[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