please keep the enum class also working.Does they really work or it is just illusion, because of the bug? :)
please keep the enum class also working.Dunno what that means?! What class?
Does they really work or it is just illusion, because of the bug? :)Applied in my local copy... test cases can be added here, if you like:
C++11 strongly typed enumerations: enum class.please keep the enum class also working.Dunno what that means?! What class?
#include <iostream>
struct B
{
enum Eb
{
ebAsd1, ebAsd2, ebAsd3,
};
enum{ unnamedEnumerator };
enum class Fruit2
{
Apple,
Strawberry,
Orange,
Cherry
};
};
enum class Fruit
{
Apple,
Strawberry,
Orange,
Cherry
};
enum class Color
{
Red,
Orange,
Green
};
int main()
{
return 0;
}
To which CC guru do we send this ?Ollydbg he is the only one:)
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);
+ }
}
}
}
p2rkw: Can you try to add some tests? See Morten's comment.I've done it. Please test against them:
whats about typedef union and unnamed members? It seems that something like this:...added another test case to SVN (and fixed some warnings).
Hi,I think this bug should be discussed in another thread :), and let's focus on handling emun declaration in this thread.
whats about typedef union and unnamed members? It seems that something like this:
typedef union
{
unsigned short Value;
struct
{
unsigned short Var1:6;
unsigned short Var2:10;
};
}
SOME_ID, *PSOME_ID;
could not be found.
How about this:CodeIndex: 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);
+ }
}
}
}
// SEnum:: OK
// SEnum::ELocal:: OK
// SEnum::eEnumClassLocal:: Fail
// SEnum::eEnumClassLocal:: FailIt looks like this is the expect behavior. I see the 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);
}
}
}
enumerator->m_Scope = isEnumClass ? tsPrivate : tsPublic;
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;
}
SEnum::eEnumClassLocal::
SEnum::EEnumClassLocal::
@ollydbg:Yes, I also see this typo, after change this, I see it list three members.
replaceCodewithSEnum::eEnumClassLocal::
CodeSEnum::EEnumClassLocal::
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;
}
EDIT: your patch works fine, all three tests were OK.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.
Any problems encountered? If no, I'll commit in the next couple of days.I'm OK with this patch. All enum testes work fine
// EGlobalCommented::
// EGlobal::
// EGlobalAssign::
// EEnumClassGlobal::
// SEnum::
// SEnum::ELocal::
// SEnum::EEnumClassLocal::