[clangd] Make sure constructors do not reference class
Reviewers: gribozavr Subscribers: ilya-biryukov, ioeric, MaskRay, jkorous, arphaman, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D58815 llvm-svn: 355679
This commit is contained in:
parent
7ec1ec10c9
commit
017cc6c190
|
@ -15,6 +15,7 @@
|
||||||
#include "clang/AST/DeclTemplate.h"
|
#include "clang/AST/DeclTemplate.h"
|
||||||
#include "clang/AST/RecursiveASTVisitor.h"
|
#include "clang/AST/RecursiveASTVisitor.h"
|
||||||
#include "clang/Index/IndexDataConsumer.h"
|
#include "clang/Index/IndexDataConsumer.h"
|
||||||
|
#include "clang/Index/IndexSymbol.h"
|
||||||
#include "clang/Index/IndexingAction.h"
|
#include "clang/Index/IndexingAction.h"
|
||||||
#include "clang/Index/USRGeneration.h"
|
#include "clang/Index/USRGeneration.h"
|
||||||
#include "llvm/Support/Path.h"
|
#include "llvm/Support/Path.h"
|
||||||
|
@ -154,6 +155,10 @@ public:
|
||||||
llvm::ArrayRef<index::SymbolRelation> Relations,
|
llvm::ArrayRef<index::SymbolRelation> Relations,
|
||||||
SourceLocation Loc,
|
SourceLocation Loc,
|
||||||
index::IndexDataConsumer::ASTNodeInfo ASTNode) override {
|
index::IndexDataConsumer::ASTNodeInfo ASTNode) override {
|
||||||
|
// Skip non-semantic references.
|
||||||
|
if (Roles & static_cast<unsigned>(index::SymbolRole::NameReference))
|
||||||
|
return true;
|
||||||
|
|
||||||
if (Loc == SearchedLocation) {
|
if (Loc == SearchedLocation) {
|
||||||
auto IsImplicitExpr = [](const Expr *E) {
|
auto IsImplicitExpr = [](const Expr *E) {
|
||||||
if (!E)
|
if (!E)
|
||||||
|
|
|
@ -211,7 +211,7 @@ getTokenLocation(SourceLocation TokLoc, const SourceManager &SM,
|
||||||
// the first seen declaration as canonical declaration is not a good enough
|
// the first seen declaration as canonical declaration is not a good enough
|
||||||
// heuristic.
|
// heuristic.
|
||||||
bool isPreferredDeclaration(const NamedDecl &ND, index::SymbolRoleSet Roles) {
|
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)) &&
|
return (Roles & static_cast<unsigned>(index::SymbolRole::Definition)) &&
|
||||||
isa<TagDecl>(&ND) &&
|
isa<TagDecl>(&ND) &&
|
||||||
!SM.isWrittenInMainFile(SM.getExpansionLoc(ND.getLocation()));
|
!SM.isWrittenInMainFile(SM.getExpansionLoc(ND.getLocation()));
|
||||||
|
@ -305,6 +305,10 @@ bool SymbolCollector::handleDeclOccurence(
|
||||||
Decl::FriendObjectKind::FOK_None) &&
|
Decl::FriendObjectKind::FOK_None) &&
|
||||||
!(Roles & static_cast<unsigned>(index::SymbolRole::Definition)))
|
!(Roles & static_cast<unsigned>(index::SymbolRole::Definition)))
|
||||||
return true;
|
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
|
// 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
|
// canonical declaration in the index. Use OrigD instead, unless we've already
|
||||||
// picked a replacement for D
|
// picked a replacement for D
|
||||||
|
|
|
@ -1337,6 +1337,15 @@ TEST(FindReferences, WithinAST) {
|
||||||
}
|
}
|
||||||
)cpp",
|
)cpp",
|
||||||
|
|
||||||
|
R"cpp(// Constructor
|
||||||
|
struct Foo {
|
||||||
|
[[F^oo]](int);
|
||||||
|
};
|
||||||
|
void foo() {
|
||||||
|
Foo f = [[Foo]](42);
|
||||||
|
}
|
||||||
|
)cpp",
|
||||||
|
|
||||||
R"cpp(// Typedef
|
R"cpp(// Typedef
|
||||||
typedef int [[Foo]];
|
typedef int [[Foo]];
|
||||||
int main() {
|
int main() {
|
||||||
|
|
Loading…
Reference in New Issue