blob: a804f0e6b011fde671f8a0a3f728f9c0ec269c97 [file] [log] [blame]
// Copyright (c) 2014, 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';
const String TEST = """
class A {
int aField;
A(this.aField);
// Test return type annotation.
int foo(a) => a;
// Test parameter type annotation.
faa (int a) => a;
// Test annotations on locals.
baz(x) {
int y = x;
return y;
}
// Test tear-off closure type annotations.
int bar(x) => x;
int tear(x) {
var torn = bar;
// Have torn escape through closure to disable tracing.
var fail = (() => torn)();
return fail(x);
}
}
main () {
var a = new A("42");
print(a.aField);
print(a.foo("42"));
print(a.foo(42));
print(a.faa("42"));
print(a.faa(42));
print(a.baz("42"));
print(a.baz(42));
// Test trusting types of tear off closures.
print(a.tear("42"));
print(a.tear(42));
}
""";
void main() {
Uri uri = new Uri(scheme: 'source');
var compiler = compilerFor(TEST, uri, trustTypeAnnotations: true);
asyncTest(() => compiler.run(uri).then((_) {
var typesInferrer = compiler.globalInference.typesInferrerInternal;
var closedWorld = typesInferrer.closedWorld;
ClassElement classA = findElement(compiler, "A");
checkReturn(String name, TypeMask type) {
MemberElement element = classA.lookupMember(name);
var mask = typesInferrer.getReturnTypeOfMember(element);
Expect.isTrue(type.containsMask(mask, closedWorld));
}
checkType(String name, type) {
MemberElement element = classA.lookupMember(name);
Expect.isTrue(type.containsMask(
typesInferrer.getTypeOfMember(element), closedWorld));
}
var intMask = new TypeMask.subtype(
closedWorld.commonElements.intClass, closedWorld);
checkReturn('foo', intMask);
checkReturn('faa', intMask);
checkType('aField', intMask);
checkReturn('bar', intMask);
checkReturn('baz', intMask);
checkReturn('tear', intMask);
}));
}