* @author Alexey Andreev
*/
public class JSNativeGenerator implements Injector, DependencyPlugin {
@Override
public void generate(InjectorContext context, MethodReference methodRef) throws IOException {
SourceWriter writer = context.getWriter();
switch (methodRef.getName()) {
case "getGlobal":
writer.append("window");
break;
case "isUndefined":
writer.append("(");
context.writeExpr(context.getArgument(0));
writer.ws().append("===").ws().append("undefined)");
break;
case "getTypeName":
writer.append("(typeof ");
context.writeExpr(context.getArgument(0));
writer.append(")");
break;
case "get":
context.writeExpr(context.getArgument(0));
renderProperty(context.getArgument(1), context);
break;
case "set":
writer.append('(');
context.writeExpr(context.getArgument(0));
renderProperty(context.getArgument(1), context);
writer.ws().append('=').ws();
context.writeExpr(context.getArgument(2));
writer.append(')');
break;
case "invoke":
context.writeExpr(context.getArgument(0));
renderProperty(context.getArgument(1), context);
writer.append('(');
for (int i = 2; i < context.argumentCount(); ++i) {
if (i > 2) {
writer.append(',').ws();
}
context.writeExpr(context.getArgument(i));
}
writer.append(')');
break;
case "instantiate":
writer.append("(new ");
context.writeExpr(context.getArgument(0));
renderProperty(context.getArgument(1), context);
writer.append('(');
for (int i = 2; i < context.argumentCount(); ++i) {
if (i > 2) {
writer.append(',').ws();
}
context.writeExpr(context.getArgument(i));
}
writer.append("))");
break;
case "wrap":
if (methodRef.getDescriptor().parameterType(0).isObject("java.lang.String")) {
writer.append("$rt_ustr(");
context.writeExpr(context.getArgument(0));
writer.append(")");
} else {
context.writeExpr(context.getArgument(0));
}
break;
case "function":
generateFunction(context);
break;
case "unwrapString":
writer.append("$rt_str(");
context.writeExpr(context.getArgument(0));
writer.append(")");
break;
default:
if (methodRef.getName().startsWith("unwrap")) {
context.writeExpr(context.getArgument(0));
}