On Tue, Jan 15, 2019 at 4:33 AM Stephen Kelly via cfe-commits <cfe-commits@lists.llvm.org> wrote: > > Author: steveire > Date: Tue Jan 15 01:30:00 2019 > New Revision: 351172 > > URL: http://llvm.org/viewvc/llvm-project?rev=351172&view=rev > Log: > [ASTDump] NFC: Move dump of type nodes to NodeDumper > > Reviewers: aaron.ballman > > Subscribers: cfe-commits > > Differential Revision: https://reviews.llvm.org/D56642 > > Modified: > cfe/trunk/include/clang/AST/TextNodeDumper.h > cfe/trunk/lib/AST/ASTDumper.cpp > cfe/trunk/lib/AST/TextNodeDumper.cpp > > Modified: cfe/trunk/include/clang/AST/TextNodeDumper.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/TextNodeDumper.h?rev=351172&r1=351171&r2=351172&view=diff > ============================================================================== > --- cfe/trunk/include/clang/AST/TextNodeDumper.h (original) > +++ cfe/trunk/include/clang/AST/TextNodeDumper.h Tue Jan 15 01:30:00 2019 > @@ -22,6 +22,7 @@ > #include "clang/AST/ExprCXX.h" > #include "clang/AST/StmtVisitor.h" > #include "clang/AST/TemplateArgumentVisitor.h" > +#include "clang/AST/TypeVisitor.h" > > namespace clang { > > @@ -127,7 +128,8 @@ class TextNodeDumper > const comments::FullComment *>, > public ConstAttrVisitor<TextNodeDumper>, > public ConstTemplateArgumentVisitor<TextNodeDumper>, > - public ConstStmtVisitor<TextNodeDumper> { > + public ConstStmtVisitor<TextNodeDumper>, > + public TypeVisitor<TextNodeDumper> { > raw_ostream &OS; > const bool ShowColors; > > @@ -259,6 +261,26 @@ public: > void VisitObjCIvarRefExpr(const ObjCIvarRefExpr *Node); > void VisitObjCBoolLiteralExpr(const ObjCBoolLiteralExpr *Node); > > + void VisitRValueReferenceType(const ReferenceType *T); > + void VisitArrayType(const ArrayType *T); > + void VisitConstantArrayType(const ConstantArrayType *T); > + void VisitVariableArrayType(const VariableArrayType *T); > + void VisitDependentSizedArrayType(const DependentSizedArrayType *T); > + void VisitDependentSizedExtVectorType(const DependentSizedExtVectorType > *T); > + void VisitVectorType(const VectorType *T); > + void VisitFunctionType(const FunctionType *T); > + void VisitFunctionProtoType(const FunctionProtoType *T); > + void VisitUnresolvedUsingType(const UnresolvedUsingType *T); > + void VisitTypedefType(const TypedefType *T); > + void VisitUnaryTransformType(const UnaryTransformType *T); > + void VisitTagType(const TagType *T); > + void VisitTemplateTypeParmType(const TemplateTypeParmType *T); > + void VisitAutoType(const AutoType *T); > + void VisitTemplateSpecializationType(const TemplateSpecializationType *T); > + void VisitInjectedClassNameType(const InjectedClassNameType *T); > + void VisitObjCInterfaceType(const ObjCInterfaceType *T); > + void VisitPackExpansionType(const PackExpansionType *T); > + > private: > void dumpCXXTemporary(const CXXTemporary *Temporary); > }; > > Modified: cfe/trunk/lib/AST/ASTDumper.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTDumper.cpp?rev=351172&r1=351171&r2=351172&view=diff > ============================================================================== > --- cfe/trunk/lib/AST/ASTDumper.cpp (original) > +++ cfe/trunk/lib/AST/ASTDumper.cpp Tue Jan 15 01:30:00 2019 > @@ -134,99 +134,39 @@ namespace { > void VisitReferenceType(const ReferenceType *T) { > dumpTypeAsChild(T->getPointeeType()); > } > - void VisitRValueReferenceType(const ReferenceType *T) { > - if (T->isSpelledAsLValue()) > - OS << " written as lvalue reference"; > - VisitReferenceType(T); > - } > void VisitMemberPointerType(const MemberPointerType *T) { > dumpTypeAsChild(T->getClass()); > dumpTypeAsChild(T->getPointeeType()); > } > void VisitArrayType(const ArrayType *T) { > - switch (T->getSizeModifier()) { > - case ArrayType::Normal: break; > - case ArrayType::Static: OS << " static"; break; > - case ArrayType::Star: OS << " *"; break; > - } > - OS << " " << T->getIndexTypeQualifiers().getAsString(); > dumpTypeAsChild(T->getElementType()); > } > - void VisitConstantArrayType(const ConstantArrayType *T) { > - OS << " " << T->getSize(); > - VisitArrayType(T); > - } > void VisitVariableArrayType(const VariableArrayType *T) { > - OS << " "; > - NodeDumper.dumpSourceRange(T->getBracketsRange()); > VisitArrayType(T); > dumpStmt(T->getSizeExpr()); > } > void VisitDependentSizedArrayType(const DependentSizedArrayType *T) { > - switch (T->getSizeModifier()) { > - case ArrayType::Normal: break; > - case ArrayType::Static: OS << " static"; break; > - case ArrayType::Star: OS << " *"; break; > - } > - OS << " " << T->getIndexTypeQualifiers().getAsString(); > - OS << " "; > - NodeDumper.dumpSourceRange(T->getBracketsRange()); > dumpTypeAsChild(T->getElementType()); > dumpStmt(T->getSizeExpr()); > } > void VisitDependentSizedExtVectorType( > const DependentSizedExtVectorType *T) { > - OS << " "; > - NodeDumper.dumpLocation(T->getAttributeLoc()); > dumpTypeAsChild(T->getElementType()); > dumpStmt(T->getSizeExpr()); > } > void VisitVectorType(const VectorType *T) { > - switch (T->getVectorKind()) { > - case VectorType::GenericVector: break; > - case VectorType::AltiVecVector: OS << " altivec"; break; > - case VectorType::AltiVecPixel: OS << " altivec pixel"; break; > - case VectorType::AltiVecBool: OS << " altivec bool"; break; > - case VectorType::NeonVector: OS << " neon"; break; > - case VectorType::NeonPolyVector: OS << " neon poly"; break; > - } > - OS << " " << T->getNumElements(); > dumpTypeAsChild(T->getElementType()); > } > void VisitFunctionType(const FunctionType *T) { > - auto EI = T->getExtInfo(); > - if (EI.getNoReturn()) OS << " noreturn"; > - if (EI.getProducesResult()) OS << " produces_result"; > - if (EI.getHasRegParm()) OS << " regparm " << EI.getRegParm(); > - OS << " " << FunctionType::getNameForCallConv(EI.getCC()); > dumpTypeAsChild(T->getReturnType()); > } > void VisitFunctionProtoType(const FunctionProtoType *T) { > - auto EPI = T->getExtProtoInfo(); > - if (EPI.HasTrailingReturn) OS << " trailing_return"; > - > - if (!T->getTypeQuals().empty()) > - OS << " " << T->getTypeQuals().getAsString(); > - > - switch (EPI.RefQualifier) { > - case RQ_None: break; > - case RQ_LValue: OS << " &"; break; > - case RQ_RValue: OS << " &&"; break; > - } > - // FIXME: Exception specification. > - // FIXME: Consumed parameters. > VisitFunctionType(T); > for (QualType PT : T->getParamTypes()) > dumpTypeAsChild(PT); > - if (EPI.Variadic) > + if (T->getExtProtoInfo().Variadic) > dumpChild([=] { OS << "..."; }); > } > - void VisitUnresolvedUsingType(const UnresolvedUsingType *T) { > - NodeDumper.dumpDeclRef(T->getDecl()); > - } > - void VisitTypedefType(const TypedefType *T) { > - NodeDumper.dumpDeclRef(T->getDecl()); > - } > void VisitTypeOfExprType(const TypeOfExprType *T) { > dumpStmt(T->getUnderlyingExpr()); > } > @@ -234,25 +174,12 @@ namespace { > dumpStmt(T->getUnderlyingExpr()); > } > void VisitUnaryTransformType(const UnaryTransformType *T) { > - switch (T->getUTTKind()) { > - case UnaryTransformType::EnumUnderlyingType: > - OS << " underlying_type"; > - break; > - } > dumpTypeAsChild(T->getBaseType()); > } > - void VisitTagType(const TagType *T) { > - NodeDumper.dumpDeclRef(T->getDecl()); > - } > void VisitAttributedType(const AttributedType *T) { > // FIXME: AttrKind > dumpTypeAsChild(T->getModifiedType()); > } > - void VisitTemplateTypeParmType(const TemplateTypeParmType *T) { > - OS << " depth " << T->getDepth() << " index " << T->getIndex(); > - if (T->isParameterPack()) OS << " pack"; > - NodeDumper.dumpDeclRef(T->getDecl()); > - } > void VisitSubstTemplateTypeParmType(const SubstTemplateTypeParmType *T) { > dumpTypeAsChild(T->getReplacedParameter()); > } > @@ -261,25 +188,12 @@ namespace { > dumpTypeAsChild(T->getReplacedParameter()); > dumpTemplateArgument(T->getArgumentPack()); > } > - void VisitAutoType(const AutoType *T) { > - if (T->isDecltypeAuto()) OS << " decltype(auto)"; > - if (!T->isDeduced()) > - OS << " undeduced"; > - } > void VisitTemplateSpecializationType(const TemplateSpecializationType > *T) { > - if (T->isTypeAlias()) OS << " alias"; > - OS << " "; T->getTemplateName().dump(OS); > for (auto &Arg : *T) > dumpTemplateArgument(Arg); > if (T->isTypeAlias()) > dumpTypeAsChild(T->getAliasedType()); > } > - void VisitInjectedClassNameType(const InjectedClassNameType *T) { > - NodeDumper.dumpDeclRef(T->getDecl()); > - } > - void VisitObjCInterfaceType(const ObjCInterfaceType *T) { > - NodeDumper.dumpDeclRef(T->getDecl()); > - } > void VisitObjCObjectPointerType(const ObjCObjectPointerType *T) { > dumpTypeAsChild(T->getPointeeType()); > } > @@ -293,7 +207,6 @@ namespace { > dumpTypeAsChild(T->getOriginalType()); > } > void VisitPackExpansionType(const PackExpansionType *T) { > - if (auto N = T->getNumExpansions()) OS << " expansions " << *N; > if (!T->isSugared()) > dumpTypeAsChild(T->getPattern()); > } > > Modified: cfe/trunk/lib/AST/TextNodeDumper.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/TextNodeDumper.cpp?rev=351172&r1=351171&r2=351172&view=diff > ============================================================================== > --- cfe/trunk/lib/AST/TextNodeDumper.cpp (original) > +++ cfe/trunk/lib/AST/TextNodeDumper.cpp Tue Jan 15 01:30:00 2019 > @@ -12,6 +12,7 @@ > > //===----------------------------------------------------------------------===// > > #include "clang/AST/TextNodeDumper.h" > +#include "clang/AST/DeclTemplate.h" > #include "clang/AST/LocInfoType.h" > > using namespace clang; > @@ -170,6 +171,8 @@ void TextNodeDumper::Visit(const Type *T > OS << " contains_unexpanded_pack"; > if (T->isFromAST()) > OS << " imported"; > + > + TypeVisitor<TextNodeDumper>::Visit(T); > } > > void TextNodeDumper::Visit(QualType T) { > @@ -886,3 +889,161 @@ void TextNodeDumper::VisitObjCSubscriptR > void TextNodeDumper::VisitObjCBoolLiteralExpr(const ObjCBoolLiteralExpr > *Node) { > OS << " " << (Node->getValue() ? "__objc_yes" : "__objc_no"); > } > + > +void TextNodeDumper::VisitRValueReferenceType(const ReferenceType *T) { > + if (T->isSpelledAsLValue()) > + OS << " written as lvalue reference"; > +} > + > +void TextNodeDumper::VisitArrayType(const ArrayType *T) { > + switch (T->getSizeModifier()) { > + case ArrayType::Normal: > + break; > + case ArrayType::Static: > + OS << " static"; > + break; > + case ArrayType::Star: > + OS << " *"; > + break; > + } > + OS << " " << T->getIndexTypeQualifiers().getAsString(); > +} > + > +void TextNodeDumper::VisitConstantArrayType(const ConstantArrayType *T) { > + OS << " " << T->getSize(); > + VisitArrayType(T); > +} > + > +void TextNodeDumper::VisitVariableArrayType(const VariableArrayType *T) { > + OS << " "; > + dumpSourceRange(T->getBracketsRange()); > + VisitArrayType(T); > +} > + > +void TextNodeDumper::VisitDependentSizedArrayType( > + const DependentSizedArrayType *T) { > + VisitArrayType(T); > + OS << " "; > + dumpSourceRange(T->getBracketsRange()); > +} > + > +void TextNodeDumper::VisitDependentSizedExtVectorType( > + const DependentSizedExtVectorType *T) { > + OS << " "; > + dumpLocation(T->getAttributeLoc()); > +} > + > +void TextNodeDumper::VisitVectorType(const VectorType *T) { > + switch (T->getVectorKind()) { > + case VectorType::GenericVector: > + break; > + case VectorType::AltiVecVector: > + OS << " altivec"; > + break; > + case VectorType::AltiVecPixel: > + OS << " altivec pixel"; > + break; > + case VectorType::AltiVecBool: > + OS << " altivec bool"; > + break; > + case VectorType::NeonVector: > + OS << " neon"; > + break; > + case VectorType::NeonPolyVector: > + OS << " neon poly"; > + break; > + } > + OS << " " << T->getNumElements(); > +} > + > +void TextNodeDumper::VisitFunctionType(const FunctionType *T) { > + auto EI = T->getExtInfo(); > + if (EI.getNoReturn()) > + OS << " noreturn"; > + if (EI.getProducesResult()) > + OS << " produces_result"; > + if (EI.getHasRegParm()) > + OS << " regparm " << EI.getRegParm(); > + OS << " " << FunctionType::getNameForCallConv(EI.getCC()); > +} > + > +void TextNodeDumper::VisitFunctionProtoType(const FunctionProtoType *T) { > + auto EPI = T->getExtProtoInfo(); > + if (EPI.HasTrailingReturn) > + OS << " trailing_return"; > + if (T->isConst()) > + OS << " const"; > + if (T->isVolatile()) > + OS << " volatile"; > + if (T->isRestrict()) > + OS << " restrict"; > + switch (EPI.RefQualifier) { > + case RQ_None: > + break; > + case RQ_LValue: > + OS << " &"; > + break; > + case RQ_RValue: > + OS << " &&"; > + break; > + } > + // FIXME: Exception specification. > + // FIXME: Consumed parameters. > + VisitFunctionType(T); > +} > + > +void TextNodeDumper::VisitUnresolvedUsingType(const UnresolvedUsingType *T) { > + dumpDeclRef(T->getDecl()); > +} > + > +void TextNodeDumper::VisitTypedefType(const TypedefType *T) { > + dumpDeclRef(T->getDecl()); > +} > + > +void TextNodeDumper::VisitUnaryTransformType(const UnaryTransformType *T) { > + switch (T->getUTTKind()) { > + case UnaryTransformType::EnumUnderlyingType: > + OS << " underlying_type"; > + break; > + } > +} > + > +void TextNodeDumper::VisitTagType(const TagType *T) { > + dumpDeclRef(T->getDecl()); > +} > + > +void TextNodeDumper::VisitTemplateTypeParmType(const TemplateTypeParmType > *T) { > + OS << " depth " << T->getDepth() << " index " << T->getIndex(); > + if (T->isParameterPack()) > + OS << " pack"; > + dumpDeclRef(T->getDecl()); > +} > + > +void TextNodeDumper::VisitAutoType(const AutoType *T) { > + if (T->isDecltypeAuto()) > + OS << " decltype(auto)"; > + if (!T->isDeduced()) > + OS << " undeduced"; > +} > + > +void TextNodeDumper::VisitTemplateSpecializationType( > + const TemplateSpecializationType *T) { > + if (T->isTypeAlias()) > + OS << " alias"; > + OS << " "; > + T->getTemplateName().dump(OS); > +} > + > +void TextNodeDumper::VisitInjectedClassNameType( > + const InjectedClassNameType *T) { > + dumpDeclRef(T->getDecl()); > +} > + > +void TextNodeDumper::VisitObjCInterfaceType(const ObjCInterfaceType *T) { > + dumpDeclRef(T->getDecl()); > +} > + > +void TextNodeDumper::VisitPackExpansionType(const PackExpansionType *T) { > + if (auto N = T->getNumExpansions())
It looks like the auto nits didn't get cleaned up. Can you handle those? ~Aaron > + OS << " expansions " << *N; > +} > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits