summaryrefslogtreecommitdiff
path: root/cli/lsp/documents.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/lsp/documents.rs')
-rw-r--r--cli/lsp/documents.rs89
1 files changed, 52 insertions, 37 deletions
diff --git a/cli/lsp/documents.rs b/cli/lsp/documents.rs
index 9892eab1f..51a63eb22 100644
--- a/cli/lsp/documents.rs
+++ b/cli/lsp/documents.rs
@@ -245,6 +245,8 @@ impl SyntheticModule {
}
#[derive(Debug, Clone)]
struct DocumentInner {
+ /// contains the last-known-good set of dependencies from parsing the module
+ dependencies: Arc<BTreeMap<String, deno_graph::Dependency>>,
fs_version: String,
line_index: Arc<LineIndex>,
maybe_language_id: Option<LanguageId>,
@@ -282,9 +284,15 @@ impl Document {
maybe_resolver,
Some(&parser),
));
+ let dependencies = if let Some(Ok(module)) = &maybe_module {
+ Arc::new(module.dependencies.clone())
+ } else {
+ Arc::new(BTreeMap::new())
+ };
let text_info = SourceTextInfo::new(content);
let line_index = Arc::new(LineIndex::new(text_info.text_str()));
Self(Arc::new(DocumentInner {
+ dependencies,
fs_version,
line_index,
maybe_language_id: None,
@@ -317,9 +325,15 @@ impl Document {
} else {
None
};
+ let dependencies = if let Some(Ok(module)) = &maybe_module {
+ Arc::new(module.dependencies.clone())
+ } else {
+ Arc::new(BTreeMap::new())
+ };
let source = SourceTextInfo::new(content);
let line_index = Arc::new(LineIndex::new(source.text_str()));
Self(Arc::new(DocumentInner {
+ dependencies,
fs_version: "1".to_string(),
line_index,
maybe_language_id: Some(language_id),
@@ -379,14 +393,20 @@ impl Document {
} else {
None
};
- let source = SourceTextInfo::new(content);
+ let dependencies = if let Some(Ok(module)) = &maybe_module {
+ Arc::new(module.dependencies.clone())
+ } else {
+ self.0.dependencies.clone()
+ };
+ let text_info = SourceTextInfo::new(content);
let line_index = if index_valid == IndexValid::All {
line_index
} else {
- Arc::new(LineIndex::new(source.text_str()))
+ Arc::new(LineIndex::new(text_info.text_str()))
};
Ok(Document(Arc::new(DocumentInner {
- text_info: source,
+ dependencies,
+ text_info,
line_index,
maybe_module,
maybe_lsp_version: Some(version),
@@ -499,15 +519,13 @@ impl Document {
self.0.maybe_warning.clone()
}
- pub fn dependencies(&self) -> Option<Vec<(String, deno_graph::Dependency)>> {
- let module = self.maybe_module()?.as_ref().ok()?;
- Some(
- module
- .dependencies
- .iter()
- .map(|(s, d)| (s.clone(), d.clone()))
- .collect(),
- )
+ pub fn dependencies(&self) -> Vec<(String, deno_graph::Dependency)> {
+ self
+ .0
+ .dependencies
+ .iter()
+ .map(|(s, d)| (s.clone(), d.clone()))
+ .collect()
}
/// If the supplied position is within a dependency range, return the resolved
@@ -911,35 +929,32 @@ impl DocumentsInner {
specifiers: Vec<String>,
referrer: &ModuleSpecifier,
) -> Option<Vec<Option<(ModuleSpecifier, MediaType)>>> {
- let doc = self.get(referrer)?;
+ let dependencies = self.get(referrer)?.0.dependencies.clone();
let mut results = Vec::new();
- if let Some(Ok(module)) = doc.maybe_module() {
- let dependencies = module.dependencies.clone();
- for specifier in specifiers {
- if specifier.starts_with("asset:") {
- if let Ok(specifier) = ModuleSpecifier::parse(&specifier) {
- let media_type = MediaType::from(&specifier);
- results.push(Some((specifier, media_type)));
- } else {
- results.push(None);
- }
- } else if let Some(dep) = dependencies.get(&specifier) {
- if let Some(Ok((specifier, _))) = &dep.maybe_type {
- results.push(self.resolve_dependency(specifier));
- } else if let Some(Ok((specifier, _))) = &dep.maybe_code {
- results.push(self.resolve_dependency(specifier));
- } else {
- results.push(None);
- }
- } else if let Some(Some(Ok((specifier, _)))) =
- self.resolve_imports_dependency(&specifier)
- {
- // clone here to avoid double borrow of self
- let specifier = specifier.clone();
- results.push(self.resolve_dependency(&specifier));
+ for specifier in specifiers {
+ if specifier.starts_with("asset:") {
+ if let Ok(specifier) = ModuleSpecifier::parse(&specifier) {
+ let media_type = MediaType::from(&specifier);
+ results.push(Some((specifier, media_type)));
+ } else {
+ results.push(None);
+ }
+ } else if let Some(dep) = dependencies.get(&specifier) {
+ if let Some(Ok((specifier, _))) = &dep.maybe_type {
+ results.push(self.resolve_dependency(specifier));
+ } else if let Some(Ok((specifier, _))) = &dep.maybe_code {
+ results.push(self.resolve_dependency(specifier));
} else {
results.push(None);
}
+ } else if let Some(Some(Ok((specifier, _)))) =
+ self.resolve_imports_dependency(&specifier)
+ {
+ // clone here to avoid double borrow of self
+ let specifier = specifier.clone();
+ results.push(self.resolve_dependency(&specifier));
+ } else {
+ results.push(None);
}
}
Some(results)