public static void Analyze(SyntaxNodeAnalysisContext context, SimpleMemberInvocationExpressionInfo invocationInfo) { InvocationExpressionSyntax invocationExpression = invocationInfo.InvocationExpression; SemanticModel semanticModel = context.SemanticModel; CancellationToken cancellationToken = context.CancellationToken; ExtensionMethodSymbolInfo extensionInfo = semanticModel.GetReducedExtensionMethodInfo(invocationExpression, cancellationToken); if (extensionInfo.Symbol == null) { return; } if (!SymbolUtility.IsLinqCast(extensionInfo.Symbol, semanticModel)) { return; } ITypeSymbol typeArgument = extensionInfo.ReducedSymbol.TypeArguments.SingleOrDefault(shouldThrow: false); if (typeArgument == null) { return; } var memberAccessExpressionType = semanticModel.GetTypeSymbol(invocationInfo.Expression, cancellationToken) as INamedTypeSymbol; if (memberAccessExpressionType?.OriginalDefinition.IsIEnumerableOfT() != true) { return; } if (!typeArgument.Equals(memberAccessExpressionType.TypeArguments[0])) { return; } if (invocationExpression.ContainsDirectives(TextSpan.FromBounds(invocationInfo.Expression.Span.End, invocationExpression.Span.End))) { return; } context.ReportDiagnostic( DiagnosticDescriptors.RemoveRedundantCast, Location.Create(invocationExpression.SyntaxTree, TextSpan.FromBounds(invocationInfo.Name.SpanStart, invocationInfo.ArgumentList.Span.End))); }
public static void AnalyzeWhereAndCast(SyntaxNodeAnalysisContext context, SimpleMemberInvocationExpressionInfo invocationInfo) { SimpleMemberInvocationExpressionInfo invocationInfo2 = SyntaxInfo.SimpleMemberInvocationExpressionInfo(invocationInfo.Expression); if (!invocationInfo2.Success) { return; } ArgumentSyntax argument = invocationInfo2.Arguments.SingleOrDefault(shouldThrow: false); if (argument == null) { return; } if (!string.Equals(invocationInfo2.NameText, "Where", StringComparison.Ordinal)) { return; } SemanticModel semanticModel = context.SemanticModel; CancellationToken cancellationToken = context.CancellationToken; IMethodSymbol methodSymbol = semanticModel.GetReducedExtensionMethodInfo(invocationInfo.InvocationExpression, cancellationToken).Symbol; if (methodSymbol == null) { return; } if (!SymbolUtility.IsLinqCast(methodSymbol, semanticModel)) { return; } IMethodSymbol methodSymbol2 = semanticModel.GetReducedExtensionMethodInfo(invocationInfo2.InvocationExpression, cancellationToken).Symbol; if (methodSymbol2 == null) { return; } if (!SymbolUtility.IsLinqWhere(methodSymbol2, semanticModel)) { return; } IsExpressionInfo isExpressionInfo = SyntaxInfo.IsExpressionInfo(GetLambdaExpression(argument.Expression)); if (!isExpressionInfo.Success) { return; } TypeSyntax type2 = (invocationInfo.Name as GenericNameSyntax)?.TypeArgumentList?.Arguments.SingleOrDefault(shouldThrow: false); if (type2 == null) { return; } ITypeSymbol typeSymbol = semanticModel.GetTypeSymbol(isExpressionInfo.Type, cancellationToken); if (typeSymbol == null) { return; } ITypeSymbol typeSymbol2 = semanticModel.GetTypeSymbol(type2, cancellationToken); if (!typeSymbol.Equals(typeSymbol2)) { return; } TextSpan span = TextSpan.FromBounds(invocationInfo2.Name.SpanStart, invocationInfo.InvocationExpression.Span.End); if (invocationInfo.InvocationExpression.ContainsDirectives(span)) { return; } context.ReportDiagnostic( DiagnosticDescriptors.SimplifyLinqMethodChain, Location.Create(invocationInfo.InvocationExpression.SyntaxTree, span)); SyntaxNode GetLambdaExpression(ExpressionSyntax expression) { CSharpSyntaxNode body = (expression as LambdaExpressionSyntax)?.Body; if (body?.Kind() == SyntaxKind.Block) { StatementSyntax statement = ((BlockSyntax)body).Statements.SingleOrDefault(shouldThrow: false); if (statement?.Kind() == SyntaxKind.ReturnStatement) { var returnStatement = (ReturnStatementSyntax)statement; return(returnStatement.Expression); } } return(body); } }