Ignored enum fixes.

C#/Java - Enums which have been ignored via %ignore and are subsequently
used are handled slightly differently. Type wrapper classes are now generated
which are effectively a wrapper of an empty enum. Previously in Java uncompilable
code was generated and in C# an int was used.
This commit is contained in:
William S Fulton 2014-04-08 23:25:27 +01:00
parent 7bec7c1b60
commit dc8428889e
6 changed files with 36 additions and 7 deletions

View File

@ -5,6 +5,12 @@ See the RELEASENOTES file for a summary of changes in each release.
Version 3.0.1 (in progress) Version 3.0.1 (in progress)
=========================== ===========================
2014-04-08: wsfulton
[Java C#] Enums which have been ignored via %ignore and are subsequently
used are handled slightly differently. Type wrapper classes are now generated
which are effectively a wrapper of an empty enum. Previously in Java uncompilable
code was generated and in C# an int was used.
2014-04-04: wsfulton 2014-04-04: wsfulton
Fix regression in 3.0.0 where legal code following an operator<< definition might Fix regression in 3.0.0 where legal code following an operator<< definition might
give a syntax error. SF Bug #1365. give a syntax error. SF Bug #1365.

View File

@ -197,6 +197,7 @@ CPP_TEST_CASES += \
disown \ disown \
dynamic_cast \ dynamic_cast \
empty \ empty \
enum_ignore \
enum_plus \ enum_plus \
enum_rename \ enum_rename \
enum_scope_template \ enum_scope_template \

View File

@ -0,0 +1,20 @@
%module enum_ignore
// Similar to enum_missing C test, but with namespaces and using %ignore
%ignore N::C;
%inline %{
namespace N {
enum C { Red, Green, Blue };
struct Draw {
void DrawBW() {}
void DrawC(C c) {}
void DrawC_Ptr(C* c) {}
void DrawC_ConstRef(C const& c) {}
};
}
%}

View File

@ -3175,8 +3175,8 @@ public:
if (anonymous_enum) { if (anonymous_enum) {
replacementname = NewString("int"); replacementname = NewString("int");
} else { } else {
// An unknown enum - one that has not been parsed (neither a C enum forward reference nor a definition) // An unknown enum - one that has not been parsed (neither a C enum forward reference nor a definition) or an ignored enum
replacementname = SwigType_base(classnametype); replacementname = NewStringf("SWIGTYPE%s", SwigType_manglestr(classnametype));
Replace(replacementname, "enum ", "", DOH_REPLACE_ANY); Replace(replacementname, "enum ", "", DOH_REPLACE_ANY);
Setattr(swig_types_hash, replacementname, classnametype); Setattr(swig_types_hash, replacementname, classnametype);
} }

View File

@ -4514,10 +4514,12 @@ private:
} else if (Strcmp(t, "enum ") == 0) { } else if (Strcmp(t, "enum ") == 0) {
ret = NewString("int"); ret = NewString("int");
} else { } else {
// An unknown enum - one that has not been parsed (neither a C enum forward reference nor a definition) // An unknown enum - one that has not been parsed (neither a C enum forward reference nor a definition) or an ignored enum
ret = SwigType_base(t); String *tt = Copy(t);
Replace(ret, "enum ", "", DOH_REPLACE_ANY); Replace(tt, "enum ", "", DOH_REPLACE_ANY);
ret = exportedName(tt);
Setattr(undefined_enum_types, t, ret); Setattr(undefined_enum_types, t, ret);
Delete(tt);
} }
} else if (SwigType_isfunctionpointer(type) || SwigType_isfunction(type)) { } else if (SwigType_isfunctionpointer(type) || SwigType_isfunction(type)) {
ret = NewString("_swig_fnptr"); ret = NewString("_swig_fnptr");

View File

@ -3090,8 +3090,8 @@ public:
if (anonymous_enum) { if (anonymous_enum) {
replacementname = NewString("int"); replacementname = NewString("int");
} else { } else {
// An unknown enum - one that has not been parsed (neither a C enum forward reference nor a definition) // An unknown enum - one that has not been parsed (neither a C enum forward reference nor a definition) or an ignored enum
replacementname = SwigType_base(classnametype); replacementname = NewStringf("SWIGTYPE%s", SwigType_manglestr(classnametype));
Replace(replacementname, "enum ", "", DOH_REPLACE_ANY); Replace(replacementname, "enum ", "", DOH_REPLACE_ANY);
Setattr(swig_types_hash, replacementname, classnametype); Setattr(swig_types_hash, replacementname, classnametype);
} }