aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_ide/src/completion/complete_keyword.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_ide/src/completion/complete_keyword.rs')
-rw-r--r--crates/ra_ide/src/completion/complete_keyword.rs269
1 files changed, 99 insertions, 170 deletions
diff --git a/crates/ra_ide/src/completion/complete_keyword.rs b/crates/ra_ide/src/completion/complete_keyword.rs
index d016f0c7c..0ab330b73 100644
--- a/crates/ra_ide/src/completion/complete_keyword.rs
+++ b/crates/ra_ide/src/completion/complete_keyword.rs
@@ -36,184 +36,98 @@ pub(super) fn complete_use_tree_keyword(acc: &mut Completions, ctx: &CompletionC
36 } 36 }
37} 37}
38 38
39fn keyword(ctx: &CompletionContext, kw: &str, snippet: &str) -> CompletionItem {
40 let res = CompletionItem::new(CompletionKind::Keyword, ctx.source_range(), kw)
41 .kind(CompletionItemKind::Keyword);
42
43 match ctx.config.snippet_cap {
44 Some(cap) => res.insert_snippet(cap, snippet),
45 _ => res.insert_text(if snippet.contains('$') { kw } else { snippet }),
46 }
47 .build()
48}
49
50fn add_keyword(
51 ctx: &CompletionContext,
52 acc: &mut Completions,
53 kw: &str,
54 snippet: &str,
55 should_add: bool,
56) {
57 if should_add {
58 acc.add(keyword(ctx, kw, snippet));
59 }
60}
61
62pub(super) fn complete_expr_keyword(acc: &mut Completions, ctx: &CompletionContext) { 39pub(super) fn complete_expr_keyword(acc: &mut Completions, ctx: &CompletionContext) {
63 let has_trait_or_impl_parent = ctx.has_impl_parent || ctx.has_trait_parent; 40 let has_trait_or_impl_parent = ctx.has_impl_parent || ctx.has_trait_parent;
64 if ctx.trait_as_prev_sibling || ctx.impl_as_prev_sibling { 41 if ctx.trait_as_prev_sibling || ctx.impl_as_prev_sibling {
65 add_keyword(ctx, acc, "where", "where ", true); 42 add_keyword(ctx, acc, "where", "where ");
66 return; 43 return;
67 } 44 }
68 if ctx.unsafe_is_prev { 45 if ctx.unsafe_is_prev {
69 add_keyword( 46 if ctx.has_item_list_or_source_file_parent || ctx.block_expr_parent {
70 ctx, 47 add_keyword(ctx, acc, "fn", "fn $0() {}")
71 acc, 48 }
72 "fn", 49
73 "fn $0() {}", 50 if (ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent)
74 ctx.has_item_list_or_source_file_parent || ctx.block_expr_parent, 51 || ctx.block_expr_parent
75 ); 52 {
76 add_keyword( 53 add_keyword(ctx, acc, "trait", "trait $0 {}");
77 ctx, 54 add_keyword(ctx, acc, "impl", "impl $0 {}");
78 acc, 55 }
79 "trait", 56
80 "trait $0 {}",
81 (ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent)
82 || ctx.block_expr_parent,
83 );
84 add_keyword(
85 ctx,
86 acc,
87 "impl",
88 "impl $0 {}",
89 (ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent)
90 || ctx.block_expr_parent,
91 );
92 return; 57 return;
93 } 58 }
94 add_keyword( 59 if ctx.has_item_list_or_source_file_parent || ctx.block_expr_parent {
95 ctx, 60 add_keyword(ctx, acc, "fn", "fn $0() {}");
96 acc, 61 }
97 "fn", 62 if (ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent)
98 "fn $0() {}", 63 || ctx.block_expr_parent
99 ctx.has_item_list_or_source_file_parent || ctx.block_expr_parent, 64 {
100 ); 65 add_keyword(ctx, acc, "use", "use ");
101 add_keyword( 66 add_keyword(ctx, acc, "impl", "impl $0 {}");
102 ctx, 67 add_keyword(ctx, acc, "trait", "trait $0 {}");
103 acc, 68 }
104 "use", 69
105 "use ", 70 if ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent {
106 (ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent) 71 add_keyword(ctx, acc, "enum", "enum $0 {}");
107 || ctx.block_expr_parent, 72 add_keyword(ctx, acc, "struct", "struct $0 {}");
108 ); 73 add_keyword(ctx, acc, "union", "union $0 {}");
109 add_keyword( 74 }
110 ctx, 75
111 acc, 76 if ctx.block_expr_parent || ctx.is_match_arm {
112 "impl", 77 add_keyword(ctx, acc, "match", "match $0 {}");
113 "impl $0 {}", 78 add_keyword(ctx, acc, "loop", "loop {$0}");
114 (ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent) 79 }
115 || ctx.block_expr_parent, 80 if ctx.block_expr_parent {
116 ); 81 add_keyword(ctx, acc, "while", "while $0 {}");
117 add_keyword( 82 }
118 ctx, 83 if ctx.if_is_prev || ctx.block_expr_parent {
119 acc, 84 add_keyword(ctx, acc, "let", "let ");
120 "trait", 85 }
121 "trait $0 {}", 86 if ctx.if_is_prev || ctx.block_expr_parent || ctx.is_match_arm {
122 (ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent) 87 add_keyword(ctx, acc, "if", "if ");
123 || ctx.block_expr_parent, 88 add_keyword(ctx, acc, "if let", "if let ");
124 ); 89 }
125 add_keyword( 90 if ctx.after_if {
126 ctx, 91 add_keyword(ctx, acc, "else", "else {$0}");
127 acc, 92 add_keyword(ctx, acc, "else if", "else if $0 {}");
128 "enum", 93 }
129 "enum $0 {}", 94 if (ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent)
130 ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent, 95 || ctx.block_expr_parent
131 ); 96 {
132 add_keyword( 97 add_keyword(ctx, acc, "mod", "mod $0 {}");
133 ctx, 98 }
134 acc, 99 if ctx.bind_pat_parent || ctx.ref_pat_parent {
135 "struct", 100 add_keyword(ctx, acc, "mut", "mut ");
136 "struct $0 {}", 101 }
137 ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent, 102 if ctx.has_item_list_or_source_file_parent || ctx.block_expr_parent {
138 ); 103 add_keyword(ctx, acc, "const", "const ");
139 add_keyword( 104 add_keyword(ctx, acc, "type", "type ");
140 ctx, 105 }
141 acc, 106 if (ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent)
142 "union", 107 || ctx.block_expr_parent
143 "union $0 {}", 108 {
144 ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent, 109 add_keyword(ctx, acc, "static", "static ");
145 ); 110 };
146 add_keyword(ctx, acc, "match", "match $0 {}", ctx.block_expr_parent || ctx.is_match_arm); 111 if (ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent)
147 add_keyword(ctx, acc, "loop", "loop {$0}", ctx.block_expr_parent || ctx.is_match_arm); 112 || ctx.block_expr_parent
148 add_keyword(ctx, acc, "while", "while $0 {}", ctx.block_expr_parent); 113 {
149 add_keyword(ctx, acc, "let", "let ", ctx.if_is_prev || ctx.block_expr_parent); 114 add_keyword(ctx, acc, "extern", "extern ");
150 add_keyword(ctx, acc, "if", "if ", ctx.if_is_prev || ctx.block_expr_parent || ctx.is_match_arm); 115 }
151 add_keyword( 116 if ctx.has_item_list_or_source_file_parent || ctx.block_expr_parent || ctx.is_match_arm {
152 ctx, 117 add_keyword(ctx, acc, "unsafe", "unsafe ");
153 acc, 118 }
154 "if let", 119 if ctx.in_loop_body {
155 "if let ", 120 if ctx.can_be_stmt {
156 ctx.if_is_prev || ctx.block_expr_parent || ctx.is_match_arm, 121 add_keyword(ctx, acc, "continue", "continue;");
157 ); 122 add_keyword(ctx, acc, "break", "break;");
158 add_keyword(ctx, acc, "else", "else {$0}", ctx.after_if); 123 } else {
159 add_keyword(ctx, acc, "else if", "else if $0 {}", ctx.after_if); 124 add_keyword(ctx, acc, "continue", "continue");
160 add_keyword( 125 add_keyword(ctx, acc, "break", "break");
161 ctx, 126 }
162 acc, 127 }
163 "mod", 128 if ctx.has_item_list_or_source_file_parent && !ctx.has_trait_parent {
164 "mod $0 {}", 129 add_keyword(ctx, acc, "pub", "pub ")
165 (ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent) 130 }
166 || ctx.block_expr_parent,
167 );
168 add_keyword(ctx, acc, "mut", "mut ", ctx.bind_pat_parent || ctx.ref_pat_parent);
169 add_keyword(
170 ctx,
171 acc,
172 "const",
173 "const ",
174 ctx.has_item_list_or_source_file_parent || ctx.block_expr_parent,
175 );
176 add_keyword(
177 ctx,
178 acc,
179 "type",
180 "type ",
181 ctx.has_item_list_or_source_file_parent || ctx.block_expr_parent,
182 );
183 add_keyword(
184 ctx,
185 acc,
186 "static",
187 "static ",
188 (ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent)
189 || ctx.block_expr_parent,
190 );
191 add_keyword(
192 ctx,
193 acc,
194 "extern",
195 "extern ",
196 (ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent)
197 || ctx.block_expr_parent,
198 );
199 add_keyword(
200 ctx,
201 acc,
202 "unsafe",
203 "unsafe ",
204 ctx.has_item_list_or_source_file_parent || ctx.block_expr_parent || ctx.is_match_arm,
205 );
206 add_keyword(ctx, acc, "continue", "continue;", ctx.in_loop_body && ctx.can_be_stmt);
207 add_keyword(ctx, acc, "break", "break;", ctx.in_loop_body && ctx.can_be_stmt);
208 add_keyword(ctx, acc, "continue", "continue", ctx.in_loop_body && !ctx.can_be_stmt);
209 add_keyword(ctx, acc, "break", "break", ctx.in_loop_body && !ctx.can_be_stmt);
210 add_keyword(
211 ctx,
212 acc,
213 "pub",
214 "pub ",
215 ctx.has_item_list_or_source_file_parent && !ctx.has_trait_parent,
216 );
217 131
218 if !ctx.is_trivial_path { 132 if !ctx.is_trivial_path {
219 return; 133 return;
@@ -225,6 +139,21 @@ pub(super) fn complete_expr_keyword(acc: &mut Completions, ctx: &CompletionConte
225 acc.add_all(complete_return(ctx, &fn_def, ctx.can_be_stmt)); 139 acc.add_all(complete_return(ctx, &fn_def, ctx.can_be_stmt));
226} 140}
227 141
142fn keyword(ctx: &CompletionContext, kw: &str, snippet: &str) -> CompletionItem {
143 let res = CompletionItem::new(CompletionKind::Keyword, ctx.source_range(), kw)
144 .kind(CompletionItemKind::Keyword);
145
146 match ctx.config.snippet_cap {
147 Some(cap) => res.insert_snippet(cap, snippet),
148 _ => res.insert_text(if snippet.contains('$') { kw } else { snippet }),
149 }
150 .build()
151}
152
153fn add_keyword(ctx: &CompletionContext, acc: &mut Completions, kw: &str, snippet: &str) {
154 acc.add(keyword(ctx, kw, snippet));
155}
156
228fn complete_return( 157fn complete_return(
229 ctx: &CompletionContext, 158 ctx: &CompletionContext,
230 fn_def: &ast::FnDef, 159 fn_def: &ast::FnDef,