diff options
author | Marcus Klaas de Vries <[email protected]> | 2019-01-16 15:34:33 +0000 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2019-01-19 12:37:25 +0000 |
commit | 3b0de53904e560f85ccfdc38e66e6d6c9e997b7a (patch) | |
tree | 2459272caf6aea31d38b414bc15f38f61c2b64ef | |
parent | 5648dcd36e65dde9c8f41884eed64a7e1a1d2073 (diff) |
Work on type inference for ADT patterns
-rw-r--r-- | crates/ra_hir/src/ty.rs | 30 | ||||
-rw-r--r-- | crates/ra_hir/src/ty/tests.rs | 5 |
2 files changed, 32 insertions, 3 deletions
diff --git a/crates/ra_hir/src/ty.rs b/crates/ra_hir/src/ty.rs index 324df5ef9..a13356714 100644 --- a/crates/ra_hir/src/ty.rs +++ b/crates/ra_hir/src/ty.rs | |||
@@ -876,6 +876,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
876 | // a Ty itself | 876 | // a Ty itself |
877 | fn infer_pat(&mut self, pat: PatId, expected: &Expectation) -> Ty { | 877 | fn infer_pat(&mut self, pat: PatId, expected: &Expectation) -> Ty { |
878 | let body = Arc::clone(&self.body); // avoid borrow checker problem | 878 | let body = Arc::clone(&self.body); // avoid borrow checker problem |
879 | |||
879 | match (&body[pat], &expected.ty) { | 880 | match (&body[pat], &expected.ty) { |
880 | (Pat::Tuple(ref args), &Ty::Tuple(ref tuple_args)) | 881 | (Pat::Tuple(ref args), &Ty::Tuple(ref tuple_args)) |
881 | if args.len() == tuple_args.len() => | 882 | if args.len() == tuple_args.len() => |
@@ -890,6 +891,31 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
890 | { | 891 | { |
891 | self.infer_pat(pat, &Expectation::has_type((&**sub_ty).clone())); | 892 | self.infer_pat(pat, &Expectation::has_type((&**sub_ty).clone())); |
892 | } | 893 | } |
894 | (pattern, &Ty::Adt { def_id, .. }) => { | ||
895 | let adt_def = def_id.resolve(self.db); | ||
896 | match (pattern, adt_def) { | ||
897 | (&Pat::Struct, Def::Struct(s)) => {} | ||
898 | ( | ||
899 | &Pat::TupleStruct { | ||
900 | path: ref p, | ||
901 | args: ref sub_pats, | ||
902 | }, | ||
903 | Def::Enum(ref e), | ||
904 | ) => { | ||
905 | // TODO: resolve enum | ||
906 | } | ||
907 | ( | ||
908 | &Pat::TupleStruct { | ||
909 | path: ref p, | ||
910 | args: ref sub_pats, | ||
911 | }, | ||
912 | Def::EnumVariant(ref e), | ||
913 | ) => { | ||
914 | let variant_data = self.db.enum_variant_data(e.def_id); | ||
915 | } | ||
916 | _ => {} | ||
917 | } | ||
918 | } | ||
893 | // TODO: implement more | 919 | // TODO: implement more |
894 | (_, ref _expected_ty) => {} | 920 | (_, ref _expected_ty) => {} |
895 | }; | 921 | }; |
@@ -1197,7 +1223,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
1197 | decl_ty | 1223 | decl_ty |
1198 | }; | 1224 | }; |
1199 | 1225 | ||
1200 | self.infer_pat(*pat, &Expectation::has_type(ty))?; | 1226 | self.infer_pat(*pat, &Expectation::has_type(ty)); |
1201 | } | 1227 | } |
1202 | Statement::Expr(expr) => { | 1228 | Statement::Expr(expr) => { |
1203 | self.infer_expr(*expr, &Expectation::none()); | 1229 | self.infer_expr(*expr, &Expectation::none()); |
@@ -1218,7 +1244,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
1218 | let ty = self.make_ty(type_ref); | 1244 | let ty = self.make_ty(type_ref); |
1219 | let ty = self.insert_type_vars(ty); | 1245 | let ty = self.insert_type_vars(ty); |
1220 | 1246 | ||
1221 | self.infer_pat(*pat, &Expectation::has_type(ty))?; | 1247 | self.infer_pat(*pat, &Expectation::has_type(ty)); |
1222 | } | 1248 | } |
1223 | self.return_ty = { | 1249 | self.return_ty = { |
1224 | let ty = self.make_ty(signature.ret_type()); | 1250 | let ty = self.make_ty(signature.ret_type()); |
diff --git a/crates/ra_hir/src/ty/tests.rs b/crates/ra_hir/src/ty/tests.rs index a55551cbb..ff2c8b0d4 100644 --- a/crates/ra_hir/src/ty/tests.rs +++ b/crates/ra_hir/src/ty/tests.rs | |||
@@ -362,7 +362,10 @@ fn test(x: &str, y: isize) { | |||
362 | fn infer_pattern() { | 362 | fn infer_pattern() { |
363 | check_inference( | 363 | check_inference( |
364 | r#" | 364 | r#" |
365 | enum E { A { x: usize }, B } | 365 | enum E { |
366 | A { x: usize }, | ||
367 | B | ||
368 | } | ||
366 | 369 | ||
367 | fn test(x: &i32) { | 370 | fn test(x: &i32) { |
368 | let y = x; | 371 | let y = x; |