3e44898e08
TEST=existing Change-Id: I72583e500cb0b69d9352b040c3e2885f9e0450c5 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/195681 Commit-Queue: Johnni Winther <johnniwinther@google.com> Reviewed-by: Jens Johansen <jensj@google.com>
222 lines
8.4 KiB
Dart
222 lines
8.4 KiB
Dart
// Copyright (c) 2020, 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.
|
|
|
|
// @dart = 2.9
|
|
|
|
import 'package:expect/expect.dart';
|
|
import 'package:kernel/ast.dart';
|
|
import 'package:front_end/src/fasta/kernel/member_covariance.dart';
|
|
|
|
main() {
|
|
void checkEquals(Covariance a, Covariance b) {
|
|
Expect.equals(a, b);
|
|
Expect.equals(a.hashCode, b.hashCode);
|
|
}
|
|
|
|
checkEquals(const Covariance.empty(), new Covariance.empty());
|
|
|
|
Expect.isTrue(const Covariance.empty().isEmpty);
|
|
Expect.isTrue(new Covariance.empty().isEmpty);
|
|
Expect.isTrue(new Covariance.internal(null, null, null).isEmpty);
|
|
|
|
checkEquals(
|
|
const Covariance.empty(), new Covariance.internal(null, null, null));
|
|
|
|
Expect.throws(() => new Covariance.internal([], null, null));
|
|
Expect.throws(() => new Covariance.internal([0], null, null));
|
|
|
|
checkEquals(
|
|
new Covariance.internal([Covariance.GenericCovariantImpl], null, null),
|
|
new Covariance.internal(
|
|
[Covariance.GenericCovariantImpl, 0], null, null));
|
|
|
|
checkEquals(new Covariance.internal([Covariance.Covariant], null, null),
|
|
new Covariance.internal([Covariance.Covariant, 0], null, null));
|
|
|
|
checkEquals(new Covariance.internal([0, Covariance.Covariant], null, null),
|
|
new Covariance.internal([0, Covariance.Covariant, 0], null, null));
|
|
|
|
Expect.throws(() => new Covariance.internal(null, {}, null));
|
|
Expect.throws(() => new Covariance.internal(null, {'a': 0}, null));
|
|
|
|
checkEquals(new Covariance.internal(null, {'a': Covariance.Covariant}, null),
|
|
new Covariance.internal(null, {'a': Covariance.Covariant}, null));
|
|
|
|
Expect.throws(() => new Covariance.internal(null, null, []));
|
|
|
|
Expect.throws(() => new Covariance.internal(null, null, [false]));
|
|
|
|
checkEquals(new Covariance.internal(null, null, [true]),
|
|
new Covariance.internal(null, null, [true, false]));
|
|
|
|
Covariance covariance = new Covariance.internal([
|
|
Covariance.Covariant,
|
|
Covariance.GenericCovariantImpl,
|
|
0,
|
|
Covariance.Covariant | Covariance.GenericCovariantImpl
|
|
], {
|
|
'a': Covariance.Covariant,
|
|
'b': Covariance.GenericCovariantImpl,
|
|
'd': Covariance.Covariant | Covariance.GenericCovariantImpl
|
|
}, [
|
|
false,
|
|
true
|
|
]);
|
|
|
|
Expect.equals(Covariance.Covariant, covariance.getPositionalVariance(0));
|
|
Expect.equals(
|
|
Covariance.GenericCovariantImpl, covariance.getPositionalVariance(1));
|
|
Expect.equals(0, covariance.getPositionalVariance(2));
|
|
Expect.equals(Covariance.Covariant | Covariance.GenericCovariantImpl,
|
|
covariance.getPositionalVariance(3));
|
|
Expect.equals(0, covariance.getPositionalVariance(4));
|
|
|
|
Expect.equals(Covariance.Covariant, covariance.getNamedVariance('a'));
|
|
Expect.equals(
|
|
Covariance.GenericCovariantImpl, covariance.getNamedVariance('b'));
|
|
Expect.equals(0, covariance.getNamedVariance('c'));
|
|
Expect.equals(Covariance.Covariant | Covariance.GenericCovariantImpl,
|
|
covariance.getNamedVariance('d'));
|
|
Expect.equals(0, covariance.getNamedVariance('e'));
|
|
|
|
Expect.isFalse(covariance.isTypeParameterGenericCovariantImpl(0));
|
|
Expect.isTrue(covariance.isTypeParameterGenericCovariantImpl(1));
|
|
Expect.isFalse(covariance.isTypeParameterGenericCovariantImpl(0));
|
|
|
|
Expect.stringEquals(
|
|
'Covariance('
|
|
'0:Covariant,1:GenericCovariantImpl,3:GenericCovariantImpl+Covariant,'
|
|
'a:Covariant,b:GenericCovariantImpl,d:GenericCovariantImpl+Covariant,'
|
|
'types:1)',
|
|
covariance.toString());
|
|
|
|
Procedure noParameterProcedure = new Procedure(
|
|
new Name('foo'), ProcedureKind.Method, new FunctionNode(null),
|
|
fileUri: dummyUri);
|
|
Covariance noParameterProcedureCovariance =
|
|
new Covariance.fromMember(noParameterProcedure, forSetter: false);
|
|
Expect.isTrue(noParameterProcedureCovariance.isEmpty);
|
|
|
|
covariance.applyCovariance(noParameterProcedure);
|
|
noParameterProcedureCovariance =
|
|
new Covariance.fromMember(noParameterProcedure, forSetter: false);
|
|
Expect.isTrue(noParameterProcedureCovariance.isEmpty);
|
|
|
|
Procedure oneParameterProcedure = new Procedure(
|
|
new Name('foo'),
|
|
ProcedureKind.Method,
|
|
new FunctionNode(null,
|
|
positionalParameters: [new VariableDeclaration(null)]),
|
|
fileUri: dummyUri);
|
|
Covariance oneParameterProcedureCovariance =
|
|
new Covariance.fromMember(oneParameterProcedure, forSetter: false);
|
|
Expect.isTrue(oneParameterProcedureCovariance.isEmpty);
|
|
|
|
covariance.applyCovariance(oneParameterProcedure);
|
|
oneParameterProcedureCovariance =
|
|
new Covariance.fromMember(oneParameterProcedure, forSetter: false);
|
|
Expect.isFalse(oneParameterProcedureCovariance.isEmpty);
|
|
Expect.equals(new Covariance.internal([Covariance.Covariant], null, null),
|
|
oneParameterProcedureCovariance);
|
|
|
|
Procedure positionalParametersProcedure = new Procedure(
|
|
new Name('foo'),
|
|
ProcedureKind.Method,
|
|
new FunctionNode(null, positionalParameters: [
|
|
new VariableDeclaration(null),
|
|
new VariableDeclaration(null),
|
|
new VariableDeclaration(null),
|
|
new VariableDeclaration(null),
|
|
new VariableDeclaration(null)
|
|
]),
|
|
fileUri: dummyUri);
|
|
Covariance positionalParametersProcedureCovariance =
|
|
new Covariance.fromMember(positionalParametersProcedure,
|
|
forSetter: false);
|
|
Expect.isTrue(positionalParametersProcedureCovariance.isEmpty);
|
|
|
|
covariance.applyCovariance(positionalParametersProcedure);
|
|
positionalParametersProcedureCovariance = new Covariance.fromMember(
|
|
positionalParametersProcedure,
|
|
forSetter: false);
|
|
Expect.isFalse(positionalParametersProcedureCovariance.isEmpty);
|
|
checkEquals(
|
|
new Covariance.internal([
|
|
Covariance.Covariant,
|
|
Covariance.GenericCovariantImpl,
|
|
0,
|
|
Covariance.Covariant | Covariance.GenericCovariantImpl
|
|
], null, null),
|
|
positionalParametersProcedureCovariance);
|
|
|
|
Procedure namedParametersProcedure = new Procedure(
|
|
new Name('foo'),
|
|
ProcedureKind.Method,
|
|
new FunctionNode(null, namedParameters: [
|
|
new VariableDeclaration('a'),
|
|
new VariableDeclaration('b'),
|
|
new VariableDeclaration('c'),
|
|
new VariableDeclaration('d'),
|
|
new VariableDeclaration('e')
|
|
]),
|
|
fileUri: dummyUri);
|
|
Covariance namedParametersProcedureCovariance =
|
|
new Covariance.fromMember(namedParametersProcedure, forSetter: false);
|
|
Expect.isTrue(namedParametersProcedureCovariance.isEmpty);
|
|
|
|
covariance.applyCovariance(namedParametersProcedure);
|
|
namedParametersProcedureCovariance =
|
|
new Covariance.fromMember(namedParametersProcedure, forSetter: false);
|
|
Expect.isFalse(namedParametersProcedureCovariance.isEmpty);
|
|
checkEquals(
|
|
new Covariance.internal(
|
|
null,
|
|
{
|
|
'a': Covariance.Covariant,
|
|
'b': Covariance.GenericCovariantImpl,
|
|
'd': Covariance.Covariant | Covariance.GenericCovariantImpl
|
|
},
|
|
null),
|
|
namedParametersProcedureCovariance);
|
|
|
|
Procedure typeParametersProcedure = new Procedure(
|
|
new Name('foo'),
|
|
ProcedureKind.Method,
|
|
new FunctionNode(null, typeParameters: [
|
|
new TypeParameter(null),
|
|
new TypeParameter(null),
|
|
new TypeParameter(null),
|
|
]),
|
|
fileUri: dummyUri);
|
|
Covariance typeParametersProcedureCovariance =
|
|
new Covariance.fromMember(typeParametersProcedure, forSetter: false);
|
|
Expect.isTrue(typeParametersProcedureCovariance.isEmpty);
|
|
|
|
covariance.applyCovariance(typeParametersProcedure);
|
|
typeParametersProcedureCovariance =
|
|
new Covariance.fromMember(typeParametersProcedure, forSetter: false);
|
|
Expect.isFalse(typeParametersProcedureCovariance.isEmpty);
|
|
checkEquals(new Covariance.internal(null, null, [false, true]),
|
|
typeParametersProcedureCovariance);
|
|
|
|
Covariance merged =
|
|
const Covariance.empty().merge(positionalParametersProcedureCovariance);
|
|
checkEquals(positionalParametersProcedureCovariance, merged);
|
|
merged = merged.merge(namedParametersProcedureCovariance);
|
|
checkEquals(
|
|
new Covariance.internal([
|
|
Covariance.Covariant,
|
|
Covariance.GenericCovariantImpl,
|
|
0,
|
|
Covariance.GenericCovariantImpl | Covariance.Covariant
|
|
], {
|
|
'a': Covariance.Covariant,
|
|
'b': Covariance.GenericCovariantImpl,
|
|
'd': Covariance.Covariant | Covariance.GenericCovariantImpl
|
|
}, null),
|
|
merged);
|
|
merged = merged.merge(typeParametersProcedureCovariance);
|
|
checkEquals(covariance, merged);
|
|
}
|