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