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 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};
}
