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>
100 lines
3.7 KiB
Dart
100 lines
3.7 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 how control flow interacts with inference.
|
|
import 'package:expect/expect.dart';
|
|
|
|
import 'utils.dart';
|
|
|
|
void main() {
|
|
testBottomUpInference();
|
|
testLoopVariableInference();
|
|
testTopDownInference();
|
|
}
|
|
|
|
void testBottomUpInference() {
|
|
// Lists.
|
|
Expect.type<List<int>>([for (; false;) 1]);
|
|
Expect.type<List<int>>([for (; false;) 1, for (; false;) 2]);
|
|
Expect.type<List<num>>([for (; false;) 1, for (; false;) 0.2]);
|
|
Expect.type<List<int>>([for (; false;) 1, 2]);
|
|
Expect.type<List<num>>([for (; false;) 1, 0.2]);
|
|
Expect.type<List<dynamic>>([for (; false;) ...[]]);
|
|
Expect.type<List<int>>([for (; false;) ...<int>[]]);
|
|
|
|
// Maps.
|
|
Expect.type<Map<int, int>>({for (; false;) 1: 1});
|
|
Expect.type<Map<int, int>>({for (; false;) 1: 1, for (; false;) 2: 2});
|
|
Expect.type<Map<num, num>>({for (; false;) 1: 0.1, for (; false;) 0.2: 2});
|
|
Expect.type<Map<int, int>>({for (; false;) 1: 1, 2: 2});
|
|
Expect.type<Map<num, num>>({for (; false;) 1: 0.1, 0.2: 2});
|
|
Expect.type<Map<dynamic, dynamic>>({for (; false;) ...{}});
|
|
Expect.type<Map<int, int>>({for (; false;) ...<int, int>{}});
|
|
|
|
// Sets.
|
|
Expect.type<Set<int>>({for (; false;) 1});
|
|
Expect.type<Set<int>>({for (; false;) 1, for (; false;) 2});
|
|
Expect.type<Set<num>>({for (; false;) 1, for (; false;) 0.2});
|
|
Expect.type<Set<int>>({for (; false;) 1, 2});
|
|
Expect.type<Set<num>>({for (; false;) 1, 0.2});
|
|
Expect.type<Set<dynamic>>({for (; false;) ...[]});
|
|
Expect.type<Set<int>>({for (; false;) ...<int>[]});
|
|
|
|
// If a nested iterable's type is dynamic, the element type is dynamic.
|
|
Expect.type<List<dynamic>>([for (; false;) ...([] as dynamic)]);
|
|
Expect.type<Set<dynamic>>({1, for (; false;) ...([] as dynamic)});
|
|
|
|
// If a nested maps's type is dynamic, the key and value types are dynamic.
|
|
Expect.type<Map<dynamic, dynamic>>({1: 1, for (; false;) ...({} as dynamic)});
|
|
}
|
|
|
|
void testLoopVariableInference() {
|
|
// Infers loop variable from iterable.
|
|
Expect.type<List<int>>([for (var i in <int>[1]) i]);
|
|
Expect.type<List<String>>([for (var i in <int>[1]) i.toRadixString(10)]);
|
|
|
|
// Infers loop variable from initializer.
|
|
Expect.type<List<int>>([for (var i = 1; i < 2; i++) i]);
|
|
Expect.type<List<String>>([for (var i = 1; i < 2; i++) i.toRadixString(10)]);
|
|
|
|
// Loop variable type is pushed into sequence.
|
|
Expect.listEquals(<int>[1], [for (int i in expectIntIterable([1])) i]);
|
|
|
|
// Loop variable type is pushed into initializer.
|
|
Expect.listEquals(<int>[1], [for (int i = expectInt(1); i < 2; i++) i]);
|
|
}
|
|
|
|
void testTopDownInference() {
|
|
// Lists.
|
|
|
|
// The context element type is pushed into the body.
|
|
Expect.listEquals(<int>[1], <int>[for (var i = 0; i < 1; i++) expectInt(1)]);
|
|
|
|
// Bottom up-inference from elements is not pushed back down into the body.
|
|
Expect.listEquals(<int>[1, 2],
|
|
[1, for (var i = 0; i < 1; i++) expectDynamic(2)]);
|
|
|
|
// Maps.
|
|
|
|
// The context element type is pushed into the body.
|
|
Expect.mapEquals(<int, String>{1: "s"}, <int, String>{
|
|
for (var i = 0; i < 1; i++) expectInt(1): expectString("s")
|
|
});
|
|
|
|
// Bottom up-inference from elements is not pushed back down into the body.
|
|
Expect.mapEquals(<int, String>{1: "s", 2: "t"}, {
|
|
1: "s",
|
|
for (var i = 0; i < 1; i++) expectDynamic(2): expectDynamic("t")
|
|
});
|
|
|
|
// Sets.
|
|
|
|
// The context element type is pushed into the body.
|
|
Expect.setEquals(<int>{1}, <int>{for (var i = 0; i < 1; i++) expectInt(1)});
|
|
|
|
// Bottom up-inference from elements is not pushed back down into the body.
|
|
Expect.setEquals(<int>{1, 2},
|
|
{1, for (var i = 0; i < 1; i++) expectDynamic(2)});
|
|
}
|