de984e58cb
Implements static semantics for redirecting factories (c.f. §10.6.2 of
the specification). This CL does not include inference of actual type
arguments on redirectees, that is it does not handle the case where
type arguments have been omitted on the redirectee as in this
following example program:
class A<T> {
factory A() = B;
}
class B<T> implements A<T> {
B();
}
Closes https://github.com/dart-lang/sdk/issues/32988.
Also resolves the second part of
https://github.com/dart-lang/sdk/issues/30579.
Can possibly also close https://github.com/dart-lang/sdk/issues/11578.
Change-Id: I5f1fb60510ba6cdc917321239819c1f817b5b85d
Reviewed-on: https://dart-review.googlesource.com/74580
Commit-Queue: Daniel Hillerström <hillerstrom@google.com>
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
56 lines
1.2 KiB
Dart
56 lines
1.2 KiB
Dart
// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
import "package:expect/expect.dart";
|
|
|
|
class A {
|
|
const A();
|
|
const factory A.B() = B;
|
|
const factory A.C() = C;
|
|
const factory A.C2() = D;
|
|
}
|
|
|
|
class B implements A {
|
|
const B();
|
|
|
|
operator ==(o) => true; // //# 00: compile-time error
|
|
}
|
|
|
|
class C implements D {
|
|
final int x;
|
|
const C() : x = 0;
|
|
const C.fromD() : x = 1;
|
|
}
|
|
|
|
class D implements A {
|
|
int get x => 0;
|
|
const factory D() = C.fromD;
|
|
}
|
|
|
|
main() {
|
|
switch (new B()) {
|
|
case const A.B(): Expect.fail("bad switch"); break; // //# 00: continued
|
|
}
|
|
|
|
switch (new C()) {
|
|
case const C():
|
|
Expect.fail("bad switch");
|
|
break;
|
|
case const A.C():
|
|
Expect.fail("bad switch");
|
|
break;
|
|
case const A.C2():
|
|
Expect.fail("bad switch");
|
|
break;
|
|
case const A(): Expect.fail("bad switch"); break; // //# 01: compile-time error
|
|
}
|
|
|
|
switch (new A()) {
|
|
case const A():
|
|
Expect.fail("bad switch");
|
|
break;
|
|
case const A.B(): Expect.fail("bad switch"); break; // //# 02: compile-time error
|
|
}
|
|
}
|