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.usedInSubclass();
}
static method interfaceCall(self::UsedAsInterface object) → void {
  object.usedInSubclass();
}
static method exactCallA(self::ClassA object) → void {
  object.usedInSubclass();
}
static method exactCallB(self::ClassB object) → void {
  object.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::•();
}
