diff --git a/DEPS b/DEPS
index 318184f..442c05e 100644
--- a/DEPS
+++ b/DEPS
@@ -113,7 +113,7 @@
   "http_retry_rev": "845771af7bb5ab38ab740ce4a31f3b0c7680302b",
   "http_rev": "d5c678cd63c3e9c1d779a09acfa95b7e3af84665",
   "http_throttle_tag" : "1.0.2",
-  "icu_rev" : "79326efe26e5440f530963704c3c0ff965b3a4ac",
+  "icu_rev" : "81d656878ec611cb0b42d52c82e9dae93920d9ba",
   "idl_parser_rev": "5fb1ebf49d235b5a70c9f49047e83b0654031eb7",
   "intl_tag": "0.17.0-nullsafety",
   "jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index e6e7c2d..32821ea2 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -518,7 +518,6 @@
     default_warning_flags += [
       "-Wno-deprecated-declarations",  # crashpad
       "-Wno-ignored-pragma-optimize",  # icu, double-conversion
-      "-Wno-implicit-int-float-conversion",  # icu
       "-Wno-macro-redefined",
       "-Wno-microsoft-cast",
       "-Wno-microsoft-unqualified-friend",
diff --git a/pkg/_fe_analyzer_shared/pubspec.yaml b/pkg/_fe_analyzer_shared/pubspec.yaml
index 9d64fc8..c0066ca 100644
--- a/pkg/_fe_analyzer_shared/pubspec.yaml
+++ b/pkg/_fe_analyzer_shared/pubspec.yaml
@@ -1,5 +1,5 @@
 name: _fe_analyzer_shared
-version: 17.0.0
+version: 18.0.0
 description: Logic that is shared between the front_end and analyzer packages.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/_fe_analyzer_shared
 
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index 9a2ca7e..d44c693 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,6 +1,8 @@
-## 1.2.0-dev
+## 1.2.0
 * Deprecated all setters in API of AST. Use `parseString()` instead.
 * `AnalysisSession.getErrors()` does not return `null`, check its `state`.
+* Support for `aliasElement` and `aliasArguments` for aliases of
+  `InterfaceType`s and `TypeParameterType`s.
 
 ## 1.1.0
 * Deprecated `TypeProvider.futureType2()`, `iterableType2()`, etc.
diff --git a/pkg/analyzer/lib/src/dart/resolver/body_inference_context.dart b/pkg/analyzer/lib/src/dart/resolver/body_inference_context.dart
index e74356b..e043a3f 100644
--- a/pkg/analyzer/lib/src/dart/resolver/body_inference_context.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/body_inference_context.dart
@@ -14,10 +14,14 @@
   static const _key = 'BodyInferenceContext';
 
   final TypeSystemImpl _typeSystem;
-  final bool _isAsynchronous;
-  final bool _isGenerator;
+  final bool isAsynchronous;
+  final bool isGenerator;
 
-  /// The context type, computed from the imposed return type schema.
+  /// The imposed return type, from the typing context.
+  /// Might be `null` if an empty typing context.
+  final DartType? imposedType;
+
+  /// The context type, computed from [imposedType].
   /// Might be `null` if an empty typing context.
   final DartType? contextType;
 
@@ -35,6 +39,7 @@
       typeSystem: typeSystem,
       isAsynchronous: node.isAsynchronous,
       isGenerator: node.isGenerator,
+      imposedType: imposedType,
       contextType: contextType,
     );
     node.setProperty(_key, bodyContext);
@@ -44,12 +49,13 @@
 
   BodyInferenceContext._({
     required TypeSystemImpl typeSystem,
-    required bool isAsynchronous,
-    required bool isGenerator,
+    required this.isAsynchronous,
+    required this.isGenerator,
+    required this.imposedType,
     required this.contextType,
-  })   : _typeSystem = typeSystem,
-        _isAsynchronous = isAsynchronous,
-        _isGenerator = isGenerator;
+  }) : _typeSystem = typeSystem;
+
+  bool get isSynchronous => !isAsynchronous;
 
   TypeProvider get _typeProvider => _typeSystem.typeProvider;
 
