public FunctionDefNode(ParserRuleContext ctx, ListNode formalParameters, boolean external, BaseNode body) { super( ctx ); this.formalParameters = new ArrayList<>( ); this.external = external; this.body = body; if( formalParameters != null ) { for( BaseNode name : formalParameters.getElements() ) { this.formalParameters.add( (NameDefNode) name ); } } }
public static ListNode newListNode(ParserRuleContext ctx, List<BaseNode> exprs) { return new ListNode( ctx, exprs ); }
@Override public DirectCompilerResult visit(FunctionInvocationNode n) { DirectCompilerResult functionName = n.getName().accept(this); DirectCompilerResult params = n.getParams().accept(this); return DirectCompilerResult.of( Expressions.invoke(functionName.getExpression(), params.getExpression()), functionName.resultType) .withFD(functionName) .withFD(params); }
public ForExpressionNode(ParserRuleContext ctx, ListNode iterationContexts, BaseNode expression) { super( ctx ); this.iterationContexts = new ArrayList<>( ); this.expression = expression; for( BaseNode n : iterationContexts.getElements() ) { this.iterationContexts.add( (IterationContextNode) n ); } }
public QuantifiedExpressionNode(ParserRuleContext ctx, Quantifier quantifier, ListNode list, BaseNode expression) { super( ctx ); this.quantifier = quantifier; this.iterationContexts = new ArrayList<>(); this.expression = expression; for ( BaseNode n : list.getElements() ) { this.iterationContexts.add( (IterationContextNode) n ); } }
public ContextNode(ParserRuleContext ctx, ListNode list) { super( ctx ); for( BaseNode node : list.getElements() ) { ContextEntryNode entry = (ContextEntryNode) node; entries.add( entry ); parsedResultType.addField(entry.getName().getText(), entry.getResultType()); } }
@Override public BaseNode visitUnaryTests_positive(FEEL_1_1Parser.UnaryTests_positiveContext ctx) { ListNode list = (ListNode) visit(ctx.positiveUnaryTests()); return ASTBuilderFactory.newUnaryTestListNode(ctx, list.getElements(), UnaryTestListNode.State.Positive); }
@Override public BaseNode visitUnaryTests_negated(FEEL_1_1Parser.UnaryTests_negatedContext ctx) { BaseNode name = ASTBuilderFactory.newNameRefNode( ctx, "not", BuiltInType.BOOLEAN ); // negating a unary tests: BOOLEAN-type anyway ListNode value = (ListNode) visit( ctx.positiveUnaryTests() ); return ASTBuilderFactory.newUnaryTestListNode(ctx, value.getElements(), UnaryTestListNode.State.Negated); }
@Test public void testExpressionList() { // TODO review this test is potentially wrong as the list is not homogeneous String inputExpression = "[ 10, foo * bar, true ]"; BaseNode list = parse( inputExpression ); assertThat( list, is( instanceOf( ListNode.class ) ) ); assertThat( list.getResultType(), is( BuiltInType.LIST ) ); assertThat( list.getText(), is( "10, foo * bar, true" ) ); ListNode ln = (ListNode) list; assertThat( ln.getElements().size(), is( 3 ) ); assertThat( ln.getElements().get( 0 ), is( instanceOf( NumberNode.class ) ) ); assertThat( ln.getElements().get( 1 ), is( instanceOf( InfixOpNode.class ) ) ); assertThat( ln.getElements().get( 2 ), is( instanceOf( BooleanNode.class ) ) ); }
function = (FEELFunction) value; if ( function != null ) { Object[] p = params.getElements().stream().map( e -> e.evaluate( ctx ) ).toArray( Object[]::new ); List<String> functionNameParts = null; if (name instanceof NameRefNode) { if( params.getElements().size() == 1 ) { Object p = params.getElements().get( 0 ).evaluate( ctx ); return ((UnaryTest) value).apply( ctx, p ); } else { ctx.notifyEvt( astEvent(Severity.ERROR, Msg.createMessage(Msg.CAN_T_INVOKE_AN_UNARY_TEST_WITH_S_PARAMETERS_UNARY_TESTS_REQUIRE_1_SINGLE_PARAMETER, params.getElements().size()) ) );
@Test public void testLogicalNegation() { String inputExpression = "not ( true )"; BaseNode neg = parse( inputExpression ); assertThat( neg, is( instanceOf( FunctionInvocationNode.class ) ) ); assertThat( neg.getResultType(), is( BuiltInType.UNKNOWN ) ); assertThat( neg.getText(), is( "not ( true )" ) ); FunctionInvocationNode not = (FunctionInvocationNode) neg; assertThat( not.getParams().getElements().get( 0 ), is( instanceOf( BooleanNode.class ) ) ); assertThat( not.getParams().getElements().get( 0 ).getResultType(), is( BuiltInType.BOOLEAN ) ); assertThat( not.getParams().getElements().get( 0 ).getText(), is( "true" ) ); }
@Test public void testFunctionInvocationPositionalParams() { String inputExpression = "my.test.Function( x+10, \"foo\" )"; BaseNode functionBase = parse( inputExpression ); assertThat( functionBase, is( instanceOf( FunctionInvocationNode.class ) ) ); assertThat( functionBase.getText(), is( inputExpression ) ); FunctionInvocationNode function = (FunctionInvocationNode) functionBase; assertThat( function.getName(), is( instanceOf( QualifiedNameNode.class ) ) ); assertThat( function.getName().getText(), is( "my.test.Function" ) ); assertThat( function.getParams(), is( instanceOf( ListNode.class ) ) ); assertThat( function.getParams().getElements().size(), is( 2 ) ); assertThat( function.getParams().getElements().get( 0 ), is( instanceOf( InfixOpNode.class ) ) ); assertThat( function.getParams().getElements().get( 1 ), is( instanceOf( StringNode.class ) ) ); }
@Test public void testFunctionInvocationWithExpressionParameters() { String inputExpression = "date and time( date(\"2016-07-29\"), time(\"19:47:53\") )"; BaseNode functionBase = parse( inputExpression ); assertThat( functionBase, is( instanceOf( FunctionInvocationNode.class ) ) ); assertThat( functionBase.getText(), is( inputExpression ) ); FunctionInvocationNode function = (FunctionInvocationNode) functionBase; assertThat( function.getName(), is( instanceOf( NameRefNode.class ) ) ); assertThat( function.getName().getText(), is( "date and time" ) ); assertThat( function.getParams(), is( instanceOf( ListNode.class ) ) ); assertThat( function.getParams().getElements().size(), is( 2 ) ); assertThat( function.getParams().getElements().get( 0 ), is( instanceOf( FunctionInvocationNode.class ) ) ); assertThat( function.getParams().getElements().get( 1 ), is( instanceOf( FunctionInvocationNode.class ) ) ); }
@Test public void testEmptyList() { String inputExpression = "[]"; BaseNode list = parse( inputExpression ); assertThat( list, is( instanceOf( ListNode.class ) ) ); assertThat( list.getResultType(), is( BuiltInType.LIST ) ); assertThat( list.getText(), is( inputExpression ) ); ListNode ln = (ListNode) list; assertThat( ln.getElements(), is( empty() )); }
@Test public void testFunctionInvocationWithKeyword() { String inputExpression = "date and time( \"2016-07-29T19:47:53\" )"; BaseNode functionBase = parse( inputExpression ); assertThat( functionBase, is( instanceOf( FunctionInvocationNode.class ) ) ); assertThat( functionBase.getText(), is( inputExpression ) ); FunctionInvocationNode function = (FunctionInvocationNode) functionBase; assertThat( function.getName(), is( instanceOf( NameRefNode.class ) ) ); assertThat( function.getName().getText(), is( "date and time" ) ); assertThat( function.getParams(), is( instanceOf( ListNode.class ) ) ); assertThat( function.getParams().getElements().size(), is( 1 ) ); assertThat( function.getParams().getElements().get( 0 ), is( instanceOf( StringNode.class ) ) ); }
@Test public void testInValueList() { // TODO review this test might be wrong as list is not homogeneous String inputExpression = "x / 4 in ( 10+y, true, 80, someVar )"; BaseNode inNode = parse( inputExpression ); assertThat( inNode, is( instanceOf( InNode.class ) ) ); assertThat( inNode.getResultType(), is( BuiltInType.BOOLEAN ) ); assertThat( inNode.getText(), is( inputExpression ) ); InNode in = (InNode) inNode; assertThat( in.getValue(), is( instanceOf( InfixOpNode.class ) ) ); assertThat( in.getValue().getText(), is( "x / 4" ) ); assertThat( in.getExprs(), is( instanceOf( ListNode.class ) ) ); assertThat( in.getExprs().getText(), is( "10+y, true, 80, someVar" ) ); ListNode list = (ListNode) in.getExprs(); assertThat( list.getElements().get( 0 ), is( instanceOf( InfixOpNode.class ) ) ); assertThat( list.getElements().get( 1 ), is( instanceOf( BooleanNode.class ) ) ); assertThat( list.getElements().get( 2 ), is( instanceOf( NumberNode.class ) ) ); assertThat( list.getElements().get( 3 ), is( instanceOf( NameRefNode.class ) ) ); }
@Override public DirectCompilerResult visit(ListNode n) { MethodCallExpr list = Expressions.list(); DirectCompilerResult result = DirectCompilerResult.of(list, BuiltInType.LIST); for (BaseNode e : n.getElements()) { DirectCompilerResult r = e.accept(this); result.withFD(r.getFieldDeclarations()); list.addArgument(r.getExpression()); } return result; }
@Test public void testFunctionInvocationEmptyParams() { String inputExpression = "my.test.Function()"; BaseNode functionBase = parse( inputExpression ); assertThat( functionBase, is( instanceOf( FunctionInvocationNode.class ) ) ); assertThat( functionBase.getText(), is( inputExpression ) ); FunctionInvocationNode function = (FunctionInvocationNode) functionBase; assertThat( function.getName(), is( instanceOf( QualifiedNameNode.class ) ) ); assertThat( function.getName().getText(), is( "my.test.Function" ) ); assertThat( function.getParams(), is( instanceOf( ListNode.class ) ) ); assertThat( function.getParams().getElements(), is( empty() ) ); }
private BaseNode buildNotCall(ParserRuleContext ctx, BaseNode name, ListNode params) { if( params.getElements().size() == 1 ) { BaseNode param = params.getElements().get( 0 ); if( param instanceof UnaryTestNode ) { return ASTBuilderFactory.newUnaryTestNode( ctx, "not", params );
assertThat( function.getName().getText(), is( "decision table" ) ); assertThat( function.getParams(), is( instanceOf( ListNode.class ) ) ); assertThat( function.getParams().getElements().size(), is( 4 ) ); assertThat( function.getParams().getElements().get( 0 ), is( instanceOf( NamedParameterNode.class ) ) ); assertThat( function.getParams().getElements().get( 1 ), is( instanceOf( NamedParameterNode.class ) ) ); assertThat( function.getParams().getElements().get( 2 ), is( instanceOf( NamedParameterNode.class ) ) ); assertThat( function.getParams().getElements().get( 3 ), is( instanceOf( NamedParameterNode.class ) ) ); NamedParameterNode named = (NamedParameterNode) function.getParams().getElements().get( 0 ); assertThat( named.getText(), is( "outputs: \"Applicant Risk Rating\"" ) ); assertThat( named.getName().getText(), is( "outputs" ) ); named = (NamedParameterNode) function.getParams().getElements().get( 1 ); assertThat( named.getName().getText(), is( "input expression list" ) ); assertThat( named.getExpression(), is( instanceOf( ListNode.class ) ) ); assertThat( list.getElements().size(), is( 2 ) ); assertThat( list.getElements().get( 0 ), is( instanceOf( StringNode.class ) ) ); assertThat( list.getElements().get( 0 ).getText(), is( "\"Applicant Age\"" ) ); assertThat( list.getElements().get( 1 ), is( instanceOf( StringNode.class ) ) ); assertThat( list.getElements().get( 1 ).getText(), is( "\"Medical History\"" ) ); named = (NamedParameterNode) function.getParams().getElements().get( 2 ); assertThat( named.getName().getText(), is( "rule list" ) ); assertThat( named.getExpression(), is( instanceOf( ListNode.class ) ) ); assertThat( list.getElements().size(), is( 5 ) ); assertThat( list.getElements().get( 0 ), is( instanceOf( ListNode.class ) ) );