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

typedef HInvalid = self::HBase<self::HKindInvalid>;
typedef HInvalidComposite<CHILD extends self::HBase<self::HKindInvalid>> = self::HBaseComposite<self::HKindInvalid, CHILD>;
typedef HInvalidChild<CHILD extends self::HBase<self::HKindInvalid>> = self::HBaseChild<self::HKindInvalid, CHILD>;
typedef HInvalidLeaf = self::HBaseLeaf<self::HKindInvalid>;
typedef HInvalidError = self::HBaseError<self::HKindInvalid>;
abstract class HBase<HKT extends self::HKind> extends core::Object implements self::Kind<self::HBase::HKT> {
  synthetic constructor •() → self::HBase<self::HBase::HKT>
    ;
}
class HBaseComposite<HKT extends self::HKindValid, CHILD extends self::HBase<self::HBaseComposite::HKT> = self::HBase<self::HKindValid>> extends core::Object implements self::HBase<self::HBaseComposite::HKT> /*hasConstConstructor*/  {
  final field core::List<self::HBaseComposite::CHILD> children;
  const constructor •(initializing-formal core::List<self::HBaseComposite::CHILD> children) → self::HBaseComposite<self::HBaseComposite::HKT, self::HBaseComposite::CHILD>
    : self::HBaseComposite::children = children, super core::Object::•()
    ;
}
class HBaseChild<HKT extends self::HKindValid, CHILD extends self::HBase<self::HBaseChild::HKT> = self::HBase<self::HKindValid>> extends core::Object implements self::HBase<self::HBaseChild::HKT> /*hasConstConstructor*/  {
  final field self::HBaseChild::CHILD child;
  const constructor •(initializing-formal self::HBaseChild::CHILD child) → self::HBaseChild<self::HBaseChild::HKT, self::HBaseChild::CHILD>
    : self::HBaseChild::child = child, super core::Object::•()
    ;
}
class HBaseLeaf<HKT extends self::HKindValid> extends core::Object implements self::HBase<self::HBaseLeaf::HKT> /*hasConstConstructor*/  {
  final field core::int data;
  const constructor •(initializing-formal core::int data) → self::HBaseLeaf<self::HBaseLeaf::HKT>
    : self::HBaseLeaf::data = data, super core::Object::•()
    ;
}
class HBaseError<HKT extends self::HKindInvalid> extends core::Object implements self::HBase<self::HBaseError::HKT> /*hasConstConstructor*/  {
  final field core::String errorMessage;
  const constructor •(initializing-formal core::String errorMessage) → self::HBaseError<self::HBaseError::HKT>
    : self::HBaseError::errorMessage = errorMessage, super core::Object::•()
    ;
}
abstract class Kind<HKT extends self::HKind> extends core::Object {
  synthetic constructor •() → self::Kind<self::Kind::HKT>
    ;
}
abstract class HKind extends core::Object {
  synthetic constructor •() → self::HKind
    ;
}
abstract class HKindValid extends core::Object implements self::HKind {
  synthetic constructor •() → self::HKindValid
    ;
}
abstract class HKindInvalid extends core::Object implements self::HKindValid {
  synthetic constructor •() → self::HKindInvalid
    ;
}
static const field self::HBase<self::HKindInvalid> invalidExample = const self::HBaseComposite::•<self::HKindInvalid, self::HBase<self::HKindInvalid>>(const <self::HBase<self::HKindInvalid>>[const self::HBaseLeaf::•<self::HKindInvalid>(0), const self::HBaseChild::•<self::HKindInvalid, self::HBaseLeaf<self::HKindInvalid>>(const self::HBaseLeaf::•<self::HKindInvalid>(0)), const self::HBaseError::•<self::HKindInvalid>("error message")]);
static method main() → dynamic
  ;
static synthetic method _#HInvalidComposite#new#tearOff<CHILD extends self::HBase<self::HKindInvalid>>(core::List<self::_#HInvalidComposite#new#tearOff::CHILD> children) → self::HBaseComposite<self::HKindInvalid, self::_#HInvalidComposite#new#tearOff::CHILD>
  return new self::HBaseComposite::•<self::HKindInvalid, self::_#HInvalidComposite#new#tearOff::CHILD>(children);
static synthetic method _#HInvalidChild#new#tearOff<CHILD extends self::HBase<self::HKindInvalid>>(self::_#HInvalidChild#new#tearOff::CHILD child) → self::HBaseChild<self::HKindInvalid, self::_#HInvalidChild#new#tearOff::CHILD>
  return new self::HBaseChild::•<self::HKindInvalid, self::_#HInvalidChild#new#tearOff::CHILD>(child);


Extra constant evaluation status:
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue48148.dart:5:16 -> InstanceConstant(const HBaseComposite<HKindInvalid, HBase<HKindInvalid>>{HBaseComposite.children: const <HBase<HKindInvalid>>[const HBaseLeaf<HKindInvalid>{HBaseLeaf.data: 0}, const HBaseChild<HKindInvalid, HBaseLeaf<HKindInvalid>>{HBaseChild.child: const HBaseLeaf<HKindInvalid>{HBaseLeaf.data: 0}}, const HBaseError<HKindInvalid>{HBaseError.errorMessage: "error message"}]})
Extra constant evaluation: evaluated: 9, effectively constant: 1
