blob: ed87faf9fecd764107823c30d9fc6c2a0dc659e3 [file] [log] [blame]
Upstream CL: https://go-review.googlesource.com/c/tools/+/321409
From cdd84f3789f3ebbd1c55dc220bbbe4a77ab4024a Mon Sep 17 00:00:00 2001
From: Moekr <1143757638wlw@gmail.com>
Date: Thu, 20 May 2021 15:41:17 +0800
Subject: [PATCH] internal/imports: merge mergeable import groups
Merge two import groups if there is no comments between them.
This can make import blocks look more pretty.
Fixes golang/go#20818 golang/go#28200
Change-Id: Ic02ca83bd778e6d5b5b3c15292cde4fba6c842a9
---
internal/imports/fix_test.go | 65 +++++++++++++++++++++++++++++----
internal/imports/sortimports.go | 23 ++++++++++--
2 files changed, 77 insertions(+), 11 deletions(-)
diff --git a/internal/imports/fix_test.go b/internal/imports/fix_test.go
index 005bf96e..5ff84cdd 100644
--- a/internal/imports/fix_test.go
+++ b/internal/imports/fix_test.go
@@ -553,7 +553,6 @@ c = fmt.Printf
import (
"fmt"
-
"gu"
"manypackages.com/packagea"
@@ -644,15 +643,11 @@ var _, _, _, _, _ = fmt.Errorf, io.Copy, strings.Contains, renamed_packagea.A, B
import (
"fmt"
-
- renamed_packagea "manypackages.com/packagea"
-
"io"
-
- . "manypackages.com/packageb"
-
"strings"
+ renamed_packagea "manypackages.com/packagea"
+ . "manypackages.com/packageb"
_ "manypackages.com/packagec"
)
@@ -1151,6 +1146,62 @@ var _, _ = rand.Read, rand.NewZipf
import "math/rand"
var _, _ = rand.Read, rand.NewZipf
+`,
+ },
+ {
+ name: "comment_between_imports_simple",
+ in: `package main
+
+import (
+ _ "foo2"
+ // foo3 has side effects.
+ _ "foo3"
+ _ "foo1"
+)
+`,
+ out: `package main
+
+import (
+ _ "foo2"
+ // foo3 has side effects.
+ _ "foo1"
+ _ "foo3"
+)
+`,
+ },
+ {
+ name: "comment_between_imports_complex",
+ in: `package main
+
+import (
+ _ "foo1" // foo1, "std" package
+ _ "github.com/bar/foo1" // github.com/bar/foo1, third-party package
+ _ "local/foo1" // local/foo1, local package
+
+ _ "appengine"
+
+ _ "foo2"
+ // local/foo3 comment
+ _ "local/foo3"
+ _ "github.com/bar/foo2"
+)
+`,
+ out: `package main
+
+import (
+ _ "foo1" // foo1, "std" package
+ _ "foo2"
+ _ "local/foo1" // local/foo1, local package
+
+ _ "github.com/bar/foo1" // github.com/bar/foo1, third-party package
+
+ _ "appengine"
+
+ // local/foo3 comment
+ _ "local/foo3"
+
+ _ "github.com/bar/foo2"
+)
`,
},
}
diff --git a/internal/imports/sortimports.go b/internal/imports/sortimports.go
index be8ffa25..25c5ca3f 100644
--- a/internal/imports/sortimports.go
+++ b/internal/imports/sortimports.go
@@ -34,14 +34,29 @@ func sortImports(localPrefix string, fset *token.FileSet, f *ast.File) {
continue
}
+ // Find comments.
+ commentLines := make([]int, len(f.Comments))
+ for j, comment := range f.Comments {
+ commentLines[j] = fset.Position(comment.Pos()).Line
+ }
+
// Identify and sort runs of specs on successive lines.
i := 0
specs := d.Specs[:0]
for j, s := range d.Specs {
- if j > i && fset.Position(s.Pos()).Line > 1+fset.Position(d.Specs[j-1].End()).Line {
- // j begins a new run. End this one.
- specs = append(specs, sortSpecs(localPrefix, fset, f, d.Specs[i:j])...)
- i = j
+ if j > i {
+ curLine, prevLine := fset.Position(s.Pos()).Line, fset.Position(d.Specs[j-1].End()).Line
+ if curLine > 1+prevLine {
+ // j begins a new run.
+ for _, commentLine := range commentLines {
+ if prevLine < commentLine && commentLine < curLine {
+ // End this one if there is a comment before the new one.
+ specs = append(specs, sortSpecs(localPrefix, fset, f, d.Specs[i:j])...)
+ i = j
+ break
+ }
+ }
+ }
}
}
specs = append(specs, sortSpecs(localPrefix, fset, f, d.Specs[i:])...)
--
2.31.1