// Copyright (c) 2018, 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 import 'package:async_helper/async_helper.dart'; import 'package:compiler/src/commandline_options.dart'; import 'package:compiler/src/common_elements.dart'; import 'package:compiler/src/common/names.dart'; import 'package:compiler/src/compiler.dart'; import 'package:compiler/src/elements/entities.dart'; import 'package:compiler/src/inferrer/abstract_value_domain.dart'; import 'package:compiler/src/inferrer/typemasks/masks.dart'; import 'package:compiler/src/js_model/element_map.dart'; import 'package:compiler/src/js_model/js_world.dart'; import 'package:expect/expect.dart'; import 'package:kernel/ast.dart' as ir; import '../helpers/memory_compiler.dart'; const String source = ''' import 'package:expect/expect.dart' deferred as expect; main() { callLoadLibrary(); } callLoadLibrary() => expect.loadLibrary(); '''; main() async { asyncTest(() async { print('--test Dart 2 ----------------------------------------------------'); await runTest([], trust: false); print('--test Dart 2 --omit-implicit-checks -----------------------------'); await runTest([Flags.omitImplicitChecks]); }); } runTest(List options, {bool trust: true}) async { CompilationResult result = await runCompiler( memorySourceFiles: {'main.dart': source}, options: options); Expect.isTrue(result.isSuccess); Compiler compiler = result.compiler; JsClosedWorld closedWorld = compiler.backendClosedWorldForTesting; AbstractValueDomain abstractValueDomain = closedWorld.abstractValueDomain; ElementEnvironment elementEnvironment = closedWorld.elementEnvironment; LibraryEntity helperLibrary = elementEnvironment.lookupLibrary(Uris.dart__js_helper); FunctionEntity loadDeferredLibrary = elementEnvironment.lookupLibraryMember( helperLibrary, 'loadDeferredLibrary'); TypeMask typeMask; KernelToLocalsMap localsMap = compiler .globalInference.resultsForTesting.globalLocalsMap .getLocalsMap(loadDeferredLibrary); MemberDefinition definition = closedWorld.elementMap.getMemberDefinition(loadDeferredLibrary); ir.Procedure procedure = definition.node; typeMask = compiler.globalInference.resultsForTesting.resultOfParameter( localsMap .getLocalVariable(procedure.function.positionalParameters.first)); if (trust) { Expect.equals( abstractValueDomain.includeNull(abstractValueDomain.stringType), typeMask); } else { Expect.equals(abstractValueDomain.dynamicType, typeMask); } }