library test.qualified.main /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/general/qualified.dart:13:11: Error: The name of a constructor must match the name of the enclosing class.
//   factory WrongName() => throw '';
//           ^^^^^^^^^
// pkg/front_end/testcases/general/qualified.dart:11:7: Context: The name of the enclosing class is 'Bad'.
// class Bad extends lib.Missing {
//       ^^^
//
// pkg/front_end/testcases/general/qualified.dart:11:19: Error: Type 'lib.Missing' not found.
// class Bad extends lib.Missing {
//                   ^^^^^^^^^^^
//
// pkg/front_end/testcases/general/qualified.dart:12:3: Error: Type 'lib.Missing' not found.
//   lib.Missing method() {}
//   ^^^^^^^^^^^
//
// pkg/front_end/testcases/general/qualified.dart:18:32: Error: The type 'lib.VoidFunction' which is an alias of 'void Function()' can't be used as supertype.
// class IllegalSupertype extends lib.VoidFunction {}
//                                ^
// pkg/front_end/testcases/general/qualified_lib.dart:27:9: Context: The issue arises via this type alias.
// typedef VoidFunction = void Function();
//         ^
//
import self as self;
import "dart:core" as core;
import "qualified_lib.dart" as lib;

import "org-dartlang-testcase:///qualified_lib.dart" as lib;

part qualified_part.dart;
class Bad extends core::Object {
  method method() → invalid-type
    ;
  static factory WrongName() → self::Bad
    ;
}
abstract class _WithMixin&Supertype&Mixin = lib::Supertype with lib::Mixin /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_WithMixin&Supertype&Mixin
    : super lib::Supertype::•()
    ;
  mixin-super-stub method foo() → dynamic
    return super.{lib::Mixin::foo}();
}
class WithMixin extends self::_WithMixin&Supertype&Mixin {
  synthetic constructor •() → self::WithMixin
    ;
}
class IllegalSupertype extends core::Object {
  synthetic constructor •() → self::IllegalSupertype
    ;
}
class C<T extends core::Object? = dynamic> extends core::Object { // from org-dartlang-testcase:///qualified_part.dart
  static final field dynamic _redirecting# = <dynamic>[self::C::b]/*isLegacy*/;
  constructor •() → self::C<self::C::T%>
    ;
  constructor a() → self::C<self::C::T%>
    ;
  static factory b<T extends core::Object? = dynamic>() → self::C<self::C::b::T%>
    return lib::C::b<self::C::b::T%>();
}
static method main() → dynamic
  ;

library test.qualified.lib /*isNonNullableByDefault*/;
import self as lib;
import "dart:core" as core;
import "qualified.dart" as self;

import "org-dartlang-testcase:///qualified.dart" as main;

typedef VoidFunction = () → void;
class C<T extends core::Object? = dynamic> extends self::C<lib::C::T%> {
  static final field dynamic _redirecting# = <dynamic>[lib::C::b]/*isLegacy*/;
  constructor •() → lib::C<lib::C::T%>
    ;
  constructor a() → lib::C<lib::C::T%>
    ;
  static factory b<T extends core::Object? = dynamic>() → lib::C<lib::C::b::T%>
    return new lib::C::a<lib::C::b::T%>();
}
class Supertype extends core::Object {
  synthetic constructor •() → lib::Supertype
    ;
  method supertypeMethod() → dynamic
    ;
}
abstract class Mixin extends core::Object {
  synthetic constructor •() → lib::Mixin
    ;
  method foo() → dynamic
    ;
}


Extra constant evaluation status:
Evaluated: ConstructorTearOff @ org-dartlang-testcase:///qualified_part.dart:7:7 -> ConstructorTearOffConstant(C.b)
Evaluated: ConstructorTearOff @ org-dartlang-testcase:///qualified_lib.dart:9:7 -> ConstructorTearOffConstant(C.b)
Extra constant evaluation: evaluated: 7, effectively constant: 2
