library test;
import self as self;
import "dart:core" as core;

class Base extends core::Object {
  field core::int* intProp = null;
  field core::num* numProp = null;
  field core::double* doubleProp = null;
  synthetic constructor •() → self::Base*
    : super core::Object::•()
    ;
  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method toString() → core::String*; -> core::Object::toString
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class Test1 extends self::Base {
  synthetic constructor •() → self::Test1*
    : super self::Base::•()
    ;
  method test() → void {
    core::int* v1 = super.{self::Base::intProp} = self::getInt();
    core::num* v2 = super.{self::Base::intProp} = self::getNum() as{TypeError} core::int*;
    core::int* v4 = let final core::int* #t1 = super.{self::Base::intProp} in #t1.{core::num::==}(null) ?{core::int*} super.{self::Base::intProp} = self::getInt() : #t1;
    core::num* v5 = let final core::int* #t2 = super.{self::Base::intProp} in #t2.{core::num::==}(null) ?{core::num*} super.{self::Base::intProp} = self::getNum() as{TypeError} core::int* : #t2;
    core::int* v7 = super.{self::Base::intProp} = super.{self::Base::intProp}.{core::num::+}(self::getInt());
    core::num* v8 = super.{self::Base::intProp} = super.{self::Base::intProp}.{core::num::+}(self::getNum()) as{TypeError} core::int*;
    core::int* v10 = super.{self::Base::intProp} = super.{self::Base::intProp}.{core::num::+}(1);
    core::int* v11 = let final core::int* #t3 = super.{self::Base::intProp} in let final core::int* #t4 = super.{self::Base::intProp} = #t3.{core::num::+}(1) in #t3;
  }
}
class Test2 extends self::Base {
  synthetic constructor •() → self::Test2*
    : super self::Base::•()
    ;
  method test() → void {
    core::int* v1 = super.{self::Base::numProp} = self::getInt();
    core::num* v2 = super.{self::Base::numProp} = self::getNum();
    core::double* v3 = super.{self::Base::numProp} = self::getDouble();
    core::num* v4 = let final core::num* #t5 = super.{self::Base::numProp} in #t5.{core::num::==}(null) ?{core::num*} super.{self::Base::numProp} = self::getInt() : #t5;
    core::num* v5 = let final core::num* #t6 = super.{self::Base::numProp} in #t6.{core::num::==}(null) ?{core::num*} super.{self::Base::numProp} = self::getNum() : #t6;
    core::num* v6 = let final core::num* #t7 = super.{self::Base::numProp} in #t7.{core::num::==}(null) ?{core::num*} super.{self::Base::numProp} = self::getDouble() : #t7;
    core::num* v7 = super.{self::Base::numProp} = super.{self::Base::numProp}.{core::num::+}(self::getInt());
    core::num* v8 = super.{self::Base::numProp} = super.{self::Base::numProp}.{core::num::+}(self::getNum());
    core::num* v9 = super.{self::Base::numProp} = super.{self::Base::numProp}.{core::num::+}(self::getDouble());
    core::num* v10 = super.{self::Base::numProp} = super.{self::Base::numProp}.{core::num::+}(1);
    core::num* v11 = let final core::num* #t8 = super.{self::Base::numProp} in let final core::num* #t9 = super.{self::Base::numProp} = #t8.{core::num::+}(1) in #t8;
  }
}
class Test3 extends self::Base {
  synthetic constructor •() → self::Test3*
    : super self::Base::•()
    ;
  method test3() → void {
    core::num* v2 = super.{self::Base::doubleProp} = self::getNum() as{TypeError} core::double*;
    core::double* v3 = super.{self::Base::doubleProp} = self::getDouble();
    core::num* v5 = let final core::double* #t10 = super.{self::Base::doubleProp} in #t10.{core::num::==}(null) ?{core::num*} super.{self::Base::doubleProp} = self::getNum() as{TypeError} core::double* : #t10;
    core::double* v6 = let final core::double* #t11 = super.{self::Base::doubleProp} in #t11.{core::num::==}(null) ?{core::double*} super.{self::Base::doubleProp} = self::getDouble() : #t11;
    core::double* v7 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.{core::double::+}(self::getInt());
    core::double* v8 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.{core::double::+}(self::getNum());
    core::double* v9 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.{core::double::+}(self::getDouble());
    core::double* v10 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.{core::double::+}(1);
    core::double* v11 = let final core::double* #t12 = super.{self::Base::doubleProp} in let final core::double* #t13 = super.{self::Base::doubleProp} = #t12.{core::double::+}(1) in #t12;
  }
}
static method getInt() → core::int*
  return 0;
static method getNum() → core::num*
  return 0;
static method getDouble() → core::double*
  return 0.0;
static method main() → dynamic {}
