private IEnumerable <INamedTypeSymbol> GetAllTypes(SyntaxContext syntaxContext, Options.Options options) { var symbolsToTraverse = new Queue <INamespaceOrTypeSymbol>(); var globalNamespace = syntaxContext.SemanticModel.Compilation.GlobalNamespace; symbolsToTraverse.Enqueue(globalNamespace); while (symbolsToTraverse.Count > 0) { var current = symbolsToTraverse.Dequeue(); foreach (var member in current.GetMembers()) { if (member is INamedTypeSymbol namedTypeSymbol) { if (syntaxContext.IsAccessible(namedTypeSymbol) && !(options.FilterOutObsoleteSymbols && namedTypeSymbol.IsObsolete())) { yield return(namedTypeSymbol); if (options.SuggestNestedTypes) { symbolsToTraverse.Enqueue(namedTypeSymbol); } } } else if (member is INamespaceSymbol ns) { symbolsToTraverse.Enqueue(ns); } } } }
public IEnumerable <CompletionItem> GetCompletionItemsForType(INamedTypeSymbol typeSymbol, SyntaxContext syntaxContext, Options.Options options) { if (syntaxContext.IsNamespaceImported(typeSymbol.ContainingNamespace) || !typeSymbol.MightContainExtensionMethods) { return(null); } var extMethodSymbols = typeSymbol .GetMembers() .OfType <IMethodSymbol>() .Where(methodSymbol => syntaxContext.IsAccessible(methodSymbol) && !(options.FilterOutObsoleteSymbols && methodSymbol.IsObsolete())) .Select(m => m.ReduceExtensionMethod(syntaxContext.AccessedSymbolType)) .Where(m => m != null); return(extMethodSymbols.Select(s => CreateCompletionItemForSymbol(s, syntaxContext, options))); }