ccls/src/messages/text_document_did_open.cc

83 lines
2.9 KiB
C++
Raw Normal View History

#include "cache_manager.h"
2017-12-29 16:29:47 +00:00
#include "clang_complete.h"
#include "include_complete.h"
2017-12-06 03:32:33 +00:00
#include "message_handler.h"
2017-12-29 16:29:47 +00:00
#include "project.h"
#include "queue_manager.h"
2017-12-06 03:32:33 +00:00
#include "timer.h"
2017-12-29 16:29:47 +00:00
#include "working_files.h"
2017-12-06 03:32:33 +00:00
2018-03-20 22:49:40 +00:00
#include <loguru.hpp>
namespace {
MethodType kMethodType = "textDocument/didOpen";
2017-12-06 04:39:44 +00:00
// Open, view, change, close file
2018-03-22 05:01:21 +00:00
struct In_TextDocumentDidOpen : public NotificationInMessage {
MethodType GetMethodType() const override { return kMethodType; }
2017-12-06 04:39:44 +00:00
struct Params {
lsTextDocumentItem textDocument;
2018-03-31 03:16:33 +00:00
// ccls extension
// If specified (e.g. ["clang++", "-DM", "a.cc"]), it overrides the project
2018-03-31 03:16:33 +00:00
// entry (e.g. loaded from compile_commands.json or .ccls).
std::vector<std::string> args;
2017-12-06 04:39:44 +00:00
};
Params params;
};
MAKE_REFLECT_STRUCT(In_TextDocumentDidOpen::Params, textDocument, args);
MAKE_REFLECT_STRUCT(In_TextDocumentDidOpen, params);
REGISTER_IN_MESSAGE(In_TextDocumentDidOpen);
struct Handler_TextDocumentDidOpen
: BaseMessageHandler<In_TextDocumentDidOpen> {
MethodType GetMethodType() const override { return kMethodType; }
2017-12-06 04:39:44 +00:00
void Run(In_TextDocumentDidOpen* request) override {
2017-12-06 03:32:33 +00:00
// NOTE: This function blocks code lens. If it starts taking a long time
// we will need to find a way to unblock the code lens request.
const auto& params = request->params;
2017-12-06 03:32:33 +00:00
Timer time;
std::string path = params.textDocument.uri.GetPath();
2017-12-07 01:00:19 +00:00
2018-04-01 00:49:32 +00:00
std::shared_ptr<ICacheManager> cache_manager = ICacheManager::Make();
WorkingFile* working_file = working_files->OnOpen(params.textDocument);
2018-03-31 03:16:33 +00:00
std::optional<std::string> cached_file_contents =
cache_manager->LoadCachedFileContents(path);
2017-12-06 03:32:33 +00:00
if (cached_file_contents)
working_file->SetIndexContent(*cached_file_contents);
QueryFile* file = nullptr;
2018-03-31 03:16:33 +00:00
FindFileOrFail(db, project, std::nullopt, path, &file);
2017-12-06 03:32:33 +00:00
if (file && file->def) {
EmitInactiveLines(working_file, file->def->inactive_regions);
EmitSemanticHighlighting(db, semantic_cache, working_file, file);
}
time.ResetAndPrint(
"[querydb] Loading cached index file for DidOpen (blocks "
"CodeLens)");
include_complete->AddFile(working_file->filename);
clang_complete->NotifyView(path);
2018-05-05 03:40:52 +00:00
if (params.args.size())
project->SetFlagsForFile(params.args, path);
2017-12-06 03:32:33 +00:00
2018-05-05 03:40:52 +00:00
// Submit new index request if it is not a header file.
if (SourceFileLanguage(path) != LanguageId::Unknown) {
Project::Entry entry = project->FindCompilationEntryForFile(path);
QueueManager::instance()->index_request.PushBack(
Index_Request(
2018-05-05 03:40:52 +00:00
entry.filename, params.args.size() ? params.args : entry.args,
true /*is_interactive*/, params.textDocument.text, cache_manager),
true /* priority */);
2018-03-20 22:49:40 +00:00
2018-05-05 03:40:52 +00:00
clang_complete->FlushSession(entry.filename);
LOG_S(INFO) << "Flushed clang complete sessions for " << entry.filename;
}
2017-12-06 03:32:33 +00:00
}
};
REGISTER_MESSAGE_HANDLER(Handler_TextDocumentDidOpen);
2017-12-07 01:00:19 +00:00
} // namespace