public static void ComputeRefactorings(RefactoringContext context, AssignmentExpressionSyntax assignmentExpression) { if (context.IsRefactoringEnabled(RefactoringDescriptors.ExpandCompoundAssignment) && context.Span.IsEmptyAndContainedInSpanOrBetweenSpans(assignmentExpression.OperatorToken) && CSharpFacts.IsCompoundAssignmentExpression(assignmentExpression.Kind()) && SyntaxInfo.AssignmentExpressionInfo(assignmentExpression).Success) { context.RegisterRefactoring( $"Expand {assignmentExpression.OperatorToken}", ct => ExpandCompoundAssignmentRefactoring.RefactorAsync(context.Document, assignmentExpression, ct), RefactoringDescriptors.ExpandCompoundAssignment); } }
public static async Task ComputeRefactoringsAsync(RefactoringContext context, AssignmentExpressionSyntax assignmentExpression) { if (context.IsRefactoringEnabled(RefactoringIdentifiers.ExpandCompoundAssignmentOperator) && context.Span.IsEmptyAndContainedInSpanOrBetweenSpans(assignmentExpression.OperatorToken) && CSharpFacts.IsCompoundAssignmentExpression(assignmentExpression.Kind()) && SyntaxInfo.AssignmentExpressionInfo(assignmentExpression).Success) { context.RegisterRefactoring( $"Expand {assignmentExpression.OperatorToken}", ct => ExpandCompoundAssignmentOperatorRefactoring.RefactorAsync(context.Document, assignmentExpression, ct)); } if (context.IsAnyRefactoringEnabled(RefactoringIdentifiers.AddCastExpression, RefactoringIdentifiers.CallToMethod) && assignmentExpression.IsKind(SyntaxKind.SimpleAssignmentExpression)) { SimpleAssignmentExpressionInfo simpleAssignment = SyntaxInfo.SimpleAssignmentExpressionInfo(assignmentExpression); ExpressionSyntax right = simpleAssignment.Right; if (simpleAssignment.Success && right.Span.Contains(context.Span)) { SemanticModel semanticModel = await context.GetSemanticModelAsync().ConfigureAwait(false); ITypeSymbol leftSymbol = semanticModel.GetTypeSymbol(simpleAssignment.Left, context.CancellationToken); if (leftSymbol?.IsErrorType() == false) { ITypeSymbol rightSymbol = semanticModel.GetTypeSymbol(right, context.CancellationToken); if (rightSymbol?.IsErrorType() == false && !leftSymbol.Equals(rightSymbol)) { ModifyExpressionRefactoring.ComputeRefactoring(context, right, leftSymbol, semanticModel); } } } } if (context.IsRefactoringEnabled(RefactoringIdentifiers.ReplaceMethodGroupWithLambda) && context.SupportsSemanticModel) { await ReplaceMethodGroupWithLambdaRefactoring.ComputeRefactoringAsync(context, assignmentExpression).ConfigureAwait(false); } }
private static void AnalyzeAssignmentExpression(SyntaxNodeAnalysisContext context) { var assignmentExpression = (AssignmentExpressionSyntax)context.Node; AssignmentExpressionInfo info = SyntaxInfo.AssignmentExpressionInfo(assignmentExpression); if (!info.Success) { return; } ExpressionSyntax right = info.Right; if (right.Kind() != SyntaxKind.ObjectCreationExpression) { return; } if (right.SpanContainsDirectives()) { return; } ExpressionSyntax left = info.Left; if (!left.IsKind(SyntaxKind.IdentifierName, SyntaxKind.SimpleMemberAccessExpression)) { return; } var objectCreation = (ObjectCreationExpressionSyntax)right; ExpressionSyntax expression = objectCreation .ArgumentList? .Arguments .SingleOrDefault(shouldThrow: false)? .Expression .WalkDownParentheses(); if (expression == null) { return; } if (!expression.IsKind(SyntaxKind.IdentifierName, SyntaxKind.SimpleMemberAccessExpression)) { return; } SemanticModel semanticModel = context.SemanticModel; CancellationToken cancellationToken = context.CancellationToken; if (!(semanticModel.GetSymbol(assignmentExpression, cancellationToken) is IMethodSymbol methodSymbol)) { return; } if (!methodSymbol.MethodKind.Is(MethodKind.EventAdd, MethodKind.EventRemove)) { return; } if (!(methodSymbol.Parameters.SingleOrDefault(shouldThrow: false)?.Type is INamedTypeSymbol typeSymbol)) { return; } if (!SymbolUtility.IsEventHandlerMethod(typeSymbol.DelegateInvokeMethod)) { return; } if (semanticModel.GetSymbol(expression, cancellationToken)?.Kind != SymbolKind.Method) { return; } DiagnosticHelpers.ReportDiagnostic(context, DiagnosticDescriptors.RemoveRedundantDelegateCreation, right); DiagnosticHelpers.ReportToken(context, DiagnosticDescriptors.RemoveRedundantDelegateCreationFadeOut, objectCreation.NewKeyword); DiagnosticHelpers.ReportNode(context, DiagnosticDescriptors.RemoveRedundantDelegateCreationFadeOut, objectCreation.Type); CSharpDiagnosticHelpers.ReportParentheses(context, DiagnosticDescriptors.RemoveRedundantDelegateCreationFadeOut, objectCreation.ArgumentList); }
public static void AnalyzeAssignmentExpression(SyntaxNodeAnalysisContext context, INamedTypeSymbol eventHandler, INamedTypeSymbol eventHandlerOfT) { var assignmentExpression = (AssignmentExpressionSyntax)context.Node; AssignmentExpressionInfo info = SyntaxInfo.AssignmentExpressionInfo(assignmentExpression); if (!info.Success) { return; } if (info.Right.Kind() != SyntaxKind.ObjectCreationExpression) { return; } var objectCreation = (ObjectCreationExpressionSyntax)info.Right; if (objectCreation.SpanContainsDirectives()) { return; } SemanticModel semanticModel = context.SemanticModel; CancellationToken cancellationToken = context.CancellationToken; ITypeSymbol typeSymbol = semanticModel.GetTypeSymbol(objectCreation, cancellationToken); if (typeSymbol == null) { return; } if (!typeSymbol.Equals(eventHandler) && !typeSymbol.OriginalDefinition.Equals(eventHandlerOfT)) { return; } ExpressionSyntax expression = objectCreation .ArgumentList? .Arguments .SingleOrDefault(shouldThrow: false)? .Expression; if (expression == null) { return; } if (!(semanticModel.GetSymbol(expression, cancellationToken) is IMethodSymbol)) { return; } if (semanticModel.GetSymbol(info.Left, cancellationToken)?.Kind != SymbolKind.Event) { return; } context.ReportDiagnostic(DiagnosticDescriptors.RemoveRedundantDelegateCreation, info.Right); context.ReportToken(DiagnosticDescriptors.RemoveRedundantDelegateCreationFadeOut, objectCreation.NewKeyword); context.ReportNode(DiagnosticDescriptors.RemoveRedundantDelegateCreationFadeOut, objectCreation.Type); context.ReportParentheses(DiagnosticDescriptors.RemoveRedundantDelegateCreationFadeOut, objectCreation.ArgumentList); }