From: Robert Griesemer Date: Thu, 10 Dec 2009 23:45:57 +0000 (-0800) Subject: implement NoSemis and NoStringConcat mode for go/printer X-Git-Tag: weekly.2009-12-22~97 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=57909b54e915430ba92aa7d6d769edfdff489b6c;p=gostls13.git implement NoSemis and NoStringConcat mode for go/printer R=rsc https://golang.org/cl/174050 --- diff --git a/src/pkg/go/printer/nodes.go b/src/pkg/go/printer/nodes.go index efb61a75cd..e5ecdd2789 100644 --- a/src/pkg/go/printer/nodes.go +++ b/src/pkg/go/printer/nodes.go @@ -127,7 +127,11 @@ func (p *printer) stringList(list []*ast.BasicLit, multiLine *bool) { for i, x := range list { 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 const ( blankStart exprListMode = 1 << iota; // print a blank before 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 commaTerm; // elements are terminated by comma 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 // all list entries on a single line for i, x := range list { if i > 0 { + if mode&plusSep != 0 { + p.print(blank, token.ADD) + } if mode&commaSep != 0 { p.print(token.COMMA) } @@ -197,6 +205,9 @@ func (p *printer) exprList(prev token.Position, list []ast.Expr, depth int, mode prev := line; line = x.Pos().Line; if i > 0 { + if mode&plusSep != 0 { + p.print(blank, token.ADD) + } if mode&commaSep != 0 { p.print(token.COMMA) } @@ -374,7 +385,9 @@ func (p *printer) fieldList(lbrace token.Position, list []*ast.Field, rbrace tok p.expr(&ast.StringList{f.Tag}, &ml); extraTabs = 0; } - p.print(token.SEMICOLON); + if p.Mode&NoSemis == 0 { + p.print(token.SEMICOLON) + } if f.Comment != nil { for ; extraTabs > 0; extraTabs-- { p.print(vtab) @@ -407,7 +420,9 @@ func (p *printer) fieldList(lbrace token.Position, list []*ast.Field, rbrace tok // embedded interface p.expr(f.Type, &ml) } - p.print(token.SEMICOLON); + if p.Mode&NoSemis == 0 { + p.print(token.SEMICOLON) + } p.lineComment(f.Comment); } if isIncomplete { @@ -818,7 +833,7 @@ func (p *printer) stmtList(list []ast.Stmt, _indent int) { // in those cases each clause is a new section p.linebreak(s.Pos().Line, 1, maxStmtNewlines, ignore, i == 0 || _indent == 0 || multiLine); 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) } } @@ -1144,7 +1159,7 @@ func (p *printer) spec(spec ast.Spec, n int, context declContext, multiLine *boo panic("unreachable") } - if context == inGroup || context == inStmtList && !optSemi { + if (context == inGroup || context == inStmtList && !optSemi) && p.Mode&NoSemis == 0 { p.print(token.SEMICOLON) } diff --git a/src/pkg/go/printer/printer.go b/src/pkg/go/printer/printer.go index a59dba32e2..727b7afc9b 100644 --- a/src/pkg/go/printer/printer.go +++ b/src/pkg/go/printer/printer.go @@ -894,6 +894,8 @@ const ( RawFormat; // do not use a tabwriter; if set, UseSpaces is ignored TabIndent; // use tabs for indentation independent of UseSpaces 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 "+" )