diff options
Diffstat (limited to 'cli/lsp/language_server.rs')
-rw-r--r-- | cli/lsp/language_server.rs | 227 |
1 files changed, 108 insertions, 119 deletions
diff --git a/cli/lsp/language_server.rs b/cli/lsp/language_server.rs index c415cf45b..c72239aa7 100644 --- a/cli/lsp/language_server.rs +++ b/cli/lsp/language_server.rs @@ -45,6 +45,7 @@ use super::code_lens; use super::completions; use super::config::Config; use super::config::ConfigSnapshot; +use super::config::UpdateImportsOnFileMoveEnabled; use super::config::WorkspaceSettings; use super::config::SETTINGS_SECTION; use super::diagnostics; @@ -1933,13 +1934,11 @@ impl Inner { ..line_index.offset_tsc(diagnostic.range.end)?, codes, (&self.fmt_options.options).into(), - tsc::UserPreferences { - quote_preference: Some((&self.fmt_options.options).into()), - ..tsc::UserPreferences::from_workspace_settings_for_specifier( - self.config.workspace_settings(), - &specifier, - ) - }, + tsc::UserPreferences::from_config_for_specifier( + &self.config, + &self.fmt_options.options, + &specifier, + ), ) .await; for action in actions { @@ -2024,13 +2023,11 @@ impl Inner { specifier.clone(), line_index.offset_tsc(params.range.start)? ..line_index.offset_tsc(params.range.end)?, - Some(tsc::UserPreferences { - quote_preference: Some((&self.fmt_options.options).into()), - ..tsc::UserPreferences::from_workspace_settings_for_specifier( - self.config.workspace_settings(), - &specifier, - ) - }), + Some(tsc::UserPreferences::from_config_for_specifier( + &self.config, + &self.fmt_options.options, + &specifier, + )), only, ) .await?; @@ -2086,13 +2083,11 @@ impl Inner { self.snapshot(), &code_action_data, (&self.fmt_options.options).into(), - tsc::UserPreferences { - quote_preference: Some((&self.fmt_options.options).into()), - ..tsc::UserPreferences::from_workspace_settings_for_specifier( - self.config.workspace_settings(), - &code_action_data.specifier, - ) - }, + tsc::UserPreferences::from_config_for_specifier( + &self.config, + &self.fmt_options.options, + &code_action_data.specifier, + ), ) .await?; if combined_code_actions.commands.is_some() { @@ -2138,13 +2133,11 @@ impl Inner { ..line_index.offset_tsc(action_data.range.end)?, action_data.refactor_name, action_data.action_name, - Some(tsc::UserPreferences { - quote_preference: Some((&self.fmt_options.options).into()), - ..tsc::UserPreferences::from_workspace_settings_for_specifier( - self.config.workspace_settings(), - &action_data.specifier, - ) - }), + Some(tsc::UserPreferences::from_config_for_specifier( + &self.config, + &self.fmt_options.options, + &action_data.specifier, + )), ) .await?; code_action.edit = refactor_edit_info.to_workspace_edit(self).await?; @@ -2413,8 +2406,13 @@ impl Inner { ¶ms.text_document_position.text_document.uri, LspUrlKind::File, ); + let language_settings = self + .config + .workspace_settings() + .language_settings_for_specifier(&specifier); if !self.is_diagnosable(&specifier) || !self.config.specifier_enabled(&specifier) + || !language_settings.map(|s| s.suggest.enabled).unwrap_or(true) { return Ok(None); } @@ -2425,20 +2423,24 @@ impl Inner { // completions, we will use internal logic and if there are completions // for imports, we will return those and not send a message into tsc, where // other completions come from. - let response = if let Some(response) = completions::get_import_completions( - &specifier, - ¶ms.text_document_position.position, - &self.config.snapshot(), - &self.client, - &self.module_registries, - &self.npm.search_api, - &self.documents, - self.maybe_import_map.clone(), - ) - .await + let mut response = None; + if language_settings + .map(|s| s.suggest.include_completions_for_import_statements) + .unwrap_or(true) { - Some(response) - } else { + response = completions::get_import_completions( + &specifier, + ¶ms.text_document_position.position, + &self.config.snapshot(), + &self.client, + &self.module_registries, + &self.npm.search_api, + &self.documents, + self.maybe_import_map.clone(), + ) + .await; + } + if response.is_none() { let line_index = asset_or_doc.line_index(); let (trigger_character, trigger_kind) = if let Some(context) = ¶ms.context { @@ -2451,7 +2453,6 @@ impl Inner { }; let position = line_index.offset_tsc(params.text_document_position.position)?; - let use_snippets = self.config.client_capabilities.snippet_support; let maybe_completion_info = self .ts_server .get_completions( @@ -2459,38 +2460,11 @@ impl Inner { specifier.clone(), position, tsc::GetCompletionsAtPositionOptions { - user_preferences: tsc::UserPreferences { - quote_preference: Some((&self.fmt_options.options).into()), - allow_incomplete_completions: Some(true), - allow_text_changes_in_new_files: Some( - specifier.scheme() == "file", - ), - import_module_specifier_ending: Some( - tsc::ImportModuleSpecifierEnding::Index, - ), - include_automatic_optional_chain_completions: Some(true), - include_completions_for_import_statements: Some(true), - include_completions_for_module_exports: self - .config - .workspace_settings() - .language_settings_for_specifier(&specifier) - .map(|s| s.suggest.auto_imports), - include_completions_with_object_literal_method_snippets: Some( - use_snippets, - ), - include_completions_with_class_member_snippets: Some( - use_snippets, - ), - include_completions_with_insert_text: Some(true), - include_completions_with_snippet_text: Some(use_snippets), - jsx_attribute_completion_style: Some( - tsc::JsxAttributeCompletionStyle::Auto, - ), - provide_prefix_and_suffix_text_for_rename: Some(true), - provide_refactor_not_applicable_reason: Some(true), - use_label_details_in_completion_entries: Some(true), - ..Default::default() - }, + user_preferences: tsc::UserPreferences::from_config_for_specifier( + &self.config, + &self.fmt_options.options, + &specifier, + ), trigger_character, trigger_kind, }, @@ -2499,22 +2473,21 @@ impl Inner { .await; if let Some(completions) = maybe_completion_info { - let results = completions.as_completion_response( - line_index, - &self - .config - .workspace_settings() - .language_settings_for_specifier(&specifier) - .cloned() - .unwrap_or_default() - .suggest, - &specifier, - position, - self, + response = Some( + completions.as_completion_response( + line_index, + &self + .config + .workspace_settings() + .language_settings_for_specifier(&specifier) + .cloned() + .unwrap_or_default() + .suggest, + &specifier, + position, + self, + ), ); - Some(results) - } else { - None } }; self.performance.measure(mark); @@ -2536,17 +2509,22 @@ impl Inner { })?; if let Some(data) = &data.tsc { let specifier = &data.specifier; - let mut args = GetCompletionDetailsArgs { - format_code_settings: Some((&self.fmt_options.options).into()), - ..data.into() - }; - args - .preferences - .get_or_insert(Default::default()) - .quote_preference = Some((&self.fmt_options.options).into()); let result = self .ts_server - .get_completion_details(self.snapshot(), args) + .get_completion_details( + self.snapshot(), + GetCompletionDetailsArgs { + format_code_settings: Some((&self.fmt_options.options).into()), + preferences: Some( + tsc::UserPreferences::from_config_for_specifier( + &self.config, + &self.fmt_options.options, + specifier, + ), + ), + ..data.into() + }, + ) .await; match result { Ok(maybe_completion_info) => { @@ -3029,15 +3007,27 @@ impl Inner { ) -> LspResult<Option<WorkspaceEdit>> { let mut changes = vec![]; for rename in params.files { + let old_specifier = self.url_map.normalize_url( + &resolve_url(&rename.old_uri).unwrap(), + LspUrlKind::File, + ); + let options = self + .config + .workspace_settings() + .language_settings_for_specifier(&old_specifier) + .map(|s| s.update_imports_on_file_move.clone()) + .unwrap_or_default(); + // Note that `Always` and `Prompt` are treated the same in the server, the + // client will worry about that after receiving the edits. + if options.enabled == UpdateImportsOnFileMoveEnabled::Never { + continue; + } changes.extend( self .ts_server .get_edits_for_file_rename( self.snapshot(), - self.url_map.normalize_url( - &resolve_url(&rename.old_uri).unwrap(), - LspUrlKind::File, - ), + old_specifier, self.url_map.normalize_url( &resolve_url(&rename.new_uri).unwrap(), LspUrlKind::File, @@ -3300,20 +3290,19 @@ impl tower_lsp::LanguageServer for LanguageServer { async fn did_save(&self, params: DidSaveTextDocumentParams) { let uri = ¶ms.text_document.uri; - let Ok(path) = specifier_to_file_path(uri) else { - return; - }; - if !is_importable_ext(&path) { - return; - } { let inner = self.0.read().await; + let specifier = inner.url_map.normalize_url(uri, LspUrlKind::File); if !inner.config.workspace_settings().cache_on_save - || !inner.config.specifier_enabled(uri) - || !inner.diagnostics_state.has_no_cache_diagnostics(uri) + || !inner.config.specifier_enabled(&specifier) + || !inner.diagnostics_state.has_no_cache_diagnostics(&specifier) { return; } + match specifier_to_file_path(&specifier) { + Ok(path) if is_importable_ext(&path) => {} + _ => return, + } } if let Err(err) = self .cache_request(Some( @@ -3677,10 +3666,12 @@ impl Inner { let specifier = self .url_map .normalize_url(¶ms.text_document.uri, LspUrlKind::File); - let workspace_settings = self.config.workspace_settings(); if !self.is_diagnosable(&specifier) || !self.config.specifier_enabled(&specifier) - || !workspace_settings.enabled_inlay_hints(&specifier) + || !self + .config + .workspace_settings() + .enabled_inlay_hints(&specifier) { return Ok(None); } @@ -3701,13 +3692,11 @@ impl Inner { self.snapshot(), specifier.clone(), text_span, - tsc::UserPreferences { - quote_preference: Some((&self.fmt_options.options).into()), - ..tsc::UserPreferences::from_workspace_settings_for_specifier( - workspace_settings, - &specifier, - ) - }, + tsc::UserPreferences::from_config_for_specifier( + &self.config, + &self.fmt_options.options, + &specifier, + ), ) .await?; let maybe_inlay_hints = maybe_inlay_hints.map(|hints| { |