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

class Foo extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  method instanceMethod() → dynamic {
    return 123;
  }
}
abstract class ExternalValue extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
}
abstract class Bar extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  abstract method externalInstanceMethod() → self::ExternalValue;
}
class Box extends core::Object {
  field dynamic field = null;
  synthetic 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 {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  method dynamicallyCalled(dynamic x) → dynamic {}
}
class DynamicReceiver2 extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  method dynamicallyCalled(dynamic x) → dynamic {}
}
static method staticMethod() → dynamic {
  return "sdfg";
}
external static abstract method externalStatic() → core::bool;
external static abstract 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);
}
