library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:9:10: Error: 'topLevelMethodAndSetter' is already declared in this scope.
// void set topLevelMethodAndSetter(value) {}
//          ^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:6:10: Context: Previous declaration of 'topLevelMethodAndSetter'.
// void set topLevelMethodAndSetter(value) {}
//          ^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:29:12: Error: A class member can't have the same name as the enclosing class.
// Try renaming the member.
//   void set Class(value) {}
//            ^^^^^
//
// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart: Error: 'topLevelMethodAndSetter' is exported from both 'pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart' and 'pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart'.
//
// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:20:19: Error: Conflicts with member 'staticMethodAndSetter'.
//   static void set staticMethodAndSetter(value) {}
//                   ^
//
// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:19:10: Error: Conflicts with setter 'staticMethodAndSetter'.
//   static staticMethodAndSetter() {}
//          ^
//
// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:34:12: Error: Conflicts with member 'extensionInstanceMethodAndSetter'.
//   void set extensionInstanceMethodAndSetter(value) {}
//            ^
//
// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:33:3: Error: Conflicts with setter 'extensionInstanceMethodAndSetter'.
//   extensionInstanceMethodAndSetter() {}
//   ^
//
// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:37:19: Error: Conflicts with member 'extensionStaticMethodAndSetter'.
//   static void set extensionStaticMethodAndSetter(value) {}
//                   ^
//
// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:36:10: Error: Conflicts with setter 'extensionStaticMethodAndSetter'.
//   static extensionStaticMethodAndSetter() {}
//          ^
//
// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:40:19: Error: Conflicts with member 'extensionInstanceMethodAndStaticSetter'.
//   static void set extensionInstanceMethodAndStaticSetter(value) {}
//                   ^
//
// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:39:3: Error: Conflicts with setter 'extensionInstanceMethodAndStaticSetter'.
//   extensionInstanceMethodAndStaticSetter() {}
//   ^
//
// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:43:12: Error: Conflicts with member 'extensionStaticMethodAndInstanceSetter'.
//   void set extensionStaticMethodAndInstanceSetter(value) {}
//            ^
//
// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:42:10: Error: Conflicts with setter 'extensionStaticMethodAndInstanceSetter'.
//   static extensionStaticMethodAndInstanceSetter() {}
//          ^
//
// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:17:12: Error: 'instanceMethodAndSetter' is already declared in this scope.
//   void set instanceMethodAndSetter(value) {}
//            ^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:16:3: Context: Previous declaration of 'instanceMethodAndSetter'.
//   instanceMethodAndSetter() {}
//   ^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:20:19: Error: 'staticMethodAndSetter' is already declared in this scope.
//   static void set staticMethodAndSetter(value) {}
//                   ^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:19:10: Context: Previous declaration of 'staticMethodAndSetter'.
//   static staticMethodAndSetter() {}
//          ^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:23:19: Error: This static member conflicts with an instance member.
//   static void set instanceMethodAndStaticSetter(value) {}
//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:22:3: Context: This is the instance member.
//   instanceMethodAndStaticSetter() {}
//   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:25:10: Error: This static member conflicts with an instance member.
//   static staticMethodAndInstanceSetter() {}
//          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:26:12: Context: This is the instance member.
//   void set staticMethodAndInstanceSetter(value) {}
//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:47:3: Error: Setter not found: 'topLevelMethodAndSetter'.
//   topLevelMethodAndSetter = topLevelMethodAndSetter();
//   ^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:48:22: Error: Method not found: 'typedefAndSetter'.
//   typedefAndSetter = typedefAndSetter();
//                      ^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:48:3: Error: Can't assign to a type literal.
//   typedefAndSetter = typedefAndSetter();
//   ^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:49:3: Error: Can't assign to a type literal.
//   classAndSetter = classAndSetter();
//   ^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:55:9: Error: Setter not found: 'staticMethodAndSetter'.
//   Class.staticMethodAndSetter = Class.staticMethodAndSetter();
//         ^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:65:13: Error: Setter not found: 'extensionStaticMethodAndSetter'.
//   Extension.extensionStaticMethodAndSetter =
//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:61:15: Error: The getter 'Class' isn't defined for the class 'Class'.
//  - 'Class' is from 'pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named 'Class'.
//   c.Class = c.Class;
//               ^^^^^
//
// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:63:5: Error: The setter 'extensionInstanceFieldAndSetter' isn't defined for the class 'int'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named 'extensionInstanceFieldAndSetter'.
//   0.extensionInstanceFieldAndSetter = 0.extensionInstanceMethodAndSetter();
//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
import self as self;
import "dart:core" as core;

