library;
//
// Problems in library:
//
// pkg/front_end/testcases/extensions/conflict_with_object.dart:6:11: Error: This extension member conflicts with Object member 'noSuchMethod'.
//   int get noSuchMethod => 42;
//           ^^^^^^^^^^^^
//
// pkg/front_end/testcases/extensions/conflict_with_object.dart:8:7: Error: This extension member conflicts with Object member 'runtimeType'.
//   int runtimeType() => 0;
//       ^^^^^^^^^^^
//
// pkg/front_end/testcases/extensions/conflict_with_object.dart:9:12: Error: This extension member conflicts with Object member '=='.
//   operator ==(other) => false;
//            ^^
//
// pkg/front_end/testcases/extensions/conflict_with_object.dart:10:17: Error: This extension member conflicts with Object member 'toString'.
//   static String toString() => 'Foo';
//                 ^^^^^^^^
//
// pkg/front_end/testcases/extensions/conflict_with_object.dart:7:12: Error: This extension member conflicts with Object member 'hashCode'.
//   void set hashCode(int value) {}
//            ^^^^^^^^
//
// pkg/front_end/testcases/extensions/conflict_with_object.dart:27:14: Error: A value of type 'dynamic Function(Invocation)' can't be assigned to a variable of type 'int'.
//  - 'Invocation' is from 'dart:core'.
//   value = "".noSuchMethod;
//              ^
//
// pkg/front_end/testcases/extensions/conflict_with_object.dart:28:6: Error: The setter 'hashCode' isn't defined for the class 'String'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named 'hashCode'.
//   "".hashCode = 42;
//      ^^^^^^^^
//
// pkg/front_end/testcases/extensions/conflict_with_object.dart:29:14: Error: A value of type 'Type' can't be assigned to a variable of type 'int'.
//  - 'Type' is from 'dart:core'.
//   value = "".runtimeType;
//              ^
//
import self as self;
import "dart:core" as core;

extension Extension on core::String {
  get noSuchMethod = self::Extension|get#noSuchMethod;
  method runtimeType = self::Extension|runtimeType;
  method tearoff runtimeType = self::Extension|get#runtimeType;
  operator == = self::Extension|==;
  static method toString = self::Extension|toString;
  set hashCode = self::Extension|set#hashCode;
}
static extension-member method Extension|get#noSuchMethod(lowered final core::String #this) → core::int
  return 42;
static extension-member method Extension|set#hashCode(lowered final core::String #this, core::int value) → void {}
static extension-member method Extension|runtimeType(lowered final core::String #this) → core::int
  return 0;
static extension-member method Extension|get#runtimeType(lowered final core::String #this) → () → core::int
  return () → core::int => self::Extension|runtimeType(#this);
static extension-member method Extension|==(lowered final core::String #this, dynamic other) → dynamic
  return false;
static extension-member method Extension|toString() → core::String
  return "Foo";
static method main() → dynamic {
  core::int value;
  self::expect(true, "".{core::Object::noSuchMethod}{(core::Invocation) → dynamic} is core::Function);
  value = self::Extension|get#noSuchMethod("");
  self::Extension|set#hashCode("", 42);
  self::expect(true, "".{core::Object::runtimeType}{core::Type} is core::Type);
  self::expect(true, self::Extension|get#runtimeType("") is core::Function);
  value = self::Extension|runtimeType("");
  self::expect(true, "" =={core::String::==}{(core::Object) → core::bool} "");
  self::expect("Foo", self::Extension|toString());
}
static method errors() → dynamic {
  core::int value;
  value = invalid-expression "pkg/front_end/testcases/extensions/conflict_with_object.dart:27:14: Error: A value of type 'dynamic Function(Invocation)' can't be assigned to a variable of type 'int'.
 - 'Invocation' is from 'dart:core'.
  value = \"\".noSuchMethod;
             ^" in "".{core::Object::noSuchMethod}{(core::Invocation) → dynamic} as{TypeError} core::int;
  invalid-expression "pkg/front_end/testcases/extensions/conflict_with_object.dart:28:6: Error: The setter 'hashCode' isn't defined for the class 'String'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'hashCode'.
  \"\".hashCode = 42;
     ^^^^^^^^" in "".{<unresolved>}hashCode = 42;
  value = invalid-expression "pkg/front_end/testcases/extensions/conflict_with_object.dart:29:14: Error: A value of type 'Type' can't be assigned to a variable of type 'int'.
 - 'Type' is from 'dart:core'.
  value = \"\".runtimeType;
             ^" in "".{core::Object::runtimeType}{core::Type} as{TypeError} core::int;
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
    throw "Mismatch: expected=${expected}, actual=${actual}";
  }
}
