library test.qualified.main;
//
// Problems in library:
//
// pkg/front_end/testcases/qualified.dart:13:11: Error: The name of a constructor must match the name of the enclosing class.
//   factory WrongName() {}
//           ^^^^^^^^^
// pkg/front_end/testcases/qualified.dart:11:7: Context: The name of the enclosing class is 'Bad'.
// class Bad extends lib.Missing {
//       ^^^
//
// pkg/front_end/testcases/qualified.dart:12:3: Error: Type 'lib.Missing' not found.
//   lib.Missing method() {}
//   ^^^^^^^^^^^
//
// pkg/front_end/testcases/qualified.dart:11:19: Error: Type 'lib.Missing' not found.
// class Bad extends lib.Missing {
//                   ^^^^^^^^^^^
//
// pkg/front_end/testcases/qualified.dart:18:7: Error: The type 'lib.VoidFunction' can't be used as supertype.
// class IllegalSupertype extends lib.VoidFunction {}
//       ^
//
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 extends lib::Supertype implements lib::Mixin {
  synthetic constructor •() → self::_WithMixin&Supertype&Mixin
    : super lib::Supertype::•()
    ;
  method /* from org-dartlang-testcase:///qualified_lib.dart */ foo() → dynamic {
    core::print("I'm Mixin.foo");
  }
}
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
  static field dynamic _redirecting# = <dynamic>[self::C::b];
  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>
    let <T extends core::Object = dynamic>() → lib::C<lib::C::b::T> #redirecting_factory = lib::C::b in let self::C::b::T #typeArg0 = null in invalid-expression;
}
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}();
  new self::WithMixin::•().{lib::Mixin::foo}();
  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> {
  static field dynamic _redirecting# = <dynamic>[lib::C::b];
  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>
    let<BottomType> #redirecting_factory = lib::C::a in let lib::C::b::T #typeArg0 = null in invalid-expression;
}
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 {
  synthetic constructor •() → lib::Mixin
    : super core::Object::•()
    ;
  method foo() → dynamic {
    core::print("I'm Mixin.foo");
  }
}
