diff options
author | Nayeem Rahman <nayeemrmn99@gmail.com> | 2024-06-28 18:18:21 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-28 18:18:21 +0100 |
commit | 2ddae872f956ddd84656a302aa5f6b752f6a6ab5 (patch) | |
tree | eebf667d2b9473b61f4c81021db7f73e8a2a83c4 /cli/lsp/documents.rs | |
parent | ec9963570bb3259952e3729517d665d70131c072 (diff) |
fix(lsp): don't use global cache paths for scope allocation (#24353)
Diffstat (limited to 'cli/lsp/documents.rs')
-rw-r--r-- | cli/lsp/documents.rs | 47 |
1 files changed, 28 insertions, 19 deletions
diff --git a/cli/lsp/documents.rs b/cli/lsp/documents.rs index 29308e9f7..05f9be718 100644 --- a/cli/lsp/documents.rs +++ b/cli/lsp/documents.rs @@ -318,7 +318,7 @@ impl Document { file_referrer: Option<ModuleSpecifier>, ) -> Arc<Self> { let file_referrer = Some(&specifier) - .filter(|s| s.scheme() == "file") + .filter(|s| cache.is_valid_file_referrer(s)) .cloned() .or(file_referrer); let media_type = resolve_media_type( @@ -804,7 +804,7 @@ impl FileSystemDocuments { file_referrer: Option<&ModuleSpecifier>, ) -> Option<Arc<Document>> { let file_referrer = Some(specifier) - .filter(|s| s.scheme() == "file") + .filter(|s| cache.is_valid_file_referrer(s)) .or(file_referrer); let new_fs_version = calculate_fs_version(cache, specifier, file_referrer); let old_doc = self.docs.get(specifier).map(|v| v.value().clone()); @@ -1051,13 +1051,16 @@ impl Documents { &self, specifier: &'a ModuleSpecifier, ) -> Option<Cow<'a, ModuleSpecifier>> { - if specifier.scheme() == "file" { - Some(Cow::Borrowed(specifier)) - } else { - self - .get(specifier) - .and_then(|d| d.file_referrer().cloned().map(Cow::Owned)) + if self.is_valid_file_referrer(specifier) { + return Some(Cow::Borrowed(specifier)); } + self + .get(specifier) + .and_then(|d| d.file_referrer().cloned().map(Cow::Owned)) + } + + pub fn is_valid_file_referrer(&self, specifier: &ModuleSpecifier) -> bool { + self.cache.is_valid_file_referrer(specifier) } /// Return `true` if the provided specifier can be resolved to a document, @@ -1447,20 +1450,25 @@ impl Documents { return Some((specifier.clone(), MediaType::Dts)); } } - - if let Ok(npm_ref) = NpmPackageReqReference::from_specifier(specifier) { - return self - .resolver - .npm_to_file_url(&npm_ref, referrer, file_referrer); + let mut specifier = specifier.clone(); + let mut media_type = None; + if let Ok(npm_ref) = NpmPackageReqReference::from_specifier(&specifier) { + let (s, mt) = + self + .resolver + .npm_to_file_url(&npm_ref, referrer, file_referrer)?; + specifier = s; + media_type = Some(mt); } - let Some(doc) = self.get_or_load(specifier, referrer) else { - return Some((specifier.clone(), MediaType::from_specifier(specifier))); + let Some(doc) = self.get_or_load(&specifier, referrer) else { + let media_type = + media_type.unwrap_or_else(|| MediaType::from_specifier(&specifier)); + return Some((specifier, media_type)); }; if let Some(types) = doc.maybe_types_dependency().maybe_specifier() { - self.resolve_dependency(types, specifier, file_referrer) + self.resolve_dependency(types, &specifier, file_referrer) } else { - let media_type = doc.media_type(); - Some((doc.specifier().clone(), media_type)) + Some((doc.specifier().clone(), doc.media_type())) } } } @@ -1593,7 +1601,8 @@ mod tests { async fn setup() -> (Documents, LspCache, TempDir) { let temp_dir = TempDir::new(); - let cache = LspCache::new(Some(temp_dir.uri())); + temp_dir.create_dir_all(".deno_dir"); + let cache = LspCache::new(Some(temp_dir.uri().join(".deno_dir").unwrap())); let config = Config::default(); let resolver = Arc::new(LspResolver::from_config(&config, &cache, None).await); |