protected override void Initialize(SonarAnalysisContext context)
        {
            context.RegisterSyntaxNodeActionInNonGenerated(
                c =>
            {
                var typeDeclaration = (TypeDeclarationSyntax)c.Node;

                if (typeDeclaration.Modifiers.Any(SyntaxKind.PartialKeyword))
                {
                    return;
                }

                var privateFields = GetPrivateFields(c.SemanticModel, typeDeclaration);

                var collector = new FieldAccessCollector(c.SemanticModel, privateFields);

                if (!collector.SafeVisit(typeDeclaration))
                {
                    // We couldn't finish the exploration so we cannot take any decision
                    return;
                }

                privateFields.Keys
                .Where(collector.IsRemovableField)
                .Select(CreateDiagnostic)
                .ToList()
                .ForEach(d => c.ReportDiagnosticWhenActive(d));

                Diagnostic CreateDiagnostic(IFieldSymbol fieldSymbol) =>
                Diagnostic.Create(rule, privateFields[fieldSymbol].GetLocation(), fieldSymbol.Name);
            },
                SyntaxKind.ClassDeclaration,
                SyntaxKind.StructDeclaration);
        }
Ejemplo n.º 2
0
        public void Analyze()
        {
            this.Log.LogMessage(
                "FieldAccessObserver",
                "begin");

            int framesCount   = 0;
            int framesHandled = 0;
            int maxLevelCount = 16;

            for (int level = 0; level < maxLevelCount; level++)
            {
                FieldAccessCollector controller = new FieldAccessCollector(this, level);
                using (IEngine trackingEngine = this.PathServices.TrackingEngineFactory.CreateTrackingEngine(controller)
                       )
                {
                    IPexTrackingDriver driver = trackingEngine.GetService <IPexTrackingDriver>();
                    if (!driver.Run())
                    {
                        break;
                    }
                }
                framesCount    = SafeMath.Max(framesCount, controller.FramesCount);
                framesHandled += controller.FramesHandled;
                if (framesHandled > framesCount)
                {
                    framesHandled = framesCount;
                }
                this.Log.LogMessage(
                    "FieldAccessObserver",
                    "collecting data, {0:P} of all frames up to level {1} / {2}",
                    ((double)framesHandled / framesCount), level, maxLevelCount);
                if (controller.FramesHandled == 0 || // did we make any progress?
                    framesHandled >= framesCount)    // or have we processed all frames there are?
                {
                    break;
                }
            }

            this.Log.LogMessage(
                "FieldAccessObserver",
                "end");
        }