diff --git a/pkg/analyzer/lib/dart/analysis/session.dart b/pkg/analyzer/lib/dart/analysis/session.dart
index f193311..9fe33e3 100644
--- a/pkg/analyzer/lib/dart/analysis/session.dart
+++ b/pkg/analyzer/lib/dart/analysis/session.dart
@@ -80,9 +80,7 @@
 
   /// Return a future that will complete with information about the results of
   /// resolving the file with the given absolute, normalized [path].
-  ///
-  /// TODO(migration): should not be nullable
-  Future<ResolvedUnitResult?> getResolvedUnit(String path);
+  Future<ResolvedUnitResult> getResolvedUnit(String path);
 
   /// Return a future that will complete with the source kind of the file with
   /// the given absolute, normalized [path]. If the path does not represent a
@@ -94,10 +92,8 @@
 
   /// Return a future that will complete with information about the results of
   /// building the element model for the file with the given absolute,
-  /// normalized[path].
-  ///
-  /// TODO(migration): should not be nullable
-  Future<UnitElementResult?> getUnitElement(String path);
+  /// normalized [path].
+  Future<UnitElementResult> getUnitElement(String path);
 
   /// Return a future that will complete with the signature for the file with
   /// the given absolute, normalized [path], or `null` if the file cannot be
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index c5dadef..3ee04f3 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -549,8 +549,7 @@
   }
 
   /// Return a [Future] that completes with the [ErrorsResult] for the Dart
-  /// file with the given [path]. If the file is not a Dart file or cannot
-  /// be analyzed, the [Future] completes with `null`.
+  /// file with the given [path].
   ///
   /// The [path] must be absolute and normalized.
   ///
@@ -642,7 +641,7 @@
       throw ArgumentError('$uri is not a library.');
     }
 
-    UnitElementResult unitResult = (await getUnitElement(file.path!))!;
+    UnitElementResult unitResult = await getUnitElement(file.path!);
     return unitResult.element.library;
   }
 
@@ -784,8 +783,7 @@
   }
 
   /// Return a [Future] that completes with a [ResolvedUnitResult] for the Dart
-  /// file with the given [path]. If the file is not a Dart file or cannot
-  /// be analyzed, the [Future] completes with `null`.
+  /// file with the given [path].
   ///
   /// The [path] must be absolute and normalized.
   ///
@@ -800,11 +798,13 @@
   /// it, which is consistent with the current file state (including new states
   /// of the files previously reported using [changeFile]), prior to the next
   /// time the analysis state transitions to "idle".
