From 4e24a97a443f396984bba46667952d5b90fe34f9 Mon Sep 17 00:00:00 2001 From: eidheim Date: Mon, 24 Jul 2017 12:35:25 +0200 Subject: [PATCH] Improved indentation on lines ending with a comment, and additional key tests --- src/source.cc | 164 ++++++++++-------- src/source.h | 5 - tests/source_key_test.cc | 364 ++++++++++++++++++++++++++++++++++++++- 3 files changed, 450 insertions(+), 83 deletions(-) diff --git a/src/source.cc b/src/source.cc index 5f543be..18e176e 100644 --- a/src/source.cc +++ b/src/source.cc @@ -14,6 +14,7 @@ #include #include #include +#include Glib::RefPtr Source::guess_language(const boost::filesystem::path &file_path) { auto language_manager=Gsv::LanguageManager::get_default(); @@ -75,10 +76,6 @@ std::string Source::FixIt::string(Glib::RefPtr buffer) { ////////////// //// View //// ////////////// -const std::regex Source::View::bracket_regex("^.*\\{ *$", std::regex::extended); -const std::regex Source::View::no_bracket_statement_regex("^(if|for|else if|while) *\\(.*[^;}] *$", std::regex::extended); -const std::regex Source::View::no_bracket_no_para_statement_regex("^else *$"); - Source::View::View(const boost::filesystem::path &file_path, Glib::RefPtr language): Gsv::View(), SpellCheckView(), DiffView(file_path), language(language), status_diagnostics(0, 0, 0) { load(); @@ -1798,6 +1795,10 @@ bool Source::View::on_key_press_event_basic(GdkEventKey* key) { //Bracket language indentation bool Source::View::on_key_press_event_bracket_language(GdkEventKey* key) { + const static std::regex no_bracket_statement_regex("^ *(if|for|while) *\\(.*[^;}{] *$|" + "^[}]? *else if *\\(.*[^;}{] *$|" + "^[}]? *else *$", std::regex::extended); + auto iter=get_buffer()->get_insert()->get_iter(); if(get_buffer()->get_has_selection()) @@ -1805,39 +1806,59 @@ bool Source::View::on_key_press_event_bracket_language(GdkEventKey* key) { if(!is_code_iter(iter)) { // Add * at start of line in comment blocks - if((key->keyval==GDK_KEY_Return || key->keyval==GDK_KEY_KP_Enter) && - !iter.starts_line() && (!string_tag || (!iter.has_tag(string_tag) && !iter.ends_tag(string_tag)))) { - cleanup_whitespace_characters_on_return(iter); - - iter=get_buffer()->get_insert()->get_iter(); - auto start_iter=get_tabs_end_iter(iter.get_line()); - auto end_iter=start_iter; - end_iter.forward_chars(2); - auto start_of_sentence=get_buffer()->get_text(start_iter, end_iter); - if(!start_of_sentence.empty()) { - if(start_of_sentence=="/*" || start_of_sentence[0]=='*') { - auto tabs=get_line_before(start_iter); - auto insert_str="\n"+tabs; - if(start_of_sentence[0]=='/') - insert_str+=' '; - insert_str+="* "; - - get_buffer()->insert_at_cursor(insert_str); - return true; + if(key->keyval==GDK_KEY_Return || key->keyval==GDK_KEY_KP_Enter) { + if(!iter.starts_line() && (!string_tag || (!iter.has_tag(string_tag) && !iter.ends_tag(string_tag)))) { + cleanup_whitespace_characters_on_return(iter); + iter=get_buffer()->get_insert()->get_iter(); + + auto start_iter=get_tabs_end_iter(iter.get_line()); + auto end_iter=start_iter; + end_iter.forward_chars(2); + auto start_of_sentence=get_buffer()->get_text(start_iter, end_iter); + if(!start_of_sentence.empty()) { + if(start_of_sentence=="/*" || start_of_sentence[0]=='*') { + auto tabs=get_line_before(start_iter); + auto insert_str="\n"+tabs; + if(start_of_sentence[0]=='/') + insert_str+=' '; + insert_str+="* "; + + get_buffer()->insert_at_cursor(insert_str); + return true; + } } } + else if(!comment_tag || !iter.ends_tag(comment_tag)) + return false; } - return false; + else + return false; } + // get iter for if expressions below, which is moved backwards past any comment + auto get_condition_iter=[this](const Gtk::TextIter &iter) { + auto condition_iter=iter; + condition_iter.backward_char(); + if(!comment_tag) + return condition_iter; + while(!condition_iter.starts_line() && (condition_iter.has_tag(comment_tag) || +#if GTKMM_MAJOR_VERSION>3 || (GTKMM_MAJOR_VERSION==3 && GTKMM_MINOR_VERSION>=20) + condition_iter.starts_tag(comment_tag) || +#else + *condition_iter=='/' || +#endif + *condition_iter==' ' || *condition_iter=='\t') && + condition_iter.backward_char()) {} + return condition_iter; + }; + //Indent depending on if/else/etc and brackets if((key->keyval==GDK_KEY_Return || key->keyval==GDK_KEY_KP_Enter) && !iter.starts_line()) { cleanup_whitespace_characters_on_return(iter); - iter=get_buffer()->get_insert()->get_iter(); - auto previous_iter=iter; - previous_iter.backward_char(); - auto start_iter=previous_iter; + + auto condition_iter=get_condition_iter(iter); + auto start_iter=condition_iter; if(*start_iter=='{') start_iter.backward_char(); Gtk::TextIter open_non_curly_bracket_iter; @@ -1853,19 +1874,22 @@ bool Source::View::on_key_press_event_bracket_language(GdkEventKey* key) { /* * Change tabs after ending comment block with an extra space (as in this case) */ - if(tabs.size()%tab_size==1) { - iter=get_buffer()->get_insert()->get_iter(); - auto tabs_end_iter=get_tabs_end_iter(iter); - if(!tabs_end_iter.ends_line() && !is_code_iter(tabs_end_iter)) { - auto end_of_line_iter=tabs_end_iter; - end_of_line_iter.forward_to_line_end(); - auto line=get_buffer()->get_text(tabs_end_iter, end_of_line_iter); - if(!line.empty() && line.compare(0, 2, "*/")==0) - tabs.pop_back(); + if(tabs.size()%tab_size==1 && !start_iter.ends_line() && !is_code_iter(start_iter)) { + auto end_of_line_iter=start_iter; + end_of_line_iter.forward_to_line_end(); + auto line=get_buffer()->get_text(start_iter, end_of_line_iter); + if(!line.empty() && line.compare(0, 2, "*/")==0) { + tabs.pop_back(); + get_buffer()->insert_at_cursor("\n"+tabs); + scroll_to(get_buffer()->get_insert()); + return true; } } - if(*previous_iter=='{') { + if(!is_code_iter(condition_iter)) + return false; + + if(*condition_iter=='{') { Gtk::TextIter found_iter; // Check if an '}' is needed bool has_right_curly_bracket=false; @@ -1906,7 +1930,7 @@ bool Source::View::on_key_press_event_bracket_language(GdkEventKey* key) { add_semicolon=true; //Add semicolon after lambda unless it's a parameter else if(!open_non_curly_bracket_iter_found) { - auto it=previous_iter; + auto it=condition_iter; long para_count=0; long square_count=0; bool square_outside_para_found=false; @@ -1969,47 +1993,38 @@ bool Source::View::on_key_press_event_bracket_language(GdkEventKey* key) { scroll_to(get_buffer()->get_insert()); return true; } - std::string sentence=get_buffer()->get_text(start_iter, iter); + auto after_condition_iter=condition_iter; + after_condition_iter.forward_char(); + std::string sentence=get_buffer()->get_text(start_iter, after_condition_iter); std::smatch sm; if(std::regex_match(sentence, sm, no_bracket_statement_regex)) { get_buffer()->insert_at_cursor("\n"+tabs+tab); scroll_to(get_buffer()->get_insert()); return true; } - else if(std::regex_match(sentence, sm, no_bracket_no_para_statement_regex)) { - get_buffer()->insert_at_cursor("\n"+tabs+tab); - scroll_to(get_buffer()->get_insert()); - return true; - } //Indenting after for instance if(...)\n...;\n - else if(iter.backward_char() && *iter==';' && iter.get_line()>0) { + 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 previous_tabs=get_line_before(previous_start_iter); - std::string previous_sentence=get_buffer()->get_text(previous_start_iter, previous_end_iter); + auto after_condition_iter=get_condition_iter(previous_end_iter); + after_condition_iter.forward_char(); + std::string previous_sentence=get_buffer()->get_text(previous_start_iter, after_condition_iter); std::smatch sm2; - if(!std::regex_match(previous_sentence, sm2, bracket_regex)) { - if(std::regex_match(previous_sentence, sm2, no_bracket_statement_regex)) { - get_buffer()->insert_at_cursor("\n"+previous_tabs); - scroll_to(get_buffer()->get_insert()); - return true; - } - else if(std::regex_match(previous_sentence, sm2, no_bracket_no_para_statement_regex)) { - get_buffer()->insert_at_cursor("\n"+previous_tabs); - scroll_to(get_buffer()->get_insert()); - return true; - } + if(std::regex_match(previous_sentence, sm2, no_bracket_statement_regex)) { + get_buffer()->insert_at_cursor("\n"+previous_tabs); + scroll_to(get_buffer()->get_insert()); + return true; } } //Indenting after ':' - else if(*iter==':') { + else if(*condition_iter==':') { bool perform_indent=true; - auto previous_iter=iter; - previous_iter.backward_char(); - while(!previous_iter.starts_line() && *previous_iter==' ' && previous_iter.backward_char()) {} - if(*previous_iter==')') { - auto token=get_token(get_tabs_end_iter(get_buffer()->get_iter_at_line(previous_iter.get_line()))); + auto iter=condition_iter; + while(!iter.starts_line() && *iter==' ' && iter.backward_char()) {} + if(*iter==')') { + auto token=get_token(get_tabs_end_iter(get_buffer()->get_iter_at_line(iter.get_line()))); if(token!="case") perform_indent=false; } @@ -2068,20 +2083,19 @@ bool Source::View::on_key_press_event_bracket_language(GdkEventKey* key) { 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 previous_tabs=get_line_before(previous_start_iter); if((tabs.size()-tab_size)==previous_tabs.size()) { - std::string previous_sentence=get_buffer()->get_text(previous_start_iter, previous_end_iter); + std::string previous_sentence=get_buffer()->get_text(previous_start_iter, after_condition_iter); std::smatch sm; - if(!std::regex_match(previous_sentence, sm, bracket_regex)) { - if(std::regex_match(previous_sentence, sm, no_bracket_statement_regex) || - std::regex_match(previous_sentence, sm, no_bracket_no_para_statement_regex)) { - auto start_iter=iter; - start_iter.backward_chars(tab_size); - get_buffer()->erase(start_iter, iter); - get_buffer()->insert_at_cursor("{"); - scroll_to(get_buffer()->get_insert()); - return true; - } + if(std::regex_match(previous_sentence, sm, no_bracket_statement_regex)) { + auto start_iter=iter; + start_iter.backward_chars(tab_size); + get_buffer()->erase(start_iter, iter); + get_buffer()->insert_at_cursor("{"); + scroll_to(get_buffer()->get_insert()); + return true; } } } diff --git a/src/source.h b/src/source.h index c55967d..f55ccf3 100644 --- a/src/source.h +++ b/src/source.h @@ -8,7 +8,6 @@ #include #include #include -#include #include namespace Source { @@ -141,10 +140,6 @@ namespace Source { void cleanup_whitespace_characters_on_return(const Gtk::TextIter &iter); - const static std::regex bracket_regex; - const static std::regex no_bracket_statement_regex; - const static std::regex no_bracket_no_para_statement_regex; - bool is_bracket_language=false; bool on_key_press_event(GdkEventKey* key) override; bool on_key_press_event_basic(GdkEventKey* key); diff --git a/tests/source_key_test.cc b/tests/source_key_test.cc index c0424e9..2131db2 100644 --- a/tests/source_key_test.cc +++ b/tests/source_key_test.cc @@ -18,10 +18,123 @@ int main() { event.state = 0; { - Source::View view(source_file, language_manager->get_language("cpp")); + auto language = language_manager->get_language("cpp"); + Source::View view(source_file, language); + view.get_source_buffer()->set_highlight_syntax(true); + view.get_source_buffer()->set_language(language); view.set_tab_char_and_size(' ', 2); event.keyval = GDK_KEY_Return; + { + view.get_buffer()->set_text("{"); + view.on_key_press_event(&event); + g_assert(view.get_buffer()->get_text() == "{\n" + " \n" + "}"); + g_assert(view.get_buffer()->get_insert()->get_iter().get_line() == 1); + g_assert(view.get_buffer()->get_insert()->get_iter().get_line_offset() == 2); + } + { + view.get_buffer()->set_text("{\n" + " \n" + "}"); + auto iter = view.get_buffer()->begin(); + iter.forward_char(); + view.get_buffer()->place_cursor(iter); + view.on_key_press_event(&event); + g_assert(view.get_buffer()->get_text() == "{\n" + " \n" + " \n" + "}"); + g_assert(view.get_buffer()->get_insert()->get_iter().get_line() == 1); + g_assert(view.get_buffer()->get_insert()->get_iter().get_line_offset() == 2); + } + { + view.get_buffer()->set_text("{\n" + " \n" + "}"); + auto iter = view.get_buffer()->get_iter_at_line(2); + iter.backward_char(); + view.get_buffer()->place_cursor(iter); + view.on_key_press_event(&event); + g_assert(view.get_buffer()->get_text() == "{\n" + " \n" + " \n" + "}"); + g_assert(view.get_buffer()->get_insert()->get_iter().get_line() == 2); + g_assert(view.get_buffer()->get_insert()->get_iter().get_line_offset() == 2); + } + { + view.get_buffer()->set_text("{\n" + " {\n" + "}"); + auto iter = view.get_buffer()->get_iter_at_line(2); + iter.backward_char(); + view.get_buffer()->place_cursor(iter); + view.on_key_press_event(&event); + g_assert(view.get_buffer()->get_text() == "{\n" + " {\n" + " \n" + " }\n" + "}"); + g_assert(view.get_buffer()->get_insert()->get_iter().get_line() == 2); + g_assert(view.get_buffer()->get_insert()->get_iter().get_line_offset() == 4); + } + { + view.get_buffer()->set_text("{\n" + " {\n" + " \n" + " }\n" + "}"); + auto iter = view.get_buffer()->get_iter_at_line(2); + iter.backward_char(); + view.get_buffer()->place_cursor(iter); + view.on_key_press_event(&event); + g_assert(view.get_buffer()->get_text() == "{\n" + " {\n" + " \n" + " \n" + " }\n" + "}"); + g_assert(view.get_buffer()->get_insert()->get_iter().get_line() == 2); + g_assert(view.get_buffer()->get_insert()->get_iter().get_line_offset() == 4); + } + { + view.get_buffer()->set_text("{\n" + "{\n" + "}"); + auto iter = view.get_buffer()->get_iter_at_line(1); + iter.forward_char(); + view.get_buffer()->place_cursor(iter); + view.on_key_press_event(&event); + g_assert(view.get_buffer()->get_text() == "{\n" + "{\n" + " \n" + "}\n" + "}"); + g_assert(view.get_buffer()->get_insert()->get_iter().get_line() == 2); + g_assert(view.get_buffer()->get_insert()->get_iter().get_line_offset() == 2); + } + { + view.get_buffer()->set_text("{\n" + "{\n" + " \n" + "}\n" + "}"); + auto iter = view.get_buffer()->get_iter_at_line(1); + iter.forward_char(); + view.get_buffer()->place_cursor(iter); + view.on_key_press_event(&event); + g_assert(view.get_buffer()->get_text() == "{\n" + "{\n" + " \n" + " \n" + "}\n" + "}"); + g_assert(view.get_buffer()->get_insert()->get_iter().get_line() == 2); + g_assert(view.get_buffer()->get_insert()->get_iter().get_line_offset() == 2); + } + { view.get_buffer()->set_text(" int main() {"); view.on_key_press_event(&event); @@ -31,6 +144,17 @@ int main() { g_assert(view.get_buffer()->get_insert()->get_iter().get_line() == 1); g_assert(view.get_buffer()->get_insert()->get_iter().get_line_offset() == 4); } + { + view.get_buffer()->set_text(" int main() {//comment"); + while(Gtk::Main::events_pending()) + Gtk::Main::iteration(false); + view.on_key_press_event(&event); + g_assert(view.get_buffer()->get_text() == " int main() {//comment\n" + " \n" + " }"); + g_assert(view.get_buffer()->get_insert()->get_iter().get_line() == 1); + g_assert(view.get_buffer()->get_insert()->get_iter().get_line_offset() == 4); + } { view.get_buffer()->set_text(" int main() { "); view.on_key_press_event(&event); @@ -53,6 +177,21 @@ int main() { g_assert(view.get_buffer()->get_insert()->get_iter().get_line() == 1); g_assert(view.get_buffer()->get_insert()->get_iter().get_line_offset() == 4); } + { + view.get_buffer()->set_text(" int main() {//comment\n" + " }"); + auto iter = view.get_buffer()->get_insert()->get_iter(); + iter.backward_chars(4); + view.get_buffer()->place_cursor(iter); + while(Gtk::Main::events_pending()) + Gtk::Main::iteration(false); + view.on_key_press_event(&event); + g_assert(view.get_buffer()->get_text() == " int main() {//comment\n" + " \n" + " }"); + g_assert(view.get_buffer()->get_insert()->get_iter().get_line() == 1); + g_assert(view.get_buffer()->get_insert()->get_iter().get_line_offset() == 4); + } { view.get_buffer()->set_text(" int main() {}"); auto iter = view.get_buffer()->get_insert()->get_iter(); @@ -105,6 +244,129 @@ int main() { g_assert(view.get_buffer()->get_insert()->get_iter().get_line() == 2); g_assert(view.get_buffer()->get_insert()->get_iter().get_line_offset() == 4); } + { + view.get_buffer()->set_text(" int main()\n" + " {/*comment*/}"); + auto iter = view.get_buffer()->get_insert()->get_iter(); + iter.backward_chars(1); + view.get_buffer()->place_cursor(iter); + while(Gtk::Main::events_pending()) + Gtk::Main::iteration(false); + view.on_key_press_event(&event); + g_assert(view.get_buffer()->get_text() == " int main()\n" + " {/*comment*/\n" + " \n" + " }"); + g_assert(view.get_buffer()->get_insert()->get_iter().get_line() == 2); + g_assert(view.get_buffer()->get_insert()->get_iter().get_line_offset() == 4); + } + + { + view.get_buffer()->set_text(" else"); + view.on_key_press_event(&event); + g_assert(view.get_buffer()->get_text() == " else\n" + " "); + g_assert(view.get_buffer()->get_insert()->get_iter() == view.get_buffer()->end()); + } + { + view.get_buffer()->set_text(" else // comment"); + while(Gtk::Main::events_pending()) + Gtk::Main::iteration(false); + view.on_key_press_event(&event); + g_assert(view.get_buffer()->get_text() == " else // comment\n" + " "); + g_assert(view.get_buffer()->get_insert()->get_iter() == view.get_buffer()->end()); + } + { + view.get_buffer()->set_text(" else;"); + view.on_key_press_event(&event); + g_assert(view.get_buffer()->get_text() == " else;\n" + " "); + g_assert(view.get_buffer()->get_insert()->get_iter() == view.get_buffer()->end()); + } + { + view.get_buffer()->set_text(" else;//comment"); + while(Gtk::Main::events_pending()) + Gtk::Main::iteration(false); + view.on_key_press_event(&event); + g_assert(view.get_buffer()->get_text() == " else;//comment\n" + " "); + g_assert(view.get_buffer()->get_insert()->get_iter() == view.get_buffer()->end()); + } + { + view.get_buffer()->set_text(" else {}"); + view.on_key_press_event(&event); + g_assert(view.get_buffer()->get_text() == " else {}\n" + " "); + g_assert(view.get_buffer()->get_insert()->get_iter() == view.get_buffer()->end()); + } + { + view.get_buffer()->set_text(" else {}//comment"); + while(Gtk::Main::events_pending()) + Gtk::Main::iteration(false); + view.on_key_press_event(&event); + g_assert(view.get_buffer()->get_text() == " else {}//comment\n" + " "); + g_assert(view.get_buffer()->get_insert()->get_iter() == view.get_buffer()->end()); + } + + { + view.get_buffer()->set_text(" } else if(true)"); + view.on_key_press_event(&event); + g_assert(view.get_buffer()->get_text() == " } else if(true)\n" + " "); + g_assert(view.get_buffer()->get_insert()->get_iter() == view.get_buffer()->end()); + } + { + view.get_buffer()->set_text(" } else if(true)//comment"); + while(Gtk::Main::events_pending()) + Gtk::Main::iteration(false); + view.on_key_press_event(&event); + g_assert(view.get_buffer()->get_text() == " } else if(true)//comment\n" + " "); + g_assert(view.get_buffer()->get_insert()->get_iter() == view.get_buffer()->end()); + } + { + view.get_buffer()->set_text(" } else if(true)\n" + " ;"); + view.on_key_press_event(&event); + g_assert(view.get_buffer()->get_text() == " } else if(true)\n" + " ;\n" + " "); + g_assert(view.get_buffer()->get_insert()->get_iter() == view.get_buffer()->end()); + } + { + view.get_buffer()->set_text(" } else if(true)//comment\n" + " ;//comment"); + while(Gtk::Main::events_pending()) + Gtk::Main::iteration(false); + view.on_key_press_event(&event); + g_assert(view.get_buffer()->get_text() == " } else if(true)//comment\n" + " ;//comment\n" + " "); + g_assert(view.get_buffer()->get_insert()->get_iter() == view.get_buffer()->end()); + } + + { + view.get_buffer()->set_text(" if(true) {\n" + " ;"); + view.on_key_press_event(&event); + g_assert(view.get_buffer()->get_text() == " if(true) {\n" + " ;\n" + " "); + g_assert(view.get_buffer()->get_insert()->get_iter() == view.get_buffer()->end()); + } + { + view.get_buffer()->set_text(" if(true) { /*comment*/\n" + " ;"); + 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" + " ;\n" + " "); + g_assert(view.get_buffer()->get_insert()->get_iter() == view.get_buffer()->end()); + } { view.get_buffer()->set_text(" if(true &&\n" @@ -135,6 +397,19 @@ int main() { " "); g_assert(view.get_buffer()->get_insert()->get_iter() == view.get_buffer()->end()); } + { + view.get_buffer()->set_text(" if(true &&\n" + " false)//comment\n" + " ;//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 &&\n" + " false)//comment\n" + " ;//comment\n" + " "); + g_assert(view.get_buffer()->get_insert()->get_iter() == view.get_buffer()->end()); + } { view.get_buffer()->set_text(" if(true &&\n" " false)\n" @@ -378,6 +653,17 @@ int main() { g_assert(view.get_buffer()->get_insert()->get_iter().get_line() == 1); g_assert(view.get_buffer()->get_insert()->get_iter().get_line_offset() == 4); } + { + view.get_buffer()->set_text(" auto func=[] {//comment"); + while(Gtk::Main::events_pending()) + Gtk::Main::iteration(false); + view.on_key_press_event(&event); + g_assert(view.get_buffer()->get_text() == " auto func=[] {//comment\n" + " \n" + " };"); + g_assert(view.get_buffer()->get_insert()->get_iter().get_line() == 1); + g_assert(view.get_buffer()->get_insert()->get_iter().get_line_offset() == 4); + } { view.get_buffer()->set_text(" void Class::Class()\n" @@ -431,6 +717,17 @@ int main() { " "); g_assert(view.get_buffer()->get_insert()->get_iter() == view.get_buffer()->end()); } + { + view.get_buffer()->set_text(" class Class : BaseClass {\n" + " public://comment"); + while(Gtk::Main::events_pending()) + Gtk::Main::iteration(false); + view.on_key_press_event(&event); + g_assert(view.get_buffer()->get_text() == " class Class : BaseClass {\n" + " public://comment\n" + " "); + g_assert(view.get_buffer()->get_insert()->get_iter() == view.get_buffer()->end()); + } { view.get_buffer()->set_text(" class Class : BaseClass {\n" " int a;\n" @@ -454,6 +751,47 @@ int main() { g_assert(view.get_buffer()->get_insert()->get_iter() == view.get_buffer()->end()); } + { + view.get_buffer()->set_text(" /*"); + while(Gtk::Main::events_pending()) + Gtk::Main::iteration(false); + view.on_key_press_event(&event); + g_assert(view.get_buffer()->get_text() == " /*\n" + " * "); + g_assert(view.get_buffer()->get_insert()->get_iter() == view.get_buffer()->end()); + } + { + view.get_buffer()->set_text(" /*\n" + " */"); + while(Gtk::Main::events_pending()) + Gtk::Main::iteration(false); + view.on_key_press_event(&event); + g_assert(view.get_buffer()->get_text() == " /*\n" + " */\n" + " "); + g_assert(view.get_buffer()->get_insert()->get_iter() == view.get_buffer()->end()); + } + { + view.get_buffer()->set_text(" //comment"); + while(Gtk::Main::events_pending()) + Gtk::Main::iteration(false); + view.on_key_press_event(&event); + g_assert(view.get_buffer()->get_text() == " //comment\n" + " "); + g_assert(view.get_buffer()->get_insert()->get_iter() == view.get_buffer()->end()); + } + { + view.get_buffer()->set_text(" //comment\n" + " //comment"); + while(Gtk::Main::events_pending()) + Gtk::Main::iteration(false); + view.on_key_press_event(&event); + g_assert(view.get_buffer()->get_text() == " //comment\n" + " //comment\n" + " "); + g_assert(view.get_buffer()->get_insert()->get_iter() == view.get_buffer()->end()); + } + event.keyval = GDK_KEY_braceleft; { @@ -465,10 +803,20 @@ int main() { g_assert(view.get_buffer()->get_insert()->get_iter() == view.get_buffer()->end()); } { - view.get_buffer()->set_text(" if(true)\n" + view.get_buffer()->set_text(" else if(true)\n" " "); view.on_key_press_event(&event); - g_assert(view.get_buffer()->get_text() == " if(true)\n" + g_assert(view.get_buffer()->get_text() == " else if(true)\n" + " {"); + g_assert(view.get_buffer()->get_insert()->get_iter() == view.get_buffer()->end()); + } + { + view.get_buffer()->set_text(" else if(true)//comment\n" + " "); + while(Gtk::Main::events_pending()) + Gtk::Main::iteration(false); + view.on_key_press_event(&event); + g_assert(view.get_buffer()->get_text() == " else if(true)//comment\n" " {"); g_assert(view.get_buffer()->get_insert()->get_iter() == view.get_buffer()->end()); } @@ -491,5 +839,15 @@ int main() { " }"); g_assert(view.get_buffer()->get_insert()->get_iter() == view.get_buffer()->end()); } + { + view.get_buffer()->set_text(" int main() {//comment\n" + " "); + while(Gtk::Main::events_pending()) + Gtk::Main::iteration(false); + view.on_key_press_event(&event); + g_assert(view.get_buffer()->get_text() == " int main() {//comment\n" + " }"); + g_assert(view.get_buffer()->get_insert()->get_iter() == view.get_buffer()->end()); + } } }