X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2Fmeta%2FAnnotationGrammarBindingResolver.java;h=cb2a161c1aae910ffd936655f5469f713e692ff1;hp=ca10c04f1d8753ae0a627101ce96ac1f7c59331c;hb=bd03a63787dd15ecb9840aa0ee0315d54d738564;hpb=280f672a6fd0674a5dfca285791f1e465cac5c9e diff --git a/src/edu/berkeley/sbp/meta/AnnotationGrammarBindingResolver.java b/src/edu/berkeley/sbp/meta/AnnotationGrammarBindingResolver.java index ca10c04..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,23 +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); if (labels != null && labels.length > 0 && "numeric".equals(labels[0])) System.out.println("here! "); - for(Method m : _cl.getMethods()) + for(Method m : _allMethods) if (new MetaGrammar.Target(m).isCompatible(p)) return new MetaGrammar.Target(m).makeSequence(p); for(Class c : _inner) @@ -63,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); + } + }