@@ -58,7 +64,7 @@
       _returnTypes.add(_typeProvider.nullType);
     } else {
       var type = expression.typeOrThrow;
-      if (_isAsynchronous) {
+      if (isAsynchronous) {
         type = _typeSystem.flatten(type);
       }
       _returnTypes.add(type);
@@ -73,8 +79,8 @@
       return;
     }
 
-    if (_isGenerator) {
-      var requiredClass = _isAsynchronous
+    if (isGenerator) {
+      var requiredClass = isAsynchronous
           ? _typeProvider.streamElement
           : _typeProvider.iterableElement;
       var type = _argumentOf(expressionType, requiredClass);
@@ -93,14 +99,14 @@
 
     var clampedReturnedType = _clampToContextType(actualReturnedType);
 
-    if (_isGenerator) {
-      if (_isAsynchronous) {
+    if (isGenerator) {
+      if (isAsynchronous) {
         return _typeProvider.streamType(clampedReturnedType);
       } else {
         return _typeProvider.iterableType(clampedReturnedType);
       }
     } else {
-      if (_isAsynchronous) {
+      if (isAsynchronous) {
         return _typeProvider.futureType(
           _typeSystem.flatten(clampedReturnedType),
         );
@@ -122,7 +128,7 @@
     // `FutureOr<void>`, let `S` be `void`.
     if (_typeSystem.isNonNullableByDefault) {
       if (R.isVoid ||
-          _isAsynchronous &&
+          isAsynchronous &&
               R is InterfaceType &&
               R.isDartAsyncFutureOr &&
               R.typeArguments[0].isVoid) {
@@ -142,7 +148,7 @@
   DartType _computeActualReturnedType({
     required bool endOfBlockIsReachable,
   }) {
-    if (_isGenerator) {
+    if (isGenerator) {
       if (_returnTypes.isEmpty) {
         return DynamicTypeImpl.instance;
       }
diff --git a/pkg/analyzer/lib/src/dart/resolver/function_expression_invocation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/function_expression_invocation_resolver.dart
index 24ce9b9..6617ab2 100644
--- a/pkg/analyzer/lib/src/dart/resolver/function_expression_invocation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/function_expression_invocation_resolver.dart
@@ -43,7 +43,7 @@
       return;
     }
 
-    var receiverType = function.staticType;
+    var receiverType = function.typeOrThrow;
     if (receiverType is InterfaceType) {
       // Note: in this circumstance it's not necessary to call
       // `_nullableDereferenceVerifier.expression` because
@@ -53,6 +53,11 @@
       return;
     }
 
+    if (_checkForUseOfVoidResult(function, receiverType)) {
+      _unresolved(node, DynamicTypeImpl.instance);
+      return;
+    }
+
     _nullableDereferenceVerifier.expression(function,
         errorCode: CompileTimeErrorCode.UNCHECKED_INVOCATION_OF_NULLABLE_VALUE);
 
@@ -62,6 +67,8 @@
     }
 
     if (identical(receiverType, NeverTypeImpl.instance)) {
+      _errorReporter.reportErrorForNode(
+          HintCode.RECEIVER_OF_TYPE_NEVER, function);
       _unresolved(node, NeverTypeImpl.instance);
       return;
     }
@@ -69,6 +76,30 @@
     _unresolved(node, DynamicTypeImpl.instance);
   }
 
+  /// Check for situations where the result of a method or function is used,
+  /// when it returns 'void'. Or, in rare cases, when other types of expressions
+  /// are void, such as identifiers.
+  ///
+  /// See [StaticWarningCode.USE_OF_VOID_RESULT].
+  ///
+  /// TODO(scheglov) this is duplicate
+  bool _checkForUseOfVoidResult(Expression expression, DartType type) {
+    if (!identical(type, VoidTypeImpl.instance)) {
+      return false;
+    }
+
+    if (expression is MethodInvocation) {
+      SimpleIdentifier methodName = expression.methodName;
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.USE_OF_VOID_RESULT, methodName, []);
+    } else {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.USE_OF_VOID_RESULT, expression, []);
+    }
+
+    return true;
+  }
+
   void _resolve(FunctionExpressionInvocationImpl node, FunctionType rawType) {
     _inferenceHelper.resolveFunctionExpressionInvocation(
       node: node,
@@ -130,7 +161,22 @@
     );
     var callElement = result.getter;
 
-    if (callElement == null || callElement.kind != ElementKind.METHOD) {
+    if (callElement == null) {
+      if (result.needsGetterError) {
+        _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION,
+          function,
+        );
+      }
+      _unresolved(node, DynamicTypeImpl.instance);
+      return;
+    }
+
+    if (callElement.kind != ElementKind.METHOD) {
+      _errorReporter.reportErrorForNode(
+        CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION,
+        function,
+      );
       _unresolved(node, DynamicTypeImpl.instance);
       return;
     }
diff --git a/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart
index c241eb0..4238870 100644
--- a/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart
@@ -3,13 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
+import 'package:analyzer/src/dart/resolver/body_inference_context.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 
@@ -21,8 +21,6 @@
     required ResolverVisitor resolver,
   }) : _resolver = resolver;
 
-  ExecutableElement get _enclosingFunction => _resolver.enclosingFunction!;
-
   ErrorReporter get _errorReporter => _resolver.errorReporter;
 
   TypeProvider get _typeProvider => _resolver.typeProvider;
@@ -30,8 +28,9 @@
   TypeSystemImpl get _typeSystem => _resolver.typeSystem;
 
   void resolve(YieldStatement node) {
-    if (_enclosingFunction.isGenerator) {
-      _resolve_generator(node);
+    var bodyContext = _resolver.inferenceContext.bodyContext;
+    if (bodyContext != null && bodyContext.isGenerator) {
+      _resolve_generator(bodyContext, node);
     } else {
       _resolve_notGenerator(node);
     }
@@ -69,26 +68,30 @@
   /// return type of a generator function.
   ///
   /// This method should only be called in generator functions.
-  void _checkForYieldOfInvalidType(YieldStatement node, bool isYieldEach) {
-    var declaredReturnType = _enclosingFunction.returnType;
-
+  void _checkForYieldOfInvalidType(
+    BodyInferenceContext bodyContext,
+    YieldStatement node,
+    bool isYieldEach,
+  ) {
     var expression = node.expression;
     var expressionType = expression.typeOrThrow;
 
     DartType impliedReturnType;
     if (isYieldEach) {
       impliedReturnType = expressionType;
-    } else if (_enclosingFunction.isSynchronous) {
+    } else if (bodyContext.isSynchronous) {
       impliedReturnType = _typeProvider.iterableType(expressionType);
     } else {
       impliedReturnType = _typeProvider.streamType(expressionType);
     }
 
-    if (!_typeSystem.isAssignableTo(impliedReturnType, declaredReturnType)) {
+    var imposedReturnType = bodyContext.imposedType;
+    if (imposedReturnType != null &&
+        !_typeSystem.isAssignableTo(impliedReturnType, imposedReturnType)) {
       _errorReporter.reportErrorForNode(
         CompileTimeErrorCode.YIELD_OF_INVALID_TYPE,
         expression,
-        [impliedReturnType, declaredReturnType],
+        [impliedReturnType, imposedReturnType],
       );
       return;
     }
@@ -98,7 +101,7 @@
       // also check that the implied return type is assignable to generic
       // Iterable/Stream.
       DartType requiredReturnType;
-      if (_enclosingFunction.isSynchronous) {
+      if (bodyContext.isSynchronous) {
         requiredReturnType = _typeProvider.iterableDynamicType;
       } else {
         requiredReturnType = _typeProvider.streamDynamicType;
@@ -114,21 +117,11 @@
     }
   }
 
-  void _computeElementType(YieldStatement node) {
-    var elementType = _resolver.inferenceContext.bodyContext?.contextType;
-    if (elementType != null) {
-      var contextType = elementType;
-      if (node.star != null) {
-        contextType = _enclosingFunction.isSynchronous
-            ? _typeProvider.iterableType(elementType)
-            : _typeProvider.streamType(elementType);
-      }
-      InferenceContext.setType(node.expression, contextType);
-    }
-  }
-
-  void _resolve_generator(YieldStatement node) {
-    _computeElementType(node);
+  void _resolve_generator(
+    BodyInferenceContext bodyContext,
+    YieldStatement node,
+  ) {
+    _setContextType(bodyContext, node);
 
     node.expression.accept(_resolver);
 
@@ -138,9 +131,9 @@
               .UNCHECKED_USE_OF_NULLABLE_VALUE_IN_YIELD_EACH);
     }
 
-    _resolver.inferenceContext.bodyContext?.addYield(node);
+    bodyContext.addYield(node);
 
-    _checkForYieldOfInvalidType(node, node.star != null);
+    _checkForYieldOfInvalidType(bodyContext, node, node.star != null);
     _checkForUseOfVoidResult(node.expression);
   }
 
@@ -156,4 +149,20 @@
 
     _checkForUseOfVoidResult(node.expression);
   }
+
+  void _setContextType(
+    BodyInferenceContext bodyContext,
+    YieldStatement node,
+  ) {
+    var elementType = bodyContext.contextType;
+    if (elementType != null) {
+      var contextType = elementType;
+      if (node.star != null) {
+        contextType = bodyContext.isSynchronous
+            ? _typeProvider.iterableType(elementType)
+            : _typeProvider.streamType(elementType);
+      }
+      InferenceContext.setType(node.expression, contextType);
+    }
+  }
 }
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 071f068..11f7424 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -765,14 +765,7 @@
     }
 
     DartType expressionType = functionExpression.typeOrThrow;
-    if (!_checkForUseOfVoidResult(functionExpression) &&
-        !_checkForUseOfNever(functionExpression) &&
-        node.staticElement == null &&
-        !_isFunctionType(expressionType)) {
-      _errorReporter.reportErrorForNode(
-          CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION,
-          functionExpression);
-    } else if (expressionType is FunctionType) {
+    if (expressionType is FunctionType) {
       _typeArgumentsVerifier.checkFunctionExpressionInvocation(node);
     }
     _requiredParametersVerifier.visitFunctionExpressionInvocation(node);
@@ -4502,24 +4495,6 @@
     }
   }
 
-  /// While in general Never is a sort of placehold type that should be usable
-  /// anywhere, we explicitly bar it from some dubious syntactic locations such
-  /// as calling a method on Never, which in practice would look something like
-  /// `(throw x).toString()` which is clearly something between a mistake and
-  /// dead code.
-  ///
-  /// See [StaticWarningCode.RECEIVER_OF_TYPE_NEVER].
-  bool _checkForUseOfNever(Expression expression) {
-    if (!identical(expression.staticType, NeverTypeImpl.instance)) {
-      return false;
-    }
-
-    _errorReporter.reportErrorForNode(
-        HintCode.RECEIVER_OF_TYPE_NEVER, expression);
-
-    return true;
-  }
-
   /// Check for situations where the result of a method or function is used,
   /// when it returns 'void'. Or, in rare cases, when other types of expressions
   /// are void, such as identifiers.
@@ -5220,19 +5195,6 @@
     return false;
   }
 
-  bool _isFunctionType(DartType type) {
-    if (type.isDynamic || type.isDartCoreNull) {
-      return true;
-    } else if (type is FunctionType || type.isDartCoreFunction) {
-      return true;
-    } else if (type is InterfaceType) {
-      var callMethod =
-          type.lookUpMethod2(FunctionElement.CALL_METHOD_NAME, _currentLibrary);
-      return callMethod != null;
-    }
-    return false;
-  }
-
   /// Return `true` if the given [identifier] is in a location where it is
   /// allowed to resolve to a static member of a supertype.
   bool _isUnqualifiedReferenceToNonLocalStaticMemberAllowed(
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index a6d0a3d..5be43d5 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 1.2.0-dev
+version: 1.2.0
 description: This package provides a library that performs static analysis of Dart code.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/analyzer
 
@@ -7,7 +7,7 @@
   sdk: '>=2.12.0-0 <3.0.0'
 
 dependencies:
-  _fe_analyzer_shared: ^17.0.0
+  _fe_analyzer_shared: ^18.0.0
   cli_util: ^0.3.0
   collection: ^1.15.0
   convert: ^3.0.0
diff --git a/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart b/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
index b1bc073..237b1d8 100644
--- a/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
@@ -1155,9 +1155,6 @@
   c.foo();
 }
 ''', [
-      if (typeToStringWithNullability)
-        error(
-            CompileTimeErrorCode.UNCHECKED_INVOCATION_OF_NULLABLE_VALUE, 61, 5),
       error(CompileTimeErrorCode.USE_OF_VOID_RESULT, 61, 5),
     ]);
 
@@ -1179,9 +1176,6 @@
   foo();
 }
 ''', [
-      if (typeToStringWithNullability)
-        error(
-            CompileTimeErrorCode.UNCHECKED_INVOCATION_OF_NULLABLE_VALUE, 23, 3),
       error(CompileTimeErrorCode.USE_OF_VOID_RESULT, 23, 3),
     ]);
 
@@ -1203,9 +1197,6 @@
   foo()();
 }
 ''', [
-      if (typeToStringWithNullability)
-        error(
-            CompileTimeErrorCode.UNCHECKED_INVOCATION_OF_NULLABLE_VALUE, 26, 5),
       error(CompileTimeErrorCode.USE_OF_VOID_RESULT, 26, 3),
     ]);
     assertMethodInvocation(
@@ -1223,9 +1214,6 @@
   foo();
 }
 ''', [
-      if (typeToStringWithNullability)
-        error(
-            CompileTimeErrorCode.UNCHECKED_INVOCATION_OF_NULLABLE_VALUE, 22, 3),
       error(CompileTimeErrorCode.USE_OF_VOID_RESULT, 22, 3),
     ]);
 
diff --git a/pkg/analyzer/test/src/diagnostics/ambiguous_extension_member_access_test.dart b/pkg/analyzer/test/src/diagnostics/ambiguous_extension_member_access_test.dart
index eb82661..424912e 100644
--- a/pkg/analyzer/test/src/diagnostics/ambiguous_extension_member_access_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/ambiguous_extension_member_access_test.dart
@@ -30,7 +30,6 @@
 int f(A a) => a();
 ''', [
       error(CompileTimeErrorCode.AMBIGUOUS_EXTENSION_MEMBER_ACCESS, 110, 1),
-      error(CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 110, 1),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/invocation_of_non_function_expression_test.dart b/pkg/analyzer/test/src/diagnostics/invocation_of_non_function_expression_test.dart
index 1a329c0..77ac7e9 100644
--- a/pkg/analyzer/test/src/diagnostics/invocation_of_non_function_expression_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invocation_of_non_function_expression_test.dart
@@ -15,13 +15,35 @@
 
 @reflectiveTest
 class InvocationOfNonFunctionExpressionTest extends PubPackageResolutionTest {
-  test_invocationOfNonFunctionExpression_literal() async {
+  test_literal_int() async {
     await assertErrorsInCode(r'''
-f() {
+void f() {
   3(5);
 }
 ''', [
-      error(CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 8, 1),
+      error(CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 13, 1),
+    ]);
+  }
+
+  test_literal_null() async {
+    await assertErrorsInCode(r'''
+// @dart = 2.9
+void f() {
+  null();
+}
+''', [
+      error(CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 28, 4),
+    ]);
+  }
+
+  test_type_Null() async {
+    await assertErrorsInCode(r'''
+// @dart = 2.9
+void f(Null a) {
+  a();
+}
+''', [
+      error(CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 34, 1),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart b/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart
index 7ca7f8d..cd56869 100644
--- a/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart
@@ -832,6 +832,17 @@
     ]);
   }
 
+  test_invoke_dynamicFunctionType_nullable2() async {
+    await assertErrorsInCode(r'''
+void f<F extends Function>(List<F?> funcList) {
+  funcList[0]();
+}
+''', [
+      error(
+          CompileTimeErrorCode.UNCHECKED_INVOCATION_OF_NULLABLE_VALUE, 50, 11),
+    ]);
+  }
+
   test_invoke_nonNullable() async {
     await assertNoErrorsInCode(r'''
 m() {
diff --git a/pkg/analyzer/test/src/diagnostics/yield_of_invalid_type_test.dart b/pkg/analyzer/test/src/diagnostics/yield_of_invalid_type_test.dart
index a107230..a5453bd 100644
--- a/pkg/analyzer/test/src/diagnostics/yield_of_invalid_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/yield_of_invalid_type_test.dart
@@ -86,6 +86,19 @@
     ]);
   }
 
+  test_none_asyncStar_int_to_streamString_functionExpression() async {
+    await assertErrorsInCode('''
+void f() {
+  // ignore:unused_local_variable
+  Stream<String> Function() v = () async* {
+    yield 1;
+  };
+}
+''', [
+      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 99, 1),
+    ]);
+  }
+
   test_none_asyncStar_int_to_untyped() async {
     await assertNoErrorsInCode('''
 f() async* {
@@ -152,6 +165,19 @@
     ]);
   }
 
+  test_none_syncStar_int_to_iterableString_functionExpression() async {
+    await assertErrorsInCode('''
+void f() {
+  // ignore:unused_local_variable
+  Iterable<String> Function() v = () sync* {
+    yield 1;
+  };
+}
+''', [
+      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 100, 1),
+    ]);
+  }
+
   test_none_syncStar_int_to_stream() async {
     await assertErrorsInCode('''
 Stream<int> f() sync* {
diff --git a/pkg/dev_compiler/lib/src/compiler/module_builder.dart b/pkg/dev_compiler/lib/src/compiler/module_builder.dart
index 04b15cc..922b17f 100644
--- a/pkg/dev_compiler/lib/src/compiler/module_builder.dart
+++ b/pkg/dev_compiler/lib/src/compiler/module_builder.dart
@@ -109,6 +109,9 @@
 Fun transformFunctionModuleFormat(
     List<ModuleItem> items, Fun function, ModuleFormat format) {
   switch (format) {
+    case ModuleFormat.ddc:
+      // Legacy format always generates output compatible with single file mode.
+      return DdcModuleBuilder().buildFunctionWithImports(items, function);
     case ModuleFormat.amd:
       return AmdModuleBuilder().buildFunctionWithImports(items, function);
     default:
@@ -174,55 +177,113 @@
 /// Generates modules for with our DDC `dart_library.js` loading mechanism.
 // TODO(jmesserly): remove this and replace with something that interoperates.
 class DdcModuleBuilder extends _ModuleBuilder {
-  Program build(Program module) {
-    // Collect imports/exports/statements.
-    visitProgram(module);
+  /// Build a module variable definition for [import].
+  ///
+  /// Used to load modules referenced in the expression during expression
+  /// evaluation.
+  static Statement buildLoadModule(
+          Identifier moduleVar, ImportDeclaration import) =>
+      js.statement(
+          'const # = dart_library.import(#);', [moduleVar, import.from]);
 
-    // Build import parameters.
-    var exportsVar = TemporaryId('exports');
-    var parameters = <TemporaryId>[exportsVar];
-    var importNames = <Expression>[];
-    var importStatements = <Statement>[];
-    for (var import in imports) {
-      importNames.add(import.from);
-      // TODO(jmesserly): we could use destructuring here.
-      var moduleVar =
-          TemporaryId(pathToJSIdentifier(import.from.valueWithoutQuotes));
-      parameters.add(moduleVar);
-      for (var importName in import.namedImports) {
-        assert(!importName
-            .isStar); // import * not supported in ddc format modules.
-        var asName = importName.asName ?? importName.name;
-        var fromName = importName.name.name;
-        // Load non-SDK modules on demand (i.e., deferred).
-        if (import.from.valueWithoutQuotes != dartSdkModule) {
-          importStatements.add(js.statement(
-              'let # = dart_library.defer(#, #, function (mod, lib) {'
-              '  # = mod;'
-              '  # = lib;'
-              '});',
-              [asName, moduleVar, js.string(fromName), moduleVar, asName]));
-        } else {
-          importStatements.add(js.statement(
-              'const # = #.#', [asName, moduleVar, importName.name.name]));
-        }
+  /// Build library variable definitions for all libraries from [import].
+  static List<Statement> buildImports(
+      Identifier moduleVar, ImportDeclaration import, bool deferModules) {
+    var items = <Statement>[];
+
+    for (var importName in import.namedImports) {
+      // import * is not emitted by the compiler, so we don't handle it here.
+      assert(!importName.isStar);
+      var asName = importName.asName ?? importName.name;
+      var fromName = importName.name.name;
+      // Load non-SDK modules on demand (i.e., deferred).
+      if (deferModules && import.from.valueWithoutQuotes != dartSdkModule) {
+        items.add(js.statement(
+            'let # = dart_library.defer(#, #, function (mod, lib) {'
+            '  # = mod;'
+            '  # = lib;'
+            '});',
+            [asName, moduleVar, js.string(fromName), moduleVar, asName]));
+      } else {
+        items.add(js.statement('const # = #.#', [asName, moduleVar, fromName]));
       }
     }
-    statements.insertAll(0, importStatements);
+    return items;
+  }
+
+  /// Build statements for [exports].
+  static List<Statement> buildExports(
+      Identifier exportsVar, List<ExportDeclaration> exports) {
+    var items = <Statement>[];
 
     if (exports.isNotEmpty) {
-      statements.add(js.comment('Exports:'));
+      items.add(js.comment('Exports:'));
       // TODO(jmesserly): make these immutable in JS?
       for (var export in exports) {
         var names = export.exportedNames;
         assert(names != null); // export * not supported in ddc modules.
         for (var name in names) {
           var alias = name.asName ?? name.name;
-          statements.add(
+          items.add(
               js.statement('#.# = #;', [exportsVar, alias.name, name.name]));
         }
       }
     }
+    return items;
+  }
+
+  /// Build function body with all necessary imports included.
+  ///
+  /// Used for the top level synthetic function generated during expression
+  /// compilation, in order to include all the context needed for evaluation
+  /// inside it.
+  ///
+  /// Returns a new function that combines all statements from tranformed
+  /// imports from [items] and the body of the [function].
+  Fun buildFunctionWithImports(List<ModuleItem> items, Fun function) {
+    clear();
+    visitModuleItems(items);
+
+    var moduleImports = _collectModuleImports(imports);
+    var importStatements = <Statement>[];
+
+    for (var p in moduleImports) {
+      var moduleVar = p.key;
+      var import = p.value;
+      importStatements.add(buildLoadModule(moduleVar, import));
+      importStatements.addAll(buildImports(moduleVar, import, false));
+    }
+
+    return Fun(
+      function.params,
+      Block([...importStatements, ...statements, ...function.body.statements]),
+    );
+  }
+
+  Program build(Program module) {
+    // Collect imports/exports/statements.
+    visitProgram(module);
+
+    var exportsVar = TemporaryId('exports');
+    var parameters = <Identifier>[exportsVar];
+    var importNames = <Expression>[];
+
+    var moduleImports = _collectModuleImports(imports);
+    var importStatements = <Statement>[];
+
+    for (var p in moduleImports) {
+      var moduleVar = p.key;
+      var import = p.value;
+      importNames.add(import.from);
+      parameters.add(moduleVar);
+      importStatements.addAll(buildImports(moduleVar, import, true));
+    }
+
+    // Prepend import statetements.
+    statements.insertAll(0, importStatements);
+
+    // Append export statements.
+    statements.addAll(buildExports(exportsVar, exports));
 
     var resultModule = NamedFunction(
         loadFunctionIdentifier(module.name),
@@ -293,6 +354,9 @@
   AmdModuleBuilder();
 
   /// Build a module variable definition for [import].
+  ///
+  /// Used to load modules referenced in the expression during expression
+  /// evaluation.
   static Statement buildLoadModule(
           Identifier moduleVar, ImportDeclaration import) =>
       js.statement('const # = require(#);', [moduleVar, import.from]);
@@ -312,20 +376,6 @@
     return items;
   }
 
-  /// Group libraries from [imports] by modules.
-  static Map<Identifier, ImportDeclaration> _collectModuleImports(
-      List<ImportDeclaration> imports) {
-    var result = <Identifier, ImportDeclaration>{};
-    for (var import in imports) {
-      // TODO(jmesserly): we could use destructuring once Atom supports it.
-      var moduleVar =
-          TemporaryId(pathToJSIdentifier(import.from.valueWithoutQuotes));
-
-      result[moduleVar] = import;
-    }
-    return result;
-  }
-
   /// Build statements for [exports].
   static List<Statement> buildExports(List<ExportDeclaration> exports) {
     var items = <Statement>[];
@@ -349,7 +399,7 @@
 
   /// Build function body with all necessary imports included.
   ///
-  /// Used for the top level syntetic function generated during expression
+  /// Used for the top level synthetic function generated during expression
   /// compilation, in order to include all the context needed for evaluation
   /// inside it.
   ///
@@ -362,10 +412,12 @@
     var moduleImports = _collectModuleImports(imports);
     var importStatements = <Statement>[];
 
-    moduleImports.forEach((moduleVar, import) {
+    for (var p in moduleImports) {
+      var moduleVar = p.key;
+      var import = p.value;
       importStatements.add(buildLoadModule(moduleVar, import));
       importStatements.addAll(buildImports(moduleVar, import));
-    });
+    }
 
     return Fun(
       function.params,
@@ -379,14 +431,16 @@
 
     var moduleImports = _collectModuleImports(imports);
     var importStatements = <Statement>[];
+    var fnParams = <Identifier>[];
+    var dependencies = <LiteralString>[];
 
-    var fnParams = moduleImports.keys.toList();
-    var dependencies =
-        moduleImports.values.map((import) => import.from).toList();
-
-    moduleImports.forEach((moduleVar, import) {
+    for (var p in moduleImports) {
+      var moduleVar = p.key;
+      var import = p.value;
+      fnParams.add(moduleVar);
+      dependencies.add(import.from);
       importStatements.addAll(buildImports(moduleVar, import));
-    });
+    }
 
     // Prepend import statetements.
     statements.insertAll(0, importStatements);
@@ -444,3 +498,17 @@
 
 // Replacement string for path separators (i.e., '/', '\', '..').
 final encodedSeparator = '__';
+
+/// Group libraries from [imports] by modules.
+List<MapEntry<Identifier, ImportDeclaration>> _collectModuleImports(
+    List<ImportDeclaration> imports) {
+  var result = <MapEntry<Identifier, ImportDeclaration>>[];
+  for (var import in imports) {
+    // TODO(jmesserly): we could use destructuring once Atom supports it.
+    var moduleVar =
+        TemporaryId(pathToJSIdentifier(import.from.valueWithoutQuotes));
+
+    result.add(MapEntry<Identifier, ImportDeclaration>(moduleVar, import));
+  }
+  return result;
+}
diff --git a/pkg/dev_compiler/test/expression_compiler/expression_compiler_test.dart b/pkg/dev_compiler/test/expression_compiler/expression_compiler_test.dart
index bfec31c..993d2aa 100644
--- a/pkg/dev_compiler/test/expression_compiler/expression_compiler_test.dart
+++ b/pkg/dev_compiler/test/expression_compiler/expression_compiler_test.dart
@@ -89,6 +89,17 @@
       errors.addAll(m.plainTextFormatted);
     };
   }
+
+  String get loadModule {
+    switch (moduleFormat) {
+      case ModuleFormat.amd:
+        return 'require';
+      case ModuleFormat.ddc:
+        return 'dart_library.import';
+      default:
+        throw UnsupportedError('Module format: $moduleFormat');
+    }
+  }
 }
 
 /// Convenience class describing JavaScript module
@@ -122,7 +133,7 @@
 
   @override
   String toString() =>
-      'Name: $name, File: $file, Package: $package, path: $path';
+      'Name: \$name, File: \$file, Package: \$package, path: \$path';
 }
 
 class TestCompilationResult {
@@ -156,7 +167,8 @@
     var compilerOptions = SharedCompilerOptions(
         replCompile: true,
         moduleName: moduleName,
-        soundNullSafety: setup.soundNullSafety);
+        soundNullSafety: setup.soundNullSafety,
+        moduleFormats: [setup.moduleFormat]);
     var coreTypes = compiler.getCoreTypes();
 
     final importToSummary = Map<Library, Component>.identity();
@@ -176,7 +188,7 @@
           allowKeywordsInProperties: true, allowSingleLineIfStatements: true);
       var printer = SimpleJavaScriptPrintingContext();
 
-      var tree = transformModuleFormat(ModuleFormat.amd, moduleTree);
+      var tree = transformModuleFormat(setup.moduleFormat, moduleTree);
       tree.accept(Printer(opts, printer, localNamer: TemporaryNamer(tree)));
       var printed = printer.getText();
       debugPrint(printed);
@@ -311,105 +323,185 @@
 }
 
 void main() {
-  group('Unsound null safety:', () {
-    var options = SetupCompilerOptions(soundNullSafety: false);
+  for (var moduleFormat in [ModuleFormat.amd, ModuleFormat.ddc]) {
+    group('Module format: $moduleFormat', () {
+      group('Unsound null safety:', () {
+        var options = SetupCompilerOptions(
+            soundNullSafety: false, moduleFormat: moduleFormat);
 
-    group('Expression compiler extension symbols tests', () {
-      var source = '''
-        ${options.dartLangComment}
-
-        main() {
-          List<int> list = {};
-          list.add(0);
-          /* evaluation placeholder */
-        }
-        ''';
-
-      TestDriver driver;
-
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
-
-      tearDown(() {
-        driver.delete();
-      });
-
-      test('extension symbol used in original compilation', () async {
-        await driver.check(
-            scope: <String, String>{'list': 'list'},
-            expression: 'list.add(1)',
-            expectedResult: r'''
-            (function(list) {
-              const dart_sdk = require('dart_sdk');
-              const dartx = dart_sdk.dartx;
-              var $add = dartx.add;
-              var S = {$add: dartx.add};
-              return list[$add](1);
-            }(
-              list
-            ))
-            ''');
-      });
-
-      test('extension symbol used only in expression compilation', () async {
-        await driver.check(
-            scope: <String, String>{'list': 'list'},
-            expression: 'list.first',
-            expectedResult: r'''
-            (function(list) {
-              const dart_sdk = require('dart_sdk');
-              const dartx = dart_sdk.dartx;
-              var S = {$first: dartx.first};
-              return list[S.$first];
-            }(
-              list
-            ))
-            ''');
-      });
-    });
-
-    group('Expression compiler scope collection tests', () {
-      var source = '''
-        ${options.dartLangComment}
-
-        class C {
-          C(int this.field);
-
-          int methodFieldAccess(int x) {
-            var inScope = 1;
-            {
-              var innerInScope = global + staticField + field;
-              /* evaluation placeholder */
-              print(innerInScope);
-              var innerNotInScope = 2;
-            }
-            var notInScope = 3;
+        group('Expression compiler import tests', () {
+          var source = '''
+          ${options.dartLangComment}
+          import 'dart:io' show Directory;
+          import 'dart:io' as p;
+          import 'dart:convert' as p;
+          
+          main() {
+            print(Directory.systemTemp);
+            print(p.Directory.systemTemp);
+            print(p.utf.decoder);
           }
 
-          static int staticField = 0;
-          int field;
-        }
+          void foo() {
+            /* evaluation placeholder */
+          }
+          ''';
 
-        int global = 42;
-        main() => 0;
-        ''';
+          TestDriver driver;
 
-      TestDriver driver;
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
 
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
+          tearDown(() {
+            driver.delete();
+          });
 
-      tearDown(() {
-        driver.delete();
-      });
+          test('expression referencing unnamed import', () async {
+            await driver.check(
+                scope: <String, String>{},
+                expression: 'Directory.systemTemp',
+                expectedResult: '''
+            (function() {
+              const dart_sdk = ${options.loadModule}(\'dart_sdk\');
+              const io = dart_sdk.io;
+              return io.Directory.systemTemp;
+            }(
+              
+            ))
+            ''');
+          });
 
-      test('local in scope', () async {
-        await driver.check(
-            scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
-            expression: 'inScope',
-            expectedResult: '''
+          test('expression referencing named import', () async {
+            await driver.check(
+                scope: <String, String>{},
+                expression: 'p.Directory.systemTemp',
+                expectedResult: '''
+            (function() {
+              const dart_sdk = ${options.loadModule}(\'dart_sdk\');
+              const io = dart_sdk.io;
+              return io.Directory.systemTemp;
+            }(
+              
+            ))
+            ''');
+          });
+
+          test(
+              'expression referencing another library with the same named import',
+              () async {
+            await driver.check(
+                scope: <String, String>{},
+                expression: 'p.utf8.decoder',
+                expectedResult: '''
+            (function() {
+              const dart_sdk = ${options.loadModule}(\'dart_sdk\');
+              const convert = dart_sdk.convert;
+              return convert.utf8.decoder;
+            }(
+              
+            ))
+            ''');
+          });
+        });
+
+        group('Expression compiler extension symbols tests', () {
+          var source = '''
+          ${options.dartLangComment}
+
+          main() {
+            List<int> list = {};
+            list.add(0);
+            /* evaluation placeholder */
+          }
+          ''';
+
+          TestDriver driver;
+
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
+
+          tearDown(() {
+            driver.delete();
+          });
+
+          test('extension symbol used in original compilation', () async {
+            await driver.check(
+                scope: <String, String>{'list': 'list'},
+                expression: 'list.add(1)',
+                expectedResult: '''
+            (function(list) {
+              const dart_sdk = ${options.loadModule}('dart_sdk');
+              const dartx = dart_sdk.dartx;
+              var \$add = dartx.add;
+              var S = {\$add: dartx.add};
+              return list[\$add](1);
+            }(
+              list
+            ))
+            ''');
+          });
+
+          test('extension symbol used only in expression compilation',
+              () async {
+            await driver.check(
+                scope: <String, String>{'list': 'list'},
+                expression: 'list.first',
+                expectedResult: '''
+            (function(list) {
+              const dart_sdk = ${options.loadModule}('dart_sdk');
+              const dartx = dart_sdk.dartx;
+              var S = {\$first: dartx.first};
+              return list[S.\$first];
+            }(
+              list
+            ))
+            ''');
+          });
+        });
+
+        group('Expression compiler scope collection tests', () {
+          var source = '''
+          ${options.dartLangComment}
+
+          class C {
+            C(int this.field);
+
+            int methodFieldAccess(int x) {
+              var inScope = 1;
+              {
+                var innerInScope = global + staticField + field;
+                /* evaluation placeholder */
+                print(innerInScope);
+                var innerNotInScope = 2;
+              }
+              var notInScope = 3;
+            }
+
+            static int staticField = 0;
+            int field;
+          }
+
+          int global = 42;
+          main() => 0;
+          ''';
+
+          TestDriver driver;
+
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
+
+          tearDown(() {
+            driver.delete();
+          });
+
+          test('local in scope', () async {
+            await driver.check(
+                scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
+                expression: 'inScope',
+                expectedResult: '''
             (function(inScope, innerInScope) {
               return inScope;
             }.bind(this)(
@@ -417,13 +509,13 @@
               0
             ))
             ''');
-      });
+          });
 
-      test('local in inner scope', () async {
-        await driver.check(
-            scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
-            expression: 'innerInScope',
-            expectedResult: '''
+          test('local in inner scope', () async {
+            await driver.check(
+                scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
+                expression: 'innerInScope',
+                expectedResult: '''
             (function(inScope, innerInScope) {
               return innerInScope;
             }.bind(this)(
@@ -431,45 +523,45 @@
               0
             ))
             ''');
-      });
+          });
 
-      test('global in scope', () async {
-        await driver.check(
-            scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
-            expression: 'global',
-            expectedResult: r'''
+          test('global in scope', () async {
+            await driver.check(
+                scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
+                expression: 'global',
+                expectedResult: '''
             (function(inScope, innerInScope) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return foo.global;
             }.bind(this)(
               1,
               0
             ))
             ''');
-      });
+          });
 
-      test('static field in scope', () async {
-        await driver.check(
-            scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
-            expression: 'staticField',
-            expectedResult: r'''
+          test('static field in scope', () async {
+            await driver.check(
+                scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
+                expression: 'staticField',
+                expectedResult: '''
             (function(inScope, innerInScope) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return foo.C.staticField;
             }.bind(this)(
               1,
               0
             ))
             ''');
-      });
+          });
 
-      test('field in scope', () async {
-        await driver.check(
-            scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
-            expression: 'field',
-            expectedResult: '''
+          test('field in scope', () async {
+            await driver.check(
+                scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
+                expression: 'field',
+                expectedResult: '''
             (function(inScope, innerInScope) {
               return this.field;
             }.bind(this)(
@@ -477,137 +569,137 @@
               0
             ))
             ''');
-      });
+          });
 
-      test('local not in scope', () async {
-        await driver.check(
-            scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
-            expression: 'notInScope',
-            expectedError:
-                "Error: The getter 'notInScope' isn't defined for the class 'C'.");
-      });
+          test('local not in scope', () async {
+            await driver.check(
+                scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
+                expression: 'notInScope',
+                expectedError:
+                    "Error: The getter 'notInScope' isn't defined for the class 'C'.");
+          });
 
-      test('local not in inner scope', () async {
-        await driver.check(
-            scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
-            expression: 'innerNotInScope',
-            expectedError:
-                "Error: The getter 'innerNotInScope' isn't defined for the class 'C'.");
-      });
-    });
+          test('local not in inner scope', () async {
+            await driver.check(
+                scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
+                expression: 'innerNotInScope',
+                expectedError:
+                    "Error: The getter 'innerNotInScope' isn't defined for the class 'C'.");
+          });
+        });
 
-    group('Expression compiler tests in extension method:', () {
-      var source = '''
-        ${options.dartLangComment}
-        extension NumberParsing on String {
-          int parseInt() {
-            var ret = int.parse(this);
-            /* evaluation placeholder */
-            return ret;
+        group('Expression compiler tests in extension method:', () {
+          var source = '''
+          ${options.dartLangComment}
+          extension NumberParsing on String {
+            int parseInt() {
+              var ret = int.parse(this);
+              /* evaluation placeholder */
+              return ret;
+            }
           }
-        }
-        main() => 0;
-      ''';
+          main() => 0;
+          ''';
 
-      TestDriver driver;
+          TestDriver driver;
 
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
 
-      tearDown(() {
-        driver.delete();
-      });
+          tearDown(() {
+            driver.delete();
+          });
 
-      test('compilation error', () async {
-        await driver.check(
-            scope: <String, String>{'ret': '1234'},
-            expression: 'typo',
-            expectedError: "Error: Getter not found: 'typo'");
-      });
+          test('compilation error', () async {
+            await driver.check(
+                scope: <String, String>{'ret': '1234'},
+                expression: 'typo',
+                expectedError: "Error: Getter not found: 'typo'");
+          });
 
-      test('local (trimmed scope)', () async {
-        // Test that current expression evaluation works in extension methods.
-        //
-        // Note: the actual scope is {#this, ret}, but #this is effectively
-        // removed in the expression compilator because it does not exist
-        // in JavaScript code.
-        // See (full scope) tests for what will the evaluation will look like
-        // when the mapping from dart symbols to JavaScipt symbols is added.
-        await driver.check(
-            scope: <String, String>{'ret': '1234'},
-            expression: 'ret',
-            expectedResult: '''
+          test('local (trimmed scope)', () async {
+            // Test that current expression evaluation works in extension methods.
+            //
+            // Note: the actual scope is {#this, ret}, but #this is effectively
+            // removed in the expression compilator because it does not exist
+            // in JavaScript code.
+            // See (full scope) tests for what will the evaluation will look like
+            // when the mapping from dart symbols to JavaScipt symbols is added.
+            await driver.check(
+                scope: <String, String>{'ret': '1234'},
+                expression: 'ret',
+                expectedResult: '''
             (function(ret) {
               return ret;
             }(
               1234
             ))
             ''');
-      });
+          });
 
-      test('local (full scope)', () async {
-        // Test evalution in extension methods in the future when the mapping
-        // from kernel symbols to dartdevc symbols is added.
-        //
-        // Note: this currently fails due to
-        // - incremental compiler not allowing #this as a parameter name
-        await driver.check(
-            scope: <String, String>{'ret': '1234', '#this': 'this'},
-            expression: 'ret',
-            expectedError:
-                "Illegal parameter name '#this' found during expression compilation.");
-      });
+          test('local (full scope)', () async {
+            // Test evalution in extension methods in the future when the mapping
+            // from kernel symbols to dartdevc symbols is added.
+            //
+            // Note: this currently fails due to
+            // - incremental compiler not allowing #this as a parameter name
+            await driver.check(
+                scope: <String, String>{'ret': '1234', '#this': 'this'},
+                expression: 'ret',
+                expectedError:
+                    "Illegal parameter name '#this' found during expression compilation.");
+          });
 
-      test('this (full scope)', () async {
-        // Test evalution in extension methods in the future when the mapping
-        // from kernel symbols to dartdevc symbols is added.
-        //
-        // Note: this currently fails due to
-        // - incremental compiler not allowing #this as a parameter name
-        // - incremental compiler not mapping 'this' from user input to '#this'
-        await driver.check(
-            scope: <String, String>{'ret': '1234', '#this': 'this'},
-            expression: 'this',
-            expectedError:
-                "Illegal parameter name '#this' found during expression compilation.");
-      });
-    });
+          test('this (full scope)', () async {
+            // Test evalution in extension methods in the future when the mapping
+            // from kernel symbols to dartdevc symbols is added.
+            //
+            // Note: this currently fails due to
+            // - incremental compiler not allowing #this as a parameter name
+            // - incremental compiler not mapping 'this' from user input to '#this'
+            await driver.check(
+                scope: <String, String>{'ret': '1234', '#this': 'this'},
+                expression: 'this',
+                expectedError:
+                    "Illegal parameter name '#this' found during expression compilation.");
+          });
+        });
 
-    group('Expression compiler tests in static function:', () {
-      var source = '''
-        ${options.dartLangComment}
-        int foo(int x, {int y}) {
-          int z = 0;
-          /* evaluation placeholder */
-          return x + y + z;
-        }
+        group('Expression compiler tests in static function:', () {
+          var source = '''
+          ${options.dartLangComment}
+          int foo(int x, {int y}) {
+            int z = 0;
+            /* evaluation placeholder */
+            return x + y + z;
+          }
 
-        main() => 0;
-        ''';
+          main() => 0;
+          ''';
 
-      TestDriver driver;
+          TestDriver driver;
 
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
 
-      tearDown(() {
-        driver.delete();
-      });
+          tearDown(() {
+            driver.delete();
+          });
 
-      test('compilation error', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'y': '2', 'z': '3'},
-            expression: 'typo',
-            expectedError: "Getter not found: \'typo\'");
-      });
+          test('compilation error', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'y': '2', 'z': '3'},
+                expression: 'typo',
+                expectedError: "Getter not found: \'typo\'");
+          });
 
-      test('local', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'y': '2', 'z': '3'},
-            expression: 'x',
-            expectedResult: '''
+          test('local', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'y': '2', 'z': '3'},
+                expression: 'x',
+                expectedResult: '''
             (function(x, y, z) {
               return x;
             }(
@@ -616,13 +708,13 @@
               3
             ))
             ''');
-      });
+          });
 
-      test('formal', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'y': '2', 'z': '3'},
-            expression: 'y',
-            expectedResult: '''
+          test('formal', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'y': '2', 'z': '3'},
+                expression: 'y',
+                expectedResult: '''
             (function(x, y, z) {
               return y;
             }(
@@ -631,13 +723,13 @@
               3
             ))
             ''');
-      });
+          });
 
-      test('named formal', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'y': '2', 'z': '3'},
-            expression: 'z',
-            expectedResult: '''
+          test('named formal', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'y': '2', 'z': '3'},
+                expression: 'z',
+                expectedResult: '''
             (function(x, y, z) {
               return z;
             }(
@@ -646,18 +738,18 @@
               3
             ))
             ''');
-      });
+          });
 
-      test('function', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'y': '2', 'z': '3'},
-            expression: 'main',
-            expectedResult: r'''
+          test('function', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'y': '2', 'z': '3'},
+                expression: 'main',
+                expectedResult: '''
             (function(x, y, z) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               var T = {
                 VoidTodynamic: () => (T.VoidTodynamic = dart.constFn(dart.fnType(dart.dynamic, [])))()
               };
@@ -675,587 +767,590 @@
               3
             ))
             ''');
-      });
-    });
+          });
+        });
 
-    group('Expression compiler tests in method:', () {
-      var source = '''
-        ${options.dartLangComment}
-        extension NumberParsing on String {
-          int parseInt() {
-            return int.parse(this);
-          }
-        }
-
-        int global = 42;
-
-        class C {
-          C(int this.field, int this._field);
-
-          static int staticField = 0;
-          static int _staticField = 1;
-
-          int _field;
-          int field;
-
-          int methodFieldAccess(int x) {
-            /* evaluation placeholder */
-            return x + _field + _staticField;
+        group('Expression compiler tests in method:', () {
+          var source = '''
+          ${options.dartLangComment}
+          extension NumberParsing on String {
+            int parseInt() {
+              return int.parse(this);
+            }
           }
 
-          Future<int> asyncMethod(int x) async {
-            return x;
+          int global = 42;
+
+          class C {
+            C(int this.field, int this._field);
+
+            static int staticField = 0;
+            static int _staticField = 1;
+
+            int _field;
+            int field;
+
+            int methodFieldAccess(int x) {
+              /* evaluation placeholder */
+              return x + _field + _staticField;
+            }
+
+            Future<int> asyncMethod(int x) async {
+              return x;
+            }
           }
-        }
 
-        main() => 0;
-        ''';
+          main() => 0;
+          ''';
 
-      TestDriver driver;
+          TestDriver driver;
 
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
 
-      tearDown(() {
-        driver.delete();
-      });
+          tearDown(() {
+            driver.delete();
+          });
 
-      test('compilation error', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'typo',
-            expectedError: "The getter 'typo' isn't defined for the class 'C'");
-      });
+          test('compilation error', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'typo',
+                expectedError:
+                    "The getter 'typo' isn't defined for the class 'C'");
+          });
 
-      test('local', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x',
-            expectedResult: '''
+          test('local', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x',
+                expectedResult: '''
             (function(x) {
               return x;
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('this', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'this',
-            expectedResult: '''
+          test('this', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'this',
+                expectedResult: '''
             (function(x) {
               return this;
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('expression using locals', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x + 1',
-            expectedResult: '''
+          test('expression using locals', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x + 1',
+                expectedResult: '''
             (function(x) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
               return dart.notNull(x) + 1;
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('expression using static fields', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x + staticField',
-            expectedResult: r'''
+          test('expression using static fields', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x + staticField',
+                expectedResult: '''
             (function(x) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return dart.notNull(x) + dart.notNull(foo.C.staticField);
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('expression using private static fields', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x + _staticField',
-            expectedResult: r'''
+          test('expression using private static fields', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x + _staticField',
+                expectedResult: '''
             (function(x) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return dart.notNull(x) + dart.notNull(foo.C._staticField);
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('expression using fields', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x + field',
-            expectedResult: '''
+          test('expression using fields', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x + field',
+                expectedResult: '''
             (function(x) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
               return dart.notNull(x) + dart.notNull(this.field);
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('expression using private fields', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x + _field',
-            expectedResult: r'''
+          test('expression using private fields', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x + _field',
+                expectedResult: '''
             (function(x) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
-              var S = {_field$1: dart.privateName(foo, "_field")};
-              return dart.notNull(x) + dart.notNull(this[S._field$1]);
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
+              var S = {_field\$1: dart.privateName(foo, "_field")};
+              return dart.notNull(x) + dart.notNull(this[S._field\$1]);
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('expression using globals', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x + global',
-            expectedResult: r'''
+          test('expression using globals', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x + global',
+                expectedResult: '''
             (function(x) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return dart.notNull(x) + dart.notNull(foo.global);
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('method call', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'methodFieldAccess(2)',
-            expectedResult: '''
+          test('method call', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'methodFieldAccess(2)',
+                expectedResult: '''
             (function(x) {
               return this.methodFieldAccess(2);
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('async method call', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'asyncMethod(2)',
-            expectedResult: '''
+          test('async method call', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'asyncMethod(2)',
+                expectedResult: '''
             (function(x) {
               return this.asyncMethod(2);
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('extension method call', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: '"1234".parseInt()',
-            expectedResult: r'''
+          test('extension method call', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: '"1234".parseInt()',
+                expectedResult: '''
             (function(x) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return foo['NumberParsing|parseInt']("1234");
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('private field modification', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: '_field = 2',
-            expectedResult: r'''
+          test('private field modification', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: '_field = 2',
+                expectedResult: '''
             (function(x) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
-              var S = {_field$1: dart.privateName(foo, "_field")};
-              return this[S._field$1] = 2;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
+              var S = {_field\$1: dart.privateName(foo, "_field")};
+              return this[S._field\$1] = 2;
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('field modification', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'field = 2',
-            expectedResult: '''
+          test('field modification', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'field = 2',
+                expectedResult: '''
             (function(x) {
               return this.field = 2;
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('private static field modification', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: '_staticField = 2',
-            expectedResult: r'''
+          test('private static field modification', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: '_staticField = 2',
+                expectedResult: '''
             (function(x) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return foo.C._staticField = 2;
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('static field modification', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'staticField = 2',
-            expectedResult: r'''
+          test('static field modification', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'staticField = 2',
+                expectedResult: '''
             (function(x) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return foo.C.staticField = 2;
             }.bind(this)(
               1
             ))
             ''');
-      });
-    });
+          });
+        });
 
-    group('Expression compiler tests in method with no field access:', () {
-      var source = '''
-        ${options.dartLangComment}
-        extension NumberParsing on String {
-          int parseInt() {
-            return int.parse(this);
-          }
-        }
-
-        int global = 42;
-
-        class C {
-          C(int this.field, int this._field);
-
-          static int staticField = 0;
-          static int _staticField = 1;
-
-          int _field;
-          int field;
-
-          int methodNoFieldAccess(int x) {
-            /* evaluation placeholder */
-            return x;
+        group('Expression compiler tests in method with no field access:', () {
+          var source = '''
+          ${options.dartLangComment}
+          extension NumberParsing on String {
+            int parseInt() {
+              return int.parse(this);
+            }
           }
 
-          Future<int> asyncMethod(int x) async {
-            return x;
+          int global = 42;
+
+          class C {
+            C(int this.field, int this._field);
+
+            static int staticField = 0;
+            static int _staticField = 1;
+
+            int _field;
+            int field;
+
+            int methodNoFieldAccess(int x) {
+              /* evaluation placeholder */
+              return x;
+            }
+
+            Future<int> asyncMethod(int x) async {
+              return x;
+            }
           }
-        }
 
-        main() => 0;
-        ''';
+          main() => 0;
+          ''';
 
-      TestDriver driver;
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
+          TestDriver driver;
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
 
-      tearDown(() {
-        driver.delete();
-      });
+          tearDown(() {
+            driver.delete();
+          });
 
-      test('compilation error', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'typo',
-            expectedError: "The getter 'typo' isn't defined for the class 'C'");
-      });
+          test('compilation error', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'typo',
+                expectedError:
+                    "The getter 'typo' isn't defined for the class 'C'");
+          });
 
-      test('expression using static fields', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x + staticField',
-            expectedResult: r'''
+          test('expression using static fields', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x + staticField',
+                expectedResult: '''
             (function(x) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return dart.notNull(x) + dart.notNull(foo.C.staticField);
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('expression using private static fields', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x + _staticField',
-            expectedResult: r'''
+          test('expression using private static fields', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x + _staticField',
+                expectedResult: '''
             (function(x) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return dart.notNull(x) + dart.notNull(foo.C._staticField);
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('expression using fields', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x + field',
-            expectedResult: '''
+          test('expression using fields', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x + field',
+                expectedResult: '''
             (function(x) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
               return dart.notNull(x) + dart.notNull(this.field);
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('expression using private fields', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x + _field',
-            expectedResult: r'''
+          test('expression using private fields', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x + _field',
+                expectedResult: '''
             (function(x) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
-              var S = {_field$1: dart.privateName(foo, "_field")};
-              return dart.notNull(x) + dart.notNull(this[S._field$1]);
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
+              var S = {_field\$1: dart.privateName(foo, "_field")};
+              return dart.notNull(x) + dart.notNull(this[S._field\$1]);
             }.bind(this)(
             1
             ))
             ''');
-      });
+          });
 
-      test('private field modification', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: '_field = 2',
-            expectedResult: r'''
+          test('private field modification', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: '_field = 2',
+                expectedResult: '''
             (function(x) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
-              var S = {_field$1: dart.privateName(foo, "_field")};
-              return this[S._field$1] = 2;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
+              var S = {_field\$1: dart.privateName(foo, "_field")};
+              return this[S._field\$1] = 2;
             }.bind(this)(
             1
             ))
             ''');
-      });
+          });
 
-      test('field modification', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'field = 2',
-            expectedResult: '''
+          test('field modification', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'field = 2',
+                expectedResult: '''
             (function(x) {
               return this.field = 2;
             }.bind(this)(
             1
             ))
             ''');
-      });
+          });
 
-      test('private static field modification', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: '_staticField = 2',
-            expectedResult: r'''
+          test('private static field modification', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: '_staticField = 2',
+                expectedResult: '''
             (function(x) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return foo.C._staticField = 2;
             }.bind(this)(
             1
             ))
             ''');
-      });
+          });
 
-      test('static field modification', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'staticField = 2',
-            expectedResult: r'''
+          test('static field modification', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'staticField = 2',
+                expectedResult: '''
             (function(x) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return foo.C.staticField = 2;
             }.bind(this)(
             1
             ))
             ''');
-      });
-    });
+          });
+        });
 
-    group('Expression compiler tests in async method:', () {
-      var source = '''
-        ${options.dartLangComment}
-        class C {
-          C(int this.field, int this._field);
+        group('Expression compiler tests in async method:', () {
+          var source = '''
+          ${options.dartLangComment}
+          class C {
+            C(int this.field, int this._field);
 
-          int _field;
-          int field;
+            int _field;
+            int field;
 
-          Future<int> asyncMethod(int x) async {
-            /* evaluation placeholder */
-            return x;
+            Future<int> asyncMethod(int x) async {
+              /* evaluation placeholder */
+              return x;
+            }
           }
-        }
 
-        main() => 0;
-        ''';
+          main() => 0;
+          ''';
 
-      TestDriver driver;
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
+          TestDriver driver;
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
 
-      tearDown(() {
-        driver.delete();
-      });
+          tearDown(() {
+            driver.delete();
+          });
 
-      test('compilation error', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'typo',
-            expectedError: "The getter 'typo' isn't defined for the class 'C'");
-      });
+          test('compilation error', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'typo',
+                expectedError:
+                    "The getter 'typo' isn't defined for the class 'C'");
+          });
 
-      test('local', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x',
-            expectedResult: '''
+          test('local', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x',
+                expectedResult: '''
             (function(x) {
               return x;
             }.bind(this)(
             1
             ))
             ''');
-      });
+          });
 
-      test('this', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'this',
-            expectedResult: '''
+          test('this', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'this',
+                expectedResult: '''
             (function(x) {
               return this;
             }.bind(this)(
             1
             ))
             ''');
-      });
-    });
+          });
+        });
 
-    group('Expression compiler tests in global function:', () {
-      var source = '''
-        ${options.dartLangComment}
-        extension NumberParsing on String {
-          int parseInt() {
-            return int.parse(this);
-          }
-        }
-
-        int global = 42;
-
-        class C {
-          C(int this.field, int this._field);
-
-          static int staticField = 0;
-          static int _staticField = 1;
-
-          int _field;
-          int field;
-
-          int methodFieldAccess(int x) {
-            return (x + _field + _staticField);
-          }
-          int methodFieldAccess(int x) {
-            return (x)
+        group('Expression compiler tests in global function:', () {
+          var source = '''
+          ${options.dartLangComment}
+          extension NumberParsing on String {
+            int parseInt() {
+              return int.parse(this);
+            }
           }
 
-          Future<int> asyncMethod(int x) async {
-            return x;
+          int global = 42;
+
+          class C {
+            C(int this.field, int this._field);
+
+            static int staticField = 0;
+            static int _staticField = 1;
+
+            int _field;
+            int field;
+
+            int methodFieldAccess(int x) {
+              return (x + _field + _staticField);
+            }
+            int methodFieldAccess(int x) {
+              return (x)
+            }
+
+            Future<int> asyncMethod(int x) async {
+              return x;
+            }
           }
-        }
 
-        int main() {
-          int x = 15;
-          var c = C(1, 2);
-          /* evaluation placeholder */
-          return 0;
-        }
-        ''';
+          int main() {
+            int x = 15;
+            var c = C(1, 2);
+            /* evaluation placeholder */
+            return 0;
+          }
+          ''';
 
-      TestDriver driver;
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
+          TestDriver driver;
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
 
-      tearDown(() {
-        driver.delete();
-      });
+          tearDown(() {
+            driver.delete();
+          });
 
-      test('compilation error', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: 'typo',
-            expectedError: "Getter not found: 'typo'.");
-      });
+          test('compilation error', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: 'typo',
+                expectedError: "Getter not found: 'typo'.");
+          });
 
-      test('local with primitive type', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: 'x',
-            expectedResult: '''
+          test('local with primitive type', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: 'x',
+                expectedResult: '''
             (function(x, c) {
               return x;
             }(
@@ -1263,13 +1358,13 @@
               null
             ))
             ''');
-      });
+          });
 
-      test('local object', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: 'c',
-            expectedResult: '''
+          test('local object', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: 'c',
+                expectedResult: '''
             (function(x, c) {
               return c;
             }(
@@ -1277,71 +1372,71 @@
               null
             ))
             ''');
-      });
+          });
 
-      test('create new object', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: 'C(1,3)',
-            expectedResult: r'''
+          test('create new object', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: 'C(1,3)',
+                expectedResult: '''
               (function(x, c) {
-                const foo$46dart = require('foo.dart');
-                const foo = foo$46dart.foo;
+                const foo\$46dart = ${options.loadModule}('foo.dart');
+                const foo = foo\$46dart.foo;
                 return new foo.C.new(1, 3);
               }(
                 1,
                 null
               ))
               ''');
-      });
+          });
 
-      test('access field of new object', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: 'C(1,3)._field',
-            expectedResult: r'''
+          test('access field of new object', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: 'C(1,3)._field',
+                expectedResult: '''
             (function(x, c) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
-              var S = {_field$1: dart.privateName(foo, "_field")};
-              return new foo.C.new(1, 3)[S._field$1];
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
+              var S = {_field\$1: dart.privateName(foo, "_field")};
+              return new foo.C.new(1, 3)[S._field\$1];
             }(
               1,
               null
             ))
             ''');
-      });
+          });
 
-      test('access static field', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: 'C.staticField',
-            expectedResult: r'''
+          test('access static field', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: 'C.staticField',
+                expectedResult: '''
             (function(x, c) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return foo.C.staticField;
             }(
               1,
               null
             ))
             ''');
-      });
+          });
 
-      test('expression using private static fields', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: 'C._staticField',
-            expectedError: "Error: Getter not found: '_staticField'.");
-      });
+          test('expression using private static fields', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: 'C._staticField',
+                expectedError: "Error: Getter not found: '_staticField'.");
+          });
 
-      test('access field', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: 'c.field',
-            expectedResult: '''
+          test('access field', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: 'c.field',
+                expectedResult: '''
             (function(x, c) {
               return c.field;
             }(
@@ -1349,32 +1444,32 @@
               null
             ))
             ''');
-      });
+          });
 
-      test('access private field', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: 'c._field',
-            expectedResult: r'''
+          test('access private field', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: 'c._field',
+                expectedResult: '''
             (function(x, c) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
-              var S = {_field$1: dart.privateName(foo, "_field")};
-              return c[S._field$1];
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
+              var S = {_field\$1: dart.privateName(foo, "_field")};
+              return c[S._field\$1];
             }(
               1,
               null
             ))
             ''');
-      });
+          });
 
-      test('method call', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: 'c.methodFieldAccess(2)',
-            expectedResult: '''
+          test('method call', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: 'c.methodFieldAccess(2)',
+                expectedResult: '''
             (function(x, c) {
               return c.methodFieldAccess(2);
             }(
@@ -1382,13 +1477,13 @@
               null
             ))
             ''');
-      });
+          });
 
