diff --git a/Examples/test-suite/csharp/Makefile.in b/Examples/test-suite/csharp/Makefile.in index 7bec108eb..292c751e4 100644 --- a/Examples/test-suite/csharp/Makefile.in +++ b/Examples/test-suite/csharp/Makefile.in @@ -28,6 +28,9 @@ CPP_TEST_CASES = \ intermediary_classname \ li_boost_intrusive_ptr +CPP11_TEST_CASES = \ + cpp11_strongly_typed_enumerations_simple \ + include $(srcdir)/../common.mk # Overridden variables here diff --git a/Examples/test-suite/csharp/cpp11_strongly_typed_enumerations_runme.cs b/Examples/test-suite/csharp/cpp11_strongly_typed_enumerations_runme.cs new file mode 100644 index 000000000..a6180609a --- /dev/null +++ b/Examples/test-suite/csharp/cpp11_strongly_typed_enumerations_runme.cs @@ -0,0 +1,163 @@ + +// This is the bool runtime testcase. It checks that the C++ bool type works. + +using System; +using cpp11_strongly_typed_enumerationsNamespace; + +public class cpp11_strongly_typed_enumerations_runme { + + public static int enumCheck(int actual, int expected) { + if (actual != expected) + throw new ApplicationException("Enum value mismatch. Expected " + expected + " Actual: " + actual); + return expected + 1; + } + + public static void Main() { + int val = 0; + val = enumCheck((int)Enum1.Val1, val); + val = enumCheck((int)Enum1.Val2, val); + val = enumCheck((int)Enum1.Val3, 13); + val = enumCheck((int)Enum1.Val4, val); + val = enumCheck((int)Enum1.Val5a, 13); + val = enumCheck((int)Enum1.Val6a, val); + + val = 0; + val = enumCheck((int)Enum2.Val1, val); + val = enumCheck((int)Enum2.Val2, val); + val = enumCheck((int)Enum2.Val3, 23); + val = enumCheck((int)Enum2.Val4, val); + val = enumCheck((int)Enum2.Val5b, 23); + val = enumCheck((int)Enum2.Val6b, val); + + val = 0; + val = enumCheck((int)Enum4.Val1, val); + val = enumCheck((int)Enum4.Val2, val); + val = enumCheck((int)Enum4.Val3, 43); + val = enumCheck((int)Enum4.Val4, val); + + val = 0; + val = enumCheck((int)Enum5.Val1, val); + val = enumCheck((int)Enum5.Val2, val); + val = enumCheck((int)Enum5.Val3, 53); + val = enumCheck((int)Enum5.Val4, val); + + val = 0; + val = enumCheck((int)Enum6.Val1, val); + val = enumCheck((int)Enum6.Val2, val); + val = enumCheck((int)Enum6.Val3, 63); + val = enumCheck((int)Enum6.Val4, val); + + val = 0; + val = enumCheck((int)Enum7td.Val1, val); + val = enumCheck((int)Enum7td.Val2, val); + val = enumCheck((int)Enum7td.Val3, 73); + val = enumCheck((int)Enum7td.Val4, val); + + val = 0; + val = enumCheck((int)Enum8.Val1, val); + val = enumCheck((int)Enum8.Val2, val); + val = enumCheck((int)Enum8.Val3, 83); + val = enumCheck((int)Enum8.Val4, val); + + val = 0; + val = enumCheck((int)Enum10.Val1, val); + val = enumCheck((int)Enum10.Val2, val); + val = enumCheck((int)Enum10.Val3, 103); + val = enumCheck((int)Enum10.Val4, val); + + val = 0; + val = enumCheck((int)Class1.Enum12.Val1, 1121); + val = enumCheck((int)Class1.Enum12.Val2, 1122); + val = enumCheck((int)Class1.Enum12.Val3, val); + val = enumCheck((int)Class1.Enum12.Val4, val); + val = enumCheck((int)Class1.Enum12.Val5c, 1121); + val = enumCheck((int)Class1.Enum12.Val6c, val); + + val = 0; + val = enumCheck((int)Class1.Enum13.Val1, 1131); + val = enumCheck((int)Class1.Enum13.Val2, 1132); + val = enumCheck((int)Class1.Enum13.Val3, val); + val = enumCheck((int)Class1.Enum13.Val4, val); + val = enumCheck((int)Class1.Enum13.Val5d, 1131); + val = enumCheck((int)Class1.Enum13.Val6d, val); + + val = 0; + val = enumCheck((int)Class1.Enum14.Val1, 1141); + val = enumCheck((int)Class1.Enum14.Val2, 1142); + val = enumCheck((int)Class1.Enum14.Val3, val); + val = enumCheck((int)Class1.Enum14.Val4, val); + val = enumCheck((int)Class1.Enum14.Val5e, 1141); + val = enumCheck((int)Class1.Enum14.Val6e, val); + + val = 0; + val = enumCheck((int)Class1.Struct1.Enum12.Val1, 3121); + val = enumCheck((int)Class1.Struct1.Enum12.Val2, 3122); + val = enumCheck((int)Class1.Struct1.Enum12.Val3, val); + val = enumCheck((int)Class1.Struct1.Enum12.Val4, val); + val = enumCheck((int)Class1.Struct1.Enum12.Val5f, 3121); + val = enumCheck((int)Class1.Struct1.Enum12.Val6f, val); + + val = 0; + val = enumCheck((int)Class1.Struct1.Enum13.Val1, 3131); + val = enumCheck((int)Class1.Struct1.Enum13.Val2, 3132); + val = enumCheck((int)Class1.Struct1.Enum13.Val3, val); + val = enumCheck((int)Class1.Struct1.Enum13.Val4, val); + + val = 0; + val = enumCheck((int)Class1.Struct1.Enum14.Val1, 3141); + val = enumCheck((int)Class1.Struct1.Enum14.Val2, 3142); + val = enumCheck((int)Class1.Struct1.Enum14.Val3, val); + val = enumCheck((int)Class1.Struct1.Enum14.Val4, val); + val = enumCheck((int)Class1.Struct1.Enum14.Val5g, 3141); + val = enumCheck((int)Class1.Struct1.Enum14.Val6g, val); + + val = 0; + val = enumCheck((int)Class2.Enum12.Val1, 2121); + val = enumCheck((int)Class2.Enum12.Val2, 2122); + val = enumCheck((int)Class2.Enum12.Val3, val); + val = enumCheck((int)Class2.Enum12.Val4, val); + val = enumCheck((int)Class2.Enum12.Val5h, 2121); + val = enumCheck((int)Class2.Enum12.Val6h, val); + + val = 0; + val = enumCheck((int)Class2.Enum13.Val1, 2131); + val = enumCheck((int)Class2.Enum13.Val2, 2132); + val = enumCheck((int)Class2.Enum13.Val3, val); + val = enumCheck((int)Class2.Enum13.Val4, val); + val = enumCheck((int)Class2.Enum13.Val5i, 2131); + val = enumCheck((int)Class2.Enum13.Val6i, val); + + val = 0; + val = enumCheck((int)Class2.Enum14.Val1, 2141); + val = enumCheck((int)Class2.Enum14.Val2, 2142); + val = enumCheck((int)Class2.Enum14.Val3, val); + val = enumCheck((int)Class2.Enum14.Val4, val); + val = enumCheck((int)Class2.Enum14.Val5j, 2141); + val = enumCheck((int)Class2.Enum14.Val6j, val); + + val = 0; + val = enumCheck((int)Class2.Struct1.Enum12.Val1, 4121); + val = enumCheck((int)Class2.Struct1.Enum12.Val2, 4122); + val = enumCheck((int)Class2.Struct1.Enum12.Val3, val); + val = enumCheck((int)Class2.Struct1.Enum12.Val4, val); + val = enumCheck((int)Class2.Struct1.Enum12.Val5k, 4121); + val = enumCheck((int)Class2.Struct1.Enum12.Val6k, val); + + val = 0; + val = enumCheck((int)Class2.Struct1.Enum13.Val1, 4131); + val = enumCheck((int)Class2.Struct1.Enum13.Val2, 4132); + val = enumCheck((int)Class2.Struct1.Enum13.Val3, val); + val = enumCheck((int)Class2.Struct1.Enum13.Val4, val); + val = enumCheck((int)Class2.Struct1.Enum13.Val5l, 4131); + val = enumCheck((int)Class2.Struct1.Enum13.Val6l, val); + + val = 0; + val = enumCheck((int)Class2.Struct1.Enum14.Val1, 4141); + val = enumCheck((int)Class2.Struct1.Enum14.Val2, 4142); + val = enumCheck((int)Class2.Struct1.Enum14.Val3, val); + val = enumCheck((int)Class2.Struct1.Enum14.Val4, val); + val = enumCheck((int)Class2.Struct1.Enum14.Val5m, 4141); + val = enumCheck((int)Class2.Struct1.Enum14.Val6m, val); + } +} + diff --git a/Source/Modules/csharp.cxx b/Source/Modules/csharp.cxx index 0a698ca2c..39cab8f0a 100644 --- a/Source/Modules/csharp.cxx +++ b/Source/Modules/csharp.cxx @@ -719,7 +719,7 @@ public: String *overloaded_name = getOverloadedName(n); if (!Getattr(n, "sym:overloaded")) { - if (!addSymbol(Getattr(n, "sym:name"), n, imclass_name)) + if (!addSymbol(symname, n, imclass_name)) return SWIG_ERROR; } @@ -1266,6 +1266,7 @@ public: int unnamedinstance = GetFlag(parent, "unnamedinstance"); String *parent_name = Getattr(parent, "name"); String *nspace = getNSpace(); + String *newsymname = 0; String *tmpValue; // Strange hack from parent method @@ -1290,14 +1291,20 @@ public: { EnumFeature enum_feature = decodeEnumFeature(parent); + if ((enum_feature == SimpleEnum) && GetFlag(parent, "scopedenum")) { + newsymname = Swig_name_member(0, Getattr(parent, "sym:name"), symname); + symname = newsymname; + } + // Add to language symbol table String *scope = 0; if (unnamedinstance || !parent_name || enum_feature == SimpleEnum) { - if (proxy_class_name) { + String *enumClassPrefix = getEnumClassPrefix(); + if (enumClassPrefix) { scope = NewString(""); if (nspace) Printf(scope, "%s.", nspace); - Printf(scope, "%s", proxy_class_name); + Printf(scope, "%s", enumClassPrefix); } else { scope = Copy(module_class_name); } @@ -1380,6 +1387,7 @@ public: Delete(scope); } + Delete(newsymname); Delete(tmpValue); Swig_restore(n); return SWIG_OK; @@ -3053,6 +3061,16 @@ public: // Use the C syntax to make a true C# constant and hope that it compiles as C# code value = Getattr(n, "enumvalue") ? Copy(Getattr(n, "enumvalue")) : Copy(Getattr(n, "enumvalueex")); } else { + String *newsymname = 0; + if (!getCurrentClass() || !proxy_flag) { + String *enumClassPrefix = getEnumClassPrefix(); + if (enumClassPrefix) { + // A global scoped enum + newsymname = Swig_name_member(0, enumClassPrefix, symname); + symname = newsymname; + } + } + // Get the enumvalue from a PINVOKE call if (!getCurrentClass() || !cparse_cplusplus || !proxy_flag) { // Strange hack to change the name @@ -3061,7 +3079,7 @@ public: value = NewStringf("%s.%s()", full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), symname)); } else { memberconstantHandler(n); - value = NewStringf("%s.%s()", full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), Swig_name_member(0, proxy_class_name, symname))); + value = NewStringf("%s.%s()", full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), Swig_name_member(0, getEnumClassPrefix(), symname))); } } }