[geany/geany] 63a60f: Merge pull request #3043 from eht16/pascal_sync

Jiří Techet git-noreply at xxxxx
Tue Dec 28 20:04:31 UTC 2021


Branch:      refs/heads/master
Author:      Jiří Techet <techet at gmail.com>
Committer:   GitHub <noreply at github.com>
Date:        Tue, 28 Dec 2021 20:04:31 UTC
Commit:      63a60f6ad799ebaac511e0ab3d251a44ff6c0061
             https://github.com/geany/geany/commit/63a60f6ad799ebaac511e0ab3d251a44ff6c0061

Log Message:
-----------
Merge pull request #3043 from eht16/pascal_sync

Use Pascal parser from uctags


Modified Paths:
--------------
    ctags/Makefile.am
    ctags/parsers/pascal.c
    tests/ctags/bug612019.pas.tags

Modified: ctags/Makefile.am
2 lines changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -75,7 +75,7 @@ parsers = \
 	parsers/geany_matlab.c \
 	parsers/nsis.c \
 	parsers/objc.c \
-	parsers/geany_pascal.c \
+	parsers/pascal.c \
 	parsers/perl.c \
 	parsers/perl.h \
 	parsers/php.c \


Modified: ctags/parsers/pascal.c
100 lines changed, 42 insertions(+), 58 deletions(-)
===================================================================
@@ -37,22 +37,26 @@ static kindDefinition PascalKinds [] = {
 *   FUNCTION DEFINITIONS
 */
 
-static void createPascalTag (tagEntryInfo* const tag,
-							 const vString* const name, const int kind,
-							 const char *arglist, const char *vartype)
+static void createPascalTag (
+		tagEntryInfo* const tag, const vString* const name, const int kind,
+		const vString *arglist, const vString *vartype)
 {
 	if (PascalKinds [kind].enabled  &&  name != NULL  &&  vStringLength (name) > 0)
 	{
 		initTagEntry (tag, vStringValue (name), kind);
-
-		tag->extensionFields.signature = arglist;
-		tag->extensionFields.typeRef[1] = vartype;
+		if (arglist && !vStringIsEmpty (arglist))
+		{
+			tag->extensionFields.signature = vStringValue (arglist);
+		}
+		if (vartype && !vStringIsEmpty (vartype))
+		{
+			tag->extensionFields.typeRef[0] = "typename";
+			tag->extensionFields.typeRef[1] = vStringValue (vartype);
+		}
 	}
 	else
-	{
 		/* TODO: Passing NULL as name makes an assertion behind initTagEntry failure */
-		/* initTagEntry (tag, NULL, NULL); */
-	}
+		initTagEntry (tag, NULL, KIND_GHOST_INDEX);
 }
 
 static void makePascalTag (const tagEntryInfo* const tag)
@@ -82,17 +86,16 @@ static bool tail (const char *cp)
 	return result;
 }
 
