Branch: refs/heads/master Author: Jiří Techet techet@gmail.com Committer: Enrico Tröger enrico.troeger@uvena.de Date: Sun, 09 Jan 2022 22:32:40 UTC Commit: 4980a03d50e975f9c64538e8fc8beefd5ea2f8ef https://github.com/geany/geany/commit/4980a03d50e975f9c64538e8fc8beefd5ea2f8...
Log Message: ----------- Move language-specific parts of whether to trigger scope autocompletion to tm_parser
Modified Paths: -------------- src/editor.c src/tagmanager/tm_parser.c src/tagmanager/tm_parser.h
Modified: src/editor.c 47 lines changed, 20 insertions(+), 27 deletions(-) =================================================================== @@ -642,20 +642,23 @@ static void show_tags_list(GeanyEditor *editor, const GPtrArray *tags, gsize roo }
-/* do not use with long strings */ -static gboolean match_last_chars(ScintillaObject *sci, gint pos, const gchar *str) +static gint scope_autocomplete_suffix(ScintillaObject *sci, TMParserType lang, + gint pos, gboolean *scope_sep) { - gsize len = strlen(str); + const gchar *sep = tm_parser_context_separator(lang); + const gsize max_len = 3; + gboolean is_scope_sep; gchar *buf;
- g_return_val_if_fail(len < 100, FALSE); + buf = g_alloca(max_len + 1); + sci_get_text_range(sci, pos - max_len, pos, buf);
- if ((gint)len > pos) - return FALSE; - - buf = g_alloca(len + 1); - sci_get_text_range(sci, pos - len, pos, buf); - return strcmp(str, buf) == 0; + is_scope_sep = g_str_has_suffix(buf, sep); + if (scope_sep) + *scope_sep = is_scope_sep; + if (is_scope_sep) + return strlen(sep); + return tm_parser_scope_autocomplete_suffix(lang, buf); }
@@ -706,6 +709,7 @@ static gboolean autocomplete_scope(GeanyEditor *editor, const gchar *root, gsize gboolean ret = FALSE; const gchar *current_scope; const gchar *context_sep = tm_parser_context_separator(ft->lang); + gint autocomplete_suffix_len;
if (autocomplete_scope_shown) { @@ -720,22 +724,13 @@ static gboolean autocomplete_scope(GeanyEditor *editor, const gchar *root, gsize typed = sci_get_char_at(sci, pos - 1); }
- /* make sure to keep in sync with similar checks below */ - if (match_last_chars(sci, pos, context_sep)) - { - pos -= strlen(context_sep); - scope_sep_typed = TRUE; - } - else if (typed == '.') - pos -= 1; - else if ((ft->id == GEANY_FILETYPES_C || ft->id == GEANY_FILETYPES_CPP) && - match_last_chars(sci, pos, "->")) - pos -= 2; - else if (ft->id == GEANY_FILETYPES_CPP && match_last_chars(sci, pos, "->*")) - pos -= 3; - else + autocomplete_suffix_len = scope_autocomplete_suffix(sci, ft->lang, pos, + &scope_sep_typed); + if (autocomplete_suffix_len == 0) return FALSE;
+ pos -= autocomplete_suffix_len; + /* allow for a space between word and operator */ while (pos > 0 && isspace(sci_get_char_at(sci, pos - 1))) pos--; @@ -765,9 +760,7 @@ static gboolean autocomplete_scope(GeanyEditor *editor, const gchar *root, gsize pos -= strlen(name); while (pos > 0 && isspace(sci_get_char_at(sci, pos - 1))) pos--; - /* make sure to keep in sync with similar checks above */ - member = match_last_chars(sci, pos, ".") || match_last_chars(sci, pos, context_sep) || - match_last_chars(sci, pos, "->") || match_last_chars(sci, pos, "->*"); + member = scope_autocomplete_suffix(sci, ft->lang, pos, NULL) > 0;
if (symbols_get_current_scope(editor->document, ¤t_scope) == -1) current_scope = "";
Modified: src/tagmanager/tm_parser.c 27 lines changed, 27 insertions(+), 0 deletions(-) =================================================================== @@ -818,6 +818,33 @@ void tm_parser_verify_type_mappings(void) }
+/* When the suffix of 'str' is an operator that should trigger scope + * autocompletion, this function should return the length of the operator, + * zero otherwise. */ +gint tm_parser_scope_autocomplete_suffix(TMParserType lang, const gchar *str) +{ + const gchar *sep = tm_parser_context_separator(lang); + + if (g_str_has_suffix(str, sep)) + return strlen(sep); + + switch (lang) + { + case TM_PARSER_C: + case TM_PARSER_CPP: + if (g_str_has_suffix(str, ".")) + return 1; + else if (g_str_has_suffix(str, "->")) + return 2; + else if (lang == TM_PARSER_CPP && g_str_has_suffix(str, "->*")) + return 3; + default: + break; + } + return 0; +} + + /* Get the name of constructor method. Arguments of this method will be used * for calltips when creating an object using the class name * (e.g. after the opening brace in 'c = MyClass()' in Python) */
Modified: src/tagmanager/tm_parser.h 2 lines changed, 2 insertions(+), 0 deletions(-) =================================================================== @@ -124,6 +124,8 @@ gchar tm_parser_get_tag_kind(TMTagType type, TMParserType lang);
TMTagType tm_parser_get_subparser_type(TMParserType lang, TMParserType sublang, TMTagType type);
+gint tm_parser_scope_autocomplete_suffix(TMParserType lang, const gchar *str); + const gchar *tm_parser_get_constructor_method(TMParserType lang);
gchar *tm_parser_update_scope(TMParserType lang, gchar *scope);
-------------- This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).