Include field type parameters in the generated AS to force their linkage.
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@6696 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
@@ -274,6 +274,32 @@ public class ActionScriptUtils
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the primitive (unboxed) counterpart of a class, or the same class if it isn't a boxed
|
||||||
|
* type.
|
||||||
|
*/
|
||||||
|
public static Class<?> toPrimitiveType (Class<?> cclass)
|
||||||
|
{
|
||||||
|
if (Boolean.class == cclass) {
|
||||||
|
return Boolean.TYPE;
|
||||||
|
} else if (Character.class == cclass) {
|
||||||
|
return Character.TYPE;
|
||||||
|
} else if (Byte.class == cclass) {
|
||||||
|
return Byte.TYPE;
|
||||||
|
} else if (Short.class == cclass) {
|
||||||
|
return Short.TYPE;
|
||||||
|
} else if (Integer.class == cclass) {
|
||||||
|
return Integer.TYPE;
|
||||||
|
} else if (Long.class == cclass) {
|
||||||
|
return Long.TYPE;
|
||||||
|
} else if (Float.class == cclass) {
|
||||||
|
return Float.TYPE;
|
||||||
|
} else if (Double.class == cclass) {
|
||||||
|
return Double.TYPE;
|
||||||
|
}
|
||||||
|
return cclass;
|
||||||
|
}
|
||||||
|
|
||||||
/** Returns if the given class is an implementation of Map that doesn't know about Streaming */
|
/** Returns if the given class is an implementation of Map that doesn't know about Streaming */
|
||||||
protected static boolean isNaiveMap (Class<?> type)
|
protected static boolean isNaiveMap (Class<?> type)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -24,6 +24,8 @@ package com.threerings.presents.tools;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.Modifier;
|
import java.lang.reflect.Modifier;
|
||||||
|
import java.lang.reflect.ParameterizedType;
|
||||||
|
import java.lang.reflect.Type;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@@ -165,12 +167,14 @@ public class GenActionScriptStreamableTask extends GenTask
|
|||||||
public final String name;
|
public final String name;
|
||||||
public final String capitalName;
|
public final String capitalName;
|
||||||
public final String simpleType;
|
public final String simpleType;
|
||||||
|
public final String parameterTypes;
|
||||||
public final String reader;
|
public final String reader;
|
||||||
public final String writer;
|
public final String writer;
|
||||||
public final String dobjectField;
|
public final String dobjectField;
|
||||||
public boolean dset;
|
public boolean dset;
|
||||||
public boolean array;
|
public boolean array;
|
||||||
public boolean oidList;
|
public boolean oidList;
|
||||||
|
public boolean hasTypeParameters;
|
||||||
|
|
||||||
public ASField (Field f, ImportSet imports)
|
public ASField (Field f, ImportSet imports)
|
||||||
{
|
{
|
||||||
@@ -179,6 +183,25 @@ public class GenActionScriptStreamableTask extends GenTask
|
|||||||
dobjectField = StringUtil.unStudlyName(name).toUpperCase();
|
dobjectField = StringUtil.unStudlyName(name).toUpperCase();
|
||||||
simpleType = ActionScriptUtils.addImportAndGetShortType(f.getType(), true, imports);
|
simpleType = ActionScriptUtils.addImportAndGetShortType(f.getType(), true, imports);
|
||||||
|
|
||||||
|
List<String> parameters = Lists.newLinkedList();
|
||||||
|
Type genType = f.getGenericType();
|
||||||
|
if (genType instanceof ParameterizedType) {
|
||||||
|
for (Type param : ((ParameterizedType) genType).getActualTypeArguments()) {
|
||||||
|
if (param instanceof Class) {
|
||||||
|
// Convert any box classes to primitives to avoid having to import them
|
||||||
|
Class<?> primitive = ActionScriptUtils.toPrimitiveType((Class<?>) param);
|
||||||
|
parameters.add(ActionScriptUtils.addImportAndGetShortType(
|
||||||
|
primitive, false, imports));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!parameters.isEmpty()) {
|
||||||
|
parameterTypes = Joiner.on(", ").join(parameters);
|
||||||
|
hasTypeParameters = true;
|
||||||
|
} else {
|
||||||
|
parameterTypes = "";
|
||||||
|
}
|
||||||
|
|
||||||
// Lists and Maps use their Streamers directly
|
// Lists and Maps use their Streamers directly
|
||||||
if (List.class.isAssignableFrom(f.getType())) {
|
if (List.class.isAssignableFrom(f.getType())) {
|
||||||
imports.add("com.threerings.io.streamers.ArrayStreamer");
|
imports.add("com.threerings.io.streamers.ArrayStreamer");
|
||||||
@@ -188,7 +211,6 @@ public class GenActionScriptStreamableTask extends GenTask
|
|||||||
imports.add("com.threerings.io.streamers.SetStreamer");
|
imports.add("com.threerings.io.streamers.SetStreamer");
|
||||||
} else if (DSet.class.isAssignableFrom(f.getType())) {
|
} else if (DSet.class.isAssignableFrom(f.getType())) {
|
||||||
dset = true;
|
dset = true;
|
||||||
imports.add("com.threerings.presents.dobj.DSet_Entry"); // Used for signals
|
|
||||||
} else if (OidList.class.isAssignableFrom(f.getType())) {
|
} else if (OidList.class.isAssignableFrom(f.getType())) {
|
||||||
oidList = true;
|
oidList = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,16 +19,17 @@ public class {{classname}} {{^extends.isEmpty}}extends {{extends}}
|
|||||||
|
|
||||||
// GENERATED STREAMING START
|
// GENERATED STREAMING START
|
||||||
{{#pubFields}}
|
{{#pubFields}}
|
||||||
public var {{name}} :{{simpleType}};
|
public var {{name}} :{{simpleType}};{{#hasTypeParameters}} /* of */ {{parameterTypes}};{{/hasTypeParameters}}
|
||||||
|
|
||||||
|
|
||||||
{{/pubFields}}
|
{{/pubFields}}
|
||||||
{{#dobject}}
|
{{#dobject}}
|
||||||
{{#pubFields}}
|
{{#pubFields}}
|
||||||
public var {{name}}Changed :Signal = new Signal({{simpleType}}, {{simpleType}});
|
public var {{name}}Changed :Signal = new Signal({{simpleType}}, {{simpleType}});
|
||||||
{{#dset}}
|
{{#dset}}
|
||||||
public var {{name}}EntryAdded :Signal = new Signal(DSet_Entry);
|
public var {{name}}EntryAdded :Signal = new Signal({{parameterTypes}});
|
||||||
public var {{name}}EntryRemoved :Signal = new Signal(DSet_Entry);
|
public var {{name}}EntryRemoved :Signal = new Signal({{parameterTypes}});
|
||||||
public var {{name}}EntryUpdated :Signal = new Signal(DSet_Entry, DSet_Entry);
|
public var {{name}}EntryUpdated :Signal = new Signal({{parameterTypes}}, {{parameterTypes}});
|
||||||
{{/dset}}
|
{{/dset}}
|
||||||
{{#array}}
|
{{#array}}
|
||||||
public var {{name}}ElementUpdated :Signal = new Signal(int, Object, Object);
|
public var {{name}}ElementUpdated :Signal = new Signal(int, Object, Object);
|
||||||
|
|||||||
Reference in New Issue
Block a user