public void Track(SonarAnalysisContext context, params PropertyAccessCondition[] conditions) { context.RegisterCompilationStartAction( c => { if (IsEnabled(c.Options)) { c.RegisterSyntaxNodeActionInNonGenerated( GeneratedCodeRecognizer, TrackMemberAccess, TrackedSyntaxKinds); } }); void TrackMemberAccess(SyntaxNodeAnalysisContext c) { if (IsTrackedProperty(c.Node, c.SemanticModel)) { c.ReportDiagnosticWhenActive(Diagnostic.Create(Rule, c.Node.GetLocation())); } } bool IsTrackedProperty(SyntaxNode expression, SemanticModel semanticModel) { // We register for both MemberAccess and IdentifierName and we want to // avoid raising two times for the same identifier. if (IsIdentifierWithinMemberAccess(expression)) { return(false); } var propertyName = GetPropertyName(expression); if (propertyName == null) { return(false); } var conditionContext = new PropertyAccessContext(expression, propertyName, semanticModel); return(conditions.All(c => c(conditionContext))); } }
public override object AssignedValue(PropertyAccessContext context) => context.Node.Ancestors().FirstOrDefault(ancestor => ancestor.IsKind(SyntaxKind.SimpleAssignmentStatement)) is AssignmentStatementSyntax assignment
public abstract object AssignedValue(PropertyAccessContext context);