From: Robert Griesemer Date: Mon, 13 Feb 2012 19:50:53 +0000 (-0800) Subject: go/printer, gofmt: don't indent line directives X-Git-Tag: weekly.2012-02-14~72 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=28ffb38f4a55759664b240843af00e6d88b72128;p=gostls13.git go/printer, gofmt: don't indent line directives This was broken by https://golang.org/cl/5643066 which introduced lazy indentation printing. Fixes #2990. R=rsc CC=golang-dev https://golang.org/cl/5655067 --- diff --git a/src/pkg/go/printer/printer.go b/src/pkg/go/printer/printer.go index f99b7bc7b4..c9949205e8 100644 --- a/src/pkg/go/printer/printer.go +++ b/src/pkg/go/printer/printer.go @@ -275,8 +275,6 @@ func (p *printer) writeString(pos token.Position, s string, isLit bool) { p.last = p.pos } -const linePrefix = "//line " - // writeCommentPrefix writes the whitespace before a comment. // If there is any pending whitespace, it consumes as much of // it as is likely to help position the comment nicely. @@ -397,16 +395,10 @@ func (p *printer) writeCommentPrefix(pos, next token.Position, prev, comment *as } if n > 0 { - // turn off indent if we're about to print a line directive - indent := p.indent - if strings.HasPrefix(comment.Text, linePrefix) { - p.indent = 0 - } // use formfeeds to break columns before a comment; // this is analogous to using formfeeds to separate // individual lines of /*-style comments p.writeByte('\f', nlimit(n)) - p.indent = indent // restore indent } } } @@ -588,30 +580,33 @@ func stripCommonPrefix(lines []string) { func (p *printer) writeComment(comment *ast.Comment) { text := comment.Text + pos := p.posFor(comment.Pos()) - if strings.HasPrefix(text, linePrefix) { - pos := strings.TrimSpace(text[len(linePrefix):]) - i := strings.LastIndex(pos, ":") - if i >= 0 { - // The line directive we are about to print changed - // the Filename and Line number used by go/token - // as it was reading the input originally. - // In order to match the original input, we have to - // update our own idea of the file and line number - // accordingly, after printing the directive. - file := pos[:i] - line, _ := strconv.Atoi(pos[i+1:]) - defer func() { - p.pos.Filename = file - p.pos.Line = line - p.pos.Column = 1 - }() + const linePrefix = "//line " + if strings.HasPrefix(text, linePrefix) && (!pos.IsValid() || pos.Column == 1) { + // possibly a line directive + ldir := strings.TrimSpace(text[len(linePrefix):]) + if i := strings.LastIndex(ldir, ":"); i >= 0 { + if line, err := strconv.Atoi(ldir[i+1:]); err == nil && line > 0 { + // The line directive we are about to print changed + // the Filename and Line number used for subsequent + // tokens. We have to update our AST-space position + // accordingly and suspend indentation temporarily. + indent := p.indent + p.indent = 0 + defer func() { + p.pos.Filename = ldir[:i] + p.pos.Line = line + p.pos.Column = 1 + p.indent = indent + }() + } } } // shortcut common case of //-style comments if text[1] == '/' { - p.writeString(p.posFor(comment.Pos()), text, true) + p.writeString(pos, text, true) return } @@ -622,7 +617,6 @@ func (p *printer) writeComment(comment *ast.Comment) { // write comment lines, separated by formfeed, // without a line break after the last line - pos := p.posFor(comment.Pos()) for i, line := range lines { if i > 0 { p.writeByte('\f', 1) diff --git a/src/pkg/go/printer/testdata/comments.golden b/src/pkg/go/printer/testdata/comments.golden index 7438a32e44..e5826eecef 100644 --- a/src/pkg/go/printer/testdata/comments.golden +++ b/src/pkg/go/printer/testdata/comments.golden @@ -479,6 +479,25 @@ func _() { } } +// Print line directives correctly. + +// The following is a legal line directive. +//line foo:1 +func _() { + _ = 0 + // The following is a legal line directive. It must not be indented: +//line foo:2 + _ = 1 + + // The following is not a legal line directive (it doesn't start in column 1): + //line foo:2 + _ = 2 + + // The following is not a legal line directive (negative line number): + //line foo:-3 + _ = 3 +} + // Line comments with tabs func _() { var finput *bufio.Reader // input file diff --git a/src/pkg/go/printer/testdata/comments.input b/src/pkg/go/printer/testdata/comments.input index e382764081..55f6b61f21 100644 --- a/src/pkg/go/printer/testdata/comments.input +++ b/src/pkg/go/printer/testdata/comments.input @@ -487,6 +487,25 @@ func _() { } +// Print line directives correctly. + +// The following is a legal line directive. +//line foo:1 +func _() { + _ = 0 +// The following is a legal line directive. It must not be indented: +//line foo:2 + _ = 1 + +// The following is not a legal line directive (it doesn't start in column 1): + //line foo:2 + _ = 2 + +// The following is not a legal line directive (negative line number): +//line foo:-3 + _ = 3 +} + // Line comments with tabs func _() { var finput *bufio.Reader // input file