Skip to content

Commit f189992

Browse files
authored
Merge pull request #39431 from zoecarver/lazy-pt3-print-objc-module
[cxx-interop] Print decls in the __ObjC module.
2 parents 4030a8c + 3454f90 commit f189992

File tree

4 files changed

+119
-29
lines changed

4 files changed

+119
-29
lines changed

lib/ClangImporter/ClangImporter.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2621,7 +2621,10 @@ class FilteringDeclaredDeclConsumer : public swift::VisibleDeclConsumer {
26212621

26222622
void foundDecl(ValueDecl *VD, DeclVisibilityKind Reason,
26232623
DynamicLookupInfo dynamicLookupInfo) override {
2624-
if (isDeclaredInModule(ModuleFilter, VD))
2624+
if (isDeclaredInModule(ModuleFilter, VD) ||
2625+
// Sometimes imported decls get put into the clang header module. If we
2626+
// found one of these decls, don't filter it out.
2627+
VD->getModuleContext()->getName().str() == CLANG_HEADER_MODULE_NAME)
26252628
NextConsumer.foundDecl(VD, Reason, dynamicLookupInfo);
26262629
}
26272630
};

lib/IDE/ModuleInterfacePrinting.cpp

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -660,7 +660,28 @@ void swift::ide::printModuleInterface(
660660
};
661661

662662
if (auto clangNode = getEffectiveClangNode(D)) {
663-
addToClangDecls(D, clangNode);
663+
if (auto namespaceDecl =
664+
dyn_cast_or_null<clang::NamespaceDecl>(clangNode.getAsDecl())) {
665+
// An imported namespace decl will contain members from all redecls, so
666+
// make sure we add all the redecls.
667+
for (auto redecl : namespaceDecl->redecls()) {
668+
// Namespace redecls may exist across mutliple modules. We want to
669+
// add the decl "D" to every module that has a redecl. But we only
670+
// want to add "D" once to prevent duplicate printing.
671+
clang::SourceLocation loc = redecl->getLocation();
672+
auto *owningModule = Importer.getClangOwningModule(redecl);
673+
auto found = ClangDecls.find(owningModule);
674+
if (found != ClangDecls.end() &&
675+
// Don't re-add this decl if it already exists for "OwningModule".
676+
llvm::find_if(found->second, [D](auto p) {
677+
return p.first == D;
678+
}) == found->second.end()) {
679+
found->second.push_back({D, loc});
680+
}
681+
}
682+
} else {
683+
addToClangDecls(D, clangNode);
684+
}
664685
continue;
665686
}
666687

Lines changed: 22 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,23 @@
1-
// RUN: %target-swift-ide-test -print-module -module-to-print=Submodules.SubmoduleA -I %S/Inputs -source-filename=x -enable-cxx-interop | %FileCheck %s -check-prefix=CHECK-A
2-
// RUN: %target-swift-ide-test -print-module -module-to-print=Submodules.SubmoduleB -I %S/Inputs -source-filename=x -enable-cxx-interop | %FileCheck %s -check-prefix=CHECK-B
1+
// RUN: %target-swift-ide-test -print-module -module-to-print=Submodules.SubmoduleA -I %S/Inputs -source-filename=x -enable-cxx-interop | %FileCheck %s
2+
// RUN: %target-swift-ide-test -print-module -module-to-print=Submodules.SubmoduleB -I %S/Inputs -source-filename=x -enable-cxx-interop | %FileCheck %s
33

