library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

import "org-dartlang-testcase:///typedef_from_lib.dart";

part typedef_from_part.dart;
typedef B<S extends core::Object? = dynamic> = self::Class<S%, core::int>;
class Class<S extends core::Object? = dynamic, T extends core::Object? = dynamic> extends core::Object {
  static final field dynamic _redirecting# = <dynamic>[self::Class::redirect]/*isLegacy*/;
  constructor •(self::Class::S% a, self::Class::T% b) → self::Class<self::Class::S%, self::Class::T%>
    ;
  constructor named(self::Class::S% a, [self::Class::T? b = null, core::int c = 42]) → self::Class<self::Class::S%, self::Class::T%>
    ;
  static method _#new#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#new#tearOff::S% a, self::Class::_#new#tearOff::T% b) → self::Class<self::Class::_#new#tearOff::S%, self::Class::_#new#tearOff::T%>
    return new self::Class::•<self::Class::_#new#tearOff::S%, self::Class::_#new#tearOff::T%>(a, b);
  static method _#named#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#named#tearOff::S% a, [self::Class::_#named#tearOff::T? b, has-declared-initializer core::int c]) → self::Class<self::Class::_#named#tearOff::S%, self::Class::_#named#tearOff::T%>
    return new self::Class::named<self::Class::_#named#tearOff::S%, self::Class::_#named#tearOff::T%>(a, b, c);
  static factory fact<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::fact::S% a, {self::Class::fact::T? b, has-declared-initializer core::int c}) → self::Class<self::Class::fact::S%, self::Class::fact::T%>
    ;
  static method _#fact#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#fact#tearOff::S% a, {self::Class::_#fact#tearOff::T? b, has-declared-initializer core::int c}) → self::Class<self::Class::_#fact#tearOff::S%, self::Class::_#fact#tearOff::T%>
    return self::Class::fact<self::Class::_#fact#tearOff::S%, self::Class::_#fact#tearOff::T%>(a, b: b, c: c);
  static factory redirect<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::redirect::S% a) → self::Class<self::Class::redirect::S%, self::Class::redirect::T%>
    return new self::Class::named<self::Class::redirect::S%, self::Class::redirect::T%>(a);
  static method _#redirect#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#redirect#tearOff::S% a) → self::Class<self::Class::_#redirect#tearOff::S%, self::Class::_#redirect#tearOff::T%>
    return new self::Class::named<self::Class::_#redirect#tearOff::S%, self::Class::_#redirect#tearOff::T%>(a);
}
static method main() → dynamic
  ;
static method _#B#new#tearOff<S extends core::Object? = dynamic>(self::_#B#new#tearOff::S% a, core::int b) → self::Class<self::_#B#new#tearOff::S%, core::int>
  return new self::Class::•<self::_#B#new#tearOff::S%, core::int>(a, b);
static method _#B#named#tearOff<S extends core::Object? = dynamic>(self::_#B#named#tearOff::S% a, [core::int? b, has-declared-initializer core::int c]) → self::Class<self::_#B#named#tearOff::S%, core::int>
  return new self::Class::named<self::_#B#named#tearOff::S%, core::int>(a, b, c);
static method _#B#fact#tearOff<S extends core::Object? = dynamic>(self::_#B#fact#tearOff::S% a, {core::int? b, has-declared-initializer core::int c}) → self::Class<self::_#B#fact#tearOff::S%, core::int>
  return self::Class::fact<self::_#B#fact#tearOff::S%, core::int>(a, b: b, c: c);
static method _#B#redirect#tearOff<S extends core::Object? = dynamic>(self::_#B#redirect#tearOff::S% a) → self::Class<self::_#B#redirect#tearOff::S%, core::int>
  return self::Class::_#redirect#tearOff<self::_#B#redirect#tearOff::S%, core::int>(a);

library /*isNonNullableByDefault*/;
import self as self2;
import "dart:core" as core;
import "typedef_from.dart" as self;

import "org-dartlang-testcase:///typedef_from.dart";

typedef A<T extends core::Object? = dynamic> = self::Class<T%, core::String>;
static method /* from org-dartlang-testcase:///typedef_from.dart */ _#A#new#tearOff<T extends core::Object? = dynamic>(self2::_#A#new#tearOff::T% a, core::String b) → self::Class<self2::_#A#new#tearOff::T%, core::String>
  return new self::Class::•<self2::_#A#new#tearOff::T%, core::String>(a, b);
static method /* from org-dartlang-testcase:///typedef_from.dart */ _#A#named#tearOff<T extends core::Object? = dynamic>(self2::_#A#named#tearOff::T% a, [core::String? b, has-declared-initializer core::int c]) → self::Class<self2::_#A#named#tearOff::T%, core::String>
  return new self::Class::named<self2::_#A#named#tearOff::T%, core::String>(a, b, c);
static method /* from org-dartlang-testcase:///typedef_from.dart */ _#A#fact#tearOff<T extends core::Object? = dynamic>(self2::_#A#fact#tearOff::T% a, {core::String? b, has-declared-initializer core::int c}) → self::Class<self2::_#A#fact#tearOff::T%, core::String>
  return self::Class::fact<self2::_#A#fact#tearOff::T%, core::String>(a, b: b, c: c);
static method /* from org-dartlang-testcase:///typedef_from.dart */ _#A#redirect#tearOff<T extends core::Object? = dynamic>(self2::_#A#redirect#tearOff::T% a) → self::Class<self2::_#A#redirect#tearOff::T%, core::String>
  return self::Class::_#redirect#tearOff<self2::_#A#redirect#tearOff::T%, core::String>(a);


Extra constant evaluation status:
Evaluated: ConstructorTearOff @ org-dartlang-testcase:///typedef_from.dart:75:7 -> ConstructorTearOffConstant(Class.redirect)
Extra constant evaluation: evaluated: 43, effectively constant: 1
