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: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: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: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 type '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;
  set hashCode = self::Extension|set#hashCode;
  method runtimeType = self::Extension|runtimeType;
  method tearoff runtimeType = self::Extension|get#runtimeType;
  operator == = self::Extension|==;
  static method toString = self::Extension|toString;
}
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 type '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}";
  }
}
