Skip to content
Browse files

Merge branch 'fortran/improvements'

  • Loading branch information...
2 parents 26d2ef8 + 5965b5e commit 8930ba80eb7a5fb2c489772fa37fc269202ba2d3 @b4n b4n committed Feb 23, 2014
Showing with 644 additions and 93 deletions.
  1. +1 −1 data/filetypes.fortran
  2. +5 −3 src/symbols.c
  3. +152 −48 tagmanager/ctags/fortran.c
  4. +8 −0 tests/ctags/Makefile.am
  5. +5 −1 tests/ctags/array-spec.f90.tags
  6. +1 −1 tests/ctags/auto.f.tags
  7. +51 −0 tests/ctags/block.f90
  8. +7 −0 tests/ctags/block.f90.tags
  9. +4 −3 tests/ctags/bug565813.f90.tags
  10. +1 −1 tests/ctags/bug670433.f90.tags
  11. +3 −3 tests/ctags/bug726712.f90.tags
  12. +8 −3 tests/ctags/bug734933.f90.tags
  13. +1 −1 tests/ctags/bug858165.f90.tags
  14. +1 −1 tests/ctags/bug877956.f90.tags
  15. +1 −1 tests/ctags/byte.f.tags
  16. +1 −1 tests/ctags/common.f.tags
  17. +1 −1 tests/ctags/debian_432872.f90.tags
  18. +52 −0 tests/ctags/enum.f90
  19. +48 −0 tests/ctags/enum.f90.tags
  20. +55 −0 tests/ctags/enumerators.f90
  21. +29 −0 tests/ctags/enumerators.f90.tags
  22. +1 −1 tests/ctags/forall_module.f90.tags
  23. +1 −1 tests/ctags/fortran_associate.f90.tags
  24. +45 −0 tests/ctags/interfaces.f90
  25. +8 −0 tests/ctags/interfaces.f90.tags
  26. +4 −1 tests/ctags/invalid_name.f90.tags
  27. +28 −0 tests/ctags/keyword_names.f90
  28. +8 −0 tests/ctags/keyword_names.f90.tags
  29. +19 −0 tests/ctags/members.f90
  30. +8 −0 tests/ctags/members.f90.tags
  31. +1 −1 tests/ctags/misc_types.f.tags
  32. +4 −2 tests/ctags/misc_types.f90.tags
  33. +1 −1 tests/ctags/namelist.f.tags
  34. +1 −0 tests/ctags/numlib.f90.tags
  35. +17 −0 tests/ctags/preprocessor.f90
  36. +5 −0 tests/ctags/preprocessor.f90.tags
  37. +1 −1 tests/ctags/procedure_pointer_module.f90.tags
  38. +1 −1 tests/ctags/procpoint.f90.tags
  39. +12 −0 tests/ctags/qualified_types.f90
  40. +11 −0 tests/ctags/qualified_types.f90.tags
  41. +2 −0 tests/ctags/recursive.f95.tags
  42. +5 −3 tests/ctags/square_parens.f90.tags
  43. +2 −2 tests/ctags/stdcall.f.tags
  44. +17 −7 tests/ctags/structure.f.tags
  45. +6 −2 tests/ctags/union.f.tags
  46. +1 −1 tests/ctags/value.f.tags
