library;
//
// Problems in library:
//
// pkg/front_end/testcases/extensions/instance_access_of_static.dart:26:5: Error: The method 'staticMethod' isn't defined for the class 'Class1'.
//  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
// Try correcting the name to the name of an existing method, or defining a method named 'staticMethod'.
//   c.staticMethod();
//     ^^^^^^^^^^^^
//
// pkg/front_end/testcases/extensions/instance_access_of_static.dart:27:5: Error: The getter 'staticMethod' isn't defined for the class 'Class1'.
//  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named 'staticMethod'.
//   c.staticMethod;
//     ^^^^^^^^^^^^
//
// pkg/front_end/testcases/extensions/instance_access_of_static.dart:28:5: Error: The getter 'staticProperty' isn't defined for the class 'Class1'.
//  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named 'staticProperty'.
//   c.staticProperty;
//     ^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/extensions/instance_access_of_static.dart:29:5: Error: The setter 'staticProperty' isn't defined for the class 'Class1'.
//  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named 'staticProperty'.
//   c.staticProperty = 42;
//     ^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/extensions/instance_access_of_static.dart:30:5: Error: The getter 'staticField' isn't defined for the class 'Class1'.
//  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named 'staticField'.
//   c.staticField;
//     ^^^^^^^^^^^
//
// pkg/front_end/testcases/extensions/instance_access_of_static.dart:31:5: Error: The setter 'staticField' isn't defined for the class 'Class1'.
//  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named 'staticField'.
//   c.staticField = 42;
//     ^^^^^^^^^^^
//
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*;
}
extension Extension1 on self::Class1* {
  static method staticMethod = self::Extension1|staticMethod;
  static get staticProperty = get self::Extension1|staticProperty;
  static field staticField = self::Extension1|staticField;
  static set staticProperty = set self::Extension1|staticProperty;
}
static field core::int* Extension1|staticField = 42;
static method Extension1|staticMethod() → dynamic {
  core::print("Extension1.staticMethod()");
}
static get Extension1|staticProperty() → dynamic {
  core::print("Extension1.staticProperty()");
}
static set Extension1|staticProperty(core::int* value) → void {
  core::print("Extension1.staticProperty(${value})");
  value = value.{core::num::+}(1);
}
static method main() → dynamic {
  self::Class1* c = new self::Class1::•();
  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:26:5: Error: The method 'staticMethod' isn't defined for the class 'Class1'.
 - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
Try correcting the name to the name of an existing method, or defining a method named 'staticMethod'.
  c.staticMethod();
    ^^^^^^^^^^^^";
  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:27:5: Error: The getter 'staticMethod' isn't defined for the class 'Class1'.
 - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'staticMethod'.
  c.staticMethod;
    ^^^^^^^^^^^^";
  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:28:5: Error: The getter 'staticProperty' isn't defined for the class 'Class1'.
 - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'staticProperty'.
  c.staticProperty;
    ^^^^^^^^^^^^^^";
  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:29:5: Error: The setter 'staticProperty' isn't defined for the class 'Class1'.
 - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'staticProperty'.
  c.staticProperty = 42;
    ^^^^^^^^^^^^^^";
  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:30:5: Error: The getter 'staticField' isn't defined for the class 'Class1'.
 - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'staticField'.
  c.staticField;
    ^^^^^^^^^^^";
  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:31:5: Error: The setter 'staticField' isn't defined for the class 'Class1'.
 - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'staticField'.
  c.staticField = 42;
    ^^^^^^^^^^^";
}
