forked from OSchip/llvm-project
[ASTDump] NFC: Move dump of type nodes to NodeDumper
Reviewers: aaron.ballman Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D56642 llvm-svn: 351172
This commit is contained in:
parent
73a272354d
commit
f08ca204ac
|
@ -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);
|
||||
};
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -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::VisitObjCSubscriptRefExpr(
|
|||
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())
|
||||
OS << " expansions " << *N;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue