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

import "dart:async";

typedef Exactly<invariant T extends core::Object? = dynamic> = (T%) → T%;
extension /* unnamed */ _extension#0<T extends core::Object? = dynamic> on T% {
  method checkStaticType = self::_extension#0|checkStaticType;
  method tearoff checkStaticType = self::_extension#0|get#checkStaticType;
}
static method id<T extends core::Object? = dynamic>(self::id::T% value) → self::id::T%
  return value;
static method main() → dynamic async /* emittedValueType= dynamic */ {
  FutureOr<core::int>x = 1.{core::num::+}(self::id<core::int>(1)){(core::num) → core::int};
  FutureOr<core::int>y = let final core::int #t1 = 1.{core::num::+}(self::id<core::int>(1)){(core::num) → core::int} in block {
    self::_extension#0|checkStaticType<core::int, (core::int) → core::int>(#t1);
  } =>#t1;
  FutureOr<core::int>z = let final core::int #t2 = 1.{core::num::+}(self::contextType<core::int>(1)){(core::num) → core::int} in block {
    self::_extension#0|checkStaticType<core::int, (core::int) → core::int>(#t2);
  } =>#t2;
}
static extension-member method _extension#0|checkStaticType<T extends core::Object? = dynamic, R extends (self::_extension#0|checkStaticType::T%) → self::_extension#0|checkStaticType::T% = (dynamic) → dynamic>(lowered final self::_extension#0|checkStaticType::T% #this) → void {}
static extension-member method _extension#0|get#checkStaticType<T extends core::Object? = dynamic>(lowered final self::_extension#0|get#checkStaticType::T% #this) → <R extends (self::_extension#0|get#checkStaticType::T%) → self::_extension#0|get#checkStaticType::T% = (dynamic) → dynamic>() → void
  return <R extends (self::_extension#0|get#checkStaticType::T%) → self::_extension#0|get#checkStaticType::T% = (dynamic) → dynamic>() → void => self::_extension#0|checkStaticType<self::_extension#0|get#checkStaticType::T%, R>(#this);
static method contextType<T extends core::Object? = dynamic>(core::Object? o) → self::contextType::T%
  return o as self::contextType::T%;
