Skip to content

Commit

Permalink
[Clangd] Return Includes for documentSymbol request
Browse files Browse the repository at this point in the history
  • Loading branch information
alirana01 authored and gerekon committed Jan 20, 2025
1 parent 0b9eac0 commit 6f594a1
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 7 deletions.
50 changes: 45 additions & 5 deletions clang-tools-extra/clangd/FindSymbols.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include "AST.h"
#include "FuzzyMatch.h"
#include "ParsedAST.h"
#include "Protocol.h"
#include "Quality.h"
#include "SourceCode.h"
#include "index/Index.h"
Expand All @@ -20,9 +21,9 @@
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
#include <iterator>
#include <limits>
#include <optional>
#include <tuple>
#include <vector>

#define DEBUG_TYPE "FindSymbols"

Expand Down Expand Up @@ -375,12 +376,48 @@ class DocumentOutline {
SymBuilder Root;
for (auto &TopLevel : AST.getLocalTopLevelDecls())
traverseDecl(TopLevel, Root);
return std::move(std::move(Root).build().children);
std::vector<DocumentSymbol> symbols =
std::move(std::move(Root).build().children);
auto IncludeSymbols = collectIncludeSymbols(AST);
symbols.insert(symbols.end(),
std::make_move_iterator(IncludeSymbols.begin()),
std::make_move_iterator(IncludeSymbols.end()));
return symbols;
}

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

std::vector<DocumentSymbol> collectIncludeSymbols(const ParsedAST &AST) {
std::vector<DocumentSymbol> IncludeSymbols;
const auto &IS = AST.getIncludeStructure();
const auto &MI = IS.MainFileIncludes;
for (const auto &Inclusion : MI) {

DocumentSymbol IncludeSymbol;
std::string IncludeText = Inclusion.Written;
if (IncludeText.empty())
continue;

if (((IncludeText.front() == '"' && IncludeText.back() == '"') ||
(IncludeText.front() == '<' && IncludeText.back() == '>'))) {
IncludeText = IncludeText.substr(1, IncludeText.size() - 2);
}

IncludeSymbol.name = IncludeText;
IncludeSymbol.kind = SymbolKind::File;
IncludeSymbol.range.start.line = Inclusion.HashLine;
IncludeSymbol.range.start.character = 0;
IncludeSymbol.range.end.line = Inclusion.HashLine;
IncludeSymbol.range.end.character =
static_cast<int>(Inclusion.Written.size() + 9);
IncludeSymbol.selectionRange = IncludeSymbol.range;
IncludeSymbols.push_back(std::move(IncludeSymbol));
}

return IncludeSymbols;
}

void traverseDecl(Decl *D, SymBuilder &Parent) {
// Skip symbols which do not originate from the main file.
if (!isInsideMainFile(D->getLocation(), AST.getSourceManager()))
Expand Down Expand Up @@ -628,8 +665,10 @@ PragmaMarkSymbol markToSymbol(const PragmaMark &P) {
}

std::vector<DocumentSymbol> collectDocSymbols(ParsedAST &AST) {
std::vector<DocumentSymbol> Syms = DocumentOutline(AST).build();

DocumentOutline documentOutline = DocumentOutline(AST);
std::vector<DocumentSymbol> Syms = documentOutline.build();
// TODO: Add a collection method for macros as well

const auto &PragmaMarks = AST.getMarks();
if (PragmaMarks.empty())
return Syms;
Expand All @@ -644,6 +683,7 @@ std::vector<DocumentSymbol> collectDocSymbols(ParsedAST &AST) {
DocumentSymbol Root;
Root.children = std::move(Syms);
Root.range = EntireFile;

mergePragmas(Root, llvm::ArrayRef(Pragmas));
return Root.children;
}
Expand Down
4 changes: 2 additions & 2 deletions clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -467,7 +467,7 @@ TEST(DocumentSymbols, ExternSymbol) {
#include "foo.h"
)cpp";

EXPECT_THAT(getSymbols(TU.build()), IsEmpty());
EXPECT_THAT(getSymbols(TU.build()), ElementsAre(withName("foo.h")));
}

TEST(DocumentSymbols, ExternContext) {
Expand Down Expand Up @@ -546,7 +546,7 @@ TEST(DocumentSymbols, InHeaderFile) {
}
)cpp";
EXPECT_THAT(getSymbols(TU.build()),
ElementsAre(withName("i"), withName("test")));
ElementsAre(withName("i"), withName("test"), withName("bar.h")));
}

TEST(DocumentSymbols, Template) {
Expand Down

0 comments on commit 6f594a1

Please sign in to comment.