@Override public void visit(CallConstructorExpression callConstructorExpression) { sb.append("super("); boolean first = true; Iterable<Expression> parameters = callConstructorExpression.getParameters(); for (Expression expression : parameters) { if (first) { first = false; } else { sb.append(", "); } expression.accept(this); } sb.append(")"); }
@Override public void visit(CastExpression castExpression) { sb.append("((").append(castExpression.getType().getName()).append(")"); castExpression.getExpression().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(NewArrayExpression e) { sb.append("new ").append(e.getType().getName()).append("["); e.getSize().accept(this); sb.append("]"); }
@Override public void visit(UnaryExpression unaryExpression) { sb.append("("); sb.append(unaryExpression.getOperator().getRepresentation()).append(" "); unaryExpression.getExpression().accept(this); 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 toString(Expression expression) { ExpressionStringifierVisitor expressionVisitor = new ExpressionStringifierVisitor(); expression.accept(expressionVisitor); return expressionVisitor.toString(); }
@Override public void visit(CallMethodExpression callMethodExpression) { if (callMethodExpression.getCallee() == null){ sb.append("this"); } else { callMethodExpression.getCallee().accept(this); } sb.append("."+callMethodExpression.getMethodName()+"("); boolean first = true; Iterable<Expression> parameters = callMethodExpression.getParameters(); for (Expression expression : parameters) { if (first) { first = false; } else { sb.append(", "); } expression.accept(this); } sb.append(")"); }
private Type visit(Expression expression) { methodByteCodeContext.incIndent(); ASMExpressionVisitor expressionVisitor = new ASMExpressionVisitor(methodContext, methodByteCodeContext); expression.accept(expressionVisitor); methodByteCodeContext.decIndent(); return expressionVisitor.getExpressionType(); }
@Override public void visit(final IfStatement ifStatement) { methodByteCodeContext.incIndent("if"); ifStatement.getExpression().accept(new ExpressionVisitor() { public void visit(BinaryExpression binaryExpression) { methodByteCodeContext.incIndent("if left");
@Override public void visit(InstanceOfExpression instanceOfExpression) { methodByteCodeContext.incIndent("instanceOF"); instanceOfExpression.getExpression().accept(this); methodByteCodeContext.addInstruction(new TypeInsnNode(INSTANCEOF, instanceOfExpression.getType().getClassIdentifier())); lastExpressionType = BOOLEAN; methodByteCodeContext.decIndent(); }
@Override public void visit(CastExpression castExpression) { methodByteCodeContext.incIndent("cast (", castExpression.getType(), ")"); castExpression.getExpression().accept(this); methodByteCodeContext.cast(castExpression.getType(), "cast to", castExpression.getType()); lastExpressionType = castExpression.getType(); methodByteCodeContext.decIndent(); }
@Override public void visit(NewArrayExpression e) { methodByteCodeContext.incIndent("new ", e.getType(), "[]"); e.getSize().accept(this); methodByteCodeContext.newArray(e.getType(), "new ", e.getType(), "[]"); lastExpressionType = e.getType().nestArray(); methodByteCodeContext.decIndent(); }
private void loadParameters(String methodName, Method method, ImmutableList<Expression> parameters) { methodByteCodeContext.incIndent("pass", parameters.size(), "params to", methodName); ImmutableList<Expression> parameterValues = parameters; ImmutableList<Parameter> parameterTypes = method.getParameters(); if (parameterTypes.size() != parameterValues.size()) { throw new RuntimeException("parameters passed do not match, parameters declared in "+method); } for (int i = 0; i < parameterValues.size(); i++) { methodByteCodeContext.incIndent("param", i); Expression expression = parameterValues.get(i); Type expected = parameterTypes.get(i).getType(); expression.accept(this); methodByteCodeContext.handleConversion(lastExpressionType, expected, "param", i, "for", methodName); methodByteCodeContext.decIndent(); } methodByteCodeContext.decIndent(); }
case PLUS: methodByteCodeContext.incIndent("left +"); binaryExpression.getLeftExpression().accept(this); methodByteCodeContext.decIndent(); methodByteCodeContext.incIndent("+ right"); binaryExpression.getRightExpression().accept(this); methodByteCodeContext.decIndent(); lastExpressionType = ExistingType.INT; case AND: methodByteCodeContext.incIndent("left &&"); binaryExpression.getLeftExpression().accept(this); methodByteCodeContext.decIndent(); new LiteralExpression(false).accept(this); methodByteCodeContext.addInstruction(new JumpInsnNode(IF_ICMPEQ, falseLabel), "AND: IF left is false => false"); methodByteCodeContext.incIndent("&& right"); binaryExpression.getRightExpression().accept(this); methodByteCodeContext.decIndent(); new LiteralExpression(false).accept(this); case GETARRAYATINDEX: methodByteCodeContext.incIndent("array"); binaryExpression.getLeftExpression().accept(this); Type arrayType = lastExpressionType; methodByteCodeContext.decIndent(); methodByteCodeContext.incIndent("["); binaryExpression.getRightExpression().accept(this); methodByteCodeContext.decIndent();
callMethodExpression.getCallee().accept(this); method = lastExpressionType.getMethod(methodName, parameterCount); if (method == null) {
methodByteCodeContext.incIndent(unaryExpression.getOperator().getRepresentation()); methodByteCodeContext.incIndent("unary exp"); unaryExpression.getExpression().accept(this); methodByteCodeContext.decIndent(); switch (unaryExpression.getOperator()) {