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

typedef Alias = self::Class;
typedef ComplexAlias<unrelated X extends core::Object? = dynamic> = self::Class;
typedef GenericAlias<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> = self::GenericClass<X%, Y%>;
class Class extends core::Object /*hasConstConstructor*/  {
  const constructor •([dynamic a = null]) → self::Class
    : super core::Object::•()
    ;
  const constructor named({dynamic a = null, dynamic b = null}) → self::Class
    : super core::Object::•()
    ;
}
class GenericClass<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
  const constructor •() → self::GenericClass<self::GenericClass::X%, self::GenericClass::Y%>
    : super core::Object::•()
    ;
  const constructor named({dynamic a = null, dynamic b = null}) → self::GenericClass<self::GenericClass::X%, self::GenericClass::Y%>
    : super core::Object::•()
    ;
}
@self::Class::•(const self::Class::named())
@self::Class::•(const self::Class::•())
@self::Class::•(const self::Class::named())
@self::Class::•(const self::GenericClass::•<dynamic, dynamic>())
@self::Class::•(const self::GenericClass::named<dynamic, dynamic>())
static method type() → void
  ;
static synthetic method _#ComplexAlias#new#tearOff<unrelated X extends core::Object? = dynamic>([dynamic a]) → self::Class
  return new self::Class::•(a);
static synthetic method _#ComplexAlias#named#tearOff<unrelated X extends core::Object? = dynamic>({dynamic a, dynamic b}) → self::Class
  return new self::Class::named(a: a, b: b);


Extra constant evaluation status:
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue55755.dart:19:2 -> InstanceConstant(const Class{})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue55755.dart:20:2 -> InstanceConstant(const Class{})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue55755.dart:21:2 -> InstanceConstant(const Class{})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue55755.dart:22:2 -> InstanceConstant(const Class{})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue55755.dart:23:2 -> InstanceConstant(const Class{})
Extra constant evaluation: evaluated: 10, effectively constant: 5
