SF.net SVN: geany:[3779] branches/unstable

ntrel at users.sourceforge.net ntrel at xxxxx
Mon May 11 15:36:46 UTC 2009


Revision: 3779
          http://geany.svn.sourceforge.net/geany/?rev=3779&view=rev
Author:   ntrel
Date:     2009-05-11 15:36:46 +0000 (Mon, 11 May 2009)

Log Message:
-----------
Add reStructuredText scope information for tags (for symbol list
grouping).
Add nestingLevelsPush(), nestingLevelsPop(),
nestingLevelsGetCurrent().

Modified Paths:
--------------
    branches/unstable/ChangeLog
    branches/unstable/tagmanager/nestlevel.c
    branches/unstable/tagmanager/nestlevel.h
    branches/unstable/tagmanager/rest.c

Modified: branches/unstable/ChangeLog
===================================================================
--- branches/unstable/ChangeLog	2009-05-11 14:15:00 UTC (rev 3778)
+++ branches/unstable/ChangeLog	2009-05-11 15:36:46 UTC (rev 3779)
@@ -4,6 +4,11 @@
    tagmanager/nestlevel.h, tagmanager/python.c, tagmanager/Makefile.am,
    wscript:
    Move NestingLevel code into a separate file.
+ * tagmanager/nestlevel.c, tagmanager/nestlevel.h, tagmanager/rest.c:
+   Add reStructuredText scope information for tags (for symbol list
+   grouping).
+   Add nestingLevelsPush(), nestingLevelsPop(),
+   nestingLevelsGetCurrent().
 
 
 2009-05-01  Nick Treleaven  <nick(dot)treleaven(at)btinternet(dot)com>

Modified: branches/unstable/tagmanager/nestlevel.c
===================================================================
--- branches/unstable/tagmanager/nestlevel.c	2009-05-11 14:15:00 UTC (rev 3778)
+++ branches/unstable/tagmanager/nestlevel.c	2009-05-11 15:36:46 UTC (rev 3779)
@@ -37,8 +37,9 @@
 	eFree(nls);
 }
 
+/* currently only for indentation langs e.g. python */
 extern void addNestingLevel(NestingLevels *nls, int indentation,
-	vString *name, boolean is_class)
+	const vString *name, boolean is_class)
 {
 	int i;
 	NestingLevel *nl = NULL;
@@ -66,4 +67,42 @@
 	nl->is_class = is_class;
 }
 
+extern void nestingLevelsPush(NestingLevels *nls,
+	const vString *name, int type)
+{
+	NestingLevel *nl = NULL;
+
+	if (nls->n >= nls->allocated)
+	{
+		nls->allocated++;
+		nls->levels = xRealloc(nls->levels,
+			nls->allocated, NestingLevel);
+		nls->levels[nls->n].name = vStringNew();
+	}
+	nl = &nls->levels[nls->n];
+	nls->n++;
+
+	vStringCopy(nl->name, name);
+	nl->type = type;
+}
+
+extern void nestingLevelsPop(NestingLevels *nls)
+{
+	const NestingLevel *nl = nestingLevelsGetCurrent(nls);
+
+	Assert (nl != NULL);
+	vStringClear(nl->name);
+	nls->n--;
+}
+
+extern NestingLevel *nestingLevelsGetCurrent(NestingLevels *nls)
+{
+	Assert (nls != NULL);
+
+	if (nls->n < 1)
+		return NULL;
+
+	return &nls->levels[nls->n - 1];
+}
+
 /* vi:set tabstop=4 shiftwidth=4: */

