diff options
Diffstat (limited to 'crates/hir_ty/src/infer/expr.rs')
-rw-r--r-- | crates/hir_ty/src/infer/expr.rs | 45 |
1 files changed, 33 insertions, 12 deletions
diff --git a/crates/hir_ty/src/infer/expr.rs b/crates/hir_ty/src/infer/expr.rs index 19249973c..3f3187ea2 100644 --- a/crates/hir_ty/src/infer/expr.rs +++ b/crates/hir_ty/src/infer/expr.rs | |||
@@ -443,27 +443,47 @@ impl<'a> InferenceContext<'a> { | |||
443 | }, | 443 | }, |
444 | ) | 444 | ) |
445 | .find_map(|derefed_ty| { | 445 | .find_map(|derefed_ty| { |
446 | let def_db = self.db.upcast(); | ||
447 | let module = self.resolver.module(); | ||
448 | let is_visible = |field_id: &FieldId| { | ||
449 | module | ||
450 | .map(|mod_id| { | ||
451 | self.db.field_visibilities(field_id.parent)[field_id.local_id] | ||
452 | .is_visible_from(def_db, mod_id) | ||
453 | }) | ||
454 | .unwrap_or(true) | ||
455 | }; | ||
446 | match canonicalized.decanonicalize_ty(derefed_ty.value).interned(&Interner) { | 456 | match canonicalized.decanonicalize_ty(derefed_ty.value).interned(&Interner) { |
447 | TyKind::Tuple(_, substs) => { | 457 | TyKind::Tuple(_, substs) => { |
448 | name.as_tuple_index().and_then(|idx| substs.0.get(idx).cloned()) | 458 | name.as_tuple_index().and_then(|idx| substs.0.get(idx).cloned()) |
449 | } | 459 | } |
450 | TyKind::Adt(AdtId(hir_def::AdtId::StructId(s)), parameters) => { | 460 | TyKind::Adt(AdtId(hir_def::AdtId::StructId(s)), parameters) => { |
451 | self.db.struct_data(*s).variant_data.field(name).map(|local_id| { | 461 | let local_id = self.db.struct_data(*s).variant_data.field(name)?; |
452 | let field = FieldId { parent: (*s).into(), local_id }; | 462 | let field = FieldId { parent: (*s).into(), local_id }; |
463 | if is_visible(&field) { | ||
453 | self.write_field_resolution(tgt_expr, field); | 464 | self.write_field_resolution(tgt_expr, field); |
454 | self.db.field_types((*s).into())[field.local_id] | 465 | Some( |
455 | .clone() | 466 | self.db.field_types((*s).into())[field.local_id] |
456 | .subst(¶meters) | 467 | .clone() |
457 | }) | 468 | .subst(¶meters), |
469 | ) | ||
470 | } else { | ||
471 | None | ||
472 | } | ||
458 | } | 473 | } |
459 | TyKind::Adt(AdtId(hir_def::AdtId::UnionId(u)), parameters) => { | 474 | TyKind::Adt(AdtId(hir_def::AdtId::UnionId(u)), parameters) => { |
460 | self.db.union_data(*u).variant_data.field(name).map(|local_id| { | 475 | let local_id = self.db.union_data(*u).variant_data.field(name)?; |
461 | let field = FieldId { parent: (*u).into(), local_id }; | 476 | let field = FieldId { parent: (*u).into(), local_id }; |
477 | if is_visible(&field) { | ||
462 | self.write_field_resolution(tgt_expr, field); | 478 | self.write_field_resolution(tgt_expr, field); |
463 | self.db.field_types((*u).into())[field.local_id] | 479 | Some( |
464 | .clone() | 480 | self.db.field_types((*u).into())[field.local_id] |
465 | .subst(¶meters) | 481 | .clone() |
466 | }) | 482 | .subst(¶meters), |
483 | ) | ||
484 | } else { | ||
485 | None | ||
486 | } | ||
467 | } | 487 | } |
468 | _ => None, | 488 | _ => None, |
469 | } | 489 | } |
@@ -828,6 +848,7 @@ impl<'a> InferenceContext<'a> { | |||
828 | self.trait_env.clone(), | 848 | self.trait_env.clone(), |
829 | krate, | 849 | krate, |
830 | &traits_in_scope, | 850 | &traits_in_scope, |
851 | self.resolver.module(), | ||
831 | method_name, | 852 | method_name, |
832 | ) | 853 | ) |
833 | }); | 854 | }); |