[geany/geany] 206379: Parse return value of go functions

Jiří Techet git-noreply at xxxxx
Thu May 28 14:27:23 UTC 2015


Branch:      refs/heads/master
Author:      Jiří Techet <techet at gmail.com>
Committer:   Jiří Techet <techet at gmail.com>
Date:        Thu, 28 May 2015 14:27:23 UTC
Commit:      206379a272ebce073910a49dbcb15b21909b3d3a
             https://github.com/geany/geany/commit/206379a272ebce073910a49dbcb15b21909b3d3a

Log Message:
-----------
Parse return value of go functions

Unfortunately varType is Geany-only so this patch cannot be ported to ctags.

The removal of the extra { read is not the most elegant thing but making
skipType() aware of the argList collection complicates things too much.


Modified Paths:
--------------
    tagmanager/ctags/go.c
    tests/ctags/Makefile.am
    tests/ctags/return-types.go
    tests/ctags/return-types.go.tags
    tests/ctags/test.go.tags

Modified: tagmanager/ctags/go.c
43 lines changed, 28 insertions(+), 15 deletions(-)
===================================================================
@@ -528,7 +528,7 @@ static boolean skipType (tokenInfo *const token)
 
 static void makeTag (tokenInfo *const token, const goKind kind,
 	tokenInfo *const parent_token, const goKind parent_kind,
-	const char *argList)
+	const char *argList, const char *varType)
 {
 	const char *const name = vStringValue (token->string);
 
@@ -544,6 +544,8 @@ static void makeTag (tokenInfo *const token, const goKind kind,
 	e.kind = GoKinds [kind].letter;
 	if (argList)
 		e.extensionFields.arglist = argList;
+	if (varType)
+		e.extensionFields.varType = varType;
 
 	if (parent_kind != GOTAG_UNDEFINED && parent_token != NULL)
 	{
@@ -569,7 +571,7 @@ static void parsePackage (tokenInfo *const token)
 	readToken (token);
 	if (isType (token, TOKEN_IDENTIFIER))
 	{
-		makeTag (token, GOTAG_PACKAGE, NULL, GOTAG_UNDEFINED, NULL);
+		makeTag (token, GOTAG_PACKAGE, NULL, GOTAG_UNDEFINED, NULL, NULL);
 		if (!scope && Option.include.qualifiedTags)
 		{
 			scope = vStringNew ();
@@ -594,6 +596,7 @@ static void parseFunctionOrMethod (tokenInfo *const token)
 
 	if (isType (token, TOKEN_IDENTIFIER))
 	{
+		vString *argList;
 		tokenInfo *functionToken = copyToken (token);
 
 		// Start recording signature
@@ -605,18 +608,28 @@ static void parseFunctionOrMethod (tokenInfo *const token)
 
 		vStringStripLeading (signature);
 		vStringStripTrailing (signature);
-		makeTag (functionToken, GOTAG_FUNCTION, NULL, GOTAG_UNDEFINED, signature->buffer);
-		deleteToken (functionToken);
-		vStringDelete(signature);
-
-		// Stop recording signature
-		signature = NULL;
+		argList = signature;
+		signature = vStringNew ();
 
 		readToken (token);
 
 		// Skip over result.
 		skipType (token);
 
+		// Remove the extra { we have just read
+		vStringStripTrailing (signature);
+		vStringChop (signature);
+
+		vStringStripLeading (signature);
+		vStringStripTrailing (signature);
+		makeTag (functionToken, GOTAG_FUNCTION, NULL, GOTAG_UNDEFINED, argList->buffer, signature->buffer);
+		deleteToken (functionToken);
+		vStringDelete(signature);
+		vStringDelete(argList);
+
+		// Stop recording signature
+		signature = NULL;
+
 		// Skip over function body.
 		if (isType (token, TOKEN_OPEN_CURLY))
 			skipToMatched (token);
@@ -655,11 +668,11 @@ static void parseStructMembers (tokenInfo *const token, tokenInfo *const parent_
 					if (memberCandidate)
 					{
 						// if we are here, there was a comma and memberCandidate isn't an anonymous field
-						makeTag (memberCandidate, GOTAG_MEMBER, parent_token, GOTAG_STRUCT, NULL);
+						makeTag (memberCandidate, GOTAG_MEMBER, parent_token, GOTAG_STRUCT, NULL, NULL);
 						deleteToken (memberCandidate);
 						memberCandidate = NULL;
 					}
-					makeTag (token, GOTAG_MEMBER, parent_token, GOTAG_STRUCT, NULL);
+					makeTag (token, GOTAG_MEMBER, parent_token, GOTAG_STRUCT, NULL, NULL);
 				}
 				readToken (token);
 			}
@@ -672,7 +685,7 @@ static void parseStructMembers (tokenInfo *const token, tokenInfo *const parent_
 		// type into memberCandidate and skipType() should return FALSE so no tag should
 		// be generated in this case.
 		if (skipType (token) && memberCandidate)
-			makeTag (memberCandidate, GOTAG_MEMBER, parent_token, GOTAG_STRUCT, NULL);
+			makeTag (memberCandidate, GOTAG_MEMBER, parent_token, GOTAG_STRUCT, NULL, NULL);
 
 		if (memberCandidate)
 			deleteToken (memberCandidate);
@@ -725,15 +738,15 @@ static void parseConstTypeVar (tokenInfo *const token, goKind kind)
 					typeToken = copyToken (token);
 					readToken (token);
 					if (isKeyword (token, KEYWORD_struct))
-						makeTag (typeToken, GOTAG_STRUCT, NULL, GOTAG_UNDEFINED, NULL);
+						makeTag (typeToken, GOTAG_STRUCT, NULL, GOTAG_UNDEFINED, NULL, NULL);
 					else if (isKeyword (token, KEYWORD_interface))
-						makeTag (typeToken, GOTAG_INTERFACE, NULL, GOTAG_UNDEFINED, NULL);
+						makeTag (typeToken, GOTAG_INTERFACE, NULL, GOTAG_UNDEFINED, NULL, NULL);
 					else
-						makeTag (typeToken, kind, NULL, GOTAG_UNDEFINED, NULL);
+						makeTag (typeToken, kind, NULL, GOTAG_UNDEFINED, NULL, NULL);
 					break;
 				}
 				else
-					makeTag (token, kind, NULL, GOTAG_UNDEFINED, NULL);
+					makeTag (token, kind, NULL, GOTAG_UNDEFINED, NULL, NULL);
 				readToken (token);
 			}
 			if (!isType (token, TOKEN_COMMA))


Modified: tests/ctags/Makefile.am
1 lines changed, 1 insertions(+), 0 deletions(-)
===================================================================
@@ -243,6 +243,7 @@ test_sources = \
 	refcurs.sql						\
 	regexp.js						\
 	return-hint.zep					\
+	return-types.go					\
 	rules.t2t						\
 	sample.t2t						\
 	secondary_fcn_name.js			\


Modified: tests/ctags/return-types.go
16 lines changed, 16 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1,16 @@
+package main
+
+func foo() *struct {a int; b func()} {
+	return nil
+}
+
+func bar() (a int, b func(a int), c interface{}, d string) {
+	return 0, nil, nil, ""
+}
+
+func baz() *[20*3+1]map[chan<- /* map[int]int */<-chan int]map[interface{}]*string {
+	return nil
+}
+
+func main() {
+}
\ No newline at end of file


Modified: tests/ctags/return-types.go.tags
6 lines changed, 6 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1,6 @@
+# format=tagmanager
+bar�16�()�0�(a int, b func(a int), c interface{}, d string)
+baz�16�()�0�*[20*3+1]map[chan<- <-chan int]map[interface{}]*string
+foo�16�()�0�*struct {a int; b func()}
+main�16�()�0�
+main�256�0


Modified: tests/ctags/test.go.tags
12 lines changed, 6 insertions(+), 6 deletions(-)
===================================================================
@@ -28,12 +28,12 @@ c
 d�16384�0
 e�16384�0
 f�16384�0
-f1�16�()�0
-f2�16�()�0
-f3�16�()�0
-f4�16�(a func () func ())�0
-f5�16�()�0
+f1�16�()�0�
+f2�16�()�0�
+f3�16�()�0�(a, b int)
+f4�16�(a func () func ())�0�(func (), int)
+f5�16�()�0�
 g�16384�0
 h�16384�0
-main�16�()�0
+main�16�()�0�
 main�256�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