Skip to content

Commit 8794907

Browse files
Improve message for seq_linter() (#1475)
* Improve message for `seq_linter()` Closes #1471 * update NEWS * Update test-seq_linter.R * simplify Co-authored-by: Michael Chirico <[email protected]> Co-authored-by: Michael Chirico <[email protected]>
1 parent c79986f commit 8794907

File tree

3 files changed

+41
-15
lines changed

3 files changed

+41
-15
lines changed

NEWS.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919
* `redundant_ifelse_linter()`'s lint message correctly suggests negation when
2020
the `yes` condition is `0` (#1432, @IndrajeetPatil).
2121

22+
* `seq_linter()` provides more specific replacement code in lint message
23+
(#1475, @IndrajeetPatil).
24+
2225
## New and improved features
2326

2427
* `unreachable_code_linter()` ignores trailing comments if they match a closing nolint block (#1347, @AshesITR).

R/seq_linter.R

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -68,21 +68,19 @@ seq_linter <- function() {
6868
# would get rev(seq_along(x)) as the preferred replacement.
6969
dot_expr1 <- get_fun(badx, 1L)
7070
dot_expr2 <- get_fun(badx, 2L)
71-
replacement <- ifelse(
72-
grepl("length(", dot_expr1, fixed = TRUE) | grepl("length(", dot_expr2, fixed = TRUE),
73-
"seq_along",
74-
"seq_len"
75-
)
71+
seq_along_idx <- grepl("length(", dot_expr1, fixed = TRUE) | grepl("length(", dot_expr2, fixed = TRUE)
72+
replacement <- ifelse(seq_along_idx, "seq_along", "seq_len")
7673

74+
dot_expr3 <- ifelse(seq_along_idx, "...", dot_expr2)
7775
lint_message <- ifelse(
7876
grepl("seq", dot_expr1, fixed = TRUE),
79-
sprintf(
80-
"%s(%s) is likely to be wrong in the empty edge case. Use %s(...) instead.",
81-
dot_expr1, dot_expr2, replacement
77+
sprintf(
78+
"%s(%s) is likely to be wrong in the empty edge case. Use %s(%s) instead.",
79+
dot_expr1, dot_expr2, replacement, dot_expr3
8280
),
8381
sprintf(
84-
"%s:%s is likely to be wrong in the empty edge case. Use %s() instead.",
85-
dot_expr1, dot_expr2, replacement
82+
"%s:%s is likely to be wrong in the empty edge case. Use %s(%s) instead.",
83+
dot_expr1, dot_expr2, replacement, dot_expr3
8684
)
8785
)
8886

tests/testthat/test-seq_linter.R

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,19 @@ test_that("finds seq(...) expressions", {
2626

2727
expect_lint(
2828
"function(x) { seq(nrow(x)) }",
29-
rex("seq(nrow(...))", anything, "Use seq_len(...)"),
29+
rex("seq(nrow(...))", anything, "Use seq_len(nrow(...))"),
30+
linter
31+
)
32+
33+
expect_lint(
34+
"function(x) { rev(seq(length(x))) }",
35+
rex("seq(length(...))", anything, "Use seq_along(...)"),
36+
linter
37+
)
38+
39+
expect_lint(
40+
"function(x) { rev(seq(nrow(x))) }",
41+
rex("seq(nrow(...))", anything, "Use seq_len(nrow(...))"),
3042
linter
3143
)
3244
})
@@ -99,6 +111,10 @@ test_that("1L is also bad", {
99111
})
100112

101113
test_that("reverse seq is ok", {
114+
linter <- seq_linter()
115+
expect_lint("function(x) { rev(seq_along(x)) }", NULL, linter)
116+
expect_lint("function(x) { rev(seq_len(nrow(x))) }", NULL, linter)
117+
102118
expect_lint(
103119
"function(x) { length(x):1 }",
104120
rex("length(...):1", anything, "Use seq_along"),
@@ -110,8 +126,8 @@ test_that("Message vectorization works for multiple lints", {
110126
expect_lint(
111127
"c(1:length(x), 1:nrow(y))",
112128
list(
113-
rex::rex("1:length(...)", anything, "seq_along()"),
114-
rex::rex("1:nrow(...)", anything, "seq_len()")
129+
rex::rex("1:length(...)", anything, "seq_along(...)"),
130+
rex::rex("1:nrow(...)", anything, "seq_len(nrow(...))")
115131
),
116132
seq_linter()
117133
)
@@ -120,7 +136,7 @@ test_that("Message vectorization works for multiple lints", {
120136
"c(seq(length(x)), 1:nrow(y))",
121137
list(
122138
rex::rex("seq(length(...))", anything, "seq_along(...)"),
123-
rex::rex("1:nrow(...)", anything, "seq_len()")
139+
rex::rex("1:nrow(...)", anything, "seq_len(nrow(...))")
124140
),
125141
seq_linter()
126142
)
@@ -129,7 +145,16 @@ test_that("Message vectorization works for multiple lints", {
129145
"c(seq(length(x)), seq(nrow(y)))",
130146
list(
131147
rex::rex("seq(length(...))", anything, "seq_along(...)"),
132-
rex::rex("seq(nrow(...))", anything, "seq_len(...)")
148+
rex::rex("seq(nrow(...))", anything, "seq_len(nrow(...))")
149+
),
150+
seq_linter()
151+
)
152+
153+
expect_lint(
154+
"c(1:NROW(x), seq(NCOL(y)))",
155+
list(
156+
rex::rex("1:NROW(...)", anything, "seq_len(NROW(...)"),
157+
rex::rex("seq(NCOL(...))", anything, "seq_len(NCOL(...))")
133158
),
134159
seq_linter()
135160
)

0 commit comments

Comments
 (0)