Developer forums (C::B DEVELOPMENT STRICTLY!) > CodeCompletion redesign
Patch 3407: correctly parse c++98 enums
ollydbg:
--- Quote from: p2rkw on January 21, 2013, 10:16:14 pm ---How about this:
--- Code: ---Index: src/plugins/codecompletion/parser/parserthread.cpp
===================================================================
--- src/plugins/codecompletion/parser/parserthread.cpp (wersja 8785)
+++ src/plugins/codecompletion/parser/parserthread.cpp (kopia robocza)
@@ -2263,10 +2282,13 @@
// enums have the following rough definition:
// enum [xxx] { type1 name1 [= 1][, [type2 name2 [= 2]]] };
bool isUnnamed = false;
+ bool isEnumClass = false;
int lineNr = m_Tokenizer.GetLineNumber();
wxString token = m_Tokenizer.GetToken();
- if (token == ParserConsts::kw_class)
+ if (token == ParserConsts::kw_class){
token = m_Tokenizer.GetToken();
+ isEnumClass = true;
+ }
if (token.IsEmpty())
return;
@@ -2357,7 +2379,8 @@
{
Token* lastParent = m_LastParent;
m_LastParent = newEnum;
- DoAddToken(tkEnumerator, token, m_Tokenizer.GetLineNumber());
+ Token* enumerator = DoAddToken(tkEnumerator, token, m_Tokenizer.GetLineNumber());
+ enumerator->m_Scope = isEnumClass ? tsPrivate : tsPublic;
m_LastParent = lastParent;
}
if (peek==ParserConsts::colon)
Index: src/plugins/codecompletion/nativeparser_base.h
===================================================================
--- src/plugins/codecompletion/nativeparser_base.h (wersja 8785)
+++ src/plugins/codecompletion/nativeparser_base.h (kopia robocza)
@@ -396,14 +396,16 @@
// for GenerateResultSet()
bool AddChildrenOfUnnamed(TokenTree* tree, const Token* parent, TokenIdxSet& result)
{
- if (parent->m_TokenKind == tkClass && parent->m_Name.StartsWith(g_UnnamedSymbol))
+ if (((parent->m_TokenKind & (tkClass | tkEnum)) != 0)
+ && parent->m_Name.StartsWith(g_UnnamedSymbol))
{
// add all its children
for (TokenIdxSet::const_iterator it = parent->m_Children.begin();
it != parent->m_Children.end(); ++it)
{
Token* tokenChild = tree->at(*it);
- if (tokenChild)
+ if (tokenChild &&
+ (parent->m_TokenKind == tkClass || tokenChild->m_Scope != tsPrivate))
result.insert(*it);
}
@@ -411,7 +413,25 @@
}
return false;
}
+
+ bool AddChildrenOfEnum(TokenTree* tree, const Token* parent, TokenIdxSet& result)
+ {
+ if (parent->m_TokenKind == tkEnum)
+ {
+ // add all its children
+ for (TokenIdxSet::const_iterator it = parent->m_Children.begin();
+ it != parent->m_Children.end(); ++it)
+ {
+ Token* tokenChild = tree->at(*it);
+ if (tokenChild && tokenChild->m_Scope != tsPrivate)
+ result.insert(*it);
+ }
+ return true;
+ }
+ return false;
+ }
+
// for GenerateResultSet()
bool MatchText(const wxString& text, const wxString& target, bool caseSens, bool isPrefix)
{
Index: src/plugins/codecompletion/nativeparser_base.cpp
===================================================================
--- src/plugins/codecompletion/nativeparser_base.cpp (wersja 8785)
+++ src/plugins/codecompletion/nativeparser_base.cpp (kopia robocza)
@@ -1318,7 +1318,11 @@
if (!token)
continue;
if ( !AddChildrenOfUnnamed(tree, token, result) )
+ {
result.insert(*it);
+ AddChildrenOfEnum(tree, token, result);
+ }
+
}
tree->RecalcInheritanceChain(parent);
@@ -1334,7 +1338,10 @@
if (!token)
continue;
if ( !AddChildrenOfUnnamed(tree, token, result) )
+ {
result.insert(*it2);
+ AddChildrenOfEnum(tree, token, result);
+ }
}
}
}
--- End code ---
--- End quote ---
Here is my test result of this patch:
Using the test file: trunk\src\plugins\codecompletion\testing\structs_typedefs_enums.cpp (rev 8811)
--- Code: ---// SEnum:: OK
// SEnum::ELocal:: OK
// SEnum::eEnumClassLocal:: Fail
--- End code ---
ollydbg:
--- Quote from: ollydbg on January 22, 2013, 02:25:38 pm ---// SEnum::eEnumClassLocal:: Fail
--- End quote ---
It looks like this is the expect behavior. I see the code:
--- Code: --- while (IS_ALIVE)
{
// process enumerators
token = m_Tokenizer.GetToken();
wxString peek = m_Tokenizer.PeekToken();
if (token.IsEmpty() || peek.IsEmpty())
return; //eof
if (token==ParserConsts::clbrace && level == m_Tokenizer.GetNestingLevel())
break;
// assignments (=xxx) are ignored by the tokenizer,
// so we don't have to worry about them here ;)
if (peek==ParserConsts::comma || peek==ParserConsts::clbrace || peek==ParserConsts::colon)
{
// this "if", avoids non-valid enumerators
// like a comma (if no enumerators follow)
if ( wxIsalpha(token.GetChar(0))
|| (token.GetChar(0) == ParserConsts::underscore_chr) )
{
Token* lastParent = m_LastParent;
m_LastParent = newEnum;
Token* enumerator = DoAddToken(tkEnumerator, token, m_Tokenizer.GetLineNumber());
enumerator->m_Scope = isEnumClass ? tsPrivate : tsPublic;
m_LastParent = lastParent;
}
if (peek==ParserConsts::colon)
{
// bit specifier (eg, xxx:1)
// -> walk to , or }
SkipToOneOfChars(ParserConsts::commaclbrace);
}
}
}
--- End code ---
Here:
--- Code: ---enumerator->m_Scope = isEnumClass ? tsPrivate : tsPublic;
--- End code ---
The added enumerator is "private".
But it looks like the private members are not added to codecompletion suggestion list.
--- Code: --- bool AddChildrenOfEnum(TokenTree* tree, const Token* parent, TokenIdxSet& result)
{
if (parent->m_TokenKind == tkEnum)
{
// add all its children
for (TokenIdxSet::const_iterator it = parent->m_Children.begin();
it != parent->m_Children.end(); ++it)
{
Token* tokenChild = tree->at(*it);
if (tokenChild && tokenChild->m_Scope != tsPrivate)
result.insert(*it);
}
return true;
}
return false;
}
--- End code ---
Here, only members those are "Not private" are added to the result.
p2rkw:
@ollydbg:
replace
--- Code: ---SEnum::eEnumClassLocal::
--- End code ---
with
--- Code: ---SEnum::EEnumClassLocal::
--- End code ---
ollydbg:
--- Quote from: p2rkw on January 22, 2013, 02:47:22 pm ---@ollydbg:
replace
--- Code: ---SEnum::eEnumClassLocal::
--- End code ---
with
--- Code: ---SEnum::EEnumClassLocal::
--- End code ---
--- End quote ---
Yes, I also see this typo, after change this, I see it list three members.
But I'm using the code:
--- Code: --- bool AddChildrenOfEnum(TokenTree* tree, const Token* parent, TokenIdxSet& result)
{
if (parent->m_TokenKind == tkEnum)
{
// add all its children
for (TokenIdxSet::const_iterator it = parent->m_Children.begin();
it != parent->m_Children.end(); ++it)
{
Token* tokenChild = tree->at(*it);
if (tokenChild )//&& tokenChild->m_Scope != tsPrivate)
result.insert(*it);
}
return true;
}
return false;
}
--- End code ---
I will test your patch again.
EDIT: your patch works fine, all three tests were OK.
MortenMacFly:
--- Quote from: ollydbg on January 22, 2013, 02:50:52 pm ---EDIT: your patch works fine, all three tests were OK.
--- End quote ---
Keep in mind that there are way more enums defined in this test file than only 3. These 3 commented cases are just for convenience (and because I was too lazy to type them all). But all enums should pass.
Navigation
[0] Message Index
[#] Next page
[*] Previous page
Go to full version