Example #1
0
        public ExpressionNode BuildExpression(bool enableValidation)
        {
            ExpressionNode pathRoot = null;
            ExpressionNode path     = null;

            foreach (var element in _elements)
            {
                ExpressionNode node = null;
                switch (element)
                {
                case NotExpressionPathElement _:
                    node = new LogicalNotNode();
                    break;

                case PropertyElement prop:
                    node = new PropertyAccessorNode(prop.Property.Name, enableValidation, new PropertyInfoAccessorPlugin(prop.Property, prop.AccessorFactory));
                    break;

                case ArrayElementPathElement arr:
                    node = new PropertyAccessorNode(CommonPropertyNames.IndexerName, enableValidation, new ArrayElementPlugin(arr.Indices, arr.ElementType));
                    break;

                case VisualAncestorPathElement visualAncestor:
                    node = new FindVisualAncestorNode(visualAncestor.AncestorType, visualAncestor.Level);
                    break;

                case AncestorPathElement ancestor:
                    node = new FindAncestorNode(ancestor.AncestorType, ancestor.Level);
                    break;

                case SelfPathElement _:
                    node = new SelfNode();
                    break;

                case ElementNameElement name:
                    node = new ElementNameNode(name.NameScope, name.Name);
                    break;

                case IStronglyTypedStreamElement stream:
                    node = new StreamNode(stream.CreatePlugin());
                    break;

                case ITypeCastElement typeCast:
                    node = new StrongTypeCastNode(typeCast.Type, typeCast.Cast);
                    break;

                default:
                    throw new InvalidOperationException($"Unknown binding path element type {element.GetType().FullName}");
                }

                path = pathRoot is null ? (pathRoot = node) : path.Next = node;
            }

            return(pathRoot ?? new EmptyExpressionNode());
        }
Example #2
0
 public virtual XzaarExpression Visit(LogicalNotNode node)
 {
     return(null);
 }
