public AssignmentExpressionInfo Parse()
        {
            var rslt = new AssignmentExpressionInfo(this);

            if (Conditional_expression != null)
            {
                rslt.ConditionalExpression = this.Conditional_expression.Parse();
            }
            else
            {
                rslt.LValue = new LValueInfo(this)
                {
                    Text = Lvalue
                };
                #region operator
                switch (Operator)
                {
                case "=":
                    rslt.AssignOperator = AssignOperatorInfo.Equal;
                    break;

                case "*=":
                    rslt.AssignOperator = AssignOperatorInfo.MulitEqual;
                    break;

                case "+=":
                    rslt.AssignOperator = AssignOperatorInfo.AddEqual;
                    break;

                case "/=":
                    rslt.AssignOperator = AssignOperatorInfo.DivideEqual;
                    break;

                case "%=":
                    rslt.AssignOperator = AssignOperatorInfo.ModEqual;
                    break;

                case "-=":
                    rslt.AssignOperator = AssignOperatorInfo.SubEqual;
                    break;

                default:
                    break;
                }
                #endregion
                rslt.AssignmentExpression = this.Assignment_expression.Parse();
            }
            return(rslt);
        }
        public AssignmentExpressionInfo Parse()
        {
            var rslt = new AssignmentExpressionInfo(this);
            if (Conditional_expression != null)
            {
                rslt.ConditionalExpression = this.Conditional_expression.Parse();
            }
            else
            {
                rslt.LValue = new LValueInfo(this) { Text = Lvalue };
                #region operator
                switch (Operator)
                {
                    case "=":
                        rslt.AssignOperator = AssignOperatorInfo.Equal;
                        break;
                    case "*=":
                        rslt.AssignOperator = AssignOperatorInfo.MulitEqual;
                        break;
                    case "+=":
                        rslt.AssignOperator = AssignOperatorInfo.AddEqual;
                        break;
                    case "/=":
                        rslt.AssignOperator = AssignOperatorInfo.DivideEqual;
                        break;
                    case "%=":
                        rslt.AssignOperator = AssignOperatorInfo.ModEqual;
                        break;
                    case "-=":
                        rslt.AssignOperator = AssignOperatorInfo.SubEqual;
                        break;
                    default:
                        break;
                }
                #endregion
                rslt.AssignmentExpression = this.Assignment_expression.Parse();

            }
            return rslt;
        }
        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);
        }