@@ -93,6 +93,12 @@ def __lldb_init_module(debugger, internal_dict):
93
93
'-x "^llvm::DenseMap<.+>$"'
94
94
)
95
95
96
+ debugger .HandleCommand (
97
+ "type synthetic add -w llvm "
98
+ f"-l { __name__ } .ExpectedSynthetic "
99
+ '-x "^llvm::Expected<.+>$"'
100
+ )
101
+
96
102
97
103
# Pretty printer for llvm::SmallVector/llvm::SmallVectorImpl
98
104
class SmallVectorSynthProvider :
@@ -432,3 +438,43 @@ def update(self):
432
438
for indexes in key_buckets .values ():
433
439
if len (indexes ) == 1 :
434
440
self .child_buckets .append (indexes [0 ])
441
+
442
+
443
+ class ExpectedSynthetic :
444
+ # The llvm::Expected<T> value.
445
+ expected : lldb .SBValue
446
+ # The stored success value or error value.
447
+ stored_value : lldb .SBValue
448
+
449
+ def __init__ (self , valobj : lldb .SBValue , _ ) -> None :
450
+ self .expected = valobj
451
+
452
+ def update (self ) -> None :
453
+ has_error = self .expected .GetChildMemberWithName ("HasError" ).unsigned
454
+ if not has_error :
455
+ name = "value"
456
+ member = "TStorage"
457
+ else :
458
+ name = "error"
459
+ member = "ErrorStorage"
460
+ # Anonymous union.
461
+ union = self .expected .child [0 ]
462
+ storage = union .GetChildMemberWithName (member )
463
+ stored_type = storage .type .template_args [0 ]
464
+ self .stored_value = storage .Cast (stored_type ).Clone (name )
465
+
466
+ def num_children (self ) -> int :
467
+ return 1
468
+
469
+ def get_child_index (self , name : str ) -> int :
470
+ if name == self .stored_value .name :
471
+ return 0
472
+ # Allow dereferencing for values, not errors.
473
+ if name == "$$dereference$$" and self .stored_value .name == "value" :
474
+ return 0
475
+ return - 1
476
+
477
+ def get_child_at_index (self , idx : int ) -> lldb .SBValue :
478
+ if idx == 0 :
479
+ return self .stored_value
480
+ return lldb .SBValue ()
0 commit comments