/** * Replaces non-serializable types with CPS-specific variants. * * @param original a {@link JType} to inspect * @return The {@link JType#dotclass()} for either the original {@link JType} or for the CPS equivalent. */ private JExpression cpsTypeTranslation(JType original) { if (original.fullName().equals("org.codehaus.groovy.runtime.callsite.BooleanClosureWrapper")) { return codeModel.ref("com.cloudbees.groovy.cps.impl.CpsBooleanClosureWrapper").dotclass(); } else { return original.dotclass(); } }
@Override public JExpression visitNewArray(NewArrayTree nt, Void __) { if (nt.getInitializers()!=null) { return $b.invoke("newArrayFromInitializers").tap(inv -> { nt.getInitializers().forEach(d -> inv.arg(visit(d))); }); } else { return $b.invoke("newArray").tap(inv -> { inv.arg(loc(nt)); inv.arg(t(nt.getType()).dotclass()); nt.getDimensions().forEach(d -> inv.arg(visit(d))); }); } }
@Override public JExpression visitTypeCast(TypeCastTree tt, Void __) { return $b.invoke("cast") .arg(loc(tt)) .arg(visit(tt.getExpression())) .arg(erasure(tt.getType()).dotclass()) .arg(JExpr.lit(false)); }
@Override public JExpression visitInstanceOf(InstanceOfTree it, Void __) { return $b.invoke("instanceOf") .arg(loc(it)) .arg(visit(it.getExpression())) .arg($b.invoke("constant").arg(t(it.getType()).dotclass())); }
@Override public JExpression visitTry(TryTree tt, Void __) { return $b.invoke("tryCatch") .arg(visit(tt.getBlock())) .arg(visit(tt.getFinallyBlock())) .tap(inv -> tt.getCatches().forEach(ct -> JExpr._new($CatchExpression) .arg(t(ct.getParameter()).dotclass()) .arg(n(ct.getParameter())) .arg(visit(ct.getBlock()))) ); }
@Override public JExpression visitEnhancedForLoop(EnhancedForLoopTree et, Void __) { return $b.invoke("forInLoop") .arg(loc(et)) .arg(JExpr._null()) .arg(erasure(et.getVariable()).dotclass()) .arg(n(et.getVariable())) .arg(visit(et.getExpression())) .arg(visit(et.getStatement())); }