From dcfdff74de0e94d90305f0cfa42f859f43bf7c2b Mon Sep 17 00:00:00 2001 From: dudu Date: Mon, 13 Jan 2014 21:45:48 +0100 Subject: [PATCH 1/5] Make default string params show up in signature field --- php.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/php.c b/php.c index f4ccd1a..b03d034 100644 --- a/php.c +++ b/php.c @@ -1134,6 +1134,12 @@ static boolean parseFunction (tokenInfo *const token, const tokenInfo *name) case TOKEN_PERIOD: vStringPut (arglist, '.'); break; case TOKEN_SEMICOLON: vStringPut (arglist, ';'); break; case TOKEN_STRING: vStringCatS (arglist, "'...'"); break; + { + vStringCatS (arglist, "'"); + vStringCat (arglist, token->string); + vStringCatS (arglist, "'"); + break; + } case TOKEN_IDENTIFIER: case TOKEN_KEYWORD: From 4e1467cdf8cc2f27544265f7c44f31294db75ce1 Mon Sep 17 00:00:00 2001 From: dudu Date: Wed, 29 Jan 2014 22:00:55 +0100 Subject: [PATCH 2/5] Add "docblock" extension field --- entry.c | 5 +++++ entry.h | 1 + options.c | 6 ++++-- options.h | 1 + 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/entry.c b/entry.c index aad0067..61ef009 100644 --- a/entry.c +++ b/entry.c @@ -761,6 +761,11 @@ static int addExtensionFields (const tagEntryInfo *const tag) length += fprintf (TagFile.fp, "%s\tsignature:%s", sep, tag->extensionFields.signature); + if (Option.extensionFields.docblock && + tag->extensionFields.docblock != NULL) + length += fprintf (TagFile.fp, "%s\tdocblock:%s", sep, + tag->extensionFields.docblock); + return length; #undef sep } diff --git a/entry.h b/entry.h index 0ba758f..b261c57 100644 --- a/entry.h +++ b/entry.h @@ -72,6 +72,7 @@ typedef struct sTagEntryInfo { const char* inheritance; const char* scope [2]; /* value and key */ const char* signature; + const char* docblock; /* type (union/struct/etc.) and name for a variable or typedef. */ const char* typeRef [2]; /* e.g., "struct" and struct name */ diff --git a/options.c b/options.c index e0d874f..4f9b6fb 100644 --- a/options.c +++ b/options.c @@ -119,7 +119,8 @@ optionValues Option = { FALSE, /* -fields=n */ TRUE, /* -fields=s */ FALSE, /* -fields=S */ - TRUE /* -fields=t */ + TRUE, /* -fields=t */ + FALSE /* -fields=d */ }, NULL, /* -I */ FALSE, /* -a */ @@ -208,7 +209,7 @@ static optionDescription LongOptionDescription [] = { {1," --extra=[+|-]flags"}, {1," Include extra tag entries for selected information (flags: \"fq\")."}, {1," --fields=[+|-]flags"}, - {1," Include selected extension fields (flags: \"afmikKlnsStz\") [fks]."}, + {1," Include selected extension fields (flags: \"afmikKlnsStzd\") [fks]."}, {1," --file-scope=[yes|no]"}, {1," Should tags scoped only for a single file (e.g. \"static\" tags"}, {1," be included in the output [yes]?"}, @@ -859,6 +860,7 @@ static void processFieldsOption ( case 'S': field->signature = mode; break; case 'z': field->kindKey = mode; break; case 't': field->typeRef = mode; break; + case 'd': field->docblock = mode; break; default: error(WARNING, "Unsupported parameter '%c' for \"%s\" option", c, option); diff --git a/options.h b/options.h index e2467f5..ec58848 100644 --- a/options.h +++ b/options.h @@ -78,6 +78,7 @@ struct sExtFields { /* extension field content control */ boolean scope; boolean signature; boolean typeRef; + boolean docblock; }; /* This stores the command line options. From 82fa0fb6098fa9a1edd5fab0bea4738f0ac0bea7 Mon Sep 17 00:00:00 2001 From: dudu Date: Wed, 29 Jan 2014 22:08:44 +0100 Subject: [PATCH 3/5] Add docblocks support to php parser --- php.c | 122 +++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 109 insertions(+), 13 deletions(-) diff --git a/php.c b/php.c index b03d034..30a6191 100644 --- a/php.c +++ b/php.c @@ -22,6 +22,7 @@ #include "routines.h" #include "debug.h" +#include #define SCOPE_SEPARATOR "::" @@ -237,6 +238,7 @@ static boolean InPhp = FALSE; /* whether we are between */ struct { accessType access; implType impl; + vString* docblock; } CurrentStatement; /* Current namespace */ @@ -280,8 +282,32 @@ static const char *implToString (const implType impl) return names[impl]; } +static void encodeDocBlock (vString *const encoded, vString const *docblock) +{ + int i, len; + char *buff, c; + buff = vStringValue (docblock); + len = strlen (buff); + + vStringClear (encoded); + + for (i = 0; i < len; ++i) { + c = buff[i]; + if (c == '\n') + vStringCatS (encoded, "\\n"); + else if (c == '\r') + vStringCatS (encoded, "\\r"); + else if (c == '\t') + vStringCatS (encoded, "\\t"); + else + vStringPut (encoded, c); + + } + vStringTerminate (encoded); +} + static void initPhpEntry (tagEntryInfo *const e, const tokenInfo *const token, - const phpKind kind, const accessType access) + const phpKind kind, const accessType access, vString *const docblock) { static vString *fullScope = NULL; int parentKind = -1; @@ -321,6 +347,10 @@ static void initPhpEntry (tagEntryInfo *const e, const tokenInfo *const token, e->extensionFields.scope[0] = PhpKinds[parentKind].name; e->extensionFields.scope[1] = vStringValue (fullScope); } + if (vStringLength (docblock) > 0) + { + e->extensionFields.docblock = vStringValue (docblock); + } } static void makeSimplePhpTag (const tokenInfo *const token, const phpKind kind, @@ -330,7 +360,7 @@ static void makeSimplePhpTag (const tokenInfo *const token, const phpKind kind, { tagEntryInfo e; - initPhpEntry (&e, token, kind, access); + initPhpEntry (&e, token, kind, access, CurrentStatement.docblock); makeTagEntry (&e); } } @@ -359,7 +389,7 @@ static void makeClassOrIfaceTag (const phpKind kind, const tokenInfo *const toke { tagEntryInfo e; - initPhpEntry (&e, token, kind, ACCESS_UNDEFINED); + initPhpEntry (&e, token, kind, ACCESS_UNDEFINED, CurrentStatement.docblock); if (impl != IMPL_UNDEFINED) e.extensionFields.implementation = implToString (impl); @@ -378,7 +408,7 @@ static void makeFunctionTag (const tokenInfo *const token, { tagEntryInfo e; - initPhpEntry (&e, token, K_FUNCTION, access); + initPhpEntry (&e, token, K_FUNCTION, access, CurrentStatement.docblock); if (impl != IMPL_UNDEFINED) e.extensionFields.implementation = implToString (impl); @@ -514,6 +544,18 @@ static int skipToCharacter (const int c) return d; } +static int collectToCharacter (vString *const string, const int c) +{ + int d; + do + { + d = fileGetc (); + vStringPut (string, (char) d); + } while (d != EOF && d != c); + vStringTerminate (string); + return d; +} + static void parseString (vString *const string, const int delimiter) { while (TRUE) @@ -906,9 +948,24 @@ static void readToken (tokenInfo *const token) } else if (d == '*') { + boolean isDocBlock = FALSE; + int d2 = fileGetc (); + vString *docblock = NULL; + if (d2 == '*') { + isDocBlock = TRUE; + docblock = vStringNew (); + } + else + fileUngetc (d2); + + do { - c = skipToCharacter ('*'); + if (isDocBlock == FALSE) + c = skipToCharacter ('*'); + else + c = collectToCharacter (docblock, '*'); + if (c != EOF) { c = fileGetc (); @@ -918,6 +975,18 @@ static void readToken (tokenInfo *const token) fileUngetc (c); } } while (c != EOF && c != '\0'); + if (isDocBlock) { + vString *encoded = vStringNew (); + encodeDocBlock (encoded, docblock); + vStringDelete (docblock); + + vStringClear (CurrentStatement.docblock); + vStringCatS (CurrentStatement.docblock, "/**"); + vStringCat (CurrentStatement.docblock, encoded); + vStringCatS (CurrentStatement.docblock, "/"); + + vStringDelete (encoded); + } goto getNextChar; } else @@ -1393,24 +1462,49 @@ static void enterScope (tokenInfo *const parentToken, { case TOKEN_OPEN_CURLY: enterScope (token, NULL, -1); + vStringClear (CurrentStatement.docblock); break; case TOKEN_KEYWORD: switch (token->keyword) { - case KEYWORD_class: readNext = parseClassOrIface (token, K_CLASS); break; - case KEYWORD_interface: readNext = parseClassOrIface (token, K_INTERFACE); break; - case KEYWORD_trait: readNext = parseTrait (token); break; - case KEYWORD_function: readNext = parseFunction (token, NULL); break; - case KEYWORD_const: readNext = parseConstant (token); break; - case KEYWORD_define: readNext = parseDefine (token); break; + case KEYWORD_class: + readNext = parseClassOrIface (token, K_CLASS); + vStringClear (CurrentStatement.docblock); + break; + case KEYWORD_interface: + readNext = parseClassOrIface (token, K_INTERFACE); + vStringClear (CurrentStatement.docblock); + break; + case KEYWORD_trait: + readNext = parseTrait (token); + vStringClear (CurrentStatement.docblock); + break; + case KEYWORD_function: + readNext = parseFunction (token, NULL); + vStringClear (CurrentStatement.docblock); + break; + case KEYWORD_const: + readNext = parseConstant (token); + vStringClear (CurrentStatement.docblock); + break; + case KEYWORD_define: + readNext = parseDefine (token); + vStringClear (CurrentStatement.docblock); + break; - case KEYWORD_namespace: readNext = parseNamespace (token); break; + case KEYWORD_namespace: + readNext = parseNamespace (token); + vStringClear (CurrentStatement.docblock); + 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_var: + CurrentStatement.access = ACCESS_PUBLIC; + vStringClear (CurrentStatement.docblock); + break; case KEYWORD_abstract: CurrentStatement.impl = IMPL_ABSTRACT; break; @@ -1420,6 +1514,7 @@ static void enterScope (tokenInfo *const parentToken, case TOKEN_VARIABLE: readNext = parseVariable (token); + vStringClear (CurrentStatement.docblock); break; default: break; @@ -1441,6 +1536,7 @@ static void findPhpTags (void) InPhp = FALSE; CurrentStatement.access = ACCESS_UNDEFINED; CurrentStatement.impl = IMPL_UNDEFINED; + CurrentStatement.docblock = vStringNew (); CurrentNamesapce = vStringNew (); do From a1d7171ca36254eec242a1629c895bbe8e4809c0 Mon Sep 17 00:00:00 2001 From: dudu Date: Mon, 29 Sep 2014 22:05:19 +0200 Subject: [PATCH 4/5] Fix namespace tag's command fields The command field for the namespace tags was containing the previous line from the file because I've forgot to delete old code for function parameter's default value. --- php.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/php.c b/php.c index 30a6191..48353dc 100644 --- a/php.c +++ b/php.c @@ -403,7 +403,7 @@ static void makeClassOrIfaceTag (const phpKind kind, const tokenInfo *const toke static void makeFunctionTag (const tokenInfo *const token, const vString *const arglist, const accessType access, const implType impl) -{ +{ if (PhpKinds[K_FUNCTION].enabled) { tagEntryInfo e; @@ -715,7 +715,7 @@ static int skipWhitespaces (int c) } /* - * + * * This is ugly, but the whole "