示例#1
0
        private static void VisitContent(CSharpRemovableUsingWalker visitor, SyntaxList <MemberDeclarationSyntax> members, IEnumerable <SyntaxTrivia> trivias)
        {
            var comments = trivias.Where(trivia => trivia.Kind() == SyntaxKind.SingleLineDocumentationCommentTrivia ||
                                         trivia.Kind() == SyntaxKind.MultiLineDocumentationCommentTrivia);

            foreach (var member in members)
            {
                visitor.SafeVisit(member);
            }
            foreach (var comment in comments)
            {
                if (comment.HasStructure)
                {
                    visitor.SafeVisit(comment.GetStructure());
                }
            }
        }
示例#2
0
            public override void VisitNamespaceDeclaration(NamespaceDeclarationSyntax node)
            {
                var simpleNamespaces   = node.Usings.Where(usingDirective => usingDirective.Alias == null);
                var newUsingDirectives = new HashSet <EquivalentNameSyntax>();

                newUsingDirectives.UnionWith(usingDirectivesFromParent);
                newUsingDirectives.UnionWith(simpleNamespaces.Select(x => new EquivalentNameSyntax(x.Name)));

                // We visit the namespace declaration with the updated set of parent 'usings', this is needed in case of nested namespaces
                var visitingNamespace = context.SemanticModel.GetSymbolInfo(node.Name).Symbol as INamespaceSymbol;
                var visitor           = new CSharpRemovableUsingWalker(context, newUsingDirectives.ToImmutableHashSet(), visitingNamespace);

                VisitContent(visitor, node.Members, node.DescendantTrivia());
                CheckUnnecessaryUsings(context, simpleNamespaces, visitor.necessaryNamespaces);

                necessaryNamespaces.UnionWith(visitor.necessaryNamespaces);
            }
示例#3
0
        protected override void Initialize(SonarAnalysisContext context) =>
        context.RegisterSyntaxNodeActionInNonGenerated(
            c =>
        {
            var compilationUnit       = (CompilationUnitSyntax)c.Node;
            var simpleNamespaces      = compilationUnit.Usings.Where(usingDirective => usingDirective.Alias == null);
            var globalUsingDirectives = simpleNamespaces.Select(x => new EquivalentNameSyntax(x.Name)).ToImmutableHashSet();

            var visitor = new CSharpRemovableUsingWalker(c, globalUsingDirectives, null);
            VisitContent(visitor, compilationUnit.Members, c.Node.DescendantTrivia());
            foreach (var attribute in compilationUnit.AttributeLists)
            {
                visitor.SafeVisit(attribute);
            }

            CheckUnnecessaryUsings(c, simpleNamespaces, visitor.necessaryNamespaces);
        },
            SyntaxKind.CompilationUnit);
示例#4
0
        protected override void Initialize(SonarAnalysisContext context) =>
        context.RegisterSyntaxNodeActionInNonGenerated(
            c =>
        {
            // When using top level statements, we are called twice for the same compilation unit. The second call has the containing symbol kind equal to `Method`.
            if (c.ContainingSymbol.Kind == SymbolKind.Method)
            {
                return;
            }

            var compilationUnit       = (CompilationUnitSyntax)c.Node;
            var simpleNamespaces      = compilationUnit.Usings.Where(usingDirective => usingDirective.Alias == null).ToList();
            var globalUsingDirectives = simpleNamespaces.Select(x => new EquivalentNameSyntax(x.Name)).ToImmutableHashSet();

            var visitor = new CSharpRemovableUsingWalker(c, globalUsingDirectives, null);
            VisitContent(visitor, compilationUnit.Members, c.Node.DescendantTrivia());
            foreach (var attribute in compilationUnit.AttributeLists)
            {
                visitor.SafeVisit(attribute);
            }

            CheckUnnecessaryUsings(c, simpleNamespaces, visitor.NecessaryNamespaces);
        },
            SyntaxKind.CompilationUnit);