private static void HandleInvocation(SyntaxNodeAnalysisContext context) { if (context.IsExcludedFromAnalysis()) { return; } var ifStatement = (IfStatementSyntax)context.Node; if (ifStatement?.Condition == null) { return; } var setter = ifStatement.FirstAncestorOrSelf <AccessorDeclarationSyntax>(); if (setter?.IsKind(SyntaxKind.SetAccessorDeclaration) != true) { return; } if (!Notifies(setter, context.SemanticModel, context.CancellationToken)) { return; } var propertyDeclaration = setter.FirstAncestorOrSelf <PropertyDeclarationSyntax>(); var property = context.SemanticModel.GetDeclaredSymbolSafe(propertyDeclaration, context.CancellationToken); if (property == null || property.Type.IsValueType || property.Type == KnownSymbol.String) { return; } if (!Property.TryGetBackingField(property, context.SemanticModel, context.CancellationToken, out IFieldSymbol backingField)) { return; } if (Property.TryFindValue(setter, context.SemanticModel, context.CancellationToken, out IParameterSymbol value)) { foreach (var member in new ISymbol[] { backingField, property }) { if (Equality.IsObjectEquals(ifStatement.Condition, context.SemanticModel, context.CancellationToken, value, member) || IsNegatedObjectEqualsCheck(ifStatement.Condition, context.SemanticModel, context.CancellationToken, value, member)) { if (Equality.UsesObjectOrNone(ifStatement.Condition)) { return; } } } } context.ReportDiagnostic(Diagnostic.Create(Descriptor, ifStatement.GetLocation())); }