diff options
-rw-r--r-- | crates/ra_ide/src/inlay_hints.rs | 174 |
1 files changed, 100 insertions, 74 deletions
diff --git a/crates/ra_ide/src/inlay_hints.rs b/crates/ra_ide/src/inlay_hints.rs index 64980a832..62d364bfa 100644 --- a/crates/ra_ide/src/inlay_hints.rs +++ b/crates/ra_ide/src/inlay_hints.rs | |||
@@ -345,7 +345,7 @@ fn get_fn_signature(sema: &Semantics<RootDatabase>, expr: &ast::Expr) -> Option< | |||
345 | 345 | ||
346 | #[cfg(test)] | 346 | #[cfg(test)] |
347 | mod tests { | 347 | mod tests { |
348 | use insta::assert_debug_snapshot; | 348 | use expect::{expect, Expect}; |
349 | use test_utils::extract_annotations; | 349 | use test_utils::extract_annotations; |
350 | 350 | ||
351 | use crate::{inlay_hints::InlayHintsConfig, mock_analysis::single_file}; | 351 | use crate::{inlay_hints::InlayHintsConfig, mock_analysis::single_file}; |
@@ -363,6 +363,12 @@ mod tests { | |||
363 | assert_eq!(expected, actual); | 363 | assert_eq!(expected, actual); |
364 | } | 364 | } |
365 | 365 | ||
366 | fn check_expect(ra_fixture: &str, config: InlayHintsConfig, expect: Expect) { | ||
367 | let (analysis, file_id) = single_file(ra_fixture); | ||
368 | let inlay_hints = analysis.inlay_hints(file_id, &config).unwrap(); | ||
369 | expect.assert_debug_eq(&inlay_hints) | ||
370 | } | ||
371 | |||
366 | #[test] | 372 | #[test] |
367 | fn param_hints_only() { | 373 | fn param_hints_only() { |
368 | check_with_config( | 374 | check_with_config( |
@@ -772,34 +778,41 @@ fn main() { | |||
772 | 778 | ||
773 | #[test] | 779 | #[test] |
774 | fn chaining_hints_ignore_comments() { | 780 | fn chaining_hints_ignore_comments() { |
775 | let (analysis, file_id) = single_file( | 781 | check_expect( |
776 | r#" | 782 | r#" |
777 | struct A(B); | 783 | struct A(B); |
778 | impl A { fn into_b(self) -> B { self.0 } } | 784 | impl A { fn into_b(self) -> B { self.0 } } |
779 | struct B(C); | 785 | struct B(C); |
780 | impl B { fn into_c(self) -> C { self.0 } } | 786 | impl B { fn into_c(self) -> C { self.0 } } |
781 | struct C; | 787 | struct C; |
782 | 788 | ||
783 | fn main() { | 789 | fn main() { |
784 | let c = A(B(C)) | 790 | let c = A(B(C)) |
785 | .into_b() // This is a comment | 791 | .into_b() // This is a comment |
786 | .into_c(); | 792 | .into_c(); |
787 | }"#, | 793 | } |
788 | ); | 794 | "#, |
789 | assert_debug_snapshot!(analysis.inlay_hints(file_id, &InlayHintsConfig{ parameter_hints: false, type_hints: false, chaining_hints: true, max_length: None}).unwrap(), @r###" | 795 | InlayHintsConfig { |
790 | [ | 796 | parameter_hints: false, |
791 | InlayHint { | 797 | type_hints: false, |
792 | range: 147..172, | 798 | chaining_hints: true, |
793 | kind: ChainingHint, | 799 | max_length: None, |
794 | label: "B", | ||
795 | }, | ||
796 | InlayHint { | ||
797 | range: 147..154, | ||
798 | kind: ChainingHint, | ||
799 | label: "A", | ||
800 | }, | 800 | }, |
801 | ] | 801 | expect![[r#" |
802 | "###); | 802 | [ |
803 | InlayHint { | ||
804 | range: 147..172, | ||
805 | kind: ChainingHint, | ||
806 | label: "B", | ||
807 | }, | ||
808 | InlayHint { | ||
809 | range: 147..154, | ||
810 | kind: ChainingHint, | ||
811 | label: "A", | ||
812 | }, | ||
813 | ] | ||
814 | "#]], | ||
815 | ); | ||
803 | } | 816 | } |
804 | 817 | ||
805 | #[test] | 818 | #[test] |
@@ -826,7 +839,7 @@ fn main() { | |||
826 | 839 | ||
827 | #[test] | 840 | #[test] |
828 | fn struct_access_chaining_hints() { | 841 | fn struct_access_chaining_hints() { |
829 | let (analysis, file_id) = single_file( | 842 | check_expect( |
830 | r#" | 843 | r#" |
831 | struct A { pub b: B } | 844 | struct A { pub b: B } |
832 | struct B { pub c: C } | 845 | struct B { pub c: C } |
@@ -845,58 +858,71 @@ fn main() { | |||
845 | let x = D | 858 | let x = D |
846 | .foo(); | 859 | .foo(); |
847 | }"#, | 860 | }"#, |
848 | ); | 861 | InlayHintsConfig { |
849 | assert_debug_snapshot!(analysis.inlay_hints(file_id, &InlayHintsConfig{ parameter_hints: false, type_hints: false, chaining_hints: true, max_length: None}).unwrap(), @r###" | 862 | parameter_hints: false, |
850 | [ | 863 | type_hints: false, |
851 | InlayHint { | 864 | chaining_hints: true, |
852 | range: 143..190, | 865 | max_length: None, |
853 | kind: ChainingHint, | ||
854 | label: "C", | ||
855 | }, | ||
856 | InlayHint { | ||
857 | range: 143..179, | ||
858 | kind: ChainingHint, | ||
859 | label: "B", | ||
860 | }, | 866 | }, |
861 | ] | 867 | expect![[r#" |
862 | "###); | 868 | [ |
869 | InlayHint { | ||
870 | range: 143..190, | ||
871 | kind: ChainingHint, | ||
872 | label: "C", | ||
873 | }, | ||
874 | InlayHint { | ||
875 | range: 143..179, | ||
876 | kind: ChainingHint, | ||
877 | label: "B", | ||
878 | }, | ||
879 | ] | ||
880 | "#]], | ||
881 | ); | ||
863 | } | 882 | } |
864 | 883 | ||
865 | #[test] | 884 | #[test] |
866 | fn generic_chaining_hints() { | 885 | fn generic_chaining_hints() { |
867 | let (analysis, file_id) = single_file( | 886 | check_expect( |
868 | r#" | 887 | r#" |
869 | struct A<T>(T); | 888 | struct A<T>(T); |
870 | struct B<T>(T); | 889 | struct B<T>(T); |
871 | struct C<T>(T); | 890 | struct C<T>(T); |
872 | struct X<T,R>(T, R); | 891 | struct X<T,R>(T, R); |
873 | 892 | ||
874 | impl<T> A<T> { | 893 | impl<T> A<T> { |
875 | fn new(t: T) -> Self { A(t) } | 894 | fn new(t: T) -> Self { A(t) } |
876 | fn into_b(self) -> B<T> { B(self.0) } | 895 | fn into_b(self) -> B<T> { B(self.0) } |
877 | } | 896 | } |
878 | impl<T> B<T> { | 897 | impl<T> B<T> { |
879 | fn into_c(self) -> C<T> { C(self.0) } | 898 | fn into_c(self) -> C<T> { C(self.0) } |
880 | } | 899 | } |
881 | fn main() { | 900 | fn main() { |
882 | let c = A::new(X(42, true)) | 901 | let c = A::new(X(42, true)) |
883 | .into_b() | 902 | .into_b() |
884 | .into_c(); | 903 | .into_c(); |
885 | }"#, | 904 | } |
886 | ); | 905 | "#, |
887 | assert_debug_snapshot!(analysis.inlay_hints(file_id, &InlayHintsConfig{ parameter_hints: false, type_hints: false, chaining_hints: true, max_length: None}).unwrap(), @r###" | 906 | InlayHintsConfig { |
888 | [ | 907 | parameter_hints: false, |
889 | InlayHint { | 908 | type_hints: false, |
890 | range: 246..283, | 909 | chaining_hints: true, |
891 | kind: ChainingHint, | 910 | max_length: None, |
892 | label: "B<X<i32, bool>>", | ||
893 | }, | ||
894 | InlayHint { | ||
895 | range: 246..265, | ||
896 | kind: ChainingHint, | ||
897 | label: "A<X<i32, bool>>", | ||
898 | }, | 911 | }, |
899 | ] | 912 | expect![[r#" |
900 | "###); | 913 | [ |
914 | InlayHint { | ||
915 | range: 246..283, | ||
916 | kind: ChainingHint, | ||
917 | label: "B<X<i32, bool>>", | ||
918 | }, | ||
919 | InlayHint { | ||
920 | range: 246..265, | ||
921 | kind: ChainingHint, | ||
922 | label: "A<X<i32, bool>>", | ||
923 | }, | ||
924 | ] | ||
925 | "#]], | ||
926 | ); | ||
901 | } | 927 | } |
902 | } | 928 | } |