@@ -39,6 +39,33 @@ enum class DowngradeToWarning: bool {
39
39
Yes
40
40
};
41
41
42
+ // / Calls \p callback for each type in each requirement provided by
43
+ // / \p source.
44
+ static void forAllRequirementTypes (
45
+ WhereClauseOwner source,
46
+ llvm::function_ref<void (Type, TypeRepr *)> callback) {
47
+ RequirementRequest::visitRequirements (
48
+ source, TypeResolutionStage::Interface,
49
+ [&](const Requirement &req, RequirementRepr* reqRepr) {
50
+ switch (req.getKind ()) {
51
+ case RequirementKind::Conformance:
52
+ case RequirementKind::SameType:
53
+ case RequirementKind::Superclass:
54
+ callback (req.getFirstType (),
55
+ RequirementRepr::getFirstTypeRepr (reqRepr));
56
+ callback (req.getSecondType (),
57
+ RequirementRepr::getSecondTypeRepr (reqRepr));
58
+ break ;
59
+
60
+ case RequirementKind::Layout:
61
+ callback (req.getFirstType (),
62
+ RequirementRepr::getFirstTypeRepr (reqRepr));
63
+ break ;
64
+ }
65
+ return false ;
66
+ });
67
+ }
68
+
42
69
// / \see checkTypeAccess
43
70
using CheckTypeAccessCallback =
44
71
void (AccessScope, const TypeRepr *, DowngradeToWarning);
@@ -69,7 +96,12 @@ class AccessControlCheckerBase {
69
96
WhereClauseOwner source,
70
97
AccessScope accessScope,
71
98
const DeclContext *useDC,
72
- llvm::function_ref<CheckTypeAccessCallback> diagnose);
99
+ llvm::function_ref<CheckTypeAccessCallback> diagnose) {
100
+ forAllRequirementTypes (source, [&](Type type, TypeRepr *typeRepr) {
101
+ checkTypeAccessImpl (type, typeRepr, accessScope, useDC,
102
+ /* mayBeInferred*/ false , diagnose);
103
+ });
104
+ }
73
105
74
106
AccessControlCheckerBase (TypeChecker &TC, bool checkUsableFromInline)
75
107
: TC(TC), checkUsableFromInline(checkUsableFromInline) {}
@@ -280,39 +312,6 @@ static void highlightOffendingType(TypeChecker &TC, InFlightDiagnostic &diag,
280
312
}
281
313
}
282
314
283
- void AccessControlCheckerBase::checkRequirementAccess (
284
- WhereClauseOwner source,
285
- AccessScope accessScope,
286
- const DeclContext *useDC,
287
- llvm::function_ref<CheckTypeAccessCallback> diagnose) {
288
- RequirementRequest::visitRequirements (
289
- source, TypeResolutionStage::Interface,
290
- [&](const Requirement &req, RequirementRepr* reqRepr) {
291
- switch (req.getKind ()) {
292
- case RequirementKind::Conformance:
293
- case RequirementKind::SameType:
294
- case RequirementKind::Superclass:
295
- checkTypeAccessImpl (req.getFirstType (),
296
- RequirementRepr::getFirstTypeRepr (reqRepr),
297
- accessScope, useDC, /* mayBeInferred*/ false ,
298
- diagnose);
299
- checkTypeAccessImpl (req.getSecondType (),
300
- RequirementRepr::getSecondTypeRepr (reqRepr),
301
- accessScope, useDC, /* mayBeInferred*/ false ,
302
- diagnose);
303
- break ;
304
-
305
- case RequirementKind::Layout:
306
- checkTypeAccessImpl (req.getFirstType (),
307
- RequirementRepr::getFirstTypeRepr (reqRepr),
308
- accessScope, useDC, /* mayBeInferred*/ false ,
309
- diagnose);
310
- break ;
311
- }
312
- return false ;
313
- });
314
- }
315
-
316
315
void AccessControlCheckerBase::checkGenericParamAccess (
317
316
const GenericParamList *params,
318
317
const Decl *owner,
0 commit comments