Commit b0360e46 authored by Scott Lawrence's avatar Scott Lawrence Committed by Russ Cox

go/ast: respect ImportSpec.EndPos

Fixes #2566.

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5541068
parent 88010973
......@@ -351,7 +351,7 @@ var addr = flag.String("addr", ":1718", "http service address") // Q=17, R=18
`,
},
{
Name: "import.3",
Name: "import.17",
Fn: addImportFn("x/y/z", "x/a/c"),
In: `package main
......@@ -382,6 +382,26 @@ import (
"d/f"
)
`,
},
{
Name: "import.18",
Fn: addDelImportFn("e", "o"),
In: `package main
import (
"f"
"o"
"z"
)
`,
Out: `package main
import (
"e"
"f"
"z"
)
`,
},
}
......@@ -409,6 +429,21 @@ func deleteImportFn(path string) func(*ast.File) bool {
}
}
func addDelImportFn(p1 string, p2 string) func(*ast.File) bool {
return func(f *ast.File) bool {
fixed := false
if !imports(f, p1) {
addImport(f, p1)
fixed = true
}
if imports(f, p2) {
deleteImport(f, p2)
fixed = true
}
return fixed
}
}
func rewriteImportFn(oldnew ...string) func(*ast.File) bool {
return func(f *ast.File) bool {
fixed := false
......
......@@ -67,12 +67,7 @@ func sortSpecs(fset *token.FileSet, f *File, specs []Spec) {
// Record positions for specs.
pos := make([]posSpan, len(specs))
for i, s := range specs {
// Cannot use s.End(), because it looks at len(s.Path.Value),
// and that string might have gotten longer or shorter.
// Instead, use s.Pos()+1, which is guaranteed to be > s.Pos()
// and still before the original end of the string, since any
// string literal must be at least 2 characters ("" or ``).
pos[i] = posSpan{s.Pos(), s.Pos() + 1}
pos[i] = posSpan{s.Pos(), s.End()}
}
// Identify comments in this range.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment