From 59827e7191bab776853b0ee866e604dc5df4706b Mon Sep 17 00:00:00 2001 From: William S Fulton Date: Sun, 26 May 2024 16:22:10 +0100 Subject: [PATCH] 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'. This really helps with %nspacemove as now one can simply move an outer class to another namespace, like this: %nspacemove(AnotherSpace) Space::OuterClass80; and all the nested classes will automatically also be moved into the appropriate namespace. --- CHANGES.current | 32 +++ Doc/Manual/Warnings.html | 1 + Examples/test-suite/common.mk | 7 +- .../csharp/nspacemove_nested_runme.cs | 61 ++++++ .../test-suite/d/nspacemove_nested_runme.2.d | 75 +++++++ Examples/test-suite/errors/cpp_nspacemove.i | 166 +++++++++++++++ .../test-suite/errors/cpp_nspacemove.stderr | 28 +++ Examples/test-suite/java/Makefile.in | 3 +- .../java/nspacemove_nested_runme.java | 67 ++++++ .../javascript/nspacemove_nested_runme.js | 55 +++++ .../lua/nspacemove_nested_runme.lua | 61 ++++++ Examples/test-suite/nspace.i | 1 + Examples/test-suite/nspacemove_nested.i | 201 ++++++++++++++++++ Source/Include/swigwarn.h | 1 + Source/Modules/typepass.cxx | 75 ++++--- 15 files changed, 806 insertions(+), 28 deletions(-) create mode 100644 Examples/test-suite/csharp/nspacemove_nested_runme.cs create mode 100644 Examples/test-suite/d/nspacemove_nested_runme.2.d create mode 100644 Examples/test-suite/errors/cpp_nspacemove.i create mode 100644 Examples/test-suite/errors/cpp_nspacemove.stderr create mode 100644 Examples/test-suite/java/nspacemove_nested_runme.java create mode 100644 Examples/test-suite/javascript/nspacemove_nested_runme.js create mode 100644 Examples/test-suite/lua/nspacemove_nested_runme.lua create mode 100644 Examples/test-suite/nspacemove_nested.i 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