aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/ast
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/ast')
-rw-r--r--pkg/ast/parser_test.go56
-rw-r--r--pkg/ast/testdata/all.txt2
-rw-r--r--pkg/ast/walk.go66
3 files changed, 57 insertions, 67 deletions
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 <linux/foo.h>
include "linux/foo.h"
incdir </foo/bar>
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))