@@ -109,6 +109,19 @@ static auto MakeSpecificForRequireDecl(Context& context, SemIR::LocId loc_id,
109109 return MakeSpecific (context, loc_id, require_generic_id, arg_ids);
110110}
111111
112+ static auto GetFacetTypeInSpecific (Context& context, SemIR::InstId facet_type,
113+ SemIR::SpecificId specific_id)
114+ -> SemIR::FacetTypeId {
115+ auto const_facet_type = SemIR::GetConstantValueInSpecific (
116+ context.sem_ir (), specific_id, facet_type);
117+ auto facet_type_in_specific = context.insts ().TryGetAs <SemIR::FacetType>(
118+ context.constant_values ().GetInstId (const_facet_type));
119+ if (!facet_type_in_specific.has_value ()) {
120+ return SemIR::FacetTypeId::None;
121+ }
122+ return facet_type_in_specific->facet_type_id ;
123+ }
124+
112125static auto RequireCompleteFacetType (Context& context, SemIR::LocId loc_id,
113126 const SemIR::FacetType& facet_type,
114127 MakeDiagnosticBuilderFn diagnoser)
@@ -118,9 +131,8 @@ static auto RequireCompleteFacetType(Context& context, SemIR::LocId loc_id,
118131 auto next_facet_type_id = work.pop_back_val ();
119132 const auto & facet_type_info = context.facet_types ().Get (next_facet_type_id);
120133
121- auto require_complete_interface =
122- [&](SemIR::SpecificInterface req_interface) -> bool {
123- auto interface_id = req_interface.interface_id ;
134+ for (auto extends : facet_type_info.extend_constraints ) {
135+ auto interface_id = extends.interface_id ;
124136 const auto & interface = context.interfaces ().Get (interface_id);
125137 if (!interface.is_complete ()) {
126138 if (diagnoser) {
@@ -135,28 +147,21 @@ static auto RequireCompleteFacetType(Context& context, SemIR::LocId loc_id,
135147 context, interface, [&](const SemIR::RequireImpls& require) {
136148 if (require.extend_self ) {
137149 auto require_specific_id = MakeSpecificForRequireDecl (
138- context, loc_id, req_interface.specific_id ,
139- require.generic_id );
140- auto const_facet_type = SemIR::GetConstantValueInSpecific (
141- context.sem_ir (), require_specific_id,
142- require.facet_type_inst_id );
143- if (const_facet_type != SemIR::ErrorInst::ConstantId) {
144- auto facet_type = context.insts ().GetAs <SemIR::FacetType>(
145- context.constant_values ().GetInstId (const_facet_type));
146- work.push_back (facet_type.facet_type_id );
150+ context, loc_id, extends.specific_id , require.generic_id );
151+ auto facet_type_id = GetFacetTypeInSpecific (
152+ context, require.facet_type_inst_id , require_specific_id);
153+ if (facet_type_id.has_value ()) {
154+ work.push_back (facet_type_id);
147155 }
148156 }
149157 });
150158
151- if (req_interface .specific_id .has_value ()) {
152- ResolveSpecificDefinition (context, loc_id, req_interface .specific_id );
159+ if (extends .specific_id .has_value ()) {
160+ ResolveSpecificDefinition (context, loc_id, extends .specific_id );
153161 }
154- return true ;
155- };
156-
157- auto require_complete_named_constraint =
158- [&](SemIR::SpecificNamedConstraint req_constraint) -> bool {
159- auto named_constraint_id = req_constraint.named_constraint_id ;
162+ }
163+ for (auto extends : facet_type_info.extend_named_constraints ) {
164+ auto named_constraint_id = extends.named_constraint_id ;
160165 const auto & constraint =
161166 context.named_constraints ().Get (named_constraint_id);
162167 if (!constraint.is_complete ()) {
@@ -172,33 +177,17 @@ static auto RequireCompleteFacetType(Context& context, SemIR::LocId loc_id,
172177 context, constraint, [&](const SemIR::RequireImpls& require) {
173178 if (require.extend_self ) {
174179 auto require_specific_id = MakeSpecificForRequireDecl (
175- context, loc_id, req_constraint.specific_id ,
176- require.generic_id );
177- auto const_facet_type = SemIR::GetConstantValueInSpecific (
178- context.sem_ir (), require_specific_id,
179- require.facet_type_inst_id );
180- if (const_facet_type != SemIR::ErrorInst::ConstantId) {
181- auto facet_type = context.insts ().GetAs <SemIR::FacetType>(
182- context.constant_values ().GetInstId (const_facet_type));
183- work.push_back (facet_type.facet_type_id );
180+ context, loc_id, extends.specific_id , require.generic_id );
181+ auto facet_type_id = GetFacetTypeInSpecific (
182+ context, require.facet_type_inst_id , require_specific_id);
183+ if (facet_type_id.has_value ()) {
184+ work.push_back (facet_type_id);
184185 }
185186 }
186187 });
187188
188- if (req_constraint.specific_id .has_value ()) {
189- ResolveSpecificDefinition (context, loc_id, req_constraint.specific_id );
190- }
191- return true ;
192- };
193-
194- for (auto extends : facet_type_info.extend_constraints ) {
195- if (!require_complete_interface (extends)) {
196- return false ;
197- }
198- }
199- for (auto extends : facet_type_info.extend_named_constraints ) {
200- if (!require_complete_named_constraint (extends)) {
201- return false ;
189+ if (extends.specific_id .has_value ()) {
190+ ResolveSpecificDefinition (context, loc_id, extends.specific_id );
202191 }
203192 }
204193 }
0 commit comments