From babd2950cb44b65ebb08ef4e1d53eb37ce60a9d4 Mon Sep 17 00:00:00 2001 From: eidheim Date: Tue, 1 Aug 2017 15:21:06 +0200 Subject: [PATCH] Indentation fix for multiline expressions with comments after { --- src/source.cc | 15 ++++++++------- tests/source_key_test.cc | 26 ++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/source.cc b/src/source.cc index 18e176e..0e436ad 100644 --- a/src/source.cc +++ b/src/source.cc @@ -1204,7 +1204,6 @@ Gtk::TextIter Source::View::find_start_of_sentence(Gtk::TextIter iter) { if(iter.starts_line()) return iter; - iter.backward_char(); bool stream_operator_test=false; bool colon_test=false; @@ -1868,7 +1867,7 @@ bool Source::View::on_key_press_event_bracket_language(GdkEventKey* key) { start_iter=get_tabs_end_iter(get_buffer()->get_iter_at_line(open_non_curly_bracket_iter.get_line())); } else - start_iter=get_tabs_end_iter(get_buffer()->get_iter_at_line(find_start_of_sentence(iter).get_line())); + start_iter=get_tabs_end_iter(get_buffer()->get_iter_at_line(find_start_of_sentence(condition_iter).get_line())); auto tabs=get_line_before(start_iter); /* @@ -2006,9 +2005,10 @@ bool Source::View::on_key_press_event_bracket_language(GdkEventKey* key) { else if(*condition_iter==';' && condition_iter.get_line()>0) { auto previous_end_iter=start_iter; while(previous_end_iter.backward_char() && !previous_end_iter.ends_line()) {} - auto previous_start_iter=get_tabs_end_iter(get_buffer()->get_iter_at_line(find_start_of_sentence(previous_end_iter).get_line())); + auto condition_iter=get_condition_iter(previous_end_iter); + auto previous_start_iter=get_tabs_end_iter(get_buffer()->get_iter_at_line(find_start_of_sentence(condition_iter).get_line())); auto previous_tabs=get_line_before(previous_start_iter); - auto after_condition_iter=get_condition_iter(previous_end_iter); + auto after_condition_iter=condition_iter; after_condition_iter.forward_char(); std::string previous_sentence=get_buffer()->get_text(previous_start_iter, after_condition_iter); std::smatch sm2; @@ -2082,10 +2082,11 @@ bool Source::View::on_key_press_event_bracket_language(GdkEventKey* key) { if(line_nr>0 && tabs.size()>=tab_size && iter==tabs_end_iter) { auto previous_end_iter=iter; while(previous_end_iter.backward_char() && !previous_end_iter.ends_line()) {} - auto previous_start_iter=get_tabs_end_iter(get_buffer()->get_iter_at_line(find_start_of_sentence(previous_end_iter).get_line())); - auto after_condition_iter=get_condition_iter(previous_end_iter); - after_condition_iter.forward_char(); + auto condition_iter=get_condition_iter(previous_end_iter); + auto previous_start_iter=get_tabs_end_iter(get_buffer()->get_iter_at_line(find_start_of_sentence(condition_iter).get_line())); auto previous_tabs=get_line_before(previous_start_iter); + auto after_condition_iter=condition_iter; + after_condition_iter.forward_char(); if((tabs.size()-tab_size)==previous_tabs.size()) { std::string previous_sentence=get_buffer()->get_text(previous_start_iter, after_condition_iter); std::smatch sm; diff --git a/tests/source_key_test.cc b/tests/source_key_test.cc index 2131db2..30bd5f0 100644 --- a/tests/source_key_test.cc +++ b/tests/source_key_test.cc @@ -386,6 +386,32 @@ int main() { " "); g_assert(view.get_buffer()->get_insert()->get_iter() == view.get_buffer()->end()); } + { + view.get_buffer()->set_text(" if(true &&\n" + " false) {"); + view.on_key_press_event(&event); + g_assert(view.get_buffer()->get_text() == " if(true &&\n" + " false) {\n" + " \n" + " }"); + auto iter = view.get_buffer()->end(); + iter.backward_chars(4); + g_assert(view.get_buffer()->get_insert()->get_iter() == iter); + } + { + view.get_buffer()->set_text(" if(true && // comment\n" + " false) { // comment"); + while(Gtk::Main::events_pending()) + Gtk::Main::iteration(false); + view.on_key_press_event(&event); + g_assert(view.get_buffer()->get_text() == " if(true && // comment\n" + " false) { // comment\n" + " \n" + " }"); + auto iter = view.get_buffer()->end(); + iter.backward_chars(4); + g_assert(view.get_buffer()->get_insert()->get_iter() == iter); + } { view.get_buffer()->set_text(" if(true &&\n" " false)\n"