library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "package:expect/expect.dart" as exp;

import "package:expect/expect.dart";

class A<N extends core::Object? = dynamic, S extends core::Object? = dynamic, U extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
  final field core::List<self::A::U?>? field;
  constructor •(self::A::N% n, self::A::S% s) → self::A<self::A::N%, self::A::S%, self::A::U%>
    : self::A::field = <self::A::U%>[], super core::Object::•() {
    exp::Expect::isTrue(n is{ForNonNullableByDefault} self::A::N%);
    exp::Expect::isTrue(s is{ForNonNullableByDefault} self::A::S%);
  }
  constructor empty() → self::A<self::A::N%, self::A::S%, self::A::U%>
    : self::A::field = null, super core::Object::•() {}
  const constructor c(self::A::U% u, self::A::S% s) → self::A<self::A::N%, self::A::S%, self::A::U%>
    : self::A::field = #C2, super core::Object::•()
    ;
  static factory f<N extends core::Object? = dynamic, S extends core::Object? = dynamic, U extends core::Object? = dynamic>(self::A::f::S% s) → self::A<self::A::f::N%, self::A::f::S%, self::A::f::U%> {
    exp::Expect::isTrue(s is{ForNonNullableByDefault} self::A::f::S%);
    return new self::A::empty<self::A::f::N%, self::A::f::S%, self::A::f::U%>();
  }
  get getter() → core::List<self::A::U?>? {
    return this.{self::A::field}{core::List<self::A::U?>?};
  }
  set setter(covariant-by-class self::A::S% s) → void {}
}
abstract class J<Aa extends core::Object? = dynamic, B extends core::Object? = dynamic> extends core::Object {
  synthetic constructor •() → self::J<self::J::Aa%, self::J::B%>
    : super core::Object::•()
    ;
}
abstract class I<H extends core::Object? = dynamic, C extends core::Object? = dynamic, K extends core::Object? = dynamic> extends self::J<self::I::C%, self::I::K%> {
  synthetic constructor •() → self::I<self::I::H%, self::I::C%, self::I::K%>
    : super self::J::•()
    ;
}
static method main() → dynamic {
  new self::A::•<core::num, core::double, core::List<dynamic>>(1, 2.0);
  self::A<dynamic, dynamic, dynamic> a = self::A::f<core::int, core::int, core::int>(1);
  #C3;
  core::List<dynamic>? z = a.{self::A::getter}{core::List<dynamic>?};
  a.{self::A::setter} = 1;
}

constants  {
  #C1 = null
  #C2 = <Null>[#C1]
  #C3 = self::A<core::int*, core::int*, core::List<dynamic>*> {field:#C2}
}


Constructor coverage from constants:
org-dartlang-testcase:///issue_000070.dart:
- A.c (from org-dartlang-testcase:///issue_000070.dart:22:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
