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