[geany/geany] ed1dc5: Fortran: allow keywords as names

Colomban Wendling git-noreply at xxxxx
Sun Feb 23 19:11:00 UTC 2014


Branch:      refs/heads/master
Author:      Colomban Wendling <ban at herbesfolles.org>
Committer:   Colomban Wendling <ban at herbesfolles.org>
Date:        Sun, 23 Feb 2014 19:11:00 UTC
Commit:      ed1dc50062c27e1c00d94404d96e6bc3dd051e29
             https://github.com/geany/geany/commit/ed1dc50062c27e1c00d94404d96e6bc3dd051e29

Log Message:
-----------
Fortran: allow keywords as names

Allow keywords for names of modules, programs, types, interfaces,
structures and enums.

Test case contributed by Adam Hirst, thanks.


Modified Paths:
--------------
    tagmanager/ctags/fortran.c
    tests/ctags/Makefile.am
    tests/ctags/keyword_names.f90
    tests/ctags/keyword_names.f90.tags

Modified: tagmanager/ctags/fortran.c
38 files changed, 27 insertions(+), 11 deletions(-)
===================================================================
@@ -1610,8 +1610,11 @@ static void parseStructureStmt (tokenInfo *const token)
 		strcmp (vStringValue (token->string), "/") == 0)
 	{  /* read structure name */
 		readToken (token);
-		if (isType (token, TOKEN_IDENTIFIER))
+		if (isType (token, TOKEN_IDENTIFIER) || isType (token, TOKEN_KEYWORD))
+		{
 			name = newTokenFrom (token);
+			name->type = TOKEN_IDENTIFIER;
+		}
 		skipPast (token, TOKEN_OPERATOR);
 	}
 	if (name == NULL)
@@ -1728,8 +1731,11 @@ static void parseDerivedTypeDef (tokenInfo *const token)
 		parseQualifierSpecList (token);
 	if (isType (token, TOKEN_DOUBLE_COLON))
 		readToken (token);
-	if (isType (token, TOKEN_IDENTIFIER))
+	if (isType (token, TOKEN_IDENTIFIER) || isType (token, TOKEN_KEYWORD))
+	{
+		token->type = TOKEN_IDENTIFIER;
 		makeFortranTag (token, TAG_DERIVED_TYPE);
+	}
 	ancestorPush (token);
 	skipToNextStatement (token);
 	if (isKeyword (token, KEYWORD_private) ||
@@ -1777,12 +1783,8 @@ static void parseInterfaceBlock (tokenInfo *const token)
 	tokenInfo *name = NULL;
 	Assert (isKeyword (token, KEYWORD_interface));
 	readToken (token);
-	if (isType (token, TOKEN_IDENTIFIER))
-	{
-		name = newTokenFrom (token);
-	}
-	else if (isKeyword (token, KEYWORD_assignment) ||
-			 isKeyword (token, KEYWORD_operator))
+	if (isKeyword (token, KEYWORD_assignment) ||
+		isKeyword (token, KEYWORD_operator))
 	{
 		readToken (token);
 		if (isType (token, TOKEN_PAREN_OPEN))
@@ -1790,6 +1792,11 @@ static void parseInterfaceBlock (tokenInfo *const token)
 		if (isType (token, TOKEN_OPERATOR))
 			name = newTokenFrom (token);
 	}
+	else if (isType (token, TOKEN_IDENTIFIER) || isType (token, TOKEN_KEYWORD))
+	{
+		name = newTokenFrom (token);
+		name->type = TOKEN_IDENTIFIER;
+	}
 	if (name == NULL)
 	{
 		name = newAnonTokenFrom (token, "Interface");
@@ -1844,8 +1851,11 @@ static void parseEnumBlock (tokenInfo *const token)
 	parseKindSelector (token);
 	if (isType (token, TOKEN_DOUBLE_COLON))
 		readToken (token);
-	if (isType (token, TOKEN_IDENTIFIER))
+	if (isType (token, TOKEN_IDENTIFIER) || isType (token, TOKEN_KEYWORD))
+	{
 		name = newTokenFrom (token);
+		name->type = TOKEN_IDENTIFIER;
+	}
 	if (name == NULL)
 	{
 		name = newAnonTokenFrom (token, "Enum");
@@ -2101,8 +2111,11 @@ static void parseModule (tokenInfo *const token)
 {
 	Assert (isKeyword (token, KEYWORD_module));
 	readToken (token);
-	if (isType (token, TOKEN_IDENTIFIER))
+	if (isType (token, TOKEN_IDENTIFIER) || isType (token, TOKEN_KEYWORD))
+	{
+		token->type = TOKEN_IDENTIFIER;
 		makeFortranTag (token, TAG_MODULE);
+	}
 	ancestorPush (token);
 	skipToNextStatement (token);
 	parseSpecificationPart (token);
@@ -2182,8 +2195,11 @@ static void parseSubprogram (tokenInfo *const token, const tagType tag)
 			isKeyword (token, KEYWORD_function) ||
 			isKeyword (token, KEYWORD_subroutine));
 	readToken (token);
-	if (isType (token, TOKEN_IDENTIFIER))
+	if (isType (token, TOKEN_IDENTIFIER) || isType (token, TOKEN_KEYWORD))
+	{
+		token->type = TOKEN_IDENTIFIER;
 		makeFortranTag (token, tag);
+	}
 	ancestorPush (token);
 	skipToNextStatement (token);
 	parseSpecificationPart (token);


Modified: tests/ctags/Makefile.am
1 files changed, 1 insertions(+), 0 deletions(-)
===================================================================
@@ -158,6 +158,7 @@ test_sources = \
 	keyword_implicit.cs				\
 	keyword_interface.cs			\
 	keyword_namespace.cs			\
+	keyword_names.f90				\
 	keyword_out.cs					\
 	keyword_override.cs				\
 	keyword_params.cs				\


Modified: tests/ctags/keyword_names.f90
28 files changed, 28 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1,28 @@
+! For some reason, the Fortran standard does not prohibit this...
+
+module Program
+
+  type Data
+    integer :: contents
+  end type Data
+
+  integer :: i
+
+  interface Program
+    function myFunc(arg)
+      !...
+    end function myFunc
+  end interface Program
+
+contains
+
+  function MyFunc(arg)
+  ! ...
+  end function MyFunc
+
+end module Program
+
+program Interface
+  use Program
+  ! ...
+end program Interface


Modified: tests/ctags/keyword_names.f90.tags
8 files changed, 8 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1,8 @@
+# format=tagmanager
+DataÌ1ÎProgramÖ0
+InterfaceÌ2048Ö0
+MyFuncÌ16ÎProgramÖ0
+ProgramÌ256Ö0
+ProgramÌ32ÎProgramÖ0
+contentsÌ64ÎDataÖ0
+iÌ16384ÎProgramÖ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