private static bool ComputeRefactoring( RefactoringContext context, InvocationExpressionSyntax invocation, SemanticModel semanticModel, string fromMethodName, string toMethodName) { IMethodSymbol methodSymbol = semanticModel.GetExtensionMethodInfo(invocation, context.CancellationToken).Symbol; if (methodSymbol == null) { return(false); } if (!SymbolUtility.IsLinqExtensionOfIEnumerableOfTWithPredicate(methodSymbol, fromMethodName)) { return(false); } ExpressionSyntax expression = GetExpression(invocation); if (expression == null) { return(false); } context.RegisterRefactoring( $"Replace '{fromMethodName}' with '{toMethodName}'", ct => RefactorAsync(context.Document, invocation, toMethodName, expression, ct), RefactoringIdentifiers.ReplaceAnyWithAllOrAllWithAny); return(true); }
public static void AnalyzeFirstOrDefault(SyntaxNodeAnalysisContext context, SimpleMemberInvocationExpressionInfo invocationInfo) { InvocationExpressionSyntax invocation = invocationInfo.InvocationExpression; SyntaxNode parent = invocation.WalkUpParentheses().Parent; NullCheckExpressionInfo nullCheck = SyntaxInfo.NullCheckExpressionInfo(parent, NullCheckStyles.ComparisonToNull | NullCheckStyles.IsNull); if (!nullCheck.Success) { return; } SyntaxNode node = nullCheck.NullCheckExpression; if (node.ContainsDirectives) { return; } ExtensionMethodSymbolInfo extensionMethodSymbolInfo = context.SemanticModel.GetReducedExtensionMethodInfo(invocation, context.CancellationToken); IMethodSymbol methodSymbol = extensionMethodSymbolInfo.Symbol; if (methodSymbol == null) { return; } if (!SymbolUtility.IsLinqExtensionOfIEnumerableOfTWithPredicate(methodSymbol, context.SemanticModel, name: invocationInfo.NameText, allowImmutableArrayExtension: true)) { return; } if (!extensionMethodSymbolInfo .ReducedSymbol .ReturnType .IsReferenceTypeOrNullableType()) { return; } context.ReportDiagnostic(DiagnosticDescriptors.SimplifyLinqMethodChain, node); }
public static void Analyze(SyntaxNodeAnalysisContext context, SimpleMemberInvocationExpressionInfo invocationInfo) { SyntaxNode parent = invocationInfo.InvocationExpression.WalkUpParentheses().Parent; if (parent.Kind() != SyntaxKind.LogicalNotExpression) { return; } SingleParameterLambdaExpressionInfo lambdaInfo = SyntaxInfo.SingleParameterLambdaExpressionInfo(invocationInfo.Arguments.First().Expression.WalkDownParentheses()); if (!lambdaInfo.Success) { return; } ExpressionSyntax expression = GetReturnExpression(lambdaInfo.Body)?.WalkDownParentheses(); if (expression?.IsKind(SyntaxKind.LogicalNotExpression) != true) { return; } IMethodSymbol methodSymbol = context.SemanticModel.GetReducedExtensionMethodInfo(invocationInfo.InvocationExpression, context.CancellationToken).Symbol; if (methodSymbol == null) { return; } if (!SymbolUtility.IsLinqExtensionOfIEnumerableOfTWithPredicate(methodSymbol, context.SemanticModel)) { return; } context.ReportDiagnostic(DiagnosticDescriptors.SimplifyLogicalNegation, parent); }
public static void Analyze( SyntaxNodeAnalysisContext context, SimpleMemberInvocationExpressionInfo invocationInfo) { SemanticModel semanticModel = context.SemanticModel; CancellationToken cancellationToken = context.CancellationToken; IMethodSymbol methodSymbol = semanticModel.GetReducedExtensionMethodInfo(invocationInfo.InvocationExpression, cancellationToken).Symbol; if (methodSymbol == null) { return; } if (!SymbolUtility.IsLinqExtensionOfIEnumerableOfTWithPredicate(methodSymbol, semanticModel, "FirstOrDefault")) { return; } ITypeSymbol typeSymbol = semanticModel.GetTypeSymbol(invocationInfo.Expression, cancellationToken); if (typeSymbol == null) { return; } if (typeSymbol.Kind == SymbolKind.ArrayType && ((IArrayTypeSymbol)typeSymbol).Rank == 1) { context.ReportDiagnostic(DiagnosticDescriptors.CallFindInsteadOfFirstOrDefault, invocationInfo.Name); } else if (typeSymbol.OriginalDefinition.Equals(semanticModel.GetTypeByMetadataName(MetadataNames.System_Collections_Generic_List_T))) { context.ReportDiagnostic(DiagnosticDescriptors.CallFindInsteadOfFirstOrDefault, invocationInfo.Name); } }
public static void AnalyzeWhereAndAny(SyntaxNodeAnalysisContext context) { var invocationExpression = (InvocationExpressionSyntax)context.Node; if (invocationExpression.ContainsDiagnostics) { return; } if (invocationExpression.SpanContainsDirectives()) { return; } SimpleMemberInvocationExpressionInfo invocationInfo = SyntaxInfo.SimpleMemberInvocationExpressionInfo(invocationExpression); if (!invocationInfo.Success) { return; } if (invocationInfo.NameText != "Any") { return; } ArgumentSyntax argument1 = invocationInfo.Arguments.SingleOrDefault(shouldThrow: false); if (argument1 == null) { return; } SimpleMemberInvocationExpressionInfo invocationInfo2 = SyntaxInfo.SimpleMemberInvocationExpressionInfo(invocationInfo.Expression); if (!invocationInfo2.Success) { return; } if (invocationInfo2.NameText != "Where") { return; } ArgumentSyntax argument2 = invocationInfo2.Arguments.SingleOrDefault(shouldThrow: false); if (argument2 == null) { return; } SemanticModel semanticModel = context.SemanticModel; CancellationToken cancellationToken = context.CancellationToken; IMethodSymbol methodSymbol = semanticModel.GetExtensionMethodInfo(invocationExpression, cancellationToken).Symbol; if (methodSymbol == null) { return; } if (!SymbolUtility.IsLinqExtensionOfIEnumerableOfTWithPredicate(methodSymbol, semanticModel, "Any")) { return; } IMethodSymbol methodSymbol2 = semanticModel.GetExtensionMethodInfo(invocationInfo2.InvocationExpression, cancellationToken).Symbol; if (methodSymbol2 == null) { return; } if (!SymbolUtility.IsLinqWhere(methodSymbol2, semanticModel, allowImmutableArrayExtension: true)) { return; } SingleParameterLambdaExpressionInfo lambda = SyntaxInfo.SingleParameterLambdaExpressionInfo(argument1.Expression); if (!lambda.Success) { return; } if (!(lambda.Body is ExpressionSyntax)) { return; } SingleParameterLambdaExpressionInfo lambda2 = SyntaxInfo.SingleParameterLambdaExpressionInfo(argument2.Expression); if (!lambda2.Success) { return; } if (!(lambda2.Body is ExpressionSyntax)) { return; } if (!lambda.Parameter.Identifier.ValueText.Equals(lambda2.Parameter.Identifier.ValueText, StringComparison.Ordinal)) { return; } context.ReportDiagnostic( DiagnosticDescriptors.SimplifyLinqMethodChain, Location.Create(invocationExpression.SyntaxTree, TextSpan.FromBounds(invocationInfo2.Name.SpanStart, invocationExpression.Span.End))); }