private static void CheckInvocationInsideMethod(SyntaxNodeAnalysisContext context, IMethodSymbol methodSymbol) { var invocation = (InvocationExpressionSyntax)context.Node; var invokedMethod = context.SemanticModel.GetSymbolInfo(invocation).Symbol as IMethodSymbol; if (invokedMethod == null || invokedMethod.Name != methodSymbol.Name) { return; } var memberAccess = invocation.Expression as MemberAccessExpressionSyntax; var baseCall = memberAccess?.Expression as BaseExpressionSyntax; if (baseCall == null) { return; } var objectType = invokedMethod.ContainingType; if (objectType != null && !objectType.Is(KnownType.System_Object) && GetHashCodeEqualsOverride.IsEqualsCallInGuardCondition(invocation, invokedMethod)) { context.ReportDiagnosticWhenActive(Diagnostic.Create(rule, invocation.GetLocation())); } }
protected sealed override void Initialize(SonarAnalysisContext context) { context.RegisterCodeBlockStartActionInNonGenerated <SyntaxKind>( cb => { var methodDeclaration = cb.CodeBlock as MethodDeclarationSyntax; if (methodDeclaration == null) { return; } var methodSymbol = cb.OwningSymbol as IMethodSymbol; if (methodSymbol == null || !GetHashCodeEqualsOverride.MethodIsRelevant(methodSymbol, MethodNames)) { return; } cb.RegisterSyntaxNodeAction( c => { CheckInvocationInsideMethod(c, methodSymbol); }, SyntaxKind.InvocationExpression); }); }