-static void parseArglist(const char *buf, char **arglist, char **vartype)
+static void parseArglist (const char *buf, vString *arglist, vString *vartype)
 {
-	char *c, *start, *end;
+	const char *start, *end;
 	int level;
 
-	if (NULL == buf || NULL == arglist)
+	if (NULL == buf || arglist == NULL)
 		return;
 
-	c = strdup(buf);
 	/* parse argument list which can be missing like in "function ginit:integer;" */
-	if (NULL != (start = strchr(c, '(')))
+	if (NULL != (start = strchr (buf, '(')))
 	{
 		for (level = 1, end = start + 1; level > 0; ++end)
 		{
@@ -106,45 +109,41 @@ static void parseArglist(const char *buf, char **arglist, char **vartype)
 	}
 	else /* if no argument list was found, continue looking for a return value */
 	{
-		start = "()";
-		end = c;
+		start = NULL;
+		end = buf;
 	}
 
 	/* parse return type if requested by passing a non-NULL vartype argument */
 	if (NULL != vartype)
 	{
 		char *var, *var_start;
 
-		*vartype = NULL;
-
-		if (NULL != (var = strchr(end, ':')))
+		if (NULL != (var = strchr (end, ':')))
 		{
 			var++; /* skip ':' */
-			while (isspace((int) *var))
+			while (isspace ((int) *var))
 				++var;
 
-			if (starttoken(*var))
+			if (starttoken (*var))
 			{
 				var_start = var;
 				var++;
-				while (intoken(*var))
+				while (intoken (*var))
 					var++;
-				if (endtoken(*var))
+				if (endtoken (*var))
 				{
-					*var = '\0';
-					*vartype = strdup(var_start);
+					vStringNCatS (vartype, var_start, var - var_start);
 				}
 			}
 		}
 	}
 
-	*end = '\0';
-	*arglist = strdup(start);
-
-	eFree(c);
+	if (NULL == start) /* no argument list */
+		vStringCatS (arglist, "()");
+	else
+		vStringNCatS (arglist, start, end - start);
 }
 
-
 /* Algorithm adapted from from GNU etags.
  * Locates tags for procedures & functions.  Doesn't do any type- or
  * var-definitions.  It does look for the keyword "extern" or "forward"
@@ -154,13 +153,13 @@ static void parseArglist(const char *buf, char **arglist, char **vartype)
 static void findPascalTags (void)
 {
 	vString *name = vStringNew ();
+	vString *arglist = vStringNew ();
+	vString *vartype = vStringNew ();
 	tagEntryInfo tag;
-	char *arglist = NULL;
-	char *vartype = NULL;
 	pascalKind kind = K_FUNCTION;
 		/* each of these flags is true iff: */
 	bool incomment = false;  /* point is inside a comment */
-	int comment_char = '\0'; /* type of current comment */
+	int comment_char = '\0';    /* type of current comment */
 	bool inquote = false;    /* point is inside '..' string */
 	bool get_tagname = false;/* point is after PROCEDURE/FUNCTION
 		keyword, so next item = potential tag */
@@ -257,14 +256,6 @@ static void findPascalTags (void)
 					verify_tag = false;
 				}
 			}
-			else if (tolower ((int) *dbp) == 't')
-			{
-				if (tail ("type"))      /*  check for forward reference */
-				{
-					found_tag = false;
-					verify_tag = false;
-				}
-			}
 			if (found_tag && verify_tag)  /* not external proc, so make tag */
 			{
 				found_tag = false;
@@ -283,14 +274,16 @@ static void findPascalTags (void)
 			/* grab block name */
 			while (isspace ((int) *dbp))
 				++dbp;
+			if (!starttoken(*dbp))
+				continue;
 			for (cp = dbp  ;  *cp != '\0' && !endtoken (*cp)  ;  cp++)
 				continue;
 			vStringNCopyS (name, (const char*) dbp,  cp - dbp);
-			if (arglist != NULL)
-				eFree(arglist);
-			if (kind == K_FUNCTION && vartype != NULL)
-				eFree(vartype);
-			parseArglist((const char*) cp, &arglist, (kind == K_FUNCTION) ? &vartype : NULL);
+
+			vStringClear (arglist);
+			vStringClear (vartype);
+			parseArglist ((const char*) cp, arglist, (kind == K_FUNCTION) ? vartype : NULL);
+
 			createPascalTag (&tag, name, kind, arglist, (kind == K_FUNCTION) ? vartype : NULL);
 			dbp = cp;  /* set dbp to e-o-token */
 			get_tagname = false;
@@ -329,20 +322,11 @@ static void findPascalTags (void)
 						kind = K_FUNCTION;
 					}
 					break;
-				case 't':
-					if (tail ("ype"))
-					{
-						get_tagname = true;
-						kind = K_FUNCTION;
-					}
-					break;
 			}
 		}  /* while not eof */
 	}
-	if (arglist != NULL)
-		eFree(arglist);
-	if (vartype != NULL)
-		eFree(vartype);
+	vStringDelete (arglist);
+	vStringDelete (vartype);
 	vStringDelete (name);
 }
 
@@ -351,7 +335,7 @@ extern parserDefinition* PascalParser (void)
 	static const char *const extensions [] = { "p", "pas", NULL };
 	parserDefinition* def = parserNew ("Pascal");
 	def->extensions = extensions;
-	def->kindTable  = PascalKinds;
+	def->kindTable      = PascalKinds;
 	def->kindCount  = ARRAY_SIZE (PascalKinds);
 	def->parser     = findPascalTags;
 	return def;


Modified: tests/ctags/bug612019.pas.tags
2 lines changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -1,4 +1,4 @@
 # format=tagmanager
-TTest�16�()�0
+Test1�16�()�0
 Test2�16�()�0
 Test3�16�()�0



--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).


More information about the Commits mailing list