Show members of DeclContexts (i.e., class members) in Visual Studio native visualizers
authorMike Spertus <mike@spertus.com>
Fri, 18 Mar 2016 16:38:34 +0000 (16:38 +0000)
committerMike Spertus <mike@spertus.com>
Fri, 18 Mar 2016 16:38:34 +0000 (16:38 +0000)
This change shows members of DeclContext objects in the Visual Studio debugger. It will also cast a TagType like a class or a struct to a DeclContext, so its methods and fields are visualized.

llvm-svn: 263794

clang/utils/clang.natvis

index ef20a21..cb7b01d 100644 (file)
@@ -73,6 +73,31 @@ or create a symbolic link so it updates automatically.
   <Type Name="clang::AttributedType">\r
     <DisplayString>{ModifiedType} Attribute={(clang::AttributedType::Kind)AttributedTypeBits.AttrKind}</DisplayString>\r
   </Type>\r
+  \r
+  <!-- Unfortunately, Visual Studio has trouble seeing the PointerBitMask member PointerIntUnion, so I hardwire it to 2 bits-->\r
+  <Type Name="clang::DeclContext">\r
+    <DisplayString>{(clang::Decl::Kind)DeclKind,en}Decl</DisplayString>\r
+    <Expand>\r
+      <Item Name="DeclKind">(clang::Decl::Kind)DeclKind,en</Item>\r
+      <LinkedListItems>\r
+        <HeadPointer>FirstDecl</HeadPointer>\r
+        <NextPointer>(clang::Decl *)(NextInContextAndBits.Value &amp; ~3)</NextPointer>\r
+        <ValueNode>*this</ValueNode>\r
+      </LinkedListItems>\r
+    </Expand>\r
+  </Type>\r
+  <Type Name="clang::FieldDecl">\r
+    <DisplayString>Field {{{*(clang::NamedDecl *)this,view(cpp)nd}}}</DisplayString>\r
+  </Type>\r
+  <Type Name="clang::CXXMethodDecl">\r
+    <DisplayString>Method {{{*(clang::NamedDecl *)this,view(cpp)nd}}}</DisplayString>\r
+  </Type>\r
+  <Type Name="clang::CXXConstructorDecl">\r
+    <DisplayString>Constructor {{{*(clang::NamedDecl *)this,view(cpp)nd}}}</DisplayString>\r
+  </Type>\r
+  <Type Name="clang::CXXDestructorDecl">\r
+    <DisplayString>Destructor {{{*(clang::NamedDecl *)this,view(cpp)nd}}}</DisplayString>\r
+  </Type>\r
   <Type Name="clang::NamedDecl" >\r
     <DisplayString IncludeView="cpp">{Name,view(cpp)}</DisplayString>\r
     <DisplayString>{Name}</DisplayString>\r
@@ -83,6 +108,9 @@ or create a symbolic link so it updates automatically.
     <DisplayString Condition="TagDeclKind==clang::TagTypeKind::TTK_Union">union {Name,view(cpp)}</DisplayString>\r
     <DisplayString Condition="TagDeclKind==clang::TagTypeKind::TTK_Class">class {Name,view(cpp)}</DisplayString>\r
     <DisplayString Condition="TagDeclKind==clang::TagTypeKind::TTK_Enum">enum {Name,view(cpp)}</DisplayString>\r
+    <Expand>\r
+      <ExpandedItem>(clang::DeclContext *)this</ExpandedItem>\r
+    </Expand>\r
   </Type>\r
   <Type Name="clang::TagType">\r
     <DisplayString>{*decl}</DisplayString>\r
@@ -97,7 +125,6 @@ or create a symbolic link so it updates automatically.
       <Item Name="TagType">*(clang::TagType *)this</Item>\r
     </Expand>\r
   </Type>\r
-\r
   <Type Name="clang::SubstTemplateTypeParmType">\r
     <DisplayString>{*Replaced,view(cpp)} &lt;= {CanonicalType,view(cpp)}</DisplayString>\r
     <Expand>\r