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()); return get_line_before(get_buffer()->get_insert());
} }
bool Source::View::find_start_of_sentence(Gtk::TextIter iter, Gtk::TextIter &found_iter) { bool Source::View::find_start_of_closed_expression(Gtk::TextIter iter, Gtk::TextIter &found_iter) {
while(iter.backward_char()) { do {
if(*iter!='{' && *iter!=' ' && *iter!='\t') if(*iter!='{' && *iter!=' ' && *iter!='\t')
break; break;
if(iter.starts_line()) { if(iter.starts_line()) {
found_iter=iter; found_iter=iter;
return true; return true;
} }
} } while(iter.backward_char());
int count1=0; int count1=0;
int count2=0; int count2=0;
int count3=0; int count3=0;
int count4=0;
bool ignore=false; bool ignore=false;
@ -576,18 +575,14 @@ bool Source::View::find_start_of_sentence(Gtk::TextIter iter, Gtk::TextIter &fou
count1++; count1++;
else if(*iter==']') else if(*iter==']')
count2++; count2++;
else if(*iter=='>')
count3++;
else if(*iter=='}') else if(*iter=='}')
count4++; count3++;
else if(*iter=='(') else if(*iter=='(')
count1--; count1--;
else if(*iter=='[') else if(*iter=='[')
count2--; count2--;
else if(*iter=='<')
count3--;
else if(*iter=='{') else if(*iter=='{')
count4--; count3--;
} }
} }
if(iter.starts_line() && count1<=0 && count2<=0 && count3<=0) { 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; 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 count1=0;
int count2=0; int count2=0;
int count3=0;
bool ignore=false; bool ignore=false;
@ -620,16 +614,12 @@ bool Source::View::find_open_symbol(Gtk::TextIter iter, const Gtk::TextIter &unt
count1++; count1++;
else if(*iter==']') else if(*iter==']')
count2++; count2++;
else if(*iter=='>')
count3++;
else if(*iter=='(') else if(*iter=='(')
count1--; count1--;
else if(*iter=='[') else if(*iter=='[')
count2--; count2--;
else if(*iter=='<')
count3--;
} }
if(count1<0 || count2<0 || count3<0) { if(count1<0 || count2<0) {
found_iter=iter; found_iter=iter;
return true; 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;
} }
return false; return false;
@ -1258,9 +1249,13 @@ void Source::ClangViewParse::update_types() {
} }
} }
//Clang indentation //Clang indentation.
//TODO: replace indentation methods with a better implementation or maybe use libclang
bool Source::ClangViewParse::on_key_press_event(GdkEventKey* key) { 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()) { if(get_buffer()->get_has_selection()) {
return Source::View::on_key_press_event(key); 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) { if(key->keyval==GDK_KEY_Return) {
auto iter=get_buffer()->get_insert()->get_iter(); auto iter=get_buffer()->get_insert()->get_iter();
Gtk::TextIter start_of_sentence_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); auto start_line=get_line(start_of_sentence_iter);
std::smatch sm; std::smatch sm;
std::string tabs; std::string tabs;
@ -1321,7 +1316,7 @@ bool Source::ClangViewParse::on_key_press_event(GdkEventKey* key) {
auto line=get_line_before(); auto line=get_line_before();
iter=get_buffer()->get_insert()->get_iter(); iter=get_buffer()->get_insert()->get_iter();
auto found_iter=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(); auto offset=found_iter.get_line_offset();
tabs.clear(); tabs.clear();
for(int c=0;c<offset+1;c++) 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(Glib::RefPtr<Gtk::TextBuffer::Mark> mark);
std::string get_line_before(); std::string get_line_before();
bool find_start_of_sentence(Gtk::TextIter iter, Gtk::TextIter &found_iter); bool find_start_of_closed_expression(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_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 find_right_bracket_forward(Gtk::TextIter iter, Gtk::TextIter &found_iter);
bool on_key_press_event(GdkEventKey* key); bool on_key_press_event(GdkEventKey* key);
@ -109,6 +109,8 @@ namespace Source {
std::regex tabs_regex; std::regex tabs_regex;
bool spellcheck_all=false; bool spellcheck_all=false;
std::unique_ptr<SelectionDialog> spellcheck_suggestions_dialog;
bool spellcheck_suggestions_dialog_shown=false;
private: private:
GtkSourceSearchContext *search_context; GtkSourceSearchContext *search_context;
GtkSourceSearchSettings *search_settings; GtkSourceSearchSettings *search_settings;
@ -121,8 +123,6 @@ namespace Source {
std::pair<Gtk::TextIter, Gtk::TextIter> spellcheck_get_word(Gtk::TextIter iter); std::pair<Gtk::TextIter, Gtk::TextIter> spellcheck_get_word(Gtk::TextIter iter);
void spellcheck_word(const Gtk::TextIter& start, const Gtk::TextIter& end); 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::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; sigc::connection delayed_spellcheck_suggestions_connection;
bool last_keyval_is_backspace=false; bool last_keyval_is_backspace=false;
}; };

Loading…
Cancel
Save