From: Alp Toker Date: Fri, 6 Jun 2014 15:05:09 +0000 (+0000) Subject: Fix RecursiveASTVisitor to visit types in ObjCPropertyDecl X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b07a1f40dae10582100bd099edb64dfc9d6ce71d;p=clang Fix RecursiveASTVisitor to visit types in ObjCPropertyDecl Patch by Mathieu Baudet! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@210339 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/DataRecursiveASTVisitor.h b/include/clang/AST/DataRecursiveASTVisitor.h index 829f6c9c77..acee4457c5 100644 --- a/include/clang/AST/DataRecursiveASTVisitor.h +++ b/include/clang/AST/DataRecursiveASTVisitor.h @@ -1322,8 +1322,13 @@ DEF_TRAVERSE_DECL(ObjCMethodDecl, { return true; }) -DEF_TRAVERSE_DECL(ObjCPropertyDecl, {// FIXME: implement - }) +DEF_TRAVERSE_DECL(ObjCPropertyDecl, { + if (D->getTypeSourceInfo()) + TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc())); + else + TRY_TO(TraverseType(D->getType())); + return true; +}) DEF_TRAVERSE_DECL(UsingDecl, { TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc())); diff --git a/include/clang/AST/RecursiveASTVisitor.h b/include/clang/AST/RecursiveASTVisitor.h index 1fee8a98c8..12664d0ce8 100644 --- a/include/clang/AST/RecursiveASTVisitor.h +++ b/include/clang/AST/RecursiveASTVisitor.h @@ -1394,8 +1394,13 @@ DEF_TRAVERSE_DECL(ObjCMethodDecl, { return true; }) -DEF_TRAVERSE_DECL(ObjCPropertyDecl, {// FIXME: implement - }) +DEF_TRAVERSE_DECL(ObjCPropertyDecl, { + if (D->getTypeSourceInfo()) + TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc())); + else + TRY_TO(TraverseType(D->getType())); + return true; +}) DEF_TRAVERSE_DECL(UsingDecl, { TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc())); diff --git a/unittests/Tooling/RecursiveASTVisitorTest.cpp b/unittests/Tooling/RecursiveASTVisitorTest.cpp index 837a15fa88..6be734e6d4 100644 --- a/unittests/Tooling/RecursiveASTVisitorTest.cpp +++ b/unittests/Tooling/RecursiveASTVisitorTest.cpp @@ -531,6 +531,15 @@ TEST(RecursiveASTVisitor, VisitsCompoundLiteralType) { TypeLocVisitor::Lang_C)); } +TEST(RecursiveASTVisitor, VisitsObjCPropertyType) { + TypeLocVisitor Visitor; + Visitor.ExpectMatch("NSNumber", 2, 33); + EXPECT_TRUE(Visitor.runOver( + "@class NSNumber; \n" + "@interface A @property (retain) NSNumber *x; @end\n", + TypeLocVisitor::Lang_OBJC)); +} + TEST(RecursiveASTVisitor, VisitsLambdaExpr) { LambdaExprVisitor Visitor; Visitor.ExpectMatch("", 1, 12); diff --git a/unittests/Tooling/TestVisitor.h b/unittests/Tooling/TestVisitor.h index ec751c350e..2e64032cf4 100644 --- a/unittests/Tooling/TestVisitor.h +++ b/unittests/Tooling/TestVisitor.h @@ -39,7 +39,7 @@ public: virtual ~TestVisitor() { } - enum Language { Lang_C, Lang_CXX98, Lang_CXX11, Lang_CXX=Lang_CXX98 }; + enum Language { Lang_C, Lang_CXX98, Lang_CXX11, Lang_OBJC, Lang_CXX=Lang_CXX98 }; /// \brief Runs the current AST visitor over the given code. bool runOver(StringRef Code, Language L = Lang_CXX) { @@ -48,6 +48,7 @@ public: case Lang_C: Args.push_back("-std=c99"); break; case Lang_CXX98: Args.push_back("-std=c++98"); break; case Lang_CXX11: Args.push_back("-std=c++11"); break; + case Lang_OBJC: Args.push_back("-ObjC"); break; } return tooling::runToolOnCodeWithArgs(CreateTestAction(), Code, Args); }