typedef typedefAndSetter = () → dynamic;
class classAndSetter extends core::Object {
  synthetic constructor •() → self::classAndSetter
    : super core::Object::•()
    ;
}
class Class extends core::Object {
  constructor •() → self::Class
    : super core::Object::•() {}
  method instanceMethodAndSetter() → dynamic {}
  set instanceMethodAndSetter(dynamic value) → void {}
  static method staticMethodAndSetter() → dynamic {}
  static set staticMethodAndSetter(dynamic value) → void {}
  method instanceMethodAndStaticSetter() → dynamic {}
  static set instanceMethodAndStaticSetter(dynamic value) → void {}
  static method staticMethodAndInstanceSetter() → dynamic {}
  set staticMethodAndInstanceSetter(dynamic value) → void {}
  set Class(dynamic value) → void {}
}
extension Extension on core::int? {
  method extensionInstanceMethodAndSetter = self::Extension|extensionInstanceMethodAndSetter;
  tearoff extensionInstanceMethodAndSetter = self::Extension|get#extensionInstanceMethodAndSetter;
  static method extensionStaticMethodAndSetter = self::Extension|extensionStaticMethodAndSetter;
  method extensionInstanceMethodAndStaticSetter = self::Extension|extensionInstanceMethodAndStaticSetter;
  tearoff extensionInstanceMethodAndStaticSetter = self::Extension|get#extensionInstanceMethodAndStaticSetter;
  static method extensionStaticMethodAndInstanceSetter = self::Extension|extensionStaticMethodAndInstanceSetter;
  set extensionInstanceMethodAndSetter = self::Extension|set#extensionInstanceMethodAndSetter;
  static set extensionStaticMethodAndSetter = set self::Extension|extensionStaticMethodAndSetter;
  static set extensionInstanceMethodAndStaticSetter = set self::Extension|extensionInstanceMethodAndStaticSetter;
  set extensionStaticMethodAndInstanceSetter = self::Extension|set#extensionStaticMethodAndInstanceSetter;
}
static const field dynamic _exports# = #C1 /*isLegacy, from null */;
static method topLevelMethodAndSetter() → dynamic {}
static set topLevelMethodAndSetter(dynamic value) → void {}
static set classAndSetter(dynamic value) → void {}
static method Extension|extensionInstanceMethodAndSetter(lowered final core::int? #this) → dynamic {}
static method Extension|get#extensionInstanceMethodAndSetter(lowered final core::int? #this) → () → dynamic
  return () → dynamic => self::Extension|extensionInstanceMethodAndSetter(#this);
static method Extension|set#extensionInstanceMethodAndSetter(lowered final core::int? #this, dynamic value) → void {}
static method Extension|extensionStaticMethodAndSetter() → dynamic {}
static set Extension|extensionStaticMethodAndSetter(dynamic value) → void {}
static method Extension|extensionInstanceMethodAndStaticSetter(lowered final core::int? #this) → dynamic {}
static method Extension|get#extensionInstanceMethodAndStaticSetter(lowered final core::int? #this) → () → dynamic
  return () → dynamic => self::Extension|extensionInstanceMethodAndStaticSetter(#this);
static set Extension|extensionInstanceMethodAndStaticSetter(dynamic value) → void {}
static method Extension|extensionStaticMethodAndInstanceSetter() → dynamic {}
static method Extension|set#extensionStaticMethodAndInstanceSetter(lowered final core::int? #this, dynamic value) → void {}
static method test() → dynamic {
  invalid-expression "pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:47:3: Error: Setter not found: 'topLevelMethodAndSetter'.
  topLevelMethodAndSetter = topLevelMethodAndSetter();
  ^^^^^^^^^^^^^^^^^^^^^^^";
  invalid-expression "pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:48:3: Error: Can't assign to a type literal.
  typedefAndSetter = typedefAndSetter();
  ^^^^^^^^^^^^^^^^";
  invalid-expression "pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:49:3: Error: Can't assign to a type literal.
  classAndSetter = classAndSetter();
  ^^^^^^^^^^^^^^";
  self::Class c = new self::Class::•();
  c.{self::Class::instanceMethodAndSetter} = c.{self::Class::instanceMethodAndSetter}();
  invalid-expression "pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:55:9: Error: Setter not found: 'staticMethodAndSetter'.
  Class.staticMethodAndSetter = Class.staticMethodAndSetter();
        ^^^^^^^^^^^^^^^^^^^^^";
  c.{self::Class::staticMethodAndInstanceSetter} = self::Class::staticMethodAndInstanceSetter();
  self::Class::instanceMethodAndStaticSetter = c.{self::Class::instanceMethodAndStaticSetter}();
  c.{self::Class::Class} = invalid-expression "pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:61:15: Error: The getter 'Class' isn't defined for the class 'Class'.
 - 'Class' is from 'pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'Class'.
  c.Class = c.Class;
              ^^^^^";
  invalid-expression "pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:63:5: Error: The setter 'extensionInstanceFieldAndSetter' isn't defined for the class 'int'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'extensionInstanceFieldAndSetter'.
  0.extensionInstanceFieldAndSetter = 0.extensionInstanceMethodAndSetter();
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^";
  invalid-expression "pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:65:13: Error: Setter not found: 'extensionStaticMethodAndSetter'.
  Extension.extensionStaticMethodAndSetter =
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^";
  self::Extension|set#extensionStaticMethodAndInstanceSetter(0, self::Extension|extensionStaticMethodAndInstanceSetter());
  self::Extension|extensionInstanceMethodAndStaticSetter = self::Extension|extensionInstanceMethodAndStaticSetter(0);
}
static method main() → dynamic {}

constants  {
  #C1 = "{\"topLevelMethodAndSetter\":\"'topLevelMethodAndSetter' is exported from both 'pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart' and 'pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart'.\"}"
}
