aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_ide/src/completion
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_ide/src/completion')
-rw-r--r--crates/ra_ide/src/completion/complete_attribute.rs587
-rw-r--r--crates/ra_ide/src/completion/complete_dot.rs112
-rw-r--r--crates/ra_ide/src/completion/complete_fn_param.rs12
-rw-r--r--crates/ra_ide/src/completion/complete_keyword.rs254
-rw-r--r--crates/ra_ide/src/completion/complete_macro_in_item_position.rs16
-rw-r--r--crates/ra_ide/src/completion/complete_pattern.rs28
-rw-r--r--crates/ra_ide/src/completion/complete_postfix.rs134
-rw-r--r--crates/ra_ide/src/completion/complete_qualified_path.rs196
-rw-r--r--crates/ra_ide/src/completion/complete_record.rs60
-rw-r--r--crates/ra_ide/src/completion/complete_snippet.rs20
-rw-r--r--crates/ra_ide/src/completion/complete_trait_impl.rs53
-rw-r--r--crates/ra_ide/src/completion/complete_unqualified_path.rs361
-rw-r--r--crates/ra_ide/src/completion/completion_context.rs16
-rw-r--r--crates/ra_ide/src/completion/completion_item.rs2
-rw-r--r--crates/ra_ide/src/completion/presentation.rs207
15 files changed, 1364 insertions, 694 deletions
diff --git a/crates/ra_ide/src/completion/complete_attribute.rs b/crates/ra_ide/src/completion/complete_attribute.rs
new file mode 100644
index 000000000..8bf952798
--- /dev/null
+++ b/crates/ra_ide/src/completion/complete_attribute.rs
@@ -0,0 +1,587 @@
1//! Completion for attributes
2//!
3//! This module uses a bit of static metadata to provide completions
4//! for built-in attributes.
5
6use super::completion_context::CompletionContext;
7use super::completion_item::{CompletionItem, CompletionItemKind, CompletionKind, Completions};
8use ra_syntax::{
9 ast::{Attr, AttrKind},
10 AstNode,
11};
12
13pub(super) fn complete_attribute(acc: &mut Completions, ctx: &CompletionContext) {
14 if !ctx.is_attribute {
15 return;
16 }
17
18 let is_inner = ctx
19 .original_token
20 .ancestors()
21 .find_map(Attr::cast)
22 .map(|attr| attr.kind() == AttrKind::Inner)
23 .unwrap_or(false);
24
25 for attr_completion in ATTRIBUTES {
26 let mut item = CompletionItem::new(
27 CompletionKind::Attribute,
28 ctx.source_range(),
29 attr_completion.label,
30 )
31 .kind(CompletionItemKind::Attribute);
32
33 match (attr_completion.snippet, ctx.config.snippet_cap) {
34 (Some(snippet), Some(cap)) => {
35 item = item.insert_snippet(cap, snippet);
36 }
37 _ => {}
38 }
39
40 if is_inner || !attr_completion.should_be_inner {
41 acc.add(item);
42 }
43 }
44}
45
46struct AttrCompletion {
47 label: &'static str,
48 snippet: Option<&'static str>,
49 should_be_inner: bool,
50}
51
52const ATTRIBUTES: &[AttrCompletion] = &[
53 AttrCompletion { label: "allow", snippet: Some("allow(${0:lint})"), should_be_inner: false },
54 AttrCompletion {
55 label: "cfg_attr",
56 snippet: Some("cfg_attr(${1:predicate}, ${0:attr})"),
57 should_be_inner: false,
58 },
59 AttrCompletion { label: "cfg", snippet: Some("cfg(${0:predicate})"), should_be_inner: false },
60 AttrCompletion { label: "deny", snippet: Some("deny(${0:lint})"), should_be_inner: false },
61 AttrCompletion {
62 label: "deprecated",
63 snippet: Some(r#"deprecated = "${0:reason}""#),
64 should_be_inner: false,
65 },
66 AttrCompletion {
67 label: "derive",
68 snippet: Some(r#"derive(${0:Debug})"#),
69 should_be_inner: false,
70 },
71 AttrCompletion { label: "doc", snippet: Some(r#"doc = "${0:docs}""#), should_be_inner: false },
72 AttrCompletion { label: "feature", snippet: Some("feature(${0:flag})"), should_be_inner: true },
73 AttrCompletion { label: "forbid", snippet: Some("forbid(${0:lint})"), should_be_inner: false },
74 // FIXME: resolve through macro resolution?
75 AttrCompletion { label: "global_allocator", snippet: None, should_be_inner: true },
76 AttrCompletion { label: "ignore", snippet: Some("ignore(${0:lint})"), should_be_inner: false },
77 AttrCompletion { label: "inline", snippet: Some("inline(${0:lint})"), should_be_inner: false },
78 AttrCompletion {
79 label: "link_name",
80 snippet: Some(r#"link_name = "${0:symbol_name}""#),
81 should_be_inner: false,
82 },
83 AttrCompletion { label: "link", snippet: None, should_be_inner: false },
84 AttrCompletion { label: "macro_export", snippet: None, should_be_inner: false },
85 AttrCompletion { label: "macro_use", snippet: None, should_be_inner: false },
86 AttrCompletion {
87 label: "must_use",
88 snippet: Some(r#"must_use = "${0:reason}""#),
89 should_be_inner: false,
90 },
91 AttrCompletion { label: "no_mangle", snippet: None, should_be_inner: false },
92 AttrCompletion { label: "no_std", snippet: None, should_be_inner: true },
93 AttrCompletion { label: "non_exhaustive", snippet: None, should_be_inner: false },
94 AttrCompletion { label: "panic_handler", snippet: None, should_be_inner: true },
95 AttrCompletion { label: "path", snippet: Some("path =\"${0:path}\""), should_be_inner: false },
96 AttrCompletion { label: "proc_macro", snippet: None, should_be_inner: false },
97 AttrCompletion { label: "proc_macro_attribute", snippet: None, should_be_inner: false },
98 AttrCompletion {
99 label: "proc_macro_derive",
100 snippet: Some("proc_macro_derive(${0:Trait})"),
101 should_be_inner: false,
102 },
103 AttrCompletion {
104 label: "recursion_limit",
105 snippet: Some("recursion_limit = ${0:128}"),
106 should_be_inner: true,
107 },
108 AttrCompletion { label: "repr", snippet: Some("repr(${0:C})"), should_be_inner: false },
109 AttrCompletion {
110 label: "should_panic",
111 snippet: Some(r#"expected = "${0:reason}""#),
112 should_be_inner: false,
113 },
114 AttrCompletion {
115 label: "target_feature",
116 snippet: Some("target_feature = \"${0:feature}\""),
117 should_be_inner: false,
118 },
119 AttrCompletion { label: "test", snippet: None, should_be_inner: false },
120 AttrCompletion { label: "used", snippet: None, should_be_inner: false },
121 AttrCompletion { label: "warn", snippet: Some("warn(${0:lint})"), should_be_inner: false },
122 AttrCompletion {
123 label: "windows_subsystem",
124 snippet: Some(r#"windows_subsystem = "${0:subsystem}""#),
125 should_be_inner: true,
126 },
127];
128
129#[cfg(test)]
130mod tests {
131 use crate::completion::{test_utils::do_completion, CompletionItem, CompletionKind};
132 use insta::assert_debug_snapshot;
133
134 fn do_attr_completion(code: &str) -> Vec<CompletionItem> {
135 do_completion(code, CompletionKind::Attribute)
136 }
137
138 #[test]
139 fn test_attribute_completion() {
140 assert_debug_snapshot!(
141 do_attr_completion(
142 r"
143 #[<|>]
144 ",
145 ),
146 @r###"
147 [
148 CompletionItem {
149 label: "allow",
150 source_range: 19..19,
151 delete: 19..19,
152 insert: "allow(${0:lint})",
153 kind: Attribute,
154 },
155 CompletionItem {
156 label: "cfg",
157 source_range: 19..19,
158 delete: 19..19,
159 insert: "cfg(${0:predicate})",
160 kind: Attribute,
161 },
162 CompletionItem {
163 label: "cfg_attr",
164 source_range: 19..19,
165 delete: 19..19,
166 insert: "cfg_attr(${1:predicate}, ${0:attr})",
167 kind: Attribute,
168 },
169 CompletionItem {
170 label: "deny",
171 source_range: 19..19,
172 delete: 19..19,
173 insert: "deny(${0:lint})",
174 kind: Attribute,
175 },
176 CompletionItem {
177 label: "deprecated",
178 source_range: 19..19,
179 delete: 19..19,
180 insert: "deprecated = \"${0:reason}\"",
181 kind: Attribute,
182 },
183 CompletionItem {
184 label: "derive",
185 source_range: 19..19,
186 delete: 19..19,
187 insert: "derive(${0:Debug})",
188 kind: Attribute,
189 },
190 CompletionItem {
191 label: "doc",
192 source_range: 19..19,
193 delete: 19..19,
194 insert: "doc = \"${0:docs}\"",
195 kind: Attribute,
196 },
197 CompletionItem {
198 label: "forbid",
199 source_range: 19..19,
200 delete: 19..19,
201 insert: "forbid(${0:lint})",
202 kind: Attribute,
203 },
204 CompletionItem {
205 label: "ignore",
206 source_range: 19..19,
207 delete: 19..19,
208 insert: "ignore(${0:lint})",
209 kind: Attribute,
210 },
211 CompletionItem {
212 label: "inline",
213 source_range: 19..19,
214 delete: 19..19,
215 insert: "inline(${0:lint})",
216 kind: Attribute,
217 },
218 CompletionItem {
219 label: "link",
220 source_range: 19..19,
221 delete: 19..19,
222 insert: "link",
223 kind: Attribute,
224 },
225 CompletionItem {
226 label: "link_name",
227 source_range: 19..19,
228 delete: 19..19,
229 insert: "link_name = \"${0:symbol_name}\"",
230 kind: Attribute,
231 },
232 CompletionItem {
233 label: "macro_export",
234 source_range: 19..19,
235 delete: 19..19,
236 insert: "macro_export",
237 kind: Attribute,
238 },
239 CompletionItem {
240 label: "macro_use",
241 source_range: 19..19,
242 delete: 19..19,
243 insert: "macro_use",
244 kind: Attribute,
245 },
246 CompletionItem {
247 label: "must_use",
248 source_range: 19..19,
249 delete: 19..19,
250 insert: "must_use = \"${0:reason}\"",
251 kind: Attribute,
252 },
253 CompletionItem {
254 label: "no_mangle",
255 source_range: 19..19,
256 delete: 19..19,
257 insert: "no_mangle",
258 kind: Attribute,
259 },
260 CompletionItem {
261 label: "non_exhaustive",
262 source_range: 19..19,
263 delete: 19..19,
264 insert: "non_exhaustive",
265 kind: Attribute,
266 },
267 CompletionItem {
268 label: "path",
269 source_range: 19..19,
270 delete: 19..19,
271 insert: "path =\"${0:path}\"",
272 kind: Attribute,
273 },
274 CompletionItem {
275 label: "proc_macro",
276 source_range: 19..19,
277 delete: 19..19,
278 insert: "proc_macro",
279 kind: Attribute,
280 },
281 CompletionItem {
282 label: "proc_macro_attribute",
283 source_range: 19..19,
284 delete: 19..19,
285 insert: "proc_macro_attribute",
286 kind: Attribute,
287 },
288 CompletionItem {
289 label: "proc_macro_derive",
290 source_range: 19..19,
291 delete: 19..19,
292 insert: "proc_macro_derive(${0:Trait})",
293 kind: Attribute,
294 },
295 CompletionItem {
296 label: "repr",
297 source_range: 19..19,
298 delete: 19..19,
299 insert: "repr(${0:C})",
300 kind: Attribute,
301 },
302 CompletionItem {
303 label: "should_panic",
304 source_range: 19..19,
305 delete: 19..19,
306 insert: "expected = \"${0:reason}\"",
307 kind: Attribute,
308 },
309 CompletionItem {
310 label: "target_feature",
311 source_range: 19..19,
312 delete: 19..19,
313 insert: "target_feature = \"${0:feature}\"",
314 kind: Attribute,
315 },
316 CompletionItem {
317 label: "test",
318 source_range: 19..19,
319 delete: 19..19,
320 insert: "test",
321 kind: Attribute,
322 },
323 CompletionItem {
324 label: "used",
325 source_range: 19..19,
326 delete: 19..19,
327 insert: "used",
328 kind: Attribute,
329 },
330 CompletionItem {
331 label: "warn",
332 source_range: 19..19,
333 delete: 19..19,
334 insert: "warn(${0:lint})",
335 kind: Attribute,
336 },
337 ]
338 "###
339 );
340 }
341
342 #[test]
343 fn test_inner_attribute_completion() {
344 assert_debug_snapshot!(
345 do_attr_completion(
346 r"
347 #![<|>]
348 ",
349 ),
350 @r###"
351 [
352 CompletionItem {
353 label: "allow",
354 source_range: 20..20,
355 delete: 20..20,
356 insert: "allow(${0:lint})",
357 kind: Attribute,
358 },
359 CompletionItem {
360 label: "cfg",
361 source_range: 20..20,
362 delete: 20..20,
363 insert: "cfg(${0:predicate})",
364 kind: Attribute,
365 },
366 CompletionItem {
367 label: "cfg_attr",
368 source_range: 20..20,
369 delete: 20..20,
370 insert: "cfg_attr(${1:predicate}, ${0:attr})",
371 kind: Attribute,
372 },
373 CompletionItem {
374 label: "deny",
375 source_range: 20..20,
376 delete: 20..20,
377 insert: "deny(${0:lint})",
378 kind: Attribute,
379 },
380 CompletionItem {
381 label: "deprecated",
382 source_range: 20..20,
383 delete: 20..20,
384 insert: "deprecated = \"${0:reason}\"",
385 kind: Attribute,
386 },
387 CompletionItem {
388 label: "derive",
389 source_range: 20..20,
390 delete: 20..20,
391 insert: "derive(${0:Debug})",
392 kind: Attribute,
393 },
394 CompletionItem {
395 label: "doc",
396 source_range: 20..20,
397 delete: 20..20,
398 insert: "doc = \"${0:docs}\"",
399 kind: Attribute,
400 },
401 CompletionItem {
402 label: "feature",
403 source_range: 20..20,
404 delete: 20..20,
405 insert: "feature(${0:flag})",
406 kind: Attribute,
407 },
408 CompletionItem {
409 label: "forbid",
410 source_range: 20..20,
411 delete: 20..20,
412 insert: "forbid(${0:lint})",
413 kind: Attribute,
414 },
415 CompletionItem {
416 label: "global_allocator",
417 source_range: 20..20,
418 delete: 20..20,
419 insert: "global_allocator",
420 kind: Attribute,
421 },
422 CompletionItem {
423 label: "ignore",
424 source_range: 20..20,
425 delete: 20..20,
426 insert: "ignore(${0:lint})",
427 kind: Attribute,
428 },
429 CompletionItem {
430 label: "inline",
431 source_range: 20..20,
432 delete: 20..20,
433 insert: "inline(${0:lint})",
434 kind: Attribute,
435 },
436 CompletionItem {
437 label: "link",
438 source_range: 20..20,
439 delete: 20..20,
440 insert: "link",
441 kind: Attribute,
442 },
443 CompletionItem {
444 label: "link_name",
445 source_range: 20..20,
446 delete: 20..20,
447 insert: "link_name = \"${0:symbol_name}\"",
448 kind: Attribute,
449 },
450 CompletionItem {
451 label: "macro_export",
452 source_range: 20..20,
453 delete: 20..20,
454 insert: "macro_export",
455 kind: Attribute,
456 },
457 CompletionItem {
458 label: "macro_use",
459 source_range: 20..20,
460 delete: 20..20,
461 insert: "macro_use",
462 kind: Attribute,
463 },
464 CompletionItem {
465 label: "must_use",
466 source_range: 20..20,
467 delete: 20..20,
468 insert: "must_use = \"${0:reason}\"",
469 kind: Attribute,
470 },
471 CompletionItem {
472 label: "no_mangle",
473 source_range: 20..20,
474 delete: 20..20,
475 insert: "no_mangle",
476 kind: Attribute,
477 },
478 CompletionItem {
479 label: "no_std",
480 source_range: 20..20,
481 delete: 20..20,
482 insert: "no_std",
483 kind: Attribute,
484 },
485 CompletionItem {
486 label: "non_exhaustive",
487 source_range: 20..20,
488 delete: 20..20,
489 insert: "non_exhaustive",
490 kind: Attribute,
491 },
492 CompletionItem {
493 label: "panic_handler",
494 source_range: 20..20,
495 delete: 20..20,
496 insert: "panic_handler",
497 kind: Attribute,
498 },
499 CompletionItem {
500 label: "path",
501 source_range: 20..20,
502 delete: 20..20,
503 insert: "path =\"${0:path}\"",
504 kind: Attribute,
505 },
506 CompletionItem {
507 label: "proc_macro",
508 source_range: 20..20,
509 delete: 20..20,
510 insert: "proc_macro",
511 kind: Attribute,
512 },
513 CompletionItem {
514 label: "proc_macro_attribute",
515 source_range: 20..20,
516 delete: 20..20,
517 insert: "proc_macro_attribute",
518 kind: Attribute,
519 },
520 CompletionItem {
521 label: "proc_macro_derive",
522 source_range: 20..20,
523 delete: 20..20,
524 insert: "proc_macro_derive(${0:Trait})",
525 kind: Attribute,
526 },
527 CompletionItem {
528 label: "recursion_limit",
529 source_range: 20..20,
530 delete: 20..20,
531 insert: "recursion_limit = ${0:128}",
532 kind: Attribute,
533 },
534 CompletionItem {
535 label: "repr",
536 source_range: 20..20,
537 delete: 20..20,
538 insert: "repr(${0:C})",
539 kind: Attribute,
540 },
541 CompletionItem {
542 label: "should_panic",
543 source_range: 20..20,
544 delete: 20..20,
545 insert: "expected = \"${0:reason}\"",
546 kind: Attribute,
547 },
548 CompletionItem {
549 label: "target_feature",
550 source_range: 20..20,
551 delete: 20..20,
552 insert: "target_feature = \"${0:feature}\"",
553 kind: Attribute,
554 },
555 CompletionItem {
556 label: "test",
557 source_range: 20..20,
558 delete: 20..20,
559 insert: "test",
560 kind: Attribute,
561 },
562 CompletionItem {
563 label: "used",
564 source_range: 20..20,
565 delete: 20..20,
566 insert: "used",
567 kind: Attribute,
568 },
569 CompletionItem {
570 label: "warn",
571 source_range: 20..20,
572 delete: 20..20,
573 insert: "warn(${0:lint})",
574 kind: Attribute,
575 },
576 CompletionItem {
577 label: "windows_subsystem",
578 source_range: 20..20,
579 delete: 20..20,
580 insert: "windows_subsystem = \"${0:subsystem}\"",
581 kind: Attribute,
582 },
583 ]
584 "###
585 );
586 }
587}
diff --git a/crates/ra_ide/src/completion/complete_dot.rs b/crates/ra_ide/src/completion/complete_dot.rs
index b93153b48..814354ffa 100644
--- a/crates/ra_ide/src/completion/complete_dot.rs
+++ b/crates/ra_ide/src/completion/complete_dot.rs
@@ -94,8 +94,8 @@ mod tests {
94 [ 94 [
95 CompletionItem { 95 CompletionItem {
96 label: "the_field", 96 label: "the_field",
97 source_range: [94; 94), 97 source_range: 94..94,
98 delete: [94; 94), 98 delete: 94..94,
99 insert: "the_field", 99 insert: "the_field",
100 kind: Field, 100 kind: Field,
101 detail: "u32", 101 detail: "u32",
@@ -125,8 +125,8 @@ mod tests {
125 [ 125 [
126 CompletionItem { 126 CompletionItem {
127 label: "foo()", 127 label: "foo()",
128 source_range: [187; 187), 128 source_range: 187..187,
129 delete: [187; 187), 129 delete: 187..187,
130 insert: "foo()$0", 130 insert: "foo()$0",
131 kind: Method, 131 kind: Method,
132 lookup: "foo", 132 lookup: "foo",
@@ -134,8 +134,8 @@ mod tests {
134 }, 134 },
135 CompletionItem { 135 CompletionItem {
136 label: "the_field", 136 label: "the_field",
137 source_range: [187; 187), 137 source_range: 187..187,
138 delete: [187; 187), 138 delete: 187..187,
139 insert: "the_field", 139 insert: "the_field",
140 kind: Field, 140 kind: Field,
141 detail: "(u32,)", 141 detail: "(u32,)",
@@ -165,8 +165,8 @@ mod tests {
165 [ 165 [
166 CompletionItem { 166 CompletionItem {
167 label: "foo()", 167 label: "foo()",
168 source_range: [126; 126), 168 source_range: 126..126,
169 delete: [126; 126), 169 delete: 126..126,
170 insert: "foo()$0", 170 insert: "foo()$0",
171 kind: Method, 171 kind: Method,
172 lookup: "foo", 172 lookup: "foo",
@@ -174,8 +174,8 @@ mod tests {
174 }, 174 },
175 CompletionItem { 175 CompletionItem {
176 label: "the_field", 176 label: "the_field",
177 source_range: [126; 126), 177 source_range: 126..126,
178 delete: [126; 126), 178 delete: 126..126,
179 insert: "the_field", 179 insert: "the_field",
180 kind: Field, 180 kind: Field,
181 detail: "(u32, i32)", 181 detail: "(u32, i32)",
@@ -222,24 +222,24 @@ mod tests {
222 [ 222 [
223 CompletionItem { 223 CompletionItem {
224 label: "crate_field", 224 label: "crate_field",
225 source_range: [313; 313), 225 source_range: 313..313,
226 delete: [313; 313), 226 delete: 313..313,
227 insert: "crate_field", 227 insert: "crate_field",
228 kind: Field, 228 kind: Field,
229 detail: "u32", 229 detail: "u32",
230 }, 230 },
231 CompletionItem { 231 CompletionItem {
232 label: "pub_field", 232 label: "pub_field",
233 source_range: [313; 313), 233 source_range: 313..313,
234 delete: [313; 313), 234 delete: 313..313,
235 insert: "pub_field", 235 insert: "pub_field",
236 kind: Field, 236 kind: Field,
237 detail: "u32", 237 detail: "u32",
238 }, 238 },
239 CompletionItem { 239 CompletionItem {
240 label: "super_field", 240 label: "super_field",
241 source_range: [313; 313), 241 source_range: 313..313,
242 delete: [313; 313), 242 delete: 313..313,
243 insert: "super_field", 243 insert: "super_field",
244 kind: Field, 244 kind: Field,
245 detail: "u32", 245 detail: "u32",
@@ -267,8 +267,8 @@ mod tests {
267 [ 267 [
268 CompletionItem { 268 CompletionItem {
269 label: "the_method()", 269 label: "the_method()",
270 source_range: [144; 144), 270 source_range: 144..144,
271 delete: [144; 144), 271 delete: 144..144,
272 insert: "the_method()$0", 272 insert: "the_method()$0",
273 kind: Method, 273 kind: Method,
274 lookup: "the_method", 274 lookup: "the_method",
@@ -300,8 +300,8 @@ mod tests {
300 [ 300 [
301 CompletionItem { 301 CompletionItem {
302 label: "the_method()", 302 label: "the_method()",
303 source_range: [243; 243), 303 source_range: 243..243,
304 delete: [243; 243), 304 delete: 243..243,
305 insert: "the_method()$0", 305 insert: "the_method()$0",
306 kind: Method, 306 kind: Method,
307 lookup: "the_method", 307 lookup: "the_method",
@@ -333,8 +333,8 @@ mod tests {
333 [ 333 [
334 CompletionItem { 334 CompletionItem {
335 label: "the_method()", 335 label: "the_method()",
336 source_range: [256; 256), 336 source_range: 256..256,
337 delete: [256; 256), 337 delete: 256..256,
338 insert: "the_method()$0", 338 insert: "the_method()$0",
339 kind: Method, 339 kind: Method,
340 lookup: "the_method", 340 lookup: "the_method",
@@ -362,8 +362,8 @@ mod tests {
362 [ 362 [
363 CompletionItem { 363 CompletionItem {
364 label: "the_method()", 364 label: "the_method()",
365 source_range: [151; 151), 365 source_range: 151..151,
366 delete: [151; 151), 366 delete: 151..151,
367 insert: "the_method()$0", 367 insert: "the_method()$0",
368 kind: Method, 368 kind: Method,
369 lookup: "the_method", 369 lookup: "the_method",
@@ -391,8 +391,8 @@ mod tests {
391 [ 391 [
392 CompletionItem { 392 CompletionItem {
393 label: "the_method()", 393 label: "the_method()",
394 source_range: [155; 155), 394 source_range: 155..155,
395 delete: [155; 155), 395 delete: 155..155,
396 insert: "the_method()$0", 396 insert: "the_method()$0",
397 kind: Method, 397 kind: Method,
398 lookup: "the_method", 398 lookup: "the_method",
@@ -423,8 +423,8 @@ mod tests {
423 [ 423 [
424 CompletionItem { 424 CompletionItem {
425 label: "the_method()", 425 label: "the_method()",
426 source_range: [219; 219), 426 source_range: 219..219,
427 delete: [219; 219), 427 delete: 219..219,
428 insert: "the_method()$0", 428 insert: "the_method()$0",
429 kind: Method, 429 kind: Method,
430 lookup: "the_method", 430 lookup: "the_method",
@@ -475,8 +475,8 @@ mod tests {
475 [ 475 [
476 CompletionItem { 476 CompletionItem {
477 label: "the_method()", 477 label: "the_method()",
478 source_range: [249; 249), 478 source_range: 249..249,
479 delete: [249; 249), 479 delete: 249..249,
480 insert: "the_method()$0", 480 insert: "the_method()$0",
481 kind: Method, 481 kind: Method,
482 lookup: "the_method", 482 lookup: "the_method",
@@ -502,16 +502,16 @@ mod tests {
502 [ 502 [
503 CompletionItem { 503 CompletionItem {
504 label: "0", 504 label: "0",
505 source_range: [75; 75), 505 source_range: 75..75,
506 delete: [75; 75), 506 delete: 75..75,
507 insert: "0", 507 insert: "0",
508 kind: Field, 508 kind: Field,
509 detail: "i32", 509 detail: "i32",
510 }, 510 },
511 CompletionItem { 511 CompletionItem {
512 label: "1", 512 label: "1",
513 source_range: [75; 75), 513 source_range: 75..75,
514 delete: [75; 75), 514 delete: 75..75,
515 insert: "1", 515 insert: "1",
516 kind: Field, 516 kind: Field,
517 detail: "f64", 517 detail: "f64",
@@ -545,8 +545,8 @@ mod tests {
545 [ 545 [
546 CompletionItem { 546 CompletionItem {
547 label: "blah()", 547 label: "blah()",
548 source_range: [299; 300), 548 source_range: 299..300,
549 delete: [299; 300), 549 delete: 299..300,
550 insert: "blah()$0", 550 insert: "blah()$0",
551 kind: Method, 551 kind: Method,
552 lookup: "blah", 552 lookup: "blah",
@@ -572,8 +572,8 @@ mod tests {
572 [ 572 [
573 CompletionItem { 573 CompletionItem {
574 label: "the_field", 574 label: "the_field",
575 source_range: [106; 106), 575 source_range: 106..106,
576 delete: [106; 106), 576 delete: 106..106,
577 insert: "the_field", 577 insert: "the_field",
578 kind: Field, 578 kind: Field,
579 detail: "u32", 579 detail: "u32",
@@ -606,8 +606,8 @@ mod tests {
606 [ 606 [
607 CompletionItem { 607 CompletionItem {
608 label: "await", 608 label: "await",
609 source_range: [74; 74), 609 source_range: 74..74,
610 delete: [74; 74), 610 delete: 74..74,
611 insert: "await", 611 insert: "await",
612 detail: "expr.await", 612 detail: "expr.await",
613 }, 613 },
@@ -638,15 +638,15 @@ mod tests {
638 [ 638 [
639 CompletionItem { 639 CompletionItem {
640 label: "A", 640 label: "A",
641 source_range: [217; 217), 641 source_range: 217..217,
642 delete: [217; 217), 642 delete: 217..217,
643 insert: "A", 643 insert: "A",
644 kind: Const, 644 kind: Const,
645 }, 645 },
646 CompletionItem { 646 CompletionItem {
647 label: "b", 647 label: "b",
648 source_range: [217; 217), 648 source_range: 217..217,
649 delete: [217; 217), 649 delete: 217..217,
650 insert: "b", 650 insert: "b",
651 kind: Module, 651 kind: Module,
652 }, 652 },
@@ -671,8 +671,8 @@ mod tests {
671 [ 671 [
672 CompletionItem { 672 CompletionItem {
673 label: "the_field", 673 label: "the_field",
674 source_range: [156; 157), 674 source_range: 156..157,
675 delete: [156; 157), 675 delete: 156..157,
676 insert: "the_field", 676 insert: "the_field",
677 kind: Field, 677 kind: Field,
678 detail: "u32", 678 detail: "u32",
@@ -698,8 +698,8 @@ mod tests {
698 [ 698 [
699 CompletionItem { 699 CompletionItem {
700 label: "the_field", 700 label: "the_field",
701 source_range: [156; 157), 701 source_range: 156..157,
702 delete: [156; 157), 702 delete: 156..157,
703 insert: "the_field", 703 insert: "the_field",
704 kind: Field, 704 kind: Field,
705 detail: "u32", 705 detail: "u32",
@@ -726,8 +726,8 @@ mod tests {
726 [ 726 [
727 CompletionItem { 727 CompletionItem {
728 label: "the_field", 728 label: "the_field",
729 source_range: [156; 156), 729 source_range: 156..156,
730 delete: [156; 156), 730 delete: 156..156,
731 insert: "the_field", 731 insert: "the_field",
732 kind: Field, 732 kind: Field,
733 detail: "u32", 733 detail: "u32",
@@ -753,8 +753,8 @@ mod tests {
753 [ 753 [
754 CompletionItem { 754 CompletionItem {
755 label: "the_field", 755 label: "the_field",
756 source_range: [162; 163), 756 source_range: 162..163,
757 delete: [162; 163), 757 delete: 162..163,
758 insert: "the_field", 758 insert: "the_field",
759 kind: Field, 759 kind: Field,
760 detail: "u32", 760 detail: "u32",
@@ -790,8 +790,8 @@ mod tests {
790 [ 790 [
791 CompletionItem { 791 CompletionItem {
792 label: "the_field", 792 label: "the_field",
793 source_range: [552; 552), 793 source_range: 552..552,
794 delete: [552; 552), 794 delete: 552..552,
795 insert: "the_field", 795 insert: "the_field",
796 kind: Field, 796 kind: Field,
797 detail: "u32", 797 detail: "u32",
@@ -820,8 +820,8 @@ mod tests {
820 [ 820 [
821 CompletionItem { 821 CompletionItem {
822 label: "the_method()", 822 label: "the_method()",
823 source_range: [201; 201), 823 source_range: 201..201,
824 delete: [201; 201), 824 delete: 201..201,
825 insert: "the_method()$0", 825 insert: "the_method()$0",
826 kind: Method, 826 kind: Method,
827 lookup: "the_method", 827 lookup: "the_method",
diff --git a/crates/ra_ide/src/completion/complete_fn_param.rs b/crates/ra_ide/src/completion/complete_fn_param.rs
index f84b559fc..a661932a3 100644
--- a/crates/ra_ide/src/completion/complete_fn_param.rs
+++ b/crates/ra_ide/src/completion/complete_fn_param.rs
@@ -75,8 +75,8 @@ mod tests {
75 [ 75 [
76 CompletionItem { 76 CompletionItem {
77 label: "file_id: FileId", 77 label: "file_id: FileId",
78 source_range: [110; 114), 78 source_range: 110..114,
79 delete: [110; 114), 79 delete: 110..114,
80 insert: "file_id: FileId", 80 insert: "file_id: FileId",
81 lookup: "file_id", 81 lookup: "file_id",
82 }, 82 },
@@ -99,8 +99,8 @@ mod tests {
99 [ 99 [
100 CompletionItem { 100 CompletionItem {
101 label: "file_id: FileId", 101 label: "file_id: FileId",
102 source_range: [110; 114), 102 source_range: 110..114,
103 delete: [110; 114), 103 delete: 110..114,
104 insert: "file_id: FileId", 104 insert: "file_id: FileId",
105 lookup: "file_id", 105 lookup: "file_id",
106 }, 106 },
@@ -126,8 +126,8 @@ mod tests {
126 [ 126 [
127 CompletionItem { 127 CompletionItem {
128 label: "file_id: FileId", 128 label: "file_id: FileId",
129 source_range: [289; 293), 129 source_range: 289..293,
130 delete: [289; 293), 130 delete: 289..293,
131 insert: "file_id: FileId", 131 insert: "file_id: FileId",
132 lookup: "file_id", 132 lookup: "file_id",
133 }, 133 },
diff --git a/crates/ra_ide/src/completion/complete_keyword.rs b/crates/ra_ide/src/completion/complete_keyword.rs
index adefb290e..fd95bc410 100644
--- a/crates/ra_ide/src/completion/complete_keyword.rs
+++ b/crates/ra_ide/src/completion/complete_keyword.rs
@@ -97,7 +97,7 @@ fn is_in_loop_body(leaf: &SyntaxToken) -> bool {
97 } 97 }
98 }; 98 };
99 if let Some(body) = loop_body { 99 if let Some(body) = loop_body {
100 if leaf.text_range().is_subrange(&body.syntax().text_range()) { 100 if body.syntax().text_range().contains_range(leaf.text_range()) {
101 return true; 101 return true;
102 } 102 }
103 } 103 }
@@ -140,22 +140,22 @@ mod tests {
140 [ 140 [
141 CompletionItem { 141 CompletionItem {
142 label: "crate", 142 label: "crate",
143 source_range: [21; 21), 143 source_range: 21..21,
144 delete: [21; 21), 144 delete: 21..21,
145 insert: "crate::", 145 insert: "crate::",
146 kind: Keyword, 146 kind: Keyword,
147 }, 147 },
148 CompletionItem { 148 CompletionItem {
149 label: "self", 149 label: "self",
150 source_range: [21; 21), 150 source_range: 21..21,
151 delete: [21; 21), 151 delete: 21..21,
152 insert: "self", 152 insert: "self",
153 kind: Keyword, 153 kind: Keyword,
154 }, 154 },
155 CompletionItem { 155 CompletionItem {
156 label: "super", 156 label: "super",
157 source_range: [21; 21), 157 source_range: 21..21,
158 delete: [21; 21), 158 delete: 21..21,
159 insert: "super::", 159 insert: "super::",
160 kind: Keyword, 160 kind: Keyword,
161 }, 161 },
@@ -173,15 +173,15 @@ mod tests {
173 [ 173 [
174 CompletionItem { 174 CompletionItem {
175 label: "self", 175 label: "self",
176 source_range: [24; 24), 176 source_range: 24..24,
177 delete: [24; 24), 177 delete: 24..24,
178 insert: "self", 178 insert: "self",
179 kind: Keyword, 179 kind: Keyword,
180 }, 180 },
181 CompletionItem { 181 CompletionItem {
182 label: "super", 182 label: "super",
183 source_range: [24; 24), 183 source_range: 24..24,
184 delete: [24; 24), 184 delete: 24..24,
185 insert: "super::", 185 insert: "super::",
186 kind: Keyword, 186 kind: Keyword,
187 }, 187 },
@@ -199,15 +199,15 @@ mod tests {
199 [ 199 [
200 CompletionItem { 200 CompletionItem {
201 label: "self", 201 label: "self",
202 source_range: [28; 28), 202 source_range: 28..28,
203 delete: [28; 28), 203 delete: 28..28,
204 insert: "self", 204 insert: "self",
205 kind: Keyword, 205 kind: Keyword,
206 }, 206 },
207 CompletionItem { 207 CompletionItem {
208 label: "super", 208 label: "super",
209 source_range: [28; 28), 209 source_range: 28..28,
210 delete: [28; 28), 210 delete: 28..28,
211 insert: "super::", 211 insert: "super::",
212 kind: Keyword, 212 kind: Keyword,
213 }, 213 },
@@ -230,36 +230,36 @@ mod tests {
230 [ 230 [
231 CompletionItem { 231 CompletionItem {
232 label: "if", 232 label: "if",
233 source_range: [49; 49), 233 source_range: 49..49,
234 delete: [49; 49), 234 delete: 49..49,
235 insert: "if $0 {}", 235 insert: "if $0 {}",
236 kind: Keyword, 236 kind: Keyword,
237 }, 237 },
238 CompletionItem { 238 CompletionItem {
239 label: "loop", 239 label: "loop",
240 source_range: [49; 49), 240 source_range: 49..49,
241 delete: [49; 49), 241 delete: 49..49,
242 insert: "loop {$0}", 242 insert: "loop {$0}",
243 kind: Keyword, 243 kind: Keyword,
244 }, 244 },
245 CompletionItem { 245 CompletionItem {
246 label: "match", 246 label: "match",
247 source_range: [49; 49), 247 source_range: 49..49,
248 delete: [49; 49), 248 delete: 49..49,
249 insert: "match $0 {}", 249 insert: "match $0 {}",
250 kind: Keyword, 250 kind: Keyword,
251 }, 251 },
252 CompletionItem { 252 CompletionItem {
253 label: "return", 253 label: "return",
254 source_range: [49; 49), 254 source_range: 49..49,
255 delete: [49; 49), 255 delete: 49..49,
256 insert: "return;", 256 insert: "return;",
257 kind: Keyword, 257 kind: Keyword,
258 }, 258 },
259 CompletionItem { 259 CompletionItem {
260 label: "while", 260 label: "while",
261 source_range: [49; 49), 261 source_range: 49..49,
262 delete: [49; 49), 262 delete: 49..49,
263 insert: "while $0 {}", 263 insert: "while $0 {}",
264 kind: Keyword, 264 kind: Keyword,
265 }, 265 },
@@ -284,50 +284,50 @@ mod tests {
284 [ 284 [
285 CompletionItem { 285 CompletionItem {
286 label: "else", 286 label: "else",
287 source_range: [108; 108), 287 source_range: 108..108,
288 delete: [108; 108), 288 delete: 108..108,
289 insert: "else {$0}", 289 insert: "else {$0}",
290 kind: Keyword, 290 kind: Keyword,
291 }, 291 },
292 CompletionItem { 292 CompletionItem {
293 label: "else if", 293 label: "else if",
294 source_range: [108; 108), 294 source_range: 108..108,
295 delete: [108; 108), 295 delete: 108..108,
296 insert: "else if $0 {}", 296 insert: "else if $0 {}",
297 kind: Keyword, 297 kind: Keyword,
298 }, 298 },
299 CompletionItem { 299 CompletionItem {
300 label: "if", 300 label: "if",
301 source_range: [108; 108), 301 source_range: 108..108,
302 delete: [108; 108), 302 delete: 108..108,
303 insert: "if $0 {}", 303 insert: "if $0 {}",
304 kind: Keyword, 304 kind: Keyword,
305 }, 305 },
306 CompletionItem { 306 CompletionItem {
307 label: "loop", 307 label: "loop",
308 source_range: [108; 108), 308 source_range: 108..108,
309 delete: [108; 108), 309 delete: 108..108,
310 insert: "loop {$0}", 310 insert: "loop {$0}",
311 kind: Keyword, 311 kind: Keyword,
312 }, 312 },
313 CompletionItem { 313 CompletionItem {
314 label: "match", 314 label: "match",
315 source_range: [108; 108), 315 source_range: 108..108,
316 delete: [108; 108), 316 delete: 108..108,
317 insert: "match $0 {}", 317 insert: "match $0 {}",
318 kind: Keyword, 318 kind: Keyword,
319 }, 319 },
320 CompletionItem { 320 CompletionItem {
321 label: "return", 321 label: "return",
322 source_range: [108; 108), 322 source_range: 108..108,
323 delete: [108; 108), 323 delete: 108..108,
324 insert: "return;", 324 insert: "return;",
325 kind: Keyword, 325 kind: Keyword,
326 }, 326 },
327 CompletionItem { 327 CompletionItem {
328 label: "while", 328 label: "while",
329 source_range: [108; 108), 329 source_range: 108..108,
330 delete: [108; 108), 330 delete: 108..108,
331 insert: "while $0 {}", 331 insert: "while $0 {}",
332 kind: Keyword, 332 kind: Keyword,
333 }, 333 },
@@ -351,36 +351,36 @@ mod tests {
351 [ 351 [
352 CompletionItem { 352 CompletionItem {
353 label: "if", 353 label: "if",
354 source_range: [56; 56), 354 source_range: 56..56,
355 delete: [56; 56), 355 delete: 56..56,
356 insert: "if $0 {}", 356 insert: "if $0 {}",
357 kind: Keyword, 357 kind: Keyword,
358 }, 358 },
359 CompletionItem { 359 CompletionItem {
360 label: "loop", 360 label: "loop",
361 source_range: [56; 56), 361 source_range: 56..56,
362 delete: [56; 56), 362 delete: 56..56,
363 insert: "loop {$0}", 363 insert: "loop {$0}",
364 kind: Keyword, 364 kind: Keyword,
365 }, 365 },
366 CompletionItem { 366 CompletionItem {
367 label: "match", 367 label: "match",
368 source_range: [56; 56), 368 source_range: 56..56,
369 delete: [56; 56), 369 delete: 56..56,
370 insert: "match $0 {}", 370 insert: "match $0 {}",
371 kind: Keyword, 371 kind: Keyword,
372 }, 372 },
373 CompletionItem { 373 CompletionItem {
374 label: "return", 374 label: "return",
375 source_range: [56; 56), 375 source_range: 56..56,
376 delete: [56; 56), 376 delete: 56..56,
377 insert: "return $0;", 377 insert: "return $0;",
378 kind: Keyword, 378 kind: Keyword,
379 }, 379 },
380 CompletionItem { 380 CompletionItem {
381 label: "while", 381 label: "while",
382 source_range: [56; 56), 382 source_range: 56..56,
383 delete: [56; 56), 383 delete: 56..56,
384 insert: "while $0 {}", 384 insert: "while $0 {}",
385 kind: Keyword, 385 kind: Keyword,
386 }, 386 },
@@ -400,36 +400,36 @@ mod tests {
400 [ 400 [
401 CompletionItem { 401 CompletionItem {
402 label: "if", 402 label: "if",
403 source_range: [49; 49), 403 source_range: 49..49,
404 delete: [49; 49), 404 delete: 49..49,
405 insert: "if $0 {}", 405 insert: "if $0 {}",
406 kind: Keyword, 406 kind: Keyword,
407 }, 407 },
408 CompletionItem { 408 CompletionItem {
409 label: "loop", 409 label: "loop",
410 source_range: [49; 49), 410 source_range: 49..49,
411 delete: [49; 49), 411 delete: 49..49,
412 insert: "loop {$0}", 412 insert: "loop {$0}",
413 kind: Keyword, 413 kind: Keyword,
414 }, 414 },
415 CompletionItem { 415 CompletionItem {
416 label: "match", 416 label: "match",
417 source_range: [49; 49), 417 source_range: 49..49,
418 delete: [49; 49), 418 delete: 49..49,
419 insert: "match $0 {}", 419 insert: "match $0 {}",
420 kind: Keyword, 420 kind: Keyword,
421 }, 421 },
422 CompletionItem { 422 CompletionItem {
423 label: "return", 423 label: "return",
424 source_range: [49; 49), 424 source_range: 49..49,
425 delete: [49; 49), 425 delete: 49..49,
426 insert: "return;", 426 insert: "return;",
427 kind: Keyword, 427 kind: Keyword,
428 }, 428 },
429 CompletionItem { 429 CompletionItem {
430 label: "while", 430 label: "while",
431 source_range: [49; 49), 431 source_range: 49..49,
432 delete: [49; 49), 432 delete: 49..49,
433 insert: "while $0 {}", 433 insert: "while $0 {}",
434 kind: Keyword, 434 kind: Keyword,
435 }, 435 },
@@ -454,36 +454,36 @@ mod tests {
454 [ 454 [
455 CompletionItem { 455 CompletionItem {
456 label: "if", 456 label: "if",
457 source_range: [97; 97), 457 source_range: 97..97,
458 delete: [97; 97), 458 delete: 97..97,
459 insert: "if $0 {}", 459 insert: "if $0 {}",
460 kind: Keyword, 460 kind: Keyword,
461 }, 461 },
462 CompletionItem { 462 CompletionItem {
463 label: "loop", 463 label: "loop",
464 source_range: [97; 97), 464 source_range: 97..97,
465 delete: [97; 97), 465 delete: 97..97,
466 insert: "loop {$0}", 466 insert: "loop {$0}",
467 kind: Keyword, 467 kind: Keyword,
468 }, 468 },
469 CompletionItem { 469 CompletionItem {
470 label: "match", 470 label: "match",
471 source_range: [97; 97), 471 source_range: 97..97,
472 delete: [97; 97), 472 delete: 97..97,
473 insert: "match $0 {}", 473 insert: "match $0 {}",
474 kind: Keyword, 474 kind: Keyword,
475 }, 475 },
476 CompletionItem { 476 CompletionItem {
477 label: "return", 477 label: "return",
478 source_range: [97; 97), 478 source_range: 97..97,
479 delete: [97; 97), 479 delete: 97..97,
480 insert: "return $0", 480 insert: "return $0",
481 kind: Keyword, 481 kind: Keyword,
482 }, 482 },
483 CompletionItem { 483 CompletionItem {
484 label: "while", 484 label: "while",
485 source_range: [97; 97), 485 source_range: 97..97,
486 delete: [97; 97), 486 delete: 97..97,
487 insert: "while $0 {}", 487 insert: "while $0 {}",
488 kind: Keyword, 488 kind: Keyword,
489 }, 489 },
@@ -508,36 +508,36 @@ mod tests {
508 [ 508 [
509 CompletionItem { 509 CompletionItem {
510 label: "if", 510 label: "if",
511 source_range: [95; 95), 511 source_range: 95..95,
512 delete: [95; 95), 512 delete: 95..95,
513 insert: "if $0 {}", 513 insert: "if $0 {}",
514 kind: Keyword, 514 kind: Keyword,
515 }, 515 },
516 CompletionItem { 516 CompletionItem {
517 label: "loop", 517 label: "loop",
518 source_range: [95; 95), 518 source_range: 95..95,
519 delete: [95; 95), 519 delete: 95..95,
520 insert: "loop {$0}", 520 insert: "loop {$0}",
521 kind: Keyword, 521 kind: Keyword,
522 }, 522 },
523 CompletionItem { 523 CompletionItem {
524 label: "match", 524 label: "match",
525 source_range: [95; 95), 525 source_range: 95..95,
526 delete: [95; 95), 526 delete: 95..95,
527 insert: "match $0 {}", 527 insert: "match $0 {}",
528 kind: Keyword, 528 kind: Keyword,
529 }, 529 },
530 CompletionItem { 530 CompletionItem {
531 label: "return", 531 label: "return",
532 source_range: [95; 95), 532 source_range: 95..95,
533 delete: [95; 95), 533 delete: 95..95,
534 insert: "return $0;", 534 insert: "return $0;",
535 kind: Keyword, 535 kind: Keyword,
536 }, 536 },
537 CompletionItem { 537 CompletionItem {
538 label: "while", 538 label: "while",
539 source_range: [95; 95), 539 source_range: 95..95,
540 delete: [95; 95), 540 delete: 95..95,
541 insert: "while $0 {}", 541 insert: "while $0 {}",
542 kind: Keyword, 542 kind: Keyword,
543 }, 543 },
@@ -560,36 +560,36 @@ mod tests {
560 [ 560 [
561 CompletionItem { 561 CompletionItem {
562 label: "if", 562 label: "if",
563 source_range: [95; 95), 563 source_range: 95..95,
564 delete: [95; 95), 564 delete: 95..95,
565 insert: "if $0 {}", 565 insert: "if $0 {}",
566 kind: Keyword, 566 kind: Keyword,
567 }, 567 },
568 CompletionItem { 568 CompletionItem {
569 label: "loop", 569 label: "loop",
570 source_range: [95; 95), 570 source_range: 95..95,
571 delete: [95; 95), 571 delete: 95..95,
572 insert: "loop {$0}", 572 insert: "loop {$0}",
573 kind: Keyword, 573 kind: Keyword,
574 }, 574 },
575 CompletionItem { 575 CompletionItem {
576 label: "match", 576 label: "match",
577 source_range: [95; 95), 577 source_range: 95..95,
578 delete: [95; 95), 578 delete: 95..95,
579 insert: "match $0 {}", 579 insert: "match $0 {}",
580 kind: Keyword, 580 kind: Keyword,
581 }, 581 },
582 CompletionItem { 582 CompletionItem {
583 label: "return", 583 label: "return",
584 source_range: [95; 95), 584 source_range: 95..95,
585 delete: [95; 95), 585 delete: 95..95,
586 insert: "return $0;", 586 insert: "return $0;",
587 kind: Keyword, 587 kind: Keyword,
588 }, 588 },
589 CompletionItem { 589 CompletionItem {
590 label: "while", 590 label: "while",
591 source_range: [95; 95), 591 source_range: 95..95,
592 delete: [95; 95), 592 delete: 95..95,
593 insert: "while $0 {}", 593 insert: "while $0 {}",
594 kind: Keyword, 594 kind: Keyword,
595 }, 595 },
@@ -612,50 +612,50 @@ mod tests {
612 [ 612 [
613 CompletionItem { 613 CompletionItem {
614 label: "break", 614 label: "break",
615 source_range: [63; 63), 615 source_range: 63..63,
616 delete: [63; 63), 616 delete: 63..63,
617 insert: "break;", 617 insert: "break;",
618 kind: Keyword, 618 kind: Keyword,
619 }, 619 },
620 CompletionItem { 620 CompletionItem {
621 label: "continue", 621 label: "continue",
622 source_range: [63; 63), 622 source_range: 63..63,
623 delete: [63; 63), 623 delete: 63..63,
624 insert: "continue;", 624 insert: "continue;",
625 kind: Keyword, 625 kind: Keyword,
626 }, 626 },
627 CompletionItem { 627 CompletionItem {
628 label: "if", 628 label: "if",
629 source_range: [63; 63), 629 source_range: 63..63,
630 delete: [63; 63), 630 delete: 63..63,
631 insert: "if $0 {}", 631 insert: "if $0 {}",
632 kind: Keyword, 632 kind: Keyword,
633 }, 633 },
634 CompletionItem { 634 CompletionItem {
635 label: "loop", 635 label: "loop",
636 source_range: [63; 63), 636 source_range: 63..63,
637 delete: [63; 63), 637 delete: 63..63,
638 insert: "loop {$0}", 638 insert: "loop {$0}",
639 kind: Keyword, 639 kind: Keyword,
640 }, 640 },
641 CompletionItem { 641 CompletionItem {
642 label: "match", 642 label: "match",
643 source_range: [63; 63), 643 source_range: 63..63,
644 delete: [63; 63), 644 delete: 63..63,
645 insert: "match $0 {}", 645 insert: "match $0 {}",
646 kind: Keyword, 646 kind: Keyword,
647 }, 647 },
648 CompletionItem { 648 CompletionItem {
649 label: "return", 649 label: "return",
650 source_range: [63; 63), 650 source_range: 63..63,
651 delete: [63; 63), 651 delete: 63..63,
652 insert: "return $0;", 652 insert: "return $0;",
653 kind: Keyword, 653 kind: Keyword,
654 }, 654 },
655 CompletionItem { 655 CompletionItem {
656 label: "while", 656 label: "while",
657 source_range: [63; 63), 657 source_range: 63..63,
658 delete: [63; 63), 658 delete: 63..63,
659 insert: "while $0 {}", 659 insert: "while $0 {}",
660 kind: Keyword, 660 kind: Keyword,
661 }, 661 },
@@ -676,36 +676,36 @@ mod tests {
676 [ 676 [
677 CompletionItem { 677 CompletionItem {
678 label: "if", 678 label: "if",
679 source_range: [68; 68), 679 source_range: 68..68,
680 delete: [68; 68), 680 delete: 68..68,
681 insert: "if $0 {}", 681 insert: "if $0 {}",
682 kind: Keyword, 682 kind: Keyword,
683 }, 683 },
684 CompletionItem { 684 CompletionItem {
685 label: "loop", 685 label: "loop",
686 source_range: [68; 68), 686 source_range: 68..68,
687 delete: [68; 68), 687 delete: 68..68,
688 insert: "loop {$0}", 688 insert: "loop {$0}",
689 kind: Keyword, 689 kind: Keyword,
690 }, 690 },
691 CompletionItem { 691 CompletionItem {
692 label: "match", 692 label: "match",
693 source_range: [68; 68), 693 source_range: 68..68,
694 delete: [68; 68), 694 delete: 68..68,
695 insert: "match $0 {}", 695 insert: "match $0 {}",
696 kind: Keyword, 696 kind: Keyword,
697 }, 697 },
698 CompletionItem { 698 CompletionItem {
699 label: "return", 699 label: "return",
700 source_range: [68; 68), 700 source_range: 68..68,
701 delete: [68; 68), 701 delete: 68..68,
702 insert: "return $0;", 702 insert: "return $0;",
703 kind: Keyword, 703 kind: Keyword,
704 }, 704 },
705 CompletionItem { 705 CompletionItem {
706 label: "while", 706 label: "while",
707 source_range: [68; 68), 707 source_range: 68..68,
708 delete: [68; 68), 708 delete: 68..68,
709 insert: "while $0 {}", 709 insert: "while $0 {}",
710 kind: Keyword, 710 kind: Keyword,
711 }, 711 },
@@ -732,50 +732,50 @@ mod tests {
732 [ 732 [
733 CompletionItem { 733 CompletionItem {
734 label: "break", 734 label: "break",
735 source_range: [122; 124), 735 source_range: 122..124,
736 delete: [122; 124), 736 delete: 122..124,
737 insert: "break", 737 insert: "break",
738 kind: Keyword, 738 kind: Keyword,
739 }, 739 },
740 CompletionItem { 740 CompletionItem {
741 label: "continue", 741 label: "continue",
742 source_range: [122; 124), 742 source_range: 122..124,
743 delete: [122; 124), 743 delete: 122..124,
744 insert: "continue", 744 insert: "continue",
745 kind: Keyword, 745 kind: Keyword,
746 }, 746 },
747 CompletionItem { 747 CompletionItem {
748 label: "if", 748 label: "if",
749 source_range: [122; 124), 749 source_range: 122..124,
750 delete: [122; 124), 750 delete: 122..124,
751 insert: "if $0 {}", 751 insert: "if $0 {}",
752 kind: Keyword, 752 kind: Keyword,
753 }, 753 },
754 CompletionItem { 754 CompletionItem {
755 label: "loop", 755 label: "loop",
756 source_range: [122; 124), 756 source_range: 122..124,
757 delete: [122; 124), 757 delete: 122..124,
758 insert: "loop {$0}", 758 insert: "loop {$0}",
759 kind: Keyword, 759 kind: Keyword,
760 }, 760 },
761 CompletionItem { 761 CompletionItem {
762 label: "match", 762 label: "match",
763 source_range: [122; 124), 763 source_range: 122..124,
764 delete: [122; 124), 764 delete: 122..124,
765 insert: "match $0 {}", 765 insert: "match $0 {}",
766 kind: Keyword, 766 kind: Keyword,
767 }, 767 },
768 CompletionItem { 768 CompletionItem {
769 label: "return", 769 label: "return",
770 source_range: [122; 124), 770 source_range: 122..124,
771 delete: [122; 124), 771 delete: 122..124,
772 insert: "return", 772 insert: "return",
773 kind: Keyword, 773 kind: Keyword,
774 }, 774 },
775 CompletionItem { 775 CompletionItem {
776 label: "while", 776 label: "while",
777 source_range: [122; 124), 777 source_range: 122..124,
778 delete: [122; 124), 778 delete: 122..124,
779 insert: "while $0 {}", 779 insert: "while $0 {}",
780 kind: Keyword, 780 kind: Keyword,
781 }, 781 },
diff --git a/crates/ra_ide/src/completion/complete_macro_in_item_position.rs b/crates/ra_ide/src/completion/complete_macro_in_item_position.rs
index 6000106d0..d9bb5fd25 100644
--- a/crates/ra_ide/src/completion/complete_macro_in_item_position.rs
+++ b/crates/ra_ide/src/completion/complete_macro_in_item_position.rs
@@ -42,8 +42,8 @@ mod tests {
42 [ 42 [
43 CompletionItem { 43 CompletionItem {
44 label: "foo!(…)", 44 label: "foo!(…)",
45 source_range: [46; 46), 45 source_range: 46..46,
46 delete: [46; 46), 46 delete: 46..46,
47 insert: "foo!($0)", 47 insert: "foo!($0)",
48 kind: Macro, 48 kind: Macro,
49 detail: "macro_rules! foo", 49 detail: "macro_rules! foo",
@@ -82,8 +82,8 @@ mod tests {
82 [ 82 [
83 CompletionItem { 83 CompletionItem {
84 label: "vec![…]", 84 label: "vec![…]",
85 source_range: [280; 280), 85 source_range: 280..280,
86 delete: [280; 280), 86 delete: 280..280,
87 insert: "vec![$0]", 87 insert: "vec![$0]",
88 kind: Macro, 88 kind: Macro,
89 detail: "macro_rules! vec", 89 detail: "macro_rules! vec",
@@ -119,8 +119,8 @@ mod tests {
119 [ 119 [
120 CompletionItem { 120 CompletionItem {
121 label: "foo! {…}", 121 label: "foo! {…}",
122 source_range: [163; 163), 122 source_range: 163..163,
123 delete: [163; 163), 123 delete: 163..163,
124 insert: "foo! {$0}", 124 insert: "foo! {$0}",
125 kind: Macro, 125 kind: Macro,
126 detail: "macro_rules! foo", 126 detail: "macro_rules! foo",
@@ -130,8 +130,8 @@ mod tests {
130 }, 130 },
131 CompletionItem { 131 CompletionItem {
132 label: "main()", 132 label: "main()",
133 source_range: [163; 163), 133 source_range: 163..163,
134 delete: [163; 163), 134 delete: 163..163,
135 insert: "main()$0", 135 insert: "main()$0",
136 kind: Function, 136 kind: Function,
137 lookup: "main", 137 lookup: "main",
diff --git a/crates/ra_ide/src/completion/complete_pattern.rs b/crates/ra_ide/src/completion/complete_pattern.rs
index 218829b10..fdd9e928b 100644
--- a/crates/ra_ide/src/completion/complete_pattern.rs
+++ b/crates/ra_ide/src/completion/complete_pattern.rs
@@ -63,37 +63,37 @@ mod tests {
63 [ 63 [
64 CompletionItem { 64 CompletionItem {
65 label: "Bar", 65 label: "Bar",
66 source_range: [246; 246), 66 source_range: 246..246,
67 delete: [246; 246), 67 delete: 246..246,
68 insert: "Bar", 68 insert: "Bar",
69 kind: Struct, 69 kind: Struct,
70 }, 70 },
71 CompletionItem { 71 CompletionItem {
72 label: "E", 72 label: "E",
73 source_range: [246; 246), 73 source_range: 246..246,
74 delete: [246; 246), 74 delete: 246..246,
75 insert: "E", 75 insert: "E",
76 kind: Enum, 76 kind: Enum,
77 }, 77 },
78 CompletionItem { 78 CompletionItem {
79 label: "X", 79 label: "X",
80 source_range: [246; 246), 80 source_range: 246..246,
81 delete: [246; 246), 81 delete: 246..246,
82 insert: "X", 82 insert: "X",
83 kind: EnumVariant, 83 kind: EnumVariant,
84 detail: "()", 84 detail: "()",
85 }, 85 },
86 CompletionItem { 86 CompletionItem {
87 label: "Z", 87 label: "Z",
88 source_range: [246; 246), 88 source_range: 246..246,
89 delete: [246; 246), 89 delete: 246..246,
90 insert: "Z", 90 insert: "Z",
91 kind: Const, 91 kind: Const,
92 }, 92 },
93 CompletionItem { 93 CompletionItem {
94 label: "m", 94 label: "m",
95 source_range: [246; 246), 95 source_range: 246..246,
96 delete: [246; 246), 96 delete: 246..246,
97 insert: "m", 97 insert: "m",
98 kind: Module, 98 kind: Module,
99 }, 99 },
@@ -119,15 +119,15 @@ mod tests {
119 [ 119 [
120 CompletionItem { 120 CompletionItem {
121 label: "E", 121 label: "E",
122 source_range: [151; 151), 122 source_range: 151..151,
123 delete: [151; 151), 123 delete: 151..151,
124 insert: "E", 124 insert: "E",
125 kind: Enum, 125 kind: Enum,
126 }, 126 },
127 CompletionItem { 127 CompletionItem {
128 label: "m!(…)", 128 label: "m!(…)",
129 source_range: [151; 151), 129 source_range: 151..151,
130 delete: [151; 151), 130 delete: 151..151,
131 insert: "m!($0)", 131 insert: "m!($0)",
132 kind: Macro, 132 kind: Macro,
133 detail: "macro_rules! m", 133 detail: "macro_rules! m",
diff --git a/crates/ra_ide/src/completion/complete_postfix.rs b/crates/ra_ide/src/completion/complete_postfix.rs
index 8d397b0fe..6a0f0c72e 100644
--- a/crates/ra_ide/src/completion/complete_postfix.rs
+++ b/crates/ra_ide/src/completion/complete_postfix.rs
@@ -2,7 +2,7 @@
2 2
3use ra_syntax::{ 3use ra_syntax::{
4 ast::{self, AstNode}, 4 ast::{self, AstNode},
5 TextRange, TextUnit, 5 TextRange, TextSize,
6}; 6};
7use ra_text_edit::TextEdit; 7use ra_text_edit::TextEdit;
8 8
@@ -115,7 +115,7 @@ pub(super) fn complete_postfix(acc: &mut Completions, ctx: &CompletionContext) {
115fn get_receiver_text(receiver: &ast::Expr, receiver_is_ambiguous_float_literal: bool) -> String { 115fn get_receiver_text(receiver: &ast::Expr, receiver_is_ambiguous_float_literal: bool) -> String {
116 if receiver_is_ambiguous_float_literal { 116 if receiver_is_ambiguous_float_literal {
117 let text = receiver.syntax().text(); 117 let text = receiver.syntax().text();
118 let without_dot = ..text.len() - TextUnit::of_char('.'); 118 let without_dot = ..text.len() - TextSize::of('.');
119 text.slice(without_dot).to_string() 119 text.slice(without_dot).to_string()
120 } else { 120 } else {
121 receiver.to_string() 121 receiver.to_string()
@@ -143,7 +143,7 @@ fn postfix_snippet(
143 let edit = { 143 let edit = {
144 let receiver_syntax = receiver.syntax(); 144 let receiver_syntax = receiver.syntax();
145 let receiver_range = ctx.sema.original_range(receiver_syntax).range; 145 let receiver_range = ctx.sema.original_range(receiver_syntax).range;
146 let delete_range = TextRange::from_to(receiver_range.start(), ctx.source_range().end()); 146 let delete_range = TextRange::new(receiver_range.start(), ctx.source_range().end());
147 TextEdit::replace(delete_range, snippet.to_string()) 147 TextEdit::replace(delete_range, snippet.to_string())
148 }; 148 };
149 CompletionItem::new(CompletionKind::Postfix, ctx.source_range(), label) 149 CompletionItem::new(CompletionKind::Postfix, ctx.source_range(), label)
@@ -176,57 +176,57 @@ mod tests {
176 [ 176 [
177 CompletionItem { 177 CompletionItem {
178 label: "box", 178 label: "box",
179 source_range: [89; 89), 179 source_range: 89..89,
180 delete: [85; 89), 180 delete: 85..89,
181 insert: "Box::new(bar)", 181 insert: "Box::new(bar)",
182 detail: "Box::new(expr)", 182 detail: "Box::new(expr)",
183 }, 183 },
184 CompletionItem { 184 CompletionItem {
185 label: "dbg", 185 label: "dbg",
186 source_range: [89; 89), 186 source_range: 89..89,
187 delete: [85; 89), 187 delete: 85..89,
188 insert: "dbg!(bar)", 188 insert: "dbg!(bar)",
189 detail: "dbg!(expr)", 189 detail: "dbg!(expr)",
190 }, 190 },
191 CompletionItem { 191 CompletionItem {
192 label: "if", 192 label: "if",
193 source_range: [89; 89), 193 source_range: 89..89,
194 delete: [85; 89), 194 delete: 85..89,
195 insert: "if bar {$0}", 195 insert: "if bar {$0}",
196 detail: "if expr {}", 196 detail: "if expr {}",
197 }, 197 },
198 CompletionItem { 198 CompletionItem {
199 label: "match", 199 label: "match",
200 source_range: [89; 89), 200 source_range: 89..89,
201 delete: [85; 89), 201 delete: 85..89,
202 insert: "match bar {\n ${1:_} => {$0\\},\n}", 202 insert: "match bar {\n ${1:_} => {$0\\},\n}",
203 detail: "match expr {}", 203 detail: "match expr {}",
204 }, 204 },
205 CompletionItem { 205 CompletionItem {
206 label: "not", 206 label: "not",
207 source_range: [89; 89), 207 source_range: 89..89,
208 delete: [85; 89), 208 delete: 85..89,
209 insert: "!bar", 209 insert: "!bar",
210 detail: "!expr", 210 detail: "!expr",
211 }, 211 },
212 CompletionItem { 212 CompletionItem {
213 label: "ref", 213 label: "ref",
214 source_range: [89; 89), 214 source_range: 89..89,
215 delete: [85; 89), 215 delete: 85..89,
216 insert: "&bar", 216 insert: "&bar",
217 detail: "&expr", 217 detail: "&expr",
218 }, 218 },
219 CompletionItem { 219 CompletionItem {
220 label: "refm", 220 label: "refm",
221 source_range: [89; 89), 221 source_range: 89..89,
222 delete: [85; 89), 222 delete: 85..89,
223 insert: "&mut bar", 223 insert: "&mut bar",
224 detail: "&mut expr", 224 detail: "&mut expr",
225 }, 225 },
226 CompletionItem { 226 CompletionItem {
227 label: "while", 227 label: "while",
228 source_range: [89; 89), 228 source_range: 89..89,
229 delete: [85; 89), 229 delete: 85..89,
230 insert: "while bar {\n$0\n}", 230 insert: "while bar {\n$0\n}",
231 detail: "while expr {}", 231 detail: "while expr {}",
232 }, 232 },
@@ -250,43 +250,43 @@ mod tests {
250 [ 250 [
251 CompletionItem { 251 CompletionItem {
252 label: "box", 252 label: "box",
253 source_range: [91; 91), 253 source_range: 91..91,
254 delete: [87; 91), 254 delete: 87..91,
255 insert: "Box::new(bar)", 255 insert: "Box::new(bar)",
256 detail: "Box::new(expr)", 256 detail: "Box::new(expr)",
257 }, 257 },
258 CompletionItem { 258 CompletionItem {
259 label: "dbg", 259 label: "dbg",
260 source_range: [91; 91), 260 source_range: 91..91,
261 delete: [87; 91), 261 delete: 87..91,
262 insert: "dbg!(bar)", 262 insert: "dbg!(bar)",
263 detail: "dbg!(expr)", 263 detail: "dbg!(expr)",
264 }, 264 },
265 CompletionItem { 265 CompletionItem {
266 label: "match", 266 label: "match",
267 source_range: [91; 91), 267 source_range: 91..91,
268 delete: [87; 91), 268 delete: 87..91,
269 insert: "match bar {\n ${1:_} => {$0\\},\n}", 269 insert: "match bar {\n ${1:_} => {$0\\},\n}",
270 detail: "match expr {}", 270 detail: "match expr {}",
271 }, 271 },
272 CompletionItem { 272 CompletionItem {
273 label: "not", 273 label: "not",
274 source_range: [91; 91), 274 source_range: 91..91,
275 delete: [87; 91), 275 delete: 87..91,
276 insert: "!bar", 276 insert: "!bar",
277 detail: "!expr", 277 detail: "!expr",
278 }, 278 },
279 CompletionItem { 279 CompletionItem {
280 label: "ref", 280 label: "ref",
281 source_range: [91; 91), 281 source_range: 91..91,
282 delete: [87; 91), 282 delete: 87..91,
283 insert: "&bar", 283 insert: "&bar",
284 detail: "&expr", 284 detail: "&expr",
285 }, 285 },
286 CompletionItem { 286 CompletionItem {
287 label: "refm", 287 label: "refm",
288 source_range: [91; 91), 288 source_range: 91..91,
289 delete: [87; 91), 289 delete: 87..91,
290 insert: "&mut bar", 290 insert: "&mut bar",
291 detail: "&mut expr", 291 detail: "&mut expr",
292 }, 292 },
@@ -309,43 +309,43 @@ mod tests {
309 [ 309 [
310 CompletionItem { 310 CompletionItem {
311 label: "box", 311 label: "box",
312 source_range: [52; 52), 312 source_range: 52..52,
313 delete: [49; 52), 313 delete: 49..52,
314 insert: "Box::new(42)", 314 insert: "Box::new(42)",
315 detail: "Box::new(expr)", 315 detail: "Box::new(expr)",
316 }, 316 },
317 CompletionItem { 317 CompletionItem {
318 label: "dbg", 318 label: "dbg",
319 source_range: [52; 52), 319 source_range: 52..52,
320 delete: [49; 52), 320 delete: 49..52,
321 insert: "dbg!(42)", 321 insert: "dbg!(42)",
322 detail: "dbg!(expr)", 322 detail: "dbg!(expr)",
323 }, 323 },
324 CompletionItem { 324 CompletionItem {
325 label: "match", 325 label: "match",
326 source_range: [52; 52), 326 source_range: 52..52,
327 delete: [49; 52), 327 delete: 49..52,
328 insert: "match 42 {\n ${1:_} => {$0\\},\n}", 328 insert: "match 42 {\n ${1:_} => {$0\\},\n}",
329 detail: "match expr {}", 329 detail: "match expr {}",
330 }, 330 },
331 CompletionItem { 331 CompletionItem {
332 label: "not", 332 label: "not",
333 source_range: [52; 52), 333 source_range: 52..52,
334 delete: [49; 52), 334 delete: 49..52,
335 insert: "!42", 335 insert: "!42",
336 detail: "!expr", 336 detail: "!expr",
337 }, 337 },
338 CompletionItem { 338 CompletionItem {
339 label: "ref", 339 label: "ref",
340 source_range: [52; 52), 340 source_range: 52..52,
341 delete: [49; 52), 341 delete: 49..52,
342 insert: "&42", 342 insert: "&42",
343 detail: "&expr", 343 detail: "&expr",
344 }, 344 },
345 CompletionItem { 345 CompletionItem {
346 label: "refm", 346 label: "refm",
347 source_range: [52; 52), 347 source_range: 52..52,
348 delete: [49; 52), 348 delete: 49..52,
349 insert: "&mut 42", 349 insert: "&mut 42",
350 detail: "&mut expr", 350 detail: "&mut expr",
351 }, 351 },
@@ -370,43 +370,43 @@ mod tests {
370 [ 370 [
371 CompletionItem { 371 CompletionItem {
372 label: "box", 372 label: "box",
373 source_range: [149; 150), 373 source_range: 149..150,
374 delete: [145; 150), 374 delete: 145..150,
375 insert: "Box::new(bar)", 375 insert: "Box::new(bar)",
376 detail: "Box::new(expr)", 376 detail: "Box::new(expr)",
377 }, 377 },
378 CompletionItem { 378 CompletionItem {
379 label: "dbg", 379 label: "dbg",
380 source_range: [149; 150), 380 source_range: 149..150,
381 delete: [145; 150), 381 delete: 145..150,
382 insert: "dbg!(bar)", 382 insert: "dbg!(bar)",
383 detail: "dbg!(expr)", 383 detail: "dbg!(expr)",
384 }, 384 },
385 CompletionItem { 385 CompletionItem {
386 label: "match", 386 label: "match",
387 source_range: [149; 150), 387 source_range: 149..150,
388 delete: [145; 150), 388 delete: 145..150,
389 insert: "match bar {\n ${1:_} => {$0\\},\n}", 389 insert: "match bar {\n ${1:_} => {$0\\},\n}",
390 detail: "match expr {}", 390 detail: "match expr {}",
391 }, 391 },
392 CompletionItem { 392 CompletionItem {
393 label: "not", 393 label: "not",
394 source_range: [149; 150), 394 source_range: 149..150,
395 delete: [145; 150), 395 delete: 145..150,
396 insert: "!bar", 396 insert: "!bar",
397 detail: "!expr", 397 detail: "!expr",
398 }, 398 },
399 CompletionItem { 399 CompletionItem {
400 label: "ref", 400 label: "ref",
401 source_range: [149; 150), 401 source_range: 149..150,
402 delete: [145; 150), 402 delete: 145..150,
403 insert: "&bar", 403 insert: "&bar",
404 detail: "&expr", 404 detail: "&expr",
405 }, 405 },
406 CompletionItem { 406 CompletionItem {
407 label: "refm", 407 label: "refm",
408 source_range: [149; 150), 408 source_range: 149..150,
409 delete: [145; 150), 409 delete: 145..150,
410 insert: "&mut bar", 410 insert: "&mut bar",
411 detail: "&mut expr", 411 detail: "&mut expr",
412 }, 412 },
@@ -429,43 +429,43 @@ mod tests {
429 [ 429 [
430 CompletionItem { 430 CompletionItem {
431 label: "box", 431 label: "box",
432 source_range: [56; 56), 432 source_range: 56..56,
433 delete: [49; 56), 433 delete: 49..56,
434 insert: "Box::new(&&&&42)", 434 insert: "Box::new(&&&&42)",
435 detail: "Box::new(expr)", 435 detail: "Box::new(expr)",
436 }, 436 },
437 CompletionItem { 437 CompletionItem {
438 label: "dbg", 438 label: "dbg",
439 source_range: [56; 56), 439 source_range: 56..56,
440 delete: [49; 56), 440 delete: 49..56,
441 insert: "dbg!(&&&&42)", 441 insert: "dbg!(&&&&42)",
442 detail: "dbg!(expr)", 442 detail: "dbg!(expr)",
443 }, 443 },
444 CompletionItem { 444 CompletionItem {
445 label: "match", 445 label: "match",
446 source_range: [56; 56), 446 source_range: 56..56,
447 delete: [49; 56), 447 delete: 49..56,
448 insert: "match &&&&42 {\n ${1:_} => {$0\\},\n}", 448 insert: "match &&&&42 {\n ${1:_} => {$0\\},\n}",
449 detail: "match expr {}", 449 detail: "match expr {}",
450 }, 450 },
451 CompletionItem { 451 CompletionItem {
452 label: "not", 452 label: "not",
453 source_range: [56; 56), 453 source_range: 56..56,
454 delete: [53; 56), 454 delete: 53..56,
455 insert: "!42", 455 insert: "!42",
456 detail: "!expr", 456 detail: "!expr",
457 }, 457 },
458 CompletionItem { 458 CompletionItem {
459 label: "ref", 459 label: "ref",
460 source_range: [56; 56), 460 source_range: 56..56,
461 delete: [53; 56), 461 delete: 53..56,
462 insert: "&42", 462 insert: "&42",
463 detail: "&expr", 463 detail: "&expr",
464 }, 464 },
465 CompletionItem { 465 CompletionItem {
466 label: "refm", 466 label: "refm",
467 source_range: [56; 56), 467 source_range: 56..56,
468 delete: [53; 56), 468 delete: 53..56,
469 insert: "&mut 42", 469 insert: "&mut 42",
470 detail: "&mut expr", 470 detail: "&mut expr",
471 }, 471 },
diff --git a/crates/ra_ide/src/completion/complete_qualified_path.rs b/crates/ra_ide/src/completion/complete_qualified_path.rs
index 9f795e441..dd10f74e6 100644
--- a/crates/ra_ide/src/completion/complete_qualified_path.rs
+++ b/crates/ra_ide/src/completion/complete_qualified_path.rs
@@ -57,9 +57,7 @@ pub(super) fn complete_qualified_path(acc: &mut Completions, ctx: &CompletionCon
57 } 57 }
58 match item { 58 match item {
59 hir::AssocItem::Function(func) => { 59 hir::AssocItem::Function(func) => {
60 if !func.has_self_param(ctx.db) { 60 acc.add_function(ctx, func, None);
61 acc.add_function(ctx, func, None);
62 }
63 } 61 }
64 hir::AssocItem::Const(ct) => acc.add_const(ctx, ct), 62 hir::AssocItem::Const(ct) => acc.add_const(ctx, ct),
65 hir::AssocItem::TypeAlias(ty) => acc.add_type_alias(ctx, ty), 63 hir::AssocItem::TypeAlias(ty) => acc.add_type_alias(ctx, ty),
@@ -86,9 +84,7 @@ pub(super) fn complete_qualified_path(acc: &mut Completions, ctx: &CompletionCon
86 } 84 }
87 match item { 85 match item {
88 hir::AssocItem::Function(func) => { 86 hir::AssocItem::Function(func) => {
89 if !func.has_self_param(ctx.db) { 87 acc.add_function(ctx, func, None);
90 acc.add_function(ctx, func, None);
91 }
92 } 88 }
93 hir::AssocItem::Const(ct) => acc.add_const(ctx, ct), 89 hir::AssocItem::Const(ct) => acc.add_const(ctx, ct),
94 hir::AssocItem::TypeAlias(ty) => acc.add_type_alias(ctx, ty), 90 hir::AssocItem::TypeAlias(ty) => acc.add_type_alias(ctx, ty),
@@ -166,8 +162,8 @@ mod tests {
166 [ 162 [
167 CompletionItem { 163 CompletionItem {
168 label: "my", 164 label: "my",
169 source_range: [27; 29), 165 source_range: 27..29,
170 delete: [27; 29), 166 delete: 27..29,
171 insert: "my", 167 insert: "my",
172 kind: Module, 168 kind: Module,
173 documentation: Documentation( 169 documentation: Documentation(
@@ -197,15 +193,15 @@ mod tests {
197 [ 193 [
198 CompletionItem { 194 CompletionItem {
199 label: "Foo", 195 label: "Foo",
200 source_range: [31; 31), 196 source_range: 31..31,
201 delete: [31; 31), 197 delete: 31..31,
202 insert: "Foo", 198 insert: "Foo",
203 kind: Struct, 199 kind: Struct,
204 }, 200 },
205 CompletionItem { 201 CompletionItem {
206 label: "PublicBar", 202 label: "PublicBar",
207 source_range: [31; 31), 203 source_range: 31..31,
208 delete: [31; 31), 204 delete: 31..31,
209 insert: "PublicBar", 205 insert: "PublicBar",
210 kind: Struct, 206 kind: Struct,
211 }, 207 },
@@ -230,8 +226,8 @@ mod tests {
230 [ 226 [
231 CompletionItem { 227 CompletionItem {
232 label: "Bar", 228 label: "Bar",
233 source_range: [30; 30), 229 source_range: 30..30,
234 delete: [30; 30), 230 delete: 30..30,
235 insert: "Bar", 231 insert: "Bar",
236 kind: Struct, 232 kind: Struct,
237 }, 233 },
@@ -256,15 +252,15 @@ mod tests {
256 [ 252 [
257 CompletionItem { 253 CompletionItem {
258 label: "Spam", 254 label: "Spam",
259 source_range: [11; 13), 255 source_range: 11..13,
260 delete: [11; 13), 256 delete: 11..13,
261 insert: "Spam", 257 insert: "Spam",
262 kind: Struct, 258 kind: Struct,
263 }, 259 },
264 CompletionItem { 260 CompletionItem {
265 label: "foo", 261 label: "foo",
266 source_range: [11; 13), 262 source_range: 11..13,
267 delete: [11; 13), 263 delete: 11..13,
268 insert: "foo", 264 insert: "foo",
269 kind: Module, 265 kind: Module,
270 }, 266 },
@@ -289,15 +285,15 @@ mod tests {
289 [ 285 [
290 CompletionItem { 286 CompletionItem {
291 label: "Spam", 287 label: "Spam",
292 source_range: [12; 14), 288 source_range: 12..14,
293 delete: [12; 14), 289 delete: 12..14,
294 insert: "Spam", 290 insert: "Spam",
295 kind: Struct, 291 kind: Struct,
296 }, 292 },
297 CompletionItem { 293 CompletionItem {
298 label: "foo", 294 label: "foo",
299 source_range: [12; 14), 295 source_range: 12..14,
300 delete: [12; 14), 296 delete: 12..14,
301 insert: "foo", 297 insert: "foo",
302 kind: Module, 298 kind: Module,
303 }, 299 },
@@ -326,8 +322,8 @@ mod tests {
326 [ 322 [
327 CompletionItem { 323 CompletionItem {
328 label: "Spam", 324 label: "Spam",
329 source_range: [23; 25), 325 source_range: 23..25,
330 delete: [23; 25), 326 delete: 23..25,
331 insert: "Spam", 327 insert: "Spam",
332 kind: Struct, 328 kind: Struct,
333 }, 329 },
@@ -356,8 +352,8 @@ mod tests {
356 [ 352 [
357 CompletionItem { 353 CompletionItem {
358 label: "Bar(…)", 354 label: "Bar(…)",
359 source_range: [116; 116), 355 source_range: 116..116,
360 delete: [116; 116), 356 delete: 116..116,
361 insert: "Bar($0)", 357 insert: "Bar($0)",
362 kind: EnumVariant, 358 kind: EnumVariant,
363 lookup: "Bar", 359 lookup: "Bar",
@@ -369,8 +365,8 @@ mod tests {
369 }, 365 },
370 CompletionItem { 366 CompletionItem {
371 label: "Foo", 367 label: "Foo",
372 source_range: [116; 116), 368 source_range: 116..116,
373 delete: [116; 116), 369 delete: 116..116,
374 insert: "Foo", 370 insert: "Foo",
375 kind: EnumVariant, 371 kind: EnumVariant,
376 detail: "()", 372 detail: "()",
@@ -406,8 +402,8 @@ mod tests {
406 [ 402 [
407 CompletionItem { 403 CompletionItem {
408 label: "Bar(…)", 404 label: "Bar(…)",
409 source_range: [180; 180), 405 source_range: 180..180,
410 delete: [180; 180), 406 delete: 180..180,
411 insert: "Bar($0)", 407 insert: "Bar($0)",
412 kind: EnumVariant, 408 kind: EnumVariant,
413 lookup: "Bar", 409 lookup: "Bar",
@@ -419,8 +415,8 @@ mod tests {
419 }, 415 },
420 CompletionItem { 416 CompletionItem {
421 label: "Foo", 417 label: "Foo",
422 source_range: [180; 180), 418 source_range: 180..180,
423 delete: [180; 180), 419 delete: 180..180,
424 insert: "Foo", 420 insert: "Foo",
425 kind: EnumVariant, 421 kind: EnumVariant,
426 detail: "()", 422 detail: "()",
@@ -430,8 +426,8 @@ mod tests {
430 }, 426 },
431 CompletionItem { 427 CompletionItem {
432 label: "S(…)", 428 label: "S(…)",
433 source_range: [180; 180), 429 source_range: 180..180,
434 delete: [180; 180), 430 delete: 180..180,
435 insert: "S($0)", 431 insert: "S($0)",
436 kind: EnumVariant, 432 kind: EnumVariant,
437 lookup: "S", 433 lookup: "S",
@@ -467,8 +463,8 @@ mod tests {
467 [ 463 [
468 CompletionItem { 464 CompletionItem {
469 label: "m()", 465 label: "m()",
470 source_range: [100; 100), 466 source_range: 100..100,
471 delete: [100; 100), 467 delete: 100..100,
472 insert: "m()$0", 468 insert: "m()$0",
473 kind: Function, 469 kind: Function,
474 lookup: "m", 470 lookup: "m",
@@ -483,6 +479,42 @@ mod tests {
483 } 479 }
484 480
485 #[test] 481 #[test]
482 fn completes_struct_associated_method_with_self() {
483 assert_debug_snapshot!(
484 do_reference_completion(
485 "
486 //- /lib.rs
487 /// A Struct
488 struct S;
489
490 impl S {
491 /// An associated method
492 fn m(&self) { }
493 }
494
495 fn foo() { let _ = S::<|> }
496 "
497 ),
498 @r###"
499 [
500 CompletionItem {
501 label: "m()",
502 source_range: 105..105,
503 delete: 105..105,
504 insert: "m()$0",
505 kind: Method,
506 lookup: "m",
507 detail: "fn m(&self)",
508 documentation: Documentation(
509 "An associated method",
510 ),
511 },
512 ]
513 "###
514 );
515 }
516
517 #[test]
486 fn completes_struct_associated_const() { 518 fn completes_struct_associated_const() {
487 assert_debug_snapshot!( 519 assert_debug_snapshot!(
488 do_reference_completion( 520 do_reference_completion(
@@ -503,8 +535,8 @@ mod tests {
503 [ 535 [
504 CompletionItem { 536 CompletionItem {
505 label: "C", 537 label: "C",
506 source_range: [107; 107), 538 source_range: 107..107,
507 delete: [107; 107), 539 delete: 107..107,
508 insert: "C", 540 insert: "C",
509 kind: Const, 541 kind: Const,
510 detail: "const C: i32 = 42;", 542 detail: "const C: i32 = 42;",
@@ -538,8 +570,8 @@ mod tests {
538 [ 570 [
539 CompletionItem { 571 CompletionItem {
540 label: "T", 572 label: "T",
541 source_range: [101; 101), 573 source_range: 101..101,
542 delete: [101; 101), 574 delete: 101..101,
543 insert: "T", 575 insert: "T",
544 kind: TypeAlias, 576 kind: TypeAlias,
545 detail: "type T = i32;", 577 detail: "type T = i32;",
@@ -578,24 +610,24 @@ mod tests {
578 [ 610 [
579 CompletionItem { 611 CompletionItem {
580 label: "PUBLIC_CONST", 612 label: "PUBLIC_CONST",
581 source_range: [302; 302), 613 source_range: 302..302,
582 delete: [302; 302), 614 delete: 302..302,
583 insert: "PUBLIC_CONST", 615 insert: "PUBLIC_CONST",
584 kind: Const, 616 kind: Const,
585 detail: "pub(super) const PUBLIC_CONST: u32 = 1;", 617 detail: "pub(super) const PUBLIC_CONST: u32 = 1;",
586 }, 618 },
587 CompletionItem { 619 CompletionItem {
588 label: "PublicType", 620 label: "PublicType",
589 source_range: [302; 302), 621 source_range: 302..302,
590 delete: [302; 302), 622 delete: 302..302,
591 insert: "PublicType", 623 insert: "PublicType",
592 kind: TypeAlias, 624 kind: TypeAlias,
593 detail: "pub(super) type PublicType = u32;", 625 detail: "pub(super) type PublicType = u32;",
594 }, 626 },
595 CompletionItem { 627 CompletionItem {
596 label: "public_method()", 628 label: "public_method()",
597 source_range: [302; 302), 629 source_range: 302..302,
598 delete: [302; 302), 630 delete: 302..302,
599 insert: "public_method()$0", 631 insert: "public_method()$0",
600 kind: Function, 632 kind: Function,
601 lookup: "public_method", 633 lookup: "public_method",
@@ -627,8 +659,8 @@ mod tests {
627 [ 659 [
628 CompletionItem { 660 CompletionItem {
629 label: "m()", 661 label: "m()",
630 source_range: [100; 100), 662 source_range: 100..100,
631 delete: [100; 100), 663 delete: 100..100,
632 insert: "m()$0", 664 insert: "m()$0",
633 kind: Function, 665 kind: Function,
634 lookup: "m", 666 lookup: "m",
@@ -663,8 +695,8 @@ mod tests {
663 [ 695 [
664 CompletionItem { 696 CompletionItem {
665 label: "m()", 697 label: "m()",
666 source_range: [101; 101), 698 source_range: 101..101,
667 delete: [101; 101), 699 delete: 101..101,
668 insert: "m()$0", 700 insert: "m()$0",
669 kind: Function, 701 kind: Function,
670 lookup: "m", 702 lookup: "m",
@@ -696,8 +728,8 @@ mod tests {
696 [ 728 [
697 CompletionItem { 729 CompletionItem {
698 label: "bar", 730 label: "bar",
699 source_range: [9; 9), 731 source_range: 9..9,
700 delete: [9; 9), 732 delete: 9..9,
701 insert: "bar", 733 insert: "bar",
702 kind: Module, 734 kind: Module,
703 }, 735 },
@@ -724,8 +756,8 @@ mod tests {
724 [ 756 [
725 CompletionItem { 757 CompletionItem {
726 label: "m()", 758 label: "m()",
727 source_range: [73; 73), 759 source_range: 73..73,
728 delete: [73; 73), 760 delete: 73..73,
729 insert: "m()$0", 761 insert: "m()$0",
730 kind: Function, 762 kind: Function,
731 lookup: "m", 763 lookup: "m",
@@ -760,8 +792,8 @@ mod tests {
760 [ 792 [
761 CompletionItem { 793 CompletionItem {
762 label: "m()", 794 label: "m()",
763 source_range: [99; 99), 795 source_range: 99..99,
764 delete: [99; 99), 796 delete: 99..99,
765 insert: "m()$0", 797 insert: "m()$0",
766 kind: Function, 798 kind: Function,
767 lookup: "m", 799 lookup: "m",
@@ -796,8 +828,8 @@ mod tests {
796 [ 828 [
797 CompletionItem { 829 CompletionItem {
798 label: "m()", 830 label: "m()",
799 source_range: [110; 110), 831 source_range: 110..110,
800 delete: [110; 110), 832 delete: 110..110,
801 insert: "m()$0", 833 insert: "m()$0",
802 kind: Function, 834 kind: Function,
803 lookup: "m", 835 lookup: "m",
@@ -830,8 +862,8 @@ mod tests {
830 [ 862 [
831 CompletionItem { 863 CompletionItem {
832 label: "bar()", 864 label: "bar()",
833 source_range: [185; 185), 865 source_range: 185..185,
834 delete: [185; 185), 866 delete: 185..185,
835 insert: "bar()$0", 867 insert: "bar()$0",
836 kind: Function, 868 kind: Function,
837 lookup: "bar", 869 lookup: "bar",
@@ -839,8 +871,8 @@ mod tests {
839 }, 871 },
840 CompletionItem { 872 CompletionItem {
841 label: "foo()", 873 label: "foo()",
842 source_range: [185; 185), 874 source_range: 185..185,
843 delete: [185; 185), 875 delete: 185..185,
844 insert: "foo()$0", 876 insert: "foo()$0",
845 kind: Function, 877 kind: Function,
846 lookup: "foo", 878 lookup: "foo",
@@ -870,16 +902,16 @@ mod tests {
870 [ 902 [
871 CompletionItem { 903 CompletionItem {
872 label: "foo!(…)", 904 label: "foo!(…)",
873 source_range: [179; 179), 905 source_range: 179..179,
874 delete: [179; 179), 906 delete: 179..179,
875 insert: "foo!($0)", 907 insert: "foo!($0)",
876 kind: Macro, 908 kind: Macro,
877 detail: "#[macro_export]\nmacro_rules! foo", 909 detail: "#[macro_export]\nmacro_rules! foo",
878 }, 910 },
879 CompletionItem { 911 CompletionItem {
880 label: "main()", 912 label: "main()",
881 source_range: [179; 179), 913 source_range: 179..179,
882 delete: [179; 179), 914 delete: 179..179,
883 insert: "main()$0", 915 insert: "main()$0",
884 kind: Function, 916 kind: Function,
885 lookup: "main", 917 lookup: "main",
@@ -915,22 +947,22 @@ mod tests {
915 [ 947 [
916 CompletionItem { 948 CompletionItem {
917 label: "RIGHT_CONST", 949 label: "RIGHT_CONST",
918 source_range: [57; 57), 950 source_range: 57..57,
919 delete: [57; 57), 951 delete: 57..57,
920 insert: "RIGHT_CONST", 952 insert: "RIGHT_CONST",
921 kind: Const, 953 kind: Const,
922 }, 954 },
923 CompletionItem { 955 CompletionItem {
924 label: "RightType", 956 label: "RightType",
925 source_range: [57; 57), 957 source_range: 57..57,
926 delete: [57; 57), 958 delete: 57..57,
927 insert: "RightType", 959 insert: "RightType",
928 kind: Struct, 960 kind: Struct,
929 }, 961 },
930 CompletionItem { 962 CompletionItem {
931 label: "right_fn()", 963 label: "right_fn()",
932 source_range: [57; 57), 964 source_range: 57..57,
933 delete: [57; 57), 965 delete: 57..57,
934 insert: "right_fn()$0", 966 insert: "right_fn()$0",
935 kind: Function, 967 kind: Function,
936 lookup: "right_fn", 968 lookup: "right_fn",
@@ -954,8 +986,8 @@ mod tests {
954 [ 986 [
955 CompletionItem { 987 CompletionItem {
956 label: "foo()", 988 label: "foo()",
957 source_range: [93; 94), 989 source_range: 93..94,
958 delete: [93; 94), 990 delete: 93..94,
959 insert: "foo()$0", 991 insert: "foo()$0",
960 kind: Function, 992 kind: Function,
961 lookup: "foo", 993 lookup: "foo",
@@ -963,8 +995,8 @@ mod tests {
963 }, 995 },
964 CompletionItem { 996 CompletionItem {
965 label: "main()", 997 label: "main()",
966 source_range: [93; 94), 998 source_range: 93..94,
967 delete: [93; 94), 999 delete: 93..94,
968 insert: "main()$0", 1000 insert: "main()$0",
969 kind: Function, 1001 kind: Function,
970 lookup: "main", 1002 lookup: "main",
@@ -993,15 +1025,15 @@ mod tests {
993 [ 1025 [
994 CompletionItem { 1026 CompletionItem {
995 label: "z", 1027 label: "z",
996 source_range: [57; 57), 1028 source_range: 57..57,
997 delete: [57; 57), 1029 delete: 57..57,
998 insert: "z", 1030 insert: "z",
999 kind: Module, 1031 kind: Module,
1000 }, 1032 },
1001 CompletionItem { 1033 CompletionItem {
1002 label: "z()", 1034 label: "z()",
1003 source_range: [57; 57), 1035 source_range: 57..57,
1004 delete: [57; 57), 1036 delete: 57..57,
1005 insert: "z()$0", 1037 insert: "z()$0",
1006 kind: Function, 1038 kind: Function,
1007 lookup: "z", 1039 lookup: "z",
@@ -1032,8 +1064,8 @@ mod tests {
1032 [ 1064 [
1033 CompletionItem { 1065 CompletionItem {
1034 label: "new()", 1066 label: "new()",
1035 source_range: [292; 292), 1067 source_range: 292..292,
1036 delete: [292; 292), 1068 delete: 292..292,
1037 insert: "new()$0", 1069 insert: "new()$0",
1038 kind: Function, 1070 kind: Function,
1039 lookup: "new", 1071 lookup: "new",
diff --git a/crates/ra_ide/src/completion/complete_record.rs b/crates/ra_ide/src/completion/complete_record.rs
index 83a553155..b7ab654c5 100644
--- a/crates/ra_ide/src/completion/complete_record.rs
+++ b/crates/ra_ide/src/completion/complete_record.rs
@@ -44,8 +44,8 @@ mod tests {
44 [ 44 [
45 CompletionItem { 45 CompletionItem {
46 label: "foo", 46 label: "foo",
47 source_range: [117; 118), 47 source_range: 117..118,
48 delete: [117; 118), 48 delete: 117..118,
49 insert: "foo", 49 insert: "foo",
50 kind: Field, 50 kind: Field,
51 detail: "u32", 51 detail: "u32",
@@ -73,16 +73,16 @@ mod tests {
73 [ 73 [
74 CompletionItem { 74 CompletionItem {
75 label: "bar", 75 label: "bar",
76 source_range: [161; 161), 76 source_range: 161..161,
77 delete: [161; 161), 77 delete: 161..161,
78 insert: "bar", 78 insert: "bar",
79 kind: Field, 79 kind: Field,
80 detail: "()", 80 detail: "()",
81 }, 81 },
82 CompletionItem { 82 CompletionItem {
83 label: "foo", 83 label: "foo",
84 source_range: [161; 161), 84 source_range: 161..161,
85 delete: [161; 161), 85 delete: 161..161,
86 insert: "foo", 86 insert: "foo",
87 kind: Field, 87 kind: Field,
88 detail: "u32", 88 detail: "u32",
@@ -109,8 +109,8 @@ mod tests {
109 [ 109 [
110 CompletionItem { 110 CompletionItem {
111 label: "foo", 111 label: "foo",
112 source_range: [171; 172), 112 source_range: 171..172,
113 delete: [171; 172), 113 delete: 171..172,
114 insert: "foo", 114 insert: "foo",
115 kind: Field, 115 kind: Field,
116 detail: "u32", 116 detail: "u32",
@@ -145,16 +145,16 @@ mod tests {
145 [ 145 [
146 CompletionItem { 146 CompletionItem {
147 label: "bar", 147 label: "bar",
148 source_range: [372; 372), 148 source_range: 372..372,
149 delete: [372; 372), 149 delete: 372..372,
150 insert: "bar", 150 insert: "bar",
151 kind: Field, 151 kind: Field,
152 detail: "u32", 152 detail: "u32",
153 }, 153 },
154 CompletionItem { 154 CompletionItem {
155 label: "baz", 155 label: "baz",
156 source_range: [372; 372), 156 source_range: 372..372,
157 delete: [372; 372), 157 delete: 372..372,
158 insert: "baz", 158 insert: "baz",
159 kind: Field, 159 kind: Field,
160 detail: "u32", 160 detail: "u32",
@@ -190,8 +190,8 @@ mod tests {
190 [ 190 [
191 CompletionItem { 191 CompletionItem {
192 label: "the_field", 192 label: "the_field",
193 source_range: [142; 145), 193 source_range: 142..145,
194 delete: [142; 145), 194 delete: 142..145,
195 insert: "the_field", 195 insert: "the_field",
196 kind: Field, 196 kind: Field,
197 detail: "u32", 197 detail: "u32",
@@ -215,8 +215,8 @@ mod tests {
215 [ 215 [
216 CompletionItem { 216 CompletionItem {
217 label: "the_field", 217 label: "the_field",
218 source_range: [83; 86), 218 source_range: 83..86,
219 delete: [83; 86), 219 delete: 83..86,
220 insert: "the_field", 220 insert: "the_field",
221 kind: Field, 221 kind: Field,
222 detail: "u32", 222 detail: "u32",
@@ -241,8 +241,8 @@ mod tests {
241 [ 241 [
242 CompletionItem { 242 CompletionItem {
243 label: "a", 243 label: "a",
244 source_range: [119; 119), 244 source_range: 119..119,
245 delete: [119; 119), 245 delete: 119..119,
246 insert: "a", 246 insert: "a",
247 kind: Field, 247 kind: Field,
248 detail: "u32", 248 detail: "u32",
@@ -267,8 +267,8 @@ mod tests {
267 [ 267 [
268 CompletionItem { 268 CompletionItem {
269 label: "b", 269 label: "b",
270 source_range: [119; 119), 270 source_range: 119..119,
271 delete: [119; 119), 271 delete: 119..119,
272 insert: "b", 272 insert: "b",
273 kind: Field, 273 kind: Field,
274 detail: "u32", 274 detail: "u32",
@@ -292,8 +292,8 @@ mod tests {
292 [ 292 [
293 CompletionItem { 293 CompletionItem {
294 label: "a", 294 label: "a",
295 source_range: [93; 93), 295 source_range: 93..93,
296 delete: [93; 93), 296 delete: 93..93,
297 insert: "a", 297 insert: "a",
298 kind: Field, 298 kind: Field,
299 detail: "u32", 299 detail: "u32",
@@ -317,8 +317,8 @@ mod tests {
317 [ 317 [
318 CompletionItem { 318 CompletionItem {
319 label: "the_field", 319 label: "the_field",
320 source_range: [137; 140), 320 source_range: 137..140,
321 delete: [137; 140), 321 delete: 137..140,
322 insert: "the_field", 322 insert: "the_field",
323 kind: Field, 323 kind: Field,
324 detail: "u32", 324 detail: "u32",
@@ -352,16 +352,16 @@ mod tests {
352 [ 352 [
353 CompletionItem { 353 CompletionItem {
354 label: "bar", 354 label: "bar",
355 source_range: [302; 302), 355 source_range: 302..302,
356 delete: [302; 302), 356 delete: 302..302,
357 insert: "bar", 357 insert: "bar",
358 kind: Field, 358 kind: Field,
359 detail: "u32", 359 detail: "u32",
360 }, 360 },
361 CompletionItem { 361 CompletionItem {
362 label: "baz", 362 label: "baz",
363 source_range: [302; 302), 363 source_range: 302..302,
364 delete: [302; 302), 364 delete: 302..302,
365 insert: "baz", 365 insert: "baz",
366 kind: Field, 366 kind: Field,
367 detail: "u32", 367 detail: "u32",
@@ -393,8 +393,8 @@ mod tests {
393 [ 393 [
394 CompletionItem { 394 CompletionItem {
395 label: "foo2", 395 label: "foo2",
396 source_range: [221; 221), 396 source_range: 221..221,
397 delete: [221; 221), 397 delete: 221..221,
398 insert: "foo2", 398 insert: "foo2",
399 kind: Field, 399 kind: Field,
400 detail: "u32", 400 detail: "u32",
diff --git a/crates/ra_ide/src/completion/complete_snippet.rs b/crates/ra_ide/src/completion/complete_snippet.rs
index 4bccfbfed..a3f5d1b6a 100644
--- a/crates/ra_ide/src/completion/complete_snippet.rs
+++ b/crates/ra_ide/src/completion/complete_snippet.rs
@@ -67,15 +67,15 @@ mod tests {
67 [ 67 [
68 CompletionItem { 68 CompletionItem {
69 label: "pd", 69 label: "pd",
70 source_range: [17; 17), 70 source_range: 17..17,
71 delete: [17; 17), 71 delete: 17..17,
72 insert: "eprintln!(\"$0 = {:?}\", $0);", 72 insert: "eprintln!(\"$0 = {:?}\", $0);",
73 kind: Snippet, 73 kind: Snippet,
74 }, 74 },
75 CompletionItem { 75 CompletionItem {
76 label: "ppd", 76 label: "ppd",
77 source_range: [17; 17), 77 source_range: 17..17,
78 delete: [17; 17), 78 delete: 17..17,
79 insert: "eprintln!(\"$0 = {:#?}\", $0);", 79 insert: "eprintln!(\"$0 = {:#?}\", $0);",
80 kind: Snippet, 80 kind: Snippet,
81 }, 81 },
@@ -111,23 +111,23 @@ mod tests {
111 [ 111 [
112 CompletionItem { 112 CompletionItem {
113 label: "Test function", 113 label: "Test function",
114 source_range: [78; 78), 114 source_range: 78..78,
115 delete: [78; 78), 115 delete: 78..78,
116 insert: "#[test]\nfn ${1:feature}() {\n $0\n}", 116 insert: "#[test]\nfn ${1:feature}() {\n $0\n}",
117 kind: Snippet, 117 kind: Snippet,
118 lookup: "tfn", 118 lookup: "tfn",
119 }, 119 },
120 CompletionItem { 120 CompletionItem {
121 label: "macro_rules", 121 label: "macro_rules",
122 source_range: [78; 78), 122 source_range: 78..78,
123 delete: [78; 78), 123 delete: 78..78,
124 insert: "macro_rules! $1 {\n\t($2) => {\n\t\t$0\n\t};\n}", 124 insert: "macro_rules! $1 {\n\t($2) => {\n\t\t$0\n\t};\n}",
125 kind: Snippet, 125 kind: Snippet,
126 }, 126 },
127 CompletionItem { 127 CompletionItem {
128 label: "pub(crate)", 128 label: "pub(crate)",
129 source_range: [78; 78), 129 source_range: 78..78,
130 delete: [78; 78), 130 delete: 78..78,
131 insert: "pub(crate) $0", 131 insert: "pub(crate) $0",
132 kind: Snippet, 132 kind: Snippet,
133 }, 133 },
diff --git a/crates/ra_ide/src/completion/complete_trait_impl.rs b/crates/ra_ide/src/completion/complete_trait_impl.rs
index c39943252..ee32d1ff6 100644
--- a/crates/ra_ide/src/completion/complete_trait_impl.rs
+++ b/crates/ra_ide/src/completion/complete_trait_impl.rs
@@ -141,7 +141,7 @@ fn add_function_impl(
141 } else { 141 } else {
142 CompletionItemKind::Function 142 CompletionItemKind::Function
143 }; 143 };
144 let range = TextRange::from_to(fn_def_node.text_range().start(), ctx.source_range().end()); 144 let range = TextRange::new(fn_def_node.text_range().start(), ctx.source_range().end());
145 145
146 match ctx.config.snippet_cap { 146 match ctx.config.snippet_cap {
147 Some(cap) => { 147 Some(cap) => {
@@ -167,7 +167,7 @@ fn add_type_alias_impl(
167 167
168 let snippet = format!("type {} = ", alias_name); 168 let snippet = format!("type {} = ", alias_name);
169 169
170 let range = TextRange::from_to(type_def_node.text_range().start(), ctx.source_range().end()); 170 let range = TextRange::new(type_def_node.text_range().start(), ctx.source_range().end());
171 171
172 CompletionItem::new(CompletionKind::Magic, ctx.source_range(), snippet.clone()) 172 CompletionItem::new(CompletionKind::Magic, ctx.source_range(), snippet.clone())
173 .text_edit(TextEdit::replace(range, snippet)) 173 .text_edit(TextEdit::replace(range, snippet))
@@ -188,8 +188,7 @@ fn add_const_impl(
188 if let Some(const_name) = const_name { 188 if let Some(const_name) = const_name {
189 let snippet = make_const_compl_syntax(&const_.source(ctx.db).value); 189 let snippet = make_const_compl_syntax(&const_.source(ctx.db).value);
190 190
191 let range = 191 let range = TextRange::new(const_def_node.text_range().start(), ctx.source_range().end());
192 TextRange::from_to(const_def_node.text_range().start(), ctx.source_range().end());
193 192
194 CompletionItem::new(CompletionKind::Magic, ctx.source_range(), snippet.clone()) 193 CompletionItem::new(CompletionKind::Magic, ctx.source_range(), snippet.clone())
195 .text_edit(TextEdit::replace(range, snippet)) 194 .text_edit(TextEdit::replace(range, snippet))
@@ -216,7 +215,7 @@ fn make_const_compl_syntax(const_: &ast::ConstDef) -> String {
216 .map_or(const_end, |f| f.text_range().start()); 215 .map_or(const_end, |f| f.text_range().start());
217 216
218 let len = end - start; 217 let len = end - start;
219 let range = TextRange::from_to(0.into(), len); 218 let range = TextRange::new(0.into(), len);
220 219
221 let syntax = const_.syntax().text().slice(range).to_string(); 220 let syntax = const_.syntax().text().slice(range).to_string();
222 221
@@ -254,24 +253,24 @@ mod tests {
254 [ 253 [
255 CompletionItem { 254 CompletionItem {
256 label: "const TEST_CONST: u16 = ", 255 label: "const TEST_CONST: u16 = ",
257 source_range: [209; 210), 256 source_range: 209..210,
258 delete: [209; 210), 257 delete: 209..210,
259 insert: "const TEST_CONST: u16 = ", 258 insert: "const TEST_CONST: u16 = ",
260 kind: Const, 259 kind: Const,
261 lookup: "TEST_CONST", 260 lookup: "TEST_CONST",
262 }, 261 },
263 CompletionItem { 262 CompletionItem {
264 label: "fn test()", 263 label: "fn test()",
265 source_range: [209; 210), 264 source_range: 209..210,
266 delete: [209; 210), 265 delete: 209..210,
267 insert: "fn test() {\n $0\n}", 266 insert: "fn test() {\n $0\n}",
268 kind: Function, 267 kind: Function,
269 lookup: "test", 268 lookup: "test",
270 }, 269 },
271 CompletionItem { 270 CompletionItem {
272 label: "type TestType = ", 271 label: "type TestType = ",
273 source_range: [209; 210), 272 source_range: 209..210,
274 delete: [209; 210), 273 delete: 209..210,
275 insert: "type TestType = ", 274 insert: "type TestType = ",
276 kind: TypeAlias, 275 kind: TypeAlias,
277 lookup: "TestType", 276 lookup: "TestType",
@@ -320,8 +319,8 @@ mod tests {
320 [ 319 [
321 CompletionItem { 320 CompletionItem {
322 label: "fn test()", 321 label: "fn test()",
323 source_range: [139; 140), 322 source_range: 139..140,
324 delete: [139; 140), 323 delete: 139..140,
325 insert: "fn test() {\n $0\n}", 324 insert: "fn test() {\n $0\n}",
326 kind: Function, 325 kind: Function,
327 lookup: "test", 326 lookup: "test",
@@ -349,8 +348,8 @@ mod tests {
349 [ 348 [
350 CompletionItem { 349 CompletionItem {
351 label: "fn foo()", 350 label: "fn foo()",
352 source_range: [141; 142), 351 source_range: 141..142,
353 delete: [138; 142), 352 delete: 138..142,
354 insert: "fn foo() {\n $0\n}", 353 insert: "fn foo() {\n $0\n}",
355 kind: Function, 354 kind: Function,
356 lookup: "foo", 355 lookup: "foo",
@@ -381,8 +380,8 @@ mod tests {
381 [ 380 [
382 CompletionItem { 381 CompletionItem {
383 label: "fn foo_bar()", 382 label: "fn foo_bar()",
384 source_range: [200; 201), 383 source_range: 200..201,
385 delete: [197; 201), 384 delete: 197..201,
386 insert: "fn foo_bar() {\n $0\n}", 385 insert: "fn foo_bar() {\n $0\n}",
387 kind: Function, 386 kind: Function,
388 lookup: "foo_bar", 387 lookup: "foo_bar",
@@ -432,8 +431,8 @@ mod tests {
432 [ 431 [
433 CompletionItem { 432 CompletionItem {
434 label: "fn foo()", 433 label: "fn foo()",
435 source_range: [144; 145), 434 source_range: 144..145,
436 delete: [141; 145), 435 delete: 141..145,
437 insert: "fn foo<T>() {\n $0\n}", 436 insert: "fn foo<T>() {\n $0\n}",
438 kind: Function, 437 kind: Function,
439 lookup: "foo", 438 lookup: "foo",
@@ -461,8 +460,8 @@ mod tests {
461 [ 460 [
462 CompletionItem { 461 CompletionItem {
463 label: "fn foo()", 462 label: "fn foo()",
464 source_range: [166; 167), 463 source_range: 166..167,
465 delete: [163; 167), 464 delete: 163..167,
466 insert: "fn foo<T>()\nwhere T: Into<String> {\n $0\n}", 465 insert: "fn foo<T>()\nwhere T: Into<String> {\n $0\n}",
467 kind: Function, 466 kind: Function,
468 lookup: "foo", 467 lookup: "foo",
@@ -488,8 +487,8 @@ mod tests {
488 [ 487 [
489 CompletionItem { 488 CompletionItem {
490 label: "type SomeType = ", 489 label: "type SomeType = ",
491 source_range: [124; 125), 490 source_range: 124..125,
492 delete: [119; 125), 491 delete: 119..125,
493 insert: "type SomeType = ", 492 insert: "type SomeType = ",
494 kind: TypeAlias, 493 kind: TypeAlias,
495 lookup: "SomeType", 494 lookup: "SomeType",
@@ -515,8 +514,8 @@ mod tests {
515 [ 514 [
516 CompletionItem { 515 CompletionItem {
517 label: "const SOME_CONST: u16 = ", 516 label: "const SOME_CONST: u16 = ",
518 source_range: [133; 134), 517 source_range: 133..134,
519 delete: [127; 134), 518 delete: 127..134,
520 insert: "const SOME_CONST: u16 = ", 519 insert: "const SOME_CONST: u16 = ",
521 kind: Const, 520 kind: Const,
522 lookup: "SOME_CONST", 521 lookup: "SOME_CONST",
@@ -542,8 +541,8 @@ mod tests {
542 [ 541 [
543 CompletionItem { 542 CompletionItem {
544 label: "const SOME_CONST: u16 = ", 543 label: "const SOME_CONST: u16 = ",
545 source_range: [138; 139), 544 source_range: 138..139,
546 delete: [132; 139), 545 delete: 132..139,
547 insert: "const SOME_CONST: u16 = ", 546 insert: "const SOME_CONST: u16 = ",
548 kind: Const, 547 kind: Const,
549 lookup: "SOME_CONST", 548 lookup: "SOME_CONST",
diff --git a/crates/ra_ide/src/completion/complete_unqualified_path.rs b/crates/ra_ide/src/completion/complete_unqualified_path.rs
index 638f86eda..56cd086c6 100644
--- a/crates/ra_ide/src/completion/complete_unqualified_path.rs
+++ b/crates/ra_ide/src/completion/complete_unqualified_path.rs
@@ -38,7 +38,15 @@ fn complete_enum_variants(acc: &mut Completions, ctx: &CompletionContext) {
38 if let Some(ty) = ctx.expected_type_of(&ctx.token.parent()) { 38 if let Some(ty) = ctx.expected_type_of(&ctx.token.parent()) {
39 if let Some(Adt::Enum(enum_data)) = ty.as_adt() { 39 if let Some(Adt::Enum(enum_data)) = ty.as_adt() {
40 let variants = enum_data.variants(ctx.db); 40 let variants = enum_data.variants(ctx.db);
41 let module = enum_data.module(ctx.db); 41
42 let module = if let Some(module) = ctx.scope().module() {
43 // Compute path from the completion site if available.
44 module
45 } else {
46 // Otherwise fall back to the enum's definition site.
47 enum_data.module(ctx.db)
48 };
49
42 for variant in variants { 50 for variant in variants {
43 if let Some(path) = module.find_use_path(ctx.db, ModuleDef::from(variant)) { 51 if let Some(path) = module.find_use_path(ctx.db, ModuleDef::from(variant)) {
44 // Variants with trivial paths are already added by the existing completion logic, 52 // Variants with trivial paths are already added by the existing completion logic,
@@ -77,8 +85,8 @@ mod tests {
77 [ 85 [
78 CompletionItem { 86 CompletionItem {
79 label: "collections", 87 label: "collections",
80 source_range: [21; 24), 88 source_range: 21..24,
81 delete: [21; 24), 89 delete: 21..24,
82 insert: "collections", 90 insert: "collections",
83 }, 91 },
84 ] 92 ]
@@ -149,8 +157,8 @@ mod tests {
149 [ 157 [
150 CompletionItem { 158 CompletionItem {
151 label: "Enum", 159 label: "Enum",
152 source_range: [231; 233), 160 source_range: 231..233,
153 delete: [231; 233), 161 delete: 231..233,
154 insert: "Enum", 162 insert: "Enum",
155 kind: Enum, 163 kind: Enum,
156 }, 164 },
@@ -175,8 +183,8 @@ mod tests {
175 [ 183 [
176 CompletionItem { 184 CompletionItem {
177 label: "quux(…)", 185 label: "quux(…)",
178 source_range: [91; 91), 186 source_range: 91..91,
179 delete: [91; 91), 187 delete: 91..91,
180 insert: "quux(${1:x})$0", 188 insert: "quux(${1:x})$0",
181 kind: Function, 189 kind: Function,
182 lookup: "quux", 190 lookup: "quux",
@@ -185,16 +193,16 @@ mod tests {
185 }, 193 },
186 CompletionItem { 194 CompletionItem {
187 label: "x", 195 label: "x",
188 source_range: [91; 91), 196 source_range: 91..91,
189 delete: [91; 91), 197 delete: 91..91,
190 insert: "x", 198 insert: "x",
191 kind: Binding, 199 kind: Binding,
192 detail: "i32", 200 detail: "i32",
193 }, 201 },
194 CompletionItem { 202 CompletionItem {
195 label: "y", 203 label: "y",
196 source_range: [91; 91), 204 source_range: 91..91,
197 delete: [91; 91), 205 delete: 91..91,
198 insert: "y", 206 insert: "y",
199 kind: Binding, 207 kind: Binding,
200 detail: "i32", 208 detail: "i32",
@@ -224,23 +232,23 @@ mod tests {
224 [ 232 [
225 CompletionItem { 233 CompletionItem {
226 label: "a", 234 label: "a",
227 source_range: [242; 242), 235 source_range: 242..242,
228 delete: [242; 242), 236 delete: 242..242,
229 insert: "a", 237 insert: "a",
230 kind: Binding, 238 kind: Binding,
231 }, 239 },
232 CompletionItem { 240 CompletionItem {
233 label: "b", 241 label: "b",
234 source_range: [242; 242), 242 source_range: 242..242,
235 delete: [242; 242), 243 delete: 242..242,
236 insert: "b", 244 insert: "b",
237 kind: Binding, 245 kind: Binding,
238 detail: "i32", 246 detail: "i32",
239 }, 247 },
240 CompletionItem { 248 CompletionItem {
241 label: "quux()", 249 label: "quux()",
242 source_range: [242; 242), 250 source_range: 242..242,
243 delete: [242; 242), 251 delete: 242..242,
244 insert: "quux()$0", 252 insert: "quux()$0",
245 kind: Function, 253 kind: Function,
246 lookup: "quux", 254 lookup: "quux",
@@ -267,8 +275,8 @@ mod tests {
267 [ 275 [
268 CompletionItem { 276 CompletionItem {
269 label: "quux()", 277 label: "quux()",
270 source_range: [95; 95), 278 source_range: 95..95,
271 delete: [95; 95), 279 delete: 95..95,
272 insert: "quux()$0", 280 insert: "quux()$0",
273 kind: Function, 281 kind: Function,
274 lookup: "quux", 282 lookup: "quux",
@@ -276,8 +284,8 @@ mod tests {
276 }, 284 },
277 CompletionItem { 285 CompletionItem {
278 label: "x", 286 label: "x",
279 source_range: [95; 95), 287 source_range: 95..95,
280 delete: [95; 95), 288 delete: 95..95,
281 insert: "x", 289 insert: "x",
282 kind: Binding, 290 kind: Binding,
283 }, 291 },
@@ -300,15 +308,15 @@ mod tests {
300 [ 308 [
301 CompletionItem { 309 CompletionItem {
302 label: "T", 310 label: "T",
303 source_range: [52; 52), 311 source_range: 52..52,
304 delete: [52; 52), 312 delete: 52..52,
305 insert: "T", 313 insert: "T",
306 kind: TypeParam, 314 kind: TypeParam,
307 }, 315 },
308 CompletionItem { 316 CompletionItem {
309 label: "quux()", 317 label: "quux()",
310 source_range: [52; 52), 318 source_range: 52..52,
311 delete: [52; 52), 319 delete: 52..52,
312 insert: "quux()$0", 320 insert: "quux()$0",
313 kind: Function, 321 kind: Function,
314 lookup: "quux", 322 lookup: "quux",
@@ -333,22 +341,22 @@ mod tests {
333 [ 341 [
334 CompletionItem { 342 CompletionItem {
335 label: "Self", 343 label: "Self",
336 source_range: [54; 54), 344 source_range: 54..54,
337 delete: [54; 54), 345 delete: 54..54,
338 insert: "Self", 346 insert: "Self",
339 kind: TypeParam, 347 kind: TypeParam,
340 }, 348 },
341 CompletionItem { 349 CompletionItem {
342 label: "T", 350 label: "T",
343 source_range: [54; 54), 351 source_range: 54..54,
344 delete: [54; 54), 352 delete: 54..54,
345 insert: "T", 353 insert: "T",
346 kind: TypeParam, 354 kind: TypeParam,
347 }, 355 },
348 CompletionItem { 356 CompletionItem {
349 label: "X<…>", 357 label: "X<…>",
350 source_range: [54; 54), 358 source_range: 54..54,
351 delete: [54; 54), 359 delete: 54..54,
352 insert: "X<$0>", 360 insert: "X<$0>",
353 kind: Struct, 361 kind: Struct,
354 lookup: "X", 362 lookup: "X",
@@ -372,15 +380,15 @@ mod tests {
372 [ 380 [
373 CompletionItem { 381 CompletionItem {
374 label: "Self", 382 label: "Self",
375 source_range: [48; 48), 383 source_range: 48..48,
376 delete: [48; 48), 384 delete: 48..48,
377 insert: "Self", 385 insert: "Self",
378 kind: TypeParam, 386 kind: TypeParam,
379 }, 387 },
380 CompletionItem { 388 CompletionItem {
381 label: "X", 389 label: "X",
382 source_range: [48; 48), 390 source_range: 48..48,
383 delete: [48; 48), 391 delete: 48..48,
384 insert: "X", 392 insert: "X",
385 kind: Enum, 393 kind: Enum,
386 }, 394 },
@@ -405,22 +413,22 @@ mod tests {
405 [ 413 [
406 CompletionItem { 414 CompletionItem {
407 label: "Baz", 415 label: "Baz",
408 source_range: [105; 105), 416 source_range: 105..105,
409 delete: [105; 105), 417 delete: 105..105,
410 insert: "Baz", 418 insert: "Baz",
411 kind: Enum, 419 kind: Enum,
412 }, 420 },
413 CompletionItem { 421 CompletionItem {
414 label: "Foo", 422 label: "Foo",
415 source_range: [105; 105), 423 source_range: 105..105,
416 delete: [105; 105), 424 delete: 105..105,
417 insert: "Foo", 425 insert: "Foo",
418 kind: Struct, 426 kind: Struct,
419 }, 427 },
420 CompletionItem { 428 CompletionItem {
421 label: "quux()", 429 label: "quux()",
422 source_range: [105; 105), 430 source_range: 105..105,
423 delete: [105; 105), 431 delete: 105..105,
424 insert: "quux()$0", 432 insert: "quux()$0",
425 kind: Function, 433 kind: Function,
426 lookup: "quux", 434 lookup: "quux",
@@ -447,8 +455,8 @@ mod tests {
447 [ 455 [
448 CompletionItem { 456 CompletionItem {
449 label: "other_crate", 457 label: "other_crate",
450 source_range: [4; 4), 458 source_range: 4..4,
451 delete: [4; 4), 459 delete: 4..4,
452 insert: "other_crate", 460 insert: "other_crate",
453 kind: Module, 461 kind: Module,
454 }, 462 },
@@ -473,15 +481,15 @@ mod tests {
473 [ 481 [
474 CompletionItem { 482 CompletionItem {
475 label: "Bar", 483 label: "Bar",
476 source_range: [117; 117), 484 source_range: 117..117,
477 delete: [117; 117), 485 delete: 117..117,
478 insert: "Bar", 486 insert: "Bar",
479 kind: Struct, 487 kind: Struct,
480 }, 488 },
481 CompletionItem { 489 CompletionItem {
482 label: "quux()", 490 label: "quux()",
483 source_range: [117; 117), 491 source_range: 117..117,
484 delete: [117; 117), 492 delete: 117..117,
485 insert: "quux()$0", 493 insert: "quux()$0",
486 kind: Function, 494 kind: Function,
487 lookup: "quux", 495 lookup: "quux",
@@ -505,15 +513,15 @@ mod tests {
505 [ 513 [
506 CompletionItem { 514 CompletionItem {
507 label: "Foo", 515 label: "Foo",
508 source_range: [55; 55), 516 source_range: 55..55,
509 delete: [55; 55), 517 delete: 55..55,
510 insert: "Foo", 518 insert: "Foo",
511 kind: Struct, 519 kind: Struct,
512 }, 520 },
513 CompletionItem { 521 CompletionItem {
514 label: "x()", 522 label: "x()",
515 source_range: [55; 55), 523 source_range: 55..55,
516 delete: [55; 55), 524 delete: 55..55,
517 insert: "x()$0", 525 insert: "x()$0",
518 kind: Function, 526 kind: Function,
519 lookup: "x", 527 lookup: "x",
@@ -542,16 +550,16 @@ mod tests {
542 [ 550 [
543 CompletionItem { 551 CompletionItem {
544 label: "bar", 552 label: "bar",
545 source_range: [146; 146), 553 source_range: 146..146,
546 delete: [146; 146), 554 delete: 146..146,
547 insert: "bar", 555 insert: "bar",
548 kind: Binding, 556 kind: Binding,
549 detail: "i32", 557 detail: "i32",
550 }, 558 },
551 CompletionItem { 559 CompletionItem {
552 label: "foo()", 560 label: "foo()",
553 source_range: [146; 146), 561 source_range: 146..146,
554 delete: [146; 146), 562 delete: 146..146,
555 insert: "foo()$0", 563 insert: "foo()$0",
556 kind: Function, 564 kind: Function,
557 lookup: "foo", 565 lookup: "foo",
@@ -570,15 +578,15 @@ mod tests {
570 [ 578 [
571 CompletionItem { 579 CompletionItem {
572 label: "Self", 580 label: "Self",
573 source_range: [25; 25), 581 source_range: 25..25,
574 delete: [25; 25), 582 delete: 25..25,
575 insert: "Self", 583 insert: "Self",
576 kind: TypeParam, 584 kind: TypeParam,
577 }, 585 },
578 CompletionItem { 586 CompletionItem {
579 label: "self", 587 label: "self",
580 source_range: [25; 25), 588 source_range: 25..25,
581 delete: [25; 25), 589 delete: 25..25,
582 insert: "self", 590 insert: "self",
583 kind: Binding, 591 kind: Binding,
584 detail: "&{unknown}", 592 detail: "&{unknown}",
@@ -609,15 +617,15 @@ mod tests {
609 [ 617 [
610 CompletionItem { 618 CompletionItem {
611 label: "Option", 619 label: "Option",
612 source_range: [18; 18), 620 source_range: 18..18,
613 delete: [18; 18), 621 delete: 18..18,
614 insert: "Option", 622 insert: "Option",
615 kind: Struct, 623 kind: Struct,
616 }, 624 },
617 CompletionItem { 625 CompletionItem {
618 label: "foo()", 626 label: "foo()",
619 source_range: [18; 18), 627 source_range: 18..18,
620 delete: [18; 18), 628 delete: 18..18,
621 insert: "foo()$0", 629 insert: "foo()$0",
622 kind: Function, 630 kind: Function,
623 lookup: "foo", 631 lookup: "foo",
@@ -625,8 +633,8 @@ mod tests {
625 }, 633 },
626 CompletionItem { 634 CompletionItem {
627 label: "std", 635 label: "std",
628 source_range: [18; 18), 636 source_range: 18..18,
629 delete: [18; 18), 637 delete: 18..18,
630 insert: "std", 638 insert: "std",
631 kind: Module, 639 kind: Module,
632 }, 640 },
@@ -664,22 +672,22 @@ mod tests {
664 [ 672 [
665 CompletionItem { 673 CompletionItem {
666 label: "String", 674 label: "String",
667 source_range: [18; 18), 675 source_range: 18..18,
668 delete: [18; 18), 676 delete: 18..18,
669 insert: "String", 677 insert: "String",
670 kind: Struct, 678 kind: Struct,
671 }, 679 },
672 CompletionItem { 680 CompletionItem {
673 label: "core", 681 label: "core",
674 source_range: [18; 18), 682 source_range: 18..18,
675 delete: [18; 18), 683 delete: 18..18,
676 insert: "core", 684 insert: "core",
677 kind: Module, 685 kind: Module,
678 }, 686 },
679 CompletionItem { 687 CompletionItem {
680 label: "foo()", 688 label: "foo()",
681 source_range: [18; 18), 689 source_range: 18..18,
682 delete: [18; 18), 690 delete: 18..18,
683 insert: "foo()$0", 691 insert: "foo()$0",
684 kind: Function, 692 kind: Function,
685 lookup: "foo", 693 lookup: "foo",
@@ -687,8 +695,8 @@ mod tests {
687 }, 695 },
688 CompletionItem { 696 CompletionItem {
689 label: "std", 697 label: "std",
690 source_range: [18; 18), 698 source_range: 18..18,
691 delete: [18; 18), 699 delete: 18..18,
692 insert: "std", 700 insert: "std",
693 kind: Module, 701 kind: Module,
694 }, 702 },
@@ -734,46 +742,46 @@ mod tests {
734 [ 742 [
735 CompletionItem { 743 CompletionItem {
736 label: "bar!(…)", 744 label: "bar!(…)",
737 source_range: [252; 252), 745 source_range: 252..252,
738 delete: [252; 252), 746 delete: 252..252,
739 insert: "bar!($0)", 747 insert: "bar!($0)",
740 kind: Macro, 748 kind: Macro,
741 detail: "macro_rules! bar", 749 detail: "macro_rules! bar",
742 }, 750 },
743 CompletionItem { 751 CompletionItem {
744 label: "baz!(…)", 752 label: "baz!(…)",
745 source_range: [252; 252), 753 source_range: 252..252,
746 delete: [252; 252), 754 delete: 252..252,
747 insert: "baz!($0)", 755 insert: "baz!($0)",
748 kind: Macro, 756 kind: Macro,
749 detail: "#[macro_export]\nmacro_rules! baz", 757 detail: "#[macro_export]\nmacro_rules! baz",
750 }, 758 },
751 CompletionItem { 759 CompletionItem {
752 label: "foo!(…)", 760 label: "foo!(…)",
753 source_range: [252; 252), 761 source_range: 252..252,
754 delete: [252; 252), 762 delete: 252..252,
755 insert: "foo!($0)", 763 insert: "foo!($0)",
756 kind: Macro, 764 kind: Macro,
757 detail: "macro_rules! foo", 765 detail: "macro_rules! foo",
758 }, 766 },
759 CompletionItem { 767 CompletionItem {
760 label: "m1", 768 label: "m1",
761 source_range: [252; 252), 769 source_range: 252..252,
762 delete: [252; 252), 770 delete: 252..252,
763 insert: "m1", 771 insert: "m1",
764 kind: Module, 772 kind: Module,
765 }, 773 },
766 CompletionItem { 774 CompletionItem {
767 label: "m2", 775 label: "m2",
768 source_range: [252; 252), 776 source_range: 252..252,
769 delete: [252; 252), 777 delete: 252..252,
770 insert: "m2", 778 insert: "m2",
771 kind: Module, 779 kind: Module,
772 }, 780 },
773 CompletionItem { 781 CompletionItem {
774 label: "main()", 782 label: "main()",
775 source_range: [252; 252), 783 source_range: 252..252,
776 delete: [252; 252), 784 delete: 252..252,
777 insert: "main()$0", 785 insert: "main()$0",
778 kind: Function, 786 kind: Function,
779 lookup: "main", 787 lookup: "main",
@@ -803,16 +811,16 @@ mod tests {
803 [ 811 [
804 CompletionItem { 812 CompletionItem {
805 label: "foo!(…)", 813 label: "foo!(…)",
806 source_range: [49; 49), 814 source_range: 49..49,
807 delete: [49; 49), 815 delete: 49..49,
808 insert: "foo!($0)", 816 insert: "foo!($0)",
809 kind: Macro, 817 kind: Macro,
810 detail: "macro_rules! foo", 818 detail: "macro_rules! foo",
811 }, 819 },
812 CompletionItem { 820 CompletionItem {
813 label: "foo()", 821 label: "foo()",
814 source_range: [49; 49), 822 source_range: 49..49,
815 delete: [49; 49), 823 delete: 49..49,
816 insert: "foo()$0", 824 insert: "foo()$0",
817 kind: Function, 825 kind: Function,
818 lookup: "foo", 826 lookup: "foo",
@@ -842,16 +850,16 @@ mod tests {
842 [ 850 [
843 CompletionItem { 851 CompletionItem {
844 label: "foo!(…)", 852 label: "foo!(…)",
845 source_range: [57; 57), 853 source_range: 57..57,
846 delete: [57; 57), 854 delete: 57..57,
847 insert: "foo!($0)", 855 insert: "foo!($0)",
848 kind: Macro, 856 kind: Macro,
849 detail: "macro_rules! foo", 857 detail: "macro_rules! foo",
850 }, 858 },
851 CompletionItem { 859 CompletionItem {
852 label: "main()", 860 label: "main()",
853 source_range: [57; 57), 861 source_range: 57..57,
854 delete: [57; 57), 862 delete: 57..57,
855 insert: "main()$0", 863 insert: "main()$0",
856 kind: Function, 864 kind: Function,
857 lookup: "main", 865 lookup: "main",
@@ -881,16 +889,16 @@ mod tests {
881 [ 889 [
882 CompletionItem { 890 CompletionItem {
883 label: "foo!(…)", 891 label: "foo!(…)",
884 source_range: [50; 50), 892 source_range: 50..50,
885 delete: [50; 50), 893 delete: 50..50,
886 insert: "foo!($0)", 894 insert: "foo!($0)",
887 kind: Macro, 895 kind: Macro,
888 detail: "macro_rules! foo", 896 detail: "macro_rules! foo",
889 }, 897 },
890 CompletionItem { 898 CompletionItem {
891 label: "main()", 899 label: "main()",
892 source_range: [50; 50), 900 source_range: 50..50,
893 delete: [50; 50), 901 delete: 50..50,
894 insert: "main()$0", 902 insert: "main()$0",
895 kind: Function, 903 kind: Function,
896 lookup: "main", 904 lookup: "main",
@@ -917,8 +925,8 @@ mod tests {
917 [ 925 [
918 CompletionItem { 926 CompletionItem {
919 label: "frobnicate()", 927 label: "frobnicate()",
920 source_range: [23; 24), 928 source_range: 23..24,
921 delete: [23; 24), 929 delete: 23..24,
922 insert: "frobnicate()$0", 930 insert: "frobnicate()$0",
923 kind: Function, 931 kind: Function,
924 lookup: "frobnicate", 932 lookup: "frobnicate",
@@ -926,8 +934,8 @@ mod tests {
926 }, 934 },
927 CompletionItem { 935 CompletionItem {
928 label: "main()", 936 label: "main()",
929 source_range: [23; 24), 937 source_range: 23..24,
930 delete: [23; 24), 938 delete: 23..24,
931 insert: "main()$0", 939 insert: "main()$0",
932 kind: Function, 940 kind: Function,
933 lookup: "main", 941 lookup: "main",
@@ -954,16 +962,16 @@ mod tests {
954 [ 962 [
955 CompletionItem { 963 CompletionItem {
956 label: "m!(…)", 964 label: "m!(…)",
957 source_range: [145; 145), 965 source_range: 145..145,
958 delete: [145; 145), 966 delete: 145..145,
959 insert: "m!($0)", 967 insert: "m!($0)",
960 kind: Macro, 968 kind: Macro,
961 detail: "macro_rules! m", 969 detail: "macro_rules! m",
962 }, 970 },
963 CompletionItem { 971 CompletionItem {
964 label: "quux(…)", 972 label: "quux(…)",
965 source_range: [145; 145), 973 source_range: 145..145,
966 delete: [145; 145), 974 delete: 145..145,
967 insert: "quux(${1:x})$0", 975 insert: "quux(${1:x})$0",
968 kind: Function, 976 kind: Function,
969 lookup: "quux", 977 lookup: "quux",
@@ -972,16 +980,16 @@ mod tests {
972 }, 980 },
973 CompletionItem { 981 CompletionItem {
974 label: "x", 982 label: "x",
975 source_range: [145; 145), 983 source_range: 145..145,
976 delete: [145; 145), 984 delete: 145..145,
977 insert: "x", 985 insert: "x",
978 kind: Binding, 986 kind: Binding,
979 detail: "i32", 987 detail: "i32",
980 }, 988 },
981 CompletionItem { 989 CompletionItem {
982 label: "y", 990 label: "y",
983 source_range: [145; 145), 991 source_range: 145..145,
984 delete: [145; 145), 992 delete: 145..145,
985 insert: "y", 993 insert: "y",
986 kind: Binding, 994 kind: Binding,
987 detail: "i32", 995 detail: "i32",
@@ -1007,16 +1015,16 @@ mod tests {
1007 [ 1015 [
1008 CompletionItem { 1016 CompletionItem {
1009 label: "m!(…)", 1017 label: "m!(…)",
1010 source_range: [145; 146), 1018 source_range: 145..146,
1011 delete: [145; 146), 1019 delete: 145..146,
1012 insert: "m!($0)", 1020 insert: "m!($0)",
1013 kind: Macro, 1021 kind: Macro,
1014 detail: "macro_rules! m", 1022 detail: "macro_rules! m",
1015 }, 1023 },
1016 CompletionItem { 1024 CompletionItem {
1017 label: "quux(…)", 1025 label: "quux(…)",
1018 source_range: [145; 146), 1026 source_range: 145..146,
1019 delete: [145; 146), 1027 delete: 145..146,
1020 insert: "quux(${1:x})$0", 1028 insert: "quux(${1:x})$0",
1021 kind: Function, 1029 kind: Function,
1022 lookup: "quux", 1030 lookup: "quux",
@@ -1025,16 +1033,16 @@ mod tests {
1025 }, 1033 },
1026 CompletionItem { 1034 CompletionItem {
1027 label: "x", 1035 label: "x",
1028 source_range: [145; 146), 1036 source_range: 145..146,
1029 delete: [145; 146), 1037 delete: 145..146,
1030 insert: "x", 1038 insert: "x",
1031 kind: Binding, 1039 kind: Binding,
1032 detail: "i32", 1040 detail: "i32",
1033 }, 1041 },
1034 CompletionItem { 1042 CompletionItem {
1035 label: "y", 1043 label: "y",
1036 source_range: [145; 146), 1044 source_range: 145..146,
1037 delete: [145; 146), 1045 delete: 145..146,
1038 insert: "y", 1046 insert: "y",
1039 kind: Binding, 1047 kind: Binding,
1040 detail: "i32", 1048 detail: "i32",
@@ -1060,16 +1068,16 @@ mod tests {
1060 [ 1068 [
1061 CompletionItem { 1069 CompletionItem {
1062 label: "m!(…)", 1070 label: "m!(…)",
1063 source_range: [145; 146), 1071 source_range: 145..146,
1064 delete: [145; 146), 1072 delete: 145..146,
1065 insert: "m!($0)", 1073 insert: "m!($0)",
1066 kind: Macro, 1074 kind: Macro,
1067 detail: "macro_rules! m", 1075 detail: "macro_rules! m",
1068 }, 1076 },
1069 CompletionItem { 1077 CompletionItem {
1070 label: "quux(…)", 1078 label: "quux(…)",
1071 source_range: [145; 146), 1079 source_range: 145..146,
1072 delete: [145; 146), 1080 delete: 145..146,
1073 insert: "quux(${1:x})$0", 1081 insert: "quux(${1:x})$0",
1074 kind: Function, 1082 kind: Function,
1075 lookup: "quux", 1083 lookup: "quux",
@@ -1078,16 +1086,16 @@ mod tests {
1078 }, 1086 },
1079 CompletionItem { 1087 CompletionItem {
1080 label: "x", 1088 label: "x",
1081 source_range: [145; 146), 1089 source_range: 145..146,
1082 delete: [145; 146), 1090 delete: 145..146,
1083 insert: "x", 1091 insert: "x",
1084 kind: Binding, 1092 kind: Binding,
1085 detail: "i32", 1093 detail: "i32",
1086 }, 1094 },
1087 CompletionItem { 1095 CompletionItem {
1088 label: "y", 1096 label: "y",
1089 source_range: [145; 146), 1097 source_range: 145..146,
1090 delete: [145; 146), 1098 delete: 145..146,
1091 insert: "y", 1099 insert: "y",
1092 kind: Binding, 1100 kind: Binding,
1093 detail: "i32", 1101 detail: "i32",
@@ -1113,14 +1121,14 @@ mod tests {
1113 [ 1121 [
1114 CompletionItem { 1122 CompletionItem {
1115 label: "Quux", 1123 label: "Quux",
1116 source_range: [82; 82), 1124 source_range: 82..82,
1117 delete: [82; 82), 1125 delete: 82..82,
1118 insert: "Quux", 1126 insert: "Quux",
1119 }, 1127 },
1120 CompletionItem { 1128 CompletionItem {
1121 label: "main()", 1129 label: "main()",
1122 source_range: [82; 82), 1130 source_range: 82..82,
1123 delete: [82; 82), 1131 delete: 82..82,
1124 insert: "main()$0", 1132 insert: "main()$0",
1125 kind: Function, 1133 kind: Function,
1126 lookup: "main", 1134 lookup: "main",
@@ -1154,31 +1162,31 @@ mod tests {
1154 [ 1162 [
1155 CompletionItem { 1163 CompletionItem {
1156 label: "Foo", 1164 label: "Foo",
1157 source_range: [248; 250), 1165 source_range: 248..250,
1158 delete: [248; 250), 1166 delete: 248..250,
1159 insert: "Foo", 1167 insert: "Foo",
1160 kind: Enum, 1168 kind: Enum,
1161 }, 1169 },
1162 CompletionItem { 1170 CompletionItem {
1163 label: "Foo::Bar", 1171 label: "Foo::Bar",
1164 source_range: [248; 250), 1172 source_range: 248..250,
1165 delete: [248; 250), 1173 delete: 248..250,
1166 insert: "Foo::Bar", 1174 insert: "Foo::Bar",
1167 kind: EnumVariant, 1175 kind: EnumVariant,
1168 detail: "()", 1176 detail: "()",
1169 }, 1177 },
1170 CompletionItem { 1178 CompletionItem {
1171 label: "Foo::Baz", 1179 label: "Foo::Baz",
1172 source_range: [248; 250), 1180 source_range: 248..250,
1173 delete: [248; 250), 1181 delete: 248..250,
1174 insert: "Foo::Baz", 1182 insert: "Foo::Baz",
1175 kind: EnumVariant, 1183 kind: EnumVariant,
1176 detail: "()", 1184 detail: "()",
1177 }, 1185 },
1178 CompletionItem { 1186 CompletionItem {
1179 label: "Foo::Quux", 1187 label: "Foo::Quux",
1180 source_range: [248; 250), 1188 source_range: 248..250,
1181 delete: [248; 250), 1189 delete: 248..250,
1182 insert: "Foo::Quux", 1190 insert: "Foo::Quux",
1183 kind: EnumVariant, 1191 kind: EnumVariant,
1184 detail: "()", 1192 detail: "()",
@@ -1212,31 +1220,31 @@ mod tests {
1212 [ 1220 [
1213 CompletionItem { 1221 CompletionItem {
1214 label: "Foo", 1222 label: "Foo",
1215 source_range: [219; 221), 1223 source_range: 219..221,
1216 delete: [219; 221), 1224 delete: 219..221,
1217 insert: "Foo", 1225 insert: "Foo",
1218 kind: Enum, 1226 kind: Enum,
1219 }, 1227 },
1220 CompletionItem { 1228 CompletionItem {
1221 label: "Foo::Bar", 1229 label: "Foo::Bar",
1222 source_range: [219; 221), 1230 source_range: 219..221,
1223 delete: [219; 221), 1231 delete: 219..221,
1224 insert: "Foo::Bar", 1232 insert: "Foo::Bar",
1225 kind: EnumVariant, 1233 kind: EnumVariant,
1226 detail: "()", 1234 detail: "()",
1227 }, 1235 },
1228 CompletionItem { 1236 CompletionItem {
1229 label: "Foo::Baz", 1237 label: "Foo::Baz",
1230 source_range: [219; 221), 1238 source_range: 219..221,
1231 delete: [219; 221), 1239 delete: 219..221,
1232 insert: "Foo::Baz", 1240 insert: "Foo::Baz",
1233 kind: EnumVariant, 1241 kind: EnumVariant,
1234 detail: "()", 1242 detail: "()",
1235 }, 1243 },
1236 CompletionItem { 1244 CompletionItem {
1237 label: "Foo::Quux", 1245 label: "Foo::Quux",
1238 source_range: [219; 221), 1246 source_range: 219..221,
1239 delete: [219; 221), 1247 delete: 219..221,
1240 insert: "Foo::Quux", 1248 insert: "Foo::Quux",
1241 kind: EnumVariant, 1249 kind: EnumVariant,
1242 detail: "()", 1250 detail: "()",
@@ -1266,39 +1274,39 @@ mod tests {
1266 [ 1274 [
1267 CompletionItem { 1275 CompletionItem {
1268 label: "Foo", 1276 label: "Foo",
1269 source_range: [185; 186), 1277 source_range: 185..186,
1270 delete: [185; 186), 1278 delete: 185..186,
1271 insert: "Foo", 1279 insert: "Foo",
1272 kind: Enum, 1280 kind: Enum,
1273 }, 1281 },
1274 CompletionItem { 1282 CompletionItem {
1275 label: "Foo::Bar", 1283 label: "Foo::Bar",
1276 source_range: [185; 186), 1284 source_range: 185..186,
1277 delete: [185; 186), 1285 delete: 185..186,
1278 insert: "Foo::Bar", 1286 insert: "Foo::Bar",
1279 kind: EnumVariant, 1287 kind: EnumVariant,
1280 detail: "()", 1288 detail: "()",
1281 }, 1289 },
1282 CompletionItem { 1290 CompletionItem {
1283 label: "Foo::Baz", 1291 label: "Foo::Baz",
1284 source_range: [185; 186), 1292 source_range: 185..186,
1285 delete: [185; 186), 1293 delete: 185..186,
1286 insert: "Foo::Baz", 1294 insert: "Foo::Baz",
1287 kind: EnumVariant, 1295 kind: EnumVariant,
1288 detail: "()", 1296 detail: "()",
1289 }, 1297 },
1290 CompletionItem { 1298 CompletionItem {
1291 label: "Foo::Quux", 1299 label: "Foo::Quux",
1292 source_range: [185; 186), 1300 source_range: 185..186,
1293 delete: [185; 186), 1301 delete: 185..186,
1294 insert: "Foo::Quux", 1302 insert: "Foo::Quux",
1295 kind: EnumVariant, 1303 kind: EnumVariant,
1296 detail: "()", 1304 detail: "()",
1297 }, 1305 },
1298 CompletionItem { 1306 CompletionItem {
1299 label: "main()", 1307 label: "main()",
1300 source_range: [185; 186), 1308 source_range: 185..186,
1301 delete: [185; 186), 1309 delete: 185..186,
1302 insert: "main()$0", 1310 insert: "main()$0",
1303 kind: Function, 1311 kind: Function,
1304 lookup: "main", 1312 lookup: "main",
@@ -1308,4 +1316,47 @@ mod tests {
1308 "### 1316 "###
1309 ) 1317 )
1310 } 1318 }
1319
1320 #[test]
1321 fn completes_enum_variant_from_module() {
1322 assert_debug_snapshot!(
1323 do_reference_completion(
1324 r"
1325 mod m { pub enum E { V } }
1326
1327 fn f() -> m::E {
1328 V<|>
1329 }
1330 "
1331 ),
1332 @r###"
1333 [
1334 CompletionItem {
1335 label: "f()",
1336 source_range: 98..99,
1337 delete: 98..99,
1338 insert: "f()$0",
1339 kind: Function,
1340 lookup: "f",
1341 detail: "fn f() -> m::E",
1342 },
1343 CompletionItem {
1344 label: "m",
1345 source_range: 98..99,
1346 delete: 98..99,
1347 insert: "m",
1348 kind: Module,
1349 },
1350 CompletionItem {
1351 label: "m::E::V",
1352 source_range: 98..99,
1353 delete: 98..99,
1354 insert: "m::E::V",
1355 kind: EnumVariant,
1356 detail: "()",
1357 },
1358 ]
1359 "###
1360 )
1361 }
1311} 1362}
diff --git a/crates/ra_ide/src/completion/completion_context.rs b/crates/ra_ide/src/completion/completion_context.rs
index a76d1ce45..5f2797e41 100644
--- a/crates/ra_ide/src/completion/completion_context.rs
+++ b/crates/ra_ide/src/completion/completion_context.rs
@@ -7,7 +7,7 @@ use ra_syntax::{
7 algo::{find_covering_element, find_node_at_offset}, 7 algo::{find_covering_element, find_node_at_offset},
8 ast, AstNode, 8 ast, AstNode,
9 SyntaxKind::*, 9 SyntaxKind::*,
10 SyntaxNode, SyntaxToken, TextRange, TextUnit, 10 SyntaxNode, SyntaxToken, TextRange, TextSize,
11}; 11};
12use ra_text_edit::AtomTextEdit; 12use ra_text_edit::AtomTextEdit;
13 13
@@ -20,7 +20,7 @@ pub(crate) struct CompletionContext<'a> {
20 pub(super) sema: Semantics<'a, RootDatabase>, 20 pub(super) sema: Semantics<'a, RootDatabase>,
21 pub(super) db: &'a RootDatabase, 21 pub(super) db: &'a RootDatabase,
22 pub(super) config: &'a CompletionConfig, 22 pub(super) config: &'a CompletionConfig,
23 pub(super) offset: TextUnit, 23 pub(super) offset: TextSize,
24 /// The token before the cursor, in the original file. 24 /// The token before the cursor, in the original file.
25 pub(super) original_token: SyntaxToken, 25 pub(super) original_token: SyntaxToken,
26 /// The token before the cursor, in the macro-expanded file. 26 /// The token before the cursor, in the macro-expanded file.
@@ -57,6 +57,7 @@ pub(crate) struct CompletionContext<'a> {
57 pub(super) is_macro_call: bool, 57 pub(super) is_macro_call: bool,
58 pub(super) is_path_type: bool, 58 pub(super) is_path_type: bool,
59 pub(super) has_type_args: bool, 59 pub(super) has_type_args: bool,
60 pub(super) is_attribute: bool,
60} 61}
61 62
62impl<'a> CompletionContext<'a> { 63impl<'a> CompletionContext<'a> {
@@ -113,6 +114,7 @@ impl<'a> CompletionContext<'a> {
113 is_path_type: false, 114 is_path_type: false,
114 has_type_args: false, 115 has_type_args: false,
115 dot_receiver_is_ambiguous_float_literal: false, 116 dot_receiver_is_ambiguous_float_literal: false,
117 is_attribute: false,
116 }; 118 };
117 119
118 let mut original_file = original_file.syntax().clone(); 120 let mut original_file = original_file.syntax().clone();
@@ -165,7 +167,7 @@ impl<'a> CompletionContext<'a> {
165 match self.token.kind() { 167 match self.token.kind() {
166 // workaroud when completion is triggered by trigger characters. 168 // workaroud when completion is triggered by trigger characters.
167 IDENT => self.original_token.text_range(), 169 IDENT => self.original_token.text_range(),
168 _ => TextRange::offset_len(self.offset, 0.into()), 170 _ => TextRange::empty(self.offset),
169 } 171 }
170 } 172 }
171 173
@@ -188,7 +190,7 @@ impl<'a> CompletionContext<'a> {
188 &mut self, 190 &mut self,
189 original_file: &SyntaxNode, 191 original_file: &SyntaxNode,
190 file_with_fake_ident: SyntaxNode, 192 file_with_fake_ident: SyntaxNode,
191 offset: TextUnit, 193 offset: TextSize,
192 ) { 194 ) {
193 // First, let's try to complete a reference to some declaration. 195 // First, let's try to complete a reference to some declaration.
194 if let Some(name_ref) = find_node_at_offset::<ast::NameRef>(&file_with_fake_ident, offset) { 196 if let Some(name_ref) = find_node_at_offset::<ast::NameRef>(&file_with_fake_ident, offset) {
@@ -222,7 +224,8 @@ impl<'a> CompletionContext<'a> {
222 } 224 }
223 if let Some(let_stmt) = bind_pat.syntax().ancestors().find_map(ast::LetStmt::cast) { 225 if let Some(let_stmt) = bind_pat.syntax().ancestors().find_map(ast::LetStmt::cast) {
224 if let Some(pat) = let_stmt.pat() { 226 if let Some(pat) = let_stmt.pat() {
225 if bind_pat.syntax().text_range().is_subrange(&pat.syntax().text_range()) { 227 if pat.syntax().text_range().contains_range(bind_pat.syntax().text_range())
228 {
226 self.is_pat_binding_or_const = false; 229 self.is_pat_binding_or_const = false;
227 } 230 }
228 } 231 }
@@ -244,7 +247,7 @@ impl<'a> CompletionContext<'a> {
244 &mut self, 247 &mut self,
245 original_file: &SyntaxNode, 248 original_file: &SyntaxNode,
246 name_ref: ast::NameRef, 249 name_ref: ast::NameRef,
247 offset: TextUnit, 250 offset: TextSize,
248 ) { 251 ) {
249 self.name_ref_syntax = 252 self.name_ref_syntax =
250 find_node_at_offset(&original_file, name_ref.syntax().text_range().start()); 253 find_node_at_offset(&original_file, name_ref.syntax().text_range().start());
@@ -306,6 +309,7 @@ impl<'a> CompletionContext<'a> {
306 .and_then(|it| it.syntax().parent().and_then(ast::CallExpr::cast)) 309 .and_then(|it| it.syntax().parent().and_then(ast::CallExpr::cast))
307 .is_some(); 310 .is_some();
308 self.is_macro_call = path.syntax().parent().and_then(ast::MacroCall::cast).is_some(); 311 self.is_macro_call = path.syntax().parent().and_then(ast::MacroCall::cast).is_some();
312 self.is_attribute = path.syntax().parent().and_then(ast::Attr::cast).is_some();
309 313
310 self.is_path_type = path.syntax().parent().and_then(ast::PathType::cast).is_some(); 314 self.is_path_type = path.syntax().parent().and_then(ast::PathType::cast).is_some();
311 self.has_type_args = segment.type_arg_list().is_some(); 315 self.has_type_args = segment.type_arg_list().is_some();
diff --git a/crates/ra_ide/src/completion/completion_item.rs b/crates/ra_ide/src/completion/completion_item.rs
index fb06cc125..5936fb8f7 100644
--- a/crates/ra_ide/src/completion/completion_item.rs
+++ b/crates/ra_ide/src/completion/completion_item.rs
@@ -121,6 +121,7 @@ pub enum CompletionItemKind {
121 Method, 121 Method,
122 TypeParam, 122 TypeParam,
123 Macro, 123 Macro,
124 Attribute,
124} 125}
125 126
126#[derive(Debug, PartialEq, Eq, Copy, Clone)] 127#[derive(Debug, PartialEq, Eq, Copy, Clone)]
@@ -134,6 +135,7 @@ pub(crate) enum CompletionKind {
134 Snippet, 135 Snippet,
135 Postfix, 136 Postfix,
136 BuiltinType, 137 BuiltinType,
138 Attribute,
137} 139}
138 140
139#[derive(Debug, PartialEq, Eq, Copy, Clone)] 141#[derive(Debug, PartialEq, Eq, Copy, Clone)]
diff --git a/crates/ra_ide/src/completion/presentation.rs b/crates/ra_ide/src/completion/presentation.rs
index 6a6ddc7bd..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);
@@ -452,8 +447,8 @@ mod tests {
452 [ 447 [
453 CompletionItem { 448 CompletionItem {
454 label: "Foo", 449 label: "Foo",
455 source_range: [121; 123), 450 source_range: 121..123,
456 delete: [121; 123), 451 delete: 121..123,
457 insert: "Foo", 452 insert: "Foo",
458 kind: EnumVariant, 453 kind: EnumVariant,
459 detail: "{ x: i32, y: i32 }", 454 detail: "{ x: i32, y: i32 }",
@@ -478,8 +473,8 @@ mod tests {
478 [ 473 [
479 CompletionItem { 474 CompletionItem {
480 label: "Foo(…)", 475 label: "Foo(…)",
481 source_range: [115; 117), 476 source_range: 115..117,
482 delete: [115; 117), 477 delete: 115..117,
483 insert: "Foo($0)", 478 insert: "Foo($0)",
484 kind: EnumVariant, 479 kind: EnumVariant,
485 lookup: "Foo", 480 lookup: "Foo",
@@ -506,8 +501,8 @@ mod tests {
506 [ 501 [
507 CompletionItem { 502 CompletionItem {
508 label: "Foo", 503 label: "Foo",
509 source_range: [104; 106), 504 source_range: 104..106,
510 delete: [104; 106), 505 delete: 104..106,
511 insert: "Foo", 506 insert: "Foo",
512 kind: EnumVariant, 507 kind: EnumVariant,
513 detail: "()", 508 detail: "()",
@@ -534,8 +529,8 @@ mod tests {
534 [ 529 [
535 CompletionItem { 530 CompletionItem {
536 label: "main()", 531 label: "main()",
537 source_range: [203; 206), 532 source_range: 203..206,
538 delete: [203; 206), 533 delete: 203..206,
539 insert: "main()$0", 534 insert: "main()$0",
540 kind: Function, 535 kind: Function,
541 lookup: "main", 536 lookup: "main",
@@ -543,8 +538,8 @@ mod tests {
543 }, 538 },
544 CompletionItem { 539 CompletionItem {
545 label: "something_deprecated()", 540 label: "something_deprecated()",
546 source_range: [203; 206), 541 source_range: 203..206,
547 delete: [203; 206), 542 delete: 203..206,
548 insert: "something_deprecated()$0", 543 insert: "something_deprecated()$0",
549 kind: Function, 544 kind: Function,
550 lookup: "something_deprecated", 545 lookup: "something_deprecated",
@@ -553,8 +548,8 @@ mod tests {
553 }, 548 },
554 CompletionItem { 549 CompletionItem {
555 label: "something_else_deprecated()", 550 label: "something_else_deprecated()",
556 source_range: [203; 206), 551 source_range: 203..206,
557 delete: [203; 206), 552 delete: 203..206,
558 insert: "something_else_deprecated()$0", 553 insert: "something_else_deprecated()$0",
559 kind: Function, 554 kind: Function,
560 lookup: "something_else_deprecated", 555 lookup: "something_else_deprecated",
@@ -580,8 +575,8 @@ mod tests {
580 [ 575 [
581 CompletionItem { 576 CompletionItem {
582 label: "main()", 577 label: "main()",
583 source_range: [61; 64), 578 source_range: 61..64,
584 delete: [61; 64), 579 delete: 61..64,
585 insert: "main()$0", 580 insert: "main()$0",
586 kind: Function, 581 kind: Function,
587 lookup: "main", 582 lookup: "main",
@@ -589,8 +584,8 @@ mod tests {
589 }, 584 },
590 CompletionItem { 585 CompletionItem {
591 label: "no_args()", 586 label: "no_args()",
592 source_range: [61; 64), 587 source_range: 61..64,
593 delete: [61; 64), 588 delete: 61..64,
594 insert: "no_args()$0", 589 insert: "no_args()$0",
595 kind: Function, 590 kind: Function,
596 lookup: "no_args", 591 lookup: "no_args",
@@ -610,8 +605,8 @@ mod tests {
610 [ 605 [
611 CompletionItem { 606 CompletionItem {
612 label: "main()", 607 label: "main()",
613 source_range: [80; 85), 608 source_range: 80..85,
614 delete: [80; 85), 609 delete: 80..85,
615 insert: "main()$0", 610 insert: "main()$0",
616 kind: Function, 611 kind: Function,
617 lookup: "main", 612 lookup: "main",
@@ -619,8 +614,8 @@ mod tests {
619 }, 614 },
620 CompletionItem { 615 CompletionItem {
621 label: "with_args(…)", 616 label: "with_args(…)",
622 source_range: [80; 85), 617 source_range: 80..85,
623 delete: [80; 85), 618 delete: 80..85,
624 insert: "with_args(${1:x}, ${2:y})$0", 619 insert: "with_args(${1:x}, ${2:y})$0",
625 kind: Function, 620 kind: Function,
626 lookup: "with_args", 621 lookup: "with_args",
@@ -646,8 +641,8 @@ mod tests {
646 [ 641 [
647 CompletionItem { 642 CompletionItem {
648 label: "foo()", 643 label: "foo()",
649 source_range: [163; 164), 644 source_range: 163..164,
650 delete: [163; 164), 645 delete: 163..164,
651 insert: "foo()$0", 646 insert: "foo()$0",
652 kind: Method, 647 kind: Method,
653 lookup: "foo", 648 lookup: "foo",
@@ -674,23 +669,23 @@ mod tests {
674 [ 669 [
675 CompletionItem { 670 CompletionItem {
676 label: "None", 671 label: "None",
677 source_range: [144; 147), 672 source_range: 144..147,
678 delete: [144; 147), 673 delete: 144..147,
679 insert: "None", 674 insert: "None",
680 kind: EnumVariant, 675 kind: EnumVariant,
681 detail: "()", 676 detail: "()",
682 }, 677 },
683 CompletionItem { 678 CompletionItem {
684 label: "Option", 679 label: "Option",
685 source_range: [144; 147), 680 source_range: 144..147,
686 delete: [144; 147), 681 delete: 144..147,
687 insert: "Option", 682 insert: "Option",
688 kind: Enum, 683 kind: Enum,
689 }, 684 },
690 CompletionItem { 685 CompletionItem {
691 label: "Some(…)", 686 label: "Some(…)",
692 source_range: [144; 147), 687 source_range: 144..147,
693 delete: [144; 147), 688 delete: 144..147,
694 insert: "Some($0)", 689 insert: "Some($0)",
695 kind: EnumVariant, 690 kind: EnumVariant,
696 lookup: "Some", 691 lookup: "Some",
@@ -699,8 +694,8 @@ mod tests {
699 }, 694 },
700 CompletionItem { 695 CompletionItem {
701 label: "main()", 696 label: "main()",
702 source_range: [144; 147), 697 source_range: 144..147,
703 delete: [144; 147), 698 delete: 144..147,
704 insert: "main()$0", 699 insert: "main()$0",
705 kind: Function, 700 kind: Function,
706 lookup: "main", 701 lookup: "main",
@@ -725,23 +720,23 @@ mod tests {
725 [ 720 [
726 CompletionItem { 721 CompletionItem {
727 label: "None", 722 label: "None",
728 source_range: [185; 188), 723 source_range: 185..188,
729 delete: [185; 188), 724 delete: 185..188,
730 insert: "None", 725 insert: "None",
731 kind: EnumVariant, 726 kind: EnumVariant,
732 detail: "()", 727 detail: "()",
733 }, 728 },
734 CompletionItem { 729 CompletionItem {
735 label: "Option", 730 label: "Option",
736 source_range: [185; 188), 731 source_range: 185..188,
737 delete: [185; 188), 732 delete: 185..188,
738 insert: "Option", 733 insert: "Option",
739 kind: Enum, 734 kind: Enum,
740 }, 735 },
741 CompletionItem { 736 CompletionItem {
742 label: "Some(…)", 737 label: "Some(…)",
743 source_range: [185; 188), 738 source_range: 185..188,
744 delete: [185; 188), 739 delete: 185..188,
745 insert: "Some($0)", 740 insert: "Some($0)",
746 kind: EnumVariant, 741 kind: EnumVariant,
747 lookup: "Some", 742 lookup: "Some",
@@ -771,8 +766,8 @@ mod tests {
771 [ 766 [
772 CompletionItem { 767 CompletionItem {
773 label: "foo(…)", 768 label: "foo(…)",
774 source_range: [171; 172), 769 source_range: 171..172,
775 delete: [171; 172), 770 delete: 171..172,
776 insert: "foo(${1:x})$0", 771 insert: "foo(${1:x})$0",
777 kind: Method, 772 kind: Method,
778 lookup: "foo", 773 lookup: "foo",
@@ -806,8 +801,8 @@ mod tests {
806 [ 801 [
807 CompletionItem { 802 CompletionItem {
808 label: "foo(…)", 803 label: "foo(…)",
809 source_range: [171; 172), 804 source_range: 171..172,
810 delete: [171; 172), 805 delete: 171..172,
811 insert: "foo($0)", 806 insert: "foo($0)",
812 kind: Method, 807 kind: Method,
813 lookup: "foo", 808 lookup: "foo",
@@ -833,8 +828,8 @@ mod tests {
833 [ 828 [
834 CompletionItem { 829 CompletionItem {
835 label: "foo", 830 label: "foo",
836 source_range: [40; 41), 831 source_range: 40..41,
837 delete: [40; 41), 832 delete: 40..41,
838 insert: "foo", 833 insert: "foo",
839 kind: Function, 834 kind: Function,
840 detail: "pub fn foo()", 835 detail: "pub fn foo()",
@@ -860,16 +855,16 @@ mod tests {
860 [ 855 [
861 CompletionItem { 856 CompletionItem {
862 label: "frobnicate", 857 label: "frobnicate",
863 source_range: [35; 39), 858 source_range: 35..39,
864 delete: [35; 39), 859 delete: 35..39,
865 insert: "frobnicate", 860 insert: "frobnicate",
866 kind: Function, 861 kind: Function,
867 detail: "fn frobnicate()", 862 detail: "fn frobnicate()",
868 }, 863 },
869 CompletionItem { 864 CompletionItem {
870 label: "main", 865 label: "main",
871 source_range: [35; 39), 866 source_range: 35..39,
872 delete: [35; 39), 867 delete: 35..39,
873 insert: "main", 868 insert: "main",
874 kind: Function, 869 kind: Function,
875 detail: "fn main()", 870 detail: "fn main()",
@@ -892,8 +887,8 @@ mod tests {
892 [ 887 [
893 CompletionItem { 888 CompletionItem {
894 label: "new", 889 label: "new",
895 source_range: [67; 69), 890 source_range: 67..69,
896 delete: [67; 69), 891 delete: 67..69,
897 insert: "new", 892 insert: "new",
898 kind: Function, 893 kind: Function,
899 detail: "fn new() -> Foo", 894 detail: "fn new() -> Foo",
@@ -917,16 +912,16 @@ mod tests {
917 [ 912 [
918 CompletionItem { 913 CompletionItem {
919 label: "Vec<…>", 914 label: "Vec<…>",
920 source_range: [61; 63), 915 source_range: 61..63,
921 delete: [61; 63), 916 delete: 61..63,
922 insert: "Vec<$0>", 917 insert: "Vec<$0>",
923 kind: Struct, 918 kind: Struct,
924 lookup: "Vec", 919 lookup: "Vec",
925 }, 920 },
926 CompletionItem { 921 CompletionItem {
927 label: "foo(…)", 922 label: "foo(…)",
928 source_range: [61; 63), 923 source_range: 61..63,
929 delete: [61; 63), 924 delete: 61..63,
930 insert: "foo(${1:xs})$0", 925 insert: "foo(${1:xs})$0",
931 kind: Function, 926 kind: Function,
932 lookup: "foo", 927 lookup: "foo",
@@ -947,16 +942,16 @@ mod tests {
947 [ 942 [
948 CompletionItem { 943 CompletionItem {
949 label: "Vec<…>", 944 label: "Vec<…>",
950 source_range: [64; 66), 945 source_range: 64..66,
951 delete: [64; 66), 946 delete: 64..66,
952 insert: "Vec<$0>", 947 insert: "Vec<$0>",
953 kind: TypeAlias, 948 kind: TypeAlias,
954 lookup: "Vec", 949 lookup: "Vec",
955 }, 950 },
956 CompletionItem { 951 CompletionItem {
957 label: "foo(…)", 952 label: "foo(…)",
958 source_range: [64; 66), 953 source_range: 64..66,
959 delete: [64; 66), 954 delete: 64..66,
960 insert: "foo(${1:xs})$0", 955 insert: "foo(${1:xs})$0",
961 kind: Function, 956 kind: Function,
962 lookup: "foo", 957 lookup: "foo",
@@ -977,15 +972,15 @@ mod tests {
977 [ 972 [
978 CompletionItem { 973 CompletionItem {
979 label: "Vec", 974 label: "Vec",
980 source_range: [68; 70), 975 source_range: 68..70,
981 delete: [68; 70), 976 delete: 68..70,
982 insert: "Vec", 977 insert: "Vec",
983 kind: Struct, 978 kind: Struct,
984 }, 979 },
985 CompletionItem { 980 CompletionItem {
986 label: "foo(…)", 981 label: "foo(…)",
987 source_range: [68; 70), 982 source_range: 68..70,
988 delete: [68; 70), 983 delete: 68..70,
989 insert: "foo(${1:xs})$0", 984 insert: "foo(${1:xs})$0",
990 kind: Function, 985 kind: Function,
991 lookup: "foo", 986 lookup: "foo",
@@ -1006,15 +1001,15 @@ mod tests {
1006 [ 1001 [
1007 CompletionItem { 1002 CompletionItem {
1008 label: "Vec", 1003 label: "Vec",
1009 source_range: [61; 63), 1004 source_range: 61..63,
1010 delete: [61; 63), 1005 delete: 61..63,
1011 insert: "Vec", 1006 insert: "Vec",
1012 kind: Struct, 1007 kind: Struct,
1013 }, 1008 },
1014 CompletionItem { 1009 CompletionItem {
1015 label: "foo(…)", 1010 label: "foo(…)",
1016 source_range: [61; 63), 1011 source_range: 61..63,
1017 delete: [61; 63), 1012 delete: 61..63,
1018 insert: "foo(${1:xs})$0", 1013 insert: "foo(${1:xs})$0",
1019 kind: Function, 1014 kind: Function,
1020 lookup: "foo", 1015 lookup: "foo",
@@ -1046,8 +1041,8 @@ mod tests {
1046 [ 1041 [
1047 CompletionItem { 1042 CompletionItem {
1048 label: "frobnicate!", 1043 label: "frobnicate!",
1049 source_range: [9; 9), 1044 source_range: 9..9,
1050 delete: [9; 9), 1045 delete: 9..9,
1051 insert: "frobnicate", 1046 insert: "frobnicate",
1052 kind: Macro, 1047 kind: Macro,
1053 detail: "#[macro_export]\nmacro_rules! frobnicate", 1048 detail: "#[macro_export]\nmacro_rules! frobnicate",
@@ -1072,16 +1067,16 @@ mod tests {
1072 [ 1067 [
1073 CompletionItem { 1068 CompletionItem {
1074 label: "frobnicate!", 1069 label: "frobnicate!",
1075 source_range: [56; 60), 1070 source_range: 56..60,
1076 delete: [56; 60), 1071 delete: 56..60,
1077 insert: "frobnicate", 1072 insert: "frobnicate",
1078 kind: Macro, 1073 kind: Macro,
1079 detail: "macro_rules! frobnicate", 1074 detail: "macro_rules! frobnicate",
1080 }, 1075 },
1081 CompletionItem { 1076 CompletionItem {
1082 label: "main()", 1077 label: "main()",
1083 source_range: [56; 60), 1078 source_range: 56..60,
1084 delete: [56; 60), 1079 delete: 56..60,
1085 insert: "main()$0", 1080 insert: "main()$0",
1086 kind: Function, 1081 kind: Function,
1087 lookup: "main", 1082 lookup: "main",
@@ -1109,24 +1104,24 @@ mod tests {
1109 [ 1104 [
1110 CompletionItem { 1105 CompletionItem {
1111 label: "another_field", 1106 label: "another_field",
1112 source_range: [201; 201), 1107 source_range: 201..201,
1113 delete: [201; 201), 1108 delete: 201..201,
1114 insert: "another_field", 1109 insert: "another_field",
1115 kind: Field, 1110 kind: Field,
1116 detail: "i64", 1111 detail: "i64",
1117 }, 1112 },
1118 CompletionItem { 1113 CompletionItem {
1119 label: "my_string", 1114 label: "my_string",
1120 source_range: [201; 201), 1115 source_range: 201..201,
1121 delete: [201; 201), 1116 delete: 201..201,
1122 insert: "my_string", 1117 insert: "my_string",
1123 kind: Field, 1118 kind: Field,
1124 detail: "{unknown}", 1119 detail: "{unknown}",
1125 }, 1120 },
1126 CompletionItem { 1121 CompletionItem {
1127 label: "the_field", 1122 label: "the_field",
1128 source_range: [201; 201), 1123 source_range: 201..201,
1129 delete: [201; 201), 1124 delete: 201..201,
1130 insert: "the_field", 1125 insert: "the_field",
1131 kind: Field, 1126 kind: Field,
1132 detail: "u32", 1127 detail: "u32",
@@ -1153,16 +1148,16 @@ mod tests {
1153 [ 1148 [
1154 CompletionItem { 1149 CompletionItem {
1155 label: "another_field", 1150 label: "another_field",
1156 source_range: [208; 208), 1151 source_range: 208..208,
1157 delete: [208; 208), 1152 delete: 208..208,
1158 insert: "another_field", 1153 insert: "another_field",
1159 kind: Field, 1154 kind: Field,
1160 detail: "i64", 1155 detail: "i64",
1161 }, 1156 },
1162 CompletionItem { 1157 CompletionItem {
1163 label: "another_good_type", 1158 label: "another_good_type",
1164 source_range: [208; 208), 1159 source_range: 208..208,
1165 delete: [208; 208), 1160 delete: 208..208,
1166 insert: "another_good_type", 1161 insert: "another_good_type",
1167 kind: Field, 1162 kind: Field,
1168 detail: "u32", 1163 detail: "u32",
@@ -1170,8 +1165,8 @@ mod tests {
1170 }, 1165 },
1171 CompletionItem { 1166 CompletionItem {
1172 label: "the_field", 1167 label: "the_field",
1173 source_range: [208; 208), 1168 source_range: 208..208,
1174 delete: [208; 208), 1169 delete: 208..208,
1175 insert: "the_field", 1170 insert: "the_field",
1176 kind: Field, 1171 kind: Field,
1177 detail: "u32", 1172 detail: "u32",
@@ -1201,16 +1196,16 @@ mod tests {
1201 [ 1196 [
1202 CompletionItem { 1197 CompletionItem {
1203 label: "another_field", 1198 label: "another_field",
1204 source_range: [270; 270), 1199 source_range: 270..270,
1205 delete: [270; 270), 1200 delete: 270..270,
1206 insert: "another_field", 1201 insert: "another_field",
1207 kind: Field, 1202 kind: Field,
1208 detail: "i64", 1203 detail: "i64",
1209 }, 1204 },
1210 CompletionItem { 1205 CompletionItem {
1211 label: "another_good_type", 1206 label: "another_good_type",
1212 source_range: [270; 270), 1207 source_range: 270..270,
1213 delete: [270; 270), 1208 delete: 270..270,
1214 insert: "another_good_type", 1209 insert: "another_good_type",
1215 kind: Field, 1210 kind: Field,
1216 detail: "u32", 1211 detail: "u32",
@@ -1218,8 +1213,8 @@ mod tests {
1218 }, 1213 },
1219 CompletionItem { 1214 CompletionItem {
1220 label: "the_field", 1215 label: "the_field",
1221 source_range: [270; 270), 1216 source_range: 270..270,
1222 delete: [270; 270), 1217 delete: 270..270,
1223 insert: "the_field", 1218 insert: "the_field",
1224 kind: Field, 1219 kind: Field,
1225 detail: "u32", 1220 detail: "u32",
@@ -1249,8 +1244,8 @@ mod tests {
1249 [ 1244 [
1250 CompletionItem { 1245 CompletionItem {
1251 label: "another_field", 1246 label: "another_field",
1252 source_range: [336; 336), 1247 source_range: 336..336,
1253 delete: [336; 336), 1248 delete: 336..336,
1254 insert: "another_field", 1249 insert: "another_field",
1255 kind: Field, 1250 kind: Field,
1256 detail: "i64", 1251 detail: "i64",
@@ -1258,16 +1253,16 @@ mod tests {
1258 }, 1253 },
1259 CompletionItem { 1254 CompletionItem {
1260 label: "another_good_type", 1255 label: "another_good_type",
1261 source_range: [336; 336), 1256 source_range: 336..336,
1262 delete: [336; 336), 1257 delete: 336..336,
1263 insert: "another_good_type", 1258 insert: "another_good_type",
1264 kind: Field, 1259 kind: Field,
1265 detail: "u32", 1260 detail: "u32",
1266 }, 1261 },
1267 CompletionItem { 1262 CompletionItem {
1268 label: "the_field", 1263 label: "the_field",
1269 source_range: [336; 336), 1264 source_range: 336..336,
1270 delete: [336; 336), 1265 delete: 336..336,
1271 insert: "the_field", 1266 insert: "the_field",
1272 kind: Field, 1267 kind: Field,
1273 detail: "u32", 1268 detail: "u32",
@@ -1296,16 +1291,16 @@ mod tests {
1296 [ 1291 [
1297 CompletionItem { 1292 CompletionItem {
1298 label: "another_field", 1293 label: "another_field",
1299 source_range: [328; 328), 1294 source_range: 328..328,
1300 delete: [328; 328), 1295 delete: 328..328,
1301 insert: "another_field", 1296 insert: "another_field",
1302 kind: Field, 1297 kind: Field,
1303 detail: "i64", 1298 detail: "i64",
1304 }, 1299 },
1305 CompletionItem { 1300 CompletionItem {
1306 label: "another_good_type", 1301 label: "another_good_type",
1307 source_range: [328; 328), 1302 source_range: 328..328,
1308 delete: [328; 328), 1303 delete: 328..328,
1309 insert: "another_good_type", 1304 insert: "another_good_type",
1310 kind: Field, 1305 kind: Field,
1311 detail: "u32", 1306 detail: "u32",
@@ -1313,8 +1308,8 @@ mod tests {
1313 }, 1308 },
1314 CompletionItem { 1309 CompletionItem {
1315 label: "the_field", 1310 label: "the_field",
1316 source_range: [328; 328), 1311 source_range: 328..328,
1317 delete: [328; 328), 1312 delete: 328..328,
1318 insert: "the_field", 1313 insert: "the_field",
1319 kind: Field, 1314 kind: Field,
1320 detail: "u32", 1315 detail: "u32",