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

class UnusedClass extends core::Object {
  constructor •() → self::UnusedClass*
    : super core::Object::•() {
    core::print("Unused");
  }
}
abstract class UsedAsBaseClass extends core::Object {
  synthetic constructor •() → self::UsedAsBaseClass*
    : super core::Object::•()
    ;
  method usedInSubclass() → void {
    core::print("Unused");
  }
  method calledFromB() → void {
    this.{self::UsedAsBaseClass::calledFromSubclass}();
  }
  method calledFromSubclass() → void {
    core::print("Unused");
  }
}
class UsedAsInterface extends core::Object {
  synthetic constructor •() → self::UsedAsInterface*
    : super core::Object::•()
    ;
  method usedInSubclass() → void {
    core::print("Unused");
  }
}
class InstantiatedButMethodsUnused extends core::Object {
  synthetic constructor •() → self::InstantiatedButMethodsUnused*
    : super core::Object::•()
    ;
  method usedInSubclass() → void {
    core::print("Unused");
  }
}
class ClassA extends self::UsedAsBaseClass implements self::UsedAsInterface, self::InstantiatedButMethodsUnused {
  synthetic constructor •() → self::ClassA*
    : super self::UsedAsBaseClass::•()
    ;
  method usedInSubclass() → void {
    core::print("A");
  }
}
class ClassB extends self::UsedAsBaseClass implements self::UsedAsInterface, self::InstantiatedButMethodsUnused {
  synthetic constructor •() → self::ClassB*
    : super self::UsedAsBaseClass::•()
    ;
  method usedInSubclass() → void {
    core::print("B");
    this.{self::UsedAsBaseClass::calledFromB}();
  }
  method calledFromSubclass() → void {}
}
static method baseClassCall(self::UsedAsBaseClass* object) → void {
  object.{self::UsedAsBaseClass::usedInSubclass}();
}
static method interfaceCall(self::UsedAsInterface* object) → void {
  object.{self::UsedAsInterface::usedInSubclass}();
}
static method exactCallA(self::ClassA* object) → void {
  object.{self::ClassA::usedInSubclass}();
}
static method exactCallB(self::ClassB* object) → void {
  object.{self::ClassB::usedInSubclass}();
}
static method unusedTopLevel() → dynamic {
  core::print("Unused");
}
static method usedTopLevel() → dynamic {}
static method main() → dynamic {
  self::usedTopLevel();
  self::ClassA* a = new self::ClassA::•();
  self::exactCallA(a);
  self::baseClassCall(a);
  self::interfaceCall(a);
  self::ClassB* b = new self::ClassB::•();
  self::exactCallB(b);
  self::baseClassCall(b);
  self::interfaceCall(b);
  new self::InstantiatedButMethodsUnused::•();
}
