SF.net SVN: geany:[2872] trunk

ntrel at users.sourceforge.net ntrel at xxxxx
Mon Aug 11 16:31:38 UTC 2008


Revision: 2872
          http://geany.svn.sourceforge.net/geany/?rev=2872&view=rev
Author:   ntrel
Date:     2008-08-11 16:31:36 +0000 (Mon, 11 Aug 2008)

Log Message:
-----------
Break is_comment() into comment and string detection, each called in
is_code_style().

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/src/editor.c

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2008-08-11 16:14:39 UTC (rev 2871)
+++ trunk/ChangeLog	2008-08-11 16:31:36 UTC (rev 2872)
@@ -7,6 +7,9 @@
    Fix auto-multiline comment completion for CSS.
    Fix doc-comment keyword styles confusing auto-multiline comment
    completion.
+ * src/editor.c:
+   Break is_comment() into comment and string detection, each called in
+   is_code_style().
 
 
 2008-08-08  Nick Treleaven  <nick(dot)treleaven(at)btinternet(dot)com>

Modified: trunk/src/editor.c
===================================================================
--- trunk/src/editor.c	2008-08-11 16:14:39 UTC (rev 2871)
+++ trunk/src/editor.c	2008-08-11 16:31:36 UTC (rev 2872)
@@ -77,7 +77,7 @@
 static void get_indent(GeanyEditor *editor, gint pos);
 static void insert_indent_after_line(GeanyEditor *editor, gint line);
 static void auto_multiline(GeanyEditor *editor, gint pos);
-static gboolean is_comment(gint lexer, gint prev_style, gint style);
+static gboolean is_code_style(gint lexer, gint prev_style, gint style);
 static void auto_close_bracket(ScintillaObject *sci, gint pos, gchar c);
 static void auto_table(GeanyEditor *editor, gint pos);
 static void close_block(GeanyEditor *editor, gint pos);
@@ -1309,7 +1309,7 @@
 
 	/* the style 1 before the brace (which may be highlighted) */
 	style = SSM(sci, SCI_GETSTYLEAT, pos - 1, 0);
-	if (is_comment(lexer, style, style))
+	if (! is_code_style(lexer, style, style))
 		return FALSE;
 
 	word[0] = '\0';
@@ -1451,7 +1451,7 @@
 		style = SSM(sci, SCI_GETSTYLEAT, pos, 0);
 
 	 /* don't autocomplete in comments and strings */
-	 if (!force && is_comment(lexer, prev_style, style))
+	 if (!force && !is_code_style(lexer, prev_style, style))
 		return FALSE;
 
 	linebuf = sci_get_line(sci, line);
@@ -2568,190 +2568,195 @@
 }
 
 
-/* Checks whether the given style is a comment or string for the given lexer.
+/* Checks whether the given style is a string for the given lexer.
  * It doesn't handle LEX_HTML, this should be done by the caller.
  * prev_style is used for some lexers where the style of two positions before is needed.
+ * Returns true if the style is a string, FALSE otherwise.
+ */
+static gboolean is_string_style(gint lexer, gint prev_style, gint style)
+{
+	switch (lexer)
+	{
+		case SCLEX_CPP:
+		case SCLEX_PASCAL:
+			return (style == SCE_C_CHARACTER ||
+				style == SCE_C_STRING);
+
+		case SCLEX_D:
+			return (style == SCE_D_CHARACTER ||
+				style == SCE_D_STRING);
+
+		case SCLEX_PYTHON:
+			return (style == SCE_P_STRING ||
+				style == SCE_P_TRIPLE ||
+				style == SCE_P_TRIPLEDOUBLE ||
+				style == SCE_P_CHARACTER);
+
+		case SCLEX_F77:
+		case SCLEX_FORTRAN:
+			return (style == SCE_F_STRING1 ||
+				style == SCE_F_STRING2);
+
+		case SCLEX_PERL:
+			return (prev_style == SCE_PL_STRING ||
+				style == SCE_PL_STRING ||
+				style == SCE_PL_HERE_DELIM ||
+				style == SCE_PL_HERE_Q ||
+				style == SCE_PL_HERE_QQ ||
+				style == SCE_PL_HERE_QX ||
+				style == SCE_PL_POD ||
+				style == SCE_PL_POD_VERB);
+
+		case SCLEX_RUBY:
+			return (style == SCE_RB_CHARACTER ||
+				style == SCE_RB_STRING ||
+				style == SCE_RB_HERE_DELIM ||
+				style == SCE_RB_HERE_Q ||
+				style == SCE_RB_HERE_QQ ||
+				style == SCE_RB_HERE_QX ||
+				style == SCE_RB_POD);
+
+		case SCLEX_BASH:
+			return (style == SCE_SH_STRING);
+
+		case SCLEX_SQL:
+			return (style == SCE_SQL_STRING);
+
+		case SCLEX_TCL:
+			return (style == SCE_TCL_IN_QUOTE);
+
+		case SCLEX_LUA:
+			return (style == SCE_LUA_LITERALSTRING ||
+				style == SCE_LUA_CHARACTER ||
+				style == SCE_LUA_STRING);
+
+		case SCLEX_HASKELL:
+			return (style == SCE_HA_CHARACTER ||
+				style == SCE_HA_STRING);
+
+		case SCLEX_FREEBASIC:
+			return (style == SCE_B_STRING);
+
+		case SCLEX_HTML:
+			return (prev_style == SCE_HPHP_SIMPLESTRING ||
+				prev_style == SCE_HPHP_HSTRING ||  /* HSTRING is a heredoc */
+				prev_style == SCE_HPHP_HSTRING_VARIABLE ||
+				prev_style == SCE_H_DOUBLESTRING ||
+				prev_style == SCE_H_SINGLESTRING ||
+				prev_style == SCE_H_CDATA ||
+				prev_style == SCE_H_SGML_DOUBLESTRING ||
+				prev_style == SCE_H_SGML_SIMPLESTRING);
+	}
+	return FALSE;
+}
+
+
+/* Checks whether the given style is a comment for the given lexer.
+ * It doesn't handle LEX_HTML, this should be done by the caller.
+ * prev_style is used for some lexers where the style of two positions before is needed.
  * Returns true if the style is a comment, FALSE otherwise.
  */
