SF.net SVN: geany:[3798] trunk

eht16 at users.sourceforge.net eht16 at xxxxx
Sun May 17 17:16:39 UTC 2009


Revision: 3798
          http://geany.svn.sourceforge.net/geany/?rev=3798&view=rev
Author:   eht16
Date:     2009-05-17 17:16:39 +0000 (Sun, 17 May 2009)

Log Message:
-----------
Backport change from CTags SVN to keep the parser more in sync:
Add support for Cython constructs to the Python parser.

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/tagmanager/python.c

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2009-05-17 17:16:24 UTC (rev 3797)
+++ trunk/ChangeLog	2009-05-17 17:16:39 UTC (rev 3798)
@@ -3,6 +3,8 @@
  * tagmanager/python.c:
    Fix missing symbols for variables when an equal sign is used
    in a comment on the same line as the variable declaration.
+   Backport change from CTags SVN to keep the parser more in sync:
+   Add support for Cython constructs to the Python parser.
  * src/search.c:
    Remember the additional Find in Files search flags at startup.
  * src/dialogs.c:

Modified: trunk/tagmanager/python.c
===================================================================
--- trunk/tagmanager/python.c	2009-05-17 17:16:24 UTC (rev 3797)
+++ trunk/tagmanager/python.c	2009-05-17 17:16:39 UTC (rev 3798)
@@ -188,7 +188,8 @@
 	while (*cp)
 	{
 		cp = skipEverything (cp);
-		if (!strncmp(cp, "def", 3) || !strncmp(cp, "class", 5))
+		if (!strncmp(cp, "def", 3) || !strncmp(cp, "class", 5) ||
+			!strncmp(cp, "cdef", 4) || !strncmp(cp, "cpdef", 5))
 		{
 			return cp;
 		}
@@ -426,6 +427,37 @@
 	return start;
 }
 
+/* Skip type declaration that optionally follows a cdef/cpdef */
+static const char *skipTypeDecl (const char *cp, boolean *is_class) 
+{ 
+	const char *lastStart = cp, *ptr = cp;
+	int loopCount = 0;
+	ptr = skipSpace(cp);
+	if (!strncmp("extern", ptr, 6)) { 
+		ptr += 6; 
+		ptr = skipSpace(ptr); 
+		if (!strncmp("from", ptr, 4)) { return NULL; }
+	}
+	if (!strncmp("class", ptr, 5)) {
+		ptr += 5 ; 
+		*is_class = TRUE;
+		ptr = skipSpace(ptr);
+		return ptr;
+	}
+	/* limit so that we don't pick off "int item=obj()" */
+	while (*ptr && loopCount++ < 2) {
+		while (*ptr && *ptr != '=' && *ptr != '(' && !isspace(*ptr)) ptr++;
+		if (!*ptr || *ptr == '=') return NULL;
+		if (*ptr == '(') {
+		    return lastStart; /* if we stopped on a '(' we are done */
+		}                             
+		ptr = skipSpace(ptr);
+		lastStart = ptr;
+		while (*lastStart == '*') lastStart++;  /* cdef int *identifier */
+	}
+	return NULL;
+}
+
 static void findPythonTags (void)
 {
 	vString *const continuation = vStringNew ();
@@ -440,7 +472,7 @@
 
 	while ((line = (const char *) fileReadLine ()) != NULL)
 	{
-		const char *cp = line;
+		const char *cp = line, *candidate;
 		char const *longstring;
 		char const *keyword, *variable;
 		int indent;
@@ -506,7 +538,28 @@
 				found = TRUE;
 				is_class = TRUE;
 			}
+			else if (!strncmp (keyword, "cdef ", 5))
+		    { 
+		        cp = skipSpace(keyword + 4);
+		        candidate = skipTypeDecl (cp, &is_class);
+		        if (candidate)
+		        {
+		    		found = TRUE;
+		    		cp = candidate;
+		        }
 
+		    }
+    		else if (!strncmp (keyword, "cpdef ", 6))
+		    { 
+		        cp = skipSpace(keyword + 5);
+		        candidate = skipTypeDecl (cp, &is_class);
+		        if (candidate)
+		        {
+		    		found = TRUE;
+		    		cp = candidate;
+		        }
+		    }
+
 			if (found)
 			{
 				boolean is_parent_class;
@@ -554,7 +607,7 @@
 
 extern parserDefinition *PythonParser (void)
 {
-	static const char *const extensions[] = { "py", "pyx", "pxd", "scons", "python", NULL };
+    static const char *const extensions[] = { "py", "pyx", "pxd", "pxi" ,"scons", NULL };
 	parserDefinition *def = parserNew ("Python");
 	def->kinds = PythonKinds;
 	def->kindCount = KIND_COUNT (PythonKinds);


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