SF.net SVN: geany: [1934] trunk

eht16 at users.sourceforge.net eht16 at xxxxx
Tue Oct 9 12:04:15 UTC 2007


Revision: 1934
          http://geany.svn.sourceforge.net/geany/?rev=1934&view=rev
Author:   eht16
Date:     2007-10-09 05:04:15 -0700 (Tue, 09 Oct 2007)

Log Message:
-----------
Fix wrong colouring of type keywords of tags from different filetypes.

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/src/document.c
    trunk/src/highlighting.c
    trunk/src/symbols.c
    trunk/src/symbols.h

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2007-10-09 11:49:42 UTC (rev 1933)
+++ trunk/ChangeLog	2007-10-09 12:04:15 UTC (rev 1934)
@@ -1,3 +1,10 @@
+2007-10-09  Enrico Tröger  <enrico(dot)troeger(at)uvena(dot)de>
+
+ * src/document.c, src/highlighting.c, src/symbols.c, src/symbols.h:
+   Fix wrong colouring of type keywords of tags from different
+   filetypes.
+
+
 2007-10-09  Nick Treleaven  <nick(dot)treleaven(at)btinternet(dot)com>
 
  * src/keybindings.c:

Modified: trunk/src/document.c
===================================================================
--- trunk/src/document.c	2007-10-09 11:49:42 UTC (rev 1933)
+++ trunk/src/document.c	2007-10-09 12:04:15 UTC (rev 1934)
@@ -85,7 +85,7 @@
 static void document_undo_clear(gint idx);
 static void document_redo_add(gint idx, guint type, gpointer data);
 
-static gboolean update_type_keywords(ScintillaObject *sci);
+static gboolean update_type_keywords(ScintillaObject *sci, gint lang);
 
 
 // ignore the case of filenames and paths under WIN32, causes errors if not
@@ -1271,10 +1271,10 @@
 		// unfold maybe folded results
 		sci_ensure_line_is_visible(doc_list[idx].sci,
 			sci_get_line_from_position(doc_list[idx].sci, ttf.chrgText.cpMin));
-		
+
 		sci_set_selection_start(doc_list[idx].sci, ttf.chrgText.cpMin);
 		sci_set_selection_end(doc_list[idx].sci, ttf.chrgText.cpMax);
-		
+
 		// we need to force scrolling in case the cursor is outside of the current visible area
 		// doc_list[].scroll_percent doesn't work because sci isn't always updated while searching
 		editor_scroll_to_line(doc_list[idx].sci, -1, 0.3F);
@@ -1710,7 +1710,7 @@
 /* Caches the list of project typenames, as a space separated GString.
  * Returns: TRUE if typenames have changed.
  * (*types) is set to the list of typenames, or NULL if there are none. */
-static gboolean get_project_typenames(const GString **types)
+static gboolean get_project_typenames(const GString **types, gint lang)
 {
 	static GString *last_typenames = NULL;
 	GString *s = NULL;
@@ -1721,7 +1721,7 @@
 
 		if (tags_array)
 		{
-			s = symbols_find_tags_as_string(tags_array, TM_GLOBAL_TYPE_MASK);
+			s = symbols_find_tags_as_string(tags_array, TM_GLOBAL_TYPE_MASK, lang);
 		}
 	}
 
@@ -1747,7 +1747,7 @@
  * If sci is not NULL, then if sci supports typenames, project typenames are updated
  * if necessary, and typename keywords are set for sci.
  * Returns: TRUE if any scintilla type keywords were updated. */
