if completion does auto-insertion, indicate this in the label

This commit is contained in:
Aleksey Kladov 2019-10-10 13:03:20 +03:00
parent 793f7e69f2
commit 31561b118f
5 changed files with 562 additions and 475 deletions

View file

@ -119,27 +119,28 @@ mod tests {
", ",
), ),
@r###" @r###"
[ [
CompletionItem { CompletionItem {
label: "foo", label: "foo(…)",
source_range: [187; 187), source_range: [187; 187),
delete: [187; 187), delete: [187; 187),
insert: "foo()$0", insert: "foo()$0",
kind: Method, kind: Method,
detail: "fn foo(self)", lookup: "foo",
}, detail: "fn foo(self)",
CompletionItem { },
label: "the_field", CompletionItem {
source_range: [187; 187), label: "the_field",
delete: [187; 187), source_range: [187; 187),
insert: "the_field", delete: [187; 187),
kind: Field, insert: "the_field",
detail: "(u32,)", kind: Field,
documentation: Documentation( detail: "(u32,)",
"This is the_field", documentation: Documentation(
), "This is the_field",
}, ),
] },
]
"### "###
); );
} }
@ -158,24 +159,25 @@ mod tests {
", ",
), ),
@r###" @r###"
[ [
CompletionItem { CompletionItem {
label: "foo", label: "foo(…)",
source_range: [126; 126), source_range: [126; 126),
delete: [126; 126), delete: [126; 126),
insert: "foo()$0", insert: "foo()$0",
kind: Method, kind: Method,
detail: "fn foo(&self)", lookup: "foo",
}, detail: "fn foo(&self)",
CompletionItem { },
label: "the_field", CompletionItem {
source_range: [126; 126), label: "the_field",
delete: [126; 126), source_range: [126; 126),
insert: "the_field", delete: [126; 126),
kind: Field, insert: "the_field",
detail: "(u32, i32)", kind: Field,
}, detail: "(u32, i32)",
] },
]
"### "###
); );
} }
@ -210,16 +212,17 @@ mod tests {
", ",
), ),
@r###" @r###"
[ [
CompletionItem { CompletionItem {
label: "the_method", label: "the_method(…)",
source_range: [144; 144), source_range: [144; 144),
delete: [144; 144), delete: [144; 144),
insert: "the_method()$0", insert: "the_method()$0",
kind: Method, kind: Method,
detail: "fn the_method(&self)", lookup: "the_method",
}, detail: "fn the_method(&self)",
] },
]
"### "###
); );
} }
@ -238,16 +241,17 @@ mod tests {
", ",
), ),
@r###" @r###"
[ [
CompletionItem { CompletionItem {
label: "the_method", label: "the_method(…)",
source_range: [151; 151), source_range: [151; 151),
delete: [151; 151), delete: [151; 151),
insert: "the_method()$0", insert: "the_method()$0",
kind: Method, kind: Method,
detail: "fn the_method(&self)", lookup: "the_method",
}, detail: "fn the_method(&self)",
] },
]
"### "###
); );
} }
@ -266,16 +270,17 @@ mod tests {
", ",
), ),
@r###" @r###"
[ [
CompletionItem { CompletionItem {
label: "the_method", label: "the_method(…)",
source_range: [155; 155), source_range: [155; 155),
delete: [155; 155), delete: [155; 155),
insert: "the_method()$0", insert: "the_method()$0",
kind: Method, kind: Method,
detail: "fn the_method(&self)", lookup: "the_method",
}, detail: "fn the_method(&self)",
] },
]
"### "###
); );
} }
@ -317,16 +322,17 @@ mod tests {
", ",
), ),
@r###" @r###"
[ [
CompletionItem { CompletionItem {
label: "the_method", label: "the_method(…)",
source_range: [249; 249), source_range: [249; 249),
delete: [249; 249), delete: [249; 249),
insert: "the_method()$0", insert: "the_method()$0",
kind: Method, kind: Method,
detail: "fn the_method(&self)", lookup: "the_method",
}, detail: "fn the_method(&self)",
] },
]
"### "###
); );
} }
@ -386,16 +392,17 @@ mod tests {
", ",
), ),
@r###" @r###"
[ [
CompletionItem { CompletionItem {
label: "blah", label: "blah(…)",
source_range: [299; 300), source_range: [299; 300),
delete: [299; 300), delete: [299; 300),
insert: "blah()$0", insert: "blah()$0",
kind: Method, kind: Method,
detail: "pub fn blah(&self)", lookup: "blah",
}, detail: "pub fn blah(&self)",
] },
]
"### "###
); );
} }

