mirror of
https://github.com/dart-lang/sdk
synced 2024-09-16 00:09:49 +00:00
04e6f4c282
This adds an [isSynthesized] flag to the [VariableDeclaration] the signal when the variable doesn't correspond to a variable in the source code. The name of a variable can only be `null` if it is synthesized. Partially in response to https://github.com/dart-lang/sdk/issues/51554 TEST=existing Change-Id: I94591971f11da09d210c8b25a2d05e22ca05dc62 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/286961 Reviewed-by: Joshua Litt <joshualitt@google.com> Commit-Queue: Johnni Winther <johnniwinther@google.com> Reviewed-by: Chloe Stefantsova <cstefantsova@google.com> Reviewed-by: Alexander Markov <alexmarkov@google.com>
221 lines
8.5 KiB
Dart
221 lines
8.5 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.
|
|
|
|
import 'package:expect/expect.dart';
|
|
import 'package:kernel/ast.dart';
|
|
import 'package:front_end/src/fasta/kernel/member_covariance.dart';
|
|
|
|
void 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, isSynthesized: true)
|
|
]),
|
|
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, isSynthesized: true),
|
|
new VariableDeclaration(null, isSynthesized: true),
|
|
new VariableDeclaration(null, isSynthesized: true),
|
|
new VariableDeclaration(null, isSynthesized: true),
|
|
new VariableDeclaration(null, isSynthesized: true)
|
|
]),
|
|
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);
|
|
}
|