@loaden:
rev7176, you add a function call
// After add a variable token, we should skip to semicolon
SkipToOneOfChars(ParserConsts::semicolonclbrace, true);
m_Str.Clear();
But look at the DoParse() code:
case ParserConsts::semicolon_chr:
{
m_Str.Clear();
m_PointerOrRef.Clear();
// Notice: clears the queue "m_EncounteredTypeNamespaces"
while (!m_EncounteredTypeNamespaces.empty())
m_EncounteredTypeNamespaces.pop();
m_TemplateArgument.Clear();
}
break;
So, if you Get(eat) the semicolon too earlier, you have no change to clear the context.
BTW:
who can explain the logic to detect a "variable" in these code snippet:
else if ( (peek == ParserConsts::semicolon)
|| ( ( m_Options.useBuffer
&& (peek.GetChar(0) == ParserConsts::opbracket_chr) )
&& (!m_Str.Contains(ParserConsts::dcolon)) ) )
{
if ( !m_Str.IsEmpty()
&& ( wxIsalpha(token.GetChar(0))
|| (token.GetChar(0) == ParserConsts::underscore_chr) ) )
{
if (m_Options.handleVars)
{
Token* newToken = DoAddToken(tkVariable, token, m_Tokenizer.GetLineNumber());
if (newToken && !m_TemplateArgument.IsEmpty())
ResolveTemplateArgs(newToken);
}
// After add a variable token, we should skip to semicolon
SkipToOneOfChars(ParserConsts::semicolonclbrace, true);
m_Str.Clear();
}
}
Too hard to understand the logic... :(
So, if you Get(eat) the semicolon too earlier, you have no change to clear the context.
I had another concern, but did not try (yet):
What about such constructs:
void main(void)
{
int a,b,c;
MyClass d,e,f;
}
... will b,c and e,f be skipped?
So, if you Get(eat) the semicolon too earlier, you have no change to clear the context.
I had another concern, but did not try (yet):
What about such constructs:
void main(void)
{
int a,b,c;
MyClass d,e,f;
}
... will b,c and e,f be skipped?
I think no problem.
This can improve performance.
the a,b,c are local variable.
you can try:
int a,b,c;
MyClass d,e,f;