mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-04 20:31:10 +01:00
Given `fn f(T:! I, x: T)`, we have a facet type `I`, a facet value `T` and a value `x` of type `FacetAccessType(T)`. Previously we explicitly handled the case of member access on `x.F` where the type is a `FacetAccessType` by looking through it at the facet value, and then at its facet type. This is already something that impl lookup does for us, so we can remove this special case. We also previously had a complex branch handling the case `T.F` on a facet value, because `PerformImplLookup()` in member access is expecting a `TypeId`, not a facet value. However, the first thing that branch does is convert the facet value to a type expression, forming a `FacetAccessType`. Unfortuntely, when combined, if we had `x.F` we would convert it from a value of type `FacetAccessType` to a facet value, and then convert that to a type as a `FacetAccessType` again. We see this extra `FacetAccessType` disappear from the SemIR after this change. In this change, we remove both the inlined replacement of `PerformImplLookup()` and the explicit handling of `FacetAccessType`. We drive all member access lookups on the `base_id`'s type through a single `PerformImplLookup()` call. If the `base_id` is a facet value, to get the TypeId to look into, we convert the facet value to a `FacetAccessType`, reducing the complex special cases down to a single line.