diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index c70c06766b..7dbb1a7c1b 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -5051,27 +5051,19 @@ impl Editor { let snippet; let new_text; if completion.is_snippet() { - // lsp returns function definition with placeholders in "new_text" - // when configured from language server, even when renaming a function - // - // in such cases, we use the label instead - // https://github.com/zed-industries/zed/issues/29982 - let snippet_source = completion - .label() - .filter(|label| { - completion.kind() == Some(CompletionItemKind::FUNCTION) - && label != &completion.new_text - }) - .and_then(|label| { - let cursor_offset = newest_anchor.head().to_offset(&snapshot); - let next_char_is_not_whitespace = snapshot - .chars_at(cursor_offset) - .next() - .map_or(true, |ch| !ch.is_whitespace()); - next_char_is_not_whitespace.then_some(label) - }) - .unwrap_or(completion.new_text.clone()); - + let mut snippet_source = completion.new_text.clone(); + if let Some(scope) = snapshot.language_scope_at(newest_anchor.head()) { + if scope.prefers_label_for_snippet_in_completion() { + if let Some(label) = completion.label() { + if matches!( + completion.kind(), + Some(CompletionItemKind::FUNCTION) | Some(CompletionItemKind::METHOD) + ) { + snippet_source = label; + } + } + } + } snippet = Some(Snippet::parse(&snippet_source).log_err()?); new_text = snippet.as_ref().unwrap().text.clone(); } else { diff --git a/crates/language/src/language.rs b/crates/language/src/language.rs index 3f741b9ecd..1c6c686709 100644 --- a/crates/language/src/language.rs +++ b/crates/language/src/language.rs @@ -828,6 +828,8 @@ pub struct LanguageConfigOverride { pub completion_query_characters: Override>, #[serde(default)] pub opt_into_language_servers: Vec, + #[serde(default)] + pub prefer_label_for_snippet: Option, } #[derive(Clone, Deserialize, Debug, Serialize, JsonSchema)] @@ -1788,6 +1790,18 @@ impl LanguageScope { ) } + /// Returns whether to prefer snippet `label` over `new_text` to replace text when + /// completion is accepted. + /// + /// In cases like when cursor is in string or renaming existing function, + /// you don't want to expand function signature instead just want function name + /// to replace existing one. + pub fn prefers_label_for_snippet_in_completion(&self) -> bool { + self.config_override() + .and_then(|o| o.prefer_label_for_snippet) + .unwrap_or(false) + } + /// Returns a list of bracket pairs for a given language with an additional /// piece of information about whether the particular bracket pair is currently active for a given language. pub fn brackets(&self) -> impl Iterator { diff --git a/crates/languages/src/tsx/config.toml b/crates/languages/src/tsx/config.toml index 8bdf0b5138..2c9fccc5b2 100644 --- a/crates/languages/src/tsx/config.toml +++ b/crates/languages/src/tsx/config.toml @@ -34,3 +34,7 @@ opt_into_language_servers = ["emmet-language-server"] [overrides.string] completion_query_characters = ["-", "."] opt_into_language_servers = ["tailwindcss-language-server"] +prefer_label_for_snippet = true + +[overrides.call_expression] +prefer_label_for_snippet = true diff --git a/crates/languages/src/tsx/overrides.scm b/crates/languages/src/tsx/overrides.scm index d93c8b5aea..7af776306c 100644 --- a/crates/languages/src/tsx/overrides.scm +++ b/crates/languages/src/tsx/overrides.scm @@ -13,3 +13,5 @@ (jsx_self_closing_element) (jsx_expression) ] @default + +(_ value: (call_expression) @call_expression) diff --git a/crates/languages/src/typescript/config.toml b/crates/languages/src/typescript/config.toml index 29d71e94a1..8aff96104c 100644 --- a/crates/languages/src/typescript/config.toml +++ b/crates/languages/src/typescript/config.toml @@ -21,3 +21,7 @@ debuggers = ["JavaScript"] [overrides.string] completion_query_characters = ["."] +prefer_label_for_snippet = true + +[overrides.call_expression] +prefer_label_for_snippet = true diff --git a/crates/languages/src/typescript/overrides.scm b/crates/languages/src/typescript/overrides.scm index 81fec9a5f5..86cb0e19fb 100644 --- a/crates/languages/src/typescript/overrides.scm +++ b/crates/languages/src/typescript/overrides.scm @@ -1,2 +1,4 @@ (comment) @comment.inclusive (string) @string + +(_ value: (call_expression) @call_expression)