[geany/geany] 8930ba: Merge branch 'fortran/improvements'

Colomban Wendling git-noreply at xxxxx
Sun Feb 23 19:30:11 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:30:11 UTC
Commit:      8930ba80eb7a5fb2c489772fa37fc269202ba2d3
             https://github.com/geany/geany/commit/8930ba80eb7a5fb2c489772fa37fc269202ba2d3

Log Message:
-----------
Merge branch 'fortran/improvements'


Modified Paths:
--------------
    data/filetypes.fortran
    src/symbols.c
    tagmanager/ctags/fortran.c
    tests/ctags/Makefile.am
    tests/ctags/array-spec.f90.tags
    tests/ctags/auto.f.tags
    tests/ctags/block.f90
    tests/ctags/block.f90.tags
    tests/ctags/bug565813.f90.tags
    tests/ctags/bug670433.f90.tags
    tests/ctags/bug726712.f90.tags
    tests/ctags/bug734933.f90.tags
    tests/ctags/bug858165.f90.tags
    tests/ctags/bug877956.f90.tags
    tests/ctags/byte.f.tags
    tests/ctags/common.f.tags
    tests/ctags/debian_432872.f90.tags
    tests/ctags/enum.f90
    tests/ctags/enum.f90.tags
    tests/ctags/enumerators.f90
    tests/ctags/enumerators.f90.tags
    tests/ctags/forall_module.f90.tags
    tests/ctags/fortran_associate.f90.tags
    tests/ctags/interfaces.f90
    tests/ctags/interfaces.f90.tags
    tests/ctags/invalid_name.f90.tags
    tests/ctags/keyword_names.f90
    tests/ctags/keyword_names.f90.tags
    tests/ctags/members.f90
    tests/ctags/members.f90.tags
    tests/ctags/misc_types.f.tags
    tests/ctags/misc_types.f90.tags
    tests/ctags/namelist.f.tags
    tests/ctags/numlib.f90.tags
    tests/ctags/preprocessor.f90
    tests/ctags/preprocessor.f90.tags
    tests/ctags/procedure_pointer_module.f90.tags
    tests/ctags/procpoint.f90.tags
    tests/ctags/qualified_types.f90
    tests/ctags/qualified_types.f90.tags
    tests/ctags/recursive.f95.tags
    tests/ctags/square_parens.f90.tags
    tests/ctags/stdcall.f.tags
    tests/ctags/structure.f.tags
    tests/ctags/union.f.tags
    tests/ctags/value.f.tags

Modified: data/filetypes.fortran
2 files changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -3,7 +3,7 @@
 
 [keywords]
 # all items must be in one line
-primary=abstract access action advance all allstop allocatable allocate apostrophe assign assignment associate asynchronous backspace bind blank blockdata call case character class close codimension common complex concurrent contains contiguous continue critical cycle data deallocate decimal delim default dimension direct do dowhile double doubleprecision elemental else elseif elsewhere encoding end endassociate endblockdata endcritical enddo endfile endforall endfunction endif endinterface endmodule endprocedure endprogram endselect endsubmodule endsubroutine endtype endwhere entry enum enumerator eor equivalence err errmsg exist exit extends external file final flush fmt forall form format formatted function generic go goto id if images implicit import impure in include inout integer inquire intent interface intrinsic iomsg iolength iostat is kind len lock logical memory module name named namelist nextrec nml non_intrinsic non_overridable none nopass nullify number only open opened operator optional out pad parameter pass pause pending pointer pos position precision print private procedure program protected public quote pure read readwrite real rec recl recursive result return rewind save select selectcase selecttype sequential sign size stat status stop stream submodule subroutine sync syncall syncimages syncmemory target then to type unformatted unit unlock use value volatile wait where while write
+primary=abstract access action advance all allstop allocatable allocate apostrophe assign assignment associate asynchronous backspace bind blank block blockdata call case character class close codimension common complex concurrent contains contiguous continue critical cycle data deallocate decimal delim default dimension direct do dowhile double doubleprecision elemental else elseif elsewhere encoding end endassociate endblock endblockdata endcritical enddo endfile endforall endfunction endif endinterface endmodule endprocedure endprogram endselect endsubmodule endsubroutine endtype endwhere entry enum enumerator eor equivalence err errmsg exist exit extends external file final flush fmt forall form format formatted function generic go goto id if images implicit import impure in include inout integer inquire intent interface intrinsic iomsg iolength iostat is kind len lock logical memory module name named namelist nextrec nml non_intrinsic non_overridable none nopass nullify number only open opened operator optional out pad parameter pass pause pending pointer pos position precision print private procedure program protected public quote pure read readwrite real rec recl recursive result return rewind save select selectcase selecttype sequential sign size stat status stop stream submodule subroutine sync syncall syncimages syncmemory target then to type unformatted unit unlock use value volatile wait where while write
 intrinsic_functions=abs achar acos acosd acosh adjustl adjustr aimag aimax0 aimin0 aint ajmax0 ajmin0 akmax0 akmin0 all allocated alog alog10 amax0 amax1 amin0 amin1 amod anint any asin asind asinh associated atan atan2 atan2d atand atanh atomic_define atomic_ref bessel_j0 bessel_j1 bessel_jn bessel_y0 bessel_y1 bessel_yn bge bgt bit_size bitest bitl bitlr bitrl bjtest bktest ble blt break btest c_associated c_f_pointer c_f_procpointer c_funloc c_loc c_sizeof cabs ccos cdabs cdcos cdexp cdlog cdsin cdsqrt ceiling cexp char clog cmplx command_argument_count conjg cos cosd cosh count cpu_time cshift csin csqrt dabs dacos dacosd dasin dasind datan datan2 datan2d datand date date_and_time dble dcmplx dconjg dcos dcosd dcosh dcotan ddim dexp dfloat dfloti dflotj dflotk digits dim dimag dint dlog dlog10 dmax1 dmin1 dmod dnint dot_product dprod dreal dshiftl dshiftr dsign dsin dsind dsinh dsqrt dtan dtand dtanh eoshift epsilon erf erfc erfc_scaled errsns execute_command_line exp exponent extends_type_of findloc float floati floatj floatk floor fraction free gamma get_command get_command_argument get_environment_variable huge hypot iabs iachar iall iand iany ibclr ibits ibset ichar idate idim idint idnint ieor ifix iiabs iiand iibclr iibits iibset iidim iidint iidnnt iieor iifix iint iior iiqint iiqnnt iishft iishftc iisign ilen image_index imax0 imax1 imin0 imin1 imod index inint inot int int1 int2 int4 int8 ior iparity iqint iqnint is_contiguous is_isostat_end is_isostat_eor ishft ishftc isign isnan izext jiand jibclr jibits jibset jidim jidint jidnnt jieor jifix jint jior jiqint jiqnnt jishft jishftc jisign jmax0 jmax1 jmin0 jmin1 jmod jnint jnot jzext kiabs kiand kibclr kibits kibset kidim kidint kidnnt kieor kifix kind kint kior kishft kishftc kisign kmax0 kmax1 kmin0 kmin1 kmod knint knot kzext lbound lcobound leadz len len_trim lge lgt lle llt log log10 log_gamma logical lshift malloc maskl maskr matmul max max0 max1 maxexponent maxloc maxval merge merge_bits min min0 min1 minexponent minloc minval mod modulo move_alloc mvbits nearest new_line nint norm2 not null num_images number_of_processors nworkers pack parity popcnt poppar precision present product radix random random_number random_seed range real repeat reshape rrspacing rshift same_type_as scale scan secnds selected_char_kind selected_int_kind selected_real_kind set_exponent shape shifta shiftl shiftr sign sin sind sinh size sizeof sngl snglq spacing spread sqrt storage_size sum system_clock tan tand tanh this_image tiny trailz transfer transpose trim ubound ucobound unpack verify
 user_functions=cdabs cdcos cdexp cdlog cdsin cdsqrt cotan cotand dcmplx dconjg dcotan dcotand decode dimag dll_export dll_import doublecomplex dreal dvchk encode find flen flush getarg getcharqq getcl getdat getenv gettim hfix ibchng identifier imag int1 int2 int4 intc intrup invalop iostat_msg isha ishc ishl jfix lacfar locking locnear map nargs nbreak ndperr ndpexc offset ovefl peekcharqq precfill prompt qabs qacos qacosd qasin qasind qatan qatand qatan2 qcmplx qconjg qcos qcosd qcosh qdim qexp qext qextd qfloat qimag qlog qlog10 qmax1 qmin1 qmod qreal qsign qsin qsind qsinh qsqrt qtan qtand qtanh ran rand randu rewrite segment setdat settim system timer undfl unlock union val virtual volatile zabs zcos zexp zlog zsin zsqrt
 


Modified: src/symbols.c
8 files changed, 5 insertions(+), 3 deletions(-)
===================================================================
@@ -972,12 +972,14 @@ static void add_top_level_items(GeanyDocument *doc)
 		{
 			tag_list_add_groups(tag_store,
 				&(tv_iters.tag_namespace), _("Module"), "classviewer-class",
+				&(tv_iters.tag_struct), _("Programs"), "classviewer-class",
 				&(tv_iters.tag_interface), _("Interfaces"), "classviewer-struct",
-				&(tv_iters.tag_function), _("Functions"), "classviewer-method",
-				&(tv_iters.tag_member), _("Subroutines"), "classviewer-method",
+				&(tv_iters.tag_function), _("Functions / Subroutines"), "classviewer-method",
 				&(tv_iters.tag_variable), _("Variables"), "classviewer-var",
-				&(tv_iters.tag_type), _("Types"), "classviewer-namespace",
+				&(tv_iters.tag_class), _("Types"), "classviewer-class",
+				&(tv_iters.tag_member), _("Components"), "classviewer-member",
 				&(tv_iters.tag_macro), _("Blocks"), "classviewer-member",
+				&(tv_iters.tag_type), _("Enums"), "classviewer-struct",
 				&(tv_iters.tag_other), _("Other"), "classviewer-other",
 				NULL);
 			break;


Modified: tagmanager/ctags/fortran.c
200 files changed, 152 insertions(+), 48 deletions(-)
===================================================================
@@ -65,6 +65,7 @@
 	KEYWORD_assignment,
 	KEYWORD_associate,
 	KEYWORD_automatic,
+	KEYWORD_bind,
 	KEYWORD_block,
 	KEYWORD_byte,
 	KEYWORD_cexternal,
@@ -83,6 +84,8 @@
 	KEYWORD_elemental,
 	KEYWORD_end,
 	KEYWORD_entry,
+	KEYWORD_enum,
+	KEYWORD_enumerator,
 	KEYWORD_equivalence,
 	KEYWORD_extends,
 	KEYWORD_external,
@@ -97,6 +100,8 @@
 	KEYWORD_intent,
 	KEYWORD_interface,
 	KEYWORD_intrinsic,
+	KEYWORD_kind,
+	KEYWORD_len,
 	KEYWORD_logical,
 	KEYWORD_map,
 	KEYWORD_module,
@@ -178,6 +183,8 @@
 	TAG_SUBROUTINE,
 	TAG_DERIVED_TYPE,
 	TAG_VARIABLE,
+	TAG_ENUM,
+	TAG_ENUMERATOR,
 	TAG_COUNT  /* must be last */
 } tagType;
 
@@ -203,6 +210,8 @@
 static boolean FreeSourceForm = FALSE;
 static boolean ParsingString;
 static tokenInfo *Parent = NULL;
+static boolean NewLine = TRUE;
+static unsigned int contextual_fake_count = 0;
 
 /* indexed by tagType */
 static kindOption FortranKinds [] = {
@@ -210,16 +219,18 @@
 	{ TRUE,  'c', "macro",		"common blocks"},
 	{ TRUE,  'e', "entry",		"entry points"},
 	{ TRUE,  'f', "function",	"functions"},
-	{ FALSE, 'i', "interface",	"interface contents, generic names, and operators"},
-	{ TRUE,  'k', "component",	"type and structure components"},
+	{ TRUE,  'i', "interface",	"interface contents, generic names, and operators"},
+	{ TRUE,  'k', "member",	"type and structure components"},
 	{ TRUE,  'l', "label",		"labels"},
 	{ FALSE, 'L', "local",		"local, common block, and namelist variables"},
 	{ TRUE,  'm', "namespace",	"modules"},
 	{ TRUE,  'n', "namelist",	"namelists"},
-	{ TRUE,  'p', "package",	"programs"},
-	{ TRUE,  's', "member",	"subroutines"},
-	{ TRUE,  't', "typedef",	"derived types and structures"},
-	{ TRUE,  'v', "variable",	"program (global) and module variables"}
+	{ TRUE,  'p', "struct",	"programs"},
+	{ TRUE,  's', "method",	"subroutines"},
+	{ TRUE,  't', "class",	"derived types and structures"},
+	{ TRUE,  'v', "variable",	"program (global) and module variables"},
+	{ TRUE,  'E', "enum",	"enumerations"},
+	{ TRUE,  'F', "enumerator",	"enumeration values"},
 };
 
 /* For efinitions of Fortran 77 with extensions:
@@ -236,6 +247,7 @@
 	{ "assignment",     KEYWORD_assignment   },
 	{ "associate",      KEYWORD_associate    },
 	{ "automatic",      KEYWORD_automatic    },
+	{ "bind",           KEYWORD_bind         },
 	{ "block",          KEYWORD_block        },
 	{ "byte",           KEYWORD_byte         },
 	{ "cexternal",      KEYWORD_cexternal    },
@@ -254,6 +266,8 @@
 	{ "elemental",      KEYWORD_elemental    },
 	{ "end",            KEYWORD_end          },
 	{ "entry",          KEYWORD_entry        },
+	{ "enum",           KEYWORD_enum         },
+	{ "enumerator",     KEYWORD_enumerator   },
 	{ "equivalence",    KEYWORD_equivalence  },
 	{ "extends",        KEYWORD_extends      },
 	{ "external",       KEYWORD_external     },
@@ -268,6 +282,8 @@
 	{ "intent",         KEYWORD_intent       },
 	{ "interface",      KEYWORD_interface    },
 	{ "intrinsic",      KEYWORD_intrinsic    },
+	{ "kind",           KEYWORD_kind         },
+	{ "len",            KEYWORD_len          },
 	{ "logical",        KEYWORD_logical      },
 	{ "map",            KEYWORD_map          },
 	{ "module",         KEYWORD_module       },
@@ -368,7 +384,7 @@ static const tokenInfo* ancestorScope (void)
 	{
 		tokenInfo *const token = Ancestors.list + i - 1;
 		if (token->type == TOKEN_IDENTIFIER &&
-			token->tag != TAG_UNDEFINED  && token->tag != TAG_INTERFACE)
+			token->tag != TAG_UNDEFINED)
 			result = token;
 	}
 	return result;
@@ -445,6 +461,16 @@ static tokenInfo *newTokenFrom (tokenInfo *const token)
 	return result;
 }
 
+static tokenInfo *newAnonTokenFrom (tokenInfo *const token, const char *type)
+{
+	char buffer[64];
+	tokenInfo *result = newTokenFrom (token);
+	sprintf (buffer, "%s#%u", type, contextual_fake_count++);
+	vStringClear (result->string);
+	vStringCatS (result->string, buffer);
+	return result;
+}
+
 static void deleteToken (tokenInfo *const token)
 {
 	if (token != NULL)
@@ -500,7 +526,7 @@ static void makeFortranTag (tokenInfo *const token, tagType tag)
 				e.extensionFields.scope [1] = vStringValue (scope->string);
 			}
 		}
-		if (! insideInterface () || includeTag (TAG_INTERFACE))
+		if (! insideInterface () /*|| includeTag (TAG_INTERFACE)*/)
 			makeTagEntry (&e);
 	}
 }
@@ -704,7 +730,6 @@ static int skipToNextLine (void)
 
 static int getFreeFormChar (boolean inComment)
 {
-	static boolean newline = TRUE;
 	boolean advanceLine = FALSE;
 	int c = fileGetc ();
 
@@ -719,7 +744,7 @@ static int getFreeFormChar (boolean inComment)
 		while (isspace (c)  &&  c != '\n');
 		if (c == '\n')
 		{
-			newline = TRUE;
+			NewLine = TRUE;
 			advanceLine = TRUE;
 		}
 		else if (c == '!')
@@ -730,16 +755,16 @@ static int getFreeFormChar (boolean inComment)
 			c = '&';
 		}
 	}
-	else if (newline && (c == '!' || c == '#'))
+	else if (NewLine && (c == '!' || c == '#'))
 		advanceLine = TRUE;
 	while (advanceLine)
 	{
 		while (isspace (c))
 			c = fileGetc ();
-		if (c == '!' || (newline && c == '#'))
+		if (c == '!' || (NewLine && c == '#'))
 		{
 			c = skipToNextLine ();
-			newline = TRUE;
+			NewLine = TRUE;
 			continue;
 		}
 		if (c == '&')
@@ -747,7 +772,7 @@ static int getFreeFormChar (boolean inComment)
 		else
 			advanceLine = FALSE;
 	}
-	newline = (boolean) (c == '\n');
+	NewLine = (boolean) (c == '\n');
 	return c;
 }
 
@@ -1144,6 +1169,7 @@ static boolean isTypeSpec (tokenInfo *const token)
 		case KEYWORD_record:
 		case KEYWORD_type:
 		case KEYWORD_procedure:
+		case KEYWORD_enumerator:
 			result = TRUE;
 			break;
 		default:
@@ -1171,6 +1197,21 @@ static boolean isSubprogramPrefix (tokenInfo *const token)
 	return result;
 }
 
+static void parseKindSelector (tokenInfo *const token)
+{
+	if (isType (token, TOKEN_PAREN_OPEN))
+		skipOverParens (token);  /* skip kind-selector */
+	if (isType (token, TOKEN_OPERATOR) &&
+		strcmp (vStringValue (token->string), "*") == 0)
+	{
+		readToken (token);
+		if (isType (token, TOKEN_PAREN_OPEN))
+			skipOverParens (token);
+		else
+			readToken (token);
+	}
+}
+
 /*  type-spec
  *      is INTEGER [kind-selector]
  *      or REAL [kind-selector] is ( etc. )
@@ -1208,14 +1249,7 @@ static void parseTypeSpec (tokenInfo *const token)
 		case KEYWORD_real:
 		case KEYWORD_procedure:
 			readToken (token);
-			if (isType (token, TOKEN_PAREN_OPEN))
-				skipOverParens (token);  /* skip kind-selector */
-			if (isType (token, TOKEN_OPERATOR) &&
-				strcmp (vStringValue (token->string), "*") == 0)
-			{
-				readToken (token);
-				readToken (token);
-			}
+			parseKindSelector (token);
 			break;
 
 		case KEYWORD_double:
@@ -1246,6 +1280,10 @@ static void parseTypeSpec (tokenInfo *const token)
 				parseDerivedTypeDef (token);
 			break;
 
+		case KEYWORD_enumerator:
+			readToken (token);
+			break;
+
 		default:
 			skipToToken (token, TOKEN_STATEMENT_END);
 			break;
@@ -1297,6 +1335,8 @@ static void parseQualifierSpecList (tokenInfo *const token)
 			case KEYWORD_allocatable:
 			case KEYWORD_external:
 			case KEYWORD_intrinsic:
+			case KEYWORD_kind:
+			case KEYWORD_len:
 			case KEYWORD_optional:
 			case KEYWORD_private:
 			case KEYWORD_pointer:
@@ -1333,11 +1373,12 @@ static tagType variableTagType (void)
 		const tokenInfo* const parent = ancestorTop ();
 		switch (parent->tag)
 		{
-			case TAG_MODULE:       result = TAG_VARIABLE;  break;
-			case TAG_DERIVED_TYPE: result = TAG_COMPONENT; break;
-			case TAG_FUNCTION:     result = TAG_LOCAL;     break;
-			case TAG_SUBROUTINE:   result = TAG_LOCAL;     break;
-			default:               result = TAG_VARIABLE;  break;
+			case TAG_MODULE:       result = TAG_VARIABLE;   break;
+			case TAG_DERIVED_TYPE: result = TAG_COMPONENT;  break;
+			case TAG_FUNCTION:     result = TAG_LOCAL;      break;
+			case TAG_SUBROUTINE:   result = TAG_LOCAL;      break;
+			case TAG_ENUM:         result = TAG_ENUMERATOR; break;
+			default:               result = TAG_VARIABLE;   break;
 		}
 	}
 	return result;
@@ -1568,25 +1609,27 @@ static void parseUnionStmt (tokenInfo *const token)
  */
 static void parseStructureStmt (tokenInfo *const token)
 {
-	tokenInfo *name;
+	tokenInfo *name = NULL;
 	Assert (isKeyword (token, KEYWORD_structure));
 	readToken (token);
 	if (isType (token, TOKEN_OPERATOR) &&
 		strcmp (vStringValue (token->string), "/") == 0)
 	{  /* read structure name */
 		readToken (token);
-		if (isType (token, TOKEN_IDENTIFIER))
-			makeFortranTag (token, TAG_DERIVED_TYPE);
-		name = newTokenFrom (token);
+		if (isType (token, TOKEN_IDENTIFIER) || isType (token, TOKEN_KEYWORD))
+		{
+			name = newTokenFrom (token);
+			name->type = TOKEN_IDENTIFIER;
+		}
 		skipPast (token, TOKEN_OPERATOR);
 	}
-	else
+	if (name == NULL)
 	{  /* fake out anonymous structure */
-		name = newToken ();
+		name = newAnonTokenFrom (token, "Structure");
 		name->type = TOKEN_IDENTIFIER;
 		name->tag = TAG_DERIVED_TYPE;
-		vStringCopyS (name->string, "anonymous");
 	}
+	makeFortranTag (name, TAG_DERIVED_TYPE);
 	while (isType (token, TOKEN_IDENTIFIER))
 	{  /* read field names */
 		makeFortranTag (token, TAG_COMPONENT);
@@ -1694,8 +1737,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) ||
@@ -1743,29 +1789,27 @@ static void parseInterfaceBlock (tokenInfo *const token)
 	tokenInfo *name = NULL;
 	Assert (isKeyword (token, KEYWORD_interface));
 	readToken (token);
-	if (isType (token, TOKEN_IDENTIFIER))
-	{
-		makeFortranTag (token, TAG_INTERFACE);
-		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))
 			readToken (token);
 		if (isType (token, TOKEN_OPERATOR))
-		{
-			makeFortranTag (token, TAG_INTERFACE);
 			name = newTokenFrom (token);
-		}
+	}
+	else if (isType (token, TOKEN_IDENTIFIER) || isType (token, TOKEN_KEYWORD))
+	{
+		name = newTokenFrom (token);
+		name->type = TOKEN_IDENTIFIER;
 	}
 	if (name == NULL)
 	{
-		name = newToken ();
+		name = newAnonTokenFrom (token, "Interface");
 		name->type = TOKEN_IDENTIFIER;
 		name->tag = TAG_INTERFACE;
 	}
+	makeFortranTag (name, TAG_INTERFACE);
 	ancestorPush (name);
 	while (! isKeyword (token, KEYWORD_end))
 	{
@@ -1791,6 +1835,56 @@ static void parseInterfaceBlock (tokenInfo *const token)
 	deleteToken (name);
 }
 
+/* enum-block
+ *      enum-stmt (is ENUM, BIND(C) [ :: type-alias-name ]
+ *                 or ENUM [ kind-selector ] [ :: ] [ type-alias-name ])
+ *          [ enum-body (is ENUMERATOR [ :: ] enumerator-list) ]
+ *      end-enum-stmt (is END ENUM)
+ */
+static void parseEnumBlock (tokenInfo *const token)
+{
+	tokenInfo *name = NULL;
+	Assert (isKeyword (token, KEYWORD_enum));
+	readToken (token);
+	if (isType (token, TOKEN_COMMA))
+	{
+		readToken (token);
+		if (isType (token, TOKEN_KEYWORD))
+			readToken (token);
+		if (isType (token, TOKEN_PAREN_OPEN))
+			skipOverParens (token);
+	}
+	parseKindSelector (token);
+	if (isType (token, TOKEN_DOUBLE_COLON))
+		readToken (token);
+	if (isType (token, TOKEN_IDENTIFIER) || isType (token, TOKEN_KEYWORD))
+	{
+		name = newTokenFrom (token);
+		name->type = TOKEN_IDENTIFIER;
+	}
+	if (name == NULL)
+	{
+		name = newAnonTokenFrom (token, "Enum");
+		name->type = TOKEN_IDENTIFIER;
+		name->tag = TAG_ENUM;
+	}
+	makeFortranTag (name, TAG_ENUM);
+	skipToNextStatement (token);
+	ancestorPush (name);
+	while (! isKeyword (token, KEYWORD_end))
+	{
+		if (isTypeSpec (token))
+			parseTypeDeclarationStmt (token);
+		else
+			skipToNextStatement (token);
+	}
+	readSubToken (token);
+	/* secondary token should be KEYWORD_enum token */
+	skipToNextStatement (token);
+	ancestorPop ();
+	deleteToken (name);
+}
+
 /*  entry-stmt is
  *      ENTRY entry-name [ ( dummy-arg-list ) ]
  */
@@ -1872,6 +1966,7 @@ static boolean parseDeclarationConstruct (tokenInfo *const token)
 	{
 		case KEYWORD_entry:		parseEntryStmt (token);      break;
 		case KEYWORD_interface:	parseInterfaceBlock (token); break;
+		case KEYWORD_enum:		parseEnumBlock (token);      break;
 		case KEYWORD_stdcall:   readToken (token);           break;
 		/* derived type handled by parseTypeDeclarationStmt(); */
 
@@ -2022,8 +2117,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);
@@ -2079,6 +2177,7 @@ static boolean parseExecutionPart (tokenInfo *const token)
 			case KEYWORD_end:
 				readSubToken (token);
 				if (isSecondaryKeyword (token, KEYWORD_do) ||
+					isSecondaryKeyword (token, KEYWORD_enum) ||
 					isSecondaryKeyword (token, KEYWORD_if) ||
 					isSecondaryKeyword (token, KEYWORD_select) ||
 					isSecondaryKeyword (token, KEYWORD_where) ||
@@ -2102,8 +2201,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);
@@ -2207,7 +2309,9 @@ static boolean findFortranTags (const unsigned int passCount)
 	Parent = newToken ();
 	token = newToken ();
 	FreeSourceForm = (boolean) (passCount > 1);
+	contextual_fake_count = 0;
 	Column = 0;
+	NewLine = TRUE;
 	exception = (exception_t) setjmp (Exception);
 	if (exception == ExceptionEOF)
 		retry = FALSE;


Modified: tests/ctags/Makefile.am
8 files changed, 8 insertions(+), 0 deletions(-)
===================================================================
@@ -20,6 +20,7 @@ test_sources = \
 	attributes.cs					\
 	auto.f							\
 	bit_field.c						\
+	block.f90						\
 	bracematch.js					\
 	bug1020715.cpp					\
 	bug1020715.c					\
@@ -121,7 +122,9 @@ test_sources = \
 	directives.c					\
 	dopbl2.f						\
 	enum.c							\
+	enum.f90						\
 	enum.java						\
