ef8cc2c1cf
As per planned breaking change to let platforms decide how they and what throw for late initiaization errors, we no longer need a public `LateInitializationError` class. It's confusing to have one if some platforms throw something else instead. Removes the public abstract class. The dart:_internal implementation class `LateError` no longer implements it. This is the only implementation of the public interface, and the class which platforms either throw directly, or through front-end lowering of the feature. Remove mentions in tests. All tests now just expect `Error`, some platform specific tests might test the message. TEST=rewrote tests referring to LateInitializationError. Change-Id: I54344a67f89ce101ed770412db134e12354cdcc4 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/174928 Commit-Queue: Lasse R.H. Nielsen <lrn@google.com> Reviewed-by: Nate Bosch <nbosch@google.com>
157 lines
7.5 KiB
Plaintext
157 lines
7.5 KiB
Plaintext
library /*isNonNullableByDefault*/;
|
|
import self as self;
|
|
import "dart:core" as core;
|
|
import "dart:_internal" as _in;
|
|
|
|
class Class extends core::Object {
|
|
field core::int? _#Class#field1 = null;
|
|
field core::bool _#Class#field1#isSet = false;
|
|
field core::int? _#Class#field2 = null;
|
|
field core::bool _#Class#field2#isSet = false;
|
|
field core::int? _#Class#field3 = null;
|
|
field core::bool _#Class#field3#isSet = false;
|
|
field core::int? _#Class#field4 = null;
|
|
field core::bool _#Class#field4#isSet = false;
|
|
synthetic constructor •() → self::Class
|
|
: super core::Object::•()
|
|
;
|
|
get field1() → core::int
|
|
return this.{self::Class::_#Class#field1#isSet} ?{core::int} let final core::int? #t1 = this.{self::Class::_#Class#field1} in #t1{core::int} : throw new _in::LateError::fieldNI("field1");
|
|
set field1(core::int #t2) → void {
|
|
this.{self::Class::_#Class#field1#isSet} = true;
|
|
this.{self::Class::_#Class#field1} = #t2;
|
|
}
|
|
get field2() → core::int
|
|
return this.{self::Class::_#Class#field2#isSet} ?{core::int} let final core::int? #t3 = this.{self::Class::_#Class#field2} in #t3{core::int} : throw new _in::LateError::fieldNI("field2");
|
|
set field2(core::int #t4) → void {
|
|
this.{self::Class::_#Class#field2#isSet} = true;
|
|
this.{self::Class::_#Class#field2} = #t4;
|
|
}
|
|
get field3() → core::int
|
|
return this.{self::Class::_#Class#field3#isSet} ?{core::int} let final core::int? #t5 = this.{self::Class::_#Class#field3} in #t5{core::int} : throw new _in::LateError::fieldNI("field3");
|
|
set field3(core::int #t6) → void
|
|
if(this.{self::Class::_#Class#field3#isSet})
|
|
throw new _in::LateError::fieldAI("field3");
|
|
else {
|
|
this.{self::Class::_#Class#field3#isSet} = true;
|
|
this.{self::Class::_#Class#field3} = #t6;
|
|
}
|
|
get field4() → core::int
|
|
return this.{self::Class::_#Class#field4#isSet} ?{core::int} let final core::int? #t7 = this.{self::Class::_#Class#field4} in #t7{core::int} : throw new _in::LateError::fieldNI("field4");
|
|
set field4(core::int #t8) → void
|
|
if(this.{self::Class::_#Class#field4#isSet})
|
|
throw new _in::LateError::fieldAI("field4");
|
|
else {
|
|
this.{self::Class::_#Class#field4#isSet} = true;
|
|
this.{self::Class::_#Class#field4} = #t8;
|
|
}
|
|
}
|
|
class SubClass extends self::Class {
|
|
field core::int? _#SubClass#field1 = null;
|
|
field core::bool _#SubClass#field1#isSet = false;
|
|
field core::int? _#SubClass#field2 = null;
|
|
field core::bool _#SubClass#field2#isSet = false;
|
|
field core::int? _#SubClass#field3 = null;
|
|
field core::bool _#SubClass#field3#isSet = false;
|
|
field core::int? _#SubClass#field4 = null;
|
|
field core::bool _#SubClass#field4#isSet = false;
|
|
synthetic constructor •() → self::SubClass
|
|
: super self::Class::•()
|
|
;
|
|
get field1() → core::int
|
|
return this.{self::SubClass::_#SubClass#field1#isSet} ?{core::int} let final core::int? #t9 = this.{self::SubClass::_#SubClass#field1} in #t9{core::int} : throw new _in::LateError::fieldNI("field1");
|
|
set field1(core::int #t10) → void {
|
|
this.{self::SubClass::_#SubClass#field1#isSet} = true;
|
|
this.{self::SubClass::_#SubClass#field1} = #t10;
|
|
}
|
|
get field2() → core::int {
|
|
if(!this.{self::SubClass::_#SubClass#field2#isSet}) {
|
|
this.{self::SubClass::_#SubClass#field2} = 0;
|
|
this.{self::SubClass::_#SubClass#field2#isSet} = true;
|
|
}
|
|
return let final core::int? #t11 = this.{self::SubClass::_#SubClass#field2} in #t11{core::int};
|
|
}
|
|
set field2(core::int #t12) → void {
|
|
this.{self::SubClass::_#SubClass#field2#isSet} = true;
|
|
this.{self::SubClass::_#SubClass#field2} = #t12;
|
|
}
|
|
get field3() → core::int
|
|
return this.{self::SubClass::_#SubClass#field3#isSet} ?{core::int} let final core::int? #t13 = this.{self::SubClass::_#SubClass#field3} in #t13{core::int} : throw new _in::LateError::fieldNI("field3");
|
|
set field3(core::int #t14) → void
|
|
if(this.{self::SubClass::_#SubClass#field3#isSet})
|
|
throw new _in::LateError::fieldAI("field3");
|
|
else {
|
|
this.{self::SubClass::_#SubClass#field3#isSet} = true;
|
|
this.{self::SubClass::_#SubClass#field3} = #t14;
|
|
}
|
|
get field4() → core::int {
|
|
if(!this.{self::SubClass::_#SubClass#field4#isSet}) {
|
|
final core::int #t15 = 0;
|
|
if(this.{self::SubClass::_#SubClass#field4#isSet})
|
|
throw new _in::LateError::fieldADI("field4");
|
|
this.{self::SubClass::_#SubClass#field4} = #t15;
|
|
this.{self::SubClass::_#SubClass#field4#isSet} = true;
|
|
}
|
|
return let final core::int? #t16 = this.{self::SubClass::_#SubClass#field4} in #t16{core::int};
|
|
}
|
|
get directField1() → core::int
|
|
return super.{self::Class::field1};
|
|
set directField1(core::int value) → void {
|
|
super.{self::Class::field1} = value;
|
|
}
|
|
get directField2() → core::int
|
|
return super.{self::Class::field2};
|
|
set directField2(core::int value) → void {
|
|
super.{self::Class::field2} = value;
|
|
}
|
|
get directField3() → core::int
|
|
return super.{self::Class::field3};
|
|
get directField4() → core::int
|
|
return super.{self::Class::field4};
|
|
}
|
|
static method main() → dynamic {
|
|
self::SubClass sc = new self::SubClass::•();
|
|
self::Class c = sc;
|
|
self::throws(() → core::int => c.{self::Class::field1}, "Read value from uninitialized SubClass.field1");
|
|
self::throws(() → core::int => sc.{self::SubClass::directField1}, "Read value from uninitialized Class.field1");
|
|
self::expect(42, c.{self::Class::field1} = 42);
|
|
self::expect(42, c.{self::Class::field1});
|
|
self::throws(() → core::int => sc.{self::SubClass::directField1}, "Read value from uninitialized Class.field1");
|
|
self::expect(87, sc.{self::SubClass::directField1} = 87);
|
|
self::expect(87, sc.{self::SubClass::directField1});
|
|
self::expect(0, c.{self::Class::field2});
|
|
self::throws(() → core::int => sc.{self::SubClass::directField2}, "Read value from uninitialized Class.field2");
|
|
self::expect(42, c.{self::Class::field2} = 42);
|
|
self::expect(42, c.{self::Class::field2});
|
|
self::throws(() → core::int => sc.{self::SubClass::directField2}, "Read value from uninitialized Class.field2");
|
|
self::expect(87, sc.{self::SubClass::directField2} = 87);
|
|
self::expect(87, sc.{self::SubClass::directField2});
|
|
self::throws(() → core::int => c.{self::Class::field3}, "Read value from uninitialized SubClass.field3");
|
|
self::throws(() → core::int => sc.{self::SubClass::directField3}, "Read value from uninitialized Class.field3");
|
|
self::expect(42, c.{self::Class::field3} = 42);
|
|
self::expect(42, c.{self::Class::field3});
|
|
self::throws(() → core::int => sc.{self::SubClass::directField3}, "Read value from uninitialized Class.field3");
|
|
self::throws(() → core::int => c.{self::Class::field3} = 87, "Write value to initialized SubClass.field3");
|
|
self::expect(0, c.{self::Class::field4});
|
|
self::throws(() → core::int => sc.{self::SubClass::directField4}, "Read value from uninitialized Class.field4");
|
|
self::expect(42, c.{self::Class::field4} = 42);
|
|
self::expect(0, c.{self::Class::field4});
|
|
self::expect(42, sc.{self::SubClass::directField4});
|
|
self::throws(() → core::int => c.{self::Class::field4} = 87, "Write value to initialized SubClass.field4");
|
|
}
|
|
static method expect(dynamic expected, dynamic actual) → dynamic {
|
|
if(!expected.{core::Object::==}(actual))
|
|
throw "Expected ${expected}, actual ${actual}.";
|
|
}
|
|
static method throws(() → dynamic f, core::String message) → dynamic {
|
|
dynamic value;
|
|
try {
|
|
value = f.call();
|
|
}
|
|
on core::Error catch(final core::Error e) {
|
|
core::print(e);
|
|
return;
|
|
}
|
|
throw "${message}: ${value}";
|
|
}
|