]> Cypherpunks repositories - gostls13.git/commitdiff
go/printer: don't crash if AST contains BadXXX nodes
authorRobert Griesemer <gri@golang.org>
Wed, 11 Jan 2012 16:32:03 +0000 (08:32 -0800)
committerRobert Griesemer <gri@golang.org>
Wed, 11 Jan 2012 16:32:03 +0000 (08:32 -0800)
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5535048

src/pkg/go/printer/printer.go
src/pkg/go/printer/printer_test.go

index a78cfc65fccb372399048449b35c282900599d13..c720f2e665c479b263edd5c399a2573ac6b2e523 100644 (file)
@@ -773,8 +773,13 @@ func (p *printer) print(args ...interface{}) {
                                next = p.fset.Position(x) // accurate position of next item
                        }
                        tok = p.lastTok
+               case string:
+                       // incorrect AST - print error message
+                       data = x
+                       isLit = true
+                       tok = token.STRING
                default:
-                       fmt.Fprintf(os.Stderr, "print: unsupported argument type %T\n", f)
+                       fmt.Fprintf(os.Stderr, "print: unsupported argument %v (%T)\n", f, f)
                        panic("go/printer type")
                }
                p.lastTok = tok
index 45477d40f6e99ced3300a880c3c4e72754ceed34..525fcc1595f7ef096b51f3457892365fafb88e99 100644 (file)
@@ -204,3 +204,18 @@ func init() {
                panic("got " + s + ", want " + name)
        }
 }
+
+// Verify that the printer doesn't crash if the AST contains BadXXX nodes.
+func TestBadNodes(t *testing.T) {
+       const src = "package p\n("
+       const res = "package p\nBadDecl\n"
+       f, err := parser.ParseFile(fset, "", src, parser.ParseComments)
+       if err == nil {
+               t.Errorf("expected illegal program")
+       }
+       var buf bytes.Buffer
+       Fprint(&buf, fset, f)
+       if buf.String() != res {
+               t.Errorf("got %q, expected %q", buf.String(), res)
+       }
+}