示例#1
0
        private static void HandleQueryClause(QueryClauseSyntax queryClause, List <SyntaxToken> tokensToCheck)
        {
            switch (queryClause.Kind())
            {
            case SyntaxKind.FromClause:
                var fromClause = (FromClauseSyntax)queryClause;
                tokensToCheck.Add(fromClause.FromKeyword);
                break;

            case SyntaxKind.LetClause:
                var letClause = (LetClauseSyntax)queryClause;
                tokensToCheck.Add(letClause.LetKeyword);
                break;

            case SyntaxKind.WhereClause:
                var whereClause = (WhereClauseSyntax)queryClause;
                tokensToCheck.Add(whereClause.WhereKeyword);
                break;

            case SyntaxKind.JoinClause:
            case SyntaxKind.JoinIntoClause:
                var joinClause = (JoinClauseSyntax)queryClause;
                tokensToCheck.Add(joinClause.JoinKeyword);
                break;

            case SyntaxKind.OrderByClause:
                var orderByClause = (OrderByClauseSyntax)queryClause;
                tokensToCheck.Add(orderByClause.OrderByKeyword);
                break;
            }
        }
        private static int GetComplexityForClause([NotNull] QueryClauseSyntax bodyClause)
        {
            if (bodyClause is OrderByClauseSyntax orderByClause)
            {
                return(orderByClause.Orderings.Count);
            }

            return(bodyClause is LetClauseSyntax _ ? 2 : 1);
        }
示例#3
0
        private bool ReplacementBreaksQueryClause(QueryClauseSyntax originalClause, QueryClauseSyntax newClause)
        {
            // Ensure QueryClauseInfos are compatible.
            QueryClauseInfo originalClauseInfo = this.OriginalSemanticModel.GetQueryClauseInfo(originalClause, this.CancellationToken);
            QueryClauseInfo newClauseInfo      = this.SpeculativeSemanticModel.GetQueryClauseInfo(newClause, this.CancellationToken);

            return(!SymbolInfosAreCompatible(originalClauseInfo.CastInfo, newClauseInfo.CastInfo) ||
                   !SymbolInfosAreCompatible(originalClauseInfo.OperationInfo, newClauseInfo.OperationInfo));
        }
示例#4
0
        private static bool TryRewriteBodyClause(QueryClauseSyntax clause, YieldStatementSyntax dummyYield, ref BlockSyntax body)
        {
            if (clause is WhereClauseSyntax whereClauseSyntax)
            {
                body = body.InsertNodesBefore(FindDummyYieldIn(body), new[]
                {
                    IfStatement(
                        BinaryExpression(SyntaxKind.EqualsExpression, MaybeParenthesizedExpression(whereClauseSyntax.Condition),
                                         LiteralExpression(SyntaxKind.FalseLiteralExpression)), ContinueStatement())
                });
                return(true);
            }

            if (clause is LetClauseSyntax letClauseSyntax)
            {
                body = body.InsertNodesBefore(FindDummyYieldIn(body), new[]
                {
                    LocalDeclarationStatement(
                        VariableDeclaration(IdentifierName("var"), SingletonSeparatedList(VariableDeclarator(
                                                                                              letClauseSyntax.Identifier)
                                                                                          .WithInitializer(
                                                                                              EqualsValueClause(letClauseSyntax.Expression)
                                                                                              )
                                                                                          )
                                            )
                        )
                });
                return(true);
            }
            if (clause is FromClauseSyntax fromClauseSyntax)
            {
                var nestedStmt = ForEachStatement(
                    IdentifierName("var"),
                    fromClauseSyntax.Identifier,
                    fromClauseSyntax.Expression,
                    Block().AddStatements(dummyYield));

                body = body.ReplaceNode(FindDummyYieldIn(body), nestedStmt);

                return(true);
            }
            return(false);
        }
示例#5
0
        private QueryClause VisitContinuationClause(QueryClauseSyntax clause)
        {
            switch (clause)
            {
            case FromClauseSyntax from:
                return(Expressive.From(null, from.Expression.Accept(this)));

            case LetClauseSyntax let:
                return(Expressive.Let(null, let.Expression.Accept(this)));

            case JoinClauseSyntax join:
                return(Expressive.Join(null, join.InExpression.Accept(this), join.LeftExpression.Accept(this), join.RightExpression.Accept(this)));

            case WhereClauseSyntax where:
                return(Expressive.Where(where.Condition.Accept(this)));

            case OrderByClauseSyntax orderby:
                return(Expressive.OrderBy(Utils.Select(@orderby.Orderings, x => Expressive.Ordering(x.Expression.Accept(this), x.AscendingOrDescendingKeyword.Text == "ascending"))));

            default:
                throw new ArgumentException("Invalid clause.");
            }
        }
 public IRangeVariableSymbol?ToSymbol(QueryClauseSyntax node)
 => Model.GetDeclaredSymbol(node, CancellationToken);
