|
|
|
|
@ -277,7 +277,8 @@ LanguageProtocol::Capabilities LanguageProtocol::Client::initialize() {
|
|
|
|
|
"formatting": { "dynamicRegistration": false }, |
|
|
|
|
"rangeFormatting": { "dynamicRegistration": false }, |
|
|
|
|
"rename": { "dynamicRegistration": false }, |
|
|
|
|
"publishDiagnostics": { "relatedInformation":true } |
|
|
|
|
"publishDiagnostics": { "relatedInformation": true }, |
|
|
|
|
"diagnostic": { "dynamicRegistration": false, "relatedDocumentSupport": true } |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
"initializationOptions": { |
|
|
|
|
@ -340,6 +341,8 @@ LanguageProtocol::Capabilities LanguageProtocol::Client::initialize() {
|
|
|
|
|
capabilities.workspace_folders = change_notifications->boolean_or(true); // Can be string as well
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// Workaround since rust-analyzer erroneously uses both publish and pull diagnostic
|
|
|
|
|
capabilities.pull_diagnostic = language_id == "rust" ? false : boolean_or_object("diagnosticProvider"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// See https://clangd.llvm.org/extensions.html#utf-8-offsets for documentation on offsetEncoding
|
|
|
|
|
@ -743,7 +746,10 @@ void Source::LanguageProtocolView::initialize() {
|
|
|
|
|
update_status_state(this); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(capabilities.type_coverage) |
|
|
|
|
update_type_coverage(); |
|
|
|
|
if(capabilities.pull_diagnostic) |
|
|
|
|
pull_diagnostic(); |
|
|
|
|
|
|
|
|
|
initialized = true; |
|
|
|
|
}; |
|
|
|
|
@ -765,6 +771,7 @@ Source::LanguageProtocolView::~LanguageProtocolView() {
|
|
|
|
|
autocomplete_delayed_show_arguments_connection.disconnect(); |
|
|
|
|
resolve_completion_item_connection.disconnect(); |
|
|
|
|
update_type_coverage_connection.disconnect(); |
|
|
|
|
pull_diagnostic_connection.disconnect(); |
|
|
|
|
|
|
|
|
|
if(initialize_thread.joinable()) |
|
|
|
|
initialize_thread.join(); |
|
|
|
|
@ -878,6 +885,7 @@ bool Source::LanguageProtocolView::save() {
|
|
|
|
|
|
|
|
|
|
write_notification("textDocument/didSave"); |
|
|
|
|
|
|
|
|
|
if(capabilities.type_coverage) |
|
|
|
|
update_type_coverage(); |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
@ -1545,6 +1553,12 @@ void Source::LanguageProtocolView::setup_signals() {
|
|
|
|
|
write_did_change_notification({{"contentChanges", "[{" + to_string({"text", '"' + JSON::escape_string(get_buffer()->get_text().raw()) + '"'}) + "}]"}}); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(capabilities.pull_diagnostic) { |
|
|
|
|
get_buffer()->signal_changed().connect([this]() { |
|
|
|
|
pull_diagnostic(); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void Source::LanguageProtocolView::setup_autocomplete() { |
|
|
|
|
@ -2526,7 +2540,6 @@ boost::optional<char> Source::LanguageProtocolView::get_named_parameter_symbol()
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void Source::LanguageProtocolView::update_type_coverage() { |
|
|
|
|
if(capabilities.type_coverage) { |
|
|
|
|
write_request("textDocument/typeCoverage", {}, [this](JSON &&result, bool error) { |
|
|
|
|
if(error) { |
|
|
|
|
if(update_type_coverage_retries > 0) { // Retry typeCoverage request, since these requests can fail while waiting for language server to start
|
|
|
|
|
@ -2566,4 +2579,25 @@ void Source::LanguageProtocolView::update_type_coverage() {
|
|
|
|
|
}); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void Source::LanguageProtocolView::pull_diagnostic() { |
|
|
|
|
pull_diagnostic_connection.disconnect(); |
|
|
|
|
pull_diagnostic_connection = Glib::signal_timeout().connect( |
|
|
|
|
[this]() { |
|
|
|
|
write_request("textDocument/diagnostic", {}, [this](JSON &&result, bool error) { |
|
|
|
|
if(!error) { |
|
|
|
|
std::vector<std::shared_ptr<LanguageProtocol::Diagnostic>> diagnostics; |
|
|
|
|
for(auto &child : result.array_or_empty("items")) { |
|
|
|
|
try { |
|
|
|
|
diagnostics.emplace_back(std::make_shared<LanguageProtocol::Diagnostic>(std::move(child))); |
|
|
|
|
} |
|
|
|
|
catch(...) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
update_diagnostics_async(std::move(diagnostics)); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
return false; |
|
|
|
|
}, |
|
|
|
|
1000); |
|
|
|
|
} |
|
|
|
|
|