-  Future<ResolvedUnitResult?> getResult(String path,
+  Future<ResolvedUnitResult> getResult(String path,
       {bool sendCachedToStream = false}) {
     _throwIfNotAbsolutePath(path);
     if (!_fsState.hasUri(path)) {
-      return Future.value();
+      return Future.value(
+        NotValidResolvedUnitResultImpl(ResultState.NOT_FILE_OF_URI),
+      );
     }
 
     // Return the cached result.
@@ -842,11 +842,13 @@
   }
 
   /// Return a [Future] that completes with the [UnitElementResult] for the
-  /// file with the given [path], or with `null` if the file cannot be analyzed.
-  Future<UnitElementResult?> getUnitElement(String path) {
+  /// file with the given [path].
+  Future<UnitElementResult> getUnitElement(String path) {
     _throwIfNotAbsolutePath(path);
     if (!_fsState.hasUri(path)) {
-      return Future.value();
+      return Future.value(
+        NotValidUnitElementResultImpl(ResultState.NOT_FILE_OF_URI),
+      );
     }
     var completer = Completer<UnitElementResult>();
     _unitElementRequestedFiles
diff --git a/pkg/analyzer/lib/src/dart/analysis/results.dart b/pkg/analyzer/lib/src/dart/analysis/results.dart
index 5d19c53..9bd876d 100644
--- a/pkg/analyzer/lib/src/dart/analysis/results.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/results.dart
@@ -8,6 +8,7 @@
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
+import 'package:analyzer/dart/element/type_system.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
@@ -116,6 +117,58 @@
   }
 }
 
+/// The implementation of [ResolvedUnitResult] when not [ResultState.VALID].
+class NotValidResolvedUnitResultImpl extends NotValidFileResultImpl
+    implements ResolvedUnitResult {
+  NotValidResolvedUnitResultImpl(ResultState state) : super(state);
+
+  @override
+  String? get content {
+    throw StateError('This result is not valid');
+  }
+
+  @override
+  List<AnalysisError> get errors {
+    throw StateError('This result is not valid');
+  }
+
+  @override
+  LibraryElement get libraryElement {
+    throw StateError('This result is not valid');
+  }
+
+  @override
+  TypeProvider get typeProvider {
+    throw StateError('This result is not valid');
+  }
+
+  @override
+  TypeSystem get typeSystem {
+    throw StateError('This result is not valid');
+  }
+
+  @override
+  CompilationUnit? get unit {
+    throw StateError('This result is not valid');
+  }
+}
+
+/// The implementation of [UnitElementResult] when not [ResultState.VALID].
+class NotValidUnitElementResultImpl extends NotValidAnalysisResultImpl
+    implements UnitElementResult {
+  NotValidUnitElementResultImpl(ResultState state) : super(state);
+
+  @override
+  CompilationUnitElement get element {
+    throw StateError('This result is not valid');
+  }
+
+  @override
+  String get signature {
+    throw StateError('This result is not valid');
+  }
+}
+
 class ParsedLibraryResultImpl extends AnalysisResultImpl
     implements ParsedLibraryResult {
   @override
diff --git a/pkg/analyzer/lib/src/dart/analysis/search.dart b/pkg/analyzer/lib/src/dart/analysis/search.dart
index 821ebf0..7d24cf9 100644
--- a/pkg/analyzer/lib/src/dart/analysis/search.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/search.dart
@@ -55,7 +55,7 @@
     for (String file in files) {
       if (searchedFiles.add(file, this)) {
         var unitResult = await _driver.getUnitElement(file);
-        if (unitResult != null) {
+        if (unitResult.state == ResultState.VALID) {
           unitResult.element.types.forEach(addElements);
           unitResult.element.mixins.forEach(addElements);
         }
@@ -175,7 +175,7 @@
     List<FileState> knownFiles = _driver.fsState.knownFiles.toList();
     for (FileState file in knownFiles) {
       var unitResult = await _driver.getUnitElement(file.path!);
-      if (unitResult != null) {
+      if (unitResult.state == ResultState.VALID) {
         CompilationUnitElement unitElement = unitResult.element;
         unitElement.accessors.forEach(addElement);
         unitElement.enums.forEach(addElement);
@@ -284,7 +284,7 @@
 
   Future<CompilationUnitElement?> _getUnitElement(String file) async {
     var result = await _driver.getUnitElement(file);
-    return result?.element;
+    return result.state == ResultState.VALID ? result.element : null;
   }
 
   Future<List<SearchResult>> _searchReferences(
@@ -378,7 +378,7 @@
     LibraryElement libraryElement = element.library;
     for (CompilationUnitElement unitElement in libraryElement.units) {
       String unitPath = unitElement.source.fullName;
-      ResolvedUnitResult unitResult = (await _driver.getResult(unitPath))!;
+      ResolvedUnitResult unitResult = await _driver.getResult(unitPath);
       _ImportElementReferencesVisitor visitor =
           _ImportElementReferencesVisitor(element, unitElement);
       unitResult.unit!.accept(visitor);
@@ -397,7 +397,7 @@
     List<SearchResult> results = <SearchResult>[];
     for (CompilationUnitElement unitElement in element.units) {
       String unitPath = unitElement.source.fullName;
-      ResolvedUnitResult unitResult = (await _driver.getResult(unitPath))!;
+      ResolvedUnitResult unitResult = await _driver.getResult(unitPath);
       CompilationUnit unit = unitResult.unit!;
       for (Directive directive in unit.directives) {
         if (directive is PartOfDirective && directive.element == element) {
@@ -422,7 +422,7 @@
     }
 
     // Prepare the unit.
-    ResolvedUnitResult unitResult = (await _driver.getResult(path))!;
+    ResolvedUnitResult unitResult = await _driver.getResult(path);
     var unit = unitResult.unit;
     if (unit == null) {
       return const <SearchResult>[];
@@ -475,7 +475,7 @@
     LibraryElement libraryElement = element.library;
     for (CompilationUnitElement unitElement in libraryElement.units) {
       String unitPath = unitElement.source.fullName;
-      ResolvedUnitResult unitResult = (await _driver.getResult(unitPath))!;
+      ResolvedUnitResult unitResult = await _driver.getResult(unitPath);
       _LocalReferencesVisitor visitor =
           _LocalReferencesVisitor(element, unitElement);
       unitResult.unit!.accept(visitor);
diff --git a/pkg/analyzer/lib/src/dart/analysis/session.dart b/pkg/analyzer/lib/src/dart/analysis/session.dart
index 787c675..7153b15 100644
--- a/pkg/analyzer/lib/src/dart/analysis/session.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/session.dart
@@ -115,7 +115,7 @@
   }
 
   @override
-  Future<ResolvedUnitResult?> getResolvedUnit(String path) {
+  Future<ResolvedUnitResult> getResolvedUnit(String path) {
     _checkConsistency();
     return _driver.getResult(path);
   }
@@ -127,7 +127,7 @@
   }
 
   @override
-  Future<UnitElementResult?> getUnitElement(String path) {
+  Future<UnitElementResult> getUnitElement(String path) {
     _checkConsistency();
     return _driver.getUnitElement(path);
   }
diff --git a/pkg/analyzer/lib/src/lint/project.dart b/pkg/analyzer/lib/src/lint/project.dart
index 759dddc..ff937d9 100644
--- a/pkg/analyzer/lib/src/lint/project.dart
+++ b/pkg/analyzer/lib/src/lint/project.dart
@@ -134,7 +134,7 @@
     for (Source source in sources!) {
       String path = source.uri.path;
       if (path.startsWith(libDir) && !path.startsWith(libSrcDir)) {
-        ResolvedUnitResult result = (await driver.getResult(source.fullName))!;
+        ResolvedUnitResult result = await driver.getResult(source.fullName);
         LibraryElement library = result.libraryElement;
 
         NamespaceBuilder namespaceBuilder = NamespaceBuilder();
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index 78b4c28..e4a7455 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -193,7 +193,7 @@
     driver1.priorityFiles = [a];
     driver2.priorityFiles = [a];
 
-    ResolvedUnitResult result = (await driver2.getResult(b))!;
+    ResolvedUnitResult result = await driver2.getResult(b);
     expect(result.path, b);
 
     await scheduler.status.firstWhere((status) => status.isIdle);
@@ -442,9 +442,9 @@
 part of 'lib.dart';
 ''');
 
-    ResolvedUnitResult libResult = (await driver.getResult(lib))!;
-    ResolvedUnitResult partResult1 = (await driver.getResult(part1))!;
-    ResolvedUnitResult partResult2 = (await driver.getResult(part2))!;
+    ResolvedUnitResult libResult = await driver.getResult(lib);
+    ResolvedUnitResult partResult1 = await driver.getResult(part1);
+    ResolvedUnitResult partResult2 = await driver.getResult(part2);
 
     CompilationUnit libUnit = libResult.unit!;
     CompilationUnit partUnit1 = partResult1.unit!;
@@ -489,7 +489,7 @@
 
     driver.addFile(lib);
 
-    ResolvedUnitResult libResult = (await driver.getResult(lib))!;
+    ResolvedUnitResult libResult = await driver.getResult(lib);
     List<AnalysisError> errors = libResult.errors;
     expect(errors, hasLength(1));
     expect(errors[0].errorCode, CompileTimeErrorCode.PART_OF_UNNAMED_LIBRARY);
@@ -508,7 +508,7 @@
 
     driver.addFile(lib);
 
-    ResolvedUnitResult libResult = (await driver.getResult(lib))!;
+    ResolvedUnitResult libResult = await driver.getResult(lib);
     List<AnalysisError> errors = libResult.errors;
     expect(errors, hasLength(1));
     expect(errors[0].errorCode, CompileTimeErrorCode.PART_OF_DIFFERENT_LIBRARY);
@@ -527,7 +527,7 @@
 
     driver.addFile(lib);
 
-    ResolvedUnitResult libResult = (await driver.getResult(lib))!;
+    ResolvedUnitResult libResult = await driver.getResult(lib);
     List<AnalysisError> errors = libResult.errors;
     expect(errors, hasLength(1));
     expect(errors[0].errorCode, CompileTimeErrorCode.PART_OF_DIFFERENT_LIBRARY);
@@ -546,7 +546,7 @@
 
     driver.addFile(lib);
 
-    ResolvedUnitResult libResult = (await driver.getResult(lib))!;
+    ResolvedUnitResult libResult = await driver.getResult(lib);
     List<AnalysisError> errors = libResult.errors;
     expect(errors, hasLength(1));
     expect(errors[0].errorCode, CompileTimeErrorCode.PART_OF_NON_PART);
@@ -558,7 +558,7 @@
 
     driver.priorityFiles = [a];
 
-    ResolvedUnitResult result1 = (await driver.getResult(a))!;
+    ResolvedUnitResult result1 = await driver.getResult(a);
     expect(driver.test.priorityResults, containsPair(a, result1));
 
     await waitForIdleWithoutExceptions();
@@ -566,7 +566,7 @@
 
     // Get the (cached) result, not reported to the stream.
     {
-      ResolvedUnitResult result2 = (await driver.getResult(a))!;
+      ResolvedUnitResult result2 = await driver.getResult(a);
       expect(result2, same(result1));
       expect(allResults, isEmpty);
     }
@@ -574,7 +574,7 @@
     // Get the (cached) result, reported to the stream.
     {
       ResolvedUnitResult result2 =
-          (await driver.getResult(a, sendCachedToStream: true))!;
+          await driver.getResult(a, sendCachedToStream: true);
       expect(result2, same(result1));
 
       expect(allResults, hasLength(1));
@@ -590,21 +590,21 @@
 
     driver.priorityFiles = [a];
 
-    ResolvedUnitResult result1 = (await driver.getResult(a))!;
+    ResolvedUnitResult result1 = await driver.getResult(a);
     expect(driver.test.priorityResults, containsPair(a, result1));
 
     // Change a file.
     // The cache is flushed.
     driver.changeFile(a);
     expect(driver.test.priorityResults, isEmpty);
-    ResolvedUnitResult result2 = (await driver.getResult(a))!;
+    ResolvedUnitResult result2 = await driver.getResult(a);
     expect(driver.test.priorityResults, containsPair(a, result2));
 
     // Add a file.
     // The cache is flushed.
     driver.addFile(b);
     expect(driver.test.priorityResults, isEmpty);
-    ResolvedUnitResult result3 = (await driver.getResult(a))!;
+    ResolvedUnitResult result3 = await driver.getResult(a);
     expect(driver.test.priorityResults, containsPair(a, result3));
 
     // Remove a file.
@@ -621,7 +621,7 @@
 
     driver.priorityFiles = [a];
 
-    ResolvedUnitResult result1 = (await driver.getResult(a))!;
+    ResolvedUnitResult result1 = await driver.getResult(a);
     expect(driver.test.priorityResults, hasLength(1));
     expect(driver.test.priorityResults, containsPair(a, result1));
 
@@ -632,7 +632,7 @@
     expect(driver.test.priorityResults, containsPair(a, result1));
 
     // Get the result for "b".
-    ResolvedUnitResult result2 = (await driver.getResult(b))!;
+    ResolvedUnitResult result2 = await driver.getResult(b);
     expect(driver.test.priorityResults, hasLength(2));
     expect(driver.test.priorityResults, containsPair(a, result1));
     expect(driver.test.priorityResults, containsPair(b, result2));
@@ -648,11 +648,11 @@
     var a = convertPath('/test/bin/a.dart');
     newFile(a, content: 'var a = 1;');
 
-    ResolvedUnitResult result1 = (await driver.getResult(a))!;
+    ResolvedUnitResult result1 = await driver.getResult(a);
     expect(driver.test.priorityResults, isEmpty);
 
     // The file is not priority, so its result is not cached.
-    ResolvedUnitResult result2 = (await driver.getResult(a))!;
+    ResolvedUnitResult result2 = await driver.getResult(a);
     expect(result2, isNot(same(result1)));
   }
 
@@ -822,7 +822,7 @@
 @A(5)
 class C {}
 ''');
-    var result = (await driver.getResult(testFile))!;
+    var result = await driver.getResult(testFile);
     var atD = AstFinder.getClass(result.unit!, 'C').metadata[0];
     var atDI = atD.elementAnnotation as ElementAnnotationImpl;
     var value = atDI.evaluationResult!.value;
@@ -839,7 +839,7 @@
   final value;
 }
 ''');
-    var result = (await driver.getResult(testFile))!;
+    var result = await driver.getResult(testFile);
     var atD = AstFinder.getClass(result.unit!, 'C').metadata[0];
     var atDI = atD.elementAnnotation as ElementAnnotationImpl;
     var value = atDI.evaluationResult!.value!;
@@ -855,7 +855,7 @@
 const x = 1;
 @x class C {}
 ''');
-    var result = (await driver.getResult(testFile))!;
+    var result = await driver.getResult(testFile);
     Annotation at_x = AstFinder.getClass(result.unit!, 'C').metadata[0];
     expect(at_x.elementAnnotation!.computeConstantValue()!.toIntValue(), 1);
   }
@@ -865,7 +865,7 @@
 const x = y + 1;
 const y = x + 1;
 ''');
-    var result = (await driver.getResult(testFile))!;
+    var result = await driver.getResult(testFile);
     var x = AstFinder.getTopLevelVariableElement(result.unit!, 'x')
         as TopLevelVariableElementImpl;
     _expectCircularityError(x.evaluationResult!);
@@ -876,7 +876,7 @@
 const x = y + 1;
 const y = 1;
 ''');
-    var result = (await driver.getResult(testFile))!;
+    var result = await driver.getResult(testFile);
     var x = AstFinder.getTopLevelVariableElement(result.unit!, 'x');
     var y = AstFinder.getTopLevelVariableElement(result.unit!, 'y');
     expect(x.computeConstantValue()!.toIntValue(), 2);
@@ -893,7 +893,7 @@
 
 class B {}
 ''');
-    var result = (await driver.getResult(testFile))!;
+    var result = await driver.getResult(testFile);
     var x = AstFinder.getTopLevelVariableElement(result.unit!, 'x');
     expect(x.computeConstantValue(), isNotNull);
   }
@@ -918,7 +918,7 @@
 const c = C.WARNING;
 const d = D.WARNING;
 ''');
-    ResolvedUnitResult result = (await driver.getResult(b))!;
+    ResolvedUnitResult result = await driver.getResult(b);
     expect(result.errors, isEmpty);
   }
 
@@ -947,7 +947,7 @@
   const C();
 }
 ''');
-    ResolvedUnitResult result = (await driver.getResult(b))!;
+    ResolvedUnitResult result = await driver.getResult(b);
     expect(result.errors, isEmpty);
   }
 
@@ -959,7 +959,7 @@
 }
 const x = const Derived();
 ''');
-    var result = (await driver.getResult(testFile))!;
+    var result = await driver.getResult(testFile);
     var x = AstFinder.getTopLevelVariableElement(result.unit!, 'x');
     expect(x.computeConstantValue(), isNotNull);
   }
@@ -968,7 +968,7 @@
     addTestFile('''
 const x = 1;
 ''');
-    var result = (await driver.getResult(testFile))!;
+    var result = await driver.getResult(testFile);
     var x = AstFinder.getTopLevelVariableElement(result.unit!, 'x');
     expect(x.computeConstantValue()!.toIntValue(), 1);
   }
@@ -977,14 +977,14 @@
     var a = convertPath('/a.dart');
 
     newFile(a, content: 'var V = 1;');
-    (await driver.getResult(a))!;
+    await driver.getResult(a);
 
     var session1 = driver.currentSession;
     expect(session1, isNotNull);
 
     modifyFile(a, 'var V = 2;');
     driver.changeFile(a);
-    (await driver.getResult(a))!;
+    await driver.getResult(a);
 
     var session2 = driver.currentSession;
     expect(session2, isNotNull);
@@ -1045,7 +1045,7 @@
 export 'foo.dart';
 ''');
 
-    ResolvedUnitResult result = (await driver.getResult(testFile))!;
+    ResolvedUnitResult result = await driver.getResult(testFile);
     List<AnalysisError> errors = result.errors;
     expect(errors, hasLength(1));
     expect(errors[0].errorCode, CompileTimeErrorCode.URI_DOES_NOT_EXIST);
@@ -1056,7 +1056,7 @@
 import 'foo.dart';
 ''');
 
-    ResolvedUnitResult result = (await driver.getResult(testFile))!;
+    ResolvedUnitResult result = await driver.getResult(testFile);
     List<AnalysisError> errors = result.errors;
     expect(errors, hasLength(1));
     expect(errors[0].errorCode, CompileTimeErrorCode.URI_DOES_NOT_EXIST);
@@ -1070,7 +1070,7 @@
 }
 ''', priority: true);
 
-    ResolvedUnitResult result = (await driver.getResult(testFile))!;
+    ResolvedUnitResult result = await driver.getResult(testFile);
     List<AnalysisError> errors = result.errors;
     expect(errors, hasLength(1));
     expect(errors[0].errorCode, CompileTimeErrorCode.URI_DOES_NOT_EXIST);
@@ -1082,7 +1082,7 @@
 part 'foo.dart';
 ''');
 
-    ResolvedUnitResult result = (await driver.getResult(testFile))!;
+    ResolvedUnitResult result = await driver.getResult(testFile);
     List<AnalysisError> errors = result.errors;
     expect(errors, hasLength(1));
     expect(errors[0].errorCode, CompileTimeErrorCode.URI_DOES_NOT_EXIST);
@@ -1122,12 +1122,12 @@
     expect(allResults, isEmpty);
 
     var result = await driver.getResult(templatePath);
-    expect(result, isNull);
+    expect(result.state, ResultState.NOT_FILE_OF_URI);
     expect(allExceptions, isEmpty);
     expect(allResults, isEmpty);
 
-    var element = await driver.getUnitElement(templatePath);
-    expect(element, isNull);
+    var elementResult = await driver.getUnitElement(templatePath);
+    expect(elementResult.state, ResultState.NOT_FILE_OF_URI);
     expect(allExceptions, isEmpty);
     expect(allResults, isEmpty);
 
@@ -1147,7 +1147,7 @@
     expect(driver.getCachedResult(a), isNull);
 
     driver.priorityFiles = [a];
-    ResolvedUnitResult result = (await driver.getResult(a))!;
+    ResolvedUnitResult result = await driver.getResult(a);
 
     expect(driver.getCachedResult(a), same(result));
   }
@@ -1284,7 +1284,7 @@
 
     // Ensure that [a.dart] library cycle is loaded.
     // So, `a.dart` is in the library context.
-    (await driver.getResult(a))!;
+    await driver.getResult(a);
 
     // Update the file, changing its API signature.
     // Note that we don't call `changeFile`.
@@ -1298,14 +1298,14 @@
     expect(driver.getFileSync(a).lineInfo.lineCount, 1);
 
     // We have not read `a.dart`, so `A` is still not declared.
-    expect(((await driver.getResult(b))!).errors, isNotEmpty);
+    expect((await driver.getResult(b)).errors, isNotEmpty);
 
     // Notify the driver that the file was changed.
     driver.changeFile(a);
 
     // So, `class A {}` is declared now.
     expect(driver.getFileSync(a).lineInfo.lineCount, 2);
-    expect(((await driver.getResult(b))!).errors, isEmpty);
+    expect((await driver.getResult(b)).errors, isEmpty);
   }
 
   test_getFileSync_library() async {
@@ -1394,7 +1394,7 @@
     String content = 'int f() => 42;';
     addTestFile(content, priority: true);
 
-    ResolvedUnitResult result = (await driver.getResult(testFile))!;
+    ResolvedUnitResult result = await driver.getResult(testFile);
     expect(result.path, testFile);
     expect(result.uri.toString(), 'package:test/test.dart');
     expect(result.state, ResultState.VALID);
@@ -1426,14 +1426,14 @@
     driver.addFile(b);
     await waitForIdleWithoutExceptions();
 
-    ResolvedUnitResult result = (await driver.getResult(b))!;
+    ResolvedUnitResult result = await driver.getResult(b);
     expect(result.errors, isEmpty);
   }
 
   test_getResult_doesNotExist() async {
     var a = convertPath('/test/lib/a.dart');
 
-    ResolvedUnitResult result = (await driver.getResult(a))!;
+    ResolvedUnitResult result = await driver.getResult(a);
     expect(result.path, a);
     expect(result.uri.toString(), 'package:test/a.dart');
     expect(result.state, ResultState.NOT_A_FILE);
@@ -1444,7 +1444,7 @@
     String content = 'main() { int vv; }';
     addTestFile(content, priority: true);
 
-    ResolvedUnitResult result = (await driver.getResult(testFile))!;
+    ResolvedUnitResult result = await driver.getResult(testFile);
     expect(result.path, testFile);
     expect(result.errors, hasLength(1));
     {
@@ -1467,7 +1467,7 @@
 class B {}
 ''');
 
-    ResolvedUnitResult result = (await driver.getResult(testFile))!;
+    ResolvedUnitResult result = await driver.getResult(testFile);
     expect(result.path, testFile);
   }
 
@@ -1479,7 +1479,7 @@
 ''';
     addTestFile(content, priority: true);
 
-    var result = (await driver.getResult(testFile))!;
+    var result = await driver.getResult(testFile);
     expect(result.errors, isEmpty);
   }
 
@@ -1498,7 +1498,7 @@
 
     // No errors in b.dart
     {
-      ResolvedUnitResult result = (await driver.getResult(b))!;
+      ResolvedUnitResult result = await driver.getResult(b);
       expect(result.errors, isEmpty);
     }
 
@@ -1508,7 +1508,7 @@
 
     // The unresolved URI error must be reported.
     {
-      ResolvedUnitResult result = (await driver.getResult(b))!;
+      ResolvedUnitResult result = await driver.getResult(b);
       expect(
           result.errors,
           contains(predicate((AnalysisError e) =>
@@ -1521,7 +1521,7 @@
 
     // No errors in b.dart again.
     {
-      ResolvedUnitResult result = (await driver.getResult(b))!;
+      ResolvedUnitResult result = await driver.getResult(b);
       expect(result.errors, isEmpty);
     }
   }
@@ -1534,7 +1534,7 @@
 ''', priority: true);
     await waitForIdleWithoutExceptions();
 
-    ResolvedUnitResult result = (await driver.getResult(testFile))!;
+    ResolvedUnitResult result = await driver.getResult(testFile);
     _assertClassFieldType(result.unit!, 'C', 'f', 'int');
   }
 
@@ -1549,7 +1549,7 @@
 ''', priority: true);
     await waitForIdleWithoutExceptions();
 
-    ResolvedUnitResult result = (await driver.getResult(testFile))!;
+    ResolvedUnitResult result = await driver.getResult(testFile);
     _assertClassMethodReturnType(result.unit!, 'A', 'm', 'int');
     _assertClassMethodReturnType(result.unit!, 'B', 'm', 'int');
   }
@@ -1562,7 +1562,7 @@
 class C {}
 ''', priority: true);
 
-    ResolvedUnitResult result = (await driver.getResult(testFile))!;
+    ResolvedUnitResult result = await driver.getResult(testFile);
     ClassDeclaration c = result.unit!.declarations[1] as ClassDeclaration;
     Annotation a = c.metadata[0];
     expect(a.name.name, 'fff');
@@ -1589,7 +1589,7 @@
 ''';
     addTestFile(content);
 
-    ResolvedUnitResult result = (await driver.getResult(testFile))!;
+    ResolvedUnitResult result = await driver.getResult(testFile);
     expect(result.path, testFile);
   }
 
@@ -1601,7 +1601,7 @@
 ''';
     addTestFile(content, priority: true);
 
-    ResolvedUnitResult result = (await driver.getResult(testFile))!;
+    ResolvedUnitResult result = await driver.getResult(testFile);
     expect(result.path, testFile);
     // Has only exports for valid URIs.
     List<ExportElement> imports = result.libraryElement.exports;
@@ -1618,7 +1618,7 @@
 ''';
     addTestFile(content, priority: true);
 
-    ResolvedUnitResult result = (await driver.getResult(testFile))!;
+    ResolvedUnitResult result = await driver.getResult(testFile);
     expect(result.path, testFile);
     // Has only imports for valid URIs.
     List<ImportElement> imports = result.libraryElement.imports;
@@ -1639,7 +1639,7 @@
 part '';
 ''';
     addTestFile(content);
-    (await driver.getResult(testFile))!;
+    await driver.getResult(testFile);
   }
 
   test_getResult_languageVersion() async {
@@ -1649,7 +1649,7 @@
 class A{}
 ''');
 
-    var result = (await driver.getResult(path))!;
+    var result = await driver.getResult(path);
     var languageVersion = result.unit!.languageVersionToken!;
     expect(languageVersion.major, 2);
     expect(languageVersion.minor, 7);
@@ -1686,7 +1686,7 @@
     // package:my_pkg/c.dart's import is erroneous, causing y's reference to z
     // to be unresolved (and therefore have type dynamic).
     {
-      ResolvedUnitResult result = (await driver.getResult(a))!;
+      ResolvedUnitResult result = await driver.getResult(a);
       expect(result.errors, isEmpty);
     }
 
@@ -1696,7 +1696,7 @@
     // successfully imports file:///my_pkg/test/d.dart, causing y to have an
     // inferred type of String.
     {
-      ResolvedUnitResult result = (await driver.getResult(b))!;
+      ResolvedUnitResult result = await driver.getResult(b);
       List<AnalysisError> errors = result.errors;
       expect(errors, hasLength(1));
       expect(errors[0].errorCode, CompileTimeErrorCode.INVALID_ASSIGNMENT);
@@ -1710,7 +1710,7 @@
 var V;
 ''';
     addTestFile(content);
-    (await driver.getResult(testFile))!;
+    await driver.getResult(testFile);
   }
 
   test_getResult_nameConflict_local_typeInference() async {
@@ -1724,7 +1724,7 @@
 }
 ''';
     addTestFile(content);
-    (await driver.getResult(testFile))!;
+    await driver.getResult(testFile);
   }
 
   test_getResult_notAbsolutePath() async {
@@ -1737,7 +1737,7 @@
     var path = convertPath('/test/lib/test.txt');
     newFile(path, content: 'class A {}');
 
-    ResolvedUnitResult result = (await driver.getResult(path))!;
+    ResolvedUnitResult result = await driver.getResult(path);
     expect(result, isNotNull);
     expect(result.unit!.declaredElement!.types.map((e) => e.name), ['A']);
   }
