aboutsummaryrefslogtreecommitdiff
path: root/crates/ide_completion
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ide_completion')
-rw-r--r--crates/ide_completion/src/completions/dot.rs24
-rw-r--r--crates/ide_completion/src/completions/flyimport.rs8
-rw-r--r--crates/ide_completion/src/completions/qualified_path.rs56
-rw-r--r--crates/ide_completion/src/completions/unqualified_path.rs50
-rw-r--r--crates/ide_completion/src/lib.rs6
-rw-r--r--crates/ide_completion/src/render.rs54
-rw-r--r--crates/ide_completion/src/render/function.rs39
7 files changed, 155 insertions, 82 deletions
diff --git a/crates/ide_completion/src/completions/dot.rs b/crates/ide_completion/src/completions/dot.rs
index 5ee9a9f07..cec2d0c3a 100644
--- a/crates/ide_completion/src/completions/dot.rs
+++ b/crates/ide_completion/src/completions/dot.rs
@@ -81,7 +81,7 @@ fn foo(s: S) { s.$0 }
81"#, 81"#,
82 expect![[r#" 82 expect![[r#"
83 fd foo u32 83 fd foo u32
84 me bar() -> () 84 me bar() fn(&self)
85 "#]], 85 "#]],
86 ); 86 );
87 } 87 }
@@ -97,7 +97,7 @@ impl S {
97"#, 97"#,
98 expect![[r#" 98 expect![[r#"
99 fd the_field (u32,) 99 fd the_field (u32,)
100 me foo() -> () 100 me foo() fn(self)
101 "#]], 101 "#]],
102 ) 102 )
103 } 103 }
@@ -113,7 +113,7 @@ impl A {
113"#, 113"#,
114 expect![[r#" 114 expect![[r#"
115 fd the_field (u32, i32) 115 fd the_field (u32, i32)
116 me foo() -> () 116 me foo() fn(&self)
117 "#]], 117 "#]],
118 ) 118 )
119 } 119 }
@@ -163,7 +163,7 @@ mod m {
163fn foo(a: A) { a.$0 } 163fn foo(a: A) { a.$0 }
164"#, 164"#,
165 expect![[r#" 165 expect![[r#"
166 me the_method() -> () 166 me the_method() fn(&self)
167 "#]], 167 "#]],
168 ); 168 );
169 } 169 }
@@ -196,7 +196,7 @@ impl A<i32> {
196fn foo(a: A<u32>) { a.$0 } 196fn foo(a: A<u32>) { a.$0 }
197"#, 197"#,
198 expect![[r#" 198 expect![[r#"
199 me the_method() -> () 199 me the_method() fn(&self)
200 "#]], 200 "#]],
201 ) 201 )
202 } 202 }
@@ -211,7 +211,7 @@ impl Trait for A {}
211fn foo(a: A) { a.$0 } 211fn foo(a: A) { a.$0 }
212"#, 212"#,
213 expect![[r#" 213 expect![[r#"
214 me the_method() -> () 214 me the_method() fn(&self)
215 "#]], 215 "#]],
216 ); 216 );
217 } 217 }
@@ -226,7 +226,7 @@ impl<T> Trait for T {}
226fn foo(a: &A) { a.$0 } 226fn foo(a: &A) { a.$0 }
227", 227",
228 expect![[r#" 228 expect![[r#"
229 me the_method() -> () 229 me the_method() fn(&self)
230 "#]], 230 "#]],
231 ); 231 );
232 } 232 }
@@ -244,7 +244,7 @@ impl Trait for A {}
244fn foo(a: A) { a.$0 } 244fn foo(a: A) { a.$0 }
245", 245",
246 expect![[r#" 246 expect![[r#"
247 me the_method() -> () 247 me the_method() fn(&self)
248 "#]], 248 "#]],
249 ); 249 );
250 } 250 }
@@ -298,7 +298,7 @@ impl T {
298} 298}
299"#, 299"#,
300 expect![[r#" 300 expect![[r#"
301 me blah() -> () 301 me blah() fn(&self)
302 "#]], 302 "#]],
303 ); 303 );
304 } 304 }
@@ -407,7 +407,7 @@ fn foo() {
407} 407}
408"#, 408"#,
409 expect![[r#" 409 expect![[r#"
410 me the_method() -> () 410 me the_method() fn(&self)
411 "#]], 411 "#]],
412 ); 412 );
413 } 413 }
@@ -422,7 +422,7 @@ macro_rules! make_s { () => { S }; }
422fn main() { make_s!().f$0; } 422fn main() { make_s!().f$0; }
423"#, 423"#,
424 expect![[r#" 424 expect![[r#"
425 me foo() -> () 425 me foo() fn(&self)
426 "#]], 426 "#]],
427 ) 427 )
428 } 428 }
@@ -450,7 +450,7 @@ mod foo {
450} 450}
451 "#, 451 "#,
452 expect![[r#" 452 expect![[r#"
453 me private() -> () 453 me private() fn(&self)
454 "#]], 454 "#]],
455 ); 455 );
456 } 456 }
diff --git a/crates/ide_completion/src/completions/flyimport.rs b/crates/ide_completion/src/completions/flyimport.rs
index 391a11c91..08df2df3f 100644
--- a/crates/ide_completion/src/completions/flyimport.rs
+++ b/crates/ide_completion/src/completions/flyimport.rs
@@ -402,7 +402,7 @@ fn main() {
402 check( 402 check(
403 fixture, 403 fixture,
404 expect![[r#" 404 expect![[r#"
405 fn weird_function() (dep::test_mod::TestTrait) -> () 405 fn weird_function() (dep::test_mod::TestTrait) fn()
406 "#]], 406 "#]],
407 ); 407 );
408 408
@@ -495,7 +495,7 @@ fn main() {
495 check( 495 check(
496 fixture, 496 fixture,
497 expect![[r#" 497 expect![[r#"
498 me random_method() (dep::test_mod::TestTrait) -> () 498 me random_method() (dep::test_mod::TestTrait) fn(&self)
499 "#]], 499 "#]],
500 ); 500 );
501 501
@@ -665,7 +665,7 @@ fn main() {
665} 665}
666 "#, 666 "#,
667 expect![[r#" 667 expect![[r#"
668 me random_method() (dep::test_mod::TestTrait) -> () DEPRECATED 668 me random_method() (dep::test_mod::TestTrait) fn(&self) DEPRECATED
669 "#]], 669 "#]],
670 ); 670 );
671 671
@@ -696,7 +696,7 @@ fn main() {
696"#, 696"#,
697 expect![[r#" 697 expect![[r#"
698 ct SPECIAL_CONST (dep::test_mod::TestTrait) DEPRECATED 698 ct SPECIAL_CONST (dep::test_mod::TestTrait) DEPRECATED
699 fn weird_function() (dep::test_mod::TestTrait) -> () DEPRECATED 699 fn weird_function() (dep::test_mod::TestTrait) fn() DEPRECATED
700 "#]], 700 "#]],
701 ); 701 );
702 } 702 }
diff --git a/crates/ide_completion/src/completions/qualified_path.rs b/crates/ide_completion/src/completions/qualified_path.rs
index df74b739e..105ff6013 100644
--- a/crates/ide_completion/src/completions/qualified_path.rs
+++ b/crates/ide_completion/src/completions/qualified_path.rs
@@ -359,8 +359,8 @@ impl S {
359fn foo() { let _ = S::$0 } 359fn foo() { let _ = S::$0 }
360"#, 360"#,
361 expect![[r#" 361 expect![[r#"
362 fn a() -> () 362 fn a() fn()
363 me b(…) -> () 363 me b(…) fn(&self)
364 ct C const C: i32 = 42; 364 ct C const C: i32 = 42;
365 ta T type T = i32; 365 ta T type T = i32;
366 "#]], 366 "#]],
@@ -387,7 +387,7 @@ mod m {
387fn foo() { let _ = S::$0 } 387fn foo() { let _ = S::$0 }
388"#, 388"#,
389 expect![[r#" 389 expect![[r#"
390 fn public_method() -> () 390 fn public_method() fn()
391 ct PUBLIC_CONST pub(crate) const PUBLIC_CONST: u32 = 1; 391 ct PUBLIC_CONST pub(crate) const PUBLIC_CONST: u32 = 1;
392 ta PublicType pub(crate) type PublicType = u32; 392 ta PublicType pub(crate) type PublicType = u32;
393 "#]], 393 "#]],
@@ -404,7 +404,7 @@ impl E { fn m() { } }
404fn foo() { let _ = E::$0 } 404fn foo() { let _ = E::$0 }
405 "#, 405 "#,
406 expect![[r#" 406 expect![[r#"
407 fn m() -> () 407 fn m() fn()
408 "#]], 408 "#]],
409 ); 409 );
410 } 410 }
@@ -419,7 +419,7 @@ impl U { fn m() { } }
419fn foo() { let _ = U::$0 } 419fn foo() { let _ = U::$0 }
420"#, 420"#,
421 expect![[r#" 421 expect![[r#"
422 fn m() -> () 422 fn m() fn()
423 "#]], 423 "#]],
424 ); 424 );
425 } 425 }
@@ -449,7 +449,7 @@ trait Trait { fn m(); }
449fn foo() { let _ = Trait::$0 } 449fn foo() { let _ = Trait::$0 }
450"#, 450"#,
451 expect![[r#" 451 expect![[r#"
452 fn m() -> () 452 fn m() fn()
453 "#]], 453 "#]],
454 ); 454 );
455 } 455 }
@@ -466,7 +466,7 @@ impl Trait for S {}
466fn foo() { let _ = S::$0 } 466fn foo() { let _ = S::$0 }
467"#, 467"#,
468 expect![[r#" 468 expect![[r#"
469 fn m() -> () 469 fn m() fn()
470 "#]], 470 "#]],
471 ); 471 );
472 } 472 }
@@ -483,7 +483,7 @@ impl Trait for S {}
483fn foo() { let _ = <S as Trait>::$0 } 483fn foo() { let _ = <S as Trait>::$0 }
484"#, 484"#,
485 expect![[r#" 485 expect![[r#"
486 fn m() -> () 486 fn m() fn()
487 "#]], 487 "#]],
488 ); 488 );
489 } 489 }
@@ -512,11 +512,11 @@ fn foo<T: Sub>() { T::$0 }
512 ta SubTy type SubTy; 512 ta SubTy type SubTy;
513 ta Ty type Ty; 513 ta Ty type Ty;
514 ct C2 const C2: (); 514 ct C2 const C2: ();
515 fn subfunc() -> () 515 fn subfunc() fn()
516 me submethod(…) -> () 516 me submethod(…) fn(&self)
517 ct CONST const CONST: u8; 517 ct CONST const CONST: u8;
518 fn func() -> () 518 fn func() fn()
519 me method(…) -> () 519 me method(…) fn(&self)
520 "#]], 520 "#]],
521 ); 521 );
522 } 522 }
@@ -552,11 +552,11 @@ impl<T> Sub for Wrap<T> {
552 ta SubTy type SubTy; 552 ta SubTy type SubTy;
553 ta Ty type Ty; 553 ta Ty type Ty;
554 ct CONST const CONST: u8 = 0; 554 ct CONST const CONST: u8 = 0;
555 fn func() -> () 555 fn func() fn()
556 me method(…) -> () 556 me method(…) fn(&self)
557 ct C2 const C2: () = (); 557 ct C2 const C2: () = ();
558 fn subfunc() -> () 558 fn subfunc() fn()
559 me submethod(…) -> () 559 me submethod(…) fn(&self)
560 "#]], 560 "#]],
561 ); 561 );
562 } 562 }
@@ -573,8 +573,8 @@ impl T { fn bar() {} }
573fn main() { T::$0; } 573fn main() { T::$0; }
574"#, 574"#,
575 expect![[r#" 575 expect![[r#"
576 fn foo() -> () 576 fn foo() fn()
577 fn bar() -> () 577 fn bar() fn()
578 "#]], 578 "#]],
579 ); 579 );
580 } 580 }
@@ -589,7 +589,7 @@ macro_rules! foo { () => {} }
589fn main() { let _ = crate::$0 } 589fn main() { let _ = crate::$0 }
590 "#, 590 "#,
591 expect![[r##" 591 expect![[r##"
592 fn main() -> () 592 fn main() fn()
593 ma foo!(…) #[macro_export] macro_rules! foo 593 ma foo!(…) #[macro_export] macro_rules! foo
594 "##]], 594 "##]],
595 ); 595 );
@@ -633,7 +633,7 @@ mod p {
633"#, 633"#,
634 expect![[r#" 634 expect![[r#"
635 ct RIGHT_CONST 635 ct RIGHT_CONST
636 fn right_fn() -> () 636 fn right_fn() fn()
637 st RightType 637 st RightType
638 "#]], 638 "#]],
639 ); 639 );
@@ -680,8 +680,8 @@ fn main() { m!(self::f$0); }
680fn foo() {} 680fn foo() {}
681"#, 681"#,
682 expect![[r#" 682 expect![[r#"
683 fn main() -> () 683 fn main() fn()
684 fn foo() -> () 684 fn foo() fn()
685 "#]], 685 "#]],
686 ); 686 );
687 } 687 }
@@ -699,7 +699,7 @@ mod m {
699"#, 699"#,
700 expect![[r#" 700 expect![[r#"
701 md z 701 md z
702 fn z() -> () 702 fn z() fn()
703 "#]], 703 "#]],
704 ); 704 );
705 } 705 }
@@ -719,7 +719,7 @@ fn foo() {
719} 719}
720"#, 720"#,
721 expect![[r#" 721 expect![[r#"
722 fn new() -> HashMap<K, V, RandomState> 722 fn new() fn() -> HashMap<K, V, RandomState>
723 "#]], 723 "#]],
724 ); 724 );
725 } 725 }
@@ -752,8 +752,8 @@ fn main() {
752} 752}
753"#, 753"#,
754 expect![[r#" 754 expect![[r#"
755 fn main() -> () 755 fn main() fn()
756 fn foo(…) -> () 756 fn foo(…) fn(i32, i32)
757 "#]], 757 "#]],
758 ); 758 );
759 } 759 }
@@ -776,7 +776,7 @@ impl Foo {
776 expect![[r#" 776 expect![[r#"
777 ev Bar () 777 ev Bar ()
778 ev Baz () 778 ev Baz ()
779 me foo(…) -> () 779 me foo(…) fn(self)
780 "#]], 780 "#]],
781 ); 781 );
782 } 782 }
@@ -800,7 +800,7 @@ impl u8 {
800"#, 800"#,
801 expect![[r#" 801 expect![[r#"
802 ct MAX pub const MAX: Self = 255; 802 ct MAX pub const MAX: Self = 255;
803 me func(…) -> () 803 me func(…) fn(self)
804 "#]], 804 "#]],
805 ); 805 );
806 } 806 }
diff --git a/crates/ide_completion/src/completions/unqualified_path.rs b/crates/ide_completion/src/completions/unqualified_path.rs
index 5ef80f6a7..1b8b063e7 100644
--- a/crates/ide_completion/src/completions/unqualified_path.rs
+++ b/crates/ide_completion/src/completions/unqualified_path.rs
@@ -135,7 +135,7 @@ fn quux(x: i32) {
135 expect![[r#" 135 expect![[r#"
136 lc y i32 136 lc y i32
137 lc x i32 137 lc x i32
138 fn quux(…) -> () 138 fn quux(…) fn(i32)
139 "#]], 139 "#]],
140 ); 140 );
141 } 141 }
@@ -157,7 +157,7 @@ fn quux() {
157 expect![[r#" 157 expect![[r#"
158 lc b i32 158 lc b i32
159 lc a 159 lc a
160 fn quux() -> () 160 fn quux() fn()
161 "#]], 161 "#]],
162 ); 162 );
163 } 163 }
@@ -172,7 +172,7 @@ fn quux() {
172"#, 172"#,
173 expect![[r#" 173 expect![[r#"
174 lc x 174 lc x
175 fn quux() -> () 175 fn quux() fn()
176 "#]], 176 "#]],
177 ); 177 );
178 } 178 }
@@ -203,14 +203,14 @@ fn main() {
203 r#"fn quux<T>() { $0 }"#, 203 r#"fn quux<T>() { $0 }"#,
204 expect![[r#" 204 expect![[r#"
205 tp T 205 tp T
206 fn quux() -> () 206 fn quux() fn()
207 "#]], 207 "#]],
208 ); 208 );
209 check( 209 check(
210 r#"fn quux<const C: usize>() { $0 }"#, 210 r#"fn quux<const C: usize>() { $0 }"#,
211 expect![[r#" 211 expect![[r#"
212 cp C 212 cp C
213 fn quux() -> () 213 fn quux() fn()
214 "#]], 214 "#]],
215 ); 215 );
216 } 216 }
@@ -221,7 +221,7 @@ fn main() {
221 check( 221 check(
222 r#"fn quux<'a>() { $0 }"#, 222 r#"fn quux<'a>() { $0 }"#,
223 expect![[r#" 223 expect![[r#"
224 fn quux() -> () 224 fn quux() fn()
225 "#]], 225 "#]],
226 ); 226 );
227 } 227 }
@@ -259,7 +259,7 @@ fn quux() { $0 }
259"#, 259"#,
260 expect![[r#" 260 expect![[r#"
261 st S 261 st S
262 fn quux() -> () 262 fn quux() fn()
263 en E 263 en E
264 "#]], 264 "#]],
265 ); 265 );
@@ -312,7 +312,7 @@ mod m {
312} 312}
313"#, 313"#,
314 expect![[r#" 314 expect![[r#"
315 fn quux() -> () 315 fn quux() fn()
316 st Bar 316 st Bar
317 "#]], 317 "#]],
318 ); 318 );
@@ -327,7 +327,7 @@ fn x() -> $0
327"#, 327"#,
328 expect![[r#" 328 expect![[r#"
329 st Foo 329 st Foo
330 fn x() -> () 330 fn x() fn()
331 "#]], 331 "#]],
332 ); 332 );
333 } 333 }
@@ -348,7 +348,7 @@ fn foo() {
348 expect![[r#" 348 expect![[r#"
349 lc bar i32 349 lc bar i32
350 lc bar i32 350 lc bar i32
351 fn foo() -> () 351 fn foo() fn()
352 "#]], 352 "#]],
353 ); 353 );
354 } 354 }
@@ -378,7 +378,7 @@ use prelude::*;
378mod prelude { struct Option; } 378mod prelude { struct Option; }
379"#, 379"#,
380 expect![[r#" 380 expect![[r#"
381 fn foo() -> () 381 fn foo() fn()
382 md std 382 md std
383 st Option 383 st Option
384 "#]], 384 "#]],
@@ -408,7 +408,7 @@ mod macros {
408} 408}
409"#, 409"#,
410 expect![[r##" 410 expect![[r##"
411 fn f() -> () 411 fn f() fn()
412 ma concat!(…) #[macro_export] macro_rules! concat 412 ma concat!(…) #[macro_export] macro_rules! concat
413 md std 413 md std
414 "##]], 414 "##]],
@@ -435,7 +435,7 @@ use prelude::*;
435mod prelude { struct String; } 435mod prelude { struct String; }
436"#, 436"#,
437 expect![[r#" 437 expect![[r#"
438 fn foo() -> () 438 fn foo() fn()
439 md std 439 md std
440 md core 440 md core
441 st String 441 st String
@@ -466,7 +466,7 @@ fn main() { let v = $0 }
466 expect![[r##" 466 expect![[r##"
467 md m1 467 md m1
468 ma baz!(…) #[macro_export] macro_rules! baz 468 ma baz!(…) #[macro_export] macro_rules! baz
469 fn main() -> () 469 fn main() fn()
470 md m2 470 md m2
471 ma bar!(…) macro_rules! bar 471 ma bar!(…) macro_rules! bar
472 ma foo!(…) macro_rules! foo 472 ma foo!(…) macro_rules! foo
@@ -482,7 +482,7 @@ macro_rules! foo { () => {} }
482fn foo() { $0 } 482fn foo() { $0 }
483"#, 483"#,
484 expect![[r#" 484 expect![[r#"
485 fn foo() -> () 485 fn foo() fn()
486 ma foo!(…) macro_rules! foo 486 ma foo!(…) macro_rules! foo
487 "#]], 487 "#]],
488 ); 488 );
@@ -496,7 +496,7 @@ macro_rules! foo { () => {} }
496fn main() { let x: $0 } 496fn main() { let x: $0 }
497"#, 497"#,
498 expect![[r#" 498 expect![[r#"
499 fn main() -> () 499 fn main() fn()
500 ma foo!(…) macro_rules! foo 500 ma foo!(…) macro_rules! foo
501 "#]], 501 "#]],
502 ); 502 );
@@ -510,7 +510,7 @@ macro_rules! foo { () => {} }
510fn main() { $0 } 510fn main() { $0 }
511"#, 511"#,
512 expect![[r#" 512 expect![[r#"
513 fn main() -> () 513 fn main() fn()
514 ma foo!(…) macro_rules! foo 514 ma foo!(…) macro_rules! foo
515 "#]], 515 "#]],
516 ); 516 );
@@ -526,8 +526,8 @@ fn main() {
526} 526}
527"#, 527"#,
528 expect![[r#" 528 expect![[r#"
529 fn frobnicate() -> () 529 fn frobnicate() fn()
530 fn main() -> () 530 fn main() fn()
531 "#]], 531 "#]],
532 ); 532 );
533 } 533 }
@@ -545,7 +545,7 @@ fn quux(x: i32) {
545 expect![[r#" 545 expect![[r#"
546 lc y i32 546 lc y i32
547 lc x i32 547 lc x i32
548 fn quux(…) -> () 548 fn quux(…) fn(i32)
549 ma m!(…) macro_rules! m 549 ma m!(…) macro_rules! m
550 "#]], 550 "#]],
551 ); 551 );
@@ -564,7 +564,7 @@ fn quux(x: i32) {
564 expect![[r#" 564 expect![[r#"
565 lc y i32 565 lc y i32
566 lc x i32 566 lc x i32
567 fn quux(…) -> () 567 fn quux(…) fn(i32)
568 ma m!(…) macro_rules! m 568 ma m!(…) macro_rules! m
569 "#]], 569 "#]],
570 ); 570 );
@@ -583,7 +583,7 @@ fn quux(x: i32) {
583 expect![[r#" 583 expect![[r#"
584 lc y i32 584 lc y i32
585 lc x i32 585 lc x i32
586 fn quux(…) -> () 586 fn quux(…) fn(i32)
587 ma m!(…) macro_rules! m 587 ma m!(…) macro_rules! m
588 "#]], 588 "#]],
589 ); 589 );
@@ -598,7 +598,7 @@ use spam::Quux;
598fn main() { $0 } 598fn main() { $0 }
599"#, 599"#,
600 expect![[r#" 600 expect![[r#"
601 fn main() -> () 601 fn main() fn()
602 ?? Quux 602 ?? Quux
603 "#]], 603 "#]],
604 ); 604 );
@@ -616,7 +616,7 @@ fn main() { let foo: Foo = Q$0 }
616 ev Foo::Baz () 616 ev Foo::Baz ()
617 ev Foo::Quux () 617 ev Foo::Quux ()
618 en Foo 618 en Foo
619 fn main() -> () 619 fn main() fn()
620 "#]], 620 "#]],
621 ) 621 )
622 } 622 }
@@ -631,7 +631,7 @@ fn f() -> m::E { V$0 }
631 expect![[r#" 631 expect![[r#"
632 ev m::E::V () 632 ev m::E::V ()
633 md m 633 md m
634 fn f() -> E 634 fn f() fn() -> E
635 "#]], 635 "#]],
636 ) 636 )
637 } 637 }
diff --git a/crates/ide_completion/src/lib.rs b/crates/ide_completion/src/lib.rs
index 263554ecf..5b7ad38d5 100644
--- a/crates/ide_completion/src/lib.rs
+++ b/crates/ide_completion/src/lib.rs
@@ -230,7 +230,7 @@ fn foo() {
230 bar.fo$0; 230 bar.fo$0;
231} 231}
232"#, 232"#,
233 DetailAndDocumentation { detail: "-> ()", documentation: "Do the foo" }, 233 DetailAndDocumentation { detail: "fn(&self)", documentation: "Do the foo" },
234 ); 234 );
235 } 235 }
236 236
@@ -255,7 +255,7 @@ fn foo() {
255 bar.fo$0; 255 bar.fo$0;
256} 256}
257"#, 257"#,
258 DetailAndDocumentation { detail: "-> ()", documentation: " Do the foo" }, 258 DetailAndDocumentation { detail: "fn(&self)", documentation: " Do the foo" },
259 ); 259 );
260 } 260 }
261 261
@@ -273,7 +273,7 @@ fn bar() {
273 for c in fo$0 273 for c in fo$0
274} 274}
275"#, 275"#,
276 DetailAndDocumentation { detail: "-> &str", documentation: "Do the foo" }, 276 DetailAndDocumentation { detail: "fn() -> &str", documentation: "Do the foo" },
277 ); 277 );
278 } 278 }
279} 279}
diff --git a/crates/ide_completion/src/render.rs b/crates/ide_completion/src/render.rs
index 09a27de71..36655667c 100644
--- a/crates/ide_completion/src/render.rs
+++ b/crates/ide_completion/src/render.rs
@@ -452,6 +452,44 @@ fn main() { Foo::Fo$0 }
452 } 452 }
453 453
454 #[test] 454 #[test]
455 fn fn_detail_includes_args_and_return_type() {
456 check(
457 r#"
458fn foo<T>(a: u32, b: u32, t: T) -> (u32, T) { (a, t) }
459
460fn main() { fo$0 }
461"#,
462 expect![[r#"
463 [
464 CompletionItem {
465 label: "foo(…)",
466 source_range: 68..70,
467 delete: 68..70,
468 insert: "foo(${1:a}, ${2:b}, ${3:t})$0",
469 kind: SymbolKind(
470 Function,
471 ),
472 lookup: "foo",
473 detail: "fn(u32, u32, T) -> (u32, T)",
474 trigger_call_info: true,
475 },
476 CompletionItem {
477 label: "main()",
478 source_range: 68..70,
479 delete: 68..70,
480 insert: "main()$0",
481 kind: SymbolKind(
482 Function,
483 ),
484 lookup: "main",
485 detail: "fn()",
486 },
487 ]
488 "#]],
489 );
490 }
491
492 #[test]
455 fn enum_detail_just_parentheses_for_unit() { 493 fn enum_detail_just_parentheses_for_unit() {
456 check( 494 check(
457 r#" 495 r#"
@@ -538,7 +576,7 @@ fn main() { let _: m::Spam = S$0 }
538 Function, 576 Function,
539 ), 577 ),
540 lookup: "main", 578 lookup: "main",
541 detail: "-> ()", 579 detail: "fn()",
542 }, 580 },
543 ] 581 ]
544 "#]], 582 "#]],
@@ -567,7 +605,7 @@ fn main() { som$0 }
567 Function, 605 Function,
568 ), 606 ),
569 lookup: "main", 607 lookup: "main",
570 detail: "-> ()", 608 detail: "fn()",
571 }, 609 },
572 CompletionItem { 610 CompletionItem {
573 label: "something_deprecated()", 611 label: "something_deprecated()",
@@ -578,7 +616,7 @@ fn main() { som$0 }
578 Function, 616 Function,
579 ), 617 ),
580 lookup: "something_deprecated", 618 lookup: "something_deprecated",
581 detail: "-> ()", 619 detail: "fn()",
582 deprecated: true, 620 deprecated: true,
583 }, 621 },
584 CompletionItem { 622 CompletionItem {
@@ -590,7 +628,7 @@ fn main() { som$0 }
590 Function, 628 Function,
591 ), 629 ),
592 lookup: "something_else_deprecated", 630 lookup: "something_else_deprecated",
593 detail: "-> ()", 631 detail: "fn()",
594 deprecated: true, 632 deprecated: true,
595 }, 633 },
596 ] 634 ]
@@ -641,7 +679,7 @@ impl S {
641 insert: "bar()$0", 679 insert: "bar()$0",
642 kind: Method, 680 kind: Method,
643 lookup: "bar", 681 lookup: "bar",
644 detail: "-> ()", 682 detail: "fn(self)",
645 documentation: Documentation( 683 documentation: Documentation(
646 "Method docs", 684 "Method docs",
647 ), 685 ),
@@ -741,7 +779,7 @@ fn foo(s: S) { s.$0 }
741 insert: "the_method()$0", 779 insert: "the_method()$0",
742 kind: Method, 780 kind: Method,
743 lookup: "the_method", 781 lookup: "the_method",
744 detail: "-> ()", 782 detail: "fn(&self)",
745 }, 783 },
746 ] 784 ]
747 "#]], 785 "#]],
@@ -1049,7 +1087,7 @@ fn main() {
1049 Function, 1087 Function,
1050 ), 1088 ),
1051 lookup: "foo", 1089 lookup: "foo",
1052 detail: "-> ()", 1090 detail: "fn(&mut S)",
1053 trigger_call_info: true, 1091 trigger_call_info: true,
1054 }, 1092 },
1055 CompletionItem { 1093 CompletionItem {
@@ -1061,7 +1099,7 @@ fn main() {
1061 Function, 1099 Function,
1062 ), 1100 ),
1063 lookup: "main", 1101 lookup: "main",
1064 detail: "-> ()", 1102 detail: "fn()",
1065 }, 1103 },
1066 CompletionItem { 1104 CompletionItem {
1067 label: "s", 1105 label: "s",
diff --git a/crates/ide_completion/src/render/function.rs b/crates/ide_completion/src/render/function.rs
index 194ea135e..010303182 100644
--- a/crates/ide_completion/src/render/function.rs
+++ b/crates/ide_completion/src/render/function.rs
@@ -2,6 +2,7 @@
2 2
3use hir::{HasSource, HirDisplay, Type}; 3use hir::{HasSource, HirDisplay, Type};
4use ide_db::SymbolKind; 4use ide_db::SymbolKind;
5use itertools::Itertools;
5use syntax::ast::Fn; 6use syntax::ast::Fn;
6 7
7use crate::{ 8use crate::{
@@ -73,8 +74,42 @@ impl<'a> FunctionRender<'a> {
73 } 74 }
74 75
75 fn detail(&self) -> String { 76 fn detail(&self) -> String {
76 let ty = self.func.ret_type(self.ctx.db()); 77 let ret_ty = self.func.ret_type(self.ctx.db());
77 format!("-> {}", ty.display(self.ctx.db())) 78 let ret = if ret_ty.is_unit() {
79 // Omit the return type if it is the unit type
80 String::new()
81 } else {
82 format!(" {}", self.ty_display())
83 };
84
85 format!("fn({}){}", self.params_display(), ret)
86 }
87
88 fn params_display(&self) -> String {
89 if let Some(self_param) = self.func.self_param(self.ctx.db()) {
90 let params = self
91 .func
92 .assoc_fn_params(self.ctx.db())
93 .into_iter()
94 .skip(1) // skip the self param because we are manually handling that
95 .map(|p| p.ty().display(self.ctx.db()).to_string());
96
97 std::iter::once(self_param.display(self.ctx.db()).to_owned()).chain(params).join(", ")
98 } else {
99 let params = self
100 .func
101 .assoc_fn_params(self.ctx.db())
102 .into_iter()
103 .map(|p| p.ty().display(self.ctx.db()).to_string())
104 .join(", ");
105 params
106 }
107 }
108
109 fn ty_display(&self) -> String {
110 let ret_ty = self.func.ret_type(self.ctx.db());
111
112 format!("-> {}", ret_ty.display(self.ctx.db()))
78 } 113 }
79 114
80 fn add_arg(&self, arg: &str, ty: &Type) -> String { 115 fn add_arg(&self, arg: &str, ty: &Type) -> String {