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:
@@ -21,9 +21,11 @@
|
|||||||
|
|
||||||
package com.threerings.presents.tools;
|
package com.threerings.presents.tools;
|
||||||
|
|
||||||
|
import java.lang.reflect.GenericArrayType;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.lang.reflect.ParameterizedType;
|
import java.lang.reflect.ParameterizedType;
|
||||||
import java.lang.reflect.Type;
|
import java.lang.reflect.Type;
|
||||||
|
import java.lang.reflect.WildcardType;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
@@ -47,6 +49,7 @@ import org.apache.velocity.app.VelocityEngine;
|
|||||||
import com.google.common.base.Predicate;
|
import com.google.common.base.Predicate;
|
||||||
import com.google.common.collect.Iterables;
|
import com.google.common.collect.Iterables;
|
||||||
|
|
||||||
|
import com.samskivert.util.Logger;
|
||||||
import com.samskivert.util.StringUtil;
|
import com.samskivert.util.StringUtil;
|
||||||
|
|
||||||
import com.samskivert.velocity.VelocityUtil;
|
import com.samskivert.velocity.VelocityUtil;
|
||||||
@@ -113,8 +116,7 @@ public abstract class InvocationTask extends Task
|
|||||||
{
|
{
|
||||||
this.method = method;
|
this.method = method;
|
||||||
|
|
||||||
// we need to look through our arguments and note any needed
|
// if this method has listener arguments, we need to add listener argument info for them
|
||||||
// imports in the supplied table
|
|
||||||
Class<?>[] args = method.getParameterTypes();
|
Class<?>[] args = method.getParameterTypes();
|
||||||
for (int ii = 0; ii < args.length; ii++) {
|
for (int ii = 0; ii < args.length; ii++) {
|
||||||
Class<?> arg = args[ii];
|
Class<?> arg = args[ii];
|
||||||
@@ -122,13 +124,15 @@ public abstract class InvocationTask extends Task
|
|||||||
arg = arg.getComponentType();
|
arg = arg.getComponentType();
|
||||||
}
|
}
|
||||||
|
|
||||||
// if this is a listener, we need to add a listener
|
|
||||||
// argument info for it
|
|
||||||
if (_ilistener.isAssignableFrom(arg)) {
|
if (_ilistener.isAssignableFrom(arg)) {
|
||||||
listenerArgs.add(new ListenerArgument(ii, 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
|
// 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 ()
|
public String getCode ()
|
||||||
{
|
{
|
||||||
return StringUtil.unStudlyName(method.getName()).toUpperCase();
|
return StringUtil.unStudlyName(method.getName()).toUpperCase();
|
||||||
@@ -368,8 +397,8 @@ public abstract class InvocationTask extends Task
|
|||||||
DirectoryScanner ds = fs.getDirectoryScanner(getProject());
|
DirectoryScanner ds = fs.getDirectoryScanner(getProject());
|
||||||
File fromDir = fs.getDir(getProject());
|
File fromDir = fs.getDir(getProject());
|
||||||
String[] srcFiles = ds.getIncludedFiles();
|
String[] srcFiles = ds.getIncludedFiles();
|
||||||
for (int f = 0; f < srcFiles.length; f++) {
|
for (String srcFile : srcFiles) {
|
||||||
processService(new File(fromDir, srcFiles[f]));
|
processService(new File(fromDir, srcFile));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user