X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2Fmisc%2FReflectiveWalker.java;h=71e597cd2bf17919f4224ec87008ae0b3d176716;hp=2334d621f1c65e90fc4e487713b8e8ec95304939;hb=5cf6851e385edfdec4955120e03bf7e282dc8a68;hpb=0a0227b9180534d2a431f3d6e08a398bde2244c4 diff --git a/src/edu/berkeley/sbp/misc/ReflectiveWalker.java b/src/edu/berkeley/sbp/misc/ReflectiveWalker.java index 2334d62..71e597c 100644 --- a/src/edu/berkeley/sbp/misc/ReflectiveWalker.java +++ b/src/edu/berkeley/sbp/misc/ReflectiveWalker.java @@ -53,11 +53,18 @@ public class ReflectiveWalker extends StringWalker { } return ret.toString(); } + public Object walk(Tree 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() + ".()"); + if (ret != null) { + if (!complain) return null; + throw new Error("two constructors with " + nonVoid + " parameters: " + c.getName() + ".()"); + } 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"); }