Skip to content

Commit

Permalink
Add equals_na_linter (#326)
Browse files Browse the repository at this point in the history
Closes #143
  • Loading branch information
jabranham authored and jimhester committed Jun 14, 2018
1 parent 90bc6b6 commit bee2f34
Show file tree
Hide file tree
Showing 9 changed files with 80 additions and 10 deletions.
1 change: 1 addition & 0 deletions DESCRIPTION
Expand Up @@ -47,6 +47,7 @@ Collate:
'comments.R'
'object_name_linters.R'
'deprecated.R'
'equals_na_lintr.R'
'exclude.R'
'expect_lint.R'
'extract.R'
Expand Down
1 change: 1 addition & 0 deletions NAMESPACE
Expand Up @@ -24,6 +24,7 @@ export(default_linters)
export(default_settings)
export(default_undesirable_functions)
export(default_undesirable_operators)
export(equals_na_linter)
export(expect_lint)
export(expect_lint_free)
export(extraction_operator_linter)
Expand Down
1 change: 1 addition & 0 deletions NEWS.md
Expand Up @@ -54,6 +54,7 @@
* Changed `lint_package` to remove fully excluded files as soon as possible to
avoid reading and pre-processing of ignored files (@mwaldstein)
* Allow for any number of `#` to start a comment. Useful in ESS (#299, @prosoitos)
* New equals_na_linter() (#143, #326, @jabranham)

# lintr 1.0.2 #
* Fix tests to work with upcoming testthat release.
Expand Down
38 changes: 38 additions & 0 deletions R/equals_na_lintr.R
@@ -0,0 +1,38 @@
#' @describeIn linters that checks for x == NA
#' @export
equals_na_linter <- function(source_file) {
all_matches <- re_matches(
source_file$lines,
rex("==", zero_or_more(" "), "NA"),
locations = TRUE,
global = TRUE
)
line_numbers <- as.integer(names(source_file$lines))

Map(
function(line_matches, line_number) {
lapply(
split(line_matches, seq_len(nrow(line_matches))),
function(match) {
start <- match[["start"]]
if (is.na(start)) {
return()
}
end <- match[["end"]]
Lint(
filename = source_file$filename,
line_number = line_number,
column_number = start,
type = "warning",
message = "Use is.na rather than == NA.",
line = source_file$lines[[as.character(line_number)]],
ranges = list(c(start, end)),
linter = "equals_na_linter"
)
}
)
},
all_matches,
line_numbers
)
}
1 change: 1 addition & 0 deletions R/zzz.R
Expand Up @@ -89,6 +89,7 @@ default_linters <- with_defaults(default = list(),
closed_curly_linter(),
commas_linter,
commented_code_linter,
equals_na_linter,
function_left_parentheses_linter,
infix_spaces_linter,
line_length_linter(80),
Expand Down
2 changes: 1 addition & 1 deletion man/default_linters.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

24 changes: 15 additions & 9 deletions man/linters.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions man/read_settings.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

21 changes: 21 additions & 0 deletions tests/testthat/test-equals_na_linter.R
@@ -0,0 +1,21 @@
context("equals_na_linter")

test_that("returns the correct linting", {
msg <- rex("Use is.na rather than == NA.")
expect_lint("blah", NULL, equals_na_linter)
expect_lint(" blah", NULL, equals_na_linter)
expect_lint(" blah", NULL, equals_na_linter)
expect_lint("x=NA", NULL, equals_na_linter)

expect_lint(
"x == NA",
list(message = msg, line_number = 1L, column_number = 3),
equals_na_linter)

expect_lint(
"x==NA",
list(message = msg, line_number = 1L, column_number = 2),
equals_na_linter
)

})

0 comments on commit bee2f34

Please sign in to comment.