[clang-tools-extra] Extend call hierarchy for enum constants (PR #147042)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Jul 4 04:18:00 PDT 2025
https://github.com/timon-ul created https://github.com/llvm/llvm-project/pull/147042
Implementation for https://github.com/clangd/clangd/issues/2203
>From 464db70ca20e0924d37ebf6c5147721e382d5063 Mon Sep 17 00:00:00 2001
From: Timon Ulrich <timon.ulrich at advantest.com>
Date: Wed, 2 Jul 2025 15:23:46 +0200
Subject: [PATCH 1/2] Added call hierarchy for enum constants
---
clang-tools-extra/clangd/XRefs.cpp | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/clang-tools-extra/clangd/XRefs.cpp b/clang-tools-extra/clangd/XRefs.cpp
index 089f8158c9aa5..5bbc681cf04e2 100644
--- a/clang-tools-extra/clangd/XRefs.cpp
+++ b/clang-tools-extra/clangd/XRefs.cpp
@@ -2287,7 +2287,8 @@ prepareCallHierarchy(ParsedAST &AST, Position Pos, PathRef TUPath) {
Decl->getKind() != Decl::Kind::FunctionTemplate &&
!(Decl->getKind() == Decl::Kind::Var &&
!cast<VarDecl>(Decl)->isLocalVarDecl()) &&
- Decl->getKind() != Decl::Kind::Field)
+ Decl->getKind() != Decl::Kind::Field &&
+ Decl->getKind() != Decl::Kind::EnumConstant)
continue;
if (auto CHI = declToCallHierarchyItem(*Decl, AST.tuPath()))
Result.emplace_back(std::move(*CHI));
>From bfc167d2da892dfd9624eff651cece2b3328cee4 Mon Sep 17 00:00:00 2001
From: Timon Ulrich <timon.ulrich at advantest.com>
Date: Thu, 3 Jul 2025 13:54:43 +0200
Subject: [PATCH 2/2] Added test for CallHierarchy on enum constants
---
.../clangd/unittests/CallHierarchyTests.cpp | 29 +++++++++++++++++++
1 file changed, 29 insertions(+)
diff --git a/clang-tools-extra/clangd/unittests/CallHierarchyTests.cpp b/clang-tools-extra/clangd/unittests/CallHierarchyTests.cpp
index eb852ef5ee00b..08cc80ff8981e 100644
--- a/clang-tools-extra/clangd/unittests/CallHierarchyTests.cpp
+++ b/clang-tools-extra/clangd/unittests/CallHierarchyTests.cpp
@@ -633,6 +633,35 @@ TEST(CallHierarchy, HierarchyOnVar) {
iFromRanges(Source.range("Callee")))));
}
+TEST(CallHierarchy, HierarchyOnEnumConstant) {
+ // Tests that the call hierarchy works on enum constants.
+ Annotations Source(R"cpp(
+ enum class Coin { heads$Heads^ , tai$Tails^ls };
+ void caller() {
+ Coin::$CallerH[[heads]];
+ Coin::$CallerT[[tails]];
+ }
+ )cpp");
+ TestTU TU = TestTU::withCode(Source.code());
+ auto AST = TU.build();
+ auto Index = TU.index();
+
+ std::vector<CallHierarchyItem> Items =
+ prepareCallHierarchy(AST, Source.point("Heads"), testPath(TU.Filename));
+ ASSERT_THAT(Items, ElementsAre(withName("heads")));
+ auto IncomingLevel1 = incomingCalls(Items[0], Index.get());
+ ASSERT_THAT(IncomingLevel1,
+ ElementsAre(AllOf(from(withName("caller")),
+ iFromRanges(Source.range("CallerH")))));
+ Items =
+ prepareCallHierarchy(AST, Source.point("Tails"), testPath(TU.Filename));
+ ASSERT_THAT(Items, ElementsAre(withName("tails")));
+ IncomingLevel1 = incomingCalls(Items[0], Index.get());
+ ASSERT_THAT(IncomingLevel1,
+ ElementsAre(AllOf(from(withName("caller")),
+ iFromRanges(Source.range("CallerT")))));
+}
+
TEST(CallHierarchy, CallInDifferentFileThanCaller) {
Annotations Header(R"cpp(
#define WALDO void caller() {
More information about the cfe-commits
mailing list