Modified: branches/unstable/tagmanager/nestlevel.h
===================================================================
--- branches/unstable/tagmanager/nestlevel.h	2009-05-11 14:15:00 UTC (rev 3778)
+++ branches/unstable/tagmanager/nestlevel.h	2009-05-11 15:36:46 UTC (rev 3779)
@@ -29,23 +29,28 @@
 {
 	int indentation;
 	vString *name;
-	boolean is_class;
+	int type;
+	boolean is_class;		/* should be replaced by type field */
 };
 
 struct NestingLevels
 {
 	NestingLevel *levels;
-	int n;
+	int n;					/* number of levels in use */
 	int allocated;
 };
 
 /*
 *   FUNCTION PROTOTYPES
 */
-NestingLevels *newNestingLevels(void);
-void freeNestingLevels(NestingLevels *nls);
-void addNestingLevel(NestingLevels *nls, int indentation,
-	vString *name, boolean is_class);
+extern NestingLevels *newNestingLevels(void);
+extern void freeNestingLevels(NestingLevels *nls);
+extern void addNestingLevel(NestingLevels *nls, int indentation,
+	const vString *name, boolean is_class);
+extern void nestingLevelsPush(NestingLevels *nls,
+	const vString *name, int type);
+extern void nestingLevelsPop(NestingLevels *nls);
+extern NestingLevel *nestingLevelsGetCurrent(NestingLevels *nls);
 
 #endif  /* _NESTLEVEL_H */
 

Modified: branches/unstable/tagmanager/rest.c
===================================================================
--- branches/unstable/tagmanager/rest.c	2009-05-11 14:15:00 UTC (rev 3778)
+++ branches/unstable/tagmanager/rest.c	2009-05-11 15:36:46 UTC (rev 3779)
@@ -19,6 +19,7 @@
 #include "parse.h"
 #include "read.h"
 #include "vstring.h"
+#include "nestlevel.h"
 
 /*
 *   DATA DEFINITIONS
@@ -40,24 +41,48 @@
 
 static char kindchars[SECTION_COUNT];
 
+static NestingLevels *nestingLevels = NULL;
+
 /*
 *   FUNCTION DEFINITIONS
 */
 
-static void makeRestTag (const vString* const name,
-			   kindOption* const kinds, const int kind)
+static NestingLevel *getNestingLevel(const int kind)
 {
-	if (name != NULL && vStringLength (name) > 0)
+	NestingLevel *nl;
+
+	while (1)
 	{
+		nl = nestingLevelsGetCurrent(nestingLevels);
+		if (nl && nl->type >= kind)
+			nestingLevelsPop(nestingLevels);
+		else
+			break;
+	}
+	return nl;
+}
+
+static void makeRestTag (const vString* const name, const int kind)
+{
+	const NestingLevel *const nl = getNestingLevel(kind);
+
+	if (vStringLength (name) > 0)
+	{
 		tagEntryInfo e;
 		initTagEntry (&e, vStringValue (name));
 
 		e.lineNumber--;	/* we want the line before the '---' underline chars */
-		e.kindName = kinds [kind].name;
-		e.kind = kinds [kind].letter;
+		e.kindName = RestKinds [kind].name;
+		e.kind = RestKinds [kind].letter;
 
+		if (nl && nl->type < kind)
+		{
+			e.extensionFields.scope [0] = RestKinds [nl->type].name;
+			e.extensionFields.scope [1] = vStringValue (nl->name);
+		}
 		makeTagEntry (&e);
 	}
+	nestingLevelsPush(nestingLevels, name, kind);
 }
 
 
@@ -105,6 +130,7 @@
 	const unsigned char *line;
 
 	memset(kindchars, 0, sizeof kindchars);
+	nestingLevels = newNestingLevels();
 
 	while ((line = fileReadLine ()) != NULL)
 	{
@@ -120,7 +146,7 @@
 
 			if (kind >= 0)
 			{
-				makeRestTag(name, RestKinds, kind);
+				makeRestTag(name, kind);
 				continue;
 			}
 		}
@@ -130,6 +156,7 @@
 		vStringTerminate(name);
 	}
 	vStringDelete (name);
+	freeNestingLevels(nestingLevels);
 }
 
 extern parserDefinition* RestParser (void)


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