Skip to content

Commit 62e08fa

Browse files
committed
Better label for macros completion
1 parent 44e6c2c commit 62e08fa

File tree

5 files changed

+59
-48
lines changed

5 files changed

+59
-48
lines changed

crates/ra_ide/src/completion/complete_macro_in_item_position.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ mod tests {
4141
@r###"
4242
[
4343
CompletionItem {
44-
label: "foo!",
44+
label: "foo!(…)",
4545
source_range: [46; 46),
4646
delete: [46; 46),
4747
insert: "foo!($0)",
@@ -81,7 +81,7 @@ mod tests {
8181
@r###"
8282
[
8383
CompletionItem {
84-
label: "vec!",
84+
label: "vec![…]",
8585
source_range: [280; 280),
8686
delete: [280; 280),
8787
insert: "vec![$0]",
@@ -118,7 +118,7 @@ mod tests {
118118
@r###"
119119
[
120120
CompletionItem {
121-
label: "foo!",
121+
label: "foo! {…}",
122122
source_range: [163; 163),
123123
delete: [163; 163),
124124
insert: "foo! {$0}",

crates/ra_ide/src/completion/complete_pattern.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ mod tests {
125125
kind: Enum,
126126
},
127127
CompletionItem {
128-
label: "m!",
128+
label: "m!(…)",
129129
source_range: [151; 151),
130130
delete: [151; 151),
131131
insert: "m!($0)",

crates/ra_ide/src/completion/complete_qualified_path.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -869,7 +869,7 @@ mod tests {
869869
@r###"
870870
[
871871
CompletionItem {
872-
label: "foo!",
872+
label: "foo!(…)",
873873
source_range: [179; 179),
874874
delete: [179; 179),
875875
insert: "foo!($0)",

crates/ra_ide/src/completion/complete_unqualified_path.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -733,23 +733,23 @@ mod tests {
733733
@r###"
734734
[
735735
CompletionItem {
736-
label: "bar!",
736+
label: "bar!(…)",
737737
source_range: [252; 252),
738738
delete: [252; 252),
739739
insert: "bar!($0)",
740740
kind: Macro,
741741
detail: "macro_rules! bar",
742742
},
743743
CompletionItem {
744-
label: "baz!",
744+
label: "baz!(…)",
745745
source_range: [252; 252),
746746
delete: [252; 252),
747747
insert: "baz!($0)",
748748
kind: Macro,
749749
detail: "#[macro_export]\nmacro_rules! baz",
750750
},
751751
CompletionItem {
752-
label: "foo!",
752+
label: "foo!(…)",
753753
source_range: [252; 252),
754754
delete: [252; 252),
755755
insert: "foo!($0)",
@@ -802,7 +802,7 @@ mod tests {
802802
@r###"
803803
[
804804
CompletionItem {
805-
label: "foo!",
805+
label: "foo!(…)",
806806
source_range: [49; 49),
807807
delete: [49; 49),
808808
insert: "foo!($0)",
@@ -841,7 +841,7 @@ mod tests {
841841
@r###"
842842
[
843843
CompletionItem {
844-
label: "foo!",
844+
label: "foo!(…)",
845845
source_range: [57; 57),
846846
delete: [57; 57),
847847
insert: "foo!($0)",
@@ -880,7 +880,7 @@ mod tests {
880880
@r###"
881881
[
882882
CompletionItem {
883-
label: "foo!",
883+
label: "foo!(…)",
884884
source_range: [50; 50),
885885
delete: [50; 50),
886886
insert: "foo!($0)",
@@ -953,7 +953,7 @@ mod tests {
953953
@r###"
954954
[
955955
CompletionItem {
956-
label: "m!",
956+
label: "m!(…)",
957957
source_range: [145; 145),
958958
delete: [145; 145),
959959
insert: "m!($0)",
@@ -1006,7 +1006,7 @@ mod tests {
10061006
@r###"
10071007
[
10081008
CompletionItem {
1009-
label: "m!",
1009+
label: "m!(…)",
10101010
source_range: [145; 146),
10111011
delete: [145; 146),
10121012
insert: "m!($0)",
@@ -1059,7 +1059,7 @@ mod tests {
10591059
@r###"
10601060
[
10611061
CompletionItem {
1062-
label: "m!",
1062+
label: "m!(…)",
10631063
source_range: [145; 146),
10641064
delete: [145; 146),
10651065
insert: "m!($0)",

crates/ra_ide/src/completion/presentation.rs

Lines changed: 45 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -133,29 +133,6 @@ impl Completions {
133133
completion_item.kind(kind).set_documentation(docs).add_to(self)
134134
}
135135

136-
fn guess_macro_braces(&self, macro_name: &str, docs: &str) -> &'static str {
137-
let mut votes = [0, 0, 0];
138-
for (idx, s) in docs.match_indices(&macro_name) {
139-
let (before, after) = (&docs[..idx], &docs[idx + s.len()..]);
140-
// Ensure to match the full word
141-
if after.starts_with('!')
142-
&& !before.ends_with(|c: char| c == '_' || c.is_ascii_alphanumeric())
143-
{
144-
// It may have spaces before the braces like `foo! {}`
145-
match after[1..].chars().find(|&c| !c.is_whitespace()) {
146-
Some('{') => votes[0] += 1,
147-
Some('[') => votes[1] += 1,
148-
Some('(') => votes[2] += 1,
149-
_ => {}
150-
}
151-
}
152-
}
153-
154-
// Insert a space before `{}`.
155-
// We prefer the last one when some votes equal.
156-
*votes.iter().zip(&[" {$0}", "[$0]", "($0)"]).max_by_key(|&(&vote, _)| vote).unwrap().1
157-
}
158-
159136
pub(crate) fn add_macro(
160137
&mut self,
161138
ctx: &CompletionContext,
@@ -177,21 +154,27 @@ impl Completions {
177154
let detail = macro_label(&ast_node);
178155

179156
let docs = macro_.docs(ctx.db);
180-
let macro_declaration = format!("{}!", name);
181157

182-
let mut builder =
183-
CompletionItem::new(CompletionKind::Reference, ctx.source_range(), &macro_declaration)
184-
.kind(CompletionItemKind::Macro)
185-
.set_documentation(docs.clone())
186-
.set_deprecated(is_deprecated(macro_, ctx.db))
187-
.detail(detail);
158+
let mut builder = CompletionItem::new(
159+
CompletionKind::Reference,
160+
ctx.source_range(),
161+
&format!("{}!", name),
162+
)
163+
.kind(CompletionItemKind::Macro)
164+
.set_documentation(docs.clone())
165+
.set_deprecated(is_deprecated(macro_, ctx.db))
166+
.detail(detail);
188167

168+
let needs_bang = ctx.use_item_syntax.is_none() && !ctx.is_macro_call;
189169
builder = match ctx.config.snippet_cap {
190-
Some(cap) if ctx.use_item_syntax.is_none() && !ctx.is_macro_call => {
191-
let macro_braces_to_insert =
192-
self.guess_macro_braces(&name, docs.as_ref().map_or("", |s| s.as_str()));
193-
builder.insert_snippet(cap, macro_declaration + macro_braces_to_insert)
170+
Some(cap) if needs_bang => {
171+
let docs = docs.as_ref().map_or("", |s| s.as_str());
172+
let (bra, ket) = guess_macro_braces(&name, docs);
173+
builder
174+
.insert_snippet(cap, format!("{}!{}$0{}", name, bra, ket))
175+
.label(format!("{}!{}…{}", name, bra, ket))
194176
}
177+
None if needs_bang => builder.insert_text(format!("{}!", name)),
195178
_ => {
196179
tested_by!(dont_insert_macro_call_parens_unncessary);
197180
builder.insert_text(name)
@@ -404,6 +387,34 @@ fn is_deprecated(node: impl HasAttrs, db: &RootDatabase) -> bool {
404387
node.attrs(db).by_key("deprecated").exists()
405388
}
406389

390+
fn guess_macro_braces(macro_name: &str, docs: &str) -> (&'static str, &'static str) {
391+
let mut votes = [0, 0, 0];
392+
for (idx, s) in docs.match_indices(&macro_name) {
393+
let (before, after) = (&docs[..idx], &docs[idx + s.len()..]);
394+
// Ensure to match the full word
395+
if after.starts_with('!')
396+
&& !before.ends_with(|c: char| c == '_' || c.is_ascii_alphanumeric())
397+
{
398+
// It may have spaces before the braces like `foo! {}`
399+
match after[1..].chars().find(|&c| !c.is_whitespace()) {
400+
Some('{') => votes[0] += 1,
401+
Some('[') => votes[1] += 1,
402+
Some('(') => votes[2] += 1,
403+
_ => {}
404+
}
405+
}
406+
}
407+
408+
// Insert a space before `{}`.
409+
// We prefer the last one when some votes equal.
410+
let (_vote, (bra, ket)) = votes
411+
.iter()
412+
.zip(&[(" {", "}"), ("[", "]"), ("(", ")")])
413+
.max_by_key(|&(&vote, _)| vote)
414+
.unwrap();
415+
(*bra, *ket)
416+
}
417+
407418
#[cfg(test)]
408419
mod tests {
409420
use insta::assert_debug_snapshot;

0 commit comments

Comments
 (0)