library main /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "member_inheritance_from_opt_out_lib.dart" as opt;

import "org-dartlang-testcase:///member_inheritance_from_opt_out_lib.dart";

abstract class Interface extends core::Object {
  field core::int field1;
  field core::int? field2;
  field core::int property3;
  field core::int? property4;
  synthetic constructor •() → self::Interface
    ;
  abstract method method1() → core::int;
  abstract method method2() → core::int?;
  abstract method method3a(core::int a, core::int b) → core::int;
  abstract method method3b(core::int a, [core::int b]) → core::int;
  abstract method method3c([core::int a, core::int b]) → core::int;
  abstract method method4a(core::int? a, core::int? b) → core::int?;
  abstract method method4b(core::int? a, [core::int? b]) → core::int?;
  abstract method method4c([core::int? a, core::int? b]) → core::int?;
  abstract method method5a(core::int a, {core::int b = 0}) → core::int;
  abstract method method5b({core::int a = 0, core::int b = 0}) → core::int;
  abstract method method5c({required core::int a, required core::int b}) → core::int;
  abstract method method6a(core::int? a, {core::int? b}) → core::int?;
  abstract method method6b({core::int? a, core::int? b}) → core::int?;
  abstract method method6c({required core::int? a, required core::int? b}) → core::int?;
  abstract get getter1() → core::int;
  abstract get getter2() → core::int?;
  abstract set setter1(core::int value) → void;
  abstract set setter2(core::int? value) → void;
  abstract get field3() → core::int;
  abstract set field3(core::int value) → void;
  abstract get field4() → core::int?;
  abstract set field4(core::int? value) → void;
  abstract get property1() → core::int;
  abstract set property1(core::int value) → void;
  abstract get property2() → core::int?;
  abstract set property2(core::int? value) → void;
}
class Class1 extends opt::LegacyClass {
  synthetic constructor •() → self::Class1
    ;
}
class Class2a extends opt::LegacyClass implements self::Interface {
  synthetic constructor •() → self::Class2a
    ;
  abstract member-signature get field1() → core::int; -> opt::LegacyClass::field1
  abstract member-signature set field1(core::int value) → void; -> opt::LegacyClass::field1
  abstract member-signature get field2() → core::int?; -> opt::LegacyClass::field2
  abstract member-signature set field2(core::int? value) → void; -> opt::LegacyClass::field2
  abstract member-signature get field3() → core::int; -> opt::LegacyClass::field3
  abstract member-signature set field3(core::int value) → void; -> opt::LegacyClass::field3
  abstract member-signature get field4() → core::int?; -> opt::LegacyClass::field4
  abstract member-signature set field4(core::int? value) → void; -> opt::LegacyClass::field4
  abstract member-signature get property1() → core::int; -> opt::LegacyClass::property1
  abstract member-signature set property1(core::int value) → void; -> opt::LegacyClass::property1
  abstract member-signature get property2() → core::int?; -> opt::LegacyClass::property2
  abstract member-signature set property2(core::int? value) → void; -> opt::LegacyClass::property2
  abstract member-signature get property3() → core::int; -> opt::LegacyClass::property3
  abstract member-signature set property3(core::int value) → void; -> opt::LegacyClass::property3
  abstract member-signature get property4() → core::int?; -> opt::LegacyClass::property4
  abstract member-signature set property4(core::int? value) → void; -> opt::LegacyClass::property4
  abstract member-signature method method1() → core::int; -> opt::LegacyClass::method1
  abstract member-signature method method2() → core::int?; -> opt::LegacyClass::method2
  abstract member-signature method method3a(core::int a, core::int b) → core::int; -> opt::LegacyClass::method3a
  abstract member-signature method method3b(core::int a, [core::int b]) → core::int; -> opt::LegacyClass::method3b
  abstract member-signature method method3c([core::int a, core::int b]) → core::int; -> opt::LegacyClass::method3c
  abstract member-signature method method4a(core::int? a, core::int? b) → core::int?; -> opt::LegacyClass::method4a
  abstract member-signature method method4b(core::int? a, [core::int? b]) → core::int?; -> opt::LegacyClass::method4b
  abstract member-signature method method4c([core::int? a, core::int? b]) → core::int?; -> opt::LegacyClass::method4c
  abstract member-signature method method5a(core::int a, {core::int b}) → core::int; -> opt::LegacyClass::method5a
  abstract member-signature method method5b({core::int a, core::int b}) → core::int; -> opt::LegacyClass::method5b
  abstract member-signature method method6a(core::int? a, {core::int? b}) → core::int?; -> opt::LegacyClass::method6a
  abstract member-signature method method6b({core::int? a, core::int? b}) → core::int?; -> opt::LegacyClass::method6b
  abstract member-signature get getter1() → core::int; -> opt::LegacyClass::getter1
  abstract member-signature get getter2() → core::int?; -> opt::LegacyClass::getter2
  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 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
  abstract member-signature set setter1(core::int value) → void; -> opt::LegacyClass::setter1
  abstract member-signature set setter2(core::int? value) → void; -> opt::LegacyClass::setter2
}
class Class2b extends opt::LegacyClass implements self::Interface {
  field core::int field1;
  field core::int? field2;
  field core::int property3;
  field core::int? property4;
  synthetic constructor •() → self::Class2b
    ;
  method method1() → core::int
    ;
  method method2() → core::int?
    ;
  method method3a(core::int a, core::int b) → core::int
    ;
  method method3b(core::int a, [core::int b = 42]) → core::int
    ;
  method method3c([core::int a = 42, core::int b = 42]) → core::int
    ;
  method method4a(core::int? a, core::int? b) → core::int?
    ;
  method method4b(core::int? a, [core::int? b]) → core::int?
    ;
  method method4c([core::int? a, core::int? b]) → core::int?
    ;
  method method5a(core::int a, {core::int b = 0}) → core::int
    ;
  method method5b({core::int a = 0, core::int b = 0}) → core::int
    ;
  method method5c({required core::int a, required core::int b}) → core::int
    ;
  method method6a(core::int? a, {core::int? b}) → core::int?
    ;
  method method6b({core::int? a, core::int? b}) → core::int?
    ;
  method method6c({required core::int? a, required core::int? b}) → core::int?
    ;
  get getter1() → core::int
    ;
  get getter2() → core::int?
    ;
  set setter1(core::int value) → void
    ;
  set setter2(core::int? value) → void
    ;
  get field3() → core::int
    ;
  set field3(core::int value) → void
    ;
  get field4() → core::int?
    ;
  set field4(core::int? value) → void
    ;
  get property1() → core::int
    ;
  set property1(core::int value) → void
    ;
  get property2() → core::int?
    ;
  set property2(core::int? value) → void
    ;
  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 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 Class3a extends opt::GenericLegacyClass<core::int> {
  synthetic constructor •() → self::Class3a
    ;
}
class Class3b extends opt::GenericLegacyClass<core::int?> {
  synthetic constructor •() → self::Class3b
    ;
}
class Class3c<S extends core::Object? = dynamic> extends opt::GenericLegacyClass<self::Class3c::S%> {
  synthetic constructor •() → self::Class3c<self::Class3c::S%>
    ;
}
static method main() → dynamic
  ;

library opt_out;
import self as opt;
import "dart:core" as core;

class LegacyClass extends core::Object {
  field core::int* field1;
  field core::int* field2;
  field core::int* field3;
  field core::int* field4;
  synthetic constructor •() → opt::LegacyClass*
    ;
  method method1() → core::int*
    ;
  method method2() → core::int*
    ;
  method method3a(core::int* a, core::int* b) → core::int*
    ;
  method method3b(core::int* a, [core::int* b]) → core::int*
    ;
  method method3c([core::int* a, core::int* b]) → core::int*
    ;
  method method4a(core::int* a, core::int* b) → core::int*
    ;
  method method4b(core::int* a, [core::int* b]) → core::int*
    ;
  method method4c([core::int* a, core::int* b]) → core::int*
    ;
  method method5a(core::int* a, {core::int* b}) → core::int*
    ;
  method method5b({core::int* a, core::int* b}) → core::int*
    ;
  method method5c({core::int* a, core::int* b}) → core::int*
    ;
  method method6a(core::int* a, {core::int* b}) → core::int*
    ;
  method method6b({core::int* a, core::int* b}) → core::int*
    ;
  method method6c({core::int* a, core::int* b}) → core::int*
    ;
  get getter1() → core::int*
    ;
  get getter2() → core::int*
    ;
  set setter1(core::int* value) → void
    ;
  set setter2(core::int* value) → void
    ;
  get property1() → core::int*
    ;
  set property1(core::int* value) → void
    ;
  get property2() → core::int*
    ;
  set property2(core::int* value) → void
    ;
  get property3() → core::int*
    ;
  set property3(core::int* value) → void
    ;
  get property4() → core::int*
    ;
  set property4(core::int* value) → void
    ;
  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 GenericLegacyClass<T extends core::Object* = dynamic> extends core::Object {
  synthetic constructor •() → opt::GenericLegacyClass<opt::GenericLegacyClass::T*>*
    ;
  method method1() → opt::GenericLegacyClass::T*
    ;
  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
}
