aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_ide/src/completion/presentation.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_ide/src/completion/presentation.rs')
-rw-r--r--crates/ra_ide/src/completion/presentation.rs286
1 files changed, 146 insertions, 140 deletions
diff --git a/crates/ra_ide/src/completion/presentation.rs b/crates/ra_ide/src/completion/presentation.rs
index 5e2b8b920..7633cd7fd 100644
--- a/crates/ra_ide/src/completion/presentation.rs
+++ b/crates/ra_ide/src/completion/presentation.rs
@@ -15,12 +15,7 @@ use crate::{
15}; 15};
16 16
17impl Completions { 17impl Completions {
18 pub(crate) fn add_field( 18 pub(crate) fn add_field(&mut self, ctx: &CompletionContext, field: hir::Field, ty: &Type) {
19 &mut self,
20 ctx: &CompletionContext,
21 field: hir::StructField,
22 ty: &Type,
23 ) {
24 let is_deprecated = is_deprecated(field, ctx.db); 19 let is_deprecated = is_deprecated(field, ctx.db);
25 let ty = ty.display(ctx.db).to_string(); 20 let ty = ty.display(ctx.db).to_string();
26 let name = field.name(ctx.db); 21 let name = field.name(ctx.db);
@@ -133,29 +128,6 @@ impl Completions {
133 completion_item.kind(kind).set_documentation(docs).add_to(self) 128 completion_item.kind(kind).set_documentation(docs).add_to(self)
134 } 129 }
135 130
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
159 pub(crate) fn add_macro( 131 pub(crate) fn add_macro(
160 &mut self, 132 &mut self,
161 ctx: &CompletionContext, 133 ctx: &CompletionContext,
@@ -177,21 +149,27 @@ impl Completions {
177 let detail = macro_label(&ast_node); 149 let detail = macro_label(&ast_node);
178 150
179 let docs = macro_.docs(ctx.db); 151 let docs = macro_.docs(ctx.db);
180 let macro_declaration = format!("{}!", name);
181 152
182 let mut builder = 153 let mut builder = CompletionItem::new(
183 CompletionItem::new(CompletionKind::Reference, ctx.source_range(), &macro_declaration) 154 CompletionKind::Reference,
184 .kind(CompletionItemKind::Macro) 155 ctx.source_range(),
185 .set_documentation(docs.clone()) 156 &format!("{}!", name),
186 .set_deprecated(is_deprecated(macro_, ctx.db)) 157 )
187 .detail(detail); 158 .kind(CompletionItemKind::Macro)
159 .set_documentation(docs.clone())
160 .set_deprecated(is_deprecated(macro_, ctx.db))
161 .detail(detail);
188 162
163 let needs_bang = ctx.use_item_syntax.is_none() && !ctx.is_macro_call;
189 builder = match ctx.config.snippet_cap { 164 builder = match ctx.config.snippet_cap {
190 Some(cap) if ctx.use_item_syntax.is_none() && !ctx.is_macro_call => { 165 Some(cap) if needs_bang => {
191 let macro_braces_to_insert = 166 let docs = docs.as_ref().map_or("", |s| s.as_str());
192 self.guess_macro_braces(&name, docs.as_ref().map_or("", |s| s.as_str())); 167 let (bra, ket) = guess_macro_braces(&name, docs);
193 builder.insert_snippet(cap, macro_declaration + macro_braces_to_insert) 168 builder
169 .insert_snippet(cap, format!("{}!{}$0{}", name, bra, ket))
170 .label(format!("{}!{}…{}", name, bra, ket))
194 } 171 }
172 None if needs_bang => builder.insert_text(format!("{}!", name)),
195 _ => { 173 _ => {
196 tested_by!(dont_insert_macro_call_parens_unncessary); 174 tested_by!(dont_insert_macro_call_parens_unncessary);
197 builder.insert_text(name) 175 builder.insert_text(name)
@@ -404,6 +382,34 @@ fn is_deprecated(node: impl HasAttrs, db: &RootDatabase) -> bool {
404 node.attrs(db).by_key("deprecated").exists() 382 node.attrs(db).by_key("deprecated").exists()
405} 383}
406 384
385fn guess_macro_braces(macro_name: &str, docs: &str) -> (&'static str, &'static str) {
386 let mut votes = [0, 0, 0];
387 for (idx, s) in docs.match_indices(&macro_name) {
388 let (before, after) = (&docs[..idx], &docs[idx + s.len()..]);
389 // Ensure to match the full word
390 if after.starts_with('!')
391 && !before.ends_with(|c: char| c == '_' || c.is_ascii_alphanumeric())
392 {
393 // It may have spaces before the braces like `foo! {}`
394 match after[1..].chars().find(|&c| !c.is_whitespace()) {
395 Some('{') => votes[0] += 1,
396 Some('[') => votes[1] += 1,
397 Some('(') => votes[2] += 1,
398 _ => {}
399 }
400 }
401 }
402
403 // Insert a space before `{}`.
404 // We prefer the last one when some votes equal.
405 let (_vote, (bra, ket)) = votes
406 .iter()
407 .zip(&[(" {", "}"), ("[", "]"), ("(", ")")])
408 .max_by_key(|&(&vote, _)| vote)
409 .unwrap();
410 (*bra, *ket)
411}
412
407#[cfg(test)] 413#[cfg(test)]
408mod tests { 414mod tests {
409 use insta::assert_debug_snapshot; 415 use insta::assert_debug_snapshot;
@@ -441,8 +447,8 @@ mod tests {
441 [ 447 [
442 CompletionItem { 448 CompletionItem {
443 label: "Foo", 449 label: "Foo",
444 source_range: [121; 123), 450 source_range: 121..123,
445 delete: [121; 123), 451 delete: 121..123,
446 insert: "Foo", 452 insert: "Foo",
447 kind: EnumVariant, 453 kind: EnumVariant,
448 detail: "{ x: i32, y: i32 }", 454 detail: "{ x: i32, y: i32 }",
@@ -467,8 +473,8 @@ mod tests {
467 [ 473 [
468 CompletionItem { 474 CompletionItem {
469 label: "Foo(…)", 475 label: "Foo(…)",
470 source_range: [115; 117), 476 source_range: 115..117,
471 delete: [115; 117), 477 delete: 115..117,
472 insert: "Foo($0)", 478 insert: "Foo($0)",
473 kind: EnumVariant, 479 kind: EnumVariant,
474 lookup: "Foo", 480 lookup: "Foo",
@@ -495,8 +501,8 @@ mod tests {
495 [ 501 [
496 CompletionItem { 502 CompletionItem {
497 label: "Foo", 503 label: "Foo",
498 source_range: [104; 106), 504 source_range: 104..106,
499 delete: [104; 106), 505 delete: 104..106,
500 insert: "Foo", 506 insert: "Foo",
501 kind: EnumVariant, 507 kind: EnumVariant,
502 detail: "()", 508 detail: "()",
@@ -523,8 +529,8 @@ mod tests {
523 [ 529 [
524 CompletionItem { 530 CompletionItem {
525 label: "main()", 531 label: "main()",
526 source_range: [203; 206), 532 source_range: 203..206,
527 delete: [203; 206), 533 delete: 203..206,
528 insert: "main()$0", 534 insert: "main()$0",
529 kind: Function, 535 kind: Function,
530 lookup: "main", 536 lookup: "main",
@@ -532,8 +538,8 @@ mod tests {
532 }, 538 },
533 CompletionItem { 539 CompletionItem {
534 label: "something_deprecated()", 540 label: "something_deprecated()",
535 source_range: [203; 206), 541 source_range: 203..206,
536 delete: [203; 206), 542 delete: 203..206,
537 insert: "something_deprecated()$0", 543 insert: "something_deprecated()$0",
538 kind: Function, 544 kind: Function,
539 lookup: "something_deprecated", 545 lookup: "something_deprecated",
@@ -542,8 +548,8 @@ mod tests {
542 }, 548 },
543 CompletionItem { 549 CompletionItem {
544 label: "something_else_deprecated()", 550 label: "something_else_deprecated()",
545 source_range: [203; 206), 551 source_range: 203..206,
546 delete: [203; 206), 552 delete: 203..206,
547 insert: "something_else_deprecated()$0", 553 insert: "something_else_deprecated()$0",
548 kind: Function, 554 kind: Function,
549 lookup: "something_else_deprecated", 555 lookup: "something_else_deprecated",
@@ -569,8 +575,8 @@ mod tests {
569 [ 575 [
570 CompletionItem { 576 CompletionItem {
571 label: "main()", 577 label: "main()",
572 source_range: [61; 64), 578 source_range: 61..64,
573 delete: [61; 64), 579 delete: 61..64,
574 insert: "main()$0", 580 insert: "main()$0",
575 kind: Function, 581 kind: Function,
576 lookup: "main", 582 lookup: "main",
@@ -578,8 +584,8 @@ mod tests {
578 }, 584 },
579 CompletionItem { 585 CompletionItem {
580 label: "no_args()", 586 label: "no_args()",
581 source_range: [61; 64), 587 source_range: 61..64,
582 delete: [61; 64), 588 delete: 61..64,
583 insert: "no_args()$0", 589 insert: "no_args()$0",
584 kind: Function, 590 kind: Function,
585 lookup: "no_args", 591 lookup: "no_args",
@@ -599,8 +605,8 @@ mod tests {
599 [ 605 [
600 CompletionItem { 606 CompletionItem {
601 label: "main()", 607 label: "main()",
602 source_range: [80; 85), 608 source_range: 80..85,
603 delete: [80; 85), 609 delete: 80..85,
604 insert: "main()$0", 610 insert: "main()$0",
605 kind: Function, 611 kind: Function,
606 lookup: "main", 612 lookup: "main",
@@ -608,8 +614,8 @@ mod tests {
608 }, 614 },
609 CompletionItem { 615 CompletionItem {
610 label: "with_args(…)", 616 label: "with_args(…)",
611 source_range: [80; 85), 617 source_range: 80..85,
612 delete: [80; 85), 618 delete: 80..85,
613 insert: "with_args(${1:x}, ${2:y})$0", 619 insert: "with_args(${1:x}, ${2:y})$0",
614 kind: Function, 620 kind: Function,
615 lookup: "with_args", 621 lookup: "with_args",
@@ -635,8 +641,8 @@ mod tests {
635 [ 641 [
636 CompletionItem { 642 CompletionItem {
637 label: "foo()", 643 label: "foo()",
638 source_range: [163; 164), 644 source_range: 163..164,
639 delete: [163; 164), 645 delete: 163..164,
640 insert: "foo()$0", 646 insert: "foo()$0",
641 kind: Method, 647 kind: Method,
642 lookup: "foo", 648 lookup: "foo",
@@ -663,23 +669,23 @@ mod tests {
663 [ 669 [
664 CompletionItem { 670 CompletionItem {
665 label: "None", 671 label: "None",
666 source_range: [144; 147), 672 source_range: 144..147,
667 delete: [144; 147), 673 delete: 144..147,
668 insert: "None", 674 insert: "None",
669 kind: EnumVariant, 675 kind: EnumVariant,
670 detail: "()", 676 detail: "()",
671 }, 677 },
672 CompletionItem { 678 CompletionItem {
673 label: "Option", 679 label: "Option",
674 source_range: [144; 147), 680 source_range: 144..147,
675 delete: [144; 147), 681 delete: 144..147,
676 insert: "Option", 682 insert: "Option",
677 kind: Enum, 683 kind: Enum,
678 }, 684 },
679 CompletionItem { 685 CompletionItem {
680 label: "Some(…)", 686 label: "Some(…)",
681 source_range: [144; 147), 687 source_range: 144..147,
682 delete: [144; 147), 688 delete: 144..147,
683 insert: "Some($0)", 689 insert: "Some($0)",
684 kind: EnumVariant, 690 kind: EnumVariant,
685 lookup: "Some", 691 lookup: "Some",
@@ -688,8 +694,8 @@ mod tests {
688 }, 694 },
689 CompletionItem { 695 CompletionItem {
690 label: "main()", 696 label: "main()",
691 source_range: [144; 147), 697 source_range: 144..147,
692 delete: [144; 147), 698 delete: 144..147,
693 insert: "main()$0", 699 insert: "main()$0",
694 kind: Function, 700 kind: Function,
695 lookup: "main", 701 lookup: "main",
@@ -714,23 +720,23 @@ mod tests {
714 [ 720 [
715 CompletionItem { 721 CompletionItem {
716 label: "None", 722 label: "None",
717 source_range: [185; 188), 723 source_range: 185..188,
718 delete: [185; 188), 724 delete: 185..188,
719 insert: "None", 725 insert: "None",
720 kind: EnumVariant, 726 kind: EnumVariant,
721 detail: "()", 727 detail: "()",
722 }, 728 },
723 CompletionItem { 729 CompletionItem {
724 label: "Option", 730 label: "Option",
725 source_range: [185; 188), 731 source_range: 185..188,
726 delete: [185; 188), 732 delete: 185..188,
727 insert: "Option", 733 insert: "Option",
728 kind: Enum, 734 kind: Enum,
729 }, 735 },
730 CompletionItem { 736 CompletionItem {
731 label: "Some(…)", 737 label: "Some(…)",
732 source_range: [185; 188), 738 source_range: 185..188,
733 delete: [185; 188), 739 delete: 185..188,
734 insert: "Some($0)", 740 insert: "Some($0)",
735 kind: EnumVariant, 741 kind: EnumVariant,
736 lookup: "Some", 742 lookup: "Some",
@@ -760,8 +766,8 @@ mod tests {
760 [ 766 [
761 CompletionItem { 767 CompletionItem {
762 label: "foo(…)", 768 label: "foo(…)",
763 source_range: [171; 172), 769 source_range: 171..172,
764 delete: [171; 172), 770 delete: 171..172,
765 insert: "foo(${1:x})$0", 771 insert: "foo(${1:x})$0",
766 kind: Method, 772 kind: Method,
767 lookup: "foo", 773 lookup: "foo",
@@ -795,8 +801,8 @@ mod tests {
795 [ 801 [
796 CompletionItem { 802 CompletionItem {
797 label: "foo(…)", 803 label: "foo(…)",
798 source_range: [171; 172), 804 source_range: 171..172,
799 delete: [171; 172), 805 delete: 171..172,
800 insert: "foo($0)", 806 insert: "foo($0)",
801 kind: Method, 807 kind: Method,
802 lookup: "foo", 808 lookup: "foo",
@@ -822,8 +828,8 @@ mod tests {
822 [ 828 [
823 CompletionItem { 829 CompletionItem {
824 label: "foo", 830 label: "foo",
825 source_range: [40; 41), 831 source_range: 40..41,
826 delete: [40; 41), 832 delete: 40..41,
827 insert: "foo", 833 insert: "foo",
828 kind: Function, 834 kind: Function,
829 detail: "pub fn foo()", 835 detail: "pub fn foo()",
@@ -849,16 +855,16 @@ mod tests {
849 [ 855 [
850 CompletionItem { 856 CompletionItem {
851 label: "frobnicate", 857 label: "frobnicate",
852 source_range: [35; 39), 858 source_range: 35..39,
853 delete: [35; 39), 859 delete: 35..39,
854 insert: "frobnicate", 860 insert: "frobnicate",
855 kind: Function, 861 kind: Function,
856 detail: "fn frobnicate()", 862 detail: "fn frobnicate()",
857 }, 863 },
858 CompletionItem { 864 CompletionItem {
859 label: "main", 865 label: "main",
860 source_range: [35; 39), 866 source_range: 35..39,
861 delete: [35; 39), 867 delete: 35..39,
862 insert: "main", 868 insert: "main",
863 kind: Function, 869 kind: Function,
864 detail: "fn main()", 870 detail: "fn main()",
@@ -881,8 +887,8 @@ mod tests {
881 [ 887 [
882 CompletionItem { 888 CompletionItem {
883 label: "new", 889 label: "new",
884 source_range: [67; 69), 890 source_range: 67..69,
885 delete: [67; 69), 891 delete: 67..69,
886 insert: "new", 892 insert: "new",
887 kind: Function, 893 kind: Function,
888 detail: "fn new() -> Foo", 894 detail: "fn new() -> Foo",
@@ -906,16 +912,16 @@ mod tests {
906 [ 912 [
907 CompletionItem { 913 CompletionItem {
908 label: "Vec<…>", 914 label: "Vec<…>",
909 source_range: [61; 63), 915 source_range: 61..63,
910 delete: [61; 63), 916 delete: 61..63,
911 insert: "Vec<$0>", 917 insert: "Vec<$0>",
912 kind: Struct, 918 kind: Struct,
913 lookup: "Vec", 919 lookup: "Vec",
914 }, 920 },
915 CompletionItem { 921 CompletionItem {
916 label: "foo(…)", 922 label: "foo(…)",
917 source_range: [61; 63), 923 source_range: 61..63,
918 delete: [61; 63), 924 delete: 61..63,
919 insert: "foo(${1:xs})$0", 925 insert: "foo(${1:xs})$0",
920 kind: Function, 926 kind: Function,
921 lookup: "foo", 927 lookup: "foo",
@@ -936,16 +942,16 @@ mod tests {
936 [ 942 [
937 CompletionItem { 943 CompletionItem {
938 label: "Vec<…>", 944 label: "Vec<…>",
939 source_range: [64; 66), 945 source_range: 64..66,
940 delete: [64; 66), 946 delete: 64..66,
941 insert: "Vec<$0>", 947 insert: "Vec<$0>",
942 kind: TypeAlias, 948 kind: TypeAlias,
943 lookup: "Vec", 949 lookup: "Vec",
944 }, 950 },
945 CompletionItem { 951 CompletionItem {
946 label: "foo(…)", 952 label: "foo(…)",
947 source_range: [64; 66), 953 source_range: 64..66,
948 delete: [64; 66), 954 delete: 64..66,
949 insert: "foo(${1:xs})$0", 955 insert: "foo(${1:xs})$0",
950 kind: Function, 956 kind: Function,
951 lookup: "foo", 957 lookup: "foo",
@@ -966,15 +972,15 @@ mod tests {
966 [ 972 [
967 CompletionItem { 973 CompletionItem {
968 label: "Vec", 974 label: "Vec",
969 source_range: [68; 70), 975 source_range: 68..70,
970 delete: [68; 70), 976 delete: 68..70,
971 insert: "Vec", 977 insert: "Vec",
972 kind: Struct, 978 kind: Struct,
973 }, 979 },
974 CompletionItem { 980 CompletionItem {
975 label: "foo(…)", 981 label: "foo(…)",
976 source_range: [68; 70), 982 source_range: 68..70,
977 delete: [68; 70), 983 delete: 68..70,
978 insert: "foo(${1:xs})$0", 984 insert: "foo(${1:xs})$0",
979 kind: Function, 985 kind: Function,
980 lookup: "foo", 986 lookup: "foo",
@@ -995,15 +1001,15 @@ mod tests {
995 [ 1001 [
996 CompletionItem { 1002 CompletionItem {
997 label: "Vec", 1003 label: "Vec",
998 source_range: [61; 63), 1004 source_range: 61..63,
999 delete: [61; 63), 1005 delete: 61..63,
1000 insert: "Vec", 1006 insert: "Vec",
1001 kind: Struct, 1007 kind: Struct,
1002 }, 1008 },
1003 CompletionItem { 1009 CompletionItem {
1004 label: "foo(…)", 1010 label: "foo(…)",
1005 source_range: [61; 63), 1011 source_range: 61..63,
1006 delete: [61; 63), 1012 delete: 61..63,
1007 insert: "foo(${1:xs})$0", 1013 insert: "foo(${1:xs})$0",
1008 kind: Function, 1014 kind: Function,
1009 lookup: "foo", 1015 lookup: "foo",
@@ -1035,8 +1041,8 @@ mod tests {
1035 [ 1041 [
1036 CompletionItem { 1042 CompletionItem {
1037 label: "frobnicate!", 1043 label: "frobnicate!",
1038 source_range: [9; 9), 1044 source_range: 9..9,
1039 delete: [9; 9), 1045 delete: 9..9,
1040 insert: "frobnicate", 1046 insert: "frobnicate",
1041 kind: Macro, 1047 kind: Macro,
1042 detail: "#[macro_export]\nmacro_rules! frobnicate", 1048 detail: "#[macro_export]\nmacro_rules! frobnicate",
@@ -1061,16 +1067,16 @@ mod tests {
1061 [ 1067 [
1062 CompletionItem { 1068 CompletionItem {
1063 label: "frobnicate!", 1069 label: "frobnicate!",
1064 source_range: [56; 60), 1070 source_range: 56..60,
1065 delete: [56; 60), 1071 delete: 56..60,
1066 insert: "frobnicate", 1072 insert: "frobnicate",
1067 kind: Macro, 1073 kind: Macro,
1068 detail: "macro_rules! frobnicate", 1074 detail: "macro_rules! frobnicate",
1069 }, 1075 },
1070 CompletionItem { 1076 CompletionItem {
1071 label: "main()", 1077 label: "main()",
1072 source_range: [56; 60), 1078 source_range: 56..60,
1073 delete: [56; 60), 1079 delete: 56..60,
1074 insert: "main()$0", 1080 insert: "main()$0",
1075 kind: Function, 1081 kind: Function,
1076 lookup: "main", 1082 lookup: "main",
@@ -1098,24 +1104,24 @@ mod tests {
1098 [ 1104 [
1099 CompletionItem { 1105 CompletionItem {
1100 label: "another_field", 1106 label: "another_field",
1101 source_range: [201; 201), 1107 source_range: 201..201,
1102 delete: [201; 201), 1108 delete: 201..201,
1103 insert: "another_field", 1109 insert: "another_field",
1104 kind: Field, 1110 kind: Field,
1105 detail: "i64", 1111 detail: "i64",
1106 }, 1112 },
1107 CompletionItem { 1113 CompletionItem {
1108 label: "my_string", 1114 label: "my_string",
1109 source_range: [201; 201), 1115 source_range: 201..201,
1110 delete: [201; 201), 1116 delete: 201..201,
1111 insert: "my_string", 1117 insert: "my_string",
1112 kind: Field, 1118 kind: Field,
1113 detail: "{unknown}", 1119 detail: "{unknown}",
1114 }, 1120 },
1115 CompletionItem { 1121 CompletionItem {
1116 label: "the_field", 1122 label: "the_field",
1117 source_range: [201; 201), 1123 source_range: 201..201,
1118 delete: [201; 201), 1124 delete: 201..201,
1119 insert: "the_field", 1125 insert: "the_field",
1120 kind: Field, 1126 kind: Field,
1121 detail: "u32", 1127 detail: "u32",
@@ -1142,16 +1148,16 @@ mod tests {
1142 [ 1148 [
1143 CompletionItem { 1149 CompletionItem {
1144 label: "another_field", 1150 label: "another_field",
1145 source_range: [208; 208), 1151 source_range: 208..208,
1146 delete: [208; 208), 1152 delete: 208..208,
1147 insert: "another_field", 1153 insert: "another_field",
1148 kind: Field, 1154 kind: Field,
1149 detail: "i64", 1155 detail: "i64",
1150 }, 1156 },
1151 CompletionItem { 1157 CompletionItem {
1152 label: "another_good_type", 1158 label: "another_good_type",
1153 source_range: [208; 208), 1159 source_range: 208..208,
1154 delete: [208; 208), 1160 delete: 208..208,
1155 insert: "another_good_type", 1161 insert: "another_good_type",
1156 kind: Field, 1162 kind: Field,
1157 detail: "u32", 1163 detail: "u32",
@@ -1159,8 +1165,8 @@ mod tests {
1159 }, 1165 },
1160 CompletionItem { 1166 CompletionItem {
1161 label: "the_field", 1167 label: "the_field",
1162 source_range: [208; 208), 1168 source_range: 208..208,
1163 delete: [208; 208), 1169 delete: 208..208,
1164 insert: "the_field", 1170 insert: "the_field",
1165 kind: Field, 1171 kind: Field,
1166 detail: "u32", 1172 detail: "u32",
@@ -1190,16 +1196,16 @@ mod tests {
1190 [ 1196 [
1191 CompletionItem { 1197 CompletionItem {
1192 label: "another_field", 1198 label: "another_field",
1193 source_range: [270; 270), 1199 source_range: 270..270,
1194 delete: [270; 270), 1200 delete: 270..270,
1195 insert: "another_field", 1201 insert: "another_field",
1196 kind: Field, 1202 kind: Field,
1197 detail: "i64", 1203 detail: "i64",
1198 }, 1204 },
1199 CompletionItem { 1205 CompletionItem {
1200 label: "another_good_type", 1206 label: "another_good_type",
1201 source_range: [270; 270), 1207 source_range: 270..270,
1202 delete: [270; 270), 1208 delete: 270..270,
1203 insert: "another_good_type", 1209 insert: "another_good_type",
1204 kind: Field, 1210 kind: Field,
1205 detail: "u32", 1211 detail: "u32",
@@ -1207,8 +1213,8 @@ mod tests {
1207 }, 1213 },
1208 CompletionItem { 1214 CompletionItem {
1209 label: "the_field", 1215 label: "the_field",
1210 source_range: [270; 270), 1216 source_range: 270..270,
1211 delete: [270; 270), 1217 delete: 270..270,
1212 insert: "the_field", 1218 insert: "the_field",
1213 kind: Field, 1219 kind: Field,
1214 detail: "u32", 1220 detail: "u32",
@@ -1238,8 +1244,8 @@ mod tests {
1238 [ 1244 [
1239 CompletionItem { 1245 CompletionItem {
1240 label: "another_field", 1246 label: "another_field",
1241 source_range: [336; 336), 1247 source_range: 336..336,
1242 delete: [336; 336), 1248 delete: 336..336,
1243 insert: "another_field", 1249 insert: "another_field",
1244 kind: Field, 1250 kind: Field,
1245 detail: "i64", 1251 detail: "i64",
@@ -1247,16 +1253,16 @@ mod tests {
1247 }, 1253 },
1248 CompletionItem { 1254 CompletionItem {
1249 label: "another_good_type", 1255 label: "another_good_type",
1250 source_range: [336; 336), 1256 source_range: 336..336,
1251 delete: [336; 336), 1257 delete: 336..336,
1252 insert: "another_good_type", 1258 insert: "another_good_type",
1253 kind: Field, 1259 kind: Field,
1254 detail: "u32", 1260 detail: "u32",
1255 }, 1261 },
1256 CompletionItem { 1262 CompletionItem {
1257 label: "the_field", 1263 label: "the_field",
1258 source_range: [336; 336), 1264 source_range: 336..336,
1259 delete: [336; 336), 1265 delete: 336..336,
1260 insert: "the_field", 1266 insert: "the_field",
1261 kind: Field, 1267 kind: Field,
1262 detail: "u32", 1268 detail: "u32",
@@ -1285,16 +1291,16 @@ mod tests {
1285 [ 1291 [
1286 CompletionItem { 1292 CompletionItem {
1287 label: "another_field", 1293 label: "another_field",
1288 source_range: [328; 328), 1294 source_range: 328..328,
1289 delete: [328; 328), 1295 delete: 328..328,
1290 insert: "another_field", 1296 insert: "another_field",
1291 kind: Field, 1297 kind: Field,
1292 detail: "i64", 1298 detail: "i64",
1293 }, 1299 },
1294 CompletionItem { 1300 CompletionItem {
1295 label: "another_good_type", 1301 label: "another_good_type",
1296 source_range: [328; 328), 1302 source_range: 328..328,
1297 delete: [328; 328), 1303 delete: 328..328,
1298 insert: "another_good_type", 1304 insert: "another_good_type",
1299 kind: Field, 1305 kind: Field,
1300 detail: "u32", 1306 detail: "u32",
@@ -1302,8 +1308,8 @@ mod tests {
1302 }, 1308 },
1303 CompletionItem { 1309 CompletionItem {
1304 label: "the_field", 1310 label: "the_field",
1305 source_range: [328; 328), 1311 source_range: 328..328,
1306 delete: [328; 328), 1312 delete: 328..328,
1307 insert: "the_field", 1313 insert: "the_field",
1308 kind: Field, 1314 kind: Field,
1309 detail: "u32", 1315 detail: "u32",