Skip to content

Commit 415b7bc

Browse files
committed
Sema: Begin untangling diagnoseMissingWitnesses()
1 parent 0b0ad73 commit 415b7bc

File tree

3 files changed

+17
-16
lines changed

3 files changed

+17
-16
lines changed

lib/Sema/TypeCheckProtocol.cpp

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1957,7 +1957,8 @@ void MultiConformanceChecker::checkAllConformances() {
19571957
for (auto It = AllUsedCheckers.rbegin(); It != AllUsedCheckers.rend();
19581958
++It) {
19591959
if (!It->getLocalMissingWitness().empty()) {
1960-
if (It->diagnoseMissingWitnesses(MissingWitnessDiagnosisKind::FixItOnly))
1960+
if (It->diagnoseMissingWitnesses(MissingWitnessDiagnosisKind::FixItOnly,
1961+
/*Delayed=*/false))
19611962
break;
19621963
}
19631964
}
@@ -3862,7 +3863,7 @@ static ArrayRef<MissingWitness> pruneMissingWitnesses(
38623863
}
38633864

38643865
bool ConformanceChecker::
3865-
diagnoseMissingWitnesses(MissingWitnessDiagnosisKind Kind) {
3866+
diagnoseMissingWitnesses(MissingWitnessDiagnosisKind Kind, bool Delayed) {
38663867
auto LocalMissing = getLocalMissingWitness();
38673868

38683869
SmallVector<MissingWitness, 4> MissingWitnessScratch;
@@ -4004,18 +4005,19 @@ diagnoseMissingWitnesses(MissingWitnessDiagnosisKind Kind) {
40044005
case MissingWitnessDiagnosisKind::ErrorFixIt: {
40054006
const auto MissingWitnesses = filterProtocolRequirements(
40064007
GlobalMissingWitnesses.getArrayRef(), Adoptee);
4007-
if (SuppressDiagnostics) {
4008+
if (Delayed) {
40084009
// If the diagnostics are suppressed, we register these missing witnesses
40094010
// for later revisiting.
40104011
Conformance->setInvalid();
40114012
getASTContext().addDelayedMissingWitnesses(
40124013
Conformance,
40134014
std::make_unique<DelayedMissingWitnesses>(MissingWitnesses));
40144015
} else {
4016+
auto Loc = this->Loc;
40154017
diagnoseOrDefer(
40164018
LocalMissing[0].requirement, true,
4017-
[&](NormalProtocolConformance *Conf) {
4018-
InsertFixit(Conf, Loc, IsEditorMode, std::move(MissingWitnesses));
4019+
[InsertFixit, Loc, IsEditorMode, MissingWitnesses](NormalProtocolConformance *Conf) {
4020+
InsertFixit(Conf, Loc, IsEditorMode, MissingWitnesses);
40194021
});
40204022
}
40214023
clearGlobalMissingWitnesses();
@@ -5505,14 +5507,14 @@ void ConformanceChecker::checkConformance(MissingWitnessDiagnosisKind Kind) {
55055507
ensureRequirementsAreSatisfied();
55065508

55075509
// Diagnose missing type witnesses for now.
5508-
diagnoseMissingWitnesses(Kind);
5509-
5510-
// Diagnose missing value witnesses later.
5511-
SWIFT_DEFER { diagnoseMissingWitnesses(Kind); };
5510+
diagnoseMissingWitnesses(Kind, /*Delayed=*/false);
55125511

55135512
// Check non-type requirements.
55145513
resolveValueWitnesses();
55155514

5515+
// Diagnose missing value witnesses.
5516+
diagnoseMissingWitnesses(Kind, /*Delayed=*/false);
5517+
55165518
emitDelayedDiags();
55175519

55185520
// Except in specific hardcoded cases for Foundation/Swift
@@ -6985,7 +6987,8 @@ TypeWitnessRequest::evaluate(Evaluator &eval,
69856987
ConformanceChecker checker(requirement->getASTContext(), conformance,
69866988
MissingWitnesses);
69876989
checker.resolveSingleTypeWitness(requirement);
6988-
checker.diagnoseMissingWitnesses(MissingWitnessDiagnosisKind::ErrorFixIt);
6990+
checker.diagnoseMissingWitnesses(MissingWitnessDiagnosisKind::ErrorFixIt,
6991+
/*Delayed=*/true);
69896992
// FIXME: ConformanceChecker and the other associated WitnessCheckers have
69906993
// an extremely convoluted caching scheme that doesn't fit nicely into the
69916994
// evaluator's model. All of this should be refactored away.
@@ -7003,7 +7006,8 @@ ValueWitnessRequest::evaluate(Evaluator &eval,
70037006
ConformanceChecker checker(requirement->getASTContext(), conformance,
70047007
MissingWitnesses);
70057008
checker.resolveSingleWitness(requirement);
7006-
checker.diagnoseMissingWitnesses(MissingWitnessDiagnosisKind::ErrorFixIt);
7009+
checker.diagnoseMissingWitnesses(MissingWitnessDiagnosisKind::ErrorFixIt,
7010+
/*Delayed=*/true);
70077011
// FIXME: ConformanceChecker and the other associated WitnessCheckers have
70087012
// an extremely convoluted caching scheme that doesn't fit nicely into the
70097013
// evaluator's model. All of this should be refactored away.

lib/Sema/TypeCheckProtocol.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -889,7 +889,8 @@ class ConformanceChecker : public WitnessChecker {
889889
/// Call this to diagnose currently known missing witnesses.
890890
///
891891
/// \returns true if any witnesses were diagnosed.
892-
bool diagnoseMissingWitnesses(MissingWitnessDiagnosisKind Kind);
892+
bool diagnoseMissingWitnesses(MissingWitnessDiagnosisKind Kind,
893+
bool Delayed);
893894

894895
/// Emit any diagnostics that have been delayed.
895896
void emitDelayedDiags();

lib/Sema/TypeCheckProtocolInference.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2993,10 +2993,6 @@ void ConformanceChecker::resolveTypeWitnesses() {
29932993

29942994
void ConformanceChecker::resolveSingleTypeWitness(
29952995
AssociatedTypeDecl *assocType) {
2996-
// Ensure we diagnose if the witness is missing.
2997-
SWIFT_DEFER {
2998-
diagnoseMissingWitnesses(MissingWitnessDiagnosisKind::ErrorFixIt);
2999-
};
30002996
switch (resolveTypeWitnessViaLookup(assocType)) {
30012997
case ResolveWitnessResult::Success:
30022998
case ResolveWitnessResult::ExplicitFailed:

0 commit comments

Comments
 (0)