private DirectCompilerResult visitQuantExpr(Expression quantOp, IterationContextsContext iterationContexts, ExpressionContext expression) { Set<FieldDeclaration> fds = new HashSet<>(); MethodCallExpr forCall = new MethodCallExpr(new NameExpr(CompiledFEELSupport.class.getSimpleName()), "quant"); forCall.addArgument(quantOp); forCall.addArgument(new NameExpr("feelExprCtx")); Expression curForCallTail = forCall; IterationContextsContext iCtxs = iterationContexts; for (FEEL_1_1Parser.IterationContextContext ic : iCtxs.iterationContext()) { DirectCompilerResult name = visit(ic.iterationNameDefinition()); DirectCompilerResult expr = visit(ic.expression().get(0)); fds.addAll(name.getFieldDeclarations()); fds.addAll(expr.getFieldDeclarations()); MethodCallExpr filterWithCall = new MethodCallExpr(curForCallTail, "with"); Expression nameParam = anonFunctionEvaluationContext2Object(name.getExpression()); Expression exprParam = anonFunctionEvaluationContext2Object(expr.getExpression()); filterWithCall.addArgument(nameParam); filterWithCall.addArgument(exprParam); curForCallTail = filterWithCall; } DirectCompilerResult expr = visit(expression); fds.addAll(expr.getFieldDeclarations()); MethodCallExpr returnCall = new MethodCallExpr(curForCallTail, "satisfies"); Expression returnParam = anonFunctionEvaluationContext2Object(expr.getExpression()); returnCall.addArgument(returnParam); return DirectCompilerResult.of(returnCall, expr.resultType, fds); }
if (ic.expression().size() == 1) { MethodCallExpr filterWithCall = new MethodCallExpr(curForCallTail, "with"); Expression nameParam = anonFunctionEvaluationContext2Object(name.getExpression()); Expression exprParam = anonFunctionEvaluationContext2Object(expr.getExpression()); filterWithCall.addArgument(nameParam); filterWithCall.addArgument(exprParam); fds.addAll(rangeEndExpr.getFieldDeclarations()); MethodCallExpr filterWithCall = new MethodCallExpr(curForCallTail, "with"); Expression nameParam = anonFunctionEvaluationContext2Object(name.getExpression()); Expression exprParam = anonFunctionEvaluationContext2Object(expr.getExpression()); Expression rangeEndExprParam = anonFunctionEvaluationContext2Object(rangeEndExpr.getExpression()); filterWithCall.addArgument(nameParam); filterWithCall.addArgument(exprParam); fds.addAll(expr.getFieldDeclarations()); MethodCallExpr returnCall = new MethodCallExpr(curForCallTail, "rreturn"); Expression returnParam = anonFunctionEvaluationContext2Object(expr.getExpression()); returnCall.addArgument(returnParam); return DirectCompilerResult.of(returnCall, expr.resultType, fds);
functionDefExpr.addArgument(ANONYMOUS_STRING_LITERAL); functionDefExpr.addArgument((parameters != null) ? parameters.getExpression() : EMPTY_LIST); functionDefExpr.addArgument(anonFunctionEvaluationContext2Object(methodCallExpr)); functionDefExpr.addArgument(new MethodCallExpr(new NameExpr("feelExprCtx"), "current")); DirectCompilerResult result = DirectCompilerResult.of(functionDefExpr, BuiltInType.FUNCTION);
@Override public DirectCompilerResult visitFilterPathExpression(FEEL_1_1Parser.FilterPathExpressionContext ctx) { if (ctx.filter != null) { DirectCompilerResult expr = visit(ctx.filterPathExpression()); DirectCompilerResult filter = visit(ctx.expression()); MethodCallExpr filterCall = new MethodCallExpr(new NameExpr(CompiledFEELSupport.class.getSimpleName()), "filter"); filterCall.addArgument(new NameExpr("feelExprCtx")); filterCall.addArgument(expr.getExpression()); MethodCallExpr filterWithCall = new MethodCallExpr(filterCall, "with"); // if (filter.resultType != BuiltInType.BOOLEAN) { // // Then is the case Table 54: Semantics of lists, ROW: e1 is a list and e2 is an integer (0 scale number) // filterWithCall.addArgument(filter.getExpression()); // } else // { // Then is the case Table 54: Semantics of lists, ROW: e1 is a list and type(FEEL(e2 , s')) is boolean // currently delegated to runtime instead: Expression anonFunctionClass = anonFunctionEvaluationContext2Object(filter.getExpression()); filterWithCall.addArgument(anonFunctionClass); // } return DirectCompilerResult.of(filterWithCall, BuiltInType.UNKNOWN).withFD(expr).withFD(filter); } else if (ctx.qualifiedName() != null) { DirectCompilerResult expr = visit(ctx.filterPathExpression()); List<String> names = ctx.qualifiedName().nameRef().stream().map(nameRefContext -> ParserHelper.getOriginalText(nameRefContext)).collect(Collectors.toList()); return telescopePathAccessor(expr, names); } else { return visit(ctx.unaryExpression()); } }
private DirectCompilerResult declareInternalFunction(ExpressionContext bodyCtx, FEEL_1_1Parser.FormalParametersContext parametersCtx) { DirectCompilerResult body = visit(bodyCtx); DirectCompilerResult parameters = parametersCtx == null? null : visit(parametersCtx); ObjectCreationExpr functionDefExpr = new ObjectCreationExpr(); functionDefExpr.setType(TYPE_CUSTOM_FEEL_FUNCTION); functionDefExpr.addArgument(ANONYMOUS_STRING_LITERAL); functionDefExpr.addArgument((parameters != null) ? parameters.getExpression() : EMPTY_LIST); functionDefExpr.addArgument(anonFunctionEvaluationContext2Object(body.getExpression())); functionDefExpr.addArgument(new MethodCallExpr(new NameExpr("feelExprCtx"), "current")); DirectCompilerResult result = DirectCompilerResult.of(functionDefExpr, BuiltInType.FUNCTION).withFD(body); if (parameters != null) { result.withFD(parameters); } return result; }