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::•()
    ;
}
class Test1 extends self::Base {
  synthetic constructor •() → self::Test1*
    : super self::Base::•()
    ;
  method test() → void {
    dynamic v1 = super.{self::Base::intProp} = self::getInt();
    dynamic v2 = super.{self::Base::intProp} = self::getNum();
    dynamic v4 = let final dynamic #t1 = super.{self::Base::intProp} in #t1.==(null) ? super.{self::Base::intProp} = self::getInt() : #t1;
    dynamic v5 = let final dynamic #t2 = super.{self::Base::intProp} in #t2.==(null) ? super.{self::Base::intProp} = self::getNum() : #t2;
    dynamic v7 = super.{self::Base::intProp} = super.{self::Base::intProp}.+(self::getInt());
    dynamic v8 = super.{self::Base::intProp} = super.{self::Base::intProp}.+(self::getNum());
    dynamic v10 = super.{self::Base::intProp} = super.{self::Base::intProp}.+(1);
    dynamic v11 = let final dynamic #t3 = super.{self::Base::intProp} in let final dynamic #t4 = super.{self::Base::intProp} = #t3.+(1) in #t3;
  }
}
class Test2 extends self::Base {
  synthetic constructor •() → self::Test2*
    : super self::Base::•()
    ;
  method test() → void {
    dynamic v1 = super.{self::Base::numProp} = self::getInt();
    dynamic v2 = super.{self::Base::numProp} = self::getNum();
    dynamic v3 = super.{self::Base::numProp} = self::getDouble();
    dynamic v4 = let final dynamic #t5 = super.{self::Base::numProp} in #t5.==(null) ? super.{self::Base::numProp} = self::getInt() : #t5;
    dynamic v5 = let final dynamic #t6 = super.{self::Base::numProp} in #t6.==(null) ? super.{self::Base::numProp} = self::getNum() : #t6;
    dynamic v6 = let final dynamic #t7 = super.{self::Base::numProp} in #t7.==(null) ? super.{self::Base::numProp} = self::getDouble() : #t7;
    dynamic v7 = super.{self::Base::numProp} = super.{self::Base::numProp}.+(self::getInt());
    dynamic v8 = super.{self::Base::numProp} = super.{self::Base::numProp}.+(self::getNum());
    dynamic v9 = super.{self::Base::numProp} = super.{self::Base::numProp}.+(self::getDouble());
    dynamic v10 = super.{self::Base::numProp} = super.{self::Base::numProp}.+(1);
    dynamic v11 = let final dynamic #t8 = super.{self::Base::numProp} in let final dynamic #t9 = super.{self::Base::numProp} = #t8.+(1) in #t8;
  }
}
class Test3 extends self::Base {
  synthetic constructor •() → self::Test3*
    : super self::Base::•()
    ;
  method test3() → void {
    dynamic v2 = super.{self::Base::doubleProp} = self::getNum();
    dynamic v3 = super.{self::Base::doubleProp} = self::getDouble();
    dynamic v5 = let final dynamic #t10 = super.{self::Base::doubleProp} in #t10.==(null) ? super.{self::Base::doubleProp} = self::getNum() : #t10;
    dynamic v6 = let final dynamic #t11 = super.{self::Base::doubleProp} in #t11.==(null) ? super.{self::Base::doubleProp} = self::getDouble() : #t11;
    dynamic v7 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.+(self::getInt());
    dynamic v8 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.+(self::getNum());
    dynamic v9 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.+(self::getDouble());
    dynamic v10 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.+(1);
    dynamic v11 = let final dynamic #t12 = super.{self::Base::doubleProp} in let final dynamic #t13 = super.{self::Base::doubleProp} = #t12.+(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 {}