+	enumerators.f90					\
 	events.cs						\
 	extern_variable.h				\
 	forall_module.f90				\
@@ -138,6 +141,7 @@ test_sources = \
 	initialization.f90				\
 	interface_indexers.cs			\
 	interface_properties.cs			\
+	interfaces.f90					\
 	internal.cs						\
 	intro_orig.tex					\
 	intro.tex						\
@@ -156,6 +160,7 @@ test_sources = \
 	keyword_implicit.cs				\
 	keyword_interface.cs			\
 	keyword_namespace.cs			\
+	keyword_names.f90				\
 	keyword_out.cs					\
 	keyword_override.cs				\
 	keyword_params.cs				\
@@ -176,6 +181,7 @@ test_sources = \
 	matlab_backtracking.m			\
 	matlab_test.m					\
 	maze.erl						\
+	members.f90						\
 	misc_types.f90					\
 	misc_types.f					\
 	mode.php						\
@@ -192,12 +198,14 @@ test_sources = \
 	objectivec_protocol.mm			\
 	Package.pm						\
 	php5_5_class_kw.php				\
+	preprocessor.f90				\
 	procedure_pointer_module.f90	\
 	procpoint.f90					\
 	property.cs						\
 	prototype.h						\
 	pure_elem.f95					\
 	py_constructor_arglist.py		\
+	qualified_types.f90				\
 	random.sql						\
 	readlob.sql						\
 	readlong.sql					\


Modified: tests/ctags/array-spec.f90.tags
6 files changed, 5 insertions(+), 1 deletions(-)
===================================================================
@@ -1,3 +1,7 @@
 # format=tagmanager
-df_typeÌ4096Îinm_dfÖ0
+df_mb_dataÌ64Îdf_typeÖ0
+df_mb_timeÌ64Îdf_typeÖ0
+df_typeÌ1Îinm_dfÖ0
+df_wb_dataÌ64Îdf_typeÖ0
+df_wb_timeÌ64Îdf_typeÖ0
 inm_dfÌ256Ö0


Modified: tests/ctags/auto.f.tags
2 files changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -1,5 +1,5 @@
 # format=tagmanager
-AUTO_TESTÌ512Ö0
+AUTO_TESTÌ2048Ö0
 DÌ16384ÎAUTO_TESTÖ0
 PÌ16384ÎAUTO_TESTÖ0
 QÌ16384ÎAUTO_TESTÖ0


Modified: tests/ctags/block.f90
51 files changed, 51 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1,51 @@
+module Blocks
+  implicit none
+
+  integer :: i
+
+contains
+
+  function MyFunc(thing)
+  integer, intent(in) :: thing
+  integer             :: myfunc
+
+  block
+    ! these obviously won't show up, because variables inside functions inside modules don't anyway
+    ! and that's fine
+    integer :: tempint
+    tempint = 1
+    if (tempint == 1) then
+      tempint = 2
+    end if
+    myfunc = tempint
+  end block
+
+  end function MyFunc
+
+end module Blocks
+
+program Main
+  use Blocks
+
+  implicit none
+
+  ! these variable declarations should definitely show up in the symbol list
+  integer :: otherint, moreint
+
+  otherint = 3
+
+  block
+    ! These shouldn't, because...
+    integer :: newtempint
+
+    newtempint = 2
+    block
+      ! ...the damn things can be arbitrarily nested!
+      integer :: newer_int
+
+      newer_int = 3
+    end block
+    newtempint = 2 * newtempint
+  end block
+
+end program Main


Modified: tests/ctags/block.f90.tags
7 files changed, 7 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1,7 @@
+# format=tagmanager
+BlocksÌ256Ö0
+MainÌ2048Ö0
+MyFuncÌ16ÎBlocksÖ0
+iÌ16384ÎBlocksÖ0
+moreintÌ16384ÎMainÖ0
+otherintÌ16384ÎMainÖ0


Modified: tests/ctags/bug565813.f90.tags
7 files changed, 4 insertions(+), 3 deletions(-)
===================================================================
@@ -1,7 +1,8 @@
 # format=tagmanager
 NÌ16384Îctags_bugÖ0
+barÌ64Îfoo_tÖ0
 ctags_bugÌ256Ö0
 foo_getbarÌ16Îctags_bugÖ0
-foo_set_barÌ64Îctags_bugÖ0
-foo_setbarÌ64Îctags_bugÖ0
-foo_tÌ4096Îctags_bugÖ0
+foo_set_barÌ128Îctags_bugÖ0
+foo_setbarÌ128Îctags_bugÖ0
+foo_tÌ1Îctags_bugÖ0


Modified: tests/ctags/bug670433.f90.tags
2 files changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -1,5 +1,5 @@
 # format=tagmanager
-barÌ64ÎfoobarÖ0
+barÌ128ÎfoobarÖ0
 fÌ16ÎfooÖ0
 fooÌ16ÎfoobarÖ0
 foobarÌ256Ö0


Modified: tests/ctags/bug726712.f90.tags
6 files changed, 3 insertions(+), 3 deletions(-)
===================================================================
@@ -1,4 +1,4 @@
 # format=tagmanager
-sub1Ì64Ö0
-sub2Ì64Ö0
-tagstest_ctrlÌ64Ö0
+sub1Ì128Ö0
+sub2Ì128Ö0
+tagstest_ctrlÌ128Ö0


Modified: tests/ctags/bug734933.f90.tags
11 files changed, 8 insertions(+), 3 deletions(-)
===================================================================
@@ -1,12 +1,17 @@
 # format=tagmanager
-ADD_COMPONENTSÌ64ÎMDCOMPONENTSÖ0
+ADD_COMPONENTSÌ128ÎMDCOMPONENTSÖ0
 COMPÌ16384ÎMDCOMPONENTSÖ0
-COMPONENTÌ4096ÎMDCOMPONENTSÖ0
+COMPONENTÌ1ÎMDCOMPONENTSÖ0
 COMPONENTSÌ16384ÎMDCOMPONENTSÖ0
 COMPONENTS_TMPÌ16384ÎMDCOMPONENTSÖ0
-COMPONENT_POINTERÌ4096ÎMDCOMPONENTSÖ0
+COMPONENT_POINTERÌ1ÎMDCOMPONENTSÖ0
 COMP_TMPÌ16384ÎMDCOMPONENTSÖ0
 LIM_COMPONENTSÌ16384ÎMDCOMPONENTSÖ0
 MDCOMPONENTSÌ256Ö0
+MEMDEALLOCÌ32ÎMDCOMPONENTSÖ0
+NAMEÌ64ÎCOMPONENTÖ0
 NCOMPÌ16384ÎMDCOMPONENTSÖ0
 NUM_COMPONENTSÌ16384ÎMDCOMPONENTSÖ0
+NUM_PARTÌ64ÎCOMPONENTÖ0
+PÌ64ÎCOMPONENT_POINTERÖ0
+PART_LISTÌ64ÎCOMPONENTÖ0


