Skip to content

Commit ace86e8

Browse files
committed
[ConstraintSystem] Switch "missing conformance" fix/diagnostic to use protocol type
Switch type allows "missing conformance" diagnostic to be used not only for protocols by for protocol compositions as well.
1 parent 2ad3cac commit ace86e8

File tree

5 files changed

+18
-15
lines changed

5 files changed

+18
-15
lines changed

lib/Sema/CSDiagnostics.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -324,14 +324,15 @@ class RequirementFailure : public FailureDiagnostic {
324324
/// ```
325325
class MissingConformanceFailure final : public RequirementFailure {
326326
Type NonConformingType;
327-
ProtocolDecl *Protocol;
327+
Type ProtocolType;
328328

329329
public:
330330
MissingConformanceFailure(Expr *expr, ConstraintSystem &cs,
331331
ConstraintLocator *locator,
332-
std::pair<Type, ProtocolDecl *> conformance)
332+
std::pair<Type, Type> conformance)
333333
: RequirementFailure(cs, expr, RequirementKind::Conformance, locator),
334-
NonConformingType(conformance.first), Protocol(conformance.second) {}
334+
NonConformingType(conformance.first), ProtocolType(conformance.second) {
335+
}
335336

336337
bool diagnoseAsError() override;
337338

@@ -341,7 +342,7 @@ class MissingConformanceFailure final : public RequirementFailure {
341342
Type getLHS() const override { return NonConformingType; }
342343

343344
/// The protocol generic requirement expected associated type to conform to.
344-
Type getRHS() const override { return Protocol->getDeclaredType(); }
345+
Type getRHS() const override { return ProtocolType; }
345346

346347
protected:
347348
DiagOnDecl getDiagnosticOnDecl() const override {

lib/Sema/CSFix.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -161,15 +161,15 @@ RelabelArguments::create(ConstraintSystem &cs,
161161

162162
bool MissingConformance::diagnose(Expr *root, bool asNote) const {
163163
MissingConformanceFailure failure(root, getConstraintSystem(), getLocator(),
164-
{NonConformingType, Protocol});
164+
{NonConformingType, ProtocolType});
165165
return failure.diagnose(asNote);
166166
}
167167

168168
MissingConformance *MissingConformance::create(ConstraintSystem &cs, Type type,
169-
ProtocolDecl *protocol,
169+
Type protocolType,
170170
ConstraintLocator *locator) {
171171
return new (cs.getAllocator())
172-
MissingConformance(cs, type, protocol, locator);
172+
MissingConformance(cs, type, protocolType, locator);
173173
}
174174

175175
bool SkipSameTypeRequirement::diagnose(Expr *root, bool asNote) const {

lib/Sema/CSFix.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -364,12 +364,13 @@ class RelabelArguments final
364364
/// Add a new conformance to the type to satisfy a requirement.
365365
class MissingConformance final : public ConstraintFix {
366366
Type NonConformingType;
367-
ProtocolDecl *Protocol;
367+
// This could either be a protocol or protocol composition.
368+
Type ProtocolType;
368369

369-
MissingConformance(ConstraintSystem &cs, Type type, ProtocolDecl *protocol,
370+
MissingConformance(ConstraintSystem &cs, Type type, Type protocolType,
370371
ConstraintLocator *locator)
371372
: ConstraintFix(cs, FixKind::AddConformance, locator),
372-
NonConformingType(type), Protocol(protocol) {}
373+
NonConformingType(type), ProtocolType(protocolType) {}
373374

374375
public:
375376
std::string getName() const override {
@@ -379,12 +380,12 @@ class MissingConformance final : public ConstraintFix {
379380
bool diagnose(Expr *root, bool asNote = false) const override;
380381

381382
static MissingConformance *create(ConstraintSystem &cs, Type type,
382-
ProtocolDecl *protocol,
383+
Type protocolType,
383384
ConstraintLocator *locator);
384385

385386
Type getNonConformingType() { return NonConformingType; }
386387

387-
ProtocolDecl *getProtocol() { return Protocol; }
388+
Type getProtocolType() { return ProtocolType; }
388389
};
389390

390391
/// Skip same-type generic requirement constraint,

lib/Sema/CSSimplify.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3352,8 +3352,9 @@ ConstraintSystem::SolutionKind ConstraintSystem::simplifyConformsToConstraint(
33523352
return SolutionKind::Error;
33533353
}
33543354

3355-
auto *fix = MissingConformance::create(*this, type, protocol,
3356-
getConstraintLocator(locator));
3355+
auto *fix =
3356+
MissingConformance::create(*this, type, protocol->getDeclaredType(),
3357+
getConstraintLocator(locator));
33573358
if (!recordFix(fix))
33583359
return SolutionKind::Solved;
33593360
}

lib/Sema/TypeCheckProtocol.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -710,7 +710,7 @@ static Optional<RequirementMatch> findMissingGenericRequirementForSolutionFix(
710710
auto missingConform = (MissingConformance *)fix;
711711
requirementKind = RequirementKind::Conformance;
712712
type = missingConform->getNonConformingType();
713-
missingType = missingConform->getProtocol()->getDeclaredType();
713+
missingType = missingConform->getProtocolType();
714714
break;
715715
}
716716
case FixKind::SkipSameTypeRequirement: {

0 commit comments

Comments
 (0)