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
  ;
