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

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