static void makeSimplePhpTag (const tokenInfo *const token, const phpKind kind, const accessType access) { if (PhpKinds[kind].enabled) { tagEntryInfo e; initPhpEntry (&e, token, kind, access); makePhpTagEntry (&e); } }
static void makeClassOrIfaceTag (const phpKind kind, const tokenInfo *const token, vString *const inheritance, const implType impl) { if (PhpKinds[kind].enabled) { tagEntryInfo e; initPhpEntry (&e, token, kind, ACCESS_UNDEFINED); if (impl != IMPL_UNDEFINED) e.extensionFields.implementation = implToString (impl); if (vStringLength (inheritance) > 0) e.extensionFields.inheritance = vStringValue (inheritance); makePhpTagEntry (&e); } }
static void makeFunctionTag (const tokenInfo *const token, const vString *const arglist, const accessType access, const implType impl) { if (PhpKinds[K_FUNCTION].enabled) { tagEntryInfo e; initPhpEntry (&e, token, K_FUNCTION, access); if (impl != IMPL_UNDEFINED) e.extensionFields.implementation = implToString (impl); if (arglist) e.extensionFields.signature = vStringValue (arglist); makePhpTagEntry (&e); } }
static void makeFunctionTag (const tokenInfo *const token, const vString *const arglist, const vString *const rtype, const accessType access, const implType impl) { if (PhpKinds[K_FUNCTION].enabled) { tagEntryInfo e; initPhpEntry (&e, token, K_FUNCTION, access); if (impl != IMPL_UNDEFINED) e.extensionFields.implementation = implToString (impl); if (arglist) e.extensionFields.signature = vStringValue (arglist); if (rtype) { if ((vStringLength (rtype) == 4) && (strcmp (vStringValue (rtype), "self") == 0) && vStringLength (token->scope) > 0) { if (token->parentKind == -1) e.extensionFields.typeRef [0] = "unknown"; else e.extensionFields.typeRef [0] = PhpKinds [token->parentKind].name; e.extensionFields.typeRef [1] = vStringValue (token->scope); } else if ((vStringLength (rtype) == 6) && (strcmp (vStringValue (rtype), "parent") == 0) && (ParentClass && vStringLength (ParentClass) > 0)) { e.extensionFields.typeRef [0] = "class"; e.extensionFields.typeRef [1] = vStringValue (ParentClass); } else { e.extensionFields.typeRef [0] = "unknown"; e.extensionFields.typeRef [1] = vStringValue (rtype); } } makePhpTagEntry (&e); } }
/* parses declarations of the form * use Foo * use Foo\Bar\Class * use Foo\Bar\Class as FooBarClass * use function Foo\Bar\func * use function Foo\Bar\func as foobarfunc * use const Foo\Bar\CONST * use const Foo\Bar\CONST as FOOBARCONST * use Foo, Bar * use Foo, Bar as Baz * use Foo as Test, Bar as Baz * use Foo\{Bar, Baz as Child, Nested\Other, Even\More as Something} */ static boolean parseUse (tokenInfo *const token) { boolean readNext = FALSE; /* we can't know the use type, because class, interface and namespaces * aliases are the same, and the only difference is the referenced name's * type */ const char *refType = "unknown"; vString *refName = vStringNew (); tokenInfo *nameToken = newToken (); boolean grouped = FALSE; readToken (token); /* skip use keyword itself */ if (token->type == TOKEN_KEYWORD && (token->keyword == KEYWORD_function || token->keyword == KEYWORD_const)) { switch (token->keyword) { case KEYWORD_function: refType = PhpKinds[K_FUNCTION].name; break; case KEYWORD_const: refType = PhpKinds[K_DEFINE].name; break; default: break; /* silence compilers */ } readNext = TRUE; } if (readNext) readToken (token); readQualifiedName (token, refName, nameToken); grouped = readNext = (token->type == TOKEN_OPEN_CURLY); do { size_t refNamePrefixLength = grouped ? vStringLength (refName) : 0; /* if it's either not the first name in a comma-separated list, or we * are in a grouped alias and need to read the leaf name */ if (readNext) { readToken (token); readQualifiedName (token, refName, nameToken); } if (token->type == TOKEN_KEYWORD && token->keyword == KEYWORD_as) { readToken (token); copyToken (nameToken, token, TRUE); readToken (token); } if (nameToken->type == TOKEN_IDENTIFIER && PhpKinds[K_ALIAS].enabled) { tagEntryInfo entry; initPhpEntry (&entry, nameToken, K_ALIAS, ACCESS_UNDEFINED); entry.extensionFields.typeRef[0] = refType; entry.extensionFields.typeRef[1] = vStringValue (refName); makePhpTagEntry (&entry); } vStringTruncate (refName, refNamePrefixLength); readNext = TRUE; } while (token->type == TOKEN_COMMA); if (grouped && token->type == TOKEN_CLOSE_CURLY) readToken (token); vStringDelete (refName); deleteToken (nameToken); return (token->type == TOKEN_SEMICOLON); }