From: <wsf...@us...> - 2012-09-20 18:17:58
|
Revision: 13841 http://swig.svn.sourceforge.net/swig/?rev=13841&view=rev Author: wsfulton Date: 2012-09-20 18:17:52 +0000 (Thu, 20 Sep 2012) Log Message: ----------- Add scoped enums into correct correct scope in type system. Note that cpp0x_strongly_typed_enumerations.i still shows further language symbol table problems which need fixing. Modified Paths: -------------- branches/gsoc2009-matevz/Source/CParse/parser.y branches/gsoc2009-matevz/Source/Modules/typepass.cxx Modified: branches/gsoc2009-matevz/Source/CParse/parser.y =================================================================== --- branches/gsoc2009-matevz/Source/CParse/parser.y 2012-09-14 22:25:35 UTC (rev 13840) +++ branches/gsoc2009-matevz/Source/CParse/parser.y 2012-09-20 18:17:52 UTC (rev 13841) @@ -1690,7 +1690,7 @@ %type <node> types_directive template_directive warn_directive ; /* C declarations */ -%type <node> c_declaration c_decl c_decl_tail c_enum_keyword c_enum_inherit c_enum_decl c_enum_forward_decl c_constructor_decl c_lambda_decl c_lambda_decl_front ; +%type <node> c_declaration c_decl c_decl_tail c_enum_key c_enum_inherit c_enum_decl c_enum_forward_decl c_constructor_decl c_lambda_decl c_lambda_decl_front ; %type <node> enumlist edecl; /* C++ declarations */ @@ -3307,12 +3307,15 @@ enum class ------------------------------------------------------------ */ -c_enum_keyword : ENUM { - $$ = (char*)"enumkeyword"; +c_enum_key : ENUM { + $$ = (char *)"enum"; } | ENUM CLASS { - $$ = (char*)"enumclasskeyword"; + $$ = (char *)"enum class"; } + | ENUM STRUCT { + $$ = (char *)"enum struct"; + } ; /* ------------------------------------------------------------ @@ -3329,12 +3332,16 @@ enum [class] Name [: base_type]; ------------------------------------------------------------ */ -c_enum_forward_decl : storage_class c_enum_keyword ename c_enum_inherit SEMI { +c_enum_forward_decl : storage_class c_enum_key ename c_enum_inherit SEMI { SwigType *ty = 0; + int scopedenum = $3 && !Equal($2, "enum"); $$ = new_node("enumforward"); ty = NewStringf("enum %s", $3); - Setattr($$,"enumkeyword",$2); + Setattr($$,"enumkey",$2); + if (scopedenum) + SetFlag($$, "scopedenum"); Setattr($$,"name",$3); + Setattr($$,"inherit",$4); Setattr($$,"type",ty); Setattr($$,"sym:weak", "1"); add_symbols($$); @@ -3347,26 +3354,46 @@ enum [class] Name [: base_type] { ... } MyEnum [= ...]; * ------------------------------------------------------------ */ -c_enum_decl : storage_class c_enum_keyword ename c_enum_inherit LBRACE enumlist RBRACE SEMI { +c_enum_decl : storage_class c_enum_key ename c_enum_inherit LBRACE enumlist RBRACE SEMI { SwigType *ty = 0; + int scopedenum = $3 && !Equal($2, "enum"); $$ = new_node("enum"); ty = NewStringf("enum %s", $3); - Setattr($$,"enumkeyword",$2); + Setattr($$,"enumkey",$2); + if (scopedenum) + SetFlag($$, "scopedenum"); Setattr($$,"name",$3); Setattr($$,"inherit",$4); Setattr($$,"type",ty); appendChild($$,$6); add_symbols($$); /* Add to tag space */ - add_symbols($6); /* Add enum values to id space */ + + if (scopedenum) { + Swig_symbol_newscope(); + Swig_symbol_setscopename($3); + Delete(Namespaceprefix); + Namespaceprefix = Swig_symbol_qualifiedscopename(0); + } + + add_symbols($6); /* Add enum values to appropriate enum or enum class scope */ + + if (scopedenum) { + Setattr($$,"symtab", Swig_symbol_popscope()); + Delete(Namespaceprefix); + Namespaceprefix = Swig_symbol_qualifiedscopename(0); + } } - | storage_class c_enum_keyword ename c_enum_inherit LBRACE enumlist RBRACE declarator initializer c_decl_tail { + | storage_class c_enum_key ename c_enum_inherit LBRACE enumlist RBRACE declarator initializer c_decl_tail { Node *n; SwigType *ty = 0; String *unnamed = 0; int unnamedinstance = 0; + int scopedenum = $3 && !Equal($2, "enum"); $$ = new_node("enum"); - Setattr($$,"enumkeyword",$2); + Setattr($$,"enumkey",$2); + if (scopedenum) + SetFlag($$, "scopedenum"); Setattr($$,"inherit",$4); if ($3) { Setattr($$,"name",$3); @@ -3433,7 +3460,22 @@ add_symbols($$); /* Add enum to tag space */ set_nextSibling($$,n); Delete(n); - add_symbols($6); /* Add enum values to id space */ + + if (scopedenum) { + Swig_symbol_newscope(); + Swig_symbol_setscopename($3); + Delete(Namespaceprefix); + Namespaceprefix = Swig_symbol_qualifiedscopename(0); + } + + add_symbols($6); /* Add enum values to appropriate enum or enum class scope */ + + if (scopedenum) { + Setattr($$,"symtab", Swig_symbol_popscope()); + Delete(Namespaceprefix); + Namespaceprefix = Swig_symbol_qualifiedscopename(0); + } + add_symbols(n); Delete(unnamed); } @@ -5760,7 +5802,7 @@ | TYPE_BOOL { $$ = $1; } | TYPE_VOID { $$ = $1; } | TYPE_TYPEDEF template_decl { $$ = NewStringf("%s%s",$1,$2); } - | c_enum_keyword idcolon { $$ = NewStringf("enum %s", $2); } + | c_enum_key idcolon { $$ = NewStringf("enum %s", $2); } | TYPE_RAW { $$ = $1; } | idcolon { Modified: branches/gsoc2009-matevz/Source/Modules/typepass.cxx =================================================================== --- branches/gsoc2009-matevz/Source/Modules/typepass.cxx 2012-09-14 22:25:35 UTC (rev 13840) +++ branches/gsoc2009-matevz/Source/Modules/typepass.cxx 2012-09-20 18:17:52 UTC (rev 13841) @@ -834,16 +834,17 @@ virtual int enumvalueDeclaration(Node *n) { String *name = Getattr(n, "name"); String *value = Getattr(n, "value"); + String *scopedenum = Getattr(parentNode(n), "scopedenum"); if (!value) value = name; if (Strcmp(value, name) == 0) { String *new_value; - if ((nsname || inclass) && cparse_cplusplus) { + if ((nsname || inclass || scopedenum) && cparse_cplusplus) { new_value = NewStringf("%s::%s", SwigType_namestr(Swig_symbol_qualified(n)), value); } else { new_value = NewString(value); } - if ((nsname || inclass) && !cparse_cplusplus) { + if ((nsname || inclass || scopedenum) && !cparse_cplusplus) { String *cppvalue = NewStringf("%s::%s", SwigType_namestr(Swig_symbol_qualified(n)), value); Setattr(n, "cppvalue", cppvalue); /* for target languages that always generate C++ code even when wrapping C code */ } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |