diff --git a/clang/lib/AST/StmtProfile.cpp b/clang/lib/AST/StmtProfile.cpp index 0698d2f6094d..5cac91d6b6ef 100644 --- a/clang/lib/AST/StmtProfile.cpp +++ b/clang/lib/AST/StmtProfile.cpp @@ -12,6 +12,8 @@ // //===----------------------------------------------------------------------===// #include "clang/AST/ASTContext.h" +#include "clang/AST/DeclCXX.h" +#include "clang/AST/DeclObjC.h" #include "clang/AST/DeclTemplate.h" #include "clang/AST/Expr.h" #include "clang/AST/ExprCXX.h" @@ -32,69 +34,10 @@ namespace { bool Canonical) : ID(ID), Context(Context), Canonical(Canonical) { } - // FIXME: Use StmtNodes.def to declare all VisitXXX functions - void VisitStmt(Stmt *S); - void VisitExpr(Expr *S); - void VisitDeclRefExpr(DeclRefExpr *S); - void VisitPredefinedExpr(PredefinedExpr *S); - void VisitIntegerLiteral(IntegerLiteral *S); - void VisitCharacterLiteral(CharacterLiteral *S); - void VisitFloatingLiteral(FloatingLiteral *S); - void VisitImaginaryLiteral(ImaginaryLiteral *S); - void VisitStringLiteral(StringLiteral *S); - void VisitParenExpr(ParenExpr *S); - void VisitUnaryOperator(UnaryOperator *S); - void VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *S); - void VisitArraySubscriptExpr(ArraySubscriptExpr *S); - void VisitCallExpr(CallExpr *S); - void VisitMemberExpr(MemberExpr *S); - void VisitCompoundLiteralExpr(CompoundLiteralExpr *S); - void VisitCastExpr(CastExpr *S); - void VisitImplicitCastExpr(ImplicitCastExpr *S); - void VisitExplicitCastExpr(ExplicitCastExpr *S); - void VisitCStyleCastExpr(CStyleCastExpr *S); - void VisitBinaryOperator(BinaryOperator *S); - void VisitCompoundAssignOperator(CompoundAssignOperator *S); - void VisitConditionalOperator(ConditionalOperator *S); - void VisitAddrLabelExpr(AddrLabelExpr *S); - void VisitStmtExpr(StmtExpr *S); - void VisitTypesCompatibleExpr(TypesCompatibleExpr *S); - void VisitShuffleVectorExpr(ShuffleVectorExpr *S); - void VisitChooseExpr(ChooseExpr *S); - void VisitGNUNullExpr(GNUNullExpr *S); - void VisitInitListExpr(InitListExpr *S); - void VisitDesignatedInitExpr(DesignatedInitExpr *S); - void VisitImplicitValueInitExpr(ImplicitValueInitExpr *S); - void VisitExtVectorElementExpr(ExtVectorElementExpr *S); - void VisitBlockExpr(BlockExpr *S); - void VisitBlockDeclRefExpr(BlockDeclRefExpr *S); - void VisitCXXOperatorCallExpr(CXXOperatorCallExpr *S); - void VisitCXXMemberCallExpr(CXXMemberCallExpr *S); - void VisitCXXNamedCastExpr(CXXNamedCastExpr *S); - void VisitCXXStaticCastExpr(CXXStaticCastExpr *S); - void VisitCXXDynamicCastExpr(CXXDynamicCastExpr *S); - void VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *S); - void VisitCXXConstCastExpr(CXXConstCastExpr *S); - void VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *S); - void VisitCXXTypeidExpr(CXXTypeidExpr *S); - void VisitCXXThisExpr(CXXThisExpr *S); - void VisitCXXThrowExpr(CXXThrowExpr *S); - void VisitCXXDefaultArgExpr(CXXDefaultArgExpr *S); - void VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *S); - void VisitCXXConstructExpr(CXXConstructExpr *S); - void VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *S); - void VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *S); - void VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *S); - void VisitCXXConditionDeclExpr(CXXConditionDeclExpr *S); - void VisitCXXNewExpr(CXXNewExpr *S); - void VisitCXXDeleteExpr(CXXDeleteExpr *S); - void VisitUnresolvedFunctionNameExpr(UnresolvedFunctionNameExpr *S); - void VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *S); - void VisitQualifiedDeclRefExpr(QualifiedDeclRefExpr *S); - void VisitUnresolvedDeclRefExpr(UnresolvedDeclRefExpr *S); - void VisitTemplateIdRefExpr(TemplateIdRefExpr *S); - // FIXME: pick up at CXXExprWithTemporaries, handle Objective-C expressions +#define STMT(Node, Base) +#define EXPR(Node, Base) void Visit##Node(Node *S); +#include "clang/AST/StmtNodes.def" /// \brief Visit a declaration that is referenced within an expression /// or statement. @@ -463,6 +406,79 @@ void StmtProfiler::VisitTemplateIdRefExpr(TemplateIdRefExpr *S) { VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs()); } +void StmtProfiler::VisitCXXExprWithTemporaries(CXXExprWithTemporaries *S) { + VisitExpr(S); + ID.AddBoolean(S->shouldDestroyTemporaries()); + for (unsigned I = 0, N = S->getNumTemporaries(); I != N; ++I) + VisitDecl( + const_cast(S->getTemporary(I)->getDestructor())); +} + +void +StmtProfiler::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *S) { + VisitExpr(S); + VisitType(S->getTypeAsWritten()); +} + +void StmtProfiler::VisitCXXUnresolvedMemberExpr(CXXUnresolvedMemberExpr *S) { + VisitExpr(S); + ID.AddBoolean(S->isArrow()); + VisitName(S->getMember()); +} + +void StmtProfiler::VisitObjCStringLiteral(ObjCStringLiteral *S) { + VisitExpr(S); +} + +void StmtProfiler::VisitObjCEncodeExpr(ObjCEncodeExpr *S) { + VisitExpr(S); + VisitType(S->getEncodedType()); +} + +void StmtProfiler::VisitObjCSelectorExpr(ObjCSelectorExpr *S) { + VisitExpr(S); + VisitName(S->getSelector()); +} + +void StmtProfiler::VisitObjCProtocolExpr(ObjCProtocolExpr *S) { + VisitExpr(S); + VisitDecl(S->getProtocol()); +} + +void StmtProfiler::VisitObjCIvarRefExpr(ObjCIvarRefExpr *S) { + VisitExpr(S); + VisitDecl(S->getDecl()); + ID.AddBoolean(S->isArrow()); + ID.AddBoolean(S->isFreeIvar()); +} + +void StmtProfiler::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *S) { + VisitExpr(S); + VisitDecl(S->getProperty()); +} + +void StmtProfiler::VisitObjCKVCRefExpr(ObjCKVCRefExpr *S) { + VisitExpr(S); + VisitDecl(S->getGetterMethod()); + VisitDecl(S->getSetterMethod()); + VisitDecl(S->getClassProp()); +} + +void StmtProfiler::VisitObjCMessageExpr(ObjCMessageExpr *S) { + VisitExpr(S); + VisitName(S->getSelector()); + VisitDecl(S->getMethodDecl()); +} + +void StmtProfiler::VisitObjCSuperExpr(ObjCSuperExpr *S) { + VisitExpr(S); +} + +void StmtProfiler::VisitObjCIsaExpr(ObjCIsaExpr *S) { + VisitExpr(S); + ID.AddBoolean(S->isArrow()); +} + void StmtProfiler::VisitType(QualType T) { if (Canonical) { if (const TemplateTypeParmType *TTP = T->getAs()) {