modelize_class: Link `subset_kind` with its corresponding production
authorJean-Christophe Beaupré <jcbrinfo@users.noreply.github.com>
Fri, 9 Jun 2017 05:30:16 +0000 (01:30 -0400)
committerJean-Christophe Beaupré <jcbrinfo@users.noreply.github.com>
Thu, 15 Jun 2017 18:48:09 +0000 (14:48 -0400)
Signed-off-by: Jean-Christophe Beaupré <jcbrinfo@users.noreply.github.com>

50 files changed:
src/modelize/modelize_class.nit
tests/base_error_class_kind.nit
tests/base_error_class_kind2.nit
tests/error_subset_no_new.nit [new file with mode: 0644]
tests/sav/base_error_class_kind2_alt1.res
tests/sav/base_error_class_kind2_alt10.res
tests/sav/base_error_class_kind2_alt11.res
tests/sav/base_error_class_kind2_alt12.res
tests/sav/base_error_class_kind2_alt13.res
tests/sav/base_error_class_kind2_alt14.res
tests/sav/base_error_class_kind2_alt15.res
tests/sav/base_error_class_kind2_alt16.res [new file with mode: 0644]
tests/sav/base_error_class_kind2_alt17.res [new file with mode: 0644]
tests/sav/base_error_class_kind2_alt18.res [new file with mode: 0644]
tests/sav/base_error_class_kind2_alt19.res [new file with mode: 0644]
tests/sav/base_error_class_kind2_alt2.res
tests/sav/base_error_class_kind2_alt20.res [new file with mode: 0644]
tests/sav/base_error_class_kind2_alt3.res
tests/sav/base_error_class_kind2_alt4.res
tests/sav/base_error_class_kind2_alt5.res
tests/sav/base_error_class_kind2_alt6.res
tests/sav/base_error_class_kind2_alt7.res
tests/sav/base_error_class_kind2_alt8.res
tests/sav/base_error_class_kind2_alt9.res
tests/sav/base_error_class_kind_alt1.res
tests/sav/base_error_class_kind_alt10.res
tests/sav/base_error_class_kind_alt11.res
tests/sav/base_error_class_kind_alt12.res
tests/sav/base_error_class_kind_alt13.res
tests/sav/base_error_class_kind_alt14.res
tests/sav/base_error_class_kind_alt15.res
tests/sav/base_error_class_kind_alt16.res [new file with mode: 0644]
tests/sav/base_error_class_kind_alt17.res [new file with mode: 0644]
tests/sav/base_error_class_kind_alt18.res [new file with mode: 0644]
tests/sav/base_error_class_kind_alt19.res [new file with mode: 0644]
tests/sav/base_error_class_kind_alt2.res
tests/sav/base_error_class_kind_alt20.res [new file with mode: 0644]
tests/sav/base_error_class_kind_alt26.res [new file with mode: 0644]
tests/sav/base_error_class_kind_alt3.res
tests/sav/base_error_class_kind_alt4.res
tests/sav/base_error_class_kind_alt5.res
tests/sav/base_error_class_kind_alt6.res
tests/sav/base_error_class_kind_alt7.res
tests/sav/base_error_class_kind_alt8.res
tests/sav/base_error_class_kind_alt9.res
tests/sav/error_subset_no_new.res [new file with mode: 0644]
tests/sav/test_object_class_kind_alt5.res [new file with mode: 0644]
tests/sav/test_subset_out_of_order_alt1.res [new file with mode: 0644]
tests/test_object_class_kind.nit
tests/test_subset_out_of_order.nit [new file with mode: 0644]

index 7580dde..553263b 100644 (file)
@@ -500,6 +500,9 @@ end
 redef class AExternClasskind
        redef fun mkind do return extern_kind
 end
+redef class ASubsetClasskind
+       redef fun mkind do return subset_kind
+end
 
 redef class AFormaldef
        # The associated parameter type
index 43644b0..16d7137 100644 (file)
@@ -37,6 +37,9 @@ end
 extern class ExC
 end
 
+subset SSet
+end
+
 ##
 
 interface SubI
@@ -45,6 +48,7 @@ interface SubI
        #alt2# super CC
        #alt3# super EnC
        #alt4# super ExC
