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 + } +}