Skip to content

Commit 024eb8f

Browse files
committed
touchup
1 parent 22b60d6 commit 024eb8f

File tree

1 file changed

+32
-43
lines changed

1 file changed

+32
-43
lines changed

toolchain/check/type_completion.cpp

Lines changed: 32 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
112125
static 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

Comments
 (0)