library test.qualified.main;
//
// Problems in library:
//
// pkg/front_end/testcases/general/qualified.dart:15: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:13:7: Context: The name of the enclosing class is 'Bad'.
// class Bad extends lib.Missing {
//       ^^^
//
// pkg/front_end/testcases/general/qualified.dart:13:19: Error: Type 'lib.Missing' not found.
// class Bad extends lib.Missing {
//                   ^^^^^^^^^^^
//
// pkg/front_end/testcases/general/qualified.dart:14:3: Error: Type 'lib.Missing' not found.
//   lib.Missing method() {}
//   ^^^^^^^^^^^
//
// pkg/front_end/testcases/general/qualified.dart:20: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
    return throw "";
}
class WithMixin extends self::_WithMixin&Supertype&Mixin {
  synthetic constructor •() → self::WithMixin
    : super self::_WithMixin&Supertype&Mixin::•()
    ;
}
class IllegalSupertype extends core::Object {
  synthetic constructor •() → self::IllegalSupertype
    : super core::Object::•()
    ;
}
class C<T extends core::Object? = dynamic> extends core::Object { // from org-dartlang-testcase:///qualified_part.dart
  constructor •() → self::C<self::C::T%>
    : super core::Object::•()
    ;
  constructor a() → self::C<self::C::T%>
    : super core::Object::•()
    ;
  static factory b<T extends core::Object? = dynamic>() → self::C<self::C::b::T%> /* redirection-target: lib::C::b<self::C::b::T%>*/
    return lib::C::b<self::C::b::T%>();
}
abstract class _WithMixin&Supertype&Mixin = lib::Supertype with lib::Mixin /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_WithMixin&Supertype&Mixin
    : super lib::Supertype::•()
    ;
  synthetic mixin-super-stub method foo() → dynamic
    return super.{lib::Mixin::foo}();
}
static method main() → dynamic {
  new self::C::•<core::String>();
  new self::C::a<core::String>();
  new lib::C::a<core::String>();
  new lib::C::•<core::String>();
  new lib::C::a<core::String>();
  new lib::C::a<core::String>();
  new self::WithMixin::•().{lib::Supertype::supertypeMethod}(){() → dynamic};
  new self::WithMixin::•().{self::_WithMixin&Supertype&Mixin::foo}(){() → dynamic};
  new self::IllegalSupertype::•();
}

library test.qualified.lib;
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%> {
  constructor •() → lib::C<lib::C::T%>
    : super self::C::•()
    ;
  constructor a() → lib::C<lib::C::T%>
    : super self::C::•()
    ;
  static factory b<T extends core::Object? = dynamic>() → lib::C<lib::C::b::T%> /* redirection-target: lib::C::a<lib::C::b::T%>*/
    return new lib::C::a<lib::C::b::T%>();
}
class Supertype extends core::Object {
  synthetic constructor •() → lib::Supertype
    : super core::Object::•()
    ;
  method supertypeMethod() → dynamic {
    core::print("I'm supertypeMethod form lib.Supertype");
  }
}
abstract class Mixin extends core::Object /*isMixinDeclaration*/  {
  method foo() → dynamic {
    core::print("I'm Mixin.foo");
  }
}
