private void CheckForEmptyCollectionAccess(CSharpExplodedGraph explodedGraph, SyntaxNodeAnalysisContext context) { var check = new EmptyCollectionAccessedCheck(explodedGraph); explodedGraph.AddExplodedGraphCheck(check); var emptyCollections = new HashSet <SyntaxNode>(); var nonEmptyCollections = new HashSet <SyntaxNode>(); void explorationEnded(object sender, EventArgs args) => emptyCollections.Except(nonEmptyCollections) .Select(node => Diagnostic.Create(rule, node.GetLocation())) .ToList() .ForEach(d => context.ReportDiagnosticWhenActive(d)); void collectionAccessedHandler(object sender, CollectionAccessedEventArgs args) => (args.IsEmpty ? emptyCollections : nonEmptyCollections).Add(args.Node); explodedGraph.ExplorationEnded += explorationEnded; check.CollectionAccessed += collectionAccessedHandler; try { explodedGraph.Walk(); } finally { check.CollectionAccessed -= collectionAccessedHandler; explodedGraph.ExplorationEnded -= explorationEnded; } }
public AnalysisContext(CSharpExplodedGraph explodedGraph) { check = new EmptyCollectionAccessedCheck(explodedGraph); check.CollectionAccessed += CollectionAccessedHandler; explodedGraph.AddExplodedGraphCheck(check); }
private void CheckForEmptyCollectionAccess(ExplodedGraph explodedGraph, SyntaxNodeAnalysisContext context) { var check = new EmptyCollectionAccessedCheck(explodedGraph); explodedGraph.AddExplodedGraphCheck(check); var emptyCollections = new HashSet <SyntaxNode>(); var nonEmptyCollections = new HashSet <SyntaxNode>(); EventHandler <CollectionAccessedEventArgs> collectionAccessedHandler = (sender, args) => (args.IsEmpty ? emptyCollections : nonEmptyCollections).Add(args.Node); check.CollectionAccessed += collectionAccessedHandler; try { explodedGraph.Walk(); } finally { check.CollectionAccessed -= collectionAccessedHandler; } foreach (var node in emptyCollections.Except(nonEmptyCollections)) { context.ReportDiagnostic(Diagnostic.Create(rule, node.GetLocation())); } }