@@ -1749,7 +1749,7 @@
 ''';
     addTestFile(content);
     // Should not throw exceptions.
-    (await driver.getResult(testFile))!;
+    await driver.getResult(testFile);
   }
 
   test_getResult_sameFile_twoUris() async {
@@ -1771,14 +1771,14 @@
     await waitForIdleWithoutExceptions();
 
     {
-      ResolvedUnitResult result = (await driver.getResult(b))!;
+      ResolvedUnitResult result = await driver.getResult(b);
       expect(_getImportSource(result.unit!, 0).uri.toString(),
           'package:test/a.dart');
       _assertTopLevelVarType(result.unit!, 'VB', 'A<int>');
     }
 
     {
-      ResolvedUnitResult result = (await driver.getResult(c))!;
+      ResolvedUnitResult result = await driver.getResult(c);
       expect(
         _getImportSource(result.unit!, 0).uri,
         toUri('/test/lib/a.dart'),
@@ -1805,7 +1805,7 @@
     await waitForIdleWithoutExceptions();
 
     {
-      ResolvedUnitResult result = (await driver.getResult(a))!;
+      ResolvedUnitResult result = await driver.getResult(a);
       _assertTopLevelVarType(result.unit!, 'A1', 'int');
       _assertTopLevelVarType(result.unit!, 'A2', 'int');
     }
@@ -1825,7 +1825,7 @@
     driver.changeFile(a);
 
     {
-      ResolvedUnitResult result = (await driver.getResult(a))!;
+      ResolvedUnitResult result = await driver.getResult(a);
       _assertTopLevelVarType(result.unit!, 'A1', 'double');
       _assertTopLevelVarType(result.unit!, 'A2', 'double');
     }
@@ -1837,7 +1837,7 @@
     var resultFuture = driver.getResult(testFile);
     driver.removeFile(testFile);
 
-    var result = (await resultFuture)!;
+    var result = await resultFuture;
     expect(result.path, testFile);
     expect(result.unit!, isNotNull);
   }
@@ -1850,8 +1850,8 @@
     var future2 = driver.getResult(testFile);
 
     // Both futures complete, with the same result.
-    ResolvedUnitResult result1 = (await future1)!;
-    ResolvedUnitResult result2 = (await future2)!;
+    ResolvedUnitResult result1 = await future1;
+    ResolvedUnitResult result2 = await future2;
     expect(result2, same(result1));
     expect(result1.path, testFile);
     expect(result1.unit!, isNotNull);
@@ -1870,7 +1870,7 @@
 
     // Ensure that [a.dart] library cycle is loaded.
     // So, `a.dart` is in the library context.
-    (await driver.getResult(a))!;
+    await driver.getResult(a);
 
     // Update the file, changing its API signature.
     // Note that we don't call `changeFile`.
@@ -1884,14 +1884,14 @@
     expect(await driver.getSourceKind(a), SourceKind.PART);
 
     // We have not read `a.dart`, so `A` is still not declared.
-    expect(((await driver.getResult(b))!).errors, isNotEmpty);
+    expect((await driver.getResult(b)).errors, isNotEmpty);
 
     // Notify the driver that the file was changed.
     driver.changeFile(a);
 
     // So, `class A {}` is declared now.
     expect(await driver.getSourceKind(a), SourceKind.LIBRARY);
-    expect(((await driver.getResult(b))!).errors, isEmpty);
+    expect((await driver.getResult(b)).errors, isEmpty);
   }
 
   test_getSourceKind_changeFile() async {
@@ -1945,7 +1945,7 @@
 ''';
     addTestFile(content);
 
