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

class UnusedClass extends core::Object {
  constructor •() → self::UnusedClass
    ;
}
abstract class UsedAsBaseClass extends core::Object {
  synthetic constructor •() → self::UsedAsBaseClass
    ;
  method usedInSubclass() → void
    ;
  method calledFromB() → void
    ;
  method calledFromSubclass() → void
    ;
}
class UsedAsInterface extends core::Object {
  synthetic constructor •() → self::UsedAsInterface
    ;
  method usedInSubclass() → void
    ;
}
class InstantiatedButMethodsUnused extends core::Object {
  synthetic constructor •() → self::InstantiatedButMethodsUnused
    ;
  method usedInSubclass() → void
    ;
}
class ClassA extends self::UsedAsBaseClass implements self::UsedAsInterface, self::InstantiatedButMethodsUnused {
  synthetic constructor •() → self::ClassA
    ;
  method usedInSubclass() → void
    ;
}
class ClassB extends self::UsedAsBaseClass implements self::UsedAsInterface, self::InstantiatedButMethodsUnused {
  synthetic constructor •() → self::ClassB
    ;
  method usedInSubclass() → void
    ;
  method calledFromSubclass() → void
    ;
}
static method baseClassCall(self::UsedAsBaseClass object) → void
  ;
static method interfaceCall(self::UsedAsInterface object) → void
  ;
static method exactCallA(self::ClassA object) → void
  ;
static method exactCallB(self::ClassB object) → void
  ;
static method unusedTopLevel() → dynamic
  ;
static method usedTopLevel() → dynamic
  ;
static method main() → dynamic
  ;
