Handle service methods with forall types.
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@6582 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
@@ -25,6 +25,7 @@ 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.TypeVariable;
|
||||||
import java.lang.reflect.WildcardType;
|
import java.lang.reflect.WildcardType;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
@@ -138,6 +139,15 @@ public abstract class InvocationTask extends GenTask
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String typeParams () {
|
||||||
|
List<String> params = Lists.newArrayList();
|
||||||
|
for (Type type : method.getGenericParameterTypes()) {
|
||||||
|
collectTypeParams(type, params);
|
||||||
|
}
|
||||||
|
// the trailing space in '> ' is needed
|
||||||
|
return params.isEmpty() ? "" : StringUtil.toString(params, "<", "> ");
|
||||||
|
}
|
||||||
|
|
||||||
public String getArgList () {
|
public String getArgList () {
|
||||||
StringBuilder buf = new StringBuilder();
|
StringBuilder buf = new StringBuilder();
|
||||||
Type[] ptypes = method.getGenericParameterTypes();
|
Type[] ptypes = method.getGenericParameterTypes();
|
||||||
@@ -319,6 +329,8 @@ public abstract class InvocationTask extends GenTask
|
|||||||
}
|
}
|
||||||
} else if (type instanceof GenericArrayType) {
|
} else if (type instanceof GenericArrayType) {
|
||||||
addImportsForType(((GenericArrayType)type).getGenericComponentType(), imports);
|
addImportsForType(((GenericArrayType)type).getGenericComponentType(), imports);
|
||||||
|
} else if (type instanceof TypeVariable) {
|
||||||
|
// nothing needed
|
||||||
} else {
|
} else {
|
||||||
System.err.println(Logger.format(
|
System.err.println(Logger.format(
|
||||||
"Unhandled Type in adding imports for a service", "type", type, "typeClass",
|
"Unhandled Type in adding imports for a service", "type", type, "typeClass",
|
||||||
@@ -326,6 +338,24 @@ public abstract class InvocationTask extends GenTask
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void collectTypeParams (Type type, List<String> params) {
|
||||||
|
if (type instanceof TypeVariable) {
|
||||||
|
String tvar = ((TypeVariable)type).getName();
|
||||||
|
if (!params.contains(tvar)) params.add(tvar);
|
||||||
|
} else if (type instanceof ParameterizedType) {
|
||||||
|
for (Type pt : ((ParameterizedType)type).getActualTypeArguments()) {
|
||||||
|
collectTypeParams(pt, params);
|
||||||
|
}
|
||||||
|
} else if (type instanceof WildcardType) {
|
||||||
|
for (Type lb : ((WildcardType)type).getLowerBounds()) {
|
||||||
|
collectTypeParams(lb, params);
|
||||||
|
}
|
||||||
|
for (Type ub : ((WildcardType)type).getUpperBounds()) {
|
||||||
|
collectTypeParams(ub, params);
|
||||||
|
}
|
||||||
|
} // else nada
|
||||||
|
}
|
||||||
|
|
||||||
protected String boxArgument (Class<?> clazz, int index) {
|
protected String boxArgument (Class<?> clazz, int index) {
|
||||||
if (_ilistener.isAssignableFrom(clazz)) {
|
if (_ilistener.isAssignableFrom(clazz)) {
|
||||||
return GenUtil.boxArgument(clazz, "listener" + index);
|
return GenUtil.boxArgument(clazz, "listener" + index);
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ public class {{name}}Marshaller extends InvocationMarshaller
|
|||||||
public static final int {{code}} = {{-index}};
|
public static final int {{code}} = {{-index}};
|
||||||
|
|
||||||
// from interface {{name}}Service
|
// from interface {{name}}Service
|
||||||
public void {{method.name}} ({{getArgList}})
|
public {{typeParams}}void {{method.name}} ({{getArgList}})
|
||||||
{
|
{
|
||||||
{{#listenerArgs}}
|
{{#listenerArgs}}
|
||||||
{{marshaller}} listener{{index}} = new {{marshaller}}();
|
{{marshaller}} listener{{index}} = new {{marshaller}}();
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ public interface {{name}}Provider extends InvocationProvider
|
|||||||
/**
|
/**
|
||||||
* Handles a {@link {{name}}Service#{{method.name}}} request.
|
* Handles a {@link {{name}}Service#{{method.name}}} request.
|
||||||
*/
|
*/
|
||||||
void {{method.name}} (ClientObject caller{{#hasArgs}}, {{/hasArgs}}{{getArgList}}){{^listenerArgs.isEmpty}}
|
{{typeParams}}void {{method.name}} (ClientObject caller{{#hasArgs}}, {{/hasArgs}}{{getArgList}}){{^listenerArgs.isEmpty}}
|
||||||
|
|
||||||
throws InvocationException{{/listenerArgs.isEmpty}};
|
throws InvocationException{{/listenerArgs.isEmpty}};
|
||||||
{{/methods}}
|
{{/methods}}
|
||||||
|
|||||||
Reference in New Issue
Block a user