Skip to content

Commit 6f594a1

Browse files
alirana01gerekon
authored andcommitted
[Clangd] Return Includes for documentSymbol request
1 parent 0b9eac0 commit 6f594a1

File tree

2 files changed

+47
-7
lines changed

2 files changed

+47
-7
lines changed

clang-tools-extra/clangd/FindSymbols.cpp

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "AST.h"
1111
#include "FuzzyMatch.h"
1212
#include "ParsedAST.h"
13+
#include "Protocol.h"
1314
#include "Quality.h"
1415
#include "SourceCode.h"
1516
#include "index/Index.h"
@@ -20,9 +21,9 @@
2021
#include "llvm/ADT/STLExtras.h"
2122
#include "llvm/ADT/SmallVector.h"
2223
#include "llvm/ADT/StringRef.h"
24+
#include <iterator>
2325
#include <limits>
24-
#include <optional>
25-
#include <tuple>
26+
#include <vector>
2627

2728
#define DEBUG_TYPE "FindSymbols"
2829

@@ -375,12 +376,48 @@ class DocumentOutline {
375376
SymBuilder Root;
376377
for (auto &TopLevel : AST.getLocalTopLevelDecls())
377378
traverseDecl(TopLevel, Root);
378-
return std::move(std::move(Root).build().children);
379+
std::vector<DocumentSymbol> symbols =
380+
std::move(std::move(Root).build().children);
381+
auto IncludeSymbols = collectIncludeSymbols(AST);
382+
symbols.insert(symbols.end(),
383+
std::make_move_iterator(IncludeSymbols.begin()),
384+
std::make_move_iterator(IncludeSymbols.end()));
385+
return symbols;
379386
}
380387

381388
private:
382389
enum class VisitKind { No, OnlyDecl, OnlyChildren, DeclAndChildren };
383390

391+
std::vector<DocumentSymbol> collectIncludeSymbols(const ParsedAST &AST) {
392+
std::vector<DocumentSymbol> IncludeSymbols;
393+
const auto &IS = AST.getIncludeStructure();
394+
const auto &MI = IS.MainFileIncludes;
395+
for (const auto &Inclusion : MI) {
396+
397+
DocumentSymbol IncludeSymbol;
398+
std::string IncludeText = Inclusion.Written;
399+
if (IncludeText.empty())
400+
continue;
401+
402+
if (((IncludeText.front() == '"' && IncludeText.back() == '"') ||
403+
(IncludeText.front() == '<' && IncludeText.back() == '>'))) {
404+
IncludeText = IncludeText.substr(1, IncludeText.size() - 2);
405+
}
406+
407+
IncludeSymbol.name = IncludeText;
408+
IncludeSymbol.kind = SymbolKind::File;
409+
IncludeSymbol.range.start.line = Inclusion.HashLine;
410+
IncludeSymbol.range.start.character = 0;
411+
IncludeSymbol.range.end.line = Inclusion.HashLine;
412+
IncludeSymbol.range.end.character =
413+
static_cast<int>(Inclusion.Written.size() + 9);
414+
IncludeSymbol.selectionRange = IncludeSymbol.range;
415+
IncludeSymbols.push_back(std::move(IncludeSymbol));
416+
}
417+
418+
return IncludeSymbols;
419+
}
420+
384421
void traverseDecl(Decl *D, SymBuilder &Parent) {
385422
// Skip symbols which do not originate from the main file.
386423
if (!isInsideMainFile(D->getLocation(), AST.getSourceManager()))
@@ -628,8 +665,10 @@ PragmaMarkSymbol markToSymbol(const PragmaMark &P) {
628665
}
629666

630667
std::vector<DocumentSymbol> collectDocSymbols(ParsedAST &AST) {
631-
std::vector<DocumentSymbol> Syms = DocumentOutline(AST).build();
632-
668+
DocumentOutline documentOutline = DocumentOutline(AST);
669+
std::vector<DocumentSymbol> Syms = documentOutline.build();
670+
// TODO: Add a collection method for macros as well
671+
633672
const auto &PragmaMarks = AST.getMarks();
634673
if (PragmaMarks.empty())
635674
return Syms;
@@ -644,6 +683,7 @@ std::vector<DocumentSymbol> collectDocSymbols(ParsedAST &AST) {
644683
DocumentSymbol Root;
645684
Root.children = std::move(Syms);
646685
Root.range = EntireFile;
686+
647687
mergePragmas(Root, llvm::ArrayRef(Pragmas));
648688
return Root.children;
649689
}

clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,7 @@ TEST(DocumentSymbols, ExternSymbol) {
467467
#include "foo.h"
468468
)cpp";
469469

470-
EXPECT_THAT(getSymbols(TU.build()), IsEmpty());
470+
EXPECT_THAT(getSymbols(TU.build()), ElementsAre(withName("foo.h")));
471471
}
472472

473473
TEST(DocumentSymbols, ExternContext) {
@@ -546,7 +546,7 @@ TEST(DocumentSymbols, InHeaderFile) {
546546
}
547547
)cpp";
548548
EXPECT_THAT(getSymbols(TU.build()),
549-
ElementsAre(withName("i"), withName("test")));
549+
ElementsAre(withName("i"), withName("test"), withName("bar.h")));
550550
}
551551

552552
TEST(DocumentSymbols, Template) {

0 commit comments

Comments
 (0)