From e2ffb4fc9111e28f1d8e0e987cb06172cbbd4e84 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Sun, 27 Aug 2017 15:08:11 +0200 Subject: pkg/compiler: move more const-processing code to compiler --- pkg/ast/parser_test.go | 56 ++++++++++++++++++++-------------------- pkg/ast/testdata/all.txt | 2 ++ pkg/ast/walk.go | 66 +++++++++++++++++++----------------------------- 3 files changed, 57 insertions(+), 67 deletions(-) (limited to 'pkg/ast') diff --git a/pkg/ast/parser_test.go b/pkg/ast/parser_test.go index 809a0beaf..84a5fedf0 100644 --- a/pkg/ast/parser_test.go +++ b/pkg/ast/parser_test.go @@ -27,35 +27,37 @@ func TestParseAll(t *testing.T) { if err != nil { t.Fatalf("failed to read file: %v", err) } - errorHandler := func(pos Pos, msg string) { - t.Fatalf("%v:%v:%v: %v", pos.File, pos.Line, pos.Col, msg) - } - desc := Parse(data, file.Name(), errorHandler) - if desc == nil { - t.Fatalf("parsing failed, but no error produced") - } - data2 := Format(desc) - desc2 := Parse(data2, file.Name(), errorHandler) - if desc2 == nil { - t.Fatalf("parsing failed, but no error produced") - } - if len(desc.Nodes) != len(desc2.Nodes) { - t.Fatalf("formatting number of top level decls: %v/%v", - len(desc.Nodes), len(desc2.Nodes)) - } - for i := range desc.Nodes { - n1, n2 := desc.Nodes[i], desc2.Nodes[i] - if n1 == nil { - t.Fatalf("got nil node") + t.Run(file.Name(), func(t *testing.T) { + eh := func(pos Pos, msg string) { + t.Fatalf("%v:%v:%v: %v", pos.File, pos.Line, pos.Col, msg) } - if !reflect.DeepEqual(n1, n2) { - t.Fatalf("formatting changed code:\n%#v\nvs:\n%#v", n1, n2) + desc := Parse(data, file.Name(), eh) + if desc == nil { + t.Fatalf("parsing failed, but no error produced") } - } - data3 := Format(Clone(desc)) - if !bytes.Equal(data, data3) { - t.Fatalf("Clone lost data") - } + data2 := Format(desc) + desc2 := Parse(data2, file.Name(), eh) + if desc2 == nil { + t.Fatalf("parsing failed, but no error produced") + } + if len(desc.Nodes) != len(desc2.Nodes) { + t.Fatalf("formatting number of top level decls: %v/%v", + len(desc.Nodes), len(desc2.Nodes)) + } + for i := range desc.Nodes { + n1, n2 := desc.Nodes[i], desc2.Nodes[i] + if n1 == nil { + t.Fatalf("got nil node") + } + if !reflect.DeepEqual(n1, n2) { + t.Fatalf("formatting changed code:\n%#v\nvs:\n%#v", n1, n2) + } + } + data3 := Format(Clone(desc)) + if !bytes.Equal(data, data3) { + t.Fatalf("Clone lost data") + } + }) } } diff --git a/pkg/ast/testdata/all.txt b/pkg/ast/testdata/all.txt index 443f26368..9ddf67844 100644 --- a/pkg/ast/testdata/all.txt +++ b/pkg/ast/testdata/all.txt @@ -22,6 +22,8 @@ call(foo int32:"bar") ### unexpected string, expecting int, identifier define FOO `bar` define FOO `bar ### C expression is not terminated +foo(x int32[1:2:3, opt]) ### unexpected ':', expecting ']' + include include "linux/foo.h" incdir diff --git a/pkg/ast/walk.go b/pkg/ast/walk.go index 90a92cf77..af62884fe 100644 --- a/pkg/ast/walk.go +++ b/pkg/ast/walk.go @@ -8,85 +8,71 @@ import ( ) // Walk calls callback cb for every node in AST. -func Walk(desc *Description, cb func(n Node)) { +func Walk(desc *Description, cb func(n, parent Node)) { for _, n := range desc.Nodes { - WalkNode(n, cb) + WalkNode(n, nil, cb) } } -func WalkNode(n0 Node, cb func(n Node)) { +func WalkNode(n0, parent Node, cb func(n, parent Node)) { + cb(n0, parent) switch n := n0.(type) { case *NewLine: - cb(n) case *Comment: - cb(n) case *Include: - cb(n) - WalkNode(n.File, cb) + WalkNode(n.File, n, cb) case *Incdir: - cb(n) - WalkNode(n.Dir, cb) + WalkNode(n.Dir, n, cb) case *Define: - cb(n) - WalkNode(n.Name, cb) - WalkNode(n.Value, cb) + WalkNode(n.Name, n, cb) + WalkNode(n.Value, n, cb) case *Resource: - cb(n) - WalkNode(n.Name, cb) - WalkNode(n.Base, cb) + WalkNode(n.Name, n, cb) + WalkNode(n.Base, n, cb) for _, v := range n.Values { - WalkNode(v, cb) + WalkNode(v, n, cb) } case *Call: - cb(n) - WalkNode(n.Name, cb) + WalkNode(n.Name, n, cb) for _, f := range n.Args { - WalkNode(f, cb) + WalkNode(f, n, cb) } if n.Ret != nil { - WalkNode(n.Ret, cb) + WalkNode(n.Ret, n, cb) } case *Struct: - cb(n) - WalkNode(n.Name, cb) + WalkNode(n.Name, n, cb) for _, f := range n.Fields { - WalkNode(f, cb) + WalkNode(f, n, cb) } for _, a := range n.Attrs { - WalkNode(a, cb) + WalkNode(a, n, cb) } for _, c := range n.Comments { - WalkNode(c, cb) + WalkNode(c, n, cb) } case *IntFlags: - cb(n) - WalkNode(n.Name, cb) + WalkNode(n.Name, n, cb) for _, v := range n.Values { - WalkNode(v, cb) + WalkNode(v, n, cb) } case *StrFlags: - cb(n) - WalkNode(n.Name, cb) + WalkNode(n.Name, n, cb) for _, v := range n.Values { - WalkNode(v, cb) + WalkNode(v, n, cb) } case *Ident: - cb(n) case *String: - cb(n) case *Int: - cb(n) case *Type: - cb(n) for _, t := range n.Args { - WalkNode(t, cb) + WalkNode(t, n, cb) } case *Field: - cb(n) - WalkNode(n.Name, cb) - WalkNode(n.Type, cb) + WalkNode(n.Name, n, cb) + WalkNode(n.Type, n, cb) for _, c := range n.Comments { - WalkNode(c, cb) + WalkNode(c, n, cb) } default: panic(fmt.Sprintf("unknown AST node: %#v", n)) -- cgit mrf-deployment