Example #3
0
        public (ExpressionNode?Node, SourceMode Mode) Parse(ref CharacterReader r)
        {
            ExpressionNode?rootNode = null;
            ExpressionNode?node     = null;

            var(astNodes, mode) = BindingExpressionGrammar.Parse(ref r);

            foreach (var astNode in astNodes)
            {
                ExpressionNode?nextNode = null;
                switch (astNode)
                {
                case BindingExpressionGrammar.EmptyExpressionNode _:
                    nextNode = new EmptyExpressionNode();
                    break;

                case BindingExpressionGrammar.NotNode _:
                    nextNode = new LogicalNotNode();
                    break;

                case BindingExpressionGrammar.StreamNode _:
                    nextNode = new StreamNode();
                    break;

                case BindingExpressionGrammar.PropertyNameNode propName:
                    nextNode = new PropertyAccessorNode(propName.PropertyName, _enableValidation);
                    break;

                case BindingExpressionGrammar.IndexerNode indexer:
                    nextNode = new StringIndexerNode(indexer.Arguments);
                    break;

                case BindingExpressionGrammar.AttachedPropertyNameNode attachedProp:
                    nextNode = ParseAttachedProperty(attachedProp);
                    break;

                case BindingExpressionGrammar.SelfNode _:
                    nextNode = new SelfNode();
                    break;

                case BindingExpressionGrammar.AncestorNode ancestor:
                    nextNode = ParseFindAncestor(ancestor);
                    break;

                case BindingExpressionGrammar.NameNode elementName:
                    nextNode = new ElementNameNode(_nameScope ?? throw new NotSupportedException("Invalid element name binding with null name scope!"), elementName.Name);
                    break;

                case BindingExpressionGrammar.TypeCastNode typeCast:
                    nextNode = ParseTypeCastNode(typeCast);
                    break;
                }
                if (node is null)
                {
                    rootNode = node = nextNode;
                }
                else
                {
                    node.Next = nextNode;
                    node      = nextNode;
                }
            }

            return(rootNode, mode);
        }
    // $ANTLR start "unaryExpression"
    // JavaScript.g:313:1: unaryExpression : ( postfixExpression | 'delete' ( LT )* unaryExpression | 'void' ( LT )* unaryExpression | 'typeof' ( LT )* unaryExpression | '++' unaryExpression | '--' unaryExpression | '+' ( LT )* unaryExpression | '-' ( LT )* unaryExpression | '~' ( LT )* unaryExpression | '!' ( LT )* unaryExpression );
    public JavaScriptParser.unaryExpression_return unaryExpression() // throws RecognitionException [1]
    {   
        JavaScriptParser.unaryExpression_return retval = new JavaScriptParser.unaryExpression_return();
        retval.Start = input.LT(1);

        object root_0 = null;

        IToken string_literal369 = null;
        IToken LT370 = null;
        IToken string_literal372 = null;
        IToken LT373 = null;
        IToken string_literal375 = null;
        IToken LT376 = null;
        IToken string_literal378 = null;
        IToken string_literal380 = null;
        IToken char_literal382 = null;
        IToken LT383 = null;
        IToken char_literal385 = null;
        IToken LT386 = null;
        IToken char_literal388 = null;
        IToken LT389 = null;
        IToken char_literal391 = null;
        IToken LT392 = null;
        JavaScriptParser.postfixExpression_return postfixExpression368 = default(JavaScriptParser.postfixExpression_return);

        JavaScriptParser.unaryExpression_return unaryExpression371 = default(JavaScriptParser.unaryExpression_return);

        JavaScriptParser.unaryExpression_return unaryExpression374 = default(JavaScriptParser.unaryExpression_return);

        JavaScriptParser.unaryExpression_return unaryExpression377 = default(JavaScriptParser.unaryExpression_return);

        JavaScriptParser.unaryExpression_return unaryExpression379 = default(JavaScriptParser.unaryExpression_return);

        JavaScriptParser.unaryExpression_return unaryExpression381 = default(JavaScriptParser.unaryExpression_return);

        JavaScriptParser.unaryExpression_return unaryExpression384 = default(JavaScriptParser.unaryExpression_return);

        JavaScriptParser.unaryExpression_return unaryExpression387 = default(JavaScriptParser.unaryExpression_return);

        JavaScriptParser.unaryExpression_return unaryExpression390 = default(JavaScriptParser.unaryExpression_return);

        JavaScriptParser.unaryExpression_return unaryExpression393 = default(JavaScriptParser.unaryExpression_return);


        object string_literal369_tree=null;
        object LT370_tree=null;
        object string_literal372_tree=null;
        object LT373_tree=null;
        object string_literal375_tree=null;
        object LT376_tree=null;
        object string_literal378_tree=null;
        object string_literal380_tree=null;
        object char_literal382_tree=null;
        object LT383_tree=null;
        object char_literal385_tree=null;
        object LT386_tree=null;
        object char_literal388_tree=null;
        object LT389_tree=null;
        object char_literal391_tree=null;
        object LT392_tree=null;

        try 
    	{
            // JavaScript.g:314:2: ( postfixExpression | 'delete' ( LT )* unaryExpression | 'void' ( LT )* unaryExpression | 'typeof' ( LT )* unaryExpression | '++' unaryExpression | '--' unaryExpression | '+' ( LT )* unaryExpression | '-' ( LT )* unaryExpression | '~' ( LT )* unaryExpression | '!' ( LT )* unaryExpression )
            int alt199 = 10;
            alt199 = dfa199.Predict(input);
            switch (alt199) 
            {
                case 1 :
                    // JavaScript.g:314:4: postfixExpression
                    {
                    	root_0 = (object)adaptor.GetNilNode();

                    	PushFollow(FOLLOW_postfixExpression_in_unaryExpression2837);
                    	postfixExpression368 = postfixExpression();
                    	state.followingStackPointer--;
                    	if (state.failed) return retval;
                    	if ( state.backtracking == 0 ) adaptor.AddChild(root_0, postfixExpression368.Tree);

                    }
                    break;
                case 2 :
                    // JavaScript.g:315:4: 'delete' ( LT )* unaryExpression
                    {
                    	root_0 = (object)adaptor.GetNilNode();

                    	string_literal369=(IToken)Match(input,104,FOLLOW_104_in_unaryExpression2843); if (state.failed) return retval;
                    	if ( state.backtracking == 0 )
                    	{string_literal369_tree = new DeleteNode(string_literal369) ;
                    		root_0 = (object)adaptor.BecomeRoot(string_literal369_tree, root_0);
                    	}
                    	// JavaScript.g:315:28: ( LT )*
                    	do 
                    	{
                    	    int alt192 = 2;
                    	    int LA192_0 = input.LA(1);

                    	    if ( (LA192_0 == LT) )
                    	    {
                    	        alt192 = 1;
                    	    }


                    	    switch (alt192) 
                    		{
                    			case 1 :
                    			    // JavaScript.g:315:28: LT
                    			    {
                    			    	LT370=(IToken)Match(input,LT,FOLLOW_LT_in_unaryExpression2849); if (state.failed) return retval;

                    			    }
                    			    break;

                    			default:
                    			    goto loop192;
                    	    }
                    	} while (true);

                    	loop192:
                    		;	// Stops C# compiler whining that label 'loop192' has no statements

                    	PushFollow(FOLLOW_unaryExpression_in_unaryExpression2853);
                    	unaryExpression371 = unaryExpression();
                    	state.followingStackPointer--;
                    	if (state.failed) return retval;
                    	if ( state.backtracking == 0 ) adaptor.AddChild(root_0, unaryExpression371.Tree);

                    }
                    break;
                case 3 :
                    // JavaScript.g:316:4: 'void' ( LT )* unaryExpression
                    {
                    	root_0 = (object)adaptor.GetNilNode();

                    	string_literal372=(IToken)Match(input,105,FOLLOW_105_in_unaryExpression2859); if (state.failed) return retval;
                    	if ( state.backtracking == 0 )
                    	{string_literal372_tree = new VoidNode(string_literal372) ;
                    		root_0 = (object)adaptor.BecomeRoot(string_literal372_tree, root_0);
                    	}
                    	// JavaScript.g:316:24: ( LT )*
                    	do 
                    	{
                    	    int alt193 = 2;
                    	    int LA193_0 = input.LA(1);

                    	    if ( (LA193_0 == LT) )
                    	    {
                    	        alt193 = 1;
                    	    }


                    	    switch (alt193) 
                    		{
                    			case 1 :
                    			    // JavaScript.g:316:24: LT
                    			    {
                    			    	LT373=(IToken)Match(input,LT,FOLLOW_LT_in_unaryExpression2865); if (state.failed) return retval;

                    			    }
                    			    break;

                    			default:
                    			    goto loop193;
                    	    }
                    	} while (true);

                    	loop193:
                    		;	// Stops C# compiler whining that label 'loop193' has no statements

                    	PushFollow(FOLLOW_unaryExpression_in_unaryExpression2869);
                    	unaryExpression374 = unaryExpression();
                    	state.followingStackPointer--;
                    	if (state.failed) return retval;
                    	if ( state.backtracking == 0 ) adaptor.AddChild(root_0, unaryExpression374.Tree);

                    }
                    break;
                case 4 :
                    // JavaScript.g:317:4: 'typeof' ( LT )* unaryExpression
                    {
                    	root_0 = (object)adaptor.GetNilNode();

                    	string_literal375=(IToken)Match(input,106,FOLLOW_106_in_unaryExpression2875); if (state.failed) return retval;
                    	if ( state.backtracking == 0 )
                    	{string_literal375_tree = new TypeOfExpr(string_literal375) ;
                    		root_0 = (object)adaptor.BecomeRoot(string_literal375_tree, root_0);
                    	}
                    	// JavaScript.g:317:28: ( LT )*
                    	do 
                    	{
                    	    int alt194 = 2;
                    	    int LA194_0 = input.LA(1);

                    	    if ( (LA194_0 == LT) )
                    	    {
                    	        alt194 = 1;
                    	    }


                    	    switch (alt194) 
                    		{
                    			case 1 :
                    			    // JavaScript.g:317:28: LT
                    			    {
                    			    	LT376=(IToken)Match(input,LT,FOLLOW_LT_in_unaryExpression2881); if (state.failed) return retval;

                    			    }
                    			    break;

                    			default:
                    			    goto loop194;
                    	    }
                    	} while (true);

                    	loop194:
                    		;	// Stops C# compiler whining that label 'loop194' has no statements

                    	PushFollow(FOLLOW_unaryExpression_in_unaryExpression2885);
                    	unaryExpression377 = unaryExpression();
                    	state.followingStackPointer--;
                    	if (state.failed) return retval;
                    	if ( state.backtracking == 0 ) adaptor.AddChild(root_0, unaryExpression377.Tree);

                    }
                    break;
                case 5 :
                    // JavaScript.g:318:4: '++' unaryExpression
                    {
                    	root_0 = (object)adaptor.GetNilNode();

                    	string_literal378=(IToken)Match(input,107,FOLLOW_107_in_unaryExpression2891); if (state.failed) return retval;
                    	if ( state.backtracking == 0 )
                    	{string_literal378_tree = new preIncExpr(string_literal378) ;
                    		root_0 = (object)adaptor.BecomeRoot(string_literal378_tree, root_0);
                    	}
                    	PushFollow(FOLLOW_unaryExpression_in_unaryExpression2897);
                    	unaryExpression379 = unaryExpression();
                    	state.followingStackPointer--;
                    	if (state.failed) return retval;
                    	if ( state.backtracking == 0 ) adaptor.AddChild(root_0, unaryExpression379.Tree);

                    }
                    break;
                case 6 :
                    // JavaScript.g:319:4: '--' unaryExpression
                    {
                    	root_0 = (object)adaptor.GetNilNode();

                    	string_literal380=(IToken)Match(input,108,FOLLOW_108_in_unaryExpression2903); if (state.failed) return retval;
                    	if ( state.backtracking == 0 )
                    	{string_literal380_tree = new preDecExpr(string_literal380) ;
                    		root_0 = (object)adaptor.BecomeRoot(string_literal380_tree, root_0);
                    	}
                    	PushFollow(FOLLOW_unaryExpression_in_unaryExpression2909);
                    	unaryExpression381 = unaryExpression();
                    	state.followingStackPointer--;
                    	if (state.failed) return retval;
                    	if ( state.backtracking == 0 ) adaptor.AddChild(root_0, unaryExpression381.Tree);

                    }
                    break;
                case 7 :
                    // JavaScript.g:320:4: '+' ( LT )* unaryExpression
                    {
                    	root_0 = (object)adaptor.GetNilNode();

                    	char_literal382=(IToken)Match(input,99,FOLLOW_99_in_unaryExpression2915); if (state.failed) return retval;
                    	if ( state.backtracking == 0 )
                    	{char_literal382_tree = new PosNode(char_literal382) ;
                    		root_0 = (object)adaptor.BecomeRoot(char_literal382_tree, root_0);
                    	}
                    	// JavaScript.g:320:20: ( LT )*
                    	do 
                    	{
                    	    int alt195 = 2;
                    	    int LA195_0 = input.LA(1);

                    	    if ( (LA195_0 == LT) )
                    	    {
                    	        alt195 = 1;
                    	    }


                    	    switch (alt195) 
                    		{
                    			case 1 :
                    			    // JavaScript.g:320:20: LT
                    			    {
                    			    	LT383=(IToken)Match(input,LT,FOLLOW_LT_in_unaryExpression2921); if (state.failed) return retval;

                    			    }
                    			    break;

                    			default:
                    			    goto loop195;
                    	    }
                    	} while (true);

                    	loop195:
                    		;	// Stops C# compiler whining that label 'loop195' has no statements

                    	PushFollow(FOLLOW_unaryExpression_in_unaryExpression2925);
                    	unaryExpression384 = unaryExpression();
                    	state.followingStackPointer--;
                    	if (state.failed) return retval;
                    	if ( state.backtracking == 0 ) adaptor.AddChild(root_0, unaryExpression384.Tree);

                    }
                    break;
                case 8 :
                    // JavaScript.g:321:4: '-' ( LT )* unaryExpression
                    {
                    	root_0 = (object)adaptor.GetNilNode();

                    	char_literal385=(IToken)Match(input,100,FOLLOW_100_in_unaryExpression2931); if (state.failed) return retval;
                    	if ( state.backtracking == 0 )
                    	{char_literal385_tree = new NegNode(char_literal385) ;
                    		root_0 = (object)adaptor.BecomeRoot(char_literal385_tree, root_0);
                    	}
                    	// JavaScript.g:321:20: ( LT )*
                    	do 
                    	{
                    	    int alt196 = 2;
                    	    int LA196_0 = input.LA(1);

                    	    if ( (LA196_0 == LT) )
                    	    {
                    	        alt196 = 1;
                    	    }


                    	    switch (alt196) 
                    		{
                    			case 1 :
                    			    // JavaScript.g:321:20: LT
                    			    {
                    			    	LT386=(IToken)Match(input,LT,FOLLOW_LT_in_unaryExpression2937); if (state.failed) return retval;

                    			    }
                    			    break;

                    			default:
                    			    goto loop196;
                    	    }
                    	} while (true);

                    	loop196:
                    		;	// Stops C# compiler whining that label 'loop196' has no statements

                    	PushFollow(FOLLOW_unaryExpression_in_unaryExpression2941);
                    	unaryExpression387 = unaryExpression();
                    	state.followingStackPointer--;
                    	if (state.failed) return retval;
                    	if ( state.backtracking == 0 ) adaptor.AddChild(root_0, unaryExpression387.Tree);

                    }
                    break;
                case 9 :
                    // JavaScript.g:322:4: '~' ( LT )* unaryExpression
                    {
                    	root_0 = (object)adaptor.GetNilNode();

                    	char_literal388=(IToken)Match(input,109,FOLLOW_109_in_unaryExpression2947); if (state.failed) return retval;
                    	if ( state.backtracking == 0 )
                    	{char_literal388_tree = new BinaryNotNode(char_literal388) ;
                    		root_0 = (object)adaptor.BecomeRoot(char_literal388_tree, root_0);
                    	}
                    	// JavaScript.g:322:26: ( LT )*
                    	do 
                    	{
                    	    int alt197 = 2;
                    	    int LA197_0 = input.LA(1);

                    	    if ( (LA197_0 == LT) )
                    	    {
                    	        alt197 = 1;
                    	    }


                    	    switch (alt197) 
                    		{
                    			case 1 :
                    			    // JavaScript.g:322:26: LT
                    			    {
                    			    	LT389=(IToken)Match(input,LT,FOLLOW_LT_in_unaryExpression2953); if (state.failed) return retval;

                    			    }
                    			    break;

                    			default:
                    			    goto loop197;
                    	    }
                    	} while (true);

                    	loop197:
                    		;	// Stops C# compiler whining that label 'loop197' has no statements

                    	PushFollow(FOLLOW_unaryExpression_in_unaryExpression2957);
                    	unaryExpression390 = unaryExpression();
                    	state.followingStackPointer--;
                    	if (state.failed) return retval;
                    	if ( state.backtracking == 0 ) adaptor.AddChild(root_0, unaryExpression390.Tree);

                    }
                    break;
                case 10 :
                    // JavaScript.g:323:4: '!' ( LT )* unaryExpression
                    {
                    	root_0 = (object)adaptor.GetNilNode();

                    	char_literal391=(IToken)Match(input,110,FOLLOW_110_in_unaryExpression2963); if (state.failed) return retval;
                    	if ( state.backtracking == 0 )
                    	{char_literal391_tree = new LogicalNotNode(char_literal391) ;
                    		root_0 = (object)adaptor.BecomeRoot(char_literal391_tree, root_0);
                    	}
                    	// JavaScript.g:323:27: ( LT )*
                    	do 
                    	{
                    	    int alt198 = 2;
                    	    int LA198_0 = input.LA(1);

                    	    if ( (LA198_0 == LT) )
                    	    {
                    	        alt198 = 1;
                    	    }


                    	    switch (alt198) 
                    		{
                    			case 1 :
                    			    // JavaScript.g:323:27: LT
                    			    {
                    			    	LT392=(IToken)Match(input,LT,FOLLOW_LT_in_unaryExpression2969); if (state.failed) return retval;

                    			    }
                    			    break;

                    			default:
                    			    goto loop198;
                    	    }
                    	} while (true);

                    	loop198:
                    		;	// Stops C# compiler whining that label 'loop198' has no statements

                    	PushFollow(FOLLOW_unaryExpression_in_unaryExpression2973);
                    	unaryExpression393 = unaryExpression();
                    	state.followingStackPointer--;
                    	if (state.failed) return retval;
                    	if ( state.backtracking == 0 ) adaptor.AddChild(root_0, unaryExpression393.Tree);

                    }
                    break;

            }
            retval.Stop = input.LT(-1);

            if ( (state.backtracking==0) )
            {	retval.Tree = (object)adaptor.RulePostProcessing(root_0);
            	adaptor.SetTokenBoundaries(retval.Tree, (IToken) retval.Start, (IToken) retval.Stop);}
        }
        catch (RecognitionException re) 
    	{
            ReportError(re);
            Recover(input,re);
    	// Conversion of the second argument necessary, but harmless
    	retval.Tree = (object)adaptor.ErrorNode(input, (IToken) retval.Start, input.LT(-1), re);

        }
        finally 
    	{
        }
        return retval;
    }
Example #5
0
 public virtual LogicalNotNode Visit(LogicalNotNode node)
 {
     return(node);
 }