mspertus created this revision.
mspertus added reviewers: aaron.ballman, zturner, aemerson.
mspertus added a subscriber: cfe-commits.

Visualizer for clang::FunctionProtoType

Displays return type and parameters for the Function Protoype object in the 
Locals window. For example, the prototype `int(double, A *)` displays as

```
T                 Int(Double, struct A *)
|-ReturnType      Int
|-Parameter Types Double, struct A *
 |-[0]            BuiltinType {Double}
 |-[1]            PointerType {struct A *}
| /* More stuff */
```



http://reviews.llvm.org/D18297

Files:
  clang.natvis

Index: clang.natvis
===================================================================
--- clang.natvis
+++ clang.natvis
@@ -29,6 +29,7 @@
     <DisplayString 
Condition="TypeBits.TC==clang::Type::TypeClass::TemplateTypeParm" 
IncludeView="poly">{*(clang::TemplateTypeParmType *)this}</DisplayString>
     <DisplayString 
Condition="TypeBits.TC==clang::Type::TypeClass::SubstTemplateTypeParm" 
IncludeView="poly">{*(clang::SubstTemplateTypeParmType *)this}</DisplayString>
     <DisplayString Condition="TypeBits.TC==clang::Type::TypeClass::Record" 
IncludeView="poly">{*(clang::RecordType *)this}</DisplayString>
+    <DisplayString 
Condition="TypeBits.TC==clang::Type::TypeClass::FunctionProto" 
IncludeView="poly">{*(clang::FunctionProtoType *)this}</DisplayString>
     <DisplayString IncludeView="cpp">{*this,view(poly)}</DisplayString>
     <DisplayString IncludeView="poly">{*this,view(cmn)}"</DisplayString> <!-- 
Not yet implemented Type subclass -->
     <DisplayString>{*this,view(cmn)}  {{{*this,view(poly)}}}</DisplayString>
@@ -44,6 +45,7 @@
       <ExpandedItem ExcludeView="cmn" 
Condition="TypeBits.TC==clang::Type::TypeClass::TemplateTypeParm">(clang::TemplateTypeParmType
 *)this</ExpandedItem>
       <ExpandedItem ExcludeView="cmn" 
Condition="TypeBits.TC==clang::Type::TypeClass::SubstTemplateTypeParm">(clang::SubstTemplateTypeParmType
 *)this</ExpandedItem>
       <ExpandedItem ExcludeView="cmn" 
Condition="TypeBits.TC==clang::Type::TypeClass::Record">(clang::RecordType 
*)this</ExpandedItem>
+      <ExpandedItem ExcludeView="cmn" 
Condition="TypeBits.TC==clang::Type::TypeClass::FunctionProto">(clang::FunctionProtoType
 *)this</ExpandedItem>
     </Expand>
   </Type>
   <Type Name="clang::PointerType">
@@ -132,6 +134,36 @@
       <Item Name="Replaced">*Replaced</Item>
     </Expand>
   </Type>
+  <!-- We only show the first 5 parameter types in the display string (can't 
figure out how to loop in DisplayString)
+       but the expansion has all parameters -->
+  <Type Name="clang::FunctionProtoType">
+    <DisplayString IncludeView="parm0" 
Condition="NumParams==0"></DisplayString>
+    <DisplayString IncludeView="parm0">{*(clang::QualType 
*)(this+1),view(cpp)}{*this,view(parm1)}</DisplayString>
+    <DisplayString IncludeView="parm1" 
Condition="NumParams==1"></DisplayString>
+    <DisplayString IncludeView="parm1">, {*((clang::QualType 
*)(this+1)+1),view(cpp)}{*this,view(parm2)}</DisplayString>
+    <DisplayString IncludeView="parm2" 
Condition="NumParams==2"></DisplayString>
+    <DisplayString IncludeView="parm2">, {*((clang::QualType 
*)(this+1)+2),view(cpp)}{*this,view(parm3)}</DisplayString>
+    <DisplayString IncludeView="parm3" 
Condition="NumParams==3"></DisplayString>
+    <DisplayString IncludeView="parm3">, {*((clang::QualType 
*)(this+1)+3),view(cpp)}{*this,view(parm4)}</DisplayString>
+    <DisplayString IncludeView="parm4" 
Condition="NumParams==4"></DisplayString>
+    <DisplayString IncludeView="parm4">, {*((clang::QualType 
*)(this+1)+4),view(cpp)}{*this,view(parm5)}</DisplayString>
+    <DisplayString IncludeView="parm5" 
Condition="NumParams==5"></DisplayString>
+    <DisplayString IncludeView="parm5">, /* expand for more params 
*/</DisplayString>
+    <DisplayString>{ResultType,view(cpp)}({*this,view(parm0)})</DisplayString>
+    <Expand>
+      <Item Name="ReturnType">ResultType</Item>
+      <Synthetic Name="Parameter Types">
+        <DisplayString>{*this,view(parm0)}</DisplayString>
+        <Expand>
+          <ArrayItems>
+            <Size>NumParams</Size>
+            <ValuePointer>(clang::QualType *)(this+1)</ValuePointer>
+          </ArrayItems>
+        </Expand>
+      </Synthetic>
+      <ExpandedItem>*(clang::Type *)this, view(cmn)</ExpandedItem>
+    </Expand>
+  </Type>
   <Type Name="clang::TemplateTypeParmType">
     <DisplayString>typename {*TTPDecl,view(cpp)}</DisplayString>
   </Type>


