diff options
Diffstat (limited to 'crates/ra_hir/src/ty.rs')
-rw-r--r-- | crates/ra_hir/src/ty.rs | 29 |
1 files changed, 16 insertions, 13 deletions
diff --git a/crates/ra_hir/src/ty.rs b/crates/ra_hir/src/ty.rs index bc842dd26..57fd1ed2a 100644 --- a/crates/ra_hir/src/ty.rs +++ b/crates/ra_hir/src/ty.rs | |||
@@ -904,39 +904,39 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
904 | } | 904 | } |
905 | } | 905 | } |
906 | 906 | ||
907 | fn infer_tuple_struct(&mut self, path: Option<&Path>, sub_pats: &[PatId]) -> Ty { | 907 | fn infer_tuple_struct(&mut self, path: Option<&Path>, subpats: &[PatId]) -> Ty { |
908 | let (ty, fields) = if let Some(x) = self.resolve_fields(path) { | 908 | let (ty, fields) = if let Some(x) = self.resolve_fields(path) { |
909 | x | 909 | x |
910 | } else { | 910 | } else { |
911 | return Ty::Unknown; | 911 | return Ty::Unknown; |
912 | }; | 912 | }; |
913 | 913 | ||
914 | if fields.len() != sub_pats.len() { | 914 | if fields.len() != subpats.len() { |
915 | return Ty::Unknown; | 915 | return Ty::Unknown; |
916 | } | 916 | } |
917 | 917 | ||
918 | for (&sub_pat, field) in sub_pats.iter().zip(fields.iter()) { | 918 | for (&subpat, field) in subpats.iter().zip(fields.iter()) { |
919 | let sub_ty = self.make_ty(&field.type_ref); | 919 | let sub_ty = self.make_ty(&field.type_ref); |
920 | self.infer_pat(sub_pat, &Expectation::has_type(sub_ty)); | 920 | self.infer_pat(subpat, &Expectation::has_type(sub_ty)); |
921 | } | 921 | } |
922 | 922 | ||
923 | ty | 923 | ty |
924 | } | 924 | } |
925 | 925 | ||
926 | fn infer_struct(&mut self, path: Option<&Path>, sub_pats: &[FieldPat]) -> Ty { | 926 | fn infer_struct(&mut self, path: Option<&Path>, subpats: &[FieldPat]) -> Ty { |
927 | let (ty, fields) = if let Some(x) = self.resolve_fields(path) { | 927 | let (ty, fields) = if let Some(x) = self.resolve_fields(path) { |
928 | x | 928 | x |
929 | } else { | 929 | } else { |
930 | return Ty::Unknown; | 930 | return Ty::Unknown; |
931 | }; | 931 | }; |
932 | 932 | ||
933 | for sub_pat in sub_pats { | 933 | for subpat in subpats { |
934 | let matching_field = fields.iter().find(|field| field.name == sub_pat.name); | 934 | let matching_field = fields.iter().find(|field| field.name == subpat.name); |
935 | 935 | ||
936 | if let Some(field) = matching_field { | 936 | if let Some(field) = matching_field { |
937 | let typeref = &field.type_ref; | 937 | let typeref = &field.type_ref; |
938 | let sub_ty = self.make_ty(typeref); | 938 | let sub_ty = self.make_ty(typeref); |
939 | self.infer_pat(sub_pat.pat, &Expectation::has_type(sub_ty)); | 939 | self.infer_pat(subpat.pat, &Expectation::has_type(sub_ty)); |
940 | } | 940 | } |
941 | } | 941 | } |
942 | 942 | ||
@@ -979,8 +979,8 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
979 | } | 979 | } |
980 | Pat::TupleStruct { | 980 | Pat::TupleStruct { |
981 | path: ref p, | 981 | path: ref p, |
982 | args: ref sub_pats, | 982 | args: ref subpats, |
983 | } => self.infer_tuple_struct(p.as_ref(), sub_pats), | 983 | } => self.infer_tuple_struct(p.as_ref(), subpats), |
984 | Pat::Struct { | 984 | Pat::Struct { |
985 | path: ref p, | 985 | path: ref p, |
986 | args: ref fields, | 986 | args: ref fields, |
@@ -995,12 +995,15 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
995 | Pat::Bind { | 995 | Pat::Bind { |
996 | mode, | 996 | mode, |
997 | name: _name, | 997 | name: _name, |
998 | sub_pat, | 998 | subpat, |
999 | } => { | 999 | } => { |
1000 | let subty = if let Some(subpat) = sub_pat { | 1000 | let subty = if let Some(subpat) = subpat { |
1001 | self.infer_pat(*subpat, expected) | 1001 | self.infer_pat(*subpat, expected) |
1002 | } else { | 1002 | } else { |
1003 | Ty::Unknown | 1003 | let ty = self.new_type_var(); |
1004 | self.unify(&ty, &expected.ty); | ||
1005 | let ty = self.resolve_ty_as_possible(ty); | ||
1006 | ty | ||
1004 | }; | 1007 | }; |
1005 | 1008 | ||
1006 | match mode { | 1009 | match mode { |