Commit c5178ef6 authored by Joe Tsai's avatar Joe Tsai Committed by Joe Tsai

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/+/189379Reviewed-by: default avatarRobert Griesemer <gri@golang.org>
parent fc23e216
// package comment
package main package main
import ( import (
...@@ -21,10 +20,6 @@ import ( ...@@ -21,10 +20,6 @@ import (
"io" "io"
) )
// We reset the line numbering to test that
// the formatting works independent of line directives
//line :19
import ( import (
"errors" "errors"
"fmt" "fmt"
...@@ -129,58 +124,3 @@ import ( ...@@ -129,58 +124,3 @@ import (
"dedup_by_group" "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"
)
// package comment
package main package main
import ( import (
...@@ -21,10 +20,6 @@ import ( ...@@ -21,10 +20,6 @@ import (
"io" "io"
) )
// We reset the line numbering to test that
// the formatting works independent of line directives
//line :19
import ( import (
"fmt" "fmt"
"math" "math"
...@@ -134,60 +129,3 @@ import ( ...@@ -134,60 +129,3 @@ import (
"dedup_by_group" "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"
)
...@@ -30,7 +30,7 @@ func SortImports(fset *token.FileSet, f *File) { ...@@ -30,7 +30,7 @@ func SortImports(fset *token.FileSet, f *File) {
i := 0 i := 0
specs := d.Specs[:0] specs := d.Specs[:0]
for j, s := range d.Specs { 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. // j begins a new run. End this one.
specs = append(specs, sortSpecs(fset, f, d.Specs[i:j])...) specs = append(specs, sortSpecs(fset, f, d.Specs[i:j])...)
i = j i = j
...@@ -42,8 +42,8 @@ func SortImports(fset *token.FileSet, f *File) { ...@@ -42,8 +42,8 @@ func SortImports(fset *token.FileSet, f *File) {
// Deduping can leave a blank line before the rparen; clean that up. // Deduping can leave a blank line before the rparen; clean that up.
if len(d.Specs) > 0 { if len(d.Specs) > 0 {
lastSpec := d.Specs[len(d.Specs)-1] lastSpec := d.Specs[len(d.Specs)-1]
lastLine := lineAt(fset, lastSpec.Pos()) lastLine := fset.Position(lastSpec.Pos()).Line
rParenLine := lineAt(fset, d.Rparen) rParenLine := fset.Position(d.Rparen).Line
for rParenLine > lastLine+1 { for rParenLine > lastLine+1 {
rParenLine-- rParenLine--
fset.File(d.Rparen).MergeLine(rParenLine) fset.File(d.Rparen).MergeLine(rParenLine)
...@@ -52,10 +52,6 @@ func SortImports(fset *token.FileSet, f *File) { ...@@ -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 { func importPath(s Spec) string {
t, err := strconv.Unquote(s.(*ImportSpec).Path.Value) t, err := strconv.Unquote(s.(*ImportSpec).Path.Value)
if err == nil { if err == nil {
...@@ -93,11 +89,6 @@ type posSpan struct { ...@@ -93,11 +89,6 @@ type posSpan struct {
End token.Pos 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 { func sortSpecs(fset *token.FileSet, f *File, specs []Spec) []Spec {
// Can't short-circuit here even if specs are already sorted, // Can't short-circuit here even if specs are already sorted,
// since they might yet need deduplication. // since they might yet need deduplication.
...@@ -113,57 +104,39 @@ func sortSpecs(fset *token.FileSet, f *File, specs []Spec) []Spec { ...@@ -113,57 +104,39 @@ func sortSpecs(fset *token.FileSet, f *File, specs []Spec) []Spec {
} }
// Identify comments in this range. // Identify comments in this range.
begSpecs := pos[0].Start // Any comment from pos[0].Start to the final line counts.
endSpecs := pos[len(pos)-1].End lastLine := fset.Position(pos[len(pos)-1].End).Line
beg := fset.File(begSpecs).LineStart(lineAt(fset, begSpecs)) cstart := len(f.Comments)
end := fset.File(endSpecs).LineStart(lineAt(fset, endSpecs) + 1) // beginning of next line cend := len(f.Comments)
first := len(f.Comments)
last := -1
for i, g := range f.Comments { for i, g := range f.Comments {
if g.End() >= end { if g.Pos() < pos[0].Start {
break continue
} }
// g.End() < end if i < cstart {
if beg <= g.Pos() { cstart = i
// comment is within the range [beg, end[ of import declarations }
if i < first { if fset.Position(g.End()).Line > lastLine {
first = i cend = i
} break
if i > last {
last = i
}
} }
} }
comments := f.Comments[cstart:cend]
var comments []*CommentGroup // Assign each comment to the import spec preceding it.
if last >= 0 { importComments := map[*ImportSpec][]*CommentGroup{}
comments = f.Comments[first : last+1]
}
// Assign each comment to the import spec on the same line.
importComments := map[*ImportSpec][]cgPos{}
specIndex := 0 specIndex := 0
for _, g := range comments { for _, g := range comments {
for specIndex+1 < len(specs) && pos[specIndex+1].Start <= g.Pos() { for specIndex+1 < len(specs) && pos[specIndex+1].Start <= g.Pos() {
specIndex++ 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) 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. // Sort the import specs by import path.
// Remove duplicates, when possible without data loss. // Remove duplicates, when possible without data loss.
// Reassign the import paths to have the same position sequence. // 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 the comments by new position.
sort.Slice(specs, func(i, j int) bool { sort.Slice(specs, func(i, j int) bool {
ipath := importPath(specs[i]) ipath := importPath(specs[i])
...@@ -187,7 +160,7 @@ func sortSpecs(fset *token.FileSet, f *File, specs []Spec) []Spec { ...@@ -187,7 +160,7 @@ func sortSpecs(fset *token.FileSet, f *File, specs []Spec) []Spec {
deduped = append(deduped, s) deduped = append(deduped, s)
} else { } else {
p := s.Pos() p := s.Pos()
fset.File(p).MergeLine(lineAt(fset, p)) fset.File(p).MergeLine(fset.Position(p).Line)
} }
} }
specs = deduped specs = deduped
...@@ -201,16 +174,8 @@ func sortSpecs(fset *token.FileSet, f *File, specs []Spec) []Spec { ...@@ -201,16 +174,8 @@ func sortSpecs(fset *token.FileSet, f *File, specs []Spec) []Spec {
s.Path.ValuePos = pos[i].Start s.Path.ValuePos = pos[i].Start
s.EndPos = pos[i].End s.EndPos = pos[i].End
for _, g := range importComments[s] { for _, g := range importComments[s] {
for _, c := range g.cg.List { for _, c := range g.List {
if g.left { c.Slash = pos[i].End
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
}
} }
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment