[geany/geany] f5d315: PHP: report visibility and implementation type
Colomban Wendling
git-noreply at xxxxx
Wed Jul 3 17:41:57 UTC 2013
Branch: refs/heads/master
Author: Colomban Wendling <ban at herbesfolles.org>
Committer: Colomban Wendling <ban at herbesfolles.org>
Date: Mon, 15 Apr 2013 16:42:08 UTC
Commit: f5d315809d0f219ad0e1770e0601b8c64f552ac6
https://github.com/geany/geany/commit/f5d315809d0f219ad0e1770e0601b8c64f552ac6
Log Message:
-----------
PHP: report visibility and implementation type
Report visibility (private/protected/public) and implementation
(abstract or not) for every tag for which it makes sense.
Modified Paths:
--------------
tagmanager/ctags/php.c
Modified: tagmanager/ctags/php.c
114 files changed, 103 insertions(+), 11 deletions(-)
===================================================================
@@ -81,6 +81,19 @@
KEYWORD_xor
} keywordId;
+typedef enum {
+ ACCESS_UNDEFINED,
+ ACCESS_PRIVATE,
+ ACCESS_PROTECTED,
+ ACCESS_PUBLIC,
+ COUNT_ACCESS
+} accessType;
+
+typedef enum {
+ IMPL_UNDEFINED,
+ IMPL_ABSTRACT,
+ COUNT_IMPL
+} implType;
typedef enum {
K_CLASS,
@@ -201,6 +214,12 @@
static boolean InPhp = FALSE; /* whether we are between <? ?> */
+/* current statement details */
+struct {
+ accessType access;
+ implType impl;
+} CurrentStatement;
+
static void buildPhpKeywordHash (void)
{
@@ -213,7 +232,33 @@ static void buildPhpKeywordHash (void)
}
}
-static void initPhpEntry (tagEntryInfo *e, const tokenInfo *const token, phpKind kind)
+static const char *accessToString (const accessType access)
+{
+ static const char *const names[COUNT_ACCESS] = {
+ "undefined",
+ "private",
+ "protected",
+ "public"
+ };
+
+ Assert (access < COUNT_ACCESS);
+
+ return names[access];
+}
+
+static const char *implToString (const implType impl)
+{
+ static const char *const names[COUNT_IMPL] = {
+ "undefined",
+ "abstract"
+ };
+
+ Assert (impl < COUNT_IMPL);
+
+ return names[impl];
+}
+
+static void initPhpEntry (tagEntryInfo *e, const tokenInfo *const token, phpKind kind, accessType access)
{
initTagEntry (e, vStringValue (token->string));
@@ -222,6 +267,8 @@ static void initPhpEntry (tagEntryInfo *e, const tokenInfo *const token, phpKind
e->kindName = PhpKinds[kind].name;
e->kind = (char) PhpKinds[kind].letter;
+ if (access != ACCESS_UNDEFINED)
+ e->extensionFields.access = accessToString (access);
if (vStringLength(token->scope) > 0)
{
Assert (token->parentKind >= 0);
@@ -231,25 +278,43 @@ static void initPhpEntry (tagEntryInfo *e, const tokenInfo *const token, phpKind
}
}
-static void makeSimplePhpTag (tokenInfo *const token, phpKind kind)
+static void makeSimplePhpTag (tokenInfo *const token, phpKind kind, accessType access)
{
if (PhpKinds[kind].enabled)
{
tagEntryInfo e;
- initPhpEntry (&e, token, kind);
+ initPhpEntry (&e, token, kind, access);
makeTagEntry (&e);
}
}
-static void makeFunctionTag (tokenInfo *const token, vString *const arglist)
+static void makeClassTag (tokenInfo *const token, implType impl)
+{
+ if (PhpKinds[K_CLASS].enabled)
+ {
+ tagEntryInfo e;
+
+ initPhpEntry (&e, token, K_CLASS, ACCESS_UNDEFINED);
+
+ if (impl != IMPL_UNDEFINED)
+ e.extensionFields.implementation = implToString (impl);
+
+ makeTagEntry (&e);
+ }
+}
+
+static void makeFunctionTag (tokenInfo *const token, vString *const arglist,
+ accessType access, implType impl)
{
if (PhpKinds[K_FUNCTION].enabled)
{
tagEntryInfo e;
- initPhpEntry (&e, token, K_FUNCTION);
+ initPhpEntry (&e, token, K_FUNCTION, access);
+ if (impl != IMPL_UNDEFINED)
+ e.extensionFields.implementation = implToString (impl);
if (arglist)
e.extensionFields.arglist = vStringValue (arglist);
@@ -604,6 +669,18 @@ static void readToken (tokenInfo *const token)
}
break;
}
+
+ if (token->type == TOKEN_SEMICOLON ||
+ token->type == TOKEN_OPEN_CURLY ||
+ token->type == TOKEN_CLOSE_CURLY)
+ {
+ /* reset current statement details on statement end, and when entering
+ * a deeper scope.
+ * it is a bit ugly to do this in readToken(), but it makes everything
+ * a lot simpler. */
+ CurrentStatement.access = ACCESS_UNDEFINED;
+ CurrentStatement.impl = IMPL_UNDEFINED;
+ }
}
static void enterScope (tokenInfo *const token, vString *const scope, int parentKind);
@@ -611,6 +688,7 @@ static void readToken (tokenInfo *const token)
static boolean parseClass (tokenInfo *const token)
{
boolean readNext = TRUE;
+ implType impl = CurrentStatement.impl;
tokenInfo *name;
readToken (token);
@@ -619,7 +697,7 @@ static boolean parseClass (tokenInfo *const token)
name = newToken ();
copyToken (name, token, TRUE);
- makeSimplePhpTag (name, K_CLASS);
+ makeClassTag (name, impl);
/* skip over possible "extends FOO, BAR" */
do
@@ -642,6 +720,8 @@ static boolean parseClass (tokenInfo *const token)
static boolean parseFunction (tokenInfo *const token)
{
boolean readNext = TRUE;
+ accessType access = CurrentStatement.access;
+ implType impl = CurrentStatement.impl;
tokenInfo *name;
readToken (token);
@@ -674,7 +754,7 @@ static boolean parseFunction (tokenInfo *const token)
while (depth > 0 && c != EOF);
vStringTerminate (arglist);
- makeFunctionTag (name, arglist);
+ makeFunctionTag (name, arglist, access, impl);
vStringDelete (arglist);
readToken (token); /* normally it's an open brace */
@@ -704,7 +784,7 @@ static boolean parseConstant (tokenInfo *const token)
readToken (token);
if (token->type == TOKEN_EQUAL_SIGN)
- makeSimplePhpTag (name, K_DEFINE);
+ makeSimplePhpTag (name, K_DEFINE, ACCESS_UNDEFINED);
deleteToken (name);
@@ -726,7 +806,7 @@ static boolean parseDefine (tokenInfo *const token)
if (token->type == TOKEN_STRING ||
token->type == TOKEN_IDENTIFIER)
{
- makeSimplePhpTag (token, K_DEFINE);
+ makeSimplePhpTag (token, K_DEFINE, ACCESS_UNDEFINED);
readToken (token);
}
@@ -755,8 +835,9 @@ static boolean parseDefine (tokenInfo *const token)
* $var; */
static boolean parseVariable (tokenInfo *const token)
{
- boolean readNext = TRUE;
tokenInfo *name;
+ boolean readNext = TRUE;
+ accessType access = CurrentStatement.access;
/* don't generate variable tags inside functions */
if (token->parentKind == K_FUNCTION)
@@ -767,7 +848,7 @@ static boolean parseVariable (tokenInfo *const token)
readToken (token);
if (token->type == TOKEN_EQUAL_SIGN || token->type == TOKEN_SEMICOLON)
- makeSimplePhpTag (name, K_VARIABLE);
+ makeSimplePhpTag (name, K_VARIABLE, access);
else
readNext = FALSE;
@@ -808,6 +889,14 @@ static void enterScope (tokenInfo *const parentToken, vString *const extraScope,
case KEYWORD_function: readNext = parseFunction (token); break;
case KEYWORD_const: readNext = parseConstant (token); break;
case KEYWORD_define: readNext = parseDefine (token); break;
+
+ case KEYWORD_private: CurrentStatement.access = ACCESS_PRIVATE; break;
+ case KEYWORD_protected: CurrentStatement.access = ACCESS_PROTECTED; break;
+ case KEYWORD_public: CurrentStatement.access = ACCESS_PUBLIC; break;
+ case KEYWORD_var: CurrentStatement.access = ACCESS_PUBLIC; break;
+
+ case KEYWORD_abstract: CurrentStatement.impl = IMPL_ABSTRACT; break;
+
default: break;
}
break;
@@ -833,6 +922,9 @@ static void findPhpTags (void)
tokenInfo *const token = newToken ();
InPhp = FALSE;
+ CurrentStatement.access = ACCESS_UNDEFINED;
+ CurrentStatement.impl = IMPL_UNDEFINED;
+
do
{
enterScope (token, NULL, -1);
--------------
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