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

class Foo extends core::Object {
  constructor •() → void
    : super core::Object::•()
    ;
  method instanceMethod() → dynamic {
    return 123;
  }
}
abstract class ExternalValue extends core::Object {
}
abstract class Bar extends core::Object {
  abstract method externalInstanceMethod() → self::ExternalValue;
}
class Box extends core::Object {
  field dynamic field = null;
  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 {
  constructor •() → void
    : super core::Object::•()
    ;
  method dynamicallyCalled(dynamic x) → dynamic {}
}
class DynamicReceiver2 extends core::Object {
  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::•().{self::Foo::instanceMethod}();
  core::bool z = self::externalStatic();
  self::ExternalValue w = self::createBar().{self::Bar::externalInstanceMethod}();
  self::stringArgument("sdfg");
  self::intArgument(42);
  self::Box box = new self::Box::•();
  box.{self::Box::field} = "sdfg";
  dynamic a = box.{self::Box::field};
  self::FinalBox finalBox = new self::FinalBox::•("dfg");
  dynamic b = finalBox.{self::FinalBox::finalField};
  self::SubFinalBox subBox = new self::SubFinalBox::•("dfg");
  dynamic c = subBox.{self::FinalBox::finalField};
  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);
}
