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); }
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"); }