Index: clang.natvis
===================================================================
--- clang.natvis
+++ clang.natvis
@@ -29,6 +29,7 @@
     <DisplayString Condition="TypeBits.TC==clang::Type::TypeClass::TemplateTypeParm" IncludeView="poly">{*(clang::TemplateTypeParmType *)this}</DisplayString>
     <DisplayString Condition="TypeBits.TC==clang::Type::TypeClass::SubstTemplateTypeParm" IncludeView="poly">{*(clang::SubstTemplateTypeParmType *)this}</DisplayString>
     <DisplayString Condition="TypeBits.TC==clang::Type::TypeClass::Record" IncludeView="poly">{*(clang::RecordType *)this}</DisplayString>
+    <DisplayString Condition="TypeBits.TC==clang::Type::TypeClass::FunctionProto" IncludeView="poly">{*(clang::FunctionProtoType *)this}</DisplayString>
     <DisplayString IncludeView="cpp">{*this,view(poly)}</DisplayString>
     <DisplayString IncludeView="poly">{*this,view(cmn)}"</DisplayString> <!-- Not yet implemented Type subclass -->
     <DisplayString>{*this,view(cmn)}  {{{*this,view(poly)}}}</DisplayString>
@@ -44,6 +45,7 @@
       <ExpandedItem ExcludeView="cmn" Condition="TypeBits.TC==clang::Type::TypeClass::TemplateTypeParm">(clang::TemplateTypeParmType *)this</ExpandedItem>
       <ExpandedItem ExcludeView="cmn" Condition="TypeBits.TC==clang::Type::TypeClass::SubstTemplateTypeParm">(clang::SubstTemplateTypeParmType *)this</ExpandedItem>
       <ExpandedItem ExcludeView="cmn" Condition="TypeBits.TC==clang::Type::TypeClass::Record">(clang::RecordType *)this</ExpandedItem>
+      <ExpandedItem ExcludeView="cmn" Condition="TypeBits.TC==clang::Type::TypeClass::FunctionProto">(clang::FunctionProtoType *)this</ExpandedItem>
     </Expand>
   </Type>
   <Type Name="clang::PointerType">
@@ -132,6 +134,36 @@
       <Item Name="Replaced">*Replaced</Item>
     </Expand>
   </Type>
+  <!-- We only show the first 5 parameter types in the display string (can't figure out how to loop in DisplayString)
+       but the expansion has all parameters -->
+  <Type Name="clang::FunctionProtoType">
+    <DisplayString IncludeView="parm0" Condition="NumParams==0"></DisplayString>
+    <DisplayString IncludeView="parm0">{*(clang::QualType *)(this+1),view(cpp)}{*this,view(parm1)}</DisplayString>
+    <DisplayString IncludeView="parm1" Condition="NumParams==1"></DisplayString>
+    <DisplayString IncludeView="parm1">, {*((clang::QualType *)(this+1)+1),view(cpp)}{*this,view(parm2)}</DisplayString>
+    <DisplayString IncludeView="parm2" Condition="NumParams==2"></DisplayString>
+    <DisplayString IncludeView="parm2">, {*((clang::QualType *)(this+1)+2),view(cpp)}{*this,view(parm3)}</DisplayString>
+    <DisplayString IncludeView="parm3" Condition="NumParams==3"></DisplayString>
+    <DisplayString IncludeView="parm3">, {*((clang::QualType *)(this+1)+3),view(cpp)}{*this,view(parm4)}</DisplayString>
+    <DisplayString IncludeView="parm4" Condition="NumParams==4"></DisplayString>
+    <DisplayString IncludeView="parm4">, {*((clang::QualType *)(this+1)+4),view(cpp)}{*this,view(parm5)}</DisplayString>
+    <DisplayString IncludeView="parm5" Condition="NumParams==5"></DisplayString>
+    <DisplayString IncludeView="parm5">, /* expand for more params */</DisplayString>
+    <DisplayString>{ResultType,view(cpp)}({*this,view(parm0)})</DisplayString>
+    <Expand>
+      <Item Name="ReturnType">ResultType</Item>
+      <Synthetic Name="Parameter Types">
+        <DisplayString>{*this,view(parm0)}</DisplayString>
+        <Expand>
+          <ArrayItems>
+            <Size>NumParams</Size>
+            <ValuePointer>(clang::QualType *)(this+1)</ValuePointer>
+          </ArrayItems>
+        </Expand>
+      </Synthetic>
+      <ExpandedItem>*(clang::Type *)this, view(cmn)</ExpandedItem>
+    </Expand>
+  </Type>
   <Type Name="clang::TemplateTypeParmType">
     <DisplayString>typename {*TTPDecl,view(cpp)}</DisplayString>
   </Type>
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to