aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/ty.rs
diff options
context:
space:
mode:
authorMarcus Klaas de Vries <[email protected]>2019-01-17 12:40:45 +0000
committerAleksey Kladov <[email protected]>2019-01-19 12:37:26 +0000
commit44e9a9605b2b3916669182ba091599d59653c497 (patch)
tree0bdeef63c2a1523ca69dda856226979f9a78f606 /crates/ra_hir/src/ty.rs
parentd48d5b8b6ca59b462b3a84dad9868daff2eddb6d (diff)
Fixup annotated bindings
Diffstat (limited to 'crates/ra_hir/src/ty.rs')
-rw-r--r--crates/ra_hir/src/ty.rs29
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 {