[geany/geany] bdee13: Keep a separate list of typenames for Scintilla syntax highlighting
Jiří Techet
git-noreply at xxxxx
Thu Oct 30 21:08:17 UTC 2014
Branch: refs/heads/master
Author: Jiří Techet <techet at gmail.com>
Committer: Jiří Techet <techet at gmail.com>
Date: Thu, 30 Oct 2014 21:08:17 UTC
Commit: bdee1336aa11d2064c6f71661697cfe84bc0d658
https://github.com/geany/geany/commit/bdee1336aa11d2064c6f71661697cfe84bc0d658
Log Message:
-----------
Keep a separate list of typenames for Scintilla syntax highlighting
Manage the list the same way as workspace tags_array by the fast tag removal
and merge. Thanks to this, typename tags don't have to be extracted from
tags_array periodically, which speeds up editing.
Modified Paths:
--------------
src/document.c
src/highlighting.c
src/symbols.c
src/symbols.h
tagmanager/src/tm_tag.c
tagmanager/src/tm_tag.h
tagmanager/src/tm_workspace.c
tagmanager/src/tm_workspace.h
Modified: src/document.c
3 lines changed, 1 insertions(+), 2 deletions(-)
===================================================================
@@ -2558,8 +2558,7 @@ void document_highlight_tags(GeanyDocument *doc)
/* get any type keywords and tell scintilla about them
* this will cause the type keywords to be colourized in scintilla */
- keywords_str = symbols_find_tags_as_string(app->tm_workspace->tags_array,
- TM_GLOBAL_TYPE_MASK, doc->file_type->lang);
+ keywords_str = symbols_find_typenames_as_string(doc->file_type->lang, FALSE);
if (keywords_str)
{
keywords = g_string_free(keywords_str, FALSE);
Modified: src/highlighting.c
19 lines changed, 1 insertions(+), 18 deletions(-)
===================================================================
@@ -433,23 +433,6 @@ void highlighting_free_styles(void)
}
-static GString *get_global_typenames(gint lang)
-{
- GString *s = NULL;
-
- if (app->tm_workspace)
- {
- GPtrArray *tags_array = app->tm_workspace->global_tags;
-
- if (tags_array)
- {
- s = symbols_find_tags_as_string(tags_array, TM_GLOBAL_TYPE_MASK, lang);
- }
- }
- return s;
-}
-
-
static gchar*
get_keyfile_whitespace_chars(GKeyFile *config, GKeyFile *configh)
{
@@ -823,7 +806,7 @@ static void merge_type_keywords(ScintillaObject *sci, guint ft_id, guint keyword
const gchar *user_words = style_sets[ft_id].keywords[keyword_idx];
GString *s;
- s = get_global_typenames(filetypes[ft_id]->lang);
+ s = symbols_find_typenames_as_string(filetypes[ft_id]->lang, TRUE);
if (G_UNLIKELY(s == NULL))
s = g_string_sized_new(200);
else
Modified: src/symbols.c
16 lines changed, 6 insertions(+), 10 deletions(-)
===================================================================
@@ -64,11 +64,6 @@
#include <stdlib.h>
-const guint TM_GLOBAL_TYPE_MASK =
- tm_tag_class_t | tm_tag_enum_t | tm_tag_interface_t |
- tm_tag_struct_t | tm_tag_typedef_t | tm_tag_union_t | tm_tag_namespace_t;
-
-
static gchar **html_entities = NULL;
typedef struct
@@ -248,7 +243,7 @@ static void html_tags_loaded(void)
}
-GString *symbols_find_tags_as_string(GPtrArray *tags_array, guint tag_types, gint lang)
+GString *symbols_find_typenames_as_string(gint lang, gboolean global)
{
guint j;
TMTag *tag;
@@ -256,9 +251,10 @@ GString *symbols_find_tags_as_string(GPtrArray *tags_array, guint tag_types, gin
GPtrArray *typedefs;
gint tag_lang;
- g_return_val_if_fail(tags_array != NULL, NULL);
-
- typedefs = tm_tags_extract(tags_array, tag_types);
+ if (global)
+ typedefs = tm_tags_extract(app->tm_workspace->global_tags, TM_GLOBAL_TYPE_MASK);
+ else
+ typedefs = app->tm_workspace->typename_array;
if ((typedefs) && (typedefs->len > 0))
{
@@ -280,7 +276,7 @@ GString *symbols_find_tags_as_string(GPtrArray *tags_array, guint tag_types, gin
}
}
}
- if (typedefs)
+ if (typedefs && global)
g_ptr_array_free(typedefs, TRUE);
return s;
}
Modified: src/symbols.h
4 lines changed, 1 insertions(+), 3 deletions(-)
===================================================================
@@ -34,8 +34,6 @@ const gchar *symbols_get_context_separator(gint ft_id);
#ifdef GEANY_PRIVATE
-extern const guint TM_GLOBAL_TYPE_MASK;
-
enum
{
SYMBOLS_SORT_BY_NAME,
@@ -52,7 +50,7 @@ void symbols_reload_config_files(void);
void symbols_global_tags_loaded(guint file_type_idx);
-GString *symbols_find_tags_as_string(GPtrArray *tags_array, guint tag_types, gint lang);
+GString *symbols_find_typenames_as_string(gint lang, gboolean global);
const GList *symbols_get_tag_list(GeanyDocument *doc, guint tag_types);
Modified: tagmanager/src/tm_tag.c
5 lines changed, 5 insertions(+), 0 deletions(-)
===================================================================
@@ -78,6 +78,11 @@ static void log_tag_free(TMTag *tag)
#endif /* DEBUG_TAG_REFS */
+const guint TM_GLOBAL_TYPE_MASK =
+ tm_tag_class_t | tm_tag_enum_t | tm_tag_interface_t |
+ tm_tag_struct_t | tm_tag_typedef_t | tm_tag_union_t | tm_tag_namespace_t;
+
+
/* Note: To preserve binary compatibility, it is very important
that you only *append* to this list ! */
enum
Modified: tagmanager/src/tm_tag.h
3 lines changed, 3 insertions(+), 0 deletions(-)
===================================================================
@@ -143,6 +143,9 @@ typedef struct _TMTag
#ifdef GEANY_PRIVATE
+extern const guint TM_GLOBAL_TYPE_MASK;
+
+
typedef enum {
TM_FILE_FORMAT_TAGMANAGER,
TM_FILE_FORMAT_PIPE,
Modified: tagmanager/src/tm_workspace.c
33 lines changed, 26 insertions(+), 7 deletions(-)
===================================================================
@@ -44,6 +44,7 @@ static gboolean tm_create_workspace(void)
theWorkspace->global_tags = g_ptr_array_new();
theWorkspace->source_files = g_ptr_array_new();
+ theWorkspace->typename_array = g_ptr_array_new();
return TRUE;
}
@@ -63,6 +64,7 @@ void tm_workspace_free(void)
g_ptr_array_free(theWorkspace->source_files, TRUE);
tm_tags_array_free(theWorkspace->global_tags, TRUE);
g_ptr_array_free(theWorkspace->tags_array, TRUE);
+ g_ptr_array_free(theWorkspace->typename_array, TRUE);
g_free(theWorkspace);
theWorkspace = NULL;
}
@@ -108,7 +110,10 @@ void tm_workspace_remove_source_file(TMSourceFile *source_file, gboolean update_
if (theWorkspace->source_files->pdata[i] == source_file)
{
if (update_workspace)
+ {
tm_tags_remove_file_tags(source_file, theWorkspace->tags_array);
+ tm_tags_remove_file_tags(source_file, theWorkspace->typename_array);
+ }
g_ptr_array_remove_index_fast(theWorkspace->source_files, i);
return;
}
@@ -506,18 +511,19 @@ void tm_workspace_update(void)
g_message("Total: %d tags", theWorkspace->tags_array->len);
#endif
tm_tags_sort(theWorkspace->tags_array, sort_attrs, TRUE, FALSE);
+
+ theWorkspace->typename_array = tm_tags_extract(theWorkspace->tags_array, TM_GLOBAL_TYPE_MASK);
}
-static void tm_workspace_merge_file_tags(TMSourceFile *source_file)
+static void tm_workspace_merge_tags(GPtrArray **big_array, GPtrArray *small_array)
{
TMTagAttrType sort_attrs[] = { tm_tag_attr_name_t, tm_tag_attr_file_t,
tm_tag_attr_scope_t, tm_tag_attr_type_t, tm_tag_attr_arglist_t, 0};
- GPtrArray *new_tags = tm_tags_merge(theWorkspace->tags_array,
- source_file->tags_array, sort_attrs, FALSE);
+ GPtrArray *new_tags = tm_tags_merge(*big_array, small_array, sort_attrs, FALSE);
/* tags owned by TMSourceFile - free just the pointer array */
- g_ptr_array_free(theWorkspace->tags_array, TRUE);
- theWorkspace->tags_array = new_tags;
+ g_ptr_array_free(*big_array, TRUE);
+ *big_array = new_tags;
}
/** Updates the source file by reparsing. The tags array and
@@ -540,15 +546,22 @@ void tm_workspace_update_source_file(TMSourceFile *source_file, gboolean update_
/* tm_source_file_parse() deletes the tag objects - remove the tags from
* workspace while they exist and can be scanned */
tm_tags_remove_file_tags(source_file, theWorkspace->tags_array);
+ tm_tags_remove_file_tags(source_file, theWorkspace->typename_array);
}
tm_source_file_parse(source_file);
tm_tags_sort(source_file->tags_array, NULL, FALSE, TRUE);
if (update_workspace)
{
+ GPtrArray *sf_typedefs;
+
#ifdef TM_DEBUG
g_message("Updating workspace from source file");
#endif
- tm_workspace_merge_file_tags(source_file);
+ tm_workspace_merge_tags(&theWorkspace->tags_array, source_file->tags_array);
+
+ sf_typedefs = tm_tags_extract(source_file->tags_array, TM_GLOBAL_TYPE_MASK);
+ tm_workspace_merge_tags(&theWorkspace->typename_array, sf_typedefs);
+ g_ptr_array_free(sf_typedefs, TRUE);
}
#ifdef TM_DEBUG
else
@@ -592,10 +605,16 @@ void tm_workspace_update_source_file_buffer(TMSourceFile *source_file, guchar* t
tm_tags_sort(source_file->tags_array, NULL, FALSE, TRUE);
if (update_workspace)
{
+ GPtrArray *sf_typedefs;
+
#ifdef TM_DEBUG
g_message("Updating workspace from buffer..");
#endif
- tm_workspace_merge_file_tags(source_file);
+ tm_workspace_merge_tags(&theWorkspace->tags_array, source_file->tags_array);
+
+ sf_typedefs = tm_tags_extract(source_file->tags_array, TM_GLOBAL_TYPE_MASK);
+ tm_workspace_merge_tags(&theWorkspace->typename_array, sf_typedefs);
+ g_ptr_array_free(sf_typedefs, TRUE);
}
#ifdef TM_DEBUG
else
Modified: tagmanager/src/tm_workspace.h
1 lines changed, 1 insertions(+), 0 deletions(-)
===================================================================
@@ -32,6 +32,7 @@ typedef struct
GPtrArray *source_files; /**< An array of TMSourceFile pointers */
GPtrArray *tags_array; /**< Sorted tags from all source files
(just pointers to source file tags, the tag objects are owned by the source files) */
+ GPtrArray *typename_array; /**< Typename tags for syntax highlighting (pointers owned by source files) */
} TMWorkspace;
void tm_workspace_add_source_file(TMSourceFile *source_file);
--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).
More information about the Commits
mailing list