]> Cypherpunks repositories - gostls13.git/commitdiff
go/ast: respect ImportSpec.EndPos
authorScott Lawrence <bytbox@gmail.com>
Fri, 20 Jan 2012 18:34:19 +0000 (13:34 -0500)
committerRuss Cox <rsc@golang.org>
Fri, 20 Jan 2012 18:34:19 +0000 (13:34 -0500)
Fixes #2566.

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5541068

src/cmd/gofix/import_test.go
src/pkg/go/ast/import.go

index a2ba2e7b924a0cc1dafb689120ef0b21d0d5ee46..73011920588687513a72dbb2092456f7b3c24eae 100644 (file)
@@ -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
index 894fecdaa7e8dd4ffea9dee9e90666ee87ea3d8d..2d4f69aaea6ca0c1776e509006a665ea8d89f51b 100644 (file)
@@ -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.