diff options
Diffstat (limited to 'crates/ra_ide/src/completion/complete_keyword.rs')
-rw-r--r-- | crates/ra_ide/src/completion/complete_keyword.rs | 269 |
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 | ||
39 | fn 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 | |||
50 | fn 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 | |||
62 | pub(super) fn complete_expr_keyword(acc: &mut Completions, ctx: &CompletionContext) { | 39 | pub(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 | ||
142 | fn 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 | |||
153 | fn add_keyword(ctx: &CompletionContext, acc: &mut Completions, kw: &str, snippet: &str) { | ||
154 | acc.add(keyword(ctx, kw, snippet)); | ||
155 | } | ||
156 | |||
228 | fn complete_return( | 157 | fn complete_return( |
229 | ctx: &CompletionContext, | 158 | ctx: &CompletionContext, |
230 | fn_def: &ast::FnDef, | 159 | fn_def: &ast::FnDef, |