// #lib1::InvalidListener is not a subtype of #lib1::Listener (optional.dart:42:20)
// Too few positional arguments (optional.dart:44:21)
// Too many positional arguments (optional.dart:45:21)
// Too few positional arguments (optional.dart:46:24)
// Too many positional arguments (optional.dart:47:24)
library;
import self as self;
import "dart:core" as core;

class Foo extends core::Object {
  constructor •() → void
    : super core::Object::•()
    ;
  method method(dynamic x, [dynamic y, dynamic z]) → dynamic {
    return "string";
  }
}
abstract class External extends core::Object {
  constructor •() → void
    : super core::Object::•()
    ;
  abstract method externalMethod(core::int x, [core::int y, core::int z]) → core::String;
  abstract method listen(self::Listener listener) → void;
}
abstract class Listener extends core::Object {
  constructor •() → void
    : super core::Object::•()
    ;
  abstract method event(core::String input, [core::int x, core::int y]) → void;
}
class TestListener extends self::Listener {
  constructor •() → void
    : super self::Listener::•()
    ;
  method event(core::String input, [core::int x, core::int y]) → void {}
}
class ExtendedListener extends self::Listener {
  constructor •() → void
    : super self::Listener::•()
    ;
  method event(core::String input, [core::int x, core::int y, dynamic z]) → void {}
}
class InvalidListener extends core::Object {
  constructor •() → void
    : super core::Object::•()
    ;
  method event(dynamic input, [dynamic x]) → void {}
}
external static 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}(new self::InvalidListener::•());
  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);
}
