@Override public DirectCompilerResult visit(QuantifiedExpressionNode n) { DirectCompilerResult expr = n.getExpression().accept(this); HashSet<FieldDeclaration> fds = new HashSet<>(); Expressions.NamedLambda namedLambda = Expressions.namedLambda( expr.getExpression(), n.getExpression().getText()); fds.add(namedLambda.field()); fds.addAll(expr.getFieldDeclarations()); List<Expression> expressions = n.getIterationContexts() .stream() .map(iter -> iter.accept(this)) .peek(r -> fds.addAll(r.getFieldDeclarations())) .map(DirectCompilerResult::getExpression) .collect(Collectors.toList()); // .satisfies(expr) return DirectCompilerResult.of( Expressions.quantifier(n.getQuantifier(), namedLambda.name(), expressions), expr.resultType, fds); }
.addArgument(nameLambda.name()) .addArgument(exprLambda.name()); r.addFieldDesclaration(nameLambda.field()); r.addFieldDesclaration(exprLambda.field()); r.withFD(iterName); r.withFD(iterExpr); rangeEnd.getExpression(), rangeEndExpr.getText()); with.addArgument(rangeLambda.name()); r.addFieldDesclaration(rangeLambda.field()); r.withFD(rangeEnd);
@Override public DirectCompilerResult visit(UnaryTestListNode n) { MethodCallExpr expr = Expressions.list(); HashSet<FieldDeclaration> fds = new HashSet<>(); for (BaseNode e : n.getElements()) { DirectCompilerResult r = e.accept(this); fds.addAll(r.getFieldDeclarations()); expr.addArgument(r.getExpression()); } if (n.isNegated()) { Expressions.NamedLambda negated = Expressions.namedUnaryLambda( Expressions.notExists(expr), n.getText()); fds.add(negated.field()); return DirectCompilerResult.of( Expressions.list(negated.name()), BuiltInType.LIST, fds); } else { return DirectCompilerResult.of( expr, BuiltInType.LIST, fds); } }
@Override public DirectCompilerResult visit(ForExpressionNode n) { DirectCompilerResult expr = n.getExpression().accept(this); HashSet<FieldDeclaration> fds = new HashSet<>(); Expressions.NamedLambda namedLambda = Expressions.namedLambda( expr.getExpression(), n.getExpression().getText()); fds.add(namedLambda.field()); fds.addAll(expr.getFieldDeclarations()); List<Expression> expressions = n.getIterationContexts() .stream() .map(iter -> iter.accept(this)) .peek(r -> fds.addAll(r.getFieldDeclarations())) .map(DirectCompilerResult::getExpression) .collect(Collectors.toList()); // .satisfies(expr) return DirectCompilerResult.of( Expressions.ffor(expressions, namedLambda.name()), expr.resultType, fds); }
@Override public DirectCompilerResult visit(UnaryTestNode n) { DirectCompilerResult value = n.getValue().accept(this); Expression expr = Expressions.unary(n.getOperator(), value.getExpression()); Expressions.NamedLambda namedLambda = Expressions.namedUnaryLambda(expr, n.getText()); DirectCompilerResult r = DirectCompilerResult.of(namedLambda.name(), BuiltInType.UNARY_TEST) .withFD(value); r.addFieldDesclaration(namedLambda.field()); return r; } }
public static NamedLambda namedUnaryLambda(Expression expr, String text) { LambdaExpr lambda = Expressions.unaryLambda(expr); String name = Constants.unaryTestName(text); FieldDeclaration field = Constants.unaryTest(name, lambda); return new NamedLambda(new NameExpr(name), lambda, field); }
public static NamedLambda namedLambda(Expression expr, String text) { LambdaExpr lambda = Expressions.lambda(expr); String name = Constants.functionName(text); FieldDeclaration field = Constants.function(name, lambda); return new NamedLambda(new NameExpr(name), lambda, field); }
@Override public DirectCompilerResult visit(FilterExpressionNode n) { DirectCompilerResult expr = n.getExpression().accept(this); DirectCompilerResult filter = n.getFilter().accept(this); Expressions.NamedLambda lambda = Expressions.namedLambda(filter.getExpression(), n.getFilter().getText()); DirectCompilerResult r = DirectCompilerResult.of( Expressions.filter(expr.getExpression(), lambda.name()), // here we could still try to infer the result type, but presently use ANY BuiltInType.UNKNOWN).withFD(expr).withFD(filter); r.addFieldDesclaration(lambda.field()); return r; }