summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephen Kelly <steveire@gmail.com>2019-01-15 09:30:00 +0000
committerStephen Kelly <steveire@gmail.com>2019-01-15 09:30:00 +0000
commit3cc25e326d784f0a6a796d5ca14e7f69d90e3ae7 (patch)
tree42579dcbee6244f8275c476ce13631a9a68ca786
parent9e327827d37a9d18d516fe7a027f373b01cac407 (diff)
[ASTDump] NFC: Move dump of type nodes to NodeDumper
Reviewers: aaron.ballman Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D56642
-rw-r--r--clang/include/clang/AST/TextNodeDumper.h24
-rw-r--r--clang/lib/AST/ASTDumper.cpp89
-rw-r--r--clang/lib/AST/TextNodeDumper.cpp161
3 files changed, 185 insertions, 89 deletions
diff --git a/clang/include/clang/AST/TextNodeDumper.h b/clang/include/clang/AST/TextNodeDumper.h
index 239435e98b7..4ff9f0c10dd 100644
--- a/clang/include/clang/AST/TextNodeDumper.h
+++ b/clang/include/clang/AST/TextNodeDumper.h
@@ -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);
};
diff --git a/clang/lib/AST/ASTDumper.cpp b/clang/lib/AST/ASTDumper.cpp
index 93a5f8b8a23..83d3b728896 100644
--- a/clang/lib/AST/ASTDumper.cpp
+++ b/clang/lib/AST/ASTDumper.cpp
@@ -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());
}
diff --git a/clang/lib/AST/TextNodeDumper.cpp b/clang/lib/AST/TextNodeDumper.cpp
index c106d0814d3..9e7402472b7 100644
--- a/clang/lib/AST/TextNodeDumper.cpp
+++ b/clang/lib/AST/TextNodeDumper.cpp
@@ -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;
+}