summaryrefslogtreecommitdiff
path: root/cli/lsp/language_server.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/lsp/language_server.rs')
-rw-r--r--cli/lsp/language_server.rs99
1 files changed, 70 insertions, 29 deletions
diff --git a/cli/lsp/language_server.rs b/cli/lsp/language_server.rs
index fa613f696..838ca2725 100644
--- a/cli/lsp/language_server.rs
+++ b/cli/lsp/language_server.rs
@@ -30,7 +30,9 @@ use crate::import_map::ImportMap;
use crate::tsc_config::parse_config;
use crate::tsc_config::TsConfig;
+use super::analysis::ts_changes_to_edit;
use super::analysis::CodeActionCollection;
+use super::analysis::CodeActionData;
use super::analysis::CodeLensData;
use super::analysis::CodeLensSource;
use super::capabilities;
@@ -945,35 +947,7 @@ impl Inner {
diagnostic,
&file_diagnostics,
) {
- let req = tsc::RequestMethod::GetCombinedCodeFix((
- specifier.clone(),
- json!(action.fix_id.clone().unwrap()),
- ));
- let res =
- self.ts_server.request(self.snapshot(), req).await.map_err(
- |err| {
- error!("Unable to get combined fix from TypeScript: {}", err);
- LspError::internal_error()
- },
- )?;
- let combined_code_actions: tsc::CombinedCodeActions = from_value(res)
- .map_err(|err| {
- error!("Cannot decode combined actions from TypeScript: {}", err);
- LspError::internal_error()
- })?;
- code_actions
- .add_ts_fix_all_action(
- &action,
- diagnostic,
- &combined_code_actions,
- &|s| self.get_line_index(s),
- &|s| self.documents.version(&s),
- )
- .await
- .map_err(|err| {
- error!("Unable to add fix all: {}", err);
- LspError::internal_error()
- })?;
+ code_actions.add_ts_fix_all_action(&action, &specifier, diagnostic);
}
}
}
@@ -983,6 +957,59 @@ impl Inner {
Ok(Some(code_action_response))
}
+ async fn code_action_resolve(
+ &self,
+ params: CodeAction,
+ ) -> LspResult<CodeAction> {
+ let mark = self.performance.mark("code_action_resolve");
+ let result =
+ if let Some(data) = params.data.clone() {
+ let code_action_data: CodeActionData =
+ from_value(data).map_err(|err| {
+ error!("Unable to decode code action data: {}", err);
+ LspError::invalid_params("The CodeAction's data is invalid.")
+ })?;
+ let req = tsc::RequestMethod::GetCombinedCodeFix((
+ code_action_data.specifier,
+ json!(code_action_data.fix_id.clone()),
+ ));
+ let res = self.ts_server.request(self.snapshot(), req).await.map_err(
+ |err| {
+ error!("Unable to get combined fix from TypeScript: {}", err);
+ LspError::internal_error()
+ },
+ )?;
+ let combined_code_actions: tsc::CombinedCodeActions =
+ from_value(res).map_err(|err| {
+ error!("Cannot decode combined actions from TypeScript: {}", err);
+ LspError::internal_error()
+ })?;
+ if combined_code_actions.commands.is_some() {
+ error!("Deno does not support code actions with commands.");
+ Err(LspError::invalid_request())
+ } else {
+ let mut code_action = params.clone();
+ code_action.edit = ts_changes_to_edit(
+ &combined_code_actions.changes,
+ &|s| self.get_line_index(s),
+ &|s| self.documents.version(&s),
+ )
+ .await
+ .map_err(|err| {
+ error!("Unable to convert changes to edits: {}", err);
+ LspError::internal_error()
+ })?;
+ Ok(code_action)
+ }
+ } else {
+ Err(LspError::invalid_params(
+ "The CodeAction's data is missing.",
+ ))
+ };
+ self.performance.measure(mark);
+ result
+ }
+
async fn code_lens(
&mut self,
params: CodeLensParams,
@@ -1610,6 +1637,13 @@ impl lspower::LanguageServer for LanguageServer {
self.0.lock().await.code_action(params).await
}
+ async fn code_action_resolve(
+ &self,
+ params: CodeAction,
+ ) -> LspResult<CodeAction> {
+ self.0.lock().await.code_action_resolve(params).await
+ }
+
async fn code_lens(
&self,
params: CodeLensParams,
@@ -2320,6 +2354,13 @@ mod tests {
LspResponse::RequestFixture(2, "code_action_response.json".to_string()),
),
(
+ "code_action_resolve_request.json",
+ LspResponse::RequestFixture(
+ 4,
+ "code_action_resolve_request_response.json".to_string(),
+ ),
+ ),
+ (
"shutdown_request.json",
LspResponse::Request(3, json!(null)),
),