]> Cypherpunks repositories - gostls13.git/commitdiff
go/printer, gofmt: don't indent line directives
authorRobert Griesemer <gri@golang.org>
Mon, 13 Feb 2012 19:50:53 +0000 (11:50 -0800)
committerRobert Griesemer <gri@golang.org>
Mon, 13 Feb 2012 19:50:53 +0000 (11:50 -0800)
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

src/pkg/go/printer/printer.go
src/pkg/go/printer/testdata/comments.golden
src/pkg/go/printer/testdata/comments.input

index f99b7bc7b464d384fe3475711fcbe0df7099f79b..c9949205e8a141a05ccd3fb87d5f4895842ea0ad 100644 (file)
@@ -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)
index 7438a32e44c206c194f23d6b2afb00577c6ac76c..e5826eecefeefadab2b0b0da4b2841b72f6559c0 100644 (file)
@@ -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
index e382764081b1c9a9e006d6e93fdfcada0366d3d6..55f6b61f21f388f2f1c2a54c21c347c9904a3917 100644 (file)
@@ -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