summaryrefslogtreecommitdiff
path: root/cli/lsp/documents.rs
diff options
context:
space:
mode:
authorNayeem Rahman <nayeemrmn99@gmail.com>2024-06-28 18:18:21 +0100
committerGitHub <noreply@github.com>2024-06-28 18:18:21 +0100
commit2ddae872f956ddd84656a302aa5f6b752f6a6ab5 (patch)
treeeebf667d2b9473b61f4c81021db7f73e8a2a83c4 /cli/lsp/documents.rs
parentec9963570bb3259952e3729517d665d70131c072 (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.rs47
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);