@@ -6456,6 +6456,43 @@ DefaultInitializerIsolation::evaluate(Evaluator &evaluator,
64566456 return requiredIsolation;
64576457}
64586458
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+
64596496void swift::checkOverrideActorIsolation (ValueDecl *value) {
64606497 if (isa<TypeDecl>(value))
64616498 return ;
0 commit comments