From bb0f873d012fd8c529bddff82058ff32ac08c627 Mon Sep 17 00:00:00 2001 From: eidheim Date: Thu, 8 Sep 2016 22:51:35 +0200 Subject: [PATCH] Simplified and improved Source::SpellCheckView::is_code_iter --- src/source_spellcheck.cc | 42 +++++++++------------------------------- src/source_spellcheck.h | 3 +++ 2 files changed, 12 insertions(+), 33 deletions(-) diff --git a/src/source_spellcheck.cc b/src/source_spellcheck.cc index 979f767..99f2400 100644 --- a/src/source_spellcheck.cc +++ b/src/source_spellcheck.cc @@ -185,6 +185,13 @@ Source::SpellCheckView::SpellCheckView() : Gsv::View() { delayed_spellcheck_suggestions_connection.disconnect(); return false; }); + + get_buffer()->get_tag_table()->signal_tag_added().connect([this](const Glib::RefPtr &tag) { + if(tag->property_name()=="gtksourceview:context-classes:comment") + comment_tag=tag; + else if(tag->property_name()=="gtksourceview:context-classes:string") + string_tag=tag; + }); } Source::SpellCheckView::~SpellCheckView() { @@ -301,46 +308,15 @@ void Source::SpellCheckView::goto_next_spellcheck_error() { } bool Source::SpellCheckView::is_code_iter(const Gtk::TextIter &iter) { - auto is_comment=[this](const Gtk::TextIter &iter) { - return get_source_buffer()->iter_has_context_class(iter, "comment"); - }; - auto is_string=[this](const Gtk::TextIter &iter) { - return get_source_buffer()->iter_has_context_class(iter, "string"); - }; - if(*iter=='\'') { auto previous_iter=iter; if(!iter.starts_line() && previous_iter.backward_char() && *previous_iter=='\'') return false; } - if(is_comment(iter)) + if(comment_tag && ((iter.has_tag(comment_tag) && !iter.begins_tag(comment_tag)) || iter.ends_tag(comment_tag))) return false; - if(is_string(iter)) { - //Add exception for in front of " and ' - if(*iter=='\'' || *iter=='"') { - auto previous_iter=iter; - if(previous_iter.backward_char()) { - if(!is_string(previous_iter)) - return true; - } - else - return true; - } + if(string_tag && iter.has_tag(string_tag) && !iter.begins_tag(string_tag)) return false; - } - //Iters after '...' and "..." should be code iters at the end of line - if(iter.ends_line() && !iter.starts_line()) { - auto previous_iter=iter; - if(previous_iter.backward_char()) { - if(is_comment(previous_iter)) - return false; - if(is_string(previous_iter) && *previous_iter!='\'' && *previous_iter!='"') { - auto next_iter=iter; - if(next_iter.forward_char() && !is_string(next_iter)) - return false; - } - } - } return true; } diff --git a/src/source_spellcheck.h b/src/source_spellcheck.h index e168b59..41d8826 100644 --- a/src/source_spellcheck.h +++ b/src/source_spellcheck.h @@ -26,6 +26,9 @@ namespace Source { private: std::unique_ptr spellcheck_suggestions_dialog; + Glib::RefPtr comment_tag; + Glib::RefPtr string_tag; + static AspellConfig* spellcheck_config; AspellCanHaveError *spellcheck_possible_err; AspellSpeller *spellcheck_checker;