public static ISet<INamespaceSymbol> GetUsingNamespacesInScope(this SemanticModel semanticModel, SyntaxNode location) { // Avoiding linq here for perf reasons. This is used heavily in the AddImport service HashSet<INamespaceSymbol> result = null; foreach (var @using in location.GetEnclosingUsingDirectives()) { if (@using.Alias == null) { var symbolInfo = semanticModel.GetSymbolInfo(@using.Name); if (symbolInfo.Symbol != null && symbolInfo.Symbol.Kind == SymbolKind.Namespace) { result = result ?? new HashSet<INamespaceSymbol>(); result.Add((INamespaceSymbol)symbolInfo.Symbol); } } } return (ISet<INamespaceSymbol>)result ?? ImmutableHashSet<INamespaceSymbol>.Empty; }
private static IList<UsingDirectiveSyntax> GetUsingDirectivesToAdd( SyntaxNode contextLocation, XElement snippetNode, XElement importsNode, CancellationToken cancellationToken) { var namespaceXmlName = XName.Get("Namespace", snippetNode.Name.NamespaceName); var existingUsings = contextLocation.GetEnclosingUsingDirectives(); var newUsings = new List<UsingDirectiveSyntax>(); foreach (var import in importsNode.Elements(XName.Get("Import", snippetNode.Name.NamespaceName))) { var namespaceElement = import.Element(namespaceXmlName); if (namespaceElement == null) { continue; } var namespaceToImport = namespaceElement.Value.Trim(); if (string.IsNullOrEmpty(namespaceToImport)) { continue; } var candidateUsing = SyntaxFactory.ParseCompilationUnit("using " + namespaceToImport + ";").DescendantNodes().OfType<UsingDirectiveSyntax>().FirstOrDefault(); if (candidateUsing == null) { continue; } if (!existingUsings.Any(u => u.IsEquivalentTo(candidateUsing, topLevel: false))) { newUsings.Add(candidateUsing.WithAdditionalAnnotations(Formatter.Annotation).WithAppendedTrailingTrivia(SyntaxFactory.CarriageReturnLineFeed)); } } return newUsings; }