Files
sdk/tests/compiler/dart2js/codegen/expect_annotations_test.dart
T
Johnni Winther a1dd732ec6 Extract WorldBuilder results into an immutable BuiltWorld object
For resolution this is the KClosedWorld and for codegen this is the new
CodegenWorld object. This change removes the use of the world builders
after the world building has ended. It prepares for computing more of the
result data from the collected member usages.

Change-Id: I80032e3fc0e29179137b8c0380f09f68ab6fa03b
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/100540
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Sigmund Cherem <sigmund@google.com>
2019-04-26 07:52:58 +00:00

94 lines
3.3 KiB
Dart

// Copyright (c) 2015, 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 'package:compiler/src/compiler.dart';
import 'package:compiler/src/commandline_options.dart';
import 'package:compiler/src/elements/entities.dart';
import 'package:compiler/src/inferrer/typemasks/masks.dart';
import 'package:compiler/src/inferrer/types.dart';
import 'package:compiler/src/world.dart' show JClosedWorld;
import '../inference/type_mask_test_helper.dart';
import '../helpers/memory_compiler.dart';
const Map<String, String> MEMORY_SOURCE_FILES = const {
'main.dart': r"""
import 'package:expect/expect.dart';
int method(String arg) => arg.length;
@pragma('dart2js:assumeDynamic')
int methodAssumeDynamic(String arg) => arg.length;
@pragma('dart2js:noInline')
int methodNoInline(String arg) => arg.length;
void main(List<String> args) {
print(method(args[0]));
print(methodAssumeDynamic('foo'));
print(methodNoInline('bar'));
}
"""
};
main() {
asyncTest(() async {
await runTest();
});
}
runTest() async {
CompilationResult result = await runCompiler(
memorySourceFiles: MEMORY_SOURCE_FILES, options: [Flags.testMode]);
Compiler compiler = result.compiler;
JClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
Expect.isFalse(compiler.compilationFailed, 'Unsuccessful compilation');
void testTypeMatch(FunctionEntity function, TypeMask expectedParameterType,
TypeMask expectedReturnType, GlobalTypeInferenceResults results) {
closedWorld.elementEnvironment.forEachParameterAsLocal(
closedWorld.globalLocalsMap, function, (Local parameter) {
TypeMask type = results.resultOfParameter(parameter);
Expect.equals(
expectedParameterType, simplify(type, closedWorld), "$parameter");
});
if (expectedReturnType != null) {
TypeMask type = results.resultOfMember(function).returnType;
Expect.equals(
expectedReturnType, simplify(type, closedWorld), "$function");
}
}
void test(String name,
{bool expectNoInline: false,
TypeMask expectedParameterType: null,
TypeMask expectedReturnType: null,
bool expectAssumeDynamic: false}) {
LibraryEntity mainApp = closedWorld.elementEnvironment.mainLibrary;
FunctionEntity method =
closedWorld.elementEnvironment.lookupLibraryMember(mainApp, name);
Expect.isNotNull(method);
Expect.equals(
expectNoInline,
closedWorld.annotationsData.hasNoInline(method),
"Unexpected annotation of @pragma('dart2js:noInline') on '$method'.");
Expect.equals(
expectAssumeDynamic,
closedWorld.annotationsData.hasAssumeDynamic(method),
"Unexpected annotation of @pragma('dart2js:assumeDynamic') on "
"'$method'.");
GlobalTypeInferenceResults results =
compiler.globalInference.resultsForTesting;
if (expectAssumeDynamic) {
testTypeMatch(
method, closedWorld.abstractValueDomain.dynamicType, null, results);
}
}
test('method');
test('methodAssumeDynamic', expectAssumeDynamic: true);
test('methodNoInline', expectNoInline: true);
}