diff --git a/astutil/imports.go b/astutil/imports.go index 8cc765c5..49bb25db 100644 --- a/astutil/imports.go +++ b/astutil/imports.go @@ -160,11 +160,22 @@ func DeleteImport(fset *token.FileSet, f *ast.File, path string) (deleted bool) gen.Lparen = token.NoPos // drop parens } if j > 0 { - // We deleted an entry but now there will be + lastImpspec := gen.Specs[j-1].(*ast.ImportSpec) + lastLine := fset.Position(lastImpspec.Path.ValuePos).Line + line := fset.Position(impspec.Path.ValuePos).Line + + // We deleted an entry but now there may be // a blank line-sized hole where the import was. - // Close the hole by making the previous - // import appear to "end" where this one did. - gen.Specs[j-1].(*ast.ImportSpec).EndPos = impspec.End() + if line-lastLine > 1 { + // There was a blank line immediately preceeing the deleted import, + // so there's no need to close the hole. + // Do nothing. + } else { + // There was no blank line. + // Close the hole by making the previous + // import appear to "end" where this one did. + lastImpspec.EndPos = impspec.End() + } } break } diff --git a/astutil/imports_test.go b/astutil/imports_test.go index 55e2edcf..d7a661cb 100644 --- a/astutil/imports_test.go +++ b/astutil/imports_test.go @@ -408,6 +408,61 @@ import ( pkg: "os", in: "package main\n\nimport `os`", out: `package main +`, + }, + { + name: "import.13", + pkg: "io", + in: `package main + +import ( + "fmt" + + "io" + "os" + "utf8" + + "go/format" +) +`, + out: `package main + +import ( + "fmt" + + "os" + "utf8" + + "go/format" +) +`, + }, + { + name: "import.14", + pkg: "io", + in: `package main + +import ( + "fmt" // a + + "io" // b + "os" // c + "utf8" // d + + "go/format" // e +) +`, + out: `package main + +import ( + "fmt" // a + + // b + "os" // c + "utf8" // d + + "go/format" // e +) `, }, } diff --git a/imports/fix_test.go b/imports/fix_test.go index d4646384..6041f0a8 100644 --- a/imports/fix_test.go +++ b/imports/fix_test.go @@ -540,6 +540,41 @@ func main() { fmt.Println("Hello, world") } func notmain() { fmt.Println("Hello, world") }`, }, + + // Remove first import within in a 2nd/3rd/4th/etc. section. + // golang.org/issue/7679 + { + name: "issue 7679", + in: `package main + +import ( + "fmt" + + "github.com/foo/bar" + "github.com/foo/qux" +) + +func main() { + var _ = fmt.Println + //var _ = bar.A + var _ = qux.B +} +`, + out: `package main + +import ( + "fmt" + + "github.com/foo/qux" +) + +func main() { + var _ = fmt.Println + //var _ = bar.A + var _ = qux.B +} +`, + }, } func TestFixImports(t *testing.T) {