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.rs227
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 {
&params.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,
- &params.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,
+ &params.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) = &params.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 = &params.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(&params.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| {