diff options
Diffstat (limited to 'crates/ra_ide')
-rw-r--r-- | crates/ra_ide/src/diagnostics.rs | 3 | ||||
-rw-r--r-- | crates/ra_ide/src/goto_definition.rs | 80 |
2 files changed, 83 insertions, 0 deletions
diff --git a/crates/ra_ide/src/diagnostics.rs b/crates/ra_ide/src/diagnostics.rs index a88a978d7..9bde1db8e 100644 --- a/crates/ra_ide/src/diagnostics.rs +++ b/crates/ra_ide/src/diagnostics.rs | |||
@@ -167,6 +167,9 @@ fn missing_struct_field_fix( | |||
167 | }; | 167 | }; |
168 | 168 | ||
169 | let new_field_type = sema.type_of_expr(&record_expr.expr()?)?; | 169 | let new_field_type = sema.type_of_expr(&record_expr.expr()?)?; |
170 | if new_field_type.is_unknown() { | ||
171 | return None; | ||
172 | } | ||
170 | let new_field = make::record_field_def( | 173 | let new_field = make::record_field_def( |
171 | record_expr.field_name()?, | 174 | record_expr.field_name()?, |
172 | make::type_ref(&new_field_type.display_source_code(sema.db, module.into()).ok()?), | 175 | make::type_ref(&new_field_type.display_source_code(sema.db, module.into()).ok()?), |
diff --git a/crates/ra_ide/src/goto_definition.rs b/crates/ra_ide/src/goto_definition.rs index 0798d2c36..450ce0ba7 100644 --- a/crates/ra_ide/src/goto_definition.rs +++ b/crates/ra_ide/src/goto_definition.rs | |||
@@ -908,4 +908,84 @@ mod tests { | |||
908 | "x: i32|x", | 908 | "x: i32|x", |
909 | ); | 909 | ); |
910 | } | 910 | } |
911 | |||
912 | #[test] | ||
913 | fn goto_def_for_enum_variant_self_pattern_const() { | ||
914 | check_goto( | ||
915 | " | ||
916 | //- /lib.rs | ||
917 | enum Foo { | ||
918 | Bar, | ||
919 | } | ||
920 | impl Foo { | ||
921 | fn baz(self) { | ||
922 | match self { | ||
923 | Self::Bar<|> => {} | ||
924 | } | ||
925 | } | ||
926 | } | ||
927 | ", | ||
928 | "Bar ENUM_VARIANT FileId(1) 15..18 15..18", | ||
929 | "Bar|Bar", | ||
930 | ); | ||
931 | } | ||
932 | |||
933 | #[test] | ||
934 | fn goto_def_for_enum_variant_self_pattern_record() { | ||
935 | check_goto( | ||
936 | " | ||
937 | //- /lib.rs | ||
938 | enum Foo { | ||
939 | Bar { val: i32 }, | ||
940 | } | ||
941 | impl Foo { | ||
942 | fn baz(self) -> i32 { | ||
943 | match self { | ||
944 | Self::Bar<|> { val } => {} | ||
945 | } | ||
946 | } | ||
947 | } | ||
948 | ", | ||
949 | "Bar ENUM_VARIANT FileId(1) 15..31 15..18", | ||
950 | "Bar { val: i32 }|Bar", | ||
951 | ); | ||
952 | } | ||
953 | |||
954 | #[test] | ||
955 | fn goto_def_for_enum_variant_self_expr_const() { | ||
956 | check_goto( | ||
957 | " | ||
958 | //- /lib.rs | ||
959 | enum Foo { | ||
960 | Bar, | ||
961 | } | ||
962 | impl Foo { | ||
963 | fn baz(self) { | ||
964 | Self::Bar<|>; | ||
965 | } | ||
966 | } | ||
967 | ", | ||
968 | "Bar ENUM_VARIANT FileId(1) 15..18 15..18", | ||
969 | "Bar|Bar", | ||
970 | ); | ||
971 | } | ||
972 | |||
973 | #[test] | ||
974 | fn goto_def_for_enum_variant_self_expr_record() { | ||
975 | check_goto( | ||
976 | " | ||
977 | //- /lib.rs | ||
978 | enum Foo { | ||
979 | Bar { val: i32 }, | ||
980 | } | ||
981 | impl Foo { | ||
982 | fn baz(self) { | ||
983 | Self::Bar<|> {val: 4}; | ||
984 | } | ||
985 | } | ||
986 | ", | ||
987 | "Bar ENUM_VARIANT FileId(1) 15..31 15..18", | ||
988 | "Bar { val: i32 }|Bar", | ||
989 | ); | ||
990 | } | ||
911 | } | 991 | } |