View file

@ -375,19 +375,22 @@ mod tests {
fn foo() { let _ = S::<|> } fn foo() { let _ = S::<|> }
" "
), ),
@r###"[ @r###"
[
CompletionItem { CompletionItem {
label: "m", label: "m(…)",
source_range: [100; 100), source_range: [100; 100),
delete: [100; 100), delete: [100; 100),
insert: "m()$0", insert: "m()$0",
kind: Function, kind: Function,
lookup: "m",
detail: "fn m()", detail: "fn m()",
documentation: Documentation( documentation: Documentation(
"An associated method", "An associated method",
), ),
}, },
]"### ]
"###
); );
} }
@ -474,19 +477,22 @@ mod tests {
fn foo() { let _ = S::<|> } fn foo() { let _ = S::<|> }
" "
), ),
@r###"[ @r###"
[
CompletionItem { CompletionItem {
label: "m", label: "m(…)",
source_range: [100; 100), source_range: [100; 100),
delete: [100; 100), delete: [100; 100),
insert: "m()$0", insert: "m()$0",
kind: Function, kind: Function,
lookup: "m",
detail: "fn m()", detail: "fn m()",
documentation: Documentation( documentation: Documentation(
"An associated method", "An associated method",
), ),
}, },
]"### ]
"###
); );
} }
@ -507,19 +513,22 @@ mod tests {
fn foo() { let _ = U::<|> } fn foo() { let _ = U::<|> }
" "
), ),
@r###"[ @r###"
[
CompletionItem { CompletionItem {
label: "m", label: "m(…)",
source_range: [101; 101), source_range: [101; 101),
delete: [101; 101), delete: [101; 101),
insert: "m()$0", insert: "m()$0",
kind: Function, kind: Function,
lookup: "m",
detail: "fn m()", detail: "fn m()",
documentation: Documentation( documentation: Documentation(
"An associated method", "An associated method",
), ),
}, },
]"### ]
"###
); );
} }
@ -564,24 +573,28 @@ mod tests {
} }
" "
), ),
@r###"[ @r###"
[
CompletionItem { CompletionItem {
label: "bar", label: "bar(…)",
source_range: [185; 185), source_range: [185; 185),
delete: [185; 185), delete: [185; 185),
insert: "bar()$0", insert: "bar()$0",
kind: Function, kind: Function,
lookup: "bar",
detail: "fn bar()", detail: "fn bar()",
}, },
CompletionItem { CompletionItem {
label: "foo", label: "foo(…)",
source_range: [185; 185), source_range: [185; 185),
delete: [185; 185), delete: [185; 185),
insert: "foo()$0", insert: "foo()$0",
kind: Function, kind: Function,
lookup: "foo",
detail: "fn foo()", detail: "fn foo()",
}, },
]"### ]
"###
); );
} }
@ -600,7 +613,8 @@ mod tests {
} }
" "
), ),
@r###"[ @r###"
[
CompletionItem { CompletionItem {
label: "foo!", label: "foo!",
source_range: [179; 179), source_range: [179; 179),
@ -610,14 +624,16 @@ mod tests {
detail: "#[macro_export]\nmacro_rules! foo", detail: "#[macro_export]\nmacro_rules! foo",
}, },
CompletionItem { CompletionItem {
label: "main", label: "main(…)",
source_range: [179; 179), source_range: [179; 179),
delete: [179; 179), delete: [179; 179),
insert: "main()$0", insert: "main()$0",
kind: Function, kind: Function,
lookup: "main",
detail: "fn main()", detail: "fn main()",
}, },
]"### ]
"###
); );
} }
} }

View file

