checkpoint
[sbp.git] / src / edu / berkeley / sbp / meta / AnnotationGrammarBindingResolver.java
index ca10c04..cb2a161 100644 (file)
@@ -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<Class> alc = new ArrayList<Class>();
+        ArrayList<Method> alm = new ArrayList<Method>();
+        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<Object>();
-    }
+    public Object repeatTag() { return new Tree.ArrayBuildingTreeFunctor<Object>(); }
 
     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<Class> alc, ArrayList<Method> 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);
+    }
+
 }