Skip to content

Commit 7ffe361

Browse files
committed
Sema: Clean up generic signature checking
1 parent 99c7889 commit 7ffe361

File tree

3 files changed

+63
-98
lines changed

3 files changed

+63
-98
lines changed

include/swift/AST/GenericSignatureBuilder.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -626,8 +626,7 @@ class GenericSignatureBuilder {
626626
/// where \c Dictionary requires that its key type be \c Hashable,
627627
/// the requirement \c K : Hashable is inferred from the parameter type,
628628
/// because the type \c Dictionary<K,V> cannot be formed without it.
629-
void inferRequirements(ModuleDecl &module, ParameterList *params,
630-
GenericParamList *genericParams);
629+
void inferRequirements(ModuleDecl &module, ParameterList *params);
631630

632631
/// \brief Finalize the set of requirements and compute the generic
633632
/// signature.

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5458,11 +5458,7 @@ void GenericSignatureBuilder::inferRequirements(
54585458

54595459
void GenericSignatureBuilder::inferRequirements(
54605460
ModuleDecl &module,
5461-
ParameterList *params,
5462-
GenericParamList *genericParams) {
5463-
if (genericParams == nullptr)
5464-
return;
5465-
5461+
ParameterList *params) {
54665462
for (auto P : *params) {
54675463
inferRequirements(module, P->getTypeLoc().getType(),
54685464
P->getTypeLoc().getTypeRepr(),

lib/Sema/TypeCheckGeneric.cpp

Lines changed: 61 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -33,19 +33,14 @@ using namespace swift;
3333

3434
/// Check the generic parameters in the given generic parameter list (and its
3535
/// parent generic parameter lists) according to the given resolver.
36-
void checkGenericParamList(TypeChecker &tc,
37-
GenericSignatureBuilder *builder,
38-
GenericParamList *genericParams,
39-
GenericSignature *parentSig,
40-
TypeResolution resolution) {
36+
static void checkGenericParamList(TypeChecker &tc,
37+
GenericSignatureBuilder *builder,
38+
GenericParamList *genericParams,
39+
GenericSignature *parentSig,
40+
TypeResolution resolution) {
4141
// If there is a parent context, add the generic parameters and requirements
4242
// from that context.
43-
if (builder)
44-
builder->addGenericSignature(parentSig);
45-
46-
// If there aren't any generic parameters at this level, we're done.
47-
if (!genericParams)
48-
return;
43+
builder->addGenericSignature(parentSig);
4944

5045
assert(genericParams->size() > 0 &&
5146
"Parsed an empty generic parameter list?");
@@ -57,58 +52,52 @@ void checkGenericParamList(TypeChecker &tc,
5752
// First, add the generic parameters to the generic signature builder.
5853
// Do this before checking the inheritance clause, since it may
5954
// itself be dependent on one of these parameters.
60-
if (builder) {
61-
for (auto param : *genericParams)
62-
builder->addGenericParameter(param);
63-
}
55+
for (auto param : *genericParams)
56+
builder->addGenericParameter(param);
6457

6558
// Add the requirements for each of the generic parameters to the builder.
6659
// Now, check the inheritance clauses of each parameter.
67-
if (builder) {
68-
for (auto param : *genericParams)
69-
builder->addGenericParameterRequirements(param);
70-
}
71-
60+
for (auto param : *genericParams)
61+
builder->addGenericParameterRequirements(param);
7262

7363
// Add the requirements clause to the builder.
74-
if (builder) {
75-
WhereClauseOwner owner(resolution.getDeclContext(), genericParams);
76-
using FloatingRequirementSource =
77-
GenericSignatureBuilder::FloatingRequirementSource;
78-
RequirementRequest::visitRequirements(owner, resolution.getStage(),
79-
[&](const Requirement &req, RequirementRepr *reqRepr) {
80-
auto source = FloatingRequirementSource::forExplicit(reqRepr);
81-
82-
// If we're extending a protocol and adding a redundant requirement,
83-
// for example, `extension Foo where Self: Foo`, then emit a
84-
// diagnostic.
85-
86-
if (auto decl = owner.dc->getAsDecl()) {
87-
if (auto extDecl = dyn_cast<ExtensionDecl>(decl)) {
88-
auto extType = extDecl->getExtendedType();
89-
auto extSelfType = extDecl->getSelfInterfaceType();
90-
auto reqLHSType = req.getFirstType();
91-
auto reqRHSType = req.getSecondType();
64+
65+
WhereClauseOwner owner(resolution.getDeclContext(), genericParams);
66+
using FloatingRequirementSource =
67+
GenericSignatureBuilder::FloatingRequirementSource;
68+
RequirementRequest::visitRequirements(owner, resolution.getStage(),
69+
[&](const Requirement &req, RequirementRepr *reqRepr) {
70+
auto source = FloatingRequirementSource::forExplicit(reqRepr);
71+
72+
// If we're extending a protocol and adding a redundant requirement,
73+
// for example, `extension Foo where Self: Foo`, then emit a
74+
// diagnostic.
75+
76+
if (auto decl = owner.dc->getAsDecl()) {
77+
if (auto extDecl = dyn_cast<ExtensionDecl>(decl)) {
78+
auto extType = extDecl->getExtendedType();
79+
auto extSelfType = extDecl->getSelfInterfaceType();
80+
auto reqLHSType = req.getFirstType();
81+
auto reqRHSType = req.getSecondType();
82+
83+
if (extType->isExistentialType() &&
84+
reqLHSType->isEqual(extSelfType) &&
85+
reqRHSType->isEqual(extType)) {
9286

93-
if (extType->isExistentialType() &&
94-
reqLHSType->isEqual(extSelfType) &&
95-
reqRHSType->isEqual(extType)) {
96-
97-
auto &ctx = extDecl->getASTContext();
98-
ctx.Diags.diagnose(extDecl->getLoc(),
99-
diag::protocol_extension_redundant_requirement,
100-
extType->getString(),
101-
extSelfType->getString(),
102-
reqRHSType->getString());
103-
}
87+
auto &ctx = extDecl->getASTContext();
88+
ctx.Diags.diagnose(extDecl->getLoc(),
89+
diag::protocol_extension_redundant_requirement,
90+
extType->getString(),
91+
extSelfType->getString(),
92+
reqRHSType->getString());
10493
}
10594
}
106-
107-
builder->addRequirement(req, reqRepr, source, nullptr,
108-
lookupDC->getParentModule());
109-
return false;
110-
});
111-
}
95+
}
96+
97+
builder->addRequirement(req, reqRepr, source, nullptr,
98+
lookupDC->getParentModule());
99+
return false;
100+
});
112101
}
113102

114103
std::string
@@ -168,8 +157,6 @@ TypeChecker::prepareGenericParamList(GenericParamList *gp,
168157
/// Add the generic parameter types from the given list to the vector.
169158
static void addGenericParamTypes(GenericParamList *gpList,
170159
SmallVectorImpl<GenericTypeParamType *> &params) {
171-
if (!gpList) return;
172-
173160
for (auto gpDecl : *gpList) {
174161
params.push_back(
175162
gpDecl->getDeclaredInterfaceType()->castTo<GenericTypeParamType>());
@@ -198,12 +185,13 @@ static void checkGenericFuncSignature(TypeChecker &tc,
198185
GenericSignatureBuilder *builder,
199186
AbstractFunctionDecl *func,
200187
TypeResolution resolution) {
201-
// Check the generic parameter list.
202-
auto genericParams = func->getGenericParams();
203-
204-
checkGenericParamList(tc, builder, genericParams,
205-
func->getDeclContext()->getGenericSignatureOfContext(),
206-
resolution);
188+
if (builder) {
189+
// Check the generic parameter list.
190+
checkGenericParamList(tc, builder,
191+
func->getGenericParams(),
192+
func->getDeclContext()->getGenericSignatureOfContext(),
193+
resolution);
194+
}
207195

208196
// Check the parameter patterns.
209197
auto params = func->getParameters();
@@ -213,8 +201,7 @@ static void checkGenericFuncSignature(TypeChecker &tc,
213201

214202
// Infer requirements from the pattern.
215203
if (builder) {
216-
builder->inferRequirements(*func->getParentModule(), params,
217-
genericParams);
204+
builder->inferRequirements(*func->getParentModule(), params);
218205
}
219206

220207
// If there is a declared result type, check that as well.
@@ -228,7 +215,7 @@ static void checkGenericFuncSignature(TypeChecker &tc,
228215
tc.validateType(fn->getBodyResultTypeLoc(), resolution, options);
229216

230217
// Infer requirements from it.
231-
if (builder && genericParams &&
218+
if (builder &&
232219
fn->getBodyResultTypeLoc().getTypeRepr()) {
233220
auto source =
234221
GenericSignatureBuilder::FloatingRequirementSource::forInferred(
@@ -569,20 +556,21 @@ static void checkGenericSubscriptSignature(TypeChecker &tc,
569556
SubscriptDecl *subscript,
570557
TypeResolution resolution) {
571558
// Check the generic parameter list.
572-
auto genericParams = subscript->getGenericParams();
573-
574559
auto *dc = subscript->getDeclContext();
575560

576-
checkGenericParamList(tc, builder, genericParams,
577-
dc->getGenericSignatureOfContext(),
578-
resolution);
561+
if (builder) {
562+
checkGenericParamList(tc, builder,
563+
subscript->getGenericParams(),
564+
dc->getGenericSignatureOfContext(),
565+
resolution);
566+
}
579567

580568
// Check the element type.
581569
tc.validateType(subscript->getElementTypeLoc(), resolution,
582570
TypeResolverContext::FunctionResult);
583571

584572
// Infer requirements from it.
585-
if (genericParams && builder) {
573+
if (builder) {
586574
auto source =
587575
GenericSignatureBuilder::FloatingRequirementSource::forInferred(
588576
subscript->getElementTypeLoc().getTypeRepr());
@@ -601,8 +589,7 @@ static void checkGenericSubscriptSignature(TypeChecker &tc,
601589

602590
// Infer requirements from the pattern.
603591
if (builder) {
604-
builder->inferRequirements(*subscript->getParentModule(), params,
605-
genericParams);
592+
builder->inferRequirements(*subscript->getParentModule(), params);
606593
}
607594
}
608595

@@ -773,23 +760,6 @@ GenericEnvironment *TypeChecker::checkGenericEnvironment(
773760
sig = ext->getSelfNominalTypeDecl()->getGenericSignatureOfContext();
774761
}
775762

776-
if (recursivelyVisitGenericParams) {
777-
visitOuterToInner(genericParams,
778-
[&](GenericParamList *gpList) {
779-
auto paramsDC = gpList->getParams().front()->getDeclContext();
780-
TypeResolution interfaceResolution =
781-
TypeResolution::forInterface(paramsDC, sig);
782-
checkGenericParamList(*this, nullptr, gpList, nullptr,
783-
interfaceResolution);
784-
});
785-
} else {
786-
auto paramsDC = genericParams->getParams().front()->getDeclContext();
787-
TypeResolution interfaceResolution =
788-
TypeResolution::forInterface(paramsDC, sig);
789-
checkGenericParamList(*this, nullptr, genericParams, parentSig,
790-
interfaceResolution);
791-
}
792-
793763
// Form the generic environment.
794764
return sig->createGenericEnvironment();
795765
}

0 commit comments

Comments
 (0)