summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/pkg/go/printer/printer.go31
-rw-r--r--src/pkg/go/printer/testdata/comments.go5
-rw-r--r--src/pkg/go/printer/testdata/comments.golden5
-rw-r--r--src/pkg/go/printer/testdata/declarations.golden2
4 files changed, 33 insertions, 10 deletions
diff --git a/src/pkg/go/printer/printer.go b/src/pkg/go/printer/printer.go
index 1511beee9..6c649eb38 100644
--- a/src/pkg/go/printer/printer.go
+++ b/src/pkg/go/printer/printer.go
@@ -256,11 +256,10 @@ func (p *printer) writeCommentPrefix(pos, next token.Position, isFirst, isKeywor
return;
}
- n := pos.Line - p.last.Line;
- if n == 0 {
+ if pos.Line == p.last.Line {
// comment on the same line as last item:
- // separate with at least one tab
- hasTab := false;
+ // separate with at least one separator
+ hasSep := false;
if isFirst {
j := 0;
for i, ch := range p.buffer {
@@ -272,7 +271,7 @@ func (p *printer) writeCommentPrefix(pos, next token.Position, isFirst, isKeywor
case vtab:
// respect existing tabs - important
// for proper formatting of commented structs
- hasTab = true;
+ hasSep = true;
continue;
case indent:
// apply pending indentation
@@ -283,9 +282,16 @@ func (p *printer) writeCommentPrefix(pos, next token.Position, isFirst, isKeywor
}
p.writeWhitespace(j);
}
- // make sure there is at least one tab
- if !hasTab {
- p.write(htab);
+ // make sure there is at least one separator
+ if !hasSep {
+ if pos.Line == next.Line {
+ // next item is on the same line as the comment
+ // (which must be a /*-style comment): separate
+ // with a blank instead of a tab
+ p.write([]byte{' '});
+ } else {
+ p.write(htab);
+ }
}
} else {
@@ -321,7 +327,7 @@ func (p *printer) writeCommentPrefix(pos, next token.Position, isFirst, isKeywor
}
p.writeWhitespace(j);
}
- p.writeNewlines(n);
+ p.writeNewlines(pos.Line - p.last.Line);
}
}
@@ -560,14 +566,21 @@ func (p *printer) writeCommentSuffix(needsLinebreak bool) {
func (p *printer) intersperseComments(next token.Position, isKeyword bool) {
isFirst := true;
needsLinebreak := false;
+ var last *ast.Comment;
for ; p.commentBefore(next); p.comment = p.comment.Next {
for _, c := range p.comment.List {
p.writeCommentPrefix(c.Pos(), next, isFirst, isKeyword);
isFirst = false;
p.writeComment(c);
needsLinebreak = c.Text[1] == '/';
+ last = c;
}
}
+ if last != nil && !needsLinebreak && last.Pos().Line == next.Line {
+ // the last comment is a /*-style comment and the next item
+ // follows on the same line: separate with an extra blank
+ p.write([]byte{' '});
+ }
p.writeCommentSuffix(needsLinebreak);
}
diff --git a/src/pkg/go/printer/testdata/comments.go b/src/pkg/go/printer/testdata/comments.go
index 38acce5cb..05399a3c6 100644
--- a/src/pkg/go/printer/testdata/comments.go
+++ b/src/pkg/go/printer/testdata/comments.go
@@ -215,6 +215,11 @@ func _() {
}
+// Some interesting interspersed comments
+func _(/* this */x/* is *//* an */ int) {
+}
+
+
// Line comments with tabs
func _() {
var finput *bufio.Reader; // input file
diff --git a/src/pkg/go/printer/testdata/comments.golden b/src/pkg/go/printer/testdata/comments.golden
index 2f4fb2407..5772c5629 100644
--- a/src/pkg/go/printer/testdata/comments.golden
+++ b/src/pkg/go/printer/testdata/comments.golden
@@ -215,6 +215,11 @@ func _() {
}
+// Some interesting interspersed comments
+func _( /* this */ x /* is */ /* an */ int) {
+}
+
+
// Line comments with tabs
func _() {
var finput *bufio.Reader; // input file
diff --git a/src/pkg/go/printer/testdata/declarations.golden b/src/pkg/go/printer/testdata/declarations.golden
index 2071543c5..2f5cf6059 100644
--- a/src/pkg/go/printer/testdata/declarations.golden
+++ b/src/pkg/go/printer/testdata/declarations.golden
@@ -294,7 +294,7 @@ func _() {
// formatting of structs
type _ struct{}
-type _ struct { /* this comment should be visible */}
+type _ struct { /* this comment should be visible */ }
type _ struct {
// this comment should be visible and properly indented