-      test('async method call', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: 'c.asyncMethod(2)',
-            expectedResult: '''
+          test('async method call', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: 'c.asyncMethod(2)',
+                expectedResult: '''
             (function(x, c) {
               return c.asyncMethod(2);
             }(
@@ -1396,48 +1491,48 @@
               null
             ))
             ''');
-      });
+          });
 
-      test('extension method call', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: '"1234".parseInt()',
-            expectedResult: r'''
+          test('extension method call', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: '"1234".parseInt()',
+                expectedResult: '''
             (function(x, c) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return foo['NumberParsing|parseInt']("1234");
             }(
               1,
               null
             ))
             ''');
-      });
+          });
 
-      test('private field modification', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: 'c._field = 2',
-            expectedResult: r'''
+          test('private field modification', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: 'c._field = 2',
+                expectedResult: '''
             (function(x, c) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
-              var S = {_field$1: dart.privateName(foo, "_field")};
-              return c[S._field$1] = 2;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
+              var S = {_field\$1: dart.privateName(foo, "_field")};
+              return c[S._field\$1] = 2;
             }(
               1,
               null
             ))
             ''');
-      });
+          });
 
-      test('field modification', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: 'c.field = 2',
-            expectedResult: '''
+          test('field modification', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: 'c.field = 2',
+                expectedResult: '''
             (function(x, c) {
               return c.field = 2;
             }(
@@ -1445,38 +1540,38 @@
               null
             ))
             ''');
-      });
+          });
 
-      test('private static field modification', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: 'C._staticField = 2',
-            expectedError: "Setter not found: '_staticField'.");
-      });
+          test('private static field modification', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: 'C._staticField = 2',
+                expectedError: "Setter not found: '_staticField'.");
+          });
 
-      test('static field modification', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: 'C.staticField = 2',
-            expectedResult: r'''
+          test('static field modification', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: 'C.staticField = 2',
+                expectedResult: '''
             (function(x, c) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return foo.C.staticField = 2;
             }(
               1,
               null
             ))
             ''');
-      });
+          });
 
-      test('call global function from core library', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: 'print(x)',
-            expectedResult: '''
+          test('call global function from core library', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: 'print(x)',
+                expectedResult: '''
             (function(x, c) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const core = dart_sdk.core;
               return core.print(x);
             }(
@@ -1484,54 +1579,61 @@
               null
             ))
             ''');
-      });
-    });
+          });
+        });
 
-    group('Expression compiler tests in closures:', () {
-      var source = '''
-        ${options.dartLangComment}
-        int globalFunction() {
-        int x = 15;
-        var c = C(1, 2);
+        group('Expression compiler tests in closures:', () {
+          var source = '''
+          ${options.dartLangComment}
+          int globalFunction() {
+            int x = 15;
+            var c = C(1, 2);
 
-        var outerClosure = (int y) {
-          var closureCaptureInner = (int z) {
-            /* evaluation placeholder */
-            print('\$y+\$z');
-          };
-          closureCaptureInner(0);
-        };
+            var outerClosure = (int y) {
+              var closureCaptureInner = (int z) {
+                /* evaluation placeholder */
+                print('\$y+\$z');
+              };
+              closureCaptureInner(0);
+            };
 
-        outerClosure(3);
-        return 0;
-      }
+            outerClosure(3);
+            return 0;
+          }
 
-      main() => 0;
-      ''';
+          main() => 0;
+          ''';
 
-      TestDriver driver;
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
+          TestDriver driver;
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
 
-      tearDown(() {
-        driver.delete();
-      });
+          tearDown(() {
+            driver.delete();
+          });
 
-      test('compilation error', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null', 'y': '3', 'z': '0'},
-            expression: 'typo',
-            expectedError: "Getter not found: 'typo'.");
-      });
+          test('compilation error', () async {
+            await driver.check(scope: <String, String>{
+              'x': '1',
+              'c': 'null',
+              'y': '3',
+              'z': '0'
+            }, expression: 'typo', expectedError: "Getter not found: 'typo'.");
+          });
 
-      test('expression using uncaptured variables', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null', 'y': '3', 'z': '0'},
-            expression: r"'$x+$y+$z'",
-            expectedResult: '''
+          test('expression using uncaptured variables', () async {
+            await driver.check(
+                scope: <String, String>{
+                  'x': '1',
+                  'c': 'null',
+                  'y': '3',
+                  'z': '0'
+                },
+                expression: "'\$x+\$y+\$z'",
+                expectedResult: '''
             (function(x, c, y, z) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
               return dart.str(x) + "+" + dart.str(y) + "+" + dart.str(z);
             }(
@@ -1541,15 +1643,20 @@
               0
             ))
             ''');
-      });
+          });
 
-      test('expression using captured variables', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null', 'y': '3', 'z': '0'},
-            expression: r"'$y+$z'",
-            expectedResult: '''
+          test('expression using captured variables', () async {
+            await driver.check(
+                scope: <String, String>{
+                  'x': '1',
+                  'c': 'null',
+                  'y': '3',
+                  'z': '0'
+                },
+                expression: "'\$y+\$z'",
+                expectedResult: '''
             (function(x, c, y, z) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
               return dart.str(y) + "+" + dart.str(z);
             }(
@@ -1559,83 +1666,83 @@
               0
             ))
             ''');
-      });
-    });
+          });
+        });
 
