Skip to content

Commit 3160bd8

Browse files
authored
Merge pull request #9981 from augusto2112/desugar-node-bind-gen
[lldb] Desugar the type before binding generic parameters
2 parents 757d38a + 914c4fc commit 3160bd8

File tree

5 files changed

+45
-11
lines changed

5 files changed

+45
-11
lines changed

lldb/source/Plugins/LanguageRuntime/Swift/SwiftLanguageRuntimeDynamicTypeResolution.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2341,6 +2341,7 @@ SwiftLanguageRuntime::BindGenericTypeParameters(StackFrame &stack_frame,
23412341

23422342
NodePointer canonical = TypeSystemSwiftTypeRef::GetStaticSelfType(
23432343
dem, dem.demangleSymbol(mangled_name.GetStringRef()));
2344+
canonical = ts.DesugarNode(dem, canonical);
23442345

23452346
// Build the list of type substitutions.
23462347
swift::reflection::GenericArgumentMap substitutions;

lldb/source/Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.cpp

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1174,10 +1174,8 @@ Desugar(swift::Demangle::Demangler &dem, swift::Demangle::NodePointer node,
11741174
return desugared;
11751175
}
11761176

1177-
swift::Demangle::NodePointer
1178-
TypeSystemSwiftTypeRef::Canonicalize(swift::Demangle::Demangler &dem,
1179-
swift::Demangle::NodePointer node,
1180-
swift::Mangle::ManglingFlavor flavor) {
1177+
static swift::Demangle::NodePointer Desugar(swift::Demangle::Demangler &dem,
1178+
swift::Demangle::NodePointer node) {
11811179
assert(node);
11821180
auto kind = node->getKind();
11831181
switch (kind) {
@@ -1207,7 +1205,27 @@ TypeSystemSwiftTypeRef::Canonicalize(swift::Demangle::Demangler &dem,
12071205
if (node->getNumChildren() != 1)
12081206
return node;
12091207
return node->getFirstChild();
1208+
default:
1209+
return node;
1210+
}
1211+
}
12101212

1213+
swift::Demangle::NodePointer
1214+
TypeSystemSwiftTypeRef::DesugarNode(swift::Demangle::Demangler &dem,
1215+
swift::Demangle::NodePointer node) {
1216+
using namespace swift::Demangle;
1217+
return TypeSystemSwiftTypeRef::Transform(
1218+
dem, node, [&](NodePointer node) { return Desugar(dem, node); });
1219+
}
1220+
1221+
swift::Demangle::NodePointer
1222+
TypeSystemSwiftTypeRef::Canonicalize(swift::Demangle::Demangler &dem,
1223+
swift::Demangle::NodePointer node,
1224+
swift::Mangle::ManglingFlavor flavor) {
1225+
assert(node);
1226+
node = Desugar(dem, node);
1227+
auto kind = node->getKind();
1228+
switch (kind) {
12111229
case Node::Kind::BoundGenericTypeAlias:
12121230
case Node::Kind::TypeAlias: {
12131231
// Safeguard against cyclic aliases.

lldb/source/Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,11 @@ class TypeSystemSwiftTypeRef : public TypeSystemSwift {
374374
CanonicalizeSugar(swift::Demangle::Demangler &dem,
375375
swift::Demangle::NodePointer node);
376376

377+
/// Recursively desugars sugared types (arrays, dictionaries, optionals, etc.)
378+
/// in a demangle tree.
379+
swift::Demangle::NodePointer DesugarNode(swift::Demangle::Demangler &dem,
380+
swift::Demangle::NodePointer node);
381+
377382
/// Finds the nominal type node (struct, class, enum) that contains the
378383
/// module and identifier nodes for that type. If \p node is not a valid
379384
/// type node, returns a nullptr.

lldb/test/API/lang/swift/generic_extension/TestSwiftGenericExtension.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,21 @@
99
# See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
1010
#
1111
# ------------------------------------------------------------------------------
12-
import lldbsuite.test.lldbinline as lldbinline
12+
13+
import lldb
14+
from lldbsuite.test.lldbtest import *
1315
from lldbsuite.test.decorators import *
16+
import lldbsuite.test.lldbutil as lldbutil
17+
1418

15-
lldbinline.MakeInlineTest(__file__, globals(),
16-
decorators=[swiftTest
17-
])
19+
class TestSwiftGenericExtension(TestBase):
20+
@swiftTest
21+
def test(self):
22+
self.build()
23+
lldbutil.run_to_source_breakpoint(
24+
self, "break here", lldb.SBFileSpec("main.swift")
25+
)
26+
self.expect(
27+
"expr -d run-target --bind-generic-types false -- self",
28+
substrs=["[0] = 1", "[1] = 2", "[2] = 3"],
29+
)

lldb/test/API/lang/swift/generic_extension/main.swift

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,8 @@
1111
// -----------------------------------------------------------------------------
1212
extension Array {
1313
func test() {
14-
print("PATPAT") //% self.expect("expr -d run-target -- self", substrs=['[0] = 1', '[1] = 2', '[2] = 3'])
15-
return //% self.expect("frame variable -d run -- self", substrs=['[0] = 1', '[1] = 2', '[2] = 3'])
14+
print("break here")
1615
}
1716
}
1817
var a = [1,2,3]
19-
2018
a.test()

0 commit comments

Comments
 (0)