library closure2_test;
import self as self;
import "dart:core" as core;
import "../../runtime/reify/interceptors.dart" as int;
import "../../runtime/reify/types.dart" as typ;
import "dart:mock" as mock;
import "./test_base.dart" as tes;
import "../../runtime/reify/declarations.dart" as dec;

class A extends core::Object implements int::HasRuntimeTypeGetter {
  final field typ::ReifiedType $type;
  constructor •(typ::ReifiedType $type) → void
    : self::A::$type = $type, super core::Object::•()
    ;
  method fun() → dynamic {
    return new self::Closure#A#fun#function::•(new typ::Interface::•(self::$declarations.[](1), typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](0)))), null);
  }
  get $A$T() → typ::ReifiedType
    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](0))).[](0);
  get runtimeType() → core::Type
    return this.{=self::A::$type};
}
class X extends core::Object implements int::HasRuntimeTypeGetter {
  constructor •() → void
    : super core::Object::•()
    ;
  get $type() → typ::ReifiedType
    return new typ::Interface::•(self::$declarations.[](2));
}
class Y extends core::Object implements int::HasRuntimeTypeGetter {
  constructor •() → void
    : super core::Object::•()
    ;
  get $type() → typ::ReifiedType
    return new typ::Interface::•(self::$declarations.[](3));
}
class Closure#A#fun#function extends core::Object implements core::Function, int::HasRuntimeTypeGetter {
  field core::String note = "This is temporary. The VM doesn't need closure classes.";
  field mock::Context context;
  final field typ::ReifiedType $type;
  constructor •(typ::ReifiedType $type, final mock::Context context) → dynamic
    : self::Closure#A#fun#function::$type = $type, self::Closure#A#fun#function::context = context
    ;
  method call(dynamic o) → dynamic {
    "This is a temporary solution. In the VM, this will become an additional parameter.";
    final mock::Context #contextParameter = this.{self::Closure#A#fun#function::context};
    return typ::isSubtypeOf(int::type(o), this.$Closure#A#fun#function$T);
  }
  get $Closure#A#fun#function$T() → typ::ReifiedType
    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](1))).[](0);
  get runtimeType() → core::Type
    return this.{=self::Closure#A#fun#function::$type};
}
static final field core::List<dec::Class> $declarations = (core::List<dec::Class> d) → core::List<dec::Class> {
  dec::init(d, 0, new typ::Interface::•(d.[](17)));
  dec::init(d, 1, new typ::Interface::•(d.[](17)), <dynamic>[new typ::Interface::•(d.[](19))], new typ::FunctionType::•(new typ::Interface::•(d.[](19)), const typ::Dynamic::•(), 0, <dynamic>[const typ::Dynamic::•()]));
  dec::init(d, 2, new typ::Interface::•(d.[](17)));
  dec::init(d, 3, new typ::Interface::•(d.[](17)));
  dec::init(d, 4, new typ::Interface::•(d.[](17)));
  dec::init(d, 5, new typ::Interface::•(d.[](17)));
  dec::init(d, 6, new typ::Interface::•(d.[](17)), <dynamic>[new typ::Interface::•(d.[](20), <dynamic>[new typ::Interface::•(d.[](6))]), new typ::Interface::•(d.[](21))]);
  dec::init(d, 7, new typ::Interface::•(d.[](22)));
  dec::init(d, 8, new typ::Interface::•(d.[](22)));
  dec::init(d, 9, new typ::Interface::•(d.[](17)));
  dec::init(d, 10, new typ::Interface::•(d.[](23)));
  dec::init(d, 11, new typ::Interface::•(d.[](23)));
  dec::init(d, 12, new typ::Interface::•(d.[](23)));
  dec::init(d, 13, new typ::Interface::•(d.[](23)));
  dec::init(d, 14, new typ::Interface::•(d.[](17)), <dynamic>[new typ::Interface::•(d.[](24))]);
  dec::init(d, 15, new typ::Interface::•(d.[](16)));
  dec::init(d, 16, new typ::Interface::•(d.[](23)));
  dec::init(d, 17, null);
  dec::init(d, 19, new typ::Interface::•(d.[](17)));
  dec::init(d, 20, new typ::Interface::•(d.[](17)));
  dec::init(d, 21, new typ::Interface::•(d.[](17)));
  dec::init(d, 22, new typ::Interface::•(d.[](17)), <dynamic>[new typ::Interface::•(d.[](20), <dynamic>[new typ::Interface::•(d.[](22))])]);
  dec::init(d, 23, new typ::Interface::•(d.[](17)));
  dec::init(d, 24, new typ::Interface::•(d.[](17)));
  return d;
}.call(dec::allocateDeclarations(<dynamic>["A", "Closure#A#fun#function", "X", "Y", "Null", "bool", "String", "int", "double", "Type", "AbstractClassInstantiationError", "NoSuchMethodError", "CyclicInitializationError", "UnsupportedError", "IntegerDivisionByZeroException", "RangeError", "ArgumentError", "Object", "HasRuntimeTypeGetter", "Function", "Comparable", "Pattern", "num", "Error", "Exception"], <dynamic>[1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]));
static method main() → dynamic {
  dynamic tester = new self::A::•(new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](2))])).fun();
  tes::expectTrue(tester.call(new self::X::•()));
  tes::expectFalse(tester.call(new self::Y::•()));
}