-    UnitElementResult unitResult = (await driver.getUnitElement(testFile))!;
+    UnitElementResult unitResult = await driver.getUnitElement(testFile);
     CompilationUnitElement unitElement = unitResult.element;
     expect(unitElement.source.fullName, testFile);
     expect(unitElement.functions.map((c) => c.name),
@@ -1973,7 +1973,7 @@
   test_getUnitElement_notDart() async {
     var path = convertPath('/test.txt');
     newFile(path, content: 'class A {}');
-    UnitElementResult unitResult = (await driver.getUnitElement(path))!;
+    UnitElementResult unitResult = await driver.getUnitElement(path);
     expect(unitResult.element.types.map((e) => e.name), ['A']);
   }
 
@@ -1985,7 +1985,7 @@
     String signature = await driver.getUnitElementSignature(a);
     expect(signature, isNotNull);
 
-    UnitElementResult unitResult = (await driver.getUnitElement(a))!;
+    UnitElementResult unitResult = await driver.getUnitElement(a);
     expect(unitResult.path, a);
     expect(unitResult.signature, signature);
 
@@ -2047,7 +2047,7 @@
     driver.addFile(a);
     driver.addFile(b);
 
-    (await driver.getResult(b))!;
+    await driver.getResult(b);
 
     // Modify the library, but don't notify the driver.
     // The driver should use the previous library content and elements.
@@ -2059,7 +2059,7 @@
 }
 ''');
 
-    var result = (await driver.getResult(b))!;
+    var result = await driver.getResult(b);
     var c = _getTopLevelVar(result.unit!, 'c');
     var typeC = c.declaredElement!.type as InterfaceType;
     // The class C has an old field 'foo', not the new 'bar'.
@@ -2081,7 +2081,7 @@
     driver.addFile(a);
     driver.addFile(b);
 
-    ResolvedUnitResult result = (await driver.getResult(a))!;
+    ResolvedUnitResult result = await driver.getResult(a);
     expect(result.errors, isEmpty);
     _assertTopLevelVarType(result.unit!, 'b', 'B');
   }
@@ -2106,10 +2106,10 @@
 ''');
 
     // This ensures that `a.dart` linked library is cached.
-    (await driver.getResult(a))!;
+    await driver.getResult(a);
 
     // Should not fail because of considering `b.dart` part as `a.dart` library.
-    (await driver.getResult(c))!;
+    await driver.getResult(c);
   }
 
   test_instantiateToBounds_invalid() async {
@@ -2244,7 +2244,7 @@
 
     // Ensure that [a.dart] library cycle is loaded.
     // So, `a.dart` is in the library context.
-    (await driver.getResult(a))!;
+    await driver.getResult(a);
 
     // Update the file, changing its API signature.
     // Note that we don't call `changeFile`.
@@ -2262,7 +2262,7 @@
 
     // We have not read `a.dart`, so `A` is still not declared.
     {
-      var bResult = (await driver.getResult(b))!;
+      var bResult = await driver.getResult(b);
       expect(bResult.errors, isNotEmpty);
     }
 
@@ -2275,7 +2275,7 @@
       expect(parseResult.unit.declarations, hasLength(1));
     }
     {
-      var bResult = (await driver.getResult(b))!;
+      var bResult = await driver.getResult(b);
       expect(bResult.errors, isEmpty);
     }
   }
@@ -2308,7 +2308,7 @@
 
     // Ensure that [a.dart] library cycle is loaded.
     // So, `a.dart` is in the library context.
-    (await driver.getResult(a))!;
+    await driver.getResult(a);
 
     // Update the file, changing its API signature.
     // Note that we don't call `changeFile`.
@@ -2326,7 +2326,7 @@
 
     // We have not read `a.dart`, so `A` is still not declared.
     {
-      var bResult = (await driver.getResult(b))!;
+      var bResult = await driver.getResult(b);
       expect(bResult.errors, isNotEmpty);
     }
 
@@ -2339,7 +2339,7 @@
       expect(parseResult.unit.declarations, hasLength(1));
     }
     {
-      var bResult = (await driver.getResult(b))!;
+      var bResult = await driver.getResult(b);
       expect(bResult.errors, isEmpty);
     }
   }
@@ -2518,14 +2518,14 @@
 
     // Process a.dart so that we know that it's a library for c.dart later.
     {
-      ResolvedUnitResult result = (await driver.getResult(a))!;
+      ResolvedUnitResult result = await driver.getResult(a);
       expect(result.errors, isEmpty);
       _assertTopLevelVarType(result.unit!, 'c', 'C');
     }
 
     // Now c.dart can be resolved without errors in the context of a.dart
     {
-      ResolvedUnitResult result = (await driver.getResult(c))!;
+      ResolvedUnitResult result = await driver.getResult(c);
       expect(result.errors, isEmpty);
       _assertTopLevelVarType(result.unit!, 'a', 'A');
       _assertTopLevelVarType(result.unit!, 'b', 'B');
@@ -2557,7 +2557,7 @@
 
     // b.dart will be analyzed after a.dart is analyzed.
     // So, A and B references are resolved.
-    ResolvedUnitResult result = (await driver.getResult(c))!;
+    ResolvedUnitResult result = await driver.getResult(c);
     expect(result.errors, isEmpty);
     _assertTopLevelVarType(result.unit!, 'a', 'A');
     _assertTopLevelVarType(result.unit!, 'b', 'B');
@@ -2573,7 +2573,7 @@
     driver.addFile(a);
 
     // Analyze the library without the part.
-    (await driver.getResult(a))!;
+    await driver.getResult(a);
 
     // Create the part file.
     // This should invalidate library file state (specifically the library
@@ -2585,7 +2585,7 @@
     driver.changeFile(b);
 
     // This should not crash.
-    var result = (await driver.getResult(b))!;
+    var result = await driver.getResult(b);
     expect(result.errors, isEmpty);
   }
 
@@ -2602,7 +2602,7 @@
 
     // There is no library which c.dart is a part of, so it has unresolved
     // A and B references.
-    ResolvedUnitResult result = (await driver.getResult(c))!;
+    ResolvedUnitResult result = await driver.getResult(c);
     expect(result.errors, isNotEmpty);
     expect(result.unit!, isNotNull);
   }
@@ -2631,11 +2631,11 @@
     driver.addFile(c);
 
     // Process a.dart so that we know that it's a library for c.dart later.