Modified: tests/ctags/bug858165.f90.tags
2 files changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -3,4 +3,4 @@ a
 bÌ16384ÎtestÖ0
 cÌ16384ÎtestÖ0
 dÌ16384ÎtestÖ0
-testÌ512Ö0
+testÌ2048Ö0


Modified: tests/ctags/bug877956.f90.tags
2 files changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -1,4 +1,4 @@
 # format=tagmanager
 c2Ì16384ÎtestÖ0
 cm1Ì16384ÎtestÖ0
-testÌ512Ö0
+testÌ2048Ö0


Modified: tests/ctags/byte.f.tags
2 files changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -8,4 +8,4 @@ B2
 CÌ16384Îbyte_testÖ0
 C1Ì16384Îbyte_testÖ0
 C2Ì16384Îbyte_testÖ0
-byte_testÌ512Ö0
+byte_testÌ2048Ö0


Modified: tests/ctags/common.f.tags
2 files changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -2,4 +2,4 @@
 common1Ì65536ÎmainÖ0
 common2Ì65536ÎmainÖ0
 common3Ì65536ÎmainÖ0
-mainÌ512Ö0
+mainÌ2048Ö0


Modified: tests/ctags/debian_432872.f90.tags
2 files changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -1,3 +1,3 @@
 # format=tagmanager
 FOOÌ256Ö0
-FOOÌ64ÎFOOÖ0
+FOOÌ128ÎFOOÖ0


Modified: tests/ctags/enum.f90
52 files changed, 52 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1,52 @@
+module Constants
+  implicit none
+
+  real, parameter :: pi = 4 * atan(1.0)
+  real, parameter :: E_e = 510998.91013
+
+  ! we now have enumerators in F2003/8, for the sake of interop with C
+  enum, bind(c) ! unnamed 1
+    enumerator :: red =1, blue, black =5
+    enumerator yellow
+    enumerator gold, silver, bronze
+    enumerator :: purple
+    enumerator :: pink, lavender
+  end enum
+
+  enum ! unnamed 2
+    enumerator :: a, b, c
+  end enum
+  
+  enum :: Named1
+    enumerator :: x1, y1, z1
+  end enum
+  
+  enum Named2
+    enumerator :: x2, y2, z2
+  end enum
+
+  enum(8) Named3
+    enumerator :: x3, y3, z3
+  end enum
+
+  enum*8 Named4
+    enumerator :: x4, y4, z4
+  end enum
+
+  enum(8) :: Named5
+    enumerator :: x5, y5, z5
+  end enum
+
+  enum*8 :: Named6
+    enumerator :: x6, y6, z6
+  end enum
+
+  enum, bind(c) :: Named7
+    enumerator :: x7, y7, z7
+  end enum
+
+  real, parameter :: hc = 12398.4193
+
+  public
+
+end module Constants


Modified: tests/ctags/enum.f90.tags
48 files changed, 48 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1,48 @@
+# format=tagmanager
+ConstantsÌ256Ö0
+E_eÌ16384ÎConstantsÖ0
+Enum#0Ì2ÎConstantsÖ0
+Enum#1Ì2ÎConstantsÖ0
+Named1Ì2ÎConstantsÖ0
+Named2Ì2ÎConstantsÖ0
+Named3Ì2ÎConstantsÖ0
+Named4Ì2ÎConstantsÖ0
+Named5Ì2ÎConstantsÖ0
+Named6Ì2ÎConstantsÖ0
+Named7Ì2ÎConstantsÖ0
+aÌ4ÎEnum#1Ö0
+bÌ4ÎEnum#1Ö0
+blackÌ4ÎEnum#0Ö0
+blueÌ4ÎEnum#0Ö0
+bronzeÌ4ÎEnum#0Ö0
+cÌ4ÎEnum#1Ö0
+goldÌ4ÎEnum#0Ö0
+hcÌ16384ÎConstantsÖ0
+lavenderÌ4ÎEnum#0Ö0
+piÌ16384ÎConstantsÖ0
+pinkÌ4ÎEnum#0Ö0
+purpleÌ4ÎEnum#0Ö0
+redÌ4ÎEnum#0Ö0
+silverÌ4ÎEnum#0Ö0
+x1Ì4ÎNamed1Ö0
+x2Ì4ÎNamed2Ö0
+x3Ì4ÎNamed3Ö0
+x4Ì4ÎNamed4Ö0
+x5Ì4ÎNamed5Ö0
+x6Ì4ÎNamed6Ö0
+x7Ì4ÎNamed7Ö0
+y1Ì4ÎNamed1Ö0
+y2Ì4ÎNamed2Ö0
+y3Ì4ÎNamed3Ö0
+y4Ì4ÎNamed4Ö0
+y5Ì4ÎNamed5Ö0
+y6Ì4ÎNamed6Ö0
+y7Ì4ÎNamed7Ö0
+yellowÌ4ÎEnum#0Ö0
+z1Ì4ÎNamed1Ö0
+z2Ì4ÎNamed2Ö0
+z3Ì4ÎNamed3Ö0
+z4Ì4ÎNamed4Ö0
+z5Ì4ÎNamed5Ö0
+z6Ì4ÎNamed6Ö0
+z7Ì4ÎNamed7Ö0


Modified: tests/ctags/enumerators.f90
55 files changed, 55 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1,55 @@
+module Enums
+  real :: somevar
+
+  ! we now have enumerators in F2003/8, for the sake of interop with C
+  enum, bind(c) ! unnamed 1
+    enumerator :: red =1, blue
+    enumerator gold, silver, bronze
+    enumerator :: purple
+  end enum
+
+
+  ! here follow nonstandard enum declarations, which may become valid in a later standard
+  ! no real harm implementing these as long as valid stuff isn't broken
+  enum
+    enumerator :: no_c_binding
+  end enum
+
+  enum :: Colons
+    enumerator :: r
+  end enum
+
+  enum BodyPart
+    enumerator :: arm, leg
+  end enum
+
+  enum(8) Paren_kind
+    enumerator :: b
+  end enum
+
+  enum*8 Aster_kind
+    enumerator :: c
+  end enum
+
+  enum(8) :: Paren_colon
+    enumerator :: d
+  end enum
+
+  enum*8 :: Aster_colon
+    enumerator :: e
+  end enum
+
+  enum, bind(c) :: Name_colon
+    enumerator :: d
+  end enum
+
+  ! another entry to verify the parsing hasn't broken
+  real, parameter :: othervar
+
+contains
+
+  function Func(arg)
+  ! ...
+  end function Func
+
+end module Enums


