// Formatted problems:
//
// pkg/front_end/testcases/optional.dart:47:21: Error: The argument type '#lib1::InvalidListener' can't be assigned to the parameter type '#lib1::Listener'.
// Try changing the type of the parameter, or casting the argument to '#lib1::Listener'.
//   extern.listen(new InvalidListener());
//                     ^
//
// pkg/front_end/testcases/optional.dart:49:28: Error: Too few positional arguments: 1 required, 0 given.
//   var nothing1 = foo.method();
//                            ^
//
// pkg/front_end/testcases/optional.dart:50:28: Error: Too many positional arguments: 3 allowed, but 4 found.
// Try removing the extra positional arguments.
//   var nothing2 = foo.method(1, 2, 3, 4);
//                            ^
//
// pkg/front_end/testcases/optional.dart:51:39: Error: Too few positional arguments: 1 required, 0 given.
//   var nothing3 = extern.externalMethod();
//                                       ^
//
// pkg/front_end/testcases/optional.dart:52:39: Error: Too many positional arguments: 3 allowed, but 4 found.
// Try removing the extra positional arguments.
//   var nothing4 = extern.externalMethod(1, 2, 3, 4);
//                                       ^

// Unhandled errors:
//
// pkg/front_end/testcases/optional.dart:49:28: Error: Too few positional arguments: 1 required, 0 given.
//   var nothing1 = foo.method();
//                            ^
//
// pkg/front_end/testcases/optional.dart:50:28: Error: Too many positional arguments: 3 allowed, but 4 found.
// Try removing the extra positional arguments.
//   var nothing2 = foo.method(1, 2, 3, 4);
//                            ^
//
// pkg/front_end/testcases/optional.dart:51:39: Error: Too few positional arguments: 1 required, 0 given.
//   var nothing3 = extern.externalMethod();
//                                       ^
//
// pkg/front_end/testcases/optional.dart:52:39: Error: Too many positional arguments: 3 allowed, but 4 found.
// Try removing the extra positional arguments.
//   var nothing4 = extern.externalMethod(1, 2, 3, 4);
//                                       ^

library;
import self as self;
import "dart:core" as core;

class Foo extends core::Object {
  synthetic constructor •() → self::Foo
    : super core::Object::•()
    ;
  method method(dynamic x, [dynamic y = null, dynamic z = null]) → dynamic {
    return "string";
  }
}
abstract class External extends core::Object {
  synthetic constructor •() → self::External
    : super core::Object::•()
    ;
  abstract method externalMethod(core::int x, [core::int y = null, core::int z = null]) → core::String;
  abstract method listen(self::Listener listener) → void;
}
abstract class Listener extends core::Object {
  synthetic constructor •() → self::Listener
    : super core::Object::•()
    ;
  abstract method event(core::String input, [core::int x = null, core::int y = null]) → void;
}
class TestListener extends self::Listener {
  synthetic constructor •() → self::TestListener
    : super self::Listener::•()
    ;
  method event(core::String input, [core::int x = null, core::int y = null]) → void {}
}
class ExtendedListener extends self::Listener {
  synthetic constructor •() → self::ExtendedListener
    : super self::Listener::•()
    ;
  method event(core::String input, [core::int x = null, core::int y = null, dynamic z = null]) → void {}
}
class InvalidListener extends core::Object {
  synthetic constructor •() → self::InvalidListener
    : super core::Object::•()
    ;
  method event(dynamic input, [dynamic x = null]) → void {}
}
external static abstract method createExternal() → self::External;
static method main() → dynamic {
  self::Foo foo = new self::Foo::•();
  dynamic string1 = foo.{self::Foo::method}(1);
  dynamic string2 = foo.{self::Foo::method}(1, 2);
  dynamic string3 = foo.{self::Foo::method}(1, 2, 3);
  self::External extern = self::createExternal();
  core::String string4 = extern.{self::External::externalMethod}(1);
  core::String string5 = extern.{self::External::externalMethod}(1, 2);
  core::String string6 = extern.{self::External::externalMethod}(1, 2, 3);
  extern.{self::External::listen}(new self::TestListener::•());
  extern.{self::External::listen}(new self::ExtendedListener::•());
  extern.{self::External::listen}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/optional.dart:47:21: Error: The argument type '#lib1::InvalidListener' can't be assigned to the parameter type '#lib1::Listener'.
Try changing the type of the parameter, or casting the argument to '#lib1::Listener'.
  extern.listen(new InvalidListener());
                    ^" in new self::InvalidListener::•() as{TypeError} self::Listener);
  dynamic nothing1 = foo.{self::Foo::method}();
  dynamic nothing2 = foo.{self::Foo::method}(1, 2, 3, 4);
  core::String nothing3 = extern.{self::External::externalMethod}();
  core::String nothing4 = extern.{self::External::externalMethod}(1, 2, 3, 4);
}
