Browse Source

Improved clang indentation. Its getting there.

merge-requests/365/head
eidheim 10 years ago
parent
commit
8e31159dad
  1. 39
      src/source.cc
  2. 8
      src/source.h

39
src/source.cc

@ -544,20 +544,19 @@ std::string Source::View::get_line_before() {
return get_line_before(get_buffer()->get_insert());
}
bool Source::View::find_start_of_sentence(Gtk::TextIter iter, Gtk::TextIter &found_iter) {
while(iter.backward_char()) {
bool Source::View::find_start_of_closed_expression(Gtk::TextIter iter, Gtk::TextIter &found_iter) {
do {
if(*iter!='{' && *iter!=' ' && *iter!='\t')
break;
if(iter.starts_line()) {
found_iter=iter;
return true;
}
}
} while(iter.backward_char());
int count1=0;
int count2=0;
int count3=0;
int count4=0;
bool ignore=false;
@ -576,18 +575,14 @@ bool Source::View::find_start_of_sentence(Gtk::TextIter iter, Gtk::TextIter &fou
count1++;
else if(*iter==']')
count2++;
else if(*iter=='>')
count3++;
else if(*iter=='}')
count4++;
count3++;
else if(*iter=='(')
count1--;
else if(*iter=='[')
count2--;
else if(*iter=='<')
count3--;
else if(*iter=='{')
count4--;
count3--;
}
}
if(iter.starts_line() && count1<=0 && count2<=0 && count3<=0) {
@ -598,10 +593,9 @@ bool Source::View::find_start_of_sentence(Gtk::TextIter iter, Gtk::TextIter &fou
return false;
}
bool Source::View::find_open_symbol(Gtk::TextIter iter, const Gtk::TextIter &until_iter, Gtk::TextIter &found_iter) {
bool Source::View::find_open_expression_symbol(Gtk::TextIter iter, const Gtk::TextIter &until_iter, Gtk::TextIter &found_iter) {
int count1=0;
int count2=0;
int count3=0;
bool ignore=false;
@ -620,16 +614,12 @@ bool Source::View::find_open_symbol(Gtk::TextIter iter, const Gtk::TextIter &unt
count1++;
else if(*iter==']')
count2++;
else if(*iter=='>')
count3++;
else if(*iter=='(')
count1--;
else if(*iter=='[')
count2--;
else if(*iter=='<')
count3--;
}
if(count1<0 || count2<0 || count3<0) {
if(count1<0 || count2<0) {
found_iter=iter;
return true;
}
@ -667,7 +657,8 @@ bool Source::View::find_right_bracket_forward(Gtk::TextIter iter, Gtk::TextIter
}
}
if(iter.starts_line() && *iter!=tab_char && !iter.ends_line() && *iter!='#')
//To avoid parsing of the whole file in case of erroneous brackets
if(iter.starts_line() && *iter!=tab_char && !iter.ends_line() && *iter!='#' && *iter!='p') //added p for public, private and protected keywords.
return false;
}
return false;
@ -1258,9 +1249,13 @@ void Source::ClangViewParse::update_types() {
}
}
//Clang indentation
//TODO: replace indentation methods with a better implementation or maybe use libclang
//Clang indentation.
bool Source::ClangViewParse::on_key_press_event(GdkEventKey* key) {
if(spellcheck_suggestions_dialog_shown) {
if(spellcheck_suggestions_dialog->on_key_press(key))
return true;
}
if(get_buffer()->get_has_selection()) {
return Source::View::on_key_press_event(key);
}
@ -1270,7 +1265,7 @@ bool Source::ClangViewParse::on_key_press_event(GdkEventKey* key) {
if(key->keyval==GDK_KEY_Return) {
auto iter=get_buffer()->get_insert()->get_iter();
Gtk::TextIter start_of_sentence_iter;
if(find_start_of_sentence(iter, start_of_sentence_iter)) {
if(find_start_of_closed_expression(iter, start_of_sentence_iter)) {
auto start_line=get_line(start_of_sentence_iter);
std::smatch sm;
std::string tabs;
@ -1321,7 +1316,7 @@ bool Source::ClangViewParse::on_key_press_event(GdkEventKey* key) {
auto line=get_line_before();
iter=get_buffer()->get_insert()->get_iter();
auto found_iter=iter;
if(find_open_symbol(iter, start_of_sentence_iter, found_iter)) {
if(find_open_expression_symbol(iter, start_of_sentence_iter, found_iter)) {
auto offset=found_iter.get_line_offset();
tabs.clear();
for(int c=0;c<offset+1;c++)

8
src/source.h

@ -95,8 +95,8 @@ namespace Source {
std::string get_line_before(Glib::RefPtr<Gtk::TextBuffer::Mark> mark);
std::string get_line_before();
bool find_start_of_sentence(Gtk::TextIter iter, Gtk::TextIter &found_iter);
bool find_open_symbol(Gtk::TextIter iter, const Gtk::TextIter &until_iter, Gtk::TextIter &found_iter);
bool find_start_of_closed_expression(Gtk::TextIter iter, Gtk::TextIter &found_iter);
bool find_open_expression_symbol(Gtk::TextIter iter, const Gtk::TextIter &until_iter, Gtk::TextIter &found_iter);
bool find_right_bracket_forward(Gtk::TextIter iter, Gtk::TextIter &found_iter);
bool on_key_press_event(GdkEventKey* key);
@ -109,6 +109,8 @@ namespace Source {
std::regex tabs_regex;
bool spellcheck_all=false;
std::unique_ptr<SelectionDialog> spellcheck_suggestions_dialog;
bool spellcheck_suggestions_dialog_shown=false;
private:
GtkSourceSearchContext *search_context;
GtkSourceSearchSettings *search_settings;
@ -121,8 +123,6 @@ namespace Source {
std::pair<Gtk::TextIter, Gtk::TextIter> spellcheck_get_word(Gtk::TextIter iter);
void spellcheck_word(const Gtk::TextIter& start, const Gtk::TextIter& end);
std::vector<std::string> spellcheck_get_suggestions(const Gtk::TextIter& start, const Gtk::TextIter& end);
std::unique_ptr<SelectionDialog> spellcheck_suggestions_dialog;
bool spellcheck_suggestions_dialog_shown=false;
sigc::connection delayed_spellcheck_suggestions_connection;
bool last_keyval_is_backspace=false;
};

Loading…
Cancel
Save