14 #include "clang/AST/DeclBase.h"
15 #include "clang/Basic/SourceLocation.h"
16 #include "llvm/ADT/ArrayRef.h"
17 #include "llvm/Support/Error.h"
25 void addIfDistinct(
const Range &R, std::vector<Range> &Result) {
26 if (Result.empty() || Result.back() != R) {
32 void collectFoldingRanges(DocumentSymbol Symbol,
33 std::vector<FoldingRange> &Result) {
35 Range.startLine = Symbol.range.start.line;
36 Range.startCharacter = Symbol.range.start.character;
37 Range.endLine = Symbol.range.end.line;
38 Range.endCharacter = Symbol.range.end.character;
39 Result.push_back(
Range);
40 for (
const auto &Child : Symbol.children)
41 collectFoldingRanges(Child, Result);
47 std::vector<Range> Ranges;
51 auto FID = SM.getMainFileID();
61 Node = Node->Parent) {
62 if (
const Decl *D = Node->ASTNode.get<
Decl>()) {
63 if (llvm::isa<TranslationUnitDecl>(D)) {
69 if (!SR.hasValue() || SM.getFileID(SR->getBegin()) != SM.getMainFileID()) {
75 addIfDistinct(R, Ranges);
83 return std::move(
Empty);
88 Head.range = std::move(Ranges.front());
91 llvm::makeMutableArrayRef(Ranges.data(), Ranges.size()).drop_front()) {
92 Tail->parent = std::make_unique<SelectionRange>();
97 return std::move(
Head);
111 if (!DocumentSymbols)
112 return DocumentSymbols.takeError();
113 std::vector<FoldingRange> Result;
114 for (
const auto &
Symbol : *DocumentSymbols)
115 collectFoldingRanges(
Symbol, Result);