Skip to content

Commit a16644c

Browse files
committed
[Sema] Factor out common code from resolveSingleWitness/ValueWitnesses
No functionality change.
1 parent f116799 commit a16644c

File tree

3 files changed

+32
-66
lines changed

3 files changed

+32
-66
lines changed

lib/Sema/TypeCheckProtocol.cpp

Lines changed: 25 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3355,6 +3355,28 @@ CheckTypeWitnessResult swift::checkTypeWitness(TypeChecker &tc, DeclContext *dc,
33553355
return CheckTypeWitnessResult();
33563356
}
33573357

3358+
ResolveWitnessResult
3359+
ConformanceChecker::resolveWitnessTryingAllStrategies(ValueDecl *requirement) {
3360+
decltype(&ConformanceChecker::resolveWitnessViaLookup) strategies[] = {
3361+
&ConformanceChecker::resolveWitnessViaLookup,
3362+
&ConformanceChecker::resolveWitnessViaDerivation,
3363+
&ConformanceChecker::resolveWitnessViaDefault};
3364+
3365+
for (auto strategy : strategies) {
3366+
ResolveWitnessResult result = (this->*strategy)(requirement);
3367+
switch (result) {
3368+
case ResolveWitnessResult::Success:
3369+
case ResolveWitnessResult::ExplicitFailed:
3370+
return result;
3371+
case ResolveWitnessResult::Missing:
3372+
// Continue trying.
3373+
break;
3374+
}
3375+
}
3376+
3377+
return ResolveWitnessResult::Missing;
3378+
}
3379+
33583380
/// Attempt to resolve a type witness via member name lookup.
33593381
ResolveWitnessResult ConformanceChecker::resolveTypeWitnessViaLookup(
33603382
AssociatedTypeDecl *assocType) {
@@ -3784,38 +3806,8 @@ void ConformanceChecker::resolveValueWitnesses() {
37843806
if (isa<AccessorDecl>(requirement))
37853807
continue;
37863808

3787-
// Try to resolve the witness via explicit definitions.
3788-
switch (resolveWitnessViaLookup(requirement)) {
3789-
case ResolveWitnessResult::Success:
3790-
finalizeWitness();
3791-
continue;
3792-
3793-
case ResolveWitnessResult::ExplicitFailed:
3794-
Conformance->setInvalid();
3795-
continue;
3796-
3797-
case ResolveWitnessResult::Missing:
3798-
// Continue trying below.
3799-
break;
3800-
}
3801-
3802-
// Try to resolve the witness via derivation.
3803-
switch (resolveWitnessViaDerivation(requirement)) {
3804-
case ResolveWitnessResult::Success:
3805-
finalizeWitness();
3806-
continue;
3807-
3808-
case ResolveWitnessResult::ExplicitFailed:
3809-
Conformance->setInvalid();
3810-
continue;
3811-
3812-
case ResolveWitnessResult::Missing:
3813-
// Continue trying below.
3814-
break;
3815-
}
3816-
3817-
// Try to resolve the witness via defaults.
3818-
switch (resolveWitnessViaDefault(requirement)) {
3809+
// Try to resolve the witness.
3810+
switch (resolveWitnessTryingAllStrategies(requirement)) {
38193811
case ResolveWitnessResult::Success:
38203812
finalizeWitness();
38213813
continue;
@@ -3825,7 +3817,7 @@ void ConformanceChecker::resolveValueWitnesses() {
38253817
continue;
38263818

38273819
case ResolveWitnessResult::Missing:
3828-
// Continue trying below.
3820+
// Let it get diagnosed later.
38293821
break;
38303822
}
38313823
}

lib/Sema/TypeCheckProtocol.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -629,6 +629,11 @@ class ConformanceChecker : public WitnessChecker {
629629
/// Resolve a (non-type) witness via default definition or optional.
630630
ResolveWitnessResult resolveWitnessViaDefault(ValueDecl *requirement);
631631

632+
/// Resolve a (non-type) witness by trying each standard strategy until one
633+
/// of them produces a result.
634+
ResolveWitnessResult
635+
resolveWitnessTryingAllStrategies(ValueDecl *requirement);
636+
632637
/// Attempt to resolve a type witness via member name lookup.
633638
ResolveWitnessResult resolveTypeWitnessViaLookup(
634639
AssociatedTypeDecl *assocType);

lib/Sema/TypeCheckProtocolInference.cpp

Lines changed: 2 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2083,38 +2083,8 @@ void ConformanceChecker::resolveSingleWitness(ValueDecl *requirement) {
20832083
}
20842084
}
20852085

2086-
// Try to resolve the witness via explicit definitions.
2087-
switch (resolveWitnessViaLookup(requirement)) {
2088-
case ResolveWitnessResult::Success:
2089-
return;
2090-
2091-
case ResolveWitnessResult::ExplicitFailed:
2092-
Conformance->setInvalid();
2093-
recordInvalidWitness(requirement);
2094-
return;
2095-
2096-
case ResolveWitnessResult::Missing:
2097-
// Continue trying below.
2098-
break;
2099-
}
2100-
2101-
// Try to resolve the witness via derivation.
2102-
switch (resolveWitnessViaDerivation(requirement)) {
2103-
case ResolveWitnessResult::Success:
2104-
return;
2105-
2106-
case ResolveWitnessResult::ExplicitFailed:
2107-
Conformance->setInvalid();
2108-
recordInvalidWitness(requirement);
2109-
return;
2110-
2111-
case ResolveWitnessResult::Missing:
2112-
// Continue trying below.
2113-
break;
2114-
}
2115-
2116-
// Try to resolve the witness via defaults.
2117-
switch (resolveWitnessViaDefault(requirement)) {
2086+
// Try to resolve the witness.
2087+
switch (resolveWitnessTryingAllStrategies(requirement)) {
21182088
case ResolveWitnessResult::Success:
21192089
return;
21202090

@@ -2125,6 +2095,5 @@ void ConformanceChecker::resolveSingleWitness(ValueDecl *requirement) {
21252095

21262096
case ResolveWitnessResult::Missing:
21272097
llvm_unreachable("Should have failed");
2128-
break;
21292098
}
21302099
}

0 commit comments

Comments
 (0)