[vim] Add token type to Vim syntax file.
[oota-llvm.git] / utils / lldbDataFormatters.py
index 352448d535cdbe5aa69c3d0343107bdc7e5602f3..687729f61eddd32dca59a6534c2b5113b402171c 100644 (file)
@@ -12,6 +12,12 @@ def __lldb_init_module(debugger, internal_dict):
     debugger.HandleCommand('type synthetic add -w llvm '
                            '-l lldbDataFormatters.SmallVectorSynthProvider '
                            '-x "^llvm::SmallVector<.+,.+>$"')
+    debugger.HandleCommand('type synthetic add -w llvm '
+                           '-l lldbDataFormatters.ArrayRefSynthProvider '
+                           '-x "^llvm::ArrayRef<.+>$"')
+    debugger.HandleCommand('type summary add -w llvm '
+                           '-F lldbDataFormatters.OptionalSummaryProvider '
+                           '-x "^llvm::Optional<.+>$"')
 
 # Pretty printer for llvm::SmallVector/llvm::SmallVectorImpl
 class SmallVectorSynthProvider:
@@ -53,3 +59,40 @@ class SmallVectorSynthProvider:
         self.data_type = the_type.GetTemplateArgumentType(0)
         self.type_size = self.data_type.GetByteSize()
         assert self.type_size != 0
+
+class ArrayRefSynthProvider:
+    """ Provider for llvm::ArrayRef """
+    def __init__(self, valobj, dict):
+        self.valobj = valobj;
+        self.update() # initialize this provider
+
+    def num_children(self):
+        return self.length
+
+    def get_child_index(self, name):
+        try:
+            return int(name.lstrip('[').rstrip(']'))
+        except:
+            return -1;
+
+    def get_child_at_index(self, index):
+        if index < 0 or index >= self.num_children():
+            return None;
+        offset = index * self.type_size
+        return self.data.CreateChildAtOffset('[' + str(index) + ']',
+                                             offset, self.data_type)
+
+    def update(self):
+        self.data = self.valobj.GetChildMemberWithName('Data')
+        length_obj = self.valobj.GetChildMemberWithName('Length')
+        self.length = length_obj.GetValueAsUnsigned(0)
+        self.data_type = self.data.GetType().GetPointeeType()
+        self.type_size = self.data_type.GetByteSize()
+        assert self.type_size != 0
+
+def OptionalSummaryProvider(valobj, internal_dict):
+    if not valobj.GetChildMemberWithName('hasVal').GetValueAsUnsigned(0):
+        return 'None'
+    underlying_type = valobj.GetType().GetTemplateArgumentType(0)
+    storage = valobj.GetChildMemberWithName('storage')
+    return str(storage.Cast(underlying_type))