blob: 122ba8b42a1ad747bc6d15add3df488a089387b6 [file] [log] [blame]
// Copyright (c) 2017, 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:async_helper/async_helper.dart";
import 'compiler_helper.dart';
import 'type_mask_test_helper.dart';
import 'package:compiler/src/types/types.dart';
bool isContainer(TypeMask mask) {
return mask is ContainerTypeMask;
}
const String TEST = '''
foo1() {
final methods = [];
var res, sum;
for (int i = 0; i != 3; i++) {
methods.add((int x) { res = x; sum = x + i; });
}
methods[0](499);
probe1res(res);
probe1sum(sum);
probe1methods(methods);
}
probe1res(x) => x;
probe1sum(x) => x;
probe1methods(x) => x;
nonContainer(choice) {
var m = choice == 0 ? [] : "<String>";
if (m is !List) throw 123;
// The union then filter leaves us with a non-container type.
return m;
}
foo2(int choice) {
final methods = nonContainer(choice);
var res, sum;
for (int i = 0; i != 3; i++) {
methods.add((int x) { res = x; sum = x + i; });
}
methods[0](499);
probe2res(res);
probe2methods(methods);
}
probe2res(x) => x;
probe2methods(x) => x;
main() {
foo1();
foo2(0);
foo2(1);
}
''';
void main() {
Uri uri = new Uri(scheme: 'source');
var compiler = compilerFor(TEST, uri);
asyncTest(() => compiler.run(uri).then((_) {
var typesInferrer = compiler.globalInference.typesInferrerInternal;
var closedWorld = typesInferrer.closedWorld;
var commonMasks = closedWorld.commonMasks;
typeOf(String name) {
MemberElement member = findElement(compiler, name);
return typesInferrer.getReturnTypeOfMember(member);
}
checkType(String name, type) {
var mask = typeOf(name);
Expect.equals(type.nullable(), simplify(mask, closedWorld), name);
}
checkContainer(String name, bool value) {
var mask = typeOf(name);
Expect.equals(
value, isContainer(mask), '$name is container (mask: $mask)');
}
checkContainer('probe1methods', true);
checkType('probe1res', commonMasks.uint31Type);
checkType('probe1sum', commonMasks.positiveIntType);
checkContainer('probe2methods', false);
checkType('probe2res', commonMasks.dynamicType);
}));
}