fix: remove default constructors and require explicit construct new() for all user classes

The compiler no longer auto-generates a default `new()` constructor for classes. All classes must now explicitly define `construct new() {}` to be instantiable. This change removes the `createDefaultConstructor` function from the compiler, eliminates the `return_this` primitive used by Object's default initializer, and adds explicit constructors to all test and example classes. Core metaclasses (Bool, Class, Null, Num, Object, Range, Sequence) now correctly reject `new()` calls with runtime errors.
This commit is contained in:
Bob Nystrom
2015-09-01 15:16:04 +00:00
parent 4665ec1913
commit ef93496fd4
86 changed files with 248 additions and 133 deletions
+2
View File
@@ -1,4 +1,6 @@
class TestSequence is Sequence {
construct new() {}
iterate(iterator) {
if (iterator == null) return 1
if (iterator == 10) return false
+1
View File
@@ -2,6 +2,7 @@ IO.print([].isEmpty) // expect: true
IO.print([1].isEmpty) // expect: false
class InfiniteSequence is Sequence {
construct new() {}
iterate(iterator) { true }
iteratorValue(iterator) { iterator }
}
+2
View File
@@ -15,6 +15,8 @@ class FibIterator {
}
class Fib is Sequence {
construct new() {}
iterate(iterator) {
if (iterator == null) return FibIterator.new()
iterator.iterate
+1
View File
@@ -0,0 +1 @@
Sequence.new() // expect runtime error: Sequence metaclass does not implement 'new()'.
+2
View File
@@ -1,4 +1,6 @@
class TestSequence is Sequence {
construct new() {}
iterate(iterator) {
if (iterator == null) return 1
if (iterator == 3) return false
+2
View File
@@ -15,6 +15,8 @@ class FibIterator {
}
class Fib is Sequence {
construct new() {}
iterate(iterator) {
if (iterator == null) return FibIterator.new()
iterator.iterate