-    group('Expression compiler tests in method with no type use:', () {
-      var source = '''
+        group('Expression compiler tests in method with no type use:', () {
+          var source = '''
         ${options.dartLangComment}
-        abstract class Key {
-          const factory Key(String value) = ValueKey;
-          const Key.empty();
-        }
+          abstract class Key {
+            const factory Key(String value) = ValueKey;
+            const Key.empty();
+          }
 
-        abstract class LocalKey extends Key {
-          const LocalKey() : super.empty();
-        }
+          abstract class LocalKey extends Key {
+            const LocalKey() : super.empty();
+          }
 
-        class ValueKey implements LocalKey {
-          const ValueKey(this.value);
-          final String value;
-        }
+          class ValueKey implements LocalKey {
+            const ValueKey(this.value);
+            final String value;
+          }
 
-        class MyClass {
-          const MyClass(this._t);
-          final int _t;
-        }
+          class MyClass {
+            const MyClass(this._t);
+            final int _t;
+          }
 
-        int bar(int p){
-          return p;
-        }
-        int baz(String t){
-          return t;
-        }
-        void main() {
-          var k = Key('t');
-          MyClass c = MyClass(0);
-          int p = 1;
-          const t = 1;
+          int bar(int p){
+            return p;
+          }
+          int baz(String t){
+            return t;
+          }
+          void main() {
+            var k = Key('t');
+            MyClass c = MyClass(0);
+            int p = 1;
+            const t = 1;
 
-          /* evaluation placeholder */
-          print('\$c, \$k, \$t');
-        }
-        ''';
+            /* evaluation placeholder */
+            print('\$c, \$k, \$t');
+          }
+          ''';
 
-      TestDriver driver;
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
+          TestDriver driver;
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
 
-      tearDown(() {
-        driver.delete();
-      });
+          tearDown(() {
+            driver.delete();
+          });
 
-      test('call function not using type', () async {
-        await driver.check(
-            scope: <String, String>{'p': '1'},
-            expression: 'bar(p)',
-            expectedResult: r'''
+          test('call function not using type', () async {
+            await driver.check(
+                scope: <String, String>{'p': '1'},
+                expression: 'bar(p)',
+                expectedResult: '''
             (function(p) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return foo.bar(p);
             }(
               1
             ))
             ''');
-      });
+          });
 
-      test('call function using type', () async {
-        await driver.check(
-            scope: <String, String>{'p': '0'},
-            expression: 'baz(p as String)',
-            expectedResult: r'''
+          test('call function using type', () async {
+            await driver.check(
+                scope: <String, String>{'p': '0'},
+                expression: 'baz(p as String)',
+                expectedResult: '''
             (function(p) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const core = dart_sdk.core;
               const dart = dart_sdk.dart;
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               var T = {
                 StringL: () => (T.StringL = dart.constFn(dart.legacy(core.String)))()
               };
@@ -1644,18 +1751,18 @@
               0
             ))
             ''');
-      });
+          });
 
-      test('evaluate new const expression', () async {
-        await driver.check(
-            scope: <String, String>{'p': '1'},
-            expression: 'const MyClass(1)',
-            expectedResult: r'''
+          test('evaluate new const expression', () async {
+            await driver.check(
+                scope: <String, String>{'p': '1'},
+                expression: 'const MyClass(1)',
+                expectedResult: '''
             (function(p) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               var S = {MyClass__t: dart.privateName(foo, "MyClass._t")};
               const CT = Object.create(null);
               dart.defineLazy(CT, {
@@ -1672,47 +1779,47 @@
               1
             ))
             ''');
-      });
+          });
 
-      test('evaluate optimized const expression', () async {
-        await driver.check(
-            scope: <String, String>{},
-            expression: 't',
-            expectedResult: '''
+          test('evaluate optimized const expression', () async {
+            await driver.check(
+                scope: <String, String>{},
+                expression: 't',
+                expectedResult: '''
             (function() {
               return 1;
             }(
             ))
             ''');
-      },
-          skip: 'Cannot compile constants optimized away by the frontend. '
-              'Issue: https://github.com/dart-lang/sdk/issues/41999');
+          },
+              skip: 'Cannot compile constants optimized away by the frontend. '
+                  'Issue: https://github.com/dart-lang/sdk/issues/41999');
 
-      test('evaluate factory constructor call', () async {
-        await driver.check(
-            scope: <String, String>{'p': '1'},
-            expression: "Key('t')",
-            expectedResult: r'''
+          test('evaluate factory constructor call', () async {
+            await driver.check(
+                scope: <String, String>{'p': '1'},
+                expression: "Key('t')",
+                expectedResult: '''
             (function(p) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return new foo.ValueKey.new("t");
             }(
               1
             ))
             ''');
-      });
+          });
 
-      test('evaluate const factory constructor call', () async {
-        await driver.check(
-            scope: <String, String>{'p': '1'},
-            expression: "const Key('t')",
-            expectedResult: r'''
+          test('evaluate const factory constructor call', () async {
+            await driver.check(
+                scope: <String, String>{'p': '1'},
+                expression: "const Key('t')",
+                expectedResult: '''
             (function(p) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               var S = {ValueKey_value: dart.privateName(foo, "ValueKey.value")};
               const CT = Object.create(null);
               dart.defineLazy(CT, {
@@ -1729,321 +1836,322 @@
               1
             ))
             ''');
-      });
-    });
+          });
+        });
 
-    group('Expression compiler tests in constructor:', () {
-      var source = '''
-        ${options.dartLangComment}
-        extension NumberParsing on String {
-          int parseInt() {
-            return int.parse(this);
-          }
-        }
-
-        int global = 42;
-
-        class C {
-          C(int this.field, int this._field) {
-            int x = 1;
-            /* evaluation placeholder */
-            print(this.field);
+        group('Expression compiler tests in constructor:', () {
+          var source = '''
+          ${options.dartLangComment}
+          extension NumberParsing on String {
+            int parseInt() {
+              return int.parse(this);
+            }
           }
 
-          static int staticField = 0;
-          static int _staticField = 1;
+          int global = 42;
 
-          int _field;
-          int field;
+          class C {
+            C(int this.field, int this._field) {
+              int x = 1;
+              /* evaluation placeholder */
+              print(this.field);
+            }
 
-          int methodFieldAccess(int t) {
-            return t + _field + _staticField;
+            static int staticField = 0;
+            static int _staticField = 1;
+
+            int _field;
+            int field;
+
+            int methodFieldAccess(int t) {
+              return t + _field + _staticField;
+            }
+
+            Future<int> asyncMethod(int t) async {
+              return t;
+            }
           }
 
-          Future<int> asyncMethod(int t) async {
-            return t;
-          }
-        }
+          main() => 0;
+          ''';
 
-        main() => 0;
-        ''';
+          TestDriver driver;
 
-      TestDriver driver;
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
 
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
+          tearDown(() {
+            driver.delete();
+          });
 
-      tearDown(() {
-        driver.delete();
-      });
+          test('compilation error', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'typo',
+                expectedError:
+                    "The getter 'typo' isn't defined for the class 'C'");
+          });
 
-      test('compilation error', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'typo',
-            expectedError: "The getter 'typo' isn't defined for the class 'C'");
-      });
-
-      test('local', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x',
-            expectedResult: '''
+          test('local', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x',
+                expectedResult: '''
             (function(x) {
               return x;
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('this', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'this',
-            expectedResult: '''
+          test('this', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'this',
+                expectedResult: '''
             (function(x) {
               return this;
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('expression using locals', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x + 1',
-            expectedResult: '''
+          test('expression using locals', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x + 1',
+                expectedResult: '''
             (function(x) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
               return dart.notNull(x) + 1;
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('expression using static fields', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x + staticField',
-            expectedResult: r'''
+          test('expression using static fields', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x + staticField',
+                expectedResult: '''
             (function(x) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return dart.notNull(x) + dart.notNull(foo.C.staticField);
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('expression using private static fields', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x + _staticField',
-            expectedResult: r'''
+          test('expression using private static fields', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x + _staticField',
+                expectedResult: '''
             (function(x) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return dart.notNull(x) + dart.notNull(foo.C._staticField);
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('expression using fields', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x + field',
-            expectedResult: '''
+          test('expression using fields', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x + field',
+                expectedResult: '''
             (function(x) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
               return dart.notNull(x) + dart.notNull(this.field);
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('expression using private fields', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x + _field',
-            expectedResult: r'''
+          test('expression using private fields', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x + _field',
+                expectedResult: '''
             (function(x) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
-              var S = {_field$1: dart.privateName(foo, "_field")};
-              return dart.notNull(x) + dart.notNull(this[S._field$1]);
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
+              var S = {_field\$1: dart.privateName(foo, "_field")};
+              return dart.notNull(x) + dart.notNull(this[S._field\$1]);
             }.bind(this)(
                 1
             ))
             ''');
-      });
+          });
 
-      test('expression using globals', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x + global',
-            expectedResult: r'''
+          test('expression using globals', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x + global',
+                expectedResult: '''
             (function(x) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return dart.notNull(x) + dart.notNull(foo.global);
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('method call', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'methodFieldAccess(2)',
-            expectedResult: '''
+          test('method call', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'methodFieldAccess(2)',
+                expectedResult: '''
             (function(x) {
               return this.methodFieldAccess(2);
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('async method call', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'asyncMethod(2)',
-            expectedResult: '''
+          test('async method call', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'asyncMethod(2)',
+                expectedResult: '''
             (function(x) {
               return this.asyncMethod(2);
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('extension method call', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: '"1234".parseInt()',
-            expectedResult: r'''
+          test('extension method call', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: '"1234".parseInt()',
+                expectedResult: '''
             (function(x) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return foo['NumberParsing|parseInt']("1234");
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('private field modification', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: '_field = 2',
-            expectedResult: r'''
+          test('private field modification', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: '_field = 2',
+                expectedResult: '''
             (function(x) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
-              var S = {_field$1: dart.privateName(foo, "_field")};
-              return this[S._field$1] = 2;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
+              var S = {_field\$1: dart.privateName(foo, "_field")};
+              return this[S._field\$1] = 2;
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('field modification', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'field = 2',
-            expectedResult: '''
+          test('field modification', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'field = 2',
+                expectedResult: '''
             (function(x) {
               return this.field = 2;
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('private static field modification', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: '_staticField = 2',
-            expectedResult: r'''
+          test('private static field modification', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: '_staticField = 2',
+                expectedResult: '''
             (function(x) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return foo.C._staticField = 2;
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('static field modification', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'staticField = 2',
-            expectedResult: r'''
+          test('static field modification', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'staticField = 2',
+                expectedResult: '''
             (function(x) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return foo.C.staticField = 2;
             }.bind(this)(
               1
             ))
             ''');
-      });
-    });
+          });
+        });
 
-    group('Expression compiler tests in simple loops:', () {
-      var source = '''
-        ${options.dartLangComment}
-        int globalFunction() {
-          int x = 15;
-          var c = C(1, 2);
+        group('Expression compiler tests in simple loops:', () {
+          var source = '''
+          ${options.dartLangComment}
+          int globalFunction() {
+            int x = 15;
+            var c = C(1, 2);
 
-          for(int i = 0; i < 10; i++) {
-            /* evaluation placeholder */
-            print('\$i+\$x');
-          };
-          return 0;
-        }
+            for(int i = 0; i < 10; i++) {
+              /* evaluation placeholder */
+              print('\$i+\$x');
+            };
+            return 0;
+          }
 
-        main() => 0;
-        ''';
+          main() => 0;
+          ''';
 
-      TestDriver driver;
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
+          TestDriver driver;
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
 
-      tearDown(() {
-        driver.delete();
-      });
+          tearDown(() {
+            driver.delete();
+          });
 
-      test('expression using local', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null', 'i': '0'},
-            expression: 'x',
-            expectedResult: '''
+          test('expression using local', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null', 'i': '0'},
+                expression: 'x',
+                expectedResult: '''
             (function(x, c, i) {
               return x;
             }(
@@ -2052,13 +2160,13 @@
               0
             ))
             ''');
-      });
+          });
 
-      test('expression using loop variable', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null', 'i': '0'},
-            expression: 'i',
-            expectedResult: '''
+          test('expression using loop variable', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null', 'i': '0'},
+                expression: 'i',
+                expectedResult: '''
             (function(x, c, i) {
               return i;
             }(
@@ -2067,39 +2175,39 @@
               0
             ))
             ''');
-      });
-    });
+          });
+        });
 
-    group('Expression compiler tests in iterator loops:', () {
-      var source = '''
-        ${options.dartLangComment}
-        int globalFunction() {
-          var l = <String>['1', '2', '3'];
+        group('Expression compiler tests in iterator loops:', () {
+          var source = '''
+          ${options.dartLangComment}
+          int globalFunction() {
+            var l = <String>['1', '2', '3'];
 
-          for(var e in l) {
-            /* evaluation placeholder */
-            print(e);
-          };
-          return 0;
-        }
+            for(var e in l) {
+              /* evaluation placeholder */
+              print(e);
+            };
+            return 0;
+          }
 
-        main() => 0;
-        ''';
+          main() => 0;
+          ''';
 
-      TestDriver driver;
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
+          TestDriver driver;
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
 
-      tearDown(() {
-        driver.delete();
-      });
+          tearDown(() {
+            driver.delete();
+          });
 
-      test('expression loop variable', () async {
-        await driver.check(
-            scope: <String, String>{'l': 'null', 'e': '1'},
-            expression: 'e',
-            expectedResult: '''
+          test('expression loop variable', () async {
+            await driver.check(
+                scope: <String, String>{'l': 'null', 'e': '1'},
+                expression: 'e',
+                expectedResult: '''
             (function(l, e) {
               return e;
             }(
@@ -2107,44 +2215,44 @@
               1
             ))
             ''');
-      });
-    });
+          });
+        });
 
-    group('Expression compiler tests in conditional (then):', () {
-      var source = '''
-        ${options.dartLangComment}
-        int globalFunction() {
-          int x = 1;
-          var c = C(1, 2);
+        group('Expression compiler tests in conditional (then):', () {
+          var source = '''
+          ${options.dartLangComment}
+          int globalFunction() {
+            int x = 1;
+            var c = C(1, 2);
 
-          if (x == 14) {
-            int y = 3;
-            /* evaluation placeholder */
-            print('\$y+\$x');
-          } else {
-            int z = 3;
-            print('\$z+\$x');
+            if (x == 14) {
+              int y = 3;
+              /* evaluation placeholder */
+              print('\$y+\$x');
+            } else {
+              int z = 3;
+              print('\$z+\$x');
+            }
+            return 0;
           }
-          return 0;
-        }
 
-        main() => 0;
-        ''';
+          main() => 0;
+          ''';
 
-      TestDriver driver;
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
+          TestDriver driver;
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
 
-      tearDown(() {
-        driver.delete();
-      });
+          tearDown(() {
+            driver.delete();
+          });
 
-      test('expression using local', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null', 'y': '3'},
-            expression: 'y',
-            expectedResult: '''
+          test('expression using local', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null', 'y': '3'},
+                expression: 'y',
+                expectedResult: '''
             (function(x, c, y) {
               return y;
             }(
@@ -2153,51 +2261,51 @@
               3
             ))
             ''');
-      });
+          });
 
-      test('expression using local out of scope', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null', 'y': '3'},
-            expression: 'z',
-            expectedError: "Error: Getter not found: 'z'");
-      });
-    });
+          test('expression using local out of scope', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null', 'y': '3'},
+                expression: 'z',
+                expectedError: "Error: Getter not found: 'z'");
+          });
+        });
 
-    group('Expression compiler tests in conditional (else):', () {
-      var source = '''
-        ${options.dartLangComment}
-        int globalFunction() {
-          int x = 1;
-          var c = C(1, 2);
+        group('Expression compiler tests in conditional (else):', () {
+          var source = '''
+          ${options.dartLangComment}
+          int globalFunction() {
+            int x = 1;
+            var c = C(1, 2);
 
-          if (x == 14) {
-            int y = 3;
-            print('\$y+\$x');
-          } else {
-            int z = 3;
-            /* evaluation placeholder */
-            print('\$z+\$x');
+            if (x == 14) {
+              int y = 3;
+              print('\$y+\$x');
+            } else {
+              int z = 3;
+              /* evaluation placeholder */
+              print('\$z+\$x');
+            }
+            return 0;
           }
-          return 0;
-        }
 
-        main() => 0;
-        ''';
+          main() => 0;
+          ''';
 
-      TestDriver driver;
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
+          TestDriver driver;
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
 
-      tearDown(() {
-        driver.delete();
-      });
+          tearDown(() {
+            driver.delete();
+          });
 
-      test('expression using local', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null', 'z': '3'},
-            expression: 'z',
-            expectedResult: '''
+          test('expression using local', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null', 'z': '3'},
+                expression: 'z',
+                expectedResult: '''
             (function(x, c, z) {
               return z;
             }(
@@ -2206,51 +2314,51 @@
               3
             ))
             ''');
-      });
+          });
 
-      test('expression using local out of scope', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null', 'z': '3'},
-            expression: 'y',
-            expectedError: "Error: Getter not found: 'y'");
-      });
-    });
+          test('expression using local out of scope', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null', 'z': '3'},
+                expression: 'y',
+                expectedError: "Error: Getter not found: 'y'");
+          });
+        });
 
-    group('Expression compiler tests after conditionals:', () {
-      var source = '''
-      ${options.dartLangComment}
-      int globalFunction() {
-        int x = 1;
-        var c = C(1, 2);
+        group('Expression compiler tests after conditionals:', () {
+          var source = '''
+          ${options.dartLangComment}
+          int globalFunction() {
+            int x = 1;
+            var c = C(1, 2);
 
-        if (x == 14) {
-          int y = 3;
-          print('\$y+\$x');
-        } else {
-          int z = 3;
-          print('\$z+\$x');
-        }
-        /* evaluation placeholder */
-        return 0;
-      }
+            if (x == 14) {
+              int y = 3;
+              print('\$y+\$x');
+            } else {
+              int z = 3;
+              print('\$z+\$x');
+            }
+            /* evaluation placeholder */
+            return 0;
+          }
 
-      main() => 0;
-      ''';
+          main() => 0;
+          ''';
 
-      TestDriver driver;
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
+          TestDriver driver;
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
 
-      tearDown(() {
-        driver.delete();
-      });
+          tearDown(() {
+            driver.delete();
+          });
 
-      test('expression using local', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: 'x',
-            expectedResult: '''
+          test('expression using local', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: 'x',
+                expectedResult: '''
           (function(x, c) {
             return x;
           }(
@@ -2258,53 +2366,55 @@
             null
           ))
           ''');
-      });
+          });
 
-      test('expression using local out of scope', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: 'z',
-            expectedError: "Error: Getter not found: 'z'");
-      });
-    });
+          test('expression using local out of scope', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: 'z',
+                expectedError: "Error: Getter not found: 'z'");
+          });
+        });
 
-    group('Expression compiler tests for interactions with module containers:',
-        () {
-      var source = '''
-        ${options.dartLangComment}
-        class A {
-          const A();
-        }
-        class B {
-          const B();
-        }
-        void foo() {
-          const a = A();
-          var check = a is int;
-          /* evaluation placeholder */
-          return;
-        }
+        group(
+            'Expression compiler tests for interactions with module containers:',
+            () {
+          var source = '''
+          ${options.dartLangComment}
+          class A {
+            const A();
+          }
+          class B {
+            const B();
+          }
+          void foo() {
+            const a = A();
+            var check = a is int;
+            /* evaluation placeholder */
+            return;
+          }
 
-        void main() => foo();
-        ''';
+          void main() => foo();
+          ''';
 
-      TestDriver driver;
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
+          TestDriver driver;
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
 
-      tearDown(() {
-        driver.delete();
-      });
+          tearDown(() {
+            driver.delete();
+          });
 
-      test('evaluation that non-destructively appends to the type container',
-          () async {
-        await driver.check(
-            scope: <String, String>{'a': 'null', 'check': 'null'},
-            expression: 'a is String',
-            expectedResult: r'''
+          test(
+              'evaluation that non-destructively appends to the type container',
+              () async {
+            await driver.check(
+                scope: <String, String>{'a': 'null', 'check': 'null'},
+                expression: 'a is String',
+                expectedResult: '''
             (function(a, check) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const core = dart_sdk.core;
               const dart = dart_sdk.dart;
               var T = {
@@ -2316,15 +2426,15 @@
               null
             ))
             ''');
-      });
+          });
 
-      test('evaluation that reuses the type container', () async {
-        await driver.check(
-            scope: <String, String>{'a': 'null', 'check': 'null'},
-            expression: 'a is int',
-            expectedResult: r'''
+          test('evaluation that reuses the type container', () async {
+            await driver.check(
+                scope: <String, String>{'a': 'null', 'check': 'null'},
+                expression: 'a is int',
+                expectedResult: '''
             (function(a, check) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const core = dart_sdk.core;
               const dart = dart_sdk.dart;
               var T = {
@@ -2336,20 +2446,20 @@
               null
             ))
             ''');
-      });
+          });
 
-      test(
-          'evaluation that non-destructively appends to the constant container',
-          () async {
-        await driver.check(
-            scope: <String, String>{'a': 'null', 'check': 'null'},
-            expression: 'const B()',
-            expectedResult: r'''
+          test(
+              'evaluation that non-destructively appends to the constant container',
+              () async {
+            await driver.check(
+                scope: <String, String>{'a': 'null', 'check': 'null'},
+                expression: 'const B()',
+                expectedResult: '''
             (function(a, check) {
-             const dart_sdk = require('dart_sdk');
+             const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               const CT = Object.create(null);
               dart.defineLazy(CT, {
                 get C0() {
@@ -2365,20 +2475,20 @@
               null
             ))
             ''');
-      });
+          });
 
-      test(
-          'evaluation that reuses the constant container and canonicalizes properly',
-          () async {
-        await driver.check(
-            scope: <String, String>{'a': 'null', 'check': 'null'},
-            expression: 'a == const A()',
-            expectedResult: r'''
+          test(
+              'evaluation that reuses the constant container and canonicalizes properly',
+              () async {
+            await driver.check(
+                scope: <String, String>{'a': 'null', 'check': 'null'},
+                expression: 'a == const A()',
+                expectedResult: '''
             (function(a, check) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               const CT = Object.create(null);
               dart.defineLazy(CT, {
                 get C0() {
@@ -2394,42 +2504,42 @@
               null
             ))
             ''');
-      });
-    });
+          });
+        });
 
-    group('Expression compiler tests in generic method:', () {
-      var source = '''
-        ${options.dartLangComment}
-        class A {
-          void generic<TType, KType>(TType a, KType b) {
-            /* evaluation placeholder */
-            print(a);
-            print(b);
+        group('Expression compiler tests in generic method:', () {
+          var source = '''
+          ${options.dartLangComment}
+          class A {
+            void generic<TType, KType>(TType a, KType b) {
+              /* evaluation placeholder */
+              print(a);
+              print(b);
+            }
           }
-        }
 
-        void main() => generic<int, String>(0, 'hi');
-        ''';
+          void main() => generic<int, String>(0, 'hi');
+          ''';
 
-      TestDriver driver;
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
+          TestDriver driver;
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
 
-      tearDown(() {
-        driver.delete();
-      });
+          tearDown(() {
+            driver.delete();
+          });
 
-      test('evaluate formals', () async {
-        await driver.check(
-            scope: <String, String>{
-              'TType': 'TType',
-              'KType': 'KType',
-              'a': 'a',
-              'b': 'b'
-            },
-            expression: 'a',
-            expectedResult: '''
+          test('evaluate formals', () async {
+            await driver.check(
+                scope: <String, String>{
+                  'TType': 'TType',
+                  'KType': 'KType',
+                  'a': 'a',
+                  'b': 'b'
+                },
+                expression: 'a',
+                expectedResult: '''
             (function(TType, KType, a, b) {
                 return a;
             }.bind(this)(
@@ -2439,20 +2549,20 @@
               b
             ))
             ''');
-      });
+          });
 
-      test('evaluate type parameters', () async {
-        await driver.check(
-            scope: <String, String>{
-              'TType': 'TType',
-              'KType': 'KType',
-              'a': 'a',
-              'b': 'b'
-            },
-            expression: 'TType',
-            expectedResult: '''
+          test('evaluate type parameters', () async {
+            await driver.check(
+                scope: <String, String>{
+                  'TType': 'TType',
+                  'KType': 'KType',
+                  'a': 'a',
+                  'b': 'b'
+                },
+                expression: 'TType',
+                expectedResult: '''
             (function(TType, KType, a, b) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
               return dart.wrapType(dart.legacy(TType));
             }.bind(this)(
@@ -2462,156 +2572,237 @@
               b
             ))
             ''');
-      });
-    });
+          });
+        });
 
-    group('Expression compiler tests using extension symbols', () {
-      var source = '''
-        ${options.dartLangComment}
-        void bar() {
-          /* evaluation placeholder */
-        }
+        group('Expression compiler tests using extension symbols', () {
+          var source = '''
+          ${options.dartLangComment}
+          void bar() {
+            /* evaluation placeholder */
+          }
 
-        void main() => bar();
-        ''';
+          void main() => bar();
+          ''';
 
-      TestDriver driver;
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
+          TestDriver driver;
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
 
-      tearDown(() {
-        driver.delete();
-      });
+          tearDown(() {
+            driver.delete();
+          });
 
-      test('map access', () async {
-        await driver.check(
-            scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
-            expression:
-                '(Map<String, String> params) { return params["index"]; }({})',
-            expectedResult: r'''
+          test('map access', () async {
+            await driver.check(
+                scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
+                expression:
+                    '(Map<String, String> params) { return params["index"]; }({})',
+                expectedResult: '''
             (function() {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const core = dart_sdk.core;
               const _js_helper = dart_sdk._js_helper;
               const dart = dart_sdk.dart;
               const dartx = dart_sdk.dartx;
               var T = {
                 StringL: () => (T.StringL = dart.constFn(dart.legacy(core.String)))(),
-                MapOfStringL$StringL: () => (T.MapOfStringL$StringL = dart.constFn(core.Map$(T.StringL(), T.StringL())))(),
-                MapLOfStringL$StringL: () => (T.MapLOfStringL$StringL = dart.constFn(dart.legacy(T.MapOfStringL$StringL())))(),
-                MapLOfStringL$StringLToStringL: () => (T.MapLOfStringL$StringLToStringL = dart.constFn(dart.fnType(T.StringL(), [T.MapLOfStringL$StringL()])))(),
-                IdentityMapOfStringL$StringL: () => (T.IdentityMapOfStringL$StringL = dart.constFn(_js_helper.IdentityMap$(T.StringL(), T.StringL())))()
+                MapOfStringL\$StringL: () => (T.MapOfStringL\$StringL = dart.constFn(core.Map\$(T.StringL(), T.StringL())))(),
+                MapLOfStringL\$StringL: () => (T.MapLOfStringL\$StringL = dart.constFn(dart.legacy(T.MapOfStringL\$StringL())))(),
+                MapLOfStringL\$StringLToStringL: () => (T.MapLOfStringL\$StringLToStringL = dart.constFn(dart.fnType(T.StringL(), [T.MapLOfStringL\$StringL()])))(),
+                IdentityMapOfStringL\$StringL: () => (T.IdentityMapOfStringL\$StringL = dart.constFn(_js_helper.IdentityMap\$(T.StringL(), T.StringL())))()
               };
-              var S = {$_get: dartx._get};
-              return dart.fn(params => params[S.$_get]("index"), T.MapLOfStringL$StringLToStringL())(new (T.IdentityMapOfStringL$StringL()).new());
+              var S = {\$_get: dartx._get};
+              return dart.fn(params => params[S.\$_get]("index"), T.MapLOfStringL\$StringLToStringL())(new (T.IdentityMapOfStringL\$StringL()).new());
             }(
               
             ))
             ''');
+          });
+        });
       });
     });
-  });
+  }
 
-  group('Sound null safety:', () {
-    var options = SetupCompilerOptions(soundNullSafety: true);
+  for (var moduleFormat in [ModuleFormat.amd, ModuleFormat.ddc]) {
+    group('Module format: $moduleFormat', () {
+      group('Sound null safety:', () {
+        var options = SetupCompilerOptions(soundNullSafety: true);
 
-    group('Expression compiler extension symbols tests', () {
-      var source = '''
-        ${options.dartLangComment}
-  
-        main() {
-          List<int> list = {};
-          list.add(0);
-          /* evaluation placeholder */
-        }
-        ''';
-
-      TestDriver driver;
-
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
-
-      tearDown(() {
-        driver.delete();
-      });
-
-      test('extension symbol used in original compilation', () async {
-        await driver.check(
-            scope: <String, String>{'list': 'list'},
-            expression: 'list.add(1)',
-            expectedResult: r'''
-            (function(list) {
-              const dart_sdk = require('dart_sdk');
-              const dartx = dart_sdk.dartx;
-              var $add = dartx.add;
-              var S = {$add: dartx.add};
-              return list[$add](1);
-            }(
-              list
-            ))
-            ''');
-      });
-
-      test('extension symbol used only in expression compilation', () async {
-        await driver.check(
-            scope: <String, String>{'list': 'list'},
-            expression: 'list.first',
-            expectedResult: r'''
-            (function(list) {
-              const dart_sdk = require('dart_sdk');
-              const dartx = dart_sdk.dartx;
-              var S = {$first: dartx.first};
-              return list[S.$first];
-            }(
-              list
-            ))
-            ''');
-      });
-    });
-
-    group('Expression compiler scope collection tests', () {
-      var source = '''
-        ${options.dartLangComment}
-
-        class C {
-          C(int this.field);
-
-          int methodFieldAccess(int x) {
-            var inScope = 1;
-            {
-              var innerInScope = global + staticField + field;
-              /* evaluation placeholder */
-              print(innerInScope);
-              var innerNotInScope = 2;
-            }
-            var notInScope = 3;
+        group('Expression compiler import tests', () {
+          var source = '''
+          ${options.dartLangComment}
+          import 'dart:io' show Directory;
+          import 'dart:io' as p;
+          import 'dart:convert' as p;
+          
+          main() {
+            print(Directory.systemTemp);
+            print(p.Directory.systemTemp);
+            print(p.utf.decoder);
           }
 
-          static int staticField = 0;
-          int field;
-        }
+          void foo() {
+            /* evaluation placeholder */
+          }
+          ''';
 
-        int global = 42;
-        main() => 0;
-        ''';
+          TestDriver driver;
 
-      TestDriver driver;
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
 
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
+          tearDown(() {
+            driver.delete();
+          });
 
-      tearDown(() {
-        driver.delete();
-      });
+          test('expression referencing unnamed import', () async {
+            await driver.check(
+                scope: <String, String>{},
+                expression: 'Directory.systemTemp',
+                expectedResult: '''
+            (function() {
+              const dart_sdk = ${options.loadModule}(\'dart_sdk\');
+              const io = dart_sdk.io;
+              return io.Directory.systemTemp;
+            }(
+              
+            ))
+            ''');
+          });
 
-      test('local in scope', () async {
-        await driver.check(
-            scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
-            expression: 'inScope',
-            expectedResult: '''
+          test('expression referencing named import', () async {
+            await driver.check(
+                scope: <String, String>{},
+                expression: 'p.Directory.systemTemp',
+                expectedResult: '''
+            (function() {
+              const dart_sdk = ${options.loadModule}(\'dart_sdk\');
+              const io = dart_sdk.io;
+              return io.Directory.systemTemp;
+            }(
+              
+            ))
+            ''');
+          });
+
+          test(
+              'expression referencing another library with the same named import',
+              () async {
+            await driver.check(
+                scope: <String, String>{},
+                expression: 'p.utf8.decoder',
+                expectedResult: '''
+            (function() {
+              const dart_sdk = ${options.loadModule}(\'dart_sdk\');
+              const convert = dart_sdk.convert;
+              return convert.utf8.decoder;
+            }(
+              
+            ))
+            ''');
+          });
+        });
+
+        group('Expression compiler extension symbols tests', () {
+          var source = '''
+          ${options.dartLangComment}
+    
+          main() {
+            List<int> list = {};
+            list.add(0);
+            /* evaluation placeholder */
+          }
+          ''';
+
+          TestDriver driver;
+
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
+
+          tearDown(() {
+            driver.delete();
+          });
+
+          test('extension symbol used in original compilation', () async {
+            await driver.check(
+                scope: <String, String>{'list': 'list'},
+                expression: 'list.add(1)',
+                expectedResult: '''
+            (function(list) {
+              const dart_sdk = ${options.loadModule}('dart_sdk');
+              const dartx = dart_sdk.dartx;
+              var \$add = dartx.add;
+              var S = {\$add: dartx.add};
+              return list[\$add](1);
+            }(
+              list
+            ))
+            ''');
+          });
+
+          test('extension symbol used only in expression compilation',
+              () async {
+            await driver.check(
+                scope: <String, String>{'list': 'list'},
+                expression: 'list.first',
+                expectedResult: '''
+            (function(list) {
+              const dart_sdk = ${options.loadModule}('dart_sdk');
+              const dartx = dart_sdk.dartx;
+              var S = {\$first: dartx.first};
+              return list[S.\$first];
+            }(
+              list
+            ))
+            ''');
+          });
+        });
+
+        group('Expression compiler scope collection tests', () {
+          var source = '''
+          ${options.dartLangComment}
+
+          class C {
+            C(int this.field);
+
+            int methodFieldAccess(int x) {
+              var inScope = 1;
+              {
+                var innerInScope = global + staticField + field;
+                /* evaluation placeholder */
+                print(innerInScope);
+                var innerNotInScope = 2;
+              }
+              var notInScope = 3;
+            }
+
+            static int staticField = 0;
+            int field;
+          }
+
+          int global = 42;
+          main() => 0;
+          ''';
+
+          TestDriver driver;
+
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
+
+          tearDown(() {
+            driver.delete();
+          });
+
+          test('local in scope', () async {
+            await driver.check(
+                scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
+                expression: 'inScope',
+                expectedResult: '''
             (function(inScope, innerInScope) {
               return inScope;
             }.bind(this)(
@@ -2619,13 +2810,13 @@
               0
             ))
             ''');
-      });
+          });
 
-      test('local in inner scope', () async {
-        await driver.check(
-            scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
-            expression: 'innerInScope',
-            expectedResult: '''
+          test('local in inner scope', () async {
+            await driver.check(
+                scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
+                expression: 'innerInScope',
+                expectedResult: '''
             (function(inScope, innerInScope) {
               return innerInScope;
             }.bind(this)(
@@ -2633,45 +2824,45 @@
               0
             ))
             ''');
-      });
+          });
 
-      test('global in scope', () async {
-        await driver.check(
-            scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
-            expression: 'global',
-            expectedResult: r'''
+          test('global in scope', () async {
+            await driver.check(
+                scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
+                expression: 'global',
+                expectedResult: '''
             (function(inScope, innerInScope) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return foo.global;
             }.bind(this)(
               1,
               0
             ))
             ''');
-      });
+          });
 
-      test('static field in scope', () async {
-        await driver.check(
-            scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
-            expression: 'staticField',
-            expectedResult: r'''
+          test('static field in scope', () async {
+            await driver.check(
+                scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
+                expression: 'staticField',
+                expectedResult: '''
             (function(inScope, innerInScope) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return foo.C.staticField;
             }.bind(this)(
               1,
               0
             ))
             ''');
-      });
+          });
 
-      test('field in scope', () async {
-        await driver.check(
-            scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
-            expression: 'field',
-            expectedResult: '''
+          test('field in scope', () async {
+            await driver.check(
+                scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
+                expression: 'field',
+                expectedResult: '''
             (function(inScope, innerInScope) {
               return this.field;
             }.bind(this)(
@@ -2679,137 +2870,137 @@
               0
             ))
             ''');
-      });
+          });
 
-      test('local not in scope', () async {
-        await driver.check(
-            scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
-            expression: 'notInScope',
-            expectedError:
-                "Error: The getter 'notInScope' isn't defined for the class 'C'.");
-      });
+          test('local not in scope', () async {
+            await driver.check(
+                scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
+                expression: 'notInScope',
+                expectedError:
+                    "Error: The getter 'notInScope' isn't defined for the class 'C'.");
+          });
 
-      test('local not in inner scope', () async {
-        await driver.check(
-            scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
-            expression: 'innerNotInScope',
-            expectedError:
-                "Error: The getter 'innerNotInScope' isn't defined for the class 'C'.");
-      });
-    });
+          test('local not in inner scope', () async {
+            await driver.check(
+                scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
+                expression: 'innerNotInScope',
+                expectedError:
+                    "Error: The getter 'innerNotInScope' isn't defined for the class 'C'.");
+          });
+        });
 
-    group('Expression compiler tests in extension method:', () {
-      var source = '''
-        ${options.dartLangComment}
-        extension NumberParsing on String {
-          int parseInt() {
-            var ret = int.parse(this);
-            /* evaluation placeholder */
-            return ret;
+        group('Expression compiler tests in extension method:', () {
+          var source = '''
+          ${options.dartLangComment}
+          extension NumberParsing on String {
+            int parseInt() {
+              var ret = int.parse(this);
+              /* evaluation placeholder */
+              return ret;
+            }
           }
-        }
-        main() => 0;
-      ''';
+          main() => 0;
+          ''';
 
-      TestDriver driver;
+          TestDriver driver;
 
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
 
-      tearDown(() {
-        driver.delete();
-      });
+          tearDown(() {
+            driver.delete();
+          });
 
-      test('compilation error', () async {
-        await driver.check(
-            scope: <String, String>{'ret': '1234'},
-            expression: 'typo',
-            expectedError: "Error: Getter not found: 'typo'");
-      });
+          test('compilation error', () async {
+            await driver.check(
+                scope: <String, String>{'ret': '1234'},
+                expression: 'typo',
+                expectedError: "Error: Getter not found: 'typo'");
+          });
 
-      test('local (trimmed scope)', () async {
-        // Test that current expression evaluation works in extension methods.
-        //
-        // Note: the actual scope is {#this, ret}, but #this is effectively
-        // removed in the expression compilator because it does not exist
-        // in JavaScript code.
-        // See (full scope) tests for what will the evaluation will look like
-        // when the mapping from dart symbols to JavaScipt symbols is added.
-        await driver.check(
-            scope: <String, String>{'ret': '1234'},
-            expression: 'ret',
-            expectedResult: '''
+          test('local (trimmed scope)', () async {
+            // Test that current expression evaluation works in extension methods.
+            //
+            // Note: the actual scope is {#this, ret}, but #this is effectively
+            // removed in the expression compilator because it does not exist
+            // in JavaScript code.
+            // See (full scope) tests for what will the evaluation will look like
+            // when the mapping from dart symbols to JavaScipt symbols is added.
+            await driver.check(
+                scope: <String, String>{'ret': '1234'},
+                expression: 'ret',
+                expectedResult: '''
             (function(ret) {
               return ret;
             }(
               1234
             ))
             ''');
-      });
+          });
 
-      test('local (full scope)', () async {
-        // Test evalution in extension methods in the future when the mapping
-        // from kernel symbols to dartdevc symbols is added.
-        //
-        // Note: this currently fails due to
-        // - incremental compiler not allowing #this as a parameter name
-        await driver.check(
-            scope: <String, String>{'ret': '1234', '#this': 'this'},
-            expression: 'ret',
-            expectedError:
-                "Illegal parameter name '#this' found during expression compilation.");
-      });
+          test('local (full scope)', () async {
+            // Test evalution in extension methods in the future when the mapping
+            // from kernel symbols to dartdevc symbols is added.
+            //
+            // Note: this currently fails due to
+            // - incremental compiler not allowing #this as a parameter name
+            await driver.check(
+                scope: <String, String>{'ret': '1234', '#this': 'this'},
+                expression: 'ret',
+                expectedError:
+                    "Illegal parameter name '#this' found during expression compilation.");
+          });
 
-      test('this (full scope)', () async {
-        // Test evalution in extension methods in the future when the mapping
-        // from kernel symbols to dartdevc symbols is added.
-        //
-        // Note: this currently fails due to
-        // - incremental compiler not allowing #this as a parameter name
-        // - incremental compiler not mapping 'this' from user input to '#this'
-        await driver.check(
-            scope: <String, String>{'ret': '1234', '#this': 'this'},
-            expression: 'this',
-            expectedError:
-                "Illegal parameter name '#this' found during expression compilation.");
-      });
-    });
+          test('this (full scope)', () async {
+            // Test evalution in extension methods in the future when the mapping
+            // from kernel symbols to dartdevc symbols is added.
+            //
+            // Note: this currently fails due to
+            // - incremental compiler not allowing #this as a parameter name
+            // - incremental compiler not mapping 'this' from user input to '#this'
+            await driver.check(
+                scope: <String, String>{'ret': '1234', '#this': 'this'},
+                expression: 'this',
+                expectedError:
+                    "Illegal parameter name '#this' found during expression compilation.");
+          });
+        });
 
-    group('Expression compiler tests in static function:', () {
-      var source = '''
-        ${options.dartLangComment}
-        int foo(int x, {int y}) {
-          int z = 0;
-          /* evaluation placeholder */
-          return x + y + z;
-        }
+        group('Expression compiler tests in static function:', () {
+          var source = '''
+          ${options.dartLangComment}
+          int foo(int x, {int y}) {
+            int z = 0;
+            /* evaluation placeholder */
+            return x + y + z;
+          }
 
-        main() => 0;
-        ''';
+          main() => 0;
+          ''';
 
-      TestDriver driver;
+          TestDriver driver;
 
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
 
-      tearDown(() {
-        driver.delete();
-      });
+          tearDown(() {
+            driver.delete();
+          });
 
-      test('compilation error', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'y': '2', 'z': '3'},
-            expression: 'typo',
-            expectedError: "Getter not found: \'typo\'");
-      });
+          test('compilation error', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'y': '2', 'z': '3'},
+                expression: 'typo',
+                expectedError: "Getter not found: \'typo\'");
+          });
 
-      test('local', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'y': '2', 'z': '3'},
-            expression: 'x',
-            expectedResult: '''
+          test('local', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'y': '2', 'z': '3'},
+                expression: 'x',
+                expectedResult: '''
             (function(x, y, z) {
               return x;
             }(
@@ -2818,13 +3009,13 @@
               3
             ))
             ''');
-      });
+          });
 
-      test('formal', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'y': '2', 'z': '3'},
-            expression: 'y',
-            expectedResult: '''
+          test('formal', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'y': '2', 'z': '3'},
+                expression: 'y',
+                expectedResult: '''
             (function(x, y, z) {
               return y;
             }(
@@ -2833,13 +3024,13 @@
               3
             ))
             ''');
-      });
+          });
 
-      test('named formal', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'y': '2', 'z': '3'},
-            expression: 'z',
-            expectedResult: '''
+          test('named formal', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'y': '2', 'z': '3'},
+                expression: 'z',
+                expectedResult: '''
             (function(x, y, z) {
               return z;
             }(
@@ -2848,18 +3039,18 @@
               3
             ))
             ''');
-      });
+          });
 
-      test('function', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'y': '2', 'z': '3'},
-            expression: 'main',
-            expectedResult: r'''
+          test('function', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'y': '2', 'z': '3'},
+                expression: 'main',
+                expectedResult: '''
             (function(x, y, z) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               var T = {
                 VoidTodynamic: () => (T.VoidTodynamic = dart.constFn(dart.fnType(dart.dynamic, [])))()
               };
@@ -2877,571 +3068,574 @@
               3
             ))
             ''');
-      });
-    });
+          });
+        });
 
-    group('Expression compiler tests in method:', () {
-      var source = '''
-        ${options.dartLangComment}
-        extension NumberParsing on String {
-          int parseInt() {
-            return int.parse(this);
-          }
-        }
-
-        int global = 42;
-
-        class C {
-          C(int this.field, int this._field);
-
-          static int staticField = 0;
-          static int _staticField = 1;
-
-          int _field;
-          int field;
-
-          int methodFieldAccess(int x) {
-            /* evaluation placeholder */
-            return x + _field + _staticField;
+        group('Expression compiler tests in method:', () {
+          var source = '''
+          ${options.dartLangComment}
+          extension NumberParsing on String {
+            int parseInt() {
+              return int.parse(this);
+            }
           }
 
-          Future<int> asyncMethod(int x) async {
-            return x;
+          int global = 42;
+
+          class C {
+            C(int this.field, int this._field);
+
+            static int staticField = 0;
+            static int _staticField = 1;
+
+            int _field;
+            int field;
+
+            int methodFieldAccess(int x) {
+              /* evaluation placeholder */
+              return x + _field + _staticField;
+            }
+
+            Future<int> asyncMethod(int x) async {
+              return x;
+            }
           }
-        }
 
-        main() => 0;
-        ''';
+          main() => 0;
+          ''';
 
-      TestDriver driver;
+          TestDriver driver;
 
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
 
-      tearDown(() {
-        driver.delete();
-      });
+          tearDown(() {
+            driver.delete();
+          });
 
-      test('compilation error', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'typo',
-            expectedError: "The getter 'typo' isn't defined for the class 'C'");
-      });
+          test('compilation error', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'typo',
+                expectedError:
+                    "The getter 'typo' isn't defined for the class 'C'");
+          });
 
-      test('local', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x',
-            expectedResult: '''
+          test('local', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x',
+                expectedResult: '''
             (function(x) {
               return x;
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('this', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'this',
-            expectedResult: '''
+          test('this', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'this',
+                expectedResult: '''
             (function(x) {
               return this;
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('expression using locals', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x + 1',
-            expectedResult: '''
+          test('expression using locals', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x + 1',
+                expectedResult: '''
             (function(x) {
               return x + 1;
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('expression using static fields', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x + staticField',
-            expectedResult: r'''
+          test('expression using static fields', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x + staticField',
+                expectedResult: '''
             (function(x) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return x + foo.C.staticField;
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('expression using private static fields', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x + _staticField',
-            expectedResult: r'''
+          test('expression using private static fields', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x + _staticField',
+                expectedResult: '''
             (function(x) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return x + foo.C._staticField;
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('expression using fields', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x + field',
-            expectedResult: '''
+          test('expression using fields', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x + field',
+                expectedResult: '''
             (function(x) {
               return x + this.field;
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('expression using private fields', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x + _field',
-            expectedResult: r'''
+          test('expression using private fields', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x + _field',
+                expectedResult: '''
             (function(x) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
-              var S = {_field$1: dart.privateName(foo, "_field")};
-              return x + this[S._field$1];
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
+              var S = {_field\$1: dart.privateName(foo, "_field")};
+              return x + this[S._field\$1];
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('expression using globals', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x + global',
-            expectedResult: r'''
+          test('expression using globals', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x + global',
+                expectedResult: '''
             (function(x) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return x + foo.global;
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('method call', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'methodFieldAccess(2)',
-            expectedResult: '''
+          test('method call', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'methodFieldAccess(2)',
+                expectedResult: '''
             (function(x) {
               return this.methodFieldAccess(2);
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('async method call', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'asyncMethod(2)',
-            expectedResult: '''
+          test('async method call', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'asyncMethod(2)',
+                expectedResult: '''
             (function(x) {
               return this.asyncMethod(2);
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('extension method call', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: '"1234".parseInt()',
-            expectedResult: r'''
+          test('extension method call', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: '"1234".parseInt()',
+                expectedResult: '''
             (function(x) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return foo['NumberParsing|parseInt']("1234");
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('private field modification', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: '_field = 2',
-            expectedResult: r'''
+          test('private field modification', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: '_field = 2',
+                expectedResult: '''
             (function(x) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
-              var S = {_field$1: dart.privateName(foo, "_field")};
-              return this[S._field$1] = 2;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
+              var S = {_field\$1: dart.privateName(foo, "_field")};
+              return this[S._field\$1] = 2;
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('field modification', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'field = 2',
-            expectedResult: '''
+          test('field modification', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'field = 2',
+                expectedResult: '''
             (function(x) {
               return this.field = 2;
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('private static field modification', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: '_staticField = 2',
-            expectedResult: r'''
+          test('private static field modification', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: '_staticField = 2',
+                expectedResult: '''
             (function(x) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return foo.C._staticField = 2;
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('static field modification', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'staticField = 2',
-            expectedResult: r'''
+          test('static field modification', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'staticField = 2',
+                expectedResult: '''
             (function(x) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return foo.C.staticField = 2;
             }.bind(this)(
               1
             ))
             ''');
-      });
-    });
+          });
+        });
 
-    group('Expression compiler tests in method with no field access:', () {
-      var source = '''
-        ${options.dartLangComment}
-        extension NumberParsing on String {
-          int parseInt() {
-            return int.parse(this);
-          }
-        }
-
-        int global = 42;
-
-        class C {
-          C(int this.field, int this._field);
-
-          static int staticField = 0;
-          static int _staticField = 1;
-
-          int _field;
-          int field;
-
-          int methodNoFieldAccess(int x) {
-            /* evaluation placeholder */
-            return x;
+        group('Expression compiler tests in method with no field access:', () {
+          var source = '''
+          ${options.dartLangComment}
+          extension NumberParsing on String {
+            int parseInt() {
+              return int.parse(this);
+            }
           }
 
-          Future<int> asyncMethod(int x) async {
-            return x;
+          int global = 42;
+
+          class C {
+            C(int this.field, int this._field);
+
+            static int staticField = 0;
+            static int _staticField = 1;
+
+            int _field;
+            int field;
+
+            int methodNoFieldAccess(int x) {
+              /* evaluation placeholder */
+              return x;
+            }
+
+            Future<int> asyncMethod(int x) async {
+              return x;
+            }
           }
-        }
 
-        main() => 0;
-        ''';
+          main() => 0;
+          ''';
 
-      TestDriver driver;
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
+          TestDriver driver;
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
 
-      tearDown(() {
-        driver.delete();
-      });
+          tearDown(() {
+            driver.delete();
+          });
 
-      test('compilation error', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'typo',
-            expectedError: "The getter 'typo' isn't defined for the class 'C'");
-      });
+          test('compilation error', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'typo',
+                expectedError:
+                    "The getter 'typo' isn't defined for the class 'C'");
+          });
 
-      test('expression using static fields', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x + staticField',
-            expectedResult: r'''
+          test('expression using static fields', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x + staticField',
+                expectedResult: '''
             (function(x) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return x + foo.C.staticField;
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('expression using private static fields', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x + _staticField',
-            expectedResult: r'''
+          test('expression using private static fields', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x + _staticField',
+                expectedResult: '''
             (function(x) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return x + foo.C._staticField;
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('expression using fields', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x + field',
-            expectedResult: '''
+          test('expression using fields', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x + field',
+                expectedResult: '''
             (function(x) {
               return x + this.field;
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('expression using private fields', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x + _field',
-            expectedResult: r'''
+          test('expression using private fields', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x + _field',
+                expectedResult: '''
             (function(x) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
-              var S = {_field$1: dart.privateName(foo, "_field")};
-              return x + this[S._field$1];
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
+              var S = {_field\$1: dart.privateName(foo, "_field")};
+              return x + this[S._field\$1];
             }.bind(this)(
             1
             ))
             ''');
-      });
+          });
 
-      test('private field modification', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: '_field = 2',
-            expectedResult: r'''
+          test('private field modification', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: '_field = 2',
+                expectedResult: '''
             (function(x) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
-              var S = {_field$1: dart.privateName(foo, "_field")};
-              return this[S._field$1] = 2;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
+              var S = {_field\$1: dart.privateName(foo, "_field")};
+              return this[S._field\$1] = 2;
             }.bind(this)(
             1
             ))
             ''');
-      });
+          });
 
-      test('field modification', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'field = 2',
-            expectedResult: '''
+          test('field modification', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'field = 2',
+                expectedResult: '''
             (function(x) {
               return this.field = 2;
             }.bind(this)(
             1
             ))
             ''');
-      });
+          });
 
-      test('private static field modification', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: '_staticField = 2',
-            expectedResult: r'''
+          test('private static field modification', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: '_staticField = 2',
+                expectedResult: '''
             (function(x) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return foo.C._staticField = 2;
             }.bind(this)(
             1
             ))
             ''');
-      });
+          });
 
-      test('static field modification', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'staticField = 2',
-            expectedResult: r'''
+          test('static field modification', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'staticField = 2',
+                expectedResult: '''
             (function(x) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return foo.C.staticField = 2;
             }.bind(this)(
             1
             ))
             ''');
-      });
-    });
+          });
+        });
 
-    group('Expression compiler tests in async method:', () {
-      var source = '''
-        ${options.dartLangComment}
-        class C {
-          C(int this.field, int this._field);
+        group('Expression compiler tests in async method:', () {
+          var source = '''
+          ${options.dartLangComment}
+          class C {
+            C(int this.field, int this._field);
 
-          int _field;
-          int field;
+            int _field;
+            int field;
 
-          Future<int> asyncMethod(int x) async {
-            /* evaluation placeholder */
-            return x;
+            Future<int> asyncMethod(int x) async {
+              /* evaluation placeholder */
+              return x;
+            }
           }
-        }
 
-        main() => 0;
-        ''';
+          main() => 0;
+          ''';
 
-      TestDriver driver;
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
+          TestDriver driver;
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
 
-      tearDown(() {
-        driver.delete();
-      });
+          tearDown(() {
+            driver.delete();
+          });
 
-      test('compilation error', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'typo',
-            expectedError: "The getter 'typo' isn't defined for the class 'C'");
-      });
+          test('compilation error', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'typo',
+                expectedError:
+                    "The getter 'typo' isn't defined for the class 'C'");
+          });
 
-      test('local', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x',
-            expectedResult: '''
+          test('local', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x',
+                expectedResult: '''
             (function(x) {
               return x;
             }.bind(this)(
             1
             ))
             ''');
-      });
+          });
 
-      test('this', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'this',
-            expectedResult: '''
+          test('this', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'this',
+                expectedResult: '''
             (function(x) {
               return this;
             }.bind(this)(
             1
             ))
             ''');
-      });
-    });
+          });
+        });
 
-    group('Expression compiler tests in global function:', () {
-      var source = '''
-        ${options.dartLangComment}
-        extension NumberParsing on String {
-          int parseInt() {
-            return int.parse(this);
-          }
-        }
-
-        int global = 42;
-
-        class C {
-          C(int this.field, int this._field);
-
-          static int staticField = 0;
-          static int _staticField = 1;
-
-          int _field;
-          int field;
-
-          int methodFieldAccess(int x) {
-            return (x + _field + _staticField);
-          }
-          int methodFieldAccess(int x) {
-            return (x)
+        group('Expression compiler tests in global function:', () {
+          var source = '''
+          ${options.dartLangComment}
+          extension NumberParsing on String {
+            int parseInt() {
+              return int.parse(this);
+            }
           }
 
-          Future<int> asyncMethod(int x) async {
-            return x;
+          int global = 42;
+
+          class C {
+            C(int this.field, int this._field);
+
+            static int staticField = 0;
+            static int _staticField = 1;
+
+            int _field;
+            int field;
+
+            int methodFieldAccess(int x) {
+              return (x + _field + _staticField);
+            }
+            int methodFieldAccess(int x) {
+              return (x)
+            }
+
+            Future<int> asyncMethod(int x) async {
+              return x;
+            }
           }
-        }
 
-        int main() {
-          int x = 15;
-          var c = C(1, 2);
-          /* evaluation placeholder */
-          return 0;
-        }
-        ''';
+          int main() {
+            int x = 15;
+            var c = C(1, 2);
+            /* evaluation placeholder */
+            return 0;
+          }
+          ''';
 
-      TestDriver driver;
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
+          TestDriver driver;
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
 
-      tearDown(() {
-        driver.delete();
-      });
+          tearDown(() {
+            driver.delete();
+          });
 
-      test('compilation error', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: 'typo',
-            expectedError: "Getter not found: 'typo'.");
-      });
+          test('compilation error', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: 'typo',
+                expectedError: "Getter not found: 'typo'.");
+          });
 
-      test('local with primitive type', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: 'x',
-            expectedResult: '''
+          test('local with primitive type', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: 'x',
+                expectedResult: '''
             (function(x, c) {
               return x;
             }(
@@ -3449,13 +3643,13 @@
               null
             ))
             ''');
-      });
+          });
 
-      test('local object', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: 'c',
-            expectedResult: '''
+          test('local object', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: 'c',
+                expectedResult: '''
             (function(x, c) {
               return c;
             }(
@@ -3463,71 +3657,71 @@
               null
             ))
             ''');
-      });
+          });
 
-      test('create new object', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: 'C(1,3)',
-            expectedResult: r'''
+          test('create new object', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: 'C(1,3)',
+                expectedResult: '''
             (function(x, c) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return new foo.C.new(1, 3);
             }(
               1,
               null
             ))
             ''');
-      });
+          });
 
-      test('access field of new object', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: 'C(1,3)._field',
-            expectedResult: r'''
+          test('access field of new object', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: 'C(1,3)._field',
+                expectedResult: '''
             (function(x, c) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
-              var S = {_field$1: dart.privateName(foo, "_field")};
-              return new foo.C.new(1, 3)[S._field$1];
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
+              var S = {_field\$1: dart.privateName(foo, "_field")};
+              return new foo.C.new(1, 3)[S._field\$1];
             }(
               1,
               null
             ))
             ''');
-      });
+          });
 
-      test('access static field', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: 'C.staticField',
-            expectedResult: r'''
+          test('access static field', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: 'C.staticField',
+                expectedResult: '''
             (function(x, c) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return foo.C.staticField;
             }(
               1,
               null
             ))
             ''');
-      });
+          });
 
-      test('expression using private static fields', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: 'C._staticField',
-            expectedError: "Error: Getter not found: '_staticField'.");
-      });
+          test('expression using private static fields', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: 'C._staticField',
+                expectedError: "Error: Getter not found: '_staticField'.");
+          });
 
