@Override public void visit(BlockStatement statement) { visit(statement.getBody()); }
@Override public void visit(SequentialStatement statement) { visit(statement.getSequence()); }
@Override public void visit(QualificationExpr expr) { super.visit(expr); dependencies.add(expr.getField().getClassName()); } }
@Override public void visit(InvocationExpr expr) { super.visit(expr); dependencies.add(expr.getMethod().getClassName()); }
@Override public void visit(QualificationExpr expr) { super.visit(expr); consumer.consume(expr.getField()); }
@Override public void visit(MonitorExitStatement statement) { super.visit(statement); if (async) { consumer.consume(MONITOR_EXIT_METHOD); } else { consumer.consume(MONITOR_EXIT_SYNC_METHOD); } }
@Override public void visit(NewExpr expr) { super.visit(expr); consumer.consume(expr.getConstructedClass()); }
@Override public void visit(AssignmentStatement statement) { super.visit(statement); if (statement.isAsync()) { consumer.consumeFunction("$rt_suspending"); } }
@Override public void visit(UnaryExpr expr) { super.visit(expr); switch (expr.getOperation()) { case NULL_CHECK: consumer.consumeFunction("$rt_nullCheck"); break; default: break; } }
@Override public void visit(NewMultiArrayExpr expr) { super.visit(expr); visitType(expr.getType()); }
@Override public void visit(MonitorEnterStatement statement) { super.visit(statement); if (async) { consumer.consume(MONITOR_ENTER_METHOD); consumer.consumeFunction("$rt_suspending"); } else { consumer.consume(MONITOR_ENTER_SYNC_METHOD); } }
@Override public void visit(TryCatchStatement statement) { super.visit(statement); if (statement.getExceptionType() != null) { consumer.consume(statement.getExceptionType()); } }
@Override public void visit(NewArrayExpr expr) { super.visit(expr); visitType(expr.getType()); if (!(expr.getType() instanceof ValueType.Primitive)) { consumer.consumeFunction("$rt_createArray"); } }
@Override public void visit(WhileStatement statement) { if (statement.getCondition() != null) { statement.getCondition().acceptVisitor(this); } visit(statement.getBody()); }
@Override public void visit(TryCatchStatement statement) { super.visit(statement); if (statement.getExceptionVariable() != null) { if (variables[statement.getExceptionVariable()] < 0) { statement.setExceptionVariable(null); } else { statement.setExceptionVariable(renumber(statement.getExceptionVariable())); } } } }
@Override public void visit(InstanceOfExpr expr) { super.visit(expr); visitType(expr.getType()); if (expr.getType() instanceof ValueType.Object) { String clsName = ((ValueType.Object) expr.getType()).getClassName(); ClassReader cls = classSource.get(clsName); if (cls == null || cls.hasModifier(ElementModifier.INTERFACE)) { consumer.consumeFunction("$rt_isInstance"); } } else { consumer.consumeFunction("$rt_isInstance"); } } }
@Override public void visit(BinaryExpr expr) { super.visit(expr); switch (expr.getOperation()) { case COMPARE: consumer.consumeFunction("$rt_compare"); break; case MULTIPLY: if (expr.getType() == OperationType.INT && !RenderingUtil.isSmallInteger(expr.getFirstOperand()) && !RenderingUtil.isSmallInteger(expr.getSecondOperand())) { consumer.consumeFunction("$rt_imul"); } break; default: break; } }