library /*isNonNullableByDefault*/;
//
// 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;
  tearoff runtimeType = self::Extension|get#runtimeType;
  operator == = self::Extension|==;
  static method toString = self::Extension|toString;
  set hashCode = self::Extension|set#hashCode;
}
static method Extension|get#noSuchMethod(lowered final core::String #this) → core::int
  return 42;
static method Extension|set#hashCode(lowered final core::String #this, core::int value) → void {}
static method Extension|runtimeType(lowered final core::String #this) → core::int
  return 0;
static method Extension|get#runtimeType(lowered final core::String #this) → () → core::int
  return () → core::int => self::Extension|runtimeType(#this);
static method Extension|==(lowered final core::String #this, dynamic other) → dynamic
  return false;
static method Extension|toString() → core::String
  return "Foo";
static method main() → dynamic {
  core::int value;
  self::expect(true, "".{core::Object::noSuchMethod}{(core::Invocation) → dynamic} is{ForNonNullableByDefault} core::Function);
  value = self::Extension|get#noSuchMethod("");
  self::Extension|set#hashCode("", 42);
  self::expect(true, "".{core::Object::runtimeType}{core::Type} is{ForNonNullableByDefault} core::Type);
  self::expect(true, self::Extension|get#runtimeType("") is{ForNonNullableByDefault} 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,ForNonNullableByDefault} 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,ForNonNullableByDefault} 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}";
  }
}


Extra constant evaluation status:
Evaluated: EqualsCall @ org-dartlang-testcase:///conflict_with_object.dart:21:19 -> BoolConstant(true)
Extra constant evaluation: evaluated: 31, effectively constant: 1
