Esempio n. 1
0
        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>();
            }
Esempio n. 3
0
            /// <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()));
            }