Skip to content

Commit dadcf3c

Browse files
Improve robustness to comments in matrix_apply_linter() (#2896)
* Improve robustness to comments * need strip_comments_from_subtree * Improve robustness to comments
1 parent d6267ac commit dadcf3c

File tree

2 files changed

+20
-24
lines changed

2 files changed

+20
-24
lines changed

R/matrix_apply_linter.R

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ matrix_apply_linter <- function() {
9797
Linter(linter_level = "expression", function(source_expression) {
9898
xml_calls <- source_expression$xml_find_function_calls("apply")
9999
bad_expr <- xml_find_all(xml_calls, xpath)
100+
bad_expr <- strip_comments_from_subtree(bad_expr)
100101

101102
variable <- xml_text(xml_find_all(bad_expr, variable_xpath))
102103

tests/testthat/test-matrix_apply_linter.R

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,86 +1,81 @@
11
test_that("matrix_apply_linter skips allowed usages", {
22
linter <- matrix_apply_linter()
33

4-
expect_lint("apply(x, 1, prod)", NULL, linter)
4+
expect_no_lint("apply(x, 1, prod)", linter)
55

6-
expect_lint("apply(x, 1, function(i) sum(i[i > 0]))", NULL, linter)
6+
expect_no_lint("apply(x, 1, function(i) sum(i[i > 0]))", linter)
77

88
# sum as FUN argument
9-
expect_lint("apply(x, 1, f, sum)", NULL, linter)
9+
expect_no_lint("apply(x, 1, f, sum)", linter)
1010

1111
# mean() with named arguments other than na.rm is skipped because they are not
1212
# implemented in colMeans() or rowMeans()
13-
expect_lint("apply(x, 1, mean, trim = 0.2)", NULL, linter)
13+
expect_no_lint("apply(x, 1, mean, trim = 0.2)", linter)
1414
})
1515

1616
test_that("matrix_apply_linter is not implemented for complex MARGIN values", {
1717
linter <- matrix_apply_linter()
1818

1919
# Could be implemented at some point
20-
expect_lint("apply(x, seq(2, 4), sum)", NULL, linter)
20+
expect_no_lint("apply(x, seq(2, 4), sum)", linter)
2121

2222
# No equivalent
23-
expect_lint("apply(x, c(2, 4), sum)", NULL, linter)
23+
expect_no_lint("apply(x, c(2, 4), sum)", linter)
2424

2525
# Beyond the scope of static analysis
26-
expect_lint("apply(x, m, sum)", NULL, linter)
27-
28-
expect_lint("apply(x, 1 + 2:4, sum)", NULL, linter)
26+
expect_no_lint("apply(x, m, sum)", linter)
2927

28+
expect_no_lint("apply(x, 1 + 2:4, sum)", linter)
3029
})
3130

3231

3332
test_that("matrix_apply_linter simple disallowed usages", {
3433
linter <- matrix_apply_linter()
35-
lint_message <- rex::rex("rowSums(x)")
3634

35+
lint_message <- rex::rex("rowSums(x)")
3736
expect_lint("apply(x, 1, sum)", lint_message, linter)
38-
3937
expect_lint("apply(x, MARGIN = 1, FUN = sum)", lint_message, linter)
40-
4138
expect_lint("apply(x, 1L, sum)", lint_message, linter)
42-
4339
expect_lint("apply(x, 1:4, sum)", rex::rex("rowSums(x, dims = 4)"), linter)
44-
4540
expect_lint("apply(x, 2, sum)", rex::rex("rowSums(colSums(x))"), linter)
46-
4741
expect_lint("apply(x, 2:4, sum)", rex::rex("rowSums(colSums(x), dims = 3)"), linter)
4842

4943
lint_message <- rex::rex("rowMeans")
50-
5144
expect_lint("apply(x, 1, mean)", lint_message, linter)
52-
5345
expect_lint("apply(x, MARGIN = 1, FUN = mean)", lint_message, linter)
5446

5547
# Works with extra args in mean()
5648
expect_lint("apply(x, 1, mean, na.rm = TRUE)", lint_message, linter)
5749

5850
lint_message <- rex::rex("colMeans")
59-
6051
expect_lint("apply(x, 2, mean)", lint_message, linter)
61-
6252
expect_lint("apply(x, 2:4, mean)", lint_message, linter)
6353

54+
# adversarial comments
55+
expect_lint(
56+
trim_some("
57+
apply(x, 2, #comment
58+
mean)
59+
"),
60+
lint_message,
61+
linter
62+
)
6463
})
6564

6665
test_that("matrix_apply_linter recommendation includes na.rm if present in original call", {
6766
linter <- matrix_apply_linter()
68-
lint_message <- rex::rex("na.rm = TRUE")
6967

68+
lint_message <- rex::rex("na.rm = TRUE")
7069
expect_lint("apply(x, 1, sum, na.rm = TRUE)", lint_message, linter)
71-
7270
expect_lint("apply(x, 2, sum, na.rm = TRUE)", lint_message, linter)
73-
7471
expect_lint("apply(x, 1, mean, na.rm = TRUE)", lint_message, linter)
75-
7672
expect_lint("apply(x, 2, mean, na.rm = TRUE)", lint_message, linter)
7773

7874
lint_message <- rex::rex("rowSums(x)")
7975
expect_lint("apply(x, 1, sum)", lint_message, linter)
8076

8177
lint_message <- rex::rex("na.rm = foo")
8278
expect_lint("apply(x, 1, sum, na.rm = foo)", lint_message, linter)
83-
8479
})
8580

8681
test_that("matrix_apply_linter works with multiple lints in a single expression", {

0 commit comments

Comments
 (0)