library typevariable2_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 "../../runtime/reify/declarations.dart" as dec;

class C extends core::Object implements int::HasRuntimeTypeGetter {
  final field typ::ReifiedType $type;
  constructor •(typ::ReifiedType $type) → void
    : self::C::$type = $type, super core::Object::•()
    ;
  method test(dynamic o) → core::bool {
    return typ::isSubtypeOf(int::type(o), this.$C$T);
  }
  get t() → core::Type {
    return dynamic;
  }
  get test#get() → dynamic
    return new self::Closure#C#test::•(new typ::Interface::•(self::$declarations.[](1), typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](0)))), this);
  get $C$T() → typ::ReifiedType
    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](0))).[](0);
  get runtimeType() → core::Type
    return this.{=self::C::$type};
}
class Closure#C#test extends core::Object implements core::Function, int::HasRuntimeTypeGetter {
  field core::String note = "This is temporary. The VM doesn't need closure classes.";
  field self::C self;
  final field typ::ReifiedType $type;
  constructor •(typ::ReifiedType $type, final self::C self) → dynamic
    : self::Closure#C#test::$type = $type, self::Closure#C#test::self = self
    ;
  method call(dynamic o) → core::bool
    return this.{self::Closure#C#test::self}.{self::C::test}(o);
  get $Closure#C#test$T() → typ::ReifiedType
    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](1))).[](0);
  get runtimeType() → core::Type
    return this.{=self::Closure#C#test::$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.[](15)));
  dec::init(d, 1, new typ::Interface::•(d.[](15)), <dynamic>[new typ::Interface::•(d.[](17))], new typ::FunctionType::•(new typ::Interface::•(d.[](17)), new typ::Interface::•(d.[](3)), 0, <dynamic>[const typ::Dynamic::•()]));
  dec::init(d, 2, new typ::Interface::•(d.[](15)));
  dec::init(d, 3, new typ::Interface::•(d.[](15)));
  dec::init(d, 4, new typ::Interface::•(d.[](15)), <dynamic>[new typ::Interface::•(d.[](18), <dynamic>[new typ::Interface::•(d.[](4))]), new typ::Interface::•(d.[](19))]);
  dec::init(d, 5, new typ::Interface::•(d.[](20)));
  dec::init(d, 6, new typ::Interface::•(d.[](20)));
  dec::init(d, 7, new typ::Interface::•(d.[](15)));
  dec::init(d, 8, new typ::Interface::•(d.[](21)));
  dec::init(d, 9, new typ::Interface::•(d.[](21)));
  dec::init(d, 10, new typ::Interface::•(d.[](21)));
  dec::init(d, 11, new typ::Interface::•(d.[](21)));
  dec::init(d, 12, new typ::Interface::•(d.[](15)), <dynamic>[new typ::Interface::•(d.[](22))]);
  dec::init(d, 13, new typ::Interface::•(d.[](14)));
  dec::init(d, 14, new typ::Interface::•(d.[](21)));
  dec::init(d, 15, null);
  dec::init(d, 17, new typ::Interface::•(d.[](15)));
  dec::init(d, 18, new typ::Interface::•(d.[](15)));
  dec::init(d, 19, new typ::Interface::•(d.[](15)));
  dec::init(d, 20, new typ::Interface::•(d.[](15)), <dynamic>[new typ::Interface::•(d.[](18), <dynamic>[new typ::Interface::•(d.[](20))])]);
  dec::init(d, 21, new typ::Interface::•(d.[](15)));
  dec::init(d, 22, new typ::Interface::•(d.[](15)));
  return d;
}.call(dec::allocateDeclarations(<dynamic>["C", "Closure#C#test", "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, 1, 0, 0, 0, 0]));
static method main() → dynamic {}
