library;
//
// Problems in library:
//
// pkg/front_end/testcases/extension_types/representation.dart:5:23: Error: Expected a representation field.
// extension type Missing() {} // Error
//                       ^
//
// pkg/front_end/testcases/extension_types/representation.dart:7:24: Error: Each extension type should have exactly one representation field.
// extension type Multiple(bool instanceField1, int instanceField2) {}  // Error
//                        ^
//
// pkg/front_end/testcases/extension_types/representation.dart:9:50: Error: Duplicated parameter name 'instanceField'.
// extension type Duplicate(bool instanceField, int instanceField) {} // Error
//                                                  ^^^^^^^^^^^^^
// pkg/front_end/testcases/extension_types/representation.dart:9:31: Context: Other parameter named 'instanceField'.
// extension type Duplicate(bool instanceField, int instanceField) {} // Error
//                               ^^^^^^^^^^^^^
//
// pkg/front_end/testcases/extension_types/representation.dart:9:50: Error: 'instanceField' is already declared in this scope.
// extension type Duplicate(bool instanceField, int instanceField) {} // Error
//                                                  ^^^^^^^^^^^^^
// pkg/front_end/testcases/extension_types/representation.dart:9:31: Context: Previous declaration of 'instanceField'.
// extension type Duplicate(bool instanceField, int instanceField) {} // Error
//                               ^^^^^^^^^^^^^
//
// pkg/front_end/testcases/extension_types/representation.dart:9:25: Error: Each extension type should have exactly one representation field.
// extension type Duplicate(bool instanceField, int instanceField) {} // Error
//                         ^
//
import self as self;
import "dart:core" as core;

extension type Missing(invalid-type #) {
  constructor • = self::Missing|constructor#;
  constructor tearoff • = self::Missing|constructor#_#new#tearOff;
}
extension type Multiple(core::bool instanceField1) {
  abstract extension-type-member representation-field get instanceField1() → core::bool;
  abstract extension-type-member representation-field get instanceField2() → core::int;
  constructor • = self::Multiple|constructor#;
  constructor tearoff • = self::Multiple|constructor#_#new#tearOff;
}
extension type Duplicate(core::bool instanceField) {
  abstract extension-type-member representation-field get instanceField() → core::bool;
  constructor • = self::Duplicate|constructor#;
  constructor tearoff • = self::Duplicate|constructor#_#new#tearOff;
}
static extension-type-member method Missing|constructor#() → self::Missing% /* erasure=invalid-type, declared=! */
  ;
static extension-type-member method Missing|constructor#_#new#tearOff() → self::Missing% /* erasure=invalid-type, declared=! */
  return self::Missing|constructor#();
static extension-type-member method Multiple|constructor#(core::bool instanceField1, core::int instanceField2) → self::Multiple% /* erasure=core::bool, declared=! */
  ;
static extension-type-member method Multiple|constructor#_#new#tearOff(core::bool instanceField1, core::int instanceField2) → self::Multiple% /* erasure=core::bool, declared=! */
  return self::Multiple|constructor#(instanceField1, instanceField2);
static extension-type-member method Duplicate|constructor#(core::int instanceField, core::int instanceField) → self::Duplicate% /* erasure=core::bool, declared=! */
  ;
static extension-type-member method Duplicate|constructor#_#new#tearOff(core::int instanceField, core::int instanceField) → self::Duplicate% /* erasure=core::bool, declared=! */
  return self::Duplicate|constructor#(instanceField, instanceField);