-    (await driver.getResult(a))!;
+    await driver.getResult(a);
 
     // c.dart is resolve in the context of a.dart, knows 'A' and 'B'.
     {
-      UnitElementResult result = (await driver.getUnitElement(c))!;
+      UnitElementResult result = await driver.getUnitElement(c);
       var partUnit = result.element;
 
       assertType(partUnit.topLevelVariables[0].type, 'A');
@@ -2671,7 +2671,7 @@
 
     // c.dart is resolve in the context of a.dart, knows 'A' and 'B'.
     {
-      UnitElementResult result = (await driver.getUnitElement(c))!;
+      UnitElementResult result = await driver.getUnitElement(c);
       var partUnit = result.element;
 
       assertType(partUnit.topLevelVariables[0].type, 'A');
@@ -2695,7 +2695,7 @@
     // We don't know the library of c.dart, but we should get a result.
     // The types "A" and "B" are unresolved.
     {
-      UnitElementResult result = (await driver.getUnitElement(c))!;
+      UnitElementResult result = await driver.getUnitElement(c);
       var partUnit = result.element;
 
       expect(partUnit.topLevelVariables[0].name, 'a');
@@ -2733,7 +2733,7 @@
     String signatureBefore = await driver.getUnitElementSignature(c);
 
     // Process a.dart so that we know that it's a library for c.dart later.
-    (await driver.getResult(a))!;
+    await driver.getResult(a);
 
     // The before and after signatures must be the same.
     String signatureAfter = await driver.getUnitElementSignature(c);
diff --git a/pkg/analyzer/test/src/dart/analysis/search_test.dart b/pkg/analyzer/test/src/dart/analysis/search_test.dart
index b27723e..b053a6f 100644
--- a/pkg/analyzer/test/src/dart/analysis/search_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/search_test.dart
@@ -357,7 +357,7 @@
 ''');
     var element = findElement.unnamedConstructor('A');
 
-    CompilationUnit otherUnit = (await driver.getResult(other))!.unit!;
+    CompilationUnit otherUnit = (await driver.getResult(other)).unit!;
     Element main = otherUnit.declaredElement!.functions[0];
     var expected = [
       ExpectedResult(main, SearchResultKind.REFERENCE,
diff --git a/pkg/analyzer/test/src/dart/analysis/session_test.dart b/pkg/analyzer/test/src/dart/analysis/session_test.dart
index e06ecf0..f1235ca 100644
--- a/pkg/analyzer/test/src/dart/analysis/session_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/session_test.dart
@@ -30,7 +30,7 @@
     var relPath = 'dart/my/lib/a.dart';
     newFile('$workspaceRootPath/bazel-bin/$relPath');
 
-    var path = '$workspaceRootPath/$relPath';
+    var path = convertPath('$workspaceRootPath/$relPath');
     var session = contextFor(path).currentSession;
     var result = await session.getErrors(path);
     expect(result.state, ResultState.NOT_FILE_OF_URI);
@@ -50,6 +50,56 @@
     expect(result.errors, hasLength(1));
     expect(result.uri.toString(), 'package:dart.my/a.dart');
   }
+
+  void test_getResolvedUnit_notFileOfUri() async {
+    var relPath = 'dart/my/lib/a.dart';
+    newFile('$workspaceRootPath/bazel-bin/$relPath');
+
+    var path = convertPath('$workspaceRootPath/$relPath');
+    var session = contextFor(path).currentSession;
+    var result = await session.getResolvedUnit(path);
+    expect(result.state, ResultState.NOT_FILE_OF_URI);
+    expect(() => result.errors, throwsStateError);
+  }
+
+  void test_getResolvedUnit_valid() async {
+    var file = newFile(
+      '$workspaceRootPath/dart/my/lib/a.dart',
+      content: 'class A {}',
+    );
+
+    var session = contextFor(file.path).currentSession;
+    var result = await session.getResolvedUnit(file.path);
+    expect(result.state, ResultState.VALID);
+    expect(result.path, file.path);
+    expect(result.errors, isEmpty);
+    expect(result.uri.toString(), 'package:dart.my/a.dart');
+  }
+
+  void test_getUnitElement_notFileOfUri() async {
+    var relPath = 'dart/my/lib/a.dart';
+    newFile('$workspaceRootPath/bazel-bin/$relPath');
+
+    var path = convertPath('$workspaceRootPath/$relPath');
+    var session = contextFor(path).currentSession;
+    var result = await session.getUnitElement(path);
+    expect(result.state, ResultState.NOT_FILE_OF_URI);
+    expect(() => result.element, throwsStateError);
+  }
+
+  void test_getUnitElement_valid() async {
+    var file = newFile(
+      '$workspaceRootPath/dart/my/lib/a.dart',
+      content: 'class A {}',
+    );
+
+    var session = contextFor(file.path).currentSession;
+    var result = await session.getUnitElement(file.path);
+    expect(result.state, ResultState.VALID);
+    expect(result.path, file.path);
+    expect(result.element.types, hasLength(1));
+    expect(result.uri.toString(), 'package:dart.my/a.dart');
+  }
 }
 
 @reflectiveTest
@@ -153,7 +203,7 @@
   test_getParsedLibrary_getElementDeclaration_notThisLibrary() async {
     newFile(testPath, content: '');
 
-    var resolvedUnit = (await session.getResolvedUnit(testPath))!;
+    var resolvedUnit = await session.getResolvedUnit(testPath);
     var typeProvider = resolvedUnit.typeProvider;
     var intClass = typeProvider.intType.element;
 
@@ -171,7 +221,7 @@
 
     var parsedLibrary = session.getParsedLibrary(testPath);
 
-    var unitElement = (await session.getUnitElement(testPath))!.element;
+    var unitElement = (await session.getUnitElement(testPath)).element;
     var fooElement = unitElement.topLevelVariables[0];
     expect(fooElement.name, 'foo');
 
@@ -481,7 +531,7 @@
 class B {}
 ''');
 
-    var unitResult = (await session.getResolvedUnit(testPath))!;
+    var unitResult = await session.getResolvedUnit(testPath);
     expect(unitResult.session, session);
     expect(unitResult.path, testPath);
     expect(unitResult.uri, Uri.parse('package:test/test.dart'));
@@ -510,7 +560,7 @@
 class B {}
 ''');
 
-    var unitResult = (await session.getUnitElement(testPath))!;
+    var unitResult = await session.getUnitElement(testPath);
     expect(unitResult.session, session);
     expect(unitResult.path, testPath);
     expect(unitResult.uri, Uri.parse('package:test/test.dart'));
diff --git a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
index 3f18aab..330c655 100644
--- a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
@@ -183,7 +183,7 @@
   Future<ResolvedUnitResult> resolveFile(String path) async {
     var analysisContext = contextFor(pathForContextSelection ?? path);
     var session = analysisContext.currentSession;
-    return (await session.getResolvedUnit(path))!;
+    return await session.getResolvedUnit(path);
   }
 
   @mustCallSuper
diff --git a/pkg/analyzer/test/src/summary/top_level_inference_test.dart b/pkg/analyzer/test/src/summary/top_level_inference_test.dart
index fb39435..fc25b65 100644
--- a/pkg/analyzer/test/src/summary/top_level_inference_test.dart
+++ b/pkg/analyzer/test/src/summary/top_level_inference_test.dart
@@ -2712,7 +2712,7 @@
 
     var path = convertPath(testFilePath);
     var analysisSession = contextFor(path).currentSession;
-    var result = (await analysisSession.getUnitElement(path))!;
+    var result = await analysisSession.getUnitElement(path);
     return result.element.library;
   }
 }
diff --git a/pkg/analyzer/test/util/id_testing_helper.dart b/pkg/analyzer/test/util/id_testing_helper.dart
index 08e94dd..19c16a4 100644
--- a/pkg/analyzer/test/util/id_testing_helper.dart
+++ b/pkg/analyzer/test/util/id_testing_helper.dart
@@ -173,7 +173,7 @@
   var results = <Uri, ResolvedUnitResult>{};
   for (var testUri in testUris) {
     var path = resourceProvider.convertPath(testUri.path);
-    var result = (await driver.getResult(path))!;
+    var result = await driver.getResult(path);
     var errors =
         result.errors.where((e) => e.severity == Severity.error).toList();
     if (errors.isNotEmpty) {
diff --git a/tools/VERSION b/tools/VERSION
index 5f9ce2d..984173b 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 13
 PATCH 0
-PRERELEASE 119
+PRERELEASE 120
 PRERELEASE_PATCH 0
\ No newline at end of file
