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

class C<T extends core::Object, S extends core::Object> extends core::Object {
  constructor internal() → void
    : super core::Object::•()
    ;
  method foo(self::C::S s) → dynamic {
    final mock::Context #context = new mock::Context::•(1);
    #context.parent = null;
    #context.[]=(0, this);
    return new self::Closure#C#foo#function::•<self::C::T, self::C::S>(#context);
  }
  method bar() → dynamic {
    self::C<self::C::T, self::C::S> self = this;
  }
  method baz() → dynamic {
    return new self::Closure#C#baz#function::•<self::C::T, self::C::S>(null);
  }
  static factory •<T extends core::Object, S extends core::Object>() → self::C<self::C::•::T, self::C::•::S> {
    final () → dynamic local = new self::Closure#C#function#local::•<self::C::•::T, self::C::•::S>(null);
    return local.call();
  }
}
class Closure#C#foo#function<T extends core::Object, S extends core::Object> extends core::Object implements core::Function {
  field core::String note = "This is temporary. The VM doesn't need closure classes.";
  field mock::Context context;
  constructor •(final mock::Context context) → dynamic
    : self::Closure#C#foo#function::context = context
    ;
  method call(self::Closure#C#foo#function::T x) → dynamic {
    "This is a temporary solution. In the VM, this will become an additional parameter.";
    final mock::Context #contextParameter = this.{self::Closure#C#foo#function::context};
    self::Closure#C#foo#function::T y = x;
    core::Object z = y;
    self::C<self::Closure#C#foo#function::T, self::Closure#C#foo#function::S> self = #contextParameter.[](0);
    return z as self::Closure#C#foo#function::T;
  }
}
class Closure#C#baz#function#function<T extends core::Object, S extends core::Object> extends core::Object implements core::Function {
  field core::String note = "This is temporary. The VM doesn't need closure classes.";
  field mock::Context context;
  constructor •(final mock::Context context) → dynamic
    : self::Closure#C#baz#function#function::context = context
    ;
  method call() → dynamic {
    "This is a temporary solution. In the VM, this will become an additional parameter.";
    final mock::Context #contextParameter = this.{self::Closure#C#baz#function#function::context};
    return self::C::•<self::Closure#C#baz#function#function::T, self::Closure#C#baz#function#function::S>();
  }
}
class Closure#C#baz#function<T extends core::Object, S extends core::Object> extends core::Object implements core::Function {
  field core::String note = "This is temporary. The VM doesn't need closure classes.";
  field mock::Context context;
  constructor •(final mock::Context context) → dynamic
    : self::Closure#C#baz#function::context = context
    ;
  method call() → dynamic {
    "This is a temporary solution. In the VM, this will become an additional parameter.";
    final mock::Context #contextParameter = this.{self::Closure#C#baz#function::context};
    return new self::Closure#C#baz#function#function::•<self::Closure#C#baz#function::T, self::Closure#C#baz#function::S>(#contextParameter);
  }
}
class Closure#C#function#local<T extends core::Object, S extends core::Object> extends core::Object implements core::Function {
  field core::String note = "This is temporary. The VM doesn't need closure classes.";
  field mock::Context context;
  constructor •(final mock::Context context) → dynamic
    : self::Closure#C#function#local::context = context
    ;
  method call() → dynamic {
    "This is a temporary solution. In the VM, this will become an additional parameter.";
    final mock::Context #contextParameter = this.{self::Closure#C#function#local::context};
    self::C<self::Closure#C#function#local::T, self::Closure#C#function#local::S> self = new self::C::internal<self::Closure#C#function#local::T, self::Closure#C#function#local::S>();
    return self;
  }
}
static method main(dynamic arguments) → dynamic {
  core::print(self::C::•<core::String, core::String>().foo(null).call(arguments.first));
  dynamic c = self::C::•<core::int, core::int>().baz().call().call();
  if(!(c is self::C<core::int, core::int>))
    throw "${c} fails type test 'is C<int, int>'";
  if(c is self::C<core::String, core::String>) {
    throw "${c} passes type test 'is C<String, String>'";
  }
  core::print(c);
}
