private static async Task <CacheEntry?> GetCacheEntryAsync( Project project, bool loadOnly, IImportCompletionCacheService <CacheEntry, object> cacheService, CancellationToken cancellationToken ) { // While we are caching data from SyntaxTreeInfo, all the things we cared about here are actually based on sources symbols. // So using source symbol checksum would suffice. var checksum = await SymbolTreeInfo .GetSourceSymbolsChecksumAsync(project, cancellationToken) .ConfigureAwait(false); // Cache miss, create all requested items. if ( !cacheService.ProjectItemsCache.TryGetValue(project.Id, out var cacheEntry) || cacheEntry.Checksum != checksum || cacheEntry.Language != project.Language ) { var syntaxFacts = project.LanguageServices.GetRequiredService <ISyntaxFactsService>(); var builder = new CacheEntry.Builder( checksum, project.Language, syntaxFacts.StringComparer ); foreach (var document in project.Documents) { // Don't look for extension methods in generated code. if (document.State.Attributes.IsGenerated) { continue; } var info = await document .GetSyntaxTreeIndexAsync(loadOnly, cancellationToken) .ConfigureAwait(false); if (info == null) { return(null); } if (info.ContainsExtensionMethod) { builder.AddItem(info); } } cacheEntry = builder.ToCacheEntry(); cacheService.ProjectItemsCache[project.Id] = cacheEntry; } return(cacheEntry); }
public ExtensionMethodSymbolComputer( Document document, SemanticModel semanticModel, ITypeSymbol receiverTypeSymbol, int position, ISet<string> namespaceInScope) { _originatingDocument = document; _originatingSemanticModel = semanticModel; _receiverTypeSymbol = receiverTypeSymbol; _position = position; _namespaceInScope = namespaceInScope; var receiverTypeNames = GetReceiverTypeNames(receiverTypeSymbol); _receiverTypeNames = AddComplexTypes(receiverTypeNames); _cacheService = GetCacheService(document.Project.Solution.Workspace); _checkedReceiverTypes = new ConcurrentDictionary<ITypeSymbol, bool>(); }
/// <summary> /// Force create all relevant indices /// </summary> public static Task PopulateIndicesAsync(Project?project, IImportCompletionCacheService <CacheEntry, object> cacheService, CancellationToken cancellationToken) { if (project is null) { return(Task.CompletedTask); } using var _ = ArrayBuilder <Task> .GetInstance(out var tasks); foreach (var relevantProject in GetAllRelevantProjects(project)) { tasks.Add(Task.Run(() => GetCacheEntryAsync(relevantProject, loadOnly: false, cacheService, cancellationToken), cancellationToken)); } foreach (var peReference in GetAllRelevantPeReferences(project)) { tasks.Add(Task.Run(() => SymbolTreeInfo.GetInfoForMetadataReferenceAsync(project.Solution, peReference, loadOnly: false, cancellationToken).AsTask(), cancellationToken)); } return(Task.WhenAll(tasks.ToImmutable())); }