diff --git a/src/message_handler.hh b/src/message_handler.hh index 8f09dc7c..1df705ff 100644 --- a/src/message_handler.hh +++ b/src/message_handler.hh @@ -313,7 +313,7 @@ private: void textDocument_signatureHelp(TextDocumentPositionParam &, ReplyOnce &); void textDocument_switchSourceHeader(TextDocumentIdentifier &, ReplyOnce &); void textDocument_typeDefinition(TextDocumentPositionParam &, ReplyOnce &); - void workspace_didChangeConfiguration(EmptyParam &); + void workspace_didChangeConfiguration(JsonReader &); void workspace_didChangeWatchedFiles(DidChangeWatchedFilesParam &); void workspace_didChangeWorkspaceFolders(DidChangeWorkspaceFoldersParam &); void workspace_executeCommand(JsonReader &, ReplyOnce &); diff --git a/src/messages/workspace.cc b/src/messages/workspace.cc index c604ab62..cfa781e2 100644 --- a/src/messages/workspace.cc +++ b/src/messages/workspace.cc @@ -13,6 +13,9 @@ #include #include +#include +#include + #include #include #include @@ -22,13 +25,29 @@ using namespace llvm; namespace ccls { REFLECT_STRUCT(SymbolInformation, name, kind, location, containerName); -void MessageHandler::workspace_didChangeConfiguration(EmptyParam &) { - for (auto &[folder, _] : g_config->workspaceFolders) - project->load(folder); - project->index(wfiles, RequestId()); +void MessageHandler::workspace_didChangeConfiguration(JsonReader &reader) { + auto it = reader.m->FindMember("settings"); + if (it != reader.m->MemberEnd() && it->value.IsObject()) { + rapidjson::StringBuffer output; + rapidjson::Writer writer(output); + JsonReader m1(&it->value); + it->value.Accept(writer); + LOG_S(INFO) << "didChangeConfiguration: " << output.GetString(); + try { + reflect(m1, *g_config); + } catch (std::invalid_argument &) { + reader.path_.push_back("settings"); + reader.path_.insert(reader.path_.end(), m1.path_.begin(), m1.path_.end()); + throw; + } - manager->clear(); -}; + for (auto &[folder, _] : g_config->workspaceFolders) + project->load(folder); + project->index(wfiles, RequestId()); + + manager->clear(); + } +} void MessageHandler::workspace_didChangeWatchedFiles( DidChangeWatchedFilesParam ¶m) {