SF.net SVN: geany: [1653] trunk

eht16 at users.sourceforge.net eht16 at xxxxx
Fri Jun 29 15:42:38 UTC 2007


Revision: 1653
          http://svn.sourceforge.net/geany/?rev=1653&view=rev
Author:   eht16
Date:     2007-06-29 08:42:37 -0700 (Fri, 29 Jun 2007)

Log Message:
-----------
Re-add previously removed code to fix broken calltips.
Merge some minor bugfixes to C/C++ parser from CTags SVN and remove compiler warning.	 

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/tagmanager/c.c
    trunk/tagmanager/get.c
    trunk/tagmanager/get.h

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2007-06-29 14:32:21 UTC (rev 1652)
+++ trunk/ChangeLog	2007-06-29 15:42:37 UTC (rev 1653)
@@ -2,6 +2,10 @@
 
  * src/dialogs.c:
    Set also previous colour when setting the colour for the dialog.
+ * tagmanager/c.c, tagmanager/get.c, tagmanager/get.h:
+   Re-add previously removed code to fix broken calltips.
+   Merge some minor bugfixes to C/C++ parser from CTags SVN and
+   remove compiler warning.
 
 
 2007-06-28  Nick Treleaven  <nick.treleaven at btinternet.com>

Modified: trunk/tagmanager/c.c
===================================================================
--- trunk/tagmanager/c.c	2007-06-29 14:32:21 UTC (rev 1652)
+++ trunk/tagmanager/c.c	2007-06-29 15:42:37 UTC (rev 1653)
@@ -29,9 +29,7 @@
 /*
 *   MACROS
 */
-#define MaxFields   6
 
-#define stringValue(a)		#a
 #define activeToken(st)		((st)->token [(int) (st)->tokenIndex])
 #define parentDecl(st)		((st)->parent == NULL ? \
 				DECL_NONE : (st)->parent->declaration)
@@ -578,14 +576,14 @@
     }
 }
 
-static const char *accessString (const accessType access)
+static const char *accessString (const accessType laccess)
 {
     static const char *const names [] ={
 	"?", "private", "protected", "public", "default"
     };
     Assert (sizeof (names) / sizeof (names [0]) == ACCESS_COUNT);
-    Assert ((int) access < ACCESS_COUNT);
-    return names [(int) access];
+    Assert ((int) laccess < ACCESS_COUNT);
+    return names [(int) laccess];
 }
 
 static const char *implementationString (const impType imp)
@@ -715,7 +713,6 @@
          return TRUE;
       default: return FALSE;
     }
-    return FALSE;
 }
 
 static boolean isVariableKeyword (const tokenInfo *const token)
@@ -790,7 +787,6 @@
     {
 	case DECL_ENUM:
 	case DECL_NAMESPACE:
-	case DECL_UNION:
 	    accessDefault = ACCESS_UNDEFINED;
 	    break;
 
@@ -803,6 +799,7 @@
 
 	case DECL_INTERFACE:
 	case DECL_STRUCT:
+	case DECL_UNION:
 	    accessDefault = ACCESS_PUBLIC;
 	    break;
 
@@ -1054,7 +1051,7 @@
 			}
 			if (st->implementation != IMP_DEFAULT &&
 				(isLanguage (Lang_cpp) || isLanguage (Lang_csharp) ||
-				 isLanguage (Lang_java)))
+				 isLanguage (Lang_java) || isLanguage (Lang_d) || isLanguage (Lang_ferite)))
 			{
 				tag->extensionFields.implementation =
 						implementationString (st->implementation);
@@ -1063,7 +1060,11 @@
 			{
 				tag->extensionFields.access = accessField (st);
 			}
-	    break;
+            if ((TRUE == st->gotArgs) && (TRUE == Option.extensionFields.argList) &&
+			 ((TAG_FUNCTION == type) || (TAG_METHOD == type) || (TAG_PROTOTYPE == type))) {
+				tag->extensionFields.arglist = getArglistFromPos(tag->filePosition, tag->name);
+			}
+		break;
     }
 
 	if ((TAG_FIELD == tag->type) || (TAG_MEMBER == tag->type) ||
@@ -1498,6 +1499,14 @@
 
     initToken (token);
 
+   /* Bug #1585745 (CTags): strangely, C++ destructors allow whitespace between
+    * the ~ and the class name. */
+	if (isLanguage (Lang_cpp) && firstChar == '~')
+	{
+		vStringPut (name, c);
+		c = skipToNonWhite ();
+	}
+
     do
     {
 	vStringPut (name, c);
@@ -1650,7 +1659,7 @@
     vStringCopy (dest->name, src->name);
 }
 
-static void setAccess (statementInfo *const st, const accessType access)
+static void setAccess (statementInfo *const st, const accessType laccess)
 {
     if (isMember (st))
     {
@@ -1663,9 +1672,9 @@
 	    else
 		cppUngetc (c);
 
-	    st->member.accessDefault = access;
+	    st->member.accessDefault = laccess;
 	}
-	st->member.access = access;
+	st->member.access = laccess;
     }
 }
 
@@ -2346,7 +2355,7 @@
 	setToken (st, TOKEN_SEMICOLON);
     else if (c == ',')
 	setToken (st, TOKEN_COMMA);
