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 has-declared-initializer self::Class::E? #result;
    lowered core::bool #result#isSet = false;
    function #result#get() → self::Class::E% {
      if(!#result#isSet) {
        #result = this.{self::Class::field}{self::Class::E%};
        #result#isSet = true;
      }
      return #result{self::Class::E%};
    }
    function #result#set(self::Class::E% result#param) → dynamic {
      #result#isSet = true;
      return #result = result#param;
    }
    return #result#get(){() → self::Class::E%};
  }
}
static method returnNonNullable(core::int value) → core::int {
  lowered has-declared-initializer core::int? #result;
  function #result#get() → core::int
    return let final core::int? #t1 = #result in #t1 == null ?{core::int} #result = value : #t1{core::int};
  function #result#set(core::int result#param) → dynamic
    return #result = result#param;
  return #result#get(){() → core::int};
}
static method returnNullable(core::int? value) → core::int? {
  lowered has-declared-initializer 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? result#param) → dynamic {
    #result#isSet = true;
    return #result = result#param;
  }
  return #result#get(){() → core::int?};
}
static method main() → dynamic {
  self::expect(42, new self::Class::•<core::int>(42).{self::Class::returnTypeVariable}(){() → core::int});
  self::expect(87, new self::Class::•<core::int?>(87).{self::Class::returnTypeVariable}(){() → core::int?});
  self::expect(null, new self::Class::•<core::int?>(null).{self::Class::returnTypeVariable}(){() → core::int?});
  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::==}{(core::Object) → core::bool} actual))
    throw "Expected ${expected}, actual ${actual}";
}