-static gboolean is_comment(gint lexer, gint prev_style, gint style)
+static gboolean is_comment_style(gint lexer, gint prev_style, gint style)
 {
-	gboolean result = FALSE;
-
 	switch (lexer)
 	{
 		case SCLEX_CPP:
 		case SCLEX_PASCAL:
-		{
-			if (style == SCE_C_COMMENT ||
+			return (style == SCE_C_COMMENT ||
 				style == SCE_C_COMMENTLINE ||
 				style == SCE_C_COMMENTDOC ||
 				style == SCE_C_COMMENTLINEDOC ||
 				style == SCE_C_COMMENTDOCKEYWORD ||
-				style == SCE_C_COMMENTDOCKEYWORDERROR ||
-				style == SCE_C_CHARACTER ||
-				style == SCE_C_PREPROCESSOR ||
-				style == SCE_C_STRING)
-				result = TRUE;
-			break;
-		}
+				style == SCE_C_COMMENTDOCKEYWORDERROR);
+
 		case SCLEX_D:
-		{
-			if (style == SCE_D_COMMENT ||
+			return (style == SCE_D_COMMENT ||
 				style == SCE_D_COMMENTLINE ||
 				style == SCE_D_COMMENTDOC ||
 				style == SCE_D_COMMENTNESTED ||
 				style == SCE_D_COMMENTLINEDOC ||
 				style == SCE_D_COMMENTDOCKEYWORD ||
-				style == SCE_D_COMMENTDOCKEYWORDERROR ||
-				style == SCE_D_CHARACTER ||
-				style == SCE_D_STRING)
-				result = TRUE;
-			break;
-		}
+				style == SCE_D_COMMENTDOCKEYWORDERROR);
+
 		case SCLEX_PYTHON:
-		{
-			if (style == SCE_P_COMMENTLINE ||
+			return (style == SCE_P_COMMENTLINE ||
 				style == SCE_P_COMMENTBLOCK ||
 				prev_style == SCE_P_COMMENTLINE ||
-				prev_style == SCE_P_COMMENTBLOCK ||
-				style == SCE_P_STRING ||
-				style == SCE_P_TRIPLE ||
-				style == SCE_P_TRIPLEDOUBLE ||
-				style == SCE_P_CHARACTER)
-				result = TRUE;
-			break;
-		}
+				prev_style == SCE_P_COMMENTBLOCK);
+
 		case SCLEX_F77:
 		case SCLEX_FORTRAN:
-		{
-			if (style == SCE_F_COMMENT ||
-				style == SCE_F_STRING1 ||
-				style == SCE_F_STRING2)
-				result = TRUE;
-			break;
-		}
+			return (style == SCE_F_COMMENT);
+
 		case SCLEX_PERL:
-		{
-			if (prev_style == SCE_PL_COMMENTLINE ||
-				prev_style == SCE_PL_STRING ||
-				style == SCE_PL_COMMENTLINE ||
-				style == SCE_PL_STRING ||
-				style == SCE_PL_HERE_DELIM ||
-				style == SCE_PL_HERE_Q ||
-				style == SCE_PL_HERE_QQ ||
-				style == SCE_PL_HERE_QX ||
-				style == SCE_PL_POD ||
-				style == SCE_PL_POD_VERB)
-				result = TRUE;
-			break;
-		}
+			return (prev_style == SCE_PL_COMMENTLINE ||
+				style == SCE_PL_COMMENTLINE);
+
 		case SCLEX_PROPERTIES:
-		{
-			if (style == SCE_PROPS_COMMENT)
-				result = TRUE;
-			break;
-		}
+			return (style == SCE_PROPS_COMMENT);
+
 		case SCLEX_LATEX:
-		{
-			if (style == SCE_L_COMMENT)
-				result = TRUE;
-			break;
-		}
+			return (style == SCE_L_COMMENT);
+
 		case SCLEX_MAKEFILE:
-		{
-			if (style == SCE_MAKE_COMMENT)
-				result = TRUE;
-			break;
-		}
+			return (style == SCE_MAKE_COMMENT);
+
 		case SCLEX_RUBY:
-		{
-			if (prev_style == SCE_RB_COMMENTLINE ||
-				style == SCE_RB_CHARACTER ||
-				style == SCE_RB_STRING ||
-				style == SCE_RB_HERE_DELIM ||
-				style == SCE_RB_HERE_Q ||
-				style == SCE_RB_HERE_QQ ||
-				style == SCE_RB_HERE_QX ||
-				style == SCE_RB_POD)
-				result = TRUE;
-			break;
-		}
+			return (prev_style == SCE_RB_COMMENTLINE);
+
 		case SCLEX_BASH:
-		{
-			if (prev_style == SCE_SH_COMMENTLINE ||
-				style == SCE_SH_STRING)
-				result = TRUE;
-			break;
-		}
+			return (prev_style == SCE_SH_COMMENTLINE);
+
 		case SCLEX_SQL:
-		{
-			if (style == SCE_SQL_COMMENT ||
+			return (style == SCE_SQL_COMMENT ||
 				style == SCE_SQL_COMMENTLINE ||
-				style == SCE_SQL_COMMENTDOC ||
-				style == SCE_SQL_STRING)
-				result = TRUE;
-			break;
-		}
+				style == SCE_SQL_COMMENTDOC);
+
 		case SCLEX_TCL:
-		{
-			if (style == SCE_TCL_COMMENT ||
+			return (style == SCE_TCL_COMMENT ||
 				style == SCE_TCL_COMMENTLINE ||
 				style == SCE_TCL_COMMENT_BOX ||
-				style == SCE_TCL_BLOCK_COMMENT ||
-				style == SCE_TCL_IN_QUOTE)
-				result = TRUE;
-			break;
-		}
+				style == SCE_TCL_BLOCK_COMMENT);
+
 		case SCLEX_LUA:
-		{
-			if (style == SCE_LUA_COMMENT ||
+			return (style == SCE_LUA_COMMENT ||
 				style == SCE_LUA_COMMENTLINE ||
-				style == SCE_LUA_COMMENTDOC ||
-				style == SCE_LUA_LITERALSTRING ||
-				style == SCE_LUA_CHARACTER ||
-				style == SCE_LUA_STRING)
-				result = TRUE;
-			break;
-		}
+				style == SCE_LUA_COMMENTDOC);
+
 		case SCLEX_HASKELL:
-		{
-			if (prev_style == SCE_HA_COMMENTLINE ||
+			return (prev_style == SCE_HA_COMMENTLINE ||
 				style == SCE_HA_COMMENTBLOCK ||
 				style == SCE_HA_COMMENTBLOCK2 ||
-				style == SCE_HA_COMMENTBLOCK3 ||
-				style == SCE_HA_CHARACTER ||
-				style == SCE_HA_STRING)
-				result = TRUE;
-			break;
-		}
+				style == SCE_HA_COMMENTBLOCK3);
+
 		case SCLEX_FREEBASIC:
-		{
-			if (style == SCE_B_COMMENT ||
-				style == SCE_B_STRING)
-				result = TRUE;
-			break;
-		}
+			return (style == SCE_B_COMMENT);
+
 		case SCLEX_HTML:
-		{
-			if (prev_style == SCE_HPHP_SIMPLESTRING ||
-				prev_style == SCE_HPHP_HSTRING ||
-				prev_style == SCE_HPHP_COMMENTLINE ||
+			return (prev_style == SCE_HPHP_COMMENTLINE ||
 				prev_style == SCE_HPHP_COMMENT ||
-				prev_style == SCE_HPHP_HSTRING ||  /* HSTRING is a heredoc */
-				prev_style == SCE_HPHP_HSTRING_VARIABLE ||
-				prev_style == SCE_H_DOUBLESTRING ||
-				prev_style == SCE_H_SINGLESTRING ||
-				prev_style == SCE_H_CDATA ||
 				prev_style == SCE_H_COMMENT ||
-				prev_style == SCE_H_SGML_DOUBLESTRING ||
-				prev_style == SCE_H_SGML_SIMPLESTRING ||
-				prev_style == SCE_H_SGML_COMMENT)
-				result = TRUE;
+				prev_style == SCE_H_SGML_COMMENT);
+	}
+	return FALSE;
+}
+
+
+/* Checks whether the given style is normal code (not string, comment, preprocessor, etc).
+ * It doesn't handle LEX_HTML, this should be done by the caller.
+ * prev_style is used for some lexers where the style of two positions before is needed.
+ */
+static gboolean is_code_style(gint lexer, gint prev_style, gint style)
+{
+	switch (lexer)
+	{
+		case SCLEX_CPP:
+			if (style == SCE_C_PREPROCESSOR)
+				return FALSE;
 			break;
-		}
 	}
-
-	return result;
+	return !(is_comment_style(lexer, prev_style, style) &&
+		is_string_style(lexer, prev_style, style));
 }
 
 


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