public Sequence makeSequence(Production p) {
return Sequence.rewritingSequence(new TargetReducer(p, buildSequence(p), "reducer-"+this), p.elements, p.labels, p.drops);
}
- public abstract Object plant(Object[] fields, int[] map);
+ public abstract Object plant(Object[] fields);
public boolean isRaw() { return false; }
public Object invokeRaw(Iterable<Tree<Object>> t) { return null; }
public class TargetReducer implements Tree.TreeFunctor<Object,Object> {
}
}
System.err.println("input tree: " + t);
- return plant(ret.toArray(new Object[0]), map);
+ Object[] o = (Object[])ret.toArray(new Object[0]);
+ int max = 0;
+ for(int i=0; i<map.length; i++) max = Math.max(map[i], max);
+ Object[] o2 = new Object[max+1];
+ for(int i=0; i<o.length; i++) o2[map[i]] = o[i];
+ return plant(o2);
}
}
}
return new TargetConstructor(c).buildSequence(p);
return null;
}
- public Object plant(Object[] fields, int[] map) {
+ public Object plant(Object[] fields) {
try {
Object ret = _class.newInstance();
Field[] f = _class.getFields();
int j = 0;
- for(int i=0; i<f.length; i++)
- if (map[i] != -1) {
- Object tgt = Reflection.lub(fields[map[i]]);
- if (f[i].getType() == String.class) tgt = stringify(tgt);
- // FUGLY
- tgt = coerce(tgt, f[i].getType());
- System.err.println("setting a " + f[i].getType().getName() + " to " + Reflection.show(tgt));
- f[i].set(ret, tgt);
- }
+ for(int i=0; i<f.length; i++) {
+ Object tgt = Reflection.lub(fields[i]);
+ if (f[i].getType() == String.class) tgt = stringify(tgt);
+ // FUGLY
+ tgt = coerce(tgt, f[i].getType());
+ System.err.println("setting a " + f[i].getType().getName() + " to " + Reflection.show(tgt));
+ f[i].set(ret, tgt);
+ }
return ret;
} catch (Exception e) {
e.printStackTrace();
argtags[i+ofs] = (arg)a;
return buildSequence(p, names, argtags);
}
- public Object plant(Object[] fields, int[] map) {
+ public Object plant(Object[] fields) {
try {
Class[] argTypes = _ctor.getParameterTypes();
Object[] args = new Object[argTypes.length];
int j = 0;
- for(int i=0; i<args.length; i++)
- if (map[i] != -1) {
- Object tgt = Reflection.lub(fields[map[i]]);
- if (argTypes[i] == String.class) tgt = stringify(tgt);
- // FUGLY
- tgt = coerce(tgt, argTypes[i]);
- System.err.println("setting a " + argTypes[i].getName() + " to " + Reflection.show(tgt));
- args[i] = tgt;
- }
+ for(int i=0; i<args.length; i++) {
+ Object tgt = Reflection.lub(fields[i]);
+ if (argTypes[i] == String.class) tgt = stringify(tgt);
+ // FUGLY
+ tgt = coerce(tgt, argTypes[i]);
+ System.err.println("setting a " + argTypes[i].getName() + " to " + Reflection.show(tgt));
+ args[i] = tgt;
+ }
return _ctor.newInstance(args);
} catch (Exception e) {
throw new RuntimeException(e);
throw new RuntimeException(e);
}
}
- public Object plant(Object[] fields, int[] map) {
+ public Object plant(Object[] fields) {
try {
Class[] argTypes = _method.getParameterTypes();
Object[] args = new Object[argTypes.length];
int j = 0;
- for(int i=0; i<args.length; i++)
- if (map[i] != -1) {
- Object tgt = Reflection.lub(fields[map[i]]);
- if (argTypes[i] == String.class) tgt = stringify(tgt);
- // FUGLY
- tgt = coerce(tgt, argTypes[i]);
- System.err.println("setting a " + argTypes[i].getName() + " to " + Reflection.show(tgt));
- args[i] = tgt;
- }
+ for(int i=0; i<args.length; i++) {
+ Object tgt = Reflection.lub(fields[i]);
+ if (argTypes[i] == String.class) tgt = stringify(tgt);
+ // FUGLY
+ tgt = coerce(tgt, argTypes[i]);
+ System.err.println("setting a " + argTypes[i].getName() + " to " + Reflection.show(tgt));
+ args[i] = tgt;
+ }
System.err.println("invoking " + _method + " with " + Reflection.show(args));
return _method.invoke(null, args);
} catch (Exception e) {