Skip to content

Commit b05a622

Browse files
authored
Merge pull request #29090 from CodaFi/globe-up
[NFC] Unblock Lazy Member Loading For Import-As-Member
2 parents a6a1f86 + 518ab9f commit b05a622

File tree

4 files changed

+320
-89
lines changed

4 files changed

+320
-89
lines changed

lib/ClangImporter/ClangImporter.cpp

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3010,7 +3010,7 @@ void ClangImporter::loadExtensions(NominalTypeDecl *nominal,
30103010
// FIXME: If we already looked at this for this generation,
30113011
// skip.
30123012

3013-
for (auto entry : table.lookupGlobalsAsMembers(effectiveClangContext)) {
3013+
for (auto entry : table.allGlobalsAsMembersInContext(effectiveClangContext)) {
30143014
// If the entry is not visible, skip it.
30153015
if (!isVisibleClangEntry(clangCtx, entry)) continue;
30163016

@@ -3786,17 +3786,6 @@ ClangImporter::Implementation::loadNamedMembers(
37863786
return None;
37873787
}
37883788

3789-
// Also bail out if there are any global-as-member mappings for this context;
3790-
// we can support some of them lazily but the full set of idioms seems
3791-
// prohibitively complex (also they're not stored in by-name lookup, for
3792-
// reasons unclear).
3793-
if (isa<ExtensionDecl>(D) && !checkedGlobalsAsMembers.insert(IDC).second) {
3794-
if (forEachLookupTable([&](SwiftLookupTable &table) -> bool {
3795-
return (!table.lookupGlobalsAsMembers(effectiveClangContext).empty());
3796-
}))
3797-
return None;
3798-
}
3799-
38003789
// There are 3 cases:
38013790
//
38023791
// - The decl is from a bridging header, CMO is Some(nullptr)
@@ -3846,6 +3835,27 @@ ClangImporter::Implementation::loadNamedMembers(
38463835
}
38473836
}
38483837

3838+
for (auto entry : table->lookupGlobalsAsMembers(SerializedSwiftName(N),
3839+
effectiveClangContext)) {
3840+
if (!entry.is<clang::NamedDecl *>()) continue;
3841+
auto member = entry.get<clang::NamedDecl *>();
3842+
if (!isVisibleClangEntry(clangCtx, member)) continue;
3843+
3844+
// Skip Decls from different clang::DeclContexts
3845+
if (member->getDeclContext() != CDC) continue;
3846+
3847+
SmallVector<Decl*, 4> tmp;
3848+
insertMembersAndAlternates(member, tmp);
3849+
for (auto *TD : tmp) {
3850+
if (auto *V = dyn_cast<ValueDecl>(TD)) {
3851+
// Skip ValueDecls if they import under different names.
3852+
if (V->getBaseName() == N) {
3853+
Members.push_back(V);
3854+
}
3855+
}
3856+
}
3857+
}
3858+
38493859
if (N == DeclBaseName::createConstructor()) {
38503860
if (auto *classDecl = dyn_cast<ClassDecl>(D)) {
38513861
SmallVector<Decl *, 4> ctors;

lib/ClangImporter/ImportDecl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8544,7 +8544,7 @@ void ClangImporter::Implementation::loadAllMembersIntoExtension(
85448544
startedImportingEntity();
85458545

85468546
// Load the members.
8547-
for (auto entry : table->lookupGlobalsAsMembers(effectiveClangContext)) {
8547+
for (auto entry : table->allGlobalsAsMembersInContext(effectiveClangContext)) {
85488548
auto decl = entry.get<clang::NamedDecl *>();
85498549

85508550
// Only include members in the same submodule as this extension.

0 commit comments

Comments
 (0)