mirror of
https://github.com/dart-lang/sdk
synced 2024-09-16 03:07:49 +00:00
ebb3dea075
R=ahe@google.com, paulberry@google.com, sigmund@google.com BUG= Review-Url: https://codereview.chromium.org/2981783002 .
68 lines
2.1 KiB
Plaintext
68 lines
2.1 KiB
Plaintext
library;
|
|
import self as self;
|
|
import "dart:core" as core;
|
|
|
|
abstract class UsedAsBaseClass extends core::Object {
|
|
default constructor •() → void
|
|
: super core::Object::•()
|
|
;
|
|
abstract method usedInSubclass() → void;
|
|
method calledFromB() → void {
|
|
this.{self::UsedAsBaseClass::calledFromSubclass}();
|
|
}
|
|
abstract method calledFromSubclass() → void;
|
|
}
|
|
abstract class UsedAsInterface extends core::Object {
|
|
abstract method usedInSubclass() → void;
|
|
}
|
|
class InstantiatedButMethodsUnused extends core::Object {
|
|
default constructor •() → void
|
|
: super core::Object::•()
|
|
;
|
|
method usedInSubclass() → void
|
|
throw "Method removed by tree-shaking";
|
|
}
|
|
class ClassA extends self::UsedAsBaseClass implements self::UsedAsInterface, self::InstantiatedButMethodsUnused {
|
|
default constructor •() → void
|
|
: super self::UsedAsBaseClass::•()
|
|
;
|
|
method usedInSubclass() → void {
|
|
core::print("A");
|
|
}
|
|
}
|
|
class ClassB extends self::UsedAsBaseClass implements self::UsedAsInterface, self::InstantiatedButMethodsUnused {
|
|
default constructor •() → void
|
|
: 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 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::•();
|
|
}
|