00001
00005 package edu.mit.csail.sdg.squander.spec;
00006
00007 import java.lang.reflect.Method;
00008
00009 import java.lang.reflect.Modifier;
00010 import java.util.ArrayList;
00011 import java.util.LinkedHashMap;
00012 import java.util.List;
00013 import java.util.Map;
00014 import java.util.Map.Entry;
00015
00016 import edu.mit.csail.sdg.squander.spec.JType.Factory;
00017 import edu.mit.csail.sdg.squander.spec.JType.Unary;
00018 import edu.mit.csail.sdg.squander.utils.Utils;
00019
00020
00021 import static edu.mit.csail.sdg.squander.spec.JField.getTypeParams;
00022
00023 public class JMethod {
00024
00025 private final String methodName;
00026 private final JType.Unary declaringClass;
00027 private final Map<String, JType.Unary> params;
00028 private final JType.Unary returnType;
00029 private final boolean isStatic;
00030
00031 private MethodSpec spec;
00032
00033 public JMethod(String methodName, Class<?> declaringClass, Map<String, Class<?>> params,
00034 Class<?> returnType, boolean isStatic) {
00035 this(methodName, Factory.instance.newJType(declaringClass), convertMap(params),
00036 Factory.instance.newJType(returnType), isStatic);
00037 }
00038
00039 private static Map<String, Unary> convertMap(Map<String, Class<?>> map) {
00040 Map<String, JType.Unary> result = new LinkedHashMap<String, Unary>();
00041 for (Entry<String, Class<?>> e : map.entrySet()) {
00042 result.put(e.getKey(), Factory.instance.newJType(e.getValue()));
00043 }
00044 return result;
00045 }
00046
00047 public JMethod(String methodName, JType.Unary declaringClass, Map<String, JType.Unary> params,
00048 JType.Unary returnType, boolean isStatic) {
00049 this.methodName = methodName;
00050 this.declaringClass = declaringClass;
00051 this.params = params;
00052 this.returnType = returnType;
00053 this.isStatic = isStatic;
00054 }
00055
00056 public String name() { return methodName; }
00057 public Unary declaringClass() { return declaringClass; }
00058 public Map<String, Unary> params() { return params; }
00059 public List<Unary> paramTypes() { return new ArrayList<Unary>(params.values()); }
00060 public Unary returnType() { return returnType; }
00061 public boolean isStatic() { return isStatic; }
00062 public MethodSpec spec() { return spec; }
00063
00064 public void setSpec(MethodSpec spec) { this.spec = spec; }
00065
00066 public static JMethod forJavaMethod(Method m) {
00067 Factory factory = JType.Factory.instance;
00068 Map<String, Unary> locals = new LinkedHashMap<String, Unary>();
00069 Class<?>[] params = m.getParameterTypes();
00070 for (int i = 0; i < params.length; i++) {
00071 String name = Utils.getMethodParamName(m, i);
00072 locals.put(name, factory.newJType(params[i], getTypeParams(m.getGenericParameterTypes()[i])));
00073 }
00074 boolean isStatic = Modifier.isStatic(m.getModifiers());
00075 Unary declClass = factory.newJType(m.getDeclaringClass());
00076 Unary retType = factory.newJType(m.getReturnType(), getTypeParams(m.getGenericReturnType()));
00077 JMethod jm = new JMethod(m.getName(), declClass, locals, retType, isStatic);
00078 MethodSpec spec = new ReflectiveSpecProvider().extractMethodSpec(m, NameSpace.forMethod(jm));
00079 jm.spec = spec;
00080 return jm;
00081 }
00082
00083 }