public virtual ComprehensionBinding VisitComprehensionBinding(ComprehensionBinding comprehensionBinding) { if (comprehensionBinding == null) return null; comprehensionBinding.TargetVariableType = this.VisitTypeReference(comprehensionBinding.TargetVariableType); comprehensionBinding.TargetVariable = this.VisitTargetExpression(comprehensionBinding.TargetVariable); comprehensionBinding.AsTargetVariableType = this.VisitTypeReference(comprehensionBinding.AsTargetVariableType); comprehensionBinding.SourceEnumerable = this.VisitExpression(comprehensionBinding.SourceEnumerable); return comprehensionBinding; }
private Expression ParseIteratorOrExpression( TokenSet followers ) { SourceContext sctx = this.scanner.CurrentSourceContext; ScannerState ss = this.scanner.state; // shortcut for ( <expression>) if( this.currentToken == Token.LeftParenthesis ) { // then it can't be a binding, it must be a filter. Expression e = ParseExpression(followers ); e.SourceContext = sctx; e.SourceContext.EndPos = this.scanner.CurrentSourceContext.StartPos; return e; } // try fully formed syntax: <type> <name> in <expression> ComprehensionBinding q = new ComprehensionBinding(); q.TargetVariableType = q.TargetVariableTypeExpression = this.ParseTypeExpression(null, followers | Parser.IdentifierOrNonReservedKeyword |Token.In|Token.RightBrace|Token.Semicolon|Token.Comma, true ); if (q.TargetVariableType != null && Parser.IdentifierOrNonReservedKeyword[this.currentToken] ) { q.TargetVariable = this.scanner.GetIdentifier(); q.SourceContext = this.scanner.CurrentSourceContext; this.SkipIdentifierOrNonReservedKeyword(); // after the identifier, look for 'in' keyword if( this.currentToken == Token.In ) { this.Skip(Token.In); q.SourceEnumerable = this.ParseExpression(followers); q.SourceContext = sctx; q.SourceContext.EndPos = this.scanner.CurrentSourceContext.StartPos; return q; } } // back up and try as untyped iterator: <name> in <expression> q.TargetVariableType = q.TargetVariableTypeExpression = null; this.scanner.endPos = sctx.StartPos; this.scanner.state = ss; this.currentToken = Token.None; this.GetNextToken(); if (Parser.IdentifierOrNonReservedKeyword[this.currentToken] ) { q.TargetVariable = this.scanner.GetIdentifier(); q.SourceContext = this.scanner.CurrentSourceContext; this.SkipIdentifierOrNonReservedKeyword(); // after the identifier, look for 'in' keyword if( this.currentToken == Token.In ) { this.Skip(Token.In); q.SourceEnumerable = this.ParseExpression(followers); return q; } else if (this.currentToken == Token.As) { this.Skip(Token.As); q.AsTargetVariableType = q.AsTargetVariableTypeExpression = this.ParseTypeExpression(null, followers|Token.In|Token.RightBrace|Token.Semicolon|Token.Comma, false); this.Skip(Token.In); q.SourceEnumerable = this.ParseExpression(followers); return q; } } // back up and try as unnamed expression: <expression> this.scanner.endPos = sctx.StartPos; this.scanner.state = ss; this.currentToken = Token.None; this.GetNextToken(); return this.ParseExpression(followers); }
public override ComprehensionBinding VisitComprehensionBinding(ComprehensionBinding comprehensionBinding) { if (comprehensionBinding == null) return null; return base.VisitComprehensionBinding((ComprehensionBinding)comprehensionBinding.Clone()); }
public EventingVisitor(Action<ComprehensionBinding> visitComprehensionBinding) { VisitedComprehensionBinding += visitComprehensionBinding; } public event Action<ComprehensionBinding> VisitedComprehensionBinding; public override ComprehensionBinding VisitComprehensionBinding(ComprehensionBinding comprehensionBinding) { if (VisitedComprehensionBinding != null) VisitedComprehensionBinding(comprehensionBinding); return base.VisitComprehensionBinding(comprehensionBinding); }