| Upstream CL: https://go-review.googlesource.com/c/tools/+/321409 | 
 |  | 
 | Modified to work against upstream Go. | 
 |  | 
 | 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. | 
 |  | 
 | --- | 
 | diff -ur org_golang_x_tools.orig/internal/imports/fix_test.go org_golang_x_tools/internal/imports/fix_test.go | 
 | --- org_golang_x_tools.orig/internal/imports/fix_test.go	2023-04-03 15:16:24.808998544 +0200 | 
 | +++ org_golang_x_tools/internal/imports/fix_test.go	2023-04-03 15:16:56.069290812 +0200 | 
 | @@ -552,7 +552,6 @@ | 
 |   | 
 |  import ( | 
 |  	"fmt" | 
 | - | 
 |  	"gu" | 
 |   | 
 |  	"manypackages.com/packagea" | 
 | @@ -643,15 +642,11 @@ | 
 |   | 
 |  import ( | 
 |  	"fmt" | 
 | - | 
 | -	renamed_packagea "manypackages.com/packagea" | 
 | - | 
 |  	"io" | 
 | - | 
 | -	. "manypackages.com/packageb" | 
 | - | 
 |  	"strings" | 
 |   | 
 | +	renamed_packagea "manypackages.com/packagea" | 
 | +	. "manypackages.com/packageb" | 
 |  	_ "manypackages.com/packagec" | 
 |  ) | 
 |   | 
 | @@ -1183,6 +1178,62 @@ | 
 |  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" | 
 | +) | 
 | +`, | 
 | +	}, | 
 |  } | 
 |   | 
 |  func TestSimpleCases(t *testing.T) { | 
 | Only in org_golang_x_tools/internal/imports: fix_test.go.orig | 
 | diff -ur org_golang_x_tools.orig/internal/imports/sortimports.go org_golang_x_tools/internal/imports/sortimports.go | 
 | --- org_golang_x_tools.orig/internal/imports/sortimports.go	2023-04-03 15:16:24.808998544 +0200 | 
 | +++ org_golang_x_tools/internal/imports/sortimports.go	2023-04-03 15:20:31.361303687 +0200 | 
 | @@ -38,15 +38,31 @@ | 
 |  			continue | 
 |  		} | 
 |   | 
 | +		// Find comments. | 
 | +		commentLines := make([]int, len(f.Comments)) | 
 | +		for j, comment := range f.Comments { | 
 | +			commentLines[j] = tokFile.Line(comment.Pos()) | 
 | +		} | 
 | + | 
 |  		// Identify and sort runs of specs on successive lines. | 
 |  		i := 0 | 
 |  		specs := d.Specs[:0] | 
 |  		for j, s := range d.Specs { | 
 | -			if j > i && tokFile.Line(s.Pos()) > 1+tokFile.Line(d.Specs[j-1].End()) { | 
 | -				// j begins a new run.  End this one. | 
 | -				specs = append(specs, sortSpecs(localPrefix, tokFile, f, d.Specs[i:j])...) | 
 | -				i = j | 
 | +			if j > i { | 
 | +				curLine, prevLine := tokFile.Line(s.Pos()), tokFile.Line(d.Specs[j-1].End()) | 
 | +				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, tokFile, f, d.Specs[i:j])...) | 
 | +							i = j | 
 | +							break | 
 | +						} | 
 | +					} | 
 | +				} | 
 |  			} | 
 | + | 
 |  		} | 
 |  		specs = append(specs, sortSpecs(localPrefix, tokFile, f, d.Specs[i:])...) | 
 |  		d.Specs = specs |