Allow loading package interface if in same package.

Add a new flag to enable package interface loading.
Use the last value of package-name in case of dupes.
Rename PrintInterfaceContentMode as InterfaceMode.
Update diagnostics.
Test package interface loading with various scenarios.
Test duplicate package-name.
This commit is contained in:
Ellie Shin
2023-11-08 17:40:40 -08:00
parent aba3b6c24e
commit e5ca8e5c0b
18 changed files with 316 additions and 140 deletions

View File

@@ -71,8 +71,10 @@ static void printToolVersionAndFlagsComment(raw_ostream &out,
ModuleDecl::ImportFilter filter = {ModuleDecl::ImportFilterKind::Default,
ModuleDecl::ImportFilterKind::Exported};
if (Opts.InterfaceContentMode != PrintInterfaceContentMode::Public)
if (Opts.InterfaceContentMode != InterfaceMode::Public)
filter |= ModuleDecl::ImportFilterKind::SPIOnly;
if (Opts.InterfaceContentMode == InterfaceMode::Package)
filter |= ModuleDecl::ImportFilterKind::PackageOnly;
SmallVector<ImportedModule> imports;
M->getImportedModules(imports, filter);
@@ -99,7 +101,7 @@ static void printToolVersionAndFlagsComment(raw_ostream &out,
<< Opts.IgnorableFlags << "\n";
}
auto hasPrivateIgnorableFlags = Opts.InterfaceContentMode != PrintInterfaceContentMode::Public && !Opts.IgnorablePrivateFlags.empty();
auto hasPrivateIgnorableFlags = Opts.InterfaceContentMode != InterfaceMode::Public && !Opts.IgnorablePrivateFlags.empty();
if (hasPrivateIgnorableFlags) {
out << "// " SWIFT_MODULE_FLAGS_IGNORABLE_PRIVATE_KEY ": "
<< Opts.IgnorablePrivateFlags << "\n";
@@ -245,7 +247,7 @@ static void printImports(raw_ostream &out,
// imports only if they are also SPI. First, list all implementation-only imports and
// filter them later.
llvm::SmallSet<ImportedModule, 4, ImportedModule::Order> ioiImportSet;
if (Opts.InterfaceContentMode != PrintInterfaceContentMode::Public && Opts.ExperimentalSPIImports) {
if (Opts.InterfaceContentMode != InterfaceMode::Public && Opts.ExperimentalSPIImports) {
SmallVector<ImportedModule, 4> ioiImports, allImports;
M->getImportedModules(ioiImports,
@@ -266,7 +268,7 @@ static void printImports(raw_ostream &out,
/// Collect @_spiOnly imports that are not imported elsewhere publicly.
llvm::SmallSet<ImportedModule, 4, ImportedModule::Order> spiOnlyImportSet;
if (Opts.InterfaceContentMode != PrintInterfaceContentMode::Public) {
if (Opts.InterfaceContentMode != InterfaceMode::Public) {
SmallVector<ImportedModule, 4> spiOnlyImports, otherImports;
M->getImportedModules(spiOnlyImports,
ModuleDecl::ImportFilterKind::SPIOnly);
@@ -333,7 +335,7 @@ static void printImports(raw_ostream &out,
if (publicImportSet.count(import))
out << "@_exported ";
if (Opts.InterfaceContentMode != PrintInterfaceContentMode::Public) {
if (Opts.InterfaceContentMode != InterfaceMode::Public) {
// An import visible in the private or package swiftinterface only.
//
// In the long term, we want to print this attribute for consistency and
@@ -621,7 +623,7 @@ public:
return;
// Skip SPI extensions in the public interface.
if (printOptions.InterfaceContentMode == PrintInterfaceContentMode::Public && extension->isSPI())
if (printOptions.InterfaceContentMode == InterfaceMode::Public && extension->isSPI())
return;
const NominalTypeDecl *nominal = extension->getExtendedNominal();
@@ -702,7 +704,7 @@ public:
inherited->isSpecificProtocol(KnownProtocolKind::Actor))
return TypeWalker::Action::SkipChildren;
if (inherited->isSPI() && printOptions.InterfaceContentMode == PrintInterfaceContentMode::Public)
if (inherited->isSPI() && printOptions.InterfaceContentMode == InterfaceMode::Public)
return TypeWalker::Action::Continue;
if (isPublicOrUsableFromInline(inherited) &&
@@ -782,7 +784,7 @@ public:
return false;
assert(nominal->isGenericContext());
if (printOptions.InterfaceContentMode != PrintInterfaceContentMode::Public)
if (printOptions.InterfaceContentMode != InterfaceMode::Public)
out << "@_spi(" << DummyProtocolName << ")\n";
out << "@available(*, unavailable)\nextension ";
nominal->getDeclaredType().print(out, printOptions);
@@ -823,7 +825,7 @@ bool swift::emitSwiftInterface(raw_ostream &out,
printImports(out, Opts, M, aliasModuleNamesTargets);
bool useExportedModuleNames = Opts.InterfaceContentMode == PrintInterfaceContentMode::Public;
bool useExportedModuleNames = Opts.InterfaceContentMode == InterfaceMode::Public;
const PrintOptions printOptions = PrintOptions::printSwiftInterfaceFile(
M, Opts.PreserveTypesAsWritten, Opts.PrintFullConvention,