library;
import self as self;
import "dart:core" as core;
import "nsm_from_opt_in_lib.dart" as nsm;

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

abstract class A2 extends core::Object implements nsm::A {
  synthetic constructor •() → self::A2*
    : super core::Object::•()
    ;
  @#C1
  method noSuchMethod(core::Invocation* invocation) → dynamic {
    return super.{core::Object::noSuchMethod}(invocation);
  }
  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 get runtimeType() → core::Type*;
  abstract member-signature method method(core::int* i) → core::int*;
  abstract member-signature method genericMethod1<T extends core::Object* = dynamic>(self::A2::genericMethod1::T* t) → self::A2::genericMethod1::T*;
  abstract member-signature method genericMethod2<T extends core::Object* = core::Object*>(self::A2::genericMethod2::T* t) → self::A2::genericMethod2::T*;
  abstract member-signature method genericMethod3<T extends core::Object* = core::Object*>(self::A2::genericMethod3::T* t) → self::A2::genericMethod3::T*;
}
abstract class B2 extends nsm::A implements self::C2 {
  synthetic constructor •() → self::B2*
    : super nsm::A::•()
    ;
  @#C1
  method noSuchMethod(core::Invocation* invocation) → dynamic {
    return super.{core::Object::noSuchMethod}(invocation);
  }
  abstract forwarding-stub method method(core::int* i, {dynamic optional = #C2}) → core::int*;
  abstract member-signature method genericMethod1<T extends core::Object* = dynamic>(self::B2::genericMethod1::T* t) → self::B2::genericMethod1::T*;
  abstract member-signature method genericMethod2<T extends core::Object* = core::Object*>(self::B2::genericMethod2::T* t) → self::B2::genericMethod2::T*;
  abstract member-signature method genericMethod3<T extends core::Object* = core::Object*>(self::B2::genericMethod3::T* t) → self::B2::genericMethod3::T*;
  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 get runtimeType() → core::Type*;
}
abstract class C2 extends core::Object {
  synthetic constructor •() → self::C2*
    : super core::Object::•()
    ;
  abstract method method(core::int* i, {dynamic optional = #C2}) → core::int*;
  abstract method genericMethod1<T extends core::Object* = dynamic>(self::C2::genericMethod1::T* t) → self::C2::genericMethod1::T*;
  abstract method genericMethod2<T extends core::Object* = core::Object*>(self::C2::genericMethod2::T* t) → self::C2::genericMethod2::T*;
  abstract method genericMethod3<T extends core::Object* = core::Object*>(self::C2::genericMethod3::T* t) → self::C2::genericMethod3::T*;
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
  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 get runtimeType() → core::Type*;
}
static method main() → dynamic {}

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

class A extends core::Object {
  synthetic constructor •() → nsm::A
    : super core::Object::•()
    ;
  method method(core::int? i) → core::int
    return let final core::int? #t1 = i in #t1.{core::num::==}(null) ?{core::int} 0 : #t1{core::int};
  method genericMethod1<T extends core::Object? = dynamic>(nsm::A::genericMethod1::T% t) → nsm::A::genericMethod1::T%
    return t;
  method genericMethod2<T extends core::Object? = core::Object?>(nsm::A::genericMethod2::T% t) → nsm::A::genericMethod2::T%
    return t;
  method genericMethod3<T extends core::Object = core::Object>(nsm::A::genericMethod3::T t) → nsm::A::genericMethod3::T
    return t;
}
abstract class B1 extends nsm::A implements nsm::C1 {
  synthetic constructor •() → nsm::B1
    : super nsm::A::•()
    ;
  @#C1
  method noSuchMethod(core::Invocation invocation) → dynamic {
    return super.{core::Object::noSuchMethod}(invocation);
  }
  abstract forwarding-stub method method(core::int? i, {dynamic optional = #C2}) → core::int;
}
abstract class C1 extends core::Object {
  synthetic constructor •() → nsm::C1
    : super core::Object::•()
    ;
  abstract method method(core::int? i, {dynamic optional = #C2}) → core::int;
  abstract method genericMethod1<T extends core::Object? = dynamic>(nsm::C1::genericMethod1::T% t) → nsm::C1::genericMethod1::T%;
  abstract method genericMethod2<T extends core::Object? = core::Object?>(nsm::C1::genericMethod2::T% t) → nsm::C1::genericMethod2::T%;
  abstract method genericMethod3<T extends core::Object = core::Object>(nsm::C1::genericMethod3::T t) → nsm::C1::genericMethod3::T;
}

constants  {
  #C1 = core::_Override {}
  #C2 = null
}
