Browse Source

Cleanup of Source::View::get_start_of_expression.

merge-requests/389/head
eidheim 8 years ago
parent
commit
8a88f79e0a
  1. 42
      src/source.cc
  2. 43
      tests/source_key_test.cc

42
src/source.cc

@ -1301,51 +1301,48 @@ Gtk::TextIter Source::View::get_start_of_expression(Gtk::TextIter iter) {
break; break;
if(iter.starts_line() && para_count == 0 && square_count == 0) { if(iter.starts_line() && para_count == 0 && square_count == 0) {
bool stream_operator_found = false; if(!is_bracket_language)
bool colon_found = false; return iter;
// Handle << at the beginning of the sentence if iter initially started with ; // Handle << at the beginning of the sentence if iter initially started with ;
if(has_semicolon) { if(has_semicolon) {
auto test_iter = get_tabs_end_iter(iter); auto test_iter = get_tabs_end_iter(iter);
if(!test_iter.starts_line() && *test_iter == '<' && is_code_iter(test_iter) && if(!test_iter.starts_line() && *test_iter == '<' && is_code_iter(test_iter) &&
test_iter.forward_char() && *test_iter == '<') test_iter.forward_char() && *test_iter == '<')
stream_operator_found = true; continue;
} }
// Handle : at the beginning of the sentence if iter initially started with { // Handle : at the beginning of the sentence if iter initially started with {
else if(colon_test) { if(colon_test) {
auto test_iter = get_tabs_end_iter(iter); auto test_iter = get_tabs_end_iter(iter);
if(!test_iter.starts_line() && *test_iter == ':' && is_code_iter(test_iter)) if(!test_iter.starts_line() && *test_iter == ':' && is_code_iter(test_iter))
colon_found = true; continue;
} }
const auto is_multiline_operator = [](const Gtk::TextIter &iter) { // Handle ',', ':', or operators that can be used between two lines, on previous line:
if(*iter == '=' || *iter == '+' || *iter == '-' || *iter == '*' || *iter == '/' ||
*iter == '%' || *iter == '<' || *iter == '>' || *iter == '&' || *iter == '|')
return true;
return false;
};
// Handle ':', ',', or operators that can be used between two lines, on previous line:
if(!stream_operator_found && !colon_found) {
auto previous_iter = iter; auto previous_iter = iter;
previous_iter.backward_char(); previous_iter.backward_char();
while(!previous_iter.starts_line() && (*previous_iter == ' ' || previous_iter.ends_line() || is_comment_iter(previous_iter)) && previous_iter.backward_char()) { while(!previous_iter.starts_line() && (*previous_iter == ' ' || previous_iter.ends_line() || is_comment_iter(previous_iter)) && previous_iter.backward_char()) {
} }
if((*previous_iter != ',' && *previous_iter != ':' && !is_multiline_operator(previous_iter)) || !is_code_iter(previous_iter) || is_comment_iter(previous_iter)) if(previous_iter.starts_line())
return iter; return iter;
else if(*previous_iter == ':') { if(colon_test && *previous_iter == ':') {
previous_iter.backward_char(); previous_iter.backward_char();
while(!previous_iter.starts_line() && *previous_iter == ' ' && previous_iter.backward_char()) { while(!previous_iter.starts_line() && *previous_iter == ' ' && previous_iter.backward_char()) {
} }
if(*previous_iter == ')') { if(*previous_iter == ')') {
auto token = get_token(get_tabs_end_iter(get_buffer()->get_iter_at_line(previous_iter.get_line()))); auto token = get_token(get_tabs_end_iter(previous_iter));
if(token == "case") if(token != "case")
return iter; continue; // Continue at for instance: Test::Test():\n test(2) {
} }
else
return iter; return iter;
} }
// Handle for instance: int a =\n b; // Handle for instance: int a =\n b;
else if(!has_semicolon && is_multiline_operator(previous_iter)) if(*previous_iter == '=' || *previous_iter == '+' || *previous_iter == '-' || *previous_iter == '*' || *previous_iter == '/' ||
*previous_iter == '%' || *previous_iter == '<' || *previous_iter == '>' || *previous_iter == '&' || *previous_iter == '|') {
if(has_semicolon)
continue;
return iter; return iter;
} }
if(*previous_iter != ',')
return iter;
} }
} while(iter.backward_char()); } while(iter.backward_char());
@ -2244,13 +2241,16 @@ bool Source::View::on_key_press_event_bracket_language(GdkEventKey *key) {
else if(*condition_iter == ':' && is_code_iter(condition_iter)) { else if(*condition_iter == ':' && is_code_iter(condition_iter)) {
bool perform_indent = true; bool perform_indent = true;
auto iter = condition_iter; auto iter = condition_iter;
if(!iter.starts_line())
iter.backward_char();
while(!iter.starts_line() && *iter == ' ' && iter.backward_char()) { while(!iter.starts_line() && *iter == ' ' && iter.backward_char()) {
} }
if(*iter == ')') { if(*iter == ')') {
auto token = get_token(get_tabs_end_iter(get_buffer()->get_iter_at_line(iter.get_line()))); auto token = get_token(get_tabs_end_iter(get_buffer()->get_iter_at_line(iter.get_line())));
if(token != "case") if(token != "case") // Do not move left for instance: void Test::Test():
perform_indent = false; perform_indent = false;
} }
if(perform_indent) { if(perform_indent) {
Gtk::TextIter found_curly_iter; Gtk::TextIter found_curly_iter;
if(find_open_curly_bracket_backward(iter, found_curly_iter)) { if(find_open_curly_bracket_backward(iter, found_curly_iter)) {

43
tests/source_key_test.cc

@ -962,6 +962,24 @@ int main() {
g_assert(buffer->get_insert()->get_iter().get_line() == 2); g_assert(buffer->get_insert()->get_iter().get_line() == 2);
g_assert(buffer->get_insert()->get_iter().get_line_offset() == 4); g_assert(buffer->get_insert()->get_iter().get_line_offset() == 4);
} }
{
buffer->set_text(" class Class {\n"
" void Class():");
view.on_key_press_event(&event);
g_assert(buffer->get_text() == " class Class {\n"
" void Class():\n"
" ");
g_assert(buffer->get_insert()->get_iter().get_line() == 2);
g_assert(buffer->get_insert()->get_iter().get_line_offset() == 4);
}
{
buffer->set_text(" void Class::Class() :");
view.on_key_press_event(&event);
g_assert(buffer->get_text() == " void Class::Class() :\n"
" ");
g_assert(buffer->get_insert()->get_iter().get_line() == 1);
g_assert(buffer->get_insert()->get_iter().get_line_offset() == 2);
}
{ {
buffer->set_text(" void Class::Class() :\n" buffer->set_text(" void Class::Class() :\n"
" var(1) {"); " var(1) {");
@ -973,6 +991,31 @@ int main() {
g_assert(buffer->get_insert()->get_iter().get_line() == 2); g_assert(buffer->get_insert()->get_iter().get_line() == 2);
g_assert(buffer->get_insert()->get_iter().get_line_offset() == 4); g_assert(buffer->get_insert()->get_iter().get_line_offset() == 4);
} }
{
buffer->set_text(" class Test {\n"
" public:\n"
" ;");
view.on_key_press_event(&event);
g_assert(buffer->get_text() == " class Test {\n"
" public:\n"
" ;\n"
" ");
g_assert(buffer->get_insert()->get_iter().get_line() == 3);
g_assert(buffer->get_insert()->get_iter().get_line_offset() == 4);
}
{
buffer->set_text(" class Test {\n"
" public:\n"
" void test() {");
view.on_key_press_event(&event);
g_assert(buffer->get_text() == " class Test {\n"
" public:\n"
" void test() {\n"
" \n"
" }");
g_assert(buffer->get_insert()->get_iter().get_line() == 3);
g_assert(buffer->get_insert()->get_iter().get_line_offset() == 6);
}
{ {
buffer->set_text(" void Class::Class(int a,\n" buffer->set_text(" void Class::Class(int a,\n"
" int b) {"); " int b) {");

Loading…
Cancel
Save