diff --git a/CHANGES.current b/CHANGES.current
index bd329527b..015be9a9f 100644
--- a/CHANGES.current
+++ b/CHANGES.current
@@ -7,6 +7,38 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/
Version 4.3.0 (in progress)
===========================
+2024-05-26: wsfulton
+ [C#, D, Java, Javascript, Lua] Fix %nspace and %nspacemove for nested
+ classes and enums in a class. For example:
+
+ %nspace Space::OuterClass80;
+ namespace Space {
+ struct OuterClass80 {
+ struct InnerClass80 {
+ struct BottomClass80 {};
+ };
+ enum InnerEnum80 { ie80a, ie80b };
+ };
+ }
+
+ Previously the following were additionally required for some languages:
+
+ %nspace Space::OuterClass80::InnerClass80;
+ %nspace Space::OuterClass80::InnerClass80::Bottom80;
+
+ Now the appropriate nspace setting is taken from the outer class.
+
+ A new warning has also been introduced to check and correct conflicting
+ nspace usage, for example if the following is additionally added:
+
+ %nspacemove(AnotherSpace) Space::OuterClass80::InnerClass80;
+
+ The following warning appears as an inner class can't be moved outside
+ of the outer class:
+
+ Warning 406: Ignoring nspace setting (AnotherSpace) for 'Space::OuterClass80::InnerClass80',
+ Warning 406: as it conflicts with the nspace setting (Space) for outer class 'Space::OuterClass80'.
+
2024-05-26: wsfulton
[C#, D, Java, Javascript, Lua] #2782 Enhance the nspace feature with
%nspacemove for moving a class or enum into a differently named target
diff --git a/Doc/Manual/Warnings.html b/Doc/Manual/Warnings.html
index 0e646e5e4..58350ea63 100644
--- a/Doc/Manual/Warnings.html
+++ b/Doc/Manual/Warnings.html
@@ -478,6 +478,7 @@ example.i(4) : Syntax error in input(1).
403. Class 'name' might be abstract.
404. Duplicate template instantiation of 'type' with name 'name' ignored, previous instantiation of 'type' with name 'name'.
405. Method with rvalue ref-qualifier name ignored.
+406. Ignoring nspace setting (setting) for 'type', as it conflicts with the nspace setting (setting) for outer class 'type'
450. Reserved
451. Setting const char * variable may leak memory.
452. Reserved
diff --git a/Examples/test-suite/common.mk b/Examples/test-suite/common.mk
index e2ed1d41c..b9d6ca016 100644
--- a/Examples/test-suite/common.mk
+++ b/Examples/test-suite/common.mk
@@ -335,9 +335,6 @@ CPP_TEST_CASES += \
namespace_typemap \
namespace_union \
namespace_virtual_method \
- nspace \
- nspace_extend \
- nspacemove \
native_directive \
naturalvar \
naturalvar_more \
@@ -353,6 +350,10 @@ CPP_TEST_CASES += \
nested_workaround \
newobject1 \
newobject3 \
+ nspace \
+ nspace_extend \
+ nspacemove \
+ nspacemove_nested \
null_pointer \
numeric_bounds_checking \
operator_overload \
diff --git a/Examples/test-suite/csharp/nspacemove_nested_runme.cs b/Examples/test-suite/csharp/nspacemove_nested_runme.cs
new file mode 100644
index 000000000..84b3329a0
--- /dev/null
+++ b/Examples/test-suite/csharp/nspacemove_nested_runme.cs
@@ -0,0 +1,61 @@
+using System;
+
+public class runme
+{
+ static void Main()
+ {
+ // outer classes
+ nspacemove_nestedNamespace.Space.OuterClass1 oc1 = new nspacemove_nestedNamespace.Space.OuterClass1();
+ nspacemove_nestedNamespace.Space.OuterClass2 oc2 = new nspacemove_nestedNamespace.Space.OuterClass2();
+ nspacemove_nestedNamespace.NewSpace3.OuterClass3 oc3 = new nspacemove_nestedNamespace.NewSpace3.OuterClass3();
+ nspacemove_nestedNamespace.NewSpace4.OuterClass4 oc4 = new nspacemove_nestedNamespace.NewSpace4.OuterClass4();
+ nspacemove_nestedNamespace.OuterClass5 oc5 = new nspacemove_nestedNamespace.OuterClass5();
+ nspacemove_nestedNamespace.OuterClass6 oc6 = new nspacemove_nestedNamespace.OuterClass6();
+ nspacemove_nestedNamespace.OuterClass7 oc7 = new nspacemove_nestedNamespace.OuterClass7();
+
+ nspacemove_nestedNamespace.Space.OuterClass10 oc10 = new nspacemove_nestedNamespace.Space.OuterClass10();
+ nspacemove_nestedNamespace.Space.OuterClass20 oc20 = new nspacemove_nestedNamespace.Space.OuterClass20();
+ nspacemove_nestedNamespace.NewOkay30.OuterClass30 oc30 = new nspacemove_nestedNamespace.NewOkay30.OuterClass30();
+ nspacemove_nestedNamespace.NewOkay40.OuterClass40 oc40 = new nspacemove_nestedNamespace.NewOkay40.OuterClass40();
+ nspacemove_nestedNamespace.NewOkay50.OuterClass50 oc50 = new nspacemove_nestedNamespace.NewOkay50.OuterClass50();
+ nspacemove_nestedNamespace.OuterClass60 oc60 = new nspacemove_nestedNamespace.OuterClass60();
+ nspacemove_nestedNamespace.OuterClass70 oc70 = new nspacemove_nestedNamespace.OuterClass70();
+ nspacemove_nestedNamespace.Space.OuterClass80 oc80 = new nspacemove_nestedNamespace.Space.OuterClass80();
+
+ // inner classes
+ nspacemove_nestedNamespace.Space.OuterClass1.InnerClass1 ic1 = new nspacemove_nestedNamespace.Space.OuterClass1.InnerClass1();
+ nspacemove_nestedNamespace.Space.OuterClass2.InnerClass2 ic2 = new nspacemove_nestedNamespace.Space.OuterClass2.InnerClass2();
+ nspacemove_nestedNamespace.NewSpace3.OuterClass3.InnerClass3 ic3 = new nspacemove_nestedNamespace.NewSpace3.OuterClass3.InnerClass3();
+ nspacemove_nestedNamespace.NewSpace4.OuterClass4.InnerClass4 ic4 = new nspacemove_nestedNamespace.NewSpace4.OuterClass4.InnerClass4();
+ nspacemove_nestedNamespace.OuterClass5.InnerClass5 ic5 = new nspacemove_nestedNamespace.OuterClass5.InnerClass5();
+ nspacemove_nestedNamespace.OuterClass6.InnerClass6 ic6 = new nspacemove_nestedNamespace.OuterClass6.InnerClass6();
+ nspacemove_nestedNamespace.OuterClass7.InnerClass7 ic7 = new nspacemove_nestedNamespace.OuterClass7.InnerClass7();
+
+ nspacemove_nestedNamespace.Space.OuterClass10.InnerClass10 ic10 = new nspacemove_nestedNamespace.Space.OuterClass10.InnerClass10();
+ nspacemove_nestedNamespace.Space.OuterClass20.InnerClass20 ic20 = new nspacemove_nestedNamespace.Space.OuterClass20.InnerClass20();
+ nspacemove_nestedNamespace.NewOkay30.OuterClass30.InnerClass30 ic30 = new nspacemove_nestedNamespace.NewOkay30.OuterClass30.InnerClass30();
+ nspacemove_nestedNamespace.NewOkay40.OuterClass40.InnerClass40 ic40 = new nspacemove_nestedNamespace.NewOkay40.OuterClass40.InnerClass40();
+ nspacemove_nestedNamespace.NewOkay50.OuterClass50.InnerClass50 ic50 = new nspacemove_nestedNamespace.NewOkay50.OuterClass50.InnerClass50();
+ nspacemove_nestedNamespace.OuterClass60.InnerClass60 ic60 = new nspacemove_nestedNamespace.OuterClass60.InnerClass60();
+ nspacemove_nestedNamespace.OuterClass70.InnerClass70 ic70 = new nspacemove_nestedNamespace.OuterClass70.InnerClass70();
+ nspacemove_nestedNamespace.Space.OuterClass80.InnerClass80 ic80 = new nspacemove_nestedNamespace.Space.OuterClass80.InnerClass80();
+
+ // inner enums
+ oc1.take(nspacemove_nestedNamespace.Space.OuterClass1.InnerEnum1.ie1a, ic1);
+ oc2.take(nspacemove_nestedNamespace.Space.OuterClass2.InnerEnum2.ie2a, ic2);
+ oc3.take(nspacemove_nestedNamespace.NewSpace3.OuterClass3.InnerEnum3.ie3a, ic3);
+ oc4.take(nspacemove_nestedNamespace.NewSpace4.OuterClass4.InnerEnum4.ie4a, ic4);
+ oc5.take(nspacemove_nestedNamespace.OuterClass5.InnerEnum5.ie5a, ic5);
+ oc6.take(nspacemove_nestedNamespace.OuterClass6.InnerEnum6.ie6a, ic6);
+ oc7.take(nspacemove_nestedNamespace.OuterClass7.InnerEnum7.ie7a, ic7);
+
+ oc10.take(nspacemove_nestedNamespace.Space.OuterClass10.InnerEnum10.ie10a, ic10);
+ oc20.take(nspacemove_nestedNamespace.Space.OuterClass20.InnerEnum20.ie20a, ic20);
+ oc30.take(nspacemove_nestedNamespace.NewOkay30.OuterClass30.InnerEnum30.ie30a, ic30);
+ oc40.take(nspacemove_nestedNamespace.NewOkay40.OuterClass40.InnerEnum40.ie40a, ic40);
+ oc50.take(nspacemove_nestedNamespace.NewOkay50.OuterClass50.InnerEnum50.ie50a, ic50);
+ oc60.take(nspacemove_nestedNamespace.OuterClass60.InnerEnum60.ie60a, ic60);
+ oc70.take(nspacemove_nestedNamespace.OuterClass70.InnerEnum70.ie70a, ic70);
+ oc80.take(nspacemove_nestedNamespace.Space.OuterClass80.InnerEnum80.ie80a, ic80);
+ }
+}
diff --git a/Examples/test-suite/d/nspacemove_nested_runme.2.d b/Examples/test-suite/d/nspacemove_nested_runme.2.d
new file mode 100644
index 000000000..7830eb291
--- /dev/null
+++ b/Examples/test-suite/d/nspacemove_nested_runme.2.d
@@ -0,0 +1,75 @@
+module nspacemove_nested_runme;
+
+import std.exception;
+import nspacemove_nested.nspacemove_nested;
+static import nspacemove_nested.Space.OuterClass1;
+static import nspacemove_nested.Space.OuterClass2;
+static import nspacemove_nested.NewSpace3.OuterClass3;
+static import nspacemove_nested.NewSpace4.OuterClass4;
+static import nspacemove_nested.OuterClass5;
+static import nspacemove_nested.OuterClass6;
+static import nspacemove_nested.OuterClass7;
+static import nspacemove_nested.Space.OuterClass10;
+static import nspacemove_nested.Space.OuterClass20;
+static import nspacemove_nested.NewOkay30.OuterClass30;
+static import nspacemove_nested.NewOkay40.OuterClass40;
+static import nspacemove_nested.NewOkay50.OuterClass50;
+static import nspacemove_nested.OuterClass60;
+static import nspacemove_nested.OuterClass70;
+static import nspacemove_nested.Space.OuterClass80;
+
+void main() {
+ // outer classes
+ auto oc1 = new nspacemove_nested.Space.OuterClass1.OuterClass1();
+ auto oc2 = new nspacemove_nested.Space.OuterClass2.OuterClass2();
+ auto oc3 = new nspacemove_nested.NewSpace3.OuterClass3.OuterClass3();
+ auto oc4 = new nspacemove_nested.NewSpace4.OuterClass4.OuterClass4();
+ auto oc5 = new nspacemove_nested.OuterClass5.OuterClass5();
+ auto oc6 = new nspacemove_nested.OuterClass6.OuterClass6();
+ auto oc7 = new nspacemove_nested.OuterClass7.OuterClass7();
+
+ auto oc10 = new nspacemove_nested.Space.OuterClass10.OuterClass10();
+ auto oc20 = new nspacemove_nested.Space.OuterClass20.OuterClass20();
+ auto oc30 = new nspacemove_nested.NewOkay30.OuterClass30.OuterClass30();
+ auto oc40 = new nspacemove_nested.NewOkay40.OuterClass40.OuterClass40();
+ auto oc50 = new nspacemove_nested.NewOkay50.OuterClass50.OuterClass50();
+ auto oc60 = new nspacemove_nested.OuterClass60.OuterClass60();
+ auto oc70 = new nspacemove_nested.OuterClass70.OuterClass70();
+ auto oc80 = new nspacemove_nested.Space.OuterClass80.OuterClass80();
+
+ // inner classes
+ auto ic1 = new nspacemove_nested.Space.InnerClass1.InnerClass1();
+ auto ic2 = new nspacemove_nested.Space.InnerClass2.InnerClass2();
+ auto ic3 = new nspacemove_nested.NewSpace3.InnerClass3.InnerClass3();
+ auto ic4 = new nspacemove_nested.NewSpace4.InnerClass4.InnerClass4();
+ auto ic5 = new nspacemove_nested.InnerClass5.InnerClass5();
+ auto ic6 = new nspacemove_nested.InnerClass6.InnerClass6();
+ auto ic7 = new nspacemove_nested.InnerClass7.InnerClass7();
+
+ auto ic10 = new nspacemove_nested.Space.InnerClass10.InnerClass10();
+ auto ic20 = new nspacemove_nested.Space.InnerClass20.InnerClass20();
+ auto ic30 = new nspacemove_nested.NewOkay30.InnerClass30.InnerClass30();
+ auto ic40 = new nspacemove_nested.NewOkay40.InnerClass40.InnerClass40();
+ auto ic50 = new nspacemove_nested.NewOkay50.InnerClass50.InnerClass50();
+ auto ic60 = new nspacemove_nested.InnerClass60.InnerClass60();
+ auto ic70 = new nspacemove_nested.InnerClass70.InnerClass70();
+ auto ic80 = new nspacemove_nested.Space.InnerClass80.InnerClass80();
+
+ // inner enums
+ oc1.take(nspacemove_nested.Space.OuterClass1.OuterClass1.InnerEnum1.ie1a, ic1);
+ oc2.take(nspacemove_nested.Space.OuterClass2.OuterClass2.InnerEnum2.ie2a, ic2);
+ oc3.take(nspacemove_nested.NewSpace3.OuterClass3.OuterClass3.InnerEnum3.ie3a, ic3);
+ oc4.take(nspacemove_nested.NewSpace4.OuterClass4.OuterClass4.InnerEnum4.ie4a, ic4);
+ oc5.take(nspacemove_nested.OuterClass5.OuterClass5.InnerEnum5.ie5a, ic5);
+ oc6.take(nspacemove_nested.OuterClass6.OuterClass6.InnerEnum6.ie6a, ic6);
+ oc7.take(nspacemove_nested.OuterClass7.OuterClass7.InnerEnum7.ie7a, ic7);
+
+ oc10.take(nspacemove_nested.Space.OuterClass10.OuterClass10.InnerEnum10.ie10a, ic10);
+ oc20.take(nspacemove_nested.Space.OuterClass20.OuterClass20.InnerEnum20.ie20a, ic20);
+ oc30.take(nspacemove_nested.NewOkay30.OuterClass30.OuterClass30.InnerEnum30.ie30a, ic30);
+ oc40.take(nspacemove_nested.NewOkay40.OuterClass40.OuterClass40.InnerEnum40.ie40a, ic40);
+ oc50.take(nspacemove_nested.NewOkay50.OuterClass50.OuterClass50.InnerEnum50.ie50a, ic50);
+ oc60.take(nspacemove_nested.OuterClass60.OuterClass60.InnerEnum60.ie60a, ic60);
+ oc70.take(nspacemove_nested.OuterClass70.OuterClass70.InnerEnum70.ie70a, ic70);
+ oc80.take(nspacemove_nested.Space.OuterClass80.OuterClass80.InnerEnum80.ie80a, ic80);
+}
diff --git a/Examples/test-suite/errors/cpp_nspacemove.i b/Examples/test-suite/errors/cpp_nspacemove.i
new file mode 100644
index 000000000..96a4d5002
--- /dev/null
+++ b/Examples/test-suite/errors/cpp_nspacemove.i
@@ -0,0 +1,166 @@
+%module xxx
+
+// Test nspace warnings (based on Examples/test-suite/nspacemove_nested.i)
+
+%feature("flatnested"); // must have in order to see nspace warnings when using Python as nested classes are otherwise simply ignored in Python
+
+%nspace Space::OuterClass1;
+%nspacemove(BadSpace1) Space::OuterClass1::InnerClass1;
+%nspacemove(BadSpace1) Space::OuterClass1::InnerEnum1;
+
+%nspace Space::OuterClass2;
+%nonspace Space::OuterClass2::InnerClass2;
+%nonspace Space::OuterClass2::InnerEnum2;
+
+%nspacemove(NewSpace3) Space::OuterClass3;
+%nspacemove(BadSpace3) Space::OuterClass3::InnerClass3;
+%nspacemove(BadSpace3) Space::OuterClass3::InnerEnum3;
+
+%nspacemove(NewSpace4) Space::OuterClass4;
+%nonspace Space::OuterClass4::InnerClass4;
+%nonspace Space::OuterClass4::InnerEnum4;
+
+%nspacemove(NewSpace5) Space::OuterClass5::InnerClass5;
+%nspacemove(NewSpace5) Space::OuterClass5::InnerEnum5;
+
+%nonspace Space::OuterClass6;
+%nspace Space::OuterClass6::InnerClass6;
+%nspace Space::OuterClass6::InnerEnum6;
+
+%nonspace Space::OuterClass7;
+%nspacemove(NewSpace7) Space::OuterClass7::InnerClass7;
+%nspacemove(NewSpace7) Space::OuterClass7::InnerEnum7;
+
+%inline %{
+namespace Space {
+ struct OuterClass1 {
+ struct InnerClass1 {
+ struct BottomClass1 {};
+ };
+ enum InnerEnum1 { ie1a, ie1b };
+ void take(InnerEnum1 e) {}
+ };
+ struct OuterClass2 {
+ struct InnerClass2 {
+ struct BottomClass2 {};
+ };
+ enum InnerEnum2 { ie2a, ie2b };
+ void take(InnerEnum2 e) {}
+ };
+ struct OuterClass3 {
+ struct InnerClass3 {
+ struct BottomClass3 {};
+ };
+ enum InnerEnum3 { ie3a, ie3b };
+ void take(InnerEnum3 e) {}
+ };
+ struct OuterClass4 {
+ struct InnerClass4 {
+ struct BottomClass4 {};
+ };
+ enum InnerEnum4 { ie4a, ie4b };
+ void take(InnerEnum4 e) {}
+ };
+ struct OuterClass5 {
+ struct InnerClass5 {
+ struct BottomClass5 {};
+ };
+ enum InnerEnum5 { ie5a, ie5b };
+ void take(InnerEnum5 e) {}
+ };
+ struct OuterClass6 {
+ struct InnerClass6 {
+ struct BottomClass6 {};
+ };
+ enum InnerEnum6 { ie6a, ie6b };
+ void take(InnerEnum6 e) {}
+ };
+ struct OuterClass7 {
+ struct InnerClass7 {
+ struct BottomClass7 {};
+ };
+ enum InnerEnum7 { ie7a, ie7b };
+ void take(InnerEnum7 e) {}
+ };
+}
+%}
+
+
+// These should not warn
+%nspace Space::OuterClass10;
+%nspace Space::OuterClass10::InnerClass10;
+%nspace Space::OuterClass10::InnerEnum10;
+
+%nspace Space::OuterClass20;
+%clearnspace Space::OuterClass20::InnerClass20;
+%clearnspace Space::OuterClass20::InnerEnum20;
+
+%nspacemove(NewOkay30) Space::OuterClass30;
+%nspace Space::OuterClass30::InnerClass30;
+%nspace Space::OuterClass30::InnerEnum40;
+
+%nspacemove(NewOkay40) Space::OuterClass40;
+%clearnspace Space::OuterClass40::InnerClass40;
+%clearnspace Space::OuterClass40::InnerEnum40;
+
+%nspacemove(NewOkay50) Space::OuterClass50;
+
+%nonspace Space::OuterClass60;
+%nonspace Space::OuterClass60::InnerClass60;
+%nonspace Space::OuterClass60::InnerEnum60;
+
+%nonspace Space::OuterClass70;
+
+%inline %{
+namespace Space {
+ struct OuterClass10 {
+ struct InnerClass10 {
+ struct BottomClass10 {};
+ };
+ enum InnerEnum10 { ie10a, ie10b };
+ void take(InnerEnum10 e) {}
+ };
+ struct OuterClass20 {
+ struct InnerClass20 {
+ struct BottomClass20 {};
+ };
+ enum InnerEnum20 { ie20a, ie20b };
+ void take(InnerEnum20 e) {}
+ };
+ struct OuterClass30 {
+ struct InnerClass30 {
+ struct BottomClass30 {};
+ };
+ enum InnerEnum30 { ie30a, ie30b };
+ void take(InnerEnum30 e) {}
+ };
+ struct OuterClass40 {
+ struct InnerClass40 {
+ struct BottomClass40 {};
+ };
+ enum InnerEnum40 { ie40a, ie40b };
+ void take(InnerEnum40 e) {}
+ };
+ struct OuterClass50 {
+ struct InnerClass50 {
+ struct BottomClass50 {};
+ };
+ enum InnerEnum50 { ie50a, ie50b };
+ void take(InnerEnum50 e) {}
+ };
+ struct OuterClass60 {
+ struct InnerClass60 {
+ struct BottomClass60 {};
+ };
+ enum InnerEnum60 { ie60a, ie60b };
+ void take(InnerEnum60 e) {}
+ };
+ struct OuterClass70 {
+ struct InnerClass70 {
+ struct BottomClass70 {};
+ };
+ enum InnerEnum70 { ie70a, ie70b };
+ void take(InnerEnum70 e) {}
+ };
+}
+%}
diff --git a/Examples/test-suite/errors/cpp_nspacemove.stderr b/Examples/test-suite/errors/cpp_nspacemove.stderr
new file mode 100644
index 000000000..72b6359fb
--- /dev/null
+++ b/Examples/test-suite/errors/cpp_nspacemove.stderr
@@ -0,0 +1,28 @@
+cpp_nspacemove.i:37: Warning 406: Ignoring nspace setting (BadSpace1) for 'Space::OuterClass1::InnerClass1',
+cpp_nspacemove.i:36: Warning 406: as it conflicts with the nspace setting (Space) for outer class 'Space::OuterClass1'.
+cpp_nspacemove.i:40: Warning 406: Ignoring nspace setting (BadSpace1) for 'Space::OuterClass1::InnerEnum1',
+cpp_nspacemove.i:36: Warning 406: as it conflicts with the nspace setting (Space) for outer class 'Space::OuterClass1'.
+cpp_nspacemove.i:44: Warning 406: Ignoring nspace setting (0) for 'Space::OuterClass2::InnerClass2',
+cpp_nspacemove.i:43: Warning 406: as it conflicts with the nspace setting (Space) for outer class 'Space::OuterClass2'.
+cpp_nspacemove.i:47: Warning 406: Ignoring nspace setting (0) for 'Space::OuterClass2::InnerEnum2',
+cpp_nspacemove.i:43: Warning 406: as it conflicts with the nspace setting (Space) for outer class 'Space::OuterClass2'.
+cpp_nspacemove.i:51: Warning 406: Ignoring nspace setting (BadSpace3) for 'Space::OuterClass3::InnerClass3',
+cpp_nspacemove.i:50: Warning 406: as it conflicts with the nspace setting (NewSpace3) for outer class 'Space::OuterClass3'.
+cpp_nspacemove.i:54: Warning 406: Ignoring nspace setting (BadSpace3) for 'Space::OuterClass3::InnerEnum3',
+cpp_nspacemove.i:50: Warning 406: as it conflicts with the nspace setting (NewSpace3) for outer class 'Space::OuterClass3'.
+cpp_nspacemove.i:58: Warning 406: Ignoring nspace setting (0) for 'Space::OuterClass4::InnerClass4',
+cpp_nspacemove.i:57: Warning 406: as it conflicts with the nspace setting (NewSpace4) for outer class 'Space::OuterClass4'.
+cpp_nspacemove.i:61: Warning 406: Ignoring nspace setting (0) for 'Space::OuterClass4::InnerEnum4',
+cpp_nspacemove.i:57: Warning 406: as it conflicts with the nspace setting (NewSpace4) for outer class 'Space::OuterClass4'.
+cpp_nspacemove.i:65: Warning 406: Ignoring nspace setting (NewSpace5) for 'Space::OuterClass5::InnerClass5',
+cpp_nspacemove.i:64: Warning 406: as it conflicts with the nspace setting () for outer class 'Space::OuterClass5'.
+cpp_nspacemove.i:68: Warning 406: Ignoring nspace setting (NewSpace5) for 'Space::OuterClass5::InnerEnum5',
+cpp_nspacemove.i:64: Warning 406: as it conflicts with the nspace setting () for outer class 'Space::OuterClass5'.
+cpp_nspacemove.i:72: Warning 406: Ignoring nspace setting (1) for 'Space::OuterClass6::InnerClass6',
+cpp_nspacemove.i:71: Warning 406: as it conflicts with the nspace setting () for outer class 'Space::OuterClass6'.
+cpp_nspacemove.i:75: Warning 406: Ignoring nspace setting (1) for 'Space::OuterClass6::InnerEnum6',
+cpp_nspacemove.i:71: Warning 406: as it conflicts with the nspace setting () for outer class 'Space::OuterClass6'.
+cpp_nspacemove.i:79: Warning 406: Ignoring nspace setting (NewSpace7) for 'Space::OuterClass7::InnerClass7',
+cpp_nspacemove.i:78: Warning 406: as it conflicts with the nspace setting () for outer class 'Space::OuterClass7'.
+cpp_nspacemove.i:82: Warning 406: Ignoring nspace setting (NewSpace7) for 'Space::OuterClass7::InnerEnum7',
+cpp_nspacemove.i:78: Warning 406: as it conflicts with the nspace setting () for outer class 'Space::OuterClass7'.
diff --git a/Examples/test-suite/java/Makefile.in b/Examples/test-suite/java/Makefile.in
index 5656eb551..3d60a85e2 100644
--- a/Examples/test-suite/java/Makefile.in
+++ b/Examples/test-suite/java/Makefile.in
@@ -86,8 +86,9 @@ java_director_exception_feature_nspace.%: JAVA_PACKAGE = $*Package
java_nspacewithoutpackage.%: JAVA_PACKAGEOPT =
multiple_inheritance_nspace.%: JAVA_PACKAGE = $*Package
nspace.%: JAVA_PACKAGE = $*Package
-nspacemove.%: JAVA_PACKAGE = $*Package
nspace_extend.%: JAVA_PACKAGE = $*Package
+nspacemove.%: JAVA_PACKAGE = $*Package
+nspacemove_nested.%: JAVA_PACKAGE = $*Package
# Rules for the different types of tests
%.cpptest:
diff --git a/Examples/test-suite/java/nspacemove_nested_runme.java b/Examples/test-suite/java/nspacemove_nested_runme.java
new file mode 100644
index 000000000..6d06630c9
--- /dev/null
+++ b/Examples/test-suite/java/nspacemove_nested_runme.java
@@ -0,0 +1,67 @@
+public class nspacemove_nested_runme {
+
+ static {
+ try {
+ System.loadLibrary("nspacemove_nested");
+ } catch (UnsatisfiedLinkError e) {
+ System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e);
+ System.exit(1);
+ }
+ }
+
+ public static void main(String argv[]) {
+ // outer classes
+ nspacemove_nestedPackage.Space.OuterClass1 oc1 = new nspacemove_nestedPackage.Space.OuterClass1();
+ nspacemove_nestedPackage.Space.OuterClass2 oc2 = new nspacemove_nestedPackage.Space.OuterClass2();
+ nspacemove_nestedPackage.NewSpace3.OuterClass3 oc3 = new nspacemove_nestedPackage.NewSpace3.OuterClass3();
+ nspacemove_nestedPackage.NewSpace4.OuterClass4 oc4 = new nspacemove_nestedPackage.NewSpace4.OuterClass4();
+ nspacemove_nestedPackage.OuterClass5 oc5 = new nspacemove_nestedPackage.OuterClass5();
+ nspacemove_nestedPackage.OuterClass6 oc6 = new nspacemove_nestedPackage.OuterClass6();
+ nspacemove_nestedPackage.OuterClass7 oc7 = new nspacemove_nestedPackage.OuterClass7();
+
+ nspacemove_nestedPackage.Space.OuterClass10 oc10 = new nspacemove_nestedPackage.Space.OuterClass10();
+ nspacemove_nestedPackage.Space.OuterClass20 oc20 = new nspacemove_nestedPackage.Space.OuterClass20();
+ nspacemove_nestedPackage.NewOkay30.OuterClass30 oc30 = new nspacemove_nestedPackage.NewOkay30.OuterClass30();
+ nspacemove_nestedPackage.NewOkay40.OuterClass40 oc40 = new nspacemove_nestedPackage.NewOkay40.OuterClass40();
+ nspacemove_nestedPackage.NewOkay50.OuterClass50 oc50 = new nspacemove_nestedPackage.NewOkay50.OuterClass50();
+ nspacemove_nestedPackage.OuterClass60 oc60 = new nspacemove_nestedPackage.OuterClass60();
+ nspacemove_nestedPackage.OuterClass70 oc70 = new nspacemove_nestedPackage.OuterClass70();
+ nspacemove_nestedPackage.Space.OuterClass80 oc80 = new nspacemove_nestedPackage.Space.OuterClass80();
+
+ // inner classes
+ nspacemove_nestedPackage.Space.OuterClass1.InnerClass1 ic1 = new nspacemove_nestedPackage.Space.OuterClass1.InnerClass1();
+ nspacemove_nestedPackage.Space.OuterClass2.InnerClass2 ic2 = new nspacemove_nestedPackage.Space.OuterClass2.InnerClass2();
+ nspacemove_nestedPackage.NewSpace3.OuterClass3.InnerClass3 ic3 = new nspacemove_nestedPackage.NewSpace3.OuterClass3.InnerClass3();
+ nspacemove_nestedPackage.NewSpace4.OuterClass4.InnerClass4 ic4 = new nspacemove_nestedPackage.NewSpace4.OuterClass4.InnerClass4();
+ nspacemove_nestedPackage.OuterClass5.InnerClass5 ic5 = new nspacemove_nestedPackage.OuterClass5.InnerClass5();
+ nspacemove_nestedPackage.OuterClass6.InnerClass6 ic6 = new nspacemove_nestedPackage.OuterClass6.InnerClass6();
+ nspacemove_nestedPackage.OuterClass7.InnerClass7 ic7 = new nspacemove_nestedPackage.OuterClass7.InnerClass7();
+
+ nspacemove_nestedPackage.Space.OuterClass10.InnerClass10 ic10 = new nspacemove_nestedPackage.Space.OuterClass10.InnerClass10();
+ nspacemove_nestedPackage.Space.OuterClass20.InnerClass20 ic20 = new nspacemove_nestedPackage.Space.OuterClass20.InnerClass20();
+ nspacemove_nestedPackage.NewOkay30.OuterClass30.InnerClass30 ic30 = new nspacemove_nestedPackage.NewOkay30.OuterClass30.InnerClass30();
+ nspacemove_nestedPackage.NewOkay40.OuterClass40.InnerClass40 ic40 = new nspacemove_nestedPackage.NewOkay40.OuterClass40.InnerClass40();
+ nspacemove_nestedPackage.NewOkay50.OuterClass50.InnerClass50 ic50 = new nspacemove_nestedPackage.NewOkay50.OuterClass50.InnerClass50();
+ nspacemove_nestedPackage.OuterClass60.InnerClass60 ic60 = new nspacemove_nestedPackage.OuterClass60.InnerClass60();
+ nspacemove_nestedPackage.OuterClass70.InnerClass70 ic70 = new nspacemove_nestedPackage.OuterClass70.InnerClass70();
+ nspacemove_nestedPackage.Space.OuterClass80.InnerClass80 ic80 = new nspacemove_nestedPackage.Space.OuterClass80.InnerClass80();
+
+ // inner enums
+ oc1.take(nspacemove_nestedPackage.Space.OuterClass1.InnerEnum1.ie1a, ic1);
+ oc2.take(nspacemove_nestedPackage.Space.OuterClass2.InnerEnum2.ie2a, ic2);
+ oc3.take(nspacemove_nestedPackage.NewSpace3.OuterClass3.InnerEnum3.ie3a, ic3);
+ oc4.take(nspacemove_nestedPackage.NewSpace4.OuterClass4.InnerEnum4.ie4a, ic4);
+ oc5.take(nspacemove_nestedPackage.OuterClass5.InnerEnum5.ie5a, ic5);
+ oc6.take(nspacemove_nestedPackage.OuterClass6.InnerEnum6.ie6a, ic6);
+ oc7.take(nspacemove_nestedPackage.OuterClass7.InnerEnum7.ie7a, ic7);
+
+ oc10.take(nspacemove_nestedPackage.Space.OuterClass10.InnerEnum10.ie10a, ic10);
+ oc20.take(nspacemove_nestedPackage.Space.OuterClass20.InnerEnum20.ie20a, ic20);
+ oc30.take(nspacemove_nestedPackage.NewOkay30.OuterClass30.InnerEnum30.ie30a, ic30);
+ oc40.take(nspacemove_nestedPackage.NewOkay40.OuterClass40.InnerEnum40.ie40a, ic40);
+ oc50.take(nspacemove_nestedPackage.NewOkay50.OuterClass50.InnerEnum50.ie50a, ic50);
+ oc60.take(nspacemove_nestedPackage.OuterClass60.InnerEnum60.ie60a, ic60);
+ oc70.take(nspacemove_nestedPackage.OuterClass70.InnerEnum70.ie70a, ic70);
+ oc80.take(nspacemove_nestedPackage.Space.OuterClass80.InnerEnum80.ie80a, ic80);
+ }
+}
diff --git a/Examples/test-suite/javascript/nspacemove_nested_runme.js b/Examples/test-suite/javascript/nspacemove_nested_runme.js
new file mode 100644
index 000000000..a2ea7ff20
--- /dev/null
+++ b/Examples/test-suite/javascript/nspacemove_nested_runme.js
@@ -0,0 +1,55 @@
+var nspacemove_nested = require("nspacemove_nested");
+
+// outer classes
+oc1 = new nspacemove_nested.Space.OuterClass1()
+oc2 = new nspacemove_nested.Space.OuterClass2()
+oc3 = new nspacemove_nested.NewSpace3.OuterClass3()
+oc4 = new nspacemove_nested.NewSpace4.OuterClass4()
+oc5 = new nspacemove_nested.OuterClass5()
+oc6 = new nspacemove_nested.OuterClass6()
+oc7 = new nspacemove_nested.OuterClass7()
+
+oc10 = new nspacemove_nested.Space.OuterClass10()
+oc20 = new nspacemove_nested.Space.OuterClass20()
+oc30 = new nspacemove_nested.NewOkay30.OuterClass30()
+oc40 = new nspacemove_nested.NewOkay40.OuterClass40()
+oc50 = new nspacemove_nested.NewOkay50.OuterClass50()
+oc60 = new nspacemove_nested.OuterClass60()
+oc70 = new nspacemove_nested.OuterClass70()
+oc80 = new nspacemove_nested.Space.OuterClass80()
+
+// inner classes
+ic1 = new nspacemove_nested.Space.InnerClass1()
+ic2 = new nspacemove_nested.Space.InnerClass2()
+ic3 = new nspacemove_nested.NewSpace3.InnerClass3()
+ic4 = new nspacemove_nested.NewSpace4.InnerClass4()
+ic5 = new nspacemove_nested.InnerClass5()
+ic6 = new nspacemove_nested.InnerClass6()
+ic7 = new nspacemove_nested.InnerClass7()
+
+ic10 = new nspacemove_nested.Space.InnerClass10()
+ic20 = new nspacemove_nested.Space.InnerClass20()
+ic30 = new nspacemove_nested.NewOkay30.InnerClass30()
+ic40 = new nspacemove_nested.NewOkay40.InnerClass40()
+ic50 = new nspacemove_nested.NewOkay50.InnerClass50()
+ic60 = new nspacemove_nested.InnerClass60()
+ic70 = new nspacemove_nested.InnerClass70()
+ic80 = new nspacemove_nested.Space.InnerClass80()
+
+// inner enums
+oc1.take(nspacemove_nested.Space.OuterClass1.ie1a, ic1)
+oc2.take(nspacemove_nested.Space.OuterClass2.ie2a, ic2)
+oc3.take(nspacemove_nested.NewSpace3.OuterClass3.ie3a, ic3)
+oc4.take(nspacemove_nested.NewSpace4.OuterClass4.ie4a, ic4)
+oc5.take(nspacemove_nested.OuterClass5.ie5a, ic5)
+oc6.take(nspacemove_nested.OuterClass6.ie6a, ic6)
+oc7.take(nspacemove_nested.OuterClass7.ie7a, ic7)
+
+oc10.take(nspacemove_nested.Space.OuterClass10.ie10a, ic10)
+oc20.take(nspacemove_nested.Space.OuterClass20.ie20a, ic20)
+oc30.take(nspacemove_nested.NewOkay30.OuterClass30.ie30a, ic30)
+oc40.take(nspacemove_nested.NewOkay40.OuterClass40.ie40a, ic40)
+oc50.take(nspacemove_nested.NewOkay50.OuterClass50.ie50a, ic50)
+oc60.take(nspacemove_nested.OuterClass60.ie60a, ic60)
+oc70.take(nspacemove_nested.OuterClass70.ie70a, ic70)
+oc80.take(nspacemove_nested.Space.OuterClass80.ie80a, ic80)
diff --git a/Examples/test-suite/lua/nspacemove_nested_runme.lua b/Examples/test-suite/lua/nspacemove_nested_runme.lua
new file mode 100644
index 000000000..5a4a6fd72
--- /dev/null
+++ b/Examples/test-suite/lua/nspacemove_nested_runme.lua
@@ -0,0 +1,61 @@
+require("import") -- the import fn
+import("nspacemove_nested") -- import lib
+
+-- catch "undefined" global variables
+local env = _ENV -- Lua 5.2
+if not env then env = getfenv () end -- Lua 5.1
+setmetatable(env, {__index=function (t,i) error("undefined global variable `"..i.."'",2) end})
+
+ -- outer classes
+ oc1 = nspacemove_nested.Space.OuterClass1()
+ oc2 = nspacemove_nested.Space.OuterClass2()
+ oc3 = nspacemove_nested.NewSpace3.OuterClass3()
+ oc4 = nspacemove_nested.NewSpace4.OuterClass4()
+ oc5 = nspacemove_nested.OuterClass5()
+ oc6 = nspacemove_nested.OuterClass6()
+ oc7 = nspacemove_nested.OuterClass7()
+
+ oc10 = nspacemove_nested.Space.OuterClass10()
+ oc20 = nspacemove_nested.Space.OuterClass20()
+ oc30 = nspacemove_nested.NewOkay30.OuterClass30()
+ oc40 = nspacemove_nested.NewOkay40.OuterClass40()
+ oc50 = nspacemove_nested.NewOkay50.OuterClass50()
+ oc60 = nspacemove_nested.OuterClass60()
+ oc70 = nspacemove_nested.OuterClass70()
+ oc80 = nspacemove_nested.Space.OuterClass80()
+
+ -- inner classes
+ ic1 = nspacemove_nested.Space.InnerClass1()
+ ic2 = nspacemove_nested.Space.InnerClass2()
+ ic3 = nspacemove_nested.NewSpace3.InnerClass3()
+ ic4 = nspacemove_nested.NewSpace4.InnerClass4()
+ ic5 = nspacemove_nested.InnerClass5()
+ ic6 = nspacemove_nested.InnerClass6()
+ ic7 = nspacemove_nested.InnerClass7()
+
+ ic10 = nspacemove_nested.Space.InnerClass10()
+ ic20 = nspacemove_nested.Space.InnerClass20()
+ ic30 = nspacemove_nested.NewOkay30.InnerClass30()
+ ic40 = nspacemove_nested.NewOkay40.InnerClass40()
+ ic50 = nspacemove_nested.NewOkay50.InnerClass50()
+ ic60 = nspacemove_nested.InnerClass60()
+ ic70 = nspacemove_nested.InnerClass70()
+ ic80 = nspacemove_nested.Space.InnerClass80()
+
+ -- inner enums
+ oc1:take(nspacemove_nested.Space.OuterClass1.ie1a, ic1)
+ oc2:take(nspacemove_nested.Space.OuterClass2.ie2a, ic2)
+ oc3:take(nspacemove_nested.NewSpace3.OuterClass3.ie3a, ic3)
+ oc4:take(nspacemove_nested.NewSpace4.OuterClass4.ie4a, ic4)
+ oc5:take(nspacemove_nested.OuterClass5.ie5a, ic5)
+ oc6:take(nspacemove_nested.OuterClass6.ie6a, ic6)
+ oc7:take(nspacemove_nested.OuterClass7.ie7a, ic7)
+
+ oc10:take(nspacemove_nested.Space.OuterClass10.ie10a, ic10)
+ oc20:take(nspacemove_nested.Space.OuterClass20.ie20a, ic20)
+ oc30:take(nspacemove_nested.NewOkay30.OuterClass30.ie30a, ic30)
+ oc40:take(nspacemove_nested.NewOkay40.OuterClass40.ie40a, ic40)
+ oc50:take(nspacemove_nested.NewOkay50.OuterClass50.ie50a, ic50)
+ oc60:take(nspacemove_nested.OuterClass60.ie60a, ic60)
+ oc70:take(nspacemove_nested.OuterClass70.ie70a, ic70)
+ oc80:take(nspacemove_nested.Space.OuterClass80.ie80a, ic80)
diff --git a/Examples/test-suite/nspace.i b/Examples/test-suite/nspace.i
index 2f87c3830..e1ca3a271 100644
--- a/Examples/test-suite/nspace.i
+++ b/Examples/test-suite/nspace.i
@@ -11,6 +11,7 @@ SWIG_JAVABODY_PROXY(public, public, SWIGTYPE)
%nspace;
%nonspace Outer::Inner2::NoNSpacePlease;
%nonspace Outer::Inner2::NoNSpacePlease::ReallyNoNSpaceEnum;
+%warnfilter(SWIGWARN_TYPE_NSPACE_SETTING) Outer::Inner2::NoNSpacePlease;
%copyctor;
%ignore Outer::Inner2::Color::Color();
diff --git a/Examples/test-suite/nspacemove_nested.i b/Examples/test-suite/nspacemove_nested.i
new file mode 100644
index 000000000..5990938d1
--- /dev/null
+++ b/Examples/test-suite/nspacemove_nested.i
@@ -0,0 +1,201 @@
+%module nspacemove_nested
+
+// Tests nested classes for badly configured %nspace, %nonspace, %nspacemove combinations
+// Based off Examples/test-suite/errors/swig_nspacemove.i
+
+#if !defined(SWIGCSHARP) && !defined(SWIGJAVA)
+%feature ("flatnested");
+#endif
+
+// These will warn, hence suppressed in this testcase
+
+// Note that these could also be suppressed at the outer class level, eg:
+// %warnfilter(SWIGWARN_TYPE_NSPACE_SETTING) Space::OuterClass1;
+// Or even at namespace level:
+// %warnfilter(SWIGWARN_TYPE_NSPACE_SETTING) Space;
+
+%warnfilter(SWIGWARN_TYPE_NSPACE_SETTING) Space::OuterClass1::InnerClass1;
+%warnfilter(SWIGWARN_TYPE_NSPACE_SETTING) Space::OuterClass2::InnerClass2;
+%warnfilter(SWIGWARN_TYPE_NSPACE_SETTING) Space::OuterClass3::InnerClass3;
+%warnfilter(SWIGWARN_TYPE_NSPACE_SETTING) Space::OuterClass4::InnerClass4;
+%warnfilter(SWIGWARN_TYPE_NSPACE_SETTING) Space::OuterClass5::InnerClass5;
+%warnfilter(SWIGWARN_TYPE_NSPACE_SETTING) Space::OuterClass6::InnerClass6;
+%warnfilter(SWIGWARN_TYPE_NSPACE_SETTING) Space::OuterClass7::InnerClass7;
+
+%warnfilter(SWIGWARN_TYPE_NSPACE_SETTING) Space::OuterClass1::InnerEnum1;
+%warnfilter(SWIGWARN_TYPE_NSPACE_SETTING) Space::OuterClass2::InnerEnum2;
+%warnfilter(SWIGWARN_TYPE_NSPACE_SETTING) Space::OuterClass3::InnerEnum3;
+%warnfilter(SWIGWARN_TYPE_NSPACE_SETTING) Space::OuterClass4::InnerEnum4;
+%warnfilter(SWIGWARN_TYPE_NSPACE_SETTING) Space::OuterClass5::InnerEnum5;
+%warnfilter(SWIGWARN_TYPE_NSPACE_SETTING) Space::OuterClass6::InnerEnum6;
+%warnfilter(SWIGWARN_TYPE_NSPACE_SETTING) Space::OuterClass7::InnerEnum7;
+
+%nspace Space::OuterClass1;
+%nspacemove(BadSpace1) Space::OuterClass1::InnerClass1;
+%nspacemove(BadSpace1) Space::OuterClass1::InnerEnum1;
+
+%nspace Space::OuterClass2;
+%nonspace Space::OuterClass2::InnerClass2;
+%nonspace Space::OuterClass2::InnerEnum2;
+
+%nspacemove(NewSpace3) Space::OuterClass3;
+%nspacemove(BadSpace3) Space::OuterClass3::InnerClass3;
+%nspacemove(BadSpace3) Space::OuterClass3::InnerEnum3;
+
+%nspacemove(NewSpace4) Space::OuterClass4;
+%nonspace Space::OuterClass4::InnerClass4;
+%nonspace Space::OuterClass4::InnerEnum4;
+
+%nspacemove(NewSpace5) Space::OuterClass5::InnerClass5;
+%nspacemove(NewSpace5) Space::OuterClass5::InnerEnum5;
+
+%nonspace Space::OuterClass6;
+%nspace Space::OuterClass6::InnerClass6;
+%nspace Space::OuterClass6::InnerEnum6;
+
+%nonspace Space::OuterClass7;
+%nspacemove(NewSpace7) Space::OuterClass7::InnerClass7;
+%nspacemove(NewSpace7) Space::OuterClass7::InnerEnum7;
+
+%inline %{
+namespace Space {
+ struct OuterClass1 {
+ struct InnerClass1 {
+ struct BottomClass1 {};
+ };
+ enum InnerEnum1 { ie1a, ie1b };
+ void take(InnerEnum1 e, InnerClass1 c) {}
+ };
+ struct OuterClass2 {
+ struct InnerClass2 {
+ struct BottomClass2 {};
+ };
+ enum InnerEnum2 { ie2a, ie2b };
+ void take(InnerEnum2 e, InnerClass2 c) {}
+ };
+ struct OuterClass3 {
+ struct InnerClass3 {
+ struct BottomClass3 {};
+ };
+ enum InnerEnum3 { ie3a, ie3b };
+ void take(InnerEnum3 e, InnerClass3 c) {}
+ };
+ struct OuterClass4 {
+ struct InnerClass4 {
+ struct BottomClass4 {};
+ };
+ enum InnerEnum4 { ie4a, ie4b };
+ void take(InnerEnum4 e, InnerClass4 c) {}
+ };
+ struct OuterClass5 {
+ struct InnerClass5 {
+ struct BottomClass5 {};
+ };
+ enum InnerEnum5 { ie5a, ie5b };
+ void take(InnerEnum5 e, InnerClass5 c) {}
+ };
+ struct OuterClass6 {
+ struct InnerClass6 {
+ struct BottomClass6 {};
+ };
+ enum InnerEnum6 { ie6a, ie6b };
+ void take(InnerEnum6 e, InnerClass6 c) {}
+ };
+ struct OuterClass7 {
+ struct InnerClass7 {
+ struct BottomClass7 {};
+ };
+ enum InnerEnum7 { ie7a, ie7b };
+ void take(InnerEnum7 e, InnerClass7 c) {}
+ };
+}
+%}
+
+
+// These should not warn
+%nspace Space::OuterClass10;
+%nspace Space::OuterClass10::InnerClass10;
+%nspace Space::OuterClass10::InnerEnum10;
+
+%nspace Space::OuterClass20;
+%clearnspace Space::OuterClass20::InnerClass20;
+%clearnspace Space::OuterClass20::InnerEnum20;
+
+%nspacemove(NewOkay30) Space::OuterClass30;
+%nspace Space::OuterClass30::InnerClass30;
+%nspace Space::OuterClass30::InnerEnum40;
+
+%nspacemove(NewOkay40) Space::OuterClass40;
+%clearnspace Space::OuterClass40::InnerClass40;
+%clearnspace Space::OuterClass40::InnerEnum40;
+
+%nspacemove(NewOkay50) Space::OuterClass50;
+
+%nonspace Space::OuterClass60;
+%nonspace Space::OuterClass60::InnerClass60;
+%nonspace Space::OuterClass60::InnerEnum60;
+
+%nonspace Space::OuterClass70;
+
+%nspace Space::OuterClass80;
+
+%inline %{
+namespace Space {
+ struct OuterClass10 {
+ struct InnerClass10 {
+ struct BottomClass10 {};
+ };
+ enum InnerEnum10 { ie10a, ie10b };
+ void take(InnerEnum10 e, InnerClass10 c) {}
+ };
+ struct OuterClass20 {
+ struct InnerClass20 {
+ struct BottomClass20 {};
+ };
+ enum InnerEnum20 { ie20a, ie20b };
+ void take(InnerEnum20 e, InnerClass20 c) {}
+ };
+ struct OuterClass30 {
+ struct InnerClass30 {
+ struct BottomClass30 {};
+ };
+ enum InnerEnum30 { ie30a, ie30b };
+ void take(InnerEnum30 e, InnerClass30 c) {}
+ };
+ struct OuterClass40 {
+ struct InnerClass40 {
+ struct BottomClass40 {};
+ };
+ enum InnerEnum40 { ie40a, ie40b };
+ void take(InnerEnum40 e, InnerClass40 c) {}
+ };
+ struct OuterClass50 {
+ struct InnerClass50 {
+ struct BottomClass50 {};
+ };
+ enum InnerEnum50 { ie50a, ie50b };
+ void take(InnerEnum50 e, InnerClass50 c) {}
+ };
+ struct OuterClass60 {
+ struct InnerClass60 {
+ struct BottomClass60 {};
+ };
+ enum InnerEnum60 { ie60a, ie60b };
+ void take(InnerEnum60 e, InnerClass60 c) {}
+ };
+ struct OuterClass70 {
+ struct InnerClass70 {
+ struct BottomClass70 {};
+ };
+ enum InnerEnum70 { ie70a, ie70b };
+ void take(InnerEnum70 e, InnerClass70 c) {}
+ };
+ struct OuterClass80 {
+ struct InnerClass80 {
+ struct BottomClass80 {};
+ };
+ enum InnerEnum80 { ie80a, ie80b };
+ void take(InnerEnum80 e, InnerClass80 c) {}
+ };
+}
+%}
diff --git a/Source/Include/swigwarn.h b/Source/Include/swigwarn.h
index 6edacbdd5..6e0c083e0 100644
--- a/Source/Include/swigwarn.h
+++ b/Source/Include/swigwarn.h
@@ -163,6 +163,7 @@
#define WARN_TYPE_ABSTRACT 403
#define WARN_TYPE_REDEFINED 404
#define WARN_TYPE_RVALUE_REF_QUALIFIER_IGNORED 405
+#define WARN_TYPE_NSPACE_SETTING 406
/* Unused since 4.1.0: #define WARN_TYPEMAP_SOURCETARGET 450 */
#define WARN_TYPEMAP_CHARLEAK 451
diff --git a/Source/Modules/typepass.cxx b/Source/Modules/typepass.cxx
index 5c9c4e48f..29b285c59 100644
--- a/Source/Modules/typepass.cxx
+++ b/Source/Modules/typepass.cxx
@@ -341,6 +341,54 @@ class TypePass:private Dispatcher {
Delete(allbases);
}
+ /* ------------------------------------------------------------
+ * nspace_setting()
+ *
+ * Configures "sym:nspace" on the node and returns an overridden
+ * nspace value when %nspacemove is used.
+ * outer should point to parent class.
+ * ------------------------------------------------------------ */
+
+ String *nspace_setting(Node *n, Node *outer) {
+ String *nssymname_new = nssymname;
+ String *feature_nspace = GetFlagAttr(n, "feature:nspace");
+ String *nspace = Copy(feature_nspace);
+ Replaceall(nspace, "::", ".");
+ if (outer) {
+ // Nested class or enum in a class
+ String *outer_nspace = Getattr(outer, "sym:nspace");
+ //Printf(stdout, "nspace value %s on %s\n", outer_nspace, Getattr(n, "name"));
+ String *nspace_attribute = Getattr(n, "feature:nspace");;
+ bool warn = false;
+ if (outer_nspace) {
+ if (Equal(nspace_attribute, "0")) {
+ warn = true;
+ } else if (nspace && !(Equal(nspace, "1") || Equal(nspace, outer_nspace))) {
+ warn = true;
+ }
+ } else if (nspace) {
+ warn = true;
+ }
+ if (warn) {
+ Swig_warning(WARN_TYPE_NSPACE_SETTING, Getfile(n), Getline(n), "Ignoring nspace setting (%s) for '%s',\n", nspace_attribute, Swig_name_decl(n));
+ Swig_warning(WARN_TYPE_NSPACE_SETTING, Getfile(outer), Getline(outer), "as it conflicts with the nspace setting (%s) for outer class '%s'.\n", outer_nspace, Swig_name_decl(outer));
+ }
+ Setattr(n, "sym:nspace", outer_nspace);
+ //Printf(stdout, "setting nspace %s on %s to %s\n", outer_nspace, Getattr(n, "name"), outer_nspace);
+ } else {
+ if (nspace) {
+ if (Equal(nspace, "1")) {
+ if (nssymname)
+ Setattr(n, "sym:nspace", nssymname);
+ } else {
+ Setattr(n, "sym:nspace", nspace);
+ nssymname_new = nspace;
+ }
+ }
+ }
+ return nssymname_new;
+ }
+
/* ------------------------------------------------------------
* top()
* ------------------------------------------------------------ */
@@ -495,18 +543,7 @@ class TypePass:private Dispatcher {
}
String *oldnssymname = nssymname;
- String *nspace_feature = GetFlagAttr(n, "feature:nspace");
- String *nspace = Copy(nspace_feature);
- Replaceall(nspace, "::", ".");
- if (nspace) {
- if (Equal(nspace, "1")) {
- if (nssymname)
- Setattr(n, "sym:nspace", nssymname);
- } else {
- Setattr(n, "sym:nspace", nspace);
- nssymname = nspace;
- }
- }
+ nssymname = nspace_setting(n, Getattr(n, "nested:outer"));
SwigType_new_scope(scopename);
SwigType_attach_symtab(Getattr(n, "symtab"));
@@ -845,18 +882,8 @@ class TypePass:private Dispatcher {
Setattr(n, "enumtype", enumtype);
String *oldnssymname = nssymname;
- String *nspace_feature = GetFlagAttr(n, "feature:nspace");
- String *nspace = Copy(nspace_feature);
- Replaceall(nspace, "::", ".");
- if (nspace) {
- if (Equal(nspace, "1")) {
- if (nssymname)
- Setattr(n, "sym:nspace", nssymname);
- } else {
- Setattr(n, "sym:nspace", nspace);
- nssymname = nspace;
- }
- }
+ Node *parent = parentNode(n);
+ nssymname = nspace_setting(n, parent && Equal(nodeType(parent), "class") ? parent : NULL);
// This block of code is for dealing with %ignore on an enum item where the target language
// attempts to use the C enum value in the target language itself and expects the previous enum value