mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
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:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user