Code::Blocks Forums

Developer forums (C::B DEVELOPMENT STRICTLY!) => Development => CodeCompletion redesign => Topic started by: ollydbg on May 30, 2011, 08:04:27 am

Title: rev7176, potential bug
Post by: ollydbg on May 30, 2011, 08:04:27 am
@loaden:
rev7176, you add a function call
Code
                        // After add a variable token, we should skip to semicolon
                        SkipToOneOfChars(ParserConsts::semicolonclbrace, true);
                        m_Str.Clear();

But look at the DoParse() code:
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.
Title: Re: rev7176, potential bug
Post by: ollydbg on May 30, 2011, 08:52:08 am
BTW:
who can explain the logic to detect a "variable" in these code snippet:

Code
                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... :(
Title: Re: rev7176, potential bug
Post by: MortenMacFly on May 30, 2011, 09:10:14 am
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:
Code
void main(void)
{
  int a,b,c;
  MyClass d,e,f;
}
... will b,c and e,f be skipped?
Title: Re: rev7176, potential bug
Post by: Loaden on May 30, 2011, 11:09:33 am
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:
Code
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:

Code
  int a,b,c;
  MyClass d,e,f;

Title: Re: rev7176, potential bug
Post by: Loaden on May 30, 2011, 11:22:57 am
@loaden:
rev7176, you add a function call
Code
                        // After add a variable token, we should skip to semicolon
                        SkipToOneOfChars(ParserConsts::semicolonclbrace, true);
                        m_Str.Clear();

But look at the DoParse() code:
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.
I see, you are right!
Thanks!