Skip to content

Commit 0f0ae58

Browse files
committed
Factor out Type-in-Requirement visiting from access checking
I wish there was more we could share with the upcoming implementation-only checker, but I don't see an obvious way to do it. All the call sites want to know what kind of declaration they're visiting in order to customize the diagnostic, or downgrade something to a warning, or something else. No functionality change.
1 parent 6c05389 commit 0f0ae58

File tree

1 file changed

+33
-34
lines changed

1 file changed

+33
-34
lines changed

lib/Sema/TypeCheckAccess.cpp

Lines changed: 33 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,33 @@ enum class DowngradeToWarning: bool {
3939
Yes
4040
};
4141

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+
4269
/// \see checkTypeAccess
4370
using CheckTypeAccessCallback =
4471
void(AccessScope, const TypeRepr *, DowngradeToWarning);
@@ -69,7 +96,12 @@ class AccessControlCheckerBase {
6996
WhereClauseOwner source,
7097
AccessScope accessScope,
7198
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+
}
73105

74106
AccessControlCheckerBase(TypeChecker &TC, bool checkUsableFromInline)
75107
: TC(TC), checkUsableFromInline(checkUsableFromInline) {}
@@ -280,39 +312,6 @@ static void highlightOffendingType(TypeChecker &TC, InFlightDiagnostic &diag,
280312
}
281313
}
282314

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-
316315
void AccessControlCheckerBase::checkGenericParamAccess(
317316
const GenericParamList *params,
318317
const Decl *owner,

0 commit comments

Comments
 (0)