public static void Analyze( SyntaxNodeAnalysisContext context, InvocationExpressionSyntax invocation, MemberAccessExpressionSyntax memberAccess, string methodName) { if (memberAccess.Expression?.IsKind(SyntaxKind.InvocationExpression) == true) { var invocation2 = (InvocationExpressionSyntax)memberAccess.Expression; if (invocation2.ArgumentList?.Arguments.Count == 1 && invocation2.Expression?.IsKind(SyntaxKind.SimpleMemberAccessExpression) == true) { var memberAccess2 = (MemberAccessExpressionSyntax)invocation2.Expression; if (memberAccess2.Name?.Identifier.ValueText == "Where" && SyntaxAnalyzer.IsEnumerableExtensionMethod(invocation, methodName, 1, context.SemanticModel, context.CancellationToken) && (SyntaxAnalyzer.IsEnumerableWhereOrImmutableArrayWhereMethod(invocation2, context.SemanticModel, context.CancellationToken))) { TextSpan span = TextSpan.FromBounds(memberAccess2.Name.Span.Start, invocation.Span.End); if (!invocation.ContainsDirectives(span)) { context.ReportDiagnostic( DiagnosticDescriptors.SimplifyLinqMethodChain, Location.Create(invocation.SyntaxTree, span)); } } } } }
public static void Analyze(SyntaxNodeAnalysisContext context, InvocationExpressionSyntax invocation, MemberAccessExpressionSyntax memberAccess) { if (SyntaxAnalyzer.IsEnumerableExtensionMethod(invocation, "Count", 1, context.SemanticModel, context.CancellationToken)) { string propertyName = SyntaxHelper.GetCountOrLengthPropertyName(memberAccess.Expression, context.SemanticModel, allowImmutableArray: true, cancellationToken: context.CancellationToken); if (propertyName != null) { TextSpan span = TextSpan.FromBounds(memberAccess.Name.Span.Start, invocation.Span.End); if (invocation .DescendantTrivia(span) .All(f => f.IsWhitespaceOrEndOfLineTrivia())) { Diagnostic diagnostic = Diagnostic.Create( DiagnosticDescriptors.ReplaceCountMethodWithCountOrLengthProperty, Location.Create(context.Node.SyntaxTree, span), ImmutableDictionary.CreateRange(new KeyValuePair <string, string>[] { new KeyValuePair <string, string>("PropertyName", propertyName) }), propertyName); context.ReportDiagnostic(diagnostic); } } else if (invocation.Parent?.IsKind( SyntaxKind.EqualsExpression, SyntaxKind.GreaterThanExpression, SyntaxKind.LessThanExpression) == true) { var binaryExpression = (BinaryExpressionSyntax)invocation.Parent; if (IsFixableBinaryExpression(binaryExpression)) { TextSpan span = TextSpan.FromBounds(invocation.Span.End, binaryExpression.Span.End); if (binaryExpression .DescendantTrivia(span) .All(f => f.IsWhitespaceOrEndOfLineTrivia())) { context.ReportDiagnostic( DiagnosticDescriptors.ReplaceCountMethodWithAnyMethod, binaryExpression.GetLocation()); } } } } }
public static void Analyze(SyntaxNodeAnalysisContext context, InvocationExpressionSyntax invocation, MemberAccessExpressionSyntax memberAccess) { if (invocation.Parent?.IsKind(SyntaxKind.SimpleMemberAccessExpression) == false && SyntaxAnalyzer.IsEnumerableExtensionMethod(invocation, "Any", 1, context.SemanticModel, context.CancellationToken)) { string propertyName = SyntaxHelper.GetCountOrLengthPropertyName(memberAccess.Expression, context.SemanticModel, allowImmutableArray: false, cancellationToken: context.CancellationToken); if (propertyName != null) { string messageArg = null; TextSpan span = TextSpan.FromBounds(memberAccess.Name.Span.Start, invocation.Span.End); if (invocation.DescendantTrivia(span).All(f => f.IsWhitespaceOrEndOfLineTrivia())) { if (invocation.Parent?.IsKind(SyntaxKind.LogicalNotExpression) == true) { var logicalNot = (PrefixUnaryExpressionSyntax)invocation.Parent; if (logicalNot.OperatorToken.TrailingTrivia.All(f => f.IsWhitespaceOrEndOfLineTrivia()) && logicalNot.Operand.GetLeadingTrivia().All(f => f.IsWhitespaceOrEndOfLineTrivia())) { messageArg = $"{propertyName} == 0"; } } else { messageArg = $"{propertyName} > 0"; } } if (messageArg != null) { Diagnostic diagnostic = Diagnostic.Create( DiagnosticDescriptors.ReplaceAnyMethodWithCountOrLengthProperty, Location.Create(context.Node.SyntaxTree, span), ImmutableDictionary.CreateRange(new KeyValuePair <string, string>[] { new KeyValuePair <string, string>("PropertyName", propertyName) }), messageArg); context.ReportDiagnostic(diagnostic); } } } }