예제 #1
0
        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;
            }
        }
예제 #2
0
            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()));
            }
        }