+++ /dev/null
-// Copyright 2006 all rights reserved; see LICENSE file for BSD-style license
-
-package edu.berkeley.sbp.bind;
-
-import edu.berkeley.sbp.util.*;
-import edu.berkeley.sbp.*;
-import edu.berkeley.sbp.chr.*;
-import edu.berkeley.sbp.bind.*;
-import java.util.*;
-import java.lang.annotation.*;
-import java.lang.reflect.*;
-import java.io.*;
-import java.security.*;
-import static edu.berkeley.sbp.util.Reflection.*;
-
-public abstract class Bindable implements ToJava {
-
- public abstract String getSimpleName();
- public abstract String toString();
- public abstract <A extends Annotation> A getAnnotation(Class<A> c);
- public abstract Object impose(Object[] fields);
- public boolean isAnnotationPresent(Class<? extends Annotation> c) { return getAnnotation(c) != null; }
-
- public abstract Annotation[][] getArgAnnotations();
- public abstract String[] getArgNames();
- public abstract Class[] getArgTypes();
-
- public Binding createBinding() { return new SimpleBinding(); }
- public Binding createBinding(final int[] map) { return new SimpleBinding(map); }
- public Binding createBinding(final int[] map, Object prepend) { return new SimpleBinding(map, prepend); }
-
-
- public static Bindable create(Object o) {
- if (o instanceof Class) return new BindableClass((Class)o);
- if (o instanceof Method) return new BindableMethod((Method)o);
- if (o instanceof Constructor) return new BindableConstructor((Constructor)o);
- return null;
- }
-
- // Subclasses //////////////////////////////////////////////////////////////////////////////
-
- private static class BindableMethod extends Bindable {
- private final Method _method;
- public String toString() { return "BindableMethod["+_method+"]"; }
- public BindableMethod(Method _method) { this._method = _method; }
- public String getSimpleName() { return _method.getName(); }
- public <A extends Annotation> A getAnnotation(final Class<A> c) { return _method.getAnnotation(c); }
- public Object impose(Object[] fields) { return Reflection.impose(_method, fields); }
- public Annotation[][] getArgAnnotations() { return _method.getParameterAnnotations(); }
- public String[] getArgNames() { return new String[_method.getParameterTypes().length]; }
- public Class[] getArgTypes() { return _method.getParameterTypes(); }
- public void toJava(StringBuffer sb) {
- sb.append("Bindable.create(");
- sb.append(_method.getDeclaringClass().getName().replace('$','.'));
- sb.append(".class.getMethod(\"");
- sb.append(_method.getName());
- sb.append("\", ");
- appendClassArray(sb, _method.getParameterTypes());
- sb.append("))");
- }
- }
-
- private static class BindableConstructor extends Bindable {
- private final Constructor _constructor;
- public String toString() { return "BindableConstructor["+_constructor+"]"; }
- public BindableConstructor(Constructor _constructor) { this._constructor = _constructor; }
- public String getSimpleName() { return _constructor.getDeclaringClass().getSimpleName(); }
- public <A extends Annotation> A getAnnotation(Class<A> c) { return _constructor.getAnnotation(c); }
- public Object impose(Object[] fields) { return Reflection.impose(_constructor, fields); }
- public Annotation[][] getArgAnnotations() { return _constructor.getParameterAnnotations(); }
- public String[] getArgNames() { return new String[_constructor.getParameterTypes().length]; }
- public Class[] getArgTypes() { return _constructor.getParameterTypes(); }
- public void toJava(StringBuffer sb) {
- sb.append("Bindable.create(");
- sb.append(_constructor.getDeclaringClass().getName().replace('$','.'));
- sb.append(".class.getConstructor(");
- appendClassArray(sb, _constructor.getParameterTypes());
- sb.append("))");
- }
- }
-
- private static class BindableClass extends Bindable {
- private final Class _class;
- public String toString() { return "BindableClass["+_class+"]"; }
- public BindableClass(Class _class) { this._class = _class; }
- public String getSimpleName() { return _class.getSimpleName(); }
- public <A extends Annotation> A getAnnotation(Class<A> c) { return (A)_class.getAnnotation(c); }
- public Object impose(Object[] fields) { return Reflection.impose(_class, fields); }
- public Annotation[][] getArgAnnotations() {
- Field[] fields = _class.getFields();
- Annotation[][] ret = new Annotation[fields.length][];
- for(int i=0; i<fields.length; i++)
- ret[i] = fields[i].getAnnotations();
- return ret;
- }
- public String[] getArgNames() {
- Field[] fields = _class.getFields();
- String[] ret = new String[fields.length];
- for(int i=0; i<fields.length; i++)
- ret[i] = fields[i].getName();
- return ret;
- }
- public Class[] getArgTypes() {
- Field[] fields = _class.getFields();
- Class[] ret = new Class[fields.length];
- for(int i=0; i<fields.length; i++)
- ret[i] = fields[i].getType();
- return ret;
- }
- public void toJava(StringBuffer sb) {
- sb.append("Bindable.create(");
- sb.append(_class.getName().replace('$','.'));
- sb.append(".class)");
- }
- }
-
-
- // Helpers //////////////////////////////////////////////////////////////////////////////
-
- private static void appendClassArray(StringBuffer sb, Class[] c) {
- sb.append("new Class[] {");
- for(int i=0; i<c.length; i++) {
- sb.append(makeClass(c[i]));
- sb.append(".class");
- if (i<c.length-1)
- sb.append(",");
- }
- sb.append("}");
- }
-
- private static String makeClass(Class c) {
- if (!c.isArray()) return c.getName().replace('$','.');
- return makeClass(c.getComponentType())+"[]";
- }
-
-
- // Creating Bindings //////////////////////////////////////////////////////////////////////////////
-
- private class SimpleBinding implements Binding, ToJava {
- private int[] map = null;
- private Object prepend = null;
- public SimpleBinding() { }
- public SimpleBinding(int[] map) { this.map = map; }
- public SimpleBinding(int[] map, Object prepend) { this.map = map; this.prepend = prepend; }
-
- public Object invoke(Object[] o) {
- if (map==null) return impose(o);
- 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]+(prepend==null?0:1)] = o[i];
- if (prepend != null) o2[0] = prepend;
- return impose(o2);
- }
-
- public void toJava(StringBuffer sb) {
- Bindable.this.toJava(sb);
- sb.append(".createBinding(");
- if (map != null) {
- sb.append("new int[] {");
- for(int i=0; i<map.length; i++) {
- sb.append(i);
- if (i<map.length-1) sb.append(",");
- }
- sb.append("}");
- }
- sb.append(")");
- }
- }
-
-}
+++ /dev/null
-// Copyright 2006 all rights reserved; see LICENSE file for BSD-style license
-
-package edu.berkeley.sbp.bind;
-import edu.berkeley.sbp.*;
-import edu.berkeley.sbp.util.*;
-import edu.berkeley.sbp.bind.*;
-import java.io.*;
-import java.util.*;
-import java.lang.reflect.*;
-
-public class BindingFunctor<T> implements TreeFunctor<T,Object>, ToJava {
- private Binding _binding;
- private String _toString;
- public String toString() {
- return _toString;
- }
- public BindingFunctor(String toString, Binding binding) {
- this._binding = binding;
- this._toString = toString;
- }
- public void toJava(StringBuffer sb) {
- sb.append("new BindingFunctor(");
- sb.append("\"");
- sb.append(StringUtil.toJavaString(_toString));
- sb.append("\", ");
- _binding.toJava(sb);
- sb.append(")");
- }
- public Object invoke(Iterable<Tree<T>> t) {
- ArrayList ret = new ArrayList();
- for(Tree tc : t) {
- if (tc.head() != null && tc.head() instanceof Functor)
- ret.add(((TreeFunctor<Object,Object>)tc.head()).invoke(tc.children()));
- else if (tc.size() == 0)
- ret.add(tc.head());
- else {
- System.err.println("FIXME: don't know what to do about " + tc);
- ret.add(null);
- }
- }
- Object[] o = (Object[])ret.toArray(new Object[0]);
- return _binding.invoke(o);
- }
-}