@@ -93,6 +93,12 @@ def __lldb_init_module(debugger, internal_dict):
9393 '-x "^llvm::DenseMap<.+>$"'
9494 )
9595
96+ debugger .HandleCommand (
97+ "type synthetic add -w llvm "
98+ f"-l { __name__ } .ExpectedSynthetic "
99+ '-x "^llvm::Expected<.+>$"'
100+ )
101+
96102
97103# Pretty printer for llvm::SmallVector/llvm::SmallVectorImpl
98104class SmallVectorSynthProvider :
@@ -432,3 +438,43 @@ def update(self):
432438 for indexes in key_buckets .values ():
433439 if len (indexes ) == 1 :
434440 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