// Errors:
//
// 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: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 {}
//       ^

library test.qualified.main;
import self as self;
import "dart:core" as core;
import "./qualified_lib.dart" as lib;

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 •() → void
    : 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 •() → void
    : super lib::Supertype::•()
    ;
}
class IllegalSupertype extends core::Object {
  synthetic constructor •() → void
    : 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 •() → void
    : super core::Object::•()
    ;
  constructor a() → void
    : 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::•();
}
