aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Tsai <thebrokentoaster@gmail.com>2019-08-08 06:01:24 +0000
committerJoe Tsai <joetsai@google.com>2019-08-08 19:18:56 +0000
commitc5178ef69eedce1374e684212ea9cdae6220e0f6 (patch)
tree4494547ade3185d82e466f38ad9c65b03183477e
parentfc23e216319f9e4338720dbd28e1cdedc0896b4d (diff)
downloadgo-c5178ef69eedce1374e684212ea9cdae6220e0f6.tar.gz
go-c5178ef69eedce1374e684212ea9cdae6220e0f6.zip
Revert "go/ast: fix SortImports to handle block comments"
This reverts CL 162337. Reason for revert: this introduces a regression Fixes #33538 Updates #18929 Change-Id: Ib2320a840c6d3ec7912e8f414e933d04fbf11ab4 Reviewed-on: https://go-review.googlesource.com/c/go/+/189379 Reviewed-by: Robert Griesemer <gri@golang.org>
-rw-r--r--src/cmd/gofmt/testdata/import.golden60
-rw-r--r--src/cmd/gofmt/testdata/import.input62
-rw-r--r--src/go/ast/import.go81
3 files changed, 23 insertions, 180 deletions
diff --git a/src/cmd/gofmt/testdata/import.golden b/src/cmd/gofmt/testdata/import.golden
index f7d742e3e8..51d7be79df 100644
--- a/src/cmd/gofmt/testdata/import.golden
+++ b/src/cmd/gofmt/testdata/import.golden
@@ -1,4 +1,3 @@
-// package comment
package main
import (
@@ -21,10 +20,6 @@ import (
"io"
)
-// We reset the line numbering to test that
-// the formatting works independent of line directives
-//line :19
-
import (
"errors"
"fmt"
@@ -129,58 +124,3 @@ import (
"dedup_by_group"
)
-
-import (
- "fmt" // for Printf
- /* comment */ io1 "io"
- /* comment */ io2 "io"
- /* comment */ "log"
-)
-
-import (
- "fmt"
- /* comment */ io1 "io"
- /* comment */ io2 "io" // hello
- "math" /* right side */
- // end
-)
-
-import (
- "errors" // for New
- "fmt"
- /* comment */ io1 "io" /* before */ // after
- io2 "io" // another
- // end
-)
-
-import (
- "errors" // for New
- /* left */ "fmt" /* right */
- "log" // for Fatal
- /* left */ "math" /* right */
-)
-
-import /* why */ /* comment here? */ (
- /* comment */ "fmt"
- "math"
-)
-
-// Reset it again
-//line :100
-
-// Dedup with different import styles
-import (
- "path"
- . "path"
- _ "path"
- pathpkg "path"
-)
-
-/* comment */
-import (
- "fmt"
- "math" // for Abs
- // This is a new run
- "errors"
- "fmt"
-)
diff --git a/src/cmd/gofmt/testdata/import.input b/src/cmd/gofmt/testdata/import.input
index 6e3a3a3bed..9a4b09dbf9 100644
--- a/src/cmd/gofmt/testdata/import.input
+++ b/src/cmd/gofmt/testdata/import.input
@@ -1,4 +1,3 @@
-// package comment
package main
import (
@@ -21,10 +20,6 @@ import (
"io"
)
-// We reset the line numbering to test that
-// the formatting works independent of line directives
-//line :19
-
import (
"fmt"
"math"
@@ -134,60 +129,3 @@ import (
"dedup_by_group"
)
-
-import (
- /* comment */ io1 "io"
- "fmt" // for Printf
- /* comment */ "log"
- /* comment */ io2 "io"
-)
-
-import (
- /* comment */ io2 "io" // hello
- /* comment */ io1 "io"
- "math" /* right side */
- "fmt"
- // end
-)
-
-import (
- /* comment */ io1 "io" /* before */ // after
- "fmt"
- "errors" // for New
- io2 "io" // another
- // end
-)
-
-import (
- /* left */ "fmt" /* right */
- "errors" // for New
- /* left */ "math" /* right */
- "log" // for Fatal
-)
-
-import /* why */ /* comment here? */ (
- /* comment */ "fmt"
- "math"
-)
-
-// Reset it again
-//line :100
-
-// Dedup with different import styles
-import (
- "path"
- . "path"
- _ "path"
- "path"
- pathpkg "path"
-)
-
-/* comment */
-import (
- "math" // for Abs
- "fmt"
- // This is a new run
- "errors"
- "fmt"
- "errors"
-)
diff --git a/src/go/ast/import.go b/src/go/ast/import.go
index 7102884c85..be23c7fc43 100644
--- a/src/go/ast/import.go
+++ b/src/go/ast/import.go
@@ -30,7 +30,7 @@ func SortImports(fset *token.FileSet, f *File) {
i := 0
specs := d.Specs[:0]
for j, s := range d.Specs {
- if j > i && lineAt(fset, s.Pos()) > 1+lineAt(fset, d.Specs[j-1].End()) {
+ 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(fset, f, d.Specs[i:j])...)
i = j
@@ -42,8 +42,8 @@ func SortImports(fset *token.FileSet, f *File) {
// Deduping can leave a blank line before the rparen; clean that up.
if len(d.Specs) > 0 {
lastSpec := d.Specs[len(d.Specs)-1]
- lastLine := lineAt(fset, lastSpec.Pos())
- rParenLine := lineAt(fset, d.Rparen)
+ lastLine := fset.Position(lastSpec.Pos()).Line
+ rParenLine := fset.Position(d.Rparen).Line
for rParenLine > lastLine+1 {
rParenLine--
fset.File(d.Rparen).MergeLine(rParenLine)
@@ -52,10 +52,6 @@ func SortImports(fset *token.FileSet, f *File) {
}
}
-func lineAt(fset *token.FileSet, pos token.Pos) int {
- return fset.PositionFor(pos, false).Line
-}
-
func importPath(s Spec) string {
t, err := strconv.Unquote(s.(*ImportSpec).Path.Value)
if err == nil {
@@ -93,11 +89,6 @@ type posSpan struct {
End token.Pos
}
-type cgPos struct {
- left bool // true if comment is to the left of the spec, false otherwise.
- cg *CommentGroup
-}
-
func sortSpecs(fset *token.FileSet, f *File, specs []Spec) []Spec {
// Can't short-circuit here even if specs are already sorted,
// since they might yet need deduplication.
@@ -113,57 +104,39 @@ func sortSpecs(fset *token.FileSet, f *File, specs []Spec) []Spec {
}
// Identify comments in this range.
- begSpecs := pos[0].Start
- endSpecs := pos[len(pos)-1].End
- beg := fset.File(begSpecs).LineStart(lineAt(fset, begSpecs))
- end := fset.File(endSpecs).LineStart(lineAt(fset, endSpecs) + 1) // beginning of next line
- first := len(f.Comments)
- last := -1
+ // Any comment from pos[0].Start to the final line counts.
+ lastLine := fset.Position(pos[len(pos)-1].End).Line
+ cstart := len(f.Comments)
+ cend := len(f.Comments)
for i, g := range f.Comments {
- if g.End() >= end {
- break
+ if g.Pos() < pos[0].Start {
+ continue
}
- // g.End() < end
- if beg <= g.Pos() {
- // comment is within the range [beg, end[ of import declarations
- if i < first {
- first = i
- }
- if i > last {
- last = i
- }
+ if i < cstart {
+ cstart = i
+ }
+ if fset.Position(g.End()).Line > lastLine {
+ cend = i
+ break
}
}
+ comments := f.Comments[cstart:cend]
- var comments []*CommentGroup
- if last >= 0 {
- comments = f.Comments[first : last+1]
- }
-
- // Assign each comment to the import spec on the same line.
- importComments := map[*ImportSpec][]cgPos{}
+ // Assign each comment to the import spec preceding it.
+ importComments := map[*ImportSpec][]*CommentGroup{}
specIndex := 0
for _, g := range comments {
for specIndex+1 < len(specs) && pos[specIndex+1].Start <= g.Pos() {
specIndex++
}
- var left bool
- // A block comment can appear before the first import spec.
- if specIndex == 0 && pos[specIndex].Start > g.Pos() {
- left = true
- } else if specIndex+1 < len(specs) && // Or it can appear on the left of an import spec.
- lineAt(fset, pos[specIndex].Start)+1 == lineAt(fset, g.Pos()) {
- specIndex++
- left = true
- }
s := specs[specIndex].(*ImportSpec)
- importComments[s] = append(importComments[s], cgPos{left: left, cg: g})
+ importComments[s] = append(importComments[s], g)
}
// Sort the import specs by import path.
// Remove duplicates, when possible without data loss.
// Reassign the import paths to have the same position sequence.
- // Reassign each comment to the spec on the same line.
+ // Reassign each comment to abut the end of its spec.
// Sort the comments by new position.
sort.Slice(specs, func(i, j int) bool {
ipath := importPath(specs[i])
@@ -187,7 +160,7 @@ func sortSpecs(fset *token.FileSet, f *File, specs []Spec) []Spec {
deduped = append(deduped, s)
} else {
p := s.Pos()
- fset.File(p).MergeLine(lineAt(fset, p))
+ fset.File(p).MergeLine(fset.Position(p).Line)
}
}
specs = deduped
@@ -201,16 +174,8 @@ func sortSpecs(fset *token.FileSet, f *File, specs []Spec) []Spec {
s.Path.ValuePos = pos[i].Start
s.EndPos = pos[i].End
for _, g := range importComments[s] {
- for _, c := range g.cg.List {
- if g.left {
- c.Slash = pos[i].Start - 1
- } else {
- // An import spec can have both block comment and a line comment
- // to its right. In that case, both of them will have the same pos.
- // But while formatting the AST, the line comment gets moved to
- // after the block comment.
- c.Slash = pos[i].End
- }
+ for _, c := range g.List {
+ c.Slash = pos[i].End
}
}
}