summaryrefslogtreecommitdiff
path: root/cli/lsp
diff options
context:
space:
mode:
Diffstat (limited to 'cli/lsp')
-rw-r--r--cli/lsp/diagnostics.rs33
-rw-r--r--cli/lsp/documents.rs85
-rw-r--r--cli/lsp/language_server.rs14
3 files changed, 68 insertions, 64 deletions
diff --git a/cli/lsp/diagnostics.rs b/cli/lsp/diagnostics.rs
index 0a6f33126..85bd2d76e 100644
--- a/cli/lsp/diagnostics.rs
+++ b/cli/lsp/diagnostics.rs
@@ -27,8 +27,8 @@ use deno_core::serde::Deserialize;
use deno_core::serde_json;
use deno_core::serde_json::json;
use deno_core::ModuleSpecifier;
+use deno_graph::Resolution;
use deno_graph::ResolutionError;
-use deno_graph::Resolved;
use deno_graph::SpecifierError;
use deno_lint::rules::LintRule;
use deno_runtime::tokio_util::create_basic_runtime;
@@ -852,18 +852,17 @@ impl DenoDiagnostic {
}
}
-fn diagnose_resolved(
+fn diagnose_resolution(
diagnostics: &mut Vec<lsp::Diagnostic>,
snapshot: &language_server::StateSnapshot,
- resolved: &deno_graph::Resolved,
+ resolution: &Resolution,
is_dynamic: bool,
maybe_assert_type: Option<&str>,
) {
- match resolved {
- Resolved::Ok {
- specifier, range, ..
- } => {
- let range = documents::to_lsp_range(range);
+ match resolution {
+ Resolution::Ok(resolved) => {
+ let specifier = &resolved.specifier;
+ let range = documents::to_lsp_range(&resolved.range);
// If the module is a remote module and has a `X-Deno-Warning` header, we
// want a warning diagnostic with that message.
if let Some(metadata) = snapshot.cache_metadata.get(specifier) {
@@ -959,8 +958,8 @@ fn diagnose_resolved(
}
// The specifier resolution resulted in an error, so we want to issue a
// diagnostic for that.
- Resolved::Err(err) => diagnostics.push(
- DenoDiagnostic::ResolutionError(err.clone())
+ Resolution::Err(err) => diagnostics.push(
+ DenoDiagnostic::ResolutionError(*err.clone())
.to_lsp_diagnostic(&documents::to_lsp_range(err.range())),
),
_ => (),
@@ -984,31 +983,28 @@ fn diagnose_dependency(
}
if let Some(import_map) = &snapshot.maybe_import_map {
- if let Resolved::Ok {
- specifier, range, ..
- } = &dependency.maybe_code
- {
- if let Some(to) = import_map.lookup(specifier, referrer) {
+ if let Resolution::Ok(resolved) = &dependency.maybe_code {
+ if let Some(to) = import_map.lookup(&resolved.specifier, referrer) {
if dependency_key != to {
diagnostics.push(
DenoDiagnostic::ImportMapRemap {
from: dependency_key.to_string(),
to,
}
- .to_lsp_diagnostic(&documents::to_lsp_range(range)),
+ .to_lsp_diagnostic(&documents::to_lsp_range(&resolved.range)),
);
}
}
}
}
- diagnose_resolved(
+ diagnose_resolution(
diagnostics,
snapshot,
&dependency.maybe_code,
dependency.is_dynamic,
dependency.maybe_assert_type.as_deref(),
);
- diagnose_resolved(
+ diagnose_resolution(
diagnostics,
snapshot,
&dependency.maybe_type,
@@ -1064,6 +1060,7 @@ mod tests {
use crate::lsp::documents::Documents;
use crate::lsp::documents::LanguageId;
use crate::lsp::language_server::StateSnapshot;
+ use pretty_assertions::assert_eq;
use std::path::Path;
use std::path::PathBuf;
use std::sync::Arc;
diff --git a/cli/lsp/documents.rs b/cli/lsp/documents.rs
index c32efe89c..329fc554b 100644
--- a/cli/lsp/documents.rs
+++ b/cli/lsp/documents.rs
@@ -33,7 +33,7 @@ use deno_core::parking_lot::Mutex;
use deno_core::url;
use deno_core::ModuleSpecifier;
use deno_graph::GraphImport;
-use deno_graph::Resolved;
+use deno_graph::Resolution;
use deno_runtime::deno_node::NodeResolutionMode;
use deno_runtime::permissions::PermissionsContainer;
use once_cell::sync::Lazy;
@@ -243,7 +243,7 @@ impl AssetOrDocument {
#[derive(Debug, Default)]
struct DocumentDependencies {
deps: BTreeMap<String, deno_graph::Dependency>,
- maybe_types_dependency: Option<(String, Resolved)>,
+ maybe_types_dependency: Option<deno_graph::TypesDependency>,
}
impl DocumentDependencies {
@@ -508,13 +508,12 @@ impl Document {
self.0.maybe_lsp_version.is_some()
}
- pub fn maybe_types_dependency(&self) -> deno_graph::Resolved {
- if let Some((_, maybe_dep)) =
- self.0.dependencies.maybe_types_dependency.as_ref()
+ pub fn maybe_types_dependency(&self) -> Resolution {
+ if let Some(types_dep) = self.0.dependencies.maybe_types_dependency.as_ref()
{
- maybe_dep.clone()
+ types_dep.dependency.clone()
} else {
- deno_graph::Resolved::None
+ Resolution::None
}
}
@@ -597,20 +596,23 @@ impl Document {
}
}
-pub fn to_hover_text(result: &Resolved) -> String {
+pub fn to_hover_text(result: &Resolution) -> String {
match result {
- Resolved::Ok { specifier, .. } => match specifier.scheme() {
- "data" => "_(a data url)_".to_string(),
- "blob" => "_(a blob url)_".to_string(),
- _ => format!(
- "{}&#8203;{}",
- &specifier[..url::Position::AfterScheme],
- &specifier[url::Position::AfterScheme..],
- )
- .replace('@', "&#8203;@"),
- },
- Resolved::Err(_) => "_[errored]_".to_string(),
- Resolved::None => "_[missing]_".to_string(),
+ Resolution::Ok(resolved) => {
+ let specifier = &resolved.specifier;
+ match specifier.scheme() {
+ "data" => "_(a data url)_".to_string(),
+ "blob" => "_(a blob url)_".to_string(),
+ _ => format!(
+ "{}&#8203;{}",
+ &specifier[..url::Position::AfterScheme],
+ &specifier[url::Position::AfterScheme..],
+ )
+ .replace('@', "&#8203;@"),
+ }
+ }
+ Resolution::Err(_) => "_[errored]_".to_string(),
+ Resolution::None => "_[missing]_".to_string(),
}
}
@@ -1094,15 +1096,16 @@ impl Documents {
} else if let Some(dep) =
dependencies.as_ref().and_then(|d| d.deps.get(&specifier))
{
- if let Resolved::Ok { specifier, .. } = &dep.maybe_type {
+ if let Some(specifier) = dep.maybe_type.maybe_specifier() {
results.push(self.resolve_dependency(specifier, maybe_npm_resolver));
- } else if let Resolved::Ok { specifier, .. } = &dep.maybe_code {
+ } else if let Some(specifier) = dep.maybe_code.maybe_specifier() {
results.push(self.resolve_dependency(specifier, maybe_npm_resolver));
} else {
results.push(None);
}
- } else if let Some(Resolved::Ok { specifier, .. }) =
- self.resolve_imports_dependency(&specifier)
+ } else if let Some(specifier) = self
+ .resolve_imports_dependency(&specifier)
+ .and_then(|r| r.maybe_specifier())
{
results.push(self.resolve_dependency(specifier, maybe_npm_resolver));
} else if let Ok(npm_ref) = NpmPackageReference::from_str(&specifier) {
@@ -1186,18 +1189,18 @@ impl Documents {
self.maybe_resolver =
CliResolver::maybe_new(maybe_jsx_config, maybe_import_map);
self.imports = Arc::new(
- if let Some(Ok(Some(imports))) =
+ if let Some(Ok(imports)) =
maybe_config_file.map(|cf| cf.to_maybe_imports())
{
imports
.into_iter()
- .map(|(referrer, dependencies)| {
+ .map(|import| {
let graph_import = GraphImport::new(
- referrer.clone(),
- dependencies,
+ &import.referrer,
+ import.imports,
self.get_maybe_resolver(),
);
- (referrer, graph_import)
+ (import.referrer, graph_import)
})
.collect()
} else {
@@ -1274,10 +1277,8 @@ impl Documents {
self.add(dep, specifier);
}
}
- if let Resolved::Ok { specifier: dep, .. } =
- doc.maybe_types_dependency()
- {
- self.add(&dep, specifier);
+ if let Some(dep) = doc.maybe_types_dependency().maybe_specifier() {
+ self.add(dep, specifier);
}
}
}
@@ -1345,13 +1346,12 @@ impl Documents {
}
let doc = self.get(specifier)?;
let maybe_module = doc.maybe_module().and_then(|r| r.as_ref().ok());
- let maybe_types_dependency = maybe_module.and_then(|m| {
- m.maybe_types_dependency
- .as_ref()
- .map(|(_, resolved)| resolved.clone())
- });
- if let Some(Resolved::Ok { specifier, .. }) = maybe_types_dependency {
- self.resolve_dependency(&specifier, maybe_npm_resolver)
+ let maybe_types_dependency = maybe_module
+ .and_then(|m| m.maybe_types_dependency.as_ref().map(|d| &d.dependency));
+ if let Some(specifier) =
+ maybe_types_dependency.and_then(|d| d.maybe_specifier())
+ {
+ self.resolve_dependency(specifier, maybe_npm_resolver)
} else {
let media_type = doc.media_type();
Some((specifier.clone(), media_type))
@@ -1361,10 +1361,7 @@ impl Documents {
/// Iterate through any "imported" modules, checking to see if a dependency
/// is available. This is used to provide "global" imports like the JSX import
/// source.
- fn resolve_imports_dependency(
- &self,
- specifier: &str,
- ) -> Option<&deno_graph::Resolved> {
+ fn resolve_imports_dependency(&self, specifier: &str) -> Option<&Resolution> {
for graph_imports in self.imports.values() {
let maybe_dep = graph_imports.dependencies.get(specifier);
if maybe_dep.is_some() {
diff --git a/cli/lsp/language_server.rs b/cli/lsp/language_server.rs
index 13eb61412..f4045a19e 100644
--- a/cli/lsp/language_server.rs
+++ b/cli/lsp/language_server.rs
@@ -173,8 +173,18 @@ impl LanguageServer {
inner_loader: &mut inner_loader,
open_docs: &open_docs,
};
- let graph = ps.create_graph_with_loader(roots, &mut loader).await?;
- graph_valid(&graph, true, false)?;
+ let graph = ps
+ .create_graph_with_loader(roots.clone(), &mut loader)
+ .await?;
+ graph_valid(
+ &graph,
+ &roots,
+ deno_graph::WalkOptions {
+ follow_dynamic: false,
+ follow_type_only: true,
+ check_js: false,
+ },
+ )?;
Ok(())
}