예제 #1
0
 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);
        }