From fa30b68767fd3ad67517bc6601ae79f9d89e1b51 Mon Sep 17 00:00:00 2001 From: Alan Donovan Date: Fri, 21 Nov 2025 11:05:05 -0500 Subject: [PATCH] go/{ast,doc}: update BasicLit.ValueEnd as well as ValuePos For #76395 Change-Id: Ie2ad715a05cb298b08667cfe8a8394f1dfa3936c Reviewed-on: https://go-review.googlesource.com/c/go/+/722880 Reviewed-by: Robert Findley LUCI-TryBot-Result: Go LUCI --- src/go/ast/import.go | 13 ++++++++++++- src/go/doc/example.go | 13 ++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/go/ast/import.go b/src/go/ast/import.go index 3e53f10677c..84d00fef995 100644 --- a/src/go/ast/import.go +++ b/src/go/ast/import.go @@ -222,7 +222,7 @@ func sortSpecs(fset *token.FileSet, f *File, d *GenDecl, specs []Spec) []Spec { if s.Name != nil { s.Name.NamePos = pos[i].Start } - s.Path.ValuePos = pos[i].Start + updateBasicLitPos(s.Path, pos[i].Start) s.EndPos = pos[i].End for _, g := range importComments[s] { for _, c := range g.cg.List { @@ -245,3 +245,14 @@ func sortSpecs(fset *token.FileSet, f *File, d *GenDecl, specs []Spec) []Spec { return specs } + +// updateBasicLitPos updates lit.Pos, +// ensuring that lit.End is displaced by the same amount. +// (See https://go.dev/issue/76395.) +func updateBasicLitPos(lit *BasicLit, pos token.Pos) { + len := lit.End() - lit.Pos() + lit.ValuePos = pos + if lit.ValueEnd.IsValid() { + lit.ValueEnd = pos + len + } +} diff --git a/src/go/doc/example.go b/src/go/doc/example.go index 5c03c6612f9..228bdf58f81 100644 --- a/src/go/doc/example.go +++ b/src/go/doc/example.go @@ -238,7 +238,7 @@ func playExample(file *ast.File, f *ast.FuncDecl) *ast.File { spec := *s path := *s.Path spec.Path = &path - spec.Path.ValuePos = groupStart(&spec) + updateBasicLitPos(spec.Path, groupStart(&spec)) namedImports = append(namedImports, &spec) delete(unresolved, n) } @@ -720,3 +720,14 @@ func isExampleSuffix(s string) bool { r, size := utf8.DecodeRuneInString(s) return size > 0 && unicode.IsLower(r) } + +// updateBasicLitPos updates lit.Pos, +// ensuring that lit.End is displaced by the same amount. +// (See https://go.dev/issue/76395.) +func updateBasicLitPos(lit *ast.BasicLit, pos token.Pos) { + len := lit.End() - lit.Pos() + lit.ValuePos = pos + if lit.ValueEnd.IsValid() { + lit.ValueEnd = pos + len + } +}