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