示例#7
0
 public override QueryClauseInfo GetQueryClauseInfo(QueryClauseSyntax node, CancellationToken cancellationToken = default(CancellationToken))
 {
     var bound = GetBoundQueryClause(node);
     return GetQueryClauseInfo(bound);
 }
示例#8
0
 public override IRangeVariableSymbol GetDeclaredSymbol(QueryClauseSyntax queryClause, CancellationToken cancellationToken = default(CancellationToken))
 {
     var bound = GetBoundQueryClause(queryClause);
     return bound == null ? null : bound.DefinedSymbol;
 }
示例#9
0
 /// <summary>
 /// Gets the semantic information associated with a query clause.
 /// </summary>
 public abstract QueryClauseInfo GetQueryClauseInfo(QueryClauseSyntax node, CancellationToken cancellationToken = default(CancellationToken));
示例#10
0
 public abstract IRangeVariableSymbol GetDeclaredSymbol(QueryClauseSyntax queryClause, CancellationToken cancellationToken = default(CancellationToken));
 private static void HandleQueryClause(QueryClauseSyntax queryClause, List<SyntaxToken> tokensToCheck)
 {
     switch (queryClause.Kind())
     {
     case SyntaxKind.FromClause:
         var fromClause = (FromClauseSyntax)queryClause;
         tokensToCheck.Add(fromClause.FromKeyword);
         break;
     case SyntaxKind.LetClause:
         var letClause = (LetClauseSyntax)queryClause;
         tokensToCheck.Add(letClause.LetKeyword);
         break;
     case SyntaxKind.WhereClause:
         var whereClause = (WhereClauseSyntax)queryClause;
         tokensToCheck.Add(whereClause.WhereKeyword);
         break;
     case SyntaxKind.JoinClause:
     case SyntaxKind.JoinIntoClause:
         var joinClause = (JoinClauseSyntax)queryClause;
         tokensToCheck.Add(joinClause.JoinKeyword);
         break;
     case SyntaxKind.OrderByClause:
         var orderByClause = (OrderByClauseSyntax)queryClause;
         tokensToCheck.Add(orderByClause.OrderByKeyword);
         break;
     }
 }
 public override IRangeVariableSymbol GetDeclaredSymbol(QueryClauseSyntax node, CancellationToken cancellationToken = default(CancellationToken))
 {
     using (Logger.LogBlock(FunctionId.CSharp_SemanticModel_GetDeclaredSymbol, message: this.SyntaxTree.FilePath, cancellationToken: cancellationToken))
     {
         CheckSyntaxNode(node);
         var model = this.GetMemberModel(node);
         return (model == null) ? null : model.GetDeclaredSymbol(node, cancellationToken);
     }
 }
 public override QueryClauseInfo GetQueryClauseInfo(QueryClauseSyntax node, CancellationToken cancellationToken = default(CancellationToken))
 {
     using (Logger.LogBlock(FunctionId.CSharp_SemanticModel_GetQueryClauseInfo, message: this.SyntaxTree.FilePath, cancellationToken: cancellationToken))
     {
         CheckSyntaxNode(node);
         var model = this.GetMemberModel(node);
         return (model == null) ? default(QueryClauseInfo) : model.GetQueryClauseInfo(node, cancellationToken);
     }
 }
 public static IInternalQueryExpression ToInternalQueryExpression(this QueryClauseSyntax syntax)
 {
     return(null);
 }
 public override QueryClauseInfo GetQueryClauseInfo(QueryClauseSyntax node, CancellationToken cancellationToken = default(CancellationToken))
 {
     CheckSyntaxNode(node);
     var model = this.GetMemberModel(node);
     return (model == null) ? default(QueryClauseInfo) : model.GetQueryClauseInfo(node, cancellationToken);
 }
 public override IRangeVariableSymbol GetDeclaredSymbol(QueryClauseSyntax node, CancellationToken cancellationToken = default(CancellationToken))
 {
     CheckSyntaxNode(node);
     var model = this.GetMemberModel(node);
     return (model == null) ? null : model.GetDeclaredSymbol(node, cancellationToken);
 }
 public TameQueryClauseSyntax(QueryClauseSyntax node)
 {
     Node = node;
     AddChildren();
 }