@ -145,13 +145,15 @@ mod tests {
} }
" "
), ),
@r###"[ @r###"
[
CompletionItem { CompletionItem {
label: "quux", label: "quux(…)",
source_range: [91; 91), source_range: [91; 91),
delete: [91; 91), delete: [91; 91),
insert: "quux($0)", insert: "quux($0)",
kind: Function, kind: Function,
lookup: "quux",
detail: "fn quux(x: i32)", detail: "fn quux(x: i32)",
}, },
CompletionItem { CompletionItem {
@ -170,7 +172,8 @@ mod tests {
kind: Binding, kind: Binding,
detail: "i32", detail: "i32",
}, },
]"### ]
"###
); );
} }
@ -190,7 +193,8 @@ mod tests {
} }
" "
), ),
@r###"[ @r###"
[
CompletionItem { CompletionItem {
label: "a", label: "a",
source_range: [242; 242), source_range: [242; 242),
@ -207,14 +211,16 @@ mod tests {
detail: "i32", detail: "i32",
}, },
CompletionItem { CompletionItem {
label: "quux", label: "quux(…)",
source_range: [242; 242), source_range: [242; 242),
delete: [242; 242), delete: [242; 242),
insert: "quux()$0", insert: "quux()$0",
kind: Function, kind: Function,
lookup: "quux",
detail: "fn quux()", detail: "fn quux()",
}, },
]"### ]
"###
); );
} }
@ -230,13 +236,15 @@ mod tests {
} }
" "
), ),
@r###"[ @r###"
[
CompletionItem { CompletionItem {
label: "quux", label: "quux(…)",
source_range: [95; 95), source_range: [95; 95),
delete: [95; 95), delete: [95; 95),
insert: "quux()$0", insert: "quux()$0",
kind: Function, kind: Function,
lookup: "quux",
detail: "fn quux()", detail: "fn quux()",
}, },
CompletionItem { CompletionItem {
@ -246,7 +254,8 @@ mod tests {
insert: "x", insert: "x",
kind: Binding, kind: Binding,
}, },
]"### ]
"###
); );
} }
@ -260,7 +269,8 @@ mod tests {
} }
" "
), ),
@r###"[ @r###"
[
CompletionItem { CompletionItem {
label: "T", label: "T",
source_range: [52; 52), source_range: [52; 52),
@ -269,14 +279,16 @@ mod tests {
kind: TypeParam, kind: TypeParam,
}, },
CompletionItem { CompletionItem {
label: "quux", label: "quux(…)",
source_range: [52; 52), source_range: [52; 52),
delete: [52; 52), delete: [52; 52),
insert: "quux()$0", insert: "quux()$0",
kind: Function, kind: Function,
lookup: "quux",
detail: "fn quux<T>()", detail: "fn quux<T>()",
}, },
]"### ]
"###
); );
} }
@ -300,11 +312,12 @@ mod tests {
kind: TypeParam, kind: TypeParam,
}, },
CompletionItem { CompletionItem {
label: "X", label: "X<…>",
source_range: [54; 54), source_range: [54; 54),
delete: [54; 54), delete: [54; 54),
insert: "X<$0>", insert: "X<$0>",
kind: Struct, kind: Struct,
lookup: "X",
}, },
] ]
"### "###
@ -354,7 +367,8 @@ mod tests {
} }
" "
), ),
@r###"[ @r###"
[
CompletionItem { CompletionItem {
label: "Baz", label: "Baz",
source_range: [105; 105), source_range: [105; 105),
@ -370,14 +384,16 @@ mod tests {
kind: Struct, kind: Struct,
}, },
CompletionItem { CompletionItem {
label: "quux", label: "quux(…)",
source_range: [105; 105), source_range: [105; 105),
delete: [105; 105), delete: [105; 105),
insert: "quux()$0", insert: "quux()$0",
kind: Function, kind: Function,
lookup: "quux",
detail: "fn quux()", detail: "fn quux()",
}, },
]"### ]
"###
); );
} }
@ -417,7 +433,8 @@ mod tests {
} }
" "
), ),
@r###"[ @r###"
[
CompletionItem { CompletionItem {
label: "Bar", label: "Bar",
source_range: [117; 117), source_range: [117; 117),
@ -426,14 +443,16 @@ mod tests {
kind: Struct, kind: Struct,
}, },
CompletionItem { CompletionItem {
label: "quux", label: "quux(…)",
source_range: [117; 117), source_range: [117; 117),
delete: [117; 117), delete: [117; 117),
insert: "quux()$0", insert: "quux()$0",
kind: Function, kind: Function,
lookup: "quux",
detail: "fn quux()", detail: "fn quux()",
}, },
]"### ]
"###
); );
} }
@ -456,11 +475,12 @@ mod tests {
kind: Struct, kind: Struct,
}, },
CompletionItem { CompletionItem {
label: "x", label: "x(…)",
source_range: [55; 55), source_range: [55; 55),
delete: [55; 55), delete: [55; 55),
insert: "x()$0", insert: "x()$0",
kind: Function, kind: Function,
lookup: "x",
detail: "fn x()", detail: "fn x()",
}, },
] ]
@ -482,7 +502,8 @@ mod tests {
} }
" "
), ),
@r###"[ @r###"
[
CompletionItem { CompletionItem {
label: "bar", label: "bar",
source_range: [146; 146), source_range: [146; 146),
@ -492,14 +513,16 @@ mod tests {
detail: "i32", detail: "i32",
}, },
CompletionItem { CompletionItem {
label: "foo", label: "foo(…)",
source_range: [146; 146), source_range: [146; 146),
delete: [146; 146), delete: [146; 146),
insert: "foo()$0", insert: "foo()$0",
kind: Function, kind: Function,
lookup: "foo",
detail: "fn foo()", detail: "fn foo()",
}, },
]"### ]
"###
); );
} }
@ -554,11 +577,12 @@ mod tests {
kind: Struct, kind: Struct,
}, },
CompletionItem { CompletionItem {
label: "foo", label: "foo(…)",
source_range: [18; 18), source_range: [18; 18),
delete: [18; 18), delete: [18; 18),
insert: "foo()$0", insert: "foo()$0",
kind: Function, kind: Function,
lookup: "foo",
detail: "fn foo()", detail: "fn foo()",
}, },
CompletionItem { CompletionItem {
@ -606,7 +630,8 @@ mod tests {
} }
" "
), ),
@r##"[ @r###"
[
CompletionItem { CompletionItem {
label: "bar!", label: "bar!",
source_range: [252; 252), source_range: [252; 252),
@ -646,14 +671,16 @@ mod tests {
kind: Module, kind: Module,
}, },
CompletionItem { CompletionItem {
label: "main", label: "main(…)",
source_range: [252; 252), source_range: [252; 252),
delete: [252; 252), delete: [252; 252),
insert: "main()$0", insert: "main()$0",
kind: Function, kind: Function,
lookup: "main",
detail: "fn main()", detail: "fn main()",
}, },
]"## ]
"###
); );
} }
@ -672,15 +699,8 @@ mod tests {
} }
" "
), ),
@r##"[ @r###"
CompletionItem { [
label: "foo",
source_range: [49; 49),
delete: [49; 49),
insert: "foo()$0",
kind: Function,
detail: "fn foo()",
},
CompletionItem { CompletionItem {
label: "foo!", label: "foo!",
source_range: [49; 49), source_range: [49; 49),
@ -689,7 +709,17 @@ mod tests {
kind: Macro, kind: Macro,
detail: "macro_rules! foo", detail: "macro_rules! foo",
}, },
]"## CompletionItem {
label: "foo(…)",
source_range: [49; 49),
delete: [49; 49),
insert: "foo()$0",
kind: Function,
lookup: "foo",
detail: "fn foo()",
},
]
"###
); );
} }
@ -708,7 +738,8 @@ mod tests {
} }
" "
), ),
@r##"[ @r###"
[
CompletionItem { CompletionItem {
label: "foo!", label: "foo!",
source_range: [57; 57), source_range: [57; 57),
@ -718,14 +749,16 @@ mod tests {
detail: "macro_rules! foo", detail: "macro_rules! foo",
}, },
CompletionItem { CompletionItem {
label: "main", label: "main(…)",
source_range: [57; 57), source_range: [57; 57),
delete: [57; 57), delete: [57; 57),
insert: "main()$0", insert: "main()$0",
kind: Function, kind: Function,
lookup: "main",
detail: "fn main()", detail: "fn main()",
}, },
]"## ]
"###
); );
} }
@ -744,7 +777,8 @@ mod tests {
} }
" "
), ),
@r##"[ @r###"
[
CompletionItem { CompletionItem {
label: "foo!", label: "foo!",
source_range: [50; 50), source_range: [50; 50),
@ -754,14 +788,16 @@ mod tests {
detail: "macro_rules! foo", detail: "macro_rules! foo",
}, },
CompletionItem { CompletionItem {
label: "main", label: "main(…)",
source_range: [50; 50), source_range: [50; 50),
delete: [50; 50), delete: [50; 50),
insert: "main()$0", insert: "main()$0",
kind: Function, kind: Function,
lookup: "main",
detail: "fn main()", detail: "fn main()",
}, },
]"## ]
"###
); );
} }
} }

