[clangd] Fix DocumentOutline for concepts

Summary: Fixes https://github.com/clangd/clangd/issues/256

Reviewers: kbobyrev

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

Tags: #clang

Differential Revision: https://reviews.llvm.org/D73056
This commit is contained in:
Kadir Cetinkaya 2020-01-20 19:02:48 +01:00
parent 04de24e690
commit fb3d9153c0
No known key found for this signature in database
GPG Key ID: E39E36B8D2057ED6
2 changed files with 14 additions and 2 deletions

View File

@ -193,8 +193,11 @@ private:
enum class VisitKind { No, OnlyDecl, DeclAndChildren };
void traverseDecl(Decl *D, std::vector<DocumentSymbol> &Results) {
if (auto *Templ = llvm::dyn_cast<TemplateDecl>(D))
D = Templ->getTemplatedDecl();
if (auto *Templ = llvm::dyn_cast<TemplateDecl>(D)) {
// TemplatedDecl might be null, e.g. concepts.
if (auto *TD = Templ->getTemplatedDecl())
D = TD;
}
auto *ND = llvm::dyn_cast<NamedDecl>(D);
if (!ND)
return;

View File

@ -449,6 +449,15 @@ TEST_F(DocumentSymbolsTest, DeclarationDefinition) {
SymNameRange(Main.range("def")))));
}
TEST_F(DocumentSymbolsTest, Concepts) {
CDB.ExtraClangFlags = {"-std=c++2a"};
std::string FilePath = testPath("foo.cpp");
addFile(FilePath,
"template <typename T> concept C = requires(T t) { t.foo(); };");
EXPECT_THAT(getSymbols(FilePath), ElementsAre(WithName("C")));
}
TEST_F(DocumentSymbolsTest, ExternSymbol) {
std::string FilePath = testPath("foo.cpp");
addFile(testPath("foo.h"), R"cpp(