mspertus updated this revision to Diff 50820. mspertus added a comment. Added reference types and a more accurate AttributedType enum. I am working on additional items for the future (class members, function types, etc.) but those will take longer, and I think it is worthwhile to get this revision committed unless there are defects in it. Agree?
http://reviews.llvm.org/D18163 Files: clang.natvis
Index: clang.natvis =================================================================== --- clang.natvis +++ clang.natvis @@ -6,46 +6,112 @@ or create a symbolic link so it updates automatically. --> <AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010"> + <Type Name="clang::Type"> - <DisplayString IncludeView="BaseOnly">{(clang::Type::TypeClass)TypeBits.TC, en}</DisplayString> - <DisplayString Condition="TypeBits.TC==clang::Type::TypeClass::Builtin">Builtin Type={*(clang::BuiltinType *)this}</DisplayString> - <DisplayString Condition="TypeBits.TC==clang::Type::Attributed">Modified Type={((clang::AttributedType*)this)->ModifiedType} Attribute={(clang::AttributedType::Kind)AttributedTypeBits.AttrKind}</DisplayString> - <DisplayString Condition="TypeBits.TC==clang::Type::TypeClass::SubstTemplateTypeParm">{*(clang::SubstTemplateTypeParmType *)this}</DisplayString> - <DisplayString Condition="TypeBits.TC==clang::Type::TypeClass::Record">{*(clang::RecordType *)this}</DisplayString> - <DisplayString>{(clang::Type::TypeClass)TypeBits.TC, en}</DisplayString> - <Expand> - <Item Name="TypeClass" IncludeView="BaseOnly">(clang::Type::TypeClass)TypeBits.TC</Item> - <Item Name="Flags" IncludeView="BaseOnly">TypeBits</Item> - <Item Name="Canonical" IncludeView="BaseOnly">CanonicalType</Item> - <ExpandedItem ExcludeView="BaseOnly" Condition="TypeBits.TC==clang::Type::TypeClass::Builtin">*(clang::BuiltinType *)this</ExpandedItem> - <ExpandedItem ExcludeView="BaseOnly" Condition="TypeBits.TC==clang::Type::TypeClass::SubstTemplateTypeParm">(clang::SubstTemplateTypeParmType *)this</ExpandedItem> - <ExpandedItem ExcludeView="BaseOnly" Condition="TypeBits.TC==clang::Type::TypeClass::Record">(clang::RecordType *)this</ExpandedItem> + <!-- To visualize clang::Types, we need to look at TypeBits.TC to determine the actual + type subclass and manually dispatch accordingly (Visual Studio can't identify the real type + because clang::Type has no virtual members hence no RTTI). + + Views: + "cmn": Visualization that is common to all clang::Type subclasses + "poly": Visualization that is specific to the actual clang::Type subclass. The subtype-specific + <DisplayString> is typically as C++-like as possible (like in dump()) with <Expand> + containing all the gory details. + "cpp": Only occasionally used when we need to distinguish between an ordinary view and a C++-like view. + --> + <DisplayString IncludeView="cmn">{(clang::Type::TypeClass)TypeBits.TC, en}Type</DisplayString> + <!-- Dispatch to visualizers for the actual Type subclass --> + <DisplayString Condition="TypeBits.TC==clang::Type::TypeClass::Builtin" IncludeView="poly">{*(clang::BuiltinType *)this}</DisplayString> + <DisplayString Condition="TypeBits.TC==clang::Type::TypeClass::Pointer" IncludeView="poly">{*(clang::PointerType *)this}</DisplayString> + <DisplayString Condition="TypeBits.TC==clang::Type::TypeClass::LValueReference" IncludeView="poly">{*(clang::LValueReferenceType *)this}</DisplayString> + <DisplayString Condition="TypeBits.TC==clang::Type::TypeClass::RValueReference" IncludeView="poly">{*(clang::RValueReferenceType *)this}</DisplayString> + <DisplayString Condition="TypeBits.TC==clang::Type::TypeClass::Attributed" IncludeView="poly">{*(clang::AttributedType *)this}</DisplayString> + <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 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> + <Expand> + <Item Name="TypeClass" IncludeView="cmn">(clang::Type::TypeClass)TypeBits.TC</Item> + <Item Name="Flags" IncludeView="cmn">TypeBits</Item> + <Item Name="Canonical" IncludeView="cmn">CanonicalType</Item> + <ExpandedItem ExcludeView="cmn" Condition="TypeBits.TC==clang::Type::TypeClass::Builtin">*(clang::BuiltinType *)this</ExpandedItem> + <ExpandedItem ExcludeView="cmn" Condition="TypeBits.TC==clang::Type::TypeClass::Pointer">*(clang::PointerType *)this</ExpandedItem> + <ExpandedItem ExcludeView="cmn" Condition="TypeBits.TC==clang::Type::TypeClass::LValueReference">*(clang::LValueReferenceType *)this</ExpandedItem> + <ExpandedItem ExcludeView="cmn" Condition="TypeBits.TC==clang::Type::TypeClass::RValueReference">*(clang::RValueReferenceType *)this</ExpandedItem> + <ExpandedItem ExcludeView="cmn" Condition="TypeBits.TC==clang::Type::TypeClass::Attributed">*(clang::AttributedType *)this</ExpandedItem> + <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> + </Expand> + </Type> + <Type Name="clang::PointerType"> + <DisplayString>{PointeeType, view(poly)} *</DisplayString> + <Expand> + <ExpandedItem>*(clang::Type *)this, view(cmn)</ExpandedItem> + <Item Name="PointeeType">PointeeType</Item> + </Expand> + </Type> + <!-- We visualize all inner types for clang reference types. So a rvalue reference to an lvalue reference + to an int would visual as int & && This is a little different than GetPointeeType(), + but more clearly displays the data structure and seems natural --> + <Type Name="clang::LValueReferenceType"> + <DisplayString>{((clang::ReferenceType *)this)->PointeeType,view(cpp)} &</DisplayString> + <Expand> + <ExpandedItem>*(clang::Type *)this, view(cmn)</ExpandedItem> + <Item Name="PointeeType">PointeeType</Item> + </Expand> + </Type> + <Type Name="clang::RValueReferenceType"> + <DisplayString>{((clang::ReferenceType *)this)->PointeeType,view(cpp)} &&</DisplayString> + <Expand> + <ExpandedItem>*(clang::Type *)this, view(cmn)</ExpandedItem> + <Item Name="PointeeType">PointeeType</Item> </Expand> </Type> + <Type Name="clang::AttributedType"> + <DisplayString>{ModifiedType} Attribute={(clang::AttributedType::Kind)AttributedTypeBits.AttrKind}</DisplayString> + </Type> + <Type Name="clang::NamedDecl" > + <DisplayString IncludeView="cpp">{Name,view(cpp)}</DisplayString> + <DisplayString>{Name}</DisplayString> + </Type> + <Type Name="clang::TagDecl"> + <DisplayString Condition="TagDeclKind==clang::TagTypeKind::TTK_Struct">struct {Name,view(cpp)}</DisplayString> + <DisplayString Condition="TagDeclKind==clang::TagTypeKind::TTK_Interface">interface {Name,view(cpp)}</DisplayString> + <DisplayString Condition="TagDeclKind==clang::TagTypeKind::TTK_Union">union {Name,view(cpp)}</DisplayString> + <DisplayString Condition="TagDeclKind==clang::TagTypeKind::TTK_Class">class {Name,view(cpp)}</DisplayString> + <DisplayString Condition="TagDeclKind==clang::TagTypeKind::TTK_Enum">enum {Name,view(cpp)}</DisplayString> + </Type> <Type Name="clang::TagType"> <DisplayString>{*decl}</DisplayString> <Expand> + <ExpandedItem>*(clang::Type *)this, view(cmn)</ExpandedItem> <Item Name="decl">decl</Item> </Expand> </Type> <Type Name="clang::RecordType"> - <DisplayString>{*(clang::Type *)this, view(BaseOnly)}, {*(clang::TagType *)this}</DisplayString> + <DisplayString>{*(clang::TagType *)this}</DisplayString> <Expand> <Item Name="TagType">*(clang::TagType *)this</Item> </Expand> </Type> + <Type Name="clang::SubstTemplateTypeParmType"> - <DisplayString>{*(clang::Type *)this, view(BaseOnly)}: {*Replaced} => {CanonicalType}</DisplayString> + <DisplayString>{*Replaced,view(cpp)} <= {CanonicalType,view(cpp)}</DisplayString> <Expand> - <ExpandedItem>*(clang::Type *)this, view(BaseOnly)</ExpandedItem> + <ExpandedItem>*(clang::Type *)this, view(cmn)</ExpandedItem> <Item Name="Replaced">*Replaced</Item> </Expand> </Type> <Type Name="clang::TemplateTypeParmType"> - <DisplayString>{*TTPDecl}</DisplayString> + <DisplayString>typename {*TTPDecl,view(cpp)}</DisplayString> </Type> <Type Name="clang::QualType"> <!-- TODO: Qualifiers. Also, when VS2013 support is deprecated, change 4 to clang::TypeAlignmentInBits (not properly recognized by VS2013) --> + <DisplayString IncludeView="poly">{*((clang::ExtQualsTypeCommonBase *)(((uintptr_t)Value.Value) & ~(uintptr_t)((1 << 4) - 1)))->BaseType,view(poly)}</DisplayString> + <DisplayString IncludeView="cpp">{*((clang::ExtQualsTypeCommonBase *)(((uintptr_t)Value.Value) & ~(uintptr_t)((1 << 4) - 1)))->BaseType,view(cpp)}</DisplayString> <DisplayString>{*((clang::ExtQualsTypeCommonBase *)(((uintptr_t)Value.Value) & ~(uintptr_t)((1 << 4) - 1)))->BaseType}</DisplayString> <Expand> <Item Name="BaseType">*((clang::ExtQualsTypeCommonBase *)(((uintptr_t)Value.Value) & ~(uintptr_t)((1 << 4) - 1)))->BaseType</Item> @@ -70,22 +136,21 @@ <Item Name="Kind">(clang::BuiltinType::Kind)BuiltinTypeBits.Kind</Item> </Expand> </Type> - <Type Name="clang::NamedDecl"> - <DisplayString>{Name}</DisplayString> - </Type> + <Type Name="clang::TemplateSpecializationType"> <DisplayString Condition="(Template.Storage.Val.Val.Value & 3) != 3 && (Template.Storage.Val.Val.Value & 2) != 2 && (Template.Storage.Val.Val.Value & 1) != 1">{(clang::TemplateDecl *)((Template.Storage.Val.Val.Value >> 2) << 2)}</DisplayString> <DisplayString>{Template.Storage}</DisplayString> </Type> <Type Name="clang::IdentifierInfo"> - <DisplayString Condition="Entry != 0">({((llvm::StringMapEntry<clang::IdentifierInfo *>*)Entry)+1,s})</DisplayString> + <DisplayString Condition="Entry != 0">{((llvm::StringMapEntry<clang::IdentifierInfo *>*)Entry)+1,sb}</DisplayString> <Expand> <Item Condition="Entry != 0" Name="[Identifier]">((llvm::StringMapEntry<clang::IdentifierInfo *>*)Entry)+1,s</Item> <Item Name="Token Kind">(clang::tok::TokenKind)TokenID</Item> </Expand> </Type> <Type Name="clang::DeclarationName"> <DisplayString Condition="Ptr == 0">Empty</DisplayString> + <DisplayString Condition="(Ptr & PtrMask) == StoredIdentifier" IncludeView="cpp">{*(clang::IdentifierInfo *)(Ptr & ~PtrMask)}</DisplayString> <DisplayString Condition="(Ptr & PtrMask) == StoredIdentifier">{{Identifier ({*(clang::IdentifierInfo *)(Ptr & ~PtrMask)})}}</DisplayString> <DisplayString Condition="(Ptr & PtrMask) == StoredObjCZeroArgSelector">{{ObjC Zero Arg Selector (*{(clang::IdentifierInfo *)(Ptr & ~PtrMask)})}}</DisplayString> <DisplayString Condition="(Ptr & PtrMask) == StoredObjCOneArgSelector">{{ObjC One Arg Selector (*{(clang::IdentifierInfo *)(Ptr & ~PtrMask)})}}</DisplayString>
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits