Fix variable initialisation problem in objc parser, causing erroneous
parsing of second file. Patch sent by Lars C. Hassing git-svn-id: svn://svn.code.sf.net/p/ctags/code/trunk@788 c5d04d22-be80-434c-894e-aa346cc9e8e8
This commit is contained in:
parent
8c3b2e6ab9
commit
98a8c332ef
65
objc.c
65
objc.c
|
@ -508,22 +508,22 @@ static void tillTokenOrFallBack (vString * const UNUSED (ident), objcToken what)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int ignoreBalanced_count = 0;
|
||||||
static void ignoreBalanced (vString * const UNUSED (ident), objcToken what)
|
static void ignoreBalanced (vString * const UNUSED (ident), objcToken what)
|
||||||
{
|
{
|
||||||
static int count = 0;
|
|
||||||
|
|
||||||
switch (what)
|
switch (what)
|
||||||
{
|
{
|
||||||
case Tok_PARL:
|
case Tok_PARL:
|
||||||
case Tok_CurlL:
|
case Tok_CurlL:
|
||||||
case Tok_SQUAREL:
|
case Tok_SQUAREL:
|
||||||
count++;
|
ignoreBalanced_count++;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Tok_PARR:
|
case Tok_PARR:
|
||||||
case Tok_CurlR:
|
case Tok_CurlR:
|
||||||
case Tok_SQUARER:
|
case Tok_SQUARER:
|
||||||
count--;
|
ignoreBalanced_count--;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -531,7 +531,7 @@ static void ignoreBalanced (vString * const UNUSED (ident), objcToken what)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (count == 0)
|
if (ignoreBalanced_count == 0)
|
||||||
toDoNext = comeAfter;
|
toDoNext = comeAfter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -818,22 +818,21 @@ static void parseStructMembers (vString * const ident, objcToken what)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called just after the struct keyword */
|
/* Called just after the struct keyword */
|
||||||
|
static boolean parseStruct_gotName = FALSE;
|
||||||
static void parseStruct (vString * const ident, objcToken what)
|
static void parseStruct (vString * const ident, objcToken what)
|
||||||
{
|
{
|
||||||
static boolean gotName = FALSE;
|
|
||||||
|
|
||||||
switch (what)
|
switch (what)
|
||||||
{
|
{
|
||||||
case ObjcIDENTIFIER:
|
case ObjcIDENTIFIER:
|
||||||
if (!gotName)
|
if (!parseStruct_gotName)
|
||||||
{
|
{
|
||||||
addTag (ident, K_STRUCT);
|
addTag (ident, K_STRUCT);
|
||||||
pushEnclosingContext (ident, K_STRUCT);
|
pushEnclosingContext (ident, K_STRUCT);
|
||||||
gotName = TRUE;
|
parseStruct_gotName = TRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
gotName = FALSE;
|
parseStruct_gotName = FALSE;
|
||||||
popEnclosingContext ();
|
popEnclosingContext ();
|
||||||
toDoNext = comeAfter;
|
toDoNext = comeAfter;
|
||||||
comeAfter (ident, what);
|
comeAfter (ident, what);
|
||||||
|
@ -847,7 +846,7 @@ static void parseStruct (vString * const ident, objcToken what)
|
||||||
/* maybe it was just a forward declaration
|
/* maybe it was just a forward declaration
|
||||||
* in which case, we pop the context */
|
* in which case, we pop the context */
|
||||||
case Tok_semi:
|
case Tok_semi:
|
||||||
if (gotName)
|
if (parseStruct_gotName)
|
||||||
popEnclosingContext ();
|
popEnclosingContext ();
|
||||||
|
|
||||||
toDoNext = comeAfter;
|
toDoNext = comeAfter;
|
||||||
|
@ -861,21 +860,20 @@ static void parseStruct (vString * const ident, objcToken what)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Parse enumeration members, ignoring potential initialization */
|
/* Parse enumeration members, ignoring potential initialization */
|
||||||
|
static parseNext parseEnumFields_prev = NULL;
|
||||||
static void parseEnumFields (vString * const ident, objcToken what)
|
static void parseEnumFields (vString * const ident, objcToken what)
|
||||||
{
|
{
|
||||||
static parseNext prev = NULL;
|
if (parseEnumFields_prev != NULL)
|
||||||
|
|
||||||
if (prev != NULL)
|
|
||||||
{
|
{
|
||||||
comeAfter = prev;
|
comeAfter = parseEnumFields_prev;
|
||||||
prev = NULL;
|
parseEnumFields_prev = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (what)
|
switch (what)
|
||||||
{
|
{
|
||||||
case ObjcIDENTIFIER:
|
case ObjcIDENTIFIER:
|
||||||
addTag (ident, K_ENUM);
|
addTag (ident, K_ENUM);
|
||||||
prev = comeAfter;
|
parseEnumFields_prev = comeAfter;
|
||||||
waitedToken = Tok_COMA;
|
waitedToken = Tok_COMA;
|
||||||
/* last item might not have a coma */
|
/* last item might not have a coma */
|
||||||
fallBackToken = Tok_CurlR;
|
fallBackToken = Tok_CurlR;
|
||||||
|
@ -896,22 +894,21 @@ static void parseEnumFields (vString * const ident, objcToken what)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* parse enum ... { ... */
|
/* parse enum ... { ... */
|
||||||
|
static boolean parseEnum_named = FALSE;
|
||||||
static void parseEnum (vString * const ident, objcToken what)
|
static void parseEnum (vString * const ident, objcToken what)
|
||||||
{
|
{
|
||||||
static boolean named = FALSE;
|
|
||||||
|
|
||||||
switch (what)
|
switch (what)
|
||||||
{
|
{
|
||||||
case ObjcIDENTIFIER:
|
case ObjcIDENTIFIER:
|
||||||
if (!named)
|
if (!parseEnum_named)
|
||||||
{
|
{
|
||||||
addTag (ident, K_ENUM);
|
addTag (ident, K_ENUM);
|
||||||
pushEnclosingContext (ident, K_ENUM);
|
pushEnclosingContext (ident, K_ENUM);
|
||||||
named = TRUE;
|
parseEnum_named = TRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
named = FALSE;
|
parseEnum_named = FALSE;
|
||||||
popEnclosingContext ();
|
popEnclosingContext ();
|
||||||
toDoNext = comeAfter;
|
toDoNext = comeAfter;
|
||||||
comeAfter (ident, what);
|
comeAfter (ident, what);
|
||||||
|
@ -920,11 +917,11 @@ static void parseEnum (vString * const ident, objcToken what)
|
||||||
|
|
||||||
case Tok_CurlL: /* '{' */
|
case Tok_CurlL: /* '{' */
|
||||||
toDoNext = &parseEnumFields;
|
toDoNext = &parseEnumFields;
|
||||||
named = FALSE;
|
parseEnum_named = FALSE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Tok_semi: /* ';' */
|
case Tok_semi: /* ';' */
|
||||||
if (named)
|
if (parseEnum_named)
|
||||||
popEnclosingContext ();
|
popEnclosingContext ();
|
||||||
toDoNext = comeAfter;
|
toDoNext = comeAfter;
|
||||||
comeAfter (ident, what);
|
comeAfter (ident, what);
|
||||||
|
@ -971,20 +968,19 @@ static void parseTypedef (vString * const ident, objcToken what)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static boolean ignorePreprocStuff_escaped = FALSE;
|
||||||
static void ignorePreprocStuff (vString * const UNUSED (ident), objcToken what)
|
static void ignorePreprocStuff (vString * const UNUSED (ident), objcToken what)
|
||||||
{
|
{
|
||||||
static boolean escaped = FALSE;
|
|
||||||
|
|
||||||
switch (what)
|
switch (what)
|
||||||
{
|
{
|
||||||
case Tok_Backslash:
|
case Tok_Backslash:
|
||||||
escaped = TRUE;
|
ignorePreprocStuff_escaped = TRUE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Tok_EOL:
|
case Tok_EOL:
|
||||||
if (escaped)
|
if (ignorePreprocStuff_escaped)
|
||||||
{
|
{
|
||||||
escaped = FALSE;
|
ignorePreprocStuff_escaped = FALSE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -993,7 +989,7 @@ static void ignorePreprocStuff (vString * const UNUSED (ident), objcToken what)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
escaped = FALSE;
|
ignorePreprocStuff_escaped = FALSE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1102,6 +1098,17 @@ static void findObjcTags (void)
|
||||||
fullMethodName = vStringNew ();
|
fullMethodName = vStringNew ();
|
||||||
prevIdent = vStringNew ();
|
prevIdent = vStringNew ();
|
||||||
|
|
||||||
|
/* (Re-)initialize state variables, this might be a second file */
|
||||||
|
comeAfter = NULL;
|
||||||
|
fallback = NULL;
|
||||||
|
parentType = K_INTERFACE;
|
||||||
|
ignoreBalanced_count = 0;
|
||||||
|
methodKind = 0;
|
||||||
|
parseStruct_gotName = FALSE;
|
||||||
|
parseEnumFields_prev = NULL;
|
||||||
|
parseEnum_named = FALSE;
|
||||||
|
ignorePreprocStuff_escaped = FALSE;
|
||||||
|
|
||||||
st.name = vStringNew ();
|
st.name = vStringNew ();
|
||||||
st.cp = fileReadLine ();
|
st.cp = fileReadLine ();
|
||||||
toDoNext = &globalScope;
|
toDoNext = &globalScope;
|
||||||
|
|
Loading…
Reference in New Issue