]> Cypherpunks repositories - gostls13.git/commitdiff
- handle field tags in pretty printer
authorRobert Griesemer <gri@golang.org>
Fri, 31 Oct 2008 21:27:34 +0000 (14:27 -0700)
committerRobert Griesemer <gri@golang.org>
Fri, 31 Oct 2008 21:27:34 +0000 (14:27 -0700)
R=r
OCL=18264
CL=18264

usr/gri/pretty/parser.go
usr/gri/pretty/printer.go
usr/gri/pretty/selftest0.go [new file with mode: 0644]
usr/gri/pretty/selftest1.go [moved from usr/gri/pretty/selftest.go with 100% similarity]
usr/gri/pretty/test.sh

index d6695897680ae078de291640af374c1fe18cd956..f9bb22a10fbdce4574b6f41e756851cc2c8da5d7 100644 (file)
@@ -326,7 +326,7 @@ func (P *Parser) ParseVarDeclList(list *AST.List, ellipsis_ok bool) {
        // parse a list of types
        i0 := list.len();
        for {
-               list.Add(P.ParseVarDecl(i0 > 0));
+               list.Add(P.ParseVarDecl(ellipsis_ok /* param list */ && i0 > 0));
                if P.tok == Scanner.COMMA {
                        P.Next();
                } else {
@@ -340,7 +340,7 @@ func (P *Parser) ParseVarDeclList(list *AST.List, ellipsis_ok bool) {
                P.Next();
        }
        
-       if i0 > 0 && typ == nil {
+       if ellipsis_ok /* param list */ && i0 > 0 && typ == nil {
                // not the first parameter section; we must have a type
                P.Error(P.pos, "type expected");
                typ = AST.BadType;
@@ -365,18 +365,10 @@ func (P *Parser) ParseVarDeclList(list *AST.List, ellipsis_ok bool) {
        } else {
                // all list entries are types
                // convert all type entries into type expressions
-               if i0 > 0 {
-                       panic("internal parser error");
-               }
-               
-               for i, n := 0, list.len(); i < n; i++ {
+               for i, n := i0, list.len(); i < n; i++ {
                        t := list.at(i).(*AST.Type);
                        list.set(i, AST.NewTypeExpr(t));
                }
-               
-               if P.tok == Scanner.COMMA {
-                       panic("internal parser error");
-               }
        }
        
        P.Ecart();
@@ -514,6 +506,8 @@ func (P *Parser) ParseMapType() *AST.Type {
 }
 
 
+func (P *Parser) ParseOperand() *AST.Expr
+
 func (P *Parser) ParseStructType() *AST.Type {
        P.Trace("StructType");
 
@@ -522,10 +516,16 @@ func (P *Parser) ParseStructType() *AST.Type {
        if P.tok == Scanner.LBRACE {
                P.Next();
                t.list = AST.NewList();
-               for P.tok == Scanner.IDENT {
+               for P.tok != Scanner.RBRACE && P.tok != Scanner.EOF {
                        P.ParseVarDeclList(t.list, false);
-                       if P.tok != Scanner.RBRACE {
-                               P.Expect(Scanner.SEMICOLON);
+                       if P.tok == Scanner.STRING {
+                               // ParseOperand takes care of string concatenation
+                               t.list.Add(P.ParseOperand());
+                       }
+                       if P.tok == Scanner.SEMICOLON {
+                               P.Next();
+                       } else {
+                               break;
                        }
                }
                P.OptSemicolon();
index fb5ceded0e0d7ac94a816736ad867cc822a2dd4c..cd20adb894a3d8021c20ed416cec06fbbc36ecd6 100644 (file)
@@ -139,7 +139,7 @@ func (P *Printer) Fields(list *AST.List) {
        for i, n := 0, list.len(); i < n; i++ {
                x := list.at(i).(*AST.Expr);
                if i > 0 {
-                       if prev == Scanner.TYPE {
+                       if prev == Scanner.TYPE && x.tok != Scanner.STRING || prev == Scanner.STRING {
                                P.semi, P.newl = true, 1;
                        } else if prev == x.tok {
                                P.String(0, ", ");
diff --git a/usr/gri/pretty/selftest0.go b/usr/gri/pretty/selftest0.go
new file mode 100644 (file)
index 0000000..09b1283
--- /dev/null
@@ -0,0 +1,11 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+type Proto struct {
+       a int "a tag";
+       b, c, d *Proto "bcd" "tag";
+       *Proto "proto tag"
+}
index a4ca3ecaa769d95c96ce0142c6eef8f47852a497..141193cf2a589a9d7260a713e4616456bc1964a0 100755 (executable)
@@ -21,7 +21,7 @@ count() {
 apply1() {
        #echo $1 $2
        case `basename $F` in
-       selftest.go | func3.go | bug014.go | bug029.go | bug032.go | bug050.go | \
+       selftest1.go | func3.go | bug014.go | bug029.go | bug032.go | bug050.go | \
        bug068.go | bug088.go | bug083.go | bug106.go ) ;;  # skip - files contain syntax errors
        * ) $1 $2; count ;;
        esac
@@ -120,11 +120,11 @@ runtests() {
 }
 
 
-# run selftest always
-./pretty -t selftest.go > $TMP1
+# run selftest1 always
+./pretty -t selftest1.go > $TMP1
 if [ $? != 0 ]; then
        cat $TMP1
-       echo "Error (selftest): pretty -t selftest.go"
+       echo "Error (selftest1): pretty -t selftest1.go"
        exit 1
 fi
 count