SF.net SVN: geany: [1952] trunk
ntrel at users.sourceforge.net
ntrel at xxxxx
Wed Oct 17 11:56:03 UTC 2007
Revision: 1952
http://geany.svn.sourceforge.net/geany/?rev=1952&view=rev
Author: ntrel
Date: 2007-10-17 04:55:59 -0700 (Wed, 17 Oct 2007)
Log Message:
-----------
Parse arrays, const and pointers in C-like function return types
(and store in varType).
Fix some indentation.
Modified Paths:
--------------
trunk/ChangeLog
trunk/TODO
trunk/tagmanager/c.c
trunk/tagmanager/tm_tag.c
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2007-10-17 11:48:42 UTC (rev 1951)
+++ trunk/ChangeLog 2007-10-17 11:55:59 UTC (rev 1952)
@@ -1,3 +1,11 @@
+2007-10-17 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
+
+ * tagmanager/tm_tag.c, tagmanager/c.c, TODO:
+ Parse arrays, const and pointers in C-like function return types
+ (and store in varType).
+ Fix some indentation.
+
+
2007-10-16 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
* geany.glade, src/callbacks.c, src/callbacks.h, src/interface.c:
Modified: trunk/TODO
===================================================================
--- trunk/TODO 2007-10-17 11:48:42 UTC (rev 1951)
+++ trunk/TODO 2007-10-17 11:55:59 UTC (rev 1952)
@@ -8,8 +8,6 @@
Next version or later:
- o make calltips show full function signature for C-like files (e.g.
- return type with const, [] for D, etc.)
o documentation: list and explain filetype modes
o documentation: preferences
o line breaking mode to limit words on a line for e.g. XML content.
Modified: trunk/tagmanager/c.c
===================================================================
--- trunk/tagmanager/c.c 2007-10-17 11:48:42 UTC (rev 1951)
+++ trunk/tagmanager/c.c 2007-10-17 11:55:59 UTC (rev 1952)
@@ -45,7 +45,7 @@
* DATA DECLARATIONS
*/
-enum { NumTokens = 8 };
+enum { NumTokens = 12 };
typedef enum eException {
ExceptionNone, ExceptionEOF, ExceptionFormattingError,
@@ -114,7 +114,8 @@
TOKEN_PAREN_NAME, /* a single name in parentheses */
TOKEN_SEMICOLON, /* the semicolon character */
TOKEN_SPEC, /* a storage class specifier, qualifier, type, etc. */
- TOKEN_STAR, /* pointer detection */
+ TOKEN_STAR, /* pointer detection */
+ TOKEN_ARRAY, /* array detection */
TOKEN_COUNT
} tokenType;
@@ -432,6 +433,7 @@
*/
static void createTags (const unsigned int nestLevel, statementInfo *const parent);
static void copyToken (tokenInfo *const dest, const tokenInfo *const src);
+static const char *getVarType (const statementInfo *const st);
/*
* FUNCTION DEFINITIONS
@@ -441,7 +443,7 @@
#if DEBUG_C
static char *tokenTypeName[] = {
"none", "args", "'}'", "'{'", "','", "'::'", "keyword", "name",
- "package", "paren-name", "';'", "spec", "*","count"
+ "package", "paren-name", "';'", "spec", "*", "[]", "count"
};
static char *tagScopeNames[] = {
@@ -608,7 +610,7 @@
{
static const char *const names [] = {
"none", "args", "}", "{", "comma", "double colon", "keyword", "name",
- "package", "paren-name", "semicolon", "specifier", "*","count"
+ "package", "paren-name", "semicolon", "specifier", "*", "[]", "count"
};
Assert (sizeof (names) / sizeof (names [0]) == TOKEN_COUNT);
Assert ((int) type < TOKEN_COUNT);
@@ -1074,10 +1076,50 @@
{
if (((TOKEN_NAME == st->firstToken->type) || isDataTypeKeyword(st->firstToken))
&& (0 != strcmp(vStringValue(st->firstToken->name), tag->name)))
- tag->extensionFields.varType = vStringValue(st->firstToken->name);
+ tag->extensionFields.varType = getVarType(st);
}
}
+static const char *getVarType (const statementInfo *const st)
+{
+ static vString *vt = NULL;
+ unsigned int i;
+
+ if (! st->gotArgs)
+ return vStringValue(st->firstToken->name); /* ignore non-functions */
+
+ if (vt == NULL)
+ vt = vStringNew();
+ else
+ vStringClear(vt);
+
+ for (i = 0; i < st->tokenIndex; i++)
+ {
+ tokenInfo *t = st->token[i];
+
+ switch (t->type)
+ {
+ case TOKEN_NAME: /* user typename */
+ if (strcmp(vStringValue(t->name), vStringValue(st->firstToken->name)) != 0)
+ continue;
+ break;
+ case TOKEN_KEYWORD:
+ if (t->keyword != KEYWORD_EXTERN && t->keyword != KEYWORD_STATIC) /* uninteresting keywords */
+ break;
+ continue;
+ case TOKEN_STAR: vStringCatS(vt, " *"); continue;
+ case TOKEN_ARRAY: vStringCatS(vt, "[]"); continue;
+ default: continue;
+ }
+ if (vStringLength(vt) > 0)
+ if (isalpha(vStringValue(vt)[vStringLength(vt) - 1]))
+ vStringPut(vt, ' ');
+ vStringCat(vt, t->name);
+ }
+ vStringTerminate(vt);
+ return vStringValue(vt);
+}
+
static void addContextSeparator (vString *const scope)
{
if (isLanguage (Lang_c) || isLanguage (Lang_cpp))
@@ -1251,13 +1293,13 @@
{
if (isType (nameToken, TOKEN_NAME))
{
- const tagType type = (isLanguage (Lang_java) || isLanguage (Lang_csharp))
- ? TAG_METHOD : TAG_FUNCTION;
- const boolean isFileScope =
- (boolean) (st->member.access == ACCESS_PRIVATE ||
- (!isMember (st) && st->scope == SCOPE_STATIC));
+ const tagType type = (isLanguage (Lang_java) || isLanguage (Lang_csharp))
+ ? TAG_METHOD : TAG_FUNCTION;
+ const boolean isFileScope =
+ (boolean) (st->member.access == ACCESS_PRIVATE ||
+ (!isMember (st) && st->scope == SCOPE_STATIC));
- makeTag (nameToken, st, isFileScope, type);
+ makeTag (nameToken, st, isFileScope, type);
}
}
@@ -1265,7 +1307,7 @@
const tokenInfo *const nameToken)
{
if (! isType (nameToken, TOKEN_NAME))
- ;
+ ;
else if (isLanguage (Lang_java) || isLanguage (Lang_csharp))
qualifyFunctionTag (st, nameToken);
else if (st->scope == SCOPE_TYPEDEF)
@@ -2413,7 +2455,7 @@
case ';': setToken (st, TOKEN_SEMICOLON); break;
case '<': skipToMatch ("<>"); break;
case '=': processInitializer (st); break;
- case '[': skipToMatch ("[]"); break;
+ case '[': setToken (st, TOKEN_ARRAY); skipToMatch ("[]"); break;
case '{': setToken (st, TOKEN_BRACE_OPEN); break;
case '}': setToken (st, TOKEN_BRACE_CLOSE); break;
default: parseGeneralToken (st, c); break;
@@ -2581,73 +2623,73 @@
case TOKEN_BRACE_OPEN:
if (isType (prev, TOKEN_ARGS))
{
- if (st->haveQualifyingName)
- {
- st->declaration = DECL_FUNCTION;
- if (isType (prev2, TOKEN_NAME))
- copyToken (st->blockName, prev2);
+ if (st->haveQualifyingName)
+ {
+ st->declaration = DECL_FUNCTION;
+ if (isType (prev2, TOKEN_NAME))
+ copyToken (st->blockName, prev2);
- if (!isLanguage (Lang_java))
- {
- ((tokenInfo *)prev2)->pointerOrder = getTokenPointerOrder (st, 3);
- }
- qualifyFunctionTag (st, prev2);
- }
+ if (!isLanguage (Lang_java))
+ {
+ ((tokenInfo *)prev2)->pointerOrder = getTokenPointerOrder (st, 3);
+ }
+ qualifyFunctionTag (st, prev2);
+ }
}
else if (isContextualStatement (st))
{
- tokenInfo *name_token = (tokenInfo *)prev;
- if (isType (name_token, TOKEN_NAME))
- {
- copyToken (st->blockName, name_token);
- }
- else if (isLanguage (Lang_csharp))
- makeTag (prev, st, FALSE, TAG_PROPERTY);
- else
- {
- tokenInfo *contextual_token = (tokenInfo *)prev;
- if(isContextualKeyword (contextual_token))
- {
- char buffer[64];
+ tokenInfo *name_token = (tokenInfo *)prev;
+ if (isType (name_token, TOKEN_NAME))
+ {
+ copyToken (st->blockName, name_token);
+ }
+ else if (isLanguage (Lang_csharp))
+ makeTag (prev, st, FALSE, TAG_PROPERTY);
+ else
+ {
+ tokenInfo *contextual_token = (tokenInfo *)prev;
+ if(isContextualKeyword (contextual_token))
+ {
+ char buffer[64];
- name_token = newToken ();
- copyToken (name_token, contextual_token);
+ name_token = newToken ();
+ copyToken (name_token, contextual_token);
- sprintf(buffer, "anon_%s_%d", name_token->name->buffer, contextual_fake_count++);
- vStringClear(name_token->name);
- vStringCatS(name_token->name, buffer);
+ sprintf(buffer, "anon_%s_%d", name_token->name->buffer, contextual_fake_count++);
+ vStringClear(name_token->name);
+ vStringCatS(name_token->name, buffer);
- name_token->type = TOKEN_NAME;
- name_token->keyword = KEYWORD_NONE;
+ name_token->type = TOKEN_NAME;
+ name_token->keyword = KEYWORD_NONE;
- advanceToken (st);
- contextual_token = activeToken (st);
- copyToken (contextual_token, token);
- copyToken ((tokenInfo *const)token, name_token);
- copyToken (st->blockName, name_token);
- copyToken (st->firstToken, name_token);
- }
- }
- qualifyBlockTag (st, name_token);
+ advanceToken (st);
+ contextual_token = activeToken (st);
+ copyToken (contextual_token, token);
+ copyToken ((tokenInfo *const)token, name_token);
+ copyToken (st->blockName, name_token);
+ copyToken (st->firstToken, name_token);
+ }
+ }
+ qualifyBlockTag (st, name_token);
}
break;
case TOKEN_SEMICOLON:
case TOKEN_COMMA:
if (insideEnumBody (st))
- ;
+ ;
else if (isType (prev, TOKEN_NAME))
{
- if (isContextualKeyword (prev2))
- makeTag (prev, st, TRUE, TAG_EXTERN_VAR);
- else
- {
- if (!isLanguage (Lang_java))
- {
- ((tokenInfo *)prev)->pointerOrder = getTokenPointerOrder (st, 2);
- }
- qualifyVariableTag (st, prev);
+ if (isContextualKeyword (prev2))
+ makeTag (prev, st, TRUE, TAG_EXTERN_VAR);
+ else
+ {
+ if (!isLanguage (Lang_java))
+ {
+ ((tokenInfo *)prev)->pointerOrder = getTokenPointerOrder (st, 2);
+ }
+ qualifyVariableTag (st, prev);
+ }
}
- }
else if (isType (prev, TOKEN_ARGS) && isType (prev2, TOKEN_NAME))
{
if (!isLanguage (Lang_java))
Modified: trunk/tagmanager/tm_tag.c
===================================================================
--- trunk/tagmanager/tm_tag.c 2007-10-17 11:48:42 UTC (rev 1951)
+++ trunk/tagmanager/tm_tag.c 2007-10-17 11:55:59 UTC (rev 1952)
@@ -137,7 +137,7 @@
tag->name = g_strdup(tag_entry->name);
tag->type = get_tag_type(tag_entry->kindName);
tag->atts.entry.local = tag_entry->isFileScope;
- tag->atts.entry.pointerOrder = tag_entry->pointerOrder;
+ tag->atts.entry.pointerOrder = 0; /* backward compatibility (use var_type instead) */
tag->atts.entry.line = tag_entry->lineNumber;
if (NULL != tag_entry->extensionFields.arglist)
tag->atts.entry.arglist = g_strdup(tag_entry->extensionFields.arglist);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Commits
mailing list