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