Branch: refs/heads/master Author: Colomban Wendling ban@herbesfolles.org Committer: Colomban Wendling ban@herbesfolles.org Date: Sun, 23 Feb 2014 19:02:55 UTC Commit: ef4c72501e0f8532e31a9fac91a3a29c3e078ce4 https://github.com/geany/geany/commit/ef4c72501e0f8532e31a9fac91a3a29c3e078c...
Log Message: ----------- Fortran: generate fake tags for anonymous structures, interfaces and enums
This allows both to show those anonymous elements, as well as giving a parent to their children, fixing display in the symbols tree.
Modified Paths: -------------- src/symbols.c tagmanager/ctags/fortran.c tests/ctags/enum.f90.tags tests/ctags/enumerators.f90.tags tests/ctags/numlib.f90.tags tests/ctags/recursive.f95.tags tests/ctags/structure.f.tags
Modified: src/symbols.c 1 files changed, 1 insertions(+), 0 deletions(-) =================================================================== @@ -979,6 +979,7 @@ static void add_top_level_items(GeanyDocument *doc) &(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 38 files changed, 22 insertions(+), 16 deletions(-) =================================================================== @@ -208,6 +208,7 @@ static boolean FreeSourceForm = FALSE; static boolean ParsingString; static tokenInfo *Parent = NULL; +static unsigned int contextual_fake_count = 0;
/* indexed by tagType */ static kindOption FortranKinds [] = { @@ -378,8 +379,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_ENUM) + token->tag != TAG_UNDEFINED) result = token; } return result; @@ -456,6 +456,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) @@ -1593,7 +1603,7 @@ 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) && @@ -1601,17 +1611,16 @@ static void parseStructureStmt (tokenInfo *const token) { /* read structure name */ readToken (token); if (isType (token, TOKEN_IDENTIFIER)) - makeFortranTag (token, TAG_DERIVED_TYPE); - name = newTokenFrom (token); + name = newTokenFrom (token); 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); @@ -1770,7 +1779,6 @@ static void parseInterfaceBlock (tokenInfo *const token) readToken (token); if (isType (token, TOKEN_IDENTIFIER)) { - makeFortranTag (token, TAG_INTERFACE); name = newTokenFrom (token); } else if (isKeyword (token, KEYWORD_assignment) || @@ -1780,17 +1788,15 @@ static void parseInterfaceBlock (tokenInfo *const token) if (isType (token, TOKEN_PAREN_OPEN)) readToken (token); if (isType (token, TOKEN_OPERATOR)) - { - makeFortranTag (token, TAG_INTERFACE); name = newTokenFrom (token); - } } 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)) { @@ -1842,12 +1848,11 @@ static void parseEnumBlock (tokenInfo *const token) name = newTokenFrom (token); if (name == NULL) { - name = newToken (); + name = newAnonTokenFrom (token, "Enum"); name->type = TOKEN_IDENTIFIER; name->tag = TAG_ENUM; } - else - makeFortranTag (name, TAG_ENUM); + makeFortranTag (name, TAG_ENUM); skipToNextStatement (token); ancestorPush (name); while (! isKeyword (token, KEYWORD_end)) @@ -2282,6 +2287,7 @@ static boolean findFortranTags (const unsigned int passCount) Parent = newToken (); token = newToken (); FreeSourceForm = (boolean) (passCount > 1); + contextual_fake_count = 0; Column = 0; exception = (exception_t) setjmp (Exception); if (exception == ExceptionEOF)
Modified: tests/ctags/enum.f90.tags 70 files changed, 36 insertions(+), 34 deletions(-) =================================================================== @@ -1,6 +1,8 @@ # 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 @@ -8,39 +10,39 @@ Named4 Named5Ì2ÎConstantsÖ0 Named6Ì2ÎConstantsÖ0 Named7Ì2ÎConstantsÖ0 -aÌ4ÎConstantsÖ0 -bÌ4ÎConstantsÖ0 -blackÌ4ÎConstantsÖ0 -blueÌ4ÎConstantsÖ0 -bronzeÌ4ÎConstantsÖ0 -cÌ4ÎConstantsÖ0 -goldÌ4Î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ÎConstantsÖ0 +lavenderÌ4ÎEnum#0Ö0 piÌ16384ÎConstantsÖ0 -pinkÌ4ÎConstantsÖ0 -purpleÌ4ÎConstantsÖ0 -redÌ4ÎConstantsÖ0 -silverÌ4ÎConstantsÖ0 -x1Ì4ÎConstantsÖ0 -x2Ì4ÎConstantsÖ0 -x3Ì4ÎConstantsÖ0 -x4Ì4ÎConstantsÖ0 -x5Ì4ÎConstantsÖ0 -x6Ì4ÎConstantsÖ0 -x7Ì4ÎConstantsÖ0 -y1Ì4ÎConstantsÖ0 -y2Ì4ÎConstantsÖ0 -y3Ì4ÎConstantsÖ0 -y4Ì4ÎConstantsÖ0 -y5Ì4ÎConstantsÖ0 -y6Ì4ÎConstantsÖ0 -y7Ì4ÎConstantsÖ0 -yellowÌ4ÎConstantsÖ0 -z1Ì4ÎConstantsÖ0 -z2Ì4ÎConstantsÖ0 -z3Ì4ÎConstantsÖ0 -z4Ì4ÎConstantsÖ0 -z5Ì4ÎConstantsÖ0 -z6Ì4ÎConstantsÖ0 -z7Ì4Î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.tags 31 files changed, 17 insertions(+), 14 deletions(-) =================================================================== @@ -3,24 +3,27 @@ Aster_colon 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ÎEnumsÖ0 -bÌ4ÎEnumsÖ0 -blueÌ4ÎEnumsÖ0 -bronzeÌ4ÎEnumsÖ0 -cÌ4ÎEnumsÖ0 -dÌ4ÎEnumsÖ0 -eÌ4ÎEnumsÖ0 -goldÌ4ÎEnumsÖ0 -legÌ4ÎEnumsÖ0 -no_c_bindingÌ4Î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ÎEnumsÖ0 -rÌ4ÎEnumsÖ0 -redÌ4ÎEnumsÖ0 -silverÌ4Î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/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/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/structure.f.tags 3 files changed, 2 insertions(+), 1 deletions(-) =================================================================== @@ -1,5 +1,6 @@ # format=tagmanager -aÌ64ÎanonymousÖ0 +Structure#0Ì1ÎnestedÖ0 +aÌ64ÎStructure#0Ö0 cloudsÌ64ÎweatherÖ0 dayÌ64ÎweatherÖ0 initialized_structureÌ2048Ö0
-------------- This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).