SF.net SVN: geany: [1102] trunk

eht16 at users.sourceforge.net eht16 at xxxxx
Fri Dec 15 17:09:06 UTC 2006


Revision: 1102
          http://svn.sourceforge.net/geany/?rev=1102&view=rev
Author:   eht16
Date:     2006-12-15 09:09:05 -0800 (Fri, 15 Dec 2006)

Log Message:
-----------
Moved html_entities array to symbols.c.
Fixed some checks for the new D lexer and improved detection of comments when auto completing or showing calltips.

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/src/main.c
    trunk/src/sci_cb.c
    trunk/src/sci_cb.h
    trunk/src/symbols.c
    trunk/src/symbols.h

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2006-12-15 12:52:52 UTC (rev 1101)
+++ trunk/ChangeLog	2006-12-15 17:09:05 UTC (rev 1102)
@@ -1,3 +1,12 @@
+2006-12-15  Enrico Tröger  <enrico.troeger at uvena.de>
+
+ * src/main.c, src/sci_cb.c, src/sci_cb.h, src/symbols.c,
+   src/symbols.h:
+   Moved html_entities array to symbols.c.
+   Fixed some checks for the new D lexer and improved detection of
+   comments when auto completing or showing calltips.
+
+
 2006-12-15  Nick Treleaven  <nick.treleaven at btinternet.com>
 
  * src/sci_cb.c:
@@ -14,7 +23,7 @@
 
 2006-12-14  Frank Lanitz  <frank at frank.uvena.de>
 
- * about.c: Fixed a typo.
+ * src/about.c: Fixed a typo.
 
 
 2006-12-14  Nick Treleaven  <nick.treleaven at btinternet.com>
@@ -31,8 +40,8 @@
 
 2006-12-13  Frank Lanitz  <frank at frank.uvena.de>
 
- * THANKS: Small update of contact data and small fix of translated 
-   language. 
+ * THANKS: Small update of contact data and small fix of translated
+           language.
 
 
 2006-12-13  Nick Treleaven  <nick.treleaven at btinternet.com>

Modified: trunk/src/main.c
===================================================================
--- trunk/src/main.c	2006-12-15 12:52:52 UTC (rev 1101)
+++ trunk/src/main.c	2006-12-15 17:09:05 UTC (rev 1102)
@@ -52,6 +52,7 @@
 #include "search.h"
 #include "build.h"
 #include "highlighting.h"
+#include "symbols.h"
 
 #ifdef HAVE_SOCKET
 # include "socket.h"
@@ -239,7 +240,6 @@
 	app->tm_workspace				= tm_get_workspace();
 	app->recent_queue				= g_queue_new();
 	app->opening_session_files		= FALSE;
-	html_entities					= NULL;
 
 	app->window = create_window1();
 	app->new_file_menu = gtk_menu_new();
@@ -674,9 +674,9 @@
 	search_finalize();
 	build_finalize();
 	document_finalize();
+	symbols_finalize();
 
 	tm_workspace_free(TM_WORK_OBJECT(app->tm_workspace));
-	g_strfreev(html_entities);
 	g_free(app->configdir);
 	g_free(app->datadir);
 	g_free(app->docdir);

Modified: trunk/src/sci_cb.c
===================================================================
--- trunk/src/sci_cb.c	2006-12-15 12:52:52 UTC (rev 1101)
+++ trunk/src/sci_cb.c	2006-12-15 17:09:05 UTC (rev 1102)
@@ -52,6 +52,7 @@
 static gboolean handle_xml(ScintillaObject *sci, gchar ch, gint idx);
 static void get_indent(ScintillaObject *sci, gint pos, gboolean use_this_line);
 static void auto_multiline(ScintillaObject *sci, gint pos);
+static gboolean is_comment(gint lexer, gint style);
 
 
 // calls the edit popup menu in the editor
@@ -259,7 +260,6 @@
 				start = pos;
 				while (sci_get_char_at(sci, --start) != '&') ;
 
-				geany_debug("%d-%d", start, pos);
 				SSM(sci, SCI_INSERTTEXT, pos - 1, (sptr_t) nt->text);
 			}
 			break;