View
2 data/filetypes.fortran
@@ -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
View
8 src/symbols.c
@@ -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;
View
200 tagmanager/ctags/fortran.c
@@ -65,6 +65,7 @@ typedef enum eKeywordId {
KEYWORD_assignment,
KEYWORD_associate,
KEYWORD_automatic,
+ KEYWORD_bind,
KEYWORD_block,
KEYWORD_byte,
KEYWORD_cexternal,
@@ -83,6 +84,8 @@ typedef enum eKeywordId {
KEYWORD_elemental,
KEYWORD_end,
KEYWORD_entry,
+ KEYWORD_enum,
+ KEYWORD_enumerator,
KEYWORD_equivalence,
KEYWORD_extends,
KEYWORD_external,
@@ -97,6 +100,8 @@ typedef enum eKeywordId {
KEYWORD_intent,
KEYWORD_interface,
KEYWORD_intrinsic,
+ KEYWORD_kind,
+ KEYWORD_len,
KEYWORD_logical,
KEYWORD_map,
KEYWORD_module,
@@ -178,6 +183,8 @@ typedef enum eTagType {
TAG_SUBROUTINE,
TAG_DERIVED_TYPE,
TAG_VARIABLE,
+ TAG_ENUM,
+ TAG_ENUMERATOR,
TAG_COUNT /* must be last */
} tagType;
@@ -203,23 +210,27 @@ static unsigned int Column = 0;
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 [] = {
{ TRUE, 'b', "block data", "block data"},
{ 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 @@ static const keywordDesc FortranKeywordTable [] = {
{ "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 @@ static const keywordDesc FortranKeywordTable [] = {
{ "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 @@ static const keywordDesc FortranKeywordTable [] = {
{ "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,24 +755,24 @@ 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 == '&')
c = fileGetc ();
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;
View
8 tests/ctags/Makefile.am
@@ -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 \
View
6 tests/ctags/array-spec.f90.tags
@@ -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
View
2 tests/ctags/auto.f.tags
@@ -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
View
51 tests/ctags/block.f90
@@ -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
View
7 tests/ctags/block.f90.tags
@@ -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
View
7 tests/ctags/bug565813.f90.tags
@@ -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
View
2 tests/ctags/bug670433.f90.tags
@@ -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
View
6 tests/ctags/bug726712.f90.tags
@@ -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
View
11 tests/ctags/bug734933.f90.tags
@@ -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
View
2 tests/ctags/bug858165.f90.tags
@@ -3,4 +3,4 @@ a
b�16384�test�0
c�16384�test�0
d�16384�test�0
-test�512�0
+test�2048�0
View
2 tests/ctags/bug877956.f90.tags
@@ -1,4 +1,4 @@
# format=tagmanager
c2�16384�test�0
cm1�16384�test�0
-test�512�0
+test�2048�0
View
2 tests/ctags/byte.f.tags
@@ -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
View
2 tests/ctags/common.f.tags
@@ -2,4 +2,4 @@
common1�65536�main�0
common2�65536�main�0
common3�65536�main�0
-main�512�0
+main�2048�0
View
2 tests/ctags/debian_432872.f90.tags
@@ -1,3 +1,3 @@
# format=tagmanager
FOO�256�0
-FOO�64�FOO�0
+FOO�128�FOO�0
View
52 tests/ctags/enum.f90
@@ -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
View
48 tests/ctags/enum.f90.tags
@@ -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
View
55 tests/ctags/enumerators.f90
@@ -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
View
29 tests/ctags/enumerators.f90.tags
@@ -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
View
2 tests/ctags/forall_module.f90.tags
@@ -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
View
2 tests/ctags/fortran_associate.f90.tags
@@ -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
View
45 tests/ctags/interfaces.f90
@@ -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
View
8 tests/ctags/interfaces.f90.tags
@@ -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
View
5 tests/ctags/invalid_name.f90.tags
@@ -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
View
28 tests/ctags/keyword_names.f90
@@ -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
View
8 tests/ctags/keyword_names.f90.tags
@@ -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
View
19 tests/ctags/members.f90
@@ -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
View
8 tests/ctags/members.f90.tags
@@ -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
View
2 tests/ctags/misc_types.f.tags
@@ -1,4 +1,4 @@
# format=tagmanager
INFOOBAR�16384�specs�0
M�16384�specs�0
-specs�512�0
+specs�2048�0
View
6 tests/ctags/misc_types.f90.tags
@@ -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
View
2 tests/ctags/namelist.f.tags
@@ -1,2 +1,2 @@
# format=tagmanager
-main�512�0
+main�2048�0
View
1 tests/ctags/numlib.f90.tags
@@ -1,2 +1,3 @@
# format=tagmanager
+Interface#0�32�numerical_libraries�0
numerical_libraries�256�0
View
17 tests/ctags/preprocessor.f90
@@ -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
View
5 tests/ctags/preprocessor.f90.tags
@@ -0,0 +1,5 @@
+# format=tagmanager
+Invisible�256�0
+Main�2048�0
+SpillsOutside�16�Invisible�0
+nope�16384�Invisible�0
View
2 tests/ctags/procedure_pointer_module.f90.tags
@@ -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
View
2 tests/ctags/procpoint.f90.tags
@@ -1,5 +1,5 @@
# format=tagmanager
-Main�512�0
+Main�2048�0
MyOtherProc�16384�Test�0
MyProc�16384�Test�0
ProcOne�16�Test�0
View
12 tests/ctags/qualified_types.f90
@@ -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
View
11 tests/ctags/qualified_types.f90.tags
@@ -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
View
2 tests/ctags/recursive.f95.tags
@@ -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
View
8 tests/ctags/square_parens.f90.tags
@@ -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
View
4 tests/ctags/stdcall.f.tags
@@ -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
View
24 tests/ctags/structure.f.tags
@@ -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
View
8 tests/ctags/union.f.tags
@@ -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
View
2 tests/ctags/value.f.tags
@@ -1,4 +1,4 @@
# format=tagmanager
aa�16384�figure�0
fig�16384�figure�0
-figure�512�0
+figure�2048�0

0 comments on commit 8930ba8

Please sign in to comment.
Something went wrong with that request. Please try again.