Skip to content

Commit 44d7cf4

Browse files
committed
[Swift Static Mirror] When resolving an external type's conformance, report the underlying type's mangled name, instead of the mangled name of the nominal type descriptor.
Resolves rdar://95990054
1 parent 528bd11 commit 44d7cf4

File tree

2 files changed

+14
-6
lines changed

2 files changed

+14
-6
lines changed

include/swift/Reflection/TypeRefBuilder.h

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1352,16 +1352,24 @@ class TypeRefBuilder {
13521352
(const char *)contextDescriptorFieldAddress,
13531353
*contextDescriptorOffset);
13541354

1355-
// Instead of a type descriptor this may just be a symbol reference, check that first
1355+
// Instead of a type descriptor this may just be a reference to an external, check that first
13561356
if (auto symbol = OpaqueDynamicSymbolResolver(remote::RemoteAddress(contextTypeDescriptorAddress))) {
13571357
if (!symbol->isResolved()) {
1358-
mangledTypeName = symbol->getSymbol().str();
13591358
Demangle::Context Ctx;
13601359
auto demangledRoot =
1361-
Ctx.demangleSymbolAsNode(mangledTypeName);
1360+
Ctx.demangleSymbolAsNode(symbol->getSymbol().str());
13621361
assert(demangledRoot->getKind() == Node::Kind::Global);
1363-
typeName =
1364-
nodeToString(demangledRoot->getChild(0)->getChild(0));
1362+
auto nomTypeDescriptorRoot = demangledRoot->getChild(0);
1363+
assert(nomTypeDescriptorRoot->getKind() == Node::Kind::NominalTypeDescriptor);
1364+
auto typeRoot = nomTypeDescriptorRoot->getChild(0);
1365+
typeName = nodeToString(typeRoot);
1366+
1367+
auto typeMangling = Demangle::mangleNode(typeRoot);
1368+
if (!typeMangling.isSuccess())
1369+
mangledTypeName = "";
1370+
else
1371+
mangledTypeName = typeMangling.result();
1372+
13651373
return std::make_pair(mangledTypeName, typeName);
13661374
} else if (symbol->getOffset()) {
13671375
// If symbol is empty and has an offset, this is the resolved remote address

test/Reflection/conformance_descriptors_of_external_types.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,4 @@ extension testModAClass : myTestProto {}
2626
// CHECK: CONFORMANCES:
2727
// CHECK: =============
2828
// CHECK-DAG: (__C.testModAClass) : ExternalConformanceCheck.myTestProto
29-
// CHECK-DAG: _$s8testModB0aB7BStructVMn (testModB.testModBStruct) : ExternalConformanceCheck.myTestProto
29+
// CHECK-DAG: 8testModB0aB7BStructV (testModB.testModBStruct) : ExternalConformanceCheck.myTestProto

0 commit comments

Comments
 (0)