nitg: Added typing test on new for non-concrete classes + unit tests for new abstract...
authorLucas Bajolet <r4pass@hotmail.com>
Mon, 27 Jan 2014 18:30:54 +0000 (13:30 -0500)
committerLucas Bajolet <r4pass@hotmail.com>
Mon, 27 Jan 2014 18:30:54 +0000 (13:30 -0500)
Signed-off-by: Lucas Bajolet <r4pass@hotmail.com>

src/typing.nit
tests/base_error_new_abstract.nit [new file with mode: 0644]
tests/base_error_new_interface.nit [new file with mode: 0644]
tests/sav/base_error_new_abstract.res [new file with mode: 0644]
tests/sav/base_error_new_interface.res [new file with mode: 0644]
tests/sav/error_needed_method_alt2.res

index 24eafb1..527f694 100644 (file)
@@ -1526,6 +1526,14 @@ redef class ANewExpr
                                v.error(self, "Type error: cannot instantiate the formal type {recvtype}.")
                                return
                        end
+               else
+                       if recvtype.mclass.kind == abstract_kind then
+                               v.error(self, "Cannot instantiate abstract class {recvtype}.")
+                               return
+                       else if recvtype.mclass.kind == interface_kind then
+                               v.error(self, "Cannot instantiate interface {recvtype}.")
+                               return
+                       end
                end
 
                var name: String
diff --git a/tests/base_error_new_abstract.nit b/tests/base_error_new_abstract.nit
new file mode 100644 (file)
index 0000000..fd81621
--- /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 kernel
+
+abstract class A
+
+end
+
+var x = new A
+
diff --git a/tests/base_error_new_interface.nit b/tests/base_error_new_interface.nit
new file mode 100644 (file)
index 0000000..02743fe
--- /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 kernel
+
+interface A
+
+end
+
+var x = new A
+
diff --git a/tests/sav/base_error_new_abstract.res b/tests/sav/base_error_new_abstract.res
new file mode 100644 (file)
index 0000000..e23154d
--- /dev/null
@@ -0,0 +1 @@
+base_error_new_abstract.nit:21,9--13: Cannot instantiate abstract class A.
diff --git a/tests/sav/base_error_new_interface.res b/tests/sav/base_error_new_interface.res
new file mode 100644 (file)
index 0000000..0e64d98
--- /dev/null
@@ -0,0 +1 @@
+base_error_new_interface.nit:21,9--13: Cannot instantiate interface A.
index 557ff19..ce6b6db 100644 (file)
@@ -1,2 +1,2 @@
-alt/error_needed_method_alt2.nit:47,10--27: Error: Method 'init' doesn't exists in Collection[Int].
+alt/error_needed_method_alt2.nit:47,10--27: Cannot instantiate interface Collection[Int].
 alt/error_needed_method_alt2.nit:47,1--40: Type Error: Expected method 'iterator' in type Collection[Int]