// Copyright 2017-2018 ccls Authors // SPDX-License-Identifier: Apache-2.0 #include "message_handler.hh" #include "pipeline.hh" #include "project.hh" #include "query_utils.hh" #include "working_files.hh" namespace ccls { namespace { struct FoldingRange { int startLine, startCharacter, endLine, endCharacter; std::string kind = "region"; }; MAKE_REFLECT_STRUCT(FoldingRange, startLine, startCharacter, endLine, endCharacter, kind); } // namespace void MessageHandler::textDocument_foldingRange(TextDocumentParam ¶m, ReplyOnce &reply) { QueryFile *file = FindFile(reply, param.textDocument.uri.GetPath()); if (!file) return; WorkingFile *wfile = wfiles->GetFileByFilename(file->def->path); if (!wfile) return; std::vector result; std::optional ls_range; for (auto [sym, refcnt] : file->symbol2refcnt) if (refcnt > 0 && sym.extent.Valid() && (sym.kind == Kind::Func || sym.kind == Kind::Type) && (ls_range = GetLsRange(wfile, sym.extent))) { FoldingRange &fold = result.emplace_back(); fold.startLine = ls_range->start.line; fold.startCharacter = ls_range->start.character; fold.endLine = ls_range->end.line; fold.endCharacter = ls_range->end.character; } reply(result); } } // namespace ccls