checkpoint
[sbp.git] / src / edu / berkeley / sbp / misc / ReflectiveWalker.java
index 2334d62..71e597c 100644 (file)
@@ -53,11 +53,18 @@ public class ReflectiveWalker extends StringWalker {
         }
         return ret.toString();
     }
+    public Object walk(Tree<String> tree) {
+        if (tree.head()!=null) {
+            Member m = member("$"+normalize(tree.head()), 0, false);
+        }
+        return super.walk(tree);
+    }
     public Object walk(String tag, Object[] argo) {
         if (argo.length==0) return super.walk(tag, argo);
         if (argo==null) return tag;
         if (tag==null || "".equals(tag)) return argo;
-        Member m = member(normalize(tag), argo.length);
+        Member m = member(normalize(tag), argo.length, argo.length>0);
+        if (m==null) return super.walk(tag, argo);
         //System.out.println("preparing to invoke method " + (m==null ? "null" : (m.toString())) + " for sequence " + (owner()+"."+tag));
         if (m != null) return Reflection.fuzzyInvoke(target, m, argo);
         if (argo.length==0) return null;
@@ -69,14 +76,17 @@ public class ReflectiveWalker extends StringWalker {
         return ret;
     }
 
-    public Member member(String methodName, int nonVoid) {
+    public Member member(String methodName, int nonVoid, boolean complain) {
         Class target = this.target.getClass();
         if (methodName == null || methodName.equals("")) return null;
         Member ret = null;
         for (Method m : target.getMethods()) {
             if (!m.getName().equals(methodName)) continue;
             if (m.getParameterTypes().length != nonVoid) continue;
-            if (ret != null) throw new Error("two methods with " + nonVoid + " parameters: " + target.getName() + "." + methodName);
+            if (ret != null) {
+                if (!complain) return null;
+                throw new Error("two methods with " + nonVoid + " parameters: " + target.getName() + "." + methodName);
+            }
             ret = m;
         }
         if (ret != null) return ret;
@@ -86,7 +96,10 @@ public class ReflectiveWalker extends StringWalker {
             if (c != null) {
                 for (Constructor m : c.getConstructors()) {
                     if (m.getParameterTypes().length != nonVoid) continue;
-                    if (ret != null) throw new Error("two constructors with " + nonVoid + " parameters: " + c.getName() + ".<init>()");
+                    if (ret != null) {
+                        if (!complain) return null;
+                        throw new Error("two constructors with " + nonVoid + " parameters: " + c.getName() + ".<init>()");
+                    }
                     ret = m;
                 }
                 if (ret != null) return ret;
@@ -94,6 +107,7 @@ public class ReflectiveWalker extends StringWalker {
             t = t.getSuperclass();
         }
         if (ret != null) return ret;
+        if (!complain) return null;
         throw new Error("while computing return type of " +methodName+ " could not find method with name " + methodName +
                         " and " + nonVoid + " arguments");
     }