-      test('access field', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: 'c.field',
-            expectedResult: '''
+          test('access field', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: 'c.field',
+                expectedResult: '''
             (function(x, c) {
               return c.field;
             }(
@@ -3535,32 +3729,32 @@
               null
             ))
             ''');
-      });
+          });
 
-      test('access private field', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: 'c._field',
-            expectedResult: r'''
+          test('access private field', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: 'c._field',
+                expectedResult: '''
             (function(x, c) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
-              var S = {_field$1: dart.privateName(foo, "_field")};
-              return c[S._field$1];
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
+              var S = {_field\$1: dart.privateName(foo, "_field")};
+              return c[S._field\$1];
             }(
                 1,
                 null
             ))
             ''');
-      });
+          });
 
-      test('method call', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: 'c.methodFieldAccess(2)',
-            expectedResult: '''
+          test('method call', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: 'c.methodFieldAccess(2)',
+                expectedResult: '''
             (function(x, c) {
               return c.methodFieldAccess(2);
             }(
@@ -3568,13 +3762,13 @@
               null
             ))
             ''');
-      });
+          });
 
-      test('async method call', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: 'c.asyncMethod(2)',
-            expectedResult: '''
+          test('async method call', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: 'c.asyncMethod(2)',
+                expectedResult: '''
             (function(x, c) {
               return c.asyncMethod(2);
             }(
@@ -3582,48 +3776,48 @@
               null
             ))
             ''');
-      });
+          });
 
-      test('extension method call', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: '"1234".parseInt()',
-            expectedResult: r'''
+          test('extension method call', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: '"1234".parseInt()',
+                expectedResult: '''
             (function(x, c) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return foo['NumberParsing|parseInt']("1234");
             }(
               1,
               null
             ))
             ''');
-      });
+          });
 
-      test('private field modification', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: 'c._field = 2',
-            expectedResult: r'''
+          test('private field modification', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: 'c._field = 2',
+                expectedResult: '''
             (function(x, c) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
-              var S = {_field$1: dart.privateName(foo, "_field")};
-              return c[S._field$1] = 2;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
+              var S = {_field\$1: dart.privateName(foo, "_field")};
+              return c[S._field\$1] = 2;
             }(
               1,
               null
             ))
             ''');
-      });
+          });
 
-      test('field modification', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: 'c.field = 2',
-            expectedResult: '''
+          test('field modification', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: 'c.field = 2',
+                expectedResult: '''
             (function(x, c) {
               return c.field = 2;
             }(
@@ -3631,38 +3825,38 @@
               null
             ))
             ''');
-      });
+          });
 
-      test('private static field modification', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: 'C._staticField = 2',
-            expectedError: "Setter not found: '_staticField'.");
-      });
+          test('private static field modification', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: 'C._staticField = 2',
+                expectedError: "Setter not found: '_staticField'.");
+          });
 
-      test('static field modification', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: 'C.staticField = 2',
-            expectedResult: r'''
+          test('static field modification', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: 'C.staticField = 2',
+                expectedResult: '''
             (function(x, c) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return foo.C.staticField = 2;
             }(
               1,
               null
             ))
             ''');
-      });
+          });
 
-      test('call global function from core library', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: 'print(x)',
-            expectedResult: '''
+          test('call global function from core library', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: 'print(x)',
+                expectedResult: '''
             (function(x, c) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const core = dart_sdk.core;
               return core.print(x);
             }(
@@ -3670,54 +3864,61 @@
               null
             ))
             ''');
-      });
-    });
+          });
+        });
 
-    group('Expression compiler tests in closures:', () {
-      var source = '''
-        ${options.dartLangComment}
-        int globalFunction() {
-        int x = 15;
-        var c = C(1, 2);
+        group('Expression compiler tests in closures:', () {
+          var source = '''
+          ${options.dartLangComment}
+          int globalFunction() {
+            int x = 15;
+            var c = C(1, 2);
 
-        var outerClosure = (int y) {
-          var closureCaptureInner = (int z) {
-            /* evaluation placeholder */
-            print('\$y+\$z');
-          };
-          closureCaptureInner(0);
-        };
+            var outerClosure = (int y) {
+              var closureCaptureInner = (int z) {
+                /* evaluation placeholder */
+                print('\$y+\$z');
+              };
+              closureCaptureInner(0);
+            };
 
-        outerClosure(3);
-        return 0;
-      }
+            outerClosure(3);
+            return 0;
+          }
 
-      main() => 0;
-      ''';
+          main() => 0;
+          ''';
 
-      TestDriver driver;
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
+          TestDriver driver;
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
 
-      tearDown(() {
-        driver.delete();
-      });
+          tearDown(() {
+            driver.delete();
+          });
 
-      test('compilation error', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null', 'y': '3', 'z': '0'},
-            expression: 'typo',
-            expectedError: "Getter not found: 'typo'.");
-      });
+          test('compilation error', () async {
+            await driver.check(scope: <String, String>{
+              'x': '1',
+              'c': 'null',
+              'y': '3',
+              'z': '0'
+            }, expression: 'typo', expectedError: "Getter not found: 'typo'.");
+          });
 
-      test('expression using uncaptured variables', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null', 'y': '3', 'z': '0'},
-            expression: r"'$x+$y+$z'",
-            expectedResult: '''
+          test('expression using uncaptured variables', () async {
+            await driver.check(
+                scope: <String, String>{
+                  'x': '1',
+                  'c': 'null',
+                  'y': '3',
+                  'z': '0'
+                },
+                expression: "'\$x+\$y+\$z'",
+                expectedResult: '''
             (function(x, c, y, z) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
               return dart.str(x) + "+" + dart.str(y) + "+" + dart.str(z);
             }(
@@ -3727,15 +3928,20 @@
               0
             ))
             ''');
-      });
+          });
 
-      test('expression using captured variables', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null', 'y': '3', 'z': '0'},
-            expression: r"'$y+$z'",
-            expectedResult: '''
+          test('expression using captured variables', () async {
+            await driver.check(
+                scope: <String, String>{
+                  'x': '1',
+                  'c': 'null',
+                  'y': '3',
+                  'z': '0'
+                },
+                expression: "'\$y+\$z'",
+                expectedResult: '''
             (function(x, c, y, z) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
               return dart.str(y) + "+" + dart.str(z);
             }(
@@ -3745,99 +3951,99 @@
               0
             ))
             ''');
-      });
-    });
+          });
+        });
 
-    group('Expression compiler tests in method with no type use:', () {
-      var source = '''
-        ${options.dartLangComment}
-        abstract class Key {
-          const factory Key(String value) = ValueKey;
-          const Key.empty();
-        }
+        group('Expression compiler tests in method with no type use:', () {
+          var source = '''
+          ${options.dartLangComment}
+          abstract class Key {
+            const factory Key(String value) = ValueKey;
+            const Key.empty();
+          }
 
-        abstract class LocalKey extends Key {
-          const LocalKey() : super.empty();
-        }
+          abstract class LocalKey extends Key {
+            const LocalKey() : super.empty();
+          }
 
-        class ValueKey implements LocalKey {
-          const ValueKey(this.value);
-          final String value;
-        }
+          class ValueKey implements LocalKey {
+            const ValueKey(this.value);
+            final String value;
+          }
 
-        class MyClass {
-          const MyClass(this._t);
-          final int _t;
-        }
+          class MyClass {
+            const MyClass(this._t);
+            final int _t;
+          }
 
-        int bar(int p){
-          return p;
-        }
-        int baz(String t){
-          return t;
-        }
-        void main() {
-          var k = Key('t');
-          MyClass c = MyClass(0);
-          int p = 1;
-          const t = 1;
+          int bar(int p){
+            return p;
+          }
+          int baz(String t){
+            return t;
+          }
+          void main() {
+            var k = Key('t');
+            MyClass c = MyClass(0);
+            int p = 1;
+            const t = 1;
 
-          /* evaluation placeholder */
-          print('\$c, \$k, \$t');
-        }
-        ''';
+            /* evaluation placeholder */
+            print('\$c, \$k, \$t');
+          }
+          ''';
 
-      TestDriver driver;
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
+          TestDriver driver;
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
 
-      tearDown(() {
-        driver.delete();
-      });
+          tearDown(() {
+            driver.delete();
+          });
 
-      test('call function not using type', () async {
-        await driver.check(
-            scope: <String, String>{'p': '1'},
-            expression: 'bar(p)',
-            expectedResult: r'''
+          test('call function not using type', () async {
+            await driver.check(
+                scope: <String, String>{'p': '1'},
+                expression: 'bar(p)',
+                expectedResult: '''
             (function(p) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return foo.bar(p);
             }(
               1
             ))
             ''');
-      });
+          });
 
-      test('call function using type', () async {
-        await driver.check(
-            scope: <String, String>{'p': '0'},
-            expression: 'baz(p as String)',
-            expectedResult: r'''
+          test('call function using type', () async {
+            await driver.check(
+                scope: <String, String>{'p': '0'},
+                expression: 'baz(p as String)',
+                expectedResult: '''
             (function(p) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const core = dart_sdk.core;
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return foo.baz(core.String.as(p));
             }(
               0
             ))
             ''');
-      });
+          });
 
-      test('evaluate new const expression', () async {
-        await driver.check(
-            scope: <String, String>{'p': '1'},
-            expression: 'const MyClass(1)',
-            expectedResult: r'''
+          test('evaluate new const expression', () async {
+            await driver.check(
+                scope: <String, String>{'p': '1'},
+                expression: 'const MyClass(1)',
+                expectedResult: '''
             (function(p) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               var S = {MyClass__t: dart.privateName(foo, "MyClass._t")};
               const CT = Object.create(null);
               dart.defineLazy(CT, {
@@ -3854,47 +4060,47 @@
               1
             ))
             ''');
-      });
+          });
 
