Skip to content

Commit

Permalink
[clangd] Make sure constructors do not reference class
Browse files Browse the repository at this point in the history
Reviewers: gribozavr

Subscribers: ilya-biryukov, ioeric, MaskRay, jkorous, arphaman, cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D58815

llvm-svn: 355679
  • Loading branch information
kadircet committed Mar 8, 2019
1 parent 7ec1ec1 commit 017cc6c
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 1 deletion.
5 changes: 5 additions & 0 deletions clang-tools-extra/clangd/XRefs.cpp
Expand Up @@ -15,6 +15,7 @@
#include "clang/AST/DeclTemplate.h"
#include "clang/AST/RecursiveASTVisitor.h"
#include "clang/Index/IndexDataConsumer.h"
#include "clang/Index/IndexSymbol.h"
#include "clang/Index/IndexingAction.h"
#include "clang/Index/USRGeneration.h"
#include "llvm/Support/Path.h"
Expand Down Expand Up @@ -154,6 +155,10 @@ class DeclarationAndMacrosFinder : public index::IndexDataConsumer {
llvm::ArrayRef<index::SymbolRelation> Relations,
SourceLocation Loc,
index::IndexDataConsumer::ASTNodeInfo ASTNode) override {
// Skip non-semantic references.
if (Roles & static_cast<unsigned>(index::SymbolRole::NameReference))
return true;

if (Loc == SearchedLocation) {
auto IsImplicitExpr = [](const Expr *E) {
if (!E)
Expand Down
6 changes: 5 additions & 1 deletion clang-tools-extra/clangd/index/SymbolCollector.cpp
Expand Up @@ -211,7 +211,7 @@ getTokenLocation(SourceLocation TokLoc, const SourceManager &SM,
// the first seen declaration as canonical declaration is not a good enough
// heuristic.
bool isPreferredDeclaration(const NamedDecl &ND, index::SymbolRoleSet Roles) {
const auto& SM = ND.getASTContext().getSourceManager();
const auto &SM = ND.getASTContext().getSourceManager();
return (Roles & static_cast<unsigned>(index::SymbolRole::Definition)) &&
isa<TagDecl>(&ND) &&
!SM.isWrittenInMainFile(SM.getExpansionLoc(ND.getLocation()));
Expand Down Expand Up @@ -305,6 +305,10 @@ bool SymbolCollector::handleDeclOccurence(
Decl::FriendObjectKind::FOK_None) &&
!(Roles & static_cast<unsigned>(index::SymbolRole::Definition)))
return true;
// Skip non-semantic references, we should start processing these when we
// decide to implement renaming with index support.
if ((Roles & static_cast<unsigned>(index::SymbolRole::NameReference)))
return true;
// A declaration created for a friend declaration should not be used as the
// canonical declaration in the index. Use OrigD instead, unless we've already
// picked a replacement for D
Expand Down
9 changes: 9 additions & 0 deletions clang-tools-extra/unittests/clangd/XRefsTests.cpp
Expand Up @@ -1337,6 +1337,15 @@ TEST(FindReferences, WithinAST) {
}
)cpp",

R"cpp(// Constructor
struct Foo {
[[F^oo]](int);
};
void foo() {
Foo f = [[Foo]](42);
}
)cpp",

R"cpp(// Typedef
typedef int [[Foo]];
int main() {
Expand Down

0 comments on commit 017cc6c

Please sign in to comment.