private async Task <IProjectEntry> AddFileAsync(Uri documentUri, Uri fromSearchPath, IAnalysisCookie cookie = null) { var item = ProjectFiles.GetEntry(documentUri, throwIfMissing: false); if (item != null) { return(item); } 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.IsNullOrEmpty()) { 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); } pyItem.OnNewAnalysis += (o, e) => OnPythonEntryNewAnalysis(pyItem); if (item is IDocument doc) { EnqueueItem(doc); } foreach (var entryRef in reanalyzeEntries) { _queue.Enqueue(entryRef, AnalysisPriority.Low); } return(item); }
private Task <IProjectEntry> AddFileAsync(Uri documentUri, Uri fromSearchPath, IAnalysisCookie cookie = null) { var item = _projectFiles.GetEntry(documentUri, throwIfMissing: false); if (item != null) { return(Task.FromResult(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(Task.FromResult(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(Task.FromResult(item)); }