示例#1
0
        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
示例#3
0
 public abstract object AssignedValue(PropertyAccessContext context);