Add imports for generic types in method arguments

git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@5785 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
Charlie Groves
2009-05-13 08:40:28 +00:00
parent ae7373cdbc
commit c6dd5ba201
@@ -21,9 +21,11 @@
package com.threerings.presents.tools;
import java.lang.reflect.GenericArrayType;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.WildcardType;
import java.util.ArrayList;
import java.util.Arrays;
@@ -47,6 +49,7 @@ import org.apache.velocity.app.VelocityEngine;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.samskivert.util.Logger;
import com.samskivert.util.StringUtil;
import com.samskivert.velocity.VelocityUtil;
@@ -113,8 +116,7 @@ public abstract class InvocationTask extends Task
{
this.method = method;
// we need to look through our arguments and note any needed
// imports in the supplied table
// if this method has listener arguments, we need to add listener argument info for them
Class<?>[] args = method.getParameterTypes();
for (int ii = 0; ii < args.length; ii++) {
Class<?> arg = args[ii];
@@ -122,13 +124,15 @@ public abstract class InvocationTask extends Task
arg = arg.getComponentType();
}
// if this is a listener, we need to add a listener
// argument info for it
if (_ilistener.isAssignableFrom(arg)) {
listenerArgs.add(new ListenerArgument(ii, arg));
}
}
imports.add(args[ii]);
// we need to look through our arguments and note any needed imports in the supplied
// table
for (Type type : method.getGenericParameterTypes()) {
addImportsForType(type, imports);
}
// import Transport if used
@@ -137,6 +141,31 @@ public abstract class InvocationTask extends Task
}
}
protected void addImportsForType (Type type, ImportSet imports)
{
if (type instanceof Class) {
imports.add((Class<?>)type);
} else if (type instanceof ParameterizedType) {
imports.add((Class<?>)((ParameterizedType)type).getRawType());
for (Type param : ((ParameterizedType)type).getActualTypeArguments()) {
addImportsForType(param, imports);
}
} else if (type instanceof WildcardType) {
for (Type upper : ((WildcardType)type).getUpperBounds()) {
addImportsForType(upper, imports);
}
for (Type lower : ((WildcardType)type).getLowerBounds()) {
addImportsForType(lower, imports);
}
} else if (type instanceof GenericArrayType) {
addImportsForType(((GenericArrayType)type).getGenericComponentType(), imports);
} else {
System.err.println(Logger.format(
"Unhandled Type in adding imports for a service", "type", type, "typeClass",
type.getClass()));
}
}
public String getCode ()
{
return StringUtil.unStudlyName(method.getName()).toUpperCase();
@@ -368,8 +397,8 @@ public abstract class InvocationTask extends Task
DirectoryScanner ds = fs.getDirectoryScanner(getProject());
File fromDir = fs.getDir(getProject());
String[] srcFiles = ds.getIncludedFiles();
for (int f = 0; f < srcFiles.length; f++) {
processService(new File(fromDir, srcFiles[f]));
for (String srcFile : srcFiles) {
processService(new File(fromDir, srcFile));
}
}
}