library;
//
// Problems in library:
//
// pkg/front_end/testcases/extensions/conflicts.dart:14:11: Error: 'DuplicateExtensionName' is already declared in this scope.
// extension DuplicateExtensionName on Class2 {
//           ^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/extensions/conflicts.dart:9:11: Context: Previous declaration of 'DuplicateExtensionName'.
// extension DuplicateExtensionName on Class1 {
//           ^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/extensions/conflicts.dart:21:3: Error: 'duplicateMethodName1' is already declared in this scope.
//   duplicateMethodName1() => 2;
//   ^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/extensions/conflicts.dart:20:3: Context: Previous declaration of 'duplicateMethodName1'.
//   duplicateMethodName1() => 1;
//   ^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/extensions/conflicts.dart:31:6: Error: The method 'uniqueMethod2' isn't defined for the class 'Class2'.
//  - 'Class2' is from 'pkg/front_end/testcases/extensions/conflicts.dart'.
// Try correcting the name to the name of an existing method, or defining a method named 'uniqueMethod2'.
//   c2.uniqueMethod2();
//      ^^^^^^^^^^^^^
//
import self as self;
import "dart:core" as core;

class Class1 extends core::Object {
  synthetic constructor •() → self::Class1*
    : super core::Object::•()
    ;
  abstract member-signature get _identityHashCode() → core::int*;
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
  abstract member-signature operator ==(dynamic other) → core::bool*;
  abstract member-signature get hashCode() → core::int*;
  abstract member-signature method toString() → core::String*;
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
  abstract member-signature get runtimeType() → core::Type*;
}
class Class2 extends core::Object {
  synthetic constructor •() → self::Class2*
    : super core::Object::•()
    ;
  abstract member-signature get _identityHashCode() → core::int*;
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
  abstract member-signature operator ==(dynamic other) → core::bool*;
  abstract member-signature get hashCode() → core::int*;
  abstract member-signature method toString() → core::String*;
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
  abstract member-signature get runtimeType() → core::Type*;
}
extension DuplicateExtensionName on self::Class1* {
  method uniqueMethod1 = self::DuplicateExtensionName|uniqueMethod1;
  tearoff uniqueMethod1 = self::DuplicateExtensionName|get#uniqueMethod1;
  method duplicateMethodName2 = self::DuplicateExtensionName|duplicateMethodName2;
  tearoff duplicateMethodName2 = self::DuplicateExtensionName|get#duplicateMethodName2;
}
extension UniqueExtensionName on self::Class1* {
  method duplicateMethodName1 = self::UniqueExtensionName|duplicateMethodName1;
  tearoff duplicateMethodName1 = self::UniqueExtensionName|get#duplicateMethodName1;
}
static method DuplicateExtensionName|uniqueMethod1(final self::Class1* #this) → dynamic {}
static method DuplicateExtensionName|get#uniqueMethod1(final self::Class1* #this) → () →* dynamic
  return () → dynamic => self::DuplicateExtensionName|uniqueMethod1(#this);
static method DuplicateExtensionName|duplicateMethodName2(final self::Class1* #this) → dynamic
  return 1;
static method DuplicateExtensionName|get#duplicateMethodName2(final self::Class1* #this) → () →* dynamic
  return () → dynamic => self::DuplicateExtensionName|duplicateMethodName2(#this);
static method UniqueExtensionName|duplicateMethodName1(final self::Class1* #this) → dynamic
  return 1;
static method UniqueExtensionName|get#duplicateMethodName1(final self::Class1* #this) → () →* dynamic
  return () → dynamic => self::UniqueExtensionName|duplicateMethodName1(#this);
static method main() → dynamic {
  self::Class1* c1 = new self::Class1::•();
  self::DuplicateExtensionName|uniqueMethod1(c1);
}
static method errors() → dynamic {
  self::Class2* c2 = new self::Class2::•();
  invalid-expression "pkg/front_end/testcases/extensions/conflicts.dart:31:6: Error: The method 'uniqueMethod2' isn't defined for the class 'Class2'.
 - 'Class2' is from 'pkg/front_end/testcases/extensions/conflicts.dart'.
Try correcting the name to the name of an existing method, or defining a method named 'uniqueMethod2'.
  c2.uniqueMethod2();
     ^^^^^^^^^^^^^";
}