Modified: tests/ctags/enumerators.f90.tags
29 files changed, 29 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1,29 @@
+# format=tagmanager
+Aster_colonÌ2ÎEnumsÖ0
+Aster_kindÌ2ÎEnumsÖ0
+BodyPartÌ2ÎEnumsÖ0
+ColonsÌ2ÎEnumsÖ0
+Enum#0Ì2ÎEnumsÖ0
+Enum#1Ì2ÎEnumsÖ0
+EnumsÌ256Ö0
+FuncÌ16ÎEnumsÖ0
+Name_colonÌ2ÎEnumsÖ0
+Paren_colonÌ2ÎEnumsÖ0
+Paren_kindÌ2ÎEnumsÖ0
+armÌ4ÎBodyPartÖ0
+bÌ4ÎParen_kindÖ0
+blueÌ4ÎEnum#0Ö0
+bronzeÌ4ÎEnum#0Ö0
+cÌ4ÎAster_kindÖ0
+dÌ4ÎName_colonÖ0
+dÌ4ÎParen_colonÖ0
+eÌ4ÎAster_colonÖ0
+goldÌ4ÎEnum#0Ö0
+legÌ4ÎBodyPartÖ0
+no_c_bindingÌ4ÎEnum#1Ö0
+othervarÌ16384ÎEnumsÖ0
+purpleÌ4ÎEnum#0Ö0
+rÌ4ÎColonsÖ0
+redÌ4ÎEnum#0Ö0
+silverÌ4ÎEnum#0Ö0
+somevarÌ16384ÎEnumsÖ0


Modified: tests/ctags/forall_module.f90.tags
2 files changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -1,5 +1,5 @@
 # format=tagmanager
 aÌ16384Îwith_forallÖ0
-sub_with_forallÌ64Îwith_forallÖ0
+sub_with_forallÌ128Îwith_forallÖ0
 twoÌ16Îwith_forallÖ0
 with_forallÌ256Ö0


Modified: tests/ctags/fortran_associate.f90.tags
2 files changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -1,5 +1,5 @@
 # format=tagmanager
 aÌ16384Îwith_associateÖ0
-do_other_stuffÌ64Îwith_associateÖ0
+do_other_stuffÌ128Îwith_associateÖ0
 do_stuffÌ16Îwith_associateÖ0
 with_associateÌ256Ö0


Modified: tests/ctags/interfaces.f90
45 files changed, 45 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1,45 @@
+module HasInterfaces
+  ! INTERFACE blocks can have names
+  ! usually only used for when overloading, but good practice anyway!
+  interface MyFunc
+    function Func1(arg)
+      integer :: arg
+    end function Func1
+
+    function Func2(arg)
+      integer :: arg
+    end function Func2
+  end interface MyFunc
+
+  ! without a name we just use a generic one
+  interface
+    subroutine CHEEV(...)
+    ! ...
+    end subroutine CHEEV
+  end interface
+
+contains
+
+  function Func1(arg)
+    integer :: arg, func1
+    func1 = arg
+  end function Func1
+
+  function Func2(arg)
+    integer :: arg, func2
+    func2 = arg
+  end function Func2
+
+end module HasInterfaces
+
+program Main
+  use HasInterfaces
+
+  ! can also occur in PROGRAMs
+  interface MySubroutine
+    subroutine Sub1(arg)
+    ! ...
+    end subroutine Sub1
+  end interface MySubroutine
+
+end program Main


Modified: tests/ctags/interfaces.f90.tags
8 files changed, 8 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1,8 @@
+# format=tagmanager
+Func1Ì16ÎHasInterfacesÖ0
+Func2Ì16ÎHasInterfacesÖ0
+HasInterfacesÌ256Ö0
+Interface#0Ì32ÎHasInterfacesÖ0
+MainÌ2048Ö0
+MyFuncÌ32ÎHasInterfacesÖ0
+MySubroutineÌ32ÎMainÖ0


Modified: tests/ctags/invalid_name.f90.tags
5 files changed, 4 insertions(+), 1 deletions(-)
===================================================================
@@ -1,5 +1,8 @@
 # format=tagmanager
+ActivityÌ64ÎDetection_RecordÖ0
 DR_FilenameÌ16384ÎTR_DetectionRecordingÖ0
 DR_LunÌ16384ÎTR_DetectionRecordingÖ0
-Detection_RecordÌ4096ÎTR_DetectionRecordingÖ0
+Detection_RecordÌ1ÎTR_DetectionRecordingÖ0
+FaceÌ64ÎDetection_RecordÖ0
 TR_DetectionRecordingÌ256Ö0
+TypeÌ64ÎDetection_RecordÖ0


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


Modified: tests/ctags/members.f90
19 files changed, 19 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1,19 @@
+module Members
+  implicit none
+
+  type HasMembers
+    ! a "derived type" in Fortran is analagous to a "class" in other languages
+    integer, kind :: kind_member
+    integer, len  :: len_member
+    integer       :: member
+  contains
+    procedure :: MyMethod
+  end type HasMembers
+
+contains
+
+  subroutine MySubroutine(arg)
+  ! ...
+  end subroutine MySubroutine
+
+end module Members


Modified: tests/ctags/members.f90.tags
8 files changed, 8 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1,8 @@
+# format=tagmanager
+HasMembersÌ1ÎMembersÖ0
+MembersÌ256Ö0
+MyMethodÌ64ÎHasMembersÖ0
+MySubroutineÌ128ÎMembersÖ0
+kind_memberÌ64ÎHasMembersÖ0
+len_memberÌ64ÎHasMembersÖ0
+memberÌ64ÎHasMembersÖ0


Modified: tests/ctags/misc_types.f.tags
2 files changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -1,4 +1,4 @@
 # format=tagmanager
 INFOOBARÌ16384ÎspecsÖ0
 MÌ16384ÎspecsÖ0
-specsÌ512Ö0
+specsÌ2048Ö0


Modified: tests/ctags/misc_types.f90.tags
6 files changed, 4 insertions(+), 2 deletions(-)
===================================================================
@@ -1,5 +1,7 @@
 # format=tagmanager
+align_second_16Ì64Îmy_structÖ0
 base_typeÌ16384ÎtestallocÖ0
+first_byteÌ64Îmy_structÖ0
 iÌ16384ÎtestallocÖ0
 i2Ì16384ÎtestallocÖ0
 i3Ì16384ÎtestallocÖ0
@@ -9,7 +11,7 @@ i6
 i7Ì16384ÎtestallocÖ0
 i8Ì16384ÎtestallocÖ0
 listÌ16384ÎtestallocÖ0
-my_structÌ4096ÎtestallocÖ0
+my_structÌ1ÎtestallocÖ0
 statusÌ16384ÎtestallocÖ0
-testallocÌ512Ö0
+testallocÌ2048Ö0
 the_structÌ16384ÎtestallocÖ0


Modified: tests/ctags/namelist.f.tags
2 files changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -1,2 +1,2 @@
 # format=tagmanager
-mainÌ512Ö0
+mainÌ2048Ö0


Modified: tests/ctags/numlib.f90.tags
1 files changed, 1 insertions(+), 0 deletions(-)
===================================================================
@@ -1,2 +1,3 @@
 # format=tagmanager
+Interface#0Ì32Înumerical_librariesÖ0
 numerical_librariesÌ256Ö0


