diff --git a/go/analysis/passes/modernize/rangeint.go b/go/analysis/passes/modernize/rangeint.go
index edffcee..fccd6e5 100644
--- a/go/analysis/passes/modernize/rangeint.go
+++ b/go/analysis/passes/modernize/rangeint.go
@@ -123,9 +123,21 @@
continue nextLoop
}
+ validIncrement := false
if inc, ok := loop.Post.(*ast.IncDecStmt); ok &&
inc.Tok == token.INC &&
astutil.EqualSyntax(compare.X, inc.X) {
+ // Have: i++
+ validIncrement = true
+ } else if assign, ok := loop.Post.(*ast.AssignStmt); ok &&
+ assign.Tok == token.ADD_ASSIGN &&
+ len(assign.Rhs) == 1 && isIntLiteral(info, assign.Rhs[0], 1) &&
+ len(assign.Lhs) == 1 && astutil.EqualSyntax(compare.X, assign.Lhs[0]) {
+ // Have: i += 1
+ validIncrement = true
+ }
+
+ if validIncrement {
// Have: for i = 0; i < limit; i++ {}
// Find references to i within the loop body.
@@ -246,7 +258,7 @@
pass.Report(analysis.Diagnostic{
Pos: init.Pos(),
- End: inc.End(),
+ End: loop.Post.End(),
Message: "for loop can be modernized using range over int",
SuggestedFixes: []analysis.SuggestedFix{{
Message: fmt.Sprintf("Replace for loop with range %s",
@@ -272,7 +284,7 @@
// Delete inc.
{
Pos: limit.End(),
- End: inc.End(),
+ End: loop.Post.End(),
},
// Add ")" after limit, if needed.
{
diff --git a/go/analysis/passes/modernize/testdata/src/rangeint/rangeint.go b/go/analysis/passes/modernize/testdata/src/rangeint/rangeint.go
index 11ddc69..a14dc38 100644
--- a/go/analysis/passes/modernize/testdata/src/rangeint/rangeint.go
+++ b/go/analysis/passes/modernize/testdata/src/rangeint/rangeint.go
@@ -92,6 +92,19 @@
i = 8
}
+ for i := 0; i < 10; i += 1 { // want "for loop can be modernized using range over int"
+ println(i)
+ }
+ for i := 0; i < 10; s.i += 1 { // nope: modifies another variable
+ println(i)
+ }
+ for i := 0; i < 10; i -= 1 { // nope: decrements i
+ println(i)
+ }
+ for i := 0; i < 10; i += 2 { // nope: range only increments by 1
+ println(i)
+ }
+
// The limit expression must be loop invariant;
// see https://github.com/golang/go/issues/72917
for i := 0; i < f(); i++ { // nope
diff --git a/go/analysis/passes/modernize/testdata/src/rangeint/rangeint.go.golden b/go/analysis/passes/modernize/testdata/src/rangeint/rangeint.go.golden
index 2b52145..0e92147 100644
--- a/go/analysis/passes/modernize/testdata/src/rangeint/rangeint.go.golden
+++ b/go/analysis/passes/modernize/testdata/src/rangeint/rangeint.go.golden
@@ -90,7 +90,20 @@
for i := 0; i < 10; i++ { // nope: assigns i
i = 8
}
-
+
+ for i := range 10 { // want "for loop can be modernized using range over int"
+ println(i)
+ }
+ for i := 0; i < 10; s.i += 1 { // nope: modifies another variable
+ println(i)
+ }
+ for i := 0; i < 10; i -= 1 { // nope: decrements i
+ println(i)
+ }
+ for i := 0; i < 10; i += 2 { // nope: range only increments by 1
+ println(i)
+ }
+
// The limit expression must be loop invariant;
// see https://github.com/golang/go/issues/72917
for i := 0; i < f(); i++ { // nope