Skip to content

Commit dfe3d49

Browse files
committed
IDE: Fix my own lazyness in SynthesizedExtensionAnalyzer::Implementation::isApplicable()
Fixes #76561
1 parent cdc2145 commit dfe3d49

File tree

1 file changed

+23
-34
lines changed

1 file changed

+23
-34
lines changed

lib/IDE/IDETypeChecking.cpp

Lines changed: 23 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -333,10 +333,6 @@ struct SynthesizedExtensionAnalyzer::Implementation {
333333
ProtocolDecl *BaseProto = OwningExt->getInnermostDeclContext()
334334
->getSelfProtocolDecl();
335335
for (auto Req : Reqs) {
336-
// FIXME: Don't skip layout requirements.
337-
if (Req.getKind() == RequirementKind::Layout)
338-
continue;
339-
340336
// Skip protocol's Self : <Protocol> requirement.
341337
if (BaseProto &&
342338
Req.getKind() == RequirementKind::Conformance &&
@@ -357,40 +353,33 @@ struct SynthesizedExtensionAnalyzer::Implementation {
357353
}
358354

359355
assert(!Req.getFirstType()->hasArchetype());
360-
assert(!Req.getSecondType()->hasArchetype());
361-
362-
auto SubstReq = Req.subst(
363-
[&](Type type) -> Type {
364-
if (type->isTypeParameter())
365-
return Target->mapTypeIntoContext(type);
366-
367-
return type;
368-
},
369-
LookUpConformanceInModule());
356+
if (Req.getKind() != RequirementKind::Layout)
357+
assert(!Req.getSecondType()->hasArchetype());
370358

371359
SmallVector<Requirement, 2> subReqs;
372-
switch (SubstReq.checkRequirement(subReqs)) {
373-
case CheckRequirementResult::Success:
374-
break;
375-
376-
case CheckRequirementResult::ConditionalConformance:
377-
// FIXME: Need to handle conditional requirements here!
378-
break;
379-
380-
case CheckRequirementResult::PackRequirement:
381-
// FIXME
382-
assert(false && "Refactor this");
383-
return true;
384-
385-
case CheckRequirementResult::SubstitutionFailure:
386-
return true;
387-
388-
case CheckRequirementResult::RequirementFailure:
389-
if (!SubstReq.canBeSatisfied())
360+
subReqs.push_back(
361+
Req.subst(
362+
QueryInterfaceTypeSubstitutions(Target->getGenericEnvironment()),
363+
LookUpConformanceInModule()));
364+
365+
while (!subReqs.empty()) {
366+
auto req = subReqs.pop_back_val();
367+
switch (req.checkRequirement(subReqs)) {
368+
case CheckRequirementResult::Success:
369+
case CheckRequirementResult::PackRequirement:
370+
case CheckRequirementResult::ConditionalConformance:
371+
break;
372+
373+
case CheckRequirementResult::SubstitutionFailure:
390374
return true;
391375

392-
MergeInfo.addRequirement(Req);
393-
break;
376+
case CheckRequirementResult::RequirementFailure:
377+
if (!req.canBeSatisfied())
378+
return true;
379+
380+
MergeInfo.addRequirement(Req);
381+
break;
382+
}
394383
}
395384
}
396385
return false;

0 commit comments

Comments
 (0)