Skip to content

Commit 5956544

Browse files
authored
Merge pull request swiftlang#63176 from xymus/ambiguous-fixes
[ModuleInterface] Don't alias the stdlib or builtin modules in alias module names mode
2 parents 93d4fa5 + c8ca517 commit 5956544

File tree

3 files changed

+78
-8
lines changed

3 files changed

+78
-8
lines changed

lib/Frontend/ModuleInterfaceSupport.cpp

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -69,15 +69,24 @@ static void printToolVersionAndFlagsComment(raw_ostream &out,
6969
out << " -module-alias " << MODULE_DISAMBIGUATING_PREFIX <<
7070
moduleName << "=" << moduleName;
7171

72-
SmallVector<ImportedModule> imports;
73-
M->getImportedModules(imports,
74-
{ModuleDecl::ImportFilterKind::Default,
72+
ModuleDecl::ImportFilter filter = {ModuleDecl::ImportFilterKind::Default,
7573
ModuleDecl::ImportFilterKind::Exported,
76-
ModuleDecl::ImportFilterKind::SPIOnly,
77-
ModuleDecl::ImportFilterKind::SPIAccessControl});
74+
ModuleDecl::ImportFilterKind::SPIAccessControl};
75+
if (Opts.PrintPrivateInterfaceContent)
76+
filter |= ModuleDecl::ImportFilterKind::SPIOnly;
77+
78+
SmallVector<ImportedModule> imports;
79+
M->getImportedModules(imports, filter);
7880
M->getMissingImportedModules(imports);
81+
7982
for (ImportedModule import: imports) {
8083
StringRef importedName = import.importedModule->getNameStr();
84+
// Skip Swift as it's commonly used in inlinable code,
85+
// and Builtin as it's imported implicitly by name.
86+
if (importedName == STDLIB_NAME ||
87+
importedName == BUILTIN_NAME)
88+
continue;
89+
8190
if (AliasModuleNamesTargets.insert(importedName).second) {
8291
out << " -module-alias " << MODULE_DISAMBIGUATING_PREFIX <<
8392
importedName << "=" << importedName;
@@ -212,7 +221,9 @@ static void diagnoseScopedImports(DiagnosticEngine &diags,
212221
/// source declarations.
213222
static void printImports(raw_ostream &out,
214223
ModuleInterfaceOptions const &Opts,
215-
ModuleDecl *M) {
224+
ModuleDecl *M,
225+
const llvm::SmallSet<StringRef, 4>
226+
&AliasModuleNamesTargets) {
216227
// FIXME: This is very similar to what's in Serializer::writeInputBlock, but
217228
// it's not obvious what higher-level optimization would be factored out here.
218229
ModuleDecl::ImportFilter allImportFilter = {
@@ -322,7 +333,8 @@ static void printImports(raw_ostream &out,
322333
}
323334

324335
out << "import ";
325-
if (Opts.AliasModuleNames)
336+
if (Opts.AliasModuleNames &&
337+
AliasModuleNamesTargets.contains(importedModule->getName().str()))
326338
out << MODULE_DISAMBIGUATING_PREFIX;
327339
importedModule->getReverseFullModuleName().printForward(out);
328340

@@ -786,7 +798,7 @@ bool swift::emitSwiftInterface(raw_ostream &out,
786798
llvm::SmallSet<StringRef, 4> aliasModuleNamesTargets;
787799
printToolVersionAndFlagsComment(out, Opts, M, aliasModuleNamesTargets);
788800

789-
printImports(out, Opts, M);
801+
printImports(out, Opts, M, aliasModuleNamesTargets);
790802

791803
static bool forceUseExportedModuleNameInPublicOnly =
792804
getenv("SWIFT_DEBUG_USE_EXPORTED_MODULE_NAME_IN_PUBLIC_ONLY");
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/// Test the generated swiftinterface with -alias-module-names-in-module-interface.
2+
3+
// RUN: %empty-directory(%t)
4+
// RUN: split-file %s %t
5+
6+
// RUN: %target-swift-frontend -emit-module \
7+
// RUN: -swift-version 5 -enable-library-evolution \
8+
// RUN: -o %t/PublicLib.swiftmodule %t/EmptyLib.swift
9+
// RUN: %target-swift-frontend -emit-module \
10+
// RUN: -swift-version 5 -enable-library-evolution \
11+
// RUN: -o %t/SPILib.swiftmodule %t/EmptyLib.swift
12+
// RUN: %target-swift-frontend -emit-module \
13+
// RUN: -swift-version 5 -enable-library-evolution \
14+
// RUN: -o %t/IOILib.swiftmodule %t/EmptyLib.swift
15+
16+
// RUN: %target-swift-frontend -emit-module \
17+
// RUN: -swift-version 5 -enable-library-evolution \
18+
// RUN: -o %t/Client.swiftmodule \
19+
// RUN: -emit-module-interface-path %t/Client.swiftinterface \
20+
// RUN: -emit-private-module-interface-path %t/Client.private.swiftinterface \
21+
// RUN: %t/Client.swift -I %t -experimental-spi-only-imports \
22+
// RUN: -alias-module-names-in-module-interface -parse-stdlib
23+
// RUN: %target-swift-typecheck-module-from-interface(%t/Client.swiftinterface) -I%t
24+
// RUN: %target-swift-typecheck-module-from-interface(%t/Client.private.swiftinterface) -module-name Client -I%t
25+
26+
// RUN: cat %t/Client.swiftinterface | %FileCheck %s -check-prefix=PUBLIC
27+
// RUN: cat %t/Client.private.swiftinterface | %FileCheck %s -check-prefix=PRIVATE
28+
29+
//--- EmptyLib.swift
30+
31+
public struct SomeType {}
32+
33+
//--- Client.swift
34+
35+
@_implementationOnly import IOILib
36+
@_spiOnly import SPILib
37+
import PublicLib
38+
39+
/// Check alias declarations.
40+
// PUBLIC-NOT: IOILib
41+
// PUBLIC-NOT: SPILib
42+
// PUBLIC: -module-alias Module___PublicLib
43+
// PRIVATE-NOT: IOILib
44+
// PRIVATE: -module-alias Module___SPILib
45+
// PRIVATE: -module-alias Module___PublicLib
46+
47+
/// Check imports.
48+
// PUBLIC: import Module___PublicLib
49+
// PRIVATE: import Module___PublicLib
50+
// PRIVATE: import Module___SPILib
51+
52+
public func builtinUser(_ a: Builtin.Int32) {}
53+
54+
@inlinable
55+
public func builtinInlinableUser() {
56+
var a: Builtin.Int32
57+
}

test/ModuleInterface/ambiguous-aliases-workaround.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ public struct SomeType {
7777
@inlinable
7878
public func inlinableFunc() {
7979
var x: AmbiguousClientName
80+
var y: Swift.Int
8081
}
8182
}
8283

0 commit comments

Comments
 (0)