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 visitContextEntries(FEEL_1_1Parser.ContextEntriesContext ctx) { List<BaseNode> nodes = new ArrayList<>(); scopeHelper.pushScope(); for ( FEEL_1_1Parser.ContextEntryContext c : ctx.contextEntry() ) { ContextEntryNode visited = (ContextEntryNode) visit( c ); // forced cast similarly to visitFunctionDefinition() method if (visited != null) { nodes.add( visited ); scopeHelper.addType( visited.getName().getText() , visited.getResultType() ); } } scopeHelper.popScope(); return ASTBuilderFactory.newListNode( ctx, nodes ); }
@Override public DirectCompilerResult visit(ContextEntryNode n) { DirectCompilerResult key = n.getName().accept(this); DirectCompilerResult value = n.getValue().accept(this); if (key.resultType != BuiltInType.STRING) { throw new IllegalArgumentException( "a Context Entry Key must be a valid FEEL String type"); } String keyText = key.getExpression().asStringLiteralExpr().getValue(); // .setEntry(key, value) MethodCallExpr setEntryContextCall = FeelCtx.setEntry(keyText, value.getExpression()); return DirectCompilerResult.of( setEntryContextCall, value.resultType, value.getFieldDeclarations()); }
@Test public void testFunctionDefinition() { String inputExpression = "{ is minor : function( person's age ) person's age < 21 }"; BaseNode ctxbase = parse( inputExpression ); assertThat( ctxbase, is( instanceOf( ContextNode.class ) ) ); assertThat( ctxbase.getText(), is( inputExpression ) ); ContextNode ctx = (ContextNode) ctxbase; assertThat( ctx.getEntries().size(), is( 1 ) ); ContextEntryNode entry = ctx.getEntries().get( 0 ); assertThat( entry.getName(), is( instanceOf( NameDefNode.class ) ) ); NameDefNode name = (NameDefNode) entry.getName(); assertThat( name.getText(), is("is minor") ); assertThat( entry.getValue(), is( instanceOf( FunctionDefNode.class ) ) ); assertThat( entry.getValue().getText(), is("function( person's age ) person's age < 21") ); FunctionDefNode isMinorFunc = (FunctionDefNode) entry.getValue(); assertThat( isMinorFunc.getFormalParameters().size(), is( 1 ) ); assertThat( isMinorFunc.getFormalParameters().get( 0 ).getText(), is( "person's age" ) ); assertThat( isMinorFunc.isExternal(), is( false ) ); assertThat( isMinorFunc.getBody(), is( instanceOf( InfixOpNode.class ) ) ); }
assertThat(entry.getName(), is(instanceOf(StringNode.class))); StringNode nameNode = (StringNode) entry.getName(); assertThat(nameNode.getText(), is(notNullValue())); assertThat(nameNode.getText(), is("\"a string key\"")); // Reference String literal test, BaseNode#getText() return the FEEL equivalent expression, in this case quoted. assertThat( entry.getName(), is( instanceOf( NameDefNode.class ) ) ); NameDefNode name = (NameDefNode) entry.getName(); assertThat( name.getParts(), is( notNullValue() ) ); assertThat( name.getParts().size(), is( 5 ) ); assertThat( entry.getName().getText(), is("a non-string key") ); assertThat( entry.getValue(), is( instanceOf( InfixOpNode.class ) ) ); assertThat( entry.getResultType(), is( BuiltInType.NUMBER ) ); assertThat( entry.getName(), is( instanceOf( NameDefNode.class ) ) ); name = (NameDefNode) entry.getName(); assertThat( name.getParts(), is( notNullValue() ) ); assertThat( name.getParts().size(), is( 9 ) ); assertThat( entry.getName().getText(), is("a key.with + /' odd chars") ); assertThat( entry.getValue(), is( instanceOf( RangeNode.class ) ) ); assertThat( entry.getResultType(), is( BuiltInType.RANGE ) );
@Test public void testNestedContexts2() { String inputExpression = "{ an applicant : { " + " home address : {" + " street name: \"broadway st\"," + " city : \"New York\" " + " } " + " },\n " + " street : an applicant.home address.street name \n" + "}"; BaseNode ctxbase = parse( inputExpression ); assertThat( ctxbase, is( instanceOf( ContextNode.class ) ) ); assertThat( ctxbase.getText(), is( inputExpression ) ); ContextNode ctx = (ContextNode) ctxbase; assertThat( ctx.getEntries().size(), is( 2 ) ); ContextEntryNode entry = ctx.getEntries().get( 1 ); assertThat( entry.getName(), is( instanceOf( NameDefNode.class ) ) ); assertThat( entry.getResultType(), is( BuiltInType.STRING ) ); NameDefNode name = (NameDefNode) entry.getName(); assertThat( name.getText(), is("street") ); assertThat( entry.getValue(), is( instanceOf( QualifiedNameNode.class ) ) ); QualifiedNameNode qnn = (QualifiedNameNode) entry.getValue(); assertThat( qnn.getParts().get( 0 ).getText(), is("an applicant") ); assertThat( qnn.getParts().get( 1 ).getText(), is("home address") ); assertThat( qnn.getParts().get( 2 ).getText(), is("street name") ); }
assertThat( entry.getName(), is( instanceOf( NameDefNode.class ) ) ); NameDefNode name = (NameDefNode) entry.getName(); assertThat( name.getParts(), is( notNullValue() ) ); assertThat( name.getParts().size(), is( 5 ) ); assertThat( entry.getName().getText(), is("a variable with in keyword") ); assertThat( entry.getValue(), is( instanceOf( NumberNode.class ) ) ); assertThat( entry.getResultType(), is( BuiltInType.NUMBER ) ); assertThat( entry.getName(), is( instanceOf( NameDefNode.class ) ) ); name = (NameDefNode) entry.getName(); assertThat( name.getParts(), is( notNullValue() ) ); assertThat( name.getParts().size(), is( 2 ) ); assertThat( entry.getName().getText(), is("another variable") ); assertThat( entry.getValue(), is( instanceOf( InfixOpNode.class ) ) ); assertThat( entry.getResultType(), is( BuiltInType.NUMBER ) ); assertThat( entry.getName(), is( instanceOf( NameDefNode.class ) ) ); name = (NameDefNode) entry.getName(); assertThat( name.getParts(), is( notNullValue() ) ); assertThat( name.getParts().size(), is( 3 ) ); assertThat( entry.getName().getText(), is("another in variable") ); assertThat( entry.getValue(), is( instanceOf( InfixOpNode.class ) ) ); assertThat( entry.getResultType(), is( BuiltInType.NUMBER ) );
assertThat( entry.getName(), is( instanceOf( NameDefNode.class ) ) ); NameDefNode name = (NameDefNode) entry.getName(); assertThat( name.getText(), is("a value") ); assertThat( entry.getValue(), is( instanceOf( NumberNode.class ) ) ); assertThat( entry.getName(), is( instanceOf( NameDefNode.class ) ) ); name = (NameDefNode) entry.getName(); assertThat( name.getText(), is( "an applicant" ) ); assertThat( entry.getValue(), is( instanceOf( ContextNode.class ) ) ); assertThat( applicant.getEntries().get( 0 ).getName().getText(), is("first name") ); assertThat( applicant.getEntries().get( 0 ).getResultType(), is( BuiltInType.STRING ) ); assertThat( applicant.getEntries().get( 1 ).getName().getText(), is("last + name") ); assertThat( applicant.getEntries().get( 1 ).getResultType(), is( BuiltInType.STRING ) ); assertThat( applicant.getEntries().get( 2 ).getName().getText(), is("full name") ); assertThat( applicant.getEntries().get( 2 ).getResultType(), is( BuiltInType.STRING ) ); assertThat( applicant.getEntries().get( 3 ).getName().getText(), is("address") ); assertThat( applicant.getEntries().get( 3 ).getValue(), is( instanceOf( ContextNode.class ) ) ); assertThat( address.getEntries().get( 0 ).getName().getText(), is("street") ); assertThat( address.getEntries().get( 0 ).getResultType(), is( BuiltInType.STRING ) ); assertThat( address.getEntries().get( 1 ).getName().getText(), is("city") ); assertThat( address.getEntries().get( 0 ).getResultType(), is( BuiltInType.STRING ) );
.map(e -> { DirectCompilerResult r = e.accept(this); scopeHelper.addType(e.getName().getText(), r.resultType); return r; })
assertThat( entry.getName(), is( instanceOf( NameDefNode.class ) ) ); NameDefNode name = (NameDefNode) entry.getName(); assertThat( name.getText(), is("trigonometric cosine") ); assertThat( entry.getValue(), is( instanceOf( FunctionDefNode.class ) ) ); assertThat( body.getEntries().size(), is( 1 ) ); ContextEntryNode java = body.getEntries().get( 0 ); assertThat( java.getName().getText(), is( "java" ) ); assertThat( java.getValue(), is( instanceOf( ContextNode.class ) ) ); assertThat( def.getEntries().get( 0 ).getName().getText(), is( "class" ) ); assertThat( def.getEntries().get( 0 ).getValue(), is( instanceOf( StringNode.class ) ) ); assertThat( def.getEntries().get( 0 ).getValue().getText(), is( "\"java.lang.Math\"" ) ); assertThat( def.getEntries().get( 1 ).getName().getText(), is( "method signature" ) ); assertThat( def.getEntries().get( 1 ).getValue(), is( instanceOf( StringNode.class ) ) ); assertThat( def.getEntries().get( 1 ).getValue().getText(), is( "\"cos(double)\"" ) );