4-
// CHECK-A-NOT: extension
5-
// CHECK-A: extension NS1 {
6-
// CHECK-A: struct BasicA {
7-
// CHECK-A: }
8-
// CHECK-A: }
9-
// CHECK-A-NOT: extension
10-
11-
// CHECK-A: extension NS1.NS2 {
12-
// CHECK-A: struct BasicDeepA {
13-
// CHECK-A: }
14-
// CHECK-A: }
15-
// CHECK-A-NOT: extension
16-
17-
// CHECK-B-NOT: extension
18-
// CHECK-B: extension NS1 {
19-
// CHECK-B: struct BasicB {
20-
// CHECK-B: }
21-
// CHECK-B: }
22-
// CHECK-B-NOT: extension
23-
24-
// CHECK-B: extension NS1.NS2 {
25-
// CHECK-B: struct BasicDeepB {
26-
// CHECK-B: }
27-
// CHECK-B: }
28-
// CHECK-B-NOT: extension
4+
// CHECK: extension NS1 {
5+
// CHECK-NEXT: struct BasicA {
6+
// CHECK-NEXT: init()
7+
// CHECK-NEXT: }
8+
// CHECK-NEXT: }
9+
// CHECK-NEXT: extension NS1 {
10+
// CHECK-NEXT: struct BasicB {
11+
// CHECK-NEXT: init()
12+
// CHECK-NEXT: }
13+
// CHECK-NEXT: }
14+
// CHECK-NEXT: extension NS1.NS2 {
15+
// CHECK-NEXT: struct BasicDeepA {
16+
// CHECK-NEXT: init()
17+
// CHECK-NEXT: }
18+
// CHECK-NEXT: }
19+
// CHECK-NEXT: extension NS1.NS2 {
20+
// CHECK-NEXT: struct BasicDeepB {
21+
// CHECK-NEXT: init()
22+
// CHECK-NEXT: }
23+
// CHECK-NEXT: }

test/api-digester/Outputs/clang-module-dump.txt

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -568,6 +568,77 @@
568568
"usr": "c:objc(pl)NSObject"
569569
}
570570
]
571+
},
572+
{
573+
"kind": "TypeAlias",
574+
"name": "__NSConstantString",
575+
"printedName": "__NSConstantString",
576+
"children": [
577+
{
578+
"kind": "TypeNominal",
579+
"name": "__NSConstantString_tag",
580+
"printedName": "__ObjC.__NSConstantString_tag",
581+
"usr": "c:@S@__NSConstantString_tag"
582+
}
583+
],
584+
"declKind": "TypeAlias",
585+
"usr": "c:@T@__NSConstantString",
586+
"moduleName": "__ObjC"
587+
},
588+
{
589+
"kind": "TypeAlias",
590+
"name": "__builtin_ms_va_list",
591+
"printedName": "__builtin_ms_va_list",
592+
"children": [
593+
{
594+
"kind": "TypeNominal",
595+
"name": "UnsafeMutablePointer",
596+
"printedName": "Swift.UnsafeMutablePointer<Swift.CChar>",
597+
"children": [
598+
{
599+
"kind": "TypeNameAlias",
600+
"name": "CChar",
601+
"printedName": "Swift.CChar",
602+
"children": [
603+
{
604+
"kind": "TypeNominal",
605+
"name": "Int8",
606+
"printedName": "Swift.Int8",
607+
"usr": "s:s4Int8V"
608+
}
609+
]
610+
}
611+
],
612+
"usr": "s:Sp"
613+
}
614+
],
615+
"declKind": "TypeAlias",
616+
"usr": "c:@T@__builtin_ms_va_list",
617+
"moduleName": "__ObjC"
618+
},
619+
{
620+
"kind": "TypeAlias",
621+
"name": "__builtin_va_list",
622+
"printedName": "__builtin_va_list",
623+
"children": [
624+
{
625+
"kind": "TypeNominal",
626+
"name": "Paren",
627+
"printedName": "(__ObjC.__va_list_tag)",
628+
"children": [
629+
{
630+
"kind": "TypeNominal",
631+
"name": "__va_list_tag",
632+
"printedName": "__ObjC.__va_list_tag",
633+
"usr": "c:@S@__va_list_tag"
634+
}
635+
],
636+
"usr": "c:@S@__va_list_tag"
637+
}
638+
],
639+
"declKind": "TypeAlias",
640+
"usr": "c:@T@__builtin_va_list",
641+
"moduleName": "__ObjC"
571642
}
572643
],
573644
"json_format_version": 6

0 commit comments

Comments
 (0)