-static gboolean update_type_keywords(ScintillaObject *sci)
+static gboolean update_type_keywords(ScintillaObject *sci, gint lang)
 {
 	gboolean ret = FALSE;
 	guint n;
@@ -1756,7 +1756,7 @@
 	if (sci != NULL && editor_lexer_get_type_keyword_idx(sci_get_lexer(sci)) == -1)
 		return FALSE;
 
-	if (! get_project_typenames(&s))
+	if (! get_project_typenames(&s, lang))
 	{	// typenames have not changed
 		if (s != NULL && sci != NULL)
 		{
@@ -1827,7 +1827,7 @@
 	{
 		/* Check if project typename keywords have changed.
 		 * If they haven't, we may need to colourise the document. */
-		if (! update_type_keywords(doc_list[idx].sci) && colourise)
+		if (! update_type_keywords(doc_list[idx].sci, type->lang) && colourise)
 			sci_colourise(doc_list[idx].sci, 0, -1);
 	}
 	if (ft_changed)
@@ -2393,7 +2393,7 @@
 	memset(doc_set, TRUE, doc_array->len * sizeof(gint8));
 
 	// remove existing docs from the set if they don't use typenames or typenames haven't changed
-	recolour = update_type_keywords(NULL);
+	recolour = update_type_keywords(NULL, -2);
 	for (i = 0; i < doc_indexes->len; i++)
 	{
 		ScintillaObject *sci;

Modified: trunk/src/highlighting.c
===================================================================
--- trunk/src/highlighting.c	2007-10-09 11:49:42 UTC (rev 1933)
+++ trunk/src/highlighting.c	2007-10-09 12:04:15 UTC (rev 1934)
@@ -344,7 +344,7 @@
 }
 
 
-static GString *get_global_typenames()
+static GString *get_global_typenames(gint lang)
 {
 	GString *s = NULL;
 
@@ -354,7 +354,7 @@
 
 		if (tags_array)
 		{
-			s = symbols_find_tags_as_string(tags_array, TM_GLOBAL_TYPE_MASK);
+			s = symbols_find_tags_as_string(tags_array, TM_GLOBAL_TYPE_MASK, lang);
 		}
 	}
 	return s;
@@ -592,11 +592,12 @@
 
 
 /* Assign global typedefs and user secondary keywords */
-static void assign_global_and_user_keywords(ScintillaObject *sci, const gchar *user_words)
+static void assign_global_and_user_keywords(ScintillaObject *sci,
+											const gchar *user_words, gint lang)
 {
 	GString *s;
 
-	s = get_global_typenames();
+	s = get_global_typenames(lang);
 	if (s == NULL)
 		s = g_string_sized_new(200);
 	else
@@ -749,7 +750,8 @@
 	SSM(sci, SCI_SETKEYWORDS, 2, (sptr_t) style_sets[GEANY_FILETYPES_C].keywords[2]);
 
 	// assign global types, merge them with user defined keywords and set them
-	assign_global_and_user_keywords(sci, style_sets[GEANY_FILETYPES_C].keywords[1]);
+	assign_global_and_user_keywords(sci, style_sets[GEANY_FILETYPES_C].keywords[1],
+		filetypes[ft_id]->lang);
 
 	styleset_c_like(sci, GEANY_FILETYPES_C);
 
@@ -805,7 +807,8 @@
 	SSM(sci, SCI_SETKEYWORDS, 2, (sptr_t) style_sets[GEANY_FILETYPES_CPP].keywords[2]);
 
 	// assign global types, merge them with user defined keywords and set them
-	assign_global_and_user_keywords(sci, style_sets[GEANY_FILETYPES_CPP].keywords[1]);
+	assign_global_and_user_keywords(sci, style_sets[GEANY_FILETYPES_CPP].keywords[1],
+		filetypes[ft_id]->lang);
 
 	styleset_c_like(sci, GEANY_FILETYPES_CPP);
 
@@ -868,7 +871,7 @@
 	SSM(sci, SCI_SETKEYWORDS, 2, (sptr_t) style_sets[ft_id].keywords[2]);
 
 	// assign global types, merge them with user defined keywords and set them
-	assign_global_and_user_keywords(sci, style_sets[ft_id].keywords[1]);
+	assign_global_and_user_keywords(sci, style_sets[ft_id].keywords[1], filetypes[ft_id]->lang);
 
 	styleset_c_like(sci, ft_id);
 

Modified: trunk/src/symbols.c
===================================================================
--- trunk/src/symbols.c	2007-10-09 11:49:42 UTC (rev 1933)
+++ trunk/src/symbols.c	2007-10-09 12:04:15 UTC (rev 1934)
@@ -149,9 +149,10 @@
 }
 
 
-GString *symbols_find_tags_as_string(GPtrArray *tags_array, guint tag_types)
+GString *symbols_find_tags_as_string(GPtrArray *tags_array, guint tag_types, gint lang)
 {
 	guint j;
+	TMTag *tag;
 	GString *s = NULL;
 	GPtrArray *typedefs;
 
@@ -164,13 +165,22 @@
 		s = g_string_sized_new(typedefs->len * 10);
 		for (j = 0; j < typedefs->len; ++j)
 		{
-			if (!(TM_TAG(typedefs->pdata[j])->atts.entry.scope))
+			tag = TM_TAG(typedefs->pdata[j]);
+			if (!(tag->atts.entry.scope))
 			{
-				if (TM_TAG(typedefs->pdata[j])->name)
+				// tag->atts.file.lang contains (for some reason) the line of the tag if
+				// tag->atts.entry.file is not NULL
+				gint tag_lang =
+					(tag->atts.entry.file) ? tag->atts.entry.file->lang : tag->atts.file.lang;
+
+				// the check for tag_lang == lang is necessary to avoid wrong type colouring of
+				// e.g. PHP classes in C++ files
+				// lang = -2 disables the check
+				if (tag->name && (tag_lang == lang || lang == -2))
 				{
 					if (j != 0)
 						g_string_append_c(s, ' ');
-					g_string_append(s, TM_TAG(typedefs->pdata[j])->name);
+					g_string_append(s, tag->name);
 				}
 			}
 		}

Modified: trunk/src/symbols.h
===================================================================
--- trunk/src/symbols.h	2007-10-09 11:49:42 UTC (rev 1933)
+++ trunk/src/symbols.h	2007-10-09 12:04:15 UTC (rev 1934)
@@ -30,7 +30,7 @@
 
 void symbols_global_tags_loaded(gint file_type_idx);
 
-GString *symbols_find_tags_as_string(GPtrArray *tags_array, guint tag_types);
+GString *symbols_find_tags_as_string(GPtrArray *tags_array, guint tag_types, gint lang);
 
 const gchar *symbols_get_context_separator(gint ft_id);
 


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the Commits mailing list