library test.qualified.main;
//
// 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() {}
//           ^^^^^^^^^
// 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: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");
  }
}
