@@ -33,19 +33,14 @@ using namespace swift;
33
33
34
34
// / Check the generic parameters in the given generic parameter list (and its
35
35
// / 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) {
41
41
// If there is a parent context, add the generic parameters and requirements
42
42
// 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);
49
44
50
45
assert (genericParams->size () > 0 &&
51
46
" Parsed an empty generic parameter list?" );
@@ -57,58 +52,52 @@ void checkGenericParamList(TypeChecker &tc,
57
52
// First, add the generic parameters to the generic signature builder.
58
53
// Do this before checking the inheritance clause, since it may
59
54
// 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);
64
57
65
58
// Add the requirements for each of the generic parameters to the builder.
66
59
// 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);
72
62
73
63
// 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)) {
92
86
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 ());
104
93
}
105
94
}
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
+ });
112
101
}
113
102
114
103
std::string
@@ -168,8 +157,6 @@ TypeChecker::prepareGenericParamList(GenericParamList *gp,
168
157
// / Add the generic parameter types from the given list to the vector.
169
158
static void addGenericParamTypes (GenericParamList *gpList,
170
159
SmallVectorImpl<GenericTypeParamType *> ¶ms) {
171
- if (!gpList) return ;
172
-
173
160
for (auto gpDecl : *gpList) {
174
161
params.push_back (
175
162
gpDecl->getDeclaredInterfaceType ()->castTo <GenericTypeParamType>());
@@ -198,12 +185,13 @@ static void checkGenericFuncSignature(TypeChecker &tc,
198
185
GenericSignatureBuilder *builder,
199
186
AbstractFunctionDecl *func,
200
187
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
+ }
207
195
208
196
// Check the parameter patterns.
209
197
auto params = func->getParameters ();
@@ -213,8 +201,7 @@ static void checkGenericFuncSignature(TypeChecker &tc,
213
201
214
202
// Infer requirements from the pattern.
215
203
if (builder) {
216
- builder->inferRequirements (*func->getParentModule (), params,
217
- genericParams);
204
+ builder->inferRequirements (*func->getParentModule (), params);
218
205
}
219
206
220
207
// If there is a declared result type, check that as well.
@@ -228,7 +215,7 @@ static void checkGenericFuncSignature(TypeChecker &tc,
228
215
tc.validateType (fn->getBodyResultTypeLoc (), resolution, options);
229
216
230
217
// Infer requirements from it.
231
- if (builder && genericParams &&
218
+ if (builder &&
232
219
fn->getBodyResultTypeLoc ().getTypeRepr ()) {
233
220
auto source =
234
221
GenericSignatureBuilder::FloatingRequirementSource::forInferred (
@@ -569,20 +556,21 @@ static void checkGenericSubscriptSignature(TypeChecker &tc,
569
556
SubscriptDecl *subscript,
570
557
TypeResolution resolution) {
571
558
// Check the generic parameter list.
572
- auto genericParams = subscript->getGenericParams ();
573
-
574
559
auto *dc = subscript->getDeclContext ();
575
560
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
+ }
579
567
580
568
// Check the element type.
581
569
tc.validateType (subscript->getElementTypeLoc (), resolution,
582
570
TypeResolverContext::FunctionResult);
583
571
584
572
// Infer requirements from it.
585
- if (genericParams && builder) {
573
+ if (builder) {
586
574
auto source =
587
575
GenericSignatureBuilder::FloatingRequirementSource::forInferred (
588
576
subscript->getElementTypeLoc ().getTypeRepr ());
@@ -601,8 +589,7 @@ static void checkGenericSubscriptSignature(TypeChecker &tc,
601
589
602
590
// Infer requirements from the pattern.
603
591
if (builder) {
604
- builder->inferRequirements (*subscript->getParentModule (), params,
605
- genericParams);
592
+ builder->inferRequirements (*subscript->getParentModule (), params);
606
593
}
607
594
}
608
595
@@ -773,23 +760,6 @@ GenericEnvironment *TypeChecker::checkGenericEnvironment(
773
760
sig = ext->getSelfNominalTypeDecl ()->getGenericSignatureOfContext ();
774
761
}
775
762
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
-
793
763
// Form the generic environment.
794
764
return sig->createGenericEnvironment ();
795
765
}
0 commit comments