From 6fb3df88d48b27c384fc3bb11de6a6ebfdc4b9e4 Mon Sep 17 00:00:00 2001 From: Mark Freeman Date: Tue, 17 Feb 2026 16:11:00 -0500 Subject: [PATCH] [release-branch.go1.26] go/analysis/passes/modernize: add vendored code Note this is a sum of CLs 731340, 733180, and 736715. Fixes #77529 Fixes #77624 Change-Id: I0c8119877184d2e6506d0b34895a746bafed3829 Reviewed-on: https://go-review.googlesource.com/c/go/+/746360 Reviewed-by: Madeline Kalil LUCI-TryBot-Result: Go LUCI Reviewed-by: Dmitri Shuralyov --- src/cmd/go.mod | 2 +- src/cmd/go.sum | 4 +-- .../go/analysis/passes/modernize/newexpr.go | 2 +- .../passes/modernize/stringsbuilder.go | 26 ++++++++++++++++++- .../analysis/passes/modernize/stringscut.go | 3 ++- src/cmd/vendor/modules.txt | 2 +- 6 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/cmd/go.mod b/src/cmd/go.mod index 85e8c4cb5f..a85acc825a 100644 --- a/src/cmd/go.mod +++ b/src/cmd/go.mod @@ -11,7 +11,7 @@ require ( golang.org/x/sys v0.39.0 golang.org/x/telemetry v0.0.0-20251128220624-abf20d0e57ec golang.org/x/term v0.38.0 - golang.org/x/tools v0.39.1-0.20251230210517-d44be789a05c + golang.org/x/tools v0.39.1-0.20260217205208-88886dd9587b ) require ( diff --git a/src/cmd/go.sum b/src/cmd/go.sum index 61c88e5253..d13c8dcc24 100644 --- a/src/cmd/go.sum +++ b/src/cmd/go.sum @@ -22,7 +22,7 @@ golang.org/x/term v0.38.0 h1:PQ5pkm/rLO6HnxFR7N2lJHOZX6Kez5Y1gDSJla6jo7Q= golang.org/x/term v0.38.0/go.mod h1:bSEAKrOT1W+VSu9TSCMtoGEOUcKxOKgl3LE5QEF/xVg= golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= -golang.org/x/tools v0.39.1-0.20251230210517-d44be789a05c h1:0pZej6BQOooNbOfjJEu4v5qx9hdwFX8HnvHCcNXcs2w= -golang.org/x/tools v0.39.1-0.20251230210517-d44be789a05c/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ= +golang.org/x/tools v0.39.1-0.20260217205208-88886dd9587b h1:eAvGtZBetn9/vYF11p6xXS7Wug5moPBH4j+kgEIZWig= +golang.org/x/tools v0.39.1-0.20260217205208-88886dd9587b/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ= rsc.io/markdown v0.0.0-20240306144322-0bf8f97ee8ef h1:mqLYrXCXYEZOop9/Dbo6RPX11539nwiCNBb1icVPmw8= rsc.io/markdown v0.0.0-20240306144322-0bf8f97ee8ef/go.mod h1:8xcPgWmwlZONN1D9bjxtHEjrUtSEa3fakVF8iaewYKQ= diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/modernize/newexpr.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/modernize/newexpr.go index 6cb75f247c..cd924ec85e 100644 --- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/modernize/newexpr.go +++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/modernize/newexpr.go @@ -25,7 +25,7 @@ import ( var NewExprAnalyzer = &analysis.Analyzer{ Name: "newexpr", Doc: analyzerutil.MustExtractDoc(doc, "newexpr"), - URL: "https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/modernize#newexpr", + URL: "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/modernize#newexpr", Requires: []*analysis.Analyzer{inspect.Analyzer}, Run: run, FactTypes: []analysis.Fact{&newLike{}}, diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/modernize/stringsbuilder.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/modernize/stringsbuilder.go index 56c5d0e3b3..98c8287a13 100644 --- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/modernize/stringsbuilder.go +++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/modernize/stringsbuilder.go @@ -5,11 +5,14 @@ package modernize import ( + "cmp" "fmt" "go/ast" "go/constant" "go/token" "go/types" + "maps" + "slices" "golang.org/x/tools/go/analysis" "golang.org/x/tools/go/analysis/passes/inspect" @@ -61,9 +64,18 @@ func stringsbuilder(pass *analysis.Pass) (any, error) { } } + lexicalOrder := func(x, y *types.Var) int { return cmp.Compare(x.Pos(), y.Pos()) } + + // File and Pos of last fix edit, + // for overlapping fix span detection. + var ( + lastEditFile *ast.File + lastEditEnd token.Pos + ) + // Now check each candidate variable's decl and uses. nextcand: - for v := range candidates { + for _, v := range slices.SortedFunc(maps.Keys(candidates), lexicalOrder) { var edits []analysis.TextEdit // Check declaration of s: @@ -79,6 +91,15 @@ nextcand: if !ok { continue } + + // To avoid semantic conflicts, do not offer a fix if its edit + // range (ignoring import edits) overlaps a previous fix. + // This fixes #76983 and is an ad-hoc mitigation of #76476. + file := astutil.EnclosingFile(def) + if file == lastEditFile && v.Pos() < lastEditEnd { + continue + } + ek, _ := def.ParentEdge() if ek == edge.AssignStmt_Lhs && len(def.Parent().Node().(*ast.AssignStmt).Lhs) == 1 { @@ -303,6 +324,9 @@ nextcand: continue nextcand // no += in a loop; reject } + lastEditFile = file + lastEditEnd = edits[len(edits)-1].End + pass.Report(analysis.Diagnostic{ Pos: loopAssign.Pos(), End: loopAssign.End(), diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/modernize/stringscut.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/modernize/stringscut.go index 954997ad6f..62088f0e91 100644 --- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/modernize/stringscut.go +++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/modernize/stringscut.go @@ -36,7 +36,7 @@ var stringscutAnalyzer = &analysis.Analyzer{ typeindexanalyzer.Analyzer, }, Run: stringscut, - URL: "https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/modernize#stringscut", + URL: "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/modernize#stringscut", } func init() { @@ -345,6 +345,7 @@ func indexArgValid(info *types.Info, index *typeindex.Index, expr ast.Expr, afte switch expr := expr.(type) { case *ast.CallExpr: return types.Identical(tv.Type, byteSliceType) && + info.Types[expr.Fun].IsType() && // make sure this isn't a function that returns a byte slice indexArgValid(info, index, expr.Args[0], afterPos) // check s in []byte(s) case *ast.Ident: sObj := info.Uses[expr] diff --git a/src/cmd/vendor/modules.txt b/src/cmd/vendor/modules.txt index 9c179c4bcd..7bd6bf86ce 100644 --- a/src/cmd/vendor/modules.txt +++ b/src/cmd/vendor/modules.txt @@ -73,7 +73,7 @@ golang.org/x/text/internal/tag golang.org/x/text/language golang.org/x/text/transform golang.org/x/text/unicode/norm -# golang.org/x/tools v0.39.1-0.20251230210517-d44be789a05c +# golang.org/x/tools v0.39.1-0.20260217205208-88886dd9587b ## explicit; go 1.24.0 golang.org/x/tools/cmd/bisect golang.org/x/tools/cover -- 2.52.0