blob: eccf53f2bbe80f31b102602e3e81dadf4e7fa27f [file] [log] [blame]
// Copyright (c) 2019, 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.
/**
* @assertion We define inherited(J, K) to be
* the set of members m such that all of the following hold:
* • m is accessible to K and
* • A is a direct superinterface of J and either
* – A declares a member m or
* – m is a member of inherited(A, K).
* • m is not overridden by J.
* ...
* Otherwise, if the static types T1,...,Tk of the members m1,...,mk are not
* identical, then there must be a member mx such that Tx <: Ti, 1 ≤ x ≤ k for
* all i ∈ 1..k, or a static type warning occurs. The member that is inherited
* is mx, if it exists; otherwise: let numberOf P ositionals(f) denote the
* number of positional parameters of a function f, and let numberOf
* RequiredParams(f) denote the number of required parameters of a function f.
* Furthermore, let s denote the set of all named parameters of the m1,...,mk.
* Then let
* h = max(numberOf Positionals(mi)),
* r = min(numberOf RequiredParams(mi)), i ∈ 1..k.
* Then I has a method named n, with r required parameters of type dynamic,
* h positional parameters of type dynamic, named parameters s of type dynamic
* and return type dynamic.
* @description Checks that there's no static warning produced when the
* subinterface member being accessed is actually inherited. Members tested
* include variables, methods, getters, setters and operators. There's no way
* to check whether the resulting inherited method signature is actually as
* described above, but we can check that it's inherited at all. Test type
* aliases
* @static-clean
* @author sgrekhov@unipro.ru
*/
// SharedOptions=--enable-experiment=nonfunction-type-aliases
import '../../../../Utils/expect.dart';
class C {}
class D extends C {}
abstract class SI1 {
int method(num? v, String? p, {int? o1, Pattern? o2});
int method2(C? v, [D? o]);
int? get gett0r;
void set sett0r(int? v);
C operator +(C v);
}
abstract class SI2 {
void method(num? v, String? p, {int? o1, Pattern? o2});
num method2(C? v, [D? o]);
num? get gett0r;
void set sett0r(num? v);
C operator +(C v);
}
typedef SIAlias1 = SI1;
typedef SIAlias2 = SI2;
abstract class I implements SIAlias1, SIAlias2, C {}
main() {
I? i = null;
i?.method(null, null, o1:null, o2:null);
var v = i?.method2(null, null);
num? n = i?.gett0r;
i?.sett0r = null;
Expect.throws(() {var v = (i as I) + (i as I);});
}