Skip to content

Commit 03ab8a0

Browse files
committed
internal/astutil: add EqualSyntax, moved from modernize
Change-Id: Ia08518c031dce2f82d17049f911946fc03356014 Reviewed-on: https://go-review.googlesource.com/c/tools/+/708915 Reviewed-by: Robert Findley <rfindley@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
1 parent 92fdfda commit 03ab8a0

File tree

14 files changed

+54
-41
lines changed

14 files changed

+54
-41
lines changed

go/analysis/passes/modernize/bloop.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"golang.org/x/tools/internal/analysisinternal"
1919
"golang.org/x/tools/internal/analysisinternal/generated"
2020
typeindexanalyzer "golang.org/x/tools/internal/analysisinternal/typeindex"
21+
"golang.org/x/tools/internal/astutil"
2122
"golang.org/x/tools/internal/moreiters"
2223
"golang.org/x/tools/internal/typesinternal/typeindex"
2324
)
@@ -241,7 +242,7 @@ func isIncrementLoop(info *types.Info, loop *ast.ForStmt) *types.Var {
241242
isZeroIntLiteral(info, assign.Rhs[0]) &&
242243
is[*ast.IncDecStmt](loop.Post) &&
243244
loop.Post.(*ast.IncDecStmt).Tok == token.INC &&
244-
equalSyntax(loop.Post.(*ast.IncDecStmt).X, assign.Lhs[0]) {
245+
astutil.EqualSyntax(loop.Post.(*ast.IncDecStmt).X, assign.Lhs[0]) {
245246
return info.Defs[assign.Lhs[0].(*ast.Ident)].(*types.Var)
246247
}
247248
return nil

go/analysis/passes/modernize/forvar.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"golang.org/x/tools/go/ast/inspector"
1414
"golang.org/x/tools/internal/analysisinternal"
1515
"golang.org/x/tools/internal/analysisinternal/generated"
16+
"golang.org/x/tools/internal/astutil"
1617
)
1718

1819
var ForVarAnalyzer = &analysis.Analyzer{
@@ -52,8 +53,8 @@ func forvar(pass *analysis.Pass) (any, error) {
5253
}
5354
isLoopVarRedecl := func(assign *ast.AssignStmt) bool {
5455
for i, lhs := range assign.Lhs {
55-
if !(equalSyntax(lhs, assign.Rhs[i]) &&
56-
(equalSyntax(lhs, loop.Key) || equalSyntax(lhs, loop.Value))) {
56+
if !(astutil.EqualSyntax(lhs, assign.Rhs[i]) &&
57+
(astutil.EqualSyntax(lhs, loop.Key) || astutil.EqualSyntax(lhs, loop.Value))) {
5758
return false
5859
}
5960
}

go/analysis/passes/modernize/maps.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"golang.org/x/tools/go/ast/inspector"
1818
"golang.org/x/tools/internal/analysisinternal"
1919
"golang.org/x/tools/internal/analysisinternal/generated"
20+
"golang.org/x/tools/internal/astutil"
2021
"golang.org/x/tools/internal/typeparams"
2122
)
2223

@@ -99,7 +100,7 @@ func mapsloop(pass *analysis.Pass) (any, error) {
99100
if assign, ok := curPrev.Node().(*ast.AssignStmt); ok &&
100101
len(assign.Lhs) == 1 &&
101102
len(assign.Rhs) == 1 &&
102-
equalSyntax(assign.Lhs[0], m) {
103+
astutil.EqualSyntax(assign.Lhs[0], m) {
103104

104105
// Have: m = rhs; for k, v := range x { m[k] = v }
105106
var newMap bool
@@ -235,8 +236,8 @@ func mapsloop(pass *analysis.Pass) (any, error) {
235236

236237
assign := rng.Body.List[0].(*ast.AssignStmt)
237238
if index, ok := assign.Lhs[0].(*ast.IndexExpr); ok &&
238-
equalSyntax(rng.Key, index.Index) &&
239-
equalSyntax(rng.Value, assign.Rhs[0]) &&
239+
astutil.EqualSyntax(rng.Key, index.Index) &&
240+
astutil.EqualSyntax(rng.Value, assign.Rhs[0]) &&
240241
is[*types.Map](typeparams.CoreType(info.TypeOf(index.X))) &&
241242
types.Identical(info.TypeOf(index), info.TypeOf(rng.Value)) { // m[k], v
242243

go/analysis/passes/modernize/minmax.go

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"golang.org/x/tools/internal/analysisinternal"
1919
"golang.org/x/tools/internal/analysisinternal/generated"
2020
typeindexanalyzer "golang.org/x/tools/internal/analysisinternal/typeindex"
21+
"golang.org/x/tools/internal/astutil"
2122
"golang.org/x/tools/internal/typeparams"
2223
"golang.org/x/tools/internal/typesinternal/typeindex"
2324
)
@@ -92,10 +93,10 @@ func minmax(pass *analysis.Pass) (any, error) {
9293
// For pattern 1, check that:
9394
// - lhs = lhs2
9495
// - {rhs,rhs2} = {a,b}
95-
if equalSyntax(lhs, lhs2) {
96-
if equalSyntax(rhs, a) && equalSyntax(rhs2, b) {
96+
if astutil.EqualSyntax(lhs, lhs2) {
97+
if astutil.EqualSyntax(rhs, a) && astutil.EqualSyntax(rhs2, b) {
9798
sign = +sign
98-
} else if equalSyntax(rhs2, a) && equalSyntax(rhs, b) {
99+
} else if astutil.EqualSyntax(rhs2, a) && astutil.EqualSyntax(rhs, b) {
99100
sign = -sign
100101
} else {
101102
return
@@ -149,10 +150,10 @@ func minmax(pass *analysis.Pass) (any, error) {
149150
lhs0 := fassign.Lhs[0]
150151
rhs0 := fassign.Rhs[0]
151152

152-
if equalSyntax(lhs, lhs0) {
153-
if equalSyntax(rhs, a) && (equalSyntax(rhs0, b) || equalSyntax(lhs0, b)) {
153+
if astutil.EqualSyntax(lhs, lhs0) {
154+
if astutil.EqualSyntax(rhs, a) && (astutil.EqualSyntax(rhs0, b) || astutil.EqualSyntax(lhs0, b)) {
154155
sign = +sign
155-
} else if (equalSyntax(rhs0, a) || equalSyntax(lhs0, a)) && equalSyntax(rhs, b) {
156+
} else if (astutil.EqualSyntax(rhs0, a) || astutil.EqualSyntax(lhs0, a)) && astutil.EqualSyntax(rhs, b) {
156157
sign = -sign
157158
} else {
158159
return
@@ -166,9 +167,9 @@ func minmax(pass *analysis.Pass) (any, error) {
166167
// Permit lhs0 to stand for rhs0 in the matching,
167168
// but don't actually reduce to lhs0 = min(lhs0, rhs)
168169
// since the "=" could be a ":=". Use min(rhs0, rhs).
169-
if equalSyntax(lhs0, a) {
170+
if astutil.EqualSyntax(lhs0, a) {
170171
a = rhs0
171-
} else if equalSyntax(lhs0, b) {
172+
} else if astutil.EqualSyntax(lhs0, b) {
172173
b = rhs0
173174
}
174175

@@ -411,9 +412,9 @@ func checkMinMaxPattern(ifStmt *ast.IfStmt, falseResult ast.Expr, funcName strin
411412
y := cmp.Y // right operand
412413

413414
// Check operand order and adjust sign accordingly
414-
if equalSyntax(t, x) && equalSyntax(f, y) {
415+
if astutil.EqualSyntax(t, x) && astutil.EqualSyntax(f, y) {
415416
sign = +sign
416-
} else if equalSyntax(t, y) && equalSyntax(f, x) {
417+
} else if astutil.EqualSyntax(t, y) && astutil.EqualSyntax(f, x) {
417418
sign = -sign
418419
} else {
419420
return false

go/analysis/passes/modernize/modernize.go

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import (
2020
"golang.org/x/tools/go/ast/inspector"
2121
"golang.org/x/tools/internal/analysisinternal"
2222
"golang.org/x/tools/internal/analysisinternal/generated"
23-
"golang.org/x/tools/internal/astutil"
2423
"golang.org/x/tools/internal/moreiters"
2524
"golang.org/x/tools/internal/stdlib"
2625
"golang.org/x/tools/internal/versions"
@@ -67,12 +66,6 @@ func skipGenerated(pass *analysis.Pass) {
6766
}
6867
}
6968

70-
// equalSyntax reports whether x and y are syntactically equal (ignoring comments).
71-
func equalSyntax(x, y ast.Expr) bool {
72-
sameName := func(x, y *ast.Ident) bool { return x.Name == y.Name }
73-
return astutil.Equal(x, y, sameName)
74-
}
75-
7669
// formatExprs formats a comma-separated list of expressions.
7770
func formatExprs(fset *token.FileSet, exprs []ast.Expr) string {
7871
var buf strings.Builder

go/analysis/passes/modernize/rangeint.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"golang.org/x/tools/internal/analysisinternal"
1919
"golang.org/x/tools/internal/analysisinternal/generated"
2020
typeindexanalyzer "golang.org/x/tools/internal/analysisinternal/typeindex"
21+
"golang.org/x/tools/internal/astutil"
2122
"golang.org/x/tools/internal/typesinternal"
2223
"golang.org/x/tools/internal/typesinternal/typeindex"
2324
)
@@ -85,7 +86,7 @@ func rangeint(pass *analysis.Pass) (any, error) {
8586

8687
if compare, ok := loop.Cond.(*ast.BinaryExpr); ok &&
8788
compare.Op == token.LSS &&
88-
equalSyntax(compare.X, init.Lhs[0]) {
89+
astutil.EqualSyntax(compare.X, init.Lhs[0]) {
8990
// Have: for i = 0; i < limit; ... {}
9091

9192
limit := compare.Y
@@ -126,7 +127,7 @@ func rangeint(pass *analysis.Pass) (any, error) {
126127

127128
if inc, ok := loop.Post.(*ast.IncDecStmt); ok &&
128129
inc.Tok == token.INC &&
129-
equalSyntax(compare.X, inc.X) {
130+
astutil.EqualSyntax(compare.X, inc.X) {
130131
// Have: for i = 0; i < limit; i++ {}
131132

132133
// Find references to i within the loop body.

go/analysis/passes/modernize/slices.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"golang.org/x/tools/go/types/typeutil"
1818
"golang.org/x/tools/internal/analysisinternal"
1919
"golang.org/x/tools/internal/analysisinternal/generated"
20+
"golang.org/x/tools/internal/astutil"
2021
)
2122

2223
// Warning: this analyzer is not safe to enable by default.
@@ -261,12 +262,12 @@ func clippedSlice(info *types.Info, e ast.Expr) (res ast.Expr, empty bool) {
261262
switch e := e.(type) {
262263
case *ast.SliceExpr:
263264
// x[:0:0], x[:len(x):len(x)], x[:k:k]
264-
if e.Slice3 && e.High != nil && e.Max != nil && equalSyntax(e.High, e.Max) { // x[:k:k]
265+
if e.Slice3 && e.High != nil && e.Max != nil && astutil.EqualSyntax(e.High, e.Max) { // x[:k:k]
265266
res = e
266267
empty = isZeroIntLiteral(info, e.High) // x[:0:0]
267268
if call, ok := e.High.(*ast.CallExpr); ok &&
268269
typeutil.Callee(info, call) == builtinLen &&
269-
equalSyntax(call.Args[0], e.X) {
270+
astutil.EqualSyntax(call.Args[0], e.X) {
270271
res = e.X // x[:len(x):len(x)] -> x
271272
}
272273
return

go/analysis/passes/modernize/slicescontains.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"golang.org/x/tools/internal/analysisinternal"
1818
"golang.org/x/tools/internal/analysisinternal/generated"
1919
typeindexanalyzer "golang.org/x/tools/internal/analysisinternal/typeindex"
20+
"golang.org/x/tools/internal/astutil"
2021
"golang.org/x/tools/internal/typeparams"
2122
"golang.org/x/tools/internal/typesinternal/typeindex"
2223
)
@@ -87,12 +88,12 @@ func slicescontains(pass *analysis.Pass) (any, error) {
8788
// isSliceElem reports whether e denotes the
8889
// current slice element (elem or s[i]).
8990
isSliceElem := func(e ast.Expr) bool {
90-
if rng.Value != nil && equalSyntax(e, rng.Value) {
91+
if rng.Value != nil && astutil.EqualSyntax(e, rng.Value) {
9192
return true // "elem"
9293
}
9394
if x, ok := e.(*ast.IndexExpr); ok &&
94-
equalSyntax(x.X, rng.X) &&
95-
equalSyntax(x.Index, rng.Key) {
95+
astutil.EqualSyntax(x.X, rng.X) &&
96+
astutil.EqualSyntax(x.Index, rng.Key) {
9697
return true // "s[i]"
9798
}
9899
return false
@@ -322,7 +323,7 @@ func slicescontains(pass *analysis.Pass) (any, error) {
322323
if prevAssign, ok := prevStmt.(*ast.AssignStmt); ok &&
323324
len(prevAssign.Lhs) == 1 &&
324325
len(prevAssign.Rhs) == 1 &&
325-
equalSyntax(prevAssign.Lhs[0], assign.Lhs[0]) &&
326+
astutil.EqualSyntax(prevAssign.Lhs[0], assign.Lhs[0]) &&
326327
is[*ast.Ident](assign.Rhs[0]) &&
327328
info.Uses[assign.Rhs[0].(*ast.Ident)] == builtinTrue {
328329

go/analysis/passes/modernize/slicesdelete.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"golang.org/x/tools/go/ast/inspector"
1616
"golang.org/x/tools/internal/analysisinternal"
1717
"golang.org/x/tools/internal/analysisinternal/generated"
18+
"golang.org/x/tools/internal/astutil"
1819
)
1920

2021
// Warning: this analyzer is not safe to enable by default (not nil-preserving).
@@ -140,7 +141,7 @@ func slicesdelete(pass *analysis.Pass) (any, error) {
140141
slice2, ok2 := call.Args[1].(*ast.SliceExpr)
141142
if ok1 && slice1.Low == nil && !slice1.Slice3 &&
142143
ok2 && slice2.High == nil && !slice2.Slice3 &&
143-
equalSyntax(slice1.X, slice2.X) && noEffects(info, slice1.X) &&
144+
astutil.EqualSyntax(slice1.X, slice2.X) && noEffects(info, slice1.X) &&
144145
increasingSliceIndices(info, slice1.High, slice2.Low) {
145146
// Have append(s[:a], s[b:]...) where we can verify a < b.
146147
report(file, call, slice1, slice2)
@@ -176,5 +177,5 @@ func increasingSliceIndices(info *types.Info, a, b ast.Expr) bool {
176177

177178
ai, ak := split(a)
178179
bi, bk := split(b)
179-
return equalSyntax(ai, bi) && constant.Compare(ak, token.LSS, bk)
180+
return astutil.EqualSyntax(ai, bi) && constant.Compare(ak, token.LSS, bk)
180181
}

go/analysis/passes/modernize/sortslice.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"golang.org/x/tools/internal/analysisinternal"
1515
"golang.org/x/tools/internal/analysisinternal/generated"
1616
typeindexanalyzer "golang.org/x/tools/internal/analysisinternal/typeindex"
17+
"golang.org/x/tools/internal/astutil"
1718
"golang.org/x/tools/internal/typesinternal/typeindex"
1819
)
1920

@@ -79,7 +80,7 @@ func slicessort(pass *analysis.Pass) (any, error) {
7980
isIndex := func(e ast.Expr, v *types.Var) bool {
8081
index, ok := e.(*ast.IndexExpr)
8182
return ok &&
82-
equalSyntax(index.X, s) &&
83+
astutil.EqualSyntax(index.X, s) &&
8384
is[*ast.Ident](index.Index) &&
8485
info.Uses[index.Index.(*ast.Ident)] == v
8586
}

0 commit comments

Comments
 (0)