a4b09ac192
Change-Id: I8b9b7d70abc47d672c68db65bc67d08beb7d41a7 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/142089 Commit-Queue: Bob Nystrom <rnystrom@google.com> Reviewed-by: Erik Ernst <eernst@google.com>
129 lines
5.0 KiB
Dart
129 lines
5.0 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.
|
|
|
|
// Test cases where the syntax is ambiguous between maps and sets because of
|
|
// spreads inside control flow.
|
|
import 'dart:collection';
|
|
|
|
import 'utils.dart';
|
|
|
|
void main() {
|
|
testBottomUpInference();
|
|
testTopDownInference();
|
|
}
|
|
|
|
void testBottomUpInference() {
|
|
Map<int, int> map = {};
|
|
Set<int> set = Set();
|
|
dynamic dynMap = map;
|
|
dynamic dynSet = set;
|
|
Iterable<int> iterable = [];
|
|
CustomSet customSet = CustomSet();
|
|
CustomMap customMap = CustomMap();
|
|
|
|
// Note: The commented out cases are the error cases. They are shown here for
|
|
// completeness and tested in map_set_ambiguity_error_test.dart.
|
|
expectMapOf<int, int>({if (true) ...map});
|
|
expectSetOf<int>({if (true) ...set});
|
|
// expect___Of<...>({if (true) ...dyn});
|
|
expectSetOf<int>({if (true) ...iterable});
|
|
expectSetOf<int>({if (true) ...customSet});
|
|
expectMapOf<int, String>({if (true) ...customMap});
|
|
|
|
expectMapOf<int, int>({if (true) ...map else ...map});
|
|
// expect___Of<...>({if (true) ...map else ...set});
|
|
expectMapOf<dynamic, dynamic>({if (true) ...map else ...dynMap});
|
|
// expect___Of<...>({if (true) ...map else ...iterable});
|
|
// expect___Of<...>({if (true) ...map else ...customSet});
|
|
expectMapOf<int, Object>({if (true) ...map else ...customMap});
|
|
|
|
expectSetOf<int>({if (true) ...set else ...set});
|
|
expectSetOf<dynamic>({if (true) ...set else ...dynSet});
|
|
expectSetOf<int>({if (true) ...set else ...iterable});
|
|
expectSetOf<int>({if (true) ...set else ...customSet});
|
|
// expect___Of<...>({if (true) ...set else ...customMap});
|
|
|
|
// expect___Of<...>({if (true) ...dyn else ...dyn});
|
|
expectSetOf<dynamic>({if (true) ...dynSet else ...iterable});
|
|
expectSetOf<dynamic>({if (true) ...dynSet else ...customSet});
|
|
expectMapOf<dynamic, dynamic>({if (true) ...dynMap else ...customMap});
|
|
|
|
expectSetOf<int>({if (true) ...iterable else ...iterable});
|
|
expectSetOf<int>({if (true) ...iterable else ...customSet});
|
|
// expect___Of<...>({if (true) ...iterable else ...customMap});
|
|
|
|
expectSetOf<int>({if (true) ...customSet else ...customSet});
|
|
// expect___Of<...>({if (true) ...customSet else ...customMap});
|
|
|
|
expectMapOf<int, String>({if (true) ...customMap else ...customMap});
|
|
|
|
// Note: The commented out cases are the error cases. They are shown here for
|
|
// completeness and tested in map_set_ambiguity_error_test.dart.
|
|
expectMapOf<int, int>({for (; false;) ...map});
|
|
expectSetOf<int>({for (; false;) ...set});
|
|
// expect___Of<...>({for (; false;) ...dyn});
|
|
expectSetOf<int>({for (; false;) ...iterable});
|
|
expectSetOf<int>({for (; false;) ...customSet});
|
|
expectMapOf<int, String>({for (; false;) ...customMap});
|
|
|
|
expectMapOf<int, int>({for (; false;) ...map, for (; false;) ...map});
|
|
// expect___Of<...>({for (; false;) ...map, for (; false;) ...set});
|
|
expectMapOf<dynamic, dynamic>(
|
|
{for (; false;) ...map, for (; false;) ...dynMap});
|
|
// expect___Of<...>({for (; false;) ...map, for (; false;) ...iterable});
|
|
// expect___Of<...>({for (; false;) ...map, for (; false;) ...customSet});
|
|
expectMapOf<int, Object>(
|
|
{for (; false;) ...map, for (; false;) ...customMap});
|
|
|
|
expectSetOf<int>({for (; false;) ...set, for (; false;) ...set});
|
|
expectSetOf<dynamic>({for (; false;) ...set, for (; false;) ...dynSet});
|
|
expectSetOf<int>({for (; false;) ...set, for (; false;) ...iterable});
|
|
expectSetOf<int>({for (; false;) ...set, for (; false;) ...customSet});
|
|
// expect___Of<...>({for (; false;) ...set, for (; false;) ...customMap});
|
|
|
|
// expect___Of<...>({for (; false;) ...dyn, for (; false;) ...dyn});
|
|
expectSetOf<dynamic>(
|
|
{for (; false;) ...dynSet, for (; false;) ...iterable});
|
|
expectSetOf<dynamic>(
|
|
{for (; false;) ...dynSet, for (; false;) ...customSet});
|
|
expectMapOf<dynamic, dynamic>(
|
|
{for (; false;) ...dynMap, for (; false;) ...customMap});
|
|
|
|
expectSetOf<int>(
|
|
{for (; false;) ...iterable, for (; false;) ...iterable});
|
|
expectSetOf<int>(
|
|
{for (; false;) ...iterable, for (; false;) ...customSet});
|
|
// expect___Of<...>(
|
|
// {for (; false;) ...iterable, for (; false;) ...customMap});
|
|
|
|
expectSetOf<int>(
|
|
{for (; false;) ...customSet, for (; false;) ...customSet});
|
|
// expect___Of<...>(
|
|
// {for (; false;) ...customSet, for (; false;) ...customMap});
|
|
|
|
expectMapOf<int, String>(
|
|
{for (; false;) ...customMap, for (; false;) ...customMap});
|
|
}
|
|
|
|
void testTopDownInference() {
|
|
dynamic untypedMap = <int, int>{};
|
|
dynamic untypedIterable = <int>[];
|
|
|
|
Map<int, int> map = {if (true) ...untypedMap};
|
|
Set<int> set = {if (true) ...untypedIterable};
|
|
Iterable<int> iterable = {if (true) ...untypedIterable};
|
|
|
|
expectMapOf<int, int>(map);
|
|
expectSetOf<int>(set);
|
|
expectSetOf<int>(iterable);
|
|
|
|
map = {for (; false;) ...untypedMap};
|
|
set = {for (; false;) ...untypedIterable};
|
|
iterable = {for (; false;) ...untypedIterable};
|
|
|
|
expectMapOf<int, int>(map);
|
|
expectSetOf<int>(set);
|
|
expectSetOf<int>(iterable);
|
|
}
|