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
extern class ExC
end
+subset SSet
+end
+
##
interface SubI
#alt2# super CC
#alt3# super EnC
#alt4# super ExC
+ #alt16# super SSet
end
abstract class SubA
super CC
#alt5# super EnC
#alt6# super ExC
+ #alt17# super SSet
end
class SubC
super CC
#alt7# super EnC
#alt8# super ExC
+ #alt18# super SSet
end
enum SubEn
#alt10# super CC
#alt11# super EnC
#alt12# super ExC
+ #alt19# super SSet
end
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
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
super CC2
#alt5# super EnC2
#alt6# super ExC2
+ #alt17# super SSet2
end
redef class SubC
super CC2
#alt7# super EnC2
#alt8# super ExC2
+ #alt18# super SSet2
end
redef class SubEn
#alt10# super CC2
#alt11# super EnC2
#alt12# super ExC2
+ #alt19# super SSet2
end
redef class SubEx
#alt14# super CC2
#alt15# super EnC2
super ExC2
+ #alt20# super SSet2
end
--- /dev/null
+# 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
-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`.
-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`.
-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`.
-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`.
-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`.
-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`.
-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`.
--- /dev/null
+alt/base_error_class_kind2_alt16.nit:41,8--12: Error: interface `SubI` cannot specialize subset `SSet2`.
--- /dev/null
+alt/base_error_class_kind2_alt17.nit:50,8--12: Error: abstract class `SubA` cannot specialize subset `SSet2`.
--- /dev/null
+alt/base_error_class_kind2_alt18.nit:59,8--12: Error: class `SubC` cannot specialize subset `SSet2`.
--- /dev/null
+alt/base_error_class_kind2_alt19.nit:68,8--12: Error: enum `SubEn` cannot specialize subset `SSet2`.
-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`.
--- /dev/null
+alt/base_error_class_kind2_alt20.nit:77,8--12: Error: extern class `SubEx` cannot specialize subset `SSet2`.
-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`.
-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`.
-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`.
-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`.
-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`.
-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`.
-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`.
-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`.
-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`.
-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`.
-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`.
-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`.
-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`.
-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`.
--- /dev/null
+alt/base_error_class_kind_alt16.nit:51,8--11: Error: interface `SubI` cannot specialize subset `SSet`.
--- /dev/null
+alt/base_error_class_kind_alt17.nit:60,8--11: Error: abstract class `SubA` cannot specialize subset `SSet`.
--- /dev/null
+alt/base_error_class_kind_alt18.nit:69,8--11: Error: class `SubC` cannot specialize subset `SSet`.
--- /dev/null
+alt/base_error_class_kind_alt19.nit:78,8--11: Error: enum `SubEn` cannot specialize subset `SSet`.
-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`.
--- /dev/null
+alt/base_error_class_kind_alt20.nit:87,8--11: Error: extern class `SubEx` cannot specialize subset `SSet`.
--- /dev/null
+alt/base_error_class_kind_alt26.nit:118,7--10: Error: subset `SubSSet` cannot specialize subset `SSet`.
-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`.
-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`.
-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`.
-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`.
-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`.
-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`.
-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`.
--- /dev/null
+error_subset_no_new.nit:27,9--16: Type Error: cannot instantiate subset `S`.
--- /dev/null
+alt/test_object_class_kind_alt5.nit:22,8--13: Error: `Object` must be an interface.
--- /dev/null
+alt/test_subset_out_of_order_alt1.nit:18,8: Error: subset `B` cannot specialize subset `A`.
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
--- /dev/null
+# 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