blob: 024c12849b9800568ffa476058ee4d710aa474f3 [file] [log] [blame]
«IMPORT org::eclipse::xtend::backend::aop»
«IMPORT org::eclipse::xtend::backend::common»
«IMPORT org::eclipse::xtend::backend::expr»
«IMPORT org::eclipse::xtend::backend::functions»
«IMPORT org::eclipse::xtend::middleend::plugins»
«IMPORT org::eclipse::xtend::backend::util»
«IMPORT org::eclipse::xtend::backend::compiler»
«IMPORT org::eclipse::xtend::middleend::javaannotations::internal»
«EXTENSION org::eclipse::xtend::backend::compiler::templates::expressions»
«EXTENSION org::eclipse::xtend::backend::compiler::templates::functions»
«EXTENSION org::eclipse::xtend::backend::compiler::templates::names»
«EXTENSION org::eclipse::xtend::backend::compiler::templates::types»
«DEFINE compileExpression(String resultVarName, String resultType, boolean declareResultVar, ParsedResource resource) FOR Object»
«ENDDEFINE»
«DEFINE compileExpression(String resultVarName, String resultType, boolean declareResultVar, ParsedResource resource) FOR ExpressionBase»
«ENDDEFINE»
«DEFINE compileExpression(String resultVarName, String resultType, boolean declareResultVar, ParsedResource resource) FOR AndExpression»
«LET getNextVarIdx() AS varIdx
«EXPAND compileExpression (getVarName(left, "leftVarName", "_"+varIdx), "Boolean", true, resource) FOR left
«EXPAND compileExpression (getVarName(right, "rightVarName", "_"+varIdx), "Boolean", true, resource) FOR right
if getVarName(left, "leftVarName", "_"+varIdx && «getVarName(right, "rightVarName", "_"+varIdx)»)
«IF declareResultVar»Boolean «ENDIF»«resultVarName» = Boolean.TRUE;
else
«IF declareResultVar»Boolean «ENDIF»«resultVarName» = Boolean.FALSE;
«ENDLET
«ENDDEFINE»
«DEFINE compileExpression(String resultVarName, String resultType, boolean declareResultVar, ParsedResource resource) FOR ConcatExpression»
«LET getNextVarIdx() AS varIdx
List<Object> «resultVarName»_Parts = new ArrayList<Object> parts.size»);
«FOREACH parts AS p ITERATOR it
«EXPAND compileExpression (p.getVarName (resultVarName, "_ConcatPart_" +it.counter1), "Object", true, resource) FOR p
«resultVarName»_Parts.add p.getVarName (resultVarName, "_ConcatPart_" +it.counter1)»);
«ENDFOREACH
«IF declareResultVar»EfficientLazyString «ENDIF»«resultVarName» = Concatenator.append (_ctx, «resultVarName»_Parts);
«ENDLET
«ENDDEFINE»
«DEFINE compileExpression(String resultVarName, String resultType, boolean declareResultVar, ParsedResource resource) FOR CreateCachedExpression
«LET getNextVarIdx() AS varIdx
final List<Object> params_«varIdx» = new ArrayList<Object>();
«FOREACH paramExpr AS p ITERATOR it
«EXPAND compileExpression (getVarName(p, "createParamVarName", "_"+ varIdx + "_" +it.counter1), "Object", true, resource) FOREACH paramExpr
params_«varIdx».add ( createParamVarName_«varIdx»_«it.counter0»);
«ENDFOREACH
«IF declareResultVar»«resultType.getResultType()» «ENDIF»«resultVarName» = «resultType.getResultType().cast()»_ctx.getCreationCache().createRaw (_ctx.getTypesystem ().findType ("«type.uniqueRepresentation»"), params_«varIdx»);
«ENDLET
«ENDDEFINE»
«DEFINE compileExpression(String resultVarName, String resultType, boolean declareResultVar, ParsedResource resource) FOR CreateUncachedExpression»
«IF declareResultVar»«resultType.getResultType()» «ENDIF»«resultVarName» = «resultType.getResultType().cast()»_ctx.getTypesystem ().findType ("«type.uniqueRepresentation»").create();
«ENDDEFINE»
«DEFINE compileExpression(String resultVarName, String resultType, boolean declareResultVar, ParsedResource resource) FOR CurryingExpression
«LET getNextVarIdx() AS varIdx
«LET getNamedFunction (function, resource) AS f»
Function «getVarName(f.name.simpleName + "UnCurried", f.name.simpleName + "UnCurried", "_" +varIdx = _ctx.getFunctionDefContext().getMatch f.name.getQualifiedNameBuilder()», «f.function.getFunctionParameterTypes()»);
List<Object> «getVarName(f.name.simpleName+"BoundParams", "boundParams", "_" + varIdx = new ArrayList<Object>();
«FOREACH boundParams.typeSelect(ExpressionBase) AS p ITERATOR it
«EXPAND compileExpression(getVarName(p, "boundParamVarName", "_" + varIdx + "_" + it.counter1), "Object", true, resource) FOR p
«getVarName(f.name.simpleName+"BoundParams", "boundParams", "_" + varIdx)».add getVarName(p, "boundParamVarName", "_" + varIdx + "_" + it.counter1)»);
«ENDFOREACH
«IF declareResultVar»Function «ENDIF»«resultVarName» = new CurriedFunction getVarName(f.name.simpleName + "UnCurried", f.name.simpleName + "UnCurried", "_" +varIdx)», «getVarName(f.name.simpleName+"BoundParams", "boundParams", "_" + varIdx)», _ctx);
«ENDLET
«ENDLET
«ENDDEFINE»
«DEFINE compileExpression(String resultVarName, String resultType, boolean declareResultVar, ParsedResource resource) FOR DeferredEvalExpression
«LET getNextVarIdx() AS varIdx
«IF declareResultVar»«resultType.getResultType()» «ENDIF»«resultVarName» = new FutureResultHolder (new AbstractFunction () {
public Object invoke (ExecutionContext _ctx, Object[] params) {
«EXPAND compileExpression (getVarName(innerExpr, "deferredExprVarName", "_"+varIdx), "Object", true, resource) FOR innerExpr
return «getVarName(innerExpr, "deferredExprVarName", "_"+varIdx)»;
}
});
«ENDLET
«ENDDEFINE»
«DEFINE compileExpression(String resultVarName, String resultType, boolean declareResultVar, ParsedResource resource) FOR HidingLocalVarDefExpression
«LET getNextVarIdx() AS varIdx
final Object oldValue_«varIdx» = _ctx.getLocalVarContext().getLocalVars().getlocalVarName»);
«EXPAND compileExpression (getVarName (defExpression, "defExprResult", "_" + varIdx), "Object", true, resource) FOR defExpression
_ctx.getLocalVarContext().getLocalVars().put localVarName», «getVarName (defExpression, "defExprResult", "_" + varIdx)»);
if (_ctx.isLogStacktrace())
_ctx.getStacktrace().add (new StacktraceEntry pos.buildSourcePos()», _ctx));
try {
«EXPAND compileExpression (resultVarName, "Object", true, resource) FOR innerExpression
}
finally {
_ctx.getStacktrace ().remove (_ctx.getStacktrace().size() - 1);
_ctx.getLocalVarContext().getLocalVars().putlocalVarName», oldValue_«varIdx»);
}
«ENDLET
«ENDDEFINE»
«DEFINE compileExpression(String resultVarName, String resultType, boolean declareResultVar, ParsedResource resource) FOR IfExpression
«LET getNextVarIdx() AS varIdx»
Boolean «getVarName (condition, "condExprVarName", "_" + varIdx = Boolean.FALSE;
«EXPAND compileExpression (getVarName (condition, "condExprVarName", "_" + varIdx), "Boolean", false, resource) FOR condition
«EXPAND initVar (resultType, declareResultVar) FOR resultVarName»
if getVarName (condition, "condExprVarName", "_" + varIdx)») {
«EXPAND compileExpression (resultVarName, resultType, false, resource) FOR ifPart
} else {
«EXPAND compileExpression (resultVarName, resultType, false, resource) FOR elsePart
}
«ENDLET»
«ENDDEFINE»
«DEFINE compileExpression(String resultVarName, String resultType, boolean declareResultVar, ParsedResource resource) FOR InitClosureExpression
«LET getNextVarIdx() AS varIdx
List<String> paramNames_«varIdx» = Arrays.asList IF !paramNames.isEmpty»"«FOREACH paramNames AS pName SEPARATOR ","»«pName»«ENDFOREACH»"«ENDIF»);
List<BackendType> paramTypes_«varIdx» = new ArrayList<BackendType>();
«FOREACH paramTypes.typeSelect(BackendType) AS pt
paramTypes_«varIdx».add (_ctx.getTypesystem ().findType ("«pt.uniqueRepresentation»"));
«ENDFOREACH
Function «resultVarName» = new AbstractClosure (_ctx.getLocalVarContext(), _ctx.getFunctionDefContext(), paramNames_«varIdx», paramTypes_«varIdx») {
protected Object apply (ExecutionContext _ctx) {
«EXPAND compileExpression (getVarName (defExpression, "defExpr", "_" +varIdx), "Object", true, resource) FOR defExpression
return «getVarName (defExpression, "defExpr", "_" +varIdx)»;
}
};
«ENDLET
«ENDDEFINE»
«DEFINE compileExpression(String resultVarName, String resultType, boolean declareResultVar, ParsedResource resource) FOR InvocationOnCollectionExpression
«LET getNextVarIdx() AS varIdx
«EXPAND compileExpression (getVarName(collection, "coll", "_" +varIdx), "Collection", true, resource) FOR collection
«IF params.size > 0 && LocalVarEvalExpression.isInstance(params.first())-»
«IF (((LocalVarEvalExpression)params.first()).localVarName == "this")-»
boolean firstParamIsThis_«varIdx» = true;
«ELSE
boolean firstParamIsThis_«varIdx» = false;
«ENDIF
«ELSE
boolean firstParamIsThis_«varIdx» = false;
«ENDIF
final List<Object> params_«varIdx» = new ArrayList<Object>();
params_«varIdx».add (null); //placeholder
«FOREACH params AS e
«EXPAND compileExpression (getVarName (e, "param", "_"+varIdx), "Object", true, resource) FOR e
params_«varIdx».add getVarName (e, "param", "_"+varIdx)»);
«ENDFOREACH
«IF declareResultVar»«resultType.getResultType()» «ENDIF»«resultVarName» = «resultType.getResultType().cast()»Invoker.invokeOnCollectionfunctionName.getQualifiedNameBuilder()», coll_«varIdx», params_«varIdx», _ctx, firstParamIsThis_«varIdx», SourcePos);
«ENDLET
«ENDDEFINE»
«DEFINE compileExpression(String resultVarName, String resultType, boolean declareResultVar, ParsedResource resource) FOR InvocationOnObjectExpression
«LET getNextVarIdx() AS varIdx
«REM»MATCH THE TWO OF THEM«ENDREM»
final List<Object> params_«varIdx» = new ArrayList<Object> ();
«IF params.size > 0 && LocalVarEvalExpression.isInstance (params.first())-»
«IF (((LocalVarEvalExpression) params.first()).localVarName == "this")-»
boolean firstParamIsThis_«varIdx» = true;
«ELSE
boolean firstParamIsThis_«varIdx» = false;
«ENDIF
«ELSE
boolean firstParamIsThis_«varIdx» = false;
«ENDIF
«FOREACH params AS e ITERATOR it
«EXPAND compileExpression (getVarName (e, "paramExprRes", "_"+varIdx+"_"+it.counter1), "Object", true, resource) FOR e
params_«varIdx».add getVarName (e, "paramExprRes", "_"+varIdx+"_"+it.counter1)»);
«ENDFOREACH
«IF nullIfFirstParamIsNull && params.size > 0
«IF declareResultVar»«resultType.getResultType()» «ENDIF»«resultVarName» = «resultType.getResultType().cast()»Invoker.invokeOnObjectNullCheckedfunctionName.getQualifiedNameBuilder()», params_«varIdx», _ctx, firstParamIsThis_«varIdx», «pos.buildSourcePos()»);
«ELSE
«IF declareResultVar»«resultType.getResultType()» «ENDIF»«resultVarName» = «resultType.getResultType().cast()»Invoker.invokeOnObjectfunctionName.getQualifiedNameBuilder()», params_«varIdx», _ctx, firstParamIsThis_«varIdx»);
«ENDIF
«ENDLET
«ENDDEFINE»
«DEFINE compileExpression(String resultVarName, String resultType, boolean declareResultVar, ParsedResource resource) FOR InvocationOnWhateverExpression
«LET getNextVarIdx() AS varIdx
«IF params.size > 0 && LocalVarEvalExpression.isInstance(params.first())»
«IF (((LocalVarEvalExpression) params.first()).localVarName == "this")-»
boolean firstParamIsThis_«varIdx» = true;
«ELSE
boolean firstParamIsThis_«varIdx» = false;
«ENDIF
«ELSE»
boolean firstParamIsThis_«varIdx» = false;
«ENDIF»
final List<Object> params_«varIdx» = new ArrayList<Object> ();
«FOREACH params AS e ITERATOR it
«EXPAND compileExpression (getVarName (e, "paramExprRes", "_"+varIdx+"_"+it.counter1), "Object", true, resource) FOR e
params_«varIdx».add getVarName (e, "paramExprRes", "_"+varIdx+"_"+it.counter1)»);
«ENDFOREACH
«IF nullIfFirstParamIsNull && params.size > 0
«IF declareResultVar»«resultType.getResultType()» «ENDIF»«resultVarName» = «resultType.getResultType().cast()»Invoker.invokeOnWhatEverNullCheckedfunctionName.getQualifiedNameBuilder()», params_«varIdx», _ctx, firstParamIsThis_«varIdx», «pos.buildSourcePos()»);
«ELSE
«IF declareResultVar»«resultType.getResultType()» «ENDIF»«resultVarName» = «resultType.getResultType().cast()»Invoker.invokeOnWhatEverfunctionName.getQualifiedNameBuilder()», params_«varIdx», _ctx, firstParamIsThis_«varIdx»);
«ENDIF
«ENDLET
«ENDDEFINE»
«DEFINE compileExpression (String resultVarName, String resultType, boolean declareResultVar, ParsedResource resource) FOR ListLiteralExpression
«LET getNextVarIdx() AS varIdx
final List<Object> «resultVarName» = new ArrayList<Object>();
«FOREACH innerExpression AS e ITERATOR it
«EXPAND compileExpression (getVarName (e, "exprRes", "_"+ varIdx + "_" + it.counter1), "Object", true, resource) FOR e
«resultVarName».add (exprRes_«varIdx»);
«ENDFOREACH
«ENDLET
«ENDDEFINE»
«DEFINE compileExpression(String resultVarName, String resultType, boolean declareResultVar, ParsedResource resource) FOR LiteralExpression
«IF declareResultVar»«resultType.getResultType()» «ENDIF»«resultVarName» = «this.toJavaLiteral()»;
«ENDDEFINE»
«DEFINE compileExpression(String resultVarName, String resultType, boolean declareResultVar, ParsedResource resource) FOR LocalVarEvalExpression
«IF declareResultVar»«resultType.getResultType()» «ENDIF»«resultVarName» = «resultType.getResultType().cast()»_ctx.getLocalVarContext().getLocalVars().get ("«localVarName»");
«ENDDEFINE»
«DEFINE compileExpression(String resultVarName, String resultType, boolean declareResultVar, ParsedResource resource) FOR MethodInvocationExpression
«LET getNextVarIdx() AS varIdx
«IF params.size > 0 && LocalVarEvalExpression.isInstance(params.first())»
«IF (((LocalVarEvalExpression) params.first()).localVarName == "this")-»
boolean firstParamIsThis_«varIdx» = true;
«ELSE
boolean firstParamIsThis_«varIdx» = false;
«ENDIF
«ELSE»
boolean firstParamIsThis_«varIdx» = false;
«ENDIF»
Class cls = «method.declaringClass.name».class;
«IF method.parameterTypes.size > 0
Method mtd = cls.getMethodmethod.name», «FOREACH method.parameterTypes AS pt SEPARATOR ", "»«pt.name»«ENDFOREACH»);
«ELSE
Method mtd = cls.getMethodmethod.name»);
«ENDIF
List<Object> «method.name»_params_«varIdx» = new ArrayList<Object>();
«FOREACH params.typeSelect(ExpressionBase) AS p ITERATOR it
«EXPAND compileExpression (getVarName (p, "paramVarName", "_" + varIdx + "_" +it.counter1), "Object", true, resource) FOR p
«method.name»_params_«varIdx».addgetVarName (p, "paramVarName", "_" + varIdx + "_" +it.counter1)»);
«ENDFOREACH
«IF declareResultVar»«resultType.getResultType()» «ENDIF»«resultVarName» = «resultType.getResultType().cast()»Invoker.invokeMethod (mtd, «method.name»_params_«varIdx», «static», _ctx, «nullIfFirstParamIsNull», firstParamIsThis_«varIdx», «pos.buildSourcePos()»)
«ENDLET
«ENDDEFINE»
«DEFINE compileExpression(String resultVarName, String resultType, boolean declareResultVar, ParsedResource resource) FOR NewLocalVarDefExpression
«LET getNextVarIdx() AS varIdx
«EXPAND compileExpression (getVarName(defExpression, "varDefExpr", "_" + varIdx), "Object", true, resource) FOR defExpression
_ctx.getLocalVarContext().getLocalVars().put localVarName», «getVarName(defExpression, "varDefExpr", "_" + varIdx)»);
if (_ctx.isLogStacktrace())
_ctx.getStacktrace().add (new StacktraceEntry pos.buildSourcePos()», _ctx));
try {
«EXPAND compileExpression (getVarName (innerExpression, "newLocalVarDefExpr", "_inner_"+varIdx), "Object", true, resource ) FOR innerExpression
«IF declareResultVar»«resultType.getResultType()» «ENDIF»«resultVarName» = «resultType.getResultType().cast()»«getVarName (innerExpression, "newLocalVarDefExpr", "_inner_"+varIdx)»;
}
finally {
if (_ctx.isLogStacktrace())
_ctx.getStacktrace ().remove (_ctx.getStacktrace().size() - 1);
_ctx.getLocalVarContext ().getLocalVars ().remove localVarName»);
}
«ENDLET
«ENDDEFINE»
«DEFINE compileExpression(String resultVarName, String resultType, boolean declareResultVar, ParsedResource resource) FOR OrExpression
«LET getNextVarIdx() AS varIdx
«EXPAND compileExpression (getVarName (left, "leftVarName", "_" +varIdx), "Boolean", true, resource) FOR left
«EXPAND compileExpression (getVarName (right, "rightVarName", "_" +varIdx), "Boolean", true, resource) FOR right
if (leftVarName_«varIdx» || rightVarName_«varIdx»)
«IF declareResultVar»Boolean «ENDIF»«resultVarName» = Boolean.TRUE;
else
«IF declareResultVar»Boolean «ENDIF»«resultVarName» = Boolean.FALSE;
«ENDLET
«ENDDEFINE»
«DEFINE compileExpression(String resultVarName, String resultType, boolean declareResultVar, ParsedResource resource) FOR PropertyOnCollectionExpression
«LET getNextVarIdx() AS varIdx
«EXPAND compileExpression (getVarName (innerExpression, "coll", "_"+varIdx), "Object", true, resource ) FOR innerExpression
«IF declareResultVar»«resultType.getResultType()» «ENDIF»«resultVarName» = «resultType.getResultType().cast()»PropertyAccessor.propertyOnCollectiongetVarName (innerExpression, "coll", "_"+varIdx)», "«propertyName»", _ctx, «pos.buildSourcePos()»);
«ENDLET
«ENDDEFINE»
«DEFINE compileExpression(String resultVarName, String resultType, boolean declareResultVar, ParsedResource resource) FOR PropertyOnObjectExpression
«LET getNextVarIdx() AS varIdx
«EXPAND compileExpression (innerExpression.getVarName ("innerPropertyOnObjectExpr", "_" + varIdx), "Object", true, resource) FOR innerExpression
«IF declareResultVar»«resultType.getResultType()» «ENDIF»«resultVarName» = «resultType.getResultType().cast()»PropertyAccessor.propertyOnObjectinnerExpression.getVarName ("innerPropertyOnObjectExpr", "_" + varIdx)», "«propertyName»", _ctx, «pos.buildSourcePos()»);
«ENDLET
«ENDDEFINE»
«DEFINE compileExpression(String resultVarName, String resultType, boolean declareResultVar, ParsedResource resource) FOR PropertyOnWhateverExpression
«LET getNextVarIdx() AS varIdx
«EXPAND compileExpression (innerExpression.getVarName("innerPropertyExpr", "_" + varIdx),"Object", true, resource) FOR innerExpression
«IF declareResultVar»«resultType.getResultType()» «ENDIF»«resultVarName» = «resultType.getResultType().cast()»PropertyAccessor.propertyOnWhateverinnerExpression.getVarName("innerPropertyExpr", "_" + varIdx)», "«propertyName»", _ctx, «pos.buildSourcePos()»);
«ENDLET
«ENDDEFINE»
«DEFINE compileExpression(String resultVarName, String resultType, boolean declareResultVar, ParsedResource resource) FOR RegisterAdviceExpression
«LET getNextVarIdx() AS varIdx»
«EXPAND compileAdvice (advice.getVarName ("advVarName", "_" +varIdx), resource) FOR advice»
final AdviceContext oldContext_«varIdx» = _ctx.getAdviceContext();
_ctx.setAdviceContext (_ctx.getAdviceContext ().copyWithAdvice (_advice));
try {
«EXPAND compileExpression (innerExpression.getVarName("innerRegisterAdviceExpr", "_" + varIdx), "Object", true, resource) FOR innerExpression»
«IF declareResultVar»«resultType.getResultType()» «ENDIF»«resultVarName» = «resultType.getResultType().cast()»«innerExpression.getVarName("innerRegisterAdviceExpr", "_" + varIdx)»;
}
finally {
_ctx.setAdviceContext (oldContext_«varIdx»);
}
«ENDLET»
«ENDDEFINE»
«DEFINE compileExpression(String resultVarName, String resultType, boolean declareResultVar, ParsedResource resource) FOR SequenceExpression»
«LET getNextVarIdx() AS varIdx»
«IF inner.size > 0
«FOREACH inner AS e ITERATOR it
«IF it.firstIteration
«EXPAND compileExpression (resultVarName, resultType, true, resource) FOR e»
«ELSE
«EXPAND compileExpression (resultVarName, resultType, false, resource) FOR e»
«ENDIF
«ENDFOREACH»
«ELSE
«IF resultType == "boolean"
«IF declareResultVar»boolean «ENDIF»«resultVarName» = false;
«ELSEIF resultType == "Boolean"
«IF declareResultVar»Boolean «ENDIF»«resultVarName» = Boolean.FALSE;
«ELSE
«IF declareResultVar»«resultType.getResultType()» «ENDIF»«resultVarName» = null;
«ENDIF
«ENDIF
«ENDLET»
«ENDDEFINE»
«DEFINE compileExpression(String resultVarName, String resultType, boolean declareResultVar, ParsedResource resource) FOR SetPropertyExpression»
«LET getNextVarIdx() AS varIdx»
«EXPAND compileExpression (resultVarName+"Inner", "Object", true, resource) FOR innerExpression»
if resultVarName» == null) {
_ctx.logNullDeRef pos.buildSourcePos()»);
«EXPAND initVar (resultType, declareResultVar) FOR resultVarName»
} else {
final BackendType «resultVarName»InnerType = _ctx.getTypesystem().findTyperesultVarName»);
«EXPAND compileExpression (getVarName (resultVarName+"Inner"+propertyName.toFirstUpper()+"Value", "value", "_" + varIdx), "Object", true, resource) FOR valueExpr»
«resultVarName»InnerType.setProperty (_ctx, «resultVarName»Inner, "«propertyName»", «getVarName (resultVarName+"Inner"+propertyName.toFirstUpper()+"Value", "value", "_" + varIdx)»);
«resultVarName» = «resultVarName»Inner;
}
«ENDLET»
«ENDDEFINE»
«DEFINE compileExpression(String resultVarName, String resultType, boolean declareResultVar, ParsedResource resource) FOR SwitchExpression»
«LET getNextVarIdx() AS varIdx»
«IF switchExpr != null
«EXPAND compileExpression (getVarName (switchExpr, "switchVal", "_" +varIdx), "Object", true, resource) FOR switchExpr»
«ELSE
Object «getVarName (switchExpr, "switchVal", "_" +varIdx = Boolean.TRUE;
«ENDIF
List<Pair<Function, Function>> «getVarName(resultVarName + "Cases", "cases", "_"+varIdx = new ArrayList<Pair<Function, Function>> ();
«FOREACH cases AS c ITERATOR it
Function «resultVarName»_Cond_«it.counter1» = new AbstractClosure(_ctx.getLocalVarContext(), _ctx.getFunctionDefContext(), new ArrayList<String> (), new ArrayList<BackendType>()) {
@Override
protected Object apply(ExecutionContext ctx) {
«EXPAND compileExpression (c.firstAsObject.getVarName (resultVarName + "_CondResult", "_" +it.counter1), "Object", true, resource) FOR c.firstAsObject
return «c.firstAsObject.getVarName (resultVarName + "_CondResult", "_" +it.counter1)»;
}
};
Function «resultVarName»_Yield_«it.counter1» = new AbstractClosure(_ctx.getLocalVarContext(), _ctx.getFunctionDefContext(), new ArrayList<String> (), new ArrayList<BackendType>()) {
@Override
protected Object apply(ExecutionContext ctx) {
«EXPAND compileExpression (c.secondAsObject.getVarName (resultVarName + "_YieldResult", "_" +it.counter1), "Object", true, resource) FOR c.secondAsObject
return «c.secondAsObject.getVarName (resultVarName + "_YieldResult", "_" +it.counter1)»;
}
};
Pair<Function, Function> «resultVarName»_Case_«it.counter1» = new Pair<Function, Function> resultVarName»_Cond_«it.counter1», «resultVarName»_Yield_«it.counter1»);
«getVarName(resultVarName + "Cases", "cases", "_"+varIdx)».add resultVarName»_Case_«it.counter1»);
«ENDFOREACH
«EXPAND initVar (resultType, declareResultVar) FOR resultVarName»
for (Pair<Function, Function> curCase : «getVarName(resultVarName + "Cases", "cases", "_"+varIdx)») {
final Object curVal = curCase.getFirst().invoke(_ctx, new Object[0]);
if (Helpers.nullSafeEquals (_ctx, «getVarName (switchExpr, "switchVal", "_" +varIdx)», curVal)) {
«resultVarName» = «resultType.getResultType().cast()»curCase.getSecond().invoke(_ctx, new Object[0]);
break;
}
}
«ENDLET»
«ENDDEFINE»
«DEFINE compileAdvice(String resultVarName, ParsedResource resource) FOR AroundAdvice»
«LET getNextVarIdx() AS varIdx»
AroundAdvice «resultVarName» = new AroundAdvice (bodyVarName_«varIdx», pointcutVarName_«varIdx», «cacheable»);
@M2tAroundAdvice (pointcutEXPAND compilePointcut (resource) FOR pointcut»)
«ENDLET»
«ENDDEFINE»
«DEFINE compilePointcut (ParsedResource resource) FOR Pointcut»
«ENDDEFINE»
«DEFINE compilePointcut (ParsedResource resource) FOR ExecutionPointcut»
«LET getNextVarIdx() AS varIdx»
@M2tPointcut (namePattern = "«functionNamePattern»" , «EXPAND compileAdviceParamTypes (resource) FOR paramTypes», hasVarArgs = «hasVarArgs»
«ENDLET»
«ENDDEFINE»
«DEFINE compileAdviceParamTypes (ParsedResource resource) FOR List[Pair
«LET getNextVarIdx() AS varIdx»
paramTypeNames={"«FOREACH this AS e SEPARATOR ", "»"«((AdviceParamType)e.secondAsObject).type.name»"«ENDFOREACH»}
«ENDLET»
«ENDDEFINE»
«DEFINE initVar (String typeName, boolean declareVar) FOR String-»
«IF declareVar»«typeName.getResultType()» «ENDIF»«this» = «typeName.getResultType().initializer()»;
«ENDDEFINE»
«DEFINE initVar (Void typeName) FOR String-»
«ENDDEFINE»