Memoize types/TypeName() for performance.
types/Parse() returns an error if the parse is incomplete.
This commit is contained in:
parent
da2008c597
commit
4867bb80f4
|
@ -2,7 +2,23 @@ package types
|
||||||
|
|
||||||
// Parsers for recognizing type names in C/Objective-C
|
// Parsers for recognizing type names in C/Objective-C
|
||||||
|
|
||||||
func TypeName(s string, n *Node) (string, *Node) {
|
var TypeName func(s string, n *Node) (string, *Node)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
cache := map[string]*Node{}
|
||||||
|
TypeName = func(s string, n *Node) (string, *Node) {
|
||||||
|
if n2,ok := cache[s]; ok {
|
||||||
|
return "",n2
|
||||||
|
}
|
||||||
|
s2,n2 := _TypeName(s,n)
|
||||||
|
if s2 == "" {
|
||||||
|
cache[s] = n2
|
||||||
|
}
|
||||||
|
return s2,n2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func _TypeName(s string, n *Node) (string, *Node) {
|
||||||
return ChildOf(NewNode("TypeName"),Seq(
|
return ChildOf(NewNode("TypeName"),Seq(
|
||||||
SpecifierQualifierList,
|
SpecifierQualifierList,
|
||||||
Opt(AbstractDeclarator),
|
Opt(AbstractDeclarator),
|
||||||
|
|
|
@ -15,9 +15,12 @@ func dbg(f string, xs ...interface{}) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func Parse(s string) *Node {
|
func Parse(s string) (*Node, error) {
|
||||||
_, n2 := TypeName(s,NewNode("AST"))
|
s2, n := TypeName(s,NewNode("AST"))
|
||||||
return n2
|
if s2 != "" {
|
||||||
|
return n,fmt.Errorf("Parse failed or incomplete. Remainder: %s",s2)
|
||||||
|
}
|
||||||
|
return n, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
//Evaluate a node to determine if it is a pointer or array
|
//Evaluate a node to determine if it is a pointer or array
|
||||||
|
|
Loading…
Reference in New Issue
Block a user