mirror of
https://github.com/dart-lang/sdk
synced 2024-09-15 21:30:17 +00:00
4ff04f641b
Change-Id: Icdcc648f42393b28daf648f752e3b4d61f51aa10 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/212043 Commit-Queue: Johnni Winther <johnniwinther@google.com> Reviewed-by: Jens Johansen <jensj@google.com>
155 lines
6.3 KiB
Dart
155 lines
6.3 KiB
Dart
// 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.
|
|
|
|
import "package:expect/expect.dart" show Expect;
|
|
|
|
import 'package:kernel/ast.dart';
|
|
import 'package:kernel/src/nnbd_top_merge.dart';
|
|
import 'package:kernel/testing/type_parser_environment.dart';
|
|
|
|
const Map<String, dynamic> data = {
|
|
'Object? vs Object?': 'Object?',
|
|
'Object* vs Object?': 'Object?',
|
|
'Object vs Object?': null,
|
|
'Object* vs Object': 'Object',
|
|
'Object* vs Object*': 'Object*',
|
|
'Object vs Object': 'Object',
|
|
'dynamic vs dynamic': 'dynamic',
|
|
'void vs void': 'void',
|
|
'Object? vs void': 'Object?',
|
|
'Object* vs void': 'Object?',
|
|
'Object vs void': null,
|
|
'dynamic vs void': 'Object?',
|
|
'Object? vs dynamic': 'Object?',
|
|
'Object* vs dynamic': 'Object?',
|
|
'Object vs dynamic': null,
|
|
'Never? vs Null': null,
|
|
'Never* vs Null': 'Null',
|
|
'Never vs Null': null,
|
|
'int? vs int?': 'int?',
|
|
'int? vs int*': 'int?',
|
|
'int* vs int*': 'int*',
|
|
'int* vs int': 'int',
|
|
'int vs int': 'int',
|
|
'int? vs int': null,
|
|
'List<Object?> vs List<Object?>': 'List<Object?>',
|
|
'List<Object*> vs List<Object?>': 'List<Object?>',
|
|
'List<Object*> vs List<Object*>': 'List<Object*>',
|
|
'List<Object> vs List<Object?>': null,
|
|
'List<Object*> vs List<Object>': 'List<Object>',
|
|
'List<Object> vs List<Object>': 'List<Object>',
|
|
'List<dynamic> vs List<dynamic>': 'List<dynamic>',
|
|
'List<void> vs List<void>': 'List<void>',
|
|
'List<Object?> vs List<void>': 'List<Object?>',
|
|
'List<Object*> vs List<void>': 'List<Object?>',
|
|
'List<Object> vs List<void>': null,
|
|
'List<dynamic> vs List<void>': 'List<Object?>',
|
|
'List<Object?> vs List<dynamic>': 'List<Object?>',
|
|
'List<Object*> vs List<dynamic>': 'List<Object?>',
|
|
'List<Object> vs List<dynamic>': null,
|
|
'List<Never?> vs List<Null>': null,
|
|
'List<Never*> vs List<Null>': 'List<Null>',
|
|
'List<Never> vs List<Null>': null,
|
|
'List<int?> vs List<int?>': 'List<int?>',
|
|
'List<int?> vs List<int*>': 'List<int?>',
|
|
'List<int*> vs List<int*>': 'List<int*>',
|
|
'List<int*> vs List<int>': 'List<int>',
|
|
'List<int> vs List<int>': 'List<int>',
|
|
'List<int?> vs List<int>': null,
|
|
'() ->? void vs () ->? void': '() ->? void',
|
|
'() ->? void vs () ->* void': '() ->? void',
|
|
'() ->* void vs () ->* void': '() ->* void',
|
|
'() ->* void vs () -> void': '() -> void',
|
|
'() -> void vs () -> void': '() -> void',
|
|
'() ->? void vs () -> void': null,
|
|
'(int?) -> void vs (int?) -> void': '(int?) -> void',
|
|
'(int?) -> void vs (int*) -> void': '(int?) -> void',
|
|
'(int*) -> void vs (int*) -> void': '(int*) -> void',
|
|
'(int*) -> void vs (int) -> void': '(int) -> void',
|
|
'(int) -> void vs (int) -> void': '(int) -> void',
|
|
'(int?) -> void vs (int) -> void': null,
|
|
'([int?]) -> void vs ([int?]) -> void': '([int?]) -> void',
|
|
'([int?]) -> void vs ([int*]) -> void': '([int?]) -> void',
|
|
'([int*]) -> void vs ([int*]) -> void': '([int*]) -> void',
|
|
'([int*]) -> void vs ([int]) -> void': '([int]) -> void',
|
|
'([int]) -> void vs ([int]) -> void': '([int]) -> void',
|
|
'([int?]) -> void vs ([int]) -> void': null,
|
|
'({int? a}) -> void vs ({int? a}) -> void': '({int? a}) -> void',
|
|
'({int? a}) -> void vs ({int* a}) -> void': '({int? a}) -> void',
|
|
'({int* a}) -> void vs ({int* a}) -> void': '({int* a}) -> void',
|
|
'({int* a}) -> void vs ({int a}) -> void': '({int a}) -> void',
|
|
'({int a}) -> void vs ({int a}) -> void': '({int a}) -> void',
|
|
'({int? a}) -> void vs ({int a}) -> void': null,
|
|
'({required int? a}) -> void vs ({required int? a}) -> void':
|
|
'({required int? a}) -> void',
|
|
'({required int? a}) -> void vs ({required int* a}) -> void':
|
|
'({required int? a}) -> void',
|
|
'({required int* a}) -> void vs ({required int* a}) -> void':
|
|
'({required int* a}) -> void',
|
|
'({required int* a}) -> void vs ({required int a}) -> void':
|
|
'({required int a}) -> void',
|
|
'({required int? a}) -> void vs ({required int a}) -> void': null,
|
|
'({int a, bool b}) -> void vs ({int a, bool b}) -> void':
|
|
'({int a, bool b}) -> void',
|
|
'({int a, bool b}) -> void vs ({bool b, int a}) -> void':
|
|
'({int a, bool b}) -> void',
|
|
'({int a, bool b}) ->* void vs ({bool b, int a}) ->? void':
|
|
'({int a, bool b}) ->? void',
|
|
'({int a, bool b}) -> void vs ({int a, required bool b}) -> void': null,
|
|
'<E>(E) -> void vs <F>(F) -> void': '<E>(E) -> void',
|
|
'<E extends int>(E) -> void vs <F extends int*>(F) -> void': [
|
|
'<E extends int>(E) -> void',
|
|
'<F extends int>(F) -> void'
|
|
],
|
|
'<E extends List<E>>(E) -> void vs <F extends List<F>>(F) -> void':
|
|
'<E extends List<E>>(E) -> void',
|
|
'<E extends List<E>>(E) -> void vs <F extends List<F>*>(F) -> void': [
|
|
'<E extends List<E>>(E) -> void',
|
|
'<F extends List<F>>(F) -> void'
|
|
],
|
|
'invalid vs invalid': 'invalid',
|
|
'invalid vs Object': 'invalid',
|
|
'invalid vs Object?': 'invalid',
|
|
'Object vs invalid': 'invalid',
|
|
'Object? vs invalid': 'invalid',
|
|
'void vs invalid': 'invalid',
|
|
'dynamic vs invalid': 'invalid',
|
|
'Null vs invalid': 'invalid',
|
|
'Never vs invalid': 'invalid',
|
|
'() -> void vs invalid': 'invalid',
|
|
'<T>(T) -> void vs <T>(invalid) -> void': '<T>(invalid) -> void',
|
|
};
|
|
|
|
void main() {
|
|
Env env = new Env('', isNonNullableByDefault: true);
|
|
data.forEach((String input, dynamic output) {
|
|
List<String> parts = input.split(' vs ');
|
|
DartType aType = env.parseType(parts[0]);
|
|
DartType bType = env.parseType(parts[1]);
|
|
DartType? expectedOutputType1;
|
|
DartType? expectedOutputType2;
|
|
if (output is List) {
|
|
expectedOutputType1 = env.parseType(output[0]);
|
|
expectedOutputType2 = env.parseType(output[1]);
|
|
} else if (output is String) {
|
|
expectedOutputType1 = expectedOutputType2 = env.parseType(output);
|
|
}
|
|
|
|
void test(DartType a, DartType b, DartType? expectedOutputType) {
|
|
DartType? actualOutputType = nnbdTopMerge(env.coreTypes, a, b);
|
|
print('nnbdTopMerge($a,$b) = '
|
|
'$actualOutputType (expected=$expectedOutputType)');
|
|
Expect.equals(
|
|
expectedOutputType,
|
|
actualOutputType,
|
|
"Unexpected nnbd top merge of $a vs $b ('$input'):\n"
|
|
"Expected: ${expectedOutputType} ('$output')\n"
|
|
"Actual: ${actualOutputType}");
|
|
}
|
|
|
|
test(aType, bType, expectedOutputType1);
|
|
test(bType, aType, expectedOutputType2);
|
|
});
|
|
}
|