library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

class Class<E extends core::Object? = dynamic> extends core::Object {
  final field self::Class::E% field;
  constructor •(self::Class::E% field) → self::Class<self::Class::E%>
    : self::Class::field = field, super core::Object::•()
    ;
  method returnTypeVariable() → self::Class::E% {
    lowered self::Class::E? #result;
    lowered core::bool #result#isSet = false;
    function #result#get() → self::Class::E% {
      if(!#result#isSet) {
        #result = this.{self::Class::field};
        #result#isSet = true;
      }
      return #result{self::Class::E%};
    }
    function #result#set(self::Class::E% #t1) → dynamic {
      #result#isSet = true;
      return #result = #t1;
    }
    return #result#get.call();
  }
}
static method returnNonNullable(core::int value) → core::int {
  lowered core::int? #result;
  function #result#get() → core::int
    return let final core::int? #t2 = #result in #t2.==(null) ?{core::int} #result = value : #t2{core::int};
  function #result#set(core::int #t3) → dynamic
    return #result = #t3;
  return #result#get.call();
}
static method returnNullable(core::int? value) → core::int? {
  lowered core::int? #result;
  lowered core::bool #result#isSet = false;
  function #result#get() → core::int? {
    if(!#result#isSet) {
      #result = value;
      #result#isSet = true;
    }
    return #result;
  }
  function #result#set(core::int? #t4) → dynamic {
    #result#isSet = true;
    return #result = #t4;
  }
  return #result#get.call();
}
static method main() → dynamic {
  self::expect(42, new self::Class::•<core::int>(42).{self::Class::returnTypeVariable}());
  self::expect(87, new self::Class::•<core::int?>(87).{self::Class::returnTypeVariable}());
  self::expect(null, new self::Class::•<core::int?>(null).{self::Class::returnTypeVariable}());
  self::expect(42, self::returnNonNullable(42));
  self::expect(87, self::returnNullable(87));
  self::expect(null, self::returnNullable(null));
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!expected.{core::Object::==}(actual))
    throw "Expected ${expected}, actual ${actual}";
}
