diff --git a/pkg/dev_compiler/test/module_symbols/class_symbols_test.dart b/pkg/dev_compiler/test/module_symbols/class_symbols_test.dart
index 6ebcbba..a3a7033 100644
--- a/pkg/dev_compiler/test/module_symbols/class_symbols_test.dart
+++ b/pkg/dev_compiler/test/module_symbols/class_symbols_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:dev_compiler/src/kernel/module_symbols.dart';
 import 'package:test/test.dart';
 
@@ -25,9 +23,9 @@
     group(mode.description, () {
       var options = SetupCompilerOptions(soundNullSafety: mode.soundNullSafety);
       group('simple class debug symbols', () {
-        TestDriver driver;
-        ClassSymbol classSymbol;
-        FunctionSymbol functionSymbol;
+        late final TestDriver driver;
+        late final ClassSymbol classSymbol;
+        late final FunctionSymbol functionSymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -35,9 +33,9 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          classSymbol = result.symbols.classes.single;
-          functionSymbol = result.symbols.functions.single;
+          var symbols = await driver.compileAndGetSymbols();
+          classSymbol = symbols.classes.single;
+          functionSymbol = symbols.functions.single;
         });
         tearDownAll(() {
           driver.cleanUp();
@@ -68,13 +66,13 @@
         });
         group('location', () {
           test('has scriptId', () async {
-            expect(classSymbol.location.scriptId, endsWith('/foo.dart'));
+            expect(classSymbol.location!.scriptId, endsWith('/foo.dart'));
           });
           test('has start token', () async {
-            expect(classSymbol.location.tokenPos, source.indexOf('class A'));
+            expect(classSymbol.location!.tokenPos, source.indexOf('class A'));
           });
           test('has end token', () async {
-            expect(classSymbol.location.endTokenPos, source.lastIndexOf('}'));
+            expect(classSymbol.location!.endTokenPos, source.lastIndexOf('}'));
           });
         });
         test('no fields', () async {
@@ -90,8 +88,8 @@
         });
       });
       group('abstract class debug symbols', () {
-        TestDriver driver;
-        ClassSymbol classSymbol;
+        late final TestDriver driver;
+        late final ClassSymbol classSymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -99,8 +97,8 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          classSymbol = result.symbols.classes.single;
+          var symbols = await driver.compileAndGetSymbols();
+          classSymbol = symbols.classes.single;
         });
         tearDownAll(() {
           driver.cleanUp();
@@ -110,8 +108,8 @@
         });
       });
       group('class extends debug symbols', () {
-        TestDriver driver;
-        ClassSymbol classSymbol;
+        late final TestDriver driver;
+        late final ClassSymbol classSymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -121,9 +119,8 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          classSymbol =
-              result.symbols.classes.where((c) => c.localId == 'A').single;
+          var symbols = await driver.compileAndGetSymbols();
+          classSymbol = symbols.classes.where((c) => c.localId == 'A').single;
         });
         tearDownAll(() {
           driver.cleanUp();
@@ -133,8 +130,8 @@
         });
       });
       group('class implements debug symbols', () {
-        TestDriver driver;
-        List<ClassSymbol> classSymbols;
+        late final TestDriver driver;
+        late final List<ClassSymbol> classSymbols;
         final source = '''
           ${options.dartLangComment}
 
@@ -146,8 +143,8 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          classSymbols = result.symbols.classes;
+          var symbols = await driver.compileAndGetSymbols();
+          classSymbols = symbols.classes;
         });
         tearDownAll(() {
           driver.cleanUp();
@@ -162,10 +159,10 @@
         });
       });
       group('class public static field debug symbols', () {
-        TestDriver driver;
-        ClassSymbol classSymbol;
-        String fieldId;
-        VariableSymbol fieldSymbol;
+        late final TestDriver driver;
+        late final ClassSymbol classSymbol;
+        late final String fieldId;
+        late final VariableSymbol fieldSymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -175,10 +172,10 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          classSymbol = result.symbols.classes.single;
+          var symbols = await driver.compileAndGetSymbols();
+          classSymbol = symbols.classes.single;
           fieldId = classSymbol.fieldIds.single;
-          fieldSymbol = result.symbols.variables.single;
+          fieldSymbol = symbols.variables.single;
         });
         tearDownAll(() {
           driver.cleanUp();
@@ -199,10 +196,10 @@
         });
       });
       group('class private static field debug symbols', () {
-        TestDriver driver;
-        ClassSymbol classSymbol;
-        String fieldId;
-        VariableSymbol fieldSymbol;
+        late final TestDriver driver;
+        late final ClassSymbol classSymbol;
+        late final String fieldId;
+        late final VariableSymbol fieldSymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -212,10 +209,10 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          classSymbol = result.symbols.classes.single;
+          var symbols = await driver.compileAndGetSymbols();
+          classSymbol = symbols.classes.single;
           fieldId = classSymbol.fieldIds.single;
-          fieldSymbol = result.symbols.variables.single;
+          fieldSymbol = symbols.variables.single;
         });
         tearDownAll(() {
           driver.cleanUp();
@@ -236,10 +233,10 @@
         });
       });
       group('class public instance field debug symbols', () {
-        TestDriver driver;
-        ClassSymbol classSymbol;
-        String fieldId;
-        VariableSymbol fieldSymbol;
+        late final TestDriver driver;
+        late final ClassSymbol classSymbol;
+        late final String fieldId;
+        late final VariableSymbol fieldSymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -249,10 +246,10 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          classSymbol = result.symbols.classes.single;
+          var symbols = await driver.compileAndGetSymbols();
+          classSymbol = symbols.classes.single;
           fieldId = classSymbol.fieldIds.single;
-          fieldSymbol = result.symbols.variables.single;
+          fieldSymbol = symbols.variables.single;
         });
         tearDownAll(() {
           driver.cleanUp();
@@ -273,10 +270,10 @@
         });
       });
       group('class private instance field debug symbols', () {
-        TestDriver driver;
-        ClassSymbol classSymbol;
-        String fieldId;
-        VariableSymbol fieldSymbol;
+        late final TestDriver driver;
+        late final ClassSymbol classSymbol;
+        late final String fieldId;
+        late final VariableSymbol fieldSymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -286,10 +283,10 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          classSymbol = result.symbols.classes.single;
+          var symbols = await driver.compileAndGetSymbols();
+          classSymbol = symbols.classes.single;
           fieldId = classSymbol.fieldIds.single;
-          fieldSymbol = result.symbols.variables.single;
+          fieldSymbol = symbols.variables.single;
         });
         tearDownAll(() {
           driver.cleanUp();
@@ -310,9 +307,9 @@
         });
       });
       group('class public instance method debug symbols', () {
-        TestDriver driver;
-        ClassSymbol classSymbol;
-        FunctionSymbol methodSymbol;
+        late final TestDriver driver;
+        late final ClassSymbol classSymbol;
+        late final FunctionSymbol methodSymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -322,10 +319,10 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          classSymbol = result.symbols.classes.single;
+          var symbols = await driver.compileAndGetSymbols();
+          classSymbol = symbols.classes.single;
           methodSymbol =
-              _symbolForDartFunction(result.symbols, 'publicInstanceMethod');
+              _symbolForDartFunction(symbols, 'publicInstanceMethod');
         });
         tearDownAll(() {
           driver.cleanUp();
@@ -343,9 +340,9 @@
         });
       });
       group('class private instance method debug symbols', () {
-        TestDriver driver;
-        ClassSymbol classSymbol;
-        FunctionSymbol methodSymbol;
+        late final TestDriver driver;
+        late final ClassSymbol classSymbol;
+        late final FunctionSymbol methodSymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -355,10 +352,10 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          classSymbol = result.symbols.classes.single;
+          var symbols = await driver.compileAndGetSymbols();
+          classSymbol = symbols.classes.single;
           methodSymbol =
-              _symbolForDartFunction(result.symbols, '_privateInstanceMethod');
+              _symbolForDartFunction(symbols, '_privateInstanceMethod');
         });
         tearDownAll(() {
           driver.cleanUp();
@@ -376,9 +373,9 @@
         });
       });
       group('class public static method debug symbols', () {
-        TestDriver driver;
-        ClassSymbol classSymbol;
-        FunctionSymbol methodSymbol;
+        late final TestDriver driver;
+        late final ClassSymbol classSymbol;
+        late final FunctionSymbol methodSymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -388,10 +385,9 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          classSymbol = result.symbols.classes.single;
-          methodSymbol =
-              _symbolForDartFunction(result.symbols, 'publicStaticMethod');
+          var symbols = await driver.compileAndGetSymbols();
+          classSymbol = symbols.classes.single;
+          methodSymbol = _symbolForDartFunction(symbols, 'publicStaticMethod');
         });
         tearDownAll(() {
           driver.cleanUp();
@@ -409,9 +405,9 @@
         });
       });
       group('class private static method debug symbols', () {
-        TestDriver driver;
-        ClassSymbol classSymbol;
-        FunctionSymbol methodSymbol;
+        late final TestDriver driver;
+        late final ClassSymbol classSymbol;
+        late final FunctionSymbol methodSymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -421,10 +417,10 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          classSymbol = result.symbols.classes.single;
+          var symbols = await driver.compileAndGetSymbols();
+          classSymbol = symbols.classes.single;
           methodSymbol =
-              _symbolForDartFunction(result.symbols, '_privateStaticMethod');
+              _symbolForDartFunction(symbols, '_privateStaticMethod');
         });
         tearDownAll(() {
           driver.cleanUp();
@@ -442,9 +438,9 @@
         });
       });
       group('class public instance getter debug symbols', () {
-        TestDriver driver;
-        ClassSymbol classSymbol;
-        FunctionSymbol methodSymbol;
+        late final TestDriver driver;
+        late final ClassSymbol classSymbol;
+        late final FunctionSymbol methodSymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -454,10 +450,10 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          classSymbol = result.symbols.classes.single;
+          var symbols = await driver.compileAndGetSymbols();
+          classSymbol = symbols.classes.single;
           methodSymbol =
-              _symbolForDartFunction(result.symbols, 'publicInstanceGetter');
+              _symbolForDartFunction(symbols, 'publicInstanceGetter');
         });
         tearDownAll(() {
           driver.cleanUp();
@@ -475,9 +471,9 @@
         });
       });
       group('class private instance getter debug symbols', () {
-        TestDriver driver;
-        ClassSymbol classSymbol;
-        FunctionSymbol methodSymbol;
+        late final TestDriver driver;
+        late final ClassSymbol classSymbol;
+        late final FunctionSymbol methodSymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -487,10 +483,10 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          classSymbol = result.symbols.classes.single;
+          var symbols = await driver.compileAndGetSymbols();
+          classSymbol = symbols.classes.single;
           methodSymbol =
-              _symbolForDartFunction(result.symbols, '_privateInstanceGetter');
+              _symbolForDartFunction(symbols, '_privateInstanceGetter');
         });
         tearDownAll(() {
           driver.cleanUp();
@@ -508,9 +504,9 @@
         });
       });
       group('class public instance setter debug symbols', () {
-        TestDriver driver;
-        ClassSymbol classSymbol;
-        FunctionSymbol methodSymbol;
+        late final TestDriver driver;
+        late final ClassSymbol classSymbol;
+        late final FunctionSymbol methodSymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -522,10 +518,10 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          classSymbol = result.symbols.classes.single;
+          var symbols = await driver.compileAndGetSymbols();
+          classSymbol = symbols.classes.single;
           methodSymbol =
-              _symbolForDartFunction(result.symbols, 'publicInstanceSetter');
+              _symbolForDartFunction(symbols, 'publicInstanceSetter');
         });
         tearDownAll(() {
           driver.cleanUp();
@@ -543,9 +539,9 @@
         });
       });
       group('class private instance setter debug symbols', () {
-        TestDriver driver;
-        ClassSymbol classSymbol;
-        FunctionSymbol methodSymbol;
+        late final TestDriver driver;
+        late final ClassSymbol classSymbol;
+        late final FunctionSymbol methodSymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -557,10 +553,10 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          classSymbol = result.symbols.classes.single;
+          var symbols = await driver.compileAndGetSymbols();
+          classSymbol = symbols.classes.single;
           methodSymbol =
-              _symbolForDartFunction(result.symbols, '_privateInstanceSetter');
+              _symbolForDartFunction(symbols, '_privateInstanceSetter');
         });
         tearDownAll(() {
           driver.cleanUp();
@@ -578,9 +574,9 @@
         });
       });
       group('class public static getter debug symbols', () {
-        TestDriver driver;
-        ClassSymbol classSymbol;
-        FunctionSymbol methodSymbol;
+        late final TestDriver driver;
+        late final ClassSymbol classSymbol;
+        late final FunctionSymbol methodSymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -590,10 +586,9 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          classSymbol = result.symbols.classes.single;
-          methodSymbol =
-              _symbolForDartFunction(result.symbols, 'publicStaticGetter');
+          var symbols = await driver.compileAndGetSymbols();
+          classSymbol = symbols.classes.single;
+          methodSymbol = _symbolForDartFunction(symbols, 'publicStaticGetter');
         });
         tearDownAll(() {
           driver.cleanUp();
@@ -611,9 +606,9 @@
         });
       });
       group('class private static getter debug symbols', () {
-        TestDriver driver;
-        ClassSymbol classSymbol;
-        FunctionSymbol methodSymbol;
+        late final TestDriver driver;
+        late final ClassSymbol classSymbol;
+        late final FunctionSymbol methodSymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -623,10 +618,10 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          classSymbol = result.symbols.classes.single;
+          var symbols = await driver.compileAndGetSymbols();
+          classSymbol = symbols.classes.single;
           methodSymbol =
-              _symbolForDartFunction(result.symbols, '_privateStaticGetter');
+              _symbolForDartFunction(symbols, '_privateStaticGetter');
         });
         tearDownAll(() {
           driver.cleanUp();
@@ -644,9 +639,9 @@
         });
       });
       group('class public static setter debug symbols', () {
-        TestDriver driver;
-        ClassSymbol classSymbol;
-        FunctionSymbol methodSymbol;
+        late final TestDriver driver;
+        late final ClassSymbol classSymbol;
+        late final FunctionSymbol methodSymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -657,10 +652,9 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          classSymbol = result.symbols.classes.single;
-          methodSymbol =
-              _symbolForDartFunction(result.symbols, 'publicStaticSetter');
+          var symbols = await driver.compileAndGetSymbols();
+          classSymbol = symbols.classes.single;
+          methodSymbol = _symbolForDartFunction(symbols, 'publicStaticSetter');
         });
         tearDownAll(() {
           driver.cleanUp();
@@ -678,9 +672,9 @@
         });
       });
       group('class private static setter debug symbols', () {
-        TestDriver driver;
-        ClassSymbol classSymbol;
-        FunctionSymbol methodSymbol;
+        late final TestDriver driver;
+        late final ClassSymbol classSymbol;
+        late final FunctionSymbol methodSymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -691,10 +685,10 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          classSymbol = result.symbols.classes.single;
+          var symbols = await driver.compileAndGetSymbols();
+          classSymbol = symbols.classes.single;
           methodSymbol =
-              _symbolForDartFunction(result.symbols, '_privateStaticSetter');
+              _symbolForDartFunction(symbols, '_privateStaticSetter');
         });
         tearDownAll(() {
           driver.cleanUp();
@@ -712,9 +706,9 @@
         });
       });
       group('class public const constructor debug symbols', () {
-        TestDriver driver;
-        ClassSymbol classSymbol;
-        FunctionSymbol methodSymbol;
+        late final TestDriver driver;
+        late final ClassSymbol classSymbol;
+        late final FunctionSymbol methodSymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -724,9 +718,9 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          classSymbol = result.symbols.classes.single;
-          methodSymbol = _symbolForDartFunction(result.symbols, '');
+          var symbols = await driver.compileAndGetSymbols();
+          classSymbol = symbols.classes.single;
+          methodSymbol = _symbolForDartFunction(symbols, '');
         });
         tearDownAll(() {
           driver.cleanUp();
@@ -745,9 +739,9 @@
         });
       });
       group('class public named constructor debug symbols', () {
-        TestDriver driver;
-        ClassSymbol classSymbol;
-        FunctionSymbol methodSymbol;
+        late final TestDriver driver;
+        late final ClassSymbol classSymbol;
+        late final FunctionSymbol methodSymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -757,9 +751,9 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          classSymbol = result.symbols.classes.single;
-          methodSymbol = _symbolForDartFunction(result.symbols, 'named');
+          var symbols = await driver.compileAndGetSymbols();
+          classSymbol = symbols.classes.single;
+          methodSymbol = _symbolForDartFunction(symbols, 'named');
         });
         tearDownAll(() {
           driver.cleanUp();
@@ -774,9 +768,9 @@
         });
       });
       group('class private named constructor debug symbols', () {
-        TestDriver driver;
-        ClassSymbol classSymbol;
-        FunctionSymbol methodSymbol;
+        late final TestDriver driver;
+        late final ClassSymbol classSymbol;
+        late final FunctionSymbol methodSymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -787,9 +781,9 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          classSymbol = result.symbols.classes.single;
-          methodSymbol = _symbolForDartFunction(result.symbols, '_');
+          var symbols = await driver.compileAndGetSymbols();
+          classSymbol = symbols.classes.single;
+          methodSymbol = _symbolForDartFunction(symbols, '_');
         });
         tearDownAll(() {
           driver.cleanUp();
@@ -804,9 +798,9 @@
         });
       });
       group('class unnamed factory debug symbols', () {
-        TestDriver driver;
-        ClassSymbol classSymbol;
-        FunctionSymbol methodSymbol;
+        late final TestDriver driver;
+        late final ClassSymbol classSymbol;
+        late final FunctionSymbol methodSymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -818,9 +812,9 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          classSymbol = result.symbols.classes.single;
-          methodSymbol = _symbolForDartFunction(result.symbols, '');
+          var symbols = await driver.compileAndGetSymbols();
+          classSymbol = symbols.classes.single;
+          methodSymbol = _symbolForDartFunction(symbols, '');
         });
         tearDownAll(() {
           driver.cleanUp();
@@ -835,9 +829,9 @@
         });
       });
       group('class public named factory debug symbols', () {
-        TestDriver driver;
-        ClassSymbol classSymbol;
-        FunctionSymbol methodSymbol;
+        late final TestDriver driver;
+        late final ClassSymbol classSymbol;
+        late final FunctionSymbol methodSymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -849,10 +843,9 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          classSymbol = result.symbols.classes.single;
-          methodSymbol =
-              _symbolForDartFunction(result.symbols, 'publicFactory');
+          var symbols = await driver.compileAndGetSymbols();
+          classSymbol = symbols.classes.single;
+          methodSymbol = _symbolForDartFunction(symbols, 'publicFactory');
         });
         tearDownAll(() {
           driver.cleanUp();
@@ -867,9 +860,9 @@
         });
       });
       group('class private named factory debug symbols', () {
-        TestDriver driver;
-        ClassSymbol classSymbol;
-        FunctionSymbol methodSymbol;
+        late final TestDriver driver;
+        late final ClassSymbol classSymbol;
+        late final FunctionSymbol methodSymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -881,10 +874,9 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          classSymbol = result.symbols.classes.single;
-          methodSymbol =
-              _symbolForDartFunction(result.symbols, '_privateFactory');
+          var symbols = await driver.compileAndGetSymbols();
+          classSymbol = symbols.classes.single;
+          methodSymbol = _symbolForDartFunction(symbols, '_privateFactory');
         });
         tearDownAll(() {
           driver.cleanUp();
@@ -899,9 +891,9 @@
         });
       });
       group('class public redirecting constructor debug symbols', () {
-        TestDriver driver;
-        ClassSymbol classSymbol;
-        FunctionSymbol methodSymbol;
+        late final TestDriver driver;
+        late final ClassSymbol classSymbol;
+        late final FunctionSymbol methodSymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -913,10 +905,9 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          classSymbol = result.symbols.classes.single;
-          methodSymbol =
-              _symbolForDartFunction(result.symbols, 'publicRedirecting');
+          var symbols = await driver.compileAndGetSymbols();
+          classSymbol = symbols.classes.single;
+          methodSymbol = _symbolForDartFunction(symbols, 'publicRedirecting');
         });
         tearDownAll(() {
           driver.cleanUp();
@@ -931,9 +922,9 @@
         });
       });
       group('class private redirecting constructor debug symbols', () {
-        TestDriver driver;
-        ClassSymbol classSymbol;
-        FunctionSymbol methodSymbol;
+        late final TestDriver driver;
+        late final ClassSymbol classSymbol;
+        late final FunctionSymbol methodSymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -945,10 +936,9 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          classSymbol = result.symbols.classes.single;
-          methodSymbol =
-              _symbolForDartFunction(result.symbols, '_privateRedirecting');
+          var symbols = await driver.compileAndGetSymbols();
+          classSymbol = symbols.classes.single;
+          methodSymbol = _symbolForDartFunction(symbols, '_privateRedirecting');
         });
         tearDownAll(() {
           driver.cleanUp();
diff --git a/pkg/dev_compiler/test/module_symbols/function_symbols_test.dart b/pkg/dev_compiler/test/module_symbols/function_symbols_test.dart
index 9c58e06..f005911 100644
--- a/pkg/dev_compiler/test/module_symbols/function_symbols_test.dart
+++ b/pkg/dev_compiler/test/module_symbols/function_symbols_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:dev_compiler/src/kernel/module_symbols.dart';
 import 'package:test/test.dart';
 
@@ -18,9 +16,9 @@
     group(mode.description, () {
       var options = SetupCompilerOptions(soundNullSafety: mode.soundNullSafety);
       group('top level function debug symbols', () {
-        TestDriver driver;
-        FunctionSymbol functionSymbol;
-        LibrarySymbol librarySymbol;
+        late final TestDriver driver;
+        late final FunctionSymbol functionSymbol;
+        late final LibrarySymbol librarySymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -30,9 +28,9 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          librarySymbol = result.symbols.libraries.single;
-          functionSymbol = result.symbols.functions.single;
+          var symbols = await driver.compileAndGetSymbols();
+          librarySymbol = symbols.libraries.single;
+          functionSymbol = symbols.functions.single;
         });
         tearDownAll(() {
           driver.cleanUp();
@@ -62,15 +60,15 @@
         });
         group('location', () {
           test('has scriptId', () async {
-            expect(functionSymbol.location.scriptId, endsWith('/foo.dart'));
+            expect(functionSymbol.location!.scriptId, endsWith('/foo.dart'));
           });
           test('has start token', () async {
-            expect(functionSymbol.location.tokenPos,
+            expect(functionSymbol.location!.tokenPos,
                 source.indexOf('topLevelFunction'));
           });
           test('has end token', () async {
             expect(
-                functionSymbol.location.endTokenPos, source.lastIndexOf('}'));
+                functionSymbol.location!.endTokenPos, source.lastIndexOf('}'));
           });
         });
         test('id in LibrarySymbol scopes', () async {
@@ -79,9 +77,9 @@
         });
       });
       group('top level private function debug symbols', () {
-        TestDriver driver;
-        FunctionSymbol functionSymbol;
-        LibrarySymbol librarySymbol;
+        late final TestDriver driver;
+        late final FunctionSymbol functionSymbol;
+        late final LibrarySymbol librarySymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -91,9 +89,9 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          functionSymbol = result.symbols.functions.single;
-          librarySymbol = result.symbols.libraries.single;
+          var symbols = await driver.compileAndGetSymbols();
+          functionSymbol = symbols.functions.single;
+          librarySymbol = symbols.libraries.single;
         });
         tearDownAll(() {
           driver.cleanUp();
@@ -108,9 +106,9 @@
         });
       });
       group('top level public getter debug symbols', () {
-        TestDriver driver;
-        FunctionSymbol functionSymbol;
-        LibrarySymbol librarySymbol;
+        late final TestDriver driver;
+        late final FunctionSymbol functionSymbol;
+        late final LibrarySymbol librarySymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -118,9 +116,9 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          functionSymbol = result.symbols.functions.single;
-          librarySymbol = result.symbols.libraries.single;
+          var symbols = await driver.compileAndGetSymbols();
+          functionSymbol = symbols.functions.single;
+          librarySymbol = symbols.libraries.single;
         });
         tearDownAll(() {
           driver.cleanUp();
@@ -138,9 +136,9 @@
         });
       });
       group('top level private getter debug symbols', () {
-        TestDriver driver;
-        FunctionSymbol functionSymbol;
-        LibrarySymbol librarySymbol;
+        late final TestDriver driver;
+        late final FunctionSymbol functionSymbol;
+        late final LibrarySymbol librarySymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -148,9 +146,9 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          functionSymbol = result.symbols.functions.single;
-          librarySymbol = result.symbols.libraries.single;
+          var symbols = await driver.compileAndGetSymbols();
+          functionSymbol = symbols.functions.single;
+          librarySymbol = symbols.libraries.single;
         });
         tearDownAll(() {
           driver.cleanUp();
@@ -168,9 +166,9 @@
         });
       });
       group('top level public setter debug symbols', () {
-        TestDriver driver;
-        FunctionSymbol functionSymbol;
-        LibrarySymbol librarySymbol;
+        late final TestDriver driver;
+        late final FunctionSymbol functionSymbol;
+        late final LibrarySymbol librarySymbol;
         final source = '''
           ${options.dartLangComment}
           var _value;
@@ -178,9 +176,9 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          functionSymbol = result.symbols.functions.single;
-          librarySymbol = result.symbols.libraries.single;
+          var symbols = await driver.compileAndGetSymbols();
+          functionSymbol = symbols.functions.single;
+          librarySymbol = symbols.libraries.single;
         });
         tearDownAll(() {
           driver.cleanUp();
@@ -198,9 +196,9 @@
         });
       });
       group('top level private setter debug symbols', () {
-        TestDriver driver;
-        FunctionSymbol functionSymbol;
-        LibrarySymbol librarySymbol;
+        late final TestDriver driver;
+        late final FunctionSymbol functionSymbol;
+        late final LibrarySymbol librarySymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -209,9 +207,9 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          functionSymbol = result.symbols.functions.single;
-          librarySymbol = result.symbols.libraries.single;
+          var symbols = await driver.compileAndGetSymbols();
+          functionSymbol = symbols.functions.single;
+          librarySymbol = symbols.libraries.single;
         });
         tearDownAll(() {
           driver.cleanUp();
@@ -229,13 +227,13 @@
         });
       });
       group('function arguments debug symbols', () {
-        TestDriver driver;
-        FunctionSymbol functionWithPositionalArgSymbol;
-        FunctionSymbol functionWithOptionalArgSymbol;
-        FunctionSymbol functionWithNamedArgSymbol;
-        VariableSymbol xSymbol;
-        VariableSymbol ySymbol;
-        VariableSymbol zSymbol;
+        late final TestDriver driver;
+        late final FunctionSymbol functionWithPositionalArgSymbol;
+        late final FunctionSymbol functionWithOptionalArgSymbol;
+        late final FunctionSymbol functionWithNamedArgSymbol;
+        late final VariableSymbol xSymbol;
+        late final VariableSymbol ySymbol;
+        late final VariableSymbol zSymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -249,16 +247,16 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          functionWithPositionalArgSymbol = result.symbols.functions
+          var symbols = await driver.compileAndGetSymbols();
+          functionWithPositionalArgSymbol = symbols.functions
               .singleWhere((f) => f.name == 'functionWithPositionalArg');
-          functionWithOptionalArgSymbol = result.symbols.functions
+          functionWithOptionalArgSymbol = symbols.functions
               .singleWhere((f) => f.name == 'functionWithOptionalArg');
-          functionWithNamedArgSymbol = result.symbols.functions
+          functionWithNamedArgSymbol = symbols.functions
               .singleWhere((f) => f.name == 'functionWithNamedArg');
-          xSymbol = result.symbols.variables.singleWhere((v) => v.name == 'x');
-          ySymbol = result.symbols.variables.singleWhere((v) => v.name == 'y');
-          zSymbol = result.symbols.variables.singleWhere((v) => v.name == 'z');
+          xSymbol = symbols.variables.singleWhere((v) => v.name == 'x');
+          ySymbol = symbols.variables.singleWhere((v) => v.name == 'y');
+          zSymbol = symbols.variables.singleWhere((v) => v.name == 'z');
         });
         tearDownAll(() {
           driver.cleanUp();
@@ -292,9 +290,9 @@
         });
       });
       group('function local variable debug symbols', () {
-        TestDriver driver;
-        FunctionSymbol functionSymbol;
-        VariableSymbol variableSymbol;
+        late final TestDriver driver;
+        late final FunctionSymbol functionSymbol;
+        late final VariableSymbol variableSymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -305,9 +303,9 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          variableSymbol = result.symbols.variables.single;
-          functionSymbol = result.symbols.functions.single;
+          var symbols = await driver.compileAndGetSymbols();
+          variableSymbol = symbols.variables.single;
+          functionSymbol = symbols.functions.single;
         });
         tearDownAll(() {
           driver.cleanUp();
diff --git a/pkg/dev_compiler/test/module_symbols/module_symbols_test_shared.dart b/pkg/dev_compiler/test/module_symbols/module_symbols_test_shared.dart
index b607f71..b552070 100644
--- a/pkg/dev_compiler/test/module_symbols/module_symbols_test_shared.dart
+++ b/pkg/dev_compiler/test/module_symbols/module_symbols_test_shared.dart
@@ -2,12 +2,15 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'dart:io' show Directory, File;
 
-import 'package:dev_compiler/dev_compiler.dart';
+import 'package:dev_compiler/src/compiler/module_builder.dart'
+    show ModuleFormat;
+import 'package:dev_compiler/src/compiler/shared_command.dart'
+    show SharedCompilerOptions;
 import 'package:dev_compiler/src/kernel/command.dart';
+import 'package:dev_compiler/src/kernel/compiler.dart' show ProgramCompiler;
+import 'package:dev_compiler/src/kernel/module_symbols.dart';
 import 'package:kernel/ast.dart' show Component, Library;
 
 import '../shared_test_options.dart';
@@ -17,7 +20,7 @@
 
   TestCompiler(this.setup);
 
-  Future<JSCode> compile({Uri input, Uri packages}) async {
+  Future<JSCode> compile({required Uri input, required Uri packages}) async {
     // Initialize incremental compiler and create component.
     setup.options.packagesFileUri = packages;
     var compiler = DevelopmentIncrementalCompiler(setup.options, input);
@@ -31,7 +34,7 @@
 
     // Initialize DDC.
     var moduleName = 'foo.dart';
-    var classHierarchy = compilerResult.classHierarchy;
+    var classHierarchy = compilerResult.classHierarchy!;
     var compilerOptions = SharedCompilerOptions(
         replCompile: true,
         moduleName: moduleName,
@@ -63,18 +66,16 @@
 
 class TestDriver {
   final SetupCompilerOptions options;
-  Directory tempDir;
-  final String source;
-  Uri input;
-  Uri packages;
-  File file;
+  late final Directory tempDir;
+  late final Uri input;
+  late final Uri packages;
 
-  TestDriver(this.options, this.source) {
+  TestDriver(this.options, String source) {
     var systemTempDir = Directory.systemTemp;
     tempDir = systemTempDir.createTempSync('foo bar');
 
     input = tempDir.uri.resolve('foo.dart');
-    file = File.fromUri(input)..createSync();
+    var file = File.fromUri(input)..createSync();
     file.writeAsStringSync(source);
 
     packages = tempDir.uri.resolve('package_config.json');
@@ -93,8 +94,15 @@
       ''');
   }
 
-  Future<JSCode> compile() async =>
-      await TestCompiler(options).compile(input: input, packages: packages);
+  Future<ModuleSymbols> compileAndGetSymbols() async {
+    var result =
+        await TestCompiler(options).compile(input: input, packages: packages);
+    var symbols = result.symbols;
+    if (symbols == null) {
+      throw Exception('No symbols found in compilation result.');
+    }
+    return symbols;
+  }
 
   void cleanUp() {
     tempDir.delete(recursive: true);
diff --git a/pkg/dev_compiler/test/module_symbols/variable_symbols_test.dart b/pkg/dev_compiler/test/module_symbols/variable_symbols_test.dart
index b6421d1..9941f2c 100644
--- a/pkg/dev_compiler/test/module_symbols/variable_symbols_test.dart
+++ b/pkg/dev_compiler/test/module_symbols/variable_symbols_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:dev_compiler/src/kernel/module_symbols.dart';
 import 'package:test/test.dart';
 
@@ -18,8 +16,8 @@
     group(mode.description, () {
       var options = SetupCompilerOptions(soundNullSafety: mode.soundNullSafety);
       group('global variable debug symbols', () {
-        TestDriver driver;
-        VariableSymbol variableSymbol;
+        late final TestDriver driver;
+        late final VariableSymbol variableSymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -28,8 +26,8 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          variableSymbol = result.symbols.variables.single;
+          var symbols = await driver.compileAndGetSymbols();
+          variableSymbol = symbols.variables.single;
         });
         tearDownAll(() {
           driver.cleanUp();
@@ -60,21 +58,21 @@
         });
         group('location', () {
           test('has scriptId', () async {
-            expect(variableSymbol.location.scriptId, endsWith('/foo.dart'));
+            expect(variableSymbol.location!.scriptId, endsWith('/foo.dart'));
           });
           test('start token position', () async {
-            expect(variableSymbol.location.tokenPos,
+            expect(variableSymbol.location!.tokenPos,
                 source.indexOf('globalVariable'));
           });
           test('end token position', () async {
             expect(
-                variableSymbol.location.endTokenPos, source.lastIndexOf(';'));
+                variableSymbol.location!.endTokenPos, source.lastIndexOf(';'));
           });
         });
       });
       group('global final variable debug symbols', () {
-        TestDriver driver;
-        VariableSymbol variableSymbol;
+        late final TestDriver driver;
+        late final VariableSymbol variableSymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -83,8 +81,8 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          variableSymbol = result.symbols.variables.single;
+          var symbols = await driver.compileAndGetSymbols();
+          variableSymbol = symbols.variables.single;
         });
         tearDownAll(() {
           driver.cleanUp();
@@ -94,8 +92,8 @@
         });
       });
       group('global const variable debug symbols', () {
-        TestDriver driver;
-        VariableSymbol variableSymbol;
+        late final TestDriver driver;
+        late final VariableSymbol variableSymbol;
         final source = '''
           ${options.dartLangComment}
 
@@ -106,8 +104,8 @@
           ''';
         setUpAll(() async {
           driver = TestDriver(options, source);
-          var result = await driver.compile();
-          variableSymbol = result.symbols.variables.single;
+          var symbols = await driver.compileAndGetSymbols();
+          variableSymbol = symbols.variables.single;
         });
         tearDownAll(() {
           driver.cleanUp();
