| Index: tests/compiler/dart2js/members_test.dart
|
| diff --git a/tests/compiler/dart2js/members_test.dart b/tests/compiler/dart2js/members_test.dart
|
| deleted file mode 100644
|
| index e00bc2f7dbfd50872b530d62028fafc31fa19216..0000000000000000000000000000000000000000
|
| --- a/tests/compiler/dart2js/members_test.dart
|
| +++ /dev/null
|
| @@ -1,681 +0,0 @@
|
| -// 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.
|
| -
|
| -library members_test;
|
| -
|
| -import 'package:expect/expect.dart';
|
| -import "package:async_helper/async_helper.dart";
|
| -import 'type_test_helper.dart';
|
| -import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
|
| -import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart"
|
| - show Element, ClassElement, MemberSignature, Name, PublicName;
|
| -import "../../../sdk/lib/_internal/compiler/implementation/resolution/class_members.dart"
|
| - show SyntheticMember, ErroneousMember;
|
| -
|
| -void main() {
|
| - testClassMembers();
|
| - testInterfaceMembers();
|
| - testClassVsInterfaceMembers();
|
| - testMixinMembers();
|
| -}
|
| -
|
| -MemberSignature getMember(InterfaceType cls, String name,
|
| - {bool isSetter: false,
|
| - int checkType: CHECK_INTERFACE}) {
|
| - Name memberName =
|
| - new Name(name, cls.element.getLibrary(), isSetter: isSetter);
|
| - MemberSignature member = checkType == CHECK_CLASS
|
| - ? cls.element.lookupClassMember(memberName)
|
| - : cls.element.lookupInterfaceMember(memberName);
|
| - if (member != null) {
|
| - Expect.equals(memberName, member.name);
|
| - }
|
| - return member;
|
| -}
|
| -
|
| -/// Check interface member only.
|
| -const int CHECK_INTERFACE = 0;
|
| -/// Check class member only.
|
| -const int CHECK_CLASS = 1;
|
| -/// Check that there is no class member for the interface member.
|
| -const int NO_CLASS_MEMBER = 2;
|
| -/// Check that the interface member is also a class member.
|
| -const int ALSO_CLASS_MEMBER = 3;
|
| -
|
| -/**
|
| - * Checks [member] or interface member [name] of the declaration of [cls].
|
| - *
|
| - * If [inheritFrom] is set, the member from [cls] must be identical to the
|
| - * member from [inheritedFrom].
|
| - *
|
| - * Otherwise, the properties of member are checked against the values of
|
| - * [isStatic], [isSetter], [isGetter], [declarer], [type] and
|
| - * [functionType].
|
| - *
|
| - * If [synthesizedFrom] or [erroneousFrom] is not `null`, the member is checked
|
| - * to be synthesized for the corresponding members found on the type is
|
| - * [synthesizedFrom] or or [erroneousFrom], respectively.
|
| - * Otherwise, if [declarer] is `null`, the declarer is checked to be [cls], and
|
| - * if [declarer] is not `null`, the declarer is checked to be [declarer].
|
| - * If [type] is `null` it is checked that the type of the member is also the
|
| - * member type, otherwise the type is checked to be [type].
|
| - *
|
| - * If [isClassMember] is `true` it is checked that the member is also a class
|
| - * member.
|
| - */
|
| -MemberSignature checkMember(InterfaceType cls,
|
| - String name,
|
| - {bool isStatic: false,
|
| - bool isSetter: false,
|
| - bool isGetter: false,
|
| - InterfaceType declarer,
|
| - DartType type,
|
| - FunctionType functionType,
|
| - InterfaceType inheritedFrom,
|
| - List<InterfaceType> synthesizedFrom,
|
| - List<InterfaceType> erroneousFrom,
|
| - int checkType: ALSO_CLASS_MEMBER}) {
|
| - String memberKind = checkType == CHECK_CLASS ? 'class' : 'interface';
|
| - MemberSignature member =
|
| - getMember(cls, name, isSetter: isSetter, checkType: checkType);
|
| - Expect.isNotNull(member, "No $memberKind member '$name' in $cls.");
|
| - Name memberName = member.name;
|
| - if (checkType == ALSO_CLASS_MEMBER) {
|
| - MemberSignature classMember = cls.element.lookupClassMember(memberName);
|
| - Expect.isNotNull(classMember, "No class member '$memberName' in $cls.");
|
| - Expect.equals(member, classMember);
|
| - } else if (checkType == NO_CLASS_MEMBER) {
|
| - Expect.isNull(cls.element.lookupClassMember(memberName));
|
| - }
|
| -
|
| - if (inheritedFrom != null) {
|
| - MemberSignature inherited = checkType == CHECK_CLASS
|
| - ? inheritedFrom.element.lookupClassMember(memberName)
|
| - : inheritedFrom.element.lookupInterfaceMember(memberName);
|
| - Expect.isNotNull(inherited,
|
| - "No $memberKind member '$memberName' in $inheritedFrom.");
|
| - Expect.equals(inherited.inheritFrom(inheritedFrom), member);
|
| - } else {
|
| - if (erroneousFrom != null || synthesizedFrom != null) {
|
| - Expect.notEquals(checkType, CHECK_CLASS,
|
| - "Arguments 'erroneousFrom' and 'synthesizedFrom' only apply "
|
| - "to interface members.");
|
| - if (synthesizedFrom != null) {
|
| - Expect.isTrue(member is SyntheticMember,
|
| - "Member '$member' is not synthesized.");
|
| - } else {
|
| - Expect.isTrue(member is ErroneousMember,
|
| - "Member '$member' is not erroneous.");
|
| - }
|
| - Set<MemberSignature> members = new Set<MemberSignature>();
|
| - List from = synthesizedFrom != null ? synthesizedFrom : erroneousFrom;
|
| - for (InterfaceType type in from) {
|
| - MemberSignature inheritedMember =
|
| - type.element.lookupInterfaceMember(memberName);
|
| - Expect.isNotNull(inheritedMember);
|
| - members.add(inheritedMember.inheritFrom(type));
|
| - }
|
| - Expect.setEquals(members, member.declarations);
|
| - } else if (declarer != null) {
|
| - Expect.equals(declarer, member.declarer,
|
| - "Unexpected declarer '${member.declarer}' of $memberKind member "
|
| - "'$member'. Expected '${declarer}'.");
|
| - } else {
|
| - Expect.equals(cls.element, member.element.getEnclosingClass());
|
| - Expect.equals(cls, member.declarer);
|
| - }
|
| - Expect.equals(isSetter, member.isSetter);
|
| - Expect.equals(isGetter, member.isGetter);
|
| - if (type != null) {
|
| - Expect.equals(type, member.type,
|
| - "Unexpected type of $memberKind member '$member'.");
|
| - }
|
| - if (functionType != null) {
|
| - if (type == null) {
|
| - Expect.equals(member.type, member.functionType,
|
| - "Unexpected type of $memberKind member '$member'.");
|
| - }
|
| - Expect.equals(functionType, member.functionType,
|
| - "Unexpected member type of $memberKind member '$member'.");
|
| - }
|
| - }
|
| - return member;
|
| -}
|
| -
|
| -void checkMemberCount(InterfaceType cls, int expectedCount,
|
| - {bool interfaceMembers: true}) {
|
| - int count = 0;
|
| - if (interfaceMembers) {
|
| - cls.element.forEachInterfaceMember((_) => count++);
|
| - } else {
|
| - cls.element.forEachClassMember((_) => count++);
|
| - }
|
| - Expect.equals(expectedCount, count);
|
| -}
|
| -
|
| -void testClassMembers() {
|
| - asyncTest(() => TypeEnvironment.create(r"""
|
| - abstract class A {
|
| - int field;
|
| - final finalField = 0;
|
| - static var staticField;
|
| -
|
| - int get getter => 0;
|
| - get abstractGetter;
|
| - void set setter(int _) {}
|
| - set abstractSetter(_);
|
| -
|
| - method() {}
|
| - abstractMethod();
|
| - static staticMethod() {}
|
| - }
|
| - class B<T> {
|
| - T field;
|
| - void method(T t) {}
|
| - static staticMethod() {}
|
| - toString([T t]) {}
|
| - }
|
| - class C<S> extends B<S> {}
|
| - class D extends C<int> {}
|
| - class E extends D {}
|
| - """, useMockCompiler: false).then((env) {
|
| -
|
| - InterfaceType bool_ = env['bool'];
|
| - InterfaceType String_ = env['String'];
|
| - InterfaceType num_ = env['num'];
|
| - InterfaceType int_ = env['int'];
|
| - InterfaceType dynamic_ = env['dynamic'];
|
| - VoidType void_ = env['void'];
|
| - InterfaceType Type_ = env['Type'];
|
| - InterfaceType Invocation_ = env['Invocation'];
|
| -
|
| - InterfaceType Object_ = env['Object'];
|
| - checkMemberCount(Object_, 5 /*declared*/, interfaceMembers: true);
|
| - checkMemberCount(Object_, 5 /*declared*/, interfaceMembers: false);
|
| -
|
| - checkMember(Object_, '==',
|
| - functionType: env.functionType(bool_, [dynamic_]));
|
| - checkMember(Object_, 'hashCode',
|
| - isGetter: true,
|
| - type: int_, functionType: env.functionType(int_, []));
|
| - checkMember(Object_, 'noSuchMethod',
|
| - functionType: env.functionType(dynamic_, [Invocation_]));
|
| - checkMember(Object_, 'runtimeType',
|
| - isGetter: true,
|
| - type: Type_, functionType: env.functionType(Type_, []));
|
| - checkMember(Object_, 'toString',
|
| - functionType: env.functionType(String_, []));
|
| -
|
| - InterfaceType A = env['A'];
|
| - checkMemberCount(A, 5 /*inherited*/ + 9 /*non-static declared*/,
|
| - interfaceMembers: true);
|
| - checkMemberCount(A, 5 /*inherited*/ + 9 /*non-abstract declared*/,
|
| - interfaceMembers: false);
|
| -
|
| - checkMember(A, '==', inheritedFrom: Object_);
|
| - checkMember(A, 'hashCode', inheritedFrom: Object_);
|
| - checkMember(A, 'noSuchMethod', inheritedFrom: Object_);
|
| - checkMember(A, 'runtimeType', inheritedFrom: Object_);
|
| - checkMember(A, 'toString', inheritedFrom: Object_);
|
| -
|
| - checkMember(A, 'field', isGetter: true,
|
| - type: int_, functionType: env.functionType(int_, []));
|
| - checkMember(A, 'field', isSetter: true,
|
| - type: int_, functionType: env.functionType(void_, [int_]));
|
| - checkMember(A, 'finalField', isGetter: true,
|
| - type: dynamic_, functionType: env.functionType(dynamic_, []));
|
| - checkMember(A, 'staticField', isGetter: true, isStatic: true,
|
| - checkType: CHECK_CLASS,
|
| - type: dynamic_, functionType: env.functionType(dynamic_, []));
|
| - checkMember(A, 'staticField', isSetter: true, isStatic: true,
|
| - checkType: CHECK_CLASS, type: dynamic_,
|
| - functionType: env.functionType(void_, [dynamic_]));
|
| -
|
| - checkMember(A, 'getter', isGetter: true,
|
| - type: int_, functionType: env.functionType(int_, []));
|
| - checkMember(A, 'abstractGetter', isGetter: true,
|
| - checkType: NO_CLASS_MEMBER,
|
| - type: dynamic_, functionType: env.functionType(dynamic_, []));
|
| - checkMember(A, 'setter', isSetter: true,
|
| - type: int_, functionType: env.functionType(void_, [int_]));
|
| - checkMember(A, 'abstractSetter', isSetter: true,
|
| - checkType: NO_CLASS_MEMBER, type: dynamic_,
|
| - functionType: env.functionType(dynamic_, [dynamic_]));
|
| -
|
| - checkMember(A, 'method', functionType: env.functionType(dynamic_, []));
|
| - checkMember(A, 'abstractMethod',
|
| - checkType: NO_CLASS_MEMBER,
|
| - functionType: env.functionType(dynamic_, []));
|
| - checkMember(A, 'staticMethod',
|
| - checkType: CHECK_CLASS,
|
| - isStatic: true, functionType: env.functionType(dynamic_, []));
|
| -
|
| - ClassElement B = env.getElement('B');
|
| - InterfaceType B_this = B.thisType;
|
| - TypeVariableType B_T = B_this.typeArguments.head;
|
| - checkMemberCount(B_this, 4 /*inherited*/ + 4 /*non-static declared*/,
|
| - interfaceMembers: true);
|
| - checkMemberCount(B_this, 4 /*inherited*/ + 5 /*declared*/,
|
| - interfaceMembers: false);
|
| -
|
| - checkMember(B_this, '==', inheritedFrom: Object_);
|
| - checkMember(B_this, 'hashCode', inheritedFrom: Object_);
|
| - checkMember(B_this, 'noSuchMethod', inheritedFrom: Object_);
|
| - checkMember(B_this, 'runtimeType', inheritedFrom: Object_);
|
| -
|
| - checkMember(B_this, 'field', isGetter: true,
|
| - type: B_T, functionType: env.functionType(B_T, []));
|
| - checkMember(B_this, 'field', isSetter: true,
|
| - type: B_T, functionType: env.functionType(void_, [B_T]));
|
| - checkMember(B_this, 'method', functionType: env.functionType(void_, [B_T]));
|
| - checkMember(B_this, 'staticMethod',
|
| - checkType: CHECK_CLASS,
|
| - isStatic: true, functionType: env.functionType(dynamic_, []));
|
| - checkMember(B_this, 'toString',
|
| - functionType: env.functionType(dynamic_, [],
|
| - optionalParameters: [B_T]));
|
| -
|
| - ClassElement C = env.getElement('C');
|
| - InterfaceType C_this = C.thisType;
|
| - TypeVariableType C_S = C_this.typeArguments.head;
|
| - checkMemberCount(C_this, 8 /*inherited*/, interfaceMembers: true);
|
| - checkMemberCount(C_this, 8 /*inherited*/, interfaceMembers: false);
|
| - InterfaceType B_S = instantiate(B, [C_S]);
|
| -
|
| - checkMember(C_this, '==', inheritedFrom: Object_);
|
| - checkMember(C_this, 'hashCode', inheritedFrom: Object_);
|
| - checkMember(C_this, 'noSuchMethod', inheritedFrom: Object_);
|
| - checkMember(C_this, 'runtimeType', inheritedFrom: Object_);
|
| -
|
| - checkMember(C_this, 'field', isGetter: true,
|
| - declarer: B_S,
|
| - type: C_S, functionType: env.functionType(C_S, []));
|
| - checkMember(C_this, 'field', isSetter: true,
|
| - declarer: B_S,
|
| - type: C_S, functionType: env.functionType(void_, [C_S]));
|
| - checkMember(C_this, 'method',
|
| - declarer: B_S,
|
| - functionType: env.functionType(void_, [C_S]));
|
| - checkMember(C_this, 'toString',
|
| - declarer: B_S,
|
| - functionType: env.functionType(dynamic_, [],
|
| - optionalParameters: [C_S]));
|
| -
|
| - InterfaceType D = env['D'];
|
| - checkMemberCount(D, 8 /*inherited*/, interfaceMembers: true);
|
| - checkMemberCount(D, 8 /*inherited*/, interfaceMembers: false);
|
| - InterfaceType B_int = instantiate(B, [int_]);
|
| -
|
| - checkMember(D, '==', inheritedFrom: Object_);
|
| - checkMember(D, 'hashCode', inheritedFrom: Object_);
|
| - checkMember(D, 'noSuchMethod', inheritedFrom: Object_);
|
| - checkMember(D, 'runtimeType', inheritedFrom: Object_);
|
| -
|
| - checkMember(D, 'field', isGetter: true,
|
| - declarer: B_int,
|
| - type: int_, functionType: env.functionType(int_, []));
|
| - checkMember(D, 'field', isSetter: true,
|
| - declarer: B_int,
|
| - type: int_, functionType: env.functionType(void_, [int_]));
|
| - checkMember(D, 'method',
|
| - declarer: B_int,
|
| - functionType: env.functionType(void_, [int_]));
|
| - checkMember(D, 'toString',
|
| - declarer: B_int,
|
| - functionType: env.functionType(dynamic_, [],
|
| - optionalParameters: [int_]));
|
| -
|
| - InterfaceType E = env['E'];
|
| - checkMemberCount(E, 8 /*inherited*/, interfaceMembers: true);
|
| - checkMemberCount(E, 8 /*inherited*/, interfaceMembers: false);
|
| -
|
| - checkMember(E, '==', inheritedFrom: Object_);
|
| - checkMember(E, 'hashCode', inheritedFrom: Object_);
|
| - checkMember(E, 'noSuchMethod', inheritedFrom: Object_);
|
| - checkMember(E, 'runtimeType', inheritedFrom: Object_);
|
| -
|
| - checkMember(E, 'field', isGetter: true,
|
| - declarer: B_int,
|
| - type: int_, functionType: env.functionType(int_, []));
|
| - checkMember(E, 'field', isSetter: true,
|
| - declarer: B_int,
|
| - type: int_, functionType: env.functionType(void_, [int_]));
|
| - checkMember(E, 'method',
|
| - declarer: B_int,
|
| - functionType: env.functionType(void_, [int_]));
|
| - checkMember(E, 'toString',
|
| - declarer: B_int,
|
| - functionType: env.functionType(dynamic_, [],
|
| - optionalParameters: [int_]));
|
| - }));
|
| -}
|
| -
|
| -void testInterfaceMembers() {
|
| - asyncTest(() => TypeEnvironment.create(r"""
|
| - abstract class A {
|
| - num method1();
|
| - void method2();
|
| - void method3();
|
| - void method4();
|
| - method5(a);
|
| - method6(a);
|
| - method7(a);
|
| - method8(a, b);
|
| - method9(a, b, c);
|
| - method10(a, {b, c});
|
| - method11(a, {b, c});
|
| - num get getter1;
|
| - num get getter2;
|
| - void set setter1(num _);
|
| - void set setter2(num _);
|
| - void set setter3(num _);
|
| - get getterAndMethod;
|
| - }
|
| - abstract class B {
|
| - int method1();
|
| - int method2();
|
| - num method3();
|
| - num method4();
|
| - method5([a]);
|
| - method6([a, b]);
|
| - method7(a, [b]);
|
| - method8([a]);
|
| - method9(a, [b]);
|
| - method10(a, {c, d});
|
| - method11(a, b, {c, d});
|
| - num get getter1;
|
| - int get getter2;
|
| - void set setter1(num _);
|
| - set setter2(num _);
|
| - void set setter3(int _);
|
| - getterAndMethod();
|
| - }
|
| - abstract class C {
|
| - int method3();
|
| - num method4();
|
| - }
|
| - abstract class D implements A, B, C {}
|
| - """).then((env) {
|
| -
|
| - InterfaceType dynamic_ = env['dynamic'];
|
| - VoidType void_ = env['void'];
|
| - InterfaceType num_ = env['num'];
|
| - InterfaceType int_ = env['int'];
|
| -
|
| - InterfaceType A = env['A'];
|
| - InterfaceType B = env['B'];
|
| - InterfaceType C = env['C'];
|
| - InterfaceType D = env['D'];
|
| -
|
| - // A: num method1()
|
| - // B: int method1()
|
| - // D: dynamic method1() -- synthesized from A and B.
|
| - checkMember(D, 'method1',
|
| - synthesizedFrom: [A, B],
|
| - functionType: env.functionType(dynamic_ , []),
|
| - checkType: NO_CLASS_MEMBER);
|
| -
|
| - // A: void method2()
|
| - // B: int method2()
|
| - // D: int method2() -- inherited from B
|
| - checkMember(D, 'method2', inheritedFrom: B, checkType: NO_CLASS_MEMBER);
|
| -
|
| - // A: void method3()
|
| - // B: num method3()
|
| - // C: int method3()
|
| - // D: dynamic method3() -- synthesized from A, B, and C.
|
| - checkMember(D, 'method3',
|
| - synthesizedFrom: [A, B, C],
|
| - functionType: env.functionType(dynamic_ , []),
|
| - checkType: NO_CLASS_MEMBER);
|
| -
|
| - // A: void method4()
|
| - // B: num method4()
|
| - // C: num method4()
|
| - // D: num method4() -- synthesized from B and C.
|
| - checkMember(D, 'method4',
|
| - synthesizedFrom: [B, C],
|
| - functionType: env.functionType(num_, []),
|
| - checkType: NO_CLASS_MEMBER);
|
| -
|
| - // A: method5(a)
|
| - // B: method5([a])
|
| - // D: method5([a]) -- inherited from B
|
| - checkMember(D, 'method5', inheritedFrom: B, checkType: NO_CLASS_MEMBER);
|
| -
|
| - // A: method6(a)
|
| - // B: method6([a, b])
|
| - // D: method6([a, b]) -- inherited from B
|
| - checkMember(D, 'method6', inheritedFrom: B, checkType: NO_CLASS_MEMBER);
|
| -
|
| - // A: method7(a)
|
| - // B: method7(a, [b])
|
| - // D: method7(a, [b]) -- inherited from B
|
| - checkMember(D, 'method7', inheritedFrom: B, checkType: NO_CLASS_MEMBER);
|
| -
|
| - // A: method8(a, b)
|
| - // B: method8([a])
|
| - // D: method8([a, b]) -- synthesized from A and B.
|
| - checkMember(D, 'method8',
|
| - synthesizedFrom: [A, B],
|
| - functionType: env.functionType(
|
| - dynamic_, [], optionalParameters: [dynamic_, dynamic_]),
|
| - checkType: NO_CLASS_MEMBER);
|
| -
|
| - // A: method9(a, b, c)
|
| - // B: method9(a, [b])
|
| - // D: method9(a, [b, c]) -- synthesized from A and B.
|
| - checkMember(D, 'method9',
|
| - synthesizedFrom: [A, B],
|
| - functionType: env.functionType(
|
| - dynamic_, [dynamic_], optionalParameters: [dynamic_, dynamic_]),
|
| - checkType: NO_CLASS_MEMBER);
|
| -
|
| - // A: method10(a, {b, c})
|
| - // B: method10(a, {c, d})
|
| - // D: method10(a, {b, c, d}) -- synthesized from A and B.
|
| - checkMember(D, 'method10',
|
| - synthesizedFrom: [A, B],
|
| - functionType: env.functionType(dynamic_, [dynamic_],
|
| - namedParameters: {'b': dynamic_,
|
| - 'c': dynamic_,
|
| - 'd': dynamic_}),
|
| - checkType: NO_CLASS_MEMBER);
|
| -
|
| - // A: method11(a, {b, c})
|
| - // B: method11(a, b, {c, d})
|
| - // D: method11(a, [b], {c, d}) -- synthesized from A and B.
|
| - // TODO(johnniwinther): Change to check synthesized member when function
|
| - // types with both optional and named parameters are supported.
|
| - Expect.isNull(getMember(D, 'method11'));
|
| - /*checkMember(D, 'method11',
|
| - synthesizedFrom: [A, B],
|
| - functionType: env.functionType(dynamic_, [dynamic_],
|
| - optionalParameters: [dynamic_],
|
| - namedParameters: {'c': dynamic_,
|
| - 'd': dynamic_,}),
|
| - checkType: NO_CLASS_MEMBER);*/
|
| -
|
| - // A: num get getter1
|
| - // B: num get getter1
|
| - // D: num get getter1 -- synthesized from A and B.
|
| - checkMember(D, 'getter1',
|
| - isGetter: true,
|
| - synthesizedFrom: [A, B], type: num_,
|
| - functionType: env.functionType(num_ , []),
|
| - checkType: NO_CLASS_MEMBER);
|
| -
|
| - // A: num get getter2
|
| - // B: int get getter2
|
| - // D: dynamic get getter2 -- synthesized from A and B.
|
| - checkMember(D, 'getter2',
|
| - isGetter: true,
|
| - synthesizedFrom: [A, B], type: dynamic_,
|
| - functionType: env.functionType(dynamic_ , []),
|
| - checkType: NO_CLASS_MEMBER);
|
| -
|
| - // A: void set setter1(num _)
|
| - // B: void set setter1(num _)
|
| - // D: void set setter1(num _) -- synthesized from A and B.
|
| - checkMember(D, 'setter1',
|
| - isSetter: true,
|
| - synthesizedFrom: [A, B], type: num_,
|
| - functionType: env.functionType(void_ , [num_]),
|
| - checkType: NO_CLASS_MEMBER);
|
| -
|
| - // A: void set setter2(num _)
|
| - // B: set setter2(num _)
|
| - // D: dynamic set setter2(dynamic _) -- synthesized from A and B.
|
| - checkMember(D, 'setter2',
|
| - isSetter: true,
|
| - synthesizedFrom: [A, B], type: dynamic_,
|
| - functionType: env.functionType(dynamic_ , [dynamic_]),
|
| - checkType: NO_CLASS_MEMBER);
|
| -
|
| - // A: void set setter3(num _)
|
| - // B: void set setter3(int _)
|
| - // D: dynamic set setter3(dynamic _) -- synthesized from A and B.
|
| - checkMember(D, 'setter3',
|
| - isSetter: true,
|
| - synthesizedFrom: [A, B], type: dynamic_,
|
| - functionType: env.functionType(dynamic_ , [dynamic_]),
|
| - checkType: NO_CLASS_MEMBER);
|
| -
|
| - // A: get getterAndMethod
|
| - // B: getterAndMethod()
|
| - // D: nothing inherited
|
| - checkMember(D, 'getterAndMethod',
|
| - erroneousFrom: [A, B],
|
| - checkType: NO_CLASS_MEMBER);
|
| - }));
|
| -}
|
| -
|
| -void testClassVsInterfaceMembers() {
|
| - asyncTest(() => TypeEnvironment.create(r"""
|
| - class A {
|
| - method1() {}
|
| - method2() {}
|
| - }
|
| - abstract class B {
|
| - method1();
|
| - method2(a);
|
| - }
|
| - abstract class C extends A implements B {}
|
| - """).then((env) {
|
| -
|
| - InterfaceType dynamic_ = env['dynamic'];
|
| - VoidType void_ = env['void'];
|
| - InterfaceType num_ = env['num'];
|
| - InterfaceType int_ = env['int'];
|
| -
|
| - InterfaceType A = env['A'];
|
| - InterfaceType B = env['B'];
|
| - InterfaceType C = env['C'];
|
| -
|
| - // A: method1()
|
| - // B: method1()
|
| - // C class: method1() -- inherited from A.
|
| - // C interface: dynamic method1() -- synthesized from A and B.
|
| - MemberSignature interfaceMember =
|
| - checkMember(C, 'method1', checkType: CHECK_INTERFACE,
|
| - synthesizedFrom: [A, B],
|
| - functionType: env.functionType(dynamic_ , []));
|
| - MemberSignature classMember =
|
| - checkMember(C, 'method1', checkType: CHECK_CLASS, inheritedFrom: A);
|
| - Expect.notEquals(interfaceMember, classMember);
|
| -
|
| - // A: method2()
|
| - // B: method2(a)
|
| - // C class: method2() -- inherited from A.
|
| - // C interface: dynamic method2([a]) -- synthesized from A and B.
|
| - interfaceMember =
|
| - checkMember(C, 'method2', checkType: CHECK_INTERFACE,
|
| - synthesizedFrom: [A, B],
|
| - functionType: env.functionType(dynamic_ , [],
|
| - optionalParameters: [dynamic_]));
|
| - classMember =
|
| - checkMember(C, 'method2', checkType: CHECK_CLASS, inheritedFrom: A);
|
| - Expect.notEquals(interfaceMember, classMember);
|
| - }));
|
| -}
|
| -
|
| -
|
| -void testMixinMembers() {
|
| - asyncTest(() => TypeEnvironment.create(r"""
|
| - class A<T> {
|
| - method1() {}
|
| - method2() {}
|
| - method3(T a) {}
|
| - method4(T a) {}
|
| - }
|
| - abstract class B<S> {
|
| - method1();
|
| - method2(a);
|
| - method3(S a) {}
|
| - }
|
| - abstract class C<U, V> extends Object with A<U> implements B<V> {}
|
| - """).then((env) {
|
| -
|
| - InterfaceType dynamic_ = env['dynamic'];
|
| - VoidType void_ = env['void'];
|
| - InterfaceType num_ = env['num'];
|
| - InterfaceType int_ = env['int'];
|
| -
|
| - ClassElement A = env.getElement('A');
|
| - ClassElement B = env.getElement('B');
|
| - ClassElement C = env.getElement('C');
|
| - InterfaceType C_this = C.thisType;
|
| - TypeVariableType C_U = C_this.typeArguments.head;
|
| - TypeVariableType C_V = C_this.typeArguments.tail.head;
|
| - InterfaceType A_U = instantiate(A, [C_U]);
|
| - InterfaceType B_V = instantiate(B, [C_V]);
|
| -
|
| - // A: method1()
|
| - // B: method1()
|
| - // C class: method1() -- inherited from A.
|
| - // C interface: dynamic method1() -- synthesized from A and B.
|
| - MemberSignature interfaceMember =
|
| - checkMember(C_this, 'method1', checkType: CHECK_INTERFACE,
|
| - synthesizedFrom: [A_U, B_V],
|
| - functionType: env.functionType(dynamic_ , []));
|
| - MemberSignature classMember =
|
| - checkMember(C_this, 'method1', checkType: CHECK_CLASS,
|
| - inheritedFrom: A_U);
|
| - Expect.notEquals(interfaceMember, classMember);
|
| -
|
| - // A: method2()
|
| - // B: method2(a)
|
| - // C class: method2() -- inherited from A.
|
| - // C interface: dynamic method2([a]) -- synthesized from A and B.
|
| - interfaceMember =
|
| - checkMember(C_this, 'method2', checkType: CHECK_INTERFACE,
|
| - synthesizedFrom: [A_U, B_V],
|
| - functionType: env.functionType(dynamic_ , [],
|
| - optionalParameters: [dynamic_]));
|
| - classMember =
|
| - checkMember(C_this, 'method2', checkType: CHECK_CLASS,
|
| - inheritedFrom: A_U);
|
| - Expect.notEquals(interfaceMember, classMember);
|
| -
|
| - // A: method3(U a)
|
| - // B: method3(V a)
|
| - // C class: method3(U a) -- inherited from A.
|
| - // C interface: dynamic method3(a) -- synthesized from A and B.
|
| - interfaceMember =
|
| - checkMember(C_this, 'method3', checkType: CHECK_INTERFACE,
|
| - synthesizedFrom: [A_U, B_V],
|
| - functionType: env.functionType(dynamic_ , [dynamic_]));
|
| - classMember =
|
| - checkMember(C_this, 'method3', checkType: CHECK_CLASS,
|
| - inheritedFrom: A_U);
|
| - Expect.notEquals(interfaceMember, classMember);
|
| -
|
| - // A: method4(U a)
|
| - // B: --
|
| - // C class: method4(U a) -- inherited from A.
|
| - // C interface: method4(U a) -- inherited from A.
|
| - checkMember(C_this, 'method4', checkType: ALSO_CLASS_MEMBER,
|
| - inheritedFrom: A_U);
|
| - }));
|
| -}
|
|
|