summaryrefslogtreecommitdiff
path: root/cli/lsp/language_server.rs
diff options
context:
space:
mode:
authorNayeem Rahman <nayeemrmn99@gmail.com>2024-08-28 05:15:48 +0100
committerGitHub <noreply@github.com>2024-08-28 05:15:48 +0100
commit97d1635343dc6e93c8dcf4b116922de5b9c57af3 (patch)
tree6edb8630d4ec473c73c47ace90a7053a898f5570 /cli/lsp/language_server.rs
parentefcabce1c117a2e0fed8604d887695a0a19a37ad (diff)
fix(lsp): panic on url_to_uri() (#25238)
Diffstat (limited to 'cli/lsp/language_server.rs')
-rw-r--r--cli/lsp/language_server.rs115
1 files changed, 64 insertions, 51 deletions
diff --git a/cli/lsp/language_server.rs b/cli/lsp/language_server.rs
index 86277ab41..37e1aa0be 100644
--- a/cli/lsp/language_server.rs
+++ b/cli/lsp/language_server.rs
@@ -32,6 +32,7 @@ use std::collections::VecDeque;
use std::env;
use std::fmt::Write as _;
use std::path::PathBuf;
+use std::str::FromStr;
use std::sync::Arc;
use tokio::sync::mpsc::unbounded_channel;
use tokio::sync::mpsc::UnboundedReceiver;
@@ -723,7 +724,9 @@ impl Inner {
.into_iter()
.map(|folder| {
(
- self.url_map.normalize_url(&folder.uri, LspUrlKind::Folder),
+ self
+ .url_map
+ .uri_to_specifier(&folder.uri, LspUrlKind::Folder),
folder,
)
})
@@ -735,7 +738,7 @@ impl Inner {
if let Some(root_uri) = params.root_uri {
if !workspace_folders.iter().any(|(_, f)| f.uri == root_uri) {
let root_url =
- self.url_map.normalize_url(&root_uri, LspUrlKind::Folder);
+ self.url_map.uri_to_specifier(&root_uri, LspUrlKind::Folder);
let name = root_url.path_segments().and_then(|s| s.last());
let name = name.unwrap_or_default().to_string();
workspace_folders.insert(
@@ -1043,7 +1046,7 @@ impl Inner {
.filter(|s| self.documents.is_valid_file_referrer(s));
let specifier = self
.url_map
- .normalize_url(&params.text_document.uri, LspUrlKind::File);
+ .uri_to_specifier(&params.text_document.uri, LspUrlKind::File);
let document = self.documents.open(
specifier.clone(),
params.text_document.version,
@@ -1065,7 +1068,7 @@ impl Inner {
let mark = self.performance.mark_with_args("lsp.did_change", &params);
let specifier = self
.url_map
- .normalize_url(&params.text_document.uri, LspUrlKind::File);
+ .uri_to_specifier(&params.text_document.uri, LspUrlKind::File);
match self.documents.change(
&specifier,
params.text_document.version,
@@ -1102,7 +1105,7 @@ impl Inner {
let _mark = self.performance.measure_scope("lsp.did_save");
let specifier = self
.url_map
- .normalize_url(&params.text_document.uri, LspUrlKind::File);
+ .uri_to_specifier(&params.text_document.uri, LspUrlKind::File);
self.documents.save(&specifier);
if !self
.config
@@ -1148,7 +1151,7 @@ impl Inner {
}
let specifier = self
.url_map
- .normalize_url(&params.text_document.uri, LspUrlKind::File);
+ .uri_to_specifier(&params.text_document.uri, LspUrlKind::File);
self.diagnostics_state.clear(&specifier);
if self.is_diagnosable(&specifier) {
self.refresh_npm_specifiers().await;
@@ -1202,7 +1205,7 @@ impl Inner {
let changes = params
.changes
.into_iter()
- .map(|e| (self.url_map.normalize_url(&e.uri, LspUrlKind::File), e))
+ .map(|e| (self.url_map.uri_to_specifier(&e.uri, LspUrlKind::File), e))
.collect::<Vec<_>>();
if changes
.iter()
@@ -1221,7 +1224,7 @@ impl Inner {
_ => return None,
};
Some(lsp_custom::DenoConfigurationChangeEvent {
- scope_uri: url_to_uri(t.0),
+ scope_uri: url_to_uri(t.0).ok()?,
file_uri: e.uri.clone(),
typ: lsp_custom::DenoConfigurationChangeType::from_file_change_type(
e.typ,
@@ -1256,7 +1259,7 @@ impl Inner {
_ => return None,
};
Some(lsp_custom::DenoConfigurationChangeEvent {
- scope_uri: url_to_uri(t.0),
+ scope_uri: url_to_uri(t.0).ok()?,
file_uri: e.uri.clone(),
typ: lsp_custom::DenoConfigurationChangeType::from_file_change_type(
e.typ,
@@ -1282,7 +1285,7 @@ impl Inner {
) -> LspResult<Option<DocumentSymbolResponse>> {
let specifier = self
.url_map
- .normalize_url(&params.text_document.uri, LspUrlKind::File);
+ .uri_to_specifier(&params.text_document.uri, LspUrlKind::File);
if !self.is_diagnosable(&specifier)
|| !self.config.specifier_enabled(&specifier)
{
@@ -1326,7 +1329,7 @@ impl Inner {
.filter(|s| self.documents.is_valid_file_referrer(s));
let mut specifier = self
.url_map
- .normalize_url(&params.text_document.uri, LspUrlKind::File);
+ .uri_to_specifier(&params.text_document.uri, LspUrlKind::File);
// skip formatting any files ignored by the config file
if !self
.config
@@ -1441,7 +1444,7 @@ impl Inner {
}
async fn hover(&self, params: HoverParams) -> LspResult<Option<Hover>> {
- let specifier = self.url_map.normalize_url(
+ let specifier = self.url_map.uri_to_specifier(
&params.text_document_position_params.text_document.uri,
LspUrlKind::File,
);
@@ -1574,7 +1577,7 @@ impl Inner {
) -> LspResult<Option<CodeActionResponse>> {
let specifier = self
.url_map
- .normalize_url(&params.text_document.uri, LspUrlKind::File);
+ .uri_to_specifier(&params.text_document.uri, LspUrlKind::File);
if !self.is_diagnosable(&specifier)
|| !self.config.specifier_enabled(&specifier)
{
@@ -1918,7 +1921,7 @@ impl Inner {
) -> LspResult<Option<Vec<CodeLens>>> {
let specifier = self
.url_map
- .normalize_url(&params.text_document.uri, LspUrlKind::File);
+ .uri_to_specifier(&params.text_document.uri, LspUrlKind::File);
if !self.is_diagnosable(&specifier)
|| !self.config.specifier_enabled(&specifier)
{
@@ -2004,7 +2007,7 @@ impl Inner {
&self,
params: DocumentHighlightParams,
) -> LspResult<Option<Vec<DocumentHighlight>>> {
- let specifier = self.url_map.normalize_url(
+ let specifier = self.url_map.uri_to_specifier(
&params.text_document_position_params.text_document.uri,
LspUrlKind::File,
);
@@ -2048,7 +2051,7 @@ impl Inner {
&self,
params: ReferenceParams,
) -> LspResult<Option<Vec<Location>>> {
- let specifier = self.url_map.normalize_url(
+ let specifier = self.url_map.uri_to_specifier(
&params.text_document_position.text_document.uri,
LspUrlKind::File,
);
@@ -2104,7 +2107,7 @@ impl Inner {
&self,
params: GotoDefinitionParams,
) -> LspResult<Option<GotoDefinitionResponse>> {
- let specifier = self.url_map.normalize_url(
+ let specifier = self.url_map.uri_to_specifier(
&params.text_document_position_params.text_document.uri,
LspUrlKind::File,
);
@@ -2143,7 +2146,7 @@ impl Inner {
&self,
params: GotoTypeDefinitionParams,
) -> LspResult<Option<GotoTypeDefinitionResponse>> {
- let specifier = self.url_map.normalize_url(
+ let specifier = self.url_map.uri_to_specifier(
&params.text_document_position_params.text_document.uri,
LspUrlKind::File,
);
@@ -2189,7 +2192,7 @@ impl Inner {
&self,
params: CompletionParams,
) -> LspResult<Option<CompletionResponse>> {
- let specifier = self.url_map.normalize_url(
+ let specifier = self.url_map.uri_to_specifier(
&params.text_document_position.text_document.uri,
LspUrlKind::File,
);
@@ -2378,7 +2381,7 @@ impl Inner {
&self,
params: GotoImplementationParams,
) -> LspResult<Option<GotoImplementationResponse>> {
- let specifier = self.url_map.normalize_url(
+ let specifier = self.url_map.uri_to_specifier(
&params.text_document_position_params.text_document.uri,
LspUrlKind::File,
);
@@ -2429,7 +2432,7 @@ impl Inner {
) -> LspResult<Option<Vec<FoldingRange>>> {
let specifier = self
.url_map
- .normalize_url(&params.text_document.uri, LspUrlKind::File);
+ .uri_to_specifier(&params.text_document.uri, LspUrlKind::File);
if !self.is_diagnosable(&specifier)
|| !self.config.specifier_enabled(&specifier)
{
@@ -2476,7 +2479,7 @@ impl Inner {
) -> LspResult<Option<Vec<CallHierarchyIncomingCall>>> {
let specifier = self
.url_map
- .normalize_url(&params.item.uri, LspUrlKind::File);
+ .uri_to_specifier(&params.item.uri, LspUrlKind::File);
if !self.is_diagnosable(&specifier)
|| !self.config.specifier_enabled(&specifier)
{
@@ -2525,7 +2528,7 @@ impl Inner {
) -> LspResult<Option<Vec<CallHierarchyOutgoingCall>>> {
let specifier = self
.url_map
- .normalize_url(&params.item.uri, LspUrlKind::File);
+ .uri_to_specifier(&params.item.uri, LspUrlKind::File);
if !self.is_diagnosable(&specifier)
|| !self.config.specifier_enabled(&specifier)
{
@@ -2570,7 +2573,7 @@ impl Inner {
&self,
params: CallHierarchyPrepareParams,
) -> LspResult<Option<Vec<CallHierarchyItem>>> {
- let specifier = self.url_map.normalize_url(
+ let specifier = self.url_map.uri_to_specifier(
&params.text_document_position_params.text_document.uri,
LspUrlKind::File,
);
@@ -2634,7 +2637,7 @@ impl Inner {
&self,
params: RenameParams,
) -> LspResult<Option<WorkspaceEdit>> {
- let specifier = self.url_map.normalize_url(
+ let specifier = self.url_map.uri_to_specifier(
&params.text_document_position.text_document.uri,
LspUrlKind::File,
);
@@ -2683,7 +2686,7 @@ impl Inner {
) -> LspResult<Option<Vec<SelectionRange>>> {
let specifier = self
.url_map
- .normalize_url(&params.text_document.uri, LspUrlKind::File);
+ .uri_to_specifier(&params.text_document.uri, LspUrlKind::File);
if !self.is_diagnosable(&specifier)
|| !self.config.specifier_enabled(&specifier)
{
@@ -2721,7 +2724,7 @@ impl Inner {
) -> LspResult<Option<SemanticTokensResult>> {
let specifier = self
.url_map
- .normalize_url(&params.text_document.uri, LspUrlKind::File);
+ .uri_to_specifier(&params.text_document.uri, LspUrlKind::File);
if !self.is_diagnosable(&specifier) {
return Ok(None);
}
@@ -2774,7 +2777,7 @@ impl Inner {
) -> LspResult<Option<SemanticTokensRangeResult>> {
let specifier = self
.url_map
- .normalize_url(&params.text_document.uri, LspUrlKind::File);
+ .uri_to_specifier(&params.text_document.uri, LspUrlKind::File);
if !self.is_diagnosable(&specifier) {
return Ok(None);
}
@@ -2823,7 +2826,7 @@ impl Inner {
&self,
params: SignatureHelpParams,
) -> LspResult<Option<SignatureHelp>> {
- let specifier = self.url_map.normalize_url(
+ let specifier = self.url_map.uri_to_specifier(
&params.text_document_position_params.text_document.uri,
LspUrlKind::File,
);
@@ -2877,8 +2880,8 @@ impl Inner {
) -> LspResult<Option<WorkspaceEdit>> {
let mut changes = vec![];
for rename in params.files {
- let old_specifier = self.url_map.normalize_url(
- &url_to_uri(&resolve_url(&rename.old_uri).unwrap()),
+ let old_specifier = self.url_map.uri_to_specifier(
+ &Uri::from_str(&rename.old_uri).unwrap(),
LspUrlKind::File,
);
let options = self
@@ -2903,8 +2906,8 @@ impl Inner {
.get_edits_for_file_rename(
self.snapshot(),
old_specifier,
- self.url_map.normalize_url(
- &url_to_uri(&resolve_url(&rename.new_uri).unwrap()),
+ self.url_map.uri_to_specifier(
+ &Uri::from_str(&rename.new_uri).unwrap(),
LspUrlKind::File,
),
format_code_settings,
@@ -3503,22 +3506,28 @@ impl Inner {
let mut config_events = vec![];
for (scope_url, config_data) in self.config.tree.data_by_scope().iter() {
- let scope_uri = url_to_uri(scope_url);
+ let Ok(scope_uri) = url_to_uri(scope_url) else {
+ continue;
+ };
if let Some(config_file) = config_data.maybe_deno_json() {
- config_events.push(lsp_custom::DenoConfigurationChangeEvent {
- scope_uri: scope_uri.clone(),
- file_uri: url_to_uri(&config_file.specifier),
- typ: lsp_custom::DenoConfigurationChangeType::Added,
- configuration_type: lsp_custom::DenoConfigurationType::DenoJson,
- });
+ if let Ok(file_uri) = url_to_uri(&config_file.specifier) {
+ config_events.push(lsp_custom::DenoConfigurationChangeEvent {
+ scope_uri: scope_uri.clone(),
+ file_uri,
+ typ: lsp_custom::DenoConfigurationChangeType::Added,
+ configuration_type: lsp_custom::DenoConfigurationType::DenoJson,
+ });
+ }
}
if let Some(package_json) = config_data.maybe_pkg_json() {
- config_events.push(lsp_custom::DenoConfigurationChangeEvent {
- scope_uri,
- file_uri: url_to_uri(&package_json.specifier()),
- typ: lsp_custom::DenoConfigurationChangeType::Added,
- configuration_type: lsp_custom::DenoConfigurationType::PackageJson,
- });
+ if let Ok(file_uri) = url_to_uri(&package_json.specifier()) {
+ config_events.push(lsp_custom::DenoConfigurationChangeEvent {
+ scope_uri,
+ file_uri,
+ typ: lsp_custom::DenoConfigurationChangeType::Added,
+ configuration_type: lsp_custom::DenoConfigurationType::PackageJson,
+ });
+ }
}
}
if !config_events.is_empty() {
@@ -3648,7 +3657,9 @@ impl Inner {
.into_iter()
.map(|folder| {
(
- self.url_map.normalize_url(&folder.uri, LspUrlKind::Folder),
+ self
+ .url_map
+ .uri_to_specifier(&folder.uri, LspUrlKind::Folder),
folder,
)
})
@@ -3724,7 +3735,8 @@ impl Inner {
result.push(TaskDefinition {
name: name.clone(),
command: command.to_string(),
- source_uri: url_to_uri(&config_file.specifier),
+ source_uri: url_to_uri(&config_file.specifier)
+ .map_err(|_| LspError::internal_error())?,
});
}
};
@@ -3735,7 +3747,8 @@ impl Inner {
result.push(TaskDefinition {
name: name.clone(),
command: command.clone(),
- source_uri: url_to_uri(&package_json.specifier()),
+ source_uri: url_to_uri(&package_json.specifier())
+ .map_err(|_| LspError::internal_error())?,
});
}
}
@@ -3750,7 +3763,7 @@ impl Inner {
) -> LspResult<Option<Vec<InlayHint>>> {
let specifier = self
.url_map
- .normalize_url(&params.text_document.uri, LspUrlKind::File);
+ .uri_to_specifier(&params.text_document.uri, LspUrlKind::File);
if !self.is_diagnosable(&specifier)
|| !self.config.specifier_enabled(&specifier)
|| !self.config.enabled_inlay_hints_for_specifier(&specifier)
@@ -3813,7 +3826,7 @@ impl Inner {
.mark_with_args("lsp.virtual_text_document", &params);
let specifier = self
.url_map
- .normalize_url(&params.text_document.uri, LspUrlKind::File);
+ .uri_to_specifier(&params.text_document.uri, LspUrlKind::File);
let contents = if specifier.scheme() == "deno"
&& specifier.path() == "/status.md"
{