package org.timepedia.exporter.rebind;
import com.google.gwt.core.ext.typeinfo.JParameter;
import com.google.gwt.core.ext.typeinfo.JPrimitiveType;
/**
*
*/
public class JExportableParameter {
private JParameter param;
private JExportableMethod method;
private ExportableTypeOracle xTypeOracle;
public JParameter getParam() {
return param;
}
public JExportableClassType getExportableEnclosingType() {
return method.getEnclosingExportType();
}
public JExportableParameter(JExportableMethod exportableMethod,
JParameter param) {
this.param = param;
this.method = exportableMethod;
xTypeOracle = getExportableEnclosingType().getExportableTypeOracle();
}
public String getTypeName() {
return param.getType().getQualifiedSourceName();
}
public String getJNISignature() {
return param.getType().getJNISignature();
}
public String getExportParameterValue(String argName) {
String paramTypeName = param.getType().getQualifiedSourceName();
JExportableType type = xTypeOracle.findExportableType(paramTypeName);
if (type != null && type.needsExport()) {
JExportableClassType cType = (JExportableClassType) type;
if (xTypeOracle.isClosure((JExportableClassType) type)) {
return argName + " == null ? null : (" + argName + ".constructor == $wnd."
+ cType.getJSQualifiedExportName() + " ? " + argName
+ "." + ClassExporter.GWT_INSTANCE + " : "
+ "@" + cType.getQualifiedExporterImplementationName() + "::"
+ "makeClosure(Lcom/google/gwt/core/client/JavaScriptObject;)("
+ argName
+ "))";
} else if (xTypeOracle.isExportable((JExportableClassType) type)) {
return argName + "." + ClassExporter.GWT_INSTANCE;
}
}
if (param.getType().isClass() != null
&& !xTypeOracle.isJavaScriptObject(param.getType())
&& !xTypeOracle.isString(param.getType())) {
return "@org.timepedia.exporter.client.ExporterUtil::gwtInstance(Ljava/lang/Object;)("
+ argName + ")";
}
return argName;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
JExportableParameter that = (JExportableParameter) o;
return getJsTypeOf().equals(that.getJsTypeOf());
}
public String getJsTypeOf() {
if (param == null) {
return "null";
} else if (param.getType().isArray() != null) {
return "array";
} else if (param.getType().isPrimitive() != null) {
JPrimitiveType prim = param.getType().isPrimitive();
return prim == JPrimitiveType.BOOLEAN ? "boolean" : "number";
} else if (xTypeOracle.isString(param.getType())) {
return "string";
} else if (xTypeOracle.isJavaScriptObject(param.getType())) {
return "object";
} else {
String paramTypeName = param.getType().getQualifiedSourceName();
JExportableType type = xTypeOracle.findExportableType(paramTypeName);
if (type != null && type instanceof JExportableClassType
&& xTypeOracle.isClosure((JExportableClassType) type)) {
return "'function'";
}
return "@" + param.getType().getQualifiedSourceName() + "::class";
}
}
public boolean isExportable() {
String js = getJsTypeOf();
return !js.contains("@") || getExportableType(false) != null;
}
@Override
public int hashCode() {
return param != null ? getJsTypeOf().hashCode() : 0;
}
public String toString() {
return param.getType().getSimpleSourceName();
}
public JExportableType getExportableType(boolean b) {
return method.getExportable(param.getType(), b);
}
public String getToArrayFunc(String qsn, String argName) {
String ret = "ExporterUtil.";
String after = ")";
if (qsn.equals("java.lang.String[]")) {
ret += "toArrString" ;
} else if (qsn.equals("java.util.Date[]")) {
ret += "toArrDate" ;
} else if (qsn.equals("double[]")) {
ret += "toArrDouble" ;
} else if (qsn.equals("float[]")) {
ret += "toArrFloat" ;
} else if (qsn.equals("long[]")) {
ret += "toArrLong" ;
} else if (qsn.equals("int[]")) {
ret += "toArrInt" ;
} else if (qsn.equals("byte[]")) {
ret += "toArrByte" ;
} else if (qsn.equals("char[]")) {
ret += "toArrChar" ;
} else {
ret += "toArrObject";
after = ", new " + qsn.replace("]", "ExporterUtil.length(" + argName + ")]") + after;
}
return ret + "(" + argName + after;
}
}