Skip to content

Commit a967f8c

Browse files
committed
[NamedLazyMemberLoading] Support named loading from ObjC categories.
1 parent d3bcdfd commit a967f8c

File tree

2 files changed

+23
-19
lines changed

2 files changed

+23
-19
lines changed

lib/AST/NameLookup.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1400,7 +1400,7 @@ TinyPtrVector<ValueDecl *> NominalTypeDecl::lookupDirect(
14001400
} else {
14011401
if (!ignoreNewExtensions) {
14021402
for (auto E : getExtensions()) {
1403-
if (E->wasDeserialized()) {
1403+
if (E->wasDeserialized() || E->hasClangNode()) {
14041404
if (populateLookupTableEntryFromLazyIDCLoader(ctx, Table,
14051405
name, E)) {
14061406
useNamedLazyMemberLoading = false;

lib/ClangImporter/ClangImporter.cpp

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3278,6 +3278,7 @@ ClangImporter::Implementation::loadNamedMembers(
32783278
auto *D = IDC->getDecl();
32793279
auto *DC = cast<DeclContext>(D);
32803280
auto *CD = D->getClangDecl();
3281+
auto *CDC = cast<clang::DeclContext>(CD);
32813282
assert(CD && "loadNamedMembers on a Decl without a clangDecl");
32823283

32833284

@@ -3317,29 +3318,32 @@ ClangImporter::Implementation::loadNamedMembers(
33173318

33183319
clang::ASTContext &clangCtx = getClangASTContext();
33193320

3321+
assert(isa<clang::ObjCContainerDecl>(CD));
3322+
33203323
TinyPtrVector<ValueDecl *> Members;
3321-
if (auto *CCD = dyn_cast<clang::ObjCContainerDecl>(CD)) {
3322-
for (auto entry : table->lookup(SerializedSwiftName(N.getBaseName()), CCD)) {
3323-
if (!entry.is<clang::NamedDecl *>()) continue;
3324-
auto member = entry.get<clang::NamedDecl *>();
3325-
if (!isVisibleClangEntry(clangCtx, member)) continue;
3326-
SmallVector<Decl*, 4> tmp;
3327-
insertMembersAndAlternates(member, tmp);
3328-
for (auto *TD : tmp) {
3329-
if (auto *V = dyn_cast<ValueDecl>(TD)) {
3330-
// Skip ValueDecls if they import into different DeclContexts
3331-
// or under different names than the one we asked about.
3332-
if (V->getDeclContext() == DC &&
3333-
V->getFullName().matchesRef(N)) {
3334-
Members.push_back(V);
3335-
}
3324+
auto *Nominal = DC->getAsNominalTypeOrNominalTypeExtensionContext();
3325+
auto ClangContext = getEffectiveClangContext(Nominal);
3326+
for (auto entry : table->lookup(SerializedSwiftName(N.getBaseName()),
3327+
ClangContext)) {
3328+
if (!entry.is<clang::NamedDecl *>()) continue;
3329+
auto member = entry.get<clang::NamedDecl *>();
3330+
if (!isVisibleClangEntry(clangCtx, member)) continue;
3331+
3332+
// Skip Decls from different clang::DeclContexts
3333+
if (member->getDeclContext() != CDC) continue;
3334+
3335+
SmallVector<Decl*, 4> tmp;
3336+
insertMembersAndAlternates(member, tmp);
3337+
for (auto *TD : tmp) {
3338+
if (auto *V = dyn_cast<ValueDecl>(TD)) {
3339+
// Skip ValueDecls if they import under different names.
3340+
if (V->getFullName().matchesRef(N)) {
3341+
Members.push_back(V);
33363342
}
33373343
}
33383344
}
3339-
return Members;
33403345
}
3341-
3342-
return None;
3346+
return Members;
33433347
}
33443348

33453349

0 commit comments

Comments
 (0)