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:9:10: Error: Conflicts with member 'topLevelMethodAndSetter'.
// void set topLevelMethodAndSetter(value) {}
//          ^
//
// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:6:10: Error: Conflicts with member 'topLevelMethodAndSetter'.
// void set topLevelMethodAndSetter(value) {}
//          ^
//
// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:5:1: Error: Conflicts with setter 'topLevelMethodAndSetter'.
// topLevelMethodAndSetter() {}
// ^
//
// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:13:10: Error: Conflicts with member 'classAndSetter'.
// void set classAndSetter(value) {}
//          ^
//
// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:11:7: Error: Conflicts with setter 'classAndSetter'.
// class classAndSetter {}
//       ^
//
// 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'.\"}"
}
