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"
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
381388private:
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
630667std::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}
0 commit comments