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

class C extends core::Object {
  static field dynamic _redirecting# = <dynamic>[self::C::fact2];
  constructor •() → void
    : super core::Object::•()
    ;
  constructor nonFact() → void
    : super core::Object::•()
    ;
  constructor nonFact2() → void
    : this self::C::nonFact()
    ;
  static factory fact() → self::C
    return null;
  static factory fact2() → self::C
    let dynamic #redirecting_factory = self::D::• in invalid-expression;
  static method staticFunction(core::int i) → void {}
}
class D extends self::C {
  default constructor •() → void
    : super self::C::•()
    ;
}
static method topLevelFunction(core::int i) → void {}
static method bad() → dynamic {
  function localFunction(core::int i) → void {}
  core::List<core::int> a = <core::Object>[];
  core::Map<core::int, core::String> b = <core::Object, core::String>{};
  core::Map<core::int, core::String> c = <core::int, core::Object>{};
  (core::Object) → core::int d = (core::int i) → dynamic => i;
  self::D e = self::C::fact();
  self::D f = new self::D::•();
  self::D g = new self::C::nonFact();
  self::D h = new self::C::nonFact2();
  (core::Object) → void i = self::C::staticFunction;
  (core::Object) → void j = self::topLevelFunction;
  (core::Object) → void k = localFunction;
}
static method ok() → dynamic {
  function localFunction(core::int i) → void {}
  core::List<core::int> a = <core::int>[];
  core::Map<core::int, core::String> b = <core::int, core::String>{};
  core::Map<core::int, core::String> c = <core::int, core::String>{};
  (core::int) → core::int d = (core::int i) → dynamic => i;
  self::D e = self::C::fact();
  self::D f = new self::D::•();
  self::C g = new self::C::nonFact();
  self::C h = new self::C::nonFact2();
  (core::int) → void i = self::C::staticFunction;
  (core::int) → void j = self::topLevelFunction;
  (core::int) → void k = localFunction;
}
static method main() → dynamic {}
