[PATCH] D95812: [clangd] Report only decl of overridding method in xref.
Utkarsh Saxena via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Feb 1 12:30:25 PST 2021
usaxena95 updated this revision to Diff 320563.
usaxena95 added a comment.
Move Index query to more logical place.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D95812/new/
https://reviews.llvm.org/D95812
Files:
clang-tools-extra/clangd/XRefs.cpp
clang-tools-extra/clangd/unittests/XRefsTests.cpp
Index: clang-tools-extra/clangd/unittests/XRefsTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/XRefsTests.cpp
+++ clang-tools-extra/clangd/unittests/XRefsTests.cpp
@@ -1850,14 +1850,14 @@
R"cpp(
class Base {
public:
- virtual void [[f^unc]]() = 0;
+ virtual void [[f^unc]]();
};
class Derived : public Base {
public:
void [[func]]() override;
};
void test(Derived* D) {
- D->[[func]]();
+ D->func(); // No references to the overrides.
})cpp";
Annotations T(Test);
auto TU = TestTU::withCode(T.code());
Index: clang-tools-extra/clangd/XRefs.cpp
===================================================================
--- clang-tools-extra/clangd/XRefs.cpp
+++ clang-tools-extra/clangd/XRefs.cpp
@@ -1332,26 +1332,19 @@
if (auto ID = getSymbolID(D))
Targets.insert(ID);
- llvm::DenseSet<SymbolID> Overrides;
+ RelationsRequest OverriddenBy;
if (Index) {
- RelationsRequest FindOverrides;
- FindOverrides.Predicate = RelationKind::OverriddenBy;
+ OverriddenBy.Predicate = RelationKind::OverriddenBy;
for (const NamedDecl *ND : Decls) {
- // Special case: virtual void meth^od() = 0 includes refs of overrides.
+ // Special case: Inlcude declaration of overridding methods.
if (const auto *CMD = llvm::dyn_cast<CXXMethodDecl>(ND)) {
- if (CMD->isPure())
+ if (CMD->isVirtual())
if (IdentifierAtCursor && SM.getSpellingLoc(CMD->getLocation()) ==
IdentifierAtCursor->location())
if (auto ID = getSymbolID(CMD))
- FindOverrides.Subjects.insert(ID);
+ OverriddenBy.Subjects.insert(ID);
}
}
- if (!FindOverrides.Subjects.empty())
- Index->relations(FindOverrides,
- [&](const SymbolID &Subject, const Symbol &Object) {
- Overrides.insert(Object.ID);
- });
- Targets.insert(Overrides.begin(), Overrides.end());
}
// We traverse the AST to find references in the main file.
@@ -1372,8 +1365,17 @@
Result.uri = URIMainFile;
Results.References.push_back(std::move(Result));
}
+ // Add declaration of overridding methods.
+ if (Index && Results.References.size() <= Limit &&
+ !OverriddenBy.Subjects.empty())
+ Index->relations(
+ OverriddenBy, [&](const SymbolID &Subject, const Symbol &Object) {
+ if (auto LSPLoc =
+ toLSPLocation(Object.CanonicalDeclaration, *MainFilePath))
+ Results.References.push_back(std::move(*LSPLoc));
+ });
+
if (Index && Results.References.size() <= Limit) {
- Req.IDs = std::move(Overrides);
for (const Decl *D : Decls) {
// Not all symbols can be referenced from outside (e.g.
// function-locals).
@@ -1386,6 +1388,7 @@
}
}
}
+
// Now query the index for references from other files.
if (!Req.IDs.empty() && Index && Results.References.size() <= Limit) {
Req.Limit = Limit;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D95812.320563.patch
Type: text/x-patch
Size: 3262 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20210201/089f2558/attachment.bin>
More information about the cfe-commits
mailing list