-      test('evaluate optimized const expression', () async {
-        await driver.check(
-            scope: <String, String>{},
-            expression: 't',
-            expectedResult: '''
+          test('evaluate optimized const expression', () async {
+            await driver.check(
+                scope: <String, String>{},
+                expression: 't',
+                expectedResult: '''
             (function() {
               return 1;
             }(
             ))
             ''');
-      },
-          skip: 'Cannot compile constants optimized away by the frontend. '
-              'Issue: https://github.com/dart-lang/sdk/issues/41999');
+          },
+              skip: 'Cannot compile constants optimized away by the frontend. '
+                  'Issue: https://github.com/dart-lang/sdk/issues/41999');
 
-      test('evaluate factory constructor call', () async {
-        await driver.check(
-            scope: <String, String>{'p': '1'},
-            expression: "Key('t')",
-            expectedResult: r'''
+          test('evaluate factory constructor call', () async {
+            await driver.check(
+                scope: <String, String>{'p': '1'},
+                expression: "Key('t')",
+                expectedResult: '''
             (function(p) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return new foo.ValueKey.new("t");
             }(
               1
             ))
             ''');
-      });
+          });
 
-      test('evaluate const factory constructor call', () async {
-        await driver.check(
-            scope: <String, String>{'p': '1'},
-            expression: "const Key('t')",
-            expectedResult: r'''
+          test('evaluate const factory constructor call', () async {
+            await driver.check(
+                scope: <String, String>{'p': '1'},
+                expression: "const Key('t')",
+                expectedResult: '''
             (function(p) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               var S = {ValueKey_value: dart.privateName(foo, "ValueKey.value")};
               const CT = Object.create(null);
               dart.defineLazy(CT, {
@@ -3911,311 +4117,312 @@
               1
             ))
             ''');
-      });
-    });
+          });
+        });
 
-    group('Expression compiler tests in constructor:', () {
-      var source = '''
-        ${options.dartLangComment}
-        extension NumberParsing on String {
-          int parseInt() {
-            return int.parse(this);
-          }
-        }
-
-        int global = 42;
-
-        class C {
-          C(int this.field, int this._field) {
-            int x = 1;
-            /* evaluation placeholder */
-            print(this.field);
+        group('Expression compiler tests in constructor:', () {
+          var source = '''
+          ${options.dartLangComment}
+          extension NumberParsing on String {
+            int parseInt() {
+              return int.parse(this);
+            }
           }
 
-          static int staticField = 0;
-          static int _staticField = 1;
+          int global = 42;
 
-          int _field;
-          int field;
+          class C {
+            C(int this.field, int this._field) {
+              int x = 1;
+              /* evaluation placeholder */
+              print(this.field);
+            }
 
-          int methodFieldAccess(int t) {
-            return t + _field + _staticField;
+            static int staticField = 0;
+            static int _staticField = 1;
+
+            int _field;
+            int field;
+
+            int methodFieldAccess(int t) {
+              return t + _field + _staticField;
+            }
+
+            Future<int> asyncMethod(int t) async {
+              return t;
+            }
           }
 
-          Future<int> asyncMethod(int t) async {
-            return t;
-          }
-        }
+          main() => 0;
+          ''';
 
-        main() => 0;
-        ''';
+          TestDriver driver;
 
-      TestDriver driver;
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
 
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
+          tearDown(() {
+            driver.delete();
+          });
 
-      tearDown(() {
-        driver.delete();
-      });
+          test('compilation error', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'typo',
+                expectedError:
+                    "The getter 'typo' isn't defined for the class 'C'");
+          });
 
-      test('compilation error', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'typo',
-            expectedError: "The getter 'typo' isn't defined for the class 'C'");
-      });
-
-      test('local', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x',
-            expectedResult: '''
+          test('local', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x',
+                expectedResult: '''
             (function(x) {
               return x;
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('this', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'this',
-            expectedResult: '''
+          test('this', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'this',
+                expectedResult: '''
             (function(x) {
               return this;
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('expression using locals', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x + 1',
-            expectedResult: '''
+          test('expression using locals', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x + 1',
+                expectedResult: '''
             (function(x) {
               return x + 1;
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('expression using static fields', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x + staticField',
-            expectedResult: r'''
+          test('expression using static fields', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x + staticField',
+                expectedResult: '''
             (function(x) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return x + foo.C.staticField;
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('expression using private static fields', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x + _staticField',
-            expectedResult: r'''
+          test('expression using private static fields', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x + _staticField',
+                expectedResult: '''
             (function(x) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return x + foo.C._staticField;
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('expression using fields', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x + field',
-            expectedResult: '''
+          test('expression using fields', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x + field',
+                expectedResult: '''
             (function(x) {
               return x + this.field;
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('expression using private fields', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x + _field',
-            expectedResult: r'''
+          test('expression using private fields', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x + _field',
+                expectedResult: '''
             (function(x) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
-              var S = {_field$1: dart.privateName(foo, "_field")};
-              return x + this[S._field$1];
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
+              var S = {_field\$1: dart.privateName(foo, "_field")};
+              return x + this[S._field\$1];
             }.bind(this)(
                 1
             ))
             ''');
-      });
+          });
 
-      test('expression using globals', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'x + global',
-            expectedResult: r'''
+          test('expression using globals', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'x + global',
+                expectedResult: '''
             (function(x) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return x + foo.global;
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('method call', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'methodFieldAccess(2)',
-            expectedResult: '''
+          test('method call', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'methodFieldAccess(2)',
+                expectedResult: '''
             (function(x) {
               return this.methodFieldAccess(2);
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('async method call', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'asyncMethod(2)',
-            expectedResult: '''
+          test('async method call', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'asyncMethod(2)',
+                expectedResult: '''
             (function(x) {
               return this.asyncMethod(2);
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('extension method call', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: '"1234".parseInt()',
-            expectedResult: r'''
+          test('extension method call', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: '"1234".parseInt()',
+                expectedResult: '''
             (function(x) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return foo['NumberParsing|parseInt']("1234");
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('private field modification', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: '_field = 2',
-            expectedResult: r'''
+          test('private field modification', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: '_field = 2',
+                expectedResult: '''
           (function(x) {
-            const dart_sdk = require('dart_sdk');
+            const dart_sdk = ${options.loadModule}('dart_sdk');
             const dart = dart_sdk.dart;
-            const foo$46dart = require('foo.dart');
-            const foo = foo$46dart.foo;
-            var S = {_field$1: dart.privateName(foo, "_field")};
-            return this[S._field$1] = 2;
+            const foo\$46dart = ${options.loadModule}('foo.dart');
+            const foo = foo\$46dart.foo;
+            var S = {_field\$1: dart.privateName(foo, "_field")};
+            return this[S._field\$1] = 2;
           }.bind(this)(
             1
           ))
           ''');
-      });
+          });
 
-      test('field modification', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'field = 2',
-            expectedResult: '''
+          test('field modification', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'field = 2',
+                expectedResult: '''
             (function(x) {
               return this.field = 2;
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('private static field modification', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: '_staticField = 2',
-            expectedResult: r'''
+          test('private static field modification', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: '_staticField = 2',
+                expectedResult: '''
             (function(x) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return foo.C._staticField = 2;
             }.bind(this)(
               1
             ))
             ''');
-      });
+          });
 
-      test('static field modification', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1'},
-            expression: 'staticField = 2',
-            expectedResult: r'''
+          test('static field modification', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1'},
+                expression: 'staticField = 2',
+                expectedResult: '''
             (function(x) {
-              const foo$46dart = require('foo.dart');
-              const foo = foo$46dart.foo;
+              const foo\$46dart = ${options.loadModule}('foo.dart');
+              const foo = foo\$46dart.foo;
               return foo.C.staticField = 2;
             }.bind(this)(
               1
             ))
             ''');
-      });
-    });
+          });
+        });
 
-    group('Expression compiler tests in loops:', () {
-      var source = '''
-        ${options.dartLangComment}
-        int globalFunction() {
-          int x = 15;
-          var c = C(1, 2);
+        group('Expression compiler tests in loops:', () {
+          var source = '''
+          ${options.dartLangComment}
+          int globalFunction() {
+            int x = 15;
+            var c = C(1, 2);
 
-          for(int i = 0; i < 10; i++) {
-            /* evaluation placeholder */
-            print('\$i+\$x');
-          };
-          return 0;
-        }
+            for(int i = 0; i < 10; i++) {
+              /* evaluation placeholder */
+              print('\$i+\$x');
+            };
+            return 0;
+          }
 
-        main() => 0;
-        ''';
+          main() => 0;
+          ''';
 
-      TestDriver driver;
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
+          TestDriver driver;
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
 
-      tearDown(() {
-        driver.delete();
-      });
+          tearDown(() {
+            driver.delete();
+          });
 
-      test('expression using local', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null', 'i': '0'},
-            expression: 'x',
-            expectedResult: '''
+          test('expression using local', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null', 'i': '0'},
+                expression: 'x',
+                expectedResult: '''
             (function(x, c, i) {
               return x;
             }(
@@ -4224,13 +4431,13 @@
               0
             ))
             ''');
-      });
+          });
 
-      test('expression using loop variable', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null', 'i': '0'},
-            expression: 'i',
-            expectedResult: '''
+          test('expression using loop variable', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null', 'i': '0'},
+                expression: 'i',
+                expectedResult: '''
             (function(x, c, i) {
               return i;
             }(
@@ -4239,39 +4446,39 @@
               0
             ))
             ''');
-      });
-    });
+          });
+        });
 
-    group('Expression compiler tests in iterator loops:', () {
-      var source = '''
-        ${options.dartLangComment}
-        int globalFunction() {
-          var l = <String>['1', '2', '3'];
+        group('Expression compiler tests in iterator loops:', () {
+          var source = '''
+          ${options.dartLangComment}
+          int globalFunction() {
+            var l = <String>['1', '2', '3'];
 
-          for(var e in l) {
-            /* evaluation placeholder */
-            print(e);
-          };
-          return 0;
-        }
+            for(var e in l) {
+              /* evaluation placeholder */
+              print(e);
+            };
+            return 0;
+          }
 
-        main() => 0;
-        ''';
+          main() => 0;
+          ''';
 
-      TestDriver driver;
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
+          TestDriver driver;
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
 
-      tearDown(() {
-        driver.delete();
-      });
+          tearDown(() {
+            driver.delete();
+          });
 
-      test('expression loop variable', () async {
-        await driver.check(
-            scope: <String, String>{'l': 'null', 'e': '1'},
-            expression: 'e',
-            expectedResult: '''
+          test('expression loop variable', () async {
+            await driver.check(
+                scope: <String, String>{'l': 'null', 'e': '1'},
+                expression: 'e',
+                expectedResult: '''
             (function(l, e) {
               return e;
             }(
@@ -4279,44 +4486,44 @@
               1
             ))
             ''');
-      });
-    });
+          });
+        });
 
-    group('Expression compiler tests in conditional (then):', () {
-      var source = '''
-        ${options.dartLangComment}
-        int globalFunction() {
-          int x = 1;
-          var c = C(1, 2);
+        group('Expression compiler tests in conditional (then):', () {
+          var source = '''
+          ${options.dartLangComment}
+          int globalFunction() {
+            int x = 1;
+            var c = C(1, 2);
 
-          if (x == 14) {
-            int y = 3;
-            /* evaluation placeholder */
-            print('\$y+\$x');
-          } else {
-            int z = 3;
-            print('\$z+\$x');
+            if (x == 14) {
+              int y = 3;
+              /* evaluation placeholder */
+              print('\$y+\$x');
+            } else {
+              int z = 3;
+              print('\$z+\$x');
+            }
+            return 0;
           }
-          return 0;
-        }
 
-        main() => 0;
-        ''';
+          main() => 0;
+          ''';
 
-      TestDriver driver;
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
+          TestDriver driver;
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
 
-      tearDown(() {
-        driver.delete();
-      });
+          tearDown(() {
+            driver.delete();
+          });
 
-      test('expression using local', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null', 'y': '3'},
-            expression: 'y',
-            expectedResult: '''
+          test('expression using local', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null', 'y': '3'},
+                expression: 'y',
+                expectedResult: '''
             (function(x, c, y) {
               return y;
             }(
@@ -4325,51 +4532,51 @@
               3
             ))
             ''');
-      });
+          });
 
-      test('expression using local out of scope', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null', 'y': '3'},
-            expression: 'z',
-            expectedError: "Error: Getter not found: 'z'");
-      });
-    });
+          test('expression using local out of scope', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null', 'y': '3'},
+                expression: 'z',
+                expectedError: "Error: Getter not found: 'z'");
+          });
+        });
 
-    group('Expression compiler tests in conditional (else):', () {
-      var source = '''
-        ${options.dartLangComment}
-        int globalFunction() {
-          int x = 1;
-          var c = C(1, 2);
+        group('Expression compiler tests in conditional (else):', () {
+          var source = '''
+          ${options.dartLangComment}
+          int globalFunction() {
+            int x = 1;
+            var c = C(1, 2);
 
-          if (x == 14) {
-            int y = 3;
-            print('\$y+\$x');
-          } else {
-            int z = 3;
-            /* evaluation placeholder */
-            print('\$z+\$x');
+            if (x == 14) {
+              int y = 3;
+              print('\$y+\$x');
+            } else {
+              int z = 3;
+              /* evaluation placeholder */
+              print('\$z+\$x');
+            }
+            return 0;
           }
-          return 0;
-        }
 
-        main() => 0;
-        ''';
+          main() => 0;
+          ''';
 
-      TestDriver driver;
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
+          TestDriver driver;
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
 
-      tearDown(() {
-        driver.delete();
-      });
+          tearDown(() {
+            driver.delete();
+          });
 
-      test('expression using local', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null', 'z': '3'},
-            expression: 'z',
-            expectedResult: '''
+          test('expression using local', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null', 'z': '3'},
+                expression: 'z',
+                expectedResult: '''
             (function(x, c, z) {
               return z;
             }(
@@ -4378,51 +4585,51 @@
               3
             ))
             ''');
-      });
+          });
 
-      test('expression using local out of scope', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null', 'z': '3'},
-            expression: 'y',
-            expectedError: "Error: Getter not found: 'y'");
-      });
-    });
+          test('expression using local out of scope', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null', 'z': '3'},
+                expression: 'y',
+                expectedError: "Error: Getter not found: 'y'");
+          });
+        });
 
-    group('Expression compiler tests after conditionals:', () {
-      var source = '''
-        ${options.dartLangComment}
-        int globalFunction() {
-          int x = 1;
-          var c = C(1, 2);
+        group('Expression compiler tests after conditionals:', () {
+          var source = '''
+          ${options.dartLangComment}
+          int globalFunction() {
+            int x = 1;
+            var c = C(1, 2);
 
-          if (x == 14) {
-            int y = 3;
-            print('\$y+\$x');
-          } else {
-            int z = 3;
-            print('\$z+\$x');
+            if (x == 14) {
+              int y = 3;
+              print('\$y+\$x');
+            } else {
+              int z = 3;
+              print('\$z+\$x');
+            }
+            /* evaluation placeholder */
+            return 0;
           }
-          /* evaluation placeholder */
-          return 0;
-        }
 
-        main() => 0;
-        ''';
+          main() => 0;
+          ''';
 
-      TestDriver driver;
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
+          TestDriver driver;
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
 
-      tearDown(() {
-        driver.delete();
-      });
+          tearDown(() {
+            driver.delete();
+          });
 
-      test('expression using local', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: 'x',
-            expectedResult: '''
+          test('expression using local', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: 'x',
+                expectedResult: '''
             (function(x, c) {
               return x;
             }(
@@ -4430,49 +4637,49 @@
               null
             ))
             ''');
-      });
+          });
 
-      test('expression using local out of scope', () async {
-        await driver.check(
-            scope: <String, String>{'x': '1', 'c': 'null'},
-            expression: 'z',
-            expectedError: "Error: Getter not found: 'z'");
-      });
-    });
+          test('expression using local out of scope', () async {
+            await driver.check(
+                scope: <String, String>{'x': '1', 'c': 'null'},
+                expression: 'z',
+                expectedError: "Error: Getter not found: 'z'");
+          });
+        });
 
-    group('Expression compiler tests in generic method:', () {
-      var source = '''
-        ${options.dartLangComment}
-        class A {
-          void generic<TType, KType>(TType a, KType b) {
-            /* evaluation placeholder */
-            print(a);
-            print(b);
+        group('Expression compiler tests in generic method:', () {
+          var source = '''
+          ${options.dartLangComment}
+          class A {
+            void generic<TType, KType>(TType a, KType b) {
+              /* evaluation placeholder */
+              print(a);
+              print(b);
+            }
           }
-        }
 
-        void main() => generic<int, String>(0, 'hi');
-        ''';
+          void main() => generic<int, String>(0, 'hi');
+          ''';
 
-      TestDriver driver;
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
+          TestDriver driver;
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
 
-      tearDown(() {
-        driver.delete();
-      });
+          tearDown(() {
+            driver.delete();
+          });
 
-      test('evaluate formals', () async {
-        await driver.check(
-            scope: <String, String>{
-              'TType': 'TType',
-              'KType': 'KType',
-              'a': 'a',
-              'b': 'b'
-            },
-            expression: 'a',
-            expectedResult: '''
+          test('evaluate formals', () async {
+            await driver.check(
+                scope: <String, String>{
+                  'TType': 'TType',
+                  'KType': 'KType',
+                  'a': 'a',
+                  'b': 'b'
+                },
+                expression: 'a',
+                expectedResult: '''
             (function(TType, KType, a, b) {
                 return a;
             }.bind(this)(
@@ -4482,20 +4689,20 @@
               b
             ))
             ''');
-      });
+          });
 
-      test('evaluate type parameters', () async {
-        await driver.check(
-            scope: <String, String>{
-              'TType': 'TType',
-              'KType': 'KType',
-              'a': 'a',
-              'b': 'b'
-            },
-            expression: 'TType',
-            expectedResult: '''
+          test('evaluate type parameters', () async {
+            await driver.check(
+                scope: <String, String>{
+                  'TType': 'TType',
+                  'KType': 'KType',
+                  'a': 'a',
+                  'b': 'b'
+                },
+                expression: 'TType',
+                expectedResult: '''
             (function(TType, KType, a, b) {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const dart = dart_sdk.dart;
               return dart.wrapType(TType);
             }.bind(this)(
@@ -4505,53 +4712,55 @@
               b
             ))
             ''');
-      });
-    });
+          });
+        });
 
-    group('Expression compiler tests using extension symbols', () {
-      var source = '''
-        ${options.dartLangComment}
-        void bar() {
-          /* evaluation placeholder */ 
-        }
+        group('Expression compiler tests using extension symbols', () {
+          var source = '''
+          ${options.dartLangComment}
+          void bar() {
+            /* evaluation placeholder */ 
+          }
 
-        void main() => bar();
-        ''';
+          void main() => bar();
+          ''';
 
-      TestDriver driver;
-      setUp(() {
-        driver = TestDriver(options, source);
-      });
+          TestDriver driver;
+          setUp(() {
+            driver = TestDriver(options, source);
+          });
 
-      tearDown(() {
-        driver.delete();
-      });
+          tearDown(() {
+            driver.delete();
+          });
 
-      test('map access', () async {
-        await driver.check(
-            scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
-            expression:
-                '(Map<String, String> params) { return params["index"]; }({})',
-            expectedResult: r'''
+          test('map access', () async {
+            await driver.check(
+                scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
+                expression:
+                    '(Map<String, String> params) { return params["index"]; }({})',
+                expectedResult: '''
             (function() {
-              const dart_sdk = require('dart_sdk');
+              const dart_sdk = ${options.loadModule}('dart_sdk');
               const core = dart_sdk.core;
               const _js_helper = dart_sdk._js_helper;
               const dart = dart_sdk.dart;
               const dartx = dart_sdk.dartx;
               var T = {
                 StringN: () => (T.StringN = dart.constFn(dart.nullable(core.String)))(),
-                MapOfString$String: () => (T.MapOfString$String = dart.constFn(core.Map$(core.String, core.String)))(),
-                MapOfString$StringToStringN: () => (T.MapOfString$StringToStringN = dart.constFn(dart.fnType(T.StringN(), [T.MapOfString$String()])))(),
-                IdentityMapOfString$String: () => (T.IdentityMapOfString$String = dart.constFn(_js_helper.IdentityMap$(core.String, core.String)))()
+                MapOfString\$String: () => (T.MapOfString\$String = dart.constFn(core.Map\$(core.String, core.String)))(),
+                MapOfString\$StringToStringN: () => (T.MapOfString\$StringToStringN = dart.constFn(dart.fnType(T.StringN(), [T.MapOfString\$String()])))(),
+                IdentityMapOfString\$String: () => (T.IdentityMapOfString\$String = dart.constFn(_js_helper.IdentityMap\$(core.String, core.String)))()
               };
-              var S = {$_get: dartx._get};
-              return dart.fn(params => params[S.$_get]("index"), T.MapOfString$StringToStringN())(new (T.IdentityMapOfString$String()).new());
+              var S = {\$_get: dartx._get};
+              return dart.fn(params => params[S.\$_get]("index"), T.MapOfString\$StringToStringN())(new (T.IdentityMapOfString\$String()).new());
             }(
               
             ))
             ''');
+          });
+        });
       });
     });
-  });
+  }
 }
diff --git a/pkg/dev_compiler/test/expression_compiler/expression_compiler_worker_test.dart b/pkg/dev_compiler/test/expression_compiler/expression_compiler_worker_test.dart
index e964f5f..b784e96 100644
--- a/pkg/dev_compiler/test/expression_compiler/expression_compiler_worker_test.dart
+++ b/pkg/dev_compiler/test/expression_compiler/expression_compiler_worker_test.dart
@@ -47,8 +47,10 @@
   final Directory rootDirectory;
   final String outputDir = 'out';
   final bool soundNullSafety;
+  final String moduleFormat;
 
-  TestProjectConfiguration(this.rootDirectory, this.soundNullSafety);
+  TestProjectConfiguration(
+      this.rootDirectory, this.soundNullSafety, this.moduleFormat);
 
   ModuleConfiguration get mainModule => ModuleConfiguration(
       root: root,
@@ -210,486 +212,486 @@
 }
 
 void main() async {
-  for (var soundNullSafety in [true, false]) {
-    group('${soundNullSafety ? "sound" : "unsound"} null safety -', () {
-      for (var summarySupport in [true, false]) {
-        group('${summarySupport ? "" : "no "}debugger summary support -', () {
-          group('expression compiler worker', () {
-            ExpressionCompilerWorker worker;
-            Future workerDone;
-            StreamController<Map<String, dynamic>> requestController;
-            StreamController<Map<String, dynamic>> responseController;
-            Directory tempDir;
-            TestProjectConfiguration config;
-            List inputs;
+  for (var moduleFormat in ['amd', 'ddc']) {
+    group('$moduleFormat module format -', () {
+      for (var soundNullSafety in [true, false]) {
+        group('${soundNullSafety ? "sound" : "unsound"} null safety -', () {
+          for (var summarySupport in [true, false]) {
+            group('${summarySupport ? "" : "no "}debugger summary support -',
+                () {
+              group('expression compiler worker', () {
+                ExpressionCompilerWorker worker;
+                Future workerDone;
+                StreamController<Map<String, dynamic>> requestController;
+                StreamController<Map<String, dynamic>> responseController;
+                Directory tempDir;
+                TestProjectConfiguration config;
+                List inputs;
 
-            setUpAll(() async {
-              tempDir = Directory.systemTemp.createTempSync('foo bar');
-              config = TestProjectConfiguration(tempDir, soundNullSafety);
+                setUpAll(() async {
+                  tempDir = Directory.systemTemp.createTempSync('foo bar');
+                  config = TestProjectConfiguration(
+                      tempDir, soundNullSafety, moduleFormat);
 
-              // simulate webdev
-              config.createTestProject();
-              var kernelGenerator = DDCKernelGenerator(config);
-              await kernelGenerator.generate();
+                  // simulate webdev
+                  config.createTestProject();
+                  var kernelGenerator = DDCKernelGenerator(config);
+                  await kernelGenerator.generate();
 
-              inputs = [
-                {
-                  'path': config.mainModule.fullDillPath.path,
-                  if (summarySupport)
-                    'summaryPath': config.mainModule.summaryDillPath.path,
-                  'moduleName': config.mainModule.moduleName
-                },
-                {
-                  'path': config.testModule.fullDillPath.path,
-                  if (summarySupport)
-                    'summaryPath': config.testModule.summaryDillPath.path,
-                  'moduleName': config.testModule.moduleName
-                },
-                {
-                  'path': config.testModule2.fullDillPath.path,
-                  if (summarySupport)
-                    'summaryPath': config.testModule2.summaryDillPath.path,
-                  'moduleName': config.testModule2.moduleName
-                },
-                {
-                  'path': config.testModule3.fullDillPath.path,
-                  if (summarySupport)
-                    'summaryPath': config.testModule3.summaryDillPath.path,
-                  'moduleName': config.testModule3.moduleName
-                },
-              ];
+                  inputs = [
+                    {
+                      'path': config.mainModule.fullDillPath.path,
+                      if (summarySupport)
+                        'summaryPath': config.mainModule.summaryDillPath.path,
+                      'moduleName': config.mainModule.moduleName
+                    },
+                    {
+                      'path': config.testModule.fullDillPath.path,
+                      if (summarySupport)
+                        'summaryPath': config.testModule.summaryDillPath.path,
+                      'moduleName': config.testModule.moduleName
+                    },
+                    {
+                      'path': config.testModule2.fullDillPath.path,
+                      if (summarySupport)
+                        'summaryPath': config.testModule2.summaryDillPath.path,
+                      'moduleName': config.testModule2.moduleName
+                    },
+                    {
+                      'path': config.testModule3.fullDillPath.path,
+                      if (summarySupport)
+                        'summaryPath': config.testModule3.summaryDillPath.path,
+                      'moduleName': config.testModule3.moduleName
+                    },
+                  ];
+                });
+
+                tearDownAll(() async {
+                  tempDir.deleteSync(recursive: true);
+                });
+
+                setUp(() async {
+                  var fileSystem = MultiRootFileSystem('org-dartlang-app',
+                      [tempDir.uri], StandardFileSystem.instance);
+
+                  requestController = StreamController<Map<String, dynamic>>();
+                  responseController = StreamController<Map<String, dynamic>>();
+                  worker = await ExpressionCompilerWorker.create(
+                    librariesSpecificationUri: config.librariesPath,
+                    // We should be able to load everything from dill and not
+                    // require source parsing. Webdev and google3 integration
+                    // currently rely on that. Make the test fail on source
+                    // reading by not providing a packages file.
+                    packagesFile: null,
+                    sdkSummary: config.sdkSummaryPath,
+                    fileSystem: fileSystem,
+                    requestStream: requestController.stream,
+                    sendResponse: responseController.add,
+                    soundNullSafety: soundNullSafety,
+                    verbose: verbose,
+                  );
+                  workerDone = worker.start();
+                });
+
+                tearDown(() async {
+                  unawaited(requestController.close());
+                  await workerDone;
+                  unawaited(responseController.close());
+                });
+
+                test('can compile expressions in sdk', () async {
+                  requestController.add({
+                    'command': 'UpdateDeps',
+                    'inputs': inputs,
+                  });
+
+                  requestController.add({
+                    'command': 'CompileExpression',
+                    'expression': 'other',
+                    'line': 107,
+                    'column': 1,
+                    'jsModules': {},
+                    'jsScope': {'other': 'other'},
+                    'libraryUri': 'dart:collection',
+                    'moduleName': 'dart_sdk',
+                  });
+
+                  expect(
+                      responseController.stream,
+                      emitsInOrder([
+                        equals({
+                          'succeeded': true,
+                        }),
+                        equals({
+                          'succeeded': true,
+                          'errors': isEmpty,
+                          'warnings': isEmpty,
+                          'infos': isEmpty,
+                          'compiledProcedure': contains('return other;'),
+                        })
+                      ]));
+                }, skip: 'Evaluating expressions in SDK is not supported yet');
+
+                test('can compile expressions in a library', () async {
+                  requestController.add({
+                    'command': 'UpdateDeps',
+                    'inputs': inputs,
+                  });
+
+                  requestController.add({
+                    'command': 'CompileExpression',
+                    'expression': 'formal',
+                    'line': 5,
+                    'column': 1,
+                    'jsModules': {},
+                    'jsScope': {'formal': 'formal'},
+                    'libraryUri': config.testModule.libraryUri,
+                    'moduleName': config.testModule.moduleName,
+                  });
+
+                  expect(
+                      responseController.stream,
+                      emitsInOrder([
+                        equals({
+                          'succeeded': true,
+                        }),
+                        equals({
+                          'succeeded': true,
+                          'errors': isEmpty,
+                          'warnings': isEmpty,
+                          'infos': isEmpty,
+                          'compiledProcedure': contains('return formal;'),
+                        })
+                      ]));
+                });
+
+                test('can compile expressions in main', () async {
+                  requestController.add({
+                    'command': 'UpdateDeps',
+                    'inputs': inputs,
+                  });
+
+                  requestController.add({
+                    'command': 'CompileExpression',
+                    'expression': 'count',
+                    'line': 9,
+                    'column': 1,
+                    'jsModules': {},
+                    'jsScope': {'count': 'count'},
+                    'libraryUri': config.mainModule.libraryUri,
+                    'moduleName': config.mainModule.moduleName,
+                  });
+
+                  expect(
+                      responseController.stream,
+                      emitsInOrder([
+                        equals({
+                          'succeeded': true,
+                        }),
+                        equals({
+                          'succeeded': true,
+                          'errors': isEmpty,
+                          'warnings': isEmpty,
+                          'infos': isEmpty,
+                          'compiledProcedure': contains('return count;'),
+                        })
+                      ]));
+                });
+
+                test('can compile expressions in main (extension method)',
+                    () async {
+                  requestController.add({
+                    'command': 'UpdateDeps',
+                    'inputs': inputs,
+                  });
+
+                  requestController.add({
+                    'command': 'CompileExpression',
+                    'expression': 'ret',
+                    'line': 19,
+                    'column': 1,
+                    'jsModules': {},
+                    'jsScope': {'ret': 'ret'},
+                    'libraryUri': config.mainModule.libraryUri,
+                    'moduleName': config.mainModule.moduleName,
+                  });
+
+                  expect(
+                      responseController.stream,
+                      emitsInOrder([
+                        equals({
+                          'succeeded': true,
+                        }),
+                        equals({
+                          'succeeded': true,
+                          'errors': isEmpty,
+                          'warnings': isEmpty,
+                          'infos': isEmpty,
+                          'compiledProcedure': contains('return ret;'),
+                        })
+                      ]));
+                });
+
+                test('can compile transitive expressions in main', () async {
+                  requestController.add({
+                    'command': 'UpdateDeps',
+                    'inputs': inputs,
+                  });
+
+                  requestController.add({
+                    'command': 'CompileExpression',
+                    'expression': 'B().c().getNumber()',
+                    'line': 9,
+                    'column': 1,
+                    'jsModules': {},
+                    'jsScope': {},
+                    'libraryUri': config.mainModule.libraryUri,
+                    'moduleName': config.mainModule.moduleName,
+                  });
+
+                  expect(
+                      responseController.stream,
+                      emitsInOrder([
+                        equals({
+                          'succeeded': true,
+                        }),
+                        equals({
+                          'succeeded': true,
+                          'errors': isEmpty,
+                          'warnings': isEmpty,
+                          'infos': isEmpty,
+                          'compiledProcedure': contains(
+                              'new test_library.B.new().c().getNumber()'),
+                        })
+                      ]));
+                });
+
+                test('can compile series of expressions in various libraries',
+                    () async {
+                  requestController.add({
+                    'command': 'UpdateDeps',
+                    'inputs': inputs,
+                  });
+
+                  requestController.add({
+                    'command': 'CompileExpression',
+                    'expression': 'B().c().getNumber()',
+                    'line': 8,
+                    'column': 1,
+                    'jsModules': {},
+                    'jsScope': {},
+                    'libraryUri': config.mainModule.libraryUri,
+                    'moduleName': config.mainModule.moduleName,
+                  });
+
+                  requestController.add({
+                    'command': 'CompileExpression',
+                    'expression': 'formal',
+                    'line': 5,
+                    'column': 1,
+                    'jsModules': {},
+                    'jsScope': {'formal': 'formal'},
+                    'libraryUri': config.testModule.libraryUri,
+                    'moduleName': config.testModule.moduleName,
+                  });
+
+                  requestController.add({
+                    'command': 'CompileExpression',
+                    'expression': 'formal',
+                    'line': 3,
+                    'column': 1,
+                    'jsModules': {},
+                    'jsScope': {'formal': 'formal'},
+                    'libraryUri': config.testModule2.libraryUri,
+                    'moduleName': config.testModule2.moduleName,
+                  });
+
+                  requestController.add({
+                    'command': 'CompileExpression',
+                    'expression': 'formal',
+                    'line': 3,
+                    'column': 1,
+                    'jsModules': {},
+                    'jsScope': {'formal': 'formal'},
+                    'libraryUri': config.testModule3.libraryUri,
+                    'moduleName': config.testModule3.moduleName,
+                  });
+
+                  requestController.add({
+                    'command': 'CompileExpression',
+                    'expression': 'B().printNumber()',
+                    'line': 9,
+                    'column': 1,
+                    'jsModules': {},
+                    'jsScope': {},
+                    'libraryUri': config.mainModule.libraryUri,
+                    'moduleName': config.mainModule.moduleName,
+                  });
+
+                  expect(
+                      responseController.stream,
+                      emitsInOrder([
+                        equals({
+                          'succeeded': true,
+                        }),
+                        equals({
+                          'succeeded': true,
+                          'errors': isEmpty,
+                          'warnings': isEmpty,
+                          'infos': isEmpty,
+                          'compiledProcedure': contains(
+                              'new test_library.B.new().c().getNumber()'),
+                        }),
+                        equals({
+                          'succeeded': true,
+                          'errors': isEmpty,
+                          'warnings': isEmpty,
+                          'infos': isEmpty,
+                          'compiledProcedure': contains('return formal;'),
+                        }),
+                        equals({
+                          'succeeded': true,
+                          'errors': isEmpty,
+                          'warnings': isEmpty,
+                          'infos': isEmpty,
+                          'compiledProcedure': contains('return formal;'),
+                        }),
+                        equals({
+                          'succeeded': true,
+                          'errors': isEmpty,
+                          'warnings': isEmpty,
+                          'infos': isEmpty,
+                          'compiledProcedure': contains('return formal;'),
+                        }),
+                        equals({
+                          'succeeded': true,
+                          'errors': isEmpty,
+                          'warnings': isEmpty,
+                          'infos': isEmpty,
+                          'compiledProcedure':
+                              contains('test_library.B.new().printNumber()'),
+                        })
+                      ]));
+                });
+
+                test('can compile after dependency update', () async {
+                  requestController.add({
+                    'command': 'UpdateDeps',
+                    'inputs': inputs,
+                  });
+
+                  requestController.add({
+                    'command': 'CompileExpression',
+                    'expression': 'B().c().getNumber()',
+                    'line': 8,
+                    'column': 1,
+                    'jsModules': {},
+                    'jsScope': {},
+                    'libraryUri': config.mainModule.libraryUri,
+                    'moduleName': config.mainModule.moduleName,
+                  });
+
+                  requestController.add({
+                    'command': 'CompileExpression',
+                    'expression': 'formal',
+                    'line': 5,
+                    'column': 1,
+                    'jsModules': {},
+                    'jsScope': {'formal': 'formal'},
+                    'libraryUri': config.testModule.libraryUri,
+                    'moduleName': config.testModule.moduleName,
+                  });
+
+                  requestController.add({
+                    'command': 'CompileExpression',
+                    'expression': 'B().printNumber()',
+                    'line': 9,
+                    'column': 1,
+                    'jsModules': {},
+                    'jsScope': {},
+                    'libraryUri': config.mainModule.libraryUri,
+                    'moduleName': config.mainModule.moduleName,
+                  });
+
+                  requestController.add({
+                    'command': 'UpdateDeps',
+                    'inputs': inputs,
+                  });
+
+                  requestController.add({
+                    'command': 'CompileExpression',
+                    'expression': 'B().c().getNumber()',
+                    'line': 8,
+                    'column': 1,
+                    'jsModules': {},
+                    'jsScope': {},
+                    'libraryUri': config.mainModule.libraryUri,
+                    'moduleName': config.mainModule.moduleName,
+                  });
+
+                  requestController.add({
+                    'command': 'CompileExpression',
+                    'expression': 'formal',
+                    'line': 3,
+                    'column': 1,
+                    'jsModules': {},
+                    'jsScope': {'formal': 'formal'},
+                    'libraryUri': config.testModule3.libraryUri,
+                    'moduleName': config.testModule3.moduleName,
+                  });
+
+                  expect(
+                      responseController.stream,
+                      emitsInOrder([
+                        equals({
+                          'succeeded': true,
+                        }),
+                        equals({
+                          'succeeded': true,
+                          'errors': isEmpty,
+                          'warnings': isEmpty,
+                          'infos': isEmpty,
+                          'compiledProcedure': contains(
+                              'new test_library.B.new().c().getNumber()'),
+                        }),
+                        equals({
+                          'succeeded': true,
+                          'errors': isEmpty,
+                          'warnings': isEmpty,
+                          'infos': isEmpty,
+                          'compiledProcedure': contains('return formal;'),
+                        }),
+                        equals({
+                          'succeeded': true,
+                          'errors': isEmpty,
+                          'warnings': isEmpty,
+                          'infos': isEmpty,
+                          'compiledProcedure':
+                              contains('test_library.B.new().printNumber()'),
+                        }),
+                        equals({
+                          'succeeded': true,
+                        }),
+                        equals({
+                          'succeeded': true,
+                          'errors': isEmpty,
+                          'warnings': isEmpty,
+                          'infos': isEmpty,
+                          'compiledProcedure': contains(
+                              'new test_library.B.new().c().getNumber()'),
+                        }),
+                        equals({
+                          'succeeded': true,
+                          'errors': isEmpty,
+                          'warnings': isEmpty,
+                          'infos': isEmpty,
+                          'compiledProcedure': contains('return formal;'),
+                        }),
+                      ]));
+                });
+              });
             });
-
-            tearDownAll(() async {
-              tempDir.deleteSync(recursive: true);
-            });
-
-            setUp(() async {
-              var fileSystem = MultiRootFileSystem('org-dartlang-app',
-                  [tempDir.uri], StandardFileSystem.instance);
-
-              requestController = StreamController<Map<String, dynamic>>();
-              responseController = StreamController<Map<String, dynamic>>();
-              worker = await ExpressionCompilerWorker.create(
-                librariesSpecificationUri: config.librariesPath,
-                // We should be able to load everything from dill and not require
-                // source parsing. Webdev and google3 integration currently rely on
-                // that. Make the test fail on source reading by not providing a
-                // packages file.
-                packagesFile: null,
-                sdkSummary: config.sdkSummaryPath,
-                fileSystem: fileSystem,
-                requestStream: requestController.stream,
-                sendResponse: responseController.add,
-                soundNullSafety: soundNullSafety,
-                verbose: verbose,
-              );
-              workerDone = worker.start();
-            });
-
-            tearDown(() async {
-              unawaited(requestController.close());
-              await workerDone;
-              unawaited(responseController.close());
-            });
-
-            test('can load dependencies and compile expressions in sdk',
-                () async {
-              requestController.add({
-                'command': 'UpdateDeps',
-                'inputs': inputs,
-              });
-
-              requestController.add({
-                'command': 'CompileExpression',
-                'expression': 'other',
-                'line': 107,
-                'column': 1,
-                'jsModules': {},
-                'jsScope': {'other': 'other'},
-                'libraryUri': 'dart:collection',
-                'moduleName': 'dart_sdk',
-              });
-
-              expect(
-                  responseController.stream,
-                  emitsInOrder([
-                    equals({
-                      'succeeded': true,
-                    }),
-                    equals({
-                      'succeeded': true,
-                      'errors': isEmpty,
-                      'warnings': isEmpty,
-                      'infos': isEmpty,
-                      'compiledProcedure': contains('return other;'),
-                    })
-                  ]));
-            }, skip: 'Evaluating expressions in SDK is not supported yet');
-
-            test('can load dependencies and compile expressions in a library',
-                () async {
-              requestController.add({
-                'command': 'UpdateDeps',
-                'inputs': inputs,
-              });
-
-              requestController.add({
-                'command': 'CompileExpression',
-                'expression': 'formal',
-                'line': 5,
-                'column': 1,
-                'jsModules': {},
-                'jsScope': {'formal': 'formal'},
-                'libraryUri': config.testModule.libraryUri,
-                'moduleName': config.testModule.moduleName,
-              });
-
-              expect(
-                  responseController.stream,
-                  emitsInOrder([
-                    equals({
-                      'succeeded': true,
-                    }),
-                    equals({
-                      'succeeded': true,
-                      'errors': isEmpty,
-                      'warnings': isEmpty,
-                      'infos': isEmpty,
-                      'compiledProcedure': contains('return formal;'),
-                    })
-                  ]));
-            });
-
-            test('can load dependencies and compile expressions in main',
-                () async {
-              requestController.add({
-                'command': 'UpdateDeps',
-                'inputs': inputs,
-              });
-
-              requestController.add({
-                'command': 'CompileExpression',
-                'expression': 'count',
-                'line': 9,
-                'column': 1,
-                'jsModules': {},
-                'jsScope': {'count': 'count'},
-                'libraryUri': config.mainModule.libraryUri,
-                'moduleName': config.mainModule.moduleName,
-              });
-
-              expect(
-                  responseController.stream,
-                  emitsInOrder([
-                    equals({
-                      'succeeded': true,
-                    }),
-                    equals({
-                      'succeeded': true,
-                      'errors': isEmpty,
-                      'warnings': isEmpty,
-                      'infos': isEmpty,
-                      'compiledProcedure': contains('return count;'),
-                    })
-                  ]));
-            });
-
-            test(
-                'can load dependencies and compile expressions in main (extension method)',
-                () async {
-              requestController.add({
-                'command': 'UpdateDeps',
-                'inputs': inputs,
-              });
-
-              requestController.add({
-                'command': 'CompileExpression',
-                'expression': 'ret',
-                'line': 19,
-                'column': 1,
-                'jsModules': {},
-                'jsScope': {'ret': 'ret'},
-                'libraryUri': config.mainModule.libraryUri,
-                'moduleName': config.mainModule.moduleName,
-              });
-
-              expect(
-                  responseController.stream,
-                  emitsInOrder([
-                    equals({
-                      'succeeded': true,
-                    }),
-                    equals({
-                      'succeeded': true,
-                      'errors': isEmpty,
-                      'warnings': isEmpty,
-                      'infos': isEmpty,
-                      'compiledProcedure': contains('return ret;'),
-                    })
-                  ]));
-            });
-
-            test(
-                'can load dependencies and compile transitive expressions in main',
-                () async {
-              requestController.add({
-                'command': 'UpdateDeps',
-                'inputs': inputs,
-              });
-
-              requestController.add({
-                'command': 'CompileExpression',
-                'expression': 'B().c().getNumber()',
-                'line': 9,
-                'column': 1,
-                'jsModules': {},
-                'jsScope': {},
-                'libraryUri': config.mainModule.libraryUri,
-                'moduleName': config.mainModule.moduleName,
-              });
-
-              expect(
-                  responseController.stream,
-                  emitsInOrder([
-                    equals({
-                      'succeeded': true,
-                    }),
-                    equals({
-                      'succeeded': true,
-                      'errors': isEmpty,
-                      'warnings': isEmpty,
-                      'infos': isEmpty,
-                      'compiledProcedure': contains(
-                          'return new test_library.B.new().c().getNumber()'),
-                    })
-                  ]));
-            });
-
-            test('can compile series of expressions in various libraries',
-                () async {
-              requestController.add({
-                'command': 'UpdateDeps',
-                'inputs': inputs,
-              });
-
-              requestController.add({
-                'command': 'CompileExpression',
-                'expression': 'B().c().getNumber()',
-                'line': 8,
-                'column': 1,
-                'jsModules': {},
-                'jsScope': {},
-                'libraryUri': config.mainModule.libraryUri,
-                'moduleName': config.mainModule.moduleName,
-              });
-
-              requestController.add({
-                'command': 'CompileExpression',
-                'expression': 'formal',
-                'line': 5,
-                'column': 1,
-                'jsModules': {},
-                'jsScope': {'formal': 'formal'},
-                'libraryUri': config.testModule.libraryUri,
-                'moduleName': config.testModule.moduleName,
-              });
-
-              requestController.add({
-                'command': 'CompileExpression',
-                'expression': 'formal',
-                'line': 3,
-                'column': 1,
-                'jsModules': {},
-                'jsScope': {'formal': 'formal'},
-                'libraryUri': config.testModule2.libraryUri,
-                'moduleName': config.testModule2.moduleName,
-              });
-
-              requestController.add({
-                'command': 'CompileExpression',
-                'expression': 'formal',
-                'line': 3,
-                'column': 1,
-                'jsModules': {},
-                'jsScope': {'formal': 'formal'},
-                'libraryUri': config.testModule3.libraryUri,
-                'moduleName': config.testModule3.moduleName,
-              });
-
-              requestController.add({
-                'command': 'CompileExpression',
-                'expression': 'B().printNumber()',
-                'line': 9,
-                'column': 1,
-                'jsModules': {},
-                'jsScope': {},
-                'libraryUri': config.mainModule.libraryUri,
-                'moduleName': config.mainModule.moduleName,
-              });
-
-              expect(
-                  responseController.stream,
-                  emitsInOrder([
-                    equals({
-                      'succeeded': true,
-                    }),
-                    equals({
-                      'succeeded': true,
-                      'errors': isEmpty,
-                      'warnings': isEmpty,
-                      'infos': isEmpty,
-                      'compiledProcedure':
-                          contains('new test_library.B.new().c().getNumber()'),
-                    }),
-                    equals({
-                      'succeeded': true,
-                      'errors': isEmpty,
-                      'warnings': isEmpty,
-                      'infos': isEmpty,
-                      'compiledProcedure': contains('return formal;'),
-                    }),
-                    equals({
-                      'succeeded': true,
-                      'errors': isEmpty,
-                      'warnings': isEmpty,
-                      'infos': isEmpty,
-                      'compiledProcedure': contains('return formal;'),
-                    }),
-                    equals({
-                      'succeeded': true,
-                      'errors': isEmpty,
-                      'warnings': isEmpty,
-                      'infos': isEmpty,
-                      'compiledProcedure': contains('return formal;'),
-                    }),
-                    equals({
-                      'succeeded': true,
-                      'errors': isEmpty,
-                      'warnings': isEmpty,
-                      'infos': isEmpty,
-                      'compiledProcedure':
-                          contains('test_library.B.new().printNumber()'),
-                    })
-                  ]));
-            });
-
-            test('can compile after dependency update', () async {
-              requestController.add({
-                'command': 'UpdateDeps',
-                'inputs': inputs,
-              });
-
-              requestController.add({
-                'command': 'CompileExpression',
-                'expression': 'B().c().getNumber()',
-                'line': 8,
-                'column': 1,
-                'jsModules': {},
-                'jsScope': {},
-                'libraryUri': config.mainModule.libraryUri,
-                'moduleName': config.mainModule.moduleName,
-              });
-
-              requestController.add({
-                'command': 'CompileExpression',
-                'expression': 'formal',
-                'line': 5,
-                'column': 1,
-                'jsModules': {},
-                'jsScope': {'formal': 'formal'},
-                'libraryUri': config.testModule.libraryUri,
-                'moduleName': config.testModule.moduleName,
-              });
-
-              requestController.add({
-                'command': 'CompileExpression',
-                'expression': 'B().printNumber()',
-                'line': 9,
-                'column': 1,
-                'jsModules': {},
-                'jsScope': {},
-                'libraryUri': config.mainModule.libraryUri,
-                'moduleName': config.mainModule.moduleName,
-              });
-
-              requestController.add({
-                'command': 'UpdateDeps',
-                'inputs': inputs,
-              });
-
-              requestController.add({
-                'command': 'CompileExpression',
-                'expression': 'B().c().getNumber()',
-                'line': 8,
-                'column': 1,
-                'jsModules': {},
-                'jsScope': {},
-                'libraryUri': config.mainModule.libraryUri,
-                'moduleName': config.mainModule.moduleName,
-              });
-
-              requestController.add({
-                'command': 'CompileExpression',
-                'expression': 'formal',
-                'line': 3,
-                'column': 1,
-                'jsModules': {},
-                'jsScope': {'formal': 'formal'},
-                'libraryUri': config.testModule3.libraryUri,
-                'moduleName': config.testModule3.moduleName,
-              });
-
-              expect(
-                  responseController.stream,
-                  emitsInOrder([
-                    equals({
-                      'succeeded': true,
-                    }),
-                    equals({
-                      'succeeded': true,
-                      'errors': isEmpty,
-                      'warnings': isEmpty,
-                      'infos': isEmpty,
-                      'compiledProcedure':
-                          contains('new test_library.B.new().c().getNumber()'),
-                    }),
-                    equals({
-                      'succeeded': true,
-                      'errors': isEmpty,
-                      'warnings': isEmpty,
-                      'infos': isEmpty,
-                      'compiledProcedure': contains('return formal;'),
-                    }),
-                    equals({
-                      'succeeded': true,
-                      'errors': isEmpty,
-                      'warnings': isEmpty,
-                      'infos': isEmpty,
-                      'compiledProcedure':
-                          contains('test_library.B.new().printNumber()'),
-                    }),
-                    equals({
-                      'succeeded': true,
-                    }),
-                    equals({
-                      'succeeded': true,
-                      'errors': isEmpty,
-                      'warnings': isEmpty,
-                      'infos': isEmpty,
-                      'compiledProcedure':
-                          contains('new test_library.B.new().c().getNumber()'),
-                    }),
-                    equals({
-                      'succeeded': true,
-                      'errors': isEmpty,
-                      'warnings': isEmpty,
-                      'infos': isEmpty,
-                      'compiledProcedure': contains('return formal;'),
-                    }),
-                  ]));
-            });
-          });
+          }
         });
       }
     });
@@ -727,7 +729,10 @@
       'org-dartlang-app',
       '--packages',
       config.packagesPath.path,
-      config.soundNullSafety ? '--sound-null-safety' : '--no-sound-null-safety'
+      if (config.soundNullSafety) '--sound-null-safety',
+      if (!config.soundNullSafety) '--no-sound-null-safety',
+      '--modules',
+      '${config.moduleFormat}',
     ];
 
     var exitCode = await runProcess(dart, args, config.rootPath);
@@ -753,6 +758,9 @@
       '--packages',
       config.packagesPath.path,
       if (config.soundNullSafety) '--sound-null-safety',
+      if (!config.soundNullSafety) '--no-sound-null-safety',
+      '--modules',
+      '${config.moduleFormat}',
     ];
 
     exitCode = await runProcess(dart, args, config.rootPath);
@@ -780,6 +788,9 @@
       '--packages',
       config.packagesPath.path,
       if (config.soundNullSafety) '--sound-null-safety',
+      if (!config.soundNullSafety) '--no-sound-null-safety',
+      '--modules',
+      '${config.moduleFormat}',
     ];
 
     exitCode = await runProcess(dart, args, config.rootPath);
@@ -809,6 +820,9 @@
       '--packages',
       config.packagesPath.toFilePath(),
       if (config.soundNullSafety) '--sound-null-safety',
+      if (!config.soundNullSafety) '--no-sound-null-safety',
+      '--modules',
+      '${config.moduleFormat}',
     ];
 
     return await runProcess(dart, args, config.rootPath);
diff --git a/pkg/vm/lib/transformations/type_flow/analysis.dart b/pkg/vm/lib/transformations/type_flow/analysis.dart
index 45d05d8..c8a530d 100644
--- a/pkg/vm/lib/transformations/type_flow/analysis.dart
+++ b/pkg/vm/lib/transformations/type_flow/analysis.dart
@@ -1636,14 +1636,13 @@
   /// ---- Implementation of [EntryPointsListener] interface. ----
 
   @override
-  void addDirectFieldAccess(Field field, Type value) {
+  void addFieldUsedInConstant(Field field, Type instance, Type value) {
+    assert(!field.isStatic);
     final fieldValue = getFieldValue(field);
-    if (field.isStatic) {
-      fieldValue.setValue(value, this, /*receiver_type=*/ null);
-    } else {
-      final receiver = new ConeType(hierarchyCache.getTFClass(field.parent));
-      fieldValue.setValue(value, this, receiver);
-    }
+    fieldValue.setValue(value, this, instance);
+    // Make sure the field is retained as removing fields used in constants
+    // may affect identity of the constants.
+    fieldValue.isGetterUsed = true;
   }
 
   @override
diff --git a/pkg/vm/lib/transformations/type_flow/native_code.dart b/pkg/vm/lib/transformations/type_flow/native_code.dart
index 2a67d18..7375c51 100644
--- a/pkg/vm/lib/transformations/type_flow/native_code.dart
+++ b/pkg/vm/lib/transformations/type_flow/native_code.dart
@@ -21,7 +21,7 @@
   void addRawCall(Selector selector);
 
   /// Sets the type of the given field.
-  void addDirectFieldAccess(Field field, Type value);
+  void addFieldUsedInConstant(Field field, Type instance, Type value);
 
   /// Add instantiation of the given class.
   ConcreteType addAllocatedClass(Class c);
diff --git a/pkg/vm/lib/transformations/type_flow/summary_collector.dart b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
index 1756791..34c375b 100644
--- a/pkg/vm/lib/transformations/type_flow/summary_collector.dart
+++ b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
@@ -2415,8 +2415,8 @@
     final resultClass = summaryCollector._entryPointsListener
         .addAllocatedClass(constant.classNode);
     constant.fieldValues.forEach((Reference fieldReference, Constant value) {
-      summaryCollector._entryPointsListener
-          .addDirectFieldAccess(fieldReference.asField, typeFor(value));
+      summaryCollector._entryPointsListener.addFieldUsedInConstant(
+          fieldReference.asField, resultClass, typeFor(value));
     });
     return new ConcreteType(resultClass.cls, null, constant);
   }
diff --git a/pkg/vm/test/transformations/type_flow/summary_collector_test.dart b/pkg/vm/test/transformations/type_flow/summary_collector_test.dart
index a046634..cad4936 100644
--- a/pkg/vm/test/transformations/type_flow/summary_collector_test.dart
+++ b/pkg/vm/test/transformations/type_flow/summary_collector_test.dart
@@ -44,7 +44,7 @@
   void addRawCall(Selector selector) {}
 
   @override
-  void addDirectFieldAccess(Field field, Type value) {}
+  void addFieldUsedInConstant(Field field, Type instance, Type value) {}
 
   @override
   ConcreteType addAllocatedClass(Class c) {
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/regress_45324.dart b/pkg/vm/testcases/transformations/type_flow/transformer/regress_45324.dart
new file mode 100644
index 0000000..76c439a
--- /dev/null
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/regress_45324.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2021, 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.
+
+class A {
+  final int targetPlatform;
+  const A(this.targetPlatform);
+
+  static const BAR = A(1);
+}
+
+class X implements A {
+  int get targetPlatform => 2;
+}
+
+A a = X();
+
+void main() {
+  print(a.targetPlatform);
+  print(A.BAR);
+}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/regress_45324.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/regress_45324.dart.expect
new file mode 100644
index 0000000..ad855f7
--- /dev/null
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/regress_45324.dart.expect
@@ -0,0 +1,19 @@
+library #lib;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/  {
+[@vm.inferred-type.metadata=dart.core::_Smi (value: 1)] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1] [@vm.unboxing-info.metadata=()->i]  final field core::int* targetPlatform;
+}
+class X extends core::Object implements self::A {
+  synthetic constructor •() → self::X*
+    : super core::Object::•()
+    ;
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1] [@vm.unboxing-info.metadata=()->i]  get targetPlatform() → core::int*
+    return 2;
+}
+[@vm.inferred-type.metadata=#lib::X?]static field self::A* a = new self::X::•();
+static method main() → void {
+  core::print([@vm.direct-call.metadata=#lib::X.targetPlatform??] [@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] [@vm.inferred-type.metadata=#lib::X?] self::a.{self::A::targetPlatform});
+  core::print(#C2);
+}
diff --git a/runtime/vm/virtual_memory_posix.cc b/runtime/vm/virtual_memory_posix.cc
index dd07c76..5a09268 100644
--- a/runtime/vm/virtual_memory_posix.cc
+++ b/runtime/vm/virtual_memory_posix.cc
@@ -347,6 +347,7 @@
 VirtualMemory::~VirtualMemory() {
 #if defined(DART_COMPRESSED_POINTERS)
   if (VirtualMemoryCompressedHeap::Contains(reserved_.pointer())) {
+    madvise(reserved_.pointer(), reserved_.size(), MADV_DONTNEED);
     VirtualMemoryCompressedHeap::Free(reserved_.pointer(), reserved_.size());
     return;
   }
diff --git a/tools/VERSION b/tools/VERSION
index faca9a1..d053d5c 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 13
 PATCH 0
-PRERELEASE 140
+PRERELEASE 141
 PRERELEASE_PATCH 0
\ No newline at end of file
