mirror of
https://github.com/golang/go
synced 2024-11-21 19:24:45 -07:00
go/printer, gofmt: align comments in multi-line expression lists
- gofmt -w src misc - improves several lists and fixes minor degradation introduced with the fix for issue 628 - removed some dead code (stringList) R=rsc CC=golang-dev https://golang.org/cl/223058
This commit is contained in:
parent
9750adbbad
commit
d177539877
@ -280,14 +280,14 @@ func (p *Prog) gccDebug(stdin []byte) (*dwarf.Data, string) {
|
|||||||
base := []string{
|
base := []string{
|
||||||
"gcc",
|
"gcc",
|
||||||
machine,
|
machine,
|
||||||
"-Wall", // many warnings
|
"-Wall", // many warnings
|
||||||
"-Werror", // warnings are errors
|
"-Werror", // warnings are errors
|
||||||
"-o" + tmp, // write object to tmp
|
"-o" + tmp, // write object to tmp
|
||||||
"-gdwarf-2", // generate DWARF v2 debugging symbols
|
"-gdwarf-2", // generate DWARF v2 debugging symbols
|
||||||
"-fno-eliminate-unused-debug-types", // gets rid of e.g. untyped enum otherwise
|
"-fno-eliminate-unused-debug-types", // gets rid of e.g. untyped enum otherwise
|
||||||
"-c", // do not link
|
"-c", // do not link
|
||||||
"-xc", // input language is C
|
"-xc", // input language is C
|
||||||
"-", // read input from standard input
|
"-", // read input from standard input
|
||||||
}
|
}
|
||||||
_, stderr, ok := run(stdin, concat(base, p.GccOptions))
|
_, stderr, ok := run(stdin, concat(base, p.GccOptions))
|
||||||
if !ok {
|
if !ok {
|
||||||
|
@ -935,7 +935,7 @@ func redirect(c *http.Conn, r *http.Request) (redirected bool) {
|
|||||||
// textExt[x] is true if the extension x indicates a text file, and false otherwise.
|
// textExt[x] is true if the extension x indicates a text file, and false otherwise.
|
||||||
var textExt = map[string]bool{
|
var textExt = map[string]bool{
|
||||||
".css": false, // must be served raw
|
".css": false, // must be served raw
|
||||||
".js": false, // must be served raw
|
".js": false, // must be served raw
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -145,13 +145,13 @@ var txbits = [NCOL][32]byte{
|
|||||||
}
|
}
|
||||||
|
|
||||||
var txpix = [NCOL]draw.Color{
|
var txpix = [NCOL]draw.Color{
|
||||||
draw.Yellow, /* yellow */
|
draw.Yellow, /* yellow */
|
||||||
draw.Cyan, /* cyan */
|
draw.Cyan, /* cyan */
|
||||||
draw.Green, /* lime green */
|
draw.Green, /* lime green */
|
||||||
draw.GreyBlue, /* slate */
|
draw.GreyBlue, /* slate */
|
||||||
draw.Red, /* red */
|
draw.Red, /* red */
|
||||||
draw.GreyGreen, /* olive green */
|
draw.GreyGreen, /* olive green */
|
||||||
draw.Blue, /* blue */
|
draw.Blue, /* blue */
|
||||||
draw.Color(0xFF55AAFF), /* pink */
|
draw.Color(0xFF55AAFF), /* pink */
|
||||||
draw.Color(0xFFAAFFFF), /* lavender */
|
draw.Color(0xFFAAFFFF), /* lavender */
|
||||||
draw.Color(0xBB005DFF), /* maroon */
|
draw.Color(0xBB005DFF), /* maroon */
|
||||||
|
@ -92,29 +92,24 @@ func (p *printer) identList(list []*ast.Ident, multiLine *bool) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Sets multiLine to true if the string list spans multiple lines.
|
|
||||||
func (p *printer) stringList(list []*ast.BasicLit, multiLine *bool) {
|
|
||||||
// convert into an expression list so we can re-use exprList formatting
|
|
||||||
xlist := make([]ast.Expr, len(list))
|
|
||||||
for i, x := range list {
|
|
||||||
xlist[i] = x
|
|
||||||
}
|
|
||||||
p.exprList(noPos, xlist, 1, plusSep, multiLine, noPos)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
type exprListMode uint
|
type exprListMode uint
|
||||||
|
|
||||||
const (
|
const (
|
||||||
blankStart exprListMode = 1 << iota // print a blank before a non-empty list
|
blankStart exprListMode = 1 << iota // print a blank before a non-empty list
|
||||||
blankEnd // print a blank after a non-empty list
|
blankEnd // print a blank after a non-empty list
|
||||||
plusSep // elements are separared by + operators
|
|
||||||
commaSep // elements are separated by commas
|
commaSep // elements are separated by commas
|
||||||
commaTerm // list is optionally terminated by a comma
|
commaTerm // list is optionally terminated by a comma
|
||||||
noIndent // no extra indentation in multi-line lists
|
noIndent // no extra indentation in multi-line lists
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
// isOneLineExpr returns true if x is "small enough" to fit onto a single line.
|
||||||
|
func (p *printer) isOneLineExpr(x ast.Expr) bool {
|
||||||
|
const maxSize = 60 // aproximate value, excluding space for comments
|
||||||
|
return p.nodeSize(x, maxSize) <= maxSize
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Print a list of expressions. If the list spans multiple
|
// Print a list of expressions. If the list spans multiple
|
||||||
// source lines, the original line breaks are respected between
|
// source lines, the original line breaks are respected between
|
||||||
// expressions. Sets multiLine to true if the list spans multiple
|
// expressions. Sets multiLine to true if the list spans multiple
|
||||||
@ -141,9 +136,6 @@ func (p *printer) exprList(prev token.Position, list []ast.Expr, depth int, mode
|
|||||||
// all list entries on a single line
|
// all list entries on a single line
|
||||||
for i, x := range list {
|
for i, x := range list {
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
if mode&plusSep != 0 {
|
|
||||||
p.print(blank, token.ADD)
|
|
||||||
}
|
|
||||||
if mode&commaSep != 0 {
|
if mode&commaSep != 0 {
|
||||||
p.print(token.COMMA)
|
p.print(token.COMMA)
|
||||||
}
|
}
|
||||||
@ -167,31 +159,42 @@ func (p *printer) exprList(prev token.Position, list []ast.Expr, depth int, mode
|
|||||||
ws = indent
|
ws = indent
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// the first linebreak is always a formfeed since this section must not
|
||||||
|
// depend on any previous formatting
|
||||||
if prev.IsValid() && prev.Line < line && p.linebreak(line, 1, 2, ws, true) {
|
if prev.IsValid() && prev.Line < line && p.linebreak(line, 1, 2, ws, true) {
|
||||||
ws = ignore
|
ws = ignore
|
||||||
*multiLine = true
|
*multiLine = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
oneLiner := false // true if the previous expression fit on a single line
|
||||||
|
prevBreak := 0 // index of last expression that was followed by a linebreak
|
||||||
for i, x := range list {
|
for i, x := range list {
|
||||||
prev := line
|
prev := line
|
||||||
line = x.Pos().Line
|
line = x.Pos().Line
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
if mode&plusSep != 0 {
|
|
||||||
p.print(blank, token.ADD)
|
|
||||||
}
|
|
||||||
if mode&commaSep != 0 {
|
if mode&commaSep != 0 {
|
||||||
p.print(token.COMMA)
|
p.print(token.COMMA)
|
||||||
}
|
}
|
||||||
if prev < line && prev > 0 && line > 0 {
|
if prev < line && prev > 0 && line > 0 {
|
||||||
if p.linebreak(line, 1, 2, ws, true) {
|
// lines are broken using newlines so comments remain aligned,
|
||||||
|
// but if an expression is not a "one-line" expression, or if
|
||||||
|
// multiple expressions are on the same line, the section is
|
||||||
|
// broken with a formfeed
|
||||||
|
if p.linebreak(line, 1, 2, ws, !oneLiner || prevBreak+1 < i) {
|
||||||
ws = ignore
|
ws = ignore
|
||||||
*multiLine = true
|
*multiLine = true
|
||||||
|
prevBreak = i
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
p.print(blank)
|
p.print(blank)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
p.expr0(x, depth, multiLine)
|
p.expr0(x, depth, multiLine)
|
||||||
|
// determine if x satisfies the "one-liner" criteria
|
||||||
|
// TODO(gri): determine if the multiline information returned
|
||||||
|
// from p.expr0 is precise enough so it could be
|
||||||
|
// used instead
|
||||||
|
oneLiner = p.isOneLineExpr(x)
|
||||||
}
|
}
|
||||||
|
|
||||||
if mode&commaTerm != 0 && next.IsValid() && p.pos.Line < next.Line {
|
if mode&commaTerm != 0 && next.IsValid() && p.pos.Line < next.Line {
|
||||||
|
@ -40,9 +40,9 @@ const (
|
|||||||
var (
|
var (
|
||||||
esc = []byte{tabwriter.Escape}
|
esc = []byte{tabwriter.Escape}
|
||||||
htab = []byte{'\t'}
|
htab = []byte{'\t'}
|
||||||
htabs = [...]byte{'\t', '\t', '\t', '\t', '\t', '\t', '\t', '\t'}
|
htabs = []byte("\t\t\t\t\t\t\t\t")
|
||||||
newlines = [...]byte{'\n', '\n', '\n', '\n', '\n', '\n', '\n', '\n'} // more than maxNewlines
|
newlines = []byte("\n\n\n\n\n\n\n\n") // more than maxNewlines
|
||||||
formfeeds = [...]byte{'\f', '\f', '\f', '\f', '\f', '\f', '\f', '\f'} // more than maxNewlines
|
formfeeds = []byte("\f\f\f\f\f\f\f\f") // more than maxNewlines
|
||||||
|
|
||||||
esc_quot = []byte(""") // shorter than """
|
esc_quot = []byte(""") // shorter than """
|
||||||
esc_apos = []byte("'") // shorter than "'"
|
esc_apos = []byte("'") // shorter than "'"
|
||||||
@ -147,7 +147,7 @@ func (p *printer) write(data []byte) {
|
|||||||
// must not be discarded by the tabwriter
|
// must not be discarded by the tabwriter
|
||||||
j := p.indent
|
j := p.indent
|
||||||
for ; j > len(htabs); j -= len(htabs) {
|
for ; j > len(htabs); j -= len(htabs) {
|
||||||
p.write0(&htabs)
|
p.write0(htabs)
|
||||||
}
|
}
|
||||||
p.write0(htabs[0:j])
|
p.write0(htabs[0:j])
|
||||||
|
|
||||||
@ -526,7 +526,7 @@ func stripCommonPrefix(lines [][]byte) {
|
|||||||
// with the opening /*, otherwise align the text with the other
|
// with the opening /*, otherwise align the text with the other
|
||||||
// lines.
|
// lines.
|
||||||
last := lines[len(lines)-1]
|
last := lines[len(lines)-1]
|
||||||
closing := []byte{'*', '/'}
|
closing := []byte("*/")
|
||||||
i := bytes.Index(last, closing)
|
i := bytes.Index(last, closing)
|
||||||
if isBlank(last[0:i]) {
|
if isBlank(last[0:i]) {
|
||||||
// last line only contains closing */
|
// last line only contains closing */
|
||||||
|
15
src/pkg/go/printer/testdata/expressions.golden
vendored
15
src/pkg/go/printer/testdata/expressions.golden
vendored
@ -337,6 +337,21 @@ func _() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Align comments in multi-line lists of single-line expressions.
|
||||||
|
var txpix = [NCOL]draw.Color{
|
||||||
|
draw.Yellow, // yellow
|
||||||
|
draw.Cyan, // cyan
|
||||||
|
draw.Green, // lime green
|
||||||
|
draw.GreyBlue, // slate
|
||||||
|
draw.Red, /* red */
|
||||||
|
draw.GreyGreen, /* olive green */
|
||||||
|
draw.Blue, /* blue */
|
||||||
|
draw.Color(0xFF55AAFF), /* pink */
|
||||||
|
draw.Color(0xFFAAFFFF), /* lavender */
|
||||||
|
draw.Color(0xBB005DFF), /* maroon */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
func same(t, u *Time) bool {
|
func same(t, u *Time) bool {
|
||||||
// respect source lines in multi-line expressions
|
// respect source lines in multi-line expressions
|
||||||
return t.Year == u.Year &&
|
return t.Year == u.Year &&
|
||||||
|
15
src/pkg/go/printer/testdata/expressions.input
vendored
15
src/pkg/go/printer/testdata/expressions.input
vendored
@ -341,6 +341,21 @@ func _() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Align comments in multi-line lists of single-line expressions.
|
||||||
|
var txpix = [NCOL]draw.Color{
|
||||||
|
draw.Yellow, // yellow
|
||||||
|
draw.Cyan, // cyan
|
||||||
|
draw.Green, // lime green
|
||||||
|
draw.GreyBlue, // slate
|
||||||
|
draw.Red, /* red */
|
||||||
|
draw.GreyGreen, /* olive green */
|
||||||
|
draw.Blue, /* blue */
|
||||||
|
draw.Color(0xFF55AAFF), /* pink */
|
||||||
|
draw.Color(0xFFAAFFFF), /* lavender */
|
||||||
|
draw.Color(0xBB005DFF), /* maroon */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
func same(t, u *Time) bool {
|
func same(t, u *Time) bool {
|
||||||
// respect source lines in multi-line expressions
|
// respect source lines in multi-line expressions
|
||||||
return t.Year == u.Year &&
|
return t.Year == u.Year &&
|
||||||
|
15
src/pkg/go/printer/testdata/expressions.raw
vendored
15
src/pkg/go/printer/testdata/expressions.raw
vendored
@ -337,6 +337,21 @@ func _() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Align comments in multi-line lists of single-line expressions.
|
||||||
|
var txpix = [NCOL]draw.Color{
|
||||||
|
draw.Yellow, // yellow
|
||||||
|
draw.Cyan, // cyan
|
||||||
|
draw.Green, // lime green
|
||||||
|
draw.GreyBlue, // slate
|
||||||
|
draw.Red, /* red */
|
||||||
|
draw.GreyGreen, /* olive green */
|
||||||
|
draw.Blue, /* blue */
|
||||||
|
draw.Color(0xFF55AAFF), /* pink */
|
||||||
|
draw.Color(0xFFAAFFFF), /* lavender */
|
||||||
|
draw.Color(0xBB005DFF), /* maroon */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
func same(t, u *Time) bool {
|
func same(t, u *Time) bool {
|
||||||
// respect source lines in multi-line expressions
|
// respect source lines in multi-line expressions
|
||||||
return t.Year == u.Year &&
|
return t.Year == u.Year &&
|
||||||
|
@ -431,8 +431,8 @@ var segments = []seg{
|
|||||||
seg{"\n//line File2.go:200\n line200", "File2.go", 200},
|
seg{"\n//line File2.go:200\n line200", "File2.go", 200},
|
||||||
seg{"\n//line :1\n line1", "", 1},
|
seg{"\n//line :1\n line1", "", 1},
|
||||||
seg{"\n//line foo:42\n line42", "foo", 42},
|
seg{"\n//line foo:42\n line42", "foo", 42},
|
||||||
seg{"\n //line foo:42\n line44", "foo", 44}, // bad line comment, ignored
|
seg{"\n //line foo:42\n line44", "foo", 44}, // bad line comment, ignored
|
||||||
seg{"\n//line foo 42\n line46", "foo", 46}, // bad line comment, ignored
|
seg{"\n//line foo 42\n line46", "foo", 46}, // bad line comment, ignored
|
||||||
seg{"\n//line foo:42 extra text\n line48", "foo", 48}, // bad line comment, ignored
|
seg{"\n//line foo:42 extra text\n line48", "foo", 48}, // bad line comment, ignored
|
||||||
seg{"\n//line foo:42\n line42", "foo", 42},
|
seg{"\n//line foo:42\n line42", "foo", 42},
|
||||||
seg{"\n//line foo:42\n line42", "foo", 42},
|
seg{"\n//line foo:42\n line42", "foo", 42},
|
||||||
|
@ -60,7 +60,7 @@ var respTests = []respTest{
|
|||||||
ProtoMinor: 0,
|
ProtoMinor: 0,
|
||||||
RequestMethod: "GET",
|
RequestMethod: "GET",
|
||||||
Header: map[string]string{
|
Header: map[string]string{
|
||||||
"Connection": "close", // TODO(rsc): Delete?
|
"Connection": "close", // TODO(rsc): Delete?
|
||||||
"Content-Length": "10", // TODO(rsc): Delete?
|
"Content-Length": "10", // TODO(rsc): Delete?
|
||||||
},
|
},
|
||||||
Close: true,
|
Close: true,
|
||||||
|
@ -195,31 +195,31 @@ var leftcheats = []leftCheat{
|
|||||||
}'
|
}'
|
||||||
*/
|
*/
|
||||||
leftCheat{0, ""},
|
leftCheat{0, ""},
|
||||||
leftCheat{1, "5"}, // * 2
|
leftCheat{1, "5"}, // * 2
|
||||||
leftCheat{1, "25"}, // * 4
|
leftCheat{1, "25"}, // * 4
|
||||||
leftCheat{1, "125"}, // * 8
|
leftCheat{1, "125"}, // * 8
|
||||||
leftCheat{2, "625"}, // * 16
|
leftCheat{2, "625"}, // * 16
|
||||||
leftCheat{2, "3125"}, // * 32
|
leftCheat{2, "3125"}, // * 32
|
||||||
leftCheat{2, "15625"}, // * 64
|
leftCheat{2, "15625"}, // * 64
|
||||||
leftCheat{3, "78125"}, // * 128
|
leftCheat{3, "78125"}, // * 128
|
||||||
leftCheat{3, "390625"}, // * 256
|
leftCheat{3, "390625"}, // * 256
|
||||||
leftCheat{3, "1953125"}, // * 512
|
leftCheat{3, "1953125"}, // * 512
|
||||||
leftCheat{4, "9765625"}, // * 1024
|
leftCheat{4, "9765625"}, // * 1024
|
||||||
leftCheat{4, "48828125"}, // * 2048
|
leftCheat{4, "48828125"}, // * 2048
|
||||||
leftCheat{4, "244140625"}, // * 4096
|
leftCheat{4, "244140625"}, // * 4096
|
||||||
leftCheat{4, "1220703125"}, // * 8192
|
leftCheat{4, "1220703125"}, // * 8192
|
||||||
leftCheat{5, "6103515625"}, // * 16384
|
leftCheat{5, "6103515625"}, // * 16384
|
||||||
leftCheat{5, "30517578125"}, // * 32768
|
leftCheat{5, "30517578125"}, // * 32768
|
||||||
leftCheat{5, "152587890625"}, // * 65536
|
leftCheat{5, "152587890625"}, // * 65536
|
||||||
leftCheat{6, "762939453125"}, // * 131072
|
leftCheat{6, "762939453125"}, // * 131072
|
||||||
leftCheat{6, "3814697265625"}, // * 262144
|
leftCheat{6, "3814697265625"}, // * 262144
|
||||||
leftCheat{6, "19073486328125"}, // * 524288
|
leftCheat{6, "19073486328125"}, // * 524288
|
||||||
leftCheat{7, "95367431640625"}, // * 1048576
|
leftCheat{7, "95367431640625"}, // * 1048576
|
||||||
leftCheat{7, "476837158203125"}, // * 2097152
|
leftCheat{7, "476837158203125"}, // * 2097152
|
||||||
leftCheat{7, "2384185791015625"}, // * 4194304
|
leftCheat{7, "2384185791015625"}, // * 4194304
|
||||||
leftCheat{7, "11920928955078125"}, // * 8388608
|
leftCheat{7, "11920928955078125"}, // * 8388608
|
||||||
leftCheat{8, "59604644775390625"}, // * 16777216
|
leftCheat{8, "59604644775390625"}, // * 16777216
|
||||||
leftCheat{8, "298023223876953125"}, // * 33554432
|
leftCheat{8, "298023223876953125"}, // * 33554432
|
||||||
leftCheat{8, "1490116119384765625"}, // * 67108864
|
leftCheat{8, "1490116119384765625"}, // * 67108864
|
||||||
leftCheat{9, "7450580596923828125"}, // * 134217728
|
leftCheat{9, "7450580596923828125"}, // * 134217728
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user