View file

@ -216,6 +216,10 @@ impl Builder {
self.lookup = Some(lookup.into()); self.lookup = Some(lookup.into());
self self
} }
pub(crate) fn label(mut self, label: impl Into<String>) -> Builder {
self.label = label.into();
self
}
pub(crate) fn insert_text(mut self, insert_text: impl Into<String>) -> Builder { pub(crate) fn insert_text(mut self, insert_text: impl Into<String>) -> Builder {
self.insert_text = Some(insert_text.into()); self.insert_text = Some(insert_text.into());
self self

View file

@ -116,7 +116,10 @@ impl Completions {
if let Some(def) = generic_def { if let Some(def) = generic_def {
if has_non_default_type_params(def, ctx.db) { if has_non_default_type_params(def, ctx.db) {
tested_by!(inserts_angle_brackets_for_generics); tested_by!(inserts_angle_brackets_for_generics);
completion_item = completion_item.insert_snippet(format!("{}<$0>", local_name)); completion_item = completion_item
.lookup_by(local_name.clone())
.label(format!("{}<…>", local_name))
.insert_snippet(format!("{}<$0>", local_name));
} }
} }
} }
@ -169,7 +172,8 @@ impl Completions {
let ast_node = func.source(ctx.db).ast; let ast_node = func.source(ctx.db).ast;
let detail = function_label(&ast_node); let detail = function_label(&ast_node);
let mut builder = CompletionItem::new(CompletionKind::Reference, ctx.source_range(), name) let mut builder =
CompletionItem::new(CompletionKind::Reference, ctx.source_range(), name.clone())
.kind(if data.has_self_param() { .kind(if data.has_self_param() {
CompletionItemKind::Method CompletionItemKind::Method
} else { } else {
@ -190,7 +194,10 @@ impl Completions {
} else { } else {
format!("{}($0)", data.name()) format!("{}($0)", data.name())
}; };
builder = builder.insert_snippet(snippet); builder = builder
.lookup_by(name.clone())
.label(format!("{}(…)", name))
.insert_snippet(snippet);
} }
self.add(builder) self.add(builder)
@ -269,24 +276,28 @@ mod tests {
fn main() { no_<|> } fn main() { no_<|> }
" "
), ),
@r###"[ @r###"
[
CompletionItem { CompletionItem {
label: "main", label: "main(…)",
source_range: [61; 64), source_range: [61; 64),
delete: [61; 64), delete: [61; 64),
insert: "main()$0", insert: "main()$0",
kind: Function, kind: Function,
lookup: "main",
detail: "fn main()", detail: "fn main()",
}, },
CompletionItem { CompletionItem {
label: "no_args", label: "no_args(…)",
source_range: [61; 64), source_range: [61; 64),
delete: [61; 64), delete: [61; 64),
insert: "no_args()$0", insert: "no_args()$0",
kind: Function, kind: Function,
lookup: "no_args",
detail: "fn no_args()", detail: "fn no_args()",
}, },
]"### ]
"###
); );
assert_debug_snapshot!( assert_debug_snapshot!(
do_reference_completion( do_reference_completion(
@ -295,24 +306,28 @@ mod tests {
fn main() { with_<|> } fn main() { with_<|> }
" "
), ),
@r###"[ @r###"
[
CompletionItem { CompletionItem {
label: "main", label: "main(…)",
source_range: [80; 85), source_range: [80; 85),
delete: [80; 85), delete: [80; 85),
insert: "main()$0", insert: "main()$0",
kind: Function, kind: Function,
lookup: "main",
detail: "fn main()", detail: "fn main()",
}, },
CompletionItem { CompletionItem {
label: "with_args", label: "with_args(…)",
source_range: [80; 85), source_range: [80; 85),
delete: [80; 85), delete: [80; 85),
insert: "with_args($0)", insert: "with_args($0)",
kind: Function, kind: Function,
lookup: "with_args",
detail: "fn with_args(x: i32, y: String)", detail: "fn with_args(x: i32, y: String)",
}, },
]"### ]
"###
); );
assert_debug_snapshot!( assert_debug_snapshot!(
do_reference_completion( do_reference_completion(
@ -326,16 +341,19 @@ mod tests {
} }
" "
), ),
@r###"[ @r###"
[
CompletionItem { CompletionItem {
label: "foo", label: "foo(…)",
source_range: [163; 164), source_range: [163; 164),
delete: [163; 164), delete: [163; 164),
insert: "foo()$0", insert: "foo()$0",
kind: Method, kind: Method,
lookup: "foo",
detail: "fn foo(&self)", detail: "fn foo(&self)",
}, },
]"### ]
"###
); );
} }
@ -430,18 +448,20 @@ mod tests {
@r###" @r###"
[ [
CompletionItem { CompletionItem {
label: "Vec", label: "Vec<…>",
source_range: [61; 63), source_range: [61; 63),
delete: [61; 63), delete: [61; 63),
insert: "Vec<$0>", insert: "Vec<$0>",
kind: Struct, kind: Struct,
lookup: "Vec",
}, },
CompletionItem { CompletionItem {
label: "foo", label: "foo(…)",
source_range: [61; 63), source_range: [61; 63),
delete: [61; 63), delete: [61; 63),
insert: "foo($0)", insert: "foo($0)",
kind: Function, kind: Function,
lookup: "foo",
detail: "fn foo(xs: Ve)", detail: "fn foo(xs: Ve)",
}, },
] ]
@ -457,18 +477,20 @@ mod tests {
@r###" @r###"
[ [
CompletionItem { CompletionItem {
label: "Vec", label: "Vec<…>",
source_range: [64; 66), source_range: [64; 66),
delete: [64; 66), delete: [64; 66),
insert: "Vec<$0>", insert: "Vec<$0>",
kind: TypeAlias, kind: TypeAlias,
lookup: "Vec",
}, },
CompletionItem { CompletionItem {
label: "foo", label: "foo(…)",
source_range: [64; 66), source_range: [64; 66),
delete: [64; 66), delete: [64; 66),
insert: "foo($0)", insert: "foo($0)",
kind: Function, kind: Function,
lookup: "foo",
detail: "fn foo(xs: Ve)", detail: "fn foo(xs: Ve)",
}, },
] ]
@ -491,11 +513,12 @@ mod tests {
kind: Struct, kind: Struct,
}, },
CompletionItem { CompletionItem {
label: "foo", label: "foo(…)",
source_range: [68; 70), source_range: [68; 70),
delete: [68; 70), delete: [68; 70),
insert: "foo($0)", insert: "foo($0)",
kind: Function, kind: Function,
lookup: "foo",
detail: "fn foo(xs: Ve)", detail: "fn foo(xs: Ve)",
}, },
] ]
@ -518,11 +541,12 @@ mod tests {
kind: Struct, kind: Struct,
}, },
CompletionItem { CompletionItem {
label: "foo", label: "foo(…)",
source_range: [61; 63), source_range: [61; 63),
delete: [61; 63), delete: [61; 63),
insert: "foo($0)", insert: "foo($0)",
kind: Function, kind: Function,
lookup: "foo",
detail: "fn foo(xs: Ve<i128>)", detail: "fn foo(xs: Ve<i128>)",
}, },
] ]