https://github.com/timon-ul created https://github.com/llvm/llvm-project/pull/113900
None >From 96c759835b798b8f002adb4835db08b8de5da97a Mon Sep 17 00:00:00 2001 From: Timon Ulrich <timon.ulr...@advantest.com> Date: Mon, 28 Oct 2024 11:03:10 +0100 Subject: [PATCH 1/2] Added call hierarchy for Field and non-local variables --- clang-tools-extra/clangd/XRefs.cpp | 5 ++- .../clangd/unittests/CallHierarchyTests.cpp | 45 +++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/clang-tools-extra/clangd/XRefs.cpp b/clang-tools-extra/clangd/XRefs.cpp index b34aba603b5306..b18a33b8ca7e8e 100644 --- a/clang-tools-extra/clangd/XRefs.cpp +++ b/clang-tools-extra/clangd/XRefs.cpp @@ -2238,7 +2238,10 @@ prepareCallHierarchy(ParsedAST &AST, Position Pos, PathRef TUPath) { for (const NamedDecl *Decl : getDeclAtPosition(AST, *Loc, {})) { if (!(isa<DeclContext>(Decl) && cast<DeclContext>(Decl)->isFunctionOrMethod()) && - Decl->getKind() != Decl::Kind::FunctionTemplate) + !((Decl->getKind() == Decl::Kind::Var && + !cast<VarDecl>(Decl)->isLocalVarDecl())) && + Decl->getKind() != Decl::Kind::FunctionTemplate && + Decl->getKind() != Decl::Kind::Field) continue; if (auto CHI = declToCallHierarchyItem(*Decl, AST.tuPath())) Result.emplace_back(std::move(*CHI)); diff --git a/clang-tools-extra/clangd/unittests/CallHierarchyTests.cpp b/clang-tools-extra/clangd/unittests/CallHierarchyTests.cpp index 6fa76aa6094bf2..4ddb8d486bdfad 100644 --- a/clang-tools-extra/clangd/unittests/CallHierarchyTests.cpp +++ b/clang-tools-extra/clangd/unittests/CallHierarchyTests.cpp @@ -446,6 +446,51 @@ TEST(CallHierarchy, CallInLocalVarDecl) { AllOf(from(withName("caller3")), fromRanges(Source.range("call3"))))); } +TEST(CallHierarchy, HierarchyOnField){ + // Tests that the call hierarchy works on fields. + Annotations Source(R"cpp( + struct Vars { + int v^ar1 = 1; + }; + void caller() { + Vars values; + values.$Callee[[var1]]; + } + )cpp"); + TestTU TU = TestTU::withCode(Source.code()); + auto AST = TU.build(); + auto Index = TU.index(); + + std::vector<CallHierarchyItem> Items = + prepareCallHierarchy(AST, Source.point(), testPath(TU.Filename)); + ASSERT_THAT(Items, ElementsAre(withName("var1"))); + auto IncomingLevel1 = incomingCalls(Items[0], Index.get()); + ASSERT_THAT(IncomingLevel1, + ElementsAre(AllOf(from(withName("caller")), + fromRanges(Source.range("Callee"))))); +} + +TEST(CallHierarchy, HierarchyOnVar){ + // Tests that the call hierarchy works on fields. + Annotations Source(R"cpp( + int v^ar = 1; + void caller() { + $Callee[[var]]; + } + )cpp"); + TestTU TU = TestTU::withCode(Source.code()); + auto AST = TU.build(); + auto Index = TU.index(); + + std::vector<CallHierarchyItem> Items = + prepareCallHierarchy(AST, Source.point(), testPath(TU.Filename)); + ASSERT_THAT(Items, ElementsAre(withName("var"))); + auto IncomingLevel1 = incomingCalls(Items[0], Index.get()); + ASSERT_THAT(IncomingLevel1, + ElementsAre(AllOf(from(withName("caller")), + fromRanges(Source.range("Callee"))))); +} + } // namespace } // namespace clangd } // namespace clang >From 0db63a5f3a86ee844bbb499a7fe188a59f9fca45 Mon Sep 17 00:00:00 2001 From: Timon Ulrich <timon.ulr...@advantest.com> Date: Mon, 28 Oct 2024 13:38:58 +0100 Subject: [PATCH 2/2] Formatting changes --- clang-tools-extra/clangd/XRefs.cpp | 4 ++-- clang-tools-extra/clangd/unittests/CallHierarchyTests.cpp | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/clang-tools-extra/clangd/XRefs.cpp b/clang-tools-extra/clangd/XRefs.cpp index b18a33b8ca7e8e..53a0346a445d8e 100644 --- a/clang-tools-extra/clangd/XRefs.cpp +++ b/clang-tools-extra/clangd/XRefs.cpp @@ -2238,8 +2238,8 @@ prepareCallHierarchy(ParsedAST &AST, Position Pos, PathRef TUPath) { for (const NamedDecl *Decl : getDeclAtPosition(AST, *Loc, {})) { if (!(isa<DeclContext>(Decl) && cast<DeclContext>(Decl)->isFunctionOrMethod()) && - !((Decl->getKind() == Decl::Kind::Var && - !cast<VarDecl>(Decl)->isLocalVarDecl())) && + !(Decl->getKind() == Decl::Kind::Var && + !cast<VarDecl>(Decl)->isLocalVarDecl()) && Decl->getKind() != Decl::Kind::FunctionTemplate && Decl->getKind() != Decl::Kind::Field) continue; diff --git a/clang-tools-extra/clangd/unittests/CallHierarchyTests.cpp b/clang-tools-extra/clangd/unittests/CallHierarchyTests.cpp index 4ddb8d486bdfad..b2278ff12735dc 100644 --- a/clang-tools-extra/clangd/unittests/CallHierarchyTests.cpp +++ b/clang-tools-extra/clangd/unittests/CallHierarchyTests.cpp @@ -446,7 +446,7 @@ TEST(CallHierarchy, CallInLocalVarDecl) { AllOf(from(withName("caller3")), fromRanges(Source.range("call3"))))); } -TEST(CallHierarchy, HierarchyOnField){ +TEST(CallHierarchy, HierarchyOnField) { // Tests that the call hierarchy works on fields. Annotations Source(R"cpp( struct Vars { @@ -470,8 +470,8 @@ TEST(CallHierarchy, HierarchyOnField){ fromRanges(Source.range("Callee"))))); } -TEST(CallHierarchy, HierarchyOnVar){ - // Tests that the call hierarchy works on fields. +TEST(CallHierarchy, HierarchyOnVar) { + // Tests that the call hierarchy works on non-local variables. Annotations Source(R"cpp( int v^ar = 1; void caller() { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits