Skip to contents

The goal of this vignette is simply to record things that are nice to know when using flir and that don’t really fit in other vignettes.

Writing a fix on several lines

Suppose you have some code like this:

expect_error(
  my_super_function(with, some, parameters),
  "a very detailed error message"
)

Maybe you want to replace the pattern expect_error(<code>, <message>) by expect_snapshot(<code>, error = TRUE) but you would like to keep this code split on several lines. While rule will detect the pattern whether it contains new lines or not, it is not possible to manually include new lines with \n in fix.

Instead, we can write “paragraphs” in the YAML file, such as:

id: snapshot
language: r
severity: warning
rule:
  pattern: expect_error($CODE, $$$)
fix: |
  expect_snapshot(
    ~~CODE~~,
    error = TRUE
  )
message: ...
### Store the rule in a file
my_rule <- tempfile(fileext = ".yml")
cat("id: snapshot
language: r
severity: warning
rule:
  pattern: expect_error($CODE, $$$)
fix: |
  expect_snapshot(
    ~~CODE~~,
    error = TRUE
  )
message: ...",
file = my_rule
)

### Demo of the rule
fix_text('
expect_error(
  my_super_function(with, some, parameters),
  "a very detailed error message"
)
', linters = my_rule)
## Old code:
## expect_error(
##   my_super_function(with, some, parameters),
##   "a very detailed error message"
## )
## 
## New code:
## expect_snapshot(
##   my_super_function(with, some, parameters),
##   error = TRUE
## )
## 

Detecting double and single quotes

By default, double and single quotes are considered different. Therefore, if you have a rule like:

id: quotes
language: r
severity: warning
rule:
  pattern: my_function(value = "deprecated_value")
fix: my_function(value = "replacement_value")
message: ...

then it will replace occurrences with double quotes only:

### Store the rule in a file
my_rule <- tempfile(fileext = ".yml")
cat("id: quotes
language: r
severity: warning
rule:
  pattern: my_function(value = \"deprecated_value\")
fix: my_function(value = \"replacement_value\")
message: ...",
file = my_rule
)

### Works when code has double quotes
fix_text('my_function(value = "deprecated_value")', linters = my_rule)
## Old code: my_function(value = "deprecated_value") 
## New code: my_function(value = "replacement_value")
### Doesn't work when code has single quotes
fix_text("my_function(value = 'deprecated_value')", linters = my_rule)

To specify that this rule should be applied no matter the type of quotes, we can use the context and strictness parameters in pattern:

id: quotes
language: r
severity: warning
rule:
  pattern: 
    context: my_function(value = "deprecated_value")
    strictness: ast
fix: my_function(value = "replacement_value")
message: ...
### Store the rule in a file
my_rule <- tempfile(fileext = ".yml")
cat("id: quotes
language: r
severity: warning
rule:
  pattern: 
    context: my_function(value = \"deprecated_value\")
    strictness: ast
fix: my_function(value = \"replacement_value\")
message: ...",
file = my_rule
)

### Works when code has double quotes
fix_text('my_function(value = "deprecated_value")', linters = my_rule)
## Old code: my_function(value = "deprecated_value") 
## New code: my_function(value = "replacement_value")
### Works when code has single quotes
fix_text("my_function(value = 'deprecated_value')", linters = my_rule)
## Old code: my_function(value = 'deprecated_value') 
## New code: my_function(value = "replacement_value")

See the ast-grep docs on strictness for more details.