[clang-tools-extra] 4e4511d - [clang] Traverse enum base specifier in RAV

Kadir Cetinkaya via cfe-commits cfe-commits at lists.llvm.org
Mon Oct 25 04:16:50 PDT 2021


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));
+}


        


More information about the cfe-commits mailing list