diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 94a7e01..e6b028b 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -736,74 +736,69 @@
     analysisServer.getExtensionCacheFor(result)?.cacheFromResult(result);
 
     var unit = result.unit;
-    if (unit != null) {
-      if (analysisServer._hasAnalysisServiceSubscription(
-          AnalysisService.HIGHLIGHTS, path)) {
-        _runDelayed(() {
-          _notificationManager.recordHighlightRegions(
-              NotificationManager.serverId,
-              path,
-              _computeHighlightRegions(unit));
-        });
-      }
-      if (analysisServer._hasAnalysisServiceSubscription(
-          AnalysisService.NAVIGATION, path)) {
-        _runDelayed(() {
-          _notificationManager.recordNavigationParams(
-              NotificationManager.serverId,
-              path,
-              _computeNavigationParams(path, unit));
-        });
-      }
-      if (analysisServer._hasAnalysisServiceSubscription(
-          AnalysisService.OCCURRENCES, path)) {
-        _runDelayed(() {
-          _notificationManager.recordOccurrences(
-              NotificationManager.serverId, path, _computeOccurrences(unit));
-        });
-      }
-      // if (analysisServer._hasAnalysisServiceSubscription(
-      //     AnalysisService.OUTLINE, path)) {
-      //   _runDelayed(() {
-      //     // TODO(brianwilkerson) Change NotificationManager to store params
-      //     // so that fileKind and libraryName can be recorded / passed along.
-      //     notificationManager.recordOutlines(NotificationManager.serverId, path,
-      //         _computeOutlineParams(path, unit, result.lineInfo));
-      //   });
-      // }
-      if (analysisServer._hasAnalysisServiceSubscription(
-          AnalysisService.CLOSING_LABELS, path)) {
-        _runDelayed(() {
-          sendAnalysisNotificationClosingLabels(
-              analysisServer, path, result.lineInfo, unit);
-        });
-      }
-      if (analysisServer._hasAnalysisServiceSubscription(
-          AnalysisService.FOLDING, path)) {
-        _runDelayed(() {
-          sendAnalysisNotificationFolding(
-              analysisServer, path, result.lineInfo, unit);
-        });
-      }
-      if (analysisServer._hasAnalysisServiceSubscription(
-          AnalysisService.OUTLINE, path)) {
-        _runDelayed(() {
-          sendAnalysisNotificationOutline(analysisServer, result);
-        });
-      }
-      if (analysisServer._hasAnalysisServiceSubscription(
-          AnalysisService.OVERRIDES, path)) {
-        _runDelayed(() {
-          sendAnalysisNotificationOverrides(analysisServer, path, unit);
-        });
-      }
-      if (analysisServer._hasFlutterServiceSubscription(
-          FlutterService.OUTLINE, path)) {
-        _runDelayed(() {
-          sendFlutterNotificationOutline(analysisServer, result);
-        });
-      }
-      // TODO(scheglov) Implement notifications for AnalysisService.IMPLEMENTED.
+    if (analysisServer._hasAnalysisServiceSubscription(
+        AnalysisService.HIGHLIGHTS, path)) {
+      _runDelayed(() {
+        _notificationManager.recordHighlightRegions(
+            NotificationManager.serverId, path, _computeHighlightRegions(unit));
+      });
+    }
+    if (analysisServer._hasAnalysisServiceSubscription(
+        AnalysisService.NAVIGATION, path)) {
+      _runDelayed(() {
+        _notificationManager.recordNavigationParams(
+            NotificationManager.serverId,
+            path,
+            _computeNavigationParams(path, unit));
+      });
+    }
+    if (analysisServer._hasAnalysisServiceSubscription(
+        AnalysisService.OCCURRENCES, path)) {
+      _runDelayed(() {
+        _notificationManager.recordOccurrences(
+            NotificationManager.serverId, path, _computeOccurrences(unit));
+      });
+    }
+    // if (analysisServer._hasAnalysisServiceSubscription(
+    //     AnalysisService.OUTLINE, path)) {
+    //   _runDelayed(() {
+    //     // TODO(brianwilkerson) Change NotificationManager to store params
+    //     // so that fileKind and libraryName can be recorded / passed along.
+    //     notificationManager.recordOutlines(NotificationManager.serverId, path,
+    //         _computeOutlineParams(path, unit, result.lineInfo));
+    //   });
+    // }
+    if (analysisServer._hasAnalysisServiceSubscription(
+        AnalysisService.CLOSING_LABELS, path)) {
+      _runDelayed(() {
+        sendAnalysisNotificationClosingLabels(
+            analysisServer, path, result.lineInfo, unit);
+      });
+    }
+    if (analysisServer._hasAnalysisServiceSubscription(
+        AnalysisService.FOLDING, path)) {
+      _runDelayed(() {
+        sendAnalysisNotificationFolding(
+            analysisServer, path, result.lineInfo, unit);
+      });
+    }
+    if (analysisServer._hasAnalysisServiceSubscription(
+        AnalysisService.OUTLINE, path)) {
+      _runDelayed(() {
+        sendAnalysisNotificationOutline(analysisServer, result);
+      });
+    }
+    if (analysisServer._hasAnalysisServiceSubscription(
+        AnalysisService.OVERRIDES, path)) {
+      _runDelayed(() {
+        sendAnalysisNotificationOverrides(analysisServer, path, unit);
+      });
+    }
+    if (analysisServer._hasFlutterServiceSubscription(
+        FlutterService.OUTLINE, path)) {
+      _runDelayed(() {
+        sendFlutterNotificationOutline(analysisServer, result);
+      });
     }
   }
 
diff --git a/pkg/analysis_server/lib/src/computer/computer_outline.dart b/pkg/analysis_server/lib/src/computer/computer_outline.dart
index deca868..46408c8 100644
--- a/pkg/analysis_server/lib/src/computer/computer_outline.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_outline.dart
@@ -17,17 +17,9 @@
 
   DartUnitOutlineComputer(this.resolvedUnit, {this.withBasicFlutter = false});
 
-  CompilationUnit get _unit {
-    var unit = resolvedUnit.unit;
-    if (unit == null) {
-      throw StateError('DartUnitOutlineComputer created with invalid result');
-    }
-    return unit;
-  }
-
   /// Returns the computed outline, not `null`.
   Outline compute() {
-    var unit = _unit;
+    var unit = resolvedUnit.unit;
     var unitContents = <Outline>[];
     for (var unitMember in unit.declarations) {
       if (unitMember is ClassDeclaration) {
@@ -325,7 +317,7 @@
   }
 
   Outline _newUnitOutline(List<Outline> unitContents) {
-    var unit = _unit;
+    var unit = resolvedUnit.unit;
     var element = Element(
         ElementKind.COMPILATION_UNIT, '<unit>', Element.makeFlags(),
         location: _getLocationNode(unit));
diff --git a/pkg/analysis_server/lib/src/computer/import_elements_computer.dart b/pkg/analysis_server/lib/src/computer/import_elements_computer.dart
index d6c013d..a29230f 100644
--- a/pkg/analysis_server/lib/src/computer/import_elements_computer.dart
+++ b/pkg/analysis_server/lib/src/computer/import_elements_computer.dart
@@ -32,11 +32,6 @@
   Future<SourceChange> createEdits(
       List<ImportedElements> importedElementsList) async {
     var unit = libraryResult.unit;
-    if (unit == null) {
-      // We should never reach this point because the libraryResult should be
-      // valid.
-      return SourceChange('');
-    }
     var filteredImportedElements =
         _filterImportedElements(importedElementsList);
     var libraryElement = libraryResult.libraryElement;
@@ -279,11 +274,6 @@
   /// Partially copied from DartFileEditBuilderImpl.
   _InsertionDescription _getInsertionDescription(String importUri) {
     var unit = libraryResult.unit;
-    if (unit == null) {
-      // We should never reach this point because the libraryResult should be
-      // valid.
-      return _InsertionDescription(0, after: 2);
-    }
     LibraryDirective? libraryDirective;
     var importDirectives = <ImportDirective>[];
     var otherDirectives = <Directive>[];
diff --git a/pkg/analysis_server/lib/src/domain_analysis.dart b/pkg/analysis_server/lib/src/domain_analysis.dart
index 2e2bc5d..df5d9f6 100644
--- a/pkg/analysis_server/lib/src/domain_analysis.dart
+++ b/pkg/analysis_server/lib/src/domain_analysis.dart
@@ -63,7 +63,7 @@
       server.sendResponse(Response.fileNotAnalyzed(request, file));
       return;
     }
-    var unit = result.unit!;
+    var unit = result.unit;
 
     // Prepare the hovers.
     var hovers = <HoverInformation>[];
@@ -105,7 +105,7 @@
       elements = <ImportedElements>[];
     } else {
       elements =
-          ImportedElementsComputer(result.unit!, params.offset, params.length)
+          ImportedElementsComputer(result.unit, params.offset, params.length)
               .compute();
     }
 
@@ -166,7 +166,7 @@
       var allResults = <AnalysisNavigationParams>[];
       var result = await server.getResolvedUnit(file);
       if (result != null && result.state == ResultState.VALID) {
-        var unit = result.unit!;
+        var unit = result.unit;
         var collector = NavigationCollectorImpl();
         computeDartNavigation(
             server.resourceProvider, collector, unit, offset, length);
@@ -237,7 +237,7 @@
     }
 
     // Ensure the offset provided is a valid location in the file.
-    final unit = result.unit!;
+    final unit = result.unit;
     final computer = DartUnitSignatureComputer(
         server.getDartdocDirectiveInfoFor(result), unit, params.offset);
     if (!computer.offsetIsValid) {
diff --git a/pkg/analysis_server/lib/src/domain_completion.dart b/pkg/analysis_server/lib/src/domain_completion.dart
index 78db63a..9a10237 100644
--- a/pkg/analysis_server/lib/src/domain_completion.dart
+++ b/pkg/analysis_server/lib/src/domain_completion.dart
@@ -330,7 +330,7 @@
       }
       server.requestStatistics?.addItemTimeNow(request, 'resolvedUnit');
       if (resolvedUnit.state == ResultState.VALID) {
-        if (offset < 0 || offset > resolvedUnit.content!.length) {
+        if (offset < 0 || offset > resolvedUnit.content.length) {
           server.sendResponse(Response.invalidParameter(
               request,
               'params.offset',
@@ -339,7 +339,7 @@
           return;
         }
 
-        recordRequest(performance, file, resolvedUnit.content!, offset);
+        recordRequest(performance, file, resolvedUnit.content, offset);
       }
       var declarationsTracker = server.declarationsTracker;
       if (declarationsTracker == null) {
diff --git a/pkg/analysis_server/lib/src/domain_kythe.dart b/pkg/analysis_server/lib/src/domain_kythe.dart
index b03acbb..990588e 100644
--- a/pkg/analysis_server/lib/src/domain_kythe.dart
+++ b/pkg/analysis_server/lib/src/domain_kythe.dart
@@ -47,8 +47,8 @@
         var entries = <KytheEntry>[];
         // TODO(brianwilkerson) Figure out how to get the list of files.
         var files = <String>[];
-        result.unit!.accept(KytheDartVisitor(server.resourceProvider, entries,
-            file, InheritanceManager3(), result.content!));
+        result.unit.accept(KytheDartVisitor(server.resourceProvider, entries,
+            file, InheritanceManager3(), result.content));
         allResults.add(KytheGetKytheEntriesResult(entries, files));
       }
       //
diff --git a/pkg/analysis_server/lib/src/domains/execution/completion.dart b/pkg/analysis_server/lib/src/domains/execution/completion.dart
index 97ab5bf..7162de9 100644
--- a/pkg/analysis_server/lib/src/domains/execution/completion.dart
+++ b/pkg/analysis_server/lib/src/domains/execution/completion.dart
@@ -53,7 +53,7 @@
 
     // Compute the patched context file content.
     var targetCode = SourceEdit.applySequence(
-      contextResult.content!,
+      contextResult.content,
       changeBuilder.sourceChange.edits[0].edits,
     );
 
diff --git a/pkg/analysis_server/lib/src/edit/edit_domain.dart b/pkg/analysis_server/lib/src/edit/edit_domain.dart
index 5513519..b73448c 100644
--- a/pkg/analysis_server/lib/src/edit/edit_domain.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_domain.dart
@@ -401,7 +401,7 @@
       return;
     }
     var libraryUnit = result.libraryElement.definingCompilationUnit;
-    if (libraryUnit != result.unit!.declaredElement) {
+    if (libraryUnit != result.unit.declaredElement) {
       // The file in the request is a part of a library. We need to pass the
       // defining compilation unit to the computer, not the part.
       result = await server.getResolvedUnit(libraryUnit.source.fullName);
@@ -483,8 +483,8 @@
       return;
     }
     var fileStamp = -1;
-    var code = result.content!;
-    var unit = result.unit!;
+    var code = result.content;
+    var unit = result.unit;
     var errors = result.errors;
     // check if there are scan/parse errors in the file
     var numScanParseErrors = _getNumberOfScanParseErrors(errors);
@@ -627,7 +627,7 @@
 error.errorCode: ${error.errorCode}
 ''';
             throw CaughtExceptionWithFiles(exception, stackTrace, {
-              file: result.content!,
+              file: result.content,
               'parameters': parametersFile,
             });
           }
@@ -766,7 +766,7 @@
 length: $length
       ''';
         throw CaughtExceptionWithFiles(exception, stackTrace, {
-          file: result.content!,
+          file: result.content,
           'parameters': parametersFile,
         });
       }
diff --git a/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart b/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart
index d216445..8c3dd26 100644
--- a/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart
+++ b/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart
@@ -31,7 +31,7 @@
 
     // Create outlines for widgets.
     var visitor = _FlutterOutlineBuilder(this);
-    resolvedUnit.unit!.accept(visitor);
+    resolvedUnit.unit.accept(visitor);
 
     // Associate Flutter outlines with Dart outlines.
     for (var outline in visitor.outlines) {
@@ -66,7 +66,7 @@
 
     var name = parameter.displayName;
 
-    var label = resolvedUnit.content!.substring(argument.offset, argument.end);
+    var label = resolvedUnit.content.substring(argument.offset, argument.end);
     if (label.contains('\n')) {
       label = '…';
     }
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/commands/organize_imports.dart b/pkg/analysis_server/lib/src/lsp/handlers/commands/organize_imports.dart
index 6b3ac68..2a81ac0 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/commands/organize_imports.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/commands/organize_imports.dart
@@ -41,8 +41,8 @@
     }
 
     return result.mapResult((result) {
-      final code = result.content!;
-      final unit = result.unit!;
+      final code = result.content;
+      final unit = result.unit;
 
       if (hasScanParseErrors(result.errors)) {
         // It's not uncommon for editors to run this command automatically on-save
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
index 8dc8323..a1c9fab 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
@@ -205,7 +205,7 @@
   ) async {
     final performance = CompletionPerformance();
     performance.path = unit.path;
-    performance.setContentsAndOffset(unit.content!, offset);
+    performance.setContentsAndOffset(unit.content, offset);
     server.performanceStats.completion.add(performance);
 
     return await performance.runRequestOperation((perf) async {
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_document_highlights.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_document_highlights.dart
index ff213a4..ae96228 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_document_highlights.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_document_highlights.dart
@@ -34,7 +34,7 @@
 
     return offset.mapResult((requestedOffset) {
       final collector = OccurrencesCollectorImpl();
-      addDartOccurrences(collector, unit.result.unit!);
+      addDartOccurrences(collector, unit.result.unit);
 
       // Find an occurrence that has an instance that spans the position.
       for (final occurrence in collector.allOccurrences) {
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_hover.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_hover.dart
index c533db2..1195c9b 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_hover.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_hover.dart
@@ -83,10 +83,6 @@
 
   ErrorOr<Hover?> _getHover(ResolvedUnitResult unit, int offset) {
     final compilationUnit = unit.unit;
-    if (compilationUnit == null) {
-      return success(null);
-    }
-
     final computer = DartUnitHoverComputer(
         server.getDartdocDirectiveInfoFor(unit), compilationUnit, offset);
     final hover = computer.compute();
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_references.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_references.dart
index b302227..93c78da 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_references.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_references.dart
@@ -83,7 +83,7 @@
         convert(results, toLocation).whereNotNull().toList();
 
     final compilationUnit = unit.unit;
-    if (compilationUnit != null && params.context.includeDeclaration == true) {
+    if (params.context.includeDeclaration == true) {
       // Also include the definition for the symbol at this location.
       referenceResults.addAll(_getDeclarations(compilationUnit, offset));
     }
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_signature_help.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_signature_help.dart
index 34f4193..25a78ca 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_signature_help.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_signature_help.dart
@@ -62,7 +62,7 @@
       // signature help for that.
       final typeArgsSignature = _tryGetTypeArgsSignatureHelp(
         dartDocInfo,
-        unit.result.unit!,
+        unit.result.unit,
         offset,
         autoTriggered,
         formats,
@@ -72,7 +72,7 @@
       }
 
       final computer =
-          DartUnitSignatureComputer(dartDocInfo, unit.result.unit!, offset);
+          DartUnitSignatureComputer(dartDocInfo, unit.result.unit, offset);
       if (!computer.offsetIsValid) {
         return success(null); // No error, just no valid hover.
       }
diff --git a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
index a09919e..7f381dd 100644
--- a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
+++ b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
@@ -864,28 +864,26 @@
     analysisServer.getExtensionCacheFor(result)?.cacheFromResult(result);
 
     final unit = result.unit;
-    if (unit != null) {
-      if (analysisServer.shouldSendClosingLabelsFor(path)) {
-        final labels = DartUnitClosingLabelsComputer(result.lineInfo, unit)
-            .compute()
-            .map((l) => toClosingLabel(result.lineInfo, l))
-            .toList();
+    if (analysisServer.shouldSendClosingLabelsFor(path)) {
+      final labels = DartUnitClosingLabelsComputer(result.lineInfo, unit)
+          .compute()
+          .map((l) => toClosingLabel(result.lineInfo, l))
+          .toList();
 
-        analysisServer.publishClosingLabels(path, labels);
-      }
-      if (analysisServer.shouldSendOutlineFor(path)) {
-        final outline = DartUnitOutlineComputer(
-          result,
-          withBasicFlutter: true,
-        ).compute();
-        final lspOutline = toOutline(result.lineInfo, outline);
-        analysisServer.publishOutline(path, lspOutline);
-      }
-      if (analysisServer.shouldSendFlutterOutlineFor(path)) {
-        final outline = FlutterOutlineComputer(result).compute();
-        final lspOutline = toFlutterOutline(result.lineInfo, outline);
-        analysisServer.publishFlutterOutline(path, lspOutline);
-      }
+      analysisServer.publishClosingLabels(path, labels);
+    }
+    if (analysisServer.shouldSendOutlineFor(path)) {
+      final outline = DartUnitOutlineComputer(
+        result,
+        withBasicFlutter: true,
+      ).compute();
+      final lspOutline = toOutline(result.lineInfo, outline);
+      analysisServer.publishOutline(path, lspOutline);
+    }
+    if (analysisServer.shouldSendFlutterOutlineFor(path)) {
+      final outline = FlutterOutlineComputer(result).compute();
+      final lspOutline = toFlutterOutline(result.lineInfo, outline);
+      analysisServer.publishFlutterOutline(path, lspOutline);
     }
   }
 
diff --git a/pkg/analysis_server/lib/src/operation/operation_analysis.dart b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
index cb7e0ed..94f0005 100644
--- a/pkg/analysis_server/lib/src/operation/operation_analysis.dart
+++ b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
@@ -94,7 +94,7 @@
     AnalysisServer server, ResolvedUnitResult resolvedUnit) {
   _sendNotification(server, () {
     protocol.FileKind fileKind;
-    var unit = resolvedUnit.unit!;
+    var unit = resolvedUnit.unit;
     if (unit.directives.any((d) => d is PartOfDirective)) {
       fileKind = protocol.FileKind.PART;
     } else {
diff --git a/pkg/analysis_server/lib/src/services/completion/completion_core.dart b/pkg/analysis_server/lib/src/services/completion/completion_core.dart
index 2c71a1e..d6fe971 100644
--- a/pkg/analysis_server/lib/src/services/completion/completion_core.dart
+++ b/pkg/analysis_server/lib/src/services/completion/completion_core.dart
@@ -44,7 +44,7 @@
   ResourceProvider get resourceProvider => result.session.resourceProvider;
 
   @override
-  Source get source => result.unit!.declaredElement!.source;
+  Source get source => result.unit.declaredElement!.source;
 
   @override
   String? get sourceContents => result.content;
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart b/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
index f6dc69a..b71fa3e 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
@@ -458,7 +458,7 @@
     return performance.run(
       'build DartCompletionRequest',
       (_) {
-        var unit = request.result.unit!;
+        var unit = request.result.unit;
         var libSource = unit.declaredElement!.library.source;
         var objectType = request.result.typeProvider.objectType;
 
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/documentation_cache.dart b/pkg/analysis_server/lib/src/services/completion/dart/documentation_cache.dart
index 4457f2e..0ca62d6 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/documentation_cache.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/documentation_cache.dart
@@ -29,7 +29,7 @@
 
   /// Fill the cache with data from the [result].
   void cacheFromResult(ResolvedUnitResult result) {
-    var compilationUnit = result.unit?.declaredElement;
+    var compilationUnit = result.unit.declaredElement;
     if (compilationUnit != null) {
       documentationCache.remove(_keyForUnit(compilationUnit));
       _cacheFromElement(compilationUnit);
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/extension_cache.dart b/pkg/analysis_server/lib/src/services/completion/dart/extension_cache.dart
index 96decc0..38481dc 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/extension_cache.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/extension_cache.dart
@@ -21,7 +21,7 @@
 
   /// Fill the cache with data from the [result].
   void cacheFromResult(ResolvedUnitResult result) {
-    var element = result.unit?.declaredElement;
+    var element = result.unit.declaredElement;
     if (element != null) {
       _cacheFromElement(element);
       for (var library in result.libraryElement.importedLibraries) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart
index c767698..f14d554 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart
@@ -158,7 +158,7 @@
       return;
     }
 
-    var libraryUnits = request.result.unit?.declaredElement?.library.units;
+    var libraryUnits = request.result.unit.declaredElement?.library.units;
     if (libraryUnits == null) {
       return;
     }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart b/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
index d045443..8812c24 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
@@ -194,7 +194,7 @@
 }
 
 String getRequestLineIndent(DartCompletionRequest request) {
-  var content = request.result.content!;
+  var content = request.result.content;
   var lineStartOffset = request.offset;
   var notWhitespaceOffset = request.offset;
   for (; lineStartOffset > 0; lineStartOffset--) {
diff --git a/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart b/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart
index e71629b..e337213 100644
--- a/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart
+++ b/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart
@@ -128,7 +128,7 @@
 
   Source get source => unitElement.source;
 
-  CompilationUnit get unit => statementContext.resolveResult.unit!;
+  CompilationUnit get unit => statementContext.resolveResult.unit;
 
   CompilationUnitElement get unitElement => unit.declaredElement!;
 
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart b/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart
index 83b0402..14485d2 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart
@@ -254,7 +254,7 @@
         sessionHelper = AnalysisSessionHelper(resolvedResult.session),
         typeProvider = resolvedResult.typeProvider,
         selectionEnd = selectionOffset + selectionLength,
-        unit = resolvedResult.unit!,
+        unit = resolvedResult.unit,
         utils = CorrectionUtils(resolvedResult);
 
   /// Return `true` if the lint with the given [name] is enabled.
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap.dart
index 1b02c88..318a934 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap.dart
@@ -39,7 +39,7 @@
   Iterable<CorrectionProducer> _wrapMultipleWidgets() sync* {
     var selectionRange = SourceRange(selectionOffset, selectionLength);
     var analyzer = SelectionAnalyzer(selectionRange);
-    resolvedResult.unit!.accept(analyzer);
+    resolvedResult.unit.accept(analyzer);
 
     var widgetExpressions = <Expression>[];
     if (analyzer.hasSelectedNodes) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/organize_imports.dart b/pkg/analysis_server/lib/src/services/correction/dart/organize_imports.dart
index caca5ec..d5cf7c0 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/organize_imports.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/organize_imports.dart
@@ -25,7 +25,7 @@
   @override
   Future<void> compute(ChangeBuilder builder) async {
     var organizer =
-        ImportOrganizer(resolvedResult.content!, unit, resolvedResult.errors);
+        ImportOrganizer(resolvedResult.content, unit, resolvedResult.errors);
     // todo (pq): consider restructuring organizer to allow a passed-in change
     //  builder
     for (var edit in organizer.organize()) {
diff --git a/pkg/analysis_server/lib/src/services/correction/statement_analyzer.dart b/pkg/analysis_server/lib/src/services/correction/statement_analyzer.dart
index 9f1c68a..9a156c4 100644
--- a/pkg/analysis_server/lib/src/services/correction/statement_analyzer.dart
+++ b/pkg/analysis_server/lib/src/services/correction/statement_analyzer.dart
@@ -52,7 +52,7 @@
 
   /// Analyze the selection, compute [status] and nodes.
   void analyze() {
-    resolveResult.unit!.accept(this);
+    resolveResult.unit.accept(this);
   }
 
   /// Records fatal error with given message and [Location].
@@ -73,7 +73,7 @@
     {
       var selectionStart = selection.offset;
       var selectionEnd = selection.end;
-      var commentRanges = getCommentRanges(resolveResult.unit!);
+      var commentRanges = getCommentRanges(resolveResult.unit);
       for (var commentRange in commentRanges) {
         if (commentRange.contains(selectionStart)) {
           invalidSelection('Selection begins inside a comment.');
@@ -208,9 +208,9 @@
 
   /// Returns `true` if there are [Token]s in the given [SourceRange].
   bool _hasTokens(SourceRange range) {
-    var fullText = resolveResult.content!;
+    var fullText = resolveResult.content;
     var rangeText = fullText.substring(range.offset, range.end);
-    return _getTokens(rangeText, resolveResult.unit!.featureSet).isNotEmpty;
+    return _getTokens(rangeText, resolveResult.unit.featureSet).isNotEmpty;
   }
 
   /// Returns `true` if [nodes] contains [node].
diff --git a/pkg/analysis_server/lib/src/services/correction/util.dart b/pkg/analysis_server/lib/src/services/correction/util.dart
index 57ffe36..ae54a38 100644
--- a/pkg/analysis_server/lib/src/services/correction/util.dart
+++ b/pkg/analysis_server/lib/src/services/correction/util.dart
@@ -537,9 +537,9 @@
   String? _endOfLine;
 
   CorrectionUtils(ResolvedUnitResult result)
-      : unit = result.unit!,
+      : unit = result.unit,
         _library = result.libraryElement,
-        _buffer = result.content!;
+        _buffer = result.content;
 
   /// Returns the EOL to use for this [CompilationUnit].
   String get endOfLine {
diff --git a/pkg/analysis_server/lib/src/services/flutter/property.dart b/pkg/analysis_server/lib/src/services/flutter/property.dart
index 0d4f3e3..2a6586d 100644
--- a/pkg/analysis_server/lib/src/services/flutter/property.dart
+++ b/pkg/analysis_server/lib/src/services/flutter/property.dart
@@ -659,7 +659,7 @@
 
   String? _expressionCode(Expression? expression) {
     if (expression != null) {
-      var content = property.resolvedUnit.content!;
+      var content = property.resolvedUnit.content;
       return content.substring(expression.offset, expression.end);
     }
     return null;
diff --git a/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart b/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart
index f38a7cc..77da5dda 100644
--- a/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart
+++ b/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart
@@ -336,7 +336,7 @@
 
     String? valueExpressionCode;
     if (valueExpression != null) {
-      valueExpressionCode = resolvedUnit.content!.substring(
+      valueExpressionCode = resolvedUnit.content.substring(
         valueExpression.offset,
         valueExpression.end,
       );
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
index 0fc97d8..7d361dc 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
@@ -66,7 +66,7 @@
   @override
   String get refactoringName => 'Extract Local Variable';
 
-  CompilationUnit get unit => resolveResult.unit!;
+  CompilationUnit get unit => resolveResult.unit;
 
   CompilationUnitElement get unitElement => unit.declaredElement!;
 
@@ -231,7 +231,7 @@
       return RefactoringStatus.fatal(
           'The selection offset must be greater than zero.');
     }
-    if (selectionOffset + selectionLength >= resolveResult.content!.length) {
+    if (selectionOffset + selectionLength >= resolveResult.content.length) {
       return RefactoringStatus.fatal(
           'The selection end offset must be less then the length of the file.');
     }
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
index a2c9a19..ebb50c0 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
@@ -297,7 +297,7 @@
       // add replace edit
       var edit = newSourceEdit_range(range, invocationSource);
       doSourceChange_addElementEdit(
-          change, resolveResult.unit!.declaredElement!, edit);
+          change, resolveResult.unit.declaredElement!, edit);
     }
     // add method declaration
     {
@@ -378,7 +378,7 @@
         var offset = _parentMember!.end;
         var edit = SourceEdit(offset, 0, '$eol$eol$prefix$declarationSource');
         doSourceChange_addElementEdit(
-            change, resolveResult.unit!.declaredElement!, edit);
+            change, resolveResult.unit.declaredElement!, edit);
       }
     }
     // done
@@ -450,7 +450,7 @@
       return RefactoringStatus.fatal(
           'The selection offset must be greater than zero.');
     }
-    if (selectionOffset + selectionLength >= resolveResult.content!.length) {
+    if (selectionOffset + selectionLength >= resolveResult.content.length) {
       return RefactoringStatus.fatal(
           'The selection end offset must be less then the length of the file.');
     }
@@ -658,12 +658,11 @@
     var originalSource = utils.getText(range.offset, range.length);
     var pattern = _SourcePattern();
     var replaceEdits = <SourceEdit>[];
-    resolveResult.unit!
-        .accept(_GetSourcePatternVisitor(range, pattern, replaceEdits));
+    resolveResult.unit.accept(_GetSourcePatternVisitor(range, pattern, replaceEdits));
     replaceEdits = replaceEdits.reversed.toList();
     var source = SourceEdit.applySequence(originalSource, replaceEdits);
     pattern.normalizedSource =
-        _getNormalizedSource(source, resolveResult.unit!.featureSet);
+        _getNormalizedSource(source, resolveResult.unit.featureSet);
     return pattern;
   }
 
@@ -706,7 +705,7 @@
     var result = RefactoringStatus();
     var assignedUsedVariables = <VariableElement>[];
 
-    var unit = resolveResult.unit!;
+    var unit = resolveResult.unit;
     _visibleRangeMap = VisibleRangesComputer.forNode(unit);
     unit.accept(
       _InitializeParametersVisitor(this, assignedUsedVariables),
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
index 1137c45..6fe4778 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
@@ -85,7 +85,7 @@
   }
 
   FeatureSet get _featureSet {
-    return resolveResult.unit!.featureSet;
+    return resolveResult.unit.featureSet;
   }
 
   Flutter get _flutter => Flutter.instance;
diff --git a/pkg/analysis_server/lib/src/services/refactoring/inline_local.dart b/pkg/analysis_server/lib/src/services/refactoring/inline_local.dart
index c7577b6..e0f3df71 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/inline_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/inline_local.dart
@@ -114,7 +114,7 @@
   @override
   Future<SourceChange> createChange() {
     var change = SourceChange(refactoringName);
-    var unitElement = resolveResult.unit!.declaredElement!;
+    var unitElement = resolveResult.unit.declaredElement!;
     var state = _initialState!;
     // remove declaration
     {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart b/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
index 1cff243..f3e4b67 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
@@ -363,7 +363,7 @@
     _methodNode = methodNode;
 
     var resolvedUnit = declaration.resolvedUnit!;
-    _methodUnit = resolvedUnit.unit!;
+    _methodUnit = resolvedUnit.unit;
     _methodUtils = CorrectionUtils(resolvedUnit);
 
     if (methodNode is MethodDeclaration) {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/move_file.dart b/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
index 1c259a4..f768861 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
@@ -71,7 +71,7 @@
   @override
   Future<SourceChange> createChange() async {
     var changeBuilder = ChangeBuilder(session: resolvedUnit.session);
-    var element = resolvedUnit.unit!.declaredElement;
+    var element = resolvedUnit.unit.declaredElement;
     if (element == null) {
       return changeBuilder.sourceChange;
     }
@@ -92,14 +92,14 @@
       var definingUnitResult = libraryResult.units.first;
       for (var result in libraryResult.units) {
         if (result.isPart) {
-          var partOfs = result.unit!.directives
+          var partOfs = result.unit.directives
               .whereType<PartOfDirective>()
               .map((e) => e.uri)
               .whereNotNull()
               .where((uri) => _isRelativeUri(uri.stringValue));
           if (partOfs.isNotEmpty) {
             await changeBuilder.addDartFileEdit(
-                result.unit!.declaredElement!.source.fullName, (builder) {
+                result.unit.declaredElement!.source.fullName, (builder) {
               partOfs.forEach((uri) {
                 var newLocation =
                     pathContext.join(newDir, pathos.basename(newFile));
@@ -114,7 +114,7 @@
 
       if (newDir != oldDir) {
         await changeBuilder.addDartFileEdit(definingUnitResult.path, (builder) {
-          for (var directive in definingUnitResult.unit!.directives) {
+          for (var directive in definingUnitResult.unit.directives) {
             if (directive is UriBasedDirective) {
               _updateUriReference(builder, directive, oldDir, newDir);
             }
@@ -123,7 +123,7 @@
       }
     } else if (newDir != oldDir) {
       // Otherwise, we need to update any relative part-of references.
-      var partOfs = resolvedUnit.unit!.directives
+      var partOfs = resolvedUnit.unit.directives
           .whereType<PartOfDirective>()
           .map((e) => e.uri)
           .whereNotNull()
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
index 422d944..91654f8 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
@@ -334,9 +334,6 @@
         }
 
         var unit = result.unit;
-        if (unit == null) {
-          return const [];
-        }
 
         var collector = _LocalElementsCollector(name);
         unit.accept(collector);
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_extension_member.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_extension_member.dart
index 5367235..f0b65ab 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_extension_member.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_extension_member.dart
@@ -165,9 +165,6 @@
         }
 
         var unit = result.unit;
-        if (unit == null) {
-          return const [];
-        }
 
         var collector = _LocalElementsCollector(name);
         unit.accept(collector);
diff --git a/pkg/analysis_server/lib/src/status/diagnostics.dart b/pkg/analysis_server/lib/src/status/diagnostics.dart
index 610be65..999bc4d 100644
--- a/pkg/analysis_server/lib/src/status/diagnostics.dart
+++ b/pkg/analysis_server/lib/src/status/diagnostics.dart
@@ -246,7 +246,7 @@
     var result = await driver.getResult2(filePath);
     if (result is ResolvedUnitResult) {
       var writer = AstWriter(buf);
-      result.unit!.accept(writer);
+      result.unit.accept(writer);
     } else {
       p(
           'An AST could not be produced for the file '
@@ -836,7 +836,7 @@
     var result = await driver.getResult2(filePath);
     CompilationUnitElement? compilationUnitElement;
     if (result is ResolvedUnitResult) {
-      compilationUnitElement = result.unit?.declaredElement;
+      compilationUnitElement = result.unit.declaredElement;
     }
     if (compilationUnitElement != null) {
       var writer = ElementWriter(buf);
diff --git a/pkg/analysis_server/test/abstract_single_unit.dart b/pkg/analysis_server/test/abstract_single_unit.dart
index 5323a57..b18416c 100644
--- a/pkg/analysis_server/test/abstract_single_unit.dart
+++ b/pkg/analysis_server/test/abstract_single_unit.dart
@@ -72,8 +72,8 @@
   Future<void> resolveTestFile() async {
     var result = await session.getResolvedUnit(testFile) as ResolvedUnitResult;
     testAnalysisResult = result;
-    testCode = result.content!;
-    testUnit = result.unit!;
+    testCode = result.content;
+    testUnit = result.unit;
     if (verifyNoTestUnitErrors) {
       expect(result.errors.where((AnalysisError error) {
         return error.errorCode != HintCode.DEAD_CODE &&
diff --git a/pkg/analysis_server/test/services/correction/organize_directives_test.dart b/pkg/analysis_server/test/services/correction/organize_directives_test.dart
index 8681ccb..7696ad5 100644
--- a/pkg/analysis_server/test/services/correction/organize_directives_test.dart
+++ b/pkg/analysis_server/test/services/correction/organize_directives_test.dart
@@ -583,7 +583,7 @@
   Future<void> _computeUnitAndErrors(String code) async {
     addTestSource(code);
     var result = await session.getResolvedUnit(testFile) as ResolvedUnitResult;
-    testUnit = result.unit!;
+    testUnit = result.unit;
     testErrors = result.errors;
   }
 }
diff --git a/pkg/analysis_server/test/services/search/search_engine_test.dart b/pkg/analysis_server/test/services/search/search_engine_test.dart
index 99aa552..512db98 100644
--- a/pkg/analysis_server/test/services/search/search_engine_test.dart
+++ b/pkg/analysis_server/test/services/search/search_engine_test.dart
@@ -41,8 +41,8 @@
     result = await resolveFile(path);
     expect(result.state, ResultState.VALID);
 
-    findNode = FindNode(result.content!, result.unit!);
-    findElement = FindElement(result.unit!);
+    findNode = FindNode(result.content, result.unit);
+    findElement = FindElement(result.unit);
   }
 
   /// Put the [code] into the test file, and resolve it.
diff --git a/pkg/analysis_server/test/src/cider/completion_test.dart b/pkg/analysis_server/test/src/cider/completion_test.dart
index b83e4ef..7a50af7 100644
--- a/pkg/analysis_server/test/src/cider/completion_test.dart
+++ b/pkg/analysis_server/test/src/cider/completion_test.dart
@@ -806,7 +806,7 @@
   /// for completion we don't resolve unnecessary node.
   void _configureToCheckNotResolved({required Set<String> identifiers}) {
     _testResolvedUnit = (resolvedUnitResult) {
-      var unit = resolvedUnitResult.unit!;
+      var unit = resolvedUnitResult.unit;
       unit.accept(
         FunctionAstVisitor(
           simpleIdentifier: (node) {
diff --git a/pkg/analysis_server/test/src/computer/closing_labels_computer_test.dart b/pkg/analysis_server/test/src/computer/closing_labels_computer_test.dart
index 5e39f9a..83a9954 100644
--- a/pkg/analysis_server/test/src/computer/closing_labels_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/closing_labels_computer_test.dart
@@ -399,7 +399,7 @@
     newFile(sourcePath, content: sourceContent);
     var result =
         await session.getResolvedUnit(sourcePath) as ResolvedUnitResult;
-    var computer = DartUnitClosingLabelsComputer(result.lineInfo, result.unit!);
+    var computer = DartUnitClosingLabelsComputer(result.lineInfo, result.unit);
     return computer.compute();
   }
 }
diff --git a/pkg/analysis_server/test/src/computer/folding_computer_test.dart b/pkg/analysis_server/test/src/computer/folding_computer_test.dart
index e6084a0..f63607d 100644
--- a/pkg/analysis_server/test/src/computer/folding_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/folding_computer_test.dart
@@ -583,7 +583,7 @@
     newFile(sourcePath, content: sourceContent);
     var result =
         await session.getResolvedUnit(sourcePath) as ResolvedUnitResult;
-    var computer = DartUnitFoldingComputer(result.lineInfo, result.unit!);
+    var computer = DartUnitFoldingComputer(result.lineInfo, result.unit);
     return computer.compute();
   }
 }
diff --git a/pkg/analysis_server/test/src/computer/highlights_computer_test.dart b/pkg/analysis_server/test/src/computer/highlights_computer_test.dart
index 145950d..46a6c44 100644
--- a/pkg/analysis_server/test/src/computer/highlights_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/highlights_computer_test.dart
@@ -122,7 +122,7 @@
       expect(result.errors, isEmpty);
     }
 
-    var computer = DartUnitHighlightsComputer(result.unit!);
+    var computer = DartUnitHighlightsComputer(result.unit);
     highlights = computer.compute();
   }
 }
diff --git a/pkg/analysis_server/test/src/computer/imported_elements_computer_test.dart b/pkg/analysis_server/test/src/computer/imported_elements_computer_test.dart
index 3448803..a63d9bc 100644
--- a/pkg/analysis_server/test/src/computer/imported_elements_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/imported_elements_computer_test.dart
@@ -473,7 +473,7 @@
     var result =
         await session.getResolvedUnit(sourcePath) as ResolvedUnitResult;
     var computer = ImportedElementsComputer(
-        result.unit!, content.indexOf(selection), selection.length);
+        result.unit, content.indexOf(selection), selection.length);
     importedElements = computer.compute();
   }
 }
diff --git a/pkg/analysis_server/test/src/computer/selection_range_computer_test.dart b/pkg/analysis_server/test/src/computer/selection_range_computer_test.dart
index 603b7b6..27e9e7f 100644
--- a/pkg/analysis_server/test/src/computer/selection_range_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/selection_range_computer_test.dart
@@ -195,7 +195,7 @@
     newFile(sourcePath, content: sourceContent);
     var result =
         await session.getResolvedUnit(sourcePath) as ResolvedUnitResult;
-    var computer = DartSelectionRangeComputer(result.unit!, offset);
+    var computer = DartSelectionRangeComputer(result.unit, offset);
     return computer.compute();
   }
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/code_template_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/code_template_test.dart
index 5103661..f6ccc74 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/code_template_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/code_template_test.dart
@@ -72,7 +72,7 @@
 }
 void g(int x, int y) {}
 ''');
-    var unit = testAnalysisResult.unit!;
+    var unit = testAnalysisResult.unit;
     var function = unit.declarations[0] as FunctionDeclaration;
     var body = function.functionExpression.body as BlockFunctionBody;
     var statement = body.block.statements[0] as ExpressionStatement;
diff --git a/pkg/analysis_server/test/src/services/flutter/widget_description.dart b/pkg/analysis_server/test/src/services/flutter/widget_description.dart
index 8cdbfff..33f47ad 100644
--- a/pkg/analysis_server/test/src/services/flutter/widget_description.dart
+++ b/pkg/analysis_server/test/src/services/flutter/widget_description.dart
@@ -24,7 +24,7 @@
     expect(fileEdit.file, testAnalysisResult.path);
 
     var actual = SourceEdit.applySequence(
-      testAnalysisResult.content!,
+      testAnalysisResult.content,
       fileEdit.edits,
     );
     expect(actual, expected);
@@ -50,7 +50,7 @@
 
   Future<protocol.FlutterGetWidgetDescriptionResult?> getDescription(
       String search) async {
-    var content = testAnalysisResult.content!;
+    var content = testAnalysisResult.content;
 
     var offset = content.indexOf(search);
     if (offset == -1) {
diff --git a/pkg/analysis_server/test/stress/completion/completion_runner.dart b/pkg/analysis_server/test/stress/completion/completion_runner.dart
index 8d16f86..16d1e81 100644
--- a/pkg/analysis_server/test/stress/completion/completion_runner.dart
+++ b/pkg/analysis_server/test/stress/completion/completion_runner.dart
@@ -82,9 +82,9 @@
         output.write('.');
         var result = await context.currentSession.getResolvedUnit(path)
             as ResolvedUnitResult;
-        var content = result.content!;
+        var content = result.content;
         var lineInfo = result.lineInfo;
-        var identifiers = _identifiersIn(result.unit!);
+        var identifiers = _identifiersIn(result.unit);
 
         for (var identifier in identifiers) {
           identifierCount++;
diff --git a/pkg/analysis_server/tool/code_completion/code_metrics.dart b/pkg/analysis_server/tool/code_completion/code_metrics.dart
index 898b393..565a9fd 100644
--- a/pkg/analysis_server/tool/code_completion/code_metrics.dart
+++ b/pkg/analysis_server/tool/code_completion/code_metrics.dart
@@ -1411,7 +1411,7 @@
             continue;
           }
 
-          resolvedUnitResult.unit!.accept(collector);
+          resolvedUnitResult.unit.accept(collector);
         } catch (exception) {
           print('Exception caught analyzing: "$filePath"');
           print(exception.toString());
diff --git a/pkg/analysis_server/tool/code_completion/completion_metrics.dart b/pkg/analysis_server/tool/code_completion/completion_metrics.dart
index 3527d19..46638b1 100644
--- a/pkg/analysis_server/tool/code_completion/completion_metrics.dart
+++ b/pkg/analysis_server/tool/code_completion/completion_metrics.dart
@@ -1319,7 +1319,7 @@
       // Use the ExpectedCompletionsVisitor to compute the set of expected
       // completions for this CompilationUnit.
       final visitor = ExpectedCompletionsVisitor(filePath);
-      _resolvedUnitResult.unit!.accept(visitor);
+      _resolvedUnitResult.unit.accept(visitor);
 
       for (var expectedCompletion in visitor.expectedCompletions) {
         var resolvedUnitResult = _resolvedUnitResult;
@@ -1328,7 +1328,7 @@
         // have the context reanalyze the file
         if (options.overlay != CompletionMetricsOptions.OVERLAY_NONE) {
           var overlayContents = _getOverlayContents(
-              _resolvedUnitResult.content!, expectedCompletion);
+              _resolvedUnitResult.content, expectedCompletion);
 
           _provider.setOverlay(filePath,
               content: overlayContents,
diff --git a/pkg/analysis_server/tool/code_completion/flutter_metrics.dart b/pkg/analysis_server/tool/code_completion/flutter_metrics.dart
index 886c484..edab701 100644
--- a/pkg/analysis_server/tool/code_completion/flutter_metrics.dart
+++ b/pkg/analysis_server/tool/code_completion/flutter_metrics.dart
@@ -224,7 +224,7 @@
             continue;
           }
 
-          resolvedUnitResult.unit!.accept(collector);
+          resolvedUnitResult.unit.accept(collector);
         } catch (exception, stackTrace) {
           print('');
           print('Exception caught analyzing: "$filePath"');
diff --git a/pkg/analysis_server/tool/code_completion/implicit_type_declarations.dart b/pkg/analysis_server/tool/code_completion/implicit_type_declarations.dart
index c2f21c9..8494fb4 100644
--- a/pkg/analysis_server/tool/code_completion/implicit_type_declarations.dart
+++ b/pkg/analysis_server/tool/code_completion/implicit_type_declarations.dart
@@ -208,7 +208,7 @@
             continue;
           }
 
-          resolvedUnitResult.unit!.accept(collector);
+          resolvedUnitResult.unit.accept(collector);
         } catch (exception, stacktrace) {
           print('Exception caught analyzing: "$filePath"');
           print(exception);
diff --git a/pkg/analysis_server/tool/code_completion/relevance_metrics.dart b/pkg/analysis_server/tool/code_completion/relevance_metrics.dart
index e80ba2a3..8a24e94 100644
--- a/pkg/analysis_server/tool/code_completion/relevance_metrics.dart
+++ b/pkg/analysis_server/tool/code_completion/relevance_metrics.dart
@@ -1964,7 +1964,7 @@
             continue;
           }
 
-          resolvedUnitResult.unit!.accept(collector);
+          resolvedUnitResult.unit.accept(collector);
         } catch (exception, stacktrace) {
           print('Exception caught analyzing: "$filePath"');
           print(exception);
diff --git a/pkg/analysis_server/tool/code_completion/relevance_table_generator.dart b/pkg/analysis_server/tool/code_completion/relevance_table_generator.dart
index 77359a0..3e2af94 100644
--- a/pkg/analysis_server/tool/code_completion/relevance_table_generator.dart
+++ b/pkg/analysis_server/tool/code_completion/relevance_table_generator.dart
@@ -317,7 +317,7 @@
 
   /// Initialize this collector prior to visiting the unit in the [result].
   void initializeFrom(ResolvedUnitResult result) {
-    unit = result.unit!;
+    unit = result.unit;
   }
 
   @override
@@ -1484,7 +1484,7 @@
           }
 
           collector.initializeFrom(resolvedUnitResult);
-          resolvedUnitResult.unit!.accept(collector);
+          resolvedUnitResult.unit.accept(collector);
         } catch (exception, stacktrace) {
           print('Exception caught analyzing: "$filePath"');
           print(exception);
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index e8557d9..73619d3 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -3,6 +3,8 @@
 * Changed `ParsedLibraryResult.units` to be non-nullable.
 * Changed `ResolvedLibraryResult.element` to be non-nullable.
 * Changed `ResolvedLibraryResult.units` to be non-nullable.
+* Changed `ResolvedUnitResult.content` to be non-nullable.
+* Changed `ResolvedUnitResult.unit` to be non-nullable.
 * Deprecated and renamed `AnalysisSession.getXyz2()` into `getXyz()`.
 * Changed `AnalysisDriver.results` to `Stream<Object>`.
   It used to always produce `ResolvedUnitResult`s, but sometimes its
diff --git a/pkg/analyzer/lib/dart/analysis/results.dart b/pkg/analyzer/lib/dart/analysis/results.dart
index 550303b..13500ba 100644
--- a/pkg/analyzer/lib/dart/analysis/results.dart
+++ b/pkg/analyzer/lib/dart/analysis/results.dart
@@ -231,7 +231,7 @@
 abstract class ResolvedUnitResult
     implements SomeResolvedUnitResult, AnalysisResultWithErrors {
   /// The content of the file that was scanned, parsed and resolved.
-  String? get content;
+  String get content;
 
   /// Return `true` if the file exists.
   bool get exists;
@@ -246,7 +246,7 @@
   TypeSystem get typeSystem;
 
   /// The fully resolved compilation unit for the [content].
-  CompilationUnit? get unit;
+  CompilationUnit get unit;
 }
 
 /// An indication of whether an analysis result is valid, and if not why.
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index df488a6..c7726fb 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -1672,7 +1672,7 @@
     List<AnalysisError> errors = _getErrorsFromSerialized(file, unit.errors);
     _updateHasErrorOrWarningFlag(file, errors);
     var index = unit.index!;
-    if (resolvedUnit != null) {
+    if (content != null && resolvedUnit != null) {
       var resolvedUnitResult = ResolvedUnitResultImpl(
         currentSession,
         file.path,
diff --git a/pkg/analyzer/lib/src/dart/analysis/results.dart b/pkg/analyzer/lib/src/dart/analysis/results.dart
index d13482f..9db2ec6 100644
--- a/pkg/analyzer/lib/src/dart/analysis/results.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/results.dart
@@ -204,13 +204,8 @@
       },
     );
 
-    var unit = unitResult.unit;
-    if (unit == null) {
-      throw StateError('The result has no unit');
-    }
-
     var locator = _DeclarationByElementLocator(element);
-    unit.accept(locator);
+    unitResult.unit.accept(locator);
     var declaration = locator.result;
 
     if (declaration == null) {
@@ -227,10 +222,10 @@
   final bool exists;
 
   @override
-  final String? content;
+  final String content;
 
   @override
-  final CompilationUnit? unit;
+  final CompilationUnit unit;
 
   @override
   final List<AnalysisError> errors;
@@ -249,10 +244,6 @@
 
   @override
   LibraryElement get libraryElement {
-    final unit = this.unit;
-    if (unit == null) {
-      throw StateError('The result has no unit');
-    }
     return unit.declaredElement!.library;
   }
 
diff --git a/pkg/analyzer/lib/src/dart/analysis/search.dart b/pkg/analyzer/lib/src/dart/analysis/search.dart
index 20df7ad..8d7a200 100644
--- a/pkg/analyzer/lib/src/dart/analysis/search.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/search.dart
@@ -381,7 +381,7 @@
       var unitResult = await _driver.getResult2(unitPath);
       if (unitResult is ResolvedUnitResult) {
         var visitor = _ImportElementReferencesVisitor(element, unitElement);
-        unitResult.unit!.accept(visitor);
+        unitResult.unit.accept(visitor);
         results.addAll(visitor.results);
       }
     }
@@ -400,7 +400,7 @@
       String unitPath = unitElement.source.fullName;
       var unitResult = await _driver.getResult2(unitPath);
       if (unitResult is ResolvedUnitResult) {
-        CompilationUnit unit = unitResult.unit!;
+        CompilationUnit unit = unitResult.unit;
         for (Directive directive in unit.directives) {
           if (directive is PartOfDirective && directive.element == element) {
             results.add(
@@ -433,9 +433,6 @@
       return const <SearchResult>[];
     }
     var unit = unitResult.unit;
-    if (unit == null) {
-      return const <SearchResult>[];
-    }
 
     // Prepare the node.
     var node = NodeLocator(element.nameOffset).searchWithin(unit);
@@ -487,7 +484,7 @@
       var unitResult = await _driver.getResult2(unitPath);
       if (unitResult is ResolvedUnitResult) {
         var visitor = _LocalReferencesVisitor(element, unitElement);
-        unitResult.unit!.accept(visitor);
+        unitResult.unit.accept(visitor);
         results.addAll(visitor.results);
       }
     }
diff --git a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
index aa64210..e11ec7f 100644
--- a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
+++ b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
@@ -208,7 +208,7 @@
       result.forEach((filePath) {
         var resolved = resolve(path: filePath);
         var collector = ReferencesCollector(element);
-        resolved.unit?.accept(collector);
+        resolved.unit.accept(collector);
         var offsets = collector.offsets;
         if (offsets.isNotEmpty) {
           references.add(CiderSearchMatch(filePath, offsets));
diff --git a/pkg/analyzer/test/error/error_reporter_test.dart b/pkg/analyzer/test/error/error_reporter_test.dart
index dba624a..7b32e98 100644
--- a/pkg/analyzer/test/error/error_reporter_test.dart
+++ b/pkg/analyzer/test/error/error_reporter_test.dart
@@ -166,7 +166,7 @@
     var fa = findNode.topLevelVariableDeclaration('fa');
     var fb = findNode.topLevelVariableDeclaration('fb');
 
-    var source = result.unit!.declaredElement!.source;
+    var source = result.unit.declaredElement!.source;
     var reporter = ErrorReporter(
       listener,
       source,
@@ -201,7 +201,7 @@
     var ba = findNode.topLevelVariableDeclaration('ba');
     var bb = findNode.topLevelVariableDeclaration('bb');
 
-    var source = result.unit!.declaredElement!.source;
+    var source = result.unit.declaredElement!.source;
     var reporter = ErrorReporter(
       listener,
       source,
diff --git a/pkg/analyzer/test/generated/non_error_resolver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_test.dart
index 33fc9a1..91e4e01 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -761,7 +761,7 @@
 class D {}
 class E {}
 ''');
-    CompilationUnit unit = result.unit!;
+    CompilationUnit unit = result.unit;
     ClassElement classC = unit.declaredElement!.getType('C')!;
     expect(classC.documentationComment, isNotNull);
   }
@@ -1610,7 +1610,7 @@
 
 class C extends A<B> with M {}
 ''');
-    CompilationUnit unit = result.unit!;
+    CompilationUnit unit = result.unit;
     ClassElement classC = unit.declaredElement!.getType('C')!;
     expect(classC.mixins, hasLength(1));
     assertType(classC.mixins[0], 'M<B>');
@@ -1632,7 +1632,7 @@
         1,
       ),
     ]);
-    CompilationUnit unit = result.unit!;
+    CompilationUnit unit = result.unit;
     ClassElement classC = unit.declaredElement!.getType('C')!;
     expect(classC.mixins, hasLength(1));
     assertType(classC.mixins[0], 'M<int, String>');
@@ -1648,7 +1648,7 @@
 
 class C extends A<List<B>> with M {}
 ''');
-    CompilationUnit unit = result.unit!;
+    CompilationUnit unit = result.unit;
     ClassElement classC = unit.declaredElement!.getType('C')!;
     expect(classC.mixins, hasLength(1));
     assertType(classC.mixins[0], 'M<B>');
@@ -2095,7 +2095,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 93, 1),
       error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 97, 1),
     ]);
-    var z = result.unit!.declaredElement!.topLevelVariables
+    var z = result.unit.declaredElement!.topLevelVariables
         .where((e) => e.name == 'z')
         .single;
     assertType(z.type, 'List<String>');
@@ -2275,7 +2275,7 @@
 class B<T> = Object with A<T>;
 class C = Object with B;
 ''');
-    var bReference = result.unit!.declaredElement!.getType('C')!.mixins[0];
+    var bReference = result.unit.declaredElement!.getType('C')!.mixins[0];
     assertTypeDynamic(bReference.typeArguments[0]);
   }
 
@@ -2294,7 +2294,7 @@
 ''', [
       error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 122, 1),
     ]);
-    var bReference = result.unit!.declaredElement!.getType('C')!.mixins[0];
+    var bReference = result.unit.declaredElement!.getType('C')!.mixins[0];
     assertType(bReference.typeArguments[0], 'int');
   }
 
@@ -2333,7 +2333,7 @@
   x;
 }
 ''');
-    var main = result.unit!.declarations.last as FunctionDeclaration;
+    var main = result.unit.declarations.last as FunctionDeclaration;
     var mainBody = main.functionExpression.body as BlockFunctionBody;
     var xDecl = mainBody.block.statements[0] as VariableDeclarationStatement;
     var xElem = xDecl.variables.variables[0].declaredElement!;
@@ -2804,8 +2804,8 @@
 @B.named8()
 main() {}
 ''');
-    expect(result.unit!.declarations, hasLength(1));
-    final mainDecl = result.unit!.declarations[0];
+    expect(result.unit.declarations, hasLength(1));
+    final mainDecl = result.unit.declarations[0];
     expect(mainDecl.metadata, hasLength(8));
     mainDecl.metadata.forEach((metadata) {
       final value = metadata.elementAnnotation!.computeConstantValue()!;
diff --git a/pkg/analyzer/test/generated/simple_resolver_test.dart b/pkg/analyzer/test/generated/simple_resolver_test.dart
index b0a30a2..254dea0 100644
--- a/pkg/analyzer/test/generated/simple_resolver_test.dart
+++ b/pkg/analyzer/test/generated/simple_resolver_test.dart
@@ -1264,7 +1264,7 @@
   /// Verify that all of the identifiers in the [result] have been resolved.
   void verifyTestResolved() {
     var verifier = ResolutionVerifier();
-    result.unit!.accept(verifier);
+    result.unit.accept(verifier);
     verifier.assertResolved();
   }
 
diff --git a/pkg/analyzer/test/generated/strong_mode_test.dart b/pkg/analyzer/test/generated/strong_mode_test.dart
index aa67fe2..e724509 100644
--- a/pkg/analyzer/test/generated/strong_mode_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_test.dart
@@ -59,7 +59,7 @@
 
   late final AsserterBuilder<Element, DartType> _hasElement;
 
-  CompilationUnit get unit => result.unit!;
+  CompilationUnit get unit => result.unit;
 
   @override
   Future<void> resolveTestFile() async {
@@ -2404,7 +2404,7 @@
 }
 ''');
 
-    var b = result.unit!.declarations[1] as ClassDeclaration;
+    var b = result.unit.declarations[1] as ClassDeclaration;
     var bConstructor = b.members[0] as ConstructorDeclaration;
     var redirected = bConstructor.redirectedConstructor as ConstructorName;
 
diff --git a/pkg/analyzer/test/src/dart/analysis/dependency/base.dart b/pkg/analyzer/test/src/dart/analysis/dependency/base.dart
index 08f50c5..0c2aefa 100644
--- a/pkg/analyzer/test/src/dart/analysis/dependency/base.dart
+++ b/pkg/analyzer/test/src/dart/analysis/dependency/base.dart
@@ -140,7 +140,7 @@
     var session = contextFor(libraryPath).currentSession;
     var resolvedLibrary = await session.getResolvedLibrary(libraryPath);
     resolvedLibrary as ResolvedLibraryResult;
-    return resolvedLibrary.units.map((ru) => ru.unit!).toList();
+    return resolvedLibrary.units.map((ru) => ru.unit).toList();
   }
 }
 
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
index 5853f91..9fe7223 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -143,7 +143,7 @@
     await resolveTestFile();
 
     var myDeclaration =
-        result.unit!.declarations[0] as TopLevelVariableDeclaration;
+        result.unit.declarations[0] as TopLevelVariableDeclaration;
     var myVariable = myDeclaration.variables.variables[0];
     var myElement = myVariable.declaredElement as TopLevelVariableElement;
 
@@ -157,7 +157,7 @@
     }
 
     {
-      var classNode = result.unit!.declarations[1] as ClassDeclaration;
+      var classNode = result.unit.declarations[1] as ClassDeclaration;
       assertMyAnnotation(classNode);
 
       {
@@ -177,12 +177,12 @@
     }
 
     {
-      var node = result.unit!.declarations[2] as TopLevelVariableDeclaration;
+      var node = result.unit.declarations[2] as TopLevelVariableDeclaration;
       assertMyAnnotation(node);
     }
 
     {
-      var node = result.unit!.declarations[3] as FunctionDeclaration;
+      var node = result.unit.declarations[3] as FunctionDeclaration;
       assertMyAnnotation(node);
     }
   }
@@ -346,11 +346,11 @@
 
     await resolveTestFile();
 
-    var c = result.unit!.declarations[0] as ClassDeclaration;
+    var c = result.unit.declarations[0] as ClassDeclaration;
     var constructor = c.members[1] as ConstructorDeclaration;
     ConstructorElement element = constructor.declaredElement!;
 
-    var main = result.unit!.declarations[1] as FunctionDeclaration;
+    var main = result.unit.declarations[1] as FunctionDeclaration;
     var statement = (main.functionExpression.body as BlockFunctionBody)
         .block
         .statements[0] as VariableDeclarationStatement;
@@ -377,11 +377,11 @@
     await resolveTestFile();
 
     var myDeclaration =
-        result.unit!.declarations[0] as TopLevelVariableDeclaration;
+        result.unit.declarations[0] as TopLevelVariableDeclaration;
     VariableDeclaration myVariable = myDeclaration.variables.variables[0];
     var myElement = myVariable.declaredElement as TopLevelVariableElement;
 
-    var classNode = result.unit!.declarations[1] as ClassDeclaration;
+    var classNode = result.unit.declarations[1] as ClassDeclaration;
     var node = classNode.members[0] as MethodDeclaration;
     var statement = (node.body as BlockFunctionBody).block.statements[0]
         as VariableDeclarationStatement;
@@ -406,7 +406,7 @@
 main() {}
 ''');
     await resolveTestFile();
-    CompilationUnit unit = result.unit!;
+    CompilationUnit unit = result.unit;
 
     ImportElement aImport = unit.declaredElement!.library.imports[0];
     PrefixElement aPrefix = aImport.prefix!;
@@ -445,7 +445,7 @@
 main() {}
 ''');
     await resolveTestFile();
-    CompilationUnit unit = result.unit!;
+    CompilationUnit unit = result.unit;
 
     ImportElement aImport = unit.declaredElement!.library.imports[0];
     PrefixElement aPrefix = aImport.prefix!;
@@ -486,7 +486,7 @@
 main() {}
 ''');
     await resolveTestFile();
-    CompilationUnit unit = result.unit!;
+    CompilationUnit unit = result.unit;
 
     ImportElement aImport = unit.declaredElement!.library.imports[0];
     PrefixElement aPrefix = aImport.prefix!;
@@ -527,7 +527,7 @@
 main() {}
 ''');
     await resolveTestFile();
-    CompilationUnit unit = result.unit!;
+    CompilationUnit unit = result.unit;
 
     ImportElement aImport = unit.declaredElement!.library.imports[0];
     PrefixElement aPrefix = aImport.prefix!;
@@ -560,7 +560,7 @@
 }
 ''');
     await resolveTestFile();
-    CompilationUnit unit = result.unit!;
+    CompilationUnit unit = result.unit;
     CompilationUnitElement unitElement = unit.declaredElement!;
 
     ClassElement aClass = unitElement.getType('A')!;
@@ -590,7 +590,7 @@
 }
 ''');
     await resolveTestFile();
-    CompilationUnit unit = result.unit!;
+    CompilationUnit unit = result.unit;
     CompilationUnitElement unitElement = unit.declaredElement!;
 
     ClassElement aClass = unitElement.getType('A')!;
@@ -620,7 +620,7 @@
 }
 ''');
     await resolveTestFile();
-    CompilationUnit unit = result.unit!;
+    CompilationUnit unit = result.unit;
     CompilationUnitElement unitElement = unit.declaredElement!;
 
     ClassElement aClass = unitElement.getType('A')!;
@@ -657,11 +657,11 @@
 f() {}
 ''');
     await resolveTestFile();
-    var elementC = AstFinder.getClass(result.unit!, 'C').declaredElement!;
+    var elementC = AstFinder.getClass(result.unit, 'C').declaredElement!;
     var constructorC = elementC.constructors[0];
-    var elementD = AstFinder.getClass(result.unit!, 'D').declaredElement!;
+    var elementD = AstFinder.getClass(result.unit, 'D').declaredElement!;
     var constructorD = elementD.constructors[0];
-    var atD = AstFinder.getTopLevelFunction(result.unit!, 'f').metadata[0];
+    var atD = AstFinder.getTopLevelFunction(result.unit, 'f').metadata[0];
     var constC = atD.arguments!.arguments[0] as InstanceCreationExpression;
 
     expect(atD.name.staticElement, elementD);
@@ -689,16 +689,16 @@
     await resolveTestFile();
 
     var declaration_1 =
-        result.unit!.declarations[0] as TopLevelVariableDeclaration;
+        result.unit.declarations[0] as TopLevelVariableDeclaration;
     VariableDeclaration variable_1 = declaration_1.variables.variables[0];
     var element_1 = variable_1.declaredElement as TopLevelVariableElement;
 
     var declaration_2 =
-        result.unit!.declarations[1] as TopLevelVariableDeclaration;
+        result.unit.declarations[1] as TopLevelVariableDeclaration;
     VariableDeclaration variable_2 = declaration_2.variables.variables[0];
     var element_2 = variable_2.declaredElement as TopLevelVariableElement;
 
-    var main = result.unit!.declarations[2] as FunctionDeclaration;
+    var main = result.unit.declarations[2] as FunctionDeclaration;
 
     Annotation annotation_1 = main.metadata[0];
     expect(annotation_1.element, same(element_1.getter));
@@ -959,7 +959,7 @@
 ''');
     await resolveTestFile();
 
-    var mainDeclaration = result.unit!.declarations[0] as FunctionDeclaration;
+    var mainDeclaration = result.unit.declarations[0] as FunctionDeclaration;
     var mainElement = mainDeclaration.declaredElement as FunctionElement;
     var mainBody = mainDeclaration.functionExpression.body as BlockFunctionBody;
     List<Statement> mainStatements = mainBody.block.statements;
@@ -1090,7 +1090,7 @@
 }
 ''');
     await resolveTestFile();
-    CompilationUnit unit = result.unit!;
+    CompilationUnit unit = result.unit;
 
     var c = unit.declarations[0] as ClassDeclaration;
     var declaration = c.members[0] as FieldDeclaration;
@@ -1107,7 +1107,7 @@
 var v = (() => 42)();
 ''');
     await resolveTestFile();
-    CompilationUnit unit = result.unit!;
+    CompilationUnit unit = result.unit;
 
     var declaration = unit.declarations[0] as TopLevelVariableDeclaration;
     VariableDeclaration variable = declaration.variables.variables[0];
@@ -1164,7 +1164,7 @@
 ''');
     await resolveTestFile();
 
-    var cNode = result.unit!.declarations[0] as ClassDeclaration;
+    var cNode = result.unit.declarations[0] as ClassDeclaration;
 
     var constructorNode = cNode.members[0] as ConstructorDeclaration;
     ParameterElement pElement = constructorNode.declaredElement!.parameters[0];
@@ -1188,7 +1188,7 @@
 ''');
     await resolveTestFile();
 
-    var cNode = result.unit!.declarations[0] as ClassDeclaration;
+    var cNode = result.unit.declarations[0] as ClassDeclaration;
     ClassElement cElement = cNode.declaredElement!;
     FieldElement fElement = cElement.getField('f')!;
 
@@ -1219,10 +1219,10 @@
 ''');
     await resolveTestFile();
 
-    var aNode = result.unit!.declarations[0] as ClassDeclaration;
+    var aNode = result.unit.declarations[0] as ClassDeclaration;
     ClassElement aElement = aNode.declaredElement!;
 
-    var bNode = result.unit!.declarations[1] as ClassDeclaration;
+    var bNode = result.unit.declarations[1] as ClassDeclaration;
 
     {
       var constructor = bNode.members[0] as ConstructorDeclaration;
@@ -1261,7 +1261,7 @@
 ''');
     await resolveTestFile();
 
-    var cNode = result.unit!.declarations[0] as ClassDeclaration;
+    var cNode = result.unit.declarations[0] as ClassDeclaration;
     ClassElement cElement = cNode.declaredElement!;
 
     {
@@ -1312,10 +1312,10 @@
     await resolveTestFile();
     expect(result.errors, isEmpty);
 
-    var aNode = result.unit!.declarations[0] as ClassDeclaration;
+    var aNode = result.unit.declarations[0] as ClassDeclaration;
     ClassElement aElement = aNode.declaredElement!;
 
-    var bNode = result.unit!.declarations[1] as ClassDeclaration;
+    var bNode = result.unit.declarations[1] as ClassDeclaration;
 
     {
       ConstructorElement aUnnamed = aElement.constructors[0];
@@ -1373,10 +1373,10 @@
     await resolveTestFile();
     expect(result.errors, isEmpty);
 
-    var aNode = result.unit!.declarations[0] as ClassDeclaration;
+    var aNode = result.unit.declarations[0] as ClassDeclaration;
     ClassElement aElement = aNode.declaredElement!;
 
-    var bNode = result.unit!.declarations[1] as ClassDeclaration;
+    var bNode = result.unit.declarations[1] as ClassDeclaration;
     TypeParameterType uType =
         typeParameterTypeNone(bNode.declaredElement!.typeParameters[0]);
     InterfaceType auType = aElement.instantiate(
@@ -1714,7 +1714,7 @@
 ''');
     await resolveTestFile();
 
-    var enumNode = result.unit!.declarations[0] as EnumDeclaration;
+    var enumNode = result.unit.declarations[0] as EnumDeclaration;
     ClassElement enumElement = enumNode.declaredElement!;
 
     List<Statement> mainStatements = _getMainStatements(result);
@@ -1758,7 +1758,7 @@
 ''');
     await resolveTestFile();
 
-    var cNode = result.unit!.declarations[0] as ClassDeclaration;
+    var cNode = result.unit.declarations[0] as ClassDeclaration;
     var tElement = cNode.declaredElement!.typeParameters[0];
 
     var fDeclaration = cNode.members[0] as FieldDeclaration;
@@ -1806,7 +1806,7 @@
 ''');
     await resolveTestFile();
 
-    var clazz = result.unit!.declarations[0] as ClassDeclaration;
+    var clazz = result.unit.declarations[0] as ClassDeclaration;
     var constructor = clazz.members[0] as ConstructorDeclaration;
     List<FormalParameter> parameters = constructor.parameters.parameters;
 
@@ -1841,7 +1841,7 @@
 ''');
     await resolveTestFile();
 
-    var clazz = result.unit!.declarations[0] as ClassDeclaration;
+    var clazz = result.unit.declarations[0] as ClassDeclaration;
 
     var fDeclaration = clazz.members[0] as FieldDeclaration;
     VariableDeclaration fNode = fDeclaration.fields.variables[0];
@@ -1886,7 +1886,7 @@
 ''');
     await resolveTestFile();
 
-    var clazz = result.unit!.declarations[0] as ClassDeclaration;
+    var clazz = result.unit.declarations[0] as ClassDeclaration;
 
     var fDeclaration = clazz.members[0] as FieldDeclaration;
     VariableDeclaration fNode = fDeclaration.fields.variables[0];
@@ -1916,7 +1916,7 @@
 ''');
     await resolveTestFile();
 
-    var clazz = result.unit!.declarations[0] as ClassDeclaration;
+    var clazz = result.unit.declarations[0] as ClassDeclaration;
 
     var fDeclaration = clazz.members[0] as FieldDeclaration;
     VariableDeclaration fNode = fDeclaration.fields.variables[0];
@@ -2078,7 +2078,7 @@
     addTestFile(content);
 
     await resolveTestFile();
-    CompilationUnit unit = result.unit!;
+    CompilationUnit unit = result.unit;
 
     var cNode = unit.declarations[0] as ClassDeclaration;
     ClassElement cElement = cNode.declaredElement!;
@@ -2131,7 +2131,7 @@
 ''');
 
     await resolveTestFile();
-    CompilationUnit unit = result.unit!;
+    CompilationUnit unit = result.unit;
 
     var xNode = unit.declarations[0] as ClassDeclaration;
     ClassElement xElement = xNode.declaredElement!;
@@ -2172,7 +2172,7 @@
     addTestFile(content);
 
     await resolveTestFile();
-    CompilationUnit unit = result.unit!;
+    CompilationUnit unit = result.unit;
 
     var cNode = unit.declarations[0] as ClassDeclaration;
     ClassElement cElement = cNode.declaredElement!;
@@ -2239,7 +2239,7 @@
 }
 ''');
     await resolveTestFile();
-    CompilationUnit unit = result.unit!;
+    CompilationUnit unit = result.unit;
 
     ImportElement aImport = unit.declaredElement!.library.imports[0];
     LibraryElement aLibrary = aImport.importedLibrary!;
@@ -2356,7 +2356,7 @@
 }
 ''');
     await resolveTestFile();
-    CompilationUnit unit = result.unit!;
+    CompilationUnit unit = result.unit;
     CompilationUnitElement unitElement = unit.declaredElement!;
 
     ClassElement cElement = unitElement.getType('C')!;
@@ -4342,7 +4342,7 @@
 }
 ''');
 
-    var main = result.unit!.declarations[0] as FunctionDeclaration;
+    var main = result.unit.declarations[0] as FunctionDeclaration;
     List<Statement> statements = _getMainStatements(result);
 
     // (int p)
@@ -4735,7 +4735,7 @@
 
     InterfaceType intType = typeProvider.intType;
 
-    var main = result.unit!.declarations[0] as FunctionDeclaration;
+    var main = result.unit.declarations[0] as FunctionDeclaration;
     expect(main.declaredElement, isNotNull);
     expect(main.name.staticElement, isNotNull);
     expect(main.name.staticType, isNull);
@@ -4778,7 +4778,7 @@
 }
 ''');
     await resolveTestFile();
-    CompilationUnit unit = result.unit!;
+    CompilationUnit unit = result.unit;
 
     var cDeclaration = unit.declarations[0] as ClassDeclaration;
 
@@ -4849,7 +4849,7 @@
 num v;
 ''');
     await resolveTestFile();
-    CompilationUnit unit = result.unit!;
+    CompilationUnit unit = result.unit;
 
     List<Statement> statements = _getMainStatements(result);
 
@@ -5089,7 +5089,7 @@
     String fTypeString = 'double Function(int, {String b, bool c})';
 
     await resolveTestFile();
-    var classDeclaration = result.unit!.declarations[0] as ClassDeclaration;
+    var classDeclaration = result.unit.declarations[0] as ClassDeclaration;
     var methodDeclaration = classDeclaration.members[0] as MethodDeclaration;
     var methodElement = methodDeclaration.declaredElement as MethodElement;
 
@@ -5134,7 +5134,7 @@
     // Validate the arguments at the call site.
     //
     var functionDeclaration =
-        result.unit!.declarations[1] as FunctionDeclaration;
+        result.unit.declarations[1] as FunctionDeclaration;
     var body = functionDeclaration.functionExpression.body as BlockFunctionBody;
     var statement = body.block.statements[0] as ExpressionStatement;
     var invocation = statement.expression as MethodInvocation;
@@ -5157,7 +5157,7 @@
     await resolveTestFile();
     expect(result.errors, isEmpty);
 
-    var cNode = result.unit!.declarations[0] as ClassDeclaration;
+    var cNode = result.unit.declarations[0] as ClassDeclaration;
     ClassElement cElement = cNode.declaredElement!;
     MethodElement callElement = cElement.methods[0];
 
@@ -5183,7 +5183,7 @@
     await resolveTestFile();
     expect(result.errors, isEmpty);
 
-    var main = result.unit!.declarations[0] as FunctionDeclaration;
+    var main = result.unit.declarations[0] as FunctionDeclaration;
     var mainElement = main.declaredElement as FunctionElement;
     ParameterElement parameter = mainElement.parameters[0];
 
@@ -5220,7 +5220,7 @@
 ''');
     await resolveTestFile();
 
-    var aNode = result.unit!.declarations[0] as ClassDeclaration;
+    var aNode = result.unit.declarations[0] as ClassDeclaration;
     var fooNode = aNode.members[0] as MethodDeclaration;
     var fooElement = fooNode.declaredElement as MethodElement;
 
@@ -5305,7 +5305,7 @@
     await resolveTestFile();
     List<Statement> mainStatements = _getMainStatements(result);
 
-    var foo = result.unit!.declarations[1] as FunctionDeclaration;
+    var foo = result.unit.declarations[1] as FunctionDeclaration;
     ExecutableElement fooElement = foo.declaredElement!;
 
     var statement = mainStatements[0] as ExpressionStatement;
@@ -5452,7 +5452,7 @@
     await resolveTestFile();
     List<Statement> mainStatements = _getMainStatements(result);
 
-    var cNode = result.unit!.declarations[1] as ClassDeclaration;
+    var cNode = result.unit.declarations[1] as ClassDeclaration;
     ClassElement cElement = cNode.declaredElement!;
     var mNode = cNode.members[0] as MethodDeclaration;
     var mElement = mNode.declaredElement as MethodElement;
@@ -5509,7 +5509,7 @@
 ''');
     await resolveTestFile();
 
-    var cNode = result.unit!.declarations[0] as ClassDeclaration;
+    var cNode = result.unit.declarations[0] as ClassDeclaration;
     TypeParameterElement tElement = cNode.declaredElement!.typeParameters[0];
 
     var barNode = cNode.members[1] as MethodDeclaration;
@@ -5535,7 +5535,7 @@
 
     InterfaceType doubleType = typeProvider.doubleType;
 
-    var fNode = result.unit!.declarations[1] as FunctionDeclaration;
+    var fNode = result.unit.declarations[1] as FunctionDeclaration;
     var fElement = fNode.declaredElement as FunctionElement;
 
     var statement = mainStatements[0] as ExpressionStatement;
@@ -5564,7 +5564,7 @@
 
     List<Statement> mainStatements = _getMainStatements(result);
 
-    var fNode = result.unit!.declarations[1] as FunctionDeclaration;
+    var fNode = result.unit.declarations[1] as FunctionDeclaration;
     var fElement = fNode.declaredElement as FunctionElement;
 
     // f<bool, String>(true, 'str');
@@ -6030,7 +6030,7 @@
     addTestFile(content);
 
     await resolveTestFile();
-    CompilationUnit unit = result.unit!;
+    CompilationUnit unit = result.unit;
 
     var cClassDeclaration = unit.declarations[1] as ClassDeclaration;
     ClassElement cClassElement = cClassDeclaration.declaredElement!;
@@ -6129,7 +6129,7 @@
 
     List<Statement> statements = _getMainStatements(result);
 
-    var cDeclaration = result.unit!.declarations[1] as ClassDeclaration;
+    var cDeclaration = result.unit.declarations[1] as ClassDeclaration;
     ClassElement cElement = cDeclaration.declaredElement!;
     FieldElement fElement = cElement.fields[0];
 
@@ -6164,7 +6164,7 @@
 
     List<Statement> statements = _getMainStatements(result);
 
-    var cDeclaration = result.unit!.declarations[1] as ClassDeclaration;
+    var cDeclaration = result.unit.declarations[1] as ClassDeclaration;
     ClassElement cElement = cDeclaration.declaredElement!;
     FieldElement fElement = cElement.fields[0];
 
@@ -6189,7 +6189,7 @@
     await resolveTestFile();
     expect(result.errors, isEmpty);
 
-    var main = result.unit!.declarations[0] as FunctionDeclaration;
+    var main = result.unit.declarations[0] as FunctionDeclaration;
     var mainElement = main.declaredElement as FunctionElement;
     ParameterElement parameter = mainElement.parameters[0];
 
@@ -6232,7 +6232,7 @@
     // TODO(scheglov) Uncomment and fix "unused imports" hint.
 //    expect(result.errors, isEmpty);
 
-    var unitElement = result.unit!.declaredElement!;
+    var unitElement = result.unit.declaredElement!;
     ImportElement myImport = unitElement.library.imports[0];
     PrefixElement myPrefix = myImport.prefix!;
 
@@ -6405,7 +6405,7 @@
     addTestFile(content);
 
     await resolveTestFile();
-    CompilationUnit unit = result.unit!;
+    CompilationUnit unit = result.unit;
 
     var cClassDeclaration = unit.declarations[1] as ClassDeclaration;
     ClassElement cClassElement = cClassDeclaration.declaredElement!;
@@ -6467,7 +6467,7 @@
     addTestFile(content);
 
     await resolveTestFile();
-    CompilationUnit unit = result.unit!;
+    CompilationUnit unit = result.unit;
 
     var cClassDeclaration = unit.declarations[1] as ClassDeclaration;
     ClassElement cClassElement = cClassDeclaration.declaredElement!;
@@ -6504,7 +6504,7 @@
     addTestFile(content);
 
     await resolveTestFile();
-    CompilationUnit unit = result.unit!;
+    CompilationUnit unit = result.unit;
 
     var cClassDeclaration = unit.declarations[1] as ClassDeclaration;
     ClassElement cClassElement = cClassDeclaration.declaredElement!;
@@ -6571,7 +6571,7 @@
 }
 ''');
 
-    var main = result.unit!.declarations[0] as FunctionDeclaration;
+    var main = result.unit.declarations[0] as FunctionDeclaration;
     expect(main.declaredElement, isNotNull);
     expect(main.name.staticElement, isNotNull);
     expect(main.name.staticType, isNull);
@@ -6655,8 +6655,8 @@
     addTestFile(content);
     await resolveTestFile();
 
-    var aNode = result.unit!.declarations[0] as ClassDeclaration;
-    var bNode = result.unit!.declarations[1] as ClassDeclaration;
+    var aNode = result.unit.declarations[0] as ClassDeclaration;
+    var bNode = result.unit.declarations[1] as ClassDeclaration;
 
     var methodElement = aNode.members[0].declaredElement as MethodElement;
     var getterElement =
@@ -6784,7 +6784,7 @@
     addTestFile(content);
     await resolveTestFile();
 
-    var aNode = result.unit!.declarations[0] as ClassDeclaration;
+    var aNode = result.unit.declarations[0] as ClassDeclaration;
 
     var methodElement = aNode.members[0].declaredElement as MethodElement;
     var getterElement =
@@ -6900,7 +6900,7 @@
     addTestFile(content);
     await resolveTestFile();
 
-    var cNode = result.unit!.declarations[0] as ClassDeclaration;
+    var cNode = result.unit.declarations[0] as ClassDeclaration;
     ClassElement cElement = cNode.declaredElement!;
 
     var constructorNode = cNode.members[1] as ConstructorDeclaration;
@@ -6945,16 +6945,16 @@
     addTestFile(content);
     await resolveTestFile();
 
-    var aNode = result.unit!.declarations[0] as ClassDeclaration;
+    var aNode = result.unit.declarations[0] as ClassDeclaration;
     ClassElement aElement = aNode.declaredElement!;
 
-    var bNode = result.unit!.declarations[1] as ClassDeclaration;
+    var bNode = result.unit.declarations[1] as ClassDeclaration;
     ClassElement bElement = bNode.declaredElement!;
 
-    var cNode = result.unit!.declarations[2] as ClassDeclaration;
+    var cNode = result.unit.declarations[2] as ClassDeclaration;
     ClassElement cElement = cNode.declaredElement!;
 
-    var dNode = result.unit!.declarations[3] as ClassDeclaration;
+    var dNode = result.unit.declarations[3] as ClassDeclaration;
     Element dElement = dNode.declaredElement!;
 
     SimpleIdentifier dName = dNode.name;
@@ -7014,16 +7014,16 @@
     addTestFile(content);
     await resolveTestFile();
 
-    var aNode = result.unit!.declarations[0] as ClassDeclaration;
+    var aNode = result.unit.declarations[0] as ClassDeclaration;
     ClassElement aElement = aNode.declaredElement!;
 
-    var bNode = result.unit!.declarations[1] as ClassDeclaration;
+    var bNode = result.unit.declarations[1] as ClassDeclaration;
     ClassElement bElement = bNode.declaredElement!;
 
-    var cNode = result.unit!.declarations[2] as ClassDeclaration;
+    var cNode = result.unit.declarations[2] as ClassDeclaration;
     ClassElement cElement = cNode.declaredElement!;
 
-    var dNode = result.unit!.declarations[3] as ClassTypeAlias;
+    var dNode = result.unit.declarations[3] as ClassTypeAlias;
     Element dElement = dNode.declaredElement!;
 
     SimpleIdentifier dName = dNode.name;
@@ -7082,7 +7082,7 @@
     addTestFile(content);
     await resolveTestFile();
 
-    var enumNode = result.unit!.declarations[0] as EnumDeclaration;
+    var enumNode = result.unit.declarations[0] as EnumDeclaration;
     ClassElement enumElement = enumNode.declaredElement!;
 
     SimpleIdentifier dName = enumNode.name;
@@ -7123,7 +7123,7 @@
     ClassElement doubleElement = doubleType.element;
     ClassElement intElement = intType.element;
 
-    var cNode = result.unit!.declarations[0] as ClassDeclaration;
+    var cNode = result.unit.declarations[0] as ClassDeclaration;
     ClassElement cElement = cNode.declaredElement!;
 
     // The class name identifier.
@@ -7248,7 +7248,7 @@
 
     // topFunction()
     {
-      var node = result.unit!.declarations[0] as FunctionDeclaration;
+      var node = result.unit.declarations[0] as FunctionDeclaration;
       expect(node.declaredElement, isNotNull);
       assertType(node.declaredElement!.type, 'int Function(double)');
 
@@ -7281,7 +7281,7 @@
 
     // topGetter()
     {
-      var node = result.unit!.declarations[1] as FunctionDeclaration;
+      var node = result.unit.declarations[1] as FunctionDeclaration;
       expect(node.declaredElement, isNotNull);
       assertType(node.declaredElement!.type, 'int Function()');
 
@@ -7299,7 +7299,7 @@
 
     // topSetter()
     {
-      var node = result.unit!.declarations[2] as FunctionDeclaration;
+      var node = result.unit.declarations[2] as FunctionDeclaration;
       expect(node.declaredElement, isNotNull);
       assertType(node.declaredElement!.type, 'void Function(double)');
 
@@ -7341,7 +7341,7 @@
     addTestFile(content);
 
     await resolveTestFile();
-    CompilationUnit unit = result.unit!;
+    CompilationUnit unit = result.unit;
     CompilationUnitElement unitElement = unit.declaredElement!;
 
     var cNode = unit.declarations[0] as ClassDeclaration;
@@ -7388,7 +7388,7 @@
     addTestFile(content);
 
     await resolveTestFile();
-    CompilationUnit unit = result.unit!;
+    CompilationUnit unit = result.unit;
 
     var cNode = unit.declarations[0] as ClassDeclaration;
     ClassElement cElement = cNode.declaredElement!;
@@ -7432,7 +7432,7 @@
     addTestFile(content);
 
     await resolveTestFile();
-    CompilationUnit unit = result.unit!;
+    CompilationUnit unit = result.unit;
     CompilationUnitElement unitElement = unit.declaredElement!;
 
     {
@@ -7474,7 +7474,7 @@
     addTestFile(content);
 
     await resolveTestFile();
-    CompilationUnit unit = result.unit!;
+    CompilationUnit unit = result.unit;
     CompilationUnitElement unitElement = unit.declaredElement!;
 
     var variableDeclaration =
@@ -7518,7 +7518,7 @@
     String fTypeString = 'double Function(int, {String b, bool c})';
 
     await resolveTestFile();
-    var fDeclaration = result.unit!.declarations[0] as FunctionDeclaration;
+    var fDeclaration = result.unit.declarations[0] as FunctionDeclaration;
     var fElement = fDeclaration.declaredElement as FunctionElement;
 
     InterfaceType doubleType = typeProvider.doubleType;
@@ -7571,7 +7571,7 @@
     //
     // Validate the arguments at the call site.
     //
-    var mainDeclaration = result.unit!.declarations[1] as FunctionDeclaration;
+    var mainDeclaration = result.unit.declarations[1] as FunctionDeclaration;
     var body = mainDeclaration.functionExpression.body as BlockFunctionBody;
     var statement = body.block.statements[0] as ExpressionStatement;
     var invocation = statement.expression as MethodInvocation;
@@ -7589,7 +7589,7 @@
     addTestFile(content);
 
     await resolveTestFile();
-    CompilationUnit unit = result.unit!;
+    CompilationUnit unit = result.unit;
 
     var alias = unit.declarations[0] as FunctionTypeAlias;
     TypeAliasElement aliasElement = alias.declaredElement!;
@@ -7623,7 +7623,7 @@
 ''';
     addTestFile(content);
     await resolveTestFile();
-    CompilationUnit unit = result.unit!;
+    CompilationUnit unit = result.unit;
     CompilationUnitElement unitElement = unit.declaredElement!;
 
     var aNode = unit.declarations[0] as ClassDeclaration;
@@ -7870,7 +7870,7 @@
 c.A a2;
 ''');
     await resolveTestFile();
-    CompilationUnit unit = result.unit!;
+    CompilationUnit unit = result.unit;
 
     ImportElement bImport = unit.declaredElement!.library.imports[0];
     ImportElement cImport = unit.declaredElement!.library.imports[1];
@@ -7915,7 +7915,7 @@
 typedef void F(int p);
 ''');
     await resolveTestFile();
-    CompilationUnit unit = result.unit!;
+    CompilationUnit unit = result.unit;
 
     var fNode = unit.declarations[1] as FunctionTypeAlias;
     TypeAliasElement fElement = fNode.declaredElement!;
@@ -8033,7 +8033,7 @@
     await resolveTestFile();
     expect(result.errors, isNotEmpty);
 
-    var unitElement = result.unit!.declaredElement!;
+    var unitElement = result.unit.declaredElement!;
     var foo = unitElement.library.imports[0].prefix;
 
     List<Statement> statements = _getMainStatements(result);
@@ -8117,7 +8117,7 @@
     await resolveTestFile();
     expect(result.errors, isNotEmpty);
 
-    var unitElement = result.unit!.declaredElement!;
+    var unitElement = result.unit.declaredElement!;
     var mathImport = unitElement.library.imports[0];
     var foo = mathImport.prefix;
 
@@ -8163,7 +8163,7 @@
     await resolveTestFile();
     expect(result.errors, isNotEmpty);
 
-    var unitElement = result.unit!.declaredElement!;
+    var unitElement = result.unit.declaredElement!;
     var mathImport = unitElement.library.imports[0];
     var foo = mathImport.prefix;
     var randomElement = mathImport.importedLibrary!.getType('Random')!;
@@ -8716,7 +8716,7 @@
   }
 
   List<Statement> _getMainStatements(ResolvedUnitResult result) {
-    for (var declaration in result.unit!.declarations) {
+    for (var declaration in result.unit.declarations) {
       if (declaration is FunctionDeclaration &&
           declaration.name.name == 'main') {
         var body = declaration.functionExpression.body as BlockFunctionBody;
@@ -8728,7 +8728,7 @@
 
   TopLevelVariableElement _getTopLevelVariable(
       ResolvedUnitResult result, String name) {
-    for (var variable in result.unit!.declaredElement!.topLevelVariables) {
+    for (var variable in result.unit.declaredElement!.topLevelVariables) {
       if (variable.name == name) {
         return variable;
       }
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index 0ee0dc7..29a974a 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -448,9 +448,9 @@
     ResolvedUnitResult partResult1 = await driver.getResultValid(part1);
     ResolvedUnitResult partResult2 = await driver.getResultValid(part2);
 
-    CompilationUnit libUnit = libResult.unit!;
-    CompilationUnit partUnit1 = partResult1.unit!;
-    CompilationUnit partUnit2 = partResult2.unit!;
+    CompilationUnit libUnit = libResult.unit;
+    CompilationUnit partUnit1 = partResult1.unit;
+    CompilationUnit partUnit2 = partResult2.unit;
 
     CompilationUnitElement unitElement = libUnit.declaredElement!;
     CompilationUnitElement partElement1 = partUnit1.declaredElement!;
@@ -676,7 +676,7 @@
       ResolvedUnitResult ar = allResults
           .whereType<ResolvedUnitResult>()
           .firstWhere((r) => r.path == a);
-      _assertTopLevelVarType(ar.unit!, 'A', 'int');
+      _assertTopLevelVarType(ar.unit, 'A', 'int');
     }
     allResults.clear();
 
@@ -695,7 +695,7 @@
       ResolvedUnitResult ar = allResults
           .whereType<ResolvedUnitResult>()
           .firstWhere((r) => r.path == a);
-      _assertTopLevelVarType(ar.unit!, 'A', 'double');
+      _assertTopLevelVarType(ar.unit, 'A', 'double');
     }
   }
 
@@ -751,14 +751,14 @@
       ResolvedUnitResult ar = allResults
           .whereType<ResolvedUnitResult>()
           .firstWhere((r) => r.path == a);
-      _assertTopLevelVarType(ar.unit!, 'A1', 'int');
-      _assertTopLevelVarType(ar.unit!, 'A2', 'int');
+      _assertTopLevelVarType(ar.unit, 'A1', 'int');
+      _assertTopLevelVarType(ar.unit, 'A2', 'int');
     }
     {
       ResolvedUnitResult br = allResults
           .whereType<ResolvedUnitResult>()
           .firstWhere((r) => r.path == b);
-      _assertTopLevelVarType(br.unit!, 'B1', 'int');
+      _assertTopLevelVarType(br.unit, 'B1', 'int');
     }
 
     // Clear the results and update "a".
@@ -778,14 +778,14 @@
       ResolvedUnitResult ar = allResults
           .whereType<ResolvedUnitResult>()
           .firstWhere((r) => r.path == a);
-      _assertTopLevelVarType(ar.unit!, 'A1', 'double');
-      _assertTopLevelVarType(ar.unit!, 'A2', 'double');
+      _assertTopLevelVarType(ar.unit, 'A1', 'double');
+      _assertTopLevelVarType(ar.unit, 'A2', 'double');
     }
     {
       ResolvedUnitResult br = allResults
           .whereType<ResolvedUnitResult>()
           .firstWhere((r) => r.path == b);
-      _assertTopLevelVarType(br.unit!, 'B1', 'double');
+      _assertTopLevelVarType(br.unit, 'B1', 'double');
     }
   }
 
@@ -798,7 +798,7 @@
       expect(allResults, hasLength(1));
       var result = allResults[0] as ResolvedUnitResult;
       expect(result.path, testFile);
-      _assertTopLevelVarType(result.unit!, 'V', 'int');
+      _assertTopLevelVarType(result.unit, 'V', 'int');
     }
 
     // Update the file, but don't notify the driver.
@@ -821,7 +821,7 @@
       expect(allResults, hasLength(1));
       var result = allResults[0] as ResolvedUnitResult;
       expect(result.path, testFile);
-      _assertTopLevelVarType(result.unit!, 'V', 'double');
+      _assertTopLevelVarType(result.unit, 'V', 'double');
     }
   }
 
@@ -836,7 +836,7 @@
 class C {}
 ''');
     var result = await driver.getResultValid(testFile);
-    var atD = AstFinder.getClass(result.unit!, 'C').metadata[0];
+    var atD = AstFinder.getClass(result.unit, 'C').metadata[0];
     var atDI = atD.elementAnnotation as ElementAnnotationImpl;
     var value = atDI.evaluationResult!.value;
     // That is illegal.
@@ -853,7 +853,7 @@
 }
 ''');
     var result = await driver.getResultValid(testFile);
-    var atD = AstFinder.getClass(result.unit!, 'C').metadata[0];
+    var atD = AstFinder.getClass(result.unit, 'C').metadata[0];
     var atDI = atD.elementAnnotation as ElementAnnotationImpl;
     var value = atDI.evaluationResult!.value!;
     expect(value.type, isNotNull);
@@ -869,7 +869,7 @@
 @x class C {}
 ''');
     var result = await driver.getResultValid(testFile);
-    Annotation at_x = AstFinder.getClass(result.unit!, 'C').metadata[0];
+    Annotation at_x = AstFinder.getClass(result.unit, 'C').metadata[0];
     expect(at_x.elementAnnotation!.computeConstantValue()!.toIntValue(), 1);
   }
 
@@ -879,7 +879,7 @@
 const y = x + 1;
 ''');
     var result = await driver.getResultValid(testFile);
-    var x = AstFinder.getTopLevelVariableElement(result.unit!, 'x')
+    var x = AstFinder.getTopLevelVariableElement(result.unit, 'x')
         as TopLevelVariableElementImpl;
     _expectCircularityError(x.evaluationResult!);
   }
@@ -890,8 +890,8 @@
 const y = 1;
 ''');
     var result = await driver.getResultValid(testFile);
-    var x = AstFinder.getTopLevelVariableElement(result.unit!, 'x');
-    var y = AstFinder.getTopLevelVariableElement(result.unit!, 'y');
+    var x = AstFinder.getTopLevelVariableElement(result.unit, 'x');
+    var y = AstFinder.getTopLevelVariableElement(result.unit, 'y');
     expect(x.computeConstantValue()!.toIntValue(), 2);
     expect(y.computeConstantValue()!.toIntValue(), 1);
   }
@@ -907,7 +907,7 @@
 class B {}
 ''');
     var result = await driver.getResultValid(testFile);
-    var x = AstFinder.getTopLevelVariableElement(result.unit!, 'x');
+    var x = AstFinder.getTopLevelVariableElement(result.unit, 'x');
     expect(x.computeConstantValue(), isNotNull);
   }
 
@@ -973,7 +973,7 @@
 const x = const Derived();
 ''');
     var result = await driver.getResultValid(testFile);
-    var x = AstFinder.getTopLevelVariableElement(result.unit!, 'x');
+    var x = AstFinder.getTopLevelVariableElement(result.unit, 'x');
     expect(x.computeConstantValue(), isNotNull);
   }
 
@@ -982,7 +982,7 @@
 const x = 1;
 ''');
     var result = await driver.getResultValid(testFile);
-    var x = AstFinder.getTopLevelVariableElement(result.unit!, 'x');
+    var x = AstFinder.getTopLevelVariableElement(result.unit, 'x');
     expect(x.computeConstantValue()!.toIntValue(), 1);
   }
 
@@ -1528,7 +1528,7 @@
     expect(result.unit, isNotNull);
     expect(result.errors, hasLength(0));
 
-    var f = result.unit!.declarations[0] as FunctionDeclaration;
+    var f = result.unit.declarations[0] as FunctionDeclaration;
     assertType(f.declaredElement!.type, 'int Function()');
     assertType(f.returnType!.typeOrThrow, 'int');
 
@@ -1673,7 +1673,7 @@
     await waitForIdleWithoutExceptions();
 
     ResolvedUnitResult result = await driver.getResultValid(testFile);
-    _assertClassFieldType(result.unit!, 'C', 'f', 'int');
+    _assertClassFieldType(result.unit, 'C', 'f', 'int');
   }
 
   test_getResult_inferTypes_instanceMethod() async {
@@ -1688,8 +1688,8 @@
     await waitForIdleWithoutExceptions();
 
     ResolvedUnitResult result = await driver.getResultValid(testFile);
-    _assertClassMethodReturnType(result.unit!, 'A', 'm', 'int');
-    _assertClassMethodReturnType(result.unit!, 'B', 'm', 'int');
+    _assertClassMethodReturnType(result.unit, 'A', 'm', 'int');
+    _assertClassMethodReturnType(result.unit, 'B', 'm', 'int');
   }
 
   test_getResult_invalid_annotation_functionAsConstructor() async {
@@ -1701,7 +1701,7 @@
 ''', priority: true);
 
     ResolvedUnitResult result = await driver.getResultValid(testFile);
-    ClassDeclaration c = result.unit!.declarations[1] as ClassDeclaration;
+    ClassDeclaration c = result.unit.declarations[1] as ClassDeclaration;
     Annotation a = c.metadata[0];
     expect(a.name.name, 'fff');
     expect(a.name.staticElement, isFunctionElement);
@@ -1788,7 +1788,7 @@
 ''');
 
     var result = await driver.getResultValid(path);
-    var languageVersion = result.unit!.languageVersionToken!;
+    var languageVersion = result.unit.languageVersionToken!;
     expect(languageVersion.major, 2);
     expect(languageVersion.minor, 7);
   }
@@ -1871,7 +1871,7 @@
 
     ResolvedUnitResult result = await driver.getResultValid(path);
     expect(result, isNotNull);
-    expect(result.unit!.declaredElement!.classes.map((e) => e.name), ['A']);
+    expect(result.unit.declaredElement!.classes.map((e) => e.name), ['A']);
   }
 
   test_getResult_recursiveFlatten() async {
@@ -1904,18 +1904,18 @@
 
     {
       ResolvedUnitResult result = await driver.getResultValid(b);
-      expect(_getImportSource(result.unit!, 0).uri.toString(),
+      expect(_getImportSource(result.unit, 0).uri.toString(),
           'package:test/a.dart');
-      _assertTopLevelVarType(result.unit!, 'VB', 'A<int>');
+      _assertTopLevelVarType(result.unit, 'VB', 'A<int>');
     }
 
     {
       ResolvedUnitResult result = await driver.getResultValid(c);
       expect(
-        _getImportSource(result.unit!, 0).uri,
+        _getImportSource(result.unit, 0).uri,
         toUri('/test/lib/a.dart'),
       );
-      _assertTopLevelVarType(result.unit!, 'VC', 'A<double>');
+      _assertTopLevelVarType(result.unit, 'VC', 'A<double>');
     }
   }
 
@@ -1938,8 +1938,8 @@
 
     {
       ResolvedUnitResult result = await driver.getResultValid(a);
-      _assertTopLevelVarType(result.unit!, 'A1', 'int');
-      _assertTopLevelVarType(result.unit!, 'A2', 'int');
+      _assertTopLevelVarType(result.unit, 'A1', 'int');
+      _assertTopLevelVarType(result.unit, 'A2', 'int');
     }
 
     // Update "a" so that "A1" is now "double".
@@ -1958,8 +1958,8 @@
 
     {
       ResolvedUnitResult result = await driver.getResultValid(a);
-      _assertTopLevelVarType(result.unit!, 'A1', 'double');
-      _assertTopLevelVarType(result.unit!, 'A2', 'double');
+      _assertTopLevelVarType(result.unit, 'A1', 'double');
+      _assertTopLevelVarType(result.unit, 'A2', 'double');
     }
   }
 
@@ -2094,7 +2094,7 @@
 ''');
 
     var result = await driver.getResultValid(b);
-    var c = _getTopLevelVar(result.unit!, 'c');
+    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'.
     expect(typeC.element.getField('foo'), isNotNull);
@@ -2533,15 +2533,15 @@
     {
       ResolvedUnitResult result = await driver.getResultValid(a);
       expect(result.errors, isEmpty);
-      _assertTopLevelVarType(result.unit!, 'c', 'C');
+      _assertTopLevelVarType(result.unit, 'c', 'C');
     }
 
     // Now c.dart can be resolved without errors in the context of a.dart
     {
       ResolvedUnitResult result = await driver.getResultValid(c);
       expect(result.errors, isEmpty);
-      _assertTopLevelVarType(result.unit!, 'a', 'A');
-      _assertTopLevelVarType(result.unit!, 'b', 'B');
+      _assertTopLevelVarType(result.unit, 'a', 'A');
+      _assertTopLevelVarType(result.unit, 'b', 'B');
     }
   }
 
@@ -2572,8 +2572,8 @@
     // So, A and B references are resolved.
     ResolvedUnitResult result = await driver.getResultValid(c);
     expect(result.errors, isEmpty);
-    _assertTopLevelVarType(result.unit!, 'a', 'A');
-    _assertTopLevelVarType(result.unit!, 'b', 'B');
+    _assertTopLevelVarType(result.unit, 'a', 'A');
+    _assertTopLevelVarType(result.unit, 'b', 'B');
   }
 
   test_part_getResult_changePart_invalidatesLibraryCycle() async {
@@ -2883,13 +2883,13 @@
       ResolvedUnitResult ar = allResults
           .whereType<ResolvedUnitResult>()
           .firstWhere((r) => r.path == a);
-      _assertTopLevelVarType(ar.unit!, 'A', 'int');
+      _assertTopLevelVarType(ar.unit, 'A', 'int');
     }
     {
       ResolvedUnitResult br = allResults
           .whereType<ResolvedUnitResult>()
           .firstWhere((r) => r.path == b);
-      _assertTopLevelVarType(br.unit!, 'B', 'int');
+      _assertTopLevelVarType(br.unit, 'B', 'int');
     }
     allResults.clear();
 
@@ -2907,7 +2907,7 @@
       ResolvedUnitResult ar = allResults
           .whereType<ResolvedUnitResult>()
           .firstWhere((r) => r.path == a);
-      _assertTopLevelVarType(ar.unit!, 'A', 'double');
+      _assertTopLevelVarType(ar.unit, 'A', 'double');
     }
   }
 
@@ -3119,7 +3119,7 @@
     expect(result.unit, isNotNull);
     expect(result.errors, hasLength(0));
 
-    var f = result.unit!.declarations[0] as FunctionDeclaration;
+    var f = result.unit.declarations[0] as FunctionDeclaration;
     assertType(f.declaredElement!.type, 'int Function()');
     assertType(f.returnType!.typeOrThrow, 'int');
   }
diff --git a/pkg/analyzer/test/src/dart/analysis/index_test.dart b/pkg/analyzer/test/src/dart/analysis/index_test.dart
index 63c5831..c61fa44 100644
--- a/pkg/analyzer/test/src/dart/analysis/index_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/index_test.dart
@@ -1734,7 +1734,7 @@
   Future<void> _indexTestUnit(String code) async {
     await resolveTestCode(code);
 
-    var indexBuilder = indexUnit(result.unit!);
+    var indexBuilder = indexUnit(result.unit);
     var indexBytes = indexBuilder.toBuffer();
     index = AnalysisDriverUnitIndex.fromBuffer(indexBytes);
   }
diff --git a/pkg/analyzer/test/src/dart/analysis/results/get_element_declaration_test.dart b/pkg/analyzer/test/src/dart/analysis/results/get_element_declaration_test.dart
index a36d472..983d7bb 100644
--- a/pkg/analyzer/test/src/dart/analysis/results/get_element_declaration_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/results/get_element_declaration_test.dart
@@ -42,7 +42,7 @@
       expect(node.name.name, 'A');
       expect(
         node.name.offset,
-        this.result.content!.indexOf('A {} // 1'),
+        this.result.content.indexOf('A {} // 1'),
       );
     }
 
@@ -53,7 +53,7 @@
       expect(node.name.name, 'A');
       expect(
         node.name.offset,
-        this.result.content!.indexOf('A {} // 2'),
+        this.result.content.indexOf('A {} // 2'),
       );
     }
   }
@@ -66,7 +66,7 @@
     await resolveTestCode(r'''
 part 'a.dart';
 ''');
-    var library = this.result.unit!.declaredElement!.library;
+    var library = this.result.unit.declaredElement!.library;
     var element = library.getType('A')!;
     var result = await getElementDeclaration(element);
     var node = result!.node as ClassDeclaration;
@@ -139,7 +139,7 @@
       expect(node.name!.name, 'named');
       expect(
         node.name!.offset,
-        this.result.content!.indexOf('named(); // 1'),
+        this.result.content.indexOf('named(); // 1'),
       );
     }
 
@@ -150,7 +150,7 @@
       expect(node.name!.name, 'named');
       expect(
         node.name!.offset,
-        this.result.content!.indexOf('named(); // 2'),
+        this.result.content.indexOf('named(); // 2'),
       );
     }
   }
@@ -169,7 +169,7 @@
       expect(node.name, isNull);
       expect(
         node.returnType.offset,
-        this.result.content!.indexOf('A(); // 1'),
+        this.result.content.indexOf('A(); // 1'),
       );
     }
 
@@ -180,7 +180,7 @@
       expect(node.name, isNull);
       expect(
         node.returnType.offset,
-        this.result.content!.indexOf('A(); // 2'),
+        this.result.content.indexOf('A(); // 2'),
       );
     }
   }
diff --git a/pkg/analyzer/test/src/dart/analysis/search_test.dart b/pkg/analyzer/test/src/dart/analysis/search_test.dart
index 5b33cdf..dab758b 100644
--- a/pkg/analyzer/test/src/dart/analysis/search_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/search_test.dart
@@ -64,7 +64,7 @@
 class SearchTest extends PubPackageResolutionTest {
   AnalysisDriver get driver => driverFor(testFilePath);
 
-  CompilationUnitElement get resultUnitElement => result.unit!.declaredElement!;
+  CompilationUnitElement get resultUnitElement => result.unit.declaredElement!;
 
   String get testUriStr => 'package:test/test.dart';
 
@@ -378,7 +378,7 @@
     var element = findElement.unnamedConstructor('A');
 
     var otherUnitResult = await driver.getResult2(other) as ResolvedUnitResult;
-    CompilationUnit otherUnit = otherUnitResult.unit!;
+    CompilationUnit otherUnit = otherUnitResult.unit;
     Element main = otherUnit.declaredElement!.functions[0];
     var expected = [
       ExpectedResult(main, SearchResultKind.REFERENCE,
diff --git a/pkg/analyzer/test/src/dart/analysis/session_helper_test.dart b/pkg/analyzer/test/src/dart/analysis/session_helper_test.dart
index 6e96379..6beca53 100644
--- a/pkg/analyzer/test/src/dart/analysis/session_helper_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/session_helper_test.dart
@@ -91,7 +91,7 @@
 ''');
     var element = findNode.classDeclaration('A').declaredElement!;
     var resolvedUnit = (await helper.getResolvedUnitByElement(element))!;
-    expect(resolvedUnit.unit!.declarations, hasLength(2));
+    expect(resolvedUnit.unit.declarations, hasLength(2));
   }
 
   test_getTopLevelPropertyAccessor_defined_getter() async {
diff --git a/pkg/analyzer/test/src/dart/analysis/session_test.dart b/pkg/analyzer/test/src/dart/analysis/session_test.dart
index 5d863b5..6a9d493 100644
--- a/pkg/analyzer/test/src/dart/analysis/session_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/session_test.dart
@@ -476,8 +476,8 @@
     expect(aUnitResult.uri, Uri.parse('package:test/a.dart'));
     expect(aUnitResult.content, aContent);
     expect(aUnitResult.unit, isNotNull);
-    expect(aUnitResult.unit!.directives, hasLength(1));
-    expect(aUnitResult.unit!.declarations, hasLength(1));
+    expect(aUnitResult.unit.directives, hasLength(1));
+    expect(aUnitResult.unit.declarations, hasLength(1));
     expect(aUnitResult.errors, isEmpty);
 
     var bUnitResult = resolvedLibrary.units[1];
@@ -485,8 +485,8 @@
     expect(bUnitResult.uri, Uri.parse('package:test/b.dart'));
     expect(bUnitResult.content, bContent);
     expect(bUnitResult.unit, isNotNull);
-    expect(bUnitResult.unit!.directives, hasLength(1));
-    expect(bUnitResult.unit!.declarations, hasLength(2));
+    expect(bUnitResult.unit.directives, hasLength(1));
+    expect(bUnitResult.unit.declarations, hasLength(2));
     expect(bUnitResult.errors, isNotEmpty);
 
     var aDeclaration = resolvedLibrary.getElementDeclaration(aClass)!;
@@ -588,7 +588,7 @@
     expect(result.path, testPath);
     expect(result.uri, Uri.parse('package:test/test.dart'));
     expect(result.units, hasLength(1));
-    expect(result.units[0].unit!.declaredElement, isNotNull);
+    expect(result.units[0].unit.declaredElement, isNotNull);
   }
 
   test_getResolvedLibraryByElement2_differentSession() async {
@@ -617,7 +617,7 @@
     expect(unitResult.session, session);
     expect(unitResult.path, testPath);
     expect(unitResult.uri, Uri.parse('package:test/test.dart'));
-    expect(unitResult.unit!.declarations, hasLength(2));
+    expect(unitResult.unit.declarations, hasLength(2));
     expect(unitResult.typeProvider, isNotNull);
     expect(unitResult.libraryElement, isNotNull);
   }
diff --git a/pkg/analyzer/test/src/dart/ast/element_locator_test.dart b/pkg/analyzer/test/src/dart/ast/element_locator_test.dart
index b6f51e2..c594940 100644
--- a/pkg/analyzer/test/src/dart/ast/element_locator_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/element_locator_test.dart
@@ -46,7 +46,7 @@
   test_locate_CompilationUnit() async {
     await resolveTestCode('// only comment');
 
-    var unitElement = result.unit!.declaredElement!;
+    var unitElement = result.unit.declaredElement!;
 
     var element = ElementLocator.locate(result.unit);
     expect(element, same(unitElement));
diff --git a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
index 40ba0f8..1db519f 100644
--- a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
+++ b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
@@ -1218,9 +1218,6 @@
     var expression = findNode.topVariableDeclarationByName(name).initializer!;
 
     var unit = this.result.unit;
-    if (unit == null) {
-      throw StateError('analysis result unit is null');
-    }
     var source = unit.declaredElement!.source;
     var errorListener = GatheringErrorListener();
     var errorReporter = ErrorReporter(
diff --git a/pkg/analyzer/test/src/dart/micro/file_resolution.dart b/pkg/analyzer/test/src/dart/micro/file_resolution.dart
index ca6326b..3c85527 100644
--- a/pkg/analyzer/test/src/dart/micro/file_resolution.dart
+++ b/pkg/analyzer/test/src/dart/micro/file_resolution.dart
@@ -74,8 +74,8 @@
   Future<void> resolveTestFile() async {
     var path = convertPath(_testFile);
     result = await resolveFile(path);
-    findNode = FindNode(result.content!, result.unit!);
-    findElement = FindElement(result.unit!);
+    findNode = FindNode(result.content, result.unit);
+    findElement = FindElement(result.unit);
   }
 
   void setUp() {
diff --git a/pkg/analyzer/test/src/dart/resolution/ast_rewrite_test.dart b/pkg/analyzer/test/src/dart/resolution/ast_rewrite_test.dart
index 2fb3462..b2bceea 100644
--- a/pkg/analyzer/test/src/dart/resolution/ast_rewrite_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/ast_rewrite_test.dart
@@ -351,7 +351,7 @@
     List<String> expectedArguments,
   ) {
     var argumentStrings = argumentList.arguments
-        .map((e) => result.content!.substring(e.offset, e.end))
+        .map((e) => result.content.substring(e.offset, e.end))
         .toList();
     expect(argumentStrings, expectedArguments);
   }
@@ -383,7 +383,7 @@
     }
 
     var argumentStrings = argumentList.arguments
-        .map((e) => result.content!.substring(e.offset, e.end))
+        .map((e) => result.content.substring(e.offset, e.end))
         .toList();
     expect(argumentStrings, expectedArguments);
   }
diff --git a/pkg/analyzer/test/src/dart/resolution/constant_test.dart b/pkg/analyzer/test/src/dart/resolution/constant_test.dart
index 7d71d57..2e49834 100644
--- a/pkg/analyzer/test/src/dart/resolution/constant_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/constant_test.dart
@@ -214,7 +214,7 @@
     result = await resolveFile(convertPath('$testPackageLibPath/a.dart'));
     assertErrorsInResolvedUnit(result, []);
 
-    var bElement = FindElement(result.unit!).field('b') as ConstVariableElement;
+    var bElement = FindElement(result.unit).field('b') as ConstVariableElement;
     var bValue = bElement.evaluationResult!.value!;
     var superFields = bValue.getField(GenericState.SUPERCLASS_FIELD);
     expect(superFields!.getField('f1')!.toBoolValue(), false);
diff --git a/pkg/analyzer/test/src/dart/resolution/optional_const_test.dart b/pkg/analyzer/test/src/dart/resolution/optional_const_test.dart
index e32e7e8..daa949c 100644
--- a/pkg/analyzer/test/src/dart/resolution/optional_const_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/optional_const_test.dart
@@ -152,7 +152,7 @@
   }
 
   void _fillLibraries([LibraryElement? library]) {
-    library ??= result.unit!.declaredElement!.library;
+    library ??= result.unit.declaredElement!.library;
     var uriStr = library.source.uri.toString();
     if (!libraries.containsKey(uriStr)) {
       libraries[uriStr] = library;
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index 2080ec9..3b2f5a4 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -924,8 +924,8 @@
     result = await resolveFile(path);
     expect(result.state, ResultState.VALID);
 
-    findNode = FindNode(result.content!, result.unit!);
-    findElement = FindElement(result.unit!);
+    findNode = FindNode(result.content, result.unit);
+    findElement = FindElement(result.unit);
   }
 
   /// Create a new file with the [path] and [content], resolve it into [result].
diff --git a/pkg/analyzer/test/src/dart/resolver/exit_detector_test.dart b/pkg/analyzer/test/src/dart/resolver/exit_detector_test.dart
index a24235f..690050e 100644
--- a/pkg/analyzer/test/src/dart/resolver/exit_detector_test.dart
+++ b/pkg/analyzer/test/src/dart/resolver/exit_detector_test.dart
@@ -1102,7 +1102,7 @@
   Future<void> _assertHasReturn(String code, int n, bool expected) async {
     await resolveTestCode(code);
 
-    var function = result.unit!.declarations.last as FunctionDeclaration;
+    var function = result.unit.declarations.last as FunctionDeclaration;
     var body = function.functionExpression.body as BlockFunctionBody;
     Statement statement = body.block.statements[n];
     expect(ExitDetector.exits(statement), expected);
diff --git a/pkg/analyzer/test/src/diagnostics/mixin_application_not_implemented_interface_test.dart b/pkg/analyzer/test/src/diagnostics/mixin_application_not_implemented_interface_test.dart
index 31546d9..0266782 100644
--- a/pkg/analyzer/test/src/diagnostics/mixin_application_not_implemented_interface_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/mixin_application_not_implemented_interface_test.dart
@@ -111,7 +111,7 @@
       error(HintCode.UNUSED_ELEMENT, 96, 15),
     ]);
     var mixins =
-        result.unit!.declaredElement!.getType('_LocalDirectory')!.mixins;
+        result.unit.declaredElement!.getType('_LocalDirectory')!.mixins;
     assertType(mixins[0], 'ForwardingDirectory<_LocalDirectory>');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/type_argument_not_matching_bounds_test.dart b/pkg/analyzer/test/src/diagnostics/type_argument_not_matching_bounds_test.dart
index 72f8042..1f43b21 100644
--- a/pkg/analyzer/test/src/diagnostics/type_argument_not_matching_bounds_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/type_argument_not_matching_bounds_test.dart
@@ -300,7 +300,7 @@
       error(CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, 65, 3),
     ]);
     // Instantiate-to-bounds should have instantiated "Bar" to "Bar<Foo>".
-    assertType(result.unit!.declaredElement!.getType('Baz')!.supertype,
+    assertType(result.unit.declaredElement!.getType('Baz')!.supertype,
         'Bar<Foo<dynamic>>');
   }
 
diff --git a/pkg/analyzer/test/src/lint/linter/linter_context_impl_test.dart b/pkg/analyzer/test/src/lint/linter/linter_context_impl_test.dart
index 399d2e4..4212464 100644
--- a/pkg/analyzer/test/src/lint/linter/linter_context_impl_test.dart
+++ b/pkg/analyzer/test/src/lint/linter/linter_context_impl_test.dart
@@ -28,7 +28,7 @@
 
   Future<void> resolve(String content) async {
     await resolveTestCode(content);
-    var contextUnit = LinterContextUnit(result.content!, result.unit!);
+    var contextUnit = LinterContextUnit(result.content, result.unit);
 
     final libraryElement = result.libraryElement;
     final analysisContext = libraryElement.session.analysisContext;
diff --git a/pkg/analyzer/test/src/task/strong/dart2_inference_test.dart b/pkg/analyzer/test/src/task/strong/dart2_inference_test.dart
index e7b1ac5..87a1477 100644
--- a/pkg/analyzer/test/src/task/strong/dart2_inference_test.dart
+++ b/pkg/analyzer/test/src/task/strong/dart2_inference_test.dart
@@ -347,8 +347,8 @@
   }
 
   void _assertTypeAnnotations() {
-    var code = result.content!;
-    var unit = result.unit!;
+    var code = result.content;
+    var unit = result.unit;
 
     var types = <int, String>{};
     {
diff --git a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
index 21fa9c9..4840db6 100644
--- a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
+++ b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
@@ -22,7 +22,7 @@
   // TODO(https://github.com/dart-lang/sdk/issues/44666): Use null safety in
   //  test cases.
   CompilationUnitElement get _resultUnitElement {
-    return result.unit!.declaredElement!;
+    return result.unit.declaredElement!;
   }
 
   test_asyncClosureReturnType_flatten() async {
diff --git a/pkg/analyzer/test/util/id_testing_helper.dart b/pkg/analyzer/test/util/id_testing_helper.dart
index 6d75b6f..f192694 100644
--- a/pkg/analyzer/test/util/id_testing_helper.dart
+++ b/pkg/analyzer/test/util/id_testing_helper.dart
@@ -196,7 +196,7 @@
         });
       } else {
         String _formatError(AnalysisError e) {
-          var locationInfo = result.unit!.lineInfo!.getLocation(e.offset);
+          var locationInfo = result.unit.lineInfo!.getLocation(e.offset);
           return '$locationInfo: ${e.errorCode}: ${e.message}';
         }
 
@@ -209,7 +209,7 @@
 
   results.forEach((testUri, result) {
     dataComputer.computeUnitData(
-        driver.testingData!, result.unit!, actualMapFor(testUri));
+        driver.testingData!, result.unit, actualMapFor(testUri));
   });
   var compiledData = AnalyzerCompiledData<T>(
       testData.code, testData.entryPoint, actualMaps, globalData);
diff --git a/pkg/analyzer_plugin/lib/plugin/navigation_mixin.dart b/pkg/analyzer_plugin/lib/plugin/navigation_mixin.dart
index de11deb..07dbddb 100644
--- a/pkg/analyzer_plugin/lib/plugin/navigation_mixin.dart
+++ b/pkg/analyzer_plugin/lib/plugin/navigation_mixin.dart
@@ -27,7 +27,7 @@
     var length = parameters.length;
     if (offset < 0 && length < 0) {
       offset = 0;
-      length = result.content?.length ?? 0;
+      length = result.content.length;
     }
     return DartNavigationRequestImpl(resourceProvider, offset, length, result);
   }
diff --git a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart
index 4755515..0e6ea1a 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart
@@ -252,7 +252,7 @@
     }
     var timeStamp = result.exists ? 0 : -1;
 
-    var declaredUnit = result.unit?.declaredElement;
+    var declaredUnit = result.unit.declaredElement;
     var libraryUnit = declaredUnit?.library.definingCompilationUnit;
 
     DartFileEditBuilderImpl? libraryEditBuilder;
diff --git a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
index 6de2511..f6b890f 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
@@ -1353,7 +1353,7 @@
 
   @override
   void format(SourceRange range) {
-    var newContent = resolvedUnit.content!;
+    var newContent = resolvedUnit.content;
     var newRangeOffset = range.offset;
     var newRangeLength = range.length;
     for (var edit in fileEdit.edits) {
@@ -1437,7 +1437,7 @@
     LibraryDirective? libraryDirective;
     var importDirectives = <ImportDirective>[];
     PartDirective? partDirective;
-    var unit = resolvedUnit.unit!;
+    var unit = resolvedUnit.unit;
     for (var directive in unit.directives) {
       if (directive is LibraryDirective) {
         libraryDirective = directive;
diff --git a/pkg/analyzer_plugin/lib/utilities/completion/inherited_reference_contributor.dart b/pkg/analyzer_plugin/lib/utilities/completion/inherited_reference_contributor.dart
index a605f4e..cf0a57b 100644
--- a/pkg/analyzer_plugin/lib/utilities/completion/inherited_reference_contributor.dart
+++ b/pkg/analyzer_plugin/lib/utilities/completion/inherited_reference_contributor.dart
@@ -35,7 +35,7 @@
   Future<void> computeSuggestions(
       DartCompletionRequest request, CompletionCollector collector) async {
     var target =
-        CompletionTarget.forOffset(request.result.unit!, request.offset);
+        CompletionTarget.forOffset(request.result.unit, request.offset);
     var optype = OpType.forCompletion(target, request.offset);
     if (!optype.includeIdentifiers) {
       return;
@@ -59,7 +59,7 @@
     CompletionTarget? target,
     OpType? optype,
   }) async {
-    target ??= CompletionTarget.forOffset(request.result.unit!, request.offset,
+    target ??= CompletionTarget.forOffset(request.result.unit, request.offset,
         entryPoint: entryPoint);
     optype ??= OpType.forCompletion(target, request.offset);
     if (!optype.includeIdentifiers) {
diff --git a/pkg/analyzer_plugin/lib/utilities/completion/type_member_contributor.dart b/pkg/analyzer_plugin/lib/utilities/completion/type_member_contributor.dart
index 1009c12..d190e3d 100644
--- a/pkg/analyzer_plugin/lib/utilities/completion/type_member_contributor.dart
+++ b/pkg/analyzer_plugin/lib/utilities/completion/type_member_contributor.dart
@@ -53,7 +53,7 @@
   Expression? _computeDotTarget(
       DartCompletionRequest request, AstNode? entryPoint) {
     var target = CompletionTarget.forOffset(
-        request.result.unit!, request.offset,
+        request.result.unit, request.offset,
         entryPoint: entryPoint);
     var node = target.containingNode;
     if (node is MethodInvocation) {
diff --git a/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart b/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
index 7d3e886..fd398ed 100644
--- a/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
@@ -790,7 +790,7 @@
     addSource(path, content);
     var unit = (await resolveFile(path)).unit;
 
-    var A = unit?.declarations[1] as ClassDeclaration;
+    var A = unit.declarations[1] as ClassDeclaration;
 
     var builder = newBuilder();
     await builder.addDartFileEdit(path, (builder) {
@@ -821,7 +821,7 @@
     addSource(path, content);
     var unit = (await resolveFile(path)).unit;
 
-    var A = unit?.declarations[1] as ClassDeclaration;
+    var A = unit.declarations[1] as ClassDeclaration;
 
     var builder = newBuilder();
     await builder.addDartFileEdit(path, (builder) {
@@ -857,7 +857,7 @@
     addSource(path, content);
     var unit = (await resolveFile(path)).unit;
 
-    var A = unit?.declarations[1] as ClassDeclaration;
+    var A = unit.declarations[1] as ClassDeclaration;
 
     var builder = newBuilder();
     await builder.addDartFileEdit(path, (builder) {
@@ -1026,7 +1026,7 @@
 ''';
     addSource(path, content);
     var unit = (await resolveFile(path)).unit;
-    var g = unit?.declarations[1] as FunctionDeclaration;
+    var g = unit.declarations[1] as FunctionDeclaration;
     var body = g.functionExpression.body as BlockFunctionBody;
     var statement = body.block.statements[0] as ExpressionStatement;
     var invocation = statement.expression as MethodInvocation;
@@ -1048,7 +1048,7 @@
     addSource(path, content);
 
     var unit = (await resolveFile(path)).unit;
-    var f = unit?.declarations[0] as FunctionDeclaration;
+    var f = unit.declarations[0] as FunctionDeclaration;
     var parameters = f.functionExpression.parameters;
     var elements = parameters?.parameters.map((p) => p.declaredElement!);
 
@@ -1068,7 +1068,7 @@
     var content = 'f(int a, [bool b = false, String c]) {}';
     addSource(path, content);
     var unit = (await resolveFile(path)).unit;
-    var f = unit?.declarations[0] as FunctionDeclaration;
+    var f = unit.declarations[0] as FunctionDeclaration;
     var parameters = f.functionExpression.parameters;
     var elements = parameters?.parameters.map((p) => p.declaredElement!);
 
@@ -1088,7 +1088,7 @@
     var content = 'f(int i, String s) {}';
     addSource(path, content);
     var unit = (await resolveFile(path)).unit;
-    var f = unit?.declarations[0] as FunctionDeclaration;
+    var f = unit.declarations[0] as FunctionDeclaration;
     var parameters = f.functionExpression.parameters;
     var elements = parameters?.parameters.map((p) => p.declaredElement!);
 
@@ -1110,7 +1110,7 @@
 }''';
     addSource(path, content);
     var unit = (await resolveFile(path)).unit;
-    var f = unit?.declarations[0] as FunctionDeclaration;
+    var f = unit.declarations[0] as FunctionDeclaration;
     var body = f.functionExpression.body as BlockFunctionBody;
     var statement = body.block.statements[0] as ExpressionStatement;
     var invocation = statement.expression as MethodInvocation;
@@ -1133,7 +1133,7 @@
 }''';
     addSource(path, content);
     var unit = (await resolveFile(path)).unit;
-    var f = unit?.declarations[0] as FunctionDeclaration;
+    var f = unit.declarations[0] as FunctionDeclaration;
     var body = f.functionExpression.body as BlockFunctionBody;
     var statement = body.block.statements[0] as ExpressionStatement;
     var invocation = statement.expression as MethodInvocation;
@@ -1330,7 +1330,7 @@
     var builder = newBuilder();
     await builder.addDartFileEdit(path, (builder) {
       builder.addInsertion(content.length - 1, (builder) {
-        var typeProvider = unit!.declaredElement!.library.typeProvider;
+        var typeProvider = unit.declaredElement!.library.typeProvider;
         builder.writeType(typeProvider.dynamicType);
       });
     });
@@ -1543,7 +1543,7 @@
     var builder = newBuilder();
     await builder.addDartFileEdit(path, (builder) {
       builder.addInsertion(content.length - 1, (builder) {
-        var typeProvider = unit!.declaredElement!.library.typeProvider;
+        var typeProvider = unit.declaredElement!.library.typeProvider;
         builder.writeType(typeProvider.dynamicType, required: true);
       });
     });
@@ -1690,13 +1690,13 @@
 
   Future<ClassElement> _getClassElement(String path, String name) async {
     var result = (await resolveFile(path)).unit;
-    return result!.declaredElement!.getType(name)!;
+    return result.declaredElement!.getType(name)!;
   }
 
   Future<PropertyAccessorElement> _getTopLevelAccessorElement(
       String path, String name) async {
     var result = (await resolveFile(path)).unit;
-    return result!.declaredElement!.accessors.firstWhere((v) => v.name == name);
+    return result.declaredElement!.accessors.firstWhere((v) => v.name == name);
   }
 
   Future<InterfaceType> _getType(
@@ -1720,7 +1720,7 @@
     addSource(path, '''var f = () {}''');
 
     var resolvedUnit = await resolveFile(path);
-    var findNode = FindNode(resolvedUnit.content!, resolvedUnit.unit!);
+    var findNode = FindNode(resolvedUnit.content, resolvedUnit.unit);
     var body = findNode.functionBody('{}');
 
     var builder = newBuilder();
@@ -1737,7 +1737,7 @@
     addSource(path, 'String f() {}');
 
     var resolvedUnit = await resolveFile(path);
-    var findNode = FindNode(resolvedUnit.content!, resolvedUnit.unit!);
+    var findNode = FindNode(resolvedUnit.content, resolvedUnit.unit);
     var body = findNode.functionBody('{}');
 
     var builder = newBuilder();
@@ -1850,7 +1850,7 @@
     addSource(path, 'String f() {}');
 
     var resolvedUnit = await resolveFile(path);
-    var findNode = FindNode(resolvedUnit.content!, resolvedUnit.unit!);
+    var findNode = FindNode(resolvedUnit.content, resolvedUnit.unit);
     var type = findNode.typeAnnotation('String');
 
     var builder = newBuilder();
@@ -1873,7 +1873,7 @@
 class C extends B {}
 ''');
     var unit = (await resolveFile(path)).unit;
-    var classC = unit?.declarations[2] as ClassDeclaration;
+    var classC = unit.declarations[2] as ClassDeclaration;
     var builder = DartLinkedEditBuilderImpl(MockEditBuilderImpl());
     builder.addSuperTypesAsSuggestions(
       classC.declaredElement?.instantiate(
@@ -2895,10 +2895,10 @@
     {
       var unitResult = (await resolveFile(path)).unit;
       if (targetMixinName != null) {
-        targetElement = unitResult!.declaredElement!.mixins
+        targetElement = unitResult.declaredElement!.mixins
             .firstWhere((e) => e.name == targetMixinName);
       } else {
-        targetElement = unitResult!.declaredElement!.classes
+        targetElement = unitResult.declaredElement!.classes
             .firstWhere((e) => e.name == targetClassName);
       }
     }
diff --git a/pkg/analyzer_plugin/test/src/utilities/completion/completion_target_test.dart b/pkg/analyzer_plugin/test/src/utilities/completion/completion_target_test.dart
index 71b649d..742f070 100644
--- a/pkg/analyzer_plugin/test/src/utilities/completion/completion_target_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/completion/completion_target_test.dart
@@ -954,9 +954,9 @@
     newFile(path, content: content);
 
     var result = await resolveFile(path);
-    findElement = FindElement(result.unit!);
+    findElement = FindElement(result.unit);
 
-    target = CompletionTarget.forOffset(result.unit!, offset!);
+    target = CompletionTarget.forOffset(result.unit, offset!);
   }
 
   static String _executableNameStr(ExecutableElement executable) {
diff --git a/pkg/analyzer_plugin/test/src/utilities/completion/optype_test.dart b/pkg/analyzer_plugin/test/src/utilities/completion/optype_test.dart
index 3c8fe89..79c9e0c 100644
--- a/pkg/analyzer_plugin/test/src/utilities/completion/optype_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/completion/optype_test.dart
@@ -50,7 +50,7 @@
     //
     var resolvedUnit = await resolveFile(testPath);
     var completionTarget =
-        CompletionTarget.forOffset(resolvedUnit.unit!, completionOffset);
+        CompletionTarget.forOffset(resolvedUnit.unit, completionOffset);
     var opType = OpType.forCompletion(completionTarget, completionOffset);
     //
     // Validate the OpType.
diff --git a/pkg/analyzer_plugin/test/support/abstract_single_unit.dart b/pkg/analyzer_plugin/test/support/abstract_single_unit.dart
index afa5699..bdd1c69 100644
--- a/pkg/analyzer_plugin/test/support/abstract_single_unit.dart
+++ b/pkg/analyzer_plugin/test/support/abstract_single_unit.dart
@@ -95,8 +95,8 @@
 
   Future<void> resolveTestFile() async {
     var result = await resolveFile(testFile);
-    testCode = result.content!;
-    testUnit = result.unit!;
+    testCode = result.content;
+    testUnit = result.unit;
     if (verifyNoTestUnitErrors) {
       expect(result.errors.where((AnalysisError error) {
         return error.errorCode != HintCode.DEAD_CODE &&
diff --git a/pkg/analyzer_plugin/test/utilities/completion/completion_contributor_util.dart b/pkg/analyzer_plugin/test/utilities/completion/completion_contributor_util.dart
index d7cba95..a98ac39 100644
--- a/pkg/analyzer_plugin/test/utilities/completion/completion_contributor_util.dart
+++ b/pkg/analyzer_plugin/test/utilities/completion/completion_contributor_util.dart
@@ -418,7 +418,7 @@
         DartCompletionRequestImpl(resourceProvider, completionOffset!, result);
 
     var target =
-        CompletionTarget.forOffset(request!.result.unit!, request!.offset);
+        CompletionTarget.forOffset(request!.result.unit, request!.offset);
     var range = target.computeReplacementRange(request!.offset);
     replacementOffset = range.offset;
     replacementLength = range.length;
diff --git a/pkg/nnbd_migration/lib/migration_cli.dart b/pkg/nnbd_migration/lib/migration_cli.dart
index bcd7f99..9a0a6ec 100644
--- a/pkg/nnbd_migration/lib/migration_cli.dart
+++ b/pkg/nnbd_migration/lib/migration_cli.dart
@@ -1049,7 +1049,7 @@
     // Process each source file.
     bool allSourcesAlreadyMigrated = true;
     await processResources((ResolvedUnitResult result) async {
-      if (!result.unit!.featureSet.isEnabled(Feature.non_nullable)) {
+      if (!result.unit.featureSet.isEnabled(Feature.non_nullable)) {
         allSourcesAlreadyMigrated = false;
       }
       _progressBar.tick();
diff --git a/pkg/nnbd_migration/lib/src/front_end/info_builder.dart b/pkg/nnbd_migration/lib/src/front_end/info_builder.dart
index ecc8a99..b471651 100644
--- a/pkg/nnbd_migration/lib/src/front_end/info_builder.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/info_builder.dart
@@ -100,7 +100,7 @@
       if (result is ResolvedLibraryResult) {
         for (var unitResult in result.units) {
           var sourceInfo =
-              sourceInfoMap[unitResult.unit!.declaredElement!.source];
+              sourceInfoMap[unitResult.unit.declaredElement!.source];
           // Note: there might have been no information for this unit in
           // sourceInfoMap.  That can happen if there's an already-migrated
           // library being referenced by the code being migrated, but not all
@@ -185,7 +185,7 @@
         break;
       case NullabilityFixKind.addRequired:
         var metaImport =
-            _findImportDirective(result.unit!, 'package:meta/meta.dart');
+            _findImportDirective(result.unit, 'package:meta/meta.dart');
         if (metaImport == null) {
           edits.add(
               EditDetail('Add /*required*/ hint', offset, 0, '/*required*/ '));
@@ -273,7 +273,7 @@
   List<NavigationSource> _computeNavigationSources(ResolvedUnitResult result) {
     var collector = NavigationCollectorImpl();
     computeDartNavigation(
-        result.session.resourceProvider, collector, result.unit!, null, null);
+        result.session.resourceProvider, collector, result.unit, null, null);
     collector.createRegions();
     var files = collector.files;
     var regions = collector.regions;
@@ -377,8 +377,8 @@
     var content = result.content;
     unitInfo.diskContent = content;
     var alreadyMigrated =
-        result.unit!.featureSet.isEnabled(Feature.non_nullable);
-    unitInfo.wasExplicitlyOptedOut = result.unit!.languageVersionToken != null;
+        result.unit.featureSet.isEnabled(Feature.non_nullable);
+    unitInfo.wasExplicitlyOptedOut = result.unit.languageVersionToken != null;
     if (alreadyMigrated) {
       unitInfo.migrationStatus = UnitMigrationStatus.alreadyMigrated;
       unitInfo.migrationStatusCanBeChanged = false;
@@ -401,7 +401,7 @@
     // before we re-populate the region list.
     regions.clear();
 
-    var lineInfo = result.unit!.lineInfo;
+    var lineInfo = result.unit.lineInfo;
     var insertions = <int?, List<AtomicEdit>>{};
     var infosSeen = Set<AtomicEditInfo>.identity();
 
@@ -422,7 +422,7 @@
         var end = offset + length;
         // Insert the replacement text without deleting the replaced text.
         if (replacement.isNotEmpty) {
-          content = content!.replaceRange(end, end, replacement);
+          content = content.replaceRange(end, end, replacement);
           (insertions[sourceOffset] ??= []).add(AtomicEdit.insert(replacement));
         }
         var info = edit.info;
diff --git a/pkg/nnbd_migration/lib/src/nullability_migration_impl.dart b/pkg/nnbd_migration/lib/src/nullability_migration_impl.dart
index 07c652a..be547dc 100644
--- a/pkg/nnbd_migration/lib/src/nullability_migration_impl.dart
+++ b/pkg/nnbd_migration/lib/src/nullability_migration_impl.dart
@@ -123,7 +123,7 @@
 
   @override
   void finalizeInput(ResolvedUnitResult result) {
-    if (result.unit!.featureSet.isEnabled(Feature.non_nullable)) {
+    if (result.unit.featureSet.isEnabled(Feature.non_nullable)) {
       // This library has already been migrated; nothing more to do.
       return;
     }
@@ -132,7 +132,7 @@
       _propagated = true;
       _graph.propagate();
     }
-    var unit = result.unit!;
+    var unit = result.unit;
     var compilationUnit = unit.declaredElement!;
     var library = compilationUnit.library;
     var source = compilationUnit.source;
@@ -188,7 +188,7 @@
         !_queriedUnmigratedDependencies,
         'Should only query unmigratedDependencies after all calls to '
         'prepareInput');
-    if (result.unit!.featureSet.isEnabled(Feature.non_nullable)) {
+    if (result.unit.featureSet.isEnabled(Feature.non_nullable)) {
       // This library has already been migrated; nothing more to do.
       return;
     }
@@ -202,7 +202,7 @@
           instrumentation: _instrumentation);
       _decoratedClassHierarchy = DecoratedClassHierarchy(_variables, _graph);
     }
-    var unit = result.unit!;
+    var unit = result.unit;
     try {
       DecoratedTypeParameterBounds.current = _decoratedTypeParameterBounds;
       unit.accept(NodeBuilder(
@@ -219,12 +219,12 @@
   }
 
   void processInput(ResolvedUnitResult result) {
-    if (result.unit!.featureSet.isEnabled(Feature.non_nullable)) {
+    if (result.unit.featureSet.isEnabled(Feature.non_nullable)) {
       // This library has already been migrated; nothing more to do.
       return;
     }
     ExperimentStatusException.sanityCheck(result);
-    var unit = result.unit!;
+    var unit = result.unit;
     try {
       DecoratedTypeParameterBounds.current = _decoratedTypeParameterBounds;
       unit.accept(EdgeBuilder(
diff --git a/pkg/nnbd_migration/test/front_end/info_builder_test.dart b/pkg/nnbd_migration/test/front_end/info_builder_test.dart
index d1c96e4..23a7900 100644
--- a/pkg/nnbd_migration/test/front_end/info_builder_test.dart
+++ b/pkg/nnbd_migration/test/front_end/info_builder_test.dart
@@ -35,7 +35,7 @@
 ''');
     var result = await resolveTestFile();
     ClassDeclaration class_ =
-        result.unit!.declarations.single as ClassDeclaration;
+        result.unit.declarations.single as ClassDeclaration;
     var constructor = class_.members.single;
     expect(InfoBuilder.buildEnclosingMemberDescription(constructor),
         equals("the constructor 'C.aaa'"));
@@ -49,7 +49,7 @@
 ''');
     var result = await resolveTestFile();
     ClassDeclaration class_ =
-        result.unit!.declarations.single as ClassDeclaration;
+        result.unit.declarations.single as ClassDeclaration;
     var constructor = class_.members.single;
     expect(InfoBuilder.buildEnclosingMemberDescription(constructor),
         equals("the default constructor of 'C'"));
@@ -63,7 +63,7 @@
 ''');
     var result = await resolveTestFile();
     ClassDeclaration class_ =
-        result.unit!.declarations.single as ClassDeclaration;
+        result.unit.declarations.single as ClassDeclaration;
     FieldDeclaration fieldDeclaration =
         class_.members.single as FieldDeclaration;
     var field = fieldDeclaration.fields.variables[0];
@@ -79,7 +79,7 @@
 ''');
     var result = await resolveTestFile();
     ClassDeclaration class_ =
-        result.unit!.declarations.single as ClassDeclaration;
+        result.unit.declarations.single as ClassDeclaration;
     FieldDeclaration fieldDeclaration =
         class_.members.single as FieldDeclaration;
     var type = fieldDeclaration.fields.type;
@@ -95,7 +95,7 @@
 ''');
     var result = await resolveTestFile();
     ClassDeclaration class_ =
-        result.unit!.declarations.single as ClassDeclaration;
+        result.unit.declarations.single as ClassDeclaration;
     var getter = class_.members.single;
     expect(InfoBuilder.buildEnclosingMemberDescription(getter),
         equals("the getter 'C.aaa'"));
@@ -109,7 +109,7 @@
 ''');
     var result = await resolveTestFile();
     ClassDeclaration class_ =
-        result.unit!.declarations.single as ClassDeclaration;
+        result.unit.declarations.single as ClassDeclaration;
     var method = class_.members.single;
     expect(InfoBuilder.buildEnclosingMemberDescription(method),
         equals("the method 'C.aaa'"));
@@ -123,7 +123,7 @@
 ''');
     var result = await resolveTestFile();
     ClassDeclaration class_ =
-        result.unit!.declarations.single as ClassDeclaration;
+        result.unit.declarations.single as ClassDeclaration;
     var operator = class_.members.single;
     expect(InfoBuilder.buildEnclosingMemberDescription(operator),
         equals("the operator 'C.=='"));
@@ -137,7 +137,7 @@
 ''');
     var result = await resolveTestFile();
     ClassDeclaration class_ =
-        result.unit!.declarations.single as ClassDeclaration;
+        result.unit.declarations.single as ClassDeclaration;
     var setter = class_.members.single;
     expect(InfoBuilder.buildEnclosingMemberDescription(setter),
         equals("the setter 'C.aaa='"));
@@ -151,7 +151,7 @@
 ''');
     var result = await resolveTestFile();
     ExtensionDeclaration extension_ =
-        result.unit!.declarations.single as ExtensionDeclaration;
+        result.unit.declarations.single as ExtensionDeclaration;
     var method = extension_.members.single;
     expect(InfoBuilder.buildEnclosingMemberDescription(method),
         equals("the method 'E.aaa'"));
@@ -165,7 +165,7 @@
 ''');
     var result = await resolveTestFile();
     ExtensionDeclaration extension_ =
-        result.unit!.declarations.single as ExtensionDeclaration;
+        result.unit.declarations.single as ExtensionDeclaration;
     var method = extension_.members.single;
     expect(InfoBuilder.buildEnclosingMemberDescription(method),
         equals("the method 'aaa' in unnamed extension on List<dynamic>"));
@@ -179,7 +179,7 @@
 ''');
     var result = await resolveTestFile();
     MixinDeclaration mixin_ =
-        result.unit!.declarations.single as MixinDeclaration;
+        result.unit.declarations.single as MixinDeclaration;
     var method = mixin_.members.single;
     expect(InfoBuilder.buildEnclosingMemberDescription(method),
         equals("the method 'C.aaa'"));
@@ -190,7 +190,7 @@
 void aaa(value) {}
 ''');
     var result = await resolveTestFile();
-    var function = result.unit!.declarations.single;
+    var function = result.unit.declarations.single;
     expect(InfoBuilder.buildEnclosingMemberDescription(function),
         equals("the function 'aaa'"));
   }
@@ -200,7 +200,7 @@
 int get aaa => 7;
 ''');
     var result = await resolveTestFile();
-    var getter = result.unit!.declarations.single;
+    var getter = result.unit.declarations.single;
     expect(InfoBuilder.buildEnclosingMemberDescription(getter),
         equals("the getter 'aaa'"));
   }
@@ -210,7 +210,7 @@
 void set aaa(value) {}
 ''');
     var result = await resolveTestFile();
-    var setter = result.unit!.declarations.single;
+    var setter = result.unit.declarations.single;
     expect(InfoBuilder.buildEnclosingMemberDescription(setter),
         equals("the setter 'aaa='"));
   }
@@ -221,7 +221,7 @@
 ''');
     var result = await resolveTestFile();
     TopLevelVariableDeclaration topLevelVariableDeclaration =
-        result.unit!.declarations.single as TopLevelVariableDeclaration;
+        result.unit.declarations.single as TopLevelVariableDeclaration;
     var variable = topLevelVariableDeclaration.variables.variables[0];
     expect(InfoBuilder.buildEnclosingMemberDescription(variable),
         equals("the variable 'i'"));
@@ -233,7 +233,7 @@
 ''');
     var result = await resolveTestFile();
     TopLevelVariableDeclaration topLevelVariableDeclaration =
-        result.unit!.declarations.single as TopLevelVariableDeclaration;
+        result.unit.declarations.single as TopLevelVariableDeclaration;
     var type = topLevelVariableDeclaration.variables.type;
     expect(InfoBuilder.buildEnclosingMemberDescription(type),
         equals("the variable 'i'"));
diff --git a/pkg/nnbd_migration/test/instrumentation_test.dart b/pkg/nnbd_migration/test/instrumentation_test.dart
index f2df090..821b21c 100644
--- a/pkg/nnbd_migration/test/instrumentation_test.dart
+++ b/pkg/nnbd_migration/test/instrumentation_test.dart
@@ -150,8 +150,8 @@
         warnOnWeakCode: warnOnWeakCode);
     var result =
         await session.getResolvedUnit(sourcePath) as ResolvedUnitResult;
-    source = result.unit!.declaredElement!.source;
-    findNode = FindNode(content, result.unit!);
+    source = result.unit.declaredElement!.source;
+    findNode = FindNode(content, result.unit);
     migration.prepareInput(result);
     expect(migration.unmigratedDependencies, isEmpty);
     migration.processInput(result);
diff --git a/pkg/vm/lib/transformations/ffi_native.dart b/pkg/vm/lib/transformations/ffi_native.dart
index 4c71d56..ec120ac 100644
--- a/pkg/vm/lib/transformations/ffi_native.dart
+++ b/pkg/vm/lib/transformations/ffi_native.dart
@@ -30,6 +30,7 @@
   final Class ffiNativeClass;
   final Class nativeFunctionClass;
   final Field ffiNativeNameField;
+  final Field ffiNativeIsLeafField;
   final Field resolverField;
   final Procedure asFunctionProcedure;
   final Procedure fromAddressInternal;
@@ -39,6 +40,8 @@
         nativeFunctionClass = index.getClass('dart:ffi', 'NativeFunction'),
         ffiNativeNameField =
             index.getField('dart:ffi', 'FfiNative', 'nativeName'),
+        ffiNativeIsLeafField =
+            index.getField('dart:ffi', 'FfiNative', 'isLeaf'),
         resolverField = index.getTopLevelField('dart:ffi', '_ffi_resolver'),
         asFunctionProcedure = index.getProcedure(
             'dart:ffi', 'NativeFunctionPointer', 'asFunction'),
@@ -71,14 +74,14 @@
   }
 
   // Transform:
-  //   @FfiNative<Double Function(Double)>('Math_sqrt')
+  //   @FfiNative<Double Function(Double)>('Math_sqrt', isLeaf:true)
   //   external double _square_root(double x);
   //
   // Into:
   //   final _@FfiNative__square_root =
   //       Pointer<NativeFunction<Double Function(Double)>>
   //           .fromAddress(_ffi_resolver('dart:math', 'Math_sqrt'))
-  //           .asFunction<double Function(double)>();
+  //           .asFunction<double Function(double)>(isLeaf:true);
   //   double _square_root(double x) => _@FfiNative__square_root(x);
   Statement transformFfiNative(
       Procedure node, InstanceConstant annotationConst) {
@@ -86,6 +89,8 @@
     final params = node.function.positionalParameters;
     final functionName = annotationConst
         .fieldValues[ffiNativeNameField.getterReference] as StringConstant;
+    final isLeaf = annotationConst
+        .fieldValues[ffiNativeIsLeafField.getterReference] as BoolConstant;
 
     // double Function(double)
     final DartType dartType =
@@ -115,9 +120,12 @@
         Arguments([resolverInvocation], types: [nativeInterfaceType]));
 
     // NativeFunctionPointer.asFunction
-    //     <Double Function(Double), double Function(double)>(...)
-    final asFunctionInvocation = StaticInvocation(asFunctionProcedure,
-        Arguments([fromAddressInvocation], types: [nativeType, dartType]));
+    //     <Double Function(Double), double Function(double)>(..., isLeaf:true)
+    final asFunctionInvocation = StaticInvocation(
+        asFunctionProcedure,
+        Arguments([fromAddressInvocation],
+            types: [nativeType, dartType],
+            named: [NamedExpression("isLeaf", BoolLiteral(isLeaf.value))]));
 
     // final _@FfiNative__square_root = ...
     final fieldName = Name('_@FfiNative_${node.name.text}', currentLibrary);
@@ -127,7 +135,8 @@
         isStatic: true,
         isFinal: true,
         fileUri: currentLibrary!.fileUri,
-        getterReference: currentLibraryIndex?.lookupGetterReference(fieldName));
+        getterReference: currentLibraryIndex?.lookupGetterReference(fieldName))
+      ..fileOffset = node.fileOffset;
     currentLibrary!.addField(funcPtrField);
 
     // _@FfiNative__square_root(x)
diff --git a/runtime/bin/ffi_test/ffi_test_functions_vmspecific.cc b/runtime/bin/ffi_test/ffi_test_functions_vmspecific.cc
index a4ad2d5..885c48f 100644
--- a/runtime/bin/ffi_test/ffi_test_functions_vmspecific.cc
+++ b/runtime/bin/ffi_test/ffi_test_functions_vmspecific.cc
@@ -1080,4 +1080,33 @@
   Dart_DeletePersistentHandle_DL(closure_to_callback_);
 }
 
+////////////////////////////////////////////////////////////////////////////////
+// Functions for testing @FfiNative.
+
+DART_EXPORT Dart_Handle GetRootLibraryUrl() {
+  Dart_Handle root_lib = Dart_RootLibrary();
+  Dart_Handle lib_url = Dart_LibraryUrl(root_lib);
+  ENSURE(!Dart_IsError(lib_url));
+  return lib_url;
+}
+
+intptr_t ReturnIntPtr(intptr_t x) {
+  return x;
+}
+
+static void* FfiNativeResolver(const char* name) {
+  if (strcmp(name, "ReturnIntPtr") == 0) {
+    return reinterpret_cast<void*>(ReturnIntPtr);
+  }
+  // This should be unreachable in tests.
+  ENSURE(false);
+}
+
+DART_EXPORT void SetFfiNativeResolverForTest(Dart_Handle url) {
+  Dart_Handle library = Dart_LookupLibrary(url);
+  ENSURE(!Dart_IsError(library));
+  Dart_Handle result = Dart_SetFfiNativeResolver(library, &FfiNativeResolver);
+  ENSURE(!Dart_IsError(result));
+}
+
 }  // namespace dart
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 6f116a0..2be540b 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -9305,7 +9305,7 @@
 TEST_CASE(Dart_SetFfiNativeResolver) {
   const char* kScriptChars = R"(
     import 'dart:ffi';
-    @FfiNative<IntPtr Function(Double)>('EchoInt')
+    @FfiNative<IntPtr Function(Double)>('EchoInt', isLeaf:true)
     external int echoInt(double x);
     main() => echoInt(7.0);
     )";
@@ -9327,7 +9327,7 @@
 TEST_CASE(Dart_SetFfiNativeResolver_MissingResolver) {
   const char* kScriptChars = R"(
     import 'dart:ffi';
-    @FfiNative<IntPtr Function(Double)>('EchoInt')
+    @FfiNative<IntPtr Function(Double)>('EchoInt', isLeaf:true)
     external int echoInt(double x);
     main() => echoInt(7.0);
     )";
diff --git a/sdk/lib/ffi/ffi.dart b/sdk/lib/ffi/ffi.dart
index 0e8be36..1e8a9ea 100644
--- a/sdk/lib/ffi/ffi.dart
+++ b/sdk/lib/ffi/ffi.dart
@@ -806,7 +806,7 @@
 ///
 /// Example:
 ///```dart
-/// @FfiNative<Int64 Function(Int64, Int64)>("FfiNative_Sum")
+/// @FfiNative<Int64 Function(Int64, Int64)>("FfiNative_Sum", isLeaf:true)
 /// external int sum(int a, int b);
 ///```
 /// Calling such functions will throw an exception if no resolver
@@ -817,7 +817,8 @@
 /// NOTE: This is an experimental feature and may change in the future.
 class FfiNative<T> {
   final String nativeName;
-  const FfiNative(this.nativeName);
+  final bool isLeaf;
+  const FfiNative(this.nativeName, {this.isLeaf: false});
 }
 
 // Bootstrapping native for getting the FFI native C function pointer to look
diff --git a/tests/ffi/ffi_native_test.dart b/tests/ffi/ffi_native_test.dart
new file mode 100644
index 0000000..6997360
--- /dev/null
+++ b/tests/ffi/ffi_native_test.dart
@@ -0,0 +1,32 @@
+// 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.
+//
+// SharedObjects=ffi_test_functions
+
+import 'dart:ffi';
+
+import 'package:expect/expect.dart';
+
+import 'dylib_utils.dart';
+
+final nativeLib = dlopenPlatformSpecific('ffi_test_functions');
+final getRootLibraryUrl = nativeLib
+    .lookupFunction<Handle Function(), Object Function()>('GetRootLibraryUrl');
+final setFfiNativeResolverForTest = nativeLib
+    .lookupFunction<Void Function(Handle), void Function(Object)>('SetFfiNativeResolverForTest');
+
+@FfiNative<IntPtr Function(IntPtr)>('ReturnIntPtr')
+external int returnIntPtr(int x);
+
+@FfiNative<IntPtr Function(IntPtr)>('ReturnIntPtr', isLeaf: true)
+external int returnIntPtrLeaf(int x);
+
+void main() {
+  // Register test resolver for top-level functions above.
+  final root_lib_url = getRootLibraryUrl();
+  setFfiNativeResolverForTest(root_lib_url);
+
+  Expect.equals(123, returnIntPtr(123));
+  Expect.equals(123, returnIntPtrLeaf(123));
+}
diff --git a/tools/VERSION b/tools/VERSION
index d854130..fa3a2fe 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 314
+PRERELEASE 315
 PRERELEASE_PATCH 0
\ No newline at end of file
