Author: Kadir Cetinkaya Date: 2021-10-25T13:16:14+02:00 New Revision: 4e4511df8d33a6fc02d5e46c681855db495187cd
URL: https://github.com/llvm/llvm-project/commit/4e4511df8d33a6fc02d5e46c681855db495187cd DIFF: https://github.com/llvm/llvm-project/commit/4e4511df8d33a6fc02d5e46c681855db495187cd.diff LOG: [clang] Traverse enum base specifier in RAV Added: Modified: clang-tools-extra/clangd/unittests/SelectionTests.cpp clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp clang-tools-extra/clangd/unittests/XRefsTests.cpp clang/include/clang/AST/RecursiveASTVisitor.h clang/unittests/AST/RecursiveASTVisitorTest.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clangd/unittests/SelectionTests.cpp b/clang-tools-extra/clangd/unittests/SelectionTests.cpp index 5a45e5bde8fae..1c3bc20958486 100644 --- a/clang-tools-extra/clangd/unittests/SelectionTests.cpp +++ b/clang-tools-extra/clangd/unittests/SelectionTests.cpp @@ -473,7 +473,19 @@ TEST(SelectionTest, CommonAncestor) { [[@property(retain, nonnull) <:[My^Object2]:> *x]]; // error-ok @end )cpp", - "ObjCPropertyDecl"}}; + "ObjCPropertyDecl"}, + + {R"cpp( + typedef int Foo; + enum Bar : [[Fo^o]] {}; + )cpp", + "TypedefTypeLoc"}, + {R"cpp( + typedef int Foo; + enum Bar : [[Fo^o]]; + )cpp", + "TypedefTypeLoc"}, + }; for (const Case &C : Cases) { trace::TestTracer Tracer; diff --git a/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp b/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp index 4653490f5b036..acada4180b0fe 100644 --- a/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp +++ b/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp @@ -780,6 +780,16 @@ sizeof...($TemplateParameter[[Elements]]); $LocalVariable_decl[[d]]($LocalVariable[[b]]) ]() {}(); } )cpp", + // Enum base specifier + R"cpp( + using $Primitive_decl[[MyTypedef]] = int; + enum $Enum_decl[[MyEnum]] : $Primitive[[MyTypedef]] {}; + )cpp", + // Enum base specifier + R"cpp( + typedef int $Primitive_decl[[MyTypedef]]; + enum $Enum_decl[[MyEnum]] : $Primitive[[MyTypedef]] {}; + )cpp", }; for (const auto &TestCase : TestCases) // Mask off scope modifiers to keep the tests manageable. diff --git a/clang-tools-extra/clangd/unittests/XRefsTests.cpp b/clang-tools-extra/clangd/unittests/XRefsTests.cpp index 1f41dcd69913c..99a6b6e9d8bee 100644 --- a/clang-tools-extra/clangd/unittests/XRefsTests.cpp +++ b/clang-tools-extra/clangd/unittests/XRefsTests.cpp @@ -880,6 +880,19 @@ TEST(LocateSymbol, All) { }; )cpp", + R"cpp(// Enum base + typedef int $decl[[MyTypeDef]]; + enum Foo : My^TypeDef {}; + )cpp", + R"cpp(// Enum base + typedef int $decl[[MyTypeDef]]; + enum Foo : My^TypeDef; + )cpp", + R"cpp(// Enum base + using $decl[[MyTypeDef]] = int; + enum Foo : My^TypeDef {}; + )cpp", + R"objc( @protocol Dog; @protocol $decl[[Dog]] diff --git a/clang/include/clang/AST/RecursiveASTVisitor.h b/clang/include/clang/AST/RecursiveASTVisitor.h index 9b261e8540dac..dfc1bd35e51f9 100644 --- a/clang/include/clang/AST/RecursiveASTVisitor.h +++ b/clang/include/clang/AST/RecursiveASTVisitor.h @@ -1867,6 +1867,8 @@ DEF_TRAVERSE_DECL(EnumDecl, { TRY_TO(TraverseType(QualType(D->getTypeForDecl(), 0))); TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc())); + if (auto *TSI = D->getIntegerTypeSourceInfo()) + TRY_TO(TraverseTypeLoc(TSI->getTypeLoc())); // The enumerators are already traversed by // decls_begin()/decls_end(). }) diff --git a/clang/unittests/AST/RecursiveASTVisitorTest.cpp b/clang/unittests/AST/RecursiveASTVisitorTest.cpp index aa8756527d315..f44a5eca18728 100644 --- a/clang/unittests/AST/RecursiveASTVisitorTest.cpp +++ b/clang/unittests/AST/RecursiveASTVisitorTest.cpp @@ -10,6 +10,8 @@ #include "clang/AST/ASTConsumer.h" #include "clang/AST/ASTContext.h" #include "clang/AST/Attr.h" +#include "clang/AST/Decl.h" +#include "clang/AST/TypeLoc.h" #include "clang/Frontend/FrontendAction.h" #include "clang/Tooling/Tooling.h" #include "llvm/ADT/FunctionExtras.h" @@ -53,7 +55,11 @@ enum class VisitEvent { StartTraverseFunction, EndTraverseFunction, StartTraverseAttr, - EndTraverseAttr + EndTraverseAttr, + StartTraverseEnum, + EndTraverseEnum, + StartTraverseTypedefType, + EndTraverseTypedefType, }; class CollectInterestingEvents @@ -75,6 +81,22 @@ class CollectInterestingEvents return Ret; } + bool TraverseEnumDecl(EnumDecl *D) { + Events.push_back(VisitEvent::StartTraverseEnum); + bool Ret = RecursiveASTVisitor::TraverseEnumDecl(D); + Events.push_back(VisitEvent::EndTraverseEnum); + + return Ret; + } + + bool TraverseTypedefTypeLoc(TypedefTypeLoc TL) { + Events.push_back(VisitEvent::StartTraverseTypedefType); + bool Ret = RecursiveASTVisitor::TraverseTypedefTypeLoc(TL); + Events.push_back(VisitEvent::EndTraverseTypedefType); + + return Ret; + } + std::vector<VisitEvent> takeEvents() && { return std::move(Events); } private: @@ -103,3 +125,17 @@ __attribute__((annotate("something"))) int foo() { return 10; } VisitEvent::EndTraverseAttr, VisitEvent::EndTraverseFunction)); } + +TEST(RecursiveASTVisitorTest, EnumDeclWithBase) { + // Check enum and its integer base is visited. + llvm::StringRef Code = R"cpp( + typedef int Foo; + enum Bar : Foo; + )cpp"; + + EXPECT_THAT(collectEvents(Code), + ElementsAre(VisitEvent::StartTraverseEnum, + VisitEvent::StartTraverseTypedefType, + VisitEvent::EndTraverseTypedefType, + VisitEvent::EndTraverseEnum)); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits