X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2Fmisc%2FReflectiveWalker.java;h=f22f4b8583d00a9670874087043708a451e6d374;hp=2334d621f1c65e90fc4e487713b8e8ec95304939;hb=e4b4b7b0da38d93fc9160b0058a81c1fc7f6773b;hpb=0a0227b9180534d2a431f3d6e08a398bde2244c4 diff --git a/src/edu/berkeley/sbp/misc/ReflectiveWalker.java b/src/edu/berkeley/sbp/misc/ReflectiveWalker.java index 2334d62..f22f4b8 100644 --- a/src/edu/berkeley/sbp/misc/ReflectiveWalker.java +++ b/src/edu/berkeley/sbp/misc/ReflectiveWalker.java @@ -5,6 +5,7 @@ import java.io.*; import java.util.*; import java.lang.reflect.*; +/** use of this class is not recommended; it can handle only S-attributed grammars */ public class ReflectiveWalker extends StringWalker { public ReflectiveWalker() { this.target = this; } public ReflectiveWalker(Object target) { this.target = target; } @@ -53,11 +54,25 @@ 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); + if (m!=null) { + if ((m instanceof Method) && ((Method)m).getReturnType()==Void.TYPE) { + Reflection.fuzzyInvoke(target, m, new Object[0]); + } + } + } + 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 +84,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 +104,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 +115,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"); }