blob: ab08819696dbec50d35075b4da457caea5f7c008 [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.
// @dart = 2.7
// Test that the additional runtime type support is output to the right
// Files when using deferred loading.
import 'package:async_helper/async_helper.dart';
import 'constant_emission_test_helper.dart';
void main() {
runTest() async {
Map<String, Set<String>> expectedOutputUnits = {
'ConstructedConstant(C(x=IntConstant(1)))': {'main'},
'DeferredGlobalConstant(ConstructedConstant(C(x=IntConstant(1))))':
// With CFE constants, the references are inlined, so the constant
// only occurs in main.
{},
'ConstructedConstant(C(x=IntConstant(2)))': {'lib1'},
'DeferredGlobalConstant(ConstructedConstant(C(x=IntConstant(2))))': {
'lib1'
},
'ConstructedConstant(C(x=IntConstant(3)))': {'lib1'},
'ConstructedConstant(C(x=IntConstant(4)))': {'lib2'},
'DeferredGlobalConstant(ConstructedConstant(C(x=IntConstant(4))))': {
'lib2'
},
'ConstructedConstant(C(x=IntConstant(5)))': {'lib2'},
};
await run(
MEMORY_SOURCE_FILES,
const [
OutputUnitDescriptor('memory:lib1.dart', 'm1', 'lib1'),
OutputUnitDescriptor('memory:lib2.dart', 'm2', 'lib2'),
],
expectedOutputUnits);
}
asyncTest(() async {
print('--test from kernel------------------------------------------------');
await runTest();
});
}
// Make sure that deferred constants are not inlined into the main hunk.
const Map<String, String> MEMORY_SOURCE_FILES = const {
"main.dart": r"""
import 'c.dart';
import 'lib1.dart' deferred as l1;
const c1 = const C(1);
main() async {
print(c1.x);
await l1.loadLibrary();
l1.m1();
print(l1.c2);
}
""",
"lib1.dart": """
import 'c.dart';
import 'lib2.dart' deferred as l2;
const c2 = const C(2);
const c3 = const C(3);
m1() async {
print(c2);
print(c3);
await l2.loadLibrary();
l2.m2();
print(l2.c3);
print(l2.c4);
}
""",
"lib2.dart": """
import 'c.dart';
const c3 = const C(1);
const c4 = const C(4);
const c5 = const C(5);
m2() async {
print(c3);
print(c4);
print(c5);
}
""",
"c.dart": """
class C { const C(this.x); final x; }
""",
};