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*;
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
  abstract member-signature operator ==(dynamic other) → core::bool*;
  abstract member-signature get hashCode() → core::int*;
  abstract member-signature method toString() → core::String*;
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
  abstract member-signature get runtimeType() → core::Type*;
}
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::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::int* v7 = super.{self::Base::intProp} = super.{self::Base::intProp}.{core::num::+}(self::getInt());
    core::int* v10 = super.{self::Base::intProp} = super.{self::Base::intProp}.{core::num::+}(1);
    core::int* v11 = let final core::int* #t2 = super.{self::Base::intProp} in let final core::int* #t3 = super.{self::Base::intProp} = #t2.{core::num::+}(1) in #t2;
  }
}
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* #t4 = super.{self::Base::numProp} in #t4.{core::num::==}(null) ?{core::num*} super.{self::Base::numProp} = self::getInt() : #t4;
    core::num* v5 = let final core::num* #t5 = super.{self::Base::numProp} in #t5.{core::num::==}(null) ?{core::num*} super.{self::Base::numProp} = self::getNum() : #t5;
    core::num* v6 = let final core::num* #t6 = super.{self::Base::numProp} in #t6.{core::num::==}(null) ?{core::num*} super.{self::Base::numProp} = self::getDouble() : #t6;
    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* #t7 = super.{self::Base::numProp} in let final core::num* #t8 = super.{self::Base::numProp} = #t7.{core::num::+}(1) in #t7;
  }
}
class Test3 extends self::Base {
  synthetic constructor •() → self::Test3*
    : super self::Base::•()
    ;
  method test3() → void {
    core::double* v3 = super.{self::Base::doubleProp} = self::getDouble();
    core::double* v6 = let final core::double* #t9 = super.{self::Base::doubleProp} in #t9.{core::num::==}(null) ?{core::double*} super.{self::Base::doubleProp} = self::getDouble() : #t9;
    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* #t10 = super.{self::Base::doubleProp} in let final core::double* #t11 = super.{self::Base::doubleProp} = #t10.{core::double::+}(1) in #t10;
  }
}
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 {}
