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

typedef Exactly<invariant T extends core::Object? = dynamic> = (T%) → T%;
class Foo<T extends core::Object? = dynamic> extends core::Object {
  synthetic constructor •() → self::Foo<self::Foo::T%>
    : super core::Object::•()
    ;
}
class C<T extends core::Object> extends core::Object {
  synthetic constructor •() → self::C<self::C::T>
    : super core::Object::•()
    ;
  method something(covariant-by-class () → self::C::T? read) → void {
    self::C::T? argumentValue = read(){() → self::C::T?};
    if(!(argumentValue is self::Foo<core::String>)) {
      return;
    }
    self::CheckType|expect<self::C::T, (self::C::T) → self::C::T>(argumentValue{self::C::T & self::Foo<core::String> /* '!' & '!' = '!' */});
    self::Foo<core::String> fooValue = argumentValue{self::C::T & self::Foo<core::String> /* '!' & '!' = '!' */} as{Unchecked} self::Foo<core::String>;
    self::CheckType|expect<self::Foo<core::String>, (self::Foo<core::String>) → self::Foo<core::String>>(fooValue);
    self::CheckTypeArgumentOfFoo|expect<core::String, (core::String) → core::String>(fooValue);
  }
}
extension CheckType<T extends core::Object? = dynamic> on T% {
  method expect = self::CheckType|expect;
  method tearoff expect = self::CheckType|get#expect;
}
extension CheckTypeArgumentOfFoo<T extends core::Object? = dynamic> on self::Foo<T%> {
  method expect = self::CheckTypeArgumentOfFoo|expect;
  method tearoff expect = self::CheckTypeArgumentOfFoo|get#expect;
}
static extension-member method CheckType|expect<T extends core::Object? = dynamic, S extends (self::CheckType|expect::T%) → self::CheckType|expect::T% = (dynamic) → dynamic>(lowered final self::CheckType|expect::T% #this) → void {}
static extension-member method CheckType|get#expect<T extends core::Object? = dynamic>(lowered final self::CheckType|get#expect::T% #this) → <S extends (self::CheckType|get#expect::T%) → self::CheckType|get#expect::T% = (dynamic) → dynamic>() → void
  return <S extends (self::CheckType|get#expect::T%) → self::CheckType|get#expect::T% = (dynamic) → dynamic>() → void => self::CheckType|expect<self::CheckType|get#expect::T%, S>(#this);
static extension-member method CheckTypeArgumentOfFoo|expect<T extends core::Object? = dynamic, S extends (self::CheckTypeArgumentOfFoo|expect::T%) → self::CheckTypeArgumentOfFoo|expect::T% = (dynamic) → dynamic>(lowered final self::Foo<self::CheckTypeArgumentOfFoo|expect::T%> #this) → void {}
static extension-member method CheckTypeArgumentOfFoo|get#expect<T extends core::Object? = dynamic>(lowered final self::Foo<self::CheckTypeArgumentOfFoo|get#expect::T%> #this) → <S extends (self::CheckTypeArgumentOfFoo|get#expect::T%) → self::CheckTypeArgumentOfFoo|get#expect::T% = (dynamic) → dynamic>() → void
  return <S extends (self::CheckTypeArgumentOfFoo|get#expect::T%) → self::CheckTypeArgumentOfFoo|get#expect::T% = (dynamic) → dynamic>() → void => self::CheckTypeArgumentOfFoo|expect<self::CheckTypeArgumentOfFoo|get#expect::T%, S>(#this);
static method main() → void {
  new self::C::•<self::Foo<core::String>>().{self::C::something}(() → self::Foo<core::String> => new self::Foo::•<core::String>()){(() → self::Foo<core::String>?) → void};
}
