@@ -6456,6 +6456,43 @@ DefaultInitializerIsolation::evaluate(Evaluator &evaluator,
6456
6456
return requiredIsolation;
6457
6457
}
6458
6458
6459
+ std::optional<DefaultIsolation>
6460
+ DefaultIsolationInSourceFileRequest::evaluate (Evaluator &evaluator,
6461
+ const SourceFile *file) const {
6462
+ llvm::SmallVector<Decl *> usingDecls;
6463
+ llvm::copy_if (file->getTopLevelDecls (), std::back_inserter (usingDecls),
6464
+ [](Decl *D) { return isa<UsingDecl>(D); });
6465
+
6466
+ if (usingDecls.empty ())
6467
+ return std::nullopt;
6468
+
6469
+ std::optional<std::pair<Decl *, DefaultIsolation>> isolation;
6470
+
6471
+ auto setIsolation = [&isolation](Decl *D, DefaultIsolation newIsolation) {
6472
+ if (isolation) {
6473
+ D->diagnose (diag::invalid_redecl_of_file_isolation);
6474
+ isolation->first ->diagnose (diag::invalid_redecl_of_file_isolation_prev);
6475
+ return ;
6476
+ }
6477
+
6478
+ isolation = std::make_pair (D, newIsolation);
6479
+ };
6480
+
6481
+ for (auto *D : usingDecls) {
6482
+ switch (cast<UsingDecl>(D)->getSpecifier ()) {
6483
+ case UsingSpecifier::MainActor:
6484
+ setIsolation (D, DefaultIsolation::MainActor);
6485
+ break ;
6486
+ case UsingSpecifier::nonisolated:
6487
+ setIsolation (D, DefaultIsolation::Nonisolated);
6488
+ break ;
6489
+ }
6490
+ }
6491
+
6492
+ return isolation.has_value () ? std::optional (isolation->second )
6493
+ : std::nullopt;
6494
+ }
6495
+
6459
6496
void swift::checkOverrideActorIsolation (ValueDecl *value) {
6460
6497
if (isa<TypeDecl>(value))
6461
6498
return ;
0 commit comments