// 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:11:19: Error: Type 'lib.Missing' not found.
// class Bad extends lib.Missing {
//                   ^

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 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 dynamic #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::•().supertypeMethod();
  new self::WithMixin::•().foo();
}
