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

class Foo extends core::Object {
  synthetic constructor •() → self::Foo
    : super core::Object::•()
    ;
  method instanceMethod() → dynamic {
    return 123;
  }
}
abstract class ExternalValue extends core::Object {
  synthetic constructor •() → self::ExternalValue
    : super core::Object::•()
    ;
}
abstract class Bar extends core::Object {
  synthetic constructor •() → self::Bar
    : super core::Object::•()
    ;
  abstract method externalInstanceMethod() → self::ExternalValue;
}
class Box extends core::Object {
  field dynamic field = null;
  synthetic constructor •() → self::Box
    : super core::Object::•()
    ;
}
class FinalBox extends core::Object {
  final field dynamic finalField;
  constructor •(initializing-formal dynamic finalField) → self::FinalBox
    : self::FinalBox::finalField = finalField, super core::Object::•()
    ;
}
class SubFinalBox extends self::FinalBox {
  constructor •(dynamic value) → self::SubFinalBox
    : super self::FinalBox::•(value)
    ;
}
class DynamicReceiver1 extends core::Object {
  synthetic constructor •() → self::DynamicReceiver1
    : super core::Object::•()
    ;
  method dynamicallyCalled(dynamic x) → dynamic {}
}
class DynamicReceiver2 extends core::Object {
  synthetic constructor •() → self::DynamicReceiver2
    : super core::Object::•()
    ;
  method dynamicallyCalled(dynamic x) → dynamic {}
}
static method staticMethod() → dynamic {
  return "sdfg";
}
external static method externalStatic() → core::bool;
external static method createBar() → self::Bar;
static method stringArgument(dynamic x) → dynamic {}
static method intArgument(dynamic x) → dynamic {}
static method makeDynamicCall(dynamic receiver) → void {
  receiver{dynamic}.dynamicallyCalled("sdfg");
}
static method main() → dynamic {
  dynamic x = self::staticMethod();
  dynamic y = new self::Foo::•().{self::Foo::instanceMethod}(){() → dynamic};
  core::bool z = self::externalStatic();
  self::ExternalValue w = self::createBar().{self::Bar::externalInstanceMethod}(){() → self::ExternalValue};
  self::stringArgument("sdfg");
  self::intArgument(42);
  self::Box box = new self::Box::•();
  box.{self::Box::field} = "sdfg";
  dynamic a = box.{self::Box::field}{dynamic};
  self::FinalBox finalBox = new self::FinalBox::•("dfg");
  dynamic b = finalBox.{self::FinalBox::finalField}{dynamic};
  self::SubFinalBox subBox = new self::SubFinalBox::•("dfg");
  dynamic c = subBox.{self::FinalBox::finalField}{dynamic};
  self::makeDynamicCall(new self::DynamicReceiver1::•());
  self::makeDynamicCall(new self::DynamicReceiver2::•());
  core::List<core::String> list = <core::String>["string"];
  core::String d = list.{core::List::[]}(0){(core::int) → core::String};
}
