@@ -578,8 +578,10 @@ findMemberReference(Expr *expr) {
578
578
return None;
579
579
}
580
580
581
- void swift::checkActorIsolation (const Expr *expr, const DeclContext *dc) {
582
- class ActorIsolationWalker : public ASTWalker {
581
+ namespace {
582
+ // / Check for adherence to the actor isolation rules, emitting errors
583
+ // / when actor-isolated declarations are used in an unsafe manner.
584
+ class ActorIsolationChecker : public ASTWalker {
583
585
ASTContext &ctx;
584
586
SmallVector<const DeclContext *, 4 > contextStack;
585
587
@@ -588,18 +590,22 @@ void swift::checkActorIsolation(const Expr *expr, const DeclContext *dc) {
588
590
}
589
591
590
592
public:
591
- ActorIsolationWalker (const DeclContext *dc) : ctx(dc->getASTContext ()) {
593
+ ActorIsolationChecker (const DeclContext *dc) : ctx(dc->getASTContext ()) {
592
594
contextStack.push_back (dc);
593
595
}
594
596
595
- bool shouldWalkIntoSeparatelyCheckedClosure (ClosureExpr *expr) override {
596
- return false ;
597
- }
598
-
599
597
bool shouldWalkCaptureInitializerExpressions () override { return true ; }
600
598
601
599
bool shouldWalkIntoTapExpression () override { return false ; }
602
600
601
+ bool walkToDeclPre (Decl *D) override {
602
+ // Don't walk into functions; they'll be handled separately.
603
+ if (isa<AbstractFunctionDecl>(D))
604
+ return false ;
605
+
606
+ return true ;
607
+ }
608
+
603
609
std::pair<bool , Expr *> walkToExprPre (Expr *expr) override {
604
610
if (auto *closure = dyn_cast<AbstractClosureExpr>(expr)) {
605
611
contextStack.push_back (closure);
@@ -1011,9 +1017,38 @@ void swift::checkActorIsolation(const Expr *expr, const DeclContext *dc) {
1011
1017
llvm_unreachable (" unhandled actor isolation kind!" );
1012
1018
}
1013
1019
};
1020
+ }
1021
+
1022
+ void swift::checkTopLevelActorIsolation (TopLevelCodeDecl *decl) {
1023
+ ActorIsolationChecker checker (decl);
1024
+ decl->getBody ()->walk (checker);
1025
+ }
1026
+
1027
+ void swift::checkFunctionActorIsolation (AbstractFunctionDecl *decl) {
1028
+ ActorIsolationChecker checker (decl);
1029
+ if (auto body = decl->getBody ()) {
1030
+ body->walk (checker);
1031
+ }
1032
+ if (auto ctor = dyn_cast<ConstructorDecl>(decl))
1033
+ if (auto superInit = ctor->getSuperInitCall ())
1034
+ superInit->walk (checker);
1035
+ }
1036
+
1037
+ void swift::checkInitializerActorIsolation (Initializer *init, Expr *expr) {
1038
+ ActorIsolationChecker checker (init);
1039
+ expr->walk (checker);
1040
+ }
1041
+
1042
+ void swift::checkEnumElementActorIsolation (
1043
+ EnumElementDecl *element, Expr *expr) {
1044
+ ActorIsolationChecker checker (element);
1045
+ expr->walk (checker);
1046
+ }
1014
1047
1015
- ActorIsolationWalker walker (dc);
1016
- const_cast <Expr *>(expr)->walk (walker);
1048
+ void swift::checkPropertyWrapperActorIsolation (
1049
+ PatternBindingDecl *binding, Expr *expr) {
1050
+ ActorIsolationChecker checker (binding->getDeclContext ());
1051
+ expr->walk (checker);
1017
1052
}
1018
1053
1019
1054
// / Determine actor isolation solely from attributes.
0 commit comments