X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2Fmeta%2FAnnotationGrammarBindingResolver.java;h=cb2a161c1aae910ffd936655f5469f713e692ff1;hp=825dc56cab56344f022b7b40b59d06ebbe70dd49;hb=bd03a63787dd15ecb9840aa0ee0315d54d738564;hpb=1976ed1b8cf49284016a99114e717d46a3be3617 diff --git a/src/edu/berkeley/sbp/meta/AnnotationGrammarBindingResolver.java b/src/edu/berkeley/sbp/meta/AnnotationGrammarBindingResolver.java index 825dc56..cb2a161 100644 --- a/src/edu/berkeley/sbp/meta/AnnotationGrammarBindingResolver.java +++ b/src/edu/berkeley/sbp/meta/AnnotationGrammarBindingResolver.java @@ -15,6 +15,7 @@ public class AnnotationGrammarBindingResolver extends GrammarBindingResolver { private final Class _cl; private final Class[] _inner; + private final Method[] _allMethods; public AnnotationGrammarBindingResolver() { this(MetaGrammarBindings.class); @@ -22,21 +23,20 @@ public class AnnotationGrammarBindingResolver extends GrammarBindingResolver { public AnnotationGrammarBindingResolver(Class c) { this._cl = c; - this._inner = c.getDeclaredClasses(); + ArrayList alc = new ArrayList(); + ArrayList alm = new ArrayList(); + add(c, alc, alm); + this._inner = (Class[])alc.toArray(new Class[0]); + this._allMethods = (Method[])alm.toArray(new Method[0]); } - public AnnotationGrammarBindingResolver(Class c, Class[] inner) { - this._cl = c; - this._inner = inner; - } - - public Object repeatTag() { - return new Tree.ArrayBuildingTreeFunctor(); - } + public Object repeatTag() { return new Tree.ArrayBuildingTreeFunctor(); } public Sequence tryResolveTag(String tag, String nonTerminalName, Element[] els, Object[] labels, boolean[] drops) { MetaGrammar.Production p = new MetaGrammar.Production(tag, nonTerminalName, els, labels, drops); - for(Method m : _cl.getMethods()) + if (labels != null && labels.length > 0 && "numeric".equals(labels[0])) + System.out.println("here! "); + for(Method m : _allMethods) if (new MetaGrammar.Target(m).isCompatible(p)) return new MetaGrammar.Target(m).makeSequence(p); for(Class c : _inner) @@ -61,4 +61,18 @@ public class AnnotationGrammarBindingResolver extends GrammarBindingResolver { return Sequence.rewritingSequence(tag, els, labels, drops); } } + + // helper + + private static void add(Class cl, ArrayList alc, ArrayList alm) { + for(Method m : cl.getDeclaredMethods()) + alm.add(m); + for(Class c : cl.getDeclaredClasses()) { + alc.add(c); + add(c, alc, alm); + } + if (cl.getSuperclass() != Object.class) + add(cl.getSuperclass(), alc, alm); + } + }