static void parseFunctionOrMethod (tokenInfo *const token) { // FunctionDecl = "func" identifier Signature [ Body ] . // Body = Block. // // MethodDecl = "func" Receiver MethodName Signature [ Body ] . // Receiver = "(" [ identifier ] [ "*" ] BaseTypeName ")" . // BaseTypeName = identifier . // Skip over receiver. readToken (token); if (isType (token, TOKEN_OPEN_PAREN)) skipToMatched (token); if (isType (token, TOKEN_IDENTIFIER)) { vString *argList; tokenInfo *functionToken = copyToken (token); // Start recording signature signature = vStringNew (); // Skip over parameters. readToken (token); skipToMatchedNoRead (token); vStringStripLeading (signature); vStringStripTrailing (signature); argList = signature; signature = vStringNew (); readToken (token); // Skip over result. skipType (token); // Remove the extra { we have just read vStringStripTrailing (signature); vStringChop (signature); vStringStripLeading (signature); vStringStripTrailing (signature); makeTag (functionToken, GOTAG_FUNCTION, NULL, GOTAG_UNDEFINED, argList->buffer, signature->buffer); deleteToken (functionToken); vStringDelete(signature); vStringDelete(argList); // Stop recording signature signature = NULL; // Skip over function body. if (isType (token, TOKEN_OPEN_CURLY)) skipToMatched (token); } }
static void matchTagPattern (const vString* const line, const regexPattern* const patbuf, const regmatch_t* const pmatch) { vString *const name = substitute (vStringValue (line), patbuf->u.tag.name_pattern, BACK_REFERENCE_COUNT, pmatch); vStringStripLeading (name); vStringStripTrailing (name); if (vStringLength (name) > 0) makeRegexTag (name, &patbuf->u.tag.kind); else error (WARNING, "%s:%ld: null expansion of name pattern \"%s\"", getInputFileName (), getInputLineNumber (), patbuf->u.tag.name_pattern); vStringDelete (name); }