@Override public String toString() { return "[new " + type.getName() + "()]"; } }
@Override public String toString() { return "["+getClass().getSimpleName()+" "+getName()+"]"; }
@Override public void visit(CastExpression castExpression) { sb.append("((").append(castExpression.getType().getName()).append(")"); castExpression.getExpression().accept(this); sb.append(")"); }
@Override public void visit(NewArrayExpression e) { sb.append("new ").append(e.getType().getName()).append("["); e.getSize().accept(this); sb.append("]"); }
@Override public void visit(InstanceOfExpression instanceOfExpression) { sb.append("("); instanceOfExpression.getExpression().accept(this); sb.append(" instanceOf ").append(instanceOfExpression.getType().getName()); sb.append(")"); }
@Override public void visit(InstantiationExpression instantiationExpression) { sb.append("new ").append(instantiationExpression.getType().getName()).append("("); boolean first = true; Iterable<Expression> parameters = instantiationExpression.getParameters(); for (Expression expression : parameters) { if (first) { first = false; } else { sb.append(", "); } expression.accept(this); } sb.append(")"); }
private String paramString(Iterable<Parameter> parameters) { String result = null; for (Parameter parameter : parameters) { if (result == null) { result = ""; } else { result += ", "; } result += parameter.getType().getName()+" "+parameter.getName(); } return result == null ? "" : result; }
private void printFields(Iterable<Field> fields) { for (Field f : fields) { println( getKeywords(f.getFlags()) + " " + f.getType().getName() + " " + f.getName() + ";" ); } }
@Override public void visit(InstantiationExpression instantiationExpression) { // new instance involves creating a new object and then calling the constructor Type type = instantiationExpression.getType(); methodByteCodeContext.incIndent("new ", type.getName(), "()"); methodByteCodeContext.addInstruction(new TypeInsnNode(NEW, type.getClassIdentifier()), "new ", type.getName(), "()"); methodByteCodeContext.dup("for constructor call"); // so that we still have a reference to the object after we call the constructor. Method constructor = type.getConstructor(instantiationExpression.getParameters().size()); if (constructor == null) { throw new RuntimeException( "can't find constructor with " + instantiationExpression.getParameters().size() + " parameters in " + type); } loadParameters("<init>", constructor, instantiationExpression.getParameters()); methodByteCodeContext.addInstruction(new MethodInsnNode(INVOKESPECIAL, type.getClassIdentifier(), "<init>", constructor.getSignature()), "new ", type.getName(), "(...)"); lastExpressionType = type; methodByteCodeContext.decIndent(); }
@Override public void visit(DefineVarStatement defineVarStatement) { context.defineLocalVar(defineVarStatement.getType(), defineVarStatement.getVarName()); println(defineVarStatement.getType().getName() + " " + defineVarStatement.getVarName() + "; // line " + defineVarStatement.getLine()); }
private void printMethods(FutureType type, String typeName, Iterable<Method> methods) { for (Method m : methods) { context = new MethodContext(type, m); String methodName = m.getName(); String returnType = m.getReturnType().getName(); if (methodName.equals("<init>")) { // constructor println( getKeywords(m.getFlags()) + " " + typeName + "("+paramString(m.getParameters())+") {" ); } else { println( getKeywords(m.getFlags()) + " " + returnType + " " + methodName + "("+paramString(m.getParameters())+") {" ); } incIndent(); for (Statement s : m.getStatements()) { s.accept(this); } decIndent(); println("}"); println(); } }
(futureType.getExtending() == null ? "" : " extends " + futureType.getExtending().getName())+ " {"); incIndent();