blob: d8ad1aca85056d56d5ef85ba3d794042de0afc7f [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 'dart:async';
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/elements/entities.dart';
import 'package:compiler/src/inferrer/typemasks/masks.dart';
import 'package:compiler/src/universe/selector.dart';
import 'package:compiler/src/world.dart';
import 'package:expect/expect.dart';
import 'type_test_helper.dart';
main() {
asyncTest(() async {
print('--test from kernel------------------------------------------------');
await runTest();
});
}
Future runTest() async {
var env = await TypeEnvironment.create("""
class A {
call() {}
}
class B {
}
class C extends B {
call() {}
}
main() {
(new A())();
new B();
(new C())();
localFunction() {}
() {};
}
""", testBackendWorld: true);
Map<String, String> expectedMap = const {
'A': '[exact=A]',
'B': '[exact=C]',
'C': '[exact=C]',
};
JClosedWorld closedWorld = env.jClosedWorld;
int closureCount = 0;
Selector callSelector = new Selector.callClosure(0);
closedWorld.classHierarchy.forEachStrictSubclassOf(
closedWorld.commonElements.objectClass, (ClassEntity cls) {
if (cls.library.canonicalUri.scheme != 'memory') return;
TypeMask mask = new TypeMask.nonNullSubclass(cls, closedWorld);
TypeMask receiverType = closedWorld.computeReceiverType(callSelector, mask);
if (cls.isClosure) {
// TODO(johnniwinther): Expect mask based on 'cls' when all synthesized
// call methods are registered.
String expected = '[empty]'; //'$mask';
Expect.equals(expected, '${receiverType}',
"Unexpected receiver type for $callSelector on $mask");
closureCount++;
} else {
String expected = expectedMap[cls.name];
Expect.equals(expected, '$receiverType',
"Unexpected receiver type for $callSelector on $mask");
}
});
Expect.equals(2, closureCount);
}