Modified: tests/ctags/preprocessor.f90
17 files changed, 17 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1,17 @@
+#include
+! preprocessor directives on line 1 (and only line 1) cause breakage
+module Invisible
+
+  integer :: nope
+
+contains
+
+  function SpillsOutside
+  ! ...
+  end function SpillsOutside
+
+end module Invisible
+
+program Main
+! ...
+end program Main


Modified: tests/ctags/preprocessor.f90.tags
5 files changed, 5 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1,5 @@
+# format=tagmanager
+InvisibleÌ256Ö0
+MainÌ2048Ö0
+SpillsOutsideÌ16ÎInvisibleÖ0
+nopeÌ16384ÎInvisibleÖ0


Modified: tests/ctags/procedure_pointer_module.f90.tags
2 files changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -2,4 +2,4 @@
 aĚ16384Îproc_pointerÖ0
 my_pointerĚ16384Îproc_pointerÖ0
 proc_pointerĚ256Ö0
-subĚ64Îproc_pointerÖ0
+subĚ128Îproc_pointerÖ0


Modified: tests/ctags/procpoint.f90.tags
2 files changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -1,5 +1,5 @@
 # format=tagmanager
-MainÌ512Ö0
+MainÌ2048Ö0
 MyOtherProcÌ16384ÎTestÖ0
 MyProcÌ16384ÎTestÖ0
 ProcOneÌ16ÎTestÖ0


Modified: tests/ctags/qualified_types.f90
12 files changed, 12 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1,12 @@
+module test
+  implicit none
+  type goodtype(p1, p2, p3, p4) ! the stuff in brackets after the name of the type shouldn't appear in the type's name
+                                ! this is already correctly handled, so that's fine
+    integer, kind     :: p1, p3 
+    integer, len      :: p2, p4 ! the question is whether or not these "kind" and "len"s should be shown as members
+    real(kind=p1)     :: c1
+    character(len=p2) :: c2
+    complex           :: c3(p3)
+    integer           :: c4 = p1
+contains
+end module test


Modified: tests/ctags/qualified_types.f90.tags
11 files changed, 11 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1,11 @@
+# format=tagmanager
+c1フ64ホgoodtypeヨ0
+c2フ64ホgoodtypeヨ0
+c3フ64ホgoodtypeヨ0
+c4フ64ホgoodtypeヨ0
+goodtypeフ1ホtestヨ0
+p1フ64ホgoodtypeヨ0
+p2フ64ホgoodtypeヨ0
+p3フ64ホgoodtypeヨ0
+p4フ64ホgoodtypeヨ0
+testフ256ヨ0


Modified: tests/ctags/recursive.f95.tags
2 files changed, 2 insertions(+), 0 deletions(-)
===================================================================
@@ -1,4 +1,6 @@
 # format=tagmanager
+Interface#0Ì32ÎapproxÖ0
+Interface#1Ì32Îapprox2Ö0
 approxÌ256Ö0
 approx2Ì256Ö0
 partsÌ16384ÎapproxÖ0


Modified: tests/ctags/square_parens.f90.tags
8 files changed, 5 insertions(+), 3 deletions(-)
===================================================================
@@ -1,12 +1,14 @@
 # format=tagmanager
-SymmetryĚ4096ÎsquaretestÖ0
+SymmetryĚ1ÎsquaretestÖ0
 assigneeĚ16384ÎsquaretestÖ0
-executeĚ64ÎsquaretestÖ0
+executeĚ128ÎsquaretestÖ0
 invisibleĚ16384ÎsquaretestÖ0
 invisible_fourĚ16384ÎsquaretestÖ0
 invisible_threeĚ16384ÎsquaretestÖ0
 invisible_twoĚ16384ÎsquaretestÖ0
-mainĚ512Ö0
+iterationsĚ64ÎSymmetryÖ0
+mainĚ2048Ö0
+matrixĚ64ÎSymmetryÖ0
 squaretestĚ256Ö0
 stateĚ16384ÎsquaretestÖ0
 state_twoĚ16384ÎsquaretestÖ0


Modified: tests/ctags/stdcall.f.tags
4 files changed, 2 insertions(+), 2 deletions(-)
===================================================================
@@ -1,6 +1,6 @@
 # format=tagmanager
 D02CJWÌ16384Ö0
-FCNÌ64Ö0
+FCNÌ128Ö0
 GÌ16Ö0
 GÌ16384Ö0
 HÌ16384Ö0
@@ -11,7 +11,7 @@ J
 KÌ16384Ö0
 NÌ16384Ö0
 NOUTÌ16384Ö0
-OUTÌ64Ö0
+OUTÌ128Ö0
 PIÌ16384Ö0
 RELABSÌ16384Ö0
 TOLÌ16384Ö0


Modified: tests/ctags/structure.f.tags
24 files changed, 17 insertions(+), 7 deletions(-)
===================================================================
@@ -1,10 +1,20 @@
 # format=tagmanager
-initialized_structureÌ512Ö0
+Structure#0Ì1ÎnestedÖ0
+aÌ64ÎStructure#0Ö0
+cloudsÌ64ÎweatherÖ0
+dayÌ64ÎweatherÖ0
+initialized_structureÌ2048Ö0
 latestÌ16384Îinitialized_structureÖ0
 latestÌ16384Îuninitialized_structureÖ0
-nestedÌ4096ÎtopÖ0
-nested_structureÌ512Ö0
-topÌ4096Înested_structureÖ0
-uninitialized_structureÌ512Ö0
-weatherÌ4096Îinitialized_structureÖ0
-weatherÌ4096Îuninitialized_structureÖ0
+level2Ì64ÎtopÖ0
+level3aÌ64ÎnestedÖ0
+level3bÌ64ÎnestedÖ0
+monthÌ64ÎweatherÖ0
+nestedÌ1ÎtopÖ0
+nested_structureÌ2048Ö0
+rainfallÌ64ÎweatherÖ0
+topÌ1Înested_structureÖ0
+uninitialized_structureÌ2048Ö0
+weatherÌ1Îinitialized_structureÖ0
+weatherÌ1Îuninitialized_structureÖ0
+yearÌ64ÎweatherÖ0


Modified: tests/ctags/union.f.tags
8 files changed, 6 insertions(+), 2 deletions(-)
===================================================================
@@ -1,4 +1,8 @@
 # format=tagmanager
+dateÌ64ÎstartÖ0
+dayÌ64ÎstartÖ0
+monthÌ64ÎstartÖ0
 sdateÌ16384ÎwritedateÖ0
-startÌ4096ÎwritedateÖ0
-writedateÌ512Ö0
+startÌ1ÎwritedateÖ0
+writedateÌ2048Ö0
+yearÌ64ÎstartÖ0


Modified: tests/ctags/value.f.tags
2 files changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -1,4 +1,4 @@
 # format=tagmanager
 aaÌ16384ÎfigureÖ0
 figÌ16384ÎfigureÖ0
-figureÌ512Ö0
+figureÌ2048Ö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