@@ -433,8 +433,9 @@
 	sci = doc_list[idx].sci;
 
 	lexer = SSM(sci, SCI_GETLEXER, 0, 0);
-	if (lexer != SCLEX_CPP && lexer != SCLEX_HTML && lexer != SCLEX_PASCAL && lexer != SCLEX_BASH)
-			return;
+	if (lexer != SCLEX_CPP && lexer != SCLEX_HTML && lexer != SCLEX_PASCAL &&
+		lexer != SCLEX_D && lexer != SCLEX_BASH)
+		return;
 
 	start_brace = brace_match(sci, pos);
 	line = sci_get_line_from_position(sci, pos);
@@ -454,13 +455,8 @@
 	}
 	g_free(line_buf);
 
-	//geany_debug("line_len: %d eol: %d cnt: %d", line_len, eol_char_len, cnt);
 	if ((line_len - eol_char_len - 1) != cnt) return;
 
-/*	geany_debug("pos: %d, start: %d char: %c start_line: %d", pos, start_brace,
-					sci_get_char_at(sci, pos), sci_get_line_from_position(sci, start_brace));
-*/
-
 	if (start_brace >= 0)
 	{
 		get_indent(sci, start_brace, TRUE);
@@ -509,8 +505,7 @@
 {
 	gchar c;
 	gint orig_pos = pos;
-	// we need something more intelligent than only check for '(' because LaTeX
-	// uses {, [ or (
+
 	c = SSM(sci, SCI_GETCHARAT, pos, 0);
 	while (pos >= 0 && pos > orig_pos - 300)
 	{
@@ -568,8 +563,11 @@
 	}
 
 	style = SSM(sci, SCI_GETSTYLEAT, pos, 0);
-	if (lexer == SCLEX_CPP && (style == SCE_C_COMMENT ||
-			style == SCE_C_COMMENTLINE || style == SCE_C_COMMENTDOC)) return FALSE;
+	if (is_comment(lexer, style))
+		return FALSE;
+	// never show a calltip in a PHP file outside of the <? ?> tags
+	if (lexer == SCLEX_HTML && ! (style >= SCE_HPHP_DEFAULT && style <= SCE_HPHP_OPERATOR))
+		return FALSE;
 
 	word[0] = '\0';
 	sci_cb_find_current_word(sci, pos - 1, word, sizeof word);
@@ -608,20 +606,20 @@
 {	// HTML entities auto completion
 	guint i, j = 0;
 	GString *words;
+	gchar **entities = symbols_get_html_entities();
 
-	if (*root != '&') return FALSE;
-	if (html_entities == NULL) return FALSE;
+	if (*root != '&' || entities == NULL) return FALSE;
 
 	words = g_string_sized_new(500);
 	for (i = 0; ; i++)
 	{
-		if (html_entities[i] == NULL) break;
-		else if (html_entities[i][0] == '#') continue;
+		if (entities[i] == NULL) break;
+		else if (entities[i][0] == '#') continue;
 
-		if (! strncmp(html_entities[i], root, rootlen))
+		if (! strncmp(entities[i], root, rootlen))
 		{
 			if (j++ > 0) g_string_append_c(words, ' ');
-			g_string_append(words, html_entities[i]);
+			g_string_append(words, entities[i]);
 		}
 	}
 	if (words->len > 0) show_autocomplete(sci, rootlen, words->str);
@@ -632,7 +630,7 @@
 
 static gboolean
 autocomplete_tags(gint idx, gchar *root, gsize rootlen)
-{	// PHP, LaTeX, C and C++ tag autocompletion
+{	// PHP, LaTeX, C, C++, D and Java tag autocompletion
 	TMTagAttrType attrs[] = { tm_tag_attr_name_t, 0 };
 	const GPtrArray *tags;
 	ScintillaObject *sci;
@@ -653,7 +651,6 @@
 			g_string_append(words, ((TMTag *) tags->pdata[j])->name);
 		}
 		show_autocomplete(sci, rootlen, words->str);
-		//geany_debug("string size: %d", words->len);
 		g_string_free(words, TRUE);
 	}
 	return TRUE;
@@ -667,9 +664,11 @@
 	ScintillaObject *sci;
 	gboolean ret = FALSE;
 	gchar *wordchars;
+	filetype *ft;
 
 	if (! DOC_IDX_VALID(idx) || doc_list[idx].file_type == NULL) return FALSE;
 	sci = doc_list[idx].sci;
+	ft = doc_list[idx].file_type;
 
 	line = sci_get_line_from_position(sci, pos);
 	line_start = sci_get_position_from_line(sci, line);
@@ -680,41 +679,16 @@
 	lexer = SSM(sci, SCI_GETLEXER, 0, 0);
 	style = SSM(sci, SCI_GETSTYLEAT, pos, 0);
 
-	// don't autocomplete in comments and strings
-	if (lexer == SCLEX_HTML && style == SCE_H_DEFAULT) return FALSE;
-	else if ((lexer == SCLEX_CPP || lexer == SCLEX_PASCAL) && (style == SCE_C_COMMENT ||
-														  style == SCE_C_COMMENTLINE ||
-														  style == SCE_C_COMMENTDOC ||
-														  style == SCE_C_STRING)) return FALSE;
-	else if (lexer == SCLEX_PYTHON && (style == SCE_P_COMMENTLINE ||
-									   style == SCE_P_COMMENTBLOCK ||
-									   style == SCE_P_STRING)) return FALSE;
-	else if (lexer == SCLEX_F77 && (style == SCE_F_COMMENT ||
-									style == SCE_F_STRING1 ||
-									style == SCE_F_STRING2)) return FALSE;
-	else if (lexer == SCLEX_PERL && (style == SCE_PL_COMMENTLINE ||
-									 style == SCE_PL_STRING)) return FALSE;
-	else if (lexer == SCLEX_PROPERTIES && style == SCE_PROPS_COMMENT) return FALSE;
-	else if (lexer == SCLEX_LATEX && style == SCE_L_COMMENT) return FALSE;
-	else if (lexer == SCLEX_MAKEFILE && style == SCE_MAKE_COMMENT) return FALSE;
-	else if (lexer == SCLEX_RUBY && (style == SCE_RB_COMMENTLINE ||
-									 style == SCE_RB_STRING)) return FALSE;
-	else if (lexer == SCLEX_BASH && (style == SCE_SH_COMMENTLINE ||
-									 style == SCE_SH_STRING)) return FALSE;
-	else if (lexer == SCLEX_SQL && (style == SCE_SQL_COMMENT ||
-									style == SCE_SQL_COMMENTLINE ||
-									style == SCE_SQL_COMMENTDOC ||
-									style == SCE_SQL_STRING)) return FALSE;
-	else if (lexer == SCLEX_TCL && (style == SCE_TCL_COMMENT ||
-									style == SCE_TCL_COMMENTLINE ||
-									style == SCE_TCL_IN_QUOTE)) return FALSE;
-	else if (lexer == SCLEX_RUBY && style == SCE_MAKE_COMMENT) return FALSE;
+	 // don't autocomplete in comments and strings
+	 if (is_comment(lexer, style))
+		return FALSE;
 
-
 	linebuf = sci_get_line(sci, line);
 
-	if (doc_list[idx].file_type->id == GEANY_FILETYPES_LATEX)
+	if (ft->id == GEANY_FILETYPES_LATEX)
 		wordchars = GEANY_WORDCHARS"\\"; // add \ to word chars if we are in a LaTeX file
+	else if (ft->id == GEANY_FILETYPES_HTML || ft->id == GEANY_FILETYPES_PHP)
+		wordchars = GEANY_WORDCHARS"&"; // add & to word chars if we are in a PHP or HTML file
 	else
 		wordchars = GEANY_WORDCHARS;
 
@@ -726,8 +700,8 @@
 	rootlen = current - startword;
 
 	// entity autocompletion always in a HTML file, in a PHP file only when we are outside of <? ?>
-	if (doc_list[idx].file_type->id == GEANY_FILETYPES_HTML ||
-		(doc_list[idx].file_type->id == GEANY_FILETYPES_PHP && (style < 118 || style > 127)))
+	if (ft->id == GEANY_FILETYPES_HTML ||
+		(ft->id == GEANY_FILETYPES_PHP && (style < SCE_HPHP_DEFAULT || style > SCE_HPHP_OPERATOR)))
 		ret = autocomplete_html(sci, root, rootlen);
 	else
 	{
@@ -833,7 +807,7 @@
 	lexer = SSM(sci, SCI_GETLEXER, 0, 0);
 	style = SSM(sci, SCI_GETSTYLEAT, pos - 2, 0);
 
-	// only for C, C++, Java, Perl and PHP
+	// only for C, C++, D, Ferite, Java, Perl and PHP
 	if (doc_list[idx].file_type->id != GEANY_FILETYPES_PHP &&
 		doc_list[idx].file_type->id != GEANY_FILETYPES_C &&
 		doc_list[idx].file_type->id != GEANY_FILETYPES_D &&
@@ -843,23 +817,13 @@
 		doc_list[idx].file_type->id != GEANY_FILETYPES_FERITE)
 		return;
 
-	// return, if we are in a comment, or when SCLEX_HTML but not in PHP
-	if (lexer == SCLEX_CPP && (
-		style == SCE_C_COMMENT ||
-	    style == SCE_C_COMMENTLINE ||
-	    style == SCE_C_COMMENTDOC ||
-	    style == SCE_C_COMMENTLINEDOC ||
-		style == SCE_C_STRING ||
-		style == SCE_C_CHARACTER ||
-		style == SCE_C_PREPROCESSOR)) return;
-	//if (lexer == SCLEX_HTML && ! (style >= 118 && style <= 127)) return;
+	// return, if we are in a comment
+	if (is_comment(lexer, style))
+		return;
+	// never auto complete in a PHP file outside of the <? ?> tags
+	if (lexer == SCLEX_HTML && ! (style >= SCE_HPHP_DEFAULT && style <= SCE_HPHP_OPERATOR))
+		return;
 
-	if (doc_list[idx].file_type->id == GEANY_FILETYPES_PHP && (
-		style == SCE_HPHP_SIMPLESTRING ||
-		style == SCE_HPHP_HSTRING ||
-		style == SCE_HPHP_COMMENTLINE ||
-		style == SCE_HPHP_COMMENT)) return;
-
 	// get the indention
 	if (doc_list[idx].use_auto_indention) get_indent(sci, pos, TRUE);
 	eol = g_strconcat(utils_get_eol_char(idx), indent, NULL);
@@ -1274,7 +1238,6 @@
 		line_len = sci_get_line_length(doc_list[idx].sci, i);
 		x = 0;
 
-		//geany_debug("line: %d line_start: %d len: %d (%d)", i, line_start, MIN(255, (line_len - 1)), line_len);
 		sci_get_text_range(doc_list[idx].sci, line_start, MIN((line_start + 255), (line_start + line_len - 1)), sel);
 		sel[MIN(255, (line_len - 1))] = '\0';
 
@@ -1323,8 +1286,7 @@
 					case SCLEX_CSS: style_comment = SCE_CSS_COMMENT; break;
 					case SCLEX_SQL: style_comment = SCE_SQL_COMMENT; break;
 					case SCLEX_CAML: style_comment = SCE_CAML_COMMENT; break;
-					case SCLEX_CPP:
-					case SCLEX_PASCAL:
+					case SCLEX_D: style_comment = SCE_D_COMMENT; break;
 					default: style_comment = SCE_C_COMMENT;
 				}
 				if (sci_get_style_at(doc_list[idx].sci, line_start + x) == style_comment)
@@ -1405,7 +1367,6 @@
 		line_len = sci_get_line_length(doc_list[idx].sci, i);
 		x = 0;
 
-		//geany_debug("line: %d line_start: %d len: %d (%d)", i, line_start, MIN(255, (line_len - 1)), line_len);
 		sci_get_text_range(doc_list[idx].sci, line_start, MIN((line_start + 255), (line_start + line_len - 1)), sel);
 		sel[MIN(255, (line_len - 1))] = '\0';
 
@@ -1476,8 +1437,7 @@
 					case SCLEX_CSS: style_comment = SCE_CSS_COMMENT; break;
 					case SCLEX_SQL: style_comment = SCE_SQL_COMMENT; break;
 					case SCLEX_CAML: style_comment = SCE_CAML_COMMENT; break;
-					case SCLEX_CPP:
-					case SCLEX_PASCAL:
+					case SCLEX_D: style_comment = SCE_D_COMMENT; break;
 					default: style_comment = SCE_C_COMMENT;
 				}
 				if (sci_get_style_at(doc_list[idx].sci, line_start + x) == style_comment)
@@ -1593,7 +1553,6 @@
 		line_len = sci_get_line_length(doc_list[idx].sci, i);
 		x = 0;
 
-		//geany_debug("line: %d line_start: %d len: %d (%d)", i, line_start, MIN(256, (line_len - 1)), line_len);
 		sci_get_text_range(doc_list[idx].sci, line_start, MIN((line_start + 256), (line_start + line_len - 1)), sel);
 		sel[MIN(256, (line_len - 1))] = '\0';
 
@@ -1633,8 +1592,7 @@
 					case SCLEX_CSS: style_comment = SCE_CSS_COMMENT; break;
 					case SCLEX_SQL: style_comment = SCE_SQL_COMMENT; break;
 					case SCLEX_CAML: style_comment = SCE_CAML_COMMENT; break;
-					case SCLEX_CPP:
-					case SCLEX_PASCAL:
+					case SCLEX_D: style_comment = SCE_D_COMMENT; break;
 					default: style_comment = SCE_C_COMMENT;
 				}
 				if (sci_get_style_at(doc_list[idx].sci, line_start + x) == style_comment) continue;
@@ -1780,6 +1738,135 @@
 }
 
 
+/* Checks whether the given style is a comment or string for the given lexer.
+ * It doesn't handle LEX_HTML, this should be done by the caller.
+ * Returns true if the style is a comment, FALSE otherwise.
+ */
+static gboolean is_comment(gint lexer, gint style)
+{
+	gboolean result = FALSE;
+
+	switch (lexer)
+	{
+		case SCLEX_CPP:
+		case SCLEX_PASCAL:
+		{
+			if (style == SCE_C_COMMENT ||
+				style == SCE_C_COMMENTLINE ||
+				style == SCE_C_COMMENTDOC ||
+				style == SCE_D_COMMENTLINEDOC ||
+				style == SCE_C_CHARACTER ||
+				style == SCE_C_PREPROCESSOR ||
+				style == SCE_C_STRING)
+				result = TRUE;
+			break;
+		}
+		case SCLEX_D:
+		{
+			if (style == SCE_D_COMMENT ||
+				style == SCE_D_COMMENTLINE ||
+				style == SCE_D_COMMENTDOC ||
+				style == SCE_D_COMMENTLINEDOC ||
+				style == SCE_D_COMMENTNESTED ||
+				style == SCE_D_CHARACTER ||
+				style == SCE_D_STRING)
+				result = TRUE;
+			break;
+		}
+		case SCLEX_PYTHON:
+		{
+			if (style == SCE_P_COMMENTLINE ||
+				style == SCE_P_COMMENTBLOCK ||
+				style == SCE_P_STRING)
+				result = TRUE;
+			break;
+		}
+		case SCLEX_F77:
+		{
+			if (style == SCE_F_COMMENT ||
+				style == SCE_F_STRING1 ||
+				style == SCE_F_STRING2)
+				result = TRUE;
+			break;
+		}
+		case SCLEX_PERL:
+		{
+			if (style == SCE_PL_COMMENTLINE ||
+				style == SCE_PL_STRING)
+				result = TRUE;
+			break;
+		}
+		case SCLEX_PROPERTIES:
+		{
+			if (style == SCE_PROPS_COMMENT)
+				result = TRUE;
+			break;
+		}
+		case SCLEX_LATEX:
+		{
+			if (style == SCE_L_COMMENT)
+				result = TRUE;
+			break;
+		}
+		case SCLEX_MAKEFILE:
+		{
+			if (style == SCE_MAKE_COMMENT)
+				result = TRUE;
+			break;
+		}
+		case SCLEX_RUBY:
+		{
+			if (style == SCE_RB_COMMENTLINE ||
+				style == SCE_RB_STRING)
+				result = TRUE;
+			break;
+		}
+		case SCLEX_BASH:
+		{
+			if (style == SCE_SH_COMMENTLINE ||
+				style == SCE_SH_STRING)
+				result = TRUE;
+			break;
+		}
+		case SCLEX_SQL:
+		{
+			if (style == SCE_SQL_COMMENT ||
+				style == SCE_SQL_COMMENTLINE ||
+				style == SCE_SQL_COMMENTDOC ||
+				style == SCE_SQL_STRING)
+				result = TRUE;
+			break;
+		}
+		case SCLEX_TCL:
+		{
+			if (style == SCE_TCL_COMMENT ||
+				style == SCE_TCL_COMMENTLINE ||
+				style == SCE_TCL_IN_QUOTE)
+				result = TRUE;
+			break;
+		}
+		case SCLEX_HTML:
+		{
+			if (style == SCE_HPHP_SIMPLESTRING ||
+				style == SCE_HPHP_HSTRING ||
+				style == SCE_HPHP_COMMENTLINE ||
+				style == SCE_HPHP_COMMENT ||
+				style == SCE_H_DOUBLESTRING ||
+				style == SCE_H_SINGLESTRING ||
+				style == SCE_H_CDATA ||
+				style == SCE_H_COMMENT ||
+				style == SCE_H_SGML_DOUBLESTRING ||
+				style == SCE_H_SGML_SIMPLESTRING ||
+				style == SCE_H_SGML_COMMENT)
+				result = TRUE;
+			break;
+		}
+	}
+
+	return result;
+}
+
+
 gboolean sci_cb_lexer_is_c_like(gint lexer)
 {
 	switch (lexer)
@@ -1793,4 +1880,3 @@
 	}
 }
 
-

Modified: trunk/src/sci_cb.h
===================================================================
--- trunk/src/sci_cb.h	2006-12-15 12:52:52 UTC (rev 1101)
+++ trunk/src/sci_cb.h	2006-12-15 17:09:05 UTC (rev 1102)
@@ -41,9 +41,7 @@
 
 extern EditorInfo editor_info;
 
-gchar **html_entities;
 
-
 gboolean
 on_editor_button_press_event           (GtkWidget *widget,
                                         GdkEventButton *event,

Modified: trunk/src/symbols.c
===================================================================
--- trunk/src/symbols.c	2006-12-15 12:52:52 UTC (rev 1101)
+++ trunk/src/symbols.c	2006-12-15 17:09:05 UTC (rev 1102)
@@ -28,7 +28,6 @@
 #include "symbols.h"
 #include "utils.h"
 #include "filetypes.h"
-#include "sci_cb.h"	// html_entities
 #include "encodings.h"
 #include "document.h"
 
@@ -43,6 +42,8 @@
 	GTF_MAX
 };
 
+static gchar **html_entities = NULL;
+
 typedef struct
 {
 	gboolean	tags_loaded;
@@ -285,3 +286,16 @@
 }
 
 
+gchar **symbols_get_html_entities()
+{
+	if (html_entities == NULL)
+		html_tags_loaded(); // if not yet created, force creation of the array but shouldn't occur
+
+	return html_entities;
+}
+
+
+void symbols_finalize()
+{
+	g_strfreev(html_entities);
+}

Modified: trunk/src/symbols.h
===================================================================
--- trunk/src/symbols.h	2006-12-15 12:52:52 UTC (rev 1101)
+++ trunk/src/symbols.h	2006-12-15 17:09:05 UTC (rev 1102)
@@ -35,4 +35,8 @@
 
 TMTag *symbols_find_in_workspace(const gchar *tag_name, gint type);
 
+gchar **symbols_get_html_entities();
+
+void symbols_finalize();
+
 #endif


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