+       #alt16# super SSet
 end
 
 abstract class SubA
@@ -53,6 +57,7 @@ abstract class SubA
        super CC
        #alt5# super EnC
        #alt6# super ExC
+       #alt17# super SSet
 end
 
 class SubC
@@ -61,6 +66,7 @@ class SubC
        super CC
        #alt7# super EnC
        #alt8# super ExC
+       #alt18# super SSet
 end
 
 enum SubEn
@@ -69,6 +75,7 @@ enum SubEn
        #alt10# super CC
        #alt11# super EnC
        #alt12# super ExC
+       #alt19# super SSet
 end
 
 extern class SubEx
@@ -77,4 +84,36 @@ extern class SubEx
        #alt14# super CC
        #alt15# super EnC
        super ExC
+       #alt20# super SSet
+end
+
+# A subset can inherit anything except a subset, and has only one direct parent.
+
+subset SSetI
+       super IC
+       # TODO: super AC
+       # TODO: super CC
+       # TODO: super EnC
+       # TODO: super ExC
+       # TODO: super SSet
+end
+
+subset SSetA
+       super AC
+end
+
+subset SSetC
+       super CC
+end
+
+subset SSetEn
+       super EnC
+end
+
+subset SSetEx
+       super ExC
 end
+
+#alt26# subset SubSSet
+#alt26#        super SSet
+#alt26# end
index 94ace22..e3efe27 100644 (file)
@@ -29,12 +29,16 @@ end
 extern class ExC2
 end
 
+subset SSet2
+end
+
 redef class SubI
        super IC2
        #alt1# super AC2
        #alt2# super CC2
        #alt3# super EnC2
        #alt4# super ExC2
+       #alt16# super SSet2
 end
 
 redef class SubA
@@ -43,6 +47,7 @@ redef class SubA
        super CC2
        #alt5# super EnC2
        #alt6# super ExC2
+       #alt17# super SSet2
 end
 
 redef class SubC
@@ -51,6 +56,7 @@ redef class SubC
        super CC2
        #alt7# super EnC2
        #alt8# super ExC2
+       #alt18# super SSet2
 end
 
 redef class SubEn
@@ -59,6 +65,7 @@ redef class SubEn
        #alt10# super CC2
        #alt11# super EnC2
        #alt12# super ExC2
+       #alt19# super SSet2
 end
 
 redef class SubEx
@@ -67,4 +74,5 @@ redef class SubEx
        #alt14# super CC2
        #alt15# super EnC2
        super ExC2
+       #alt20# super SSet2
 end
diff --git a/tests/error_subset_no_new.nit b/tests/error_subset_no_new.nit
new file mode 100644 (file)
index 0000000..499c335
--- /dev/null
@@ -0,0 +1,28 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import core::kernel
+
+class A
+       var x: Int
+end
+
+subset S
+       super A
+end
+
+var a = new A(1)
+a.x.output
+var s = new S(2)
+s.x.output
index afdebe3..c642e23 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind2_alt1.nit:34,8--10: Error: interface `SubI` cannot specialize abstract class `AC2`.
+alt/base_error_class_kind2_alt1.nit:37,8--10: Error: interface `SubI` cannot specialize abstract class `AC2`.
index 063c8db..97e7f74 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind2_alt10.nit:59,8--10: Error: enum `SubEn` cannot specialize class `CC2`.
+alt/base_error_class_kind2_alt10.nit:65,8--10: Error: enum `SubEn` cannot specialize class `CC2`.
index e0f1e73..d512b92 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind2_alt11.nit:60,8--11: Error: enum `SubEn` cannot specialize enum `EnC2`.
+alt/base_error_class_kind2_alt11.nit:66,8--11: Error: enum `SubEn` cannot specialize enum `EnC2`.
index 35a83ac..963758d 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind2_alt12.nit:61,8--11: Error: enum `SubEn` cannot specialize extern class `ExC2`.
+alt/base_error_class_kind2_alt12.nit:67,8--11: Error: enum `SubEn` cannot specialize extern class `ExC2`.
index de666ea..4609628 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind2_alt13.nit:66,8--10: Error: extern class `SubEx` cannot specialize abstract class `AC2`.
+alt/base_error_class_kind2_alt13.nit:73,8--10: Error: extern class `SubEx` cannot specialize abstract class `AC2`.
index 50fbed1..9c62bfd 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind2_alt14.nit:67,8--10: Error: extern class `SubEx` cannot specialize class `CC2`.
+alt/base_error_class_kind2_alt14.nit:74,8--10: Error: extern class `SubEx` cannot specialize class `CC2`.
index 5aa6030..5852de9 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind2_alt15.nit:68,8--11: Error: extern class `SubEx` cannot specialize enum `EnC2`.
+alt/base_error_class_kind2_alt15.nit:75,8--11: Error: extern class `SubEx` cannot specialize enum `EnC2`.
diff --git a/tests/sav/base_error_class_kind2_alt16.res b/tests/sav/base_error_class_kind2_alt16.res
new file mode 100644 (file)
index 0000000..437ef40
--- /dev/null
@@ -0,0 +1 @@
+alt/base_error_class_kind2_alt16.nit:41,8--12: Error: interface `SubI` cannot specialize subset `SSet2`.
diff --git a/tests/sav/base_error_class_kind2_alt17.res b/tests/sav/base_error_class_kind2_alt17.res
new file mode 100644 (file)
index 0000000..98b66f8
--- /dev/null
@@ -0,0 +1 @@
+alt/base_error_class_kind2_alt17.nit:50,8--12: Error: abstract class `SubA` cannot specialize subset `SSet2`.
diff --git a/tests/sav/base_error_class_kind2_alt18.res b/tests/sav/base_error_class_kind2_alt18.res
new file mode 100644 (file)
index 0000000..8f6dae3
--- /dev/null
@@ -0,0 +1 @@
+alt/base_error_class_kind2_alt18.nit:59,8--12: Error: class `SubC` cannot specialize subset `SSet2`.
diff --git a/tests/sav/base_error_class_kind2_alt19.res b/tests/sav/base_error_class_kind2_alt19.res
new file mode 100644 (file)
index 0000000..f44d8a7
--- /dev/null
@@ -0,0 +1 @@
+alt/base_error_class_kind2_alt19.nit:68,8--12: Error: enum `SubEn` cannot specialize subset `SSet2`.
index d67ccca..fe66e09 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind2_alt2.nit:35,8--10: Error: interface `SubI` cannot specialize class `CC2`.
+alt/base_error_class_kind2_alt2.nit:38,8--10: Error: interface `SubI` cannot specialize class `CC2`.
diff --git a/tests/sav/base_error_class_kind2_alt20.res b/tests/sav/base_error_class_kind2_alt20.res
new file mode 100644 (file)
index 0000000..0e11a0d
--- /dev/null
@@ -0,0 +1 @@
+alt/base_error_class_kind2_alt20.nit:77,8--12: Error: extern class `SubEx` cannot specialize subset `SSet2`.
index 4c43652..974282d 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind2_alt3.nit:36,8--11: Error: interface `SubI` cannot specialize enum `EnC2`.
+alt/base_error_class_kind2_alt3.nit:39,8--11: Error: interface `SubI` cannot specialize enum `EnC2`.
index 87a2251..0e070ea 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind2_alt4.nit:37,8--11: Error: interface `SubI` cannot specialize extern class `ExC2`.
+alt/base_error_class_kind2_alt4.nit:40,8--11: Error: interface `SubI` cannot specialize extern class `ExC2`.
index 5a4fd27..c92fe03 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind2_alt5.nit:44,8--11: Error: abstract class `SubA` cannot specialize enum `EnC2`.
+alt/base_error_class_kind2_alt5.nit:48,8--11: Error: abstract class `SubA` cannot specialize enum `EnC2`.
index 6439782..5e3e4b7 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind2_alt6.nit:45,8--11: Error: abstract class `SubA` cannot specialize extern class `ExC2`.
+alt/base_error_class_kind2_alt6.nit:49,8--11: Error: abstract class `SubA` cannot specialize extern class `ExC2`.
index 965fd59..3dd7d98 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind2_alt7.nit:52,8--11: Error: class `SubC` cannot specialize enum `EnC2`.
+alt/base_error_class_kind2_alt7.nit:57,8--11: Error: class `SubC` cannot specialize enum `EnC2`.
index 80f05ea..a63a547 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind2_alt8.nit:53,8--11: Error: class `SubC` cannot specialize extern class `ExC2`.
+alt/base_error_class_kind2_alt8.nit:58,8--11: Error: class `SubC` cannot specialize extern class `ExC2`.
index 09a20d0..884af73 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind2_alt9.nit:58,8--10: Error: enum `SubEn` cannot specialize abstract class `AC2`.
+alt/base_error_class_kind2_alt9.nit:64,8--10: Error: enum `SubEn` cannot specialize abstract class `AC2`.
index 40c42a5..ff31e68 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind_alt1.nit:44,8--9: Error: interface `SubI` cannot specialize abstract class `AC`.
+alt/base_error_class_kind_alt1.nit:47,8--9: Error: interface `SubI` cannot specialize abstract class `AC`.
index 5792697..b6d2038 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind_alt10.nit:69,8--9: Error: enum `SubEn` cannot specialize class `CC`.
+alt/base_error_class_kind_alt10.nit:75,8--9: Error: enum `SubEn` cannot specialize class `CC`.
index 3600dd7..dfd9a08 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind_alt11.nit:70,8--10: Error: enum `SubEn` cannot specialize enum `EnC`.
+alt/base_error_class_kind_alt11.nit:76,8--10: Error: enum `SubEn` cannot specialize enum `EnC`.
index 95bb596..efde827 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind_alt12.nit:71,8--10: Error: enum `SubEn` cannot specialize extern class `ExC`.
+alt/base_error_class_kind_alt12.nit:77,8--10: Error: enum `SubEn` cannot specialize extern class `ExC`.
index d899ee6..70bc61b 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind_alt13.nit:76,8--9: Error: extern class `SubEx` cannot specialize abstract class `AC`.
+alt/base_error_class_kind_alt13.nit:83,8--9: Error: extern class `SubEx` cannot specialize abstract class `AC`.
index 36c9e16..ee9f43c 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind_alt14.nit:77,8--9: Error: extern class `SubEx` cannot specialize class `CC`.
+alt/base_error_class_kind_alt14.nit:84,8--9: Error: extern class `SubEx` cannot specialize class `CC`.
index b3adabf..a9a01f8 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind_alt15.nit:78,8--10: Error: extern class `SubEx` cannot specialize enum `EnC`.
+alt/base_error_class_kind_alt15.nit:85,8--10: Error: extern class `SubEx` cannot specialize enum `EnC`.
diff --git a/tests/sav/base_error_class_kind_alt16.res b/tests/sav/base_error_class_kind_alt16.res
new file mode 100644 (file)
index 0000000..821a8d0
--- /dev/null
@@ -0,0 +1 @@
+alt/base_error_class_kind_alt16.nit:51,8--11: Error: interface `SubI` cannot specialize subset `SSet`.
diff --git a/tests/sav/base_error_class_kind_alt17.res b/tests/sav/base_error_class_kind_alt17.res
new file mode 100644 (file)
index 0000000..d59dc6e
--- /dev/null
@@ -0,0 +1 @@
+alt/base_error_class_kind_alt17.nit:60,8--11: Error: abstract class `SubA` cannot specialize subset `SSet`.
diff --git a/tests/sav/base_error_class_kind_alt18.res b/tests/sav/base_error_class_kind_alt18.res
new file mode 100644 (file)
index 0000000..44de642
--- /dev/null
@@ -0,0 +1 @@
+alt/base_error_class_kind_alt18.nit:69,8--11: Error: class `SubC` cannot specialize subset `SSet`.
diff --git a/tests/sav/base_error_class_kind_alt19.res b/tests/sav/base_error_class_kind_alt19.res
new file mode 100644 (file)
index 0000000..ea50d9c
--- /dev/null
@@ -0,0 +1 @@
+alt/base_error_class_kind_alt19.nit:78,8--11: Error: enum `SubEn` cannot specialize subset `SSet`.
index ec5c855..2589edb 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind_alt2.nit:45,8--9: Error: interface `SubI` cannot specialize class `CC`.
+alt/base_error_class_kind_alt2.nit:48,8--9: Error: interface `SubI` cannot specialize class `CC`.
diff --git a/tests/sav/base_error_class_kind_alt20.res b/tests/sav/base_error_class_kind_alt20.res
new file mode 100644 (file)
index 0000000..1ced2c1
--- /dev/null
@@ -0,0 +1 @@
+alt/base_error_class_kind_alt20.nit:87,8--11: Error: extern class `SubEx` cannot specialize subset `SSet`.
diff --git a/tests/sav/base_error_class_kind_alt26.res b/tests/sav/base_error_class_kind_alt26.res
new file mode 100644 (file)
index 0000000..5df0882
--- /dev/null
@@ -0,0 +1 @@
+alt/base_error_class_kind_alt26.nit:118,7--10: Error: subset `SubSSet` cannot specialize subset `SSet`.
index 3b1ce91..27b1677 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind_alt3.nit:46,8--10: Error: interface `SubI` cannot specialize enum `EnC`.
+alt/base_error_class_kind_alt3.nit:49,8--10: Error: interface `SubI` cannot specialize enum `EnC`.
index 174b125..871f7d7 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind_alt4.nit:47,8--10: Error: interface `SubI` cannot specialize extern class `ExC`.
+alt/base_error_class_kind_alt4.nit:50,8--10: Error: interface `SubI` cannot specialize extern class `ExC`.
index 4acce40..1dadb9d 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind_alt5.nit:54,8--10: Error: abstract class `SubA` cannot specialize enum `EnC`.
+alt/base_error_class_kind_alt5.nit:58,8--10: Error: abstract class `SubA` cannot specialize enum `EnC`.
index bc9d642..6a7f115 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind_alt6.nit:55,8--10: Error: abstract class `SubA` cannot specialize extern class `ExC`.
+alt/base_error_class_kind_alt6.nit:59,8--10: Error: abstract class `SubA` cannot specialize extern class `ExC`.
index 1c16267..748e6ba 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind_alt7.nit:62,8--10: Error: class `SubC` cannot specialize enum `EnC`.
+alt/base_error_class_kind_alt7.nit:67,8--10: Error: class `SubC` cannot specialize enum `EnC`.
index e78399b..ae4bfcc 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind_alt8.nit:63,8--10: Error: class `SubC` cannot specialize extern class `ExC`.
+alt/base_error_class_kind_alt8.nit:68,8--10: Error: class `SubC` cannot specialize extern class `ExC`.
index 95e969c..05eb651 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind_alt9.nit:68,8--9: Error: enum `SubEn` cannot specialize abstract class `AC`.
+alt/base_error_class_kind_alt9.nit:74,8--9: Error: enum `SubEn` cannot specialize abstract class `AC`.
diff --git a/tests/sav/error_subset_no_new.res b/tests/sav/error_subset_no_new.res
new file mode 100644 (file)
index 0000000..6f92bb4
--- /dev/null
@@ -0,0 +1 @@
+error_subset_no_new.nit:27,9--16: Type Error: cannot instantiate subset `S`.
diff --git a/tests/sav/test_object_class_kind_alt5.res b/tests/sav/test_object_class_kind_alt5.res
new file mode 100644 (file)
index 0000000..fc18612
--- /dev/null
@@ -0,0 +1 @@
+alt/test_object_class_kind_alt5.nit:22,8--13: Error: `Object` must be an interface.
diff --git a/tests/sav/test_subset_out_of_order_alt1.res b/tests/sav/test_subset_out_of_order_alt1.res
new file mode 100644 (file)
index 0000000..c6fcccb
--- /dev/null
@@ -0,0 +1 @@
+alt/test_subset_out_of_order_alt1.nit:18,8: Error: subset `B` cannot specialize subset `A`.
index 415694f..8050b94 100644 (file)
 
 import end
 
-interface Object #alt1-4#
+interface Object #alt1-5#
 #alt1# abstract class Object
 #alt2# class Object
 #alt3# enum Object
 #alt4# extern class Object
+#alt5# subset Object
 end
diff --git a/tests/test_subset_out_of_order.nit b/tests/test_subset_out_of_order.nit
new file mode 100644 (file)
index 0000000..f700bc2
--- /dev/null
@@ -0,0 +1,22 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import core::kernel
+
+subset B
+       super A
+end
+
+class A #alt1# subset A
+end