Skip to content

Commit 0def52d

Browse files
committed
[DNM] Fix bridging to work with a split Foundation module
1 parent da17628 commit 0def52d

File tree

7 files changed

+99
-8
lines changed

7 files changed

+99
-8
lines changed

include/swift/AST/KnownIdentifiers.def

+3
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ IDENTIFIER(error)
5959
IDENTIFIER(errorDomain)
6060
IDENTIFIER(forKeyedSubscript)
6161
IDENTIFIER(Foundation)
62+
IDENTIFIER(SwiftFoundation)
63+
IDENTIFIER(FoundationSoil)
64+
IDENTIFIER(SwiftFoundationSoil)
6265
IDENTIFIER(for)
6366
IDENTIFIER(forKey)
6467
IDENTIFIER(from)

include/swift/SIL/BridgedTypes.def

+10-6
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,19 @@
3434
#define BRIDGING_KNOWN_TYPE(module, type)
3535
#endif
3636

37+
#ifndef BRIDGING_KNOWN_TYPE_WITH_MODULES_4
38+
#define BRIDGING_KNOWN_TYPE_WITH_MODULES_4(module1, module2, module3, module4, type)
39+
#endif
40+
3741
#ifndef BRIDGE_TYPE
3842
#define BRIDGE_TYPE(bmodule, btype, nmodule, ntype, opt)
3943
#endif
4044

41-
BRIDGING_KNOWN_TYPE(Foundation, NSString)
42-
BRIDGING_KNOWN_TYPE(Foundation, NSArray)
43-
BRIDGING_KNOWN_TYPE(Foundation, NSDictionary)
44-
BRIDGING_KNOWN_TYPE(Foundation, NSSet)
45-
BRIDGING_KNOWN_TYPE(Foundation, NSError)
45+
BRIDGING_KNOWN_TYPE_WITH_MODULES_4(SwiftFoundationSoil, SwiftFoundation, FoundationSoil, Foundation, NSString)
46+
BRIDGING_KNOWN_TYPE_WITH_MODULES_4(SwiftFoundationSoil, SwiftFoundation, FoundationSoil, Foundation, NSArray)
47+
BRIDGING_KNOWN_TYPE_WITH_MODULES_4(SwiftFoundationSoil, SwiftFoundation, FoundationSoil, Foundation, NSDictionary)
48+
BRIDGING_KNOWN_TYPE_WITH_MODULES_4(SwiftFoundationSoil, SwiftFoundation, FoundationSoil, Foundation, NSSet)
49+
BRIDGING_KNOWN_TYPE_WITH_MODULES_4(SwiftFoundationSoil, SwiftFoundation, FoundationSoil, Foundation, NSError)
4650
BRIDGING_KNOWN_TYPE(Swift, String)
4751
BRIDGING_KNOWN_TYPE(ObjectiveC, ObjCBool)
4852
BRIDGING_KNOWN_TYPE(ObjectiveC, Selector)
@@ -55,4 +59,4 @@ BRIDGE_TYPE(Darwin, DarwinBoolean, Swift, Bool, false)
5559

5660
#undef BRIDGING_KNOWN_TYPE
5761
#undef BRIDGE_TYPE
58-
62+
#undef BRIDGING_KNOWN_TYPE_WITH_MODULES_4

include/swift/SIL/TypeLowering.h

+4
Original file line numberDiff line numberDiff line change
@@ -697,6 +697,8 @@ class TypeConverter {
697697
// Types converted during foreign bridging.
698698
#define BRIDGING_KNOWN_TYPE(BridgedModule,BridgedType) \
699699
Optional<CanType> BridgedType##Ty;
700+
#define BRIDGING_KNOWN_TYPE_WITH_MODULES_4(_1, _2, _3, _4, BridgedType) \
701+
Optional<CanType> BridgedType##Ty;
700702
#include "swift/SIL/BridgedTypes.def"
701703

702704
const TypeLowering &
@@ -950,6 +952,8 @@ class TypeConverter {
950952
/// Known types for bridging.
951953
#define BRIDGING_KNOWN_TYPE(BridgedModule,BridgedType) \
952954
CanType get##BridgedType##Type();
955+
#define BRIDGING_KNOWN_TYPE_WITH_MODULES_4(_1, _2, _3, _4, BridgedType) \
956+
CanType get##BridgedType##Type();
953957
#include "swift/SIL/BridgedTypes.def"
954958

955959
/// Get the capture list from a closure, with transitive function captures

lib/AST/ASTContext.cpp

+11-1
Original file line numberDiff line numberDiff line change
@@ -848,7 +848,17 @@ StructDecl *ASTContext::getObjCBoolDecl() const {
848848
#define GET_FOUNDATION_DECL(NAME) \
849849
ClassDecl *ASTContext::get##NAME##Decl() const { \
850850
if (!getImpl().NAME##Decl) { \
851-
if (ModuleDecl *M = getLoadedModule(Id_Foundation)) { \
851+
ModuleDecl *M = getLoadedModule(Id_SwiftFoundationSoil); \
852+
if (!M) { \
853+
M = getLoadedModule(Id_SwiftFoundation); \
854+
} \
855+
if (!M) { \
856+
M = getLoadedModule(Id_FoundationSoil); \
857+
} \
858+
if (!M) { \
859+
M = getLoadedModule(Id_Foundation); \
860+
} \
861+
if (M) { \
852862
/* Note: use unqualified lookup so we find NSError regardless of */ \
853863
/* whether it's defined in the Foundation module or the Clang */ \
854864
/* Foundation module it imports. */ \

lib/SIL/SILFunctionType.cpp

+32
Original file line numberDiff line numberDiff line change
@@ -173,11 +173,43 @@ static CanType getKnownType(Optional<CanType> &cacheSlot, ASTContext &C,
173173
return t;
174174
}
175175

176+
static CanType getKnownTypeFromModules4(Optional<CanType> &cacheSlot, ASTContext &C,
177+
StringRef moduleName1, StringRef moduleName2,
178+
StringRef moduleName3, StringRef moduleName4,
179+
StringRef typeName) {
180+
181+
auto temporaryCacheSlot = Optional<CanType>();
182+
auto T = getKnownType(temporaryCacheSlot, C, moduleName1, typeName);
183+
184+
if (!T) {
185+
temporaryCacheSlot = Optional<CanType>();
186+
T = getKnownType(temporaryCacheSlot, C, moduleName2, typeName);
187+
}
188+
if (!T) {
189+
temporaryCacheSlot = Optional<CanType>();
190+
T = getKnownType(temporaryCacheSlot, C, moduleName3, typeName);
191+
}
192+
if (!T) {
193+
temporaryCacheSlot = Optional<CanType>();
194+
T = getKnownType(temporaryCacheSlot, C, moduleName4, typeName);
195+
}
196+
197+
cacheSlot = temporaryCacheSlot;
198+
return T;
199+
}
200+
176201
#define BRIDGING_KNOWN_TYPE(BridgedModule,BridgedType) \
177202
CanType TypeConverter::get##BridgedType##Type() { \
178203
return getKnownType(BridgedType##Ty, M.getASTContext(), \
179204
#BridgedModule, #BridgedType); \
180205
}
206+
#define BRIDGING_KNOWN_TYPE_WITH_MODULES_4(BridgedModule1,BridgedModule2,BridgedModule3,BridgedModule4,BridgedType) \
207+
CanType TypeConverter::get##BridgedType##Type() { \
208+
return getKnownTypeFromModules4(BridgedType##Ty, M.getASTContext(), \
209+
#BridgedModule1, #BridgedModule2, \
210+
#BridgedModule3, #BridgedModule4, \
211+
#BridgedType); \
212+
}
181213
#include "swift/SIL/BridgedTypes.def"
182214

183215
/// Adjust a function type to have a slightly different type.

lib/Sema/CSSimplify.cpp

+38
Original file line numberDiff line numberDiff line change
@@ -3539,7 +3539,12 @@ performMemberLookup(ConstraintKind constraintKind, DeclName memberName,
35393539
// a lookup into that Objective-C type.
35403540
if (bridgedType) {
35413541
LookupResult &bridgedLookup = lookupMember(bridgedType, memberName);
3542+
35423543
ModuleDecl *foundationModule = nullptr;
3544+
ModuleDecl *foundationSoilModule = nullptr;
3545+
ModuleDecl *swiftFoundationModule = nullptr;
3546+
ModuleDecl *swiftFoundationSoilModule = nullptr;
3547+
35433548
for (auto result : bridgedLookup) {
35443549
// Ignore results from the Objective-C "Foundation"
35453550
// module. Those core APIs are explicitly provided by the
@@ -3556,6 +3561,39 @@ performMemberLookup(ConstraintKind constraintKind, DeclName memberName,
35563561
continue;
35573562
}
35583563

3564+
if (foundationSoilModule) {
3565+
if (module == foundationSoilModule)
3566+
continue;
3567+
} else if (ClangModuleUnit::hasClangModule(module) &&
3568+
module->getName().str() == "FoundationSoil") {
3569+
// Cache the foundation module name so we don't need to look
3570+
// for it again.
3571+
foundationSoilModule = module;
3572+
continue;
3573+
}
3574+
3575+
if (swiftFoundationModule) {
3576+
if (module == swiftFoundationModule)
3577+
continue;
3578+
} else if (ClangModuleUnit::hasClangModule(module) &&
3579+
module->getName().str() == "SwiftFoundation") {
3580+
// Cache the foundation module name so we don't need to look
3581+
// for it again.
3582+
swiftFoundationModule = module;
3583+
continue;
3584+
}
3585+
3586+
if (swiftFoundationSoilModule) {
3587+
if (module == swiftFoundationSoilModule)
3588+
continue;
3589+
} else if (ClangModuleUnit::hasClangModule(module) &&
3590+
module->getName().str() == "SwiftFoundationSoil") {
3591+
// Cache the foundation module name so we don't need to look
3592+
// for it again.
3593+
swiftFoundationSoilModule = module;
3594+
continue;
3595+
}
3596+
35593597
addChoice(getOverloadChoice(result.getValueDecl(),
35603598
/*isBridged=*/true,
35613599
/*isUnwrappedOptional=*/false));

stdlib/public/core/BridgeObjectiveC.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -658,7 +658,7 @@ extension Optional: _Unwrappable {
658658
}
659659
}
660660

661-
private let _foundationSwiftValueType = _typeByName("Foundation.__SwiftValue") as? _NSSwiftValue.Type
661+
private let _foundationSwiftValueType = _typeByName("FoundationSoil.__SwiftValue") as? _NSSwiftValue.Type
662662

663663
@usableFromInline
664664
internal var _nullPlaceholder: AnyObject {

0 commit comments

Comments
 (0)