Commit 57909b54 authored by Robert Griesemer's avatar Robert Griesemer

implement NoSemis and NoStringConcat mode for go/printer

R=rsc
https://golang.org/cl/174050
parent a70caf44
...@@ -127,7 +127,11 @@ func (p *printer) stringList(list []*ast.BasicLit, multiLine *bool) { ...@@ -127,7 +127,11 @@ func (p *printer) stringList(list []*ast.BasicLit, multiLine *bool) {
for i, x := range list { for i, x := range list {
xlist[i] = x xlist[i] = x
} }
p.exprList(noPos, xlist, 1, stringListMode, multiLine); mode := stringListMode;
if p.Mode&NoStringConcat != 0 {
mode |= plusSep
}
p.exprList(noPos, xlist, 1, mode, multiLine);
} }
...@@ -136,6 +140,7 @@ type exprListMode uint ...@@ -136,6 +140,7 @@ 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; // elements are terminated by comma commaTerm; // elements are terminated by comma
noIndent; // no extra indentation in multi-line lists noIndent; // no extra indentation in multi-line lists
...@@ -165,6 +170,9 @@ func (p *printer) exprList(prev token.Position, list []ast.Expr, depth int, mode ...@@ -165,6 +170,9 @@ 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)
} }
...@@ -197,6 +205,9 @@ func (p *printer) exprList(prev token.Position, list []ast.Expr, depth int, mode ...@@ -197,6 +205,9 @@ func (p *printer) exprList(prev token.Position, list []ast.Expr, depth int, mode
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)
} }
...@@ -374,7 +385,9 @@ func (p *printer) fieldList(lbrace token.Position, list []*ast.Field, rbrace tok ...@@ -374,7 +385,9 @@ func (p *printer) fieldList(lbrace token.Position, list []*ast.Field, rbrace tok
p.expr(&ast.StringList{f.Tag}, &ml); p.expr(&ast.StringList{f.Tag}, &ml);
extraTabs = 0; extraTabs = 0;
} }
p.print(token.SEMICOLON); if p.Mode&NoSemis == 0 {
p.print(token.SEMICOLON)
}
if f.Comment != nil { if f.Comment != nil {
for ; extraTabs > 0; extraTabs-- { for ; extraTabs > 0; extraTabs-- {
p.print(vtab) p.print(vtab)
...@@ -407,7 +420,9 @@ func (p *printer) fieldList(lbrace token.Position, list []*ast.Field, rbrace tok ...@@ -407,7 +420,9 @@ func (p *printer) fieldList(lbrace token.Position, list []*ast.Field, rbrace tok
// embedded interface // embedded interface
p.expr(f.Type, &ml) p.expr(f.Type, &ml)
} }
p.print(token.SEMICOLON); if p.Mode&NoSemis == 0 {
p.print(token.SEMICOLON)
}
p.lineComment(f.Comment); p.lineComment(f.Comment);
} }
if isIncomplete { if isIncomplete {
...@@ -818,7 +833,7 @@ func (p *printer) stmtList(list []ast.Stmt, _indent int) { ...@@ -818,7 +833,7 @@ func (p *printer) stmtList(list []ast.Stmt, _indent int) {
// in those cases each clause is a new section // in those cases each clause is a new section
p.linebreak(s.Pos().Line, 1, maxStmtNewlines, ignore, i == 0 || _indent == 0 || multiLine); p.linebreak(s.Pos().Line, 1, maxStmtNewlines, ignore, i == 0 || _indent == 0 || multiLine);
multiLine = false; multiLine = false;
if !p.stmt(s, &multiLine) && (!fewerSemis || len(list) > 1) { if !p.stmt(s, &multiLine) && (!fewerSemis || len(list) > 1) && p.Mode&NoSemis == 0 {
p.print(token.SEMICOLON) p.print(token.SEMICOLON)
} }
} }
...@@ -1144,7 +1159,7 @@ func (p *printer) spec(spec ast.Spec, n int, context declContext, multiLine *boo ...@@ -1144,7 +1159,7 @@ func (p *printer) spec(spec ast.Spec, n int, context declContext, multiLine *boo
panic("unreachable") panic("unreachable")
} }
if context == inGroup || context == inStmtList && !optSemi { if (context == inGroup || context == inStmtList && !optSemi) && p.Mode&NoSemis == 0 {
p.print(token.SEMICOLON) p.print(token.SEMICOLON)
} }
......
...@@ -894,6 +894,8 @@ const ( ...@@ -894,6 +894,8 @@ const (
RawFormat; // do not use a tabwriter; if set, UseSpaces is ignored RawFormat; // do not use a tabwriter; if set, UseSpaces is ignored
TabIndent; // use tabs for indentation independent of UseSpaces TabIndent; // use tabs for indentation independent of UseSpaces
UseSpaces; // use spaces instead of tabs for alignment UseSpaces; // use spaces instead of tabs for alignment
NoSemis; // don't print semicolons at the end of a line
NoStringConcat; // don't print string lists without "+"
) )
......
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