protected override ITypeSymbol GetQueryClauseInfo( SemanticModel semanticModel, SyntaxNode node, CancellationToken cancellationToken) { var query = node.AncestorsAndSelf().OfType<QueryExpressionSyntax>().First(); if (InfoBoundSuccessfully(semanticModel.GetQueryClauseInfo(query.FromClause, cancellationToken))) { return null; } foreach (var clause in query.Body.Clauses) { if (InfoBoundSuccessfully(semanticModel.GetQueryClauseInfo(clause, cancellationToken))) { return null; } } if (InfoBoundSuccessfully(semanticModel.GetSymbolInfo(query.Body.SelectOrGroup, cancellationToken))) { return null; } var fromClause = query.FromClause; return semanticModel.GetTypeInfo(fromClause.Expression, cancellationToken).Type; }
internal override bool QueryClauseLambdasTypeEquivalent(SemanticModel oldModel, SyntaxNode oldNode, SemanticModel newModel, SyntaxNode newNode, CancellationToken cancellationToken) { switch (oldNode.Kind()) { case SyntaxKind.FromClause: case SyntaxKind.LetClause: case SyntaxKind.WhereClause: case SyntaxKind.OrderByClause: case SyntaxKind.JoinClause: var oldQueryClauseInfo = oldModel.GetQueryClauseInfo((QueryClauseSyntax)oldNode, cancellationToken); var newQueryClauseInfo = newModel.GetQueryClauseInfo((QueryClauseSyntax)newNode, cancellationToken); return MemberSignaturesEquivalent(oldQueryClauseInfo.CastInfo.Symbol, newQueryClauseInfo.CastInfo.Symbol) && MemberSignaturesEquivalent(oldQueryClauseInfo.OperationInfo.Symbol, newQueryClauseInfo.OperationInfo.Symbol); case SyntaxKind.AscendingOrdering: case SyntaxKind.DescendingOrdering: var oldOrderingInfo = oldModel.GetSymbolInfo(oldNode, cancellationToken); var newOrderingInfo = newModel.GetSymbolInfo(newNode, cancellationToken); return MemberSignaturesEquivalent(oldOrderingInfo.Symbol, newOrderingInfo.Symbol); case SyntaxKind.SelectClause: var oldSelectInfo = oldModel.GetSymbolInfo(oldNode, cancellationToken); var newSelectInfo = newModel.GetSymbolInfo(newNode, cancellationToken); // Changing reduced select clause to a non-reduced form or vice versa // adds/removes a call to Select method, which is a supported change. return oldSelectInfo.Symbol == null || newSelectInfo.Symbol == null || MemberSignaturesEquivalent(oldSelectInfo.Symbol, newSelectInfo.Symbol); case SyntaxKind.GroupClause: var oldGroupByInfo = oldModel.GetSymbolInfo(oldNode, cancellationToken); var newGroupByInfo = newModel.GetSymbolInfo(newNode, cancellationToken); return MemberSignaturesEquivalent(oldGroupByInfo.Symbol, newGroupByInfo.Symbol, GroupBySignatureComparer); default: return true; } }
internal override bool QueryClauseLambdasTypeEquivalent(SemanticModel oldModel, SyntaxNode oldNode, SemanticModel newModel, SyntaxNode newNode, CancellationToken cancellationToken) { switch (oldNode.Kind()) { case SyntaxKind.FromClause: case SyntaxKind.LetClause: case SyntaxKind.WhereClause: case SyntaxKind.OrderByClause: case SyntaxKind.JoinClause: var oldQueryClauseInfo = oldModel.GetQueryClauseInfo((QueryClauseSyntax)oldNode, cancellationToken); var newQueryClauseInfo = newModel.GetQueryClauseInfo((QueryClauseSyntax)newNode, cancellationToken); return MemberSignaturesEquivalent(oldQueryClauseInfo.CastInfo.Symbol, newQueryClauseInfo.CastInfo.Symbol) && MemberSignaturesEquivalent(oldQueryClauseInfo.OperationInfo.Symbol, newQueryClauseInfo.OperationInfo.Symbol); case SyntaxKind.AscendingOrdering: case SyntaxKind.DescendingOrdering: case SyntaxKind.SelectClause: case SyntaxKind.GroupClause: var oldSymbolInfo = oldModel.GetSymbolInfo(oldNode, cancellationToken); var newSymbolInfo = newModel.GetSymbolInfo(newNode, cancellationToken); return MemberSignaturesEquivalent(oldSymbolInfo.Symbol, newSymbolInfo.Symbol); default: return true; } }