[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