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

@#C5
typedef SomeType<T extends core::Object = dynamic> = (core::List<T>) → void;
abstract class ClassAnnotation2 extends core::Object {
}
abstract class MethodAnnotation extends core::Object {
[@vm.unreachable.metadata=]  final field core::int x;
}
abstract class TypedefAnnotation extends core::Object {
[@vm.unreachable.metadata=]  final field core::List<core::int> list;
}
abstract class VarAnnotation extends core::Object {
}
abstract class ParametrizedAnnotation<T extends core::Object = dynamic> extends core::Object {
[@vm.unreachable.metadata=]  final field self::ParametrizedAnnotation::T foo;
}
abstract class A extends core::Object {
  static method staticMethod() → void {}
}
@#C6
class B extends core::Object {
  synthetic constructor •() → self::B
    : super core::Object::•()
    ;
[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  @#C8
  method instanceMethod() → void {}
}
static method foo([@vm.inferred-type.metadata=dart.core::Null?] (core::List<core::int>) → void a) → core::int {
  @#C9 core::int x = 2;
  return [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int (skip check)] x.{core::num::+}(2);
}
@#C11
static method main(core::List<core::String> args) → dynamic {
  self::A::staticMethod();
  [@vm.direct-call.metadata=#lib::B::instanceMethod] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•().{self::B::instanceMethod}();
  self::foo(null);
}