-    else if ('}'  &&  inEnumBody)
+    else if (c == '}'  &&  inEnumBody)
     {
 	cppUngetc (c);
 	setToken (st, TOKEN_COMMA);
@@ -2629,7 +2638,7 @@
 	    else if (isType (prev, TOKEN_NAME))
 	    {
 		if (isContextualKeyword (prev2))
-		    st->scope = SCOPE_EXTERN;
+		    makeTag (prev, st, TRUE, TAG_EXTERN_VAR);
 		else
 		{
 		    if (!isLanguage (Lang_java))

Modified: trunk/tagmanager/get.c
===================================================================
--- trunk/tagmanager/get.c	2007-06-29 14:32:21 UTC (rev 1652)
+++ trunk/tagmanager/get.c	2007-06-29 15:42:37 UTC (rev 1653)
@@ -662,4 +662,141 @@
 	return c;
 }
 
+extern char *getArglistFromPos(fpos_t startPosition, const char *tokenName)
+{
+	fpos_t originalPosition;
+	char *result = NULL;
+	char *arglist = NULL;
+	long pos1, pos2 = ftell(File.fp);
+
+	fgetpos(File.fp, &originalPosition);
+	fsetpos(File.fp, &startPosition);
+	pos1 = ftell(File.fp);
+	if (pos2 > pos1)
+	{
+		result = (char *) g_malloc(sizeof(char ) * (pos2 - pos1 + 2));
+		if (result != NULL)
+		{
+			fread(result, sizeof(char), pos2 - pos1 + 1, File.fp);
+			result[pos2-pos1+1] = '\0';
+			arglist = getArglistFromStr(result, tokenName);
+			free(result);
+		}
+	}
+	fsetpos(File.fp, &originalPosition);
+	return arglist;
+}
+
+typedef enum
+{
+	st_none_t,
+	st_escape_t,
+	st_c_comment_t,
+	st_cpp_comment_t,
+	st_double_quote_t,
+	st_single_quote_t
+} ParseState;
+
+static void stripCodeBuffer(char *buf)
+{
+	int i = 0, pos = 0;
+	ParseState state = st_none_t, prev_state = st_none_t;
+
+	while (buf[i] != '\0')
+	{
+		switch(buf[i])
+		{
+			case '/':
+				if (st_none_t == state)
+				{
+					/* Check if this is the start of a comment */
+					if (buf[i+1] == '*') /* C comment */
+						state = st_c_comment_t;
+					else if (buf[i+1] == '/') /* C++ comment */
+						state = st_cpp_comment_t;
+					else /* Normal character */
+						buf[pos++] = '/';
+				}
+				else if (st_c_comment_t == state)
+				{
+					/* Check if this is the end of a C comment */
+					if (buf[i-1] == '*')
+					{
+						if ((pos > 0) && (buf[pos-1] != ' '))
+							buf[pos++] = ' ';
+						state = st_none_t;
+					}
+				}
+				break;
+			case '"':
+				if (st_none_t == state)
+					state = st_double_quote_t;
+				else if (st_double_quote_t == state)
+					state = st_none_t;
+				break;
+			case '\'':
+				if (st_none_t == state)
+					state = st_single_quote_t;
+				else if (st_single_quote_t == state)
+					state = st_none_t;
+				break;
+			default:
+				if ((buf[i] == '\\') && (st_escape_t != state))
+				{
+					prev_state = state;
+					state = st_escape_t;
+				}
+				else if (st_escape_t == state)
+				{
+					state = prev_state;
+					prev_state = st_none_t;
+				}
+				else if ((buf[i] == '\n') && (st_cpp_comment_t == state))
+				{
+					if ((pos > 0) && (buf[pos-1] != ' '))
+						buf[pos++] = ' ';
+					state = st_none_t;
+				}
+				else if (st_none_t == state)
+				{
+					if (isspace(buf[i]))
+					{
+						if ((pos > 0) && (buf[pos-1] != ' '))
+							buf[pos++] = ' ';
+					}
+					else
+						buf[pos++] = buf[i];
+				}
+				break;
+		}
+		++i;
+	}
+	buf[pos] = '\0';
+	return;
+}
+
+extern char *getArglistFromStr(char *buf, const char *name)
+{
+	char *start, *end;
+	int level;
+	if ((NULL == buf) || (NULL == name) || ('\0' == name[0]))
+		return NULL;
+	stripCodeBuffer(buf);
+	if (NULL == (start = strstr(buf, name)))
+		return NULL;
+	if (NULL == (start = strchr(start, '(')))
+		return NULL;
+	for (level = 1, end = start + 1; level > 0; ++end)
+	{
+		if ('\0' == *end)
+			break;
+		else if ('(' == *end)
+			++ level;
+		else if (')' == *end)
+			-- level;
+	}
+	*end = '\0';
+	return strdup(start);
+}
+
 /* vi:set tabstop=4 shiftwidth=4: */

Modified: trunk/tagmanager/get.h
===================================================================
--- trunk/tagmanager/get.h	2007-06-29 14:32:21 UTC (rev 1652)
+++ trunk/tagmanager/get.h	2007-06-29 15:42:37 UTC (rev 1653)
@@ -44,6 +44,8 @@
 extern void cppUngetc (const int c);
 extern int cppGetc (void);
 extern int skipOverCComment (void);
+extern char *getArglistFromPos(fpos_t startPosition, const char *tokenName);
+extern char *getArglistFromStr(char *buf, const char *name);
 
 #endif  /* _GET_H */
 


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