Bug #18526 2012-03-09 14:12
zetab
Insert all class methods without implementation malfunction
Version: svn build rev 7789 (2012/02/11 03:42:39) gcc 4.5.2 Windows/unicode - 32 bit
OS: WinXP
Declare a class:
class TestClass
{
public:
TestClass();
~TestClass();
int* Test1();
int& Test2();
unsigned int Test3();
protected:
private:
};
Using "Insert -> all class methods without implementation" for Test1, Test2, and Test3 will generate following code:
int TestClass::Test1()
{
}
int TestClass::Test2()
{
}
int TestClass::Test3()
{
}
The "*", "&" and "unsigned" in the return type are missing.
- Category
- Plugin::CodeCompletion
- Group
- Platform:Windows
- Status
- Open
- Close date
- Assigned to
- ollydbg
History
Here, in the function: int CodeCompletion::DoAllMethodsImpl(), we have such code:
wxString type = token->m_BaseType;
if ((type.Last() == _T('&') || type.Last() == _T('*')) && type[type.Len() - 2] == _T(' '))
{
type[type.Len() - 2] = type.Last();
type.RemoveLast();
}
But both three tokens have the same "base type". Do shall we use "m_FullType" instead?
Found another problem:
If I have another class:
class A
{
public:
A(int x, int y){}
~A(){}
};
And declare a member function in TestClass:
void Test4(const A& a = A(1, 2));
Insert implementation will result in:
void TestClass::Test4(const A& a, 2))
{
}
Hi, thanks for this report, I believe this is another bug, and I will look into it. Thanks.
wxString Token::GetStrippedArgs() const
{
// the argument should have the format (xxxx = y, ....) or just an empty string
// if it is empty, we just return an empty string
if (m_Args.IsEmpty())
return wxEmptyString;
wxString args;
args.Alloc(m_Args.Len() + 1);
bool skipDefaultValue = false;
for (size_t i = 0; i < m_Args.Len(); ++i)
{
const wxChar ch = m_Args[i];
if (ch == _T('\n'))
continue;
else if (ch == _T('='))
{
skipDefaultValue = true;
args.Trim();
}
else if (ch == _T(','))
skipDefaultValue = false;
if (!skipDefaultValue)
args << ch;
}
if (args.Last() != _T(')'))
args << _T(')');
return args;
}
This function works badly when m_Args="(const A& a = A(1, 2))".
Now, I see skipping parentheses is quite complex. See:
void Tokenizer::ReadParentheses(wxString& str)
I add a new bug report about your second bug in this thread.
https://developer.berlios.de/bugs/?func=detailbug&bug_id=18600&group_id=5358
Here, I will focus on the original bug.