Browse Source

Language protocol: now shows possible arguments if no argument info is sent from server after autocomplete

merge-requests/399/head
eidheim 6 years ago
parent
commit
5b2ce6469c
  1. 19
      src/source_language_protocol.cc
  2. 2
      src/source_language_protocol.h

19
src/source_language_protocol.cc

@ -1222,9 +1222,9 @@ void Source::LanguageProtocolView::setup_autocomplete() {
return; return;
if(!has_focus()) if(!has_focus())
return; return;
if(autocomplete_show_parameters) if(autocomplete_show_arguments)
autocomplete.stop(); autocomplete.stop();
autocomplete_show_parameters = false; autocomplete_show_arguments = false;
autocomplete_delayed_show_arguments_connection.disconnect(); autocomplete_delayed_show_arguments_connection.disconnect();
autocomplete_delayed_show_arguments_connection = Glib::signal_timeout().connect([this]() { autocomplete_delayed_show_arguments_connection = Glib::signal_timeout().connect([this]() {
if(get_buffer()->get_has_selection()) if(get_buffer()->get_has_selection())
@ -1244,7 +1244,7 @@ void Source::LanguageProtocolView::setup_autocomplete() {
// Remove argument completions // Remove argument completions
if(!has_named_parameters()) { // Do not remove named parameters in for instance Python if(!has_named_parameters()) { // Do not remove named parameters in for instance Python
signal_key_press_event().connect([this](GdkEventKey *key) { signal_key_press_event().connect([this](GdkEventKey *key) {
if(autocomplete_show_parameters && CompletionDialog::get() && CompletionDialog::get()->is_visible() && if(autocomplete_show_arguments && CompletionDialog::get() && CompletionDialog::get()->is_visible() &&
key->keyval != GDK_KEY_Down && key->keyval != GDK_KEY_Up && key->keyval != GDK_KEY_Down && key->keyval != GDK_KEY_Up &&
key->keyval != GDK_KEY_Return && key->keyval != GDK_KEY_KP_Enter && key->keyval != GDK_KEY_Return && key->keyval != GDK_KEY_KP_Enter &&
key->keyval != GDK_KEY_ISO_Left_Tab && key->keyval != GDK_KEY_Tab && key->keyval != GDK_KEY_ISO_Left_Tab && key->keyval != GDK_KEY_Tab &&
@ -1279,7 +1279,7 @@ void Source::LanguageProtocolView::setup_autocomplete() {
return false; return false;
autocomplete_enable_snippets = false; autocomplete_enable_snippets = false;
autocomplete_show_parameters = false; autocomplete_show_arguments = false;
auto line = ' ' + get_line_before(); auto line = ' ' + get_line_before();
const static std::regex regex("^.*([a-zA-Z_\\)\\]\\>\"']|[^a-zA-Z0-9_][a-zA-Z_][a-zA-Z0-9_]*)(\\.)([a-zA-Z0-9_]*)$|" // . const static std::regex regex("^.*([a-zA-Z_\\)\\]\\>\"']|[^a-zA-Z0-9_][a-zA-Z_][a-zA-Z0-9_]*)(\\.)([a-zA-Z0-9_]*)$|" // .
@ -1296,7 +1296,7 @@ void Source::LanguageProtocolView::setup_autocomplete() {
return true; return true;
} }
else if(is_possible_argument()) { else if(is_possible_argument()) {
autocomplete_show_parameters = true; autocomplete_show_arguments = true;
LockGuard lock(autocomplete.prefix_mutex); LockGuard lock(autocomplete.prefix_mutex);
autocomplete.prefix = ""; autocomplete.prefix = "";
return true; return true;
@ -1350,7 +1350,7 @@ void Source::LanguageProtocolView::setup_autocomplete() {
autocomplete_comment.clear(); autocomplete_comment.clear();
autocomplete_insert.clear(); autocomplete_insert.clear();
std::promise<void> result_processed; std::promise<void> result_processed;
if(autocomplete_show_parameters) { if(autocomplete_show_arguments) {
if(!capabilities.signature_help) if(!capabilities.signature_help)
return; return;
client->write_request(this, "textDocument/signatureHelp", R"("textDocument":{"uri":")" + uri + R"("}, "position": {"line": )" + std::to_string(line_number - 1) + ", \"character\": " + std::to_string(column - 1) + "}", [this, &result_processed](const boost::property_tree::ptree &result, bool error) { client->write_request(this, "textDocument/signatureHelp", R"("textDocument":{"uri":")" + uri + R"("}, "position": {"line": )" + std::to_string(line_number - 1) + ", \"character\": " + std::to_string(column - 1) + "}", [this, &result_processed](const boost::property_tree::ptree &result, bool error) {
@ -1483,7 +1483,7 @@ void Source::LanguageProtocolView::setup_autocomplete() {
} }
if(hide_window) { if(hide_window) {
if(autocomplete_show_parameters) { if(autocomplete_show_arguments) {
if(has_named_parameters()) // Do not select named parameters in for instance Python if(has_named_parameters()) // Do not select named parameters in for instance Python
get_buffer()->insert(CompletionDialog::get()->start_mark->get_iter(), insert); get_buffer()->insert(CompletionDialog::get()->start_mark->get_iter(), insert);
else { else {
@ -1496,6 +1496,11 @@ void Source::LanguageProtocolView::setup_autocomplete() {
} }
insert_snippet(CompletionDialog::get()->start_mark->get_iter(), insert); insert_snippet(CompletionDialog::get()->start_mark->get_iter(), insert);
auto iter = get_buffer()->get_insert()->get_iter();
if(*iter == ')' && iter.backward_char() && *iter == '(') { // If no arguments, try signatureHelp
last_keyval = '(';
autocomplete.run();
}
} }
else else
get_buffer()->insert(CompletionDialog::get()->start_mark->get_iter(), insert); get_buffer()->insert(CompletionDialog::get()->start_mark->get_iter(), insert);

2
src/source_language_protocol.h

@ -193,7 +193,7 @@ namespace Source {
std::vector<std::string> autocomplete_comment; std::vector<std::string> autocomplete_comment;
std::vector<std::string> autocomplete_insert; std::vector<std::string> autocomplete_insert;
std::atomic<bool> autocomplete_enable_snippets = {false}; std::atomic<bool> autocomplete_enable_snippets = {false};
bool autocomplete_show_parameters = false; bool autocomplete_show_arguments = false;
sigc::connection autocomplete_delayed_show_arguments_connection; sigc::connection autocomplete_delayed_show_arguments_connection;
bool has_named_parameters(); bool has_named_parameters();

Loading…
Cancel
Save