Ejemplo n.º 1
0
        private async Task <IProjectEntry> AddFileAsync(Uri documentUri, Uri fromSearchPath, IAnalysisCookie cookie = null)
        {
            var item = _projectFiles.GetEntry(documentUri, throwIfMissing: false);

            if (item != null)
            {
                return(item);
            }

            IEnumerable <string> aliases = null;
            var path = GetLocalPath(documentUri);

            if (fromSearchPath != null)
            {
                if (ModulePath.FromBasePathAndFile_NoThrow(GetLocalPath(fromSearchPath), path, out var mp))
                {
                    aliases = new[] { mp.ModuleName };
                }
            }
            else
            {
                aliases = GetImportNames(documentUri).Select(mp => mp.ModuleName).ToArray();
            }

            if (!(aliases?.Any() ?? false))
            {
                aliases = new[] { Path.GetFileNameWithoutExtension(path) };
            }

            var reanalyzeEntries = aliases.SelectMany(a => _analyzer.GetEntriesThatImportModule(a, true)).ToArray();
            var first            = aliases.FirstOrDefault();

            var pyItem = _analyzer.AddModule(first, path, documentUri, cookie);

            item = pyItem;
            foreach (var a in aliases.Skip(1))
            {
                _analyzer.AddModuleAlias(first, a);
            }

            var actualItem = _projectFiles.GetOrAddEntry(documentUri, item);

            if (actualItem != item)
            {
                return(actualItem);
            }

            if (_clientCaps?.python?.analysisUpdates ?? false)
            {
                pyItem.OnNewAnalysis += ProjectEntry_OnNewAnalysis;
            }

            if (item is IDocument doc)
            {
                EnqueueItem(doc);
            }

            if (reanalyzeEntries != null)
            {
                foreach (var entryRef in reanalyzeEntries)
                {
                    _queue.Enqueue(entryRef, AnalysisPriority.Low);
                }
            }

            return(item);
        }