AST/Sema: Look up custom availability domains by name.

Store the domain definitions defined on the command line on the `ModuleDecl` for
the main module.
This commit is contained in:
Allan Shortlidge
2025-01-30 16:29:29 -08:00
parent f9799aeba9
commit 770ddad742
6 changed files with 92 additions and 37 deletions

View File

@@ -17,6 +17,7 @@
#include "swift/Frontend/Frontend.h"
#include "swift/AST/ASTContext.h"
#include "swift/AST/AvailabilityDomain.h"
#include "swift/AST/DiagnosticsFrontend.h"
#include "swift/AST/DiagnosticsSema.h"
#include "swift/AST/FileSystem.h"
@@ -29,6 +30,7 @@
#include "swift/Basic/Platform.h"
#include "swift/Basic/SourceManager.h"
#include "swift/Basic/Statistic.h"
#include "swift/DependencyScan/ModuleDependencyScanner.h"
#include "swift/Frontend/CachingUtils.h"
#include "swift/Frontend/CompileJobCacheKey.h"
#include "swift/Frontend/ModuleInterfaceLoader.h"
@@ -36,17 +38,15 @@
#include "swift/SIL/SILModule.h"
#include "swift/SILOptimizer/PassManager/Passes.h"
#include "swift/SILOptimizer/Utils/Generics.h"
#include "swift/Serialization/ScanningLoaders.h"
#include "swift/Serialization/SerializationOptions.h"
#include "swift/Serialization/SerializedModuleLoader.h"
#include "swift/Serialization/ScanningLoaders.h"
#include "swift/DependencyScan/ModuleDependencyScanner.h"
#include "swift/Strings.h"
#include "swift/Subsystems.h"
#include "clang/AST/ASTContext.h"
#include "llvm/ADT/Hashing.h"
#include "llvm/ADT/IntrusiveRefCntPtr.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/TargetParser/Triple.h"
#include "llvm/CAS/ActionCache.h"
#include "llvm/CAS/BuiltinUnifiedCASDatabases.h"
#include "llvm/CAS/CASFileSystem.h"
@@ -55,8 +55,9 @@
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/Path.h"
#include "llvm/Support/Process.h"
#include "llvm/Support/VirtualOutputBackends.h"
#include "llvm/Support/ThreadPool.h"
#include "llvm/Support/VirtualOutputBackends.h"
#include "llvm/TargetParser/Triple.h"
#include <llvm/ADT/StringExtras.h>
using namespace swift;
@@ -1392,6 +1393,28 @@ bool CompilerInstance::createFilesForMainModule(
return false;
}
static void configureAvailabilityDomains(const ASTContext &ctx,
const FrontendOptions &opts,
ModuleDecl *mainModule) {
llvm::SmallDenseMap<Identifier, CustomAvailabilityDomain *> domainMap;
auto createAndInsertDomain = [&](const std::string &name,
CustomAvailabilityDomain::Kind kind) {
auto *domain = CustomAvailabilityDomain::create(
ctx, name, mainModule, CustomAvailabilityDomain::Kind::Enabled);
bool inserted = domainMap.insert({domain->getName(), domain}).second;
ASSERT(inserted); // Domains must be unique.
};
for (auto enabled : opts.AvailabilityDomains.EnabledDomains)
createAndInsertDomain(enabled, CustomAvailabilityDomain::Kind::Enabled);
for (auto disabled : opts.AvailabilityDomains.DisabledDomains)
createAndInsertDomain(disabled, CustomAvailabilityDomain::Kind::Disabled);
for (auto dynamic : opts.AvailabilityDomains.DynamicDomains)
createAndInsertDomain(dynamic, CustomAvailabilityDomain::Kind::Dynamic);
mainModule->setAvailabilityDomains(std::move(domainMap));
}
ModuleDecl *CompilerInstance::getMainModule() const {
if (MainModule)
return MainModule;
@@ -1441,6 +1464,9 @@ ModuleDecl *CompilerInstance::getMainModule() const {
if (Invocation.getLangOptions().hasFeature(Feature::WarnUnsafe))
MainModule->setStrictMemorySafety(true);
configureAvailabilityDomains(getASTContext(),
Invocation.getFrontendOptions(), MainModule);
if (!Invocation.getFrontendOptions()
.SwiftInterfaceCompilerVersion.empty()) {
auto compilerVersion =