Version 2.12.0-280.0.dev

Merge commit '1be653147440fd4139577791a3eb90503df15bf7' into 'dev'
diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json
index c6e4271..429b915 100644
--- a/.dart_tool/package_config.json
+++ b/.dart_tool/package_config.json
@@ -77,7 +77,7 @@
       "name": "analyzer",
       "rootUri": "../pkg/analyzer",
       "packageUri": "lib/",
-      "languageVersion": "2.7"
+      "languageVersion": "2.12"
     },
     {
       "name": "analyzer_cli",
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
index 3135c01..c6cd12aa 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
@@ -4897,73 +4897,97 @@
   bool _attemptPrecedenceLevelRecovery(Token token, int precedence,
       int currentLevel, bool allowCascades, TypeParamOrArgInfo typeArg) {
     // Attempt recovery.
-    assert(_token_recovery_replacements.containsKey(token.next!.lexeme));
-    TokenType replacement = _token_recovery_replacements[token.next!.lexeme]!;
-    if (currentLevel >= 0) {
-      // Check that the new precedence and currentLevel would have accepted this
-      // replacement here.
-      int newLevel = replacement.precedence;
-      // The loop it would normally have gone through is something like
-      // for (; ; --level) {
-      //   while (identical(tokenLevel, level)) {
-      //   }
-      // }
-      // So if the new tokens level <= the "old" (current) level, [level] (in
-      // the above code snippet) would get down to it and accept it.
-      // But if the new tokens level > the "old" (current) level, normally we
-      // would never get to it - so we shouldn't here either. As the loop starts
-      // by taking the first tokens tokenLevel as level, recursing below won't
-      // weed that out so we need to do it here.
-      if (newLevel > currentLevel) return false;
-    }
-
-    _currentlyRecovering = true;
     _recoverAtPrecedenceLevel = false;
-    Listener originalListener = listener;
-    TokenStreamRewriter? originalRewriter = cachedRewriter;
-    NullListener nullListener = listener = new NullListener();
-    UndoableTokenStreamRewriter undoableTokenStreamRewriter =
-        new UndoableTokenStreamRewriter();
-    cachedRewriter = undoableTokenStreamRewriter;
-    rewriter.replaceNextTokenWithSyntheticToken(token, replacement);
-    bool acceptRecovery = false;
-    Token afterExpression = _parsePrecedenceExpressionLoop(
-        precedence, allowCascades, typeArg, token);
+    assert(_tokenRecoveryReplacements.containsKey(token.next!.lexeme));
+    List<TokenType> replacements =
+        _tokenRecoveryReplacements[token.next!.lexeme]!;
+    for (int i = 0; i < replacements.length; i++) {
+      TokenType replacement = replacements[i];
 
-    if (!nullListener.hasErrors &&
-        isOneOfOrEof(afterExpression.next!, const [';', ',', ')', '{', '}'])) {
-      // Seems good!
-      acceptRecovery = true;
-    }
+      if (currentLevel >= 0) {
+        // Check that the new precedence and currentLevel would have accepted
+        // this replacement here.
+        int newLevel = replacement.precedence;
+        // The loop it would normally have gone through is something like
+        // for (; ; --level) {
+        //   while (identical(tokenLevel, level)) {
+        //   }
+        // }
+        // So if the new tokens level <= the "old" (current) level, [level] (in
+        // the above code snippet) would get down to it and accept it.
+        // But if the new tokens level > the "old" (current) level, normally we
+        // would never get to it - so we shouldn't here either.
+        // As the loop starts by taking the first tokens tokenLevel as level,
+        // recursing below won't weed that out so we need to do it here.
+        if (newLevel > currentLevel) continue;
+      }
 
-    // Undo all changes and reset.
-    _currentlyRecovering = false;
-    undoableTokenStreamRewriter.undo();
-    listener = originalListener;
-    cachedRewriter = originalRewriter;
-
-    if (acceptRecovery) {
-      // Report and redo recovery.
-      reportRecoverableError(
-          token.next!,
-          codes.templateBinaryOperatorWrittenOut
-              .withArguments(token.next!.lexeme, replacement.lexeme));
+      _currentlyRecovering = true;
+      Listener originalListener = listener;
+      TokenStreamRewriter? originalRewriter = cachedRewriter;
+      NullListener nullListener = listener = new NullListener();
+      UndoableTokenStreamRewriter undoableTokenStreamRewriter =
+          new UndoableTokenStreamRewriter();
+      cachedRewriter = undoableTokenStreamRewriter;
       rewriter.replaceNextTokenWithSyntheticToken(token, replacement);
-      return true;
+      bool acceptRecovery = false;
+      Token afterExpression = _parsePrecedenceExpressionLoop(
+          precedence, allowCascades, typeArg, token);
+      Token afterExpressionNext = afterExpression.next!;
+
+      if (!nullListener.hasErrors &&
+          token != afterExpression &&
+          (isOneOfOrEof(afterExpressionNext,
+                  const [';', ',', ')', '{', '}', '|', '||', '&', '&&']) ||
+              (afterExpressionNext.type == TokenType.IDENTIFIER &&
+                  _tokenRecoveryReplacements
+                      .containsKey(afterExpressionNext.lexeme)))) {
+        // Seems good!
+        acceptRecovery = true;
+      }
+
+      // Undo all changes and reset.
+      _currentlyRecovering = false;
+      undoableTokenStreamRewriter.undo();
+      listener = originalListener;
+      cachedRewriter = originalRewriter;
+
+      if (acceptRecovery) {
+        // Report and redo recovery.
+        reportRecoverableError(
+            token.next!,
+            codes.templateBinaryOperatorWrittenOut
+                .withArguments(token.next!.lexeme, replacement.lexeme));
+        rewriter.replaceNextTokenWithSyntheticToken(token, replacement);
+        return true;
+      }
     }
+
     return false;
   }
 
   bool _recoverAtPrecedenceLevel = false;
   bool _currentlyRecovering = false;
-  static const Map<String, TokenType> _token_recovery_replacements = const {
-    // E.g. in Kotlin these are written out, see.
+  static const Map<String, List<TokenType>> _tokenRecoveryReplacements = const {
+    // E.g. in Kotlin binary operators are written out, see.
     // https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/.
-    "xor": TokenType.CARET,
-    "and": TokenType.AMPERSAND,
-    "or": TokenType.BAR,
-    "shl": TokenType.LT_LT,
-    "shr": TokenType.GT_GT,
+    "xor": [
+      TokenType.CARET,
+    ],
+    "and": [
+      TokenType.AMPERSAND,
+      TokenType.AMPERSAND_AMPERSAND,
+    ],
+    "or": [
+      TokenType.BAR,
+      TokenType.BAR_BAR,
+    ],
+    "shl": [
+      TokenType.LT_LT,
+    ],
+    "shr": [
+      TokenType.GT_GT,
+    ],
   };
 
   int _computePrecedence(Token token) {
@@ -4992,7 +5016,7 @@
       // An identifier at this point is not right. So some recovery is going to
       // happen soon. The question is, if we can do a better recovery here.
       if (!_currentlyRecovering &&
-          _token_recovery_replacements.containsKey(token.lexeme)) {
+          _tokenRecoveryReplacements.containsKey(token.lexeme)) {
         _recoverAtPrecedenceLevel = true;
       }
     }
diff --git a/pkg/_fe_analyzer_shared/lib/src/testing/id.dart b/pkg/_fe_analyzer_shared/lib/src/testing/id.dart
index f2821d2..fd2ed54 100644
--- a/pkg/_fe_analyzer_shared/lib/src/testing/id.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/testing/id.dart
@@ -364,7 +364,7 @@
   /// Registers [value] with [id] in [actualMap].
   ///
   /// Checks for duplicate data for [id].
-  void registerValue(Uri uri, int offset, Id id, T value, Object object) {
+  void registerValue(Uri uri, int offset, Id id, T? value, Object object) {
     if (value != null) {
       ActualData<T> newData = new ActualData<T>(id, value, uri, offset, object);
       if (actualMap.containsKey(id)) {
diff --git a/pkg/_fe_analyzer_shared/lib/src/testing/id_testing.dart b/pkg/_fe_analyzer_shared/lib/src/testing/id_testing.dart
index 4149cca..6494ac3 100644
--- a/pkg/_fe_analyzer_shared/lib/src/testing/id_testing.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/testing/id_testing.dart
@@ -636,7 +636,7 @@
 }
 
 typedef Future<Map<String, TestResult<T>>> RunTestFunction<T>(TestData testData,
-    {bool testAfterFailures,
+    {required bool testAfterFailures,
     bool verbose,
     bool succinct,
     bool printCode,
diff --git a/pkg/analysis_server/lib/src/analysis_server_abstract.dart b/pkg/analysis_server/lib/src/analysis_server_abstract.dart
index f0db479..caf7177 100644
--- a/pkg/analysis_server/lib/src/analysis_server_abstract.dart
+++ b/pkg/analysis_server/lib/src/analysis_server_abstract.dart
@@ -269,11 +269,6 @@
     return null;
   }
 
-  /// Return the appropriate analysis session for the file with the given
-  /// [path].
-  AnalysisSession getAnalysisSession(String path) =>
-      getAnalysisDriver(path).currentSession;
-
   DartdocDirectiveInfo getDartdocDirectiveInfoFor(ResolvedUnitResult result) {
     return declarationsTracker
             ?.getContext(result.session.analysisContext)
diff --git a/pkg/analysis_server/lib/src/computer/imported_elements_computer.dart b/pkg/analysis_server/lib/src/computer/imported_elements_computer.dart
index e30c41a..8d2c2f4 100644
--- a/pkg/analysis_server/lib/src/computer/imported_elements_computer.dart
+++ b/pkg/analysis_server/lib/src/computer/imported_elements_computer.dart
@@ -31,8 +31,7 @@
     if (_regionIncludesDirectives()) {
       return const <ImportedElements>[];
     }
-    var visitor =
-        _Visitor(unit.declaredElement.library, offset, offset + length);
+    var visitor = _Visitor(offset, offset + length);
     unit.accept(visitor);
     return visitor.importedElements.values.toList();
   }
@@ -54,9 +53,6 @@
 /// The visitor used by an [ImportedElementsComputer] to record the names of all
 /// imported elements.
 class _Visitor extends UnifyingAstVisitor<void> {
-  /// The element representing the library containing the code being visited.
-  final LibraryElement containingLibrary;
-
   /// The offset of the start of the region of text being copied.
   final int startOffset;
 
@@ -69,7 +65,7 @@
 
   /// Initialize a newly created visitor to visit nodes within a specified
   /// region.
-  _Visitor(this.containingLibrary, this.startOffset, this.endOffset);
+  _Visitor(this.startOffset, this.endOffset);
 
   @override
   void visitNode(AstNode node) {
diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index b8c3793..d3df682 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -60,20 +60,11 @@
   /// A list containing paths of removed files.
   final List<String> removedFiles = [];
 
-  /// Return `true` if this change set does not contain any changes.
-  bool get isEmpty =>
-      addedFiles.isEmpty && changedFiles.isEmpty && removedFiles.isEmpty;
-
   /// Record that the file with the specified [path] has been added.
   void addedSource(String path) {
     addedFiles.add(path);
   }
 
-  /// Record that the file with the specified [path] has been changed.
-  void changedSource(String path) {
-    changedFiles.add(path);
-  }
-
   /// Record that the file with the specified [path] has been removed.
   void removedSource(String path) {
     removedFiles.add(path);
@@ -172,11 +163,6 @@
   /// Returns `true` if  [path] should be ignored.
   bool ignored(String path) => pathFilter.ignored(path);
 
-  /// Returns `true` if [path] is the package description file for this context
-  /// (pubspec.yaml or .packages).
-  bool isPathToPackageDescription(String path) =>
-      path == packageDescriptionPath;
-
   /// Update the set of dependencies for this context.
   void setDependencies(Iterable<String> newDependencies) {
     _dependencies = newDependencies.toSet();
@@ -346,9 +332,6 @@
   /// The name of the `doc` directory.
   static const String DOC_DIR_NAME = 'doc';
 
-  /// The name of the `lib` directory.
-  static const String LIB_DIR_NAME = 'lib';
-
   /// File name of Android manifest files.
   static const String MANIFEST_NAME = 'AndroidManifest.xml';
 
@@ -358,11 +341,6 @@
   /// File name of package spec files.
   static const String PACKAGE_SPEC_NAME = '.packages';
 
-  /// The name of the key in an embedder file whose value is the list of
-  /// libraries in the SDK.
-  /// TODO(brianwilkerson) This is also defined in sdk.dart.
-  static const String _EMBEDDED_LIB_MAP_KEY = 'embedded_libs';
-
   /// The [ResourceProvider] using which paths are converted into [Resource]s.
   final ResourceProvider resourceProvider;
 
@@ -419,9 +397,6 @@
     pathContext = resourceProvider.pathContext;
   }
 
-  /// Check if this map defines embedded libraries.
-  bool definesEmbeddedLibs(Map map) => map[_EMBEDDED_LIB_MAP_KEY] != null;
-
   @override
   Folder getContextFolderFor(String path) {
     return _getInnermostContextInfoFor(path)?.folder;
@@ -1621,14 +1596,6 @@
   /// object that resulted from parsing the ".packages" file.
   Packages get packages;
 
-  /// Create all the [UriResolver]s which should be used to resolve packages in
-  /// contexts governed by this [FolderDisposition].
-  ///
-  /// [resourceProvider] is provided since it is needed to construct most
-  /// [UriResolver]s.
-  Iterable<UriResolver> createPackageUriResolvers(
-      ResourceProvider resourceProvider);
-
   /// Return the locator used to locate the _embedder.yaml file used to
   /// configure the SDK. The [resourceProvider] is used to access the file
   /// system in cases where that is necessary.
@@ -1647,11 +1614,6 @@
   Packages get packages => null;
 
   @override
-  Iterable<UriResolver> createPackageUriResolvers(
-          ResourceProvider resourceProvider) =>
-      const <UriResolver>[];
-
-  @override
   EmbedderYamlLocator getEmbedderLocator(ResourceProvider resourceProvider) =>
       EmbedderYamlLocator(null);
 }
@@ -1684,19 +1646,6 @@
   }
 
   @override
-  Iterable<UriResolver> createPackageUriResolvers(
-      ResourceProvider resourceProvider) {
-    if (packages != null) {
-      var packageMap = buildPackageMap(resourceProvider);
-      return <UriResolver>[
-        PackageMapUriResolver(resourceProvider, packageMap),
-      ];
-    } else {
-      return const <UriResolver>[];
-    }
-  }
-
-  @override
   EmbedderYamlLocator getEmbedderLocator(ResourceProvider resourceProvider) {
     _embedderLocator ??= EmbedderYamlLocator(buildPackageMap(resourceProvider));
     return _embedderLocator;
diff --git a/pkg/analysis_server/lib/src/domain_diagnostic.dart b/pkg/analysis_server/lib/src/domain_diagnostic.dart
index 58a03a6..747fb93 100644
--- a/pkg/analysis_server/lib/src/domain_diagnostic.dart
+++ b/pkg/analysis_server/lib/src/domain_diagnostic.dart
@@ -62,11 +62,3 @@
     return null;
   }
 }
-
-class MemoryCpuSample {
-  final DateTime time;
-  final double cpuPercentage;
-  final int memoryKB;
-
-  MemoryCpuSample(this.time, this.cpuPercentage, this.memoryKB);
-}
diff --git a/pkg/analysis_server/lib/src/flutter/flutter_correction.dart b/pkg/analysis_server/lib/src/flutter/flutter_correction.dart
deleted file mode 100644
index 0ca0ab0..0000000
--- a/pkg/analysis_server/lib/src/flutter/flutter_correction.dart
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analysis_server/src/services/correction/util.dart';
-import 'package:analyzer/dart/analysis/results.dart';
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/src/dart/ast/utilities.dart';
-import 'package:meta/meta.dart';
-
-class FlutterCorrections {
-  final ResolvedUnitResult resolveResult;
-  final int selectionOffset;
-  final int selectionLength;
-  final int selectionEnd;
-
-  final CorrectionUtils utils;
-
-  AstNode node;
-
-  FlutterCorrections(
-      {@required this.resolveResult,
-      @required this.selectionOffset,
-      @required this.selectionLength})
-      : assert(resolveResult != null),
-        assert(selectionOffset != null),
-        assert(selectionLength != null),
-        selectionEnd = selectionOffset + selectionLength,
-        utils = CorrectionUtils(resolveResult) {
-    node = NodeLocator(selectionOffset, selectionEnd)
-        .searchWithin(resolveResult.unit);
-  }
-
-  /// Returns the EOL to use for this [CompilationUnit].
-  String get eol => utils.endOfLine;
-}
diff --git a/pkg/analysis_server/lib/src/protocol/protocol_internal.dart b/pkg/analysis_server/lib/src/protocol/protocol_internal.dart
index c7c93b7..17d4837 100644
--- a/pkg/analysis_server/lib/src/protocol/protocol_internal.dart
+++ b/pkg/analysis_server/lib/src/protocol/protocol_internal.dart
@@ -17,42 +17,6 @@
 final Map<String, RefactoringKind> REQUEST_ID_REFACTORING_KINDS =
     HashMap<String, RefactoringKind>();
 
-/// Adds the given [sourceEdits] to the list in [sourceFileEdit].
-void addAllEditsForSource(
-    SourceFileEdit sourceFileEdit, Iterable<SourceEdit> edits) {
-  edits.forEach(sourceFileEdit.add);
-}
-
-/// Adds the given [sourceEdit] to the list in [sourceFileEdit].
-void addEditForSource(SourceFileEdit sourceFileEdit, SourceEdit sourceEdit) {
-  var edits = sourceFileEdit.edits;
-  var index = 0;
-  while (index < edits.length && edits[index].offset > sourceEdit.offset) {
-    index++;
-  }
-  edits.insert(index, sourceEdit);
-}
-
-/// Adds [edit] to the [FileEdit] for the given [file].
-void addEditToSourceChange(
-    SourceChange change, String file, int fileStamp, SourceEdit edit) {
-  var fileEdit = change.getFileEdit(file);
-  if (fileEdit == null) {
-    fileEdit = SourceFileEdit(file, fileStamp);
-    change.addFileEdit(fileEdit);
-  }
-  fileEdit.add(edit);
-}
-
-/// Get the result of applying the edit to the given [code].  Access via
-/// SourceEdit.apply().
-String applyEdit(String code, SourceEdit edit) {
-  if (edit.length < 0) {
-    throw RangeError('length is negative');
-  }
-  return code.replaceRange(edit.offset, edit.end, edit.replacement);
-}
-
 /// Get the result of applying a set of [edits] to the given [code].  Edits
 /// are applied in the order they appear in [edits].  Access via
 /// SourceEdit.applySequence().
@@ -63,16 +27,6 @@
   return code;
 }
 
-/// Returns the [FileEdit] for the given [file], maybe `null`.
-SourceFileEdit getChangeFileEdit(SourceChange change, String file) {
-  for (var fileEdit in change.edits) {
-    if (fileEdit.file == file) {
-      return fileEdit;
-    }
-  }
-  return null;
-}
-
 /// Compare the lists [listA] and [listB], using [itemEqual] to compare
 /// list elements.
 bool listEqual<T1, T2>(
@@ -141,28 +95,6 @@
   return result;
 }
 
-RefactoringProblemSeverity maxRefactoringProblemSeverity(
-    RefactoringProblemSeverity a, RefactoringProblemSeverity b) {
-  if (b == null) {
-    return a;
-  }
-  if (a == null) {
-    return b;
-  } else if (a == RefactoringProblemSeverity.INFO) {
-    return b;
-  } else if (a == RefactoringProblemSeverity.WARNING) {
-    if (b == RefactoringProblemSeverity.ERROR ||
-        b == RefactoringProblemSeverity.FATAL) {
-      return b;
-    }
-  } else if (a == RefactoringProblemSeverity.ERROR) {
-    if (b == RefactoringProblemSeverity.FATAL) {
-      return b;
-    }
-  }
-  return a;
-}
-
 /// Create a [RefactoringFeedback] corresponding the given [kind].
 RefactoringFeedback refactoringFeedbackFromJson(
     JsonDecoder jsonDecoder, String jsonPath, Object json, Map feedbackJson) {
@@ -212,11 +144,6 @@
   return null;
 }
 
-/// Type of callbacks used to decode parts of JSON objects.  [jsonPath] is a
-/// string describing the part of the JSON object being decoded, and [value] is
-/// the part to decode.
-typedef JsonDecoderCallback<E> = E Function(String jsonPath, Object value);
-
 /// Instances of the class [HasToJson] implement [toJson] method that returns
 /// a JSON presentation.
 abstract class HasToJson {
diff --git a/pkg/analysis_server/lib/src/provisional/completion/completion_core.dart b/pkg/analysis_server/lib/src/provisional/completion/completion_core.dart
index 88b348e..7f3c747 100644
--- a/pkg/analysis_server/lib/src/provisional/completion/completion_core.dart
+++ b/pkg/analysis_server/lib/src/provisional/completion/completion_core.dart
@@ -5,7 +5,6 @@
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer_plugin/protocol/protocol_common.dart';
 
 /// [AbortCompletion] is thrown when the current completion request
 /// should be aborted because either
@@ -13,17 +12,6 @@
 /// a new completion request was received.
 class AbortCompletion {}
 
-/// An object used to produce completions at a specific location within a file.
-///
-/// Clients may implement this class when implementing plugins.
-abstract class CompletionContributor {
-  /// Return a [Future] that completes with a list of suggestions
-  /// for the given completion [request]. This will
-  /// throw [AbortCompletion] if the completion request has been aborted.
-  Future<List<CompletionSuggestion>> computeSuggestions(
-      CompletionRequest request);
-}
-
 /// The information about a requested list of completions.
 ///
 /// Clients may not extend, implement or mix-in this class.
diff --git a/pkg/analysis_server/lib/src/server/crash_reporting.dart b/pkg/analysis_server/lib/src/server/crash_reporting.dart
index c76bba4..4849825 100644
--- a/pkg/analysis_server/lib/src/server/crash_reporting.dart
+++ b/pkg/analysis_server/lib/src/server/crash_reporting.dart
@@ -17,7 +17,7 @@
   @override
   void logException(dynamic exception,
       [StackTrace stackTrace,
-      List<InstrumentationServiceAttachment> attachments]) {
+      List<InstrumentationServiceAttachment> attachments = const []]) {
     var crashReportAttachments = (attachments ?? []).map((e) {
       return CrashReportAttachment.string(
         field: 'attachment_${e.id}',
diff --git a/pkg/analysis_server/lib/src/server/error_notifier.dart b/pkg/analysis_server/lib/src/server/error_notifier.dart
index 1b911cf..a69f1f0 100644
--- a/pkg/analysis_server/lib/src/server/error_notifier.dart
+++ b/pkg/analysis_server/lib/src/server/error_notifier.dart
@@ -10,7 +10,7 @@
   @override
   void logException(dynamic exception,
       [StackTrace stackTrace,
-      List<InstrumentationServiceAttachment> attachments]) {
+      List<InstrumentationServiceAttachment> attachments = const []]) {
     if (exception is SilentException) {
       // Silent exceptions should not be reported to the user.
       return;
@@ -34,6 +34,6 @@
 /// Server may throw a [FatalException] to send a fatal error response to the
 /// IDEs.
 class FatalException extends CaughtException {
-  FatalException(String message, Object exception, stackTrace)
+  FatalException(String message, Object exception, StackTrace stackTrace)
       : super.withMessage(message, exception, stackTrace);
 }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/completion_ranking_internal.dart b/pkg/analysis_server/lib/src/services/completion/dart/completion_ranking_internal.dart
index 0c53e90..c853976 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/completion_ranking_internal.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/completion_ranking_internal.dart
@@ -5,8 +5,6 @@
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart';
 import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
-import 'package:analysis_server/src/services/correction/util.dart';
-import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 
 /// Fuzzy matching between static analysis and model-predicted lexemes
@@ -64,23 +62,6 @@
   return result.reversed.toList(growable: false);
 }
 
-/// Constructs a [CompletionSuggestion] object.
-CompletionSuggestion createCompletionSuggestion(
-    String completion, FeatureSet featureSet, int relevance) {
-  final tokens = TokenUtils.getTokens(completion, featureSet);
-  final token = tokens.isNotEmpty ? tokens[0] : null;
-  final completionKind = token != null && token.isKeyword
-      ? CompletionSuggestionKind.KEYWORD
-      : CompletionSuggestionKind.IDENTIFIER;
-  if (isLiteral(completion) &&
-      (completion.startsWith('"package:') ||
-          completion.startsWith('\'package:'))) {
-    completion = completion.replaceAll('\'', '').replaceAll('\"', '');
-  }
-  return CompletionSuggestion(completionKind, relevance, completion,
-      completion.length, 0, false, false);
-}
-
 /// Maps included relevance tags formatted as
 /// '${element.librarySource.uri}::${element.name}' to element.name.
 String elementNameFromRelevanceTag(String tag) {
@@ -173,32 +154,6 @@
       .toList();
 }
 
-bool testFollowingDot(DartCompletionRequest request) {
-  final token = getCurrentToken(request);
-  return isTokenDot(token) || isTokenDot(token.previous);
-}
-
-bool testInsideQuotes(DartCompletionRequest request) {
-  final token = getCurrentToken(request);
-  if (token == null || token.isSynthetic) {
-    return false;
-  }
-
-  final cursorOffset = request.offset;
-  if (cursorOffset == token.offset ||
-      cursorOffset == token.offset + token.length) {
-    // We are not inside the current token, quoted or otherwise.
-    return false;
-  }
-
-  final lexeme = token.lexeme;
-  if (lexeme.length > 2 && lexeme[0] == 'r') {
-    return lexeme[1] == "'" || lexeme[1] == '"';
-  }
-
-  return lexeme.length > 1 && (lexeme[0] == "'" || lexeme[0] == '"');
-}
-
 /// Tests whether all completion suggestions are for named arguments.
 bool testNamedArgument(List<CompletionSuggestion> suggestions) {
   if (suggestions == null) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart
index 5d17ae8..f127ec1 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart
@@ -74,7 +74,7 @@
       }
     }
     if (expression is ExtensionOverride) {
-      _addInstanceMembers(expression.staticElement, -1.0);
+      _addInstanceMembers(expression.staticElement, 0.0);
     } else {
       var type = expression.staticType;
       if (type == null) {
@@ -96,12 +96,10 @@
       var extendedType =
           _resolveExtendedType(containingLibrary, extension, type);
       if (extendedType != null && typeSystem.isSubtypeOf(type, extendedType)) {
-        double inheritanceDistance;
+        var inheritanceDistance = 0.0;
         if (type is InterfaceType && extendedType is InterfaceType) {
           inheritanceDistance = memberBuilder.request.featureComputer
               .inheritanceDistanceFeature(type.element, extendedType.element);
-        } else {
-          inheritanceDistance = -1;
         }
         // TODO(brianwilkerson) We might want to apply the substitution to the
         //  members of the extension for display purposes.
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart b/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart
index bb8262f..6461fbf 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart
@@ -10,6 +10,7 @@
     show ElementKind;
 import 'package:analysis_server/src/services/completion/dart/relevance_tables.g.dart';
 import 'package:analysis_server/src/utilities/extensions/element.dart';
+import 'package:analysis_server/src/utilities/extensions/numeric.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
@@ -65,20 +66,56 @@
 }
 
 /// Convert a relevance score (assumed to be between `0.0` and `1.0` inclusive)
-/// to a relevance value between `0` and `1000`. If the score is outside that
-/// range, return the [defaultValue].
-int toRelevance(double score, int defaultValue) {
-  if (score < 0.0 || score > 1.0) {
-    return defaultValue;
-  }
+/// to a relevance value between `0` and `1000`.
+int toRelevance(double score) {
+  assert(score.between(0.0, 1.0));
   return (score * 1000).truncate();
 }
 
+/// Return the weighted average of the given values, applying some constant and
+/// predetermined weights.
+double weightedAverage(
+    {double contextType = 0.0,
+    double elementKind = 0.0,
+    double hasDeprecated = 0.0,
+    double inheritanceDistance = 0.0,
+    double isConstant = 0.0,
+    double localVariableDistance = 0.0,
+    double startsWithDollar = 0.0,
+    double superMatches = 0.0}) {
+  assert(contextType.between(0.0, 1.0));
+  assert(elementKind.between(0.0, 1.0));
+  assert(hasDeprecated.between(-1.0, 0.0));
+  assert(inheritanceDistance.between(0.0, 1.0));
+  assert(isConstant.between(0.0, 1.0));
+  assert(localVariableDistance.between(0.0, 1.0));
+  assert(startsWithDollar.between(-1.0, 0.0));
+  assert(superMatches.between(0.0, 1.0));
+  var average = _weightedAverage([
+    contextType,
+    elementKind,
+    hasDeprecated,
+    inheritanceDistance,
+    isConstant,
+    localVariableDistance,
+    startsWithDollar,
+    superMatches,
+  ], [
+    1.00, // contextType
+    1.00, // elementKind
+    0.50, // hasDeprecated
+    1.00, // inheritanceDistance
+    1.00, // isConstant
+    1.00, // localVariableDistance
+    0.50, // startsWithDollar
+    1.00, // superMatches
+  ]);
+  return (average + 1.0) / 2.0;
+}
+
 /// Return the weighted average of the given [values], applying the given
 /// [weights]. The number of weights must be equal to the number of values.
-/// Values less than `0.0` are ignored. If there are no non-negative values then
-/// a negative value will be returned.
-double weightedAverage(List<double> values, List<double> weights) {
+double _weightedAverage(List<double> values, List<double> weights) {
   assert(values.length == weights.length);
   var totalValue = 0.0;
   var totalWeight = 0.0;
@@ -86,12 +123,7 @@
     var value = values[i];
     var weight = weights[i];
     totalWeight += weight;
-    if (value >= 0.0) {
-      totalValue += value * weight;
-    }
-  }
-  if (totalWeight == 0.0) {
-    return -1.0;
+    totalValue += value * weight;
   }
   return totalValue / totalWeight;
 }
@@ -175,7 +207,7 @@
   double contextTypeFeature(DartType contextType, DartType elementType) {
     if (contextType == null || elementType == null) {
       // Disable the feature if we don't have both types.
-      return -1.0;
+      return 0.0;
     }
     if (elementType == contextType) {
       // Exact match.
@@ -198,11 +230,11 @@
   double elementKindFeature(Element element, String completionLocation,
       {int distance}) {
     if (completionLocation == null) {
-      return -1.0;
+      return 0.0;
     }
     var locationTable = elementKindRelevance[completionLocation];
     if (locationTable == null) {
-      return -1.0;
+      return 0.0;
     }
     var range = locationTable[computeElementKind(element)];
     if (range == null) {
@@ -216,7 +248,7 @@
 
   /// Return the value of the _has deprecated_ feature for the given [element].
   double hasDeprecatedFeature(Element element) {
-    return element.hasOrInheritsDeprecated ? 0.0 : 1.0;
+    return element.hasOrInheritsDeprecated ? -1.0 : 0.0;
   }
 
   /// Return the inheritance distance between the [subclass] and the
@@ -261,11 +293,11 @@
   /// completing at the given [completionLocation].
   double keywordFeature(String keyword, String completionLocation) {
     if (completionLocation == null) {
-      return -1.0;
+      return 0.0;
     }
     var locationTable = keywordRelevance[completionLocation];
     if (locationTable == null) {
-      return -1.0;
+      return 0.0;
     }
     var range = locationTable[keyword];
     if (range == null) {
@@ -366,21 +398,22 @@
   }
 
   /// Return the value of the _starts with dollar_ feature.
-  double startsWithDollarFeature(String name) =>
-      name.startsWith('\$') ? 0.0 : 1.0;
+  double startsWithDollarFeature(String name) {
+    return name.startsWith('\$') ? -1.0 : 0.0;
+  }
 
   /// Return the value of the _super matches_ feature.
   double superMatchesFeature(
           String containingMethodName, String proposedMemberName) =>
       containingMethodName == null
-          ? -1.0
+          ? 0.0
           : (proposedMemberName == containingMethodName ? 1.0 : 0.0);
 
   /// Convert a [distance] to a percentage value and return the percentage. If
-  /// the [distance] is negative, return `-1.0`.
+  /// the [distance] is negative, return `0.0`.
   double _distanceToPercent(int distance) {
     if (distance < 0) {
-      return -1.0;
+      return 0.0;
     }
     return math.pow(0.98, distance);
   }
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 32e454f..df8ec96 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
@@ -112,7 +112,7 @@
     if (opType.includeReturnValueSuggestions) {
       var parent = element.enclosingElement;
       if (parent is ClassElement || parent is ExtensionElement) {
-        builder.suggestAccessor(element, inheritanceDistance: -1.0);
+        builder.suggestAccessor(element, inheritanceDistance: 0.0);
       } else {
         builder.suggestTopLevelPropertyAccessor(element, prefix: prefix);
       }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
index 53fed10..d92cc04 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
@@ -270,7 +270,7 @@
             opType.includeReturnValueSuggestions &&
             (!opType.inStaticMethodBody || fieldDecl.isStatic)) ||
         suggestLocalFields) {
-      var inheritanceDistance = -1.0;
+      var inheritanceDistance = 0.0;
       var enclosingClass = request.target.containingNode
           .thisOrAncestorOfType<ClassDeclaration>();
       if (enclosingClass != null) {
@@ -341,7 +341,7 @@
         (opType.includeReturnValueSuggestions ||
             opType.includeVoidReturnSuggestions) &&
         (!opType.inStaticMethodBody || declaration.isStatic)) {
-      var inheritanceDistance = -1.0;
+      var inheritanceDistance = 0.0;
       var enclosingClass = request.target.containingNode
           .thisOrAncestorOfType<ClassDeclaration>();
       if (enclosingClass != null) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart
index 5c33b59..102365e 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart
@@ -36,7 +36,7 @@
           if (accessor.isStatic &&
               !accessor.isSynthetic &&
               isVisible(accessor)) {
-            builder.suggestAccessor(accessor, inheritanceDistance: -1.0);
+            builder.suggestAccessor(accessor, inheritanceDistance: 0.0);
           }
         }
         for (var constructor in element.constructors) {
@@ -48,12 +48,12 @@
           if (field.isStatic &&
               (!field.isSynthetic || element.isEnum) &&
               isVisible(field)) {
-            builder.suggestField(field, inheritanceDistance: -1.0);
+            builder.suggestField(field, inheritanceDistance: 0.0);
           }
         }
         for (var method in element.methods) {
           if (method.isStatic && isVisible(method)) {
-            builder.suggestMethod(method, inheritanceDistance: -1.0);
+            builder.suggestMethod(method, inheritanceDistance: 0.0);
           }
         }
       } else if (element is ExtensionElement) {
@@ -61,17 +61,17 @@
           if (accessor.isStatic &&
               !accessor.isSynthetic &&
               isVisible(accessor)) {
-            builder.suggestAccessor(accessor, inheritanceDistance: -1.0);
+            builder.suggestAccessor(accessor, inheritanceDistance: 0.0);
           }
         }
         for (var field in element.fields) {
           if (field.isStatic && !field.isSynthetic && isVisible(field)) {
-            builder.suggestField(field, inheritanceDistance: -1.0);
+            builder.suggestField(field, inheritanceDistance: 0.0);
           }
         }
         for (var method in element.methods) {
           if (method.isStatic && isVisible(method)) {
-            builder.suggestMethod(method, inheritanceDistance: -1.0);
+            builder.suggestMethod(method, inheritanceDistance: 0.0);
           }
         }
       }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
index 276c615..edc41bb 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
@@ -222,7 +222,7 @@
       var hasDeprecated = featureComputer.hasDeprecatedFeature(accessor);
       var isConstant = request.inConstantContext
           ? featureComputer.isConstantFeature(accessor)
-          : -1.0;
+          : 0.0;
       var startsWithDollar =
           featureComputer.startsWithDollarFeature(accessor.name);
       var superMatches = featureComputer.superMatchesFeature(
@@ -240,6 +240,7 @@
           elementKind: elementKind,
           hasDeprecated: hasDeprecated,
           inheritanceDistance: inheritanceDistance,
+          isConstant: isConstant,
           startsWithDollar: startsWithDollar,
           superMatches: superMatches);
       _add(_createSuggestion(accessor, relevance: relevance));
@@ -254,12 +255,16 @@
     var elementKind = _computeElementKind(parameter);
     var isConstant = request.inConstantContext
         ? request.featureComputer.isConstantFeature(parameter)
-        : -1.0;
-    var relevance = toRelevance(
-        weightedAverage(
-            [contextType, elementKind, isConstant], [1.0, 1.0, 1.0]),
-        800);
-    listener?.computedFeatures(contextType: contextType);
+        : 0.0;
+    var score = weightedAverage(
+        contextType: contextType,
+        elementKind: elementKind,
+        isConstant: isConstant);
+    var relevance = toRelevance(score);
+    listener?.computedFeatures(
+        contextType: contextType,
+        elementKind: elementKind,
+        isConstant: isConstant);
     _add(_createSuggestion(parameter,
         elementKind: protocol.ElementKind.PARAMETER, relevance: relevance));
   }
@@ -431,7 +436,7 @@
     var hasDeprecated = featureComputer.hasDeprecatedFeature(field);
     var isConstant = request.inConstantContext
         ? featureComputer.isConstantFeature(field)
-        : -1.0;
+        : 0.0;
     var startsWithDollar = featureComputer.startsWithDollarFeature(field.name);
     var superMatches =
         featureComputer.superMatchesFeature(_containingMemberName, field.name);
@@ -448,6 +453,7 @@
         elementKind: elementKind,
         hasDeprecated: hasDeprecated,
         inheritanceDistance: inheritanceDistance,
+        isConstant: isConstant,
         startsWithDollar: startsWithDollar,
         superMatches: superMatches);
     _add(_createSuggestion(field, relevance: relevance));
@@ -490,11 +496,11 @@
   /// Add a suggestion for a [keyword]. The [offset] is the offset from the
   /// beginning of the keyword where the cursor will be left.
   void suggestKeyword(String keyword, {int offset}) {
+    var keywordFeature = request.featureComputer
+        .keywordFeature(keyword, request.opType.completionLocation);
     // TODO(brianwilkerson) The default value should probably be a constant.
-    var relevance = toRelevance(
-        request.featureComputer
-            .keywordFeature(keyword, request.opType.completionLocation),
-        800);
+    var relevance = toRelevance(keywordFeature);
+    listener?.computedFeatures(keyword: keywordFeature);
     _add(CompletionSuggestion(CompletionSuggestionKind.KEYWORD, relevance,
         keyword, offset ?? keyword.length, 0, false, false));
   }
@@ -526,20 +532,28 @@
   /// Add a suggestion for a local [variable].
   void suggestLocalVariable(LocalVariableElement variable) {
     var variableType = variable.type;
+    var target = request.target;
+    var entity = target.entity;
+    var node = entity is AstNode ? entity : target.containingNode;
     var contextType = request.featureComputer
         .contextTypeFeature(request.contextType, variableType);
     var elementKind = _computeElementKind(variable);
     var isConstant = request.inConstantContext
         ? request.featureComputer.isConstantFeature(variable)
-        : -1.0;
-    var localVariableDistance = request.featureComputer
-        .localVariableDistanceFeature(request.target.containingNode, variable);
-    var relevance = toRelevance(
-        weightedAverage(
-            [contextType, elementKind, isConstant, localVariableDistance],
-            [1.0, 1.0, 1.0, 1.0]),
-        800);
-    listener?.computedFeatures(contextType: contextType);
+        : 0.0;
+    var localVariableDistance =
+        request.featureComputer.localVariableDistanceFeature(node, variable);
+    var score = weightedAverage(
+        contextType: contextType,
+        elementKind: elementKind,
+        isConstant: isConstant,
+        localVariableDistance: localVariableDistance);
+    var relevance = toRelevance(score);
+    listener?.computedFeatures(
+        contextType: contextType,
+        elementKind: elementKind,
+        isConstant: isConstant,
+        localVariableDistance: localVariableDistance);
     _add(_createSuggestion(variable, relevance: relevance));
   }
 
@@ -560,7 +574,7 @@
     var hasDeprecated = featureComputer.hasDeprecatedFeature(method);
     var isConstant = request.inConstantContext
         ? featureComputer.isConstantFeature(method)
-        : -1.0;
+        : 0.0;
     var startsWithDollar = featureComputer.startsWithDollarFeature(method.name);
     var superMatches =
         featureComputer.superMatchesFeature(_containingMemberName, method.name);
@@ -577,6 +591,7 @@
         elementKind: elementKind,
         hasDeprecated: hasDeprecated,
         inheritanceDistance: inheritanceDistance,
+        isConstant: isConstant,
         startsWithDollar: startsWithDollar,
         superMatches: superMatches);
 
@@ -752,12 +767,16 @@
     var elementKind = _computeElementKind(parameter);
     var isConstant = request.inConstantContext
         ? request.featureComputer.isConstantFeature(parameter)
-        : -1.0;
-    var relevance = toRelevance(
-        weightedAverage(
-            [contextType, elementKind, isConstant], [1.0, 1.0, 1.0]),
-        800);
-    listener?.computedFeatures(contextType: contextType);
+        : 0.0;
+    var score = weightedAverage(
+        contextType: contextType,
+        elementKind: elementKind,
+        isConstant: isConstant);
+    var relevance = toRelevance(score);
+    listener?.computedFeatures(
+        contextType: contextType,
+        elementKind: elementKind,
+        isConstant: isConstant);
     _add(_createSuggestion(parameter, relevance: relevance));
   }
 
@@ -767,7 +786,8 @@
     // TODO(brianwilkerson) If we are in a constant context it would be nice
     //  to promote prefixes for libraries that define constants, but that
     //  might be more work than it's worth.
-    var relevance = toRelevance(elementKind, Relevance.prefix);
+    var score = weightedAverage(elementKind: elementKind);
+    var relevance = toRelevance(score);
     listener?.computedFeatures(elementKind: elementKind);
     _add(_createSuggestion(library,
         completion: prefix,
@@ -815,24 +835,29 @@
           featureComputer.contextTypeFeature(request.contextType, type);
       var elementKind = _computeElementKind(accessor);
       var hasDeprecated = featureComputer.hasDeprecatedFeature(accessor);
+      var inheritanceDistance = 0.0;
       var isConstant = request.inConstantContext
           ? featureComputer.isConstantFeature(accessor)
-          : -1.0;
+          : 0.0;
       var startsWithDollar =
           featureComputer.startsWithDollarFeature(accessor.name);
+      var superMatches = 0.0;
       var relevance = _computeMemberRelevance(
           contextType: contextType,
           elementKind: elementKind,
           hasDeprecated: hasDeprecated,
-          inheritanceDistance: -1.0,
+          inheritanceDistance: inheritanceDistance,
           isConstant: isConstant,
           startsWithDollar: startsWithDollar,
-          superMatches: -1.0);
+          superMatches: superMatches);
       listener?.computedFeatures(
           contextType: contextType,
           elementKind: elementKind,
           hasDeprecated: hasDeprecated,
-          startsWithDollar: startsWithDollar);
+          inheritanceDistance: inheritanceDistance,
+          isConstant: isConstant,
+          startsWithDollar: startsWithDollar,
+          superMatches: superMatches);
       _add(_createSuggestion(accessor, prefix: prefix, relevance: relevance));
     }
   }
@@ -857,7 +882,7 @@
       {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
       String prefix}) {
     var relevance = _computeTopLevelRelevance(typeAlias,
-        defaultRelevance: 750, elementType: _instantiateTypeAlias(typeAlias));
+        elementType: _instantiateTypeAlias(typeAlias));
     _add(_createSuggestion(typeAlias,
         kind: kind, prefix: prefix, relevance: relevance));
   }
@@ -867,11 +892,12 @@
     var elementKind = _computeElementKind(parameter);
     var isConstant = request.inConstantContext
         ? request.featureComputer.isConstantFeature(parameter)
-        : -1.0;
-    var relevance = toRelevance(
-        weightedAverage([elementKind, isConstant], [1.0, 1.0]),
-        Relevance.typeParameter);
-    listener?.computedFeatures(elementKind: elementKind);
+        : 0.0;
+    var score =
+        weightedAverage(elementKind: elementKind, isConstant: isConstant);
+    var relevance = toRelevance(score);
+    listener?.computedFeatures(
+        elementKind: elementKind, isConstant: isConstant);
     _add(_createSuggestion(parameter,
         kind: CompletionSuggestionKind.IDENTIFIER, relevance: relevance));
   }
@@ -936,29 +962,20 @@
       @required double isConstant,
       @required double startsWithDollar,
       @required double superMatches}) {
-    var score = weightedAverage([
-      contextType,
-      elementKind,
-      hasDeprecated,
-      inheritanceDistance,
-      isConstant,
-      startsWithDollar,
-      superMatches
-    ], [
-      1.00, // contextType
-      0.75, // elementKind
-      0.50, // hasDeprecated
-      1.00, // inheritanceDistance
-      1.00, // isConstant
-      0.50, // startsWithDollar
-      1.00, // superMatches
-    ]);
-    return toRelevance(score, Relevance.member);
+    var score = weightedAverage(
+        contextType: contextType,
+        elementKind: elementKind,
+        hasDeprecated: hasDeprecated,
+        inheritanceDistance: inheritanceDistance,
+        isConstant: isConstant,
+        startsWithDollar: startsWithDollar,
+        superMatches: superMatches);
+    return toRelevance(score);
   }
 
   /// Return the relevance score for a top-level [element].
   int _computeTopLevelRelevance(Element element,
-      {int defaultRelevance = 800, @required DartType elementType}) {
+      {@required DartType elementType}) {
     // TODO(brianwilkerson) The old relevance computation used a signal based
     //  on whether the element being suggested was from the same library in
     //  which completion is being performed. Explore whether that's a useful
@@ -970,15 +987,18 @@
     var hasDeprecated = featureComputer.hasDeprecatedFeature(element);
     var isConstant = request.inConstantContext
         ? featureComputer.isConstantFeature(element)
-        : -1.0;
-    var relevance = toRelevance(
-        weightedAverage([contextType, elementKind, hasDeprecated, isConstant],
-            [1.0, 0.75, 0.2, 1.0]),
-        defaultRelevance);
+        : 0.0;
+    var score = weightedAverage(
+        contextType: contextType,
+        elementKind: elementKind,
+        hasDeprecated: hasDeprecated,
+        isConstant: isConstant);
+    var relevance = toRelevance(score);
     listener?.computedFeatures(
         contextType: contextType,
         elementKind: elementKind,
-        hasDeprecated: hasDeprecated);
+        hasDeprecated: hasDeprecated,
+        isConstant: isConstant);
     return relevance;
   }
 
@@ -1117,14 +1137,16 @@
   void builtSuggestion(protocol.CompletionSuggestion suggestion);
 
   /// Invoked with the values of the features that were computed in the process
-  /// of building a suggestion. This method is only invoked when using the new
-  /// relevance computations. If invoked, it is invoked prior to invoking
+  /// of building a suggestion. This method is invoked prior to invoking
   /// [builtSuggestion].
   void computedFeatures(
       {double contextType,
       double elementKind,
       double hasDeprecated,
       double inheritanceDistance,
+      double isConstant,
+      double keyword,
+      double localVariableDistance,
       double startsWithDollar,
       double superMatches});
 
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 3a3c9ae..5eaa1c5 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
@@ -220,19 +220,6 @@
   }
 }
 
-/// Return `true` if the @deprecated annotation is present on the given [node].
-bool isDeprecated(AnnotatedNode node) {
-  if (node != null) {
-    var metadata = node.metadata;
-    if (metadata != null) {
-      return metadata.any((Annotation a) {
-        return a.name is SimpleIdentifier && a.name.name == 'deprecated';
-      });
-    }
-  }
-  return false;
-}
-
 /// Return name of the type of the given [identifier], or, if it unresolved, the
 /// name of its declared [declaredType].
 String nameForType(SimpleIdentifier identifier, TypeAnnotation declaredType) {
diff --git a/pkg/analysis_server/lib/src/services/correction/util.dart b/pkg/analysis_server/lib/src/services/correction/util.dart
index 46b3f03..b9a8e93 100644
--- a/pkg/analysis_server/lib/src/services/correction/util.dart
+++ b/pkg/analysis_server/lib/src/services/correction/util.dart
@@ -164,16 +164,6 @@
   return ranges;
 }
 
-/// Return the given [element] if it is a [CompilationUnitElement].
-/// Return the enclosing [CompilationUnitElement] of the given [element],
-/// maybe `null`.
-CompilationUnitElement getCompilationUnitElement(Element element) {
-  if (element is CompilationUnitElement) {
-    return element;
-  }
-  return element.thisOrAncestorOfType();
-}
-
 String getDefaultValueCode(DartType type) {
   if (type != null) {
     if (type.isDartCoreBool) {
diff --git a/pkg/analysis_server/lib/src/services/flutter/class_description.dart b/pkg/analysis_server/lib/src/services/flutter/class_description.dart
index 5ab9dca..f3b8a83 100644
--- a/pkg/analysis_server/lib/src/services/flutter/class_description.dart
+++ b/pkg/analysis_server/lib/src/services/flutter/class_description.dart
@@ -21,17 +21,9 @@
   final ClassElement element;
   final ConstructorElement constructor;
 
-  /// Mapping from a parameter to the default code for the corresponding
-  /// argument in a new instance creation that calls the [constructor].
-  ///
-  /// TODO(scheglov) Should be a generator, not just [String].
-  /// In general case we might need to import some libraries.
-  final Map<ParameterElement, String> parameterToDefaultCode;
-
   ClassDescription(
     this.element,
     this.constructor,
-    this.parameterToDefaultCode,
   );
 }
 
@@ -71,16 +63,13 @@
     var constructor = element.unnamedConstructor;
     if (constructor == null) return null;
 
-    var parameters = constructor.parameters;
-    var defaultValueMap = <ParameterElement, String>{};
-
-    for (var parameter in parameters) {
+    for (var parameter in constructor.parameters) {
       if (parameter.isNotOptional || parameter.hasRequired) {
         return null;
       }
     }
 
-    return ClassDescription(element, constructor, defaultValueMap);
+    return ClassDescription(element, constructor);
   }
 
   bool _isOptedInClass(ClassElement element) {
diff --git a/pkg/analysis_server/lib/src/utilities/extensions/numeric.dart b/pkg/analysis_server/lib/src/utilities/extensions/numeric.dart
new file mode 100644
index 0000000..005763f
--- /dev/null
+++ b/pkg/analysis_server/lib/src/utilities/extensions/numeric.dart
@@ -0,0 +1,9 @@
+// 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.
+
+extension DoubleExtensions on double {
+  /// Return `true` if this value is between the [lower] and [upper] bound,
+  /// inclusive.
+  bool between(double lower, double upper) => lower <= this && this <= upper;
+}
diff --git a/pkg/analysis_server/test/analysis/get_hover_test.dart b/pkg/analysis_server/test/analysis/get_hover_test.dart
index 060a52a..d1133a8 100644
--- a/pkg/analysis_server/test/analysis/get_hover_test.dart
+++ b/pkg/analysis_server/test/analysis/get_hover_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/protocol/protocol_generated.dart';
+import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -16,7 +17,8 @@
 }
 
 @reflectiveTest
-class AnalysisHoverTest extends AbstractAnalysisTest {
+class AnalysisHoverTest extends AbstractAnalysisTest
+    with WithNonFunctionTypeAliasesMixin {
   Future<HoverInformation> prepareHover(String search) {
     var offset = findOffset(search);
     return prepareHoverAt(offset);
@@ -829,4 +831,59 @@
     expect(hover.elementDescription, 'void set foo(int x)');
     expect(hover.elementKind, 'setter');
   }
+
+  Future<void> test_simpleIdentifier_typedef_functionType() async {
+    addTestFile('''
+typedef A = void Function(int);
+''');
+    var hover = await prepareHover('A');
+    _assertHover(
+      hover,
+      elementDescription: 'typedef A = void Function(int )',
+      elementKind: 'type alias',
+    );
+  }
+
+  Future<void> test_simpleIdentifier_typedef_interfaceType() async {
+    addTestFile('''
+typedef A = Map<int, String>;
+''');
+    var hover = await prepareHover('A');
+    _assertHover(
+      hover,
+      elementDescription: 'typedef A = Map<int, String>',
+      elementKind: 'type alias',
+    );
+  }
+
+  Future<void> test_simpleIdentifier_typedef_legacy() async {
+    addTestFile('''
+typedef void A(int a);
+''');
+    var hover = await prepareHover('A');
+    _assertHover(
+      hover,
+      elementDescription: 'typedef A = void Function(int a)',
+      elementKind: 'type alias',
+    );
+  }
+
+  void _assertHover(
+    HoverInformation hover, {
+    String containingLibraryPath,
+    String containingLibraryName,
+    @required String elementDescription,
+    @required String elementKind,
+    bool isDeprecated = false,
+  }) {
+    containingLibraryName ??= 'bin/test.dart';
+    expect(hover.containingLibraryName, containingLibraryName);
+
+    containingLibraryPath ??= testFile;
+    expect(hover.containingLibraryPath, containingLibraryPath);
+
+    expect(hover.elementDescription, elementDescription);
+    expect(hover.elementKind, elementKind);
+    expect(hover.isDeprecated, isDeprecated);
+  }
 }
diff --git a/pkg/analysis_server/test/context_manager_test.dart b/pkg/analysis_server/test/context_manager_test.dart
index fea3b43..1dd7834 100644
--- a/pkg/analysis_server/test/context_manager_test.dart
+++ b/pkg/analysis_server/test/context_manager_test.dart
@@ -1533,18 +1533,18 @@
   String projPath;
 
   AnalysisError missing_return =
-      AnalysisError(null, 0, 1, HintCode.MISSING_RETURN, [
+      AnalysisError(_MockSource('test.dart'), 0, 1, HintCode.MISSING_RETURN, [
     ['x']
   ]);
 
-  AnalysisError invalid_assignment_error =
-      AnalysisError(null, 0, 1, CompileTimeErrorCode.INVALID_ASSIGNMENT, [
+  AnalysisError invalid_assignment_error = AnalysisError(
+      _MockSource('test.dart'), 0, 1, CompileTimeErrorCode.INVALID_ASSIGNMENT, [
     ['x'],
     ['y']
   ]);
 
-  AnalysisError unused_local_variable =
-      AnalysisError(null, 0, 1, HintCode.UNUSED_LOCAL_VARIABLE, [
+  AnalysisError unused_local_variable = AnalysisError(
+      _MockSource('test.dart'), 0, 1, HintCode.UNUSED_LOCAL_VARIABLE, [
     ['x']
   ]);
 
@@ -2382,3 +2382,15 @@
     lastFlushedFiles = flushedFiles;
   }
 }
+
+class _MockSource implements Source {
+  @override
+  final String fullName;
+
+  _MockSource(this.fullName);
+
+  @override
+  dynamic noSuchMethod(Invocation invocation) {
+    throw StateError('Unexpected invocation of ${invocation.memberName}');
+  }
+}
diff --git a/pkg/analysis_server/test/integration/analysis/get_errors_non_standard_sdk_test.dart b/pkg/analysis_server/test/integration/analysis/get_errors_non_standard_sdk_test.dart
index 0cf5684..e80f671 100644
--- a/pkg/analysis_server/test/integration/analysis/get_errors_non_standard_sdk_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_errors_non_standard_sdk_test.dart
@@ -55,14 +55,15 @@
 class Fake {} 
 ''');
 
-    var libsDir = path.join(
-      sdkPath,
-      'lib',
-      '_internal',
-      'sdk_library_metadata',
-      'lib',
-    );
+    var libsInternalDir = path.join(sdkPath, 'lib', '_internal');
+    Directory(libsInternalDir).createSync(recursive: true);
+
+    File(path.join(sdkPath, 'lib', '_internal', 'allowed_experiments.json'))
+        .writeAsStringSync('{}');
+
+    var libsDir = path.join(libsInternalDir, 'sdk_library_metadata', 'lib');
     Directory(libsDir).createSync(recursive: true);
+
     File(path.join(libsDir, 'libraries.dart')).writeAsStringSync(r'''
 final LIBRARIES = const <String, LibraryInfo> {
   "core":  const LibraryInfo("core/core.dart"),
diff --git a/pkg/analysis_server/test/mock_packages/.dart_tool/package_config.json b/pkg/analysis_server/test/mock_packages/.dart_tool/package_config.json
new file mode 100644
index 0000000..19affdb
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/.dart_tool/package_config.json
@@ -0,0 +1,35 @@
+{
+  "configVersion": 2,
+  "packages": [
+    {
+      "name": "flutter",
+      "rootUri": "../flutter",
+      "packageUri": "lib/",
+      "languageVersion": "2.9"
+    },
+    {
+      "name": "meta",
+      "rootUri": "../meta",
+      "packageUri": "lib/",
+      "languageVersion": "2.9"
+    },
+    {
+      "name": "pedantic",
+      "rootUri": "../pedantic",
+      "packageUri": "lib/",
+      "languageVersion": "2.9"
+    },
+    {
+      "name": "ui",
+      "rootUri": "../ui",
+      "packageUri": "lib/",
+      "languageVersion": "2.9"
+    },
+    {
+      "name": "vector_math",
+      "rootUri": "../vector_math",
+      "packageUri": "lib/",
+      "languageVersion": "2.9"
+    }
+  ]
+}
diff --git a/pkg/analysis_server/test/mock_packages/.packages b/pkg/analysis_server/test/mock_packages/.packages
deleted file mode 100644
index 08d79f7..0000000
--- a/pkg/analysis_server/test/mock_packages/.packages
+++ /dev/null
@@ -1,3 +0,0 @@
-flutter:flutter/lib
-meta:meta/lib
-ui:ui/lib
diff --git a/pkg/analysis_server/test/src/flutter/flutter_correction_test.dart b/pkg/analysis_server/test/src/flutter/flutter_correction_test.dart
deleted file mode 100644
index 3ab09de..0000000
--- a/pkg/analysis_server/test/src/flutter/flutter_correction_test.dart
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analysis_server/src/flutter/flutter_correction.dart';
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import '../../abstract_single_unit.dart';
-
-void main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(FlutterCorrectionTest);
-  });
-}
-
-@reflectiveTest
-class FlutterCorrectionTest extends AbstractSingleUnitTest {
-  int offset;
-  int length = 0;
-  FlutterCorrections corrections;
-
-  @override
-  int findOffset(String search) {
-    var offset = testCode.indexOf(search);
-    expect(offset, isNonNegative, reason: "Not found '$search' in\n$testCode");
-    return offset;
-  }
-
-  @override
-  void setUp() {
-    super.setUp();
-    writeTestPackageConfig(flutter: true);
-  }
-
-//  void _assertChange(SourceChange change, String expectedCode) {
-//    expect(change, isNotNull);
-//
-//    List<SourceFileEdit> files = change.edits;
-//    expect(files, hasLength(1));
-//    expect(files[0].file, testFile);
-//
-//    List<SourceEdit> fileEdits = files[0].edits;
-//    String resultCode = SourceEdit.applySequence(testCode, fileEdits);
-//    if (resultCode != expectedCode) {
-//      print(resultCode);
-//    }
-//    expect(resultCode, expectedCode);
-//  }
-//
-//  void _createCorrections() {
-//    corrections = new FlutterCorrections(
-//      resolveResult: testAnalysisResult,
-//      selectionOffset: offset,
-//      selectionLength: length,
-//    );
-//  }
-}
diff --git a/pkg/analysis_server/test/src/flutter/test_all.dart b/pkg/analysis_server/test/src/flutter/test_all.dart
index 66e99d6..48db007 100644
--- a/pkg/analysis_server/test/src/flutter/test_all.dart
+++ b/pkg/analysis_server/test/src/flutter/test_all.dart
@@ -4,13 +4,11 @@
 
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import 'flutter_correction_test.dart' as flutter_correction;
 import 'flutter_outline_computer_test.dart' as outline_computer;
 import 'flutter_outline_notification_test.dart' as outline_notification;
 
 void main() {
   defineReflectiveSuite(() {
-    flutter_correction.main();
     outline_computer.main();
     outline_notification.main();
   });
diff --git a/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart b/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart
index 3ac4dac..08c6c05 100644
--- a/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart
+++ b/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart
@@ -8,7 +8,6 @@
 import 'package:analysis_server/src/plugin/plugin_manager.dart';
 import 'package:analysis_server/src/plugin/plugin_watcher.dart';
 import 'package:analyzer/dart/analysis/results.dart';
-import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/context/context_root.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
@@ -112,8 +111,10 @@
 
   @override
   SourceFactory sourceFactory;
+
   @override
-  AnalysisSession currentSession;
+  AnalysisSessionImpl currentSession;
+
   @override
   AnalysisOptionsImpl analysisOptions = AnalysisOptionsImpl();
 
diff --git a/pkg/analysis_server/test/utils/test_instrumentation_service.dart b/pkg/analysis_server/test/utils/test_instrumentation_service.dart
index 4fd7157..f271860 100644
--- a/pkg/analysis_server/test/utils/test_instrumentation_service.dart
+++ b/pkg/analysis_server/test/utils/test_instrumentation_service.dart
@@ -11,7 +11,7 @@
   void logException(
     exception, [
     StackTrace stackTrace,
-    List<InstrumentationServiceAttachment> attachments,
+    List<InstrumentationServiceAttachment> attachments = const [],
   ]) {
     throw CaughtException(exception, stackTrace);
   }
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index a8e8b53..ac3f422 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,4 +1,5 @@
-## 0.41.2-dev
+## 0.42.0
+* Migrated to null safety, min SDK is `2.12.0`.
 * Deprecated `FunctionTypeAliasElement.function`.
   Use `TypeAliasElement.aliasedElement` instead.
 * Widened the dependency on package:crypto to include version 3.0.0.
diff --git a/pkg/analyzer/example/analyze.dart b/pkg/analyzer/example/analyze.dart
index d9d5cb3..dcd2920 100644
--- a/pkg/analyzer/example/analyze.dart
+++ b/pkg/analyzer/example/analyze.dart
@@ -10,7 +10,7 @@
 
 /// A simple example of using the AnalysisContextCollection API.
 void main(List<String> args) async {
-  var entity = Directory.current;
+  FileSystemEntity entity = Directory.current;
   if (args.isNotEmpty) {
     String arg = args.first;
     entity = FileSystemEntity.isDirectorySync(arg) ? Directory(arg) : File(arg);
@@ -31,7 +31,7 @@
         continue;
       }
 
-      final errorsResult = await context.currentSession.getErrors(filePath);
+      final errorsResult = (await context.currentSession.getErrors(filePath))!;
       for (final error in errorsResult.errors) {
         if (error.errorCode.type != ErrorType.TODO) {
           print(
diff --git a/pkg/analyzer/lib/dart/analysis/analysis_context.dart b/pkg/analyzer/lib/dart/analysis/analysis_context.dart
index 97ff59c..984ffaa 100644
--- a/pkg/analyzer/lib/dart/analysis/analysis_context.dart
+++ b/pkg/analyzer/lib/dart/analysis/analysis_context.dart
@@ -30,7 +30,7 @@
 
   /// The root directory of the SDK against which files of this context are
   /// analyzed, or `null` if the SDK is not directory based.
-  Folder get sdkRoot;
+  Folder? get sdkRoot;
 
   /// Return the workspace for containing the context root.
   Workspace get workspace;
diff --git a/pkg/analyzer/lib/dart/analysis/analysis_context_collection.dart b/pkg/analyzer/lib/dart/analysis/analysis_context_collection.dart
index b2fba13..1f95fa7 100644
--- a/pkg/analyzer/lib/dart/analysis/analysis_context_collection.dart
+++ b/pkg/analyzer/lib/dart/analysis/analysis_context_collection.dart
@@ -5,7 +5,6 @@
 import 'package:analyzer/dart/analysis/analysis_context.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart';
-import 'package:meta/meta.dart';
 
 /// A collection of analysis contexts.
 ///
@@ -19,9 +18,9 @@
   /// If a [resourceProvider] is given, then it will be used to access the file
   /// system, otherwise the default resource provider will be used.
   factory AnalysisContextCollection(
-      {@required List<String> includedPaths,
-      List<String> excludedPaths,
-      ResourceProvider resourceProvider}) = AnalysisContextCollectionImpl;
+      {required List<String> includedPaths,
+      List<String>? excludedPaths,
+      ResourceProvider? resourceProvider}) = AnalysisContextCollectionImpl;
 
   /// Return all of the analysis contexts in this collection.
   List<AnalysisContext> get contexts;
diff --git a/pkg/analyzer/lib/dart/analysis/context_builder.dart b/pkg/analyzer/lib/dart/analysis/context_builder.dart
index 08cbd34..d3db2f3 100644
--- a/pkg/analyzer/lib/dart/analysis/context_builder.dart
+++ b/pkg/analyzer/lib/dart/analysis/context_builder.dart
@@ -7,7 +7,6 @@
 import 'package:analyzer/dart/analysis/declared_variables.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/context_builder.dart';
-import 'package:meta/meta.dart';
 
 /// A utility class used to build an analysis context based on a context root.
 ///
@@ -37,9 +36,9 @@
   /// If an [sdkSummaryPath] is provided, then that file will be used as the
   /// summary file for the SDK.
   AnalysisContext createContext(
-      {@required ContextRoot contextRoot,
-      DeclaredVariables declaredVariables,
-      List<String> librarySummaryPaths,
-      String sdkPath,
-      String sdkSummaryPath});
+      {required ContextRoot contextRoot,
+      DeclaredVariables? declaredVariables,
+      List<String>? librarySummaryPaths,
+      String? sdkPath,
+      String? sdkSummaryPath});
 }
diff --git a/pkg/analyzer/lib/dart/analysis/context_locator.dart b/pkg/analyzer/lib/dart/analysis/context_locator.dart
index 484099e..478e064 100644
--- a/pkg/analyzer/lib/dart/analysis/context_locator.dart
+++ b/pkg/analyzer/lib/dart/analysis/context_locator.dart
@@ -5,7 +5,6 @@
 import 'package:analyzer/dart/analysis/context_root.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/context_locator.dart';
-import 'package:meta/meta.dart';
 
 /// Determines the list of analysis contexts that can be used to analyze the
 /// files and folders that should be analyzed given a list of included files and
@@ -32,8 +31,8 @@
   /// `.packages` file that should be used in place of the one that would be
   /// found by looking in the directories containing the context roots.
   List<ContextRoot> locateRoots(
-      {@required List<String> includedPaths,
-      List<String> excludedPaths,
-      String optionsFile,
-      String packagesFile});
+      {required List<String> includedPaths,
+      List<String>? excludedPaths,
+      String? optionsFile,
+      String? packagesFile});
 }
diff --git a/pkg/analyzer/lib/dart/analysis/context_root.dart b/pkg/analyzer/lib/dart/analysis/context_root.dart
index ccb15b5..9767602 100644
--- a/pkg/analyzer/lib/dart/analysis/context_root.dart
+++ b/pkg/analyzer/lib/dart/analysis/context_root.dart
@@ -31,11 +31,11 @@
 
   /// The analysis options file that should be used when analyzing the files
   /// within this context root, or `null` if there is no options file.
-  File get optionsFile;
+  File? get optionsFile;
 
   /// The packages file that should be used when analyzing the files within this
   /// context root, or `null` if there is no options file.
-  File get packagesFile;
+  File? get packagesFile;
 
   /// The resource provider used to access the file system.
   ResourceProvider get resourceProvider;
diff --git a/pkg/analyzer/lib/dart/analysis/declared_variables.dart b/pkg/analyzer/lib/dart/analysis/declared_variables.dart
index bb835a4..607163d 100644
--- a/pkg/analyzer/lib/dart/analysis/declared_variables.dart
+++ b/pkg/analyzer/lib/dart/analysis/declared_variables.dart
@@ -25,6 +25,6 @@
   Iterable<String> get variableNames => _declaredVariables.keys;
 
   /// Return the raw string value of the variable with the given [name],
-  /// or `null` of the variable is not defined.
-  String get(String name) => _declaredVariables[name];
+  /// or `null` if the variable is not defined.
+  String? get(String name) => _declaredVariables[name];
 }
diff --git a/pkg/analyzer/lib/dart/analysis/features.dart b/pkg/analyzer/lib/dart/analysis/features.dart
index 5390ffa..31698ee 100644
--- a/pkg/analyzer/lib/dart/analysis/features.dart
+++ b/pkg/analyzer/lib/dart/analysis/features.dart
@@ -43,11 +43,11 @@
   /// experimental flag that may be used to enable it.  Otherwise `null`.
   ///
   /// Should be `null` if [status] is `current` or `abandoned`.
-  String get experimentalFlag;
+  String? get experimentalFlag;
 
   /// If [status] is not `future`, the first language version in which this
   /// feature was enabled by default.  Otherwise `null`.
-  Version get releaseVersion;
+  Version? get releaseVersion;
 
   /// The status of the feature.
   FeatureStatus get status;
@@ -75,8 +75,8 @@
   /// Computes the set of features implied by the given set of experimental
   /// enable flags.
   factory FeatureSet.fromEnableFlags2({
-    @required Version sdkLanguageVersion,
-    @required List<String> flags,
+    required Version sdkLanguageVersion,
+    required List<String> flags,
   }) = ExperimentStatus.fromStrings2;
 
   /// Computes the set of features for the latest language version known
diff --git a/pkg/analyzer/lib/dart/analysis/results.dart b/pkg/analyzer/lib/dart/analysis/results.dart
index d76add7..7e16f11 100644
--- a/pkg/analyzer/lib/dart/analysis/results.dart
+++ b/pkg/analyzer/lib/dart/analysis/results.dart
@@ -16,7 +16,9 @@
 /// Clients may not extend, implement or mix-in this class.
 abstract class AnalysisResult {
   /// The absolute and normalized path of the file that was analyzed.
-  String get path;
+  ///
+  /// TODO(migration): should not be nullable
+  String? get path;
 
   /// Return the session used to compute this result.
   AnalysisSession get session;
@@ -48,11 +50,11 @@
 
   /// If this declaration is returned from [ParsedLibraryResult], the parsed
   /// unit that contains the [node]. Otherwise `null`.
-  ParsedUnitResult get parsedUnit;
+  ParsedUnitResult? get parsedUnit;
 
   /// If this declaration is returned from [ResolvedLibraryResult], the
   /// resolved unit that contains the [node]. Otherwise `null`.
-  ResolvedUnitResult get resolvedUnit;
+  ResolvedUnitResult? get resolvedUnit;
 }
 
 /// The result of computing all of the errors contained in a single file, both
@@ -78,12 +80,14 @@
 /// Clients may not extend, implement or mix-in this class.
 abstract class ParsedLibraryResult implements AnalysisResult {
   /// The parsed units of the library.
-  List<ParsedUnitResult> get units;
+  ///
+  /// TODO(migration): should not be null, probably empty list
+  List<ParsedUnitResult>? get units;
 
   /// Return the declaration of the [element], or `null` if the [element]
   /// is synthetic. Throw [ArgumentError] if the [element] is not defined in
   /// this library.
-  ElementDeclarationResult getElementDeclaration(Element element);
+  ElementDeclarationResult? getElementDeclaration(Element element);
 }
 
 /// The result of parsing of a single file. The errors returned include only
@@ -124,18 +128,18 @@
 /// Clients may not extend, implement or mix-in this class.
 abstract class ResolvedLibraryResult implements AnalysisResult {
   /// The element representing this library.
-  LibraryElement get element;
+  LibraryElement? get element;
 
   /// The type provider used when resolving the library.
   TypeProvider get typeProvider;
 
   /// The resolved units of the library.
-  List<ResolvedUnitResult> get units;
+  List<ResolvedUnitResult>? get units;
 
   /// Return the declaration of the [element], or `null` if the [element]
   /// is synthetic. Throw [ArgumentError] if the [element] is not defined in
   /// this library.
-  ElementDeclarationResult getElementDeclaration(Element element);
+  ElementDeclarationResult? getElementDeclaration(Element element);
 }
 
 /// The result of building a resolved AST for a single file. The errors returned
@@ -144,7 +148,7 @@
 /// Clients may not extend, implement or mix-in this class.
 abstract class ResolvedUnitResult implements AnalysisResultWithErrors {
   /// The content of the file that was scanned, parsed and resolved.
-  String get content;
+  String? get content;
 
   /// The element representing the library containing the compilation [unit].
   LibraryElement get libraryElement;
@@ -156,7 +160,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/dart/analysis/session.dart b/pkg/analyzer/lib/dart/analysis/session.dart
index 276b81e..b922cb2 100644
--- a/pkg/analyzer/lib/dart/analysis/session.dart
+++ b/pkg/analyzer/lib/dart/analysis/session.dart
@@ -36,7 +36,9 @@
   ///
   /// If the file cannot be analyzed by this session, then the result will have
   /// a result state indicating the nature of the problem.
-  Future<ErrorsResult> getErrors(String path);
+  ///
+  /// TODO(migration): should not be nullable
+  Future<ErrorsResult?> getErrors(String path);
 
   /// Return information about the file at the given absolute, normalized
   /// [path].
@@ -80,18 +82,24 @@
 
   /// Return a future that will complete with information about the results of
   /// resolving the file with the given absolute, normalized [path].
-  Future<ResolvedUnitResult> getResolvedUnit(String path);
+  ///
+  /// TODO(migration): should not be nullable
+  Future<ResolvedUnitResult?> getResolvedUnit(String path);
 
   /// Return a future that will complete with the source kind of the file with
   /// the given absolute, normalized [path]. If the path does not represent a
   /// file or if the kind of the file cannot be determined, then the future will
   /// complete with [SourceKind.UNKNOWN].
-  Future<SourceKind> getSourceKind(String path);
+  ///
+  /// TODO(migration): should not be nullable
+  Future<SourceKind?> getSourceKind(String path);
 
   /// Return a future that will complete with information about the results of
   /// building the element model for the file with the given absolute,
   /// normalized[path].
-  Future<UnitElementResult> getUnitElement(String path);
+  ///
+  /// TODO(migration): should not be nullable
+  Future<UnitElementResult?> getUnitElement(String path);
 
   /// Return a future that will complete with the signature for the file with
   /// the given absolute, normalized [path], or `null` if the file cannot be
diff --git a/pkg/analyzer/lib/dart/analysis/uri_converter.dart b/pkg/analyzer/lib/dart/analysis/uri_converter.dart
index a93d045..511b4c8 100644
--- a/pkg/analyzer/lib/dart/analysis/uri_converter.dart
+++ b/pkg/analyzer/lib/dart/analysis/uri_converter.dart
@@ -15,12 +15,12 @@
   ///
   /// Throws an `ArgumentError` if the [path] is `null` or is not a valid
   /// absolute file path.
-  Uri pathToUri(String path, {String containingPath});
+  Uri? pathToUri(String path, {String? containingPath});
 
   /// Return the absolute path of the file to which the absolute [uri] resolves,
   /// or `null` if the [uri] cannot be resolved in this converter’s context.
   ///
   /// Throws an `ArgumentError` if the [uri] is `null` or is not an absolute
   /// URI.
-  String uriToPath(Uri uri);
+  String? uriToPath(Uri uri);
 }
diff --git a/pkg/analyzer/lib/dart/analysis/utilities.dart b/pkg/analyzer/lib/dart/analysis/utilities.dart
index 10fb211..28ff71b 100644
--- a/pkg/analyzer/lib/dart/analysis/utilities.dart
+++ b/pkg/analyzer/lib/dart/analysis/utilities.dart
@@ -15,7 +15,6 @@
 import 'package:analyzer/src/dart/scanner/scanner.dart';
 import 'package:analyzer/src/generated/parser.dart';
 import 'package:analyzer/src/string_source.dart';
-import 'package:meta/meta.dart';
 
 /// Return the result of parsing the file at the given [path].
 ///
@@ -38,13 +37,10 @@
 /// will be thrown. If the parameter is `false`, then the caller can check the
 /// result to see whether there are any errors.
 ParseStringResult parseFile(
-    {@required String path,
-    ResourceProvider resourceProvider,
-    @required FeatureSet featureSet,
+    {required String path,
+    ResourceProvider? resourceProvider,
+    required FeatureSet featureSet,
     bool throwIfDiagnostics = true}) {
-  if (featureSet == null) {
-    throw ArgumentError('A non-null feature set must be provided.');
-  }
   resourceProvider ??= PhysicalResourceProvider.INSTANCE;
   var content = (resourceProvider.getResource(path) as File).readAsStringSync();
   return parseString(
@@ -72,12 +68,12 @@
 /// errors should pass `false` and check `result.errors` to determine what parse
 /// errors, if any, have occurred.
 ParseStringResult parseString(
-    {@required String content,
-    FeatureSet featureSet,
-    String path,
+    {required String content,
+    FeatureSet? featureSet,
+    String? path,
     bool throwIfDiagnostics = true}) {
   featureSet ??= FeatureSet.latestLanguageVersion();
-  var source = StringSource(content, path);
+  var source = StringSource(content, path ?? '');
   var reader = CharSequenceReader(content);
   var errorCollector = RecordingErrorListener();
   var scanner = Scanner(source, reader, errorCollector)
@@ -108,8 +104,10 @@
 /// Note that if more than one file is going to be resolved then this function
 /// is inefficient. Clients should instead use [AnalysisContextCollection] to
 /// create one or more contexts and use those contexts to resolve the files.
-Future<ResolvedUnitResult> resolveFile(
-    {@required String path, ResourceProvider resourceProvider}) async {
+///
+/// TODO(migration): should not be nullable
+Future<ResolvedUnitResult?> resolveFile(
+    {required String path, ResourceProvider? resourceProvider}) async {
   AnalysisContext context =
       _createAnalysisContext(path: path, resourceProvider: resourceProvider);
   return await context.currentSession.getResolvedUnit(path);
@@ -120,7 +118,7 @@
 ///
 /// If a [resourceProvider] is given, it will be used to access the file system.
 AnalysisContext _createAnalysisContext(
-    {@required String path, ResourceProvider resourceProvider}) {
+    {required String path, ResourceProvider? resourceProvider}) {
   AnalysisContextCollection collection = AnalysisContextCollection(
     includedPaths: <String>[path],
     resourceProvider: resourceProvider ?? PhysicalResourceProvider.INSTANCE,
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index 809579d..471b883 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -65,11 +65,11 @@
 abstract class AnnotatedNode implements AstNode {
   /// Return the documentation comment associated with this node, or `null` if
   /// this node does not have a documentation comment associated with it.
-  Comment get documentationComment;
+  Comment? get documentationComment;
 
   /// Set the documentation comment associated with this node to the given
   /// [comment].
-  set documentationComment(Comment comment);
+  set documentationComment(Comment? comment);
 
   /// Return the first token following the comment and metadata.
   Token get firstTokenAfterCommentAndMetadata;
@@ -94,11 +94,11 @@
 abstract class Annotation implements AstNode {
   /// Return the arguments to the constructor being invoked, or `null` if this
   /// annotation is not the invocation of a constructor.
-  ArgumentList get arguments;
+  ArgumentList? get arguments;
 
   /// Set the arguments to the constructor being invoked to the given
   /// [arguments].
-  set arguments(ArgumentList arguments);
+  set arguments(ArgumentList? arguments);
 
   /// Return the at sign that introduced the annotation.
   Token get atSign;
@@ -108,26 +108,26 @@
 
   /// Return the name of the constructor being invoked, or `null` if this
   /// annotation is not the invocation of a named constructor.
-  SimpleIdentifier get constructorName;
+  SimpleIdentifier? get constructorName;
 
   /// Set the name of the constructor being invoked to the given [name].
-  set constructorName(SimpleIdentifier name);
+  set constructorName(SimpleIdentifier? name);
 
   /// Return the element associated with this annotation, or `null` if the AST
   /// structure has not been resolved or if this annotation could not be
   /// resolved.
-  Element get element;
+  Element? get element;
 
   /// Set the element associated with this annotation to the given [element].
-  set element(Element element);
+  set element(Element? element);
 
   /// Return the element annotation representing this annotation in the element
-  /// model.
-  ElementAnnotation get elementAnnotation;
+  /// model; `null` when the AST has not been resolved.
+  ElementAnnotation? get elementAnnotation;
 
   /// Set the element annotation representing this annotation in the element
   /// model to the given [annotation].
-  set elementAnnotation(ElementAnnotation annotation);
+  set elementAnnotation(ElementAnnotation? annotation);
 
   /// Return the name of the class defining the constructor that is being
   /// invoked or the name of the field that is being referenced.
@@ -137,12 +137,15 @@
   /// or the name of the field that is being referenced to the given [name].
   set name(Identifier name);
 
+  @override
+  AstNode get parent;
+
   /// Return the period before the constructor name, or `null` if this
   /// annotation is not the invocation of a named constructor.
-  Token get period;
+  Token? get period;
 
   /// Set the period before the constructor name to the given [token].
-  set period(Token token);
+  set period(Token? token);
 }
 
 /// A list of arguments in the invocation of an executable element (that is, a
@@ -167,7 +170,7 @@
   /// list to the given list of [parameters]. The list of parameters must be the
   /// same length as the number of arguments, but can contain `null` entries if
   /// a given argument does not correspond to a formal parameter.
-  set correspondingStaticParameters(List<ParameterElement> parameters);
+  set correspondingStaticParameters(List<ParameterElement?> parameters);
 
   /// Return the left parenthesis.
   Token get leftParenthesis;
@@ -229,11 +232,11 @@
 
   /// Return the comma between the [condition] and the [message], or `null` if
   /// no message was supplied.
-  Token get comma;
+  Token? get comma;
 
   /// Set the comma between the [condition] and the [message] to the given
   /// [token].
-  set comma(Token token);
+  set comma(Token? token);
 
   /// Return the condition that is being asserted to be `true`.
   Expression get condition;
@@ -250,11 +253,11 @@
 
   /// Return the message to report if the assertion fails, or `null` if no
   /// message was supplied.
-  Expression get message;
+  Expression? get message;
 
   /// Set the message to report if the assertion fails to the given
   /// [expression].
-  set message(Expression expression);
+  set message(Expression? expression);
 
   ///  Return the right parenthesis.
   Token get rightParenthesis;
@@ -360,7 +363,7 @@
   ///
   /// Note that the relationship between an AST node and its parent node may
   /// change over the lifetime of a node.
-  AstNode get parent;
+  AstNode? get parent;
 
   /// Return the node at the root of this node's AST structure.
   ///
@@ -372,26 +375,26 @@
   ///
   /// Return the value returned by the visitor as a result of visiting this
   /// node.
-  E accept<E>(AstVisitor<E> visitor);
+  E? accept<E>(AstVisitor<E> visitor);
 
   /// Return the token before [target] or `null` if it cannot be found.
-  Token findPrevious(Token target);
+  Token? findPrevious(Token target);
 
   /// Return the value of the property with the given [name], or `null` if this
   /// node does not have a property with the given name.
-  E getProperty<E>(String name);
+  E? getProperty<E>(String name);
 
   /// Set the value of the property with the given [name] to the given [value].
   /// If the value is `null`, the property will effectively be removed.
-  void setProperty(String name, Object value);
+  void setProperty(String name, Object? value);
 
   /// Return either this node or the most immediate ancestor of this node for
   /// which the [predicate] returns `true`, or `null` if there is no such node.
-  E thisOrAncestorMatching<E extends AstNode>(Predicate<AstNode> predicate);
+  E? thisOrAncestorMatching<E extends AstNode>(Predicate<AstNode> predicate);
 
   /// Return either this node or the most immediate ancestor of this node that
   /// has the given type, or `null` if there is no such node.
-  E thisOrAncestorOfType<E extends AstNode>();
+  E? thisOrAncestorOfType<E extends AstNode>();
 
   /// Return a textual description of this node in a form approximating valid
   /// source.
@@ -418,248 +421,248 @@
 /// * ThrowingAstVisitor which implements every visit method by throwing an
 ///   exception.
 abstract class AstVisitor<R> {
-  R visitAdjacentStrings(AdjacentStrings node);
+  R? visitAdjacentStrings(AdjacentStrings node);
 
-  R visitAnnotation(Annotation node);
+  R? visitAnnotation(Annotation node);
 
-  R visitArgumentList(ArgumentList node);
+  R? visitArgumentList(ArgumentList node);
 
-  R visitAsExpression(AsExpression node);
+  R? visitAsExpression(AsExpression node);
 
-  R visitAssertInitializer(AssertInitializer node);
+  R? visitAssertInitializer(AssertInitializer node);
 
-  R visitAssertStatement(AssertStatement assertStatement);
+  R? visitAssertStatement(AssertStatement assertStatement);
 
-  R visitAssignmentExpression(AssignmentExpression node);
+  R? visitAssignmentExpression(AssignmentExpression node);
 
-  R visitAwaitExpression(AwaitExpression node);
+  R? visitAwaitExpression(AwaitExpression node);
 
-  R visitBinaryExpression(BinaryExpression node);
+  R? visitBinaryExpression(BinaryExpression node);
 
-  R visitBlock(Block node);
+  R? visitBlock(Block node);
 
-  R visitBlockFunctionBody(BlockFunctionBody node);
+  R? visitBlockFunctionBody(BlockFunctionBody node);
 
-  R visitBooleanLiteral(BooleanLiteral node);
+  R? visitBooleanLiteral(BooleanLiteral node);
 
-  R visitBreakStatement(BreakStatement node);
+  R? visitBreakStatement(BreakStatement node);
 
-  R visitCascadeExpression(CascadeExpression node);
+  R? visitCascadeExpression(CascadeExpression node);
 
-  R visitCatchClause(CatchClause node);
+  R? visitCatchClause(CatchClause node);
 
-  R visitClassDeclaration(ClassDeclaration node);
+  R? visitClassDeclaration(ClassDeclaration node);
 
-  R visitClassTypeAlias(ClassTypeAlias node);
+  R? visitClassTypeAlias(ClassTypeAlias node);
 
-  R visitComment(Comment node);
+  R? visitComment(Comment node);
 
-  R visitCommentReference(CommentReference node);
+  R? visitCommentReference(CommentReference node);
 
-  R visitCompilationUnit(CompilationUnit node);
+  R? visitCompilationUnit(CompilationUnit node);
 
-  R visitConditionalExpression(ConditionalExpression node);
+  R? visitConditionalExpression(ConditionalExpression node);
 
-  R visitConfiguration(Configuration node);
+  R? visitConfiguration(Configuration node);
 
-  R visitConstructorDeclaration(ConstructorDeclaration node);
+  R? visitConstructorDeclaration(ConstructorDeclaration node);
 
-  R visitConstructorFieldInitializer(ConstructorFieldInitializer node);
+  R? visitConstructorFieldInitializer(ConstructorFieldInitializer node);
 
-  R visitConstructorName(ConstructorName node);
+  R? visitConstructorName(ConstructorName node);
 
-  R visitContinueStatement(ContinueStatement node);
+  R? visitContinueStatement(ContinueStatement node);
 
-  R visitDeclaredIdentifier(DeclaredIdentifier node);
+  R? visitDeclaredIdentifier(DeclaredIdentifier node);
 
-  R visitDefaultFormalParameter(DefaultFormalParameter node);
+  R? visitDefaultFormalParameter(DefaultFormalParameter node);
 
-  R visitDoStatement(DoStatement node);
+  R? visitDoStatement(DoStatement node);
 
-  R visitDottedName(DottedName node);
+  R? visitDottedName(DottedName node);
 
-  R visitDoubleLiteral(DoubleLiteral node);
+  R? visitDoubleLiteral(DoubleLiteral node);
 
-  R visitEmptyFunctionBody(EmptyFunctionBody node);
+  R? visitEmptyFunctionBody(EmptyFunctionBody node);
 
-  R visitEmptyStatement(EmptyStatement node);
+  R? visitEmptyStatement(EmptyStatement node);
 
-  R visitEnumConstantDeclaration(EnumConstantDeclaration node);
+  R? visitEnumConstantDeclaration(EnumConstantDeclaration node);
 
-  R visitEnumDeclaration(EnumDeclaration node);
+  R? visitEnumDeclaration(EnumDeclaration node);
 
-  R visitExportDirective(ExportDirective node);
+  R? visitExportDirective(ExportDirective node);
 
-  R visitExpressionFunctionBody(ExpressionFunctionBody node);
+  R? visitExpressionFunctionBody(ExpressionFunctionBody node);
 
-  R visitExpressionStatement(ExpressionStatement node);
+  R? visitExpressionStatement(ExpressionStatement node);
 
-  R visitExtendsClause(ExtendsClause node);
+  R? visitExtendsClause(ExtendsClause node);
 
-  R visitExtensionDeclaration(ExtensionDeclaration node);
+  R? visitExtensionDeclaration(ExtensionDeclaration node);
 
-  R visitExtensionOverride(ExtensionOverride node);
+  R? visitExtensionOverride(ExtensionOverride node);
 
-  R visitFieldDeclaration(FieldDeclaration node);
+  R? visitFieldDeclaration(FieldDeclaration node);
 
-  R visitFieldFormalParameter(FieldFormalParameter node);
+  R? visitFieldFormalParameter(FieldFormalParameter node);
 
-  R visitForEachPartsWithDeclaration(ForEachPartsWithDeclaration node);
+  R? visitForEachPartsWithDeclaration(ForEachPartsWithDeclaration node);
 
-  R visitForEachPartsWithIdentifier(ForEachPartsWithIdentifier node);
+  R? visitForEachPartsWithIdentifier(ForEachPartsWithIdentifier node);
 
-  R visitForElement(ForElement node);
+  R? visitForElement(ForElement node);
 
-  R visitFormalParameterList(FormalParameterList node);
+  R? visitFormalParameterList(FormalParameterList node);
 
-  R visitForPartsWithDeclarations(ForPartsWithDeclarations node);
+  R? visitForPartsWithDeclarations(ForPartsWithDeclarations node);
 
-  R visitForPartsWithExpression(ForPartsWithExpression node);
+  R? visitForPartsWithExpression(ForPartsWithExpression node);
 
-  R visitForStatement(ForStatement node);
+  R? visitForStatement(ForStatement node);
 
-  R visitFunctionDeclaration(FunctionDeclaration node);
+  R? visitFunctionDeclaration(FunctionDeclaration node);
 
-  R visitFunctionDeclarationStatement(FunctionDeclarationStatement node);
+  R? visitFunctionDeclarationStatement(FunctionDeclarationStatement node);
 
-  R visitFunctionExpression(FunctionExpression node);
+  R? visitFunctionExpression(FunctionExpression node);
 
-  R visitFunctionExpressionInvocation(FunctionExpressionInvocation node);
+  R? visitFunctionExpressionInvocation(FunctionExpressionInvocation node);
 
-  R visitFunctionTypeAlias(FunctionTypeAlias functionTypeAlias);
+  R? visitFunctionTypeAlias(FunctionTypeAlias functionTypeAlias);
 
-  R visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node);
+  R? visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node);
 
-  R visitGenericFunctionType(GenericFunctionType node);
+  R? visitGenericFunctionType(GenericFunctionType node);
 
-  R visitGenericTypeAlias(GenericTypeAlias node);
+  R? visitGenericTypeAlias(GenericTypeAlias node);
 
-  R visitHideCombinator(HideCombinator node);
+  R? visitHideCombinator(HideCombinator node);
 
-  R visitIfElement(IfElement node);
+  R? visitIfElement(IfElement node);
 
-  R visitIfStatement(IfStatement node);
+  R? visitIfStatement(IfStatement node);
 
-  R visitImplementsClause(ImplementsClause node);
+  R? visitImplementsClause(ImplementsClause node);
 
-  R visitImportDirective(ImportDirective node);
+  R? visitImportDirective(ImportDirective node);
 
-  R visitIndexExpression(IndexExpression node);
+  R? visitIndexExpression(IndexExpression node);
 
-  R visitInstanceCreationExpression(InstanceCreationExpression node);
+  R? visitInstanceCreationExpression(InstanceCreationExpression node);
 
-  R visitIntegerLiteral(IntegerLiteral node);
+  R? visitIntegerLiteral(IntegerLiteral node);
 
-  R visitInterpolationExpression(InterpolationExpression node);
+  R? visitInterpolationExpression(InterpolationExpression node);
 
-  R visitInterpolationString(InterpolationString node);
+  R? visitInterpolationString(InterpolationString node);
 
-  R visitIsExpression(IsExpression node);
+  R? visitIsExpression(IsExpression node);
 
-  R visitLabel(Label node);
+  R? visitLabel(Label node);
 
-  R visitLabeledStatement(LabeledStatement node);
+  R? visitLabeledStatement(LabeledStatement node);
 
-  R visitLibraryDirective(LibraryDirective node);
+  R? visitLibraryDirective(LibraryDirective node);
 
-  R visitLibraryIdentifier(LibraryIdentifier node);
+  R? visitLibraryIdentifier(LibraryIdentifier node);
 
-  R visitListLiteral(ListLiteral node);
+  R? visitListLiteral(ListLiteral node);
 
-  R visitMapLiteralEntry(MapLiteralEntry node);
+  R? visitMapLiteralEntry(MapLiteralEntry node);
 
-  R visitMethodDeclaration(MethodDeclaration node);
+  R? visitMethodDeclaration(MethodDeclaration node);
 
-  R visitMethodInvocation(MethodInvocation node);
+  R? visitMethodInvocation(MethodInvocation node);
 
-  R visitMixinDeclaration(MixinDeclaration node);
+  R? visitMixinDeclaration(MixinDeclaration node);
 
-  R visitNamedExpression(NamedExpression node);
+  R? visitNamedExpression(NamedExpression node);
 
-  R visitNativeClause(NativeClause node);
+  R? visitNativeClause(NativeClause node);
 
-  R visitNativeFunctionBody(NativeFunctionBody node);
+  R? visitNativeFunctionBody(NativeFunctionBody node);
 
-  R visitNullLiteral(NullLiteral node);
+  R? visitNullLiteral(NullLiteral node);
 
-  R visitOnClause(OnClause node);
+  R? visitOnClause(OnClause node);
 
-  R visitParenthesizedExpression(ParenthesizedExpression node);
+  R? visitParenthesizedExpression(ParenthesizedExpression node);
 
-  R visitPartDirective(PartDirective node);
+  R? visitPartDirective(PartDirective node);
 
-  R visitPartOfDirective(PartOfDirective node);
+  R? visitPartOfDirective(PartOfDirective node);
 
-  R visitPostfixExpression(PostfixExpression node);
+  R? visitPostfixExpression(PostfixExpression node);
 
-  R visitPrefixedIdentifier(PrefixedIdentifier node);
+  R? visitPrefixedIdentifier(PrefixedIdentifier node);
 
-  R visitPrefixExpression(PrefixExpression node);
+  R? visitPrefixExpression(PrefixExpression node);
 
-  R visitPropertyAccess(PropertyAccess node);
+  R? visitPropertyAccess(PropertyAccess node);
 
-  R visitRedirectingConstructorInvocation(
+  R? visitRedirectingConstructorInvocation(
       RedirectingConstructorInvocation node);
 
-  R visitRethrowExpression(RethrowExpression node);
+  R? visitRethrowExpression(RethrowExpression node);
 
-  R visitReturnStatement(ReturnStatement node);
+  R? visitReturnStatement(ReturnStatement node);
 
-  R visitScriptTag(ScriptTag node);
+  R? visitScriptTag(ScriptTag node);
 
-  R visitSetOrMapLiteral(SetOrMapLiteral node);
+  R? visitSetOrMapLiteral(SetOrMapLiteral node);
 
-  R visitShowCombinator(ShowCombinator node);
+  R? visitShowCombinator(ShowCombinator node);
 
-  R visitSimpleFormalParameter(SimpleFormalParameter node);
+  R? visitSimpleFormalParameter(SimpleFormalParameter node);
 
-  R visitSimpleIdentifier(SimpleIdentifier node);
+  R? visitSimpleIdentifier(SimpleIdentifier node);
 
-  R visitSimpleStringLiteral(SimpleStringLiteral node);
+  R? visitSimpleStringLiteral(SimpleStringLiteral node);
 
-  R visitSpreadElement(SpreadElement node);
+  R? visitSpreadElement(SpreadElement node);
 
-  R visitStringInterpolation(StringInterpolation node);
+  R? visitStringInterpolation(StringInterpolation node);
 
-  R visitSuperConstructorInvocation(SuperConstructorInvocation node);
+  R? visitSuperConstructorInvocation(SuperConstructorInvocation node);
 
-  R visitSuperExpression(SuperExpression node);
+  R? visitSuperExpression(SuperExpression node);
 
-  R visitSwitchCase(SwitchCase node);
+  R? visitSwitchCase(SwitchCase node);
 
-  R visitSwitchDefault(SwitchDefault node);
+  R? visitSwitchDefault(SwitchDefault node);
 
-  R visitSwitchStatement(SwitchStatement node);
+  R? visitSwitchStatement(SwitchStatement node);
 
-  R visitSymbolLiteral(SymbolLiteral node);
+  R? visitSymbolLiteral(SymbolLiteral node);
 
-  R visitThisExpression(ThisExpression node);
+  R? visitThisExpression(ThisExpression node);
 
-  R visitThrowExpression(ThrowExpression node);
+  R? visitThrowExpression(ThrowExpression node);
 
-  R visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node);
+  R? visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node);
 
-  R visitTryStatement(TryStatement node);
+  R? visitTryStatement(TryStatement node);
 
-  R visitTypeArgumentList(TypeArgumentList node);
+  R? visitTypeArgumentList(TypeArgumentList node);
 
-  R visitTypeName(TypeName node);
+  R? visitTypeName(TypeName node);
 
-  R visitTypeParameter(TypeParameter node);
+  R? visitTypeParameter(TypeParameter node);
 
-  R visitTypeParameterList(TypeParameterList node);
+  R? visitTypeParameterList(TypeParameterList node);
 
-  R visitVariableDeclaration(VariableDeclaration node);
+  R? visitVariableDeclaration(VariableDeclaration node);
 
-  R visitVariableDeclarationList(VariableDeclarationList node);
+  R? visitVariableDeclarationList(VariableDeclarationList node);
 
-  R visitVariableDeclarationStatement(VariableDeclarationStatement node);
+  R? visitVariableDeclarationStatement(VariableDeclarationStatement node);
 
-  R visitWhileStatement(WhileStatement node);
+  R? visitWhileStatement(WhileStatement node);
 
-  R visitWithClause(WithClause node);
+  R? visitWithClause(WithClause node);
 
-  R visitYieldStatement(YieldStatement node);
+  R? visitYieldStatement(YieldStatement node);
 }
 
 /// An await expression.
@@ -713,10 +716,10 @@
 
   /// The function type of the invocation, or `null` if the AST structure has
   /// not been resolved, or if the invocation could not be resolved.
-  FunctionType get staticInvokeType;
+  FunctionType? get staticInvokeType;
 
   /// Sets the function type of the invocation.
-  set staticInvokeType(FunctionType value);
+  set staticInvokeType(FunctionType? value);
 }
 
 /// A sequence of statements.
@@ -756,10 +759,10 @@
   set block(Block block);
 
   /// Set token representing the 'async' or 'sync' keyword to the given [token].
-  set keyword(Token token);
+  set keyword(Token? token);
 
   /// Set the star following the 'async' or 'sync' keyword to the given [token].
-  set star(Token token);
+  set star(Token? token);
 }
 
 /// A boolean literal expression.
@@ -794,10 +797,10 @@
 
   /// Return the label associated with the statement, or `null` if there is no
   /// label.
-  SimpleIdentifier get label;
+  SimpleIdentifier? get label;
 
   /// Set the label associated with the statement to the given [identifier].
-  set label(SimpleIdentifier identifier);
+  set label(SimpleIdentifier? identifier);
 
   /// Return the semicolon terminating the statement.
   Token get semicolon;
@@ -813,11 +816,11 @@
   /// or `null` if the AST has not yet been resolved or if the target could not
   /// be resolved. Note that if the source code has errors, the target might be
   /// invalid (e.g. trying to break to a switch case).
-  AstNode get target;
+  AstNode? get target;
 
   /// Set the node from which this break statement is breaking to the given
   /// [node].
-  set target(AstNode node);
+  set target(AstNode? node);
 }
 
 /// A sequence of cascaded expressions: expressions that share a common target.
@@ -872,61 +875,61 @@
 
   /// Return the token representing the 'catch' keyword, or `null` if there is
   /// no 'catch' keyword.
-  Token get catchKeyword;
+  Token? get catchKeyword;
 
   /// Set the token representing the 'catch' keyword to the given [token].
-  set catchKeyword(Token token);
+  set catchKeyword(Token? token);
 
   /// Return the comma separating the exception parameter from the stack trace
   /// parameter, or `null` if there is no stack trace parameter.
-  Token get comma;
+  Token? get comma;
 
   /// Set the comma separating the exception parameter from the stack trace
   /// parameter to the given [token].
-  set comma(Token token);
+  set comma(Token? token);
 
   /// Return the parameter whose value will be the exception that was thrown, or
   /// `null` if there is no 'catch' keyword.
-  SimpleIdentifier get exceptionParameter;
+  SimpleIdentifier? get exceptionParameter;
 
   /// Set the parameter whose value will be the exception that was thrown to the
   /// given [parameter].
-  set exceptionParameter(SimpleIdentifier parameter);
+  set exceptionParameter(SimpleIdentifier? parameter);
 
   /// Return the type of exceptions caught by this catch clause, or `null` if
   /// this catch clause catches every type of exception.
-  TypeAnnotation get exceptionType;
+  TypeAnnotation? get exceptionType;
 
   /// Set the type of exceptions caught by this catch clause to the given
   /// [exceptionType].
-  set exceptionType(TypeAnnotation exceptionType);
+  set exceptionType(TypeAnnotation? exceptionType);
 
   /// Return the left parenthesis, or `null` if there is no 'catch' keyword.
-  Token get leftParenthesis;
+  Token? get leftParenthesis;
 
   /// Set the left parenthesis to the given [token].
-  set leftParenthesis(Token token);
+  set leftParenthesis(Token? token);
 
   /// Return the token representing the 'on' keyword, or `null` if there is no
   /// 'on' keyword.
-  Token get onKeyword;
+  Token? get onKeyword;
 
   /// Set the token representing the 'on' keyword to the given [token].
-  set onKeyword(Token token);
+  set onKeyword(Token? token);
 
   /// Return the right parenthesis, or `null` if there is no 'catch' keyword.
-  Token get rightParenthesis;
+  Token? get rightParenthesis;
 
   /// Set the right parenthesis to the given [token].
-  set rightParenthesis(Token token);
+  set rightParenthesis(Token? token);
 
   /// Return the parameter whose value will be the stack trace associated with
   /// the exception, or `null` if there is no stack trace parameter.
-  SimpleIdentifier get stackTraceParameter;
+  SimpleIdentifier? get stackTraceParameter;
 
   /// Set the parameter whose value will be the stack trace associated with the
   /// exception to the given [parameter].
-  set stackTraceParameter(SimpleIdentifier parameter);
+  set stackTraceParameter(SimpleIdentifier? parameter);
 }
 
 /// The declaration of a class.
@@ -940,10 +943,10 @@
 /// Clients may not extend, implement or mix-in this class.
 abstract class ClassDeclaration implements ClassOrMixinDeclaration {
   /// Return the 'abstract' keyword, or `null` if the keyword was absent.
-  Token get abstractKeyword;
+  Token? get abstractKeyword;
 
   /// Set the 'abstract' keyword to the given [token].
-  set abstractKeyword(Token token);
+  set abstractKeyword(Token? token);
 
   /// Return the token representing the 'class' keyword.
   Token get classKeyword;
@@ -953,13 +956,13 @@
 
   /// Return the extends clause for this class, or `null` if the class does not
   /// extend any other class.
-  ExtendsClause get extendsClause;
+  ExtendsClause? get extendsClause;
 
   /// Set the extends clause for this class to the given [extendsClause].
-  set extendsClause(ExtendsClause extendsClause);
+  set extendsClause(ExtendsClause? extendsClause);
 
   /// Set the implements clause for the class to the given [implementsClause].
-  set implementsClause(ImplementsClause implementsClause);
+  set implementsClause(ImplementsClause? implementsClause);
 
   /// Return `true` if this class is declared to be an abstract class.
   bool get isAbstract;
@@ -969,31 +972,31 @@
 
   /// Return the native clause for this class, or `null` if the class does not
   /// have a native clause.
-  NativeClause get nativeClause;
+  NativeClause? get nativeClause;
 
   /// Set the native clause for this class to the given [nativeClause].
-  set nativeClause(NativeClause nativeClause);
+  set nativeClause(NativeClause? nativeClause);
 
   /// Set the right curly bracket to the given [token].
   set rightBracket(Token token);
 
   /// Set the type parameters for the class to the given list of
   /// [typeParameters].
-  set typeParameters(TypeParameterList typeParameters);
+  set typeParameters(TypeParameterList? typeParameters);
 
   /// Return the with clause for the class, or `null` if the class does not have
   /// a with clause.
-  WithClause get withClause;
+  WithClause? get withClause;
 
   /// Set the with clause for the class to the given [withClause].
-  set withClause(WithClause withClause);
+  set withClause(WithClause? withClause);
 
   /// Return the constructor declared in the class with the given [name], or
   /// `null` if there is no such constructor.
   ///
   /// If the [name] is `null` then the default constructor will be searched
   /// for.
-  ConstructorDeclaration getConstructor(String name);
+  ConstructorDeclaration? getConstructor(String? name);
 }
 
 /// A node that declares a name within the scope of a class declarations.
@@ -1009,11 +1012,11 @@
 /// Clients may not extend, implement or mix-in this class.
 abstract class ClassOrMixinDeclaration implements NamedCompilationUnitMember {
   @override
-  ClassElement get declaredElement;
+  ClassElement? get declaredElement;
 
   /// Returns the implements clause for the class/mixin, or `null` if the
   /// class/mixin does not implement any interfaces.
-  ImplementsClause get implementsClause;
+  ImplementsClause? get implementsClause;
 
   /// Returns the left curly bracket.
   Token get leftBracket;
@@ -1021,20 +1024,23 @@
   /// Returns the members defined by the class/mixin.
   NodeList<ClassMember> get members;
 
+  @override
+  SimpleIdentifier get name;
+
   /// Returns the right curly bracket.
   Token get rightBracket;
 
   /// Returns the type parameters for the class/mixin, or `null` if the
   /// class/mixin does not have any type parameters.
-  TypeParameterList get typeParameters;
+  TypeParameterList? get typeParameters;
 
   /// Returns the field declared in the class/mixin with the given [name], or
   /// `null` if there is no such field.
-  VariableDeclaration getField(String name);
+  VariableDeclaration? getField(String name);
 
   /// Returns the method declared in the class/mixin with the given [name], or
   /// `null` if there is no such method.
-  MethodDeclaration getMethod(String name);
+  MethodDeclaration? getMethod(String name);
 }
 
 /// A class type alias.
@@ -1049,13 +1055,13 @@
 abstract class ClassTypeAlias implements TypeAlias {
   /// Return the token for the 'abstract' keyword, or `null` if this is not
   /// defining an abstract class.
-  Token get abstractKeyword;
+  Token? get abstractKeyword;
 
   /// Set the token for the 'abstract' keyword to the given [token].
-  set abstractKeyword(Token token);
+  set abstractKeyword(Token? token);
 
   @override
-  ClassElement get declaredElement;
+  ClassElement? get declaredElement;
 
   /// Return the token for the '=' separating the name from the definition.
   Token get equals;
@@ -1066,14 +1072,17 @@
 
   /// Return the implements clause for this class, or `null` if there is no
   /// implements clause.
-  ImplementsClause get implementsClause;
+  ImplementsClause? get implementsClause;
 
   /// Set the implements clause for this class to the given [implementsClause].
-  set implementsClause(ImplementsClause implementsClause);
+  set implementsClause(ImplementsClause? implementsClause);
 
   /// Return `true` if this class is declared to be an abstract class.
   bool get isAbstract;
 
+  @override
+  SimpleIdentifier get name;
+
   /// Return the name of the superclass of the class being declared.
   TypeName get superclass;
 
@@ -1083,11 +1092,11 @@
 
   /// Return the type parameters for the class, or `null` if the class does not
   /// have any type parameters.
-  TypeParameterList get typeParameters;
+  TypeParameterList? get typeParameters;
 
   /// Set the type parameters for the class to the given list of
   /// [typeParameters].
-  set typeParameters(TypeParameterList typeParameters);
+  set typeParameters(TypeParameterList? typeParameters);
 
   /// Return the with clause for this class.
   WithClause get withClause;
@@ -1175,10 +1184,10 @@
 
   /// Return the token representing the 'new' keyword, or `null` if there was no
   /// 'new' keyword.
-  Token get newKeyword;
+  Token? get newKeyword;
 
   /// Set the token representing the 'new' keyword to the given [token].
-  set newKeyword(Token token);
+  set newKeyword(Token? token);
 }
 
 /// A compilation unit.
@@ -1214,47 +1223,43 @@
 
   /// Return the element associated with this compilation unit, or `null` if the
   /// AST structure has not been resolved.
-  CompilationUnitElement get declaredElement;
+  CompilationUnitElement? get declaredElement;
 
   /// Return the directives contained in this compilation unit.
   NodeList<Directive> get directives;
 
   /// Set the element associated with this compilation unit to the given
   /// [element].
-  set element(CompilationUnitElement element);
+  set element(CompilationUnitElement? element);
 
   /// Set the last token included in this node's source range to the given
   /// [token].
   set endToken(Token token);
 
-  /// The set of features available to this compilation unit, or `null` if
-  /// unknown.
+  /// The set of features available to this compilation unit.
   ///
   /// Determined by some combination of the .packages file, the enclosing
   /// package's SDK version constraint, and/or the presence of a `@dart`
   /// directive in a comment at the top of the file.
-  ///
-  /// Might be `null` if, for example, this [CompilationUnit] has been
-  /// resynthesized from a summary.
   FeatureSet get featureSet;
 
   /// The language version override specified for this compilation unit using a
   /// token like '// @dart = 2.7', or `null` if no override is specified.
-  LanguageVersionToken get languageVersionToken;
+  LanguageVersionToken? get languageVersionToken;
 
   /// Return the line information for this compilation unit.
-  LineInfo get lineInfo;
+  LineInfo? get lineInfo;
 
   /// Set the line information for this compilation unit to the given [info].
-  set lineInfo(LineInfo info);
+  set lineInfo(LineInfo? info);
 
   /// Return the script tag at the beginning of the compilation unit, or `null`
   /// if there is no script tag in this compilation unit.
-  ScriptTag get scriptTag;
+  ScriptTag? get scriptTag;
 
   /// Set the script tag at the beginning of the compilation unit to the given
   /// [scriptTag].
-  set scriptTag(ScriptTag scriptTag);
+  set scriptTag(ScriptTag? scriptTag);
 
   /// Return a list containing all of the directives and declarations in this
   /// compilation unit, sorted in lexical order.
@@ -1299,7 +1304,7 @@
   ///
   /// This element is `null` if the AST structure has not been resolved, or
   /// if the target could not be resolved.
-  Element get readElement;
+  Element? get readElement;
 
   /// The type of the value read with the [readElement].
   ///
@@ -1310,7 +1315,7 @@
   /// This type is `null` if the AST structure has not been resolved.
   ///
   /// If the target could not be resolved, this type is `dynamic`.
-  DartType get readType;
+  DartType? get readType;
 
   /// The element that is used to write the result.
   ///
@@ -1327,12 +1332,12 @@
   ///
   /// This element is `null` if the AST structure has not been resolved, or
   /// if the target could not be resolved.
-  Element get writeElement;
+  Element? get writeElement;
 
   /// The types of assigned values must be subtypes of this type.
   ///
   /// If the target could not be resolved, this type is `dynamic`.
-  DartType get writeType;
+  DartType? get writeType;
 }
 
 /// A conditional expression.
@@ -1397,10 +1402,10 @@
 abstract class Configuration implements AstNode {
   /// Return the token for the equal operator, or `null` if the condition does
   /// not include an equality test.
-  Token get equalToken;
+  Token? get equalToken;
 
   /// Set the token for the equal operator to the given [token].
-  set equalToken(Token token);
+  set equalToken(Token? token);
 
   /// Return the token for the 'if' keyword.
   Token get ifKeyword;
@@ -1437,18 +1442,18 @@
   set uri(StringLiteral uri);
 
   /// Return the source to which the [uri] was resolved.
-  Source get uriSource;
+  Source? get uriSource;
 
   /// Set the source to which the [uri] was resolved to the given [source].
-  set uriSource(Source source);
+  set uriSource(Source? source);
 
   /// Return the value to which the value of the declared variable will be
   /// compared, or `null` if the condition does not include an equality test.
-  StringLiteral get value;
+  StringLiteral? get value;
 
   /// Set the value to which the value of the declared variable will be
   /// compared to the given [value].
-  set value(StringLiteral value);
+  set value(StringLiteral? value);
 }
 
 /// A constructor declaration.
@@ -1475,44 +1480,44 @@
 abstract class ConstructorDeclaration implements ClassMember {
   /// Return the body of the constructor, or `null` if the constructor does not
   /// have a body.
-  FunctionBody get body;
+  FunctionBody? get body;
 
   /// Set the body of the constructor to the given [functionBody].
-  set body(FunctionBody functionBody);
+  set body(FunctionBody? functionBody);
 
   /// Return the token for the 'const' keyword, or `null` if the constructor is
   /// not a const constructor.
-  Token get constKeyword;
+  Token? get constKeyword;
 
   /// Set the token for the 'const' keyword to the given [token].
-  set constKeyword(Token token);
+  set constKeyword(Token? token);
 
   @override
-  ConstructorElement get declaredElement;
+  ConstructorElement? get declaredElement;
 
   /// Return the token for the 'external' keyword to the given [token].
-  Token get externalKeyword;
+  Token? get externalKeyword;
 
   /// Set the token for the 'external' keyword, or `null` if the constructor
   /// is not external.
-  set externalKeyword(Token token);
+  set externalKeyword(Token? token);
 
   /// Return the token for the 'factory' keyword, or `null` if the constructor
   /// is not a factory constructor.
-  Token get factoryKeyword;
+  Token? get factoryKeyword;
 
   /// Set the token for the 'factory' keyword to the given [token].
-  set factoryKeyword(Token token);
+  set factoryKeyword(Token? token);
 
   /// Return the initializers associated with the constructor.
   NodeList<ConstructorInitializer> get initializers;
 
   /// Return the name of the constructor, or `null` if the constructor being
   /// declared is unnamed.
-  SimpleIdentifier get name;
+  SimpleIdentifier? get name;
 
   /// Set the name of the constructor to the given [identifier].
-  set name(SimpleIdentifier identifier);
+  set name(SimpleIdentifier? identifier);
 
   /// Return the parameters associated with the constructor.
   FormalParameterList get parameters;
@@ -1523,19 +1528,19 @@
 
   /// Return the token for the period before the constructor name, or `null` if
   /// the constructor being declared is unnamed.
-  Token get period;
+  Token? get period;
 
   /// Set the token for the period before the constructor name to the given
   /// [token].
-  set period(Token token);
+  set period(Token? token);
 
   /// Return the name of the constructor to which this constructor will be
   /// redirected, or `null` if this is not a redirecting factory constructor.
-  ConstructorName get redirectedConstructor;
+  ConstructorName? get redirectedConstructor;
 
   /// Set the name of the constructor to which this constructor will be
   /// redirected to the given [redirectedConstructor] name.
-  set redirectedConstructor(ConstructorName redirectedConstructor);
+  set redirectedConstructor(ConstructorName? redirectedConstructor);
 
   /// Return the type of object being created.
   ///
@@ -1549,11 +1554,11 @@
 
   /// Return the token for the separator (colon or equals) before the
   /// initializer list or redirection, or `null` if there are no initializers.
-  Token get separator;
+  Token? get separator;
 
   /// Set the token for the separator (colon or equals) before the initializer
   /// list or redirection to the given [token].
-  set separator(Token token);
+  set separator(Token? token);
 }
 
 /// The initialization of a field within a constructor's initialization list.
@@ -1587,18 +1592,18 @@
 
   /// Return the token for the period after the 'this' keyword, or `null` if
   /// there is no 'this' keyword.
-  Token get period;
+  Token? get period;
 
   /// Set the token for the period after the 'this' keyword to the given
   /// [token].
-  set period(Token token);
+  set period(Token? token);
 
   /// Return the token for the 'this' keyword, or `null` if there is no 'this'
   /// keyword.
-  Token get thisKeyword;
+  Token? get thisKeyword;
 
   /// Set the token for the 'this' keyword to the given [token].
-  set thisKeyword(Token token);
+  set thisKeyword(Token? token);
 }
 
 /// A node that can occur in the initializer list of a constructor declaration.
@@ -1620,18 +1625,18 @@
 abstract class ConstructorName implements AstNode, ConstructorReferenceNode {
   /// Return the name of the constructor, or `null` if the specified constructor
   /// is the unnamed constructor.
-  SimpleIdentifier get name;
+  SimpleIdentifier? get name;
 
   /// Set the name of the constructor to the given [name].
-  set name(SimpleIdentifier name);
+  set name(SimpleIdentifier? name);
 
   /// Return the token for the period before the constructor name, or `null` if
   /// the specified constructor is the unnamed constructor.
-  Token get period;
+  Token? get period;
 
   /// Set the token for the period before the constructor name to the given
   /// [token].
-  set period(Token token);
+  set period(Token? token);
 
   /// Return the name of the type defining the constructor.
   TypeName get type;
@@ -1648,11 +1653,11 @@
   /// Return the element associated with the referenced constructor based on
   /// static type information, or `null` if the AST structure has not been
   /// resolved or if the constructor could not be resolved.
-  ConstructorElement get staticElement;
+  ConstructorElement? get staticElement;
 
   /// Set the element associated with the referenced constructor based on static
   /// type information to the given [element].
-  set staticElement(ConstructorElement element);
+  set staticElement(ConstructorElement? element);
 }
 
 /// A continue statement.
@@ -1670,10 +1675,10 @@
 
   /// Return the label associated with the statement, or `null` if there is no
   /// label.
-  SimpleIdentifier get label;
+  SimpleIdentifier? get label;
 
   /// Set the label associated with the statement to the given [identifier].
-  set label(SimpleIdentifier identifier);
+  set label(SimpleIdentifier? identifier);
 
   /// Return the semicolon terminating the statement.
   Token get semicolon;
@@ -1689,11 +1694,11 @@
   /// could not be resolved. Note that if the source code has errors, the
   /// target might be invalid (e.g. the target may be in an enclosing
   /// function).
-  AstNode get target;
+  AstNode? get target;
 
   /// Set the node to which this continue statement is continuing to the given
   /// [node].
-  set target(AstNode node);
+  set target(AstNode? node);
 }
 
 /// A node that represents the declaration of one or more names.
@@ -1705,7 +1710,7 @@
   /// Return the element associated with this declaration, or `null` if either
   /// this node corresponds to a list of declarations or if the AST structure
   /// has not been resolved.
-  Element get declaredElement;
+  Element? get declaredElement;
 }
 
 /// The declaration of a single identifier.
@@ -1716,7 +1721,7 @@
 /// Clients may not extend, implement or mix-in this class.
 abstract class DeclaredIdentifier implements Declaration {
   @override
-  LocalVariableElement get declaredElement;
+  LocalVariableElement? get declaredElement;
 
   /// Return the name of the variable being declared.
   SimpleIdentifier get identifier;
@@ -1734,18 +1739,18 @@
 
   /// Return the token representing either the 'final', 'const' or 'var'
   /// keyword, or `null` if no keyword was used.
-  Token get keyword;
+  Token? get keyword;
 
   /// Set the token representing either the 'final', 'const' or 'var' keyword to
   /// the given [token].
-  set keyword(Token token);
+  set keyword(Token? token);
 
   /// Return the name of the declared type of the parameter, or `null` if the
   /// parameter does not have a declared type.
-  TypeAnnotation get type;
+  TypeAnnotation? get type;
 
   /// Set the declared type of the parameter to the given [type].
-  set type(TypeAnnotation type);
+  set type(TypeAnnotation? type);
 }
 
 /// A formal parameter with a default value.
@@ -1763,11 +1768,11 @@
 abstract class DefaultFormalParameter implements FormalParameter {
   /// Return the expression computing the default value for the parameter, or
   /// `null` if there is no default value.
-  Expression get defaultValue;
+  Expression? get defaultValue;
 
   /// Set the expression computing the default value for the parameter to the
   /// given [expression].
-  set defaultValue(Expression expression);
+  set defaultValue(Expression? expression);
 
   /// Set the kind of this parameter to the given [kind].
   set kind(ParameterKind kind);
@@ -1781,11 +1786,11 @@
 
   /// Return the token separating the parameter from the default value, or
   /// `null` if there is no default value.
-  Token get separator;
+  Token? get separator;
 
   /// Set the token separating the parameter from the default value to the given
   /// [token].
-  set separator(Token token);
+  set separator(Token? token);
 }
 
 /// A node that represents a directive.
@@ -1802,10 +1807,10 @@
   /// Return the element associated with this directive, or `null` if the AST
   /// structure has not been resolved or if this directive could not be
   /// resolved.
-  Element get element;
+  Element? get element;
 
   /// Set the element associated with this directive to the given [element].
-  set element(Element element);
+  set element(Element? element);
 
   /// Return the token representing the keyword that introduces this directive
   /// ('import', 'export', 'library' or 'part').
@@ -1951,7 +1956,7 @@
   NodeList<EnumConstantDeclaration> get constants;
 
   @override
-  ClassElement get declaredElement;
+  ClassElement? get declaredElement;
 
   /// Return the 'enum' keyword.
   Token get enumKeyword;
@@ -1965,6 +1970,9 @@
   /// Set the left curly bracket to the given [token].
   set leftBracket(Token token);
 
+  @override
+  SimpleIdentifier get name;
+
   /// Return the right curly bracket.
   Token get rightBracket;
 
@@ -1980,7 +1988,7 @@
 /// Clients may not extend, implement or mix-in this class.
 abstract class ExportDirective implements NamespaceDirective {
   @override
-  ExportElement get element;
+  ExportElement? get element;
 }
 
 /// A node that represents an expression.
@@ -2009,14 +2017,14 @@
   /// of the function being invoked, then return the parameter element
   /// representing the parameter to which the value of this expression will be
   /// bound. Otherwise, return `null`.
-  ParameterElement get staticParameterElement;
+  ParameterElement? get staticParameterElement;
 
   /// Return the static type of this expression, or `null` if the AST structure
   /// has not been resolved.
-  DartType get staticType;
+  DartType? get staticType;
 
   /// Set the static type of this expression to the given [type].
-  set staticType(DartType type);
+  set staticType(DartType? type);
 
   /// If this expression is a parenthesized expression, return the result of
   /// unwrapping the expression inside the parentheses. Otherwise, return this
@@ -2047,13 +2055,13 @@
   set functionDefinition(Token token);
 
   /// Set token representing the 'async' or 'sync' keyword to the given [token].
-  set keyword(Token token);
+  set keyword(Token? token);
 
   /// Return the semicolon terminating the statement.
-  Token get semicolon;
+  Token? get semicolon;
 
   /// Set the semicolon terminating the statement to the given [token].
-  set semicolon(Token token);
+  set semicolon(Token? token);
 }
 
 /// An expression used as a statement.
@@ -2072,10 +2080,10 @@
   /// Return the semicolon terminating the statement, or `null` if the
   /// expression is a function expression and therefore isn't followed by a
   /// semicolon.
-  Token get semicolon;
+  Token? get semicolon;
 
   /// Set the semicolon terminating the statement to the given [token].
-  set semicolon(Token token);
+  set semicolon(Token? token);
 }
 
 /// The "extends" clause in a class declaration.
@@ -2107,7 +2115,7 @@
 /// Clients may not extend, implement or mix-in this class.
 abstract class ExtensionDeclaration implements CompilationUnitMember {
   @override
-  ExtensionElement get declaredElement;
+  ExtensionElement? get declaredElement;
 
   /// Return the type that is being extended.
   TypeAnnotation get extendedType;
@@ -2123,7 +2131,7 @@
 
   /// Return the name of the extension, or `null` if the extension does not have
   /// a name.
-  SimpleIdentifier get name;
+  SimpleIdentifier? get name;
 
   /// Return the token representing the 'on' keyword.
   Token get onKeyword;
@@ -2133,7 +2141,7 @@
 
   /// Return the type parameters for the extension, or `null` if the extension
   /// does not have any type parameters.
-  TypeParameterList get typeParameters;
+  TypeParameterList? get typeParameters;
 }
 
 /// An override to force resolution to choose a member from a specific
@@ -2152,7 +2160,7 @@
   /// [typeArgumentTypes] to the generic type extended by the extension.
   ///
   /// Return `null` if the AST structure has not been resolved.
-  DartType get extendedType;
+  DartType? get extendedType;
 
   /// Return the name of the extension being selected.
   Identifier get extensionName;
@@ -2163,11 +2171,11 @@
   /// Return the forced extension element.
   ///
   /// Return `null` if the AST structure has not been resolved.
-  ExtensionElement get staticElement;
+  ExtensionElement? get staticElement;
 
   /// Return the type arguments to be applied to the extension, or `null` if no
   /// type arguments were provided.
-  TypeArgumentList get typeArguments;
+  TypeArgumentList? get typeArguments;
 
   /// Return the actual type arguments to be applied to the extension, either
   /// explicitly specified in [typeArguments], or inferred.
@@ -2176,7 +2184,7 @@
   /// if the extension does not have type parameters.
   ///
   /// Return `null` if the AST structure has not been resolved.
-  List<DartType> get typeArgumentTypes;
+  List<DartType>? get typeArgumentTypes;
 }
 
 /// The declaration of one or more fields of the same type.
@@ -2205,16 +2213,16 @@
 /// Clients may not extend, implement or mix-in this class.
 abstract class FieldDeclaration implements ClassMember {
   /// The `abstract` keyword, or `null` if the keyword was not used.
-  Token get abstractKeyword;
+  Token? get abstractKeyword;
 
   /// The 'covariant' keyword, or `null` if the keyword was not used.
-  Token get covariantKeyword;
+  Token? get covariantKeyword;
 
   /// Set the token for the 'covariant' keyword to the given [token].
-  set covariantKeyword(Token token);
+  set covariantKeyword(Token? token);
 
   /// The `external` keyword, or `null` if the keyword was not used.
-  Token get externalKeyword;
+  Token? get externalKeyword;
 
   /// Return the fields being declared.
   VariableDeclarationList get fields;
@@ -2233,10 +2241,10 @@
 
   /// Return the token representing the 'static' keyword, or `null` if the
   /// fields are not static.
-  Token get staticKeyword;
+  Token? get staticKeyword;
 
   /// Set the token representing the 'static' keyword to the given [token].
-  set staticKeyword(Token token);
+  set staticKeyword(Token? token);
 }
 
 /// A field formal parameter.
@@ -2247,21 +2255,24 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class FieldFormalParameter implements NormalFormalParameter {
+  @override
+  SimpleIdentifier get identifier;
+
   /// Return the token representing either the 'final', 'const' or 'var'
   /// keyword, or `null` if no keyword was used.
-  Token get keyword;
+  Token? get keyword;
 
   /// Set the token representing either the 'final', 'const' or 'var' keyword to
   /// the given [token].
-  set keyword(Token token);
+  set keyword(Token? token);
 
   /// Return the parameters of the function-typed parameter, or `null` if this
   /// is not a function-typed field formal parameter.
-  FormalParameterList get parameters;
+  FormalParameterList? get parameters;
 
   /// Set the parameters of the function-typed parameter to the given
   /// [parameters].
-  set parameters(FormalParameterList parameters);
+  set parameters(FormalParameterList? parameters);
 
   /// Return the token representing the period.
   Token get period;
@@ -2272,7 +2283,7 @@
   /// If the parameter is function-typed, and has the question mark, then its
   /// function type is nullable. Having a nullable function type means that the
   /// parameter can be null.
-  Token get question;
+  Token? get question;
 
   /// Return the token representing the 'this' keyword.
   Token get thisKeyword;
@@ -2285,18 +2296,18 @@
   ///
   /// Note that if this is a function-typed field formal parameter this is the
   /// return type of the function.
-  TypeAnnotation get type;
+  TypeAnnotation? get type;
 
   /// Set the declared type of the parameter to the given [type].
-  set type(TypeAnnotation type);
+  set type(TypeAnnotation? type);
 
   /// Return the type parameters associated with this method, or `null` if this
   /// method is not a generic method.
-  TypeParameterList get typeParameters;
+  TypeParameterList? get typeParameters;
 
   /// Set the type parameters associated with this method to the given
   /// [typeParameters].
-  set typeParameters(TypeParameterList typeParameters);
+  set typeParameters(TypeParameterList? typeParameters);
 }
 
 /// The parts of a for-each loop that control the iteration.
@@ -2340,7 +2351,7 @@
 abstract class ForElement implements CollectionElement {
   /// Return the token representing the 'await' keyword, or `null` if there was
   /// no 'await' keyword.
-  Token get awaitKeyword;
+  Token? get awaitKeyword;
 
   /// Return the body of the loop.
   CollectionElement get body;
@@ -2381,14 +2392,16 @@
 /// Clients may not extend, implement or mix-in this class.
 abstract class FormalParameter implements AstNode {
   /// The 'covariant' keyword, or `null` if the keyword was not used.
-  Token get covariantKeyword;
+  Token? get covariantKeyword;
 
   /// Return the element representing this parameter, or `null` if this
   /// parameter has not been resolved.
-  ParameterElement get declaredElement;
+  ParameterElement? get declaredElement;
 
-  /// Return the name of the parameter being declared.
-  SimpleIdentifier get identifier;
+  /// Return the name of the parameter being declared, or `null` if the
+  /// parameter doesn't have a name, such as when it's part of a generic
+  /// function type.
+  SimpleIdentifier? get identifier;
 
   /// Return `true` if this parameter was declared with the 'const' modifier.
   bool get isConst;
@@ -2443,7 +2456,7 @@
   NodeList<Annotation> get metadata;
 
   /// The 'required' keyword, or `null` if the keyword was not used.
-  Token get requiredKeyword;
+  Token? get requiredKeyword;
 }
 
 /// The formal parameter list of a method declaration, function declaration, or
@@ -2477,11 +2490,11 @@
 abstract class FormalParameterList implements AstNode {
   /// Return the left square bracket ('[') or left curly brace ('{') introducing
   /// the optional parameters, or `null` if there are no optional parameters.
-  Token get leftDelimiter;
+  Token? get leftDelimiter;
 
   /// Set the left square bracket ('[') or left curly brace ('{') introducing
   /// the optional parameters to the given [token].
-  set leftDelimiter(Token token);
+  set leftDelimiter(Token? token);
 
   /// Return the left parenthesis.
   Token get leftParenthesis;
@@ -2494,7 +2507,7 @@
   ///
   /// The list will contain `null`s if the parameters in this list have not
   /// been resolved.
-  List<ParameterElement> get parameterElements;
+  List<ParameterElement?> get parameterElements;
 
   /// Return the parameters associated with the method.
   NodeList<FormalParameter> get parameters;
@@ -2502,11 +2515,11 @@
   /// Return the right square bracket (']') or right curly brace ('}')
   /// terminating the optional parameters, or `null` if there are no optional
   /// parameters.
-  Token get rightDelimiter;
+  Token? get rightDelimiter;
 
   /// Set the right square bracket (']') or right curly brace ('}') terminating
   /// the optional parameters to the given [token].
-  set rightDelimiter(Token token);
+  set rightDelimiter(Token? token);
 
   /// Return the right parenthesis.
   Token get rightParenthesis;
@@ -2525,7 +2538,7 @@
 abstract class ForParts implements ForLoopParts {
   /// Return the condition used to determine when to terminate the loop, or
   /// `null` if there is no condition.
-  Expression get condition;
+  Expression? get condition;
 
   /// Return the semicolon separating the initializer and the condition.
   Token get leftSeparator;
@@ -2559,7 +2572,7 @@
 abstract class ForPartsWithExpression implements ForParts {
   /// Return the initialization expression, or `null` if there is no
   /// initialization expression.
-  Expression get initialization;
+  Expression? get initialization;
 }
 
 /// A for or for-each statement.
@@ -2582,7 +2595,7 @@
 abstract class ForStatement implements Statement {
   /// Return the token representing the 'await' keyword, or `null` if there is
   /// no 'await' keyword.
-  Token get awaitKeyword;
+  Token? get awaitKeyword;
 
   /// Return the body of the loop.
   Statement get body;
@@ -2620,11 +2633,11 @@
 
   /// Return the token representing the 'async' or 'sync' keyword, or `null` if
   /// there is no such keyword.
-  Token get keyword;
+  Token? get keyword;
 
   /// Return the star following the 'async' or 'sync' keyword, or `null` if
   /// there is no star.
-  Token get star;
+  Token? get star;
 
   /// If [variable] is a local variable or parameter declared anywhere within
   /// the top level function or method containing this [FunctionBody], return a
@@ -2661,14 +2674,14 @@
 /// Clients may not extend, implement or mix-in this class.
 abstract class FunctionDeclaration implements NamedCompilationUnitMember {
   @override
-  ExecutableElement get declaredElement;
+  ExecutableElement? get declaredElement;
 
   /// Return the token representing the 'external' keyword, or `null` if this is
   /// not an external function.
-  Token get externalKeyword;
+  Token? get externalKeyword;
 
   /// Set the token representing the 'external' keyword to the given [token].
-  set externalKeyword(Token token);
+  set externalKeyword(Token? token);
 
   /// Return the function expression being wrapped.
   FunctionExpression get functionExpression;
@@ -2683,20 +2696,23 @@
   /// Return `true` if this function declares a setter.
   bool get isSetter;
 
+  @override
+  SimpleIdentifier get name;
+
   /// Return the token representing the 'get' or 'set' keyword, or `null` if
   /// this is a function declaration rather than a property declaration.
-  Token get propertyKeyword;
+  Token? get propertyKeyword;
 
   /// Set the token representing the 'get' or 'set' keyword to the given
   /// [token].
-  set propertyKeyword(Token token);
+  set propertyKeyword(Token? token);
 
   /// Return the return type of the function, or `null` if no return type was
   /// declared.
-  TypeAnnotation get returnType;
+  TypeAnnotation? get returnType;
 
   /// Set the return type of the function to the given [type].
-  set returnType(TypeAnnotation type);
+  set returnType(TypeAnnotation? type);
 }
 
 /// A [FunctionDeclaration] used as a statement.
@@ -2720,30 +2736,30 @@
 abstract class FunctionExpression implements Expression {
   /// Return the body of the function, or `null` if this is an external
   /// function.
-  FunctionBody get body;
+  FunctionBody? get body;
 
   /// Set the body of the function to the given [functionBody].
-  set body(FunctionBody functionBody);
+  set body(FunctionBody? functionBody);
 
   /// Return the element associated with the function, or `null` if the AST
   /// structure has not been resolved.
-  ExecutableElement get declaredElement;
+  ExecutableElement? get declaredElement;
 
   /// Return the parameters associated with the function, or `null` if the
   /// function is part of a top-level getter.
-  FormalParameterList get parameters;
+  FormalParameterList? get parameters;
 
   /// Set the parameters associated with the function to the given list of
   /// [parameters].
-  set parameters(FormalParameterList parameters);
+  set parameters(FormalParameterList? parameters);
 
   /// Return the type parameters associated with this method, or `null` if this
   /// method is not a generic method.
-  TypeParameterList get typeParameters;
+  TypeParameterList? get typeParameters;
 
   /// Set the type parameters associated with this method to the given
   /// [typeParameters].
-  set typeParameters(TypeParameterList typeParameters);
+  set typeParameters(TypeParameterList? typeParameters);
 }
 
 /// The invocation of a function resulting from evaluating an expression.
@@ -2772,15 +2788,15 @@
   /// Return the element associated with the function being invoked based on
   /// static type information, or `null` if the AST structure has not been
   /// resolved or the function could not be resolved.
-  ExecutableElement get staticElement;
+  ExecutableElement? get staticElement;
 
   /// Set the element associated with the function being invoked based on static
   /// type information to the given [element].
-  set staticElement(ExecutableElement element);
+  set staticElement(ExecutableElement? element);
 
   /// Set the type arguments to be applied to the method being invoked to the
   /// given [typeArguments].
-  set typeArguments(TypeArgumentList typeArguments);
+  set typeArguments(TypeArgumentList? typeArguments);
 }
 
 /// A function type alias.
@@ -2794,7 +2810,7 @@
 /// Clients may not extend, implement or mix-in this class.
 abstract class FunctionTypeAlias implements TypeAlias {
   @override
-  FunctionTypeAliasElement get declaredElement;
+  FunctionTypeAliasElement? get declaredElement;
 
   /// Return the parameters associated with the function type.
   FormalParameterList get parameters;
@@ -2805,19 +2821,19 @@
 
   /// Return the return type of the function type being defined, or `null` if no
   /// return type was given.
-  TypeAnnotation get returnType;
+  TypeAnnotation? get returnType;
 
   /// Set the return type of the function type being defined to the given
   /// [type].
-  set returnType(TypeAnnotation type);
+  set returnType(TypeAnnotation? type);
 
   /// Return the type parameters for the function type, or `null` if the
   /// function type does not have any type parameters.
-  TypeParameterList get typeParameters;
+  TypeParameterList? get typeParameters;
 
   /// Set the type parameters for the function type to the given list of
   /// [typeParameters].
-  set typeParameters(TypeParameterList typeParameters);
+  set typeParameters(TypeParameterList? typeParameters);
 }
 
 /// A function-typed formal parameter.
@@ -2828,6 +2844,9 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class FunctionTypedFormalParameter implements NormalFormalParameter {
+  @override
+  SimpleIdentifier get identifier;
+
   /// Return the parameters of the function-typed parameter.
   FormalParameterList get parameters;
 
@@ -2838,22 +2857,22 @@
   /// Return the question mark indicating that the function type is nullable, or
   /// `null` if there is no question mark. Having a nullable function type means
   /// that the parameter can be null.
-  Token get question;
+  Token? get question;
 
   /// Return the return type of the function, or `null` if the function does not
   /// have a return type.
-  TypeAnnotation get returnType;
+  TypeAnnotation? get returnType;
 
   /// Set the return type of the function to the given [type].
-  set returnType(TypeAnnotation type);
+  set returnType(TypeAnnotation? type);
 
   /// Return the type parameters associated with this function, or `null` if
   /// this function is not a generic function.
-  TypeParameterList get typeParameters;
+  TypeParameterList? get typeParameters;
 
   /// Set the type parameters associated with this method to the given
   /// [typeParameters].
-  set typeParameters(TypeParameterList typeParameters);
+  set typeParameters(TypeParameterList? typeParameters);
 }
 
 /// An anonymous function type.
@@ -2902,22 +2921,22 @@
 
   /// Set the question mark indicating that the type is nullable to the given
   /// [token].
-  set question(Token token);
+  set question(Token? token);
 
   /// Return the return type of the function type being defined, or `null` if
   /// no return type was given.
-  TypeAnnotation get returnType;
+  TypeAnnotation? get returnType;
 
   /// Set the return type of the function type being defined to the given[type].
-  set returnType(TypeAnnotation type);
+  set returnType(TypeAnnotation? type);
 
   /// Return the type parameters for the function type, or `null` if the
   /// function type does not have any type parameters.
-  TypeParameterList get typeParameters;
+  TypeParameterList? get typeParameters;
 
   /// Set the type parameters for the function type to the given list of
   /// [typeParameters].
-  set typeParameters(TypeParameterList typeParameters);
+  set typeParameters(TypeParameterList? typeParameters);
 }
 
 /// A generic type alias.
@@ -2940,24 +2959,24 @@
   ///
   /// When the non-function type aliases feature is enabled and the denoted
   /// type is not a [GenericFunctionType], return `null`.
-  GenericFunctionType get functionType;
+  GenericFunctionType? get functionType;
 
   /// Set the type of function being defined by the alias to the given
   /// [functionType].
   @Deprecated('Clients should not build AST manually')
-  set functionType(GenericFunctionType functionType);
+  set functionType(GenericFunctionType? functionType);
 
   /// Return the type being defined by the alias.
   TypeAnnotation get type;
 
   /// Return the type parameters for the function type, or `null` if the
   /// function type does not have any type parameters.
-  TypeParameterList get typeParameters;
+  TypeParameterList? get typeParameters;
 
   /// Set the type parameters for the function type to the given list of
   /// [typeParameters].
   @Deprecated('Clients should not build AST manually')
-  set typeParameters(TypeParameterList typeParameters);
+  set typeParameters(TypeParameterList? typeParameters);
 }
 
 /// A combinator that restricts the names being imported to those that are not
@@ -2990,7 +3009,7 @@
   ///
   /// One example of the latter case is an identifier that is not defined
   /// within the scope in which it appears.
-  Element get staticElement;
+  Element? get staticElement;
 
   /// Return `true` if the given [name] is visible only within the library in
   /// which it is declared.
@@ -3007,11 +3026,11 @@
 
   /// Return the statement that is executed if the condition evaluates to
   /// `false`, or `null` if there is no else statement.
-  CollectionElement get elseElement;
+  CollectionElement? get elseElement;
 
   /// Return the token representing the 'else' keyword, or `null` if there is no
   /// else statement.
-  Token get elseKeyword;
+  Token? get elseKeyword;
 
   /// Return the token representing the 'if' keyword.
   Token get ifKeyword;
@@ -3044,18 +3063,18 @@
 
   /// Return the token representing the 'else' keyword, or `null` if there is no
   /// else statement.
-  Token get elseKeyword;
+  Token? get elseKeyword;
 
   /// Set the token representing the 'else' keyword to the given [token].
-  set elseKeyword(Token token);
+  set elseKeyword(Token? token);
 
   /// Return the statement that is executed if the condition evaluates to
   /// `false`, or `null` if there is no else statement.
-  Statement get elseStatement;
+  Statement? get elseStatement;
 
   /// Set the statement that is executed if the condition evaluates to `false`
   /// to the given [statement].
-  set elseStatement(Statement statement);
+  set elseStatement(Statement? statement);
 
   /// Return the token representing the 'if' keyword.
   Token get ifKeyword;
@@ -3116,8 +3135,8 @@
     //
     StringLiteral uri1 = import1.uri;
     StringLiteral uri2 = import2.uri;
-    String uriStr1 = uri1.stringValue;
-    String uriStr2 = uri2.stringValue;
+    String? uriStr1 = uri1.stringValue;
+    String? uriStr2 = uri2.stringValue;
     if (uriStr1 != null || uriStr2 != null) {
       if (uriStr1 == null) {
         return -1;
@@ -3133,10 +3152,10 @@
     //
     // as
     //
-    SimpleIdentifier prefix1 = import1.prefix;
-    SimpleIdentifier prefix2 = import2.prefix;
-    String prefixStr1 = prefix1?.name;
-    String prefixStr2 = prefix2?.name;
+    SimpleIdentifier? prefix1 = import1.prefix;
+    SimpleIdentifier? prefix2 = import2.prefix;
+    String? prefixStr1 = prefix1?.name;
+    String? prefixStr2 = prefix2?.name;
     if (prefixStr1 != null || prefixStr2 != null) {
       if (prefixStr1 == null) {
         return -1;
@@ -3217,28 +3236,28 @@
 
   /// Return the token representing the 'as' keyword, or `null` if the imported
   /// names are not prefixed.
-  Token get asKeyword;
+  Token? get asKeyword;
 
   /// Set the token representing the 'as' keyword to the given [token].
-  set asKeyword(Token token);
+  set asKeyword(Token? token);
 
   /// Return the token representing the 'deferred' keyword, or `null` if the
   /// imported URI is not deferred.
-  Token get deferredKeyword;
+  Token? get deferredKeyword;
 
   /// Set the token representing the 'deferred' keyword to the given [token].
-  set deferredKeyword(Token token);
+  set deferredKeyword(Token? token);
 
   @override
-  ImportElement get element;
+  ImportElement? get element;
 
   /// Return the prefix to be used with the imported names, or `null` if the
   /// imported names are not prefixed.
-  SimpleIdentifier get prefix;
+  SimpleIdentifier? get prefix;
 
   /// Set the prefix to be used with the imported names to the given
   /// [identifier].
-  set prefix(SimpleIdentifier identifier);
+  set prefix(SimpleIdentifier? identifier);
 }
 
 /// An index expression.
@@ -3272,15 +3291,15 @@
 
   /// Return the period (".." | "?..") before a cascaded index expression, or
   /// `null` if this index expression is not part of a cascade expression.
-  Token get period;
+  Token? get period;
 
   /// Set the period ("..") before a cascaded index expression to the given
   /// [token].
-  set period(Token token);
+  set period(Token? token);
 
   /// Return the question mark before the left bracket, or `null` if there is no
   /// question mark.
-  Token get question;
+  Token? get question;
 
   /// Return the expression used to compute the object being indexed.
   ///
@@ -3298,11 +3317,11 @@
   ///
   /// Use [realTarget] to get the target independent of whether this is part of
   /// a cascade expression.
-  Expression get target;
+  Expression? get target;
 
   /// Set the expression used to compute the object being indexed to the given
   /// [expression].
-  set target(Expression expression);
+  set target(Expression? expression);
 
   /// Return `true` if this expression is computing a right-hand value (that is,
   /// if this expression is in a context where the operator '[]' will be
@@ -3352,11 +3371,11 @@
 
   /// Return the 'new' or 'const' keyword used to indicate how an object should
   /// be created, or `null` if the keyword was not explicitly provided.
-  Token get keyword;
+  Token? get keyword;
 
   /// Set the 'new' or 'const' keyword used to indicate how an object should be
   /// created to the given [token].
-  set keyword(Token token);
+  set keyword(Token? token);
 }
 
 /// An integer literal expression.
@@ -3380,11 +3399,12 @@
   /// Set the token representing the literal to the given [token].
   set literal(Token token);
 
-  /// Return the value of the literal.
-  int get value;
+  /// Return the value of the literal, or `null` when [literal] does not
+  /// represent a valid `int` value, for example because of overflow.
+  int? get value;
 
   /// Set the value of the literal to the given [value].
-  set value(int value);
+  set value(int? value);
 }
 
 /// A node within a [StringInterpolation].
@@ -3424,10 +3444,10 @@
 
   /// Return the right curly bracket, or `null` if the expression is an
   /// identifier without brackets.
-  Token get rightBracket;
+  Token? get rightBracket;
 
   /// Set the right curly bracket to the given [token].
-  set rightBracket(Token token);
+  set rightBracket(Token? token);
 }
 
 /// A non-empty substring of an interpolated string.
@@ -3481,15 +3501,15 @@
   /// This will usually be a [FunctionType], but it can also be `dynamic` or
   /// `Function`. In the case of interface types that have a `call` method, we
   /// store the type of that `call` method here as parameterized.
-  DartType get staticInvokeType;
+  DartType? get staticInvokeType;
 
   /// Sets the function type of the invocation based on the static type
   /// information.
-  set staticInvokeType(DartType value);
+  set staticInvokeType(DartType? value);
 
   /// Return the type arguments to be applied to the method being invoked, or
   /// `null` if no type arguments were provided.
-  TypeArgumentList get typeArguments;
+  TypeArgumentList? get typeArguments;
 
   /// Return the actual type arguments of the invocation, either explicitly
   /// specified in [typeArguments], or inferred.
@@ -3498,7 +3518,7 @@
   /// if the [function] does not have type parameters.
   ///
   /// Return `null` if the AST structure has not been resolved.
-  List<DartType> get typeArgumentTypes;
+  List<DartType>? get typeArgumentTypes;
 }
 
 /// An is expression.
@@ -3524,10 +3544,10 @@
 
   /// Return the not operator, or `null` if the sense of the test is not
   /// negated.
-  Token get notOperator;
+  Token? get notOperator;
 
   /// Set the not operator to the given [token].
-  set notOperator(Token token);
+  set notOperator(Token? token);
 
   /// Return the type being tested for.
   TypeAnnotation get type;
@@ -3708,14 +3728,14 @@
   set body(FunctionBody functionBody);
 
   @override
-  ExecutableElement get declaredElement;
+  ExecutableElement? get declaredElement;
 
   /// Return the token for the 'external' keyword, or `null` if the constructor
   /// is not external.
-  Token get externalKeyword;
+  Token? get externalKeyword;
 
   /// Set the token for the 'external' keyword to the given [token].
-  set externalKeyword(Token token);
+  set externalKeyword(Token? token);
 
   /// Return `true` if this method is declared to be an abstract method.
   bool get isAbstract;
@@ -3734,11 +3754,11 @@
 
   /// Return the token representing the 'abstract' or 'static' keyword, or
   /// `null` if neither modifier was specified.
-  Token get modifierKeyword;
+  Token? get modifierKeyword;
 
   /// Set the token representing the 'abstract' or 'static' keyword to the given
   /// [token].
-  set modifierKeyword(Token token);
+  set modifierKeyword(Token? token);
 
   /// Return the name of the method.
   SimpleIdentifier get name;
@@ -3748,41 +3768,41 @@
 
   /// Return the token representing the 'operator' keyword, or `null` if this
   /// method does not declare an operator.
-  Token get operatorKeyword;
+  Token? get operatorKeyword;
 
   /// Set the token representing the 'operator' keyword to the given [token].
-  set operatorKeyword(Token token);
+  set operatorKeyword(Token? token);
 
   /// Return the parameters associated with the method, or `null` if this method
   /// declares a getter.
-  FormalParameterList get parameters;
+  FormalParameterList? get parameters;
 
   /// Set the parameters associated with the method to the given list of
   /// [parameters].
-  set parameters(FormalParameterList parameters);
+  set parameters(FormalParameterList? parameters);
 
   /// Return the token representing the 'get' or 'set' keyword, or `null` if
   /// this is a method declaration rather than a property declaration.
-  Token get propertyKeyword;
+  Token? get propertyKeyword;
 
   /// Set the token representing the 'get' or 'set' keyword to the given
   /// [token].
-  set propertyKeyword(Token token);
+  set propertyKeyword(Token? token);
 
   /// Return the return type of the method, or `null` if no return type was
   /// declared.
-  TypeAnnotation get returnType;
+  TypeAnnotation? get returnType;
 
   /// Set the return type of the method to the given [type].
-  set returnType(TypeAnnotation type);
+  set returnType(TypeAnnotation? type);
 
   /// Return the type parameters associated with this method, or `null` if this
   /// method is not a generic method.
-  TypeParameterList get typeParameters;
+  TypeParameterList? get typeParameters;
 
   /// Set the type parameters associated with this method to the given
   /// [typeParameters].
-  set typeParameters(TypeParameterList typeParameters);
+  set typeParameters(TypeParameterList? typeParameters);
 }
 
 /// The invocation of either a function or a method.
@@ -3821,18 +3841,18 @@
   ///
   /// In an ordinary method invocation this will be period ('.'). In a cascade
   /// section this will be the cascade operator ('..').
-  Token get operator;
+  Token? get operator;
 
   /// Set the operator that separates the target from the method name to the
   /// given [token].
-  set operator(Token token);
+  set operator(Token? token);
 
   /// Return the expression used to compute the receiver of the invocation.
   ///
   /// If this invocation is not part of a cascade expression, then this is the
   /// same as [target]. If this invocation is part of a cascade expression,
   /// then the target stored with the cascade expression is returned.
-  Expression get realTarget;
+  Expression? get realTarget;
 
   /// Return the expression producing the object on which the method is defined,
   /// or `null` if there is no target (that is, the target is implicitly `this`)
@@ -3840,15 +3860,15 @@
   ///
   /// Use [realTarget] to get the target independent of whether this is part of
   /// a cascade expression.
-  Expression get target;
+  Expression? get target;
 
   /// Set the expression producing the object on which the method is defined to
   /// the given [expression].
-  set target(Expression expression);
+  set target(Expression? expression);
 
   /// Set the type arguments to be applied to the method being invoked to the
   /// given [typeArguments].
-  set typeArguments(TypeArgumentList typeArguments);
+  set typeArguments(TypeArgumentList? typeArguments);
 }
 
 /// An expression that implicitly makes reference to a method.
@@ -3860,11 +3880,11 @@
   /// no meaningful static element to return (e.g. because this is a
   /// non-compound assignment expression, or because the method referred to
   /// could not be resolved).
-  MethodElement get staticElement;
+  MethodElement? get staticElement;
 
   /// Set the element associated with the expression based on static types to
   /// the given [element].
-  set staticElement(MethodElement element);
+  set staticElement(MethodElement? element);
 }
 
 /// The declaration of a mixin.
@@ -3880,7 +3900,7 @@
 
   /// Return the on clause for the mixin, or `null` if the mixin does not have
   /// any superclass constraints.
-  OnClause get onClause;
+  OnClause? get onClause;
 }
 
 /// A node that declares a single name within the scope of a compilation unit.
@@ -3905,7 +3925,7 @@
   /// Return the element representing the parameter being named by this
   /// expression, or `null` if the AST structure has not been resolved or if
   /// there is no parameter with the same name as this expression.
-  ParameterElement get element;
+  ParameterElement? get element;
 
   /// Return the expression with which the name is associated.
   Expression get expression;
@@ -3942,18 +3962,18 @@
 
   /// Set the question mark indicating that the type is nullable to the given
   /// [token].
-  set question(Token token);
+  set question(Token? token);
 
   /// Set the type being named to the given [type].
-  set type(DartType type);
+  set type(DartType? type);
 
   /// Return the type arguments associated with the type, or `null` if there are
   /// no type arguments.
-  TypeArgumentList get typeArguments;
+  TypeArgumentList? get typeArguments;
 
   /// Set the type arguments associated with the type to the given
   /// [typeArguments].
-  set typeArguments(TypeArgumentList typeArguments);
+  set typeArguments(TypeArgumentList? typeArguments);
 }
 
 /// A node that represents a directive that impacts the namespace of a library.
@@ -3980,7 +4000,7 @@
   /// This will be the source from the first configuration whose condition is
   /// true, or the [uriSource] if either there are no configurations or if
   /// there are no configurations whose condition is true.
-  Source get selectedSource;
+  Source? get selectedSource;
 
   /// Return the content of the URI that was selected based on the declared
   /// variables.
@@ -3988,7 +4008,7 @@
   /// This will be the URI from the first configuration whose condition is
   /// true, or the [uriContent] if either there are no configurations or if
   /// there are no configurations whose condition is true.
-  String get selectedUriContent;
+  String? get selectedUriContent;
 
   /// Return the semicolon terminating the directive.
   Token get semicolon;
@@ -4005,11 +4025,11 @@
 /// Clients may not extend, implement or mix-in this class.
 abstract class NativeClause implements AstNode {
   /// Return the name of the native object that implements the class.
-  StringLiteral get name;
+  StringLiteral? get name;
 
   /// Set the name of the native object that implements the class to the given
   /// [name].
-  set name(StringLiteral name);
+  set name(StringLiteral? name);
 
   /// Return the token representing the 'native' keyword.
   Token get nativeKeyword;
@@ -4044,11 +4064,11 @@
 
   /// Return the string literal representing the string after the 'native'
   /// token.
-  StringLiteral get stringLiteral;
+  StringLiteral? get stringLiteral;
 
   /// Set the string literal representing the string after the 'native' token to
   /// the given [stringLiteral].
-  set stringLiteral(StringLiteral stringLiteral);
+  set stringLiteral(StringLiteral? stringLiteral);
 }
 
 /// A list of AST nodes that have a common parent.
@@ -4057,11 +4077,11 @@
 abstract class NodeList<E extends AstNode> implements List<E> {
   /// Return the first token included in this node list's source range, or
   /// `null` if the list is empty.
-  Token get beginToken;
+  Token? get beginToken;
 
   /// Return the last token included in this node list's source range, or `null`
   /// if the list is empty.
-  Token get endToken;
+  Token? get endToken;
 
   /// Return the node that is the parent of each of the elements in the list.
   AstNode get owner;
@@ -4090,19 +4110,19 @@
 /// Clients may not extend, implement or mix-in this class.
 abstract class NormalFormalParameter implements FormalParameter {
   /// Set the token for the 'covariant' keyword to the given [token].
-  set covariantKeyword(Token token);
+  set covariantKeyword(Token? token);
 
   /// Return the documentation comment associated with this parameter, or `null`
   /// if this parameter does not have a documentation comment associated with
   /// it.
-  Comment get documentationComment;
+  Comment? get documentationComment;
 
   /// Set the documentation comment associated with this parameter to the given
   /// [comment].
-  set documentationComment(Comment comment);
+  set documentationComment(Comment? comment);
 
   /// Set the name of the parameter being declared to the given [identifier].
-  set identifier(SimpleIdentifier identifier);
+  set identifier(SimpleIdentifier? identifier);
 
   /// Set the metadata associated with this node to the given [metadata].
   set metadata(List<Annotation> metadata);
@@ -4213,11 +4233,11 @@
 abstract class PartOfDirective implements Directive {
   /// Return the name of the library that the containing compilation unit is
   /// part of.
-  LibraryIdentifier get libraryName;
+  LibraryIdentifier? get libraryName;
 
   /// Set the name of the library that the containing compilation unit is part
   /// of to the given [libraryName].
-  set libraryName(LibraryIdentifier libraryName);
+  set libraryName(LibraryIdentifier? libraryName);
 
   /// Return the token representing the 'of' keyword.
   Token get ofKeyword;
@@ -4240,12 +4260,12 @@
   /// Return the URI of the library that the containing compilation unit is part
   /// of, or `null` if no URI was given (typically because a library name was
   /// provided).
-  StringLiteral get uri;
+  StringLiteral? get uri;
 
   /// Return the URI of the library that the containing compilation unit is part
   /// of, or `null` if no URI was given (typically because a library name was
   /// provided).
-  set uri(StringLiteral uri);
+  set uri(StringLiteral? uri);
 }
 
 /// A postfix unary expression.
@@ -4383,11 +4403,11 @@
   ///
   /// Use [realTarget] to get the target independent of whether this is part of
   /// a cascade expression.
-  Expression get target;
+  Expression? get target;
 
   /// Set the expression computing the object defining the property being
   /// accessed to the given [expression].
-  set target(Expression expression);
+  set target(Expression? expression);
 }
 
 /// The invocation of a constructor in the same class from within a
@@ -4407,19 +4427,19 @@
 
   /// Return the name of the constructor that is being invoked, or `null` if the
   /// unnamed constructor is being invoked.
-  SimpleIdentifier get constructorName;
+  SimpleIdentifier? get constructorName;
 
   /// Set the name of the constructor that is being invoked to the given
   /// [identifier].
-  set constructorName(SimpleIdentifier identifier);
+  set constructorName(SimpleIdentifier? identifier);
 
   /// Return the token for the period before the name of the constructor that is
   /// being invoked, or `null` if the unnamed constructor is being invoked.
-  Token get period;
+  Token? get period;
 
   /// Set the token for the period before the name of the constructor that is
   /// being invoked to the given [token].
-  set period(Token token);
+  set period(Token? token);
 
   /// Return the token for the 'this' keyword.
   Token get thisKeyword;
@@ -4451,11 +4471,11 @@
 abstract class ReturnStatement implements Statement {
   /// Return the expression computing the value to be returned, or `null` if no
   /// explicit value was provided.
-  Expression get expression;
+  Expression? get expression;
 
   /// Set the expression computing the value to be returned to the given
   /// [expression].
-  set expression(Expression expression);
+  set expression(Expression? expression);
 
   /// Return the token representing the 'return' keyword.
   Token get returnKeyword;
@@ -4569,18 +4589,18 @@
 abstract class SimpleFormalParameter implements NormalFormalParameter {
   /// Return the token representing either the 'final', 'const' or 'var'
   /// keyword, or `null` if no keyword was used.
-  Token get keyword;
+  Token? get keyword;
 
   /// Set the token representing either the 'final', 'const' or 'var' keyword to
   /// the given [token].
-  set keyword(Token token);
+  set keyword(Token? token);
 
   /// Return the declared type of the parameter, or `null` if the parameter does
   /// not have a declared type.
-  TypeAnnotation get type;
+  TypeAnnotation? get type;
 
   /// Set the declared type of the parameter to the given [type].
-  set type(TypeAnnotation type);
+  set type(TypeAnnotation? type);
 }
 
 /// A simple identifier.
@@ -4600,7 +4620,7 @@
 
   /// Set the element associated with this identifier based on static type
   /// information to the given [element].
-  set staticElement(Element element);
+  set staticElement(Element? element);
 
   /// If the identifier is a tear-off, return the inferred type arguments
   /// applied to the function type of the element to produce its [staticType].
@@ -4612,7 +4632,7 @@
   /// Return `null` if not a tear-off.
   ///
   /// Return `null` if the AST structure has not been resolved.
-  List<DartType> get tearOffTypeArgumentTypes;
+  List<DartType>? get tearOffTypeArgumentTypes;
 
   /// Return the token representing the identifier.
   Token get token;
@@ -4770,7 +4790,7 @@
 abstract class StringLiteral implements Literal {
   /// Return the value of the string literal, or `null` if the string is not a
   /// constant string without any string interpolation.
-  String get stringValue;
+  String? get stringValue;
 }
 
 /// The invocation of a superclass' constructor from within a constructor's
@@ -4790,19 +4810,19 @@
 
   /// Return the name of the constructor that is being invoked, or `null` if the
   /// unnamed constructor is being invoked.
-  SimpleIdentifier get constructorName;
+  SimpleIdentifier? get constructorName;
 
   /// Set the name of the constructor that is being invoked to the given
   /// [identifier].
-  set constructorName(SimpleIdentifier identifier);
+  set constructorName(SimpleIdentifier? identifier);
 
   /// Return the token for the period before the name of the constructor that is
   /// being invoked, or `null` if the unnamed constructor is being invoked.
-  Token get period;
+  Token? get period;
 
   /// Set the token for the period before the name of the constructor that is
   /// being invoked to the given [token].
-  set period(Token token);
+  set period(Token? token);
 
   /// Return the token for the 'super' keyword.
   Token get superKeyword;
@@ -4996,7 +5016,7 @@
 /// Clients may not extend, implement or mix-in this class.
 abstract class TopLevelVariableDeclaration implements CompilationUnitMember {
   /// The `external` keyword, or `null` if the keyword was not used.
-  Token get externalKeyword;
+  Token? get externalKeyword;
 
   /// Return the semicolon terminating the declaration.
   Token get semicolon;
@@ -5033,17 +5053,17 @@
 
   /// Return the finally block contained in the try statement, or `null` if the
   /// statement does not contain a finally clause.
-  Block get finallyBlock;
+  Block? get finallyBlock;
 
   /// Set the finally block contained in the try statement to the given [block].
-  set finallyBlock(Block block);
+  set finallyBlock(Block? block);
 
   /// Return the token representing the 'finally' keyword, or `null` if the
   /// statement does not contain a finally clause.
-  Token get finallyKeyword;
+  Token? get finallyKeyword;
 
   /// Set the token representing the 'finally' keyword to the given [token].
-  set finallyKeyword(Token token);
+  set finallyKeyword(Token? token);
 
   /// Return the token representing the 'try' keyword.
   Token get tryKeyword;
@@ -5063,6 +5083,9 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class TypeAlias implements NamedCompilationUnitMember {
+  @override
+  SimpleIdentifier get name;
+
   /// Return the semicolon terminating the declaration.
   Token get semicolon;
 
@@ -5086,11 +5109,11 @@
 abstract class TypeAnnotation implements AstNode {
   /// The question mark indicating that the type is nullable, or `null` if there
   /// is no question mark.
-  Token get question;
+  Token? get question;
 
   /// Return the type being named, or `null` if the AST structure has not been
   /// resolved.
-  DartType get type;
+  DartType? get type;
 }
 
 /// A list of type arguments.
@@ -5126,10 +5149,10 @@
 abstract class TypedLiteral implements Literal {
   /// Return the token representing the 'const' keyword, or `null` if the
   /// literal is not a constant.
-  Token get constKeyword;
+  Token? get constKeyword;
 
   /// Set the token representing the 'const' keyword to the given [token].
-  set constKeyword(Token token);
+  set constKeyword(Token? token);
 
   /// Return `true` if this literal is a constant expression, either because the
   /// keyword `const` was explicitly provided or because no keyword was provided
@@ -5138,11 +5161,11 @@
 
   /// Return the type argument associated with this literal, or `null` if no
   /// type arguments were declared.
-  TypeArgumentList get typeArguments;
+  TypeArgumentList? get typeArguments;
 
   /// Set the type argument associated with this literal to the given
   /// [typeArguments].
-  set typeArguments(TypeArgumentList typeArguments);
+  set typeArguments(TypeArgumentList? typeArguments);
 }
 
 /// The name of a type, which can optionally include type arguments.
@@ -5162,20 +5185,20 @@
 abstract class TypeParameter implements Declaration {
   /// Return the upper bound for legal arguments, or `null` if there is no
   /// explicit upper bound.
-  TypeAnnotation get bound;
+  TypeAnnotation? get bound;
 
   /// Set the upper bound for legal arguments to the given [type].
-  set bound(TypeAnnotation type);
+  set bound(TypeAnnotation? type);
 
   @override
-  TypeParameterElement get declaredElement;
+  TypeParameterElement? get declaredElement;
 
   /// Return the token representing the 'extends' keyword, or `null` if there is
   /// no explicit upper bound.
-  Token get extendsKeyword;
+  Token? get extendsKeyword;
 
   /// Set the token representing the 'extends' keyword to the given [token].
-  set extendsKeyword(Token token);
+  set extendsKeyword(Token? token);
 
   /// Return the name of the type parameter.
   SimpleIdentifier get name;
@@ -5216,11 +5239,12 @@
   /// Set the URI referenced by this directive to the given [uri].
   set uri(StringLiteral uri);
 
-  /// Return the content of the [uri].
-  String get uriContent;
+  /// Return the content of the [uri], or `null` if the AST structure has not
+  /// been resolved, or if the [uri] has a string interpolation.
+  String? get uriContent;
 
   /// Set the content of the [uri] to the given [content].
-  set uriContent(String content);
+  set uriContent(String? content);
 
   /// Return the element associated with the [uri] of this directive, or `null`
   /// if the AST structure has not been resolved or if the URI could not be
@@ -5228,13 +5252,13 @@
   ///
   /// Examples of the latter case include a directive that contains an invalid
   /// URL or a URL that does not exist.
-  Element get uriElement;
+  Element? get uriElement;
 
   /// Return the source to which the [uri] was resolved.
-  Source get uriSource;
+  Source? get uriSource;
 
   /// Set the source to which the [uri] was resolved to the given [source].
-  set uriSource(Source source);
+  set uriSource(Source? source);
 }
 
 /// An identifier that has an initial value associated with it.
@@ -5252,23 +5276,23 @@
 // extend [Declaration].
 abstract class VariableDeclaration implements Declaration {
   @override
-  VariableElement get declaredElement;
+  VariableElement? get declaredElement;
 
   /// Return the equal sign separating the variable name from the initial value,
   /// or `null` if the initial value was not specified.
-  Token get equals;
+  Token? get equals;
 
   /// Set the equal sign separating the variable name from the initial value to
   /// the given [token].
-  set equals(Token token);
+  set equals(Token? token);
 
   /// Return the expression used to compute the initial value for the variable,
   /// or `null` if the initial value was not specified.
-  Expression get initializer;
+  Expression? get initializer;
 
   /// Set the expression used to compute the initial value for the variable to
   /// the given [expression].
-  set initializer(Expression expression);
+  set initializer(Expression? expression);
 
   /// Return `true` if this variable was declared with the 'const' modifier.
   bool get isConst;
@@ -5320,22 +5344,22 @@
 
   /// Return the token representing the 'final', 'const' or 'var' keyword, or
   /// `null` if no keyword was included.
-  Token get keyword;
+  Token? get keyword;
 
   /// Set the token representing the 'final', 'const' or 'var' keyword to the
   /// given [token].
-  set keyword(Token token);
+  set keyword(Token? token);
 
   /// Return the token representing the 'late' keyword, or `null` if the late
   /// modifier was not included.
-  Token get lateKeyword;
+  Token? get lateKeyword;
 
   /// Return the type of the variables being declared, or `null` if no type was
   /// provided.
-  TypeAnnotation get type;
+  TypeAnnotation? get type;
 
   /// Set the type of the variables being declared to the given [type].
-  set type(TypeAnnotation type);
+  set type(TypeAnnotation? type);
 
   /// Return a list containing the individual variables being declared.
   NodeList<VariableDeclaration> get variables;
@@ -5439,11 +5463,11 @@
   set semicolon(Token token);
 
   /// Return the star optionally following the 'yield' keyword.
-  Token get star;
+  Token? get star;
 
   /// Return the star optionally following the 'yield' keyword to the given
   /// [token].
-  set star(Token token);
+  set star(Token? token);
 
   /// Return the 'yield' keyword.
   Token get yieldKeyword;
diff --git a/pkg/analyzer/lib/dart/ast/ast_factory.dart b/pkg/analyzer/lib/dart/ast/ast_factory.dart
index 4dcba21..55a558c 100644
--- a/pkg/analyzer/lib/dart/ast/ast_factory.dart
+++ b/pkg/analyzer/lib/dart/ast/ast_factory.dart
@@ -6,7 +6,6 @@
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
-import 'package:meta/meta.dart';
 
 /// A collection of factory methods which may be used to create concrete
 /// instances of the interfaces that constitute the AST.
@@ -21,8 +20,8 @@
   /// [constructorName] can be `null` if the annotation is not referencing a
   /// named constructor. The [arguments] can be `null` if the annotation is not
   /// referencing a constructor.
-  Annotation annotation(Token atSign, Identifier name, Token period,
-      SimpleIdentifier constructorName, ArgumentList arguments);
+  Annotation annotation(Token atSign, Identifier name, Token? period,
+      SimpleIdentifier? constructorName, ArgumentList? arguments);
 
   /// Returns a newly created list of arguments. The list of [arguments] can
   /// be `null` if there are no arguments.
@@ -39,8 +38,8 @@
       Token assertKeyword,
       Token leftParenthesis,
       Expression condition,
-      Token comma,
-      Expression message,
+      Token? comma,
+      Expression? message,
       Token rightParenthesis);
 
   /// Returns a newly created assert statement. The [comma] and [message] can
@@ -49,8 +48,8 @@
       Token assertKeyword,
       Token leftParenthesis,
       Expression condition,
-      Token comma,
-      Expression message,
+      Token? comma,
+      Expression? message,
       Token rightParenthesis,
       Token semicolon);
 
@@ -76,7 +75,7 @@
   /// statements. The [keyword] can be `null` if there is no keyword specified
   /// for the block. The [star] can be `null` if there is no star following the
   /// keyword (and must be `null` if there is no keyword).
-  BlockFunctionBody blockFunctionBody(Token keyword, Token star, Block block);
+  BlockFunctionBody blockFunctionBody(Token? keyword, Token? star, Block block);
 
   /// Returns a newly created boolean literal.
   BooleanLiteral booleanLiteral(Token literal, bool value);
@@ -84,7 +83,7 @@
   /// Returns a newly created break statement. The [label] can be `null` if
   /// there is no label associated with the statement.
   BreakStatement breakStatement(
-      Token breakKeyword, SimpleIdentifier label, Token semicolon);
+      Token breakKeyword, SimpleIdentifier? label, Token semicolon);
 
   /// Returns a newly created cascade expression. The list of
   /// [cascadeSections] must contain at least one element.
@@ -96,14 +95,14 @@
   /// [stackTraceParameter] can be `null` if the stack trace parameter is not
   /// defined.
   CatchClause catchClause(
-      Token onKeyword,
-      TypeAnnotation exceptionType,
-      Token catchKeyword,
-      Token leftParenthesis,
-      SimpleIdentifier exceptionParameter,
-      Token comma,
-      SimpleIdentifier stackTraceParameter,
-      Token rightParenthesis,
+      Token? onKeyword,
+      TypeAnnotation? exceptionType,
+      Token? catchKeyword,
+      Token? leftParenthesis,
+      SimpleIdentifier? exceptionParameter,
+      Token? comma,
+      SimpleIdentifier? stackTraceParameter,
+      Token? rightParenthesis,
       Block body);
 
   /// Returns a newly created class declaration. Either or both of the
@@ -115,15 +114,15 @@
   /// corresponding clause. The list of [members] can be `null` if the class
   /// does not have any members.
   ClassDeclaration classDeclaration(
-      Comment comment,
-      List<Annotation> metadata,
-      Token abstractKeyword,
+      Comment? comment,
+      List<Annotation>? metadata,
+      Token? abstractKeyword,
       Token classKeyword,
       SimpleIdentifier name,
-      TypeParameterList typeParameters,
-      ExtendsClause extendsClause,
-      WithClause withClause,
-      ImplementsClause implementsClause,
+      TypeParameterList? typeParameters,
+      ExtendsClause? extendsClause,
+      WithClause? withClause,
+      ImplementsClause? implementsClause,
       Token leftBracket,
       List<ClassMember> members,
       Token rightBracket);
@@ -135,37 +134,35 @@
   /// the class is not abstract. The [implementsClause] can be `null` if the
   /// class does not implement any interfaces.
   ClassTypeAlias classTypeAlias(
-      Comment comment,
-      List<Annotation> metadata,
+      Comment? comment,
+      List<Annotation>? metadata,
       Token keyword,
       SimpleIdentifier name,
-      TypeParameterList typeParameters,
+      TypeParameterList? typeParameters,
       Token equals,
-      Token abstractKeyword,
+      Token? abstractKeyword,
       TypeName superclass,
       WithClause withClause,
-      ImplementsClause implementsClause,
+      ImplementsClause? implementsClause,
       Token semicolon);
 
   /// Returns a newly created reference to a Dart element. The [newKeyword]
   /// can be `null` if the reference is not to a constructor.
-  CommentReference commentReference(Token newKeyword, Identifier identifier);
+  CommentReference commentReference(Token? newKeyword, Identifier identifier);
 
   /// Returns a newly created compilation unit to have the given directives and
   /// declarations.  The [scriptTag] can be `null` (or omitted) if there is no
   /// script tag in the compilation unit.  The list of [declarations] can be
   /// `null` (or omitted) if there are no directives in the compilation unit.
   /// The list of `declarations` can be `null` (or omitted) if there are no
-  /// declarations in the compilation unit.  The [featureSet] can be `null` if
-  /// the set of features for this compilation unit is not known (this
-  /// restricts what analysis can be done of the compilation unit).
+  /// declarations in the compilation unit.
   CompilationUnit compilationUnit(
-      {@required Token beginToken,
-      ScriptTag scriptTag,
-      List<Directive> directives,
-      List<CompilationUnitMember> declarations,
-      @required Token endToken,
-      @required FeatureSet featureSet});
+      {required Token beginToken,
+      ScriptTag? scriptTag,
+      List<Directive>? directives,
+      List<CompilationUnitMember>? declarations,
+      required Token endToken,
+      required FeatureSet featureSet});
 
   /// Returns a newly created conditional expression.
   ConditionalExpression conditionalExpression(
@@ -180,8 +177,8 @@
       Token ifKeyword,
       Token leftParenthesis,
       DottedName name,
-      Token equalToken,
-      StringLiteral value,
+      Token? equalToken,
+      StringLiteral? value,
       Token rightParenthesis,
       StringLiteral libraryUri);
 
@@ -199,26 +196,26 @@
   /// does not redirect to a different constructor. The [body] can be `null` if
   /// the constructor does not have a body.
   ConstructorDeclaration constructorDeclaration(
-      Comment comment,
-      List<Annotation> metadata,
-      Token externalKeyword,
-      Token constKeyword,
-      Token factoryKeyword,
+      Comment? comment,
+      List<Annotation>? metadata,
+      Token? externalKeyword,
+      Token? constKeyword,
+      Token? factoryKeyword,
       Identifier returnType,
-      Token period,
-      SimpleIdentifier name,
+      Token? period,
+      SimpleIdentifier? name,
       FormalParameterList parameters,
-      Token separator,
-      List<ConstructorInitializer> initializers,
-      ConstructorName redirectedConstructor,
-      FunctionBody body);
+      Token? separator,
+      List<ConstructorInitializer>? initializers,
+      ConstructorName? redirectedConstructor,
+      FunctionBody? body);
 
   /// Returns a newly created field initializer to initialize the field with
   /// the given name to the value of the given expression. The [thisKeyword] and
   /// [period] can be `null` if the 'this' keyword was not specified.
   ConstructorFieldInitializer constructorFieldInitializer(
-      Token thisKeyword,
-      Token period,
+      Token? thisKeyword,
+      Token? period,
       SimpleIdentifier fieldName,
       Token equals,
       Expression expression);
@@ -226,28 +223,28 @@
   /// Returns a newly created constructor name. The [period] and [name] can be
   /// `null` if the constructor being named is the unnamed constructor.
   ConstructorName constructorName(
-      TypeName type, Token period, SimpleIdentifier name);
+      TypeName type, Token? period, SimpleIdentifier? name);
 
   /// Returns a newly created continue statement. The [label] can be `null` if
   /// there is no label associated with the statement.
   ContinueStatement continueStatement(
-      Token continueKeyword, SimpleIdentifier label, Token semicolon);
+      Token continueKeyword, SimpleIdentifier? label, Token semicolon);
 
   /// Returns a newly created formal parameter. Either or both of the
   /// [comment] and [metadata] can be `null` if the declaration does not have
   /// the corresponding attribute. The [keyword] can be `null` if a type name is
   /// given. The [type] must be `null` if the keyword is 'var'.
   DeclaredIdentifier declaredIdentifier(
-      Comment comment,
-      List<Annotation> metadata,
-      Token keyword,
-      TypeAnnotation type,
+      Comment? comment,
+      List<Annotation>? metadata,
+      Token? keyword,
+      TypeAnnotation? type,
       SimpleIdentifier identifier);
 
   /// Returns a newly created default formal parameter. The [separator] and
   /// [defaultValue] can be `null` if there is no default value.
   DefaultFormalParameter defaultFormalParameter(NormalFormalParameter parameter,
-      ParameterKind kind, Token separator, Expression defaultValue);
+      ParameterKind kind, Token? separator, Expression? defaultValue);
 
   /// Returns a documentation comment consisting of the given [tokens] and
   /// having the given [references] (if supplied) embedded within it.
@@ -284,15 +281,15 @@
   /// corresponding attribute. (Technically, enum constants cannot have
   /// metadata, but we allow it for consistency.)
   EnumConstantDeclaration enumConstantDeclaration(
-      Comment comment, List<Annotation> metadata, SimpleIdentifier name);
+      Comment? comment, List<Annotation>? metadata, SimpleIdentifier name);
 
   /// Returns a newly created enumeration declaration. Either or both of the
   /// [comment] and [metadata] can be `null` if the declaration does not have
   /// the corresponding attribute. The list of [constants] must contain at least
   /// one value.
   EnumDeclaration enumDeclaration(
-      Comment comment,
-      List<Annotation> metadata,
+      Comment? comment,
+      List<Annotation>? metadata,
       Token enumKeyword,
       SimpleIdentifier name,
       Token leftBracket,
@@ -304,23 +301,23 @@
   /// corresponding attribute. The list of [combinators] can be `null` if there
   /// are no combinators.
   ExportDirective exportDirective(
-      Comment comment,
-      List<Annotation> metadata,
+      Comment? comment,
+      List<Annotation>? metadata,
       Token keyword,
       StringLiteral libraryUri,
-      List<Configuration> configurations,
-      List<Combinator> combinators,
+      List<Configuration>? configurations,
+      List<Combinator>? combinators,
       Token semicolon);
 
-  /// Returns a newly created function body consisting of a block of statements.
+  /// Returns a newly created function body consisting of an expression.
   /// The [keyword] can be `null` if the function body is not an async function
   /// body.
-  ExpressionFunctionBody expressionFunctionBody(Token keyword,
-      Token functionDefinition, Expression expression, Token semicolon);
+  ExpressionFunctionBody expressionFunctionBody(Token? keyword,
+      Token functionDefinition, Expression expression, Token? semicolon);
 
   /// Returns a newly created expression statement.
   ExpressionStatement expressionStatement(
-      Expression expression, Token semicolon);
+      Expression expression, Token? semicolon);
 
   /// Returns a newly created extends clause.
   ExtendsClause extendsClause(Token extendsKeyword, TypeName superclass);
@@ -328,37 +325,37 @@
   /// Return a newly created extension declaration. The list of [typeParameters]
   /// can be `null` if there are no type parameters.
   ExtensionDeclaration extensionDeclaration(
-      {Comment comment,
-      List<Annotation> metadata,
-      Token extensionKeyword,
-      @required SimpleIdentifier name,
-      TypeParameterList typeParameters,
-      Token onKeyword,
-      @required TypeAnnotation extendedType,
-      Token leftBracket,
-      List<ClassMember> members,
-      Token rightBracket});
+      {Comment? comment,
+      List<Annotation>? metadata,
+      required Token extensionKeyword,
+      required SimpleIdentifier? name,
+      TypeParameterList? typeParameters,
+      required Token onKeyword,
+      required TypeAnnotation extendedType,
+      required Token leftBracket,
+      required List<ClassMember> members,
+      required Token rightBracket});
 
   /// Return a newly created extension override. The list of [typeArguments]
   /// can be `null` if there are no type arguments.
   ExtensionOverride extensionOverride(
-      {@required Identifier extensionName,
-      TypeArgumentList typeArguments,
-      @required ArgumentList argumentList});
+      {required Identifier extensionName,
+      TypeArgumentList? typeArguments,
+      required ArgumentList argumentList});
 
   /// Returns a newly created field declaration. Either or both of the
   /// [comment] and [metadata] can be `null` if the declaration does not have
   /// the corresponding attribute. The [staticKeyword] can be `null` if the
   /// field is not a static field.
   FieldDeclaration fieldDeclaration2(
-      {Comment comment,
-      List<Annotation> metadata,
-      Token abstractKeyword,
-      Token covariantKeyword,
-      Token externalKeyword,
-      Token staticKeyword,
-      @required VariableDeclarationList fieldList,
-      @required Token semicolon});
+      {Comment? comment,
+      List<Annotation>? metadata,
+      Token? abstractKeyword,
+      Token? covariantKeyword,
+      Token? externalKeyword,
+      Token? staticKeyword,
+      required VariableDeclarationList fieldList,
+      required Token semicolon});
 
   /// Returns a newly created formal parameter. Either or both of the [comment]
   /// and [metadata] can be `null` if the parameter does not have the
@@ -368,37 +365,41 @@
   /// [parameters] can be `null` if this is not a function-typed field formal
   /// parameter.
   FieldFormalParameter fieldFormalParameter2(
-      {Comment comment,
-      List<Annotation> metadata,
-      Token covariantKeyword,
-      Token requiredKeyword,
-      Token keyword,
-      TypeAnnotation type,
-      @required Token thisKeyword,
-      @required Token period,
-      @required SimpleIdentifier identifier,
-      TypeParameterList typeParameters,
-      FormalParameterList parameters,
-      Token question});
+      {Comment? comment,
+      List<Annotation>? metadata,
+      Token? covariantKeyword,
+      Token? requiredKeyword,
+      Token? keyword,
+      TypeAnnotation? type,
+      required Token thisKeyword,
+      required Token period,
+      required SimpleIdentifier identifier,
+      TypeParameterList? typeParameters,
+      FormalParameterList? parameters,
+      Token? question});
 
   /// Returns a newly created for each part that includes a declaration.
   ForEachPartsWithDeclaration forEachPartsWithDeclaration(
-      {DeclaredIdentifier loopVariable, Token inKeyword, Expression iterable});
+      {required DeclaredIdentifier loopVariable,
+      required Token inKeyword,
+      required Expression iterable});
 
   /// Returns a newly created for each part that includes an identifier that is
   /// declared outside of the loop.
   ForEachPartsWithIdentifier forEachPartsWithIdentifier(
-      {SimpleIdentifier identifier, Token inKeyword, Expression iterable});
+      {required SimpleIdentifier identifier,
+      required Token inKeyword,
+      required Expression iterable});
 
   /// Returns a newly created for element that can be part of a list, map or set
   /// literal.
   ForElement forElement(
-      {Token awaitKeyword,
-      Token forKeyword,
-      Token leftParenthesis,
-      ForLoopParts forLoopParts,
-      Token rightParenthesis,
-      CollectionElement body});
+      {Token? awaitKeyword,
+      required Token forKeyword,
+      required Token leftParenthesis,
+      required ForLoopParts forLoopParts,
+      required Token rightParenthesis,
+      required CollectionElement body});
 
   /// Returns a newly created parameter list. The list of [parameters] can be
   /// `null` if there are no parameters. The [leftDelimiter] and
@@ -406,34 +407,34 @@
   FormalParameterList formalParameterList(
       Token leftParenthesis,
       List<FormalParameter> parameters,
-      Token leftDelimiter,
-      Token rightDelimiter,
+      Token? leftDelimiter,
+      Token? rightDelimiter,
       Token rightParenthesis);
 
   /// Returns a newly created for part that includes a declaration.
   ForPartsWithDeclarations forPartsWithDeclarations(
-      {VariableDeclarationList variables,
-      Token leftSeparator,
-      Expression condition,
-      Token rightSeparator,
-      List<Expression> updaters});
+      {required VariableDeclarationList variables,
+      required Token leftSeparator,
+      Expression? condition,
+      required Token rightSeparator,
+      List<Expression>? updaters});
 
   /// Returns a newly created for part that includes an expression.
   ForPartsWithExpression forPartsWithExpression(
-      {Expression initialization,
-      Token leftSeparator,
-      Expression condition,
-      Token rightSeparator,
-      List<Expression> updaters});
+      {Expression? initialization,
+      required Token leftSeparator,
+      Expression? condition,
+      required Token rightSeparator,
+      List<Expression>? updaters});
 
   /// Returns a newly created for statement.
   ForStatement forStatement(
-      {Token awaitKeyword,
-      Token forKeyword,
-      Token leftParenthesis,
-      ForLoopParts forLoopParts,
-      Token rightParenthesis,
-      Statement body});
+      {Token? awaitKeyword,
+      required Token forKeyword,
+      required Token leftParenthesis,
+      required ForLoopParts forLoopParts,
+      required Token rightParenthesis,
+      required Statement body});
 
   /// Returns a newly created function declaration. Either or both of the
   /// [comment] and [metadata] can be `null` if the function does not have the
@@ -442,11 +443,11 @@
   /// return type was specified. The [propertyKeyword] can be `null` if the
   /// function is neither a getter or a setter.
   FunctionDeclaration functionDeclaration(
-      Comment comment,
-      List<Annotation> metadata,
-      Token externalKeyword,
-      TypeAnnotation returnType,
-      Token propertyKeyword,
+      Comment? comment,
+      List<Annotation>? metadata,
+      Token? externalKeyword,
+      TypeAnnotation? returnType,
+      Token? propertyKeyword,
       SimpleIdentifier name,
       FunctionExpression functionExpression);
 
@@ -455,12 +456,12 @@
       FunctionDeclaration functionDeclaration);
 
   /// Returns a newly created function declaration.
-  FunctionExpression functionExpression(TypeParameterList typeParameters,
-      FormalParameterList parameters, FunctionBody body);
+  FunctionExpression functionExpression(TypeParameterList? typeParameters,
+      FormalParameterList? parameters, FunctionBody? body);
 
   /// Returns a newly created function expression invocation.
   FunctionExpressionInvocation functionExpressionInvocation(Expression function,
-      TypeArgumentList typeArguments, ArgumentList argumentList);
+      TypeArgumentList? typeArguments, ArgumentList argumentList);
 
   /// Returns a newly created function type alias. Either or both of the
   /// [comment] and [metadata] can be `null` if the function does not have the
@@ -468,12 +469,12 @@
   /// was specified. The [typeParameters] can be `null` if the function has no
   /// type parameters.
   FunctionTypeAlias functionTypeAlias(
-      Comment comment,
-      List<Annotation> metadata,
+      Comment? comment,
+      List<Annotation>? metadata,
       Token keyword,
-      TypeAnnotation returnType,
+      TypeAnnotation? returnType,
       SimpleIdentifier name,
-      TypeParameterList typeParameters,
+      TypeParameterList? typeParameters,
       FormalParameterList parameters,
       Token semicolon);
 
@@ -482,34 +483,34 @@
   /// corresponding attribute. The [returnType] can be `null` if no return type
   /// was specified.
   FunctionTypedFormalParameter functionTypedFormalParameter2(
-      {Comment comment,
-      List<Annotation> metadata,
-      Token covariantKeyword,
-      Token requiredKeyword,
-      TypeAnnotation returnType,
-      @required SimpleIdentifier identifier,
-      TypeParameterList typeParameters,
-      @required FormalParameterList parameters,
-      Token question});
+      {Comment? comment,
+      List<Annotation>? metadata,
+      Token? covariantKeyword,
+      Token? requiredKeyword,
+      TypeAnnotation? returnType,
+      required SimpleIdentifier identifier,
+      TypeParameterList? typeParameters,
+      required FormalParameterList parameters,
+      Token? question});
 
   /// Initialize a newly created generic function type.
   GenericFunctionType genericFunctionType(
-      TypeAnnotation returnType,
+      TypeAnnotation? returnType,
       Token functionKeyword,
-      TypeParameterList typeParameters,
+      TypeParameterList? typeParameters,
       FormalParameterList parameters,
-      {Token question});
+      {Token? question});
 
   /// Returns a newly created generic type alias. Either or both of the
   /// [comment] and [metadata] can be `null` if the variable list does not have
   /// the corresponding attribute. The [typeParameters] can be `null` if there
   /// are no type parameters.
   GenericTypeAlias genericTypeAlias(
-      Comment comment,
-      List<Annotation> metadata,
+      Comment? comment,
+      List<Annotation>? metadata,
       Token typedefKeyword,
       SimpleIdentifier name,
-      TypeParameterList typeParameters,
+      TypeParameterList? typeParameters,
       Token equals,
       TypeAnnotation type,
       Token semicolon);
@@ -521,13 +522,13 @@
   /// Returns a newly created if element that can be part of a list, map or set
   /// literal.
   IfElement ifElement(
-      {Token ifKeyword,
-      Token leftParenthesis,
-      Expression condition,
-      Token rightParenthesis,
-      CollectionElement thenElement,
-      Token elseKeyword,
-      CollectionElement elseElement});
+      {required Token ifKeyword,
+      required Token leftParenthesis,
+      required Expression condition,
+      required Token rightParenthesis,
+      required CollectionElement thenElement,
+      Token? elseKeyword,
+      CollectionElement? elseElement});
 
   /// Returns a newly created if statement. The [elseKeyword] and
   /// [elseStatement] can be `null` if there is no else clause.
@@ -537,8 +538,8 @@
       Expression condition,
       Token rightParenthesis,
       Statement thenStatement,
-      Token elseKeyword,
-      Statement elseStatement);
+      Token? elseKeyword,
+      Statement? elseStatement);
 
   /// Returns a newly created implements clause.
   ImplementsClause implementsClause(
@@ -551,44 +552,44 @@
   /// does not specify a prefix. The list of [combinators] can be `null` if
   /// there are no combinators.
   ImportDirective importDirective(
-      Comment comment,
-      List<Annotation> metadata,
+      Comment? comment,
+      List<Annotation>? metadata,
       Token keyword,
       StringLiteral libraryUri,
-      List<Configuration> configurations,
-      Token deferredKeyword,
-      Token asKeyword,
-      SimpleIdentifier prefix,
-      List<Combinator> combinators,
+      List<Configuration>? configurations,
+      Token? deferredKeyword,
+      Token? asKeyword,
+      SimpleIdentifier? prefix,
+      List<Combinator>? combinators,
       Token semicolon);
 
   /// Returns a newly created index expression.
   IndexExpression indexExpressionForCascade2(
-      {@required Token period,
-      Token question,
-      @required Token leftBracket,
-      @required Expression index,
-      @required Token rightBracket});
+      {required Token period,
+      Token? question,
+      required Token leftBracket,
+      required Expression index,
+      required Token rightBracket});
 
   /// Returns a newly created index expression.
   IndexExpression indexExpressionForTarget2(
-      {@required Expression target,
-      Token question,
-      @required Token leftBracket,
-      @required Expression index,
-      @required Token rightBracket});
+      {required Expression target,
+      Token? question,
+      required Token leftBracket,
+      required Expression index,
+      required Token rightBracket});
 
   /// Returns a newly created instance creation expression.
-  InstanceCreationExpression instanceCreationExpression(
-      Token keyword, ConstructorName constructorName, ArgumentList argumentList,
-      {TypeArgumentList typeArguments});
+  InstanceCreationExpression instanceCreationExpression(Token? keyword,
+      ConstructorName constructorName, ArgumentList argumentList,
+      {TypeArgumentList? typeArguments});
 
   /// Returns a newly created integer literal.
-  IntegerLiteral integerLiteral(Token literal, int value);
+  IntegerLiteral integerLiteral(Token literal, int? value);
 
   /// Returns a newly created interpolation expression.
   InterpolationExpression interpolationExpression(
-      Token leftBracket, Expression expression, Token rightBracket);
+      Token leftBracket, Expression expression, Token? rightBracket);
 
   /// Returns a newly created string of characters that are part of a string
   /// interpolation.
@@ -597,7 +598,7 @@
   /// Returns a newly created is expression. The [notOperator] can be `null`
   /// if the sense of the test is not negated.
   IsExpression isExpression(Expression expression, Token isOperator,
-      Token notOperator, TypeAnnotation type);
+      Token? notOperator, TypeAnnotation type);
 
   /// Returns a newly created label.
   Label label(SimpleIdentifier label, Token colon);
@@ -608,8 +609,12 @@
   /// Returns a newly created library directive. Either or both of the
   /// [comment] and [metadata] can be `null` if the directive does not have the
   /// corresponding attribute.
-  LibraryDirective libraryDirective(Comment comment, List<Annotation> metadata,
-      Token libraryKeyword, LibraryIdentifier name, Token semicolon);
+  LibraryDirective libraryDirective(
+      Comment? comment,
+      List<Annotation>? metadata,
+      Token libraryKeyword,
+      LibraryIdentifier name,
+      Token semicolon);
 
   /// Returns a newly created prefixed identifier.
   LibraryIdentifier libraryIdentifier(List<SimpleIdentifier> components);
@@ -618,7 +623,7 @@
   /// if the literal is not a constant. The [typeArguments] can be `null` if no
   /// type arguments were declared. The list of [elements] can be `null` if the
   /// list is empty.
-  ListLiteral listLiteral(Token constKeyword, TypeArgumentList typeArguments,
+  ListLiteral listLiteral(Token? constKeyword, TypeArgumentList? typeArguments,
       Token leftBracket, List<CollectionElement> elements, Token rightBracket);
 
   /// Returns a newly created map literal entry.
@@ -635,36 +640,36 @@
   /// `null` if the method does not implement an operator. The [parameters] must
   /// be `null` if this method declares a getter.
   MethodDeclaration methodDeclaration(
-      Comment comment,
-      List<Annotation> metadata,
-      Token externalKeyword,
-      Token modifierKeyword,
-      TypeAnnotation returnType,
-      Token propertyKeyword,
-      Token operatorKeyword,
+      Comment? comment,
+      List<Annotation>? metadata,
+      Token? externalKeyword,
+      Token? modifierKeyword,
+      TypeAnnotation? returnType,
+      Token? propertyKeyword,
+      Token? operatorKeyword,
       SimpleIdentifier name,
-      TypeParameterList typeParameters,
-      FormalParameterList parameters,
+      TypeParameterList? typeParameters,
+      FormalParameterList? parameters,
       FunctionBody body);
 
   /// Returns a newly created method invocation. The [target] and [operator]
   /// can be `null` if there is no target.
   MethodInvocation methodInvocation(
-      Expression target,
-      Token operator,
+      Expression? target,
+      Token? operator,
       SimpleIdentifier methodName,
-      TypeArgumentList typeArguments,
+      TypeArgumentList? typeArguments,
       ArgumentList argumentList);
 
   /// Return a newly created mixin declaration.
   MixinDeclaration mixinDeclaration(
-      Comment comment,
-      List<Annotation> metadata,
+      Comment? comment,
+      List<Annotation>? metadata,
       Token mixinKeyword,
       SimpleIdentifier name,
-      TypeParameterList typeParameters,
-      OnClause onClause,
-      ImplementsClause implementsClause,
+      TypeParameterList? typeParameters,
+      OnClause? onClause,
+      ImplementsClause? implementsClause,
       Token leftBracket,
       List<ClassMember> members,
       Token rightBracket);
@@ -673,17 +678,17 @@
   NamedExpression namedExpression(Label name, Expression expression);
 
   /// Returns a newly created native clause.
-  NativeClause nativeClause(Token nativeKeyword, StringLiteral name);
+  NativeClause nativeClause(Token nativeKeyword, StringLiteral? name);
 
   /// Returns a newly created function body consisting of the 'native' token,
   /// a string literal, and a semicolon.
   NativeFunctionBody nativeFunctionBody(
-      Token nativeKeyword, StringLiteral stringLiteral, Token semicolon);
+      Token nativeKeyword, StringLiteral? stringLiteral, Token semicolon);
 
   /// Returns a newly created list of nodes such that all of the nodes that
   /// are added to the list will have their parent set to the given [owner]. The
   /// list will initially be populated with the given [elements].
-  NodeList<E> nodeList<E extends AstNode>(AstNode owner, [List<E> elements]);
+  NodeList<E> nodeList<E extends AstNode>(AstNode owner, [List<E>? elements]);
 
   /// Returns a newly created null literal.
   NullLiteral nullLiteral(Token literal);
@@ -698,19 +703,19 @@
   /// Returns a newly created part directive. Either or both of the [comment]
   /// and [metadata] can be `null` if the directive does not have the
   /// corresponding attribute.
-  PartDirective partDirective(Comment comment, List<Annotation> metadata,
+  PartDirective partDirective(Comment? comment, List<Annotation>? metadata,
       Token partKeyword, StringLiteral partUri, Token semicolon);
 
   /// Returns a newly created part-of directive. Either or both of the
   /// [comment] and [metadata] can be `null` if the directive does not have the
   /// corresponding attribute.
   PartOfDirective partOfDirective(
-      Comment comment,
-      List<Annotation> metadata,
+      Comment? comment,
+      List<Annotation>? metadata,
       Token partKeyword,
       Token ofKeyword,
-      StringLiteral uri,
-      LibraryIdentifier libraryName,
+      StringLiteral? uri,
+      LibraryIdentifier? libraryName,
       Token semicolon);
 
   /// Returns a newly created postfix expression.
@@ -725,15 +730,15 @@
 
   /// Returns a newly created property access expression.
   PropertyAccess propertyAccess(
-      Expression target, Token operator, SimpleIdentifier propertyName);
+      Expression? target, Token operator, SimpleIdentifier propertyName);
 
   /// Returns a newly created redirecting invocation to invoke the constructor
   /// with the given name with the given arguments. The [constructorName] can be
   /// `null` if the constructor being invoked is the unnamed constructor.
   RedirectingConstructorInvocation redirectingConstructorInvocation(
       Token thisKeyword,
-      Token period,
-      SimpleIdentifier constructorName,
+      Token? period,
+      SimpleIdentifier? constructorName,
       ArgumentList argumentList);
 
   /// Returns a newly created rethrow expression.
@@ -742,7 +747,7 @@
   /// Returns a newly created return statement. The [expression] can be `null`
   /// if no explicit value was provided.
   ReturnStatement returnStatement(
-      Token returnKeyword, Expression expression, Token semicolon);
+      Token returnKeyword, Expression? expression, Token semicolon);
 
   /// Returns a newly created script tag.
   ScriptTag scriptTag(Token scriptTag);
@@ -752,11 +757,11 @@
   /// if no type arguments were declared. The list of [elements] can be `null`
   /// if the set or map is empty.
   SetOrMapLiteral setOrMapLiteral(
-      {Token constKeyword,
-      TypeArgumentList typeArguments,
-      Token leftBracket,
-      List<CollectionElement> elements,
-      Token rightBracket});
+      {Token? constKeyword,
+      TypeArgumentList? typeArguments,
+      required Token leftBracket,
+      required List<CollectionElement> elements,
+      required Token rightBracket});
 
   /// Returns a newly created import show combinator.
   ShowCombinator showCombinator(
@@ -767,13 +772,13 @@
   /// corresponding attribute. The [keyword] can be `null` if a type was
   /// specified. The [type] must be `null` if the keyword is 'var'.
   SimpleFormalParameter simpleFormalParameter2(
-      {Comment comment,
-      List<Annotation> metadata,
-      Token covariantKeyword,
-      Token requiredKeyword,
-      Token keyword,
-      TypeAnnotation type,
-      @required SimpleIdentifier identifier});
+      {Comment? comment,
+      List<Annotation>? metadata,
+      Token? covariantKeyword,
+      Token? requiredKeyword,
+      Token? keyword,
+      TypeAnnotation? type,
+      required SimpleIdentifier? identifier});
 
   /// Returns a newly created identifier.
   SimpleIdentifier simpleIdentifier(Token token, {bool isDeclaration = false});
@@ -782,7 +787,8 @@
   SimpleStringLiteral simpleStringLiteral(Token literal, String value);
 
   /// Returns a newly created spread element.
-  SpreadElement spreadElement({Token spreadOperator, Expression expression});
+  SpreadElement spreadElement(
+      {required Token spreadOperator, required Expression expression});
 
   /// Returns a newly created string interpolation expression.
   StringInterpolation stringInterpolation(List<InterpolationElement> elements);
@@ -793,8 +799,8 @@
   /// unnamed constructor.
   SuperConstructorInvocation superConstructorInvocation(
       Token superKeyword,
-      Token period,
-      SimpleIdentifier constructorName,
+      Token? period,
+      SimpleIdentifier? constructorName,
       ArgumentList argumentList);
 
   /// Returns a newly created super expression.
@@ -834,17 +840,21 @@
   /// of the [comment] and [metadata] can be `null` if the variable does not
   /// have the corresponding attribute.
   TopLevelVariableDeclaration topLevelVariableDeclaration(
-      Comment comment,
-      List<Annotation> metadata,
+      Comment? comment,
+      List<Annotation>? metadata,
       VariableDeclarationList variableList,
       Token semicolon,
-      {Token externalKeyword});
+      {Token? externalKeyword});
 
   /// Returns a newly created try statement. The list of [catchClauses] can be
   /// `null` if there are no catch clauses. The [finallyKeyword] and
   /// [finallyBlock] can be `null` if there is no finally clause.
-  TryStatement tryStatement(Token tryKeyword, Block body,
-      List<CatchClause> catchClauses, Token finallyKeyword, Block finallyBlock);
+  TryStatement tryStatement(
+      Token tryKeyword,
+      Block body,
+      List<CatchClause> catchClauses,
+      Token? finallyKeyword,
+      Block? finallyBlock);
 
   /// Returns a newly created list of type arguments.
   TypeArgumentList typeArgumentList(
@@ -853,15 +863,15 @@
   /// Returns a newly created type name. The [typeArguments] can be `null` if
   /// there are no type arguments. The [question] can be `null` if there is no
   /// question mark.
-  TypeName typeName(Identifier name, TypeArgumentList typeArguments,
-      {Token question});
+  TypeName typeName(Identifier name, TypeArgumentList? typeArguments,
+      {Token? question});
 
   /// Returns a newly created type parameter. Either or both of the [comment]
   /// and [metadata] can be `null` if the parameter does not have the
   /// corresponding attribute. The [extendsKeyword] and [bound] can be `null` if
   /// the parameter does not have an upper bound.
-  TypeParameter typeParameter(Comment comment, List<Annotation> metadata,
-      SimpleIdentifier name, Token extendsKeyword, TypeAnnotation bound);
+  TypeParameter typeParameter(Comment? comment, List<Annotation>? metadata,
+      SimpleIdentifier name, Token? extendsKeyword, TypeAnnotation? bound);
 
   /// Returns a newly created list of type parameters.
   TypeParameterList typeParameterList(Token leftBracket,
@@ -870,7 +880,7 @@
   /// Returns a newly created variable declaration. The [equals] and
   /// [initializer] can be `null` if there is no initializer.
   VariableDeclaration variableDeclaration(
-      SimpleIdentifier name, Token equals, Expression initializer);
+      SimpleIdentifier name, Token? equals, Expression? initializer);
 
   /// Returns a newly created variable declaration list. Either or both of the
   /// [comment] and [metadata] can be `null` if the variable list does not have
@@ -879,10 +889,10 @@
   ///
   /// Use [variableDeclarationList2] instead.
   VariableDeclarationList variableDeclarationList(
-      Comment comment,
-      List<Annotation> metadata,
-      Token keyword,
-      TypeAnnotation type,
+      Comment? comment,
+      List<Annotation>? metadata,
+      Token? keyword,
+      TypeAnnotation? type,
       List<VariableDeclaration> variables);
 
   /// Returns a newly created variable declaration list. Either or both of the
@@ -890,12 +900,12 @@
   /// the corresponding attribute. The [keyword] can be `null` if a type was
   /// specified. The [type] must be `null` if the keyword is 'var'.
   VariableDeclarationList variableDeclarationList2(
-      {Comment comment,
-      List<Annotation> metadata,
-      Token lateKeyword,
-      Token keyword,
-      TypeAnnotation type,
-      List<VariableDeclaration> variables});
+      {Comment? comment,
+      List<Annotation>? metadata,
+      Token? lateKeyword,
+      Token? keyword,
+      TypeAnnotation? type,
+      required List<VariableDeclaration> variables});
 
   /// Returns a newly created variable declaration statement.
   VariableDeclarationStatement variableDeclarationStatement(
@@ -911,5 +921,5 @@
   /// Returns a newly created yield expression. The [star] can be `null` if no
   /// star was provided.
   YieldStatement yieldStatement(
-      Token yieldKeyword, Token star, Expression expression, Token semicolon);
+      Token yieldKeyword, Token? star, Expression expression, Token semicolon);
 }
diff --git a/pkg/analyzer/lib/dart/ast/visitor.dart b/pkg/analyzer/lib/dart/ast/visitor.dart
index bf78d64..1bbc19e 100644
--- a/pkg/analyzer/lib/dart/ast/visitor.dart
+++ b/pkg/analyzer/lib/dart/ast/visitor.dart
@@ -53,7 +53,7 @@
 
   /// A visitor, used to visit the children of the current node, that will add
   /// the nodes it visits to the [_queue].
-  _BreadthFirstChildVisitor _childVisitor;
+  late final _BreadthFirstChildVisitor _childVisitor;
 
   /// Initialize a newly created visitor.
   BreadthFirstVisitor() {
@@ -71,7 +71,7 @@
   }
 
   @override
-  R visitNode(AstNode node) {
+  R? visitNode(AstNode node) {
     node.visitChildren(_childVisitor);
     return null;
   }
@@ -101,7 +101,7 @@
   const DelegatingAstVisitor(this.delegates);
 
   @override
-  T visitNode(AstNode node) {
+  T? visitNode(AstNode node) {
     delegates.forEach((delegate) {
       node.accept(delegate);
     });
@@ -132,470 +132,474 @@
   const GeneralizingAstVisitor();
 
   @override
-  R visitAdjacentStrings(AdjacentStrings node) => visitStringLiteral(node);
+  R? visitAdjacentStrings(AdjacentStrings node) => visitStringLiteral(node);
 
-  R visitAnnotatedNode(AnnotatedNode node) => visitNode(node);
+  R? visitAnnotatedNode(AnnotatedNode node) => visitNode(node);
 
   @override
-  R visitAnnotation(Annotation node) => visitNode(node);
+  R? visitAnnotation(Annotation node) => visitNode(node);
 
   @override
-  R visitArgumentList(ArgumentList node) => visitNode(node);
+  R? visitArgumentList(ArgumentList node) => visitNode(node);
 
   @override
-  R visitAsExpression(AsExpression node) => visitExpression(node);
+  R? visitAsExpression(AsExpression node) => visitExpression(node);
 
   @override
-  R visitAssertInitializer(AssertInitializer node) => visitNode(node);
+  R? visitAssertInitializer(AssertInitializer node) => visitNode(node);
 
   @override
-  R visitAssertStatement(AssertStatement node) => visitStatement(node);
+  R? visitAssertStatement(AssertStatement node) => visitStatement(node);
 
   @override
-  R visitAssignmentExpression(AssignmentExpression node) =>
+  R? visitAssignmentExpression(AssignmentExpression node) =>
       visitExpression(node);
 
   @override
-  R visitAwaitExpression(AwaitExpression node) => visitExpression(node);
+  R? visitAwaitExpression(AwaitExpression node) => visitExpression(node);
 
   @override
-  R visitBinaryExpression(BinaryExpression node) => visitExpression(node);
+  R? visitBinaryExpression(BinaryExpression node) => visitExpression(node);
 
   @override
-  R visitBlock(Block node) => visitStatement(node);
+  R? visitBlock(Block node) => visitStatement(node);
 
   @override
-  R visitBlockFunctionBody(BlockFunctionBody node) => visitFunctionBody(node);
+  R? visitBlockFunctionBody(BlockFunctionBody node) => visitFunctionBody(node);
 
   @override
-  R visitBooleanLiteral(BooleanLiteral node) => visitLiteral(node);
+  R? visitBooleanLiteral(BooleanLiteral node) => visitLiteral(node);
 
   @override
-  R visitBreakStatement(BreakStatement node) => visitStatement(node);
+  R? visitBreakStatement(BreakStatement node) => visitStatement(node);
 
   @override
-  R visitCascadeExpression(CascadeExpression node) => visitExpression(node);
+  R? visitCascadeExpression(CascadeExpression node) => visitExpression(node);
 
   @override
-  R visitCatchClause(CatchClause node) => visitNode(node);
+  R? visitCatchClause(CatchClause node) => visitNode(node);
 
   @override
-  R visitClassDeclaration(ClassDeclaration node) =>
+  R? visitClassDeclaration(ClassDeclaration node) =>
       visitNamedCompilationUnitMember(node);
 
-  R visitClassMember(ClassMember node) => visitDeclaration(node);
+  R? visitClassMember(ClassMember node) => visitDeclaration(node);
 
   @override
-  R visitClassTypeAlias(ClassTypeAlias node) => visitTypeAlias(node);
+  R? visitClassTypeAlias(ClassTypeAlias node) => visitTypeAlias(node);
 
-  R visitCollectionElement(CollectionElement node) => visitNode(node);
+  R? visitCollectionElement(CollectionElement node) => visitNode(node);
 
-  R visitCombinator(Combinator node) => visitNode(node);
+  R? visitCombinator(Combinator node) => visitNode(node);
 
   @override
-  R visitComment(Comment node) => visitNode(node);
+  R? visitComment(Comment node) => visitNode(node);
 
   @override
-  R visitCommentReference(CommentReference node) => visitNode(node);
+  R? visitCommentReference(CommentReference node) => visitNode(node);
 
   @override
-  R visitCompilationUnit(CompilationUnit node) => visitNode(node);
+  R? visitCompilationUnit(CompilationUnit node) => visitNode(node);
 
-  R visitCompilationUnitMember(CompilationUnitMember node) =>
+  R? visitCompilationUnitMember(CompilationUnitMember node) =>
       visitDeclaration(node);
 
   @override
-  R visitConditionalExpression(ConditionalExpression node) =>
+  R? visitConditionalExpression(ConditionalExpression node) =>
       visitExpression(node);
 
   @override
-  R visitConfiguration(Configuration node) => visitNode(node);
+  R? visitConfiguration(Configuration node) => visitNode(node);
 
   @override
-  R visitConstructorDeclaration(ConstructorDeclaration node) =>
+  R? visitConstructorDeclaration(ConstructorDeclaration node) =>
       visitClassMember(node);
 
   @override
-  R visitConstructorFieldInitializer(ConstructorFieldInitializer node) =>
+  R? visitConstructorFieldInitializer(ConstructorFieldInitializer node) =>
       visitConstructorInitializer(node);
 
-  R visitConstructorInitializer(ConstructorInitializer node) => visitNode(node);
+  R? visitConstructorInitializer(ConstructorInitializer node) =>
+      visitNode(node);
 
   @override
-  R visitConstructorName(ConstructorName node) => visitNode(node);
+  R? visitConstructorName(ConstructorName node) => visitNode(node);
 
   @override
-  R visitContinueStatement(ContinueStatement node) => visitStatement(node);
+  R? visitContinueStatement(ContinueStatement node) => visitStatement(node);
 
-  R visitDeclaration(Declaration node) => visitAnnotatedNode(node);
+  R? visitDeclaration(Declaration node) => visitAnnotatedNode(node);
 
   @override
-  R visitDeclaredIdentifier(DeclaredIdentifier node) => visitDeclaration(node);
+  R? visitDeclaredIdentifier(DeclaredIdentifier node) => visitDeclaration(node);
 
   @override
-  R visitDefaultFormalParameter(DefaultFormalParameter node) =>
+  R? visitDefaultFormalParameter(DefaultFormalParameter node) =>
       visitFormalParameter(node);
 
-  R visitDirective(Directive node) => visitAnnotatedNode(node);
+  R? visitDirective(Directive node) => visitAnnotatedNode(node);
 
   @override
-  R visitDoStatement(DoStatement node) => visitStatement(node);
+  R? visitDoStatement(DoStatement node) => visitStatement(node);
 
   @override
-  R visitDottedName(DottedName node) => visitNode(node);
+  R? visitDottedName(DottedName node) => visitNode(node);
 
   @override
-  R visitDoubleLiteral(DoubleLiteral node) => visitLiteral(node);
+  R? visitDoubleLiteral(DoubleLiteral node) => visitLiteral(node);
 
   @override
-  R visitEmptyFunctionBody(EmptyFunctionBody node) => visitFunctionBody(node);
+  R? visitEmptyFunctionBody(EmptyFunctionBody node) => visitFunctionBody(node);
 
   @override
-  R visitEmptyStatement(EmptyStatement node) => visitStatement(node);
+  R? visitEmptyStatement(EmptyStatement node) => visitStatement(node);
 
   @override
-  R visitEnumConstantDeclaration(EnumConstantDeclaration node) =>
+  R? visitEnumConstantDeclaration(EnumConstantDeclaration node) =>
       visitDeclaration(node);
 
   @override
-  R visitEnumDeclaration(EnumDeclaration node) =>
+  R? visitEnumDeclaration(EnumDeclaration node) =>
       visitNamedCompilationUnitMember(node);
 
   @override
-  R visitExportDirective(ExportDirective node) => visitNamespaceDirective(node);
+  R? visitExportDirective(ExportDirective node) =>
+      visitNamespaceDirective(node);
 
-  R visitExpression(Expression node) => visitCollectionElement(node);
+  R? visitExpression(Expression node) => visitCollectionElement(node);
 
   @override
-  R visitExpressionFunctionBody(ExpressionFunctionBody node) =>
+  R? visitExpressionFunctionBody(ExpressionFunctionBody node) =>
       visitFunctionBody(node);
 
   @override
-  R visitExpressionStatement(ExpressionStatement node) => visitStatement(node);
+  R? visitExpressionStatement(ExpressionStatement node) => visitStatement(node);
 
   @override
-  R visitExtendsClause(ExtendsClause node) => visitNode(node);
+  R? visitExtendsClause(ExtendsClause node) => visitNode(node);
 
   @override
-  R visitExtensionDeclaration(ExtensionDeclaration node) =>
+  R? visitExtensionDeclaration(ExtensionDeclaration node) =>
       visitCompilationUnitMember(node);
 
   @override
-  R visitExtensionOverride(ExtensionOverride node) => visitExpression(node);
+  R? visitExtensionOverride(ExtensionOverride node) => visitExpression(node);
 
   @override
-  R visitFieldDeclaration(FieldDeclaration node) => visitClassMember(node);
+  R? visitFieldDeclaration(FieldDeclaration node) => visitClassMember(node);
 
   @override
-  R visitFieldFormalParameter(FieldFormalParameter node) =>
+  R? visitFieldFormalParameter(FieldFormalParameter node) =>
       visitNormalFormalParameter(node);
 
-  R visitForEachParts(ForEachParts node) => visitNode(node);
+  R? visitForEachParts(ForEachParts node) => visitNode(node);
 
   @override
-  R visitForEachPartsWithDeclaration(ForEachPartsWithDeclaration node) =>
+  R? visitForEachPartsWithDeclaration(ForEachPartsWithDeclaration node) =>
       visitForEachParts(node);
 
   @override
-  R visitForEachPartsWithIdentifier(ForEachPartsWithIdentifier node) =>
+  R? visitForEachPartsWithIdentifier(ForEachPartsWithIdentifier node) =>
       visitForEachParts(node);
 
   @override
-  R visitForElement(ForElement node) => visitCollectionElement(node);
+  R? visitForElement(ForElement node) => visitCollectionElement(node);
 
-  R visitFormalParameter(FormalParameter node) => visitNode(node);
+  R? visitFormalParameter(FormalParameter node) => visitNode(node);
 
   @override
-  R visitFormalParameterList(FormalParameterList node) => visitNode(node);
+  R? visitFormalParameterList(FormalParameterList node) => visitNode(node);
 
-  R visitForParts(ForParts node) => visitNode(node);
+  R? visitForParts(ForParts node) => visitNode(node);
 
   @override
-  R visitForPartsWithDeclarations(ForPartsWithDeclarations node) =>
+  R? visitForPartsWithDeclarations(ForPartsWithDeclarations node) =>
       visitForParts(node);
 
   @override
-  R visitForPartsWithExpression(ForPartsWithExpression node) =>
+  R? visitForPartsWithExpression(ForPartsWithExpression node) =>
       visitForParts(node);
 
   @override
-  R visitForStatement(ForStatement node) => visitStatement(node);
+  R? visitForStatement(ForStatement node) => visitStatement(node);
 
-  R visitFunctionBody(FunctionBody node) => visitNode(node);
+  R? visitFunctionBody(FunctionBody node) => visitNode(node);
 
   @override
-  R visitFunctionDeclaration(FunctionDeclaration node) =>
+  R? visitFunctionDeclaration(FunctionDeclaration node) =>
       visitNamedCompilationUnitMember(node);
 
   @override
-  R visitFunctionDeclarationStatement(FunctionDeclarationStatement node) =>
+  R? visitFunctionDeclarationStatement(FunctionDeclarationStatement node) =>
       visitStatement(node);
 
   @override
-  R visitFunctionExpression(FunctionExpression node) => visitExpression(node);
+  R? visitFunctionExpression(FunctionExpression node) => visitExpression(node);
 
   @override
-  R visitFunctionExpressionInvocation(FunctionExpressionInvocation node) =>
+  R? visitFunctionExpressionInvocation(FunctionExpressionInvocation node) =>
       visitInvocationExpression(node);
 
   @override
-  R visitFunctionTypeAlias(FunctionTypeAlias node) => visitTypeAlias(node);
+  R? visitFunctionTypeAlias(FunctionTypeAlias node) => visitTypeAlias(node);
 
   @override
-  R visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) =>
+  R? visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) =>
       visitNormalFormalParameter(node);
 
   @override
-  R visitGenericFunctionType(GenericFunctionType node) =>
+  R? visitGenericFunctionType(GenericFunctionType node) =>
       visitTypeAnnotation(node);
 
   @override
-  R visitGenericTypeAlias(GenericTypeAlias node) => visitTypeAlias(node);
+  R? visitGenericTypeAlias(GenericTypeAlias node) => visitTypeAlias(node);
 
   @override
-  R visitHideCombinator(HideCombinator node) => visitCombinator(node);
+  R? visitHideCombinator(HideCombinator node) => visitCombinator(node);
 
-  R visitIdentifier(Identifier node) => visitExpression(node);
+  R? visitIdentifier(Identifier node) => visitExpression(node);
 
   @override
-  R visitIfElement(IfElement node) => visitCollectionElement(node);
+  R? visitIfElement(IfElement node) => visitCollectionElement(node);
 
   @override
-  R visitIfStatement(IfStatement node) => visitStatement(node);
+  R? visitIfStatement(IfStatement node) => visitStatement(node);
 
   @override
-  R visitImplementsClause(ImplementsClause node) => visitNode(node);
+  R? visitImplementsClause(ImplementsClause node) => visitNode(node);
 
   @override
-  R visitImportDirective(ImportDirective node) => visitNamespaceDirective(node);
+  R? visitImportDirective(ImportDirective node) =>
+      visitNamespaceDirective(node);
 
   @override
-  R visitIndexExpression(IndexExpression node) => visitExpression(node);
+  R? visitIndexExpression(IndexExpression node) => visitExpression(node);
 
   @override
-  R visitInstanceCreationExpression(InstanceCreationExpression node) =>
+  R? visitInstanceCreationExpression(InstanceCreationExpression node) =>
       visitExpression(node);
 
   @override
-  R visitIntegerLiteral(IntegerLiteral node) => visitLiteral(node);
+  R? visitIntegerLiteral(IntegerLiteral node) => visitLiteral(node);
 
-  R visitInterpolationElement(InterpolationElement node) => visitNode(node);
+  R? visitInterpolationElement(InterpolationElement node) => visitNode(node);
 
   @override
-  R visitInterpolationExpression(InterpolationExpression node) =>
+  R? visitInterpolationExpression(InterpolationExpression node) =>
       visitInterpolationElement(node);
 
   @override
-  R visitInterpolationString(InterpolationString node) =>
+  R? visitInterpolationString(InterpolationString node) =>
       visitInterpolationElement(node);
 
-  R visitInvocationExpression(InvocationExpression node) =>
+  R? visitInvocationExpression(InvocationExpression node) =>
       visitExpression(node);
 
   @override
-  R visitIsExpression(IsExpression node) => visitExpression(node);
+  R? visitIsExpression(IsExpression node) => visitExpression(node);
 
   @override
-  R visitLabel(Label node) => visitNode(node);
+  R? visitLabel(Label node) => visitNode(node);
 
   @override
-  R visitLabeledStatement(LabeledStatement node) => visitStatement(node);
+  R? visitLabeledStatement(LabeledStatement node) => visitStatement(node);
 
   @override
-  R visitLibraryDirective(LibraryDirective node) => visitDirective(node);
+  R? visitLibraryDirective(LibraryDirective node) => visitDirective(node);
 
   @override
-  R visitLibraryIdentifier(LibraryIdentifier node) => visitIdentifier(node);
+  R? visitLibraryIdentifier(LibraryIdentifier node) => visitIdentifier(node);
 
   @override
-  R visitListLiteral(ListLiteral node) => visitTypedLiteral(node);
+  R? visitListLiteral(ListLiteral node) => visitTypedLiteral(node);
 
-  R visitLiteral(Literal node) => visitExpression(node);
+  R? visitLiteral(Literal node) => visitExpression(node);
 
   @override
-  R visitMapLiteralEntry(MapLiteralEntry node) => visitCollectionElement(node);
+  R? visitMapLiteralEntry(MapLiteralEntry node) => visitCollectionElement(node);
 
   @override
-  R visitMethodDeclaration(MethodDeclaration node) => visitClassMember(node);
+  R? visitMethodDeclaration(MethodDeclaration node) => visitClassMember(node);
 
   @override
-  R visitMethodInvocation(MethodInvocation node) =>
+  R? visitMethodInvocation(MethodInvocation node) =>
       visitInvocationExpression(node);
 
   @override
-  R visitMixinDeclaration(MixinDeclaration node) =>
+  R? visitMixinDeclaration(MixinDeclaration node) =>
       visitNamedCompilationUnitMember(node);
 
-  R visitNamedCompilationUnitMember(NamedCompilationUnitMember node) =>
+  R? visitNamedCompilationUnitMember(NamedCompilationUnitMember node) =>
       visitCompilationUnitMember(node);
 
   @override
-  R visitNamedExpression(NamedExpression node) => visitExpression(node);
+  R? visitNamedExpression(NamedExpression node) => visitExpression(node);
 
-  R visitNamespaceDirective(NamespaceDirective node) =>
+  R? visitNamespaceDirective(NamespaceDirective node) =>
       visitUriBasedDirective(node);
 
   @override
-  R visitNativeClause(NativeClause node) => visitNode(node);
+  R? visitNativeClause(NativeClause node) => visitNode(node);
 
   @override
-  R visitNativeFunctionBody(NativeFunctionBody node) => visitFunctionBody(node);
+  R? visitNativeFunctionBody(NativeFunctionBody node) =>
+      visitFunctionBody(node);
 
-  R visitNode(AstNode node) {
+  R? visitNode(AstNode node) {
     node.visitChildren(this);
     return null;
   }
 
-  R visitNormalFormalParameter(NormalFormalParameter node) =>
+  R? visitNormalFormalParameter(NormalFormalParameter node) =>
       visitFormalParameter(node);
 
   @override
-  R visitNullLiteral(NullLiteral node) => visitLiteral(node);
+  R? visitNullLiteral(NullLiteral node) => visitLiteral(node);
 
   @override
-  R visitOnClause(OnClause node) => visitNode(node);
+  R? visitOnClause(OnClause node) => visitNode(node);
 
   @override
-  R visitParenthesizedExpression(ParenthesizedExpression node) =>
+  R? visitParenthesizedExpression(ParenthesizedExpression node) =>
       visitExpression(node);
 
   @override
-  R visitPartDirective(PartDirective node) => visitUriBasedDirective(node);
+  R? visitPartDirective(PartDirective node) => visitUriBasedDirective(node);
 
   @override
-  R visitPartOfDirective(PartOfDirective node) => visitDirective(node);
+  R? visitPartOfDirective(PartOfDirective node) => visitDirective(node);
 
   @override
-  R visitPostfixExpression(PostfixExpression node) => visitExpression(node);
+  R? visitPostfixExpression(PostfixExpression node) => visitExpression(node);
 
   @override
-  R visitPrefixedIdentifier(PrefixedIdentifier node) => visitIdentifier(node);
+  R? visitPrefixedIdentifier(PrefixedIdentifier node) => visitIdentifier(node);
 
   @override
-  R visitPrefixExpression(PrefixExpression node) => visitExpression(node);
+  R? visitPrefixExpression(PrefixExpression node) => visitExpression(node);
 
   @override
-  R visitPropertyAccess(PropertyAccess node) => visitExpression(node);
+  R? visitPropertyAccess(PropertyAccess node) => visitExpression(node);
 
   @override
-  R visitRedirectingConstructorInvocation(
+  R? visitRedirectingConstructorInvocation(
           RedirectingConstructorInvocation node) =>
       visitConstructorInitializer(node);
 
   @override
-  R visitRethrowExpression(RethrowExpression node) => visitExpression(node);
+  R? visitRethrowExpression(RethrowExpression node) => visitExpression(node);
 
   @override
-  R visitReturnStatement(ReturnStatement node) => visitStatement(node);
+  R? visitReturnStatement(ReturnStatement node) => visitStatement(node);
 
   @override
-  R visitScriptTag(ScriptTag scriptTag) => visitNode(scriptTag);
+  R? visitScriptTag(ScriptTag scriptTag) => visitNode(scriptTag);
 
   @override
-  R visitSetOrMapLiteral(SetOrMapLiteral node) => visitTypedLiteral(node);
+  R? visitSetOrMapLiteral(SetOrMapLiteral node) => visitTypedLiteral(node);
 
   @override
-  R visitShowCombinator(ShowCombinator node) => visitCombinator(node);
+  R? visitShowCombinator(ShowCombinator node) => visitCombinator(node);
 
   @override
-  R visitSimpleFormalParameter(SimpleFormalParameter node) =>
+  R? visitSimpleFormalParameter(SimpleFormalParameter node) =>
       visitNormalFormalParameter(node);
 
   @override
-  R visitSimpleIdentifier(SimpleIdentifier node) => visitIdentifier(node);
+  R? visitSimpleIdentifier(SimpleIdentifier node) => visitIdentifier(node);
 
   @override
-  R visitSimpleStringLiteral(SimpleStringLiteral node) =>
+  R? visitSimpleStringLiteral(SimpleStringLiteral node) =>
       visitSingleStringLiteral(node);
 
-  R visitSingleStringLiteral(SingleStringLiteral node) =>
+  R? visitSingleStringLiteral(SingleStringLiteral node) =>
       visitStringLiteral(node);
 
   @override
-  R visitSpreadElement(SpreadElement node) => visitCollectionElement(node);
+  R? visitSpreadElement(SpreadElement node) => visitCollectionElement(node);
 
-  R visitStatement(Statement node) => visitNode(node);
+  R? visitStatement(Statement node) => visitNode(node);
 
   @override
-  R visitStringInterpolation(StringInterpolation node) =>
+  R? visitStringInterpolation(StringInterpolation node) =>
       visitSingleStringLiteral(node);
 
-  R visitStringLiteral(StringLiteral node) => visitLiteral(node);
+  R? visitStringLiteral(StringLiteral node) => visitLiteral(node);
 
   @override
-  R visitSuperConstructorInvocation(SuperConstructorInvocation node) =>
+  R? visitSuperConstructorInvocation(SuperConstructorInvocation node) =>
       visitConstructorInitializer(node);
 
   @override
-  R visitSuperExpression(SuperExpression node) => visitExpression(node);
+  R? visitSuperExpression(SuperExpression node) => visitExpression(node);
 
   @override
-  R visitSwitchCase(SwitchCase node) => visitSwitchMember(node);
+  R? visitSwitchCase(SwitchCase node) => visitSwitchMember(node);
 
   @override
-  R visitSwitchDefault(SwitchDefault node) => visitSwitchMember(node);
+  R? visitSwitchDefault(SwitchDefault node) => visitSwitchMember(node);
 
-  R visitSwitchMember(SwitchMember node) => visitNode(node);
+  R? visitSwitchMember(SwitchMember node) => visitNode(node);
 
   @override
-  R visitSwitchStatement(SwitchStatement node) => visitStatement(node);
+  R? visitSwitchStatement(SwitchStatement node) => visitStatement(node);
 
   @override
-  R visitSymbolLiteral(SymbolLiteral node) => visitLiteral(node);
+  R? visitSymbolLiteral(SymbolLiteral node) => visitLiteral(node);
 
   @override
-  R visitThisExpression(ThisExpression node) => visitExpression(node);
+  R? visitThisExpression(ThisExpression node) => visitExpression(node);
 
   @override
-  R visitThrowExpression(ThrowExpression node) => visitExpression(node);
+  R? visitThrowExpression(ThrowExpression node) => visitExpression(node);
 
   @override
-  R visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) =>
+  R? visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) =>
       visitCompilationUnitMember(node);
 
   @override
-  R visitTryStatement(TryStatement node) => visitStatement(node);
+  R? visitTryStatement(TryStatement node) => visitStatement(node);
 
-  R visitTypeAlias(TypeAlias node) => visitNamedCompilationUnitMember(node);
+  R? visitTypeAlias(TypeAlias node) => visitNamedCompilationUnitMember(node);
 
-  R visitTypeAnnotation(TypeAnnotation node) => visitNode(node);
+  R? visitTypeAnnotation(TypeAnnotation node) => visitNode(node);
 
   @override
-  R visitTypeArgumentList(TypeArgumentList node) => visitNode(node);
+  R? visitTypeArgumentList(TypeArgumentList node) => visitNode(node);
 
-  R visitTypedLiteral(TypedLiteral node) => visitLiteral(node);
+  R? visitTypedLiteral(TypedLiteral node) => visitLiteral(node);
 
   @override
-  R visitTypeName(TypeName node) => visitNode(node);
+  R? visitTypeName(TypeName node) => visitNode(node);
 
   @override
-  R visitTypeParameter(TypeParameter node) => visitNode(node);
+  R? visitTypeParameter(TypeParameter node) => visitNode(node);
 
   @override
-  R visitTypeParameterList(TypeParameterList node) => visitNode(node);
+  R? visitTypeParameterList(TypeParameterList node) => visitNode(node);
 
-  R visitUriBasedDirective(UriBasedDirective node) => visitDirective(node);
+  R? visitUriBasedDirective(UriBasedDirective node) => visitDirective(node);
 
   @override
-  R visitVariableDeclaration(VariableDeclaration node) =>
+  R? visitVariableDeclaration(VariableDeclaration node) =>
       visitDeclaration(node);
 
   @override
-  R visitVariableDeclarationList(VariableDeclarationList node) =>
+  R? visitVariableDeclarationList(VariableDeclarationList node) =>
       visitNode(node);
 
   @override
-  R visitVariableDeclarationStatement(VariableDeclarationStatement node) =>
+  R? visitVariableDeclarationStatement(VariableDeclarationStatement node) =>
       visitStatement(node);
 
   @override
-  R visitWhileStatement(WhileStatement node) => visitStatement(node);
+  R? visitWhileStatement(WhileStatement node) => visitStatement(node);
 
   @override
-  R visitWithClause(WithClause node) => visitNode(node);
+  R? visitWithClause(WithClause node) => visitNode(node);
 
   @override
-  R visitYieldStatement(YieldStatement node) => visitStatement(node);
+  R? visitYieldStatement(YieldStatement node) => visitStatement(node);
 }
 
 /// An AST visitor that will recursively visit all of the nodes in an AST
@@ -613,728 +617,728 @@
   const RecursiveAstVisitor();
 
   @override
-  R visitAdjacentStrings(AdjacentStrings node) {
+  R? visitAdjacentStrings(AdjacentStrings node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitAnnotation(Annotation node) {
+  R? visitAnnotation(Annotation node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitArgumentList(ArgumentList node) {
+  R? visitArgumentList(ArgumentList node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitAsExpression(AsExpression node) {
+  R? visitAsExpression(AsExpression node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitAssertInitializer(AssertInitializer node) {
+  R? visitAssertInitializer(AssertInitializer node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitAssertStatement(AssertStatement node) {
+  R? visitAssertStatement(AssertStatement node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitAssignmentExpression(AssignmentExpression node) {
+  R? visitAssignmentExpression(AssignmentExpression node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitAwaitExpression(AwaitExpression node) {
+  R? visitAwaitExpression(AwaitExpression node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitBinaryExpression(BinaryExpression node) {
+  R? visitBinaryExpression(BinaryExpression node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitBlock(Block node) {
+  R? visitBlock(Block node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitBlockFunctionBody(BlockFunctionBody node) {
+  R? visitBlockFunctionBody(BlockFunctionBody node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitBooleanLiteral(BooleanLiteral node) {
+  R? visitBooleanLiteral(BooleanLiteral node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitBreakStatement(BreakStatement node) {
+  R? visitBreakStatement(BreakStatement node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitCascadeExpression(CascadeExpression node) {
+  R? visitCascadeExpression(CascadeExpression node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitCatchClause(CatchClause node) {
+  R? visitCatchClause(CatchClause node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitClassDeclaration(ClassDeclaration node) {
+  R? visitClassDeclaration(ClassDeclaration node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitClassTypeAlias(ClassTypeAlias node) {
+  R? visitClassTypeAlias(ClassTypeAlias node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitComment(Comment node) {
+  R? visitComment(Comment node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitCommentReference(CommentReference node) {
+  R? visitCommentReference(CommentReference node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitCompilationUnit(CompilationUnit node) {
+  R? visitCompilationUnit(CompilationUnit node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitConditionalExpression(ConditionalExpression node) {
+  R? visitConditionalExpression(ConditionalExpression node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitConfiguration(Configuration node) {
+  R? visitConfiguration(Configuration node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitConstructorDeclaration(ConstructorDeclaration node) {
+  R? visitConstructorDeclaration(ConstructorDeclaration node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+  R? visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitConstructorName(ConstructorName node) {
+  R? visitConstructorName(ConstructorName node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitContinueStatement(ContinueStatement node) {
+  R? visitContinueStatement(ContinueStatement node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitDeclaredIdentifier(DeclaredIdentifier node) {
+  R? visitDeclaredIdentifier(DeclaredIdentifier node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitDefaultFormalParameter(DefaultFormalParameter node) {
+  R? visitDefaultFormalParameter(DefaultFormalParameter node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitDoStatement(DoStatement node) {
+  R? visitDoStatement(DoStatement node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitDottedName(DottedName node) {
+  R? visitDottedName(DottedName node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitDoubleLiteral(DoubleLiteral node) {
+  R? visitDoubleLiteral(DoubleLiteral node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitEmptyFunctionBody(EmptyFunctionBody node) {
+  R? visitEmptyFunctionBody(EmptyFunctionBody node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitEmptyStatement(EmptyStatement node) {
+  R? visitEmptyStatement(EmptyStatement node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitEnumConstantDeclaration(EnumConstantDeclaration node) {
+  R? visitEnumConstantDeclaration(EnumConstantDeclaration node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitEnumDeclaration(EnumDeclaration node) {
+  R? visitEnumDeclaration(EnumDeclaration node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitExportDirective(ExportDirective node) {
+  R? visitExportDirective(ExportDirective node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitExpressionFunctionBody(ExpressionFunctionBody node) {
+  R? visitExpressionFunctionBody(ExpressionFunctionBody node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitExpressionStatement(ExpressionStatement node) {
+  R? visitExpressionStatement(ExpressionStatement node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitExtendsClause(ExtendsClause node) {
+  R? visitExtendsClause(ExtendsClause node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitExtensionDeclaration(ExtensionDeclaration node) {
+  R? visitExtensionDeclaration(ExtensionDeclaration node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitExtensionOverride(ExtensionOverride node) {
+  R? visitExtensionOverride(ExtensionOverride node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitFieldDeclaration(FieldDeclaration node) {
+  R? visitFieldDeclaration(FieldDeclaration node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitFieldFormalParameter(FieldFormalParameter node) {
+  R? visitFieldFormalParameter(FieldFormalParameter node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitForEachPartsWithDeclaration(ForEachPartsWithDeclaration node) {
+  R? visitForEachPartsWithDeclaration(ForEachPartsWithDeclaration node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitForEachPartsWithIdentifier(ForEachPartsWithIdentifier node) {
+  R? visitForEachPartsWithIdentifier(ForEachPartsWithIdentifier node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitForElement(ForElement node) {
+  R? visitForElement(ForElement node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitFormalParameterList(FormalParameterList node) {
+  R? visitFormalParameterList(FormalParameterList node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitForPartsWithDeclarations(ForPartsWithDeclarations node) {
+  R? visitForPartsWithDeclarations(ForPartsWithDeclarations node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitForPartsWithExpression(ForPartsWithExpression node) {
+  R? visitForPartsWithExpression(ForPartsWithExpression node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitForStatement(ForStatement node) {
+  R? visitForStatement(ForStatement node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitFunctionDeclaration(FunctionDeclaration node) {
+  R? visitFunctionDeclaration(FunctionDeclaration node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
+  R? visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitFunctionExpression(FunctionExpression node) {
+  R? visitFunctionExpression(FunctionExpression node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+  R? visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitFunctionTypeAlias(FunctionTypeAlias node) {
+  R? visitFunctionTypeAlias(FunctionTypeAlias node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+  R? visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitGenericFunctionType(GenericFunctionType node) {
+  R? visitGenericFunctionType(GenericFunctionType node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitGenericTypeAlias(GenericTypeAlias node) {
+  R? visitGenericTypeAlias(GenericTypeAlias node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitHideCombinator(HideCombinator node) {
+  R? visitHideCombinator(HideCombinator node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitIfElement(IfElement node) {
+  R? visitIfElement(IfElement node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitIfStatement(IfStatement node) {
+  R? visitIfStatement(IfStatement node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitImplementsClause(ImplementsClause node) {
+  R? visitImplementsClause(ImplementsClause node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitImportDirective(ImportDirective node) {
+  R? visitImportDirective(ImportDirective node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitIndexExpression(IndexExpression node) {
+  R? visitIndexExpression(IndexExpression node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitInstanceCreationExpression(InstanceCreationExpression node) {
+  R? visitInstanceCreationExpression(InstanceCreationExpression node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitIntegerLiteral(IntegerLiteral node) {
+  R? visitIntegerLiteral(IntegerLiteral node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitInterpolationExpression(InterpolationExpression node) {
+  R? visitInterpolationExpression(InterpolationExpression node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitInterpolationString(InterpolationString node) {
+  R? visitInterpolationString(InterpolationString node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitIsExpression(IsExpression node) {
+  R? visitIsExpression(IsExpression node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitLabel(Label node) {
+  R? visitLabel(Label node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitLabeledStatement(LabeledStatement node) {
+  R? visitLabeledStatement(LabeledStatement node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitLibraryDirective(LibraryDirective node) {
+  R? visitLibraryDirective(LibraryDirective node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitLibraryIdentifier(LibraryIdentifier node) {
+  R? visitLibraryIdentifier(LibraryIdentifier node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitListLiteral(ListLiteral node) {
+  R? visitListLiteral(ListLiteral node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitMapLiteralEntry(MapLiteralEntry node) {
+  R? visitMapLiteralEntry(MapLiteralEntry node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitMethodDeclaration(MethodDeclaration node) {
+  R? visitMethodDeclaration(MethodDeclaration node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitMethodInvocation(MethodInvocation node) {
+  R? visitMethodInvocation(MethodInvocation node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitMixinDeclaration(MixinDeclaration node) {
+  R? visitMixinDeclaration(MixinDeclaration node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitNamedExpression(NamedExpression node) {
+  R? visitNamedExpression(NamedExpression node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitNativeClause(NativeClause node) {
+  R? visitNativeClause(NativeClause node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitNativeFunctionBody(NativeFunctionBody node) {
+  R? visitNativeFunctionBody(NativeFunctionBody node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitNullLiteral(NullLiteral node) {
+  R? visitNullLiteral(NullLiteral node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitOnClause(OnClause node) {
+  R? visitOnClause(OnClause node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitParenthesizedExpression(ParenthesizedExpression node) {
+  R? visitParenthesizedExpression(ParenthesizedExpression node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitPartDirective(PartDirective node) {
+  R? visitPartDirective(PartDirective node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitPartOfDirective(PartOfDirective node) {
+  R? visitPartOfDirective(PartOfDirective node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitPostfixExpression(PostfixExpression node) {
+  R? visitPostfixExpression(PostfixExpression node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitPrefixedIdentifier(PrefixedIdentifier node) {
+  R? visitPrefixedIdentifier(PrefixedIdentifier node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitPrefixExpression(PrefixExpression node) {
+  R? visitPrefixExpression(PrefixExpression node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitPropertyAccess(PropertyAccess node) {
+  R? visitPropertyAccess(PropertyAccess node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitRedirectingConstructorInvocation(
+  R? visitRedirectingConstructorInvocation(
       RedirectingConstructorInvocation node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitRethrowExpression(RethrowExpression node) {
+  R? visitRethrowExpression(RethrowExpression node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitReturnStatement(ReturnStatement node) {
+  R? visitReturnStatement(ReturnStatement node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitScriptTag(ScriptTag node) {
+  R? visitScriptTag(ScriptTag node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitSetOrMapLiteral(SetOrMapLiteral node) {
+  R? visitSetOrMapLiteral(SetOrMapLiteral node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitShowCombinator(ShowCombinator node) {
+  R? visitShowCombinator(ShowCombinator node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitSimpleFormalParameter(SimpleFormalParameter node) {
+  R? visitSimpleFormalParameter(SimpleFormalParameter node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitSimpleIdentifier(SimpleIdentifier node) {
+  R? visitSimpleIdentifier(SimpleIdentifier node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitSimpleStringLiteral(SimpleStringLiteral node) {
+  R? visitSimpleStringLiteral(SimpleStringLiteral node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitSpreadElement(SpreadElement node) {
+  R? visitSpreadElement(SpreadElement node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitStringInterpolation(StringInterpolation node) {
+  R? visitStringInterpolation(StringInterpolation node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+  R? visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitSuperExpression(SuperExpression node) {
+  R? visitSuperExpression(SuperExpression node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitSwitchCase(SwitchCase node) {
+  R? visitSwitchCase(SwitchCase node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitSwitchDefault(SwitchDefault node) {
+  R? visitSwitchDefault(SwitchDefault node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitSwitchStatement(SwitchStatement node) {
+  R? visitSwitchStatement(SwitchStatement node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitSymbolLiteral(SymbolLiteral node) {
+  R? visitSymbolLiteral(SymbolLiteral node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitThisExpression(ThisExpression node) {
+  R? visitThisExpression(ThisExpression node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitThrowExpression(ThrowExpression node) {
+  R? visitThrowExpression(ThrowExpression node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+  R? visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitTryStatement(TryStatement node) {
+  R? visitTryStatement(TryStatement node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitTypeArgumentList(TypeArgumentList node) {
+  R? visitTypeArgumentList(TypeArgumentList node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitTypeName(TypeName node) {
+  R? visitTypeName(TypeName node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitTypeParameter(TypeParameter node) {
+  R? visitTypeParameter(TypeParameter node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitTypeParameterList(TypeParameterList node) {
+  R? visitTypeParameterList(TypeParameterList node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitVariableDeclaration(VariableDeclaration node) {
+  R? visitVariableDeclaration(VariableDeclaration node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitVariableDeclarationList(VariableDeclarationList node) {
+  R? visitVariableDeclarationList(VariableDeclarationList node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitVariableDeclarationStatement(VariableDeclarationStatement node) {
+  R? visitVariableDeclarationStatement(VariableDeclarationStatement node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitWhileStatement(WhileStatement node) {
+  R? visitWhileStatement(WhileStatement node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitWithClause(WithClause node) {
+  R? visitWithClause(WithClause node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitYieldStatement(YieldStatement node) {
+  R? visitYieldStatement(YieldStatement node) {
     node.visitChildren(this);
     return null;
   }
@@ -1351,373 +1355,373 @@
   const SimpleAstVisitor();
 
   @override
-  R visitAdjacentStrings(AdjacentStrings node) => null;
+  R? visitAdjacentStrings(AdjacentStrings node) => null;
 
   @override
-  R visitAnnotation(Annotation node) => null;
+  R? visitAnnotation(Annotation node) => null;
 
   @override
-  R visitArgumentList(ArgumentList node) => null;
+  R? visitArgumentList(ArgumentList node) => null;
 
   @override
-  R visitAsExpression(AsExpression node) => null;
+  R? visitAsExpression(AsExpression node) => null;
 
   @override
-  R visitAssertInitializer(AssertInitializer node) => null;
+  R? visitAssertInitializer(AssertInitializer node) => null;
 
   @override
-  R visitAssertStatement(AssertStatement node) => null;
+  R? visitAssertStatement(AssertStatement node) => null;
 
   @override
-  R visitAssignmentExpression(AssignmentExpression node) => null;
+  R? visitAssignmentExpression(AssignmentExpression node) => null;
 
   @override
-  R visitAwaitExpression(AwaitExpression node) => null;
+  R? visitAwaitExpression(AwaitExpression node) => null;
 
   @override
-  R visitBinaryExpression(BinaryExpression node) => null;
+  R? visitBinaryExpression(BinaryExpression node) => null;
 
   @override
-  R visitBlock(Block node) => null;
+  R? visitBlock(Block node) => null;
 
   @override
-  R visitBlockFunctionBody(BlockFunctionBody node) => null;
+  R? visitBlockFunctionBody(BlockFunctionBody node) => null;
 
   @override
-  R visitBooleanLiteral(BooleanLiteral node) => null;
+  R? visitBooleanLiteral(BooleanLiteral node) => null;
 
   @override
-  R visitBreakStatement(BreakStatement node) => null;
+  R? visitBreakStatement(BreakStatement node) => null;
 
   @override
-  R visitCascadeExpression(CascadeExpression node) => null;
+  R? visitCascadeExpression(CascadeExpression node) => null;
 
   @override
-  R visitCatchClause(CatchClause node) => null;
+  R? visitCatchClause(CatchClause node) => null;
 
   @override
-  R visitClassDeclaration(ClassDeclaration node) => null;
+  R? visitClassDeclaration(ClassDeclaration node) => null;
 
   @override
-  R visitClassTypeAlias(ClassTypeAlias node) => null;
+  R? visitClassTypeAlias(ClassTypeAlias node) => null;
 
   @override
-  R visitComment(Comment node) => null;
+  R? visitComment(Comment node) => null;
 
   @override
-  R visitCommentReference(CommentReference node) => null;
+  R? visitCommentReference(CommentReference node) => null;
 
   @override
-  R visitCompilationUnit(CompilationUnit node) => null;
+  R? visitCompilationUnit(CompilationUnit node) => null;
 
   @override
-  R visitConditionalExpression(ConditionalExpression node) => null;
+  R? visitConditionalExpression(ConditionalExpression node) => null;
 
   @override
-  R visitConfiguration(Configuration node) => null;
+  R? visitConfiguration(Configuration node) => null;
 
   @override
-  R visitConstructorDeclaration(ConstructorDeclaration node) => null;
+  R? visitConstructorDeclaration(ConstructorDeclaration node) => null;
 
   @override
-  R visitConstructorFieldInitializer(ConstructorFieldInitializer node) => null;
+  R? visitConstructorFieldInitializer(ConstructorFieldInitializer node) => null;
 
   @override
-  R visitConstructorName(ConstructorName node) => null;
+  R? visitConstructorName(ConstructorName node) => null;
 
   @override
-  R visitContinueStatement(ContinueStatement node) => null;
+  R? visitContinueStatement(ContinueStatement node) => null;
 
   @override
-  R visitDeclaredIdentifier(DeclaredIdentifier node) => null;
+  R? visitDeclaredIdentifier(DeclaredIdentifier node) => null;
 
   @override
-  R visitDefaultFormalParameter(DefaultFormalParameter node) => null;
+  R? visitDefaultFormalParameter(DefaultFormalParameter node) => null;
 
   @override
-  R visitDoStatement(DoStatement node) => null;
+  R? visitDoStatement(DoStatement node) => null;
 
   @override
-  R visitDottedName(DottedName node) => null;
+  R? visitDottedName(DottedName node) => null;
 
   @override
-  R visitDoubleLiteral(DoubleLiteral node) => null;
+  R? visitDoubleLiteral(DoubleLiteral node) => null;
 
   @override
-  R visitEmptyFunctionBody(EmptyFunctionBody node) => null;
+  R? visitEmptyFunctionBody(EmptyFunctionBody node) => null;
 
   @override
-  R visitEmptyStatement(EmptyStatement node) => null;
+  R? visitEmptyStatement(EmptyStatement node) => null;
 
   @override
-  R visitEnumConstantDeclaration(EnumConstantDeclaration node) => null;
+  R? visitEnumConstantDeclaration(EnumConstantDeclaration node) => null;
 
   @override
-  R visitEnumDeclaration(EnumDeclaration node) => null;
+  R? visitEnumDeclaration(EnumDeclaration node) => null;
 
   @override
-  R visitExportDirective(ExportDirective node) => null;
+  R? visitExportDirective(ExportDirective node) => null;
 
   @override
-  R visitExpressionFunctionBody(ExpressionFunctionBody node) => null;
+  R? visitExpressionFunctionBody(ExpressionFunctionBody node) => null;
 
   @override
-  R visitExpressionStatement(ExpressionStatement node) => null;
+  R? visitExpressionStatement(ExpressionStatement node) => null;
 
   @override
-  R visitExtendsClause(ExtendsClause node) => null;
+  R? visitExtendsClause(ExtendsClause node) => null;
 
   @override
-  R visitExtensionDeclaration(ExtensionDeclaration node) => null;
+  R? visitExtensionDeclaration(ExtensionDeclaration node) => null;
 
   @override
-  R visitExtensionOverride(ExtensionOverride node) => null;
+  R? visitExtensionOverride(ExtensionOverride node) => null;
 
   @override
-  R visitFieldDeclaration(FieldDeclaration node) => null;
+  R? visitFieldDeclaration(FieldDeclaration node) => null;
 
   @override
-  R visitFieldFormalParameter(FieldFormalParameter node) => null;
+  R? visitFieldFormalParameter(FieldFormalParameter node) => null;
 
   @override
-  R visitForEachPartsWithDeclaration(ForEachPartsWithDeclaration node) => null;
+  R? visitForEachPartsWithDeclaration(ForEachPartsWithDeclaration node) => null;
 
   @override
-  R visitForEachPartsWithIdentifier(ForEachPartsWithIdentifier node) => null;
+  R? visitForEachPartsWithIdentifier(ForEachPartsWithIdentifier node) => null;
 
   @override
-  R visitForElement(ForElement node) => null;
+  R? visitForElement(ForElement node) => null;
 
   @override
-  R visitFormalParameterList(FormalParameterList node) => null;
+  R? visitFormalParameterList(FormalParameterList node) => null;
 
   @override
-  R visitForPartsWithDeclarations(ForPartsWithDeclarations node) => null;
+  R? visitForPartsWithDeclarations(ForPartsWithDeclarations node) => null;
 
   @override
-  R visitForPartsWithExpression(ForPartsWithExpression node) => null;
+  R? visitForPartsWithExpression(ForPartsWithExpression node) => null;
 
   @override
-  R visitForStatement(ForStatement node) => null;
+  R? visitForStatement(ForStatement node) => null;
 
   @override
-  R visitFunctionDeclaration(FunctionDeclaration node) => null;
+  R? visitFunctionDeclaration(FunctionDeclaration node) => null;
 
   @override
-  R visitFunctionDeclarationStatement(FunctionDeclarationStatement node) =>
+  R? visitFunctionDeclarationStatement(FunctionDeclarationStatement node) =>
       null;
 
   @override
-  R visitFunctionExpression(FunctionExpression node) => null;
+  R? visitFunctionExpression(FunctionExpression node) => null;
 
   @override
-  R visitFunctionExpressionInvocation(FunctionExpressionInvocation node) =>
+  R? visitFunctionExpressionInvocation(FunctionExpressionInvocation node) =>
       null;
 
   @override
-  R visitFunctionTypeAlias(FunctionTypeAlias node) => null;
+  R? visitFunctionTypeAlias(FunctionTypeAlias node) => null;
 
   @override
-  R visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) =>
+  R? visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) =>
       null;
 
   @override
-  R visitGenericFunctionType(GenericFunctionType node) => null;
+  R? visitGenericFunctionType(GenericFunctionType node) => null;
 
   @override
-  R visitGenericTypeAlias(GenericTypeAlias node) => null;
+  R? visitGenericTypeAlias(GenericTypeAlias node) => null;
 
   @override
-  R visitHideCombinator(HideCombinator node) => null;
+  R? visitHideCombinator(HideCombinator node) => null;
 
   @override
-  R visitIfElement(IfElement node) => null;
+  R? visitIfElement(IfElement node) => null;
 
   @override
-  R visitIfStatement(IfStatement node) => null;
+  R? visitIfStatement(IfStatement node) => null;
 
   @override
-  R visitImplementsClause(ImplementsClause node) => null;
+  R? visitImplementsClause(ImplementsClause node) => null;
 
   @override
-  R visitImportDirective(ImportDirective node) => null;
+  R? visitImportDirective(ImportDirective node) => null;
 
   @override
-  R visitIndexExpression(IndexExpression node) => null;
+  R? visitIndexExpression(IndexExpression node) => null;
 
   @override
-  R visitInstanceCreationExpression(InstanceCreationExpression node) => null;
+  R? visitInstanceCreationExpression(InstanceCreationExpression node) => null;
 
   @override
-  R visitIntegerLiteral(IntegerLiteral node) => null;
+  R? visitIntegerLiteral(IntegerLiteral node) => null;
 
   @override
-  R visitInterpolationExpression(InterpolationExpression node) => null;
+  R? visitInterpolationExpression(InterpolationExpression node) => null;
 
   @override
-  R visitInterpolationString(InterpolationString node) => null;
+  R? visitInterpolationString(InterpolationString node) => null;
 
   @override
-  R visitIsExpression(IsExpression node) => null;
+  R? visitIsExpression(IsExpression node) => null;
 
   @override
-  R visitLabel(Label node) => null;
+  R? visitLabel(Label node) => null;
 
   @override
-  R visitLabeledStatement(LabeledStatement node) => null;
+  R? visitLabeledStatement(LabeledStatement node) => null;
 
   @override
-  R visitLibraryDirective(LibraryDirective node) => null;
+  R? visitLibraryDirective(LibraryDirective node) => null;
 
   @override
-  R visitLibraryIdentifier(LibraryIdentifier node) => null;
+  R? visitLibraryIdentifier(LibraryIdentifier node) => null;
 
   @override
-  R visitListLiteral(ListLiteral node) => null;
+  R? visitListLiteral(ListLiteral node) => null;
 
   @override
-  R visitMapLiteralEntry(MapLiteralEntry node) => null;
+  R? visitMapLiteralEntry(MapLiteralEntry node) => null;
 
   @override
-  R visitMethodDeclaration(MethodDeclaration node) => null;
+  R? visitMethodDeclaration(MethodDeclaration node) => null;
 
   @override
-  R visitMethodInvocation(MethodInvocation node) => null;
+  R? visitMethodInvocation(MethodInvocation node) => null;
 
   @override
-  R visitMixinDeclaration(MixinDeclaration node) => null;
+  R? visitMixinDeclaration(MixinDeclaration node) => null;
 
   @override
-  R visitNamedExpression(NamedExpression node) => null;
+  R? visitNamedExpression(NamedExpression node) => null;
 
   @override
-  R visitNativeClause(NativeClause node) => null;
+  R? visitNativeClause(NativeClause node) => null;
 
   @override
-  R visitNativeFunctionBody(NativeFunctionBody node) => null;
+  R? visitNativeFunctionBody(NativeFunctionBody node) => null;
 
   @override
-  R visitNullLiteral(NullLiteral node) => null;
+  R? visitNullLiteral(NullLiteral node) => null;
 
   @override
-  R visitOnClause(OnClause node) => null;
+  R? visitOnClause(OnClause node) => null;
 
   @override
-  R visitParenthesizedExpression(ParenthesizedExpression node) => null;
+  R? visitParenthesizedExpression(ParenthesizedExpression node) => null;
 
   @override
-  R visitPartDirective(PartDirective node) => null;
+  R? visitPartDirective(PartDirective node) => null;
 
   @override
-  R visitPartOfDirective(PartOfDirective node) => null;
+  R? visitPartOfDirective(PartOfDirective node) => null;
 
   @override
-  R visitPostfixExpression(PostfixExpression node) => null;
+  R? visitPostfixExpression(PostfixExpression node) => null;
 
   @override
-  R visitPrefixedIdentifier(PrefixedIdentifier node) => null;
+  R? visitPrefixedIdentifier(PrefixedIdentifier node) => null;
 
   @override
-  R visitPrefixExpression(PrefixExpression node) => null;
+  R? visitPrefixExpression(PrefixExpression node) => null;
 
   @override
-  R visitPropertyAccess(PropertyAccess node) => null;
+  R? visitPropertyAccess(PropertyAccess node) => null;
 
   @override
-  R visitRedirectingConstructorInvocation(
+  R? visitRedirectingConstructorInvocation(
           RedirectingConstructorInvocation node) =>
       null;
 
   @override
-  R visitRethrowExpression(RethrowExpression node) => null;
+  R? visitRethrowExpression(RethrowExpression node) => null;
 
   @override
-  R visitReturnStatement(ReturnStatement node) => null;
+  R? visitReturnStatement(ReturnStatement node) => null;
 
   @override
-  R visitScriptTag(ScriptTag node) => null;
+  R? visitScriptTag(ScriptTag node) => null;
 
   @override
-  R visitSetOrMapLiteral(SetOrMapLiteral node) => null;
+  R? visitSetOrMapLiteral(SetOrMapLiteral node) => null;
 
   @override
-  R visitShowCombinator(ShowCombinator node) => null;
+  R? visitShowCombinator(ShowCombinator node) => null;
 
   @override
-  R visitSimpleFormalParameter(SimpleFormalParameter node) => null;
+  R? visitSimpleFormalParameter(SimpleFormalParameter node) => null;
 
   @override
-  R visitSimpleIdentifier(SimpleIdentifier node) => null;
+  R? visitSimpleIdentifier(SimpleIdentifier node) => null;
 
   @override
-  R visitSimpleStringLiteral(SimpleStringLiteral node) => null;
+  R? visitSimpleStringLiteral(SimpleStringLiteral node) => null;
 
   @override
-  R visitSpreadElement(SpreadElement node) => null;
+  R? visitSpreadElement(SpreadElement node) => null;
 
   @override
-  R visitStringInterpolation(StringInterpolation node) => null;
+  R? visitStringInterpolation(StringInterpolation node) => null;
 
   @override
-  R visitSuperConstructorInvocation(SuperConstructorInvocation node) => null;
+  R? visitSuperConstructorInvocation(SuperConstructorInvocation node) => null;
 
   @override
-  R visitSuperExpression(SuperExpression node) => null;
+  R? visitSuperExpression(SuperExpression node) => null;
 
   @override
-  R visitSwitchCase(SwitchCase node) => null;
+  R? visitSwitchCase(SwitchCase node) => null;
 
   @override
-  R visitSwitchDefault(SwitchDefault node) => null;
+  R? visitSwitchDefault(SwitchDefault node) => null;
 
   @override
-  R visitSwitchStatement(SwitchStatement node) => null;
+  R? visitSwitchStatement(SwitchStatement node) => null;
 
   @override
-  R visitSymbolLiteral(SymbolLiteral node) => null;
+  R? visitSymbolLiteral(SymbolLiteral node) => null;
 
   @override
-  R visitThisExpression(ThisExpression node) => null;
+  R? visitThisExpression(ThisExpression node) => null;
 
   @override
-  R visitThrowExpression(ThrowExpression node) => null;
+  R? visitThrowExpression(ThrowExpression node) => null;
 
   @override
-  R visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) => null;
+  R? visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) => null;
 
   @override
-  R visitTryStatement(TryStatement node) => null;
+  R? visitTryStatement(TryStatement node) => null;
 
   @override
-  R visitTypeArgumentList(TypeArgumentList node) => null;
+  R? visitTypeArgumentList(TypeArgumentList node) => null;
 
   @override
-  R visitTypeName(TypeName node) => null;
+  R? visitTypeName(TypeName node) => null;
 
   @override
-  R visitTypeParameter(TypeParameter node) => null;
+  R? visitTypeParameter(TypeParameter node) => null;
 
   @override
-  R visitTypeParameterList(TypeParameterList node) => null;
+  R? visitTypeParameterList(TypeParameterList node) => null;
 
   @override
-  R visitVariableDeclaration(VariableDeclaration node) => null;
+  R? visitVariableDeclaration(VariableDeclaration node) => null;
 
   @override
-  R visitVariableDeclarationList(VariableDeclarationList node) => null;
+  R? visitVariableDeclarationList(VariableDeclarationList node) => null;
 
   @override
-  R visitVariableDeclarationStatement(VariableDeclarationStatement node) =>
+  R? visitVariableDeclarationStatement(VariableDeclarationStatement node) =>
       null;
 
   @override
-  R visitWhileStatement(WhileStatement node) => null;
+  R? visitWhileStatement(WhileStatement node) => null;
 
   @override
-  R visitWithClause(WithClause node) => null;
+  R? visitWithClause(WithClause node) => null;
 
   @override
-  R visitYieldStatement(YieldStatement node) => null;
+  R? visitYieldStatement(YieldStatement node) => null;
 }
 
 /// An AST visitor that will throw an exception if any of the visit methods that
@@ -1732,380 +1736,380 @@
   const ThrowingAstVisitor();
 
   @override
-  R visitAdjacentStrings(AdjacentStrings node) => _throw(node);
+  R? visitAdjacentStrings(AdjacentStrings node) => _throw(node);
 
   @override
-  R visitAnnotation(Annotation node) => _throw(node);
+  R? visitAnnotation(Annotation node) => _throw(node);
 
   @override
-  R visitArgumentList(ArgumentList node) => _throw(node);
+  R? visitArgumentList(ArgumentList node) => _throw(node);
 
   @override
-  R visitAsExpression(AsExpression node) => _throw(node);
+  R? visitAsExpression(AsExpression node) => _throw(node);
 
   @override
-  R visitAssertInitializer(AssertInitializer node) => _throw(node);
+  R? visitAssertInitializer(AssertInitializer node) => _throw(node);
 
   @override
-  R visitAssertStatement(AssertStatement node) => _throw(node);
+  R? visitAssertStatement(AssertStatement node) => _throw(node);
 
   @override
-  R visitAssignmentExpression(AssignmentExpression node) => _throw(node);
+  R? visitAssignmentExpression(AssignmentExpression node) => _throw(node);
 
   @override
-  R visitAwaitExpression(AwaitExpression node) => _throw(node);
+  R? visitAwaitExpression(AwaitExpression node) => _throw(node);
 
   @override
-  R visitBinaryExpression(BinaryExpression node) => _throw(node);
+  R? visitBinaryExpression(BinaryExpression node) => _throw(node);
 
   @override
-  R visitBlock(Block node) => _throw(node);
+  R? visitBlock(Block node) => _throw(node);
 
   @override
-  R visitBlockFunctionBody(BlockFunctionBody node) => _throw(node);
+  R? visitBlockFunctionBody(BlockFunctionBody node) => _throw(node);
 
   @override
-  R visitBooleanLiteral(BooleanLiteral node) => _throw(node);
+  R? visitBooleanLiteral(BooleanLiteral node) => _throw(node);
 
   @override
-  R visitBreakStatement(BreakStatement node) => _throw(node);
+  R? visitBreakStatement(BreakStatement node) => _throw(node);
 
   @override
-  R visitCascadeExpression(CascadeExpression node) => _throw(node);
+  R? visitCascadeExpression(CascadeExpression node) => _throw(node);
 
   @override
-  R visitCatchClause(CatchClause node) => _throw(node);
+  R? visitCatchClause(CatchClause node) => _throw(node);
 
   @override
-  R visitClassDeclaration(ClassDeclaration node) => _throw(node);
+  R? visitClassDeclaration(ClassDeclaration node) => _throw(node);
 
   @override
-  R visitClassTypeAlias(ClassTypeAlias node) => _throw(node);
+  R? visitClassTypeAlias(ClassTypeAlias node) => _throw(node);
 
   @override
-  R visitComment(Comment node) => _throw(node);
+  R? visitComment(Comment node) => _throw(node);
 
   @override
-  R visitCommentReference(CommentReference node) => _throw(node);
+  R? visitCommentReference(CommentReference node) => _throw(node);
 
   @override
-  R visitCompilationUnit(CompilationUnit node) => _throw(node);
+  R? visitCompilationUnit(CompilationUnit node) => _throw(node);
 
   @override
-  R visitConditionalExpression(ConditionalExpression node) => _throw(node);
+  R? visitConditionalExpression(ConditionalExpression node) => _throw(node);
 
   @override
-  R visitConfiguration(Configuration node) => _throw(node);
+  R? visitConfiguration(Configuration node) => _throw(node);
 
   @override
-  R visitConstructorDeclaration(ConstructorDeclaration node) => _throw(node);
+  R? visitConstructorDeclaration(ConstructorDeclaration node) => _throw(node);
 
   @override
-  R visitConstructorFieldInitializer(ConstructorFieldInitializer node) =>
+  R? visitConstructorFieldInitializer(ConstructorFieldInitializer node) =>
       _throw(node);
 
   @override
-  R visitConstructorName(ConstructorName node) => _throw(node);
+  R? visitConstructorName(ConstructorName node) => _throw(node);
 
   @override
-  R visitContinueStatement(ContinueStatement node) => _throw(node);
+  R? visitContinueStatement(ContinueStatement node) => _throw(node);
 
   @override
-  R visitDeclaredIdentifier(DeclaredIdentifier node) => _throw(node);
+  R? visitDeclaredIdentifier(DeclaredIdentifier node) => _throw(node);
 
   @override
-  R visitDefaultFormalParameter(DefaultFormalParameter node) => _throw(node);
+  R? visitDefaultFormalParameter(DefaultFormalParameter node) => _throw(node);
 
   @override
-  R visitDoStatement(DoStatement node) => _throw(node);
+  R? visitDoStatement(DoStatement node) => _throw(node);
 
   @override
-  R visitDottedName(DottedName node) => _throw(node);
+  R? visitDottedName(DottedName node) => _throw(node);
 
   @override
-  R visitDoubleLiteral(DoubleLiteral node) => _throw(node);
+  R? visitDoubleLiteral(DoubleLiteral node) => _throw(node);
 
   @override
-  R visitEmptyFunctionBody(EmptyFunctionBody node) => _throw(node);
+  R? visitEmptyFunctionBody(EmptyFunctionBody node) => _throw(node);
 
   @override
-  R visitEmptyStatement(EmptyStatement node) => _throw(node);
+  R? visitEmptyStatement(EmptyStatement node) => _throw(node);
 
   @override
-  R visitEnumConstantDeclaration(EnumConstantDeclaration node) => _throw(node);
+  R? visitEnumConstantDeclaration(EnumConstantDeclaration node) => _throw(node);
 
   @override
-  R visitEnumDeclaration(EnumDeclaration node) => _throw(node);
+  R? visitEnumDeclaration(EnumDeclaration node) => _throw(node);
 
   @override
-  R visitExportDirective(ExportDirective node) => _throw(node);
+  R? visitExportDirective(ExportDirective node) => _throw(node);
 
   @override
-  R visitExpressionFunctionBody(ExpressionFunctionBody node) => _throw(node);
+  R? visitExpressionFunctionBody(ExpressionFunctionBody node) => _throw(node);
 
   @override
-  R visitExpressionStatement(ExpressionStatement node) => _throw(node);
+  R? visitExpressionStatement(ExpressionStatement node) => _throw(node);
 
   @override
-  R visitExtendsClause(ExtendsClause node) => _throw(node);
+  R? visitExtendsClause(ExtendsClause node) => _throw(node);
 
   @override
-  R visitExtensionDeclaration(ExtensionDeclaration node) => _throw(node);
+  R? visitExtensionDeclaration(ExtensionDeclaration node) => _throw(node);
 
   @override
-  R visitExtensionOverride(ExtensionOverride node) => _throw(node);
+  R? visitExtensionOverride(ExtensionOverride node) => _throw(node);
 
   @override
-  R visitFieldDeclaration(FieldDeclaration node) => _throw(node);
+  R? visitFieldDeclaration(FieldDeclaration node) => _throw(node);
 
   @override
-  R visitFieldFormalParameter(FieldFormalParameter node) => _throw(node);
+  R? visitFieldFormalParameter(FieldFormalParameter node) => _throw(node);
 
   @override
-  R visitForEachPartsWithDeclaration(ForEachPartsWithDeclaration node) =>
+  R? visitForEachPartsWithDeclaration(ForEachPartsWithDeclaration node) =>
       _throw(node);
 
   @override
-  R visitForEachPartsWithIdentifier(ForEachPartsWithIdentifier node) =>
+  R? visitForEachPartsWithIdentifier(ForEachPartsWithIdentifier node) =>
       _throw(node);
 
   @override
-  R visitForElement(ForElement node) => _throw(node);
+  R? visitForElement(ForElement node) => _throw(node);
 
   @override
-  R visitFormalParameterList(FormalParameterList node) => _throw(node);
+  R? visitFormalParameterList(FormalParameterList node) => _throw(node);
 
   @override
-  R visitForPartsWithDeclarations(ForPartsWithDeclarations node) =>
+  R? visitForPartsWithDeclarations(ForPartsWithDeclarations node) =>
       _throw(node);
 
   @override
-  R visitForPartsWithExpression(ForPartsWithExpression node) => _throw(node);
+  R? visitForPartsWithExpression(ForPartsWithExpression node) => _throw(node);
 
   @override
-  R visitForStatement(ForStatement node) => _throw(node);
+  R? visitForStatement(ForStatement node) => _throw(node);
 
   @override
-  R visitFunctionDeclaration(FunctionDeclaration node) => _throw(node);
+  R? visitFunctionDeclaration(FunctionDeclaration node) => _throw(node);
 
   @override
-  R visitFunctionDeclarationStatement(FunctionDeclarationStatement node) =>
+  R? visitFunctionDeclarationStatement(FunctionDeclarationStatement node) =>
       _throw(node);
 
   @override
-  R visitFunctionExpression(FunctionExpression node) => _throw(node);
+  R? visitFunctionExpression(FunctionExpression node) => _throw(node);
 
   @override
-  R visitFunctionExpressionInvocation(FunctionExpressionInvocation node) =>
+  R? visitFunctionExpressionInvocation(FunctionExpressionInvocation node) =>
       _throw(node);
 
   @override
-  R visitFunctionTypeAlias(FunctionTypeAlias node) => _throw(node);
+  R? visitFunctionTypeAlias(FunctionTypeAlias node) => _throw(node);
 
   @override
-  R visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) =>
+  R? visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) =>
       _throw(node);
 
   @override
-  R visitGenericFunctionType(GenericFunctionType node) => _throw(node);
+  R? visitGenericFunctionType(GenericFunctionType node) => _throw(node);
 
   @override
-  R visitGenericTypeAlias(GenericTypeAlias node) => _throw(node);
+  R? visitGenericTypeAlias(GenericTypeAlias node) => _throw(node);
 
   @override
-  R visitHideCombinator(HideCombinator node) => _throw(node);
+  R? visitHideCombinator(HideCombinator node) => _throw(node);
 
   @override
-  R visitIfElement(IfElement node) => _throw(node);
+  R? visitIfElement(IfElement node) => _throw(node);
 
   @override
-  R visitIfStatement(IfStatement node) => _throw(node);
+  R? visitIfStatement(IfStatement node) => _throw(node);
 
   @override
-  R visitImplementsClause(ImplementsClause node) => _throw(node);
+  R? visitImplementsClause(ImplementsClause node) => _throw(node);
 
   @override
-  R visitImportDirective(ImportDirective node) => _throw(node);
+  R? visitImportDirective(ImportDirective node) => _throw(node);
 
   @override
-  R visitIndexExpression(IndexExpression node) => _throw(node);
+  R? visitIndexExpression(IndexExpression node) => _throw(node);
 
   @override
-  R visitInstanceCreationExpression(InstanceCreationExpression node) =>
+  R? visitInstanceCreationExpression(InstanceCreationExpression node) =>
       _throw(node);
 
   @override
-  R visitIntegerLiteral(IntegerLiteral node) => _throw(node);
+  R? visitIntegerLiteral(IntegerLiteral node) => _throw(node);
 
   @override
-  R visitInterpolationExpression(InterpolationExpression node) => _throw(node);
+  R? visitInterpolationExpression(InterpolationExpression node) => _throw(node);
 
   @override
-  R visitInterpolationString(InterpolationString node) => _throw(node);
+  R? visitInterpolationString(InterpolationString node) => _throw(node);
 
   @override
-  R visitIsExpression(IsExpression node) => _throw(node);
+  R? visitIsExpression(IsExpression node) => _throw(node);
 
   @override
-  R visitLabel(Label node) => _throw(node);
+  R? visitLabel(Label node) => _throw(node);
 
   @override
-  R visitLabeledStatement(LabeledStatement node) => _throw(node);
+  R? visitLabeledStatement(LabeledStatement node) => _throw(node);
 
   @override
-  R visitLibraryDirective(LibraryDirective node) => _throw(node);
+  R? visitLibraryDirective(LibraryDirective node) => _throw(node);
 
   @override
-  R visitLibraryIdentifier(LibraryIdentifier node) => _throw(node);
+  R? visitLibraryIdentifier(LibraryIdentifier node) => _throw(node);
 
   @override
-  R visitListLiteral(ListLiteral node) => _throw(node);
+  R? visitListLiteral(ListLiteral node) => _throw(node);
 
   @override
-  R visitMapLiteralEntry(MapLiteralEntry node) => _throw(node);
+  R? visitMapLiteralEntry(MapLiteralEntry node) => _throw(node);
 
   @override
-  R visitMethodDeclaration(MethodDeclaration node) => _throw(node);
+  R? visitMethodDeclaration(MethodDeclaration node) => _throw(node);
 
   @override
-  R visitMethodInvocation(MethodInvocation node) => _throw(node);
+  R? visitMethodInvocation(MethodInvocation node) => _throw(node);
 
   @override
-  R visitMixinDeclaration(MixinDeclaration node) => _throw(node);
+  R? visitMixinDeclaration(MixinDeclaration node) => _throw(node);
 
   @override
-  R visitNamedExpression(NamedExpression node) => _throw(node);
+  R? visitNamedExpression(NamedExpression node) => _throw(node);
 
   @override
-  R visitNativeClause(NativeClause node) => _throw(node);
+  R? visitNativeClause(NativeClause node) => _throw(node);
 
   @override
-  R visitNativeFunctionBody(NativeFunctionBody node) => _throw(node);
+  R? visitNativeFunctionBody(NativeFunctionBody node) => _throw(node);
 
   @override
-  R visitNullLiteral(NullLiteral node) => _throw(node);
+  R? visitNullLiteral(NullLiteral node) => _throw(node);
 
   @override
-  R visitOnClause(OnClause node) => _throw(node);
+  R? visitOnClause(OnClause node) => _throw(node);
 
   @override
-  R visitParenthesizedExpression(ParenthesizedExpression node) => _throw(node);
+  R? visitParenthesizedExpression(ParenthesizedExpression node) => _throw(node);
 
   @override
-  R visitPartDirective(PartDirective node) => _throw(node);
+  R? visitPartDirective(PartDirective node) => _throw(node);
 
   @override
-  R visitPartOfDirective(PartOfDirective node) => _throw(node);
+  R? visitPartOfDirective(PartOfDirective node) => _throw(node);
 
   @override
-  R visitPostfixExpression(PostfixExpression node) => _throw(node);
+  R? visitPostfixExpression(PostfixExpression node) => _throw(node);
 
   @override
-  R visitPrefixedIdentifier(PrefixedIdentifier node) => _throw(node);
+  R? visitPrefixedIdentifier(PrefixedIdentifier node) => _throw(node);
 
   @override
-  R visitPrefixExpression(PrefixExpression node) => _throw(node);
+  R? visitPrefixExpression(PrefixExpression node) => _throw(node);
 
   @override
-  R visitPropertyAccess(PropertyAccess node) => _throw(node);
+  R? visitPropertyAccess(PropertyAccess node) => _throw(node);
 
   @override
-  R visitRedirectingConstructorInvocation(
+  R? visitRedirectingConstructorInvocation(
           RedirectingConstructorInvocation node) =>
       _throw(node);
 
   @override
-  R visitRethrowExpression(RethrowExpression node) => _throw(node);
+  R? visitRethrowExpression(RethrowExpression node) => _throw(node);
 
   @override
-  R visitReturnStatement(ReturnStatement node) => _throw(node);
+  R? visitReturnStatement(ReturnStatement node) => _throw(node);
 
   @override
-  R visitScriptTag(ScriptTag node) => _throw(node);
+  R? visitScriptTag(ScriptTag node) => _throw(node);
 
   @override
-  R visitSetOrMapLiteral(SetOrMapLiteral node) => _throw(node);
+  R? visitSetOrMapLiteral(SetOrMapLiteral node) => _throw(node);
 
   @override
-  R visitShowCombinator(ShowCombinator node) => _throw(node);
+  R? visitShowCombinator(ShowCombinator node) => _throw(node);
 
   @override
-  R visitSimpleFormalParameter(SimpleFormalParameter node) => _throw(node);
+  R? visitSimpleFormalParameter(SimpleFormalParameter node) => _throw(node);
 
   @override
-  R visitSimpleIdentifier(SimpleIdentifier node) => _throw(node);
+  R? visitSimpleIdentifier(SimpleIdentifier node) => _throw(node);
 
   @override
-  R visitSimpleStringLiteral(SimpleStringLiteral node) => _throw(node);
+  R? visitSimpleStringLiteral(SimpleStringLiteral node) => _throw(node);
 
   @override
-  R visitSpreadElement(SpreadElement node) => _throw(node);
+  R? visitSpreadElement(SpreadElement node) => _throw(node);
 
   @override
-  R visitStringInterpolation(StringInterpolation node) => _throw(node);
+  R? visitStringInterpolation(StringInterpolation node) => _throw(node);
 
   @override
-  R visitSuperConstructorInvocation(SuperConstructorInvocation node) =>
+  R? visitSuperConstructorInvocation(SuperConstructorInvocation node) =>
       _throw(node);
 
   @override
-  R visitSuperExpression(SuperExpression node) => _throw(node);
+  R? visitSuperExpression(SuperExpression node) => _throw(node);
 
   @override
-  R visitSwitchCase(SwitchCase node) => _throw(node);
+  R? visitSwitchCase(SwitchCase node) => _throw(node);
 
   @override
-  R visitSwitchDefault(SwitchDefault node) => _throw(node);
+  R? visitSwitchDefault(SwitchDefault node) => _throw(node);
 
   @override
-  R visitSwitchStatement(SwitchStatement node) => _throw(node);
+  R? visitSwitchStatement(SwitchStatement node) => _throw(node);
 
   @override
-  R visitSymbolLiteral(SymbolLiteral node) => _throw(node);
+  R? visitSymbolLiteral(SymbolLiteral node) => _throw(node);
 
   @override
-  R visitThisExpression(ThisExpression node) => _throw(node);
+  R? visitThisExpression(ThisExpression node) => _throw(node);
 
   @override
-  R visitThrowExpression(ThrowExpression node) => _throw(node);
+  R? visitThrowExpression(ThrowExpression node) => _throw(node);
 
   @override
-  R visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) =>
+  R? visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) =>
       _throw(node);
 
   @override
-  R visitTryStatement(TryStatement node) => _throw(node);
+  R? visitTryStatement(TryStatement node) => _throw(node);
 
   @override
-  R visitTypeArgumentList(TypeArgumentList node) => _throw(node);
+  R? visitTypeArgumentList(TypeArgumentList node) => _throw(node);
 
   @override
-  R visitTypeName(TypeName node) => _throw(node);
+  R? visitTypeName(TypeName node) => _throw(node);
 
   @override
-  R visitTypeParameter(TypeParameter node) => _throw(node);
+  R? visitTypeParameter(TypeParameter node) => _throw(node);
 
   @override
-  R visitTypeParameterList(TypeParameterList node) => _throw(node);
+  R? visitTypeParameterList(TypeParameterList node) => _throw(node);
 
   @override
-  R visitVariableDeclaration(VariableDeclaration node) => _throw(node);
+  R? visitVariableDeclaration(VariableDeclaration node) => _throw(node);
 
   @override
-  R visitVariableDeclarationList(VariableDeclarationList node) => _throw(node);
+  R? visitVariableDeclarationList(VariableDeclarationList node) => _throw(node);
 
   @override
-  R visitVariableDeclarationStatement(VariableDeclarationStatement node) =>
+  R? visitVariableDeclarationStatement(VariableDeclarationStatement node) =>
       _throw(node);
 
   @override
-  R visitWhileStatement(WhileStatement node) => _throw(node);
+  R? visitWhileStatement(WhileStatement node) => _throw(node);
 
   @override
-  R visitWithClause(WithClause node) => _throw(node);
+  R? visitWithClause(WithClause node) => _throw(node);
 
   @override
-  R visitYieldStatement(YieldStatement node) => _throw(node);
+  R? visitYieldStatement(YieldStatement node) => _throw(node);
 
   R _throw(AstNode node) {
     throw Exception('Missing implementation of visit${node.runtimeType}');
@@ -2124,974 +2128,974 @@
 
   /// Initialize a newly created visitor to time calls to the given base
   /// visitor's visits.
-  TimedAstVisitor(this._baseVisitor, [Stopwatch watch])
+  TimedAstVisitor(this._baseVisitor, [Stopwatch? watch])
       : stopwatch = watch ?? Stopwatch();
 
   @override
-  T visitAdjacentStrings(AdjacentStrings node) {
+  T? visitAdjacentStrings(AdjacentStrings node) {
     stopwatch.start();
-    T result = _baseVisitor.visitAdjacentStrings(node);
+    T? result = _baseVisitor.visitAdjacentStrings(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitAnnotation(Annotation node) {
+  T? visitAnnotation(Annotation node) {
     stopwatch.start();
-    T result = _baseVisitor.visitAnnotation(node);
+    T? result = _baseVisitor.visitAnnotation(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitArgumentList(ArgumentList node) {
+  T? visitArgumentList(ArgumentList node) {
     stopwatch.start();
-    T result = _baseVisitor.visitArgumentList(node);
+    T? result = _baseVisitor.visitArgumentList(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitAsExpression(AsExpression node) {
+  T? visitAsExpression(AsExpression node) {
     stopwatch.start();
-    T result = _baseVisitor.visitAsExpression(node);
+    T? result = _baseVisitor.visitAsExpression(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitAssertInitializer(AssertInitializer node) {
+  T? visitAssertInitializer(AssertInitializer node) {
     stopwatch.start();
-    T result = _baseVisitor.visitAssertInitializer(node);
+    T? result = _baseVisitor.visitAssertInitializer(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitAssertStatement(AssertStatement node) {
+  T? visitAssertStatement(AssertStatement node) {
     stopwatch.start();
-    T result = _baseVisitor.visitAssertStatement(node);
+    T? result = _baseVisitor.visitAssertStatement(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitAssignmentExpression(AssignmentExpression node) {
+  T? visitAssignmentExpression(AssignmentExpression node) {
     stopwatch.start();
-    T result = _baseVisitor.visitAssignmentExpression(node);
+    T? result = _baseVisitor.visitAssignmentExpression(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitAwaitExpression(AwaitExpression node) {
+  T? visitAwaitExpression(AwaitExpression node) {
     stopwatch.start();
-    T result = _baseVisitor.visitAwaitExpression(node);
+    T? result = _baseVisitor.visitAwaitExpression(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitBinaryExpression(BinaryExpression node) {
+  T? visitBinaryExpression(BinaryExpression node) {
     stopwatch.start();
-    T result = _baseVisitor.visitBinaryExpression(node);
+    T? result = _baseVisitor.visitBinaryExpression(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitBlock(Block node) {
+  T? visitBlock(Block node) {
     stopwatch.start();
-    T result = _baseVisitor.visitBlock(node);
+    T? result = _baseVisitor.visitBlock(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitBlockFunctionBody(BlockFunctionBody node) {
+  T? visitBlockFunctionBody(BlockFunctionBody node) {
     stopwatch.start();
-    T result = _baseVisitor.visitBlockFunctionBody(node);
+    T? result = _baseVisitor.visitBlockFunctionBody(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitBooleanLiteral(BooleanLiteral node) {
+  T? visitBooleanLiteral(BooleanLiteral node) {
     stopwatch.start();
-    T result = _baseVisitor.visitBooleanLiteral(node);
+    T? result = _baseVisitor.visitBooleanLiteral(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitBreakStatement(BreakStatement node) {
+  T? visitBreakStatement(BreakStatement node) {
     stopwatch.start();
-    T result = _baseVisitor.visitBreakStatement(node);
+    T? result = _baseVisitor.visitBreakStatement(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitCascadeExpression(CascadeExpression node) {
+  T? visitCascadeExpression(CascadeExpression node) {
     stopwatch.start();
-    T result = _baseVisitor.visitCascadeExpression(node);
+    T? result = _baseVisitor.visitCascadeExpression(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitCatchClause(CatchClause node) {
+  T? visitCatchClause(CatchClause node) {
     stopwatch.start();
-    T result = _baseVisitor.visitCatchClause(node);
+    T? result = _baseVisitor.visitCatchClause(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitClassDeclaration(ClassDeclaration node) {
+  T? visitClassDeclaration(ClassDeclaration node) {
     stopwatch.start();
-    T result = _baseVisitor.visitClassDeclaration(node);
+    T? result = _baseVisitor.visitClassDeclaration(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitClassTypeAlias(ClassTypeAlias node) {
+  T? visitClassTypeAlias(ClassTypeAlias node) {
     stopwatch.start();
-    T result = _baseVisitor.visitClassTypeAlias(node);
+    T? result = _baseVisitor.visitClassTypeAlias(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitComment(Comment node) {
+  T? visitComment(Comment node) {
     stopwatch.start();
-    T result = _baseVisitor.visitComment(node);
+    T? result = _baseVisitor.visitComment(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitCommentReference(CommentReference node) {
+  T? visitCommentReference(CommentReference node) {
     stopwatch.start();
-    T result = _baseVisitor.visitCommentReference(node);
+    T? result = _baseVisitor.visitCommentReference(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitCompilationUnit(CompilationUnit node) {
+  T? visitCompilationUnit(CompilationUnit node) {
     stopwatch.start();
-    T result = _baseVisitor.visitCompilationUnit(node);
+    T? result = _baseVisitor.visitCompilationUnit(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitConditionalExpression(ConditionalExpression node) {
+  T? visitConditionalExpression(ConditionalExpression node) {
     stopwatch.start();
-    T result = _baseVisitor.visitConditionalExpression(node);
+    T? result = _baseVisitor.visitConditionalExpression(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitConfiguration(Configuration node) {
+  T? visitConfiguration(Configuration node) {
     stopwatch.start();
-    T result = _baseVisitor.visitConfiguration(node);
+    T? result = _baseVisitor.visitConfiguration(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitConstructorDeclaration(ConstructorDeclaration node) {
+  T? visitConstructorDeclaration(ConstructorDeclaration node) {
     stopwatch.start();
-    T result = _baseVisitor.visitConstructorDeclaration(node);
+    T? result = _baseVisitor.visitConstructorDeclaration(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+  T? visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
     stopwatch.start();
-    T result = _baseVisitor.visitConstructorFieldInitializer(node);
+    T? result = _baseVisitor.visitConstructorFieldInitializer(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitConstructorName(ConstructorName node) {
+  T? visitConstructorName(ConstructorName node) {
     stopwatch.start();
-    T result = _baseVisitor.visitConstructorName(node);
+    T? result = _baseVisitor.visitConstructorName(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitContinueStatement(ContinueStatement node) {
+  T? visitContinueStatement(ContinueStatement node) {
     stopwatch.start();
-    T result = _baseVisitor.visitContinueStatement(node);
+    T? result = _baseVisitor.visitContinueStatement(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitDeclaredIdentifier(DeclaredIdentifier node) {
+  T? visitDeclaredIdentifier(DeclaredIdentifier node) {
     stopwatch.start();
-    T result = _baseVisitor.visitDeclaredIdentifier(node);
+    T? result = _baseVisitor.visitDeclaredIdentifier(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitDefaultFormalParameter(DefaultFormalParameter node) {
+  T? visitDefaultFormalParameter(DefaultFormalParameter node) {
     stopwatch.start();
-    T result = _baseVisitor.visitDefaultFormalParameter(node);
+    T? result = _baseVisitor.visitDefaultFormalParameter(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitDoStatement(DoStatement node) {
+  T? visitDoStatement(DoStatement node) {
     stopwatch.start();
-    T result = _baseVisitor.visitDoStatement(node);
+    T? result = _baseVisitor.visitDoStatement(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitDottedName(DottedName node) {
+  T? visitDottedName(DottedName node) {
     stopwatch.start();
-    T result = _baseVisitor.visitDottedName(node);
+    T? result = _baseVisitor.visitDottedName(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitDoubleLiteral(DoubleLiteral node) {
+  T? visitDoubleLiteral(DoubleLiteral node) {
     stopwatch.start();
-    T result = _baseVisitor.visitDoubleLiteral(node);
+    T? result = _baseVisitor.visitDoubleLiteral(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitEmptyFunctionBody(EmptyFunctionBody node) {
+  T? visitEmptyFunctionBody(EmptyFunctionBody node) {
     stopwatch.start();
-    T result = _baseVisitor.visitEmptyFunctionBody(node);
+    T? result = _baseVisitor.visitEmptyFunctionBody(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitEmptyStatement(EmptyStatement node) {
+  T? visitEmptyStatement(EmptyStatement node) {
     stopwatch.start();
-    T result = _baseVisitor.visitEmptyStatement(node);
+    T? result = _baseVisitor.visitEmptyStatement(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitEnumConstantDeclaration(EnumConstantDeclaration node) {
+  T? visitEnumConstantDeclaration(EnumConstantDeclaration node) {
     stopwatch.start();
-    T result = _baseVisitor.visitEnumConstantDeclaration(node);
+    T? result = _baseVisitor.visitEnumConstantDeclaration(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitEnumDeclaration(EnumDeclaration node) {
+  T? visitEnumDeclaration(EnumDeclaration node) {
     stopwatch.start();
-    T result = _baseVisitor.visitEnumDeclaration(node);
+    T? result = _baseVisitor.visitEnumDeclaration(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitExportDirective(ExportDirective node) {
+  T? visitExportDirective(ExportDirective node) {
     stopwatch.start();
-    T result = _baseVisitor.visitExportDirective(node);
+    T? result = _baseVisitor.visitExportDirective(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitExpressionFunctionBody(ExpressionFunctionBody node) {
+  T? visitExpressionFunctionBody(ExpressionFunctionBody node) {
     stopwatch.start();
-    T result = _baseVisitor.visitExpressionFunctionBody(node);
+    T? result = _baseVisitor.visitExpressionFunctionBody(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitExpressionStatement(ExpressionStatement node) {
+  T? visitExpressionStatement(ExpressionStatement node) {
     stopwatch.start();
-    T result = _baseVisitor.visitExpressionStatement(node);
+    T? result = _baseVisitor.visitExpressionStatement(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitExtendsClause(ExtendsClause node) {
+  T? visitExtendsClause(ExtendsClause node) {
     stopwatch.start();
-    T result = _baseVisitor.visitExtendsClause(node);
+    T? result = _baseVisitor.visitExtendsClause(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitExtensionDeclaration(ExtensionDeclaration node) {
+  T? visitExtensionDeclaration(ExtensionDeclaration node) {
     stopwatch.start();
-    T result = _baseVisitor.visitExtensionDeclaration(node);
+    T? result = _baseVisitor.visitExtensionDeclaration(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitExtensionOverride(ExtensionOverride node) {
+  T? visitExtensionOverride(ExtensionOverride node) {
     stopwatch.start();
-    T result = _baseVisitor.visitExtensionOverride(node);
+    T? result = _baseVisitor.visitExtensionOverride(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitFieldDeclaration(FieldDeclaration node) {
+  T? visitFieldDeclaration(FieldDeclaration node) {
     stopwatch.start();
-    T result = _baseVisitor.visitFieldDeclaration(node);
+    T? result = _baseVisitor.visitFieldDeclaration(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitFieldFormalParameter(FieldFormalParameter node) {
+  T? visitFieldFormalParameter(FieldFormalParameter node) {
     stopwatch.start();
-    T result = _baseVisitor.visitFieldFormalParameter(node);
+    T? result = _baseVisitor.visitFieldFormalParameter(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitForEachPartsWithDeclaration(ForEachPartsWithDeclaration node) {
+  T? visitForEachPartsWithDeclaration(ForEachPartsWithDeclaration node) {
     stopwatch.start();
-    T result = _baseVisitor.visitForEachPartsWithDeclaration(node);
+    T? result = _baseVisitor.visitForEachPartsWithDeclaration(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitForEachPartsWithIdentifier(ForEachPartsWithIdentifier node) {
+  T? visitForEachPartsWithIdentifier(ForEachPartsWithIdentifier node) {
     stopwatch.start();
-    T result = _baseVisitor.visitForEachPartsWithIdentifier(node);
+    T? result = _baseVisitor.visitForEachPartsWithIdentifier(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitForElement(ForElement node) {
+  T? visitForElement(ForElement node) {
     stopwatch.start();
-    T result = _baseVisitor.visitForElement(node);
+    T? result = _baseVisitor.visitForElement(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitFormalParameterList(FormalParameterList node) {
+  T? visitFormalParameterList(FormalParameterList node) {
     stopwatch.start();
-    T result = _baseVisitor.visitFormalParameterList(node);
+    T? result = _baseVisitor.visitFormalParameterList(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitForPartsWithDeclarations(ForPartsWithDeclarations node) {
+  T? visitForPartsWithDeclarations(ForPartsWithDeclarations node) {
     stopwatch.start();
-    T result = _baseVisitor.visitForPartsWithDeclarations(node);
+    T? result = _baseVisitor.visitForPartsWithDeclarations(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitForPartsWithExpression(ForPartsWithExpression node) {
+  T? visitForPartsWithExpression(ForPartsWithExpression node) {
     stopwatch.start();
-    T result = _baseVisitor.visitForPartsWithExpression(node);
+    T? result = _baseVisitor.visitForPartsWithExpression(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitForStatement(ForStatement node) {
+  T? visitForStatement(ForStatement node) {
     stopwatch.start();
-    T result = _baseVisitor.visitForStatement(node);
+    T? result = _baseVisitor.visitForStatement(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitFunctionDeclaration(FunctionDeclaration node) {
+  T? visitFunctionDeclaration(FunctionDeclaration node) {
     stopwatch.start();
-    T result = _baseVisitor.visitFunctionDeclaration(node);
+    T? result = _baseVisitor.visitFunctionDeclaration(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
+  T? visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
     stopwatch.start();
-    T result = _baseVisitor.visitFunctionDeclarationStatement(node);
+    T? result = _baseVisitor.visitFunctionDeclarationStatement(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitFunctionExpression(FunctionExpression node) {
+  T? visitFunctionExpression(FunctionExpression node) {
     stopwatch.start();
-    T result = _baseVisitor.visitFunctionExpression(node);
+    T? result = _baseVisitor.visitFunctionExpression(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+  T? visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     stopwatch.start();
-    T result = _baseVisitor.visitFunctionExpressionInvocation(node);
+    T? result = _baseVisitor.visitFunctionExpressionInvocation(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitFunctionTypeAlias(FunctionTypeAlias node) {
+  T? visitFunctionTypeAlias(FunctionTypeAlias node) {
     stopwatch.start();
-    T result = _baseVisitor.visitFunctionTypeAlias(node);
+    T? result = _baseVisitor.visitFunctionTypeAlias(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+  T? visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     stopwatch.start();
-    T result = _baseVisitor.visitFunctionTypedFormalParameter(node);
+    T? result = _baseVisitor.visitFunctionTypedFormalParameter(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitGenericFunctionType(GenericFunctionType node) {
+  T? visitGenericFunctionType(GenericFunctionType node) {
     stopwatch.start();
-    T result = _baseVisitor.visitGenericFunctionType(node);
+    T? result = _baseVisitor.visitGenericFunctionType(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitGenericTypeAlias(GenericTypeAlias node) {
+  T? visitGenericTypeAlias(GenericTypeAlias node) {
     stopwatch.start();
-    T result = _baseVisitor.visitGenericTypeAlias(node);
+    T? result = _baseVisitor.visitGenericTypeAlias(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitHideCombinator(HideCombinator node) {
+  T? visitHideCombinator(HideCombinator node) {
     stopwatch.start();
-    T result = _baseVisitor.visitHideCombinator(node);
+    T? result = _baseVisitor.visitHideCombinator(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitIfElement(IfElement node) {
+  T? visitIfElement(IfElement node) {
     stopwatch.start();
-    T result = _baseVisitor.visitIfElement(node);
+    T? result = _baseVisitor.visitIfElement(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitIfStatement(IfStatement node) {
+  T? visitIfStatement(IfStatement node) {
     stopwatch.start();
-    T result = _baseVisitor.visitIfStatement(node);
+    T? result = _baseVisitor.visitIfStatement(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitImplementsClause(ImplementsClause node) {
+  T? visitImplementsClause(ImplementsClause node) {
     stopwatch.start();
-    T result = _baseVisitor.visitImplementsClause(node);
+    T? result = _baseVisitor.visitImplementsClause(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitImportDirective(ImportDirective node) {
+  T? visitImportDirective(ImportDirective node) {
     stopwatch.start();
-    T result = _baseVisitor.visitImportDirective(node);
+    T? result = _baseVisitor.visitImportDirective(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitIndexExpression(IndexExpression node) {
+  T? visitIndexExpression(IndexExpression node) {
     stopwatch.start();
-    T result = _baseVisitor.visitIndexExpression(node);
+    T? result = _baseVisitor.visitIndexExpression(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitInstanceCreationExpression(InstanceCreationExpression node) {
+  T? visitInstanceCreationExpression(InstanceCreationExpression node) {
     stopwatch.start();
-    T result = _baseVisitor.visitInstanceCreationExpression(node);
+    T? result = _baseVisitor.visitInstanceCreationExpression(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitIntegerLiteral(IntegerLiteral node) {
+  T? visitIntegerLiteral(IntegerLiteral node) {
     stopwatch.start();
-    T result = _baseVisitor.visitIntegerLiteral(node);
+    T? result = _baseVisitor.visitIntegerLiteral(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitInterpolationExpression(InterpolationExpression node) {
+  T? visitInterpolationExpression(InterpolationExpression node) {
     stopwatch.start();
-    T result = _baseVisitor.visitInterpolationExpression(node);
+    T? result = _baseVisitor.visitInterpolationExpression(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitInterpolationString(InterpolationString node) {
+  T? visitInterpolationString(InterpolationString node) {
     stopwatch.start();
-    T result = _baseVisitor.visitInterpolationString(node);
+    T? result = _baseVisitor.visitInterpolationString(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitIsExpression(IsExpression node) {
+  T? visitIsExpression(IsExpression node) {
     stopwatch.start();
-    T result = _baseVisitor.visitIsExpression(node);
+    T? result = _baseVisitor.visitIsExpression(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitLabel(Label node) {
+  T? visitLabel(Label node) {
     stopwatch.start();
-    T result = _baseVisitor.visitLabel(node);
+    T? result = _baseVisitor.visitLabel(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitLabeledStatement(LabeledStatement node) {
+  T? visitLabeledStatement(LabeledStatement node) {
     stopwatch.start();
-    T result = _baseVisitor.visitLabeledStatement(node);
+    T? result = _baseVisitor.visitLabeledStatement(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitLibraryDirective(LibraryDirective node) {
+  T? visitLibraryDirective(LibraryDirective node) {
     stopwatch.start();
-    T result = _baseVisitor.visitLibraryDirective(node);
+    T? result = _baseVisitor.visitLibraryDirective(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitLibraryIdentifier(LibraryIdentifier node) {
+  T? visitLibraryIdentifier(LibraryIdentifier node) {
     stopwatch.start();
-    T result = _baseVisitor.visitLibraryIdentifier(node);
+    T? result = _baseVisitor.visitLibraryIdentifier(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitListLiteral(ListLiteral node) {
+  T? visitListLiteral(ListLiteral node) {
     stopwatch.start();
-    T result = _baseVisitor.visitListLiteral(node);
+    T? result = _baseVisitor.visitListLiteral(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitMapLiteralEntry(MapLiteralEntry node) {
+  T? visitMapLiteralEntry(MapLiteralEntry node) {
     stopwatch.start();
-    T result = _baseVisitor.visitMapLiteralEntry(node);
+    T? result = _baseVisitor.visitMapLiteralEntry(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitMethodDeclaration(MethodDeclaration node) {
+  T? visitMethodDeclaration(MethodDeclaration node) {
     stopwatch.start();
-    T result = _baseVisitor.visitMethodDeclaration(node);
+    T? result = _baseVisitor.visitMethodDeclaration(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitMethodInvocation(MethodInvocation node) {
+  T? visitMethodInvocation(MethodInvocation node) {
     stopwatch.start();
-    T result = _baseVisitor.visitMethodInvocation(node);
+    T? result = _baseVisitor.visitMethodInvocation(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitMixinDeclaration(MixinDeclaration node) {
+  T? visitMixinDeclaration(MixinDeclaration node) {
     stopwatch.start();
-    T result = _baseVisitor.visitMixinDeclaration(node);
+    T? result = _baseVisitor.visitMixinDeclaration(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitNamedExpression(NamedExpression node) {
+  T? visitNamedExpression(NamedExpression node) {
     stopwatch.start();
-    T result = _baseVisitor.visitNamedExpression(node);
+    T? result = _baseVisitor.visitNamedExpression(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitNativeClause(NativeClause node) {
+  T? visitNativeClause(NativeClause node) {
     stopwatch.start();
-    T result = _baseVisitor.visitNativeClause(node);
+    T? result = _baseVisitor.visitNativeClause(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitNativeFunctionBody(NativeFunctionBody node) {
+  T? visitNativeFunctionBody(NativeFunctionBody node) {
     stopwatch.start();
-    T result = _baseVisitor.visitNativeFunctionBody(node);
+    T? result = _baseVisitor.visitNativeFunctionBody(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitNullLiteral(NullLiteral node) {
+  T? visitNullLiteral(NullLiteral node) {
     stopwatch.start();
-    T result = _baseVisitor.visitNullLiteral(node);
+    T? result = _baseVisitor.visitNullLiteral(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitOnClause(OnClause node) {
+  T? visitOnClause(OnClause node) {
     stopwatch.start();
-    T result = _baseVisitor.visitOnClause(node);
+    T? result = _baseVisitor.visitOnClause(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitParenthesizedExpression(ParenthesizedExpression node) {
+  T? visitParenthesizedExpression(ParenthesizedExpression node) {
     stopwatch.start();
-    T result = _baseVisitor.visitParenthesizedExpression(node);
+    T? result = _baseVisitor.visitParenthesizedExpression(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitPartDirective(PartDirective node) {
+  T? visitPartDirective(PartDirective node) {
     stopwatch.start();
-    T result = _baseVisitor.visitPartDirective(node);
+    T? result = _baseVisitor.visitPartDirective(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitPartOfDirective(PartOfDirective node) {
+  T? visitPartOfDirective(PartOfDirective node) {
     stopwatch.start();
-    T result = _baseVisitor.visitPartOfDirective(node);
+    T? result = _baseVisitor.visitPartOfDirective(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitPostfixExpression(PostfixExpression node) {
+  T? visitPostfixExpression(PostfixExpression node) {
     stopwatch.start();
-    T result = _baseVisitor.visitPostfixExpression(node);
+    T? result = _baseVisitor.visitPostfixExpression(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitPrefixedIdentifier(PrefixedIdentifier node) {
+  T? visitPrefixedIdentifier(PrefixedIdentifier node) {
     stopwatch.start();
-    T result = _baseVisitor.visitPrefixedIdentifier(node);
+    T? result = _baseVisitor.visitPrefixedIdentifier(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitPrefixExpression(PrefixExpression node) {
+  T? visitPrefixExpression(PrefixExpression node) {
     stopwatch.start();
-    T result = _baseVisitor.visitPrefixExpression(node);
+    T? result = _baseVisitor.visitPrefixExpression(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitPropertyAccess(PropertyAccess node) {
+  T? visitPropertyAccess(PropertyAccess node) {
     stopwatch.start();
-    T result = _baseVisitor.visitPropertyAccess(node);
+    T? result = _baseVisitor.visitPropertyAccess(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitRedirectingConstructorInvocation(
+  T? visitRedirectingConstructorInvocation(
       RedirectingConstructorInvocation node) {
     stopwatch.start();
-    T result = _baseVisitor.visitRedirectingConstructorInvocation(node);
+    T? result = _baseVisitor.visitRedirectingConstructorInvocation(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitRethrowExpression(RethrowExpression node) {
+  T? visitRethrowExpression(RethrowExpression node) {
     stopwatch.start();
-    T result = _baseVisitor.visitRethrowExpression(node);
+    T? result = _baseVisitor.visitRethrowExpression(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitReturnStatement(ReturnStatement node) {
+  T? visitReturnStatement(ReturnStatement node) {
     stopwatch.start();
-    T result = _baseVisitor.visitReturnStatement(node);
+    T? result = _baseVisitor.visitReturnStatement(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitScriptTag(ScriptTag node) {
+  T? visitScriptTag(ScriptTag node) {
     stopwatch.start();
-    T result = _baseVisitor.visitScriptTag(node);
+    T? result = _baseVisitor.visitScriptTag(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitSetOrMapLiteral(SetOrMapLiteral node) {
+  T? visitSetOrMapLiteral(SetOrMapLiteral node) {
     stopwatch.start();
-    T result = _baseVisitor.visitSetOrMapLiteral(node);
+    T? result = _baseVisitor.visitSetOrMapLiteral(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitShowCombinator(ShowCombinator node) {
+  T? visitShowCombinator(ShowCombinator node) {
     stopwatch.start();
-    T result = _baseVisitor.visitShowCombinator(node);
+    T? result = _baseVisitor.visitShowCombinator(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitSimpleFormalParameter(SimpleFormalParameter node) {
+  T? visitSimpleFormalParameter(SimpleFormalParameter node) {
     stopwatch.start();
-    T result = _baseVisitor.visitSimpleFormalParameter(node);
+    T? result = _baseVisitor.visitSimpleFormalParameter(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitSimpleIdentifier(SimpleIdentifier node) {
+  T? visitSimpleIdentifier(SimpleIdentifier node) {
     stopwatch.start();
-    T result = _baseVisitor.visitSimpleIdentifier(node);
+    T? result = _baseVisitor.visitSimpleIdentifier(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitSimpleStringLiteral(SimpleStringLiteral node) {
+  T? visitSimpleStringLiteral(SimpleStringLiteral node) {
     stopwatch.start();
-    T result = _baseVisitor.visitSimpleStringLiteral(node);
+    T? result = _baseVisitor.visitSimpleStringLiteral(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitSpreadElement(SpreadElement node) {
+  T? visitSpreadElement(SpreadElement node) {
     stopwatch.start();
-    T result = _baseVisitor.visitSpreadElement(node);
+    T? result = _baseVisitor.visitSpreadElement(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitStringInterpolation(StringInterpolation node) {
+  T? visitStringInterpolation(StringInterpolation node) {
     stopwatch.start();
-    T result = _baseVisitor.visitStringInterpolation(node);
+    T? result = _baseVisitor.visitStringInterpolation(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+  T? visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     stopwatch.start();
-    T result = _baseVisitor.visitSuperConstructorInvocation(node);
+    T? result = _baseVisitor.visitSuperConstructorInvocation(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitSuperExpression(SuperExpression node) {
+  T? visitSuperExpression(SuperExpression node) {
     stopwatch.start();
-    T result = _baseVisitor.visitSuperExpression(node);
+    T? result = _baseVisitor.visitSuperExpression(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitSwitchCase(SwitchCase node) {
+  T? visitSwitchCase(SwitchCase node) {
     stopwatch.start();
-    T result = _baseVisitor.visitSwitchCase(node);
+    T? result = _baseVisitor.visitSwitchCase(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitSwitchDefault(SwitchDefault node) {
+  T? visitSwitchDefault(SwitchDefault node) {
     stopwatch.start();
-    T result = _baseVisitor.visitSwitchDefault(node);
+    T? result = _baseVisitor.visitSwitchDefault(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitSwitchStatement(SwitchStatement node) {
+  T? visitSwitchStatement(SwitchStatement node) {
     stopwatch.start();
-    T result = _baseVisitor.visitSwitchStatement(node);
+    T? result = _baseVisitor.visitSwitchStatement(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitSymbolLiteral(SymbolLiteral node) {
+  T? visitSymbolLiteral(SymbolLiteral node) {
     stopwatch.start();
-    T result = _baseVisitor.visitSymbolLiteral(node);
+    T? result = _baseVisitor.visitSymbolLiteral(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitThisExpression(ThisExpression node) {
+  T? visitThisExpression(ThisExpression node) {
     stopwatch.start();
-    T result = _baseVisitor.visitThisExpression(node);
+    T? result = _baseVisitor.visitThisExpression(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitThrowExpression(ThrowExpression node) {
+  T? visitThrowExpression(ThrowExpression node) {
     stopwatch.start();
-    T result = _baseVisitor.visitThrowExpression(node);
+    T? result = _baseVisitor.visitThrowExpression(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+  T? visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
     stopwatch.start();
-    T result = _baseVisitor.visitTopLevelVariableDeclaration(node);
+    T? result = _baseVisitor.visitTopLevelVariableDeclaration(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitTryStatement(TryStatement node) {
+  T? visitTryStatement(TryStatement node) {
     stopwatch.start();
-    T result = _baseVisitor.visitTryStatement(node);
+    T? result = _baseVisitor.visitTryStatement(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitTypeArgumentList(TypeArgumentList node) {
+  T? visitTypeArgumentList(TypeArgumentList node) {
     stopwatch.start();
-    T result = _baseVisitor.visitTypeArgumentList(node);
+    T? result = _baseVisitor.visitTypeArgumentList(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitTypeName(TypeName node) {
+  T? visitTypeName(TypeName node) {
     stopwatch.start();
-    T result = _baseVisitor.visitTypeName(node);
+    T? result = _baseVisitor.visitTypeName(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitTypeParameter(TypeParameter node) {
+  T? visitTypeParameter(TypeParameter node) {
     stopwatch.start();
-    T result = _baseVisitor.visitTypeParameter(node);
+    T? result = _baseVisitor.visitTypeParameter(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitTypeParameterList(TypeParameterList node) {
+  T? visitTypeParameterList(TypeParameterList node) {
     stopwatch.start();
-    T result = _baseVisitor.visitTypeParameterList(node);
+    T? result = _baseVisitor.visitTypeParameterList(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitVariableDeclaration(VariableDeclaration node) {
+  T? visitVariableDeclaration(VariableDeclaration node) {
     stopwatch.start();
-    T result = _baseVisitor.visitVariableDeclaration(node);
+    T? result = _baseVisitor.visitVariableDeclaration(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitVariableDeclarationList(VariableDeclarationList node) {
+  T? visitVariableDeclarationList(VariableDeclarationList node) {
     stopwatch.start();
-    T result = _baseVisitor.visitVariableDeclarationList(node);
+    T? result = _baseVisitor.visitVariableDeclarationList(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitVariableDeclarationStatement(VariableDeclarationStatement node) {
+  T? visitVariableDeclarationStatement(VariableDeclarationStatement node) {
     stopwatch.start();
-    T result = _baseVisitor.visitVariableDeclarationStatement(node);
+    T? result = _baseVisitor.visitVariableDeclarationStatement(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitWhileStatement(WhileStatement node) {
+  T? visitWhileStatement(WhileStatement node) {
     stopwatch.start();
-    T result = _baseVisitor.visitWhileStatement(node);
+    T? result = _baseVisitor.visitWhileStatement(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitWithClause(WithClause node) {
+  T? visitWithClause(WithClause node) {
     stopwatch.start();
-    T result = _baseVisitor.visitWithClause(node);
+    T? result = _baseVisitor.visitWithClause(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitYieldStatement(YieldStatement node) {
+  T? visitYieldStatement(YieldStatement node) {
     stopwatch.start();
-    T result = _baseVisitor.visitYieldStatement(node);
+    T? result = _baseVisitor.visitYieldStatement(node);
     stopwatch.stop();
     return result;
   }
@@ -3113,389 +3117,393 @@
   const UnifyingAstVisitor();
 
   @override
-  R visitAdjacentStrings(AdjacentStrings node) => visitNode(node);
+  R? visitAdjacentStrings(AdjacentStrings node) => visitNode(node);
 
   @override
-  R visitAnnotation(Annotation node) => visitNode(node);
+  R? visitAnnotation(Annotation node) => visitNode(node);
 
   @override
-  R visitArgumentList(ArgumentList node) => visitNode(node);
+  R? visitArgumentList(ArgumentList node) => visitNode(node);
 
   @override
-  R visitAsExpression(AsExpression node) => visitNode(node);
+  R? visitAsExpression(AsExpression node) => visitNode(node);
 
   @override
-  R visitAssertInitializer(AssertInitializer node) => visitNode(node);
+  R? visitAssertInitializer(AssertInitializer node) => visitNode(node);
 
   @override
-  R visitAssertStatement(AssertStatement node) => visitNode(node);
+  R? visitAssertStatement(AssertStatement node) => visitNode(node);
 
   @override
-  R visitAssignmentExpression(AssignmentExpression node) => visitNode(node);
+  R? visitAssignmentExpression(AssignmentExpression node) => visitNode(node);
 
   @override
-  R visitAwaitExpression(AwaitExpression node) => visitNode(node);
+  R? visitAwaitExpression(AwaitExpression node) => visitNode(node);
 
   @override
-  R visitBinaryExpression(BinaryExpression node) => visitNode(node);
+  R? visitBinaryExpression(BinaryExpression node) => visitNode(node);
 
   @override
-  R visitBlock(Block node) => visitNode(node);
+  R? visitBlock(Block node) => visitNode(node);
 
   @override
-  R visitBlockFunctionBody(BlockFunctionBody node) => visitNode(node);
+  R? visitBlockFunctionBody(BlockFunctionBody node) => visitNode(node);
 
   @override
-  R visitBooleanLiteral(BooleanLiteral node) => visitNode(node);
+  R? visitBooleanLiteral(BooleanLiteral node) => visitNode(node);
 
   @override
-  R visitBreakStatement(BreakStatement node) => visitNode(node);
+  R? visitBreakStatement(BreakStatement node) => visitNode(node);
 
   @override
-  R visitCascadeExpression(CascadeExpression node) => visitNode(node);
+  R? visitCascadeExpression(CascadeExpression node) => visitNode(node);
 
   @override
-  R visitCatchClause(CatchClause node) => visitNode(node);
+  R? visitCatchClause(CatchClause node) => visitNode(node);
 
   @override
-  R visitClassDeclaration(ClassDeclaration node) => visitNode(node);
+  R? visitClassDeclaration(ClassDeclaration node) => visitNode(node);
 
   @override
-  R visitClassTypeAlias(ClassTypeAlias node) => visitNode(node);
+  R? visitClassTypeAlias(ClassTypeAlias node) => visitNode(node);
 
   @override
-  R visitComment(Comment node) => visitNode(node);
+  R? visitComment(Comment node) => visitNode(node);
 
   @override
-  R visitCommentReference(CommentReference node) => visitNode(node);
+  R? visitCommentReference(CommentReference node) => visitNode(node);
 
   @override
-  R visitCompilationUnit(CompilationUnit node) => visitNode(node);
+  R? visitCompilationUnit(CompilationUnit node) => visitNode(node);
 
   @override
-  R visitConditionalExpression(ConditionalExpression node) => visitNode(node);
+  R? visitConditionalExpression(ConditionalExpression node) => visitNode(node);
 
   @override
-  R visitConfiguration(Configuration node) => visitNode(node);
+  R? visitConfiguration(Configuration node) => visitNode(node);
 
   @override
-  R visitConstructorDeclaration(ConstructorDeclaration node) => visitNode(node);
-
-  @override
-  R visitConstructorFieldInitializer(ConstructorFieldInitializer node) =>
+  R? visitConstructorDeclaration(ConstructorDeclaration node) =>
       visitNode(node);
 
   @override
-  R visitConstructorName(ConstructorName node) => visitNode(node);
-
-  @override
-  R visitContinueStatement(ContinueStatement node) => visitNode(node);
-
-  @override
-  R visitDeclaredIdentifier(DeclaredIdentifier node) => visitNode(node);
-
-  @override
-  R visitDefaultFormalParameter(DefaultFormalParameter node) => visitNode(node);
-
-  @override
-  R visitDoStatement(DoStatement node) => visitNode(node);
-
-  @override
-  R visitDottedName(DottedName node) => visitNode(node);
-
-  @override
-  R visitDoubleLiteral(DoubleLiteral node) => visitNode(node);
-
-  @override
-  R visitEmptyFunctionBody(EmptyFunctionBody node) => visitNode(node);
-
-  @override
-  R visitEmptyStatement(EmptyStatement node) => visitNode(node);
-
-  @override
-  R visitEnumConstantDeclaration(EnumConstantDeclaration node) =>
+  R? visitConstructorFieldInitializer(ConstructorFieldInitializer node) =>
       visitNode(node);
 
   @override
-  R visitEnumDeclaration(EnumDeclaration node) => visitNode(node);
+  R? visitConstructorName(ConstructorName node) => visitNode(node);
 
   @override
-  R visitExportDirective(ExportDirective node) => visitNode(node);
+  R? visitContinueStatement(ContinueStatement node) => visitNode(node);
 
   @override
-  R visitExpressionFunctionBody(ExpressionFunctionBody node) => visitNode(node);
+  R? visitDeclaredIdentifier(DeclaredIdentifier node) => visitNode(node);
 
   @override
-  R visitExpressionStatement(ExpressionStatement node) => visitNode(node);
-
-  @override
-  R visitExtendsClause(ExtendsClause node) => visitNode(node);
-
-  @override
-  R visitExtensionDeclaration(ExtensionDeclaration node) => visitNode(node);
-
-  @override
-  R visitExtensionOverride(ExtensionOverride node) => visitNode(node);
-
-  @override
-  R visitFieldDeclaration(FieldDeclaration node) => visitNode(node);
-
-  @override
-  R visitFieldFormalParameter(FieldFormalParameter node) => visitNode(node);
-
-  @override
-  R visitForEachPartsWithDeclaration(ForEachPartsWithDeclaration node) =>
+  R? visitDefaultFormalParameter(DefaultFormalParameter node) =>
       visitNode(node);
 
   @override
-  R visitForEachPartsWithIdentifier(ForEachPartsWithIdentifier node) =>
+  R? visitDoStatement(DoStatement node) => visitNode(node);
+
+  @override
+  R? visitDottedName(DottedName node) => visitNode(node);
+
+  @override
+  R? visitDoubleLiteral(DoubleLiteral node) => visitNode(node);
+
+  @override
+  R? visitEmptyFunctionBody(EmptyFunctionBody node) => visitNode(node);
+
+  @override
+  R? visitEmptyStatement(EmptyStatement node) => visitNode(node);
+
+  @override
+  R? visitEnumConstantDeclaration(EnumConstantDeclaration node) =>
       visitNode(node);
 
   @override
-  R visitForElement(ForElement node) => visitNode(node);
+  R? visitEnumDeclaration(EnumDeclaration node) => visitNode(node);
 
   @override
-  R visitFormalParameterList(FormalParameterList node) => visitNode(node);
+  R? visitExportDirective(ExportDirective node) => visitNode(node);
 
   @override
-  R visitForPartsWithDeclarations(ForPartsWithDeclarations node) =>
+  R? visitExpressionFunctionBody(ExpressionFunctionBody node) =>
       visitNode(node);
 
   @override
-  R visitForPartsWithExpression(ForPartsWithExpression node) => visitNode(node);
+  R? visitExpressionStatement(ExpressionStatement node) => visitNode(node);
 
   @override
-  R visitForStatement(ForStatement node) => visitNode(node);
+  R? visitExtendsClause(ExtendsClause node) => visitNode(node);
 
   @override
-  R visitFunctionDeclaration(FunctionDeclaration node) => visitNode(node);
+  R? visitExtensionDeclaration(ExtensionDeclaration node) => visitNode(node);
 
   @override
-  R visitFunctionDeclarationStatement(FunctionDeclarationStatement node) =>
+  R? visitExtensionOverride(ExtensionOverride node) => visitNode(node);
+
+  @override
+  R? visitFieldDeclaration(FieldDeclaration node) => visitNode(node);
+
+  @override
+  R? visitFieldFormalParameter(FieldFormalParameter node) => visitNode(node);
+
+  @override
+  R? visitForEachPartsWithDeclaration(ForEachPartsWithDeclaration node) =>
       visitNode(node);
 
   @override
-  R visitFunctionExpression(FunctionExpression node) => visitNode(node);
-
-  @override
-  R visitFunctionExpressionInvocation(FunctionExpressionInvocation node) =>
+  R? visitForEachPartsWithIdentifier(ForEachPartsWithIdentifier node) =>
       visitNode(node);
 
   @override
-  R visitFunctionTypeAlias(FunctionTypeAlias node) => visitNode(node);
+  R? visitForElement(ForElement node) => visitNode(node);
 
   @override
-  R visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) =>
+  R? visitFormalParameterList(FormalParameterList node) => visitNode(node);
+
+  @override
+  R? visitForPartsWithDeclarations(ForPartsWithDeclarations node) =>
       visitNode(node);
 
   @override
-  R visitGenericFunctionType(GenericFunctionType node) => visitNode(node);
-
-  @override
-  R visitGenericTypeAlias(GenericTypeAlias node) => visitNode(node);
-
-  @override
-  R visitHideCombinator(HideCombinator node) => visitNode(node);
-
-  @override
-  R visitIfElement(IfElement node) => visitNode(node);
-
-  @override
-  R visitIfStatement(IfStatement node) => visitNode(node);
-
-  @override
-  R visitImplementsClause(ImplementsClause node) => visitNode(node);
-
-  @override
-  R visitImportDirective(ImportDirective node) => visitNode(node);
-
-  @override
-  R visitIndexExpression(IndexExpression node) => visitNode(node);
-
-  @override
-  R visitInstanceCreationExpression(InstanceCreationExpression node) =>
+  R? visitForPartsWithExpression(ForPartsWithExpression node) =>
       visitNode(node);
 
   @override
-  R visitIntegerLiteral(IntegerLiteral node) => visitNode(node);
+  R? visitForStatement(ForStatement node) => visitNode(node);
 
   @override
-  R visitInterpolationExpression(InterpolationExpression node) =>
+  R? visitFunctionDeclaration(FunctionDeclaration node) => visitNode(node);
+
+  @override
+  R? visitFunctionDeclarationStatement(FunctionDeclarationStatement node) =>
       visitNode(node);
 
   @override
-  R visitInterpolationString(InterpolationString node) => visitNode(node);
+  R? visitFunctionExpression(FunctionExpression node) => visitNode(node);
 
   @override
-  R visitIsExpression(IsExpression node) => visitNode(node);
+  R? visitFunctionExpressionInvocation(FunctionExpressionInvocation node) =>
+      visitNode(node);
 
   @override
-  R visitLabel(Label node) => visitNode(node);
+  R? visitFunctionTypeAlias(FunctionTypeAlias node) => visitNode(node);
 
   @override
-  R visitLabeledStatement(LabeledStatement node) => visitNode(node);
+  R? visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) =>
+      visitNode(node);
 
   @override
-  R visitLibraryDirective(LibraryDirective node) => visitNode(node);
+  R? visitGenericFunctionType(GenericFunctionType node) => visitNode(node);
 
   @override
-  R visitLibraryIdentifier(LibraryIdentifier node) => visitNode(node);
+  R? visitGenericTypeAlias(GenericTypeAlias node) => visitNode(node);
 
   @override
-  R visitListLiteral(ListLiteral node) => visitNode(node);
+  R? visitHideCombinator(HideCombinator node) => visitNode(node);
 
   @override
-  R visitMapLiteralEntry(MapLiteralEntry node) => visitNode(node);
+  R? visitIfElement(IfElement node) => visitNode(node);
 
   @override
-  R visitMethodDeclaration(MethodDeclaration node) => visitNode(node);
+  R? visitIfStatement(IfStatement node) => visitNode(node);
 
   @override
-  R visitMethodInvocation(MethodInvocation node) => visitNode(node);
+  R? visitImplementsClause(ImplementsClause node) => visitNode(node);
 
   @override
-  R visitMixinDeclaration(MixinDeclaration node) => visitNode(node);
+  R? visitImportDirective(ImportDirective node) => visitNode(node);
 
   @override
-  R visitNamedExpression(NamedExpression node) => visitNode(node);
+  R? visitIndexExpression(IndexExpression node) => visitNode(node);
 
   @override
-  R visitNativeClause(NativeClause node) => visitNode(node);
+  R? visitInstanceCreationExpression(InstanceCreationExpression node) =>
+      visitNode(node);
 
   @override
-  R visitNativeFunctionBody(NativeFunctionBody node) => visitNode(node);
+  R? visitIntegerLiteral(IntegerLiteral node) => visitNode(node);
 
-  R visitNode(AstNode node) {
+  @override
+  R? visitInterpolationExpression(InterpolationExpression node) =>
+      visitNode(node);
+
+  @override
+  R? visitInterpolationString(InterpolationString node) => visitNode(node);
+
+  @override
+  R? visitIsExpression(IsExpression node) => visitNode(node);
+
+  @override
+  R? visitLabel(Label node) => visitNode(node);
+
+  @override
+  R? visitLabeledStatement(LabeledStatement node) => visitNode(node);
+
+  @override
+  R? visitLibraryDirective(LibraryDirective node) => visitNode(node);
+
+  @override
+  R? visitLibraryIdentifier(LibraryIdentifier node) => visitNode(node);
+
+  @override
+  R? visitListLiteral(ListLiteral node) => visitNode(node);
+
+  @override
+  R? visitMapLiteralEntry(MapLiteralEntry node) => visitNode(node);
+
+  @override
+  R? visitMethodDeclaration(MethodDeclaration node) => visitNode(node);
+
+  @override
+  R? visitMethodInvocation(MethodInvocation node) => visitNode(node);
+
+  @override
+  R? visitMixinDeclaration(MixinDeclaration node) => visitNode(node);
+
+  @override
+  R? visitNamedExpression(NamedExpression node) => visitNode(node);
+
+  @override
+  R? visitNativeClause(NativeClause node) => visitNode(node);
+
+  @override
+  R? visitNativeFunctionBody(NativeFunctionBody node) => visitNode(node);
+
+  R? visitNode(AstNode node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitNullLiteral(NullLiteral node) => visitNode(node);
+  R? visitNullLiteral(NullLiteral node) => visitNode(node);
 
   @override
-  R visitOnClause(OnClause node) => visitNode(node);
+  R? visitOnClause(OnClause node) => visitNode(node);
 
   @override
-  R visitParenthesizedExpression(ParenthesizedExpression node) =>
+  R? visitParenthesizedExpression(ParenthesizedExpression node) =>
       visitNode(node);
 
   @override
-  R visitPartDirective(PartDirective node) => visitNode(node);
+  R? visitPartDirective(PartDirective node) => visitNode(node);
 
   @override
-  R visitPartOfDirective(PartOfDirective node) => visitNode(node);
+  R? visitPartOfDirective(PartOfDirective node) => visitNode(node);
 
   @override
-  R visitPostfixExpression(PostfixExpression node) => visitNode(node);
+  R? visitPostfixExpression(PostfixExpression node) => visitNode(node);
 
   @override
-  R visitPrefixedIdentifier(PrefixedIdentifier node) => visitNode(node);
+  R? visitPrefixedIdentifier(PrefixedIdentifier node) => visitNode(node);
 
   @override
-  R visitPrefixExpression(PrefixExpression node) => visitNode(node);
+  R? visitPrefixExpression(PrefixExpression node) => visitNode(node);
 
   @override
-  R visitPropertyAccess(PropertyAccess node) => visitNode(node);
+  R? visitPropertyAccess(PropertyAccess node) => visitNode(node);
 
   @override
-  R visitRedirectingConstructorInvocation(
+  R? visitRedirectingConstructorInvocation(
           RedirectingConstructorInvocation node) =>
       visitNode(node);
 
   @override
-  R visitRethrowExpression(RethrowExpression node) => visitNode(node);
+  R? visitRethrowExpression(RethrowExpression node) => visitNode(node);
 
   @override
-  R visitReturnStatement(ReturnStatement node) => visitNode(node);
+  R? visitReturnStatement(ReturnStatement node) => visitNode(node);
 
   @override
-  R visitScriptTag(ScriptTag scriptTag) => visitNode(scriptTag);
+  R? visitScriptTag(ScriptTag scriptTag) => visitNode(scriptTag);
 
   @override
-  R visitSetOrMapLiteral(SetOrMapLiteral node) => visitNode(node);
+  R? visitSetOrMapLiteral(SetOrMapLiteral node) => visitNode(node);
 
   @override
-  R visitShowCombinator(ShowCombinator node) => visitNode(node);
+  R? visitShowCombinator(ShowCombinator node) => visitNode(node);
 
   @override
-  R visitSimpleFormalParameter(SimpleFormalParameter node) => visitNode(node);
+  R? visitSimpleFormalParameter(SimpleFormalParameter node) => visitNode(node);
 
   @override
-  R visitSimpleIdentifier(SimpleIdentifier node) => visitNode(node);
+  R? visitSimpleIdentifier(SimpleIdentifier node) => visitNode(node);
 
   @override
-  R visitSimpleStringLiteral(SimpleStringLiteral node) => visitNode(node);
+  R? visitSimpleStringLiteral(SimpleStringLiteral node) => visitNode(node);
 
   @override
-  R visitSpreadElement(SpreadElement node) => visitNode(node);
+  R? visitSpreadElement(SpreadElement node) => visitNode(node);
 
   @override
-  R visitStringInterpolation(StringInterpolation node) => visitNode(node);
+  R? visitStringInterpolation(StringInterpolation node) => visitNode(node);
 
   @override
-  R visitSuperConstructorInvocation(SuperConstructorInvocation node) =>
+  R? visitSuperConstructorInvocation(SuperConstructorInvocation node) =>
       visitNode(node);
 
   @override
-  R visitSuperExpression(SuperExpression node) => visitNode(node);
+  R? visitSuperExpression(SuperExpression node) => visitNode(node);
 
   @override
-  R visitSwitchCase(SwitchCase node) => visitNode(node);
+  R? visitSwitchCase(SwitchCase node) => visitNode(node);
 
   @override
-  R visitSwitchDefault(SwitchDefault node) => visitNode(node);
+  R? visitSwitchDefault(SwitchDefault node) => visitNode(node);
 
   @override
-  R visitSwitchStatement(SwitchStatement node) => visitNode(node);
+  R? visitSwitchStatement(SwitchStatement node) => visitNode(node);
 
   @override
-  R visitSymbolLiteral(SymbolLiteral node) => visitNode(node);
+  R? visitSymbolLiteral(SymbolLiteral node) => visitNode(node);
 
   @override
-  R visitThisExpression(ThisExpression node) => visitNode(node);
+  R? visitThisExpression(ThisExpression node) => visitNode(node);
 
   @override
-  R visitThrowExpression(ThrowExpression node) => visitNode(node);
+  R? visitThrowExpression(ThrowExpression node) => visitNode(node);
 
   @override
-  R visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) =>
+  R? visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) =>
       visitNode(node);
 
   @override
-  R visitTryStatement(TryStatement node) => visitNode(node);
+  R? visitTryStatement(TryStatement node) => visitNode(node);
 
   @override
-  R visitTypeArgumentList(TypeArgumentList node) => visitNode(node);
+  R? visitTypeArgumentList(TypeArgumentList node) => visitNode(node);
 
   @override
-  R visitTypeName(TypeName node) => visitNode(node);
+  R? visitTypeName(TypeName node) => visitNode(node);
 
   @override
-  R visitTypeParameter(TypeParameter node) => visitNode(node);
+  R? visitTypeParameter(TypeParameter node) => visitNode(node);
 
   @override
-  R visitTypeParameterList(TypeParameterList node) => visitNode(node);
+  R? visitTypeParameterList(TypeParameterList node) => visitNode(node);
 
   @override
-  R visitVariableDeclaration(VariableDeclaration node) => visitNode(node);
+  R? visitVariableDeclaration(VariableDeclaration node) => visitNode(node);
 
   @override
-  R visitVariableDeclarationList(VariableDeclarationList node) =>
+  R? visitVariableDeclarationList(VariableDeclarationList node) =>
       visitNode(node);
 
   @override
-  R visitVariableDeclarationStatement(VariableDeclarationStatement node) =>
+  R? visitVariableDeclarationStatement(VariableDeclarationStatement node) =>
       visitNode(node);
 
   @override
-  R visitWhileStatement(WhileStatement node) => visitNode(node);
+  R? visitWhileStatement(WhileStatement node) => visitNode(node);
 
   @override
-  R visitWithClause(WithClause node) => visitNode(node);
+  R? visitWithClause(WithClause node) => visitNode(node);
 
   @override
-  R visitYieldStatement(YieldStatement node) => visitNode(node);
+  R? visitYieldStatement(YieldStatement node) => visitNode(node);
 }
 
 /// A helper class used to implement the correct order of visits for a
diff --git a/pkg/analyzer/lib/dart/constant/value.dart b/pkg/analyzer/lib/dart/constant/value.dart
index f8c15ec..def4a14 100644
--- a/pkg/analyzer/lib/dart/constant/value.dart
+++ b/pkg/analyzer/lib/dart/constant/value.dart
@@ -62,7 +62,7 @@
   ///
   /// This method can return a representation of the type, even if this object
   /// would return `false` from [hasKnownValue].
-  ParameterizedType get type;
+  ParameterizedType? get type;
 
   /// Return a representation of the value of the field with the given [name].
   ///
@@ -72,14 +72,14 @@
   ///
   /// Note that, unlike the mirrors API, this method does *not* invoke a getter;
   /// it simply returns a representation of the known state of a field.
-  DartObject getField(String name);
+  DartObject? getField(String name);
 
   /// Return a boolean corresponding to the value of the object being
   /// represented, or `null` if
   /// * this object is not of type 'bool',
   /// * the value of the object being represented is not known, or
   /// * the value of the object being represented is `null`.
-  bool toBoolValue();
+  bool? toBoolValue();
 
   /// Return a double corresponding to the value of the object being represented,
   /// or `null`
@@ -87,7 +87,7 @@
   /// * this object is not of type 'double',
   /// * the value of the object being represented is not known, or
   /// * the value of the object being represented is `null`.
-  double toDoubleValue();
+  double? toDoubleValue();
 
   /// Return an element corresponding to the value of the object being
   /// represented, or `null`
@@ -95,50 +95,50 @@
   /// * this object is not of a function type,
   /// * the value of the object being represented is not known, or
   /// * the value of the object being represented is `null`.
-  ExecutableElement toFunctionValue();
+  ExecutableElement? toFunctionValue();
 
   /// Return an integer corresponding to the value of the object being
   /// represented, or `null` if
   /// * this object is not of type 'int',
   /// * the value of the object being represented is not known, or
   /// * the value of the object being represented is `null`.
-  int toIntValue();
+  int? toIntValue();
 
   /// Return a list corresponding to the value of the object being represented,
   /// or `null` if
   /// * this object is not of type 'List', or
   /// * the value of the object being represented is `null`.
-  List<DartObject> toListValue();
+  List<DartObject>? toListValue();
 
   /// Return a map corresponding to the value of the object being represented, or
   /// `null` if
   /// * this object is not of type 'Map', or
   /// * the value of the object being represented is `null`.
-  Map<DartObject, DartObject> toMapValue();
+  Map<DartObject?, DartObject?>? toMapValue();
 
   /// Return a set corresponding to the value of the object being represented,
   /// or `null` if
   /// * this object is not of type 'Set', or
   /// * the value of the object being represented is `null`.
-  Set<DartObject> toSetValue();
+  Set<DartObject>? toSetValue();
 
   /// Return a string corresponding to the value of the object being represented,
   /// or `null` if
   /// * this object is not of type 'String',
   /// * the value of the object being represented is not known, or
   /// * the value of the object being represented is `null`.
-  String toStringValue();
+  String? toStringValue();
 
   /// Return a string corresponding to the value of the object being represented,
   /// or `null` if
   /// * this object is not of type 'Symbol', or
   /// * the value of the object being represented is `null`.
   /// (We return the string
-  String toSymbolValue();
+  String? toSymbolValue();
 
   /// Return the representation of the type corresponding to the value of the
   /// object being represented, or `null` if
   /// * this object is not of type 'Type', or
   /// * the value of the object being represented is `null`.
-  DartType toTypeValue();
+  DartType? toTypeValue();
 }
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index 5f38ebb..db530ff 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -74,6 +74,12 @@
   /// class, as is the case when this element represents an enum or a mixin.
   List<ConstructorElement> get constructors;
 
+  @override
+  String get displayName;
+
+  @override
+  CompilationUnitElement get enclosingElement;
+
   /// Return a list containing all of the fields declared in this class.
   List<FieldElement> get fields;
 
@@ -140,6 +146,9 @@
   /// guard against infinite loops.
   List<InterfaceType> get mixins;
 
+  @override
+  String get name;
+
   /// Return a list containing all of the superclass constraints defined for
   /// this class. The list will be empty if this class does not represent a
   /// mixin declaration. If this class _does_ represent a mixin declaration but
@@ -164,7 +173,7 @@
   /// safe to assume that the inheritance structure of a class does not contain
   /// a cycle. Clients that traverse the inheritance structure must explicitly
   /// guard against infinite loops.
-  InterfaceType get supertype;
+  InterfaceType? get supertype;
 
   /// Return the type of `this` expression for this class.
   ///
@@ -181,38 +190,38 @@
   /// constructor will be synthetic if this class does not declare any
   /// constructors, in which case it will represent the default constructor for
   /// the class.
-  ConstructorElement get unnamedConstructor;
+  ConstructorElement? get unnamedConstructor;
 
   /// Return the field (synthetic or explicit) defined in this class that has
   /// the given [name], or `null` if this class does not define a field with the
   /// given name.
-  FieldElement getField(String name);
+  FieldElement? getField(String name);
 
   /// Return the element representing the getter with the given [name] that is
   /// declared in this class, or `null` if this class does not declare a getter
   /// with the given name.
-  PropertyAccessorElement getGetter(String name);
+  PropertyAccessorElement? getGetter(String name);
 
   /// Return the element representing the method with the given [name] that is
   /// declared in this class, or `null` if this class does not declare a method
   /// with the given name.
-  MethodElement getMethod(String name);
+  MethodElement? getMethod(String name);
 
   /// Return the named constructor declared in this class with the given [name],
   /// or `null` if this class does not declare a named constructor with the
   /// given name.
-  ConstructorElement getNamedConstructor(String name);
+  ConstructorElement? getNamedConstructor(String name);
 
   /// Return the element representing the setter with the given [name] that is
   /// declared in this class, or `null` if this class does not declare a setter
   /// with the given name.
-  PropertyAccessorElement getSetter(String name);
+  PropertyAccessorElement? getSetter(String name);
 
   /// Create the [InterfaceType] for this class with the given [typeArguments]
   /// and [nullabilitySuffix].
   InterfaceType instantiate({
-    @required List<DartType> typeArguments,
-    @required NullabilitySuffix nullabilitySuffix,
+    required List<DartType> typeArguments,
+    required NullabilitySuffix nullabilitySuffix,
   });
 
   /// Return the element representing the method that results from looking up
@@ -229,7 +238,8 @@
   /// <i>S</i> with respect to <i>L</i>. Otherwise, we say that the lookup has
   /// failed.
   /// </blockquote>
-  MethodElement lookUpConcreteMethod(String methodName, LibraryElement library);
+  MethodElement? lookUpConcreteMethod(
+      String methodName, LibraryElement library);
 
   /// Return the element representing the getter that results from looking up
   /// the given [getterName] in this class with respect to the given [library],
@@ -245,7 +255,7 @@
   /// <i>m</i> in <i>S</i> with respect to <i>L</i>. Otherwise, we say that the
   /// lookup has failed.
   /// </blockquote>
-  PropertyAccessorElement lookUpGetter(
+  PropertyAccessorElement? lookUpGetter(
       String getterName, LibraryElement library);
 
   /// Return the element representing the getter that results from looking up
@@ -263,7 +273,7 @@
   /// <i>m</i> in <i>S</i> with respect to <i>L</i>. Otherwise, we say that the
   /// lookup has failed.
   /// </blockquote>
-  PropertyAccessorElement lookUpInheritedConcreteGetter(
+  PropertyAccessorElement? lookUpInheritedConcreteGetter(
       String getterName, LibraryElement library);
 
   /// Return the element representing the method that results from looking up
@@ -280,7 +290,7 @@
   /// <i>S</i> with respect to <i>L</i>. Otherwise, we say that the lookup has
   /// failed.
   /// </blockquote>
-  MethodElement lookUpInheritedConcreteMethod(
+  MethodElement? lookUpInheritedConcreteMethod(
       String methodName, LibraryElement library);
 
   /// Return the element representing the setter that results from looking up
@@ -298,7 +308,7 @@
   /// <i>m</i> in <i>S</i> with respect to <i>L</i>. Otherwise, we say that the
   /// lookup has failed.
   /// </blockquote>
-  PropertyAccessorElement lookUpInheritedConcreteSetter(
+  PropertyAccessorElement? lookUpInheritedConcreteSetter(
       String setterName, LibraryElement library);
 
   /// Return the element representing the method that results from looking up
@@ -314,7 +324,7 @@
   /// <i>S</i> with respect to <i>L</i>. Otherwise, we say that the lookup has
   /// failed.
   /// </blockquote>
-  MethodElement lookUpInheritedMethod(
+  MethodElement? lookUpInheritedMethod(
       String methodName, LibraryElement library);
 
   /// Return the element representing the method that results from looking up
@@ -330,7 +340,7 @@
   /// <i>S</i> with respect to <i>L</i>. Otherwise, we say that the lookup has
   /// failed.
   /// </blockquote>
-  MethodElement lookUpMethod(String methodName, LibraryElement library);
+  MethodElement? lookUpMethod(String methodName, LibraryElement library);
 
   /// Return the element representing the setter that results from looking up
   /// the given [setterName] in this class with respect to the given [library],
@@ -346,7 +356,7 @@
   /// <i>m</i> in <i>S</i> with respect to <i>L</i>. Otherwise, we say that the
   /// lookup has failed.
   /// </blockquote>
-  PropertyAccessorElement lookUpSetter(
+  PropertyAccessorElement? lookUpSetter(
       String setterName, LibraryElement library);
 }
 
@@ -360,6 +370,9 @@
   // TODO(brianwilkerson) Either remove this class or rename it to something
   //  more correct.
 
+  @override
+  Element get enclosingElement;
+
   /// Return `true` if this element is a static element. A static element is an
   /// element that is not associated with a particular instance, but rather with
   /// an entire library or class.
@@ -399,7 +412,7 @@
   bool get hasLoadLibraryFunction;
 
   /// Return the [LineInfo] for the [source], or `null` if not computed yet.
-  LineInfo get lineInfo;
+  LineInfo? get lineInfo;
 
   /// Return a list containing all of the mixins contained in this compilation
   /// unit.
@@ -420,12 +433,12 @@
   /// Return the enum defined in this compilation unit that has the given
   /// [name], or `null` if this compilation unit does not define an enum with
   /// the given name.
-  ClassElement getEnum(String name);
+  ClassElement? getEnum(String name);
 
   /// Return the class defined in this compilation unit that has the given
   /// [name], or `null` if this compilation unit does not define a class with
   /// the given name.
-  ClassElement getType(String name);
+  ClassElement? getType(String name);
 }
 
 /// An element representing a constructor or a factory method defined within a
@@ -438,6 +451,9 @@
   ConstructorElement get declaration;
 
   @override
+  String get displayName;
+
+  @override
   ClassElement get enclosingElement;
 
   /// Return `true` if this constructor is a const constructor.
@@ -450,18 +466,23 @@
   /// Return `true` if this constructor represents a factory constructor.
   bool get isFactory;
 
+  @override
+  String get name;
+
   /// Return the offset of the character immediately following the last
   /// character of this constructor's name, or `null` if not named.
-  int get nameEnd;
+  ///
+  /// TODO(migration): encapsulate [nameEnd] and [periodOffset]?
+  int? get nameEnd;
 
   /// Return the offset of the `.` before this constructor name, or `null` if
   /// not named.
-  int get periodOffset;
+  int? get periodOffset;
 
   /// Return the constructor to which this constructor is redirecting, or `null`
   /// if this constructor does not redirect to another constructor or if the
   /// library containing this constructor has not yet been resolved.
-  ConstructorElement get redirectedConstructor;
+  ConstructorElement? get redirectedConstructor;
 
   @override
   InterfaceType get returnType;
@@ -505,7 +526,7 @@
   /// parameters, return the corresponding element from the class, without any
   /// substitutions. If this element is already a declaration (or a synthetic
   /// element, e.g. a synthetic property accessor), return itself.
-  Element get declaration;
+  Element? get declaration;
 
   /// Return the display name of this element, or `null` if this element does
   /// not have a name.
@@ -518,12 +539,12 @@
   /// Return the content of the documentation comment (including delimiters) for
   /// this element, or `null` if this element does not or cannot have
   /// documentation.
-  String get documentationComment;
+  String? get documentationComment;
 
   /// Return the element that either physically or logically encloses this
   /// element. This will be `null` if this element is a library because
   /// libraries are the top-level elements in the model.
-  Element get enclosingElement;
+  Element? get enclosingElement;
 
   /// Return `true` if this element has an annotation of the form
   /// `@alwaysThrows`.
@@ -607,12 +628,12 @@
 
   /// Return the library that contains this element. This will be the element
   /// itself if it is a library element. This will be `null` if this element is
-  /// an HTML file because HTML files are not contained in libraries.
-  LibraryElement get library;
+  /// [MultiplyDefinedElement] that is not contained in a library.
+  LibraryElement? get library;
 
   /// Return an object representing the location of this element in the element
   /// model. The object can be used to locate this element at a later time.
-  ElementLocation get location;
+  ElementLocation? get location;
 
   /// Return a list containing all of the metadata associated with this element.
   /// The array will be empty if the element does not have any metadata or if
@@ -621,7 +642,7 @@
 
   /// Return the name of this element, or `null` if this element does not have a
   /// name.
-  String get name;
+  String? get name;
 
   /// Return the length of the name of this element in the file that contains
   /// the declaration of this element, or `0` if this element does not have a
@@ -637,11 +658,11 @@
   AnalysisSession get session;
 
   @override
-  Source get source;
+  Source? get source;
 
   /// Use the given [visitor] to visit this element. Return the value returned
   /// by the visitor as a result of visiting this element.
-  T accept<T>(ElementVisitor<T> visitor);
+  T? accept<T>(ElementVisitor<T> visitor);
 
   /// Return the presentation of this element as it should appear when
   /// presented to users.
@@ -655,14 +676,14 @@
   ///
   /// Clients should not depend on the content of the returned value as it will
   /// be changed if doing so would improve the UX.
-  String getDisplayString({@required bool withNullability});
+  String getDisplayString({required bool withNullability});
 
   /// Return a display name for the given element that includes the path to the
   /// compilation unit in which the type is defined. If [shortName] is `null`
   /// then [displayName] will be used as the name of this element. Otherwise
   /// the provided name will be used.
   // TODO(brianwilkerson) Make the parameter optional.
-  String getExtendedDisplayName(String shortName);
+  String getExtendedDisplayName(String? shortName);
 
   /// Return `true` if this element, assuming that it is within scope, is
   /// accessible to code in the given [library]. This is defined by the Dart
@@ -671,16 +692,18 @@
   /// A declaration <i>m</i> is accessible to library <i>L</i> if <i>m</i> is
   /// declared in <i>L</i> or if <i>m</i> is public.
   /// </blockquote>
-  bool isAccessibleIn(LibraryElement library);
+  ///
+  /// TODO(migration): should not be nullable
+  bool isAccessibleIn(LibraryElement? library);
 
   /// Return either this element or the most immediate ancestor of this element
   /// for which the [predicate] returns `true`, or `null` if there is no such
   /// element.
-  E thisOrAncestorMatching<E extends Element>(Predicate<Element> predicate);
+  E? thisOrAncestorMatching<E extends Element>(Predicate<Element> predicate);
 
   /// Return either this element or the most immediate ancestor of this element
   /// that has the given type, or `null` if there is no such element.
-  E thisOrAncestorOfType<E extends Element>();
+  E? thisOrAncestorOfType<E extends Element>();
 
   /// Use the given [visitor] to visit all of the children of this element.
   /// There is no guarantee of the order in which the children will be visited.
@@ -694,7 +717,7 @@
   /// Return the errors that were produced while computing a value for this
   /// annotation, or `null` if no value has been computed. If a value has been
   /// produced but no errors were generated, then the list will be empty.
-  List<AnalysisError> get constantEvaluationErrors;
+  List<AnalysisError>? get constantEvaluationErrors;
 
   /// Return the element referenced by this annotation.
   ///
@@ -704,7 +727,7 @@
   ///
   /// In invalid code this element can be `null`, or a reference to any
   /// other element.
-  Element get element;
+  Element? get element;
 
   /// Return `true` if this annotation marks the associated function as always
   /// throwing.
@@ -792,7 +815,7 @@
   /// Return a representation of the value of this annotation, forcing the value
   /// to be computed if it had not previously been computed, or `null` if the
   /// value of this annotation could not be computed because of errors.
-  DartObject computeConstantValue();
+  DartObject? computeConstantValue();
 
   /// Return a textual description of this annotation in a form approximating
   /// valid source. The returned string will not be valid source primarily in
@@ -921,7 +944,7 @@
   /// Return the kind of the given [element], or [ERROR] if the element is
   /// `null`. This is a utility method that can reduce the need for null checks
   /// in other places.
-  static ElementKind of(Element element) {
+  static ElementKind of(Element? element) {
     if (element == null) {
       return ERROR;
     }
@@ -954,49 +977,49 @@
 /// * ThrowingElementVisitor which implements every visit method by throwing an
 ///   exception.
 abstract class ElementVisitor<R> {
-  R visitClassElement(ClassElement element);
+  R? visitClassElement(ClassElement element);
 
-  R visitCompilationUnitElement(CompilationUnitElement element);
+  R? visitCompilationUnitElement(CompilationUnitElement element);
 
-  R visitConstructorElement(ConstructorElement element);
+  R? visitConstructorElement(ConstructorElement element);
 
-  R visitExportElement(ExportElement element);
+  R? visitExportElement(ExportElement element);
 
-  R visitExtensionElement(ExtensionElement element);
+  R? visitExtensionElement(ExtensionElement element);
 
-  R visitFieldElement(FieldElement element);
+  R? visitFieldElement(FieldElement element);
 
-  R visitFieldFormalParameterElement(FieldFormalParameterElement element);
+  R? visitFieldFormalParameterElement(FieldFormalParameterElement element);
 
-  R visitFunctionElement(FunctionElement element);
+  R? visitFunctionElement(FunctionElement element);
 
-  R visitFunctionTypeAliasElement(FunctionTypeAliasElement element);
+  R? visitFunctionTypeAliasElement(FunctionTypeAliasElement element);
 
-  R visitGenericFunctionTypeElement(GenericFunctionTypeElement element);
+  R? visitGenericFunctionTypeElement(GenericFunctionTypeElement element);
 
-  R visitImportElement(ImportElement element);
+  R? visitImportElement(ImportElement element);
 
-  R visitLabelElement(LabelElement element);
+  R? visitLabelElement(LabelElement element);
 
-  R visitLibraryElement(LibraryElement element);
+  R? visitLibraryElement(LibraryElement element);
 
-  R visitLocalVariableElement(LocalVariableElement element);
+  R? visitLocalVariableElement(LocalVariableElement element);
 
-  R visitMethodElement(MethodElement element);
+  R? visitMethodElement(MethodElement element);
 
-  R visitMultiplyDefinedElement(MultiplyDefinedElement element);
+  R? visitMultiplyDefinedElement(MultiplyDefinedElement element);
 
-  R visitParameterElement(ParameterElement element);
+  R? visitParameterElement(ParameterElement element);
 
-  R visitPrefixElement(PrefixElement element);
+  R? visitPrefixElement(PrefixElement element);
 
-  R visitPropertyAccessorElement(PropertyAccessorElement element);
+  R? visitPropertyAccessorElement(PropertyAccessorElement element);
 
-  R visitTopLevelVariableElement(TopLevelVariableElement element);
+  R? visitTopLevelVariableElement(TopLevelVariableElement element);
 
-  R visitTypeAliasElement(TypeAliasElement element);
+  R? visitTypeAliasElement(TypeAliasElement element);
 
-  R visitTypeParameterElement(TypeParameterElement element);
+  R? visitTypeParameterElement(TypeParameterElement element);
 }
 
 /// An element representing an executable object, including functions, methods,
@@ -1007,6 +1030,12 @@
   @override
   ExecutableElement get declaration;
 
+  @override
+  String get displayName;
+
+  @override
+  Element get enclosingElement;
+
   /// Return `true` if this executable element did not have an explicit return
   /// type specified for it in the original source. Note that if there was no
   /// explicit return type, and if the element model is fully populated, then
@@ -1043,6 +1072,9 @@
   /// Return `true` if this executable element has a body marked as being
   /// synchronous.
   bool get isSynchronous;
+
+  @override
+  String get name;
 }
 
 /// An export directive within a library.
@@ -1055,7 +1087,7 @@
 
   /// Return the library that is exported from this library by this export
   /// directive, or `null` if the URI has invalid syntax or cannot be resolved.
-  LibraryElement get exportedLibrary;
+  LibraryElement? get exportedLibrary;
 }
 
 /// An element that represents an extension.
@@ -1066,6 +1098,9 @@
   /// declared in this extension.
   List<PropertyAccessorElement> get accessors;
 
+  @override
+  CompilationUnitElement get enclosingElement;
+
   /// Return the type that is extended by this extension.
   DartType get extendedType;
 
@@ -1078,17 +1113,17 @@
   /// Return the element representing the getter with the given [name] that is
   /// declared in this extension, or `null` if this extension does not declare a
   /// getter with the given name.
-  PropertyAccessorElement /*?*/ getGetter(String name);
+  PropertyAccessorElement? getGetter(String name);
 
   /// Return the element representing the method with the given [name] that is
   /// declared in this extension, or `null` if this extension does not declare a
   /// method with the given name.
-  MethodElement /*?*/ getMethod(String name);
+  MethodElement? getMethod(String name);
 
   /// Return the element representing the setter with the given [name] that is
   /// declared in this extension, or `null` if this extension does not declare a
   /// setter with the given name.
-  PropertyAccessorElement /*?*/ getSetter(String name);
+  PropertyAccessorElement? getSetter(String name);
 }
 
 /// A field defined within a class.
@@ -1128,7 +1163,7 @@
 abstract class FieldFormalParameterElement implements ParameterElement {
   /// Return the field element associated with this field formal parameter, or
   /// `null` if the parameter references a field that doesn't exist.
-  FieldElement get field;
+  FieldElement? get field;
 }
 
 /// A (non-method) function. This can be either a top-level function, a local
@@ -1175,8 +1210,8 @@
 
   @override
   FunctionType instantiate({
-    @required List<DartType> typeArguments,
-    @required NullabilitySuffix nullabilitySuffix,
+    required List<DartType> typeArguments,
+    required NullabilitySuffix nullabilitySuffix,
   });
 }
 
@@ -1224,7 +1259,7 @@
 
   /// Return the library that is imported into this library by this import
   /// directive, or `null` if the URI has invalid syntax or cannot be resolved.
-  LibraryElement get importedLibrary;
+  LibraryElement? get importedLibrary;
 
   /// Return `true` if this import is for a deferred library.
   bool get isDeferred;
@@ -1234,7 +1269,7 @@
 
   /// Return the prefix that was specified as part of the import directive, or
   /// `null` if there was no prefix specified.
-  PrefixElement get prefix;
+  PrefixElement? get prefix;
 
   /// Return the offset of the prefix of this import in the file that contains
   /// this import directive, or `-1` if this import is synthetic, does not have
@@ -1248,26 +1283,28 @@
 abstract class LabelElement implements Element {
   @override
   ExecutableElement get enclosingElement;
+
+  @override
+  String get name;
 }
 
 /// A library.
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class LibraryElement implements Element {
+abstract class LibraryElement implements _ExistingElement {
   /// Return the compilation unit that defines this library.
   CompilationUnitElement get definingCompilationUnit;
 
   /// Return the entry point for this library, or `null` if this library does
   /// not have an entry point. The entry point is defined to be a zero argument
   /// top-level function whose name is `main`.
-  FunctionElement get entryPoint;
+  FunctionElement? get entryPoint;
 
   /// Return a list containing all of the libraries that are exported from this
   /// library.
   List<LibraryElement> get exportedLibraries;
 
-  /// The export [Namespace] of this library, `null` if it has not been
-  /// computed yet.
+  /// The export [Namespace] of this library.
   Namespace get exportNamespace;
 
   /// Return a list containing all of the exports defined in this library.
@@ -1294,8 +1331,7 @@
 
   /// Return a list containing all of the libraries that are imported into this
   /// library. This includes all of the libraries that are imported using a
-  /// prefix (also available through the prefixes returned by [getPrefixes]) and
-  /// those that are imported without a prefix.
+  /// prefix and those that are imported without a prefix.
   List<LibraryElement> get importedLibraries;
 
   /// Return a list containing all of the imports defined in this library.
@@ -1334,8 +1370,7 @@
   /// than one `import` directive.
   List<PrefixElement> get prefixes;
 
-  /// The public [Namespace] of this library, `null` if it has not been
-  /// computed yet.
+  /// The public [Namespace] of this library.
   Namespace get publicNamespace;
 
   /// Return the name lookup scope for this library. It consists of elements
@@ -1364,7 +1399,7 @@
 
   /// Return the class defined in this library that has the given [name], or
   /// `null` if this library does not define a class with the given name.
-  ClassElement getType(String className);
+  ClassElement? getType(String className);
 
   /// If a legacy library, return the legacy view on the [element].
   /// Otherwise, return the original element.
@@ -1380,11 +1415,11 @@
   final Version package;
 
   /// The version specified using `@dart` override, `null` if absent or invalid.
-  final Version override;
+  final Version? override;
 
   LibraryLanguageVersion({
-    @required this.package,
-    @required this.override,
+    required this.package,
+    required this.override,
   });
 
   /// The effective language version for the library.
@@ -1405,6 +1440,9 @@
 abstract class LocalVariableElement implements PromotableElement {
   /// Return `true` if this variable has an initializer at declaration.
   bool get hasInitializer;
+
+  @override
+  String get name;
 }
 
 /// An element that represents a method defined within a class.
@@ -1455,7 +1493,7 @@
   ParameterElement get declaration;
 
   /// Return the Dart code of the default value, or `null` if no default value.
-  String get defaultValueCode;
+  String? get defaultValueCode;
 
   /// Return `true` if this parameter has a default value.
   bool get hasDefaultValue;
@@ -1514,6 +1552,9 @@
   /// parameter.
   bool get isRequiredPositional;
 
+  @override
+  String get name;
+
   /// Return the kind of this parameter.
   @Deprecated('Use the getters isOptionalNamed, isOptionalPositional, '
       'isRequiredNamed, and isRequiredPositional')
@@ -1540,10 +1581,13 @@
 /// A prefix used to import one or more libraries into another library.
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class PrefixElement implements Element {
+abstract class PrefixElement implements _ExistingElement {
   @override
   LibraryElement get enclosingElement;
 
+  @override
+  String get name;
+
   /// Return the name lookup scope for this import prefix. It consists of
   /// elements imported into the enclosing library with this prefix. The
   /// namespace combinators of the import directives are taken into account.
@@ -1573,16 +1617,19 @@
   /// Return the accessor representing the getter that corresponds to (has the
   /// same name as) this setter, or `null` if this accessor is not a setter or
   /// if there is no corresponding getter.
-  PropertyAccessorElement get correspondingGetter;
+  PropertyAccessorElement? get correspondingGetter;
 
   /// Return the accessor representing the setter that corresponds to (has the
   /// same name as) this getter, or `null` if this accessor is not a getter or
   /// if there is no corresponding setter.
-  PropertyAccessorElement get correspondingSetter;
+  PropertyAccessorElement? get correspondingSetter;
 
   @override
   PropertyAccessorElement get declaration;
 
+  @override
+  Element get enclosingElement;
+
   /// Return `true` if this accessor represents a getter.
   bool get isGetter;
 
@@ -1613,14 +1660,23 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class PropertyInducingElement implements VariableElement {
+  @override
+  String get displayName;
+
   /// Return the getter associated with this variable. If this variable was
   /// explicitly defined (is not synthetic) then the getter associated with it
   /// will be synthetic.
-  PropertyAccessorElement get getter;
+  PropertyAccessorElement? get getter;
 
   /// Return `true` if this variable has an initializer at declaration.
   bool get hasInitializer;
 
+  @override
+  LibraryElement get library;
+
+  @override
+  String get name;
+
   /// Return the setter associated with this variable, or `null` if the variable
   /// is effectively `final` and therefore does not have a setter associated
   /// with it. (This can happen either because the variable is explicitly
@@ -1628,7 +1684,7 @@
   /// explicit getter that does not have a corresponding setter.) If this
   /// variable was explicitly defined (is not synthetic) then the setter
   /// associated with it will be synthetic.
-  PropertyAccessorElement get setter;
+  PropertyAccessorElement? get setter;
 }
 
 /// A combinator that cause some of the names in a namespace to be visible (and
@@ -1668,7 +1724,7 @@
   /// For example it could be [GenericFunctionTypeElement].
   ///
   /// If there is no structure, return `null`.
-  Element get aliasedElement;
+  Element? get aliasedElement;
 
   /// Return the aliased type.
   ///
@@ -1680,6 +1736,9 @@
   @override
   CompilationUnitElement get enclosingElement;
 
+  @override
+  String get name;
+
   /// Produces the type resulting from instantiating this typedef with the given
   /// [typeArguments] and [nullabilitySuffix].
   ///
@@ -1689,8 +1748,8 @@
   ///     typedef F<T> = void Function<U>(T, U);
   /// then `F<int>` will produce `void Function<U>(int, U)`.
   DartType instantiate({
-    @required List<DartType> typeArguments,
-    @required NullabilitySuffix nullabilitySuffix,
+    required List<DartType> typeArguments,
+    required NullabilitySuffix nullabilitySuffix,
   });
 }
 
@@ -1707,15 +1766,21 @@
   /// `null` if this parameter does not have an explicit bound. Being able to
   /// distinguish between an implicit and explicit bound is needed by the
   /// instantiate to bounds algorithm.
-  DartType get bound;
+  DartType? get bound;
 
   @override
   TypeParameterElement get declaration;
 
+  @override
+  String get displayName;
+
+  @override
+  String get name;
+
   /// Create the [TypeParameterType] with the given [nullabilitySuffix] for
   /// this type parameter.
   TypeParameterType instantiate({
-    @required NullabilitySuffix nullabilitySuffix,
+    required NullabilitySuffix nullabilitySuffix,
   });
 }
 
@@ -1723,7 +1788,7 @@
 /// includes functions and methods if support for generic methods is enabled.
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class TypeParameterizedElement implements Element {
+abstract class TypeParameterizedElement implements _ExistingElement {
   /// If the element defines a type, indicates whether the type may safely
   /// appear without explicit type parameters as the bounds of a type parameter
   /// declaration.
@@ -1748,10 +1813,10 @@
 /// An element included into a library using some URI.
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class UriReferencedElement implements Element {
+abstract class UriReferencedElement implements _ExistingElement {
   /// Return the URI that is used to include this element into the enclosing
   /// library, or `null` if this is the defining compilation unit of a library.
-  String get uri;
+  String? get uri;
 
   /// Return the offset of the character immediately following the last
   /// character of this node's URI, or `-1` for synthetic import.
@@ -1809,5 +1874,21 @@
   /// to be computed if it had not previously been computed, or `null` if either
   /// this variable was not declared with the 'const' modifier or if the value
   /// of this variable could not be computed because of errors.
-  DartObject computeConstantValue();
+  DartObject? computeConstantValue();
+}
+
+/// This class exists to provide non-nullable overrides for existing elements,
+/// as opposite to artificial "multiply defined" element.
+abstract class _ExistingElement implements Element {
+  @override
+  Element get declaration;
+
+  @override
+  LibraryElement get library;
+
+  @override
+  Source get librarySource;
+
+  @override
+  Source get source;
 }
diff --git a/pkg/analyzer/lib/dart/element/scope.dart b/pkg/analyzer/lib/dart/element/scope.dart
index 2129a4e..82b2c0d 100644
--- a/pkg/analyzer/lib/dart/element/scope.dart
+++ b/pkg/analyzer/lib/dart/element/scope.dart
@@ -23,8 +23,8 @@
 }
 
 class ScopeLookupResult {
-  final Element getter;
-  final Element setter;
+  final Element? getter;
+  final Element? setter;
 
   ScopeLookupResult(this.getter, this.setter);
 }
diff --git a/pkg/analyzer/lib/dart/element/type.dart b/pkg/analyzer/lib/dart/element/type.dart
index e7c04af..88d625a 100644
--- a/pkg/analyzer/lib/dart/element/type.dart
+++ b/pkg/analyzer/lib/dart/element/type.dart
@@ -23,7 +23,6 @@
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type_visitor.dart';
 import 'package:analyzer/src/dart/element/type.dart' show InterfaceTypeImpl;
-import 'package:meta/meta.dart';
 
 /// The type associated with elements in the element model.
 ///
@@ -31,11 +30,11 @@
 abstract class DartType {
   /// If this type is an instantiation of a type alias, return the type
   /// arguments used for the instantiation. Otherwise return `null`.
-  List<DartType> get aliasArguments;
+  List<DartType>? get aliasArguments;
 
   /// If this type is an instantiation of a type alias, return it.
   /// Otherwise return `null`.
-  TypeAliasElement get aliasElement;
+  TypeAliasElement? get aliasElement;
 
   /// Return the name of this type as it should appear when presented to users
   /// in contexts such as error messages.
@@ -49,7 +48,7 @@
   /// the type has not, or cannot, be associated with an element. The former
   /// case will occur if the element model is not yet complete; the latter case
   /// will occur if this object represents an undefined type.
-  Element get element;
+  Element? get element;
 
   /// Return `true` if this type represents the bottom type.
   bool get isBottom;
@@ -123,7 +122,7 @@
   /// Return the name of this type, or `null` if the type does not have a name,
   /// such as when the type represents the type of an unnamed function.
   @Deprecated('Check element, or use getDisplayString()')
-  String get name;
+  String? get name;
 
   /// Return the nullability suffix of this type.
   NullabilitySuffix get nullabilitySuffix;
@@ -152,7 +151,7 @@
   ///
   /// For a [TypeParameterType] with a bound (declared or promoted), returns
   /// the interface implemented by the bound.
-  InterfaceType asInstanceOf(ClassElement element);
+  InterfaceType? asInstanceOf(ClassElement element);
 
   /// Return the presentation of this type as it should appear when presented
   /// to users in contexts such as error messages.
@@ -166,7 +165,7 @@
   ///
   /// Clients should not depend on the content of the returned value as it will
   /// be changed if doing so would improve the UX.
-  String getDisplayString({@required bool withNullability});
+  String getDisplayString({required bool withNullability});
 
   /// If this type is a [TypeParameterType], returns its bound if it has one, or
   /// [objectType] otherwise.
@@ -286,7 +285,7 @@
   /// general, equivalent to getting the superclass from this type's element
   /// because the type returned by this method will have had it's type
   /// parameters replaced.
-  InterfaceType get superclass;
+  InterfaceType? get superclass;
 
   /// Return a list containing all of the super-class constraints that this
   /// mixin declaration declares. The list will be empty if this class does not
@@ -296,17 +295,17 @@
   /// Return the element representing the getter with the given [name] that is
   /// declared in this class, or `null` if this class does not declare a getter
   /// with the given name.
-  PropertyAccessorElement getGetter(String name);
+  PropertyAccessorElement? getGetter(String name);
 
   /// Return the element representing the method with the given [name] that is
   /// declared in this class, or `null` if this class does not declare a method
   /// with the given name.
-  MethodElement getMethod(String name);
+  MethodElement? getMethod(String name);
 
   /// Return the element representing the setter with the given [name] that is
   /// declared in this class, or `null` if this class does not declare a setter
   /// with the given name.
-  PropertyAccessorElement getSetter(String name);
+  PropertyAccessorElement? getSetter(String name);
 
   /// Return the element representing the constructor that results from looking
   /// up the constructor with the given [name] in this class with respect to the
@@ -318,7 +317,7 @@
   /// <i>T<i>. Otherwise, if <i>q</i> is not defined or not accessible, a
   /// NoSuchMethodException is thrown.
   /// </blockquote>
-  ConstructorElement lookUpConstructor(String name, LibraryElement library);
+  ConstructorElement? lookUpConstructor(String? name, LibraryElement library);
 
   /// Return the element representing the getter that results from looking up
   /// the getter with the given [name] in this class with respect to the given
@@ -335,7 +334,7 @@
   ///   respect to <i>L</i>. Otherwise, we say that the lookup has failed.
   /// </blockquote>
   @Deprecated('Use lookupGetter2 instead')
-  PropertyAccessorElement lookUpGetter(String name, LibraryElement library);
+  PropertyAccessorElement? lookUpGetter(String name, LibraryElement library);
 
   /// Return the getter with the given [name].
   ///
@@ -347,7 +346,7 @@
   ///
   /// If [recoveryStatic] is `true`, then static getters of the class,
   /// and its superclasses are considered. Clients should not use it.
-  PropertyAccessorElement lookUpGetter2(
+  PropertyAccessorElement? lookUpGetter2(
     String name,
     LibraryElement library, {
     bool concrete = false,
@@ -371,8 +370,8 @@
   ///   respect to <i>L</i>. Otherwise, we say that the lookup has failed.
   /// </blockquote>
   @Deprecated('Use lookupGetter2 instead')
-  PropertyAccessorElement lookUpGetterInSuperclass(
-      String name, LibraryElement library);
+  PropertyAccessorElement? lookUpGetterInSuperclass(
+      String name, LibraryElement? library);
 
   /// Look up the member with the given [name] in this type and all extended
   /// and mixed in classes, and by default including [thisType]. If the search
@@ -384,8 +383,8 @@
   /// The [library] determines if a private member name is visible, and does not
   /// need to be supplied for public names.
   @Deprecated('Use lookupGetter2 instead')
-  PropertyAccessorElement lookUpInheritedGetter(String name,
-      {LibraryElement library, bool thisType = true});
+  PropertyAccessorElement? lookUpInheritedGetter(String name,
+      {LibraryElement? library, bool thisType = true});
 
   /// Look up the member with the given [name] in this type and all extended
   /// and mixed in classes, starting from this type. If the search fails,
@@ -397,8 +396,8 @@
   /// The [library] determines if a private member name is visible, and does not
   /// need to be supplied for public names.
   @Deprecated('Use lookupGetter2 and/or lookupMethod2 instead')
-  ExecutableElement lookUpInheritedGetterOrMethod(String name,
-      {LibraryElement library});
+  ExecutableElement? lookUpInheritedGetterOrMethod(String name,
+      {LibraryElement? library});
 
   /// Look up the member with the given [name] in this type and all extended
   /// and mixed in classes, and by default including [thisType]. If the search
@@ -410,8 +409,8 @@
   /// The [library] determines if a private member name is visible, and does not
   /// need to be supplied for public names.
   @Deprecated('Use lookupMethod2 instead')
-  MethodElement lookUpInheritedMethod(String name,
-      {LibraryElement library, bool thisType = true});
+  MethodElement? lookUpInheritedMethod(String name,
+      {LibraryElement? library, bool thisType = true});
 
   /// Look up the member with the given [name] in this type and all extended
   /// and mixed in classes, and by default including [thisType]. If the search
@@ -423,8 +422,8 @@
   /// The [library] determines if a private member name is visible, and does not
   /// need to be supplied for public names.
   @Deprecated('Use lookupSetter2 instead')
-  PropertyAccessorElement lookUpInheritedSetter(String name,
-      {LibraryElement library, bool thisType = true});
+  PropertyAccessorElement? lookUpInheritedSetter(String name,
+      {LibraryElement? library, bool thisType = true});
 
   /// Return the element representing the method that results from looking up
   /// the method with the given [name] in this class with respect to the given
@@ -440,7 +439,7 @@
   ///   respect to <i>L</i> Otherwise, we say that the lookup has failed.
   /// </blockquote>
   @Deprecated('Use lookupMethod2 instead')
-  MethodElement lookUpMethod(String name, LibraryElement library);
+  MethodElement? lookUpMethod(String name, LibraryElement library);
 
   /// Return the method with the given [name].
   ///
@@ -452,7 +451,7 @@
   ///
   /// If [recoveryStatic] is `true`, then static methods of the class,
   /// and its superclasses are considered. Clients should not use it.
-  MethodElement lookUpMethod2(
+  MethodElement? lookUpMethod2(
     String name,
     LibraryElement library, {
     bool concrete = false,
@@ -476,7 +475,7 @@
   /// * Otherwise, we say that the lookup has failed.
   /// </blockquote>
   @Deprecated('Use lookupMethod2 instead')
-  MethodElement lookUpMethodInSuperclass(String name, LibraryElement library);
+  MethodElement? lookUpMethodInSuperclass(String name, LibraryElement library);
 
   /// Return the element representing the setter that results from looking up
   /// the setter with the given [name] in this class with respect to the given
@@ -493,7 +492,7 @@
   ///   respect to <i>L</i>. Otherwise, we say that the lookup has failed.
   /// </blockquote>
   @Deprecated('Use lookupSetter2 instead')
-  PropertyAccessorElement lookUpSetter(String name, LibraryElement library);
+  PropertyAccessorElement? lookUpSetter(String name, LibraryElement library);
 
   /// Return the setter with the given [name].
   ///
@@ -505,7 +504,7 @@
   ///
   /// If [recoveryStatic] is `true`, then static setters of the class,
   /// and its superclasses are considered. Clients should not use it.
-  PropertyAccessorElement lookUpSetter2(
+  PropertyAccessorElement? lookUpSetter2(
     String name,
     LibraryElement library, {
     bool concrete = false,
@@ -529,7 +528,7 @@
   ///   respect to <i>L</i>. Otherwise, we say that the lookup has failed.
   /// </blockquote>
   @Deprecated('Use lookupSetter2 instead')
-  PropertyAccessorElement lookUpSetterInSuperclass(
+  PropertyAccessorElement? lookUpSetterInSuperclass(
       String name, LibraryElement library);
 
   /// Returns a "smart" version of the "least upper bound" of the given types.
diff --git a/pkg/analyzer/lib/dart/element/type_system.dart b/pkg/analyzer/lib/dart/element/type_system.dart
index 865e8d3..8e3d4db 100644
--- a/pkg/analyzer/lib/dart/element/type_system.dart
+++ b/pkg/analyzer/lib/dart/element/type_system.dart
@@ -41,11 +41,11 @@
   /// One and only one of [classElement] or [typeAliasElement] must
   /// be provided.
   DartType instantiateToBounds2({
-    ClassElement classElement,
+    ClassElement? classElement,
     @Deprecated("Use 'typeAliasElement' instead")
-        FunctionTypeAliasElement functionTypeAliasElement,
-    TypeAliasElement typeAliasElement,
-    @required NullabilitySuffix nullabilitySuffix,
+        FunctionTypeAliasElement? functionTypeAliasElement,
+    TypeAliasElement? typeAliasElement,
+    required NullabilitySuffix nullabilitySuffix,
   });
 
   /// Return `true` if the [leftType] is assignable to the [rightType].
diff --git a/pkg/analyzer/lib/dart/element/visitor.dart b/pkg/analyzer/lib/dart/element/visitor.dart
index f6256b8..27f3283 100644
--- a/pkg/analyzer/lib/dart/element/visitor.dart
+++ b/pkg/analyzer/lib/dart/element/visitor.dart
@@ -83,58 +83,59 @@
   const GeneralizingElementVisitor();
 
   @override
-  R visitClassElement(ClassElement element) => visitElement(element);
+  R? visitClassElement(ClassElement element) => visitElement(element);
 
   @override
-  R visitCompilationUnitElement(CompilationUnitElement element) =>
+  R? visitCompilationUnitElement(CompilationUnitElement element) =>
       visitElement(element);
 
   @override
-  R visitConstructorElement(ConstructorElement element) =>
+  R? visitConstructorElement(ConstructorElement element) =>
       visitExecutableElement(element);
 
-  R visitElement(Element element) {
+  R? visitElement(Element element) {
     element.visitChildren(this);
     return null;
   }
 
-  R visitExecutableElement(ExecutableElement element) => visitElement(element);
+  R? visitExecutableElement(ExecutableElement element) => visitElement(element);
 
   @override
-  R visitExportElement(ExportElement element) => visitElement(element);
+  R? visitExportElement(ExportElement element) => visitElement(element);
 
   @override
-  R visitExtensionElement(ExtensionElement element) => visitElement(element);
+  R? visitExtensionElement(ExtensionElement element) => visitElement(element);
 
   @override
-  R visitFieldElement(FieldElement element) =>
+  R? visitFieldElement(FieldElement element) =>
       visitPropertyInducingElement(element);
 
   @override
-  R visitFieldFormalParameterElement(FieldFormalParameterElement element) =>
+  R? visitFieldFormalParameterElement(FieldFormalParameterElement element) =>
       visitParameterElement(element);
 
   @override
-  R visitFunctionElement(FunctionElement element) => visitLocalElement(element);
+  R? visitFunctionElement(FunctionElement element) =>
+      visitLocalElement(element);
 
   @override
-  R visitFunctionTypeAliasElement(FunctionTypeAliasElement element) =>
+  R? visitFunctionTypeAliasElement(FunctionTypeAliasElement element) =>
       visitElement(element);
 
   @override
-  R visitGenericFunctionTypeElement(GenericFunctionTypeElement element) =>
+  R? visitGenericFunctionTypeElement(GenericFunctionTypeElement element) =>
       visitElement(element);
 
   @override
-  R visitImportElement(ImportElement element) => visitElement(element);
+  R? visitImportElement(ImportElement element) => visitElement(element);
 
   @override
-  R visitLabelElement(LabelElement element) => visitElement(element);
+  R? visitLabelElement(LabelElement element) => visitElement(element);
 
   @override
-  R visitLibraryElement(LibraryElement element) => visitElement(element);
+  R? visitLibraryElement(LibraryElement element) => visitElement(element);
 
-  R visitLocalElement(LocalElement element) {
+  R? visitLocalElement(LocalElement element) {
     if (element is LocalVariableElement) {
       return visitVariableElement(element);
     } else if (element is ParameterElement) {
@@ -146,43 +147,43 @@
   }
 
   @override
-  R visitLocalVariableElement(LocalVariableElement element) =>
+  R? visitLocalVariableElement(LocalVariableElement element) =>
       visitLocalElement(element);
 
   @override
-  R visitMethodElement(MethodElement element) =>
+  R? visitMethodElement(MethodElement element) =>
       visitExecutableElement(element);
 
   @override
-  R visitMultiplyDefinedElement(MultiplyDefinedElement element) =>
+  R? visitMultiplyDefinedElement(MultiplyDefinedElement element) =>
       visitElement(element);
 
   @override
-  R visitParameterElement(ParameterElement element) =>
+  R? visitParameterElement(ParameterElement element) =>
       visitLocalElement(element);
 
   @override
-  R visitPrefixElement(PrefixElement element) => visitElement(element);
+  R? visitPrefixElement(PrefixElement element) => visitElement(element);
 
   @override
-  R visitPropertyAccessorElement(PropertyAccessorElement element) =>
+  R? visitPropertyAccessorElement(PropertyAccessorElement element) =>
       visitExecutableElement(element);
 
-  R visitPropertyInducingElement(PropertyInducingElement element) =>
+  R? visitPropertyInducingElement(PropertyInducingElement element) =>
       visitVariableElement(element);
 
   @override
-  R visitTopLevelVariableElement(TopLevelVariableElement element) =>
+  R? visitTopLevelVariableElement(TopLevelVariableElement element) =>
       visitPropertyInducingElement(element);
 
   @override
-  R visitTypeAliasElement(TypeAliasElement element) => visitElement(element);
+  R? visitTypeAliasElement(TypeAliasElement element) => visitElement(element);
 
   @override
-  R visitTypeParameterElement(TypeParameterElement element) =>
+  R? visitTypeParameterElement(TypeParameterElement element) =>
       visitElement(element);
 
-  R visitVariableElement(VariableElement element) => visitElement(element);
+  R? visitVariableElement(VariableElement element) => visitElement(element);
 }
 
 /// A visitor that will recursively visit all of the element in an element
@@ -201,133 +202,133 @@
   const RecursiveElementVisitor();
 
   @override
-  R visitClassElement(ClassElement element) {
+  R? visitClassElement(ClassElement element) {
     element.visitChildren(this);
     return null;
   }
 
   @override
-  R visitCompilationUnitElement(CompilationUnitElement element) {
+  R? visitCompilationUnitElement(CompilationUnitElement element) {
     element.visitChildren(this);
     return null;
   }
 
   @override
-  R visitConstructorElement(ConstructorElement element) {
+  R? visitConstructorElement(ConstructorElement element) {
     element.visitChildren(this);
     return null;
   }
 
   @override
-  R visitExportElement(ExportElement element) {
+  R? visitExportElement(ExportElement element) {
     element.visitChildren(this);
     return null;
   }
 
   @override
-  R visitExtensionElement(ExtensionElement element) {
+  R? visitExtensionElement(ExtensionElement element) {
     element.visitChildren(this);
     return null;
   }
 
   @override
-  R visitFieldElement(FieldElement element) {
+  R? visitFieldElement(FieldElement element) {
     element.visitChildren(this);
     return null;
   }
 
   @override
-  R visitFieldFormalParameterElement(FieldFormalParameterElement element) {
+  R? visitFieldFormalParameterElement(FieldFormalParameterElement element) {
     element.visitChildren(this);
     return null;
   }
 
   @override
-  R visitFunctionElement(FunctionElement element) {
+  R? visitFunctionElement(FunctionElement element) {
     element.visitChildren(this);
     return null;
   }
 
   @override
-  R visitFunctionTypeAliasElement(FunctionTypeAliasElement element) {
+  R? visitFunctionTypeAliasElement(FunctionTypeAliasElement element) {
     element.visitChildren(this);
     return null;
   }
 
   @override
-  R visitGenericFunctionTypeElement(GenericFunctionTypeElement element) {
+  R? visitGenericFunctionTypeElement(GenericFunctionTypeElement element) {
     element.visitChildren(this);
     return null;
   }
 
   @override
-  R visitImportElement(ImportElement element) {
+  R? visitImportElement(ImportElement element) {
     element.visitChildren(this);
     return null;
   }
 
   @override
-  R visitLabelElement(LabelElement element) {
+  R? visitLabelElement(LabelElement element) {
     element.visitChildren(this);
     return null;
   }
 
   @override
-  R visitLibraryElement(LibraryElement element) {
+  R? visitLibraryElement(LibraryElement element) {
     element.visitChildren(this);
     return null;
   }
 
   @override
-  R visitLocalVariableElement(LocalVariableElement element) {
+  R? visitLocalVariableElement(LocalVariableElement element) {
     element.visitChildren(this);
     return null;
   }
 
   @override
-  R visitMethodElement(MethodElement element) {
+  R? visitMethodElement(MethodElement element) {
     element.visitChildren(this);
     return null;
   }
 
   @override
-  R visitMultiplyDefinedElement(MultiplyDefinedElement element) {
+  R? visitMultiplyDefinedElement(MultiplyDefinedElement element) {
     element.visitChildren(this);
     return null;
   }
 
   @override
-  R visitParameterElement(ParameterElement element) {
+  R? visitParameterElement(ParameterElement element) {
     element.visitChildren(this);
     return null;
   }
 
   @override
-  R visitPrefixElement(PrefixElement element) {
+  R? visitPrefixElement(PrefixElement element) {
     element.visitChildren(this);
     return null;
   }
 
   @override
-  R visitPropertyAccessorElement(PropertyAccessorElement element) {
+  R? visitPropertyAccessorElement(PropertyAccessorElement element) {
     element.visitChildren(this);
     return null;
   }
 
   @override
-  R visitTopLevelVariableElement(TopLevelVariableElement element) {
+  R? visitTopLevelVariableElement(TopLevelVariableElement element) {
     element.visitChildren(this);
     return null;
   }
 
   @override
-  R visitTypeAliasElement(TypeAliasElement element) {
+  R? visitTypeAliasElement(TypeAliasElement element) {
     element.visitChildren(this);
     return null;
   }
 
   @override
-  R visitTypeParameterElement(TypeParameterElement element) {
+  R? visitTypeParameterElement(TypeParameterElement element) {
     element.visitChildren(this);
     return null;
   }
@@ -344,71 +345,72 @@
   const SimpleElementVisitor();
 
   @override
-  R visitClassElement(ClassElement element) => null;
+  R? visitClassElement(ClassElement element) => null;
 
   @override
-  R visitCompilationUnitElement(CompilationUnitElement element) => null;
+  R? visitCompilationUnitElement(CompilationUnitElement element) => null;
 
   @override
-  R visitConstructorElement(ConstructorElement element) => null;
+  R? visitConstructorElement(ConstructorElement element) => null;
 
   @override
-  R visitExportElement(ExportElement element) => null;
+  R? visitExportElement(ExportElement element) => null;
 
   @override
-  R visitExtensionElement(ExtensionElement element) => null;
+  R? visitExtensionElement(ExtensionElement element) => null;
 
   @override
-  R visitFieldElement(FieldElement element) => null;
+  R? visitFieldElement(FieldElement element) => null;
 
   @override
-  R visitFieldFormalParameterElement(FieldFormalParameterElement element) =>
+  R? visitFieldFormalParameterElement(FieldFormalParameterElement element) =>
       null;
 
   @override
-  R visitFunctionElement(FunctionElement element) => null;
+  R? visitFunctionElement(FunctionElement element) => null;
 
   @override
-  R visitFunctionTypeAliasElement(FunctionTypeAliasElement element) => null;
+  R? visitFunctionTypeAliasElement(FunctionTypeAliasElement element) => null;
 
   @override
-  R visitGenericFunctionTypeElement(GenericFunctionTypeElement element) => null;
+  R? visitGenericFunctionTypeElement(GenericFunctionTypeElement element) =>
+      null;
 
   @override
-  R visitImportElement(ImportElement element) => null;
+  R? visitImportElement(ImportElement element) => null;
 
   @override
-  R visitLabelElement(LabelElement element) => null;
+  R? visitLabelElement(LabelElement element) => null;
 
   @override
-  R visitLibraryElement(LibraryElement element) => null;
+  R? visitLibraryElement(LibraryElement element) => null;
 
   @override
-  R visitLocalVariableElement(LocalVariableElement element) => null;
+  R? visitLocalVariableElement(LocalVariableElement element) => null;
 
   @override
-  R visitMethodElement(MethodElement element) => null;
+  R? visitMethodElement(MethodElement element) => null;
 
   @override
-  R visitMultiplyDefinedElement(MultiplyDefinedElement element) => null;
+  R? visitMultiplyDefinedElement(MultiplyDefinedElement element) => null;
 
   @override
-  R visitParameterElement(ParameterElement element) => null;
+  R? visitParameterElement(ParameterElement element) => null;
 
   @override
-  R visitPrefixElement(PrefixElement element) => null;
+  R? visitPrefixElement(PrefixElement element) => null;
 
   @override
-  R visitPropertyAccessorElement(PropertyAccessorElement element) => null;
+  R? visitPropertyAccessorElement(PropertyAccessorElement element) => null;
 
   @override
-  R visitTopLevelVariableElement(TopLevelVariableElement element) => null;
+  R? visitTopLevelVariableElement(TopLevelVariableElement element) => null;
 
   @override
-  R visitTypeAliasElement(TypeAliasElement element) => null;
+  R? visitTypeAliasElement(TypeAliasElement element) => null;
 
   @override
-  R visitTypeParameterElement(TypeParameterElement element) => null;
+  R? visitTypeParameterElement(TypeParameterElement element) => null;
 }
 
 /// An AST visitor that will throw an exception if any of the visit methods that
@@ -423,77 +425,77 @@
   const ThrowingElementVisitor();
 
   @override
-  R visitClassElement(ClassElement element) => _throw(element);
+  R? visitClassElement(ClassElement element) => _throw(element);
 
   @override
-  R visitCompilationUnitElement(CompilationUnitElement element) =>
+  R? visitCompilationUnitElement(CompilationUnitElement element) =>
       _throw(element);
 
   @override
-  R visitConstructorElement(ConstructorElement element) => _throw(element);
+  R? visitConstructorElement(ConstructorElement element) => _throw(element);
 
   @override
-  R visitExportElement(ExportElement element) => _throw(element);
+  R? visitExportElement(ExportElement element) => _throw(element);
 
   @override
-  R visitExtensionElement(ExtensionElement element) => _throw(element);
+  R? visitExtensionElement(ExtensionElement element) => _throw(element);
 
   @override
-  R visitFieldElement(FieldElement element) => _throw(element);
+  R? visitFieldElement(FieldElement element) => _throw(element);
 
   @override
-  R visitFieldFormalParameterElement(FieldFormalParameterElement element) =>
+  R? visitFieldFormalParameterElement(FieldFormalParameterElement element) =>
       _throw(element);
 
   @override
-  R visitFunctionElement(FunctionElement element) => _throw(element);
+  R? visitFunctionElement(FunctionElement element) => _throw(element);
 
   @override
-  R visitFunctionTypeAliasElement(FunctionTypeAliasElement element) =>
+  R? visitFunctionTypeAliasElement(FunctionTypeAliasElement element) =>
       _throw(element);
 
   @override
-  R visitGenericFunctionTypeElement(GenericFunctionTypeElement element) =>
+  R? visitGenericFunctionTypeElement(GenericFunctionTypeElement element) =>
       _throw(element);
 
   @override
-  R visitImportElement(ImportElement element) => _throw(element);
+  R? visitImportElement(ImportElement element) => _throw(element);
 
   @override
-  R visitLabelElement(LabelElement element) => _throw(element);
+  R? visitLabelElement(LabelElement element) => _throw(element);
 
   @override
-  R visitLibraryElement(LibraryElement element) => _throw(element);
+  R? visitLibraryElement(LibraryElement element) => _throw(element);
 
   @override
-  R visitLocalVariableElement(LocalVariableElement element) => _throw(element);
+  R? visitLocalVariableElement(LocalVariableElement element) => _throw(element);
 
   @override
-  R visitMethodElement(MethodElement element) => _throw(element);
+  R? visitMethodElement(MethodElement element) => _throw(element);
 
   @override
-  R visitMultiplyDefinedElement(MultiplyDefinedElement element) =>
+  R? visitMultiplyDefinedElement(MultiplyDefinedElement element) =>
       _throw(element);
 
   @override
-  R visitParameterElement(ParameterElement element) => _throw(element);
+  R? visitParameterElement(ParameterElement element) => _throw(element);
 
   @override
-  R visitPrefixElement(PrefixElement element) => _throw(element);
+  R? visitPrefixElement(PrefixElement element) => _throw(element);
 
   @override
-  R visitPropertyAccessorElement(PropertyAccessorElement element) =>
+  R? visitPropertyAccessorElement(PropertyAccessorElement element) =>
       _throw(element);
 
   @override
-  R visitTopLevelVariableElement(TopLevelVariableElement element) =>
+  R? visitTopLevelVariableElement(TopLevelVariableElement element) =>
       _throw(element);
 
   @override
-  R visitTypeAliasElement(TypeAliasElement element) => _throw(element);
+  R? visitTypeAliasElement(TypeAliasElement element) => _throw(element);
 
   @override
-  R visitTypeParameterElement(TypeParameterElement element) => _throw(element);
+  R? visitTypeParameterElement(TypeParameterElement element) => _throw(element);
 
   R _throw(Element element) {
     throw Exception('Missing implementation of visit${element.runtimeType}');
diff --git a/pkg/analyzer/lib/dart/sdk/build_sdk_summary.dart b/pkg/analyzer/lib/dart/sdk/build_sdk_summary.dart
index 1caa015..c3c27aa 100644
--- a/pkg/analyzer/lib/dart/sdk/build_sdk_summary.dart
+++ b/pkg/analyzer/lib/dart/sdk/build_sdk_summary.dart
@@ -12,6 +12,7 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/context/context.dart';
+import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/session.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/sdk/sdk.dart';
@@ -21,7 +22,6 @@
 import 'package:analyzer/src/summary2/linked_element_factory.dart';
 import 'package:analyzer/src/summary2/package_bundle_format.dart';
 import 'package:analyzer/src/summary2/reference.dart';
-import 'package:meta/meta.dart';
 import 'package:pub_semver/pub_semver.dart';
 import 'package:yaml/yaml.dart';
 
@@ -30,9 +30,9 @@
 /// If [embedderYamlPath] is provided, then libraries from this file are
 /// appended to the libraries of the specified SDK.
 Uint8List buildSdkSummary({
-  @required ResourceProvider resourceProvider,
-  @required String sdkPath,
-  String embedderYamlPath,
+  required ResourceProvider resourceProvider,
+  required String sdkPath,
+  String? embedderYamlPath,
 }) {
   var sdk = FolderBasedDartSdk(
     resourceProvider,
@@ -46,7 +46,7 @@
     var map = loadYaml(content) as YamlMap;
     var embedderSdk = EmbedderSdk(
       resourceProvider,
-      {file.parent: map},
+      {file.parent!: map},
       languageVersion: sdk.languageVersion,
     );
     for (var library in embedderSdk.sdkLibraries) {
@@ -58,7 +58,7 @@
   }
 
   var librarySources = sdk.sdkLibraries.map((e) {
-    return sdk.mapDartUri(e.shortName);
+    return sdk.mapDartUri(e.shortName)!;
   }).toList();
 
   var analysisContext = AnalysisContextImpl(
@@ -82,7 +82,7 @@
   final Set<String> libraryUris = <String>{};
   final List<LinkInputLibrary> inputLibraries = [];
 
-  AllowedExperiments allowedExperiments;
+  late final AllowedExperiments allowedExperiments;
   Version languageVersion;
 
   _Builder(
@@ -91,7 +91,7 @@
     this.languageVersion,
     this.librarySources,
   ) {
-    allowedExperiments = _parseAllowedExperiments(allowedExperimentsJson);
+    allowedExperiments = parseAllowedExperiments(allowedExperimentsJson);
   }
 
   /// Build the linked bundle and return its bytes.
@@ -100,7 +100,9 @@
 
     var elementFactory = LinkedElementFactory(
       context,
-      AnalysisSessionImpl(null),
+      AnalysisSessionImpl(
+        _FakeAnalysisDriver(),
+      ),
       Reference.root(),
     );
 
@@ -139,12 +141,12 @@
 
     for (Directive directive in definingUnit.directives) {
       if (directive is NamespaceDirective) {
-        String libUri = directive.uri.stringValue;
-        Source libSource = context.sourceFactory.resolveUri(source, libUri);
+        String libUri = directive.uri.stringValue!;
+        Source libSource = context.sourceFactory.resolveUri(source, libUri)!;
         _addLibrary(libSource);
       } else if (directive is PartDirective) {
-        String partUri = directive.uri.stringValue;
-        Source partSource = context.sourceFactory.resolveUri(source, partUri);
+        String partUri = directive.uri.stringValue!;
+        Source partSource = context.sourceFactory.resolveUri(source, partUri)!;
         CompilationUnit partUnit = _parse(partSource);
         inputUnits.add(
           LinkInputUnit(partUri, partSource, false, partUnit),
@@ -203,6 +205,7 @@
       content: _getContent(source),
       featureSet: _featureSet(source.uri),
       throwIfDiagnostics: false,
+      path: source.fullName,
     );
 
     if (result.errors.isNotEmpty) {
@@ -223,16 +226,9 @@
 
     return result.unit;
   }
+}
 
-  static AllowedExperiments _parseAllowedExperiments(String content) {
-    if (content == null) {
-      return AllowedExperiments(
-        sdkDefaultExperiments: [],
-        sdkLibraryExperiments: {},
-        packageExperiments: {},
-      );
-    }
-
-    return parseAllowedExperiments(content);
-  }
+class _FakeAnalysisDriver implements AnalysisDriver {
+  @override
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 }
diff --git a/pkg/analyzer/lib/diagnostic/diagnostic.dart b/pkg/analyzer/lib/diagnostic/diagnostic.dart
index 43b099a..424135c 100644
--- a/pkg/analyzer/lib/diagnostic/diagnostic.dart
+++ b/pkg/analyzer/lib/diagnostic/diagnostic.dart
@@ -17,7 +17,7 @@
 
   /// A description of how to fix the problem, or `null` if there is no such
   /// description.
-  String get correctionMessage;
+  String? get correctionMessage;
 
   /// A message describing what is wrong and why.
   DiagnosticMessage get problemMessage;
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index 5f442af..a1b53cc 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -843,27 +843,32 @@
 
 /// The lazy initialized map from [ErrorCode.uniqueName] to the [ErrorCode]
 /// instance.
-/*late final*/ HashMap<String, ErrorCode> _uniqueNameToCodeMap;
+late final HashMap<String, ErrorCode> _uniqueNameToCodeMap =
+    _computeUniqueNameToCodeMap();
 
 /// Return the [ErrorCode] with the given [uniqueName], or `null` if not
 /// found.
-ErrorCode errorCodeByUniqueName(String uniqueName) {
-  if (_uniqueNameToCodeMap == null) {
-    _uniqueNameToCodeMap = HashMap<String, ErrorCode>();
-    for (ErrorCode errorCode in errorCodeValues) {
-      var uniqueName = errorCode.uniqueName;
-      assert(() {
-        if (_uniqueNameToCodeMap.containsKey(uniqueName)) {
-          throw StateError('Not unique: $uniqueName');
-        }
-        return true;
-      }());
-      _uniqueNameToCodeMap[uniqueName] = errorCode;
-    }
-  }
+ErrorCode? errorCodeByUniqueName(String uniqueName) {
   return _uniqueNameToCodeMap[uniqueName];
 }
 
+/// Return the map from [ErrorCode.uniqueName] to the [ErrorCode] instance
+/// for all [errorCodeValues].
+HashMap<String, ErrorCode> _computeUniqueNameToCodeMap() {
+  var result = HashMap<String, ErrorCode>();
+  for (ErrorCode errorCode in errorCodeValues) {
+    var uniqueName = errorCode.uniqueName;
+    assert(() {
+      if (result.containsKey(uniqueName)) {
+        throw StateError('Not unique: $uniqueName');
+      }
+      return true;
+    }());
+    result[uniqueName] = errorCode;
+  }
+  return result;
+}
+
 /// An error discovered during the analysis of some Dart code.
 ///
 /// See [AnalysisErrorListener].
@@ -898,15 +903,15 @@
   final ErrorCode errorCode;
 
   /// The message describing the problem.
-  DiagnosticMessage _problemMessage;
+  late final DiagnosticMessage _problemMessage;
 
   /// The context messages associated with the problem. This list will be empty
   /// if there are no context messages.
-  List<DiagnosticMessage> _contextMessages;
+  final List<DiagnosticMessage> _contextMessages;
 
   /// The correction to be displayed for this error, or `null` if there is no
   /// correction information for this error.
-  String _correction;
+  String? _correction;
 
   /// The source in which the error occurred, or `null` if unknown.
   final Source source;
@@ -917,31 +922,31 @@
   /// [arguments] will be used to complete the message and correction. If any
   /// [contextMessages] are provided, they will be recorded with the error.
   AnalysisError(this.source, int offset, int length, this.errorCode,
-      [List<Object> arguments,
-      List<DiagnosticMessage> contextMessages = const []]) {
+      [List<Object?>? arguments,
+      List<DiagnosticMessage> contextMessages = const []])
+      : _contextMessages = contextMessages {
     String message = formatList(errorCode.message, arguments);
-    String correctionTemplate = errorCode.correction;
+    String? correctionTemplate = errorCode.correction;
     if (correctionTemplate != null) {
       _correction = formatList(correctionTemplate, arguments);
     }
     _problemMessage = DiagnosticMessageImpl(
-        filePath: source?.fullName,
+        filePath: source.fullName,
         length: length,
         message: message,
         offset: offset);
-    _contextMessages = contextMessages;
   }
 
   /// Initialize a newly created analysis error with given values.
   AnalysisError.forValues(this.source, int offset, int length, this.errorCode,
       String message, this._correction,
-      {List<DiagnosticMessage> contextMessages = const []}) {
+      {List<DiagnosticMessage> contextMessages = const []})
+      : _contextMessages = contextMessages {
     _problemMessage = DiagnosticMessageImpl(
-        filePath: source?.fullName,
+        filePath: source.fullName,
         length: length,
         message: message,
         offset: offset);
-    _contextMessages = contextMessages;
   }
 
   /// Initialize a newly created analysis error. The error is associated with
@@ -951,18 +956,19 @@
   /// [contextMessages] are provided, they will be recorded with the error.
   AnalysisError.withNamedArguments(this.source, int offset, int length,
       this.errorCode, Map<String, dynamic> arguments,
-      {List<DiagnosticMessage> contextMessages = const []}) {
-    String messageText = applyArgumentsToTemplate(errorCode.message, arguments);
-    String correctionTemplate = errorCode.correction;
+      {List<DiagnosticMessage> contextMessages = const []})
+      : _contextMessages = contextMessages {
+    var messageText = applyArgumentsToTemplate(errorCode.message, arguments);
+    var correctionTemplate = errorCode.correction;
     if (correctionTemplate != null) {
       _correction = applyArgumentsToTemplate(correctionTemplate, arguments);
     }
     _problemMessage = DiagnosticMessageImpl(
-        filePath: source?.fullName,
-        length: length,
-        message: messageText,
-        offset: offset);
-    _contextMessages = contextMessages;
+      filePath: source.fullName,
+      length: length,
+      message: messageText,
+      offset: offset,
+    );
   }
 
   @override
@@ -971,16 +977,16 @@
   /// Return the template used to create the correction to be displayed for this
   /// error, or `null` if there is no correction information for this error. The
   /// correction should indicate how the user can fix the error.
-  String get correction => _correction;
+  String? get correction => _correction;
 
   @override
-  String get correctionMessage => _correction;
+  String? get correctionMessage => _correction;
 
   @override
   int get hashCode {
     int hashCode = offset;
-    hashCode ^= (message != null) ? message.hashCode : 0;
-    hashCode ^= (source != null) ? source.hashCode : 0;
+    hashCode ^= message.hashCode;
+    hashCode ^= source.hashCode;
     return hashCode;
   }
 
@@ -1043,7 +1049,7 @@
   @override
   String toString() {
     StringBuffer buffer = StringBuffer();
-    buffer.write((source != null) ? source.fullName : "<unknown source>");
+    buffer.write(source.fullName);
     buffer.write("(");
     buffer.write(offset);
     buffer.write("..");
diff --git a/pkg/analyzer/lib/error/listener.dart b/pkg/analyzer/lib/error/listener.dart
index e1ab6be..7de0ed7 100644
--- a/pkg/analyzer/lib/error/listener.dart
+++ b/pkg/analyzer/lib/error/listener.dart
@@ -48,37 +48,20 @@
   /// The error listener to which errors will be reported.
   final AnalysisErrorListener _errorListener;
 
-  /// The default source to be used when reporting errors.
-  final Source _defaultSource;
-
   /// Is `true` if the library being analyzed is non-nullable by default.
   final bool isNonNullableByDefault;
 
   /// The source to be used when reporting errors.
-  Source _source;
+  final Source _source;
 
   /// Initialize a newly created error reporter that will report errors to the
   /// given [_errorListener]. Errors will be reported against the
   /// [_defaultSource] unless another source is provided later.
-  ErrorReporter(this._errorListener, this._defaultSource,
-      {this.isNonNullableByDefault = false}) {
-    if (_errorListener == null) {
-      throw ArgumentError("An error listener must be provided");
-    } else if (_defaultSource == null) {
-      throw ArgumentError("A default source must be provided");
-    }
-    _source = _defaultSource;
-  }
+  ErrorReporter(this._errorListener, this._source,
+      {this.isNonNullableByDefault = false});
 
   Source get source => _source;
 
-  /// Set the source to be used when reporting errors to the given [source].
-  /// Setting the source to `null` will cause the default source to be used.
-  @Deprecated('Create separate reporters for separate files')
-  set source(Source source) {
-    _source = source ?? _defaultSource;
-  }
-
   /// Report the given [error].
   void reportError(AnalysisError error) {
     _errorListener.onError(error);
@@ -87,7 +70,7 @@
   /// Report an error with the given [errorCode] and [arguments]. The [element]
   /// is used to compute the location of the error.
   void reportErrorForElement(ErrorCode errorCode, Element element,
-      [List<Object> arguments]) {
+      [List<Object>? arguments]) {
     reportErrorForOffset(
         errorCode, element.nameOffset, element.nameLength, arguments);
   }
@@ -95,14 +78,14 @@
   /// Report a diagnostic with the given [code] and [arguments]. The
   /// location of the diagnostic will be the name of the [constructor].
   void reportErrorForName(ErrorCode code, ConstructorDeclaration constructor,
-      {List<Object> arguments}) {
+      {List<Object>? arguments}) {
     // TODO(brianwilkerson) Consider extending this method to take any
     //  declaration and compute the correct range for the name of that
     //  declaration. This might make it easier to be consistent.
     if (constructor.name != null) {
       var offset = constructor.returnType.offset;
       reportErrorForOffset(
-          code, offset, constructor.name.end - offset, arguments);
+          code, offset, constructor.name!.end - offset, arguments);
     } else {
       reportErrorForNode(code, constructor.returnType, arguments);
     }
@@ -111,14 +94,14 @@
   /// Report an error with the given [errorCode] and [arguments].
   /// The [node] is used to compute the location of the error.
   void reportErrorForNode(ErrorCode errorCode, AstNode node,
-      [List<Object> arguments]) {
+      [List<Object?>? arguments]) {
     reportErrorForOffset(errorCode, node.offset, node.length, arguments);
   }
 
   /// Report an error with the given [errorCode] and [arguments]. The location
   /// of the error is specified by the given [offset] and [length].
   void reportErrorForOffset(ErrorCode errorCode, int offset, int length,
-      [List<Object> arguments]) {
+      [List<Object?>? arguments]) {
     _convertElements(arguments);
     var messages = _convertTypeNames(arguments);
     _errorListener.onError(
@@ -128,14 +111,14 @@
   /// Report an error with the given [errorCode] and [arguments]. The location
   /// of the error is specified by the given [span].
   void reportErrorForSpan(ErrorCode errorCode, SourceSpan span,
-      [List<Object> arguments]) {
+      [List<Object?>? arguments]) {
     reportErrorForOffset(errorCode, span.start.offset, span.length, arguments);
   }
 
   /// Report an error with the given [errorCode] and [arguments]. The [token] is
   /// used to compute the location of the error.
   void reportErrorForToken(ErrorCode errorCode, Token token,
-      [List<Object> arguments]) {
+      [List<Object?>? arguments]) {
     reportErrorForOffset(errorCode, token.offset, token.length, arguments);
   }
 
@@ -163,7 +146,7 @@
   }
 
   /// Convert all [Element]s in the [arguments] into their display strings.
-  void _convertElements(List<Object> arguments) {
+  void _convertElements(List<Object?>? arguments) {
     if (arguments == null) {
       return;
     }
@@ -183,7 +166,7 @@
   /// types, unless there are two or more types with the same names, in which
   /// case the extended display names of the types will be used in order to
   /// clarify the message.
-  List<DiagnosticMessage> _convertTypeNames(List<Object> arguments) {
+  List<DiagnosticMessage> _convertTypeNames(List<Object?>? arguments) {
     var messages = <DiagnosticMessage>[];
     if (arguments == null) {
       return messages;
@@ -191,7 +174,7 @@
 
     Map<String, List<_TypeToConvert>> typeGroups = {};
     for (int i = 0; i < arguments.length; i++) {
-      Object argument = arguments[i];
+      var argument = arguments[i];
       if (argument is DartType) {
         String displayName = argument.getDisplayString(
           withNullability: isNonNullableByDefault,
@@ -212,29 +195,29 @@
         for (_TypeToConvert typeToConvert in typeGroup) {
           for (Element element in typeToConvert.allElements()) {
             Set<Element> elements =
-                nameToElementMap.putIfAbsent(element.name, () => <Element>{});
+                nameToElementMap.putIfAbsent(element.name!, () => <Element>{});
             elements.add(element);
           }
         }
         for (_TypeToConvert typeToConvert in typeGroup) {
           // TODO(brianwilkerson) When clients do a better job of displaying
           // context messages, remove the extra text added to the buffer.
-          StringBuffer buffer;
+          StringBuffer? buffer;
           for (Element element in typeToConvert.allElements()) {
-            String name = element.name;
-            if (nameToElementMap[name].length > 1) {
+            String name = element.name!;
+            if (nameToElementMap[name]!.length > 1) {
               if (buffer == null) {
                 buffer = StringBuffer();
                 buffer.write('where ');
               } else {
                 buffer.write(', ');
               }
-              buffer.write('$name is defined in ${element.source.fullName}');
+              buffer.write('$name is defined in ${element.source!.fullName}');
             }
             messages.add(DiagnosticMessageImpl(
-                filePath: element.source.fullName,
+                filePath: element.source!.fullName,
                 length: element.nameLength,
-                message: '$name is defined in ${element.source.fullName}',
+                message: '$name is defined in ${element.source!.fullName}',
                 offset: element.nameOffset));
           }
 
@@ -254,14 +237,14 @@
 /// An error listener that will record the errors that are reported to it in a
 /// way that is appropriate for caching those errors within an analysis context.
 class RecordingErrorListener implements AnalysisErrorListener {
-  Set<AnalysisError> _errors;
+  Set<AnalysisError>? _errors;
 
   /// Return the errors collected by the listener.
   List<AnalysisError> get errors {
     if (_errors == null) {
       return const <AnalysisError>[];
     }
-    return _errors.toList();
+    return _errors!.toList();
   }
 
   /// Return the errors collected by the listener for the given [source].
@@ -269,13 +252,12 @@
     if (_errors == null) {
       return const <AnalysisError>[];
     }
-    return _errors.where((error) => error.source == source).toList();
+    return _errors!.where((error) => error.source == source).toList();
   }
 
   @override
   void onError(AnalysisError error) {
-    _errors ??= HashSet<AnalysisError>();
-    _errors.add(error);
+    (_errors ??= HashSet<AnalysisError>()).add(error);
   }
 }
 
@@ -294,7 +276,7 @@
   final DartType type;
   final String displayName;
 
-  List<Element> _allElements;
+  List<Element>? _allElements;
 
   _TypeToConvert(this.index, this.type, this.displayName);
 
@@ -318,10 +300,11 @@
       }
 
       addElementsFrom(type);
-      _allElements = elements
-          .where((element) => element.name != null && element.name.isNotEmpty)
-          .toList();
+      _allElements = elements.where((element) {
+        var name = element.name;
+        return name != null && name.isNotEmpty;
+      }).toList();
     }
-    return _allElements;
+    return _allElements!;
   }
 }
diff --git a/pkg/analyzer/lib/exception/exception.dart b/pkg/analyzer/lib/exception/exception.dart
index c666fbae..d23c830 100644
--- a/pkg/analyzer/lib/exception/exception.dart
+++ b/pkg/analyzer/lib/exception/exception.dart
@@ -9,7 +9,7 @@
 
   /// The exception that caused this exception, or `null` if this exception was
   /// not caused by another exception.
-  final CaughtException cause;
+  final CaughtException? cause;
 
   /// Initialize a newly created exception to have the given [message] and
   /// [cause].
@@ -22,7 +22,7 @@
     buffer.writeln(message);
     if (cause != null) {
       buffer.write('Caused by ');
-      cause._writeOn(buffer);
+      cause!._writeOn(buffer);
     }
     return buffer.toString();
   }
@@ -34,7 +34,7 @@
   final Object exception;
 
   /// The message describing where/how/why this was caught.
-  final String message;
+  final String? message;
 
   /// The stack trace associated with the exception.
   StackTrace stackTrace;
@@ -46,9 +46,7 @@
 
   /// Initialize a newly created caught exception to have the given [exception],
   /// [stackTrace], and [message].
-  CaughtException.withMessage(
-      this.message, this.exception, StackTrace stackTrace)
-      : stackTrace = stackTrace ?? StackTrace.current;
+  CaughtException.withMessage(this.message, this.exception, this.stackTrace);
 
   /// Recursively unwrap this [CaughtException] if it itself contains a
   /// [CaughtException].
@@ -74,22 +72,18 @@
     if (message != null) {
       buffer.writeln(message);
     }
+    var exception = this.exception;
     if (exception is AnalysisException) {
-      AnalysisException analysisException = exception;
-      buffer.writeln(analysisException.message);
-      if (stackTrace != null) {
-        buffer.writeln(stackTrace.toString());
-      }
-      CaughtException cause = analysisException.cause;
+      buffer.writeln(exception.message);
+      buffer.writeln(stackTrace.toString());
+      CaughtException? cause = exception.cause;
       if (cause != null) {
         buffer.write('Caused by ');
         cause._writeOn(buffer);
       }
     } else {
       buffer.writeln(exception.toString());
-      if (stackTrace != null) {
-        buffer.writeln(stackTrace.toString());
-      }
+      buffer.writeln(stackTrace.toString());
     }
   }
 }
@@ -105,5 +99,5 @@
   /// Create a [SilentException] to wrap a [CaughtException], adding a
   /// [message].
   SilentException.wrapInMessage(String message, CaughtException exception)
-      : this(message, exception, null);
+      : this(message, exception, StackTrace.current);
 }
diff --git a/pkg/analyzer/lib/file_system/file_system.dart b/pkg/analyzer/lib/file_system/file_system.dart
index 7f6e20e..f68ca16 100644
--- a/pkg/analyzer/lib/file_system/file_system.dart
+++ b/pkg/analyzer/lib/file_system/file_system.dart
@@ -25,7 +25,7 @@
   File copyTo(Folder parentFolder);
 
   /// Create a new [Source] instance that serves this file.
-  Source createSource([Uri uri]);
+  Source createSource([Uri? uri]);
 
   /// Synchronously read the entire file contents as a list of bytes.
   /// Throws a [FileSystemException] if the operation fails.
@@ -43,7 +43,7 @@
   /// If [newPath] identifies an existing file, that file is replaced.
   /// If [newPath] identifies an existing resource the operation might fail and
   /// an exception is thrown.
-  File renameSync(String /*!*/ newPath);
+  File renameSync(String newPath);
 
   /// Synchronously write the given [bytes] to the file. The new content will
   /// replace any existing content.
@@ -81,12 +81,12 @@
   ///
   /// However, regardless of whether [path] is relative or absolute, normalize
   /// it by removing path components of the form '.' or '..'.
-  String canonicalizePath(String /*!*/ path);
+  String canonicalizePath(String path);
 
   /// Return `true` if the [path] references a resource in this folder.
   ///
   /// The [path] must be absolute and normalized.
-  bool contains(String /*!*/ path);
+  bool contains(String path);
 
   @override
   Folder copyTo(Folder parentFolder);
@@ -96,19 +96,19 @@
 
   /// Return an existing child [Resource] with the given [relPath].
   /// Return a not existing [File] if no such child exist.
-  Resource getChild(String /*!*/ relPath);
+  Resource getChild(String relPath);
 
   /// Return a [File] representing a child [Resource] with the given
   /// [relPath].  This call does not check whether a file with the given name
   /// exists on the filesystem - client must call the [File]'s `exists` getter
   /// to determine whether the folder actually exists.
-  File getChildAssumingFile(String /*!*/ relPath);
+  File getChildAssumingFile(String relPath);
 
   /// Return a [Folder] representing a child [Resource] with the given
   /// [relPath].  This call does not check whether a folder with the given name
   /// exists on the filesystem--client must call the [Folder]'s `exists` getter
   /// to determine whether the folder actually exists.
-  Folder getChildAssumingFolder(String /*!*/ relPath);
+  Folder getChildAssumingFolder(String relPath);
 
   /// Return a list of existing direct children [Resource]s (folders and files)
   /// in this folder, in no particular order.
@@ -124,7 +124,7 @@
 
   /// Return the [Folder] that contains this resource, or `null` if this
   /// resource is a root folder.
-  Folder get parent;
+  Folder? get parent;
 
   /// Return the full path to this resource.
   String get path;
@@ -145,7 +145,7 @@
   /// Existing files and folders will be overwritten.
   ///
   /// Return the resource corresponding to this resource in the parent folder.
-  Resource copyTo(Folder /*!*/ parentFolder);
+  Resource copyTo(Folder parentFolder);
 
   /// Synchronously deletes this resource and its children.
   ///
@@ -156,7 +156,7 @@
   /// this folder.
   ///
   /// The [path] must be absolute and normalized.
-  bool isOrContains(String /*!*/ path);
+  bool isOrContains(String path);
 
   /// Return a resource that refers to the same resource as this resource, but
   /// whose path does not contain any symbolic links.
@@ -177,25 +177,25 @@
   /// The [path] must be absolute and normalized.
   ///
   /// A file may or may not exist at this location.
-  File getFile(String /*!*/ path);
+  File getFile(String path);
 
   /// Return a [Folder] that corresponds to the given [path].
   ///
   /// The [path] must be absolute and normalized.
   ///
   /// A folder may or may not exist at this location.
-  Folder getFolder(String /*!*/ path);
+  Folder getFolder(String path);
 
   /// Complete with a list of modification times for the given [sources].
   ///
   /// If the file of a source is not managed by this provider, return `null`.
   /// If the file a source does not exist, return `-1`.
-  Future<List<int>> getModificationTimes(List<Source> sources);
+  Future<List<int?>> getModificationTimes(List<Source> sources);
 
   /// Return the [Resource] that corresponds to the given [path].
   ///
   /// The [path] must be absolute and normalized.
-  Resource getResource(String /*!*/ path);
+  Resource getResource(String path);
 
   /// Return the folder in which the plugin with the given [pluginId] can store
   /// state that will persist across sessions. The folder returned for a given
@@ -203,5 +203,5 @@
   /// need to be concerned with file name collisions with other plugins,
   /// assuming that the plugin ids are unique. The plugin ids must be valid
   /// folder names.
-  Folder getStateLocation(String pluginId);
+  Folder? getStateLocation(String pluginId);
 }
diff --git a/pkg/analyzer/lib/file_system/memory_file_system.dart b/pkg/analyzer/lib/file_system/memory_file_system.dart
index caaeae1..38f3a43 100644
--- a/pkg/analyzer/lib/file_system/memory_file_system.dart
+++ b/pkg/analyzer/lib/file_system/memory_file_system.dart
@@ -28,7 +28,7 @@
   final pathos.Context _pathContext;
 
   MemoryResourceProvider(
-      {pathos.Context context, @deprecated bool isWindows = false})
+      {pathos.Context? context, @deprecated bool isWindows = false})
       : _pathContext = context ??= pathos.style == pathos.Style.windows
             // On Windows, ensure that the current drive matches
             // the drive inserted by MemoryResourceProvider.convertPath
@@ -44,7 +44,6 @@
   /// This is a utility method for testing; paths passed in to other methods in
   /// this class are never converted automatically.
   String convertPath(String path) {
-    assert(path != null);
     if (pathContext.style == pathos.windows.style) {
       if (path.startsWith(pathos.posix.separator)) {
         path = r'C:' + path;
@@ -67,7 +66,7 @@
   /// and recursively delete nested files and folders.
   void deleteFolder(String path) {
     _checkFolderAtPath(path);
-    _MemoryFolder folder = _pathToResource[path];
+    var folder = _pathToResource[path] as _MemoryFolder;
     for (Resource child in folder.getChildren()) {
       if (child is File) {
         deleteFile(child.path);
@@ -85,14 +84,12 @@
 
   @override
   File getFile(String path) {
-    assert(path != null);
     _ensureAbsoluteAndNormalized(path);
     return _MemoryFile(this, path);
   }
 
   @override
   Folder getFolder(String path) {
-    assert(path != null);
     _ensureAbsoluteAndNormalized(path);
     return _MemoryFolder(this, path);
   }
@@ -107,7 +104,6 @@
 
   @override
   Resource getResource(String path) {
-    assert(path != null);
     _ensureAbsoluteAndNormalized(path);
     return _pathToResource[path] ?? _MemoryFile(this, path);
   }
@@ -119,7 +115,6 @@
   }
 
   void modifyFile(String path, String content) {
-    assert(content != null);
     _checkFileAtPath(path);
     _pathToBytes[path] = utf8.encode(content) as Uint8List;
     _pathToTimestamp[path] = nextStamp++;
@@ -138,7 +133,7 @@
     return link;
   }
 
-  File newFile(String path, String content, [int stamp]) {
+  File newFile(String path, String content, [int? stamp]) {
     _ensureAbsoluteAndNormalized(path);
     _MemoryFile file = _newFile(path);
     _pathToBytes[path] = utf8.encode(content) as Uint8List;
@@ -147,7 +142,7 @@
     return file;
   }
 
-  File newFileWithBytes(String path, List<int> bytes, [int stamp]) {
+  File newFileWithBytes(String path, List<int> bytes, [int? stamp]) {
     _ensureAbsoluteAndNormalized(path);
     _MemoryFile file = _newFile(path);
     _pathToBytes[path] = Uint8List.fromList(bytes);
@@ -161,7 +156,7 @@
     if (!pathContext.isAbsolute(path)) {
       throw ArgumentError("Path must be absolute : $path");
     }
-    _MemoryResource resource = _pathToResource[path];
+    var resource = _pathToResource[path];
     if (resource == null) {
       String parentPath = pathContext.dirname(path);
       if (parentPath != path) {
@@ -189,7 +184,7 @@
     _pathToLinkedPath[path] = target;
   }
 
-  File updateFile(String path, String content, [int stamp]) {
+  File updateFile(String path, String content, [int? stamp]) {
     _ensureAbsoluteAndNormalized(path);
     newFolder(pathContext.dirname(path));
     _MemoryFile file = _MemoryFile(this, path);
@@ -208,10 +203,9 @@
   }
 
   void _checkFileAtPath(String path) {
-    assert(path != null);
     // TODO(brianwilkerson) Consider throwing a FileSystemException rather than
     // an ArgumentError.
-    _MemoryResource resource = _pathToResource[path];
+    var resource = _pathToResource[path];
     if (resource is! _MemoryFile) {
       if (resource == null) {
         throw ArgumentError('File expected at "$path" but does not exist');
@@ -222,10 +216,9 @@
   }
 
   void _checkFolderAtPath(String path) {
-    assert(path != null);
     // TODO(brianwilkerson) Consider throwing a FileSystemException rather than
     // an ArgumentError.
-    _MemoryResource resource = _pathToResource[path];
+    var resource = _pathToResource[path];
     if (resource is! _MemoryFolder) {
       throw ArgumentError(
           'Folder expected at "$path" but ${resource.runtimeType} found');
@@ -235,7 +228,6 @@
   /// The file system abstraction supports only absolute and normalized paths.
   /// This method is used to validate any input paths to prevent errors later.
   void _ensureAbsoluteAndNormalized(String path) {
-    assert(path != null);
     if (!pathContext.isAbsolute(path)) {
       throw ArgumentError("Path must be absolute : $path");
     }
@@ -246,9 +238,8 @@
 
   /// Create a new [_MemoryFile] without any content.
   _MemoryFile _newFile(String path) {
-    assert(path != null);
     String folderPath = pathContext.dirname(path);
-    _MemoryResource folder = _pathToResource[folderPath];
+    var folder = _pathToResource[folderPath];
     if (folder == null) {
       newFolder(folderPath);
     } else if (folder is! Folder) {
@@ -260,7 +251,6 @@
   }
 
   void _notifyWatchers(String path, ChangeType changeType) {
-    assert(path != null);
     _pathToWatchers.forEach((String watcherPath,
         List<StreamController<WatchEvent>> streamControllers) {
       if (watcherPath == path || pathContext.isWithin(watcherPath, path)) {
@@ -273,20 +263,29 @@
   }
 
   _MemoryFile _renameFileSync(_MemoryFile file, String newPath) {
-    assert(newPath != null);
     String path = file.path;
     if (newPath == path) {
       return file;
     }
-    _MemoryResource existingNewResource = _pathToResource[newPath];
+    var existingNewResource = _pathToResource[newPath];
     if (existingNewResource is _MemoryFolder) {
       throw FileSystemException(
           path, 'Could not be renamed: $newPath is a folder.');
     }
+
     _MemoryFile newFile = _newFile(newPath);
     _pathToResource.remove(path);
-    _pathToBytes[newPath] = _pathToBytes.remove(path);
-    _pathToTimestamp[newPath] = _pathToTimestamp.remove(path);
+
+    var oldBytes = _pathToBytes.remove(path);
+    if (oldBytes != null) {
+      _pathToBytes[newPath] = oldBytes;
+    }
+
+    var oldTimestamp = _pathToTimestamp.remove(path);
+    if (oldTimestamp != null) {
+      _pathToTimestamp[newPath] = oldTimestamp;
+    }
+
     if (existingNewResource != null) {
       _notifyWatchers(newPath, ChangeType.REMOVE);
     }
@@ -296,7 +295,6 @@
   }
 
   String _resolveLinks(String path) {
-    assert(path != null);
     var linkTarget = _pathToLinkedPath[path];
     if (linkTarget != null) {
       return linkTarget;
@@ -350,7 +348,7 @@
 
   @override
   int get modificationStamp {
-    int stamp = provider._pathToTimestamp[path];
+    var stamp = provider._pathToTimestamp[path];
     if (stamp == null) {
       throw FileSystemException(path, "File does not exist");
     }
@@ -363,7 +361,7 @@
   }
 
   @override
-  Source createSource([Uri uri]) {
+  Source createSource([Uri? uri]) {
     throw FileSystemException(path, 'File could not be read');
   }
 
@@ -427,7 +425,7 @@
   @override
   int get modificationStamp {
     var canonicalPath = provider._resolveLinks(path);
-    int stamp = provider._pathToTimestamp[canonicalPath];
+    var stamp = provider._pathToTimestamp[canonicalPath];
     if (stamp == null) {
       throw FileSystemException(path, 'File "$path" does not exist.');
     }
@@ -436,7 +434,6 @@
 
   @override
   File copyTo(Folder parentFolder) {
-    assert(parentFolder != null);
     parentFolder.create();
     File destination = parentFolder.getChildAssumingFile(shortName);
     destination.writeAsBytesSync(readAsBytesSync());
@@ -444,7 +441,7 @@
   }
 
   @override
-  Source createSource([Uri uri]) {
+  Source createSource([Uri? uri]) {
     uri ??= provider.pathContext.toUri(path);
     return FileSource(this, uri);
   }
@@ -462,7 +459,7 @@
   @override
   Uint8List readAsBytesSync() {
     var canonicalPath = provider._resolveLinks(path);
-    Uint8List content = provider._pathToBytes[canonicalPath];
+    var content = provider._pathToBytes[canonicalPath];
     if (content == null) {
       throw FileSystemException(path, 'File "$path" does not exist.');
     }
@@ -472,7 +469,7 @@
   @override
   String readAsStringSync() {
     var canonicalPath = provider._resolveLinks(path);
-    Uint8List content = provider._pathToBytes[canonicalPath];
+    var content = provider._pathToBytes[canonicalPath];
     if (content == null) {
       throw FileSystemException(path, 'File "$path" does not exist.');
     }
@@ -517,7 +514,6 @@
 
   @override
   String canonicalizePath(String relPath) {
-    assert(relPath != null);
     relPath = provider.pathContext.normalize(relPath);
     String childPath = provider.pathContext.join(path, relPath);
     childPath = provider.pathContext.normalize(childPath);
@@ -526,7 +522,6 @@
 
   @override
   bool contains(String path) {
-    assert(path != null);
     return provider.pathContext.isWithin(this.path, path);
   }
 
@@ -560,7 +555,7 @@
   @override
   _MemoryFile getChildAssumingFile(String relPath) {
     String childPath = canonicalizePath(relPath);
-    _MemoryResource resource = provider._pathToResource[childPath];
+    var resource = provider._pathToResource[childPath];
     if (resource is _MemoryFile) {
       return resource;
     }
@@ -570,7 +565,7 @@
   @override
   _MemoryFolder getChildAssumingFolder(String relPath) {
     String childPath = canonicalizePath(relPath);
-    _MemoryResource resource = provider._pathToResource[childPath];
+    var resource = provider._pathToResource[childPath];
     if (resource is _MemoryFolder) {
       return resource;
     }
@@ -625,10 +620,10 @@
     if (!provider._pathToWatchers.containsKey(path)) {
       provider._pathToWatchers[path] = <StreamController<WatchEvent>>[];
     }
-    provider._pathToWatchers[path].add(streamController);
+    provider._pathToWatchers[path]!.add(streamController);
     streamController.done.then((_) {
-      provider._pathToWatchers[path].remove(streamController);
-      if (provider._pathToWatchers[path].isEmpty) {
+      provider._pathToWatchers[path]!.remove(streamController);
+      if (provider._pathToWatchers[path]!.isEmpty) {
         provider._pathToWatchers.remove(path);
       }
     });
@@ -639,7 +634,7 @@
   int get hashCode => path.hashCode;
 
   @override
-  Folder get parent {
+  Folder? get parent {
     String parentPath = provider.pathContext.dirname(path);
     if (parentPath == path) {
       return null;
diff --git a/pkg/analyzer/lib/file_system/overlay_file_system.dart b/pkg/analyzer/lib/file_system/overlay_file_system.dart
index 35dde56..3e09dc3 100644
--- a/pkg/analyzer/lib/file_system/overlay_file_system.dart
+++ b/pkg/analyzer/lib/file_system/overlay_file_system.dart
@@ -9,7 +9,6 @@
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/source/source_resource.dart';
-import 'package:meta/meta.dart';
 import 'package:path/path.dart' as pathos;
 import 'package:watcher/watcher.dart';
 
@@ -67,8 +66,10 @@
   }
 
   @override
-  Folder getStateLocation(String pluginId) =>
-      _OverlayFolder(this, baseProvider.getStateLocation(pluginId));
+  Folder? getStateLocation(String pluginId) {
+    var location = baseProvider.getStateLocation(pluginId);
+    return location != null ? _OverlayFolder(this, location) : null;
+  }
 
   /// Return `true` if there is an overlay associated with the file at the given
   /// [path].
@@ -87,15 +88,7 @@
   /// to have the given [content] and [modificationStamp] even if the file is
   /// modified in the base resource provider.
   void setOverlay(String path,
-      {@required String content, @required int modificationStamp}) {
-    if (content == null) {
-      throw ArgumentError(
-          'OverlayResourceProvider.setOverlay: content cannot be null');
-    } else if (modificationStamp == null) {
-      throw ArgumentError(
-          'OverlayResourceProvider.setOverlay: modificationStamp cannot be '
-          'null');
-    }
+      {required String content, required int modificationStamp}) {
     _overlayContent[path] = content;
     _overlayModificationStamps[path] = modificationStamp;
   }
@@ -104,20 +97,21 @@
   /// file with the [newPath].
   void _copyOverlay(String oldPath, String newPath) {
     if (hasOverlay(oldPath)) {
-      _overlayContent[newPath] = _overlayContent[oldPath];
-      _overlayModificationStamps[newPath] = _overlayModificationStamps[oldPath];
+      _overlayContent[newPath] = _overlayContent[oldPath]!;
+      _overlayModificationStamps[newPath] =
+          _overlayModificationStamps[oldPath]!;
     }
   }
 
   /// Return the content of the overlay of the file at the given [path], or
   /// `null` if there is no overlay for the specified file.
-  String _getOverlayContent(String path) {
+  String? _getOverlayContent(String path) {
     return _overlayContent[path];
   }
 
   /// Return the modification stamp of the overlay of the file at the given
   /// [path], or `null` if there is no overlay for the specified file.
-  int _getOverlayModificationStamp(String path) {
+  int? _getOverlayModificationStamp(String path) {
     return _overlayModificationStamps[path];
   }
 
@@ -147,7 +141,7 @@
 
   @override
   int get lengthSync {
-    String content = provider._getOverlayContent(path);
+    String? content = provider._getOverlayContent(path);
     if (content != null) {
       return content.length;
     }
@@ -156,7 +150,7 @@
 
   @override
   int get modificationStamp {
-    int stamp = provider._getOverlayModificationStamp(path);
+    int? stamp = provider._getOverlayModificationStamp(path);
     if (stamp != null) {
       return stamp;
     }
@@ -182,7 +176,7 @@
   }
 
   @override
-  Source createSource([Uri uri]) =>
+  Source createSource([Uri? uri]) =>
       FileSource(this, uri ?? provider.pathContext.toUri(path));
 
   @override
@@ -196,8 +190,8 @@
   }
 
   @override
-  Uint8List readAsBytesSync() {
-    String content = provider._getOverlayContent(path);
+  List<int> readAsBytesSync() {
+    String? content = provider._getOverlayContent(path);
     if (content != null) {
       return utf8.encode(content) as Uint8List;
     }
@@ -206,7 +200,7 @@
 
   @override
   String readAsStringSync() {
-    String content = provider._getOverlayContent(path);
+    String? content = provider._getOverlayContent(path);
     if (content != null) {
       return content;
     }
@@ -217,9 +211,11 @@
   File renameSync(String newPath) {
     File newFile = _file.renameSync(newPath);
     if (provider.hasOverlay(path)) {
-      provider.setOverlay(newPath,
-          content: provider._getOverlayContent(path),
-          modificationStamp: provider._getOverlayModificationStamp(path));
+      provider.setOverlay(
+        newPath,
+        content: provider._getOverlayContent(path)!,
+        modificationStamp: provider._getOverlayModificationStamp(path)!,
+      );
       provider.removeOverlay(path);
     }
     return _OverlayFile(provider, newFile);
@@ -353,8 +349,8 @@
   int get hashCode => path.hashCode;
 
   @override
-  Folder get parent {
-    Folder parent = _resource.parent;
+  Folder? get parent {
+    Folder? parent = _resource.parent;
     if (parent == null) {
       return null;
     }
diff --git a/pkg/analyzer/lib/file_system/physical_file_system.dart b/pkg/analyzer/lib/file_system/physical_file_system.dart
index 9561ff6..4483f48c 100644
--- a/pkg/analyzer/lib/file_system/physical_file_system.dart
+++ b/pkg/analyzer/lib/file_system/physical_file_system.dart
@@ -20,10 +20,10 @@
 /// Generally this is ~/.dartServer. It can be overridden via the
 /// ANALYZER_STATE_LOCATION_OVERRIDE environment variable, in which case this
 /// method will return the contents of that environment variable.
-String _getStandardStateLocation() {
+String? _getStandardStateLocation() {
   final Map<String, String> env = io.Platform.environment;
   if (env.containsKey('ANALYZER_STATE_LOCATION_OVERRIDE')) {
-    return env['ANALYZER_STATE_LOCATION_OVERRIDE'];
+    return env['ANALYZER_STATE_LOCATION_OVERRIDE']!;
   }
 
   final home = io.Platform.isWindows ? env['LOCALAPPDATA'] : env['HOME'];
@@ -38,7 +38,7 @@
 ///
 /// If any exception happens, the file is considered as a not existing and
 /// `-1` is its modification time.
-List<int> _pathsToTimes(List<String> paths) {
+List<int?> _pathsToTimes(List<String?> paths) {
   return paths.map((path) {
     if (path != null) {
       try {
@@ -58,9 +58,9 @@
   static final PhysicalResourceProvider INSTANCE = PhysicalResourceProvider();
 
   /// The path to the base folder where state is stored.
-  final String _stateLocation;
+  final String? _stateLocation;
 
-  PhysicalResourceProvider({String stateLocation})
+  PhysicalResourceProvider({String? stateLocation})
       : _stateLocation = stateLocation ?? _getStandardStateLocation();
 
   @override
@@ -79,7 +79,7 @@
   }
 
   @override
-  Future<List<int>> getModificationTimes(List<Source> sources) async {
+  Future<List<int?>> getModificationTimes(List<Source> sources) async {
     List<String> paths = sources.map((source) => source.fullName).toList();
     return _pathsToTimes(paths);
   }
@@ -95,9 +95,9 @@
   }
 
   @override
-  Folder getStateLocation(String pluginId) {
+  Folder? getStateLocation(String pluginId) {
     if (_stateLocation != null) {
-      io.Directory directory = io.Directory(join(_stateLocation, pluginId));
+      io.Directory directory = io.Directory(join(_stateLocation!, pluginId));
       directory.createSync(recursive: true);
       return _PhysicalFolder(directory);
     }
@@ -131,7 +131,7 @@
     try {
       return _file.lengthSync();
     } on io.FileSystemException catch (exception) {
-      throw FileSystemException(exception.path, exception.message);
+      throw _wrapException(exception);
     }
   }
 
@@ -140,7 +140,7 @@
     try {
       return _file.lastModifiedSync().millisecondsSinceEpoch;
     } on io.FileSystemException catch (exception) {
-      throw FileSystemException(exception.path, exception.message);
+      throw _wrapException(exception);
     }
   }
 
@@ -156,7 +156,7 @@
   }
 
   @override
-  Source createSource([Uri uri]) {
+  Source createSource([Uri? uri]) {
     return FileSource(this, uri ?? pathContext.toUri(path));
   }
 
@@ -171,7 +171,7 @@
     try {
       return _file.readAsBytesSync();
     } on io.FileSystemException catch (exception) {
-      throw FileSystemException(exception.path, exception.message);
+      throw _wrapException(exception);
     }
   }
 
@@ -181,7 +181,7 @@
     try {
       return _file.readAsStringSync();
     } on io.FileSystemException catch (exception) {
-      throw FileSystemException(exception.path, exception.message);
+      throw _wrapException(exception);
     }
   }
 
@@ -190,7 +190,7 @@
     try {
       return _PhysicalFile(_file.renameSync(newPath));
     } on io.FileSystemException catch (exception) {
-      throw FileSystemException(exception.path, exception.message);
+      throw _wrapException(exception);
     }
   }
 
@@ -199,7 +199,7 @@
     try {
       return _PhysicalFile(io.File(_file.resolveSymbolicLinksSync()));
     } on io.FileSystemException catch (exception) {
-      throw FileSystemException(exception.path, exception.message);
+      throw _wrapException(exception);
     }
   }
 
@@ -211,7 +211,7 @@
     try {
       _file.writeAsBytesSync(bytes);
     } on io.FileSystemException catch (exception) {
-      throw FileSystemException(exception.path, exception.message);
+      throw _wrapException(exception);
     }
   }
 
@@ -220,7 +220,7 @@
     try {
       _file.writeAsStringSync(content);
     } on io.FileSystemException catch (exception) {
-      throw FileSystemException(exception.path, exception.message);
+      throw _wrapException(exception);
     }
   }
 }
@@ -305,7 +305,7 @@
       }
       return children;
     } on io.FileSystemException catch (exception) {
-      throw FileSystemException(exception.path, exception.message);
+      throw _wrapException(exception);
     }
   }
 
@@ -323,7 +323,7 @@
       return _PhysicalFolder(
           io.Directory(_directory.resolveSymbolicLinksSync()));
     } on io.FileSystemException catch (exception) {
-      throw FileSystemException(exception.path, exception.message);
+      throw _wrapException(exception);
     }
   }
 
@@ -350,7 +350,7 @@
   int get hashCode => path.hashCode;
 
   @override
-  Folder get parent {
+  Folder? get parent {
     String parentPath = pathContext.dirname(path);
     if (parentPath == path) {
       return null;
@@ -383,7 +383,7 @@
     try {
       _entry.deleteSync(recursive: true);
     } on io.FileSystemException catch (exception) {
-      throw FileSystemException(exception.path, exception.message);
+      throw _wrapException(exception);
     }
   }
 
@@ -414,4 +414,8 @@
       }
     }
   }
+
+  FileSystemException _wrapException(io.FileSystemException e) {
+    return FileSystemException(e.path ?? path, e.message);
+  }
 }
diff --git a/pkg/analyzer/lib/instrumentation/file_instrumentation.dart b/pkg/analyzer/lib/instrumentation/file_instrumentation.dart
index 7985cd2..745d6c30 100644
--- a/pkg/analyzer/lib/instrumentation/file_instrumentation.dart
+++ b/pkg/analyzer/lib/instrumentation/file_instrumentation.dart
@@ -10,7 +10,7 @@
 /// source or in-memory source etc.)
 class FileInstrumentationLogger implements InstrumentationLogger {
   final String filePath;
-  IOSink _sink;
+  late final IOSink _sink;
 
   FileInstrumentationLogger(this.filePath) {
     File file = File(filePath);
@@ -25,6 +25,5 @@
   @override
   Future shutdown() async {
     await _sink.close();
-    _sink = null;
   }
 }
diff --git a/pkg/analyzer/lib/instrumentation/log_adapter.dart b/pkg/analyzer/lib/instrumentation/log_adapter.dart
index 48dea7d..c3f3ad6 100644
--- a/pkg/analyzer/lib/instrumentation/log_adapter.dart
+++ b/pkg/analyzer/lib/instrumentation/log_adapter.dart
@@ -25,7 +25,7 @@
   static const String TAG_WATCH_EVENT = 'Watch';
 
   /// A logger used to log instrumentation in string format.
-  final InstrumentationLogger _instrumentationLogger;
+  final InstrumentationLogger? _instrumentationLogger;
 
   /// Initialize a newly created instrumentation service to communicate with the
   /// given [_instrumentationLogger].
@@ -38,13 +38,15 @@
   void logError(String message) => _log(TAG_ERROR, message);
 
   @override
-  void logException(dynamic exception,
-      [StackTrace stackTrace,
-      List<InstrumentationServiceAttachment> attachments]) {
+  void logException(
+    dynamic exception, [
+    StackTrace? stackTrace,
+    List<InstrumentationServiceAttachment>? attachments,
+  ]) {
     if (_instrumentationLogger != null) {
       String message = _toString(exception);
       String trace = _toString(stackTrace);
-      _instrumentationLogger.log(_join([TAG_EXCEPTION, message, trace]));
+      _instrumentationLogger!.log(_join([TAG_EXCEPTION, message, trace]));
     }
   }
 
@@ -53,14 +55,14 @@
       _log(TAG_INFO, message + (exception == null ? "" : exception.toString()));
 
   @override
-  void logLogEntry(String level, DateTime time, String message,
+  void logLogEntry(String level, DateTime? time, String message,
       Object exception, StackTrace stackTrace) {
     if (_instrumentationLogger != null) {
       String timeStamp =
           time == null ? 'null' : time.millisecondsSinceEpoch.toString();
       String exceptionText = exception.toString();
       String stackTraceText = stackTrace.toString();
-      _instrumentationLogger.log(_join([
+      _instrumentationLogger!.log(_join([
         TAG_LOG_ENTRY,
         level,
         timeStamp,
@@ -86,13 +88,13 @@
         stackTrace
       ];
       plugin.addToFields(fields);
-      _instrumentationLogger.log(_join(fields));
+      _instrumentationLogger!.log(_join(fields));
     }
   }
 
   @override
   void logPluginException(
-      PluginData plugin, dynamic exception, StackTrace stackTrace) {
+      PluginData plugin, dynamic exception, StackTrace? stackTrace) {
     if (_instrumentationLogger != null) {
       List<String> fields = <String>[
         TAG_PLUGIN_EXCEPTION,
@@ -100,14 +102,14 @@
         _toString(stackTrace)
       ];
       plugin.addToFields(fields);
-      _instrumentationLogger.log(_join(fields));
+      _instrumentationLogger!.log(_join(fields));
     }
   }
 
   @override
   void logPluginNotification(String pluginId, String notification) {
     if (_instrumentationLogger != null) {
-      _instrumentationLogger.log(
+      _instrumentationLogger!.log(
           _join([TAG_PLUGIN_NOTIFICATION, notification, pluginId, '', '']));
     }
   }
@@ -115,7 +117,7 @@
   @override
   void logPluginRequest(String pluginId, String request) {
     if (_instrumentationLogger != null) {
-      _instrumentationLogger
+      _instrumentationLogger!
           .log(_join([TAG_PLUGIN_REQUEST, request, pluginId, '', '']));
     }
   }
@@ -123,7 +125,7 @@
   @override
   void logPluginResponse(String pluginId, String response) {
     if (_instrumentationLogger != null) {
-      _instrumentationLogger
+      _instrumentationLogger!
           .log(_join([TAG_PLUGIN_RESPONSE, response, pluginId, '', '']));
     }
   }
@@ -133,7 +135,7 @@
     if (_instrumentationLogger != null) {
       List<String> fields = <String>[TAG_PLUGIN_TIMEOUT, request];
       plugin.addToFields(fields);
-      _instrumentationLogger.log(_join(fields));
+      _instrumentationLogger!.log(_join(fields));
     }
   }
 
@@ -146,11 +148,11 @@
   @override
   void logVersion(String uuid, String clientId, String clientVersion,
       String serverVersion, String sdkVersion) {
-    String normalize(String value) =>
+    String normalize(String? value) =>
         value != null && value.isNotEmpty ? value : 'unknown';
 
     if (_instrumentationLogger != null) {
-      _instrumentationLogger.log(_join([
+      _instrumentationLogger!.log(_join([
         TAG_VERSION,
         uuid,
         normalize(clientId),
@@ -164,13 +166,15 @@
   @override
   void logWatchEvent(String folderPath, String filePath, String changeType) {
     if (_instrumentationLogger != null) {
-      _instrumentationLogger
+      _instrumentationLogger!
           .log(_join([TAG_WATCH_EVENT, folderPath, filePath, changeType]));
     }
   }
 
   @override
-  Future<void> shutdown() => _instrumentationLogger.shutdown();
+  Future<void> shutdown() async {
+    await _instrumentationLogger?.shutdown();
+  }
 
   /// Write an escaped version of the given [field] to the given [buffer].
   void _escape(StringBuffer buffer, String field) {
@@ -197,7 +201,7 @@
     int length = fields.length;
     for (int i = 0; i < length; i++) {
       buffer.write(':');
-      _escape(buffer, fields[i] ?? 'null');
+      _escape(buffer, fields[i]);
     }
     return buffer.toString();
   }
@@ -205,12 +209,12 @@
   /// Log the given message with the given tag.
   void _log(String tag, String message) {
     if (_instrumentationLogger != null) {
-      _instrumentationLogger.log(_join([tag, message]));
+      _instrumentationLogger!.log(_join([tag, message]));
     }
   }
 
   /// Convert the given [object] to a string.
-  String _toString(Object object) {
+  String _toString(Object? object) {
     if (object == null) {
       return 'null';
     }
diff --git a/pkg/analyzer/lib/instrumentation/multicast_service.dart b/pkg/analyzer/lib/instrumentation/multicast_service.dart
index 995dbfe..9c7e0af 100644
--- a/pkg/analyzer/lib/instrumentation/multicast_service.dart
+++ b/pkg/analyzer/lib/instrumentation/multicast_service.dart
@@ -17,9 +17,11 @@
   }
 
   @override
-  void logException(Object exception,
-      [StackTrace stackTrace,
-      List<InstrumentationServiceAttachment> attachments]) {
+  void logException(
+    Object exception, [
+    StackTrace? stackTrace,
+    List<InstrumentationServiceAttachment>? attachments,
+  ]) {
     _services
         .forEach((s) => s.logException(exception, stackTrace, attachments));
   }
@@ -50,7 +52,7 @@
 
   @override
   void logPluginException(
-      PluginData plugin, Object exception, StackTrace stackTrace) {
+      PluginData plugin, Object exception, StackTrace? stackTrace) {
     _services
         .forEach((s) => s.logPluginException(plugin, exception, stackTrace));
   }
diff --git a/pkg/analyzer/lib/instrumentation/noop_service.dart b/pkg/analyzer/lib/instrumentation/noop_service.dart
index 47ca4ac..90be197 100644
--- a/pkg/analyzer/lib/instrumentation/noop_service.dart
+++ b/pkg/analyzer/lib/instrumentation/noop_service.dart
@@ -12,9 +12,11 @@
   void logError(String message) {}
 
   @override
-  void logException(dynamic exception,
-      [StackTrace stackTrace,
-      List<InstrumentationServiceAttachment> attachments]) {}
+  void logException(
+    Object exception, [
+    StackTrace? stackTrace,
+    List<InstrumentationServiceAttachment>? attachments,
+  ]) {}
 
   @override
   void logInfo(String message, [dynamic exception]) {}
@@ -32,7 +34,7 @@
 
   @override
   void logPluginException(
-      PluginData plugin, dynamic exception, StackTrace stackTrace) {}
+      PluginData plugin, dynamic exception, StackTrace? stackTrace) {}
 
   @override
   void logPluginNotification(String pluginId, String notification) {}
diff --git a/pkg/analyzer/lib/instrumentation/plugin_data.dart b/pkg/analyzer/lib/instrumentation/plugin_data.dart
index bc4c3e5..29c45bc 100644
--- a/pkg/analyzer/lib/instrumentation/plugin_data.dart
+++ b/pkg/analyzer/lib/instrumentation/plugin_data.dart
@@ -8,10 +8,10 @@
   final String pluginId;
 
   /// The name of the plugin.
-  final String name;
+  final String? name;
 
   /// The version of the plugin.
-  final String version;
+  final String? version;
 
   /// Initialize a newly created set of data about a plugin.
   PluginData(this.pluginId, this.name, this.version);
diff --git a/pkg/analyzer/lib/instrumentation/service.dart b/pkg/analyzer/lib/instrumentation/service.dart
index 1fda166..617644f 100644
--- a/pkg/analyzer/lib/instrumentation/service.dart
+++ b/pkg/analyzer/lib/instrumentation/service.dart
@@ -4,7 +4,6 @@
 
 import 'package:analyzer/instrumentation/noop_service.dart';
 import 'package:analyzer/instrumentation/plugin_data.dart';
-import 'package:meta/meta.dart';
 
 /// The interface used by client code to communicate with an instrumentation
 /// service of some kind.
@@ -17,9 +16,11 @@
 
   /// Log that the given non-priority [exception] was thrown, with the given
   /// [stackTrace].
-  void logException(dynamic exception,
-      [StackTrace stackTrace,
-      List<InstrumentationServiceAttachment> attachments]);
+  void logException(
+    Object exception, [
+    StackTrace? stackTrace,
+    List<InstrumentationServiceAttachment>? attachments,
+  ]);
 
   /// Log unstructured text information for debugging purposes.
   void logInfo(String message, [dynamic exception]);
@@ -41,7 +42,7 @@
   /// Log that the given non-priority [exception] was thrown, with the given
   /// [stackTrace] by the given [plugin].
   void logPluginException(
-      PluginData plugin, dynamic exception, StackTrace stackTrace);
+      PluginData plugin, Object exception, StackTrace? stackTrace);
 
   /// Log a notification from the plugin with the given [pluginId].
   void logPluginNotification(String pluginId, String notification);
@@ -86,8 +87,8 @@
 
   /// Create a new attachment with the unique [id] and string [value].
   InstrumentationServiceAttachment.string({
-    @required String id,
-    @required String value,
-  })  : id = id,
+    required String id,
+    required String value,
+  })   : id = id,
         stringValue = value;
 }
diff --git a/pkg/analyzer/lib/source/error_processor.dart b/pkg/analyzer/lib/source/error_processor.dart
index 6d114c5..7278ee6 100644
--- a/pkg/analyzer/lib/source/error_processor.dart
+++ b/pkg/analyzer/lib/source/error_processor.dart
@@ -25,24 +25,24 @@
   ///     new ErrorConfig({'missing_return' : 'error'});
   /// will create a processor config that turns `missing_return` hints into
   /// errors.
-  ErrorConfig(YamlNode codeMap) {
+  ErrorConfig(YamlNode? codeMap) {
     _processMap(codeMap);
   }
 
-  void _process(String code, Object action) {
+  void _process(String? code, Object action) {
     code = toUpperCase(code);
-    action = toLowerCase(action);
-    if (AnalyzerOptions.ignoreSynonyms.contains(action)) {
-      processors.add(ErrorProcessor.ignore(code));
+    var actionStr = toLowerCase(action);
+    if (AnalyzerOptions.ignoreSynonyms.contains(actionStr)) {
+      processors.add(ErrorProcessor.ignore(code!));
     } else {
-      ErrorSeverity severity = _toSeverity(action);
+      var severity = _toSeverity(actionStr);
       if (severity != null) {
-        processors.add(ErrorProcessor(code, severity));
+        processors.add(ErrorProcessor(code!, severity));
       }
     }
   }
 
-  void _processMap(YamlNode codes) {
+  void _processMap(YamlNode? codes) {
     if (codes is YamlMap) {
       codes.nodes.forEach((k, v) {
         if (k is YamlScalar && v is YamlScalar) {
@@ -52,7 +52,7 @@
     }
   }
 
-  ErrorSeverity _toSeverity(String severity) => severityMap[severity];
+  ErrorSeverity? _toSeverity(String? severity) => severityMap[severity];
 }
 
 /// Process errors by filtering or changing associated [ErrorSeverity].
@@ -63,7 +63,7 @@
   /// The desired severity of the processed error.
   ///
   /// If `null`, this processor will "filter" the associated error code.
-  final ErrorSeverity severity;
+  final ErrorSeverity? severity;
 
   /// Create an error processor that assigns errors with this [code] the
   /// given [severity].
@@ -87,8 +87,8 @@
 
   /// Return an error processor associated in the [analysisOptions] for the
   /// given [error], or `null` if none is found.
-  static ErrorProcessor getProcessor(
-      AnalysisOptions analysisOptions, AnalysisError error) {
+  static ErrorProcessor? getProcessor(
+      AnalysisOptions? analysisOptions, AnalysisError error) {
     if (analysisOptions == null) {
       return null;
     }
@@ -98,7 +98,11 @@
 
     // Add the strong mode processor.
     processors = processors.toList();
-    return processors.firstWhere((ErrorProcessor p) => p.appliesTo(error),
-        orElse: () => null);
+    for (var processor in processors) {
+      if (processor.appliesTo(error)) {
+        return processor;
+      }
+    }
+    return null;
   }
 }
diff --git a/pkg/analyzer/lib/source/line_info.dart b/pkg/analyzer/lib/source/line_info.dart
index 96c9149..71d4d91 100644
--- a/pkg/analyzer/lib/source/line_info.dart
+++ b/pkg/analyzer/lib/source/line_info.dart
@@ -29,9 +29,7 @@
   /// Initialize a newly created set of line information to represent the data
   /// encoded in the given list of [lineStarts].
   LineInfo(this.lineStarts) {
-    if (lineStarts == null) {
-      throw ArgumentError("lineStarts must be non-null");
-    } else if (lineStarts.isEmpty) {
+    if (lineStarts.isEmpty) {
       throw ArgumentError("lineStarts must be non-empty");
     }
   }
diff --git a/pkg/analyzer/lib/source/source_range.dart b/pkg/analyzer/lib/source/source_range.dart
index d934abd..c744010 100644
--- a/pkg/analyzer/lib/source/source_range.dart
+++ b/pkg/analyzer/lib/source/source_range.dart
@@ -75,7 +75,7 @@
   }
 
   /// Return `true` if this source range intersects the [otherRange].
-  bool intersects(SourceRange otherRange) {
+  bool intersects(SourceRange? otherRange) {
     if (otherRange == null) {
       return false;
     }
diff --git a/pkg/analyzer/lib/src/analysis_options/analysis_options_provider.dart b/pkg/analyzer/lib/src/analysis_options/analysis_options_provider.dart
index 1a8488c..a32a3dd 100644
--- a/pkg/analyzer/lib/src/analysis_options/analysis_options_provider.dart
+++ b/pkg/analyzer/lib/src/analysis_options/analysis_options_provider.dart
@@ -17,7 +17,7 @@
 class AnalysisOptionsProvider {
   /// The source factory used to resolve include declarations
   /// in analysis options files or `null` if include is not supported.
-  SourceFactory sourceFactory;
+  SourceFactory? sourceFactory;
 
   AnalysisOptionsProvider([this.sourceFactory]);
 
@@ -27,7 +27,7 @@
   /// and remove the include directive from the resulting options map.
   /// Return an empty options map if the file does not exist.
   YamlMap getOptions(Folder root, {bool crawlUp = false}) {
-    File optionsFile = getOptionsFile(root, crawlUp: crawlUp);
+    File? optionsFile = getOptionsFile(root, crawlUp: crawlUp);
     if (optionsFile == null) {
       return YamlMap();
     }
@@ -39,9 +39,9 @@
   ///
   /// The given [root] directory will be searched first. If no file is found and
   /// if [crawlUp] is `true`, then enclosing directories will be searched.
-  File getOptionsFile(Folder root, {bool crawlUp = false}) {
-    Resource resource;
-    for (Folder folder = root; folder != null; folder = folder.parent) {
+  File? getOptionsFile(Folder root, {bool crawlUp = false}) {
+    Resource? resource;
+    for (Folder? folder = root; folder != null; folder = folder.parent) {
       resource = folder.getChild(AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
       if (resource.exists || !crawlUp) {
         break;
@@ -67,12 +67,14 @@
   /// Return an empty options map if the file does not exist.
   YamlMap getOptionsFromSource(Source source) {
     YamlMap options = getOptionsFromString(_readAnalysisOptions(source));
-    YamlNode node = getValue(options, AnalyzerOptions.include);
+    var node = getValue(options, AnalyzerOptions.include);
     if (sourceFactory != null && node is YamlScalar) {
       var path = node.value;
       if (path is String) {
-        Source parent = sourceFactory.resolveUri(source, path);
-        options = merge(getOptionsFromSource(parent), options);
+        var parent = sourceFactory!.resolveUri(source, path);
+        if (parent != null) {
+          options = merge(getOptionsFromSource(parent), options);
+        }
       }
     }
     return options;
@@ -82,7 +84,7 @@
   /// An include directive, if present, will be left as-is,
   /// and the referenced options will NOT be merged into the result.
   /// Return an empty options map if the source is null.
-  YamlMap getOptionsFromString(String optionsSource) {
+  YamlMap getOptionsFromString(String? optionsSource) {
     if (optionsSource == null) {
       return YamlMap();
     }
@@ -116,7 +118,7 @@
 
   /// Read the contents of [source] as a string.
   /// Returns null if source is null or does not exist.
-  String _readAnalysisOptions(Source source) {
+  String? _readAnalysisOptions(Source source) {
     try {
       return source.contents.data;
     } catch (e) {
@@ -129,10 +131,10 @@
 /// Thrown on options format exceptions.
 class OptionsFormatException implements Exception {
   final String message;
-  final SourceSpan span;
+  final SourceSpan? span;
   OptionsFormatException(this.message, [this.span]);
 
   @override
   String toString() =>
-      'OptionsFormatException: ${message?.toString()}, ${span?.toString()}';
+      'OptionsFormatException: ${message.toString()}, ${span?.toString()}';
 }
diff --git a/pkg/analyzer/lib/src/analysis_options/error/option_codes.dart b/pkg/analyzer/lib/src/analysis_options/error/option_codes.dart
index b67961f..78c31f7 100644
--- a/pkg/analyzer/lib/src/analysis_options/error/option_codes.dart
+++ b/pkg/analyzer/lib/src/analysis_options/error/option_codes.dart
@@ -30,7 +30,7 @@
 
   /// Initialize a newly created error code to have the given [name].
   const AnalysisOptionsErrorCode(String name, String message,
-      {String correction})
+      {String? correction})
       : super(
           correction: correction,
           message: message,
@@ -82,7 +82,7 @@
 
   /// Initialize a newly created hint code to have the given [name].
   const AnalysisOptionsHintCode(String name, String message,
-      {String correction})
+      {String? correction})
       : super(
           correction: correction,
           message: message,
@@ -209,7 +209,7 @@
 
   /// Initialize a newly created warning code to have the given [name].
   const AnalysisOptionsWarningCode(String name, String message,
-      {String correction})
+      {String? correction})
       : super(
           correction: correction,
           message: message,
diff --git a/pkg/analyzer/lib/src/command_line/arguments.dart b/pkg/analyzer/lib/src/command_line/arguments.dart
index 1bf44e0..4b72704 100644
--- a/pkg/analyzer/lib/src/command_line/arguments.dart
+++ b/pkg/analyzer/lib/src/command_line/arguments.dart
@@ -27,7 +27,7 @@
 
 /// Update [options] with the value of each analysis option command line flag.
 void applyAnalysisOptionFlags(AnalysisOptionsImpl options, ArgResults args,
-    {void Function(String text) verbosePrint}) {
+    {void Function(String text)? verbosePrint}) {
   void verbose(String text) {
     if (verbosePrint != null) {
       verbosePrint('Analysis options: $text');
@@ -57,7 +57,7 @@
   ResourceProvider resourceProvider,
   ArgResults args,
 ) {
-  String absoluteNormalizedPath(String path) {
+  String? absoluteNormalizedPath(String? path) {
     if (path == null) {
       return null;
     }
@@ -222,11 +222,11 @@
   Set<String> knownAbbreviations = HashSet<String>();
   parser.options.forEach((String name, Option option) {
     knownOptions.add(name);
-    String abbreviation = option.abbr;
+    String? abbreviation = option.abbr;
     if (abbreviation != null) {
       knownAbbreviations.add(abbreviation);
     }
-    if (option.negatable) {
+    if (option.negatable ?? false) {
       knownOptions.add('no-$name');
     }
   });
diff --git a/pkg/analyzer/lib/src/context/builder.dart b/pkg/analyzer/lib/src/context/builder.dart
index c91e372..9280477 100644
--- a/pkg/analyzer/lib/src/context/builder.dart
+++ b/pkg/analyzer/lib/src/context/builder.dart
@@ -60,38 +60,38 @@
   /// arguments as the dart analysis driver constructor so that plugins may
   /// create their own drivers with the same tools, in theory. Here as a stopgap
   /// until the official plugin API is complete
-  static Function onCreateAnalysisDriver;
+  static Function? onCreateAnalysisDriver;
 
   /// The [ResourceProvider] by which paths are converted into [Resource]s.
   final ResourceProvider resourceProvider;
 
   /// The manager used to manage the DartSdk's that have been created so that
   /// they can be shared across contexts.
-  final DartSdkManager sdkManager;
+  final DartSdkManager? sdkManager;
 
   /// The cache containing the contents of overlaid files. If this builder will
   /// be used to build analysis drivers, set the [fileContentOverlay] instead.
-  final ContentCache contentCache;
+  final ContentCache? contentCache;
 
   /// The options used by the context builder.
   final ContextBuilderOptions builderOptions;
 
   /// The scheduler used by any analysis drivers created through this interface.
-  AnalysisDriverScheduler analysisDriverScheduler;
+  late final AnalysisDriverScheduler analysisDriverScheduler;
 
   /// The performance log used by any analysis drivers created through this
   /// interface.
-  PerformanceLog performanceLog;
+  late final PerformanceLog performanceLog;
 
   /// If `true`, additional analysis data useful for testing is stored.
   bool retainDataForTesting = false;
 
   /// The byte store used by any analysis drivers created through this interface.
-  ByteStore byteStore;
+  late final ByteStore byteStore;
 
   /// The file content overlay used by analysis drivers. If this builder will be
   /// used to build analysis contexts, set the [contentCache] instead.
-  FileContentOverlay fileContentOverlay;
+  FileContentOverlay? fileContentOverlay;
 
   /// Whether any analysis driver created through this interface should support
   /// indexing and search.
@@ -100,19 +100,18 @@
   /// Initialize a newly created builder to be ready to build a context rooted in
   /// the directory with the given [rootDirectoryPath].
   ContextBuilder(this.resourceProvider, this.sdkManager, this.contentCache,
-      {ContextBuilderOptions options})
+      {ContextBuilderOptions? options})
       : builderOptions = options ?? ContextBuilderOptions();
 
   /// Return an analysis driver that is configured correctly to analyze code in
   /// the directory with the given [path].
   AnalysisDriver buildDriver(ContextRoot contextRoot) {
     String path = contextRoot.root;
-    AnalysisOptions options =
-        getAnalysisOptions(path, contextRoot: contextRoot);
+    var options = getAnalysisOptions(path, contextRoot: contextRoot);
     //_processAnalysisOptions(context, optionMap);
-    SummaryDataStore summaryData;
+    SummaryDataStore? summaryData;
     if (builderOptions.librarySummaryPaths != null) {
-      summaryData = SummaryDataStore(builderOptions.librarySummaryPaths);
+      summaryData = SummaryDataStore(builderOptions.librarySummaryPaths!);
     }
     Workspace workspace =
         ContextBuilder.createWorkspace(resourceProvider, path, this);
@@ -152,7 +151,7 @@
 
     // temporary plugin support:
     if (onCreateAnalysisDriver != null) {
-      onCreateAnalysisDriver(driver, analysisDriverScheduler, performanceLog,
+      onCreateAnalysisDriver!(driver, analysisDriverScheduler, performanceLog,
           resourceProvider, byteStore, fileContentOverlay, path, sf, options);
     }
     declareVariablesInDriver(driver);
@@ -160,8 +159,8 @@
   }
 
   /// Return an analysis options object containing the default option values.
-  AnalysisOptions createDefaultOptions() {
-    AnalysisOptions defaultOptions = builderOptions.defaultOptions;
+  AnalysisOptionsImpl createDefaultOptions() {
+    AnalysisOptions? defaultOptions = builderOptions.defaultOptions;
     if (defaultOptions == null) {
       return AnalysisOptionsImpl();
     }
@@ -203,7 +202,7 @@
   }
 
   SourceFactory createSourceFactory(String rootPath,
-      {SummaryDataStore summaryData}) {
+      {SummaryDataStore? summaryData}) {
     Workspace workspace =
         ContextBuilder.createWorkspace(resourceProvider, rootPath, this);
     DartSdk sdk = findSdk(workspace);
@@ -214,7 +213,7 @@
   }
 
   SourceFactory createSourceFactoryFromWorkspace(Workspace workspace,
-      {SummaryDataStore summaryData}) {
+      {SummaryDataStore? summaryData}) {
     DartSdk sdk = findSdk(workspace);
     if (summaryData != null && sdk is SummaryBasedDartSdk) {
       summaryData.addBundle(null, sdk.bundle);
@@ -225,8 +224,8 @@
   /// Add any [declaredVariables] to the list of declared variables used by the
   /// given analysis [driver].
   void declareVariablesInDriver(AnalysisDriver driver) {
-    Map<String, String> variables = builderOptions.declaredVariables;
-    if (variables != null && variables.isNotEmpty) {
+    var variables = builderOptions.declaredVariables;
+    if (variables.isNotEmpty) {
       driver.declaredVariables = DeclaredVariables.fromMap(variables);
       driver.configure();
     }
@@ -234,8 +233,8 @@
 
   /// Return the SDK that should be used to analyze code. Use the given
   /// [workspace] to locate the SDK.
-  DartSdk findSdk(Workspace workspace) {
-    String summaryPath = builderOptions.dartSdkSummaryPath;
+  DartSdk findSdk(Workspace? workspace) {
+    String? summaryPath = builderOptions.dartSdkSummaryPath;
     if (summaryPath != null) {
       return SummaryBasedDartSdk(summaryPath, true,
           resourceProvider: resourceProvider);
@@ -243,9 +242,9 @@
 
     DartSdk folderSdk;
     {
-      String sdkPath = sdkManager.defaultSdkDirectory;
+      String sdkPath = sdkManager!.defaultSdkDirectory;
       SdkDescription description = SdkDescription(sdkPath);
-      folderSdk = sdkManager.getSdk(description, () {
+      folderSdk = sdkManager!.getSdk(description, () {
         return FolderBasedDartSdk(
           resourceProvider,
           resourceProvider.getFolder(sdkPath),
@@ -260,7 +259,7 @@
       );
       if (embedderYamlSource != null) {
         var embedderYamlPath = embedderYamlSource.fullName;
-        var libFolder = resourceProvider.getFile(embedderYamlPath).parent;
+        var libFolder = resourceProvider.getFile(embedderYamlPath).parent!;
         EmbedderYamlLocator locator =
             EmbedderYamlLocator.forLibFolder(libFolder);
         Map<Folder, YamlMap> embedderMap = locator.embedderYamls;
@@ -281,8 +280,8 @@
   /// Return the analysis options that should be used to analyze code in the
   /// directory with the given [path]. Use [verbosePrint] to echo verbose
   /// information about the analysis options selection process.
-  AnalysisOptions getAnalysisOptions(String path,
-      {void Function(String text) verbosePrint, ContextRoot contextRoot}) {
+  AnalysisOptionsImpl getAnalysisOptions(String path,
+      {void Function(String text)? verbosePrint, ContextRoot? contextRoot}) {
     void verbose(String text) {
       if (verbosePrint != null) {
         verbosePrint(text);
@@ -298,8 +297,8 @@
         AnalysisOptionsProvider(sourceFactory);
 
     AnalysisOptionsImpl options = createDefaultOptions();
-    File optionsFile = getOptionsFile(path);
-    YamlMap optionMap;
+    File? optionsFile = getOptionsFile(path);
+    YamlMap? optionMap;
 
     if (optionsFile != null) {
       try {
@@ -314,7 +313,7 @@
       }
     } else {
       // Search for the default analysis options.
-      Source source;
+      Source? source;
       if (workspace is WorkspaceWithDefaultAnalysisOptions) {
         source = sourceFactory.forUri(WorkspaceWithDefaultAnalysisOptions.uri);
       } else {
@@ -338,7 +337,7 @@
     if (optionMap != null) {
       applyToAnalysisOptions(options, optionMap);
       if (builderOptions.argResults != null) {
-        applyAnalysisOptionFlags(options, builderOptions.argResults,
+        applyAnalysisOptionFlags(options, builderOptions.argResults!,
             verbosePrint: verbosePrint);
       }
     } else {
@@ -363,15 +362,15 @@
   /// If [forceSearch] is true, then don't return the default analysis options
   /// path. This allows cli to locate what *would* have been the analysis options
   /// file path, and super-impose the defaults over it in-place.
-  File getOptionsFile(String path, {bool forceSearch = false}) {
+  File? getOptionsFile(String path, {bool forceSearch = false}) {
     if (!forceSearch) {
-      String filePath = builderOptions.defaultAnalysisOptionsFilePath;
+      String? filePath = builderOptions.defaultAnalysisOptionsFilePath;
       if (filePath != null) {
         return resourceProvider.getFile(filePath);
       }
     }
     Folder root = resourceProvider.getFolder(path);
-    for (Folder folder = root; folder != null; folder = folder.parent) {
+    for (Folder? folder = root; folder != null; folder = folder.parent) {
       File file = folder
           .getChildAssumingFile(AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
       if (file.exists) {
@@ -383,8 +382,8 @@
 
   /// Return the `pubspec.yaml` file that should be used when analyzing code in
   /// the directory with the given [path], possibly `null`.
-  File _findPubspecFile(String path) {
-    var resource = resourceProvider.getResource(path);
+  File? _findPubspecFile(String path) {
+    Resource? resource = resourceProvider.getResource(path);
     while (resource != null) {
       if (resource is Folder) {
         File pubspecFile = resource.getChildAssumingFile('pubspec.yaml');
@@ -414,7 +413,7 @@
           PubWorkspace.find(resourceProvider, packageMap, rootPath) ??
           BasicWorkspace.find(resourceProvider, packageMap, rootPath);
     }
-    Workspace workspace = BazelWorkspace.find(resourceProvider, rootPath);
+    Workspace? workspace = BazelWorkspace.find(resourceProvider, rootPath);
     workspace ??= GnWorkspace.find(resourceProvider, rootPath);
     workspace ??=
         PackageBuildWorkspace.find(resourceProvider, packageMap, rootPath);
@@ -427,7 +426,7 @@
   /// directory contains a `.packages` file.
   static bool _hasPackageFileInPath(
       ResourceProvider resourceProvider, String rootPath) {
-    Folder folder = resourceProvider.getFolder(rootPath);
+    Folder? folder = resourceProvider.getFolder(rootPath);
     while (folder != null) {
       File file = folder.getChildAssumingFile('.packages');
       if (file.exists) {
@@ -443,35 +442,34 @@
 class ContextBuilderOptions {
   /// The results of parsing the command line arguments as defined by
   /// [defineAnalysisArguments] or `null` if none.
-  ArgResults argResults;
+  ArgResults? argResults;
 
   /// The file path of the file containing the summary of the SDK that should be
   /// used to "analyze" the SDK. This option should only be specified by
   /// command-line tools such as 'dartanalyzer' or 'ddc'.
-  String dartSdkSummaryPath;
+  String? dartSdkSummaryPath;
 
   /// The file path of the analysis options file that should be used in place of
   /// any file in the root directory or a parent of the root directory, or `null`
   /// if the normal lookup mechanism should be used.
-  String defaultAnalysisOptionsFilePath;
+  String? defaultAnalysisOptionsFilePath;
 
-  /// A table mapping variable names to values for the declared variables, or
-  /// `null` if no additional variables should be declared.
-  Map<String, String> declaredVariables;
+  /// A table mapping variable names to values for the declared variables.
+  Map<String, String> declaredVariables = {};
 
   /// The default analysis options that should be used unless some or all of them
   /// are overridden in the analysis options file, or `null` if the default
   /// defaults should be used.
-  AnalysisOptions defaultOptions;
+  AnalysisOptions? defaultOptions;
 
   /// The file path of the .packages file that should be used in place of any
   /// file found using the normal (Package Specification DEP) lookup mechanism,
   /// or `null` if the normal lookup mechanism should be used.
-  String defaultPackageFilePath;
+  String? defaultPackageFilePath;
 
   /// A list of the paths of summary files that are to be used, or `null` if no
   /// summary information is available.
-  List<String> librarySummaryPaths;
+  List<String>? librarySummaryPaths;
 
   /// Initialize a newly created set of options
   ContextBuilderOptions();
@@ -489,7 +487,7 @@
 
   /// Initialize a newly created locator by processing the packages in the given
   /// [packageMap].
-  EmbedderYamlLocator(Map<String, List<Folder>> packageMap) {
+  EmbedderYamlLocator(Map<String, List<Folder>>? packageMap) {
     if (packageMap != null) {
       _processPackageMap(packageMap);
     }
@@ -507,7 +505,7 @@
 
   /// Refresh the map of located files to those found by processing the given
   /// [packageMap].
-  void refresh(Map<String, List<Folder>> packageMap) {
+  void refresh(Map<String, List<Folder>>? packageMap) {
     // Clear existing.
     embedderYamls.clear();
     if (packageMap != null) {
@@ -532,7 +530,7 @@
   /// `_embedder.yaml` files that are found in any of the folders.
   void _processPackage(List<Folder> libDirs) {
     for (Folder libDir in libDirs) {
-      String embedderYaml = _readEmbedderYaml(libDir);
+      String? embedderYaml = _readEmbedderYaml(libDir);
       if (embedderYaml != null) {
         _processEmbedderYaml(libDir, embedderYaml);
       }
@@ -544,10 +542,10 @@
     packageMap.values.forEach(_processPackage);
   }
 
-  /// Read and return the contents of [libDir]/[EMBEDDER_FILE_NAME], or `null` if
-  /// the file doesn't exist.
-  String _readEmbedderYaml(Folder libDir) {
-    File file = libDir.getChild(EMBEDDER_FILE_NAME);
+  /// Read and return the contents of [libDir]/[EMBEDDER_FILE_NAME], or `null`
+  /// if the file doesn't exist.
+  String? _readEmbedderYaml(Folder libDir) {
+    var file = libDir.getChildAssumingFile(EMBEDDER_FILE_NAME);
     try {
       return file.readAsStringSync();
     } on FileSystemException {
diff --git a/pkg/analyzer/lib/src/context/context.dart b/pkg/analyzer/lib/src/context/context.dart
index 28cdb0c..e6b7d64 100644
--- a/pkg/analyzer/lib/src/context/context.dart
+++ b/pkg/analyzer/lib/src/context/context.dart
@@ -2,14 +2,12 @@
 // 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.
 
-import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/analysis/session.dart';
 import 'package:analyzer/src/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/generated/constant.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:meta/meta.dart';
 
 /// An [AnalysisContext] in which analysis can be performed.
 class AnalysisContextImpl implements AnalysisContext {
@@ -35,6 +33,8 @@
     return _synchronousSession.declaredVariables;
   }
 
+  bool get hasTypeProvider => _synchronousSession.hasTypeProvider;
+
   @override
   set sourceFactory(SourceFactory factory) {
     throw StateError('Cannot be changed.');
@@ -61,8 +61,8 @@
   }
 
   void setTypeProviders({
-    @required TypeProvider legacy,
-    @required TypeProvider nonNullableByDefault,
+    required TypeProviderImpl legacy,
+    required TypeProviderImpl nonNullableByDefault,
   }) {
     _synchronousSession.setTypeProviders(
       legacy: legacy,
diff --git a/pkg/analyzer/lib/src/context/context_root.dart b/pkg/analyzer/lib/src/context/context_root.dart
index 393c3d5..d79e72c 100644
--- a/pkg/analyzer/lib/src/context/context_root.dart
+++ b/pkg/analyzer/lib/src/context/context_root.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/src/generated/utilities_general.dart';
-import 'package:meta/meta.dart';
 import 'package:path/path.dart' as path;
 
 /// Information about the root directory associated with an analysis context.
@@ -24,11 +23,10 @@
   /// An informative value for the file path that the analysis options were read
   /// from. This value can be `null` if there is no analysis options file or if
   /// the location of the file has not yet been discovered.
-  String optionsFilePath;
+  String? optionsFilePath;
 
   /// Initialize a newly created context root.
-  ContextRoot(this.root, this.exclude, {@required path.Context pathContext})
-      : pathContext = pathContext ?? path.context;
+  ContextRoot(this.root, this.exclude, {required this.pathContext});
 
   @override
   int get hashCode {
@@ -66,7 +64,7 @@
   /// Compare the lists [listA] and [listB], using [itemEqual] to compare list
   /// elements.
   bool _listEqual<T>(
-      List<T> listA, List<T> listB, bool Function(T a, T b) itemEqual) {
+      List<T>? listA, List<T>? listB, bool Function(T a, T b) itemEqual) {
     if (listA == null) {
       return listB == null;
     }
diff --git a/pkg/analyzer/lib/src/context/package_config_json.dart b/pkg/analyzer/lib/src/context/package_config_json.dart
index afc2047..cfda8b6 100644
--- a/pkg/analyzer/lib/src/context/package_config_json.dart
+++ b/pkg/analyzer/lib/src/context/package_config_json.dart
@@ -4,7 +4,6 @@
 
 import 'dart:convert';
 
-import 'package:meta/meta.dart';
 import 'package:pub_semver/pub_semver.dart';
 
 /// Parse the content of a `package_config.json` file located at the [uri].
@@ -46,27 +45,27 @@
   /// The timestamp for when the file was generated.
   ///
   /// Might be `null`.
-  final DateTime generated;
+  final DateTime? generated;
 
   /// The generator which created the file, typically "pub".
   ///
   /// Might be `null`.
-  final String generator;
+  final String? generator;
 
   /// The version of the generator, if the generator wants to remember that
   /// information. The version must be a Semantic Version. Pub can use the
   /// SDK version.
   ///
   /// Might be `null`.
-  final Version generatorVersion;
+  final Version? generatorVersion;
 
   PackageConfigJson({
-    @required this.uri,
-    @required this.configVersion,
-    @required this.packages,
-    @required this.generated,
-    @required this.generator,
-    @required this.generatorVersion,
+    required this.uri,
+    required this.configVersion,
+    required this.packages,
+    required this.generated,
+    required this.generator,
+    required this.generatorVersion,
   });
 }
 
@@ -85,13 +84,13 @@
   final Uri packageUri;
 
   /// The language version for the package, or `null` if not specified.
-  final LanguageVersion languageVersion;
+  final LanguageVersion? languageVersion;
 
   PackageConfigJsonPackage({
-    this.name,
-    this.rootUri,
-    this.packageUri,
-    this.languageVersion,
+    required this.name,
+    required this.rootUri,
+    required this.packageUri,
+    required this.languageVersion,
   });
 }
 
@@ -101,11 +100,11 @@
   final Uri uri;
   final String content;
 
-  int version;
+  late int version;
   List<PackageConfigJsonPackage> packages = [];
-  DateTime generated;
-  String generator;
-  Version generatorVersion;
+  DateTime? generated;
+  String? generator;
+  Version? generatorVersion;
 
   _PackageConfigJsonParser(this.uri, this.content);
 
@@ -128,9 +127,9 @@
     }
   }
 
-  T _getOptionalField<T>(Map<String, Object> map, String name) {
+  T? _getOptionalField<T>(Map<String, dynamic> map, String name) {
     var object = map[name];
-    if (object is T || object == null) {
+    if (object is T?) {
       return object;
     } else {
       var actualType = object.runtimeType;
@@ -141,7 +140,7 @@
     }
   }
 
-  T _getRequiredField<T>(Map<String, Object> map, String name) {
+  T _getRequiredField<T>(Map<String, dynamic> map, String name) {
     var object = map[name];
     if (object is T) {
       return object;
@@ -156,7 +155,7 @@
     }
   }
 
-  void _parseGenerated(Map<String, Object> map) {
+  void _parseGenerated(Map<String, dynamic> map) {
     var generatedStr = _getOptionalField<String>(map, 'generated');
     if (generatedStr != null) {
       generated = DateTime.parse(generatedStr);
@@ -173,7 +172,7 @@
     }
   }
 
-  void _parsePackage(Map<String, Object> map) {
+  void _parsePackage(Map<String, Object?> map) {
     var name = _getRequiredField<String>(map, 'name');
 
     var rootUriStr = _getRequiredField<String>(map, 'rootUri');
@@ -217,7 +216,7 @@
     );
   }
 
-  LanguageVersion _parsePackageLanguageVersion(Map<String, Object> map) {
+  LanguageVersion? _parsePackageLanguageVersion(Map<String, Object?> map) {
     var versionStr = _getOptionalField<String>(map, 'languageVersion');
     if (versionStr == null) {
       return null;
@@ -225,8 +224,8 @@
 
     var match = _languageVersionRegExp.matchAsPrefix(versionStr);
     if (match != null && match.end == versionStr.length) {
-      var major = int.parse(match.group(1));
-      var minor = int.parse(match.group(2));
+      var major = int.parse(match.group(1)!);
+      var minor = int.parse(match.group(2)!);
       return LanguageVersion(major, minor);
     } else {
       throw FormatException(
@@ -236,16 +235,16 @@
     }
   }
 
-  void _parsePackages(Map<String, Object> map) {
-    var packagesObject = _getRequiredField<List<Object>>(map, 'packages');
+  void _parsePackages(Map<String, Object?> map) {
+    var packagesObject = _getRequiredField<List<Object?>>(map, 'packages');
     for (var packageObject in packagesObject) {
-      if (packageObject is Map<String, Object>) {
+      if (packageObject is Map<String, dynamic>) {
         _parsePackage(packageObject);
       }
     }
   }
 
-  void _parseVersion(Map<String, Object> map) {
+  void _parseVersion(Map<String, Object?> map) {
     version = _getRequiredField(map, 'configVersion');
     if (version != 2) {
       throw FormatException("Unsupported config version: $version");
diff --git a/pkg/analyzer/lib/src/context/packages.dart b/pkg/analyzer/lib/src/context/packages.dart
index 087680f..57cdcd2 100644
--- a/pkg/analyzer/lib/src/context/packages.dart
+++ b/pkg/analyzer/lib/src/context/packages.dart
@@ -5,7 +5,7 @@
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/context/package_config_json.dart';
 import 'package:analyzer/src/util/uri.dart';
-import 'package:meta/meta.dart';
+// ignore: import_of_legacy_library_into_null_safe
 import 'package:package_config/src/packages_file.dart'
     as package_config_packages_file;
 import 'package:pub_semver/pub_semver.dart';
@@ -15,7 +15,7 @@
 /// Looks for `.dart_tool/package_config.json` or `.packages` in the given
 /// and parent directories.
 Packages findPackagesFrom(ResourceProvider provider, Resource start) {
-  for (var current = start; current != null; current = current.parent) {
+  for (Resource? current = start; current != null; current = current.parent) {
     if (current is Folder) {
       try {
         var jsonFile = current
@@ -92,11 +92,11 @@
       jsonPackage.packageUri,
     );
 
-    Version languageVersion;
+    Version? languageVersion;
     if (jsonPackage.languageVersion != null) {
       languageVersion = Version(
-        jsonPackage.languageVersion.major,
-        jsonPackage.languageVersion.minor,
+        jsonPackage.languageVersion!.major,
+        jsonPackage.languageVersion!.minor,
         0,
       );
       // New features were added in `2.2.2` over `2.2.0`.
@@ -128,7 +128,7 @@
     if (isJson) {
       return parsePackageConfigJsonFile(provider, file);
     } else {
-      var relativePackageConfigFile = file.parent
+      var relativePackageConfigFile = file.parent!
           .getChildAssumingFolder('.dart_tool')
           .getChildAssumingFile('package_config.json');
       if (relativePackageConfigFile.exists) {
@@ -147,13 +147,13 @@
   final Folder libFolder;
 
   /// The language version for this package, `null` not specified explicitly.
-  final Version languageVersion;
+  final Version? languageVersion;
 
   Package({
-    @required this.name,
-    @required this.rootFolder,
-    @required this.libFolder,
-    @required this.languageVersion,
+    required this.name,
+    required this.rootFolder,
+    required this.libFolder,
+    required this.languageVersion,
   });
 }
 
@@ -167,12 +167,12 @@
   Iterable<Package> get packages => _map.values;
 
   /// Return the [Package] with the given [name], or `null`.
-  Package operator [](String name) => _map[name];
+  Package? operator [](String name) => _map[name];
 
   /// Return the inner-most [Package] that contains  the [path], `null` if none.
-  Package packageForPath(String path) {
-    Package result;
-    int resultPathLength;
+  Package? packageForPath(String path) {
+    Package? result;
+    int resultPathLength = 1 << 20;
     for (var package in packages) {
       if (package.rootFolder.contains(path)) {
         var packagePathLength = package.rootFolder.path.length;
diff --git a/pkg/analyzer/lib/src/context/source.dart b/pkg/analyzer/lib/src/context/source.dart
index 377fe5e..714c9c6 100644
--- a/pkg/analyzer/lib/src/context/source.dart
+++ b/pkg/analyzer/lib/src/context/source.dart
@@ -15,7 +15,7 @@
 
 /// Return `true` if the given [source] refers to a file that is assumed to be
 /// generated.
-bool isGeneratedSource(Source source) {
+bool isGeneratedSource(Source? source) {
   if (source == null) {
     return false;
   }
@@ -51,7 +51,7 @@
   SourceFactoryImpl(this.resolvers);
 
   @override
-  DartSdk get dartSdk {
+  DartSdk? get dartSdk {
     List<UriResolver> resolvers = this.resolvers;
     int length = resolvers.length;
     for (int i = 0; i < length; i++) {
@@ -65,7 +65,7 @@
   }
 
   @override
-  Map<String, List<Folder>> get packageMap {
+  Map<String, List<Folder>>? get packageMap {
     for (var resolver in resolvers) {
       if (resolver is PackageMapUriResolver) {
         return resolver.packageMap;
@@ -86,7 +86,7 @@
   }
 
   @override
-  Source forUri(String absoluteUri) {
+  Source? forUri(String absoluteUri) {
     try {
       Uri uri;
       try {
@@ -109,7 +109,7 @@
   }
 
   @override
-  Source forUri2(Uri absoluteUri) {
+  Source? forUri2(Uri absoluteUri) {
     if (absoluteUri.isAbsolute) {
       try {
         return _internalResolveUri(null, absoluteUri);
@@ -124,7 +124,7 @@
   }
 
   @override
-  Source resolveUri(Source containingSource, String containedUri) {
+  Source? resolveUri(Source? containingSource, String? containedUri) {
     if (containedUri == null) {
       return null;
     }
@@ -151,10 +151,10 @@
   }
 
   @override
-  Uri restoreUri(Source source) {
+  Uri? restoreUri(Source source) {
     for (UriResolver resolver in resolvers) {
       // First see if a resolver can restore the URI.
-      Uri uri = resolver.restoreAbsolute(source);
+      Uri? uri = resolver.restoreAbsolute(source);
 
       if (uri != null) {
         return uri;
@@ -175,7 +175,7 @@
   /// @return the source representing the contained URI
   /// @throws AnalysisException if either the contained URI is invalid or if it
   ///         cannot be resolved against the source object's URI
-  Source _internalResolveUri(Source containingSource, Uri containedUri) {
+  Source? _internalResolveUri(Source? containingSource, Uri containedUri) {
     if (!containedUri.isAbsolute) {
       if (containingSource == null) {
         throw AnalysisException(
@@ -188,14 +188,16 @@
 
     Uri actualUri = containedUri;
 
-    return _absoluteUriToSourceCache.putIfAbsent(actualUri, () {
+    var result = _absoluteUriToSourceCache[actualUri];
+    if (result == null) {
       for (UriResolver resolver in resolvers) {
-        Source result = resolver.resolveAbsolute(containedUri, actualUri);
+        result = resolver.resolveAbsolute(containedUri, actualUri);
         if (result != null) {
-          return result;
+          _absoluteUriToSourceCache[actualUri] = result;
+          break;
         }
       }
-      return null;
-    });
+    }
+    return result;
   }
 }
diff --git a/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart b/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart
index 2b9961a..cdd784b 100644
--- a/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart
@@ -11,7 +11,6 @@
 import 'package:analyzer/src/dart/analysis/byte_store.dart';
 import 'package:analyzer/src/dart/analysis/context_builder.dart';
 import 'package:cli_util/cli_util.dart';
-import 'package:meta/meta.dart';
 
 /// An implementation of [AnalysisContextCollection].
 class AnalysisContextCollectionImpl implements AnalysisContextCollection {
@@ -24,22 +23,20 @@
 
   /// Initialize a newly created analysis context manager.
   AnalysisContextCollectionImpl({
-    ByteStore byteStore,
-    Map<String, String> declaredVariables,
+    ByteStore? byteStore,
+    Map<String, String>? declaredVariables,
     bool enableIndex = false,
-    @required List<String> includedPaths,
-    List<String> excludedPaths,
-    ResourceProvider resourceProvider,
+    required List<String> includedPaths,
+    List<String>? excludedPaths,
+    ResourceProvider? resourceProvider,
     bool retainDataForTesting = false,
-    String sdkPath,
+    String? sdkPath,
   }) : resourceProvider =
             resourceProvider ?? PhysicalResourceProvider.INSTANCE {
     sdkPath ??= getSdkPath();
 
     _throwIfAnyNotAbsoluteNormalizedPath(includedPaths);
-    if (sdkPath != null) {
-      _throwIfNotAbsoluteNormalizedPath(sdkPath);
-    }
+    _throwIfNotAbsoluteNormalizedPath(sdkPath);
 
     var contextLocator = ContextLocator(
       resourceProvider: this.resourceProvider,
diff --git a/pkg/analyzer/lib/src/dart/analysis/byte_store.dart b/pkg/analyzer/lib/src/dart/analysis/byte_store.dart
index fbb5afb..85ac05d 100644
--- a/pkg/analyzer/lib/src/dart/analysis/byte_store.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/byte_store.dart
@@ -17,7 +17,7 @@
 abstract class ByteStore {
   /// Return the bytes associated with the given [key].
   /// Return `null` if the association does not exist.
-  List<int> get(String key);
+  List<int>? get(String key);
 
   /// Associate the given [bytes] with the [key].
   void put(String key, List<int> bytes);
@@ -28,7 +28,7 @@
   final Map<String, List<int>> _map = {};
 
   @override
-  List<int> get(String key) {
+  List<int>? get(String key) {
     return _map[key];
   }
 
@@ -47,7 +47,7 @@
       : _cache = Cache<String, List<int>>(maxSizeBytes, (v) => v.length);
 
   @override
-  List<int> get(String key) {
+  List<int>? get(String key) {
     return _cache.get(key, () => _store.get(key));
   }
 
@@ -61,7 +61,7 @@
 /// [ByteStore] which does not store any data.
 class NullByteStore implements ByteStore {
   @override
-  List<int> get(String key) => null;
+  List<int>? get(String key) => null;
 
   @override
   void put(String key, List<int> bytes) {}
diff --git a/pkg/analyzer/lib/src/dart/analysis/cache.dart b/pkg/analyzer/lib/src/dart/analysis/cache.dart
index d7fe753..5f50eb1 100644
--- a/pkg/analyzer/lib/src/dart/analysis/cache.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/cache.dart
@@ -12,8 +12,8 @@
 
   Cache(this._maxSizeBytes, this._meter);
 
-  V get(K key, V Function() getNotCached) {
-    V value = _map.remove(key);
+  V? get(K key, V? Function() getNotCached) {
+    V? value = _map.remove(key);
     if (value == null) {
       value = getNotCached();
       if (value != null) {
@@ -28,7 +28,7 @@
   }
 
   void put(K key, V value) {
-    V oldValue = _map[key];
+    V? oldValue = _map[key];
     if (oldValue != null) {
       _currentSizeBytes -= _meter(oldValue);
     }
@@ -47,7 +47,7 @@
         break;
       }
       K key = _map.keys.first;
-      V value = _map.remove(key);
+      V value = _map.remove(key)!;
       _currentSizeBytes -= _meter(value);
     }
   }
diff --git a/pkg/analyzer/lib/src/dart/analysis/context_builder.dart b/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
index c10d5a4..cf3c196 100644
--- a/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
@@ -23,7 +23,6 @@
 import 'package:analyzer/src/generated/sdk.dart' show DartSdkManager;
 import 'package:analyzer/src/generated/source.dart' show ContentCache;
 import 'package:cli_util/cli_util.dart';
-import 'package:meta/meta.dart';
 
 /// An implementation of a context builder.
 class ContextBuilderImpl implements ContextBuilder {
@@ -33,22 +32,22 @@
   /// Initialize a newly created context builder. If a [resourceProvider] is
   /// given, then it will be used to access the file system, otherwise the
   /// default resource provider will be used.
-  ContextBuilderImpl({ResourceProvider resourceProvider})
+  ContextBuilderImpl({ResourceProvider? resourceProvider})
       : resourceProvider =
             resourceProvider ?? PhysicalResourceProvider.INSTANCE;
 
   @override
   AnalysisContext createContext(
-      {ByteStore byteStore,
-      @required ContextRoot contextRoot,
-      DeclaredVariables declaredVariables,
+      {ByteStore? byteStore,
+      required ContextRoot contextRoot,
+      DeclaredVariables? declaredVariables,
       bool enableIndex = false,
-      List<String> librarySummaryPaths,
-      @deprecated PerformanceLog performanceLog,
-        bool retainDataForTesting = false,
-      @deprecated AnalysisDriverScheduler scheduler,
-      String sdkPath,
-      String sdkSummaryPath}) {
+      List<String>? librarySummaryPaths,
+      @deprecated PerformanceLog? performanceLog,
+      bool retainDataForTesting = false,
+      @deprecated AnalysisDriverScheduler? scheduler,
+      String? sdkPath,
+      String? sdkSummaryPath}) {
     // TODO(scheglov) Remove this, and make `sdkPath` required.
     sdkPath ??= getSdkPath();
     ArgumentError.checkNotNull(sdkPath, 'sdkPath');
@@ -108,7 +107,7 @@
   Map<String, String> _toMap(DeclaredVariables declaredVariables) {
     Map<String, String> map = <String, String>{};
     for (String name in declaredVariables.variableNames) {
-      map[name] = declaredVariables.get(name);
+      map[name] = declaredVariables.get(name)!;
     }
     return map;
   }
diff --git a/pkg/analyzer/lib/src/dart/analysis/context_locator.dart b/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
index 65fdea6..24bd476 100644
--- a/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
@@ -13,7 +13,6 @@
 import 'package:analyzer/src/task/options.dart';
 import 'package:analyzer/src/util/yaml.dart';
 import 'package:glob/glob.dart';
-import 'package:meta/meta.dart';
 import 'package:path/path.dart';
 import 'package:yaml/yaml.dart';
 
@@ -37,23 +36,22 @@
   /// Initialize a newly created context locator. If a [resourceProvider] is
   /// supplied, it will be used to access the file system. Otherwise the default
   /// resource provider will be used.
-  ContextLocatorImpl({ResourceProvider resourceProvider})
+  ContextLocatorImpl({ResourceProvider? resourceProvider})
       : resourceProvider =
             resourceProvider ?? PhysicalResourceProvider.INSTANCE;
 
   @override
   List<ContextRoot> locateRoots(
-      {@required List<String> includedPaths,
-      List<String> excludedPaths,
-      String optionsFile,
-      String packagesFile}) {
+      {required List<String> includedPaths,
+      List<String>? excludedPaths,
+      String? optionsFile,
+      String? packagesFile}) {
     //
     // Compute the list of folders and files that are to be included.
     //
     List<Folder> includedFolders = <Folder>[];
     List<File> includedFiles = <File>[];
-    _resourcesFromPaths(
-        includedPaths ?? const <String>[], includedFolders, includedFiles);
+    _resourcesFromPaths(includedPaths, includedFolders, includedFiles);
     //
     // Compute the list of folders and files that are to be excluded.
     //
@@ -81,14 +79,14 @@
     // analyzed. For each, walk the directory structure and figure out where to
     // create context roots.
     //
-    File defaultOptionsFile;
+    File? defaultOptionsFile;
     if (optionsFile != null) {
       defaultOptionsFile = resourceProvider.getFile(optionsFile);
       if (!defaultOptionsFile.exists) {
         defaultOptionsFile = null;
       }
     }
-    File defaultPackagesFile;
+    File? defaultPackagesFile;
     if (packagesFile != null) {
       defaultPackagesFile = resourceProvider.getFile(packagesFile);
       if (!defaultPackagesFile.exists) {
@@ -108,7 +106,7 @@
     }
     Map<Folder, ContextRoot> rootMap = <Folder, ContextRoot>{};
     for (File file in includedFiles) {
-      Folder parent = file.parent;
+      Folder parent = file.parent!;
       ContextRoot root = rootMap.putIfAbsent(parent, () {
         ContextRootImpl root = ContextRootImpl(resourceProvider, parent);
         root.packagesFile = defaultPackagesFile ?? _findPackagesFile(parent);
@@ -144,17 +142,17 @@
       List<Folder> excludedFolders,
       ContextRoot containingRoot,
       List<Glob> excludedGlobs,
-      File optionsFile,
-      File packagesFile) {
+      File? optionsFile,
+      File? packagesFile) {
     //
     // If the options and packages files are allowed to be locally specified,
     // then look to see whether they are.
     //
-    File localOptionsFile;
+    File? localOptionsFile;
     if (optionsFile == null) {
       localOptionsFile = _getOptionsFile(folder);
     }
-    File localPackagesFile;
+    File? localPackagesFile;
     if (packagesFile == null) {
       localPackagesFile = _getPackagesFile(folder);
     }
@@ -195,8 +193,8 @@
       List<Folder> excludedFolders,
       ContextRoot containingRoot,
       List<Glob> excludedGlobs,
-      File optionsFile,
-      File packagesFile) {
+      File? optionsFile,
+      File? packagesFile) {
     bool isExcluded(Folder folder) {
       if (excludedFolders.contains(folder) ||
           folder.shortName.startsWith('.')) {
@@ -234,13 +232,13 @@
   /// Return the analysis options file to be used to analyze files in the given
   /// [folder], or `null` if there is no analysis options file in the given
   /// folder or any parent folder.
-  File _findOptionsFile(Folder folder) {
-    while (folder != null) {
-      File optionsFile = _getOptionsFile(folder);
+  File? _findOptionsFile(Folder? folder) {
+    for (Folder? current = folder; current != null;) {
+      File? optionsFile = _getOptionsFile(current);
       if (optionsFile != null) {
         return optionsFile;
       }
-      folder = folder.parent;
+      current = current.parent;
     }
     return null;
   }
@@ -248,13 +246,13 @@
   /// Return the packages file to be used to analyze files in the given
   /// [folder], or `null` if there is no packages file in the given folder or
   /// any parent folder.
-  File _findPackagesFile(Folder folder) {
-    while (folder != null) {
-      File packagesFile = _getPackagesFile(folder);
+  File? _findPackagesFile(Folder folder) {
+    for (Folder? current = folder; current != null;) {
+      File? packagesFile = _getPackagesFile(current);
       if (packagesFile != null) {
         return packagesFile;
       }
-      folder = folder.parent;
+      current = current.parent;
     }
     return null;
   }
@@ -266,24 +264,24 @@
   /// associated with the context root.
   List<Glob> _getExcludedGlobs(ContextRootImpl root) {
     List<Glob> patterns = [];
-    File optionsFile = root.optionsFile;
+    File? optionsFile = root.optionsFile;
     if (optionsFile != null) {
       try {
         String content = optionsFile.readAsStringSync();
         YamlNode doc = loadYamlNode(content);
         if (doc is YamlMap) {
-          YamlNode analyzerOptions = getValue(doc, AnalyzerOptions.analyzer);
+          var analyzerOptions = getValue(doc, AnalyzerOptions.analyzer);
           if (analyzerOptions is YamlMap) {
-            YamlNode excludeOptions =
+            var excludeOptions =
                 getValue(analyzerOptions, AnalyzerOptions.exclude);
             if (excludeOptions is YamlList) {
-              List<String> excludeList = toStringList(excludeOptions);
+              List<String>? excludeList = toStringList(excludeOptions);
               if (excludeList != null) {
                 for (String excludedPath in excludeList) {
                   Context context = resourceProvider.pathContext;
                   if (context.isRelative(excludedPath)) {
                     excludedPath = posix.joinAll([
-                      ...context.split(optionsFile.parent.path),
+                      ...context.split(optionsFile.parent!.path),
                       ...posix.split(excludedPath),
                     ]);
                   }
@@ -303,7 +301,7 @@
 
   /// If the given [directory] contains a file with the given [name], then
   /// return the file. Otherwise, return `null`.
-  File _getFile(Folder directory, String name) {
+  File? _getFile(Folder directory, String name) {
     Resource resource = directory.getChild(name);
     if (resource is File && resource.exists) {
       return resource;
@@ -313,12 +311,12 @@
 
   /// Return the analysis options file in the given [folder], or `null` if the
   /// folder does not contain an analysis options file.
-  File _getOptionsFile(Folder folder) =>
+  File? _getOptionsFile(Folder folder) =>
       _getFile(folder, ANALYSIS_OPTIONS_NAME);
 
   /// Return the packages file in the given [folder], or `null` if the folder
   /// does not contain a packages file.
-  File _getPackagesFile(Folder folder) {
+  File? _getPackagesFile(Folder folder) {
     var file = folder
         .getChildAssumingFolder(DOT_DART_TOOL_NAME)
         .getChildAssumingFile(PACKAGE_CONFIG_JSON_NAME);
diff --git a/pkg/analyzer/lib/src/dart/analysis/context_root.dart b/pkg/analyzer/lib/src/dart/analysis/context_root.dart
index 5888139..6045b3b 100644
--- a/pkg/analyzer/lib/src/dart/analysis/context_root.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/context_root.dart
@@ -26,10 +26,10 @@
   List<Glob> excludedGlobs = [];
 
   @override
-  File optionsFile;
+  File? optionsFile;
 
   @override
-  File packagesFile;
+  File? packagesFile;
 
   /// Initialize a newly created context root.
   ContextRootImpl(this.resourceProvider, this.root);
diff --git a/pkg/analyzer/lib/src/dart/analysis/defined_names.dart b/pkg/analyzer/lib/src/dart/analysis/defined_names.dart
index ed3cfb7..c308535 100644
--- a/pkg/analyzer/lib/src/dart/analysis/defined_names.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/defined_names.dart
@@ -8,8 +8,8 @@
 DefinedNames computeDefinedNames(CompilationUnit unit) {
   DefinedNames names = DefinedNames();
 
-  void appendName(Set<String> names, SimpleIdentifier node) {
-    String name = node?.name;
+  void appendName(Set<String> names, SimpleIdentifier? node) {
+    var name = node?.name;
     if (name != null && name.isNotEmpty) {
       names.add(name);
     }
diff --git a/pkg/analyzer/lib/src/dart/analysis/dependency/library_builder.dart b/pkg/analyzer/lib/src/dart/analysis/dependency/library_builder.dart
index 9b9a320..836177c 100644
--- a/pkg/analyzer/lib/src/dart/analysis/dependency/library_builder.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/dependency/library_builder.dart
@@ -58,7 +58,7 @@
   final Uri uri;
 
   /// The import prefix, or `null` if not specified.
-  final String prefix;
+  final String? prefix;
 
   /// The list of namespace combinators to apply, not `null`.
   final List<Combinator> combinators;
@@ -83,7 +83,7 @@
   final List<Export> exports;
 
   /// The list of libraries that correspond to the [imports].
-  List<Library> importedLibraries;
+  List<Library>? importedLibraries;
 
   /// The list of top-level nodes defined in the library.
   ///
@@ -98,13 +98,13 @@
   /// directives, or declared in this library.
   ///
   /// This list is sorted.
-  List<Node> exportedNodes;
+  List<Node>? exportedNodes;
 
   /// The map of nodes that are visible in the library, either imported,
   /// or declared in this library.
   ///
   /// TODO(scheglov) support for imports with prefixes
-  Map<String, Node> libraryScope;
+  Map<String, Node>? libraryScope;
 
   Library(this.uri, this.imports, this.exports, this.declaredNodes) {
     for (var node in declaredNodes) {
@@ -140,13 +140,13 @@
   /// It is mixed into every API token signature, because for example even
   /// though types of two functions might be the same, their locations
   /// are different.
-  List<int> uriSignature;
+  late List<int> uriSignature;
 
   /// The name of the enclosing class name, or `null` if outside a class.
-  String enclosingClassName;
+  String? enclosingClassName;
 
   /// The super class of the enclosing class, or `null` if outside a class.
-  TypeName enclosingSuperClass;
+  TypeName? enclosingSuperClass;
 
   /// The precomputed signature of the enclosing class name, or `null` if
   /// outside a class.
@@ -154,10 +154,10 @@
   /// It is mixed into every API token signature of every class member, because
   /// for example even though types of two methods might be the same, their
   /// locations are different.
-  List<int> enclosingClassNameSignature;
+  List<int>? enclosingClassNameSignature;
 
   /// The node of the enclosing class.
-  Node enclosingClass;
+  Node? enclosingClass;
 
   _LibraryBuilder(this.uri, this.units);
 
@@ -182,7 +182,7 @@
     }
 
     enclosingClassNameSignature =
-        (ApiSignature()..addString(enclosingClassName)).toByteList();
+        (ApiSignature()..addString(enclosingClassName!)).toByteList();
 
     var apiTokenSignature = _computeTokenSignature(
       node.beginToken,
@@ -212,7 +212,7 @@
     }
 
     enclosingClass = Node(
-      LibraryQualifiedName(uri, enclosingClassName),
+      LibraryQualifiedName(uri, enclosingClassName!),
       node is MixinDeclaration ? NodeKind.MIXIN : NodeKind.CLASS,
       api,
       Dependencies.none,
@@ -226,7 +226,7 @@
     List<Node> classTypeParameters;
     if (node.typeParameters != null) {
       classTypeParameters = <Node>[];
-      for (var typeParameter in node.typeParameters.typeParameters) {
+      for (var typeParameter in node.typeParameters!.typeParameters) {
         var api = referenceCollector.collect(
           _computeNodeTokenSignature(typeParameter),
           enclosingClassName: enclosingClassName,
@@ -238,11 +238,11 @@
           NodeKind.TYPE_PARAMETER,
           api,
           Dependencies.none,
-          enclosingClass: enclosingClass,
+          enclosingClass: enclosingClass!,
         ));
       }
       classTypeParameters.sort(Node.compare);
-      enclosingClass.setTypeParameters(classTypeParameters);
+      enclosingClass!.setTypeParameters(classTypeParameters);
     }
 
     var classMembers = <Node>[];
@@ -271,14 +271,14 @@
         NodeKind.CONSTRUCTOR,
         Dependencies.none,
         Dependencies.none,
-        enclosingClass: enclosingClass,
+        enclosingClass: enclosingClass!,
       ));
     }
 
     classMembers.sort(Node.compare);
-    enclosingClass.setClassMembers(classMembers);
+    enclosingClass!.setClassMembers(classMembers);
 
-    declaredNodes.add(enclosingClass);
+    declaredNodes.add(enclosingClass!);
     enclosingClassName = null;
     enclosingClassNameSignature = null;
     enclosingSuperClass = null;
@@ -331,7 +331,7 @@
       NodeKind.CONSTRUCTOR,
       api,
       impl,
-      enclosingClass: enclosingClass,
+      enclosingClass: enclosingClass!,
     ));
   }
 
@@ -392,7 +392,7 @@
     for (var directive in units.first.directives) {
       if (directive is ExportDirective) {
         var refUri = directive.uri.stringValue;
-        var importUri = uri.resolve(refUri);
+        var importUri = uri.resolve(refUri!);
         var combinators = _getCombinators(directive);
         exports.add(Export(importUri, combinators));
       }
@@ -466,22 +466,23 @@
   }
 
   void _addGenericTypeAlias(GenericTypeAlias node) {
+    // TODO(scheglov) Support all types.
     var functionType = node.functionType;
 
     var builder = _newApiSignatureBuilder();
     _appendMetadataTokens(builder, node.metadata);
     _appendNodeTokens(builder, node.typeParameters);
-    _appendNodeTokens(builder, functionType.returnType);
-    _appendNodeTokens(builder, functionType.typeParameters);
-    _appendFormalParametersTokens(builder, functionType.parameters);
+    _appendNodeTokens(builder, functionType?.returnType);
+    _appendNodeTokens(builder, functionType?.typeParameters);
+    _appendFormalParametersTokens(builder, functionType?.parameters);
     var apiTokenSignature = builder.toByteList();
 
     var api = referenceCollector.collect(
       apiTokenSignature,
       typeParameters: node.typeParameters,
-      typeParameters2: functionType.typeParameters,
-      formalParameters: functionType.parameters,
-      returnType: functionType.returnType,
+      typeParameters2: functionType?.typeParameters,
+      formalParameters: functionType?.parameters,
+      returnType: functionType?.returnType,
     );
 
     declaredNodes.add(Node(
@@ -498,7 +499,7 @@
     for (var directive in units.first.directives) {
       if (directive is ImportDirective) {
         var refUri = directive.uri.stringValue;
-        var importUri = uri.resolve(refUri);
+        var importUri = uri.resolve(refUri!);
 
         if (importUri.toString() == 'dart:core') {
           hasDartCoreImport = true;
@@ -506,10 +507,11 @@
 
         var combinators = _getCombinators(directive);
 
-        imports.add(Import(importUri, directive.prefix?.name, combinators));
+        var prefix = directive.prefix;
+        imports.add(Import(importUri, prefix?.name, combinators));
 
-        if (directive.prefix != null) {
-          referenceCollector.addImportPrefix(directive.prefix.name);
+        if (prefix != null) {
+          referenceCollector.addImportPrefix(prefix.name);
         }
       }
     }
@@ -557,7 +559,7 @@
 
     var name = LibraryQualifiedName(uri, node.name.name);
     classMembers.add(
-      Node(name, kind, api, impl, enclosingClass: enclosingClass),
+      Node(name, kind, api, impl, enclosingClass: enclosingClass!),
     );
   }
 
@@ -648,7 +650,7 @@
   }
 
   /// Return the signature for all tokens of the [node].
-  List<int> _computeNodeTokenSignature(AstNode node) {
+  List<int> _computeNodeTokenSignature(AstNode? node) {
     if (node == null) {
       return const <int>[];
     }
@@ -667,14 +669,14 @@
     var builder = ApiSignature();
     builder.addBytes(uriSignature);
     if (enclosingClassNameSignature != null) {
-      builder.addBytes(enclosingClassNameSignature);
+      builder.addBytes(enclosingClassNameSignature!);
     }
     return builder;
   }
 
   /// Append tokens of the given [parameters] to the [signature].
   static void _appendFormalParametersTokens(
-      ApiSignature signature, FormalParameterList parameters) {
+      ApiSignature signature, FormalParameterList? parameters) {
     if (parameters == null) return;
 
     for (var parameter in parameters.parameters) {
@@ -694,7 +696,7 @@
         _appendTokens(
           signature,
           parameter.beginToken,
-          parameter.type.endToken,
+          parameter.type!.endToken,
         );
         continue;
       }
@@ -706,15 +708,13 @@
 
   static void _appendMetadataTokens(
       ApiSignature signature, List<Annotation> metadata) {
-    if (metadata != null) {
-      for (var annotation in metadata) {
-        _appendNodeTokens(signature, annotation);
-      }
+    for (var annotation in metadata) {
+      _appendNodeTokens(signature, annotation);
     }
   }
 
   /// Append tokens of the given [node] to the [signature].
-  static void _appendNodeTokens(ApiSignature signature, AstNode node) {
+  static void _appendNodeTokens(ApiSignature signature, AstNode? node) {
     if (node != null) {
       _appendTokens(signature, node.beginToken, node.endToken);
     }
@@ -723,10 +723,10 @@
   /// Append tokens from [begin] to [end] (both including) to the [signature].
   static void _appendTokens(ApiSignature signature, Token begin, Token end) {
     if (begin is CommentToken) {
-      begin = (begin as CommentToken).parent;
+      begin = begin.parent!;
     }
 
-    Token token = begin;
+    Token? token = begin;
     while (token != null) {
       signature.addString(token.lexeme);
 
diff --git a/pkg/analyzer/lib/src/dart/analysis/dependency/node.dart b/pkg/analyzer/lib/src/dart/analysis/dependency/node.dart
index c7713fb..e99f616 100644
--- a/pkg/analyzer/lib/src/dart/analysis/dependency/node.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/dependency/node.dart
@@ -83,12 +83,12 @@
 
   /// All referenced nodes, computed from [unprefixedReferencedNames],
   /// [importPrefixedReferencedNames], and [classMemberReferences].
-  List<Node> referencedNodes;
+  List<Node>? referencedNodes;
 
   /// The transitive signature of this portion of the node, computed using
   /// the [tokenSignature] of this node, and API signatures of the
   /// [referencedNodes].
-  List<int> transitiveSignature;
+  List<int>? transitiveSignature;
 
   Dependencies(
       this.tokenSignature,
@@ -177,26 +177,26 @@
 
   /// If the node is a class member, the node of the enclosing class.
   /// Otherwise `null`.
-  final Node enclosingClass;
+  final Node? enclosingClass;
 
   /// If the node is a class, the nodes of its type parameters.
   /// Otherwise `null`.
-  List<Node> classTypeParameters;
+  List<Node>? classTypeParameters;
 
   /// If the node is a class, the sorted list of members in this class.
   /// Otherwise `null`.
-  List<Node> classMembers;
+  List<Node>? classMembers;
 
   Node(this.name, this.kind, this.api, this.impl,
       {this.enclosingClass, this.classTypeParameters});
 
   /// Return the node that can be referenced by the given [name] from the
   /// library with the given [libraryUri].
-  Node getClassMember(Uri libraryUri, String name) {
+  Node? getClassMember(Uri libraryUri, String name) {
     // TODO(scheglov) The list is sorted, use this fact to search faster.
     // TODO(scheglov) Collect superclass members here or outside.
-    for (var i = 0; i < classMembers.length; ++i) {
-      var member = classMembers[i];
+    for (var i = 0; i < classMembers!.length; ++i) {
+      var member = classMembers![i];
       var memberName = member.name;
       if (memberName.name == name && memberName.isAccessibleFor(libraryUri)) {
         return member;
diff --git a/pkg/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart b/pkg/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart
index 1314ccf..6f7679b 100644
--- a/pkg/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart
@@ -8,7 +8,6 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/analysis/dependency/node.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
-import 'package:meta/meta.dart';
 
 /// Collector of information about external nodes referenced by a node.
 ///
@@ -55,24 +54,24 @@
   /// Construct and return a new [Dependencies] with the given [tokenSignature]
   /// and all recorded references to external nodes in the given AST nodes.
   Dependencies collect(List<int> tokenSignature,
-      {String enclosingClassName,
-      String thisNodeName,
-      List<ConstructorInitializer> constructorInitializers,
-      TypeName enclosingSuperClass,
-      Expression expression,
-      ExtendsClause extendsClause,
-      FormalParameterList formalParameters,
-      FormalParameterList formalParametersForImpl,
-      FunctionBody functionBody,
-      ImplementsClause implementsClause,
-      OnClause onClause,
-      ConstructorName redirectedConstructor,
-      TypeAnnotation returnType,
-      TypeName superClass,
-      TypeAnnotation type,
-      TypeParameterList typeParameters,
-      TypeParameterList typeParameters2,
-      WithClause withClause}) {
+      {String? enclosingClassName,
+      String? thisNodeName,
+      List<ConstructorInitializer>? constructorInitializers,
+      TypeName? enclosingSuperClass,
+      Expression? expression,
+      ExtendsClause? extendsClause,
+      FormalParameterList? formalParameters,
+      FormalParameterList? formalParametersForImpl,
+      FunctionBody? functionBody,
+      ImplementsClause? implementsClause,
+      OnClause? onClause,
+      ConstructorName? redirectedConstructor,
+      TypeAnnotation? returnType,
+      TypeName? superClass,
+      TypeAnnotation? type,
+      TypeParameterList? typeParameters,
+      TypeParameterList? typeParameters2,
+      WithClause? withClause}) {
     _localScopes.enter();
 
     // The name of the node shadows any external names.
@@ -113,25 +112,14 @@
     var unprefixedReferencedNames = _unprefixedReferences.toList();
     _unprefixedReferences = _NameSet();
 
-    var importPrefixCount = 0;
-    for (var i = 0; i < _importPrefixedReferences.length; i++) {
-      var import = _importPrefixedReferences[i];
-      if (import.names.isNotEmpty) {
-        importPrefixCount++;
-      }
-    }
-
-    var importPrefixes = List<String>.filled(importPrefixCount, null);
-    var importPrefixedReferencedNames =
-        List<List<String>>.filled(importPrefixCount, null);
-    var importIndex = 0;
+    var importPrefixes = <String>[];
+    var importPrefixedReferencedNames = <List<String>>[];
     for (var i = 0; i < _importPrefixedReferences.length; i++) {
       var import = _importPrefixedReferences[i];
 
       if (import.names.isNotEmpty) {
-        importPrefixes[importIndex] = import.prefix;
-        importPrefixedReferencedNames[importIndex] = import.names.toList();
-        importIndex++;
+        importPrefixes.add(import.prefix);
+        importPrefixedReferencedNames.add(import.names.toList());
       }
 
       import.clear();
@@ -162,11 +150,11 @@
         return references;
       }
     }
-    return null;
+    throw StateError('Expected prefix: $name');
   }
 
   void _recordClassMemberReference(
-      {Expression target, DartType targetType, String name}) {
+      {Expression? target, DartType? targetType, required String name}) {
     if (target is Identifier) {
       var element = target.staticElement;
       if (element is ClassElement) {
@@ -174,7 +162,7 @@
         return;
       }
     }
-    targetType ??= target.staticType;
+    targetType ??= target!.staticType;
 
     if (targetType is InterfaceType) {
       _memberReferences.add(targetType.element, name);
@@ -195,7 +183,9 @@
     }
   }
 
-  void _visitArgumentList(ArgumentList node) {
+  void _visitArgumentList(ArgumentList? node) {
+    if (node == null) return;
+
     var arguments = node.arguments;
     for (var i = 0; i < arguments.length; i++) {
       var argument = arguments[i];
@@ -235,7 +225,7 @@
     _visitExpression(node.rightOperand);
   }
 
-  void _visitBlock(Block node) {
+  void _visitBlock(Block? node) {
     if (node == null) return;
 
     _visitStatements(node.statements);
@@ -250,7 +240,7 @@
     }
   }
 
-  void _visitCollectionElement(CollectionElement node) {
+  void _visitCollectionElement(CollectionElement? node) {
     if (node == null) {
       return;
     } else if (node is Expression) {
@@ -273,7 +263,7 @@
   }
 
   /// Record reference to the constructor of the [type] with the given [name].
-  void _visitConstructor(TypeName type, SimpleIdentifier name) {
+  void _visitConstructor(TypeName type, SimpleIdentifier? name) {
     _visitTypeAnnotation(type);
 
     if (name != null) {
@@ -284,7 +274,7 @@
   }
 
   void _visitConstructorInitializers(
-      TypeName superClass, List<ConstructorInitializer> initializers) {
+      TypeName? superClass, List<ConstructorInitializer>? initializers) {
     if (initializers == null) return;
 
     for (var i = 0; i < initializers.length; i++) {
@@ -295,7 +285,7 @@
       } else if (initializer is ConstructorFieldInitializer) {
         _visitExpression(initializer.expression);
       } else if (initializer is SuperConstructorInvocation) {
-        _visitConstructor(superClass, initializer.constructorName);
+        _visitConstructor(superClass!, initializer.constructorName);
         _visitArgumentList(initializer.argumentList);
       } else if (initializer is RedirectingConstructorInvocation) {
         _visitArgumentList(initializer.argumentList);
@@ -309,13 +299,13 @@
     }
   }
 
-  void _visitConstructorName(ConstructorName node) {
+  void _visitConstructorName(ConstructorName? node) {
     if (node == null) return;
 
     _visitConstructor(node.type, node.name);
   }
 
-  void _visitExpression(Expression node, {bool get = true, bool set = false}) {
+  void _visitExpression(Expression? node, {bool get = true, bool set = false}) {
     if (node == null) return;
 
     if (node is AdjacentStrings) {
@@ -405,7 +395,7 @@
     }
   }
 
-  void _visitForLoopParts(ForLoopParts node) {
+  void _visitForLoopParts(ForLoopParts? node) {
     if (node == null) {
       return;
     } else if (node is ForPartsWithDeclarations) {
@@ -429,7 +419,7 @@
     }
   }
 
-  void _visitFormalParameterList(FormalParameterList node) {
+  void _visitFormalParameterList(FormalParameterList? node) {
     if (node == null) return;
 
     var parameters = node.parameters;
@@ -440,7 +430,7 @@
         parameter = defaultParameter.parameter;
       }
       if (parameter.identifier != null) {
-        _localScopes.add(parameter.identifier.name);
+        _localScopes.add(parameter.identifier!.name);
       }
       if (parameter is FieldFormalParameter) {
         _visitTypeAnnotation(parameter.type);
@@ -459,7 +449,7 @@
     }
   }
 
-  void _visitFormalParameterListImpl(FormalParameterList node) {
+  void _visitFormalParameterListImpl(FormalParameterList? node) {
     if (node == null) return;
 
     var parameters = node.parameters;
@@ -473,7 +463,7 @@
       }
 
       if (parameter.identifier != null) {
-        _localScopes.add(parameter.identifier.name);
+        _localScopes.add(parameter.identifier!.name);
       }
     }
   }
@@ -487,7 +477,7 @@
     _localScopes.exit();
   }
 
-  void _visitFunctionBody(FunctionBody node) {
+  void _visitFunctionBody(FunctionBody? node) {
     if (node == null) return;
 
     if (node is BlockFunctionBody) {
@@ -517,7 +507,7 @@
   }
 
   void _visitIndexExpression(IndexExpression node,
-      {@required bool get, @required bool set}) {
+      {required bool get, required bool set}) {
     var target = node.target;
     if (target == null) {
       // no dependencies
@@ -616,7 +606,7 @@
   }
 
   void _visitPropertyAccess(PropertyAccess node,
-      {@required bool get, @required bool set}) {
+      {required bool get, required bool set}) {
     var realTarget = node.realTarget;
     var name = node.propertyName.name;
 
@@ -648,7 +638,7 @@
   }
 
   void _visitSimpleIdentifier(SimpleIdentifier node,
-      {@required bool get, @required bool set}) {
+      {required bool get, required bool set}) {
     if (node.isSynthetic) return;
 
     var name = node.name;
@@ -667,7 +657,7 @@
     }
   }
 
-  void _visitStatement(Statement node) {
+  void _visitStatement(Statement? node) {
     if (node == null) return;
 
     if (node is AssertStatement) {
@@ -787,14 +777,14 @@
     _visitBlock(node.finallyBlock);
   }
 
-  void _visitTypeAnnotation(TypeAnnotation node) {
+  void _visitTypeAnnotation(TypeAnnotation? node) {
     if (node == null) return;
 
     if (node is GenericFunctionType) {
       _localScopes.enter();
 
       if (node.typeParameters != null) {
-        var typeParameters = node.typeParameters.typeParameters;
+        var typeParameters = node.typeParameters!.typeParameters;
         for (var i = 0; i < typeParameters.length; i++) {
           var typeParameter = typeParameters[i];
           _localScopes.add(typeParameter.name.name);
@@ -818,7 +808,7 @@
     }
   }
 
-  void _visitTypeAnnotations(List<TypeAnnotation> typeAnnotations) {
+  void _visitTypeAnnotations(List<TypeAnnotation>? typeAnnotations) {
     if (typeAnnotations == null) return;
 
     for (var i = 0; i < typeAnnotations.length; i++) {
@@ -827,13 +817,13 @@
     }
   }
 
-  void _visitTypeArguments(TypeArgumentList node) {
+  void _visitTypeArguments(TypeArgumentList? node) {
     if (node == null) return;
 
     _visitTypeAnnotations(node.arguments);
   }
 
-  void _visitTypeParameterList(TypeParameterList node) {
+  void _visitTypeParameterList(TypeParameterList? node) {
     if (node == null) return;
 
     var typeParameters = node.typeParameters;
@@ -851,7 +841,7 @@
     }
   }
 
-  void _visitVariableList(VariableDeclarationList node) {
+  void _visitVariableList(VariableDeclarationList? node) {
     if (node == null) return;
 
     _visitTypeAnnotation(node.type);
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 9792278..7c67e46 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -86,7 +86,7 @@
 /// TODO(scheglov) Clean up the list of implicitly analyzed files.
 class AnalysisDriver implements AnalysisDriverGeneric {
   /// The version of data format, should be incremented on every format change.
-  static const int DATA_VERSION = 122;
+  static const int DATA_VERSION = 125;
 
   /// The length of the list returned by [_computeDeclaredVariablesSignature].
   static const int _declaredVariablesSignatureLength = 4;
@@ -113,11 +113,11 @@
   /// The optional store with externally provided unlinked and corresponding
   /// linked summaries. These summaries are always added to the store for any
   /// file analysis.
-  final SummaryDataStore _externalSummaries;
+  final SummaryDataStore? _externalSummaries;
 
   /// This [ContentCache] is consulted for a file content before reading
   /// the content from the file.
-  final FileContentOverlay _contentOverlay;
+  final FileContentOverlay? _contentOverlay;
 
   /// The analysis options to analyze with.
   AnalysisOptionsImpl _analysisOptions;
@@ -133,10 +133,10 @@
   DeclaredVariables declaredVariables = DeclaredVariables();
 
   /// Information about the context root being analyzed by this driver.
-  final ContextRoot contextRoot;
+  final ContextRoot? contextRoot;
 
   /// The analysis context that created this driver / session.
-  api.AnalysisContext analysisContext;
+  api.AnalysisContext? analysisContext;
 
   /// The salt to mix into all hashes used as keys for unlinked data.
   final Uint32List _saltForUnlinked =
@@ -167,7 +167,7 @@
   /// The task that discovers available files.  If this field is not `null`,
   /// and the task is not completed, it should be performed and completed
   /// before any name searching task.
-  _DiscoverAvailableFilesTask _discoverAvailableFilesTask;
+  _DiscoverAvailableFilesTask? _discoverAvailableFilesTask;
 
   /// The list of tasks to compute files defining a class member name.
   final _definingClassMemberNameTasks = <_FilesDefiningClassMemberNameTask>[];
@@ -220,7 +220,7 @@
   final _resultController = StreamController<ResolvedUnitResult>();
 
   /// The stream that will be written to when analysis results are produced.
-  Stream<ResolvedUnitResult> _onResults;
+  late final Stream<ResolvedUnitResult> _onResults;
 
   /// Resolution signatures of the most recently produced results for files.
   final Map<String, String> _lastProducedSignatures = {};
@@ -233,36 +233,36 @@
       StreamController<ExceptionResult>();
 
   /// The instance of the [Search] helper.
-  Search _search;
+  late final Search _search;
 
-  AnalysisDriverTestView _testView;
+  late final AnalysisDriverTestView _testView;
 
-  FeatureSetProvider featureSetProvider;
+  late FeatureSetProvider featureSetProvider;
 
-  FileSystemState _fsState;
+  late FileSystemState _fsState;
 
   /// The [FileTracker] used by this driver.
-  FileTracker _fileTracker;
+  late FileTracker _fileTracker;
 
   /// Whether resolved units should be indexed.
   final bool enableIndex;
 
   /// The current analysis session.
-  AnalysisSessionImpl _currentSession;
+  late AnalysisSessionImpl _currentSession;
 
   /// The current library context, consistent with the [_currentSession].
   ///
   /// TODO(scheglov) We probably should tie it into the session.
-  LibraryContext _libraryContext;
+  LibraryContext? _libraryContext;
 
   /// This function is invoked when the current session is about to be discarded.
   /// The argument represents the path of the resource causing the session
   /// to be discarded or `null` if there are multiple or this is unknown.
-  void Function(String) onCurrentSessionAboutToBeDiscarded;
+  void Function(String?)? onCurrentSessionAboutToBeDiscarded;
 
   /// If testing data is being retained, a pointer to the object that is
   /// retaining the testing data.  Otherwise `null`.
-  final TestingData testingData;
+  final TestingData? testingData;
 
   /// Create a new instance of [AnalysisDriver].
   ///
@@ -277,9 +277,9 @@
       this.contextRoot,
       SourceFactory sourceFactory,
       this._analysisOptions,
-      {Packages packages,
+      {Packages? packages,
       this.enableIndex = false,
-      SummaryDataStore externalSummaries,
+      SummaryDataStore? externalSummaries,
       bool retainDataForTesting = false})
       : _logger = logger,
         _packages = packages ?? Packages.empty,
@@ -301,7 +301,7 @@
   AnalysisOptions get analysisOptions => _analysisOptions;
 
   /// Return the current analysis session.
-  AnalysisSession get currentSession => _currentSession;
+  AnalysisSessionImpl get currentSession => _currentSession;
 
   /// Return the stream that produces [ExceptionResult]s.
   Stream<ExceptionResult> get exceptions => _exceptionController.stream;
@@ -387,7 +387,7 @@
       return AnalysisDriverPriority.interactive;
     }
     if (_discoverAvailableFilesTask != null &&
-        !_discoverAvailableFilesTask.isCompleted) {
+        !_discoverAvailableFilesTask!.isCompleted) {
       return AnalysisDriverPriority.interactive;
     }
     if (_definingClassMemberNameTasks.isNotEmpty ||
@@ -495,10 +495,10 @@
   /// At least one of the optional parameters should be provided, but only those
   /// that represent state that has actually changed need be provided.
   void configure({
-    api.AnalysisContext analysisContext,
-    AnalysisOptions analysisOptions,
-    Packages packages,
-    SourceFactory sourceFactory,
+    api.AnalysisContext? analysisContext,
+    AnalysisOptionsImpl? analysisOptions,
+    Packages? packages,
+    SourceFactory? sourceFactory,
   }) {
     if (analysisContext != null) {
       this.analysisContext = analysisContext;
@@ -521,12 +521,12 @@
   /// potentially available is done, so that they are included in [knownFiles].
   Future<void> discoverAvailableFiles() {
     if (_discoverAvailableFilesTask != null &&
-        _discoverAvailableFilesTask.isCompleted) {
+        _discoverAvailableFilesTask!.isCompleted) {
       return Future.value();
     }
     _discoverAvailableFiles();
     _scheduler.notify(this);
-    return _discoverAvailableFilesTask.completer.future;
+    return _discoverAvailableFilesTask!.completer!.future;
   }
 
   @override
@@ -541,7 +541,7 @@
   /// The [path] must be absolute and normalized.
   ///
   /// The [path] can be any file - explicitly or implicitly analyzed, or neither.
-  ResolvedUnitResult getCachedResult(String path) {
+  ResolvedUnitResult? getCachedResult(String path) {
     _throwIfNotAbsolutePath(path);
     return _priorityResults[path];
   }
@@ -554,7 +554,7 @@
   ///
   /// This method does not use analysis priorities, and must not be used in
   /// interactive analysis, such as Analysis Server or its plugins.
-  Future<ErrorsResult> getErrors(String path) async {
+  Future<ErrorsResult?> getErrors(String path) async {
     _throwIfNotAbsolutePath(path);
     if (!_fsState.hasUri(path)) {
       return null;
@@ -601,7 +601,7 @@
   /// Return a [Future] that completes with the [AnalysisDriverUnitIndex] for
   /// the file with the given [path], or with `null` if the file cannot be
   /// analyzed.
-  Future<AnalysisDriverUnitIndex> getIndex(String path) {
+  Future<AnalysisDriverUnitIndex?> getIndex(String path) {
     _throwIfNotAbsolutePath(path);
     if (!enableIndex) {
       throw ArgumentError('Indexing is not enabled.');
@@ -640,7 +640,7 @@
       throw ArgumentError('$uri is not a library.');
     }
 
-    UnitElementResult unitResult = await getUnitElement(file.path);
+    UnitElementResult unitResult = (await getUnitElement(file.path!))!;
     return unitResult.element.library;
   }
 
@@ -678,7 +678,11 @@
   /// Throw [ArgumentError] if the given [uri] is not the defining compilation
   /// unit for a library (that is, is a part of a library).
   ParsedLibraryResult getParsedLibraryByUri(Uri uri) {
-    FileState file = _fsState.getFileForUri(uri);
+    var file = _fsState.getFileForUri(uri);
+
+    if (file == null) {
+      throw ArgumentError('URI cannot be resolved: $uri');
+    }
 
     if (file.isExternalLibrary) {
       return ParsedLibraryResultImpl.external(currentSession, file.uri);
@@ -689,7 +693,7 @@
     }
 
     // The file is a local file, we can get the result.
-    return getParsedLibrary(file.path);
+    return getParsedLibrary(file.path!);
   }
 
   /// Return a [Future] that completes with a [ResolvedLibraryResult] for the
@@ -749,7 +753,11 @@
   /// [changeFile]), prior to the next time the analysis state transitions
   /// to "idle".
   Future<ResolvedLibraryResult> getResolvedLibraryByUri(Uri uri) {
-    FileState file = _fsState.getFileForUri(uri);
+    var file = _fsState.getFileForUri(uri);
+
+    if (file == null) {
+      throw ArgumentError('URI cannot be resolved: $uri');
+    }
 
     if (file.isExternalLibrary) {
       return Future.value(
@@ -762,7 +770,7 @@
     }
 
     // The file is a local file, we can get the result.
-    return getResolvedLibrary(file.path);
+    return getResolvedLibrary(file.path!);
   }
 
   ApiSignature getResolvedUnitKeyByPath(String path) {
@@ -790,7 +798,7 @@
   /// it, which is consistent with the current file state (including new states
   /// of the files previously reported using [changeFile]), prior to the next
   /// time the analysis state transitions to "idle".
-  Future<ResolvedUnitResult> getResult(String path,
+  Future<ResolvedUnitResult?> getResult(String path,
       {bool sendCachedToStream = false}) {
     _throwIfNotAbsolutePath(path);
     if (!_fsState.hasUri(path)) {
@@ -799,7 +807,7 @@
 
     // Return the cached result.
     {
-      ResolvedUnitResult result = getCachedResult(path);
+      ResolvedUnitResult? result = getCachedResult(path);
       if (result != null) {
         if (sendCachedToStream) {
           _resultController.add(result);
@@ -822,7 +830,7 @@
   /// be analyzed, the [Future] completes with `null`.
   ///
   /// The [path] must be absolute and normalized.
-  Future<SourceKind> getSourceKind(String path) async {
+  Future<SourceKind?> getSourceKind(String path) async {
     _throwIfNotAbsolutePath(path);
     if (AnalysisEngine.isDartFileName(path)) {
       FileState file = _fileTracker.getFile(path);
@@ -833,7 +841,7 @@
 
   /// Return a [Future] that completes with the [UnitElementResult] for the
   /// file with the given [path], or with `null` if the file cannot be analyzed.
-  Future<UnitElementResult> getUnitElement(String path) {
+  Future<UnitElementResult?> getUnitElement(String path) {
     _throwIfNotAbsolutePath(path);
     if (!_fsState.hasUri(path)) {
       return Future.value();
@@ -917,7 +925,7 @@
     FileState file = _fileTracker.getFile(path);
     RecordingErrorListener listener = RecordingErrorListener();
     CompilationUnit unit = file.parse(listener);
-    return ParsedUnitResultImpl(currentSession, file.path, file.uri,
+    return ParsedUnitResultImpl(currentSession, file.path!, file.uri,
         file.content, file.lineInfo, file.isPart, unit, listener.errors);
   }
 
@@ -931,16 +939,16 @@
     if (_requestedFiles.isNotEmpty) {
       String path = _requestedFiles.keys.first;
       try {
-        AnalysisResult result = _computeAnalysisResult(path, withUnit: true);
+        var result = _computeAnalysisResult(path, withUnit: true);
         // If a part without a library, delay its analysis.
         if (result == null) {
           _requestedParts
               .putIfAbsent(path, () => [])
-              .addAll(_requestedFiles.remove(path));
+              .addAll(_requestedFiles.remove(path)!);
           return;
         }
         // Notify the completers.
-        _requestedFiles.remove(path).forEach((completer) {
+        _requestedFiles.remove(path)!.forEach((completer) {
           completer.complete(result);
         });
         // Remove from to be analyzed and produce it now.
@@ -949,7 +957,7 @@
       } catch (exception, stackTrace) {
         _reportException(path, exception, stackTrace);
         _fileTracker.fileWasAnalyzed(path);
-        _requestedFiles.remove(path).forEach((completer) {
+        _requestedFiles.remove(path)!.forEach((completer) {
           completer.completeError(exception, stackTrace);
         });
         _clearLibraryContextAfterException();
@@ -962,11 +970,11 @@
       String path = _requestedLibraries.keys.first;
       try {
         var result = _computeResolvedLibrary(path);
-        _requestedLibraries.remove(path).forEach((completer) {
+        _requestedLibraries.remove(path)!.forEach((completer) {
           completer.complete(result);
         });
       } catch (exception, stackTrace) {
-        _requestedLibraries.remove(path).forEach((completer) {
+        _requestedLibraries.remove(path)!.forEach((completer) {
           completer.completeError(exception, stackTrace);
         });
         _clearLibraryContextAfterException();
@@ -977,7 +985,7 @@
     // Process an error request.
     if (_errorsRequestedFiles.isNotEmpty) {
       var path = _errorsRequestedFiles.keys.first;
-      var completers = _errorsRequestedFiles.remove(path);
+      var completers = _errorsRequestedFiles.remove(path)!;
       var result = _computeErrors(path: path, asIsIfPartWithoutLibrary: false);
       if (result != null) {
         completers.forEach((completer) {
@@ -993,7 +1001,7 @@
     if (_indexRequestedFiles.isNotEmpty) {
       String path = _indexRequestedFiles.keys.first;
       AnalysisDriverUnitIndex index = _computeIndex(path);
-      _indexRequestedFiles.remove(path).forEach((completer) {
+      _indexRequestedFiles.remove(path)!.forEach((completer) {
         completer.complete(index);
       });
       return;
@@ -1002,8 +1010,8 @@
     // Process a unit element key request.
     if (_unitElementSignatureFiles.isNotEmpty) {
       String path = _unitElementSignatureFiles.keys.first;
-      String signature = _computeUnitElementSignature(path);
-      var completers = _unitElementSignatureFiles.remove(path);
+      String? signature = _computeUnitElementSignature(path);
+      var completers = _unitElementSignatureFiles.remove(path)!;
       if (signature != null) {
         completers.forEach((completer) {
           completer.complete(signature);
@@ -1019,8 +1027,8 @@
     // Process a unit element request.
     if (_unitElementRequestedFiles.isNotEmpty) {
       String path = _unitElementRequestedFiles.keys.first;
-      UnitElementResult result = _computeUnitElement(path);
-      var completers = _unitElementRequestedFiles.remove(path);
+      UnitElementResult? result = _computeUnitElement(path);
+      var completers = _unitElementRequestedFiles.remove(path)!;
       if (result != null) {
         completers.forEach((completer) {
           completer.complete(result);
@@ -1035,8 +1043,8 @@
 
     // Discover available files.
     if (_discoverAvailableFilesTask != null &&
-        !_discoverAvailableFilesTask.isCompleted) {
-      _discoverAvailableFilesTask.perform();
+        !_discoverAvailableFilesTask!.isCompleted) {
+      _discoverAvailableFilesTask!.perform();
       return;
     }
 
@@ -1066,8 +1074,7 @@
       for (String path in _priorityFiles) {
         if (_fileTracker.isFilePending(path)) {
           try {
-            AnalysisResult result =
-                _computeAnalysisResult(path, withUnit: true);
+            var result = _computeAnalysisResult(path, withUnit: true);
             if (result == null) {
               _partsToAnalyze.add(path);
             } else {
@@ -1088,7 +1095,7 @@
     if (_fileTracker.hasPendingFiles) {
       String path = _fileTracker.anyPendingFile;
       try {
-        AnalysisResult result = _computeAnalysisResult(path,
+        var result = _computeAnalysisResult(path,
             withUnit: false, skipIfSameSignature: true);
         if (result == null) {
           _partsToAnalyze.add(path);
@@ -1097,7 +1104,7 @@
           // last time, so we don't need to produce it again now.
         } else {
           _resultController.add(result);
-          _lastProducedSignatures[result.path] = result._signature;
+          _lastProducedSignatures[result.path!] = result._signature;
         }
       } catch (exception, stackTrace) {
         _reportException(path, exception, stackTrace);
@@ -1112,10 +1119,10 @@
     if (_requestedParts.isNotEmpty) {
       String path = _requestedParts.keys.first;
       try {
-        AnalysisResult result = _computeAnalysisResult(path,
-            withUnit: true, asIsIfPartWithoutLibrary: true);
+        var result = _computeAnalysisResult(path,
+            withUnit: true, asIsIfPartWithoutLibrary: true)!;
         // Notify the completers.
-        _requestedParts.remove(path).forEach((completer) {
+        _requestedParts.remove(path)!.forEach((completer) {
           completer.complete(result);
         });
         // Remove from to be analyzed and produce it now.
@@ -1124,7 +1131,7 @@
       } catch (exception, stackTrace) {
         _reportException(path, exception, stackTrace);
         _partsToAnalyze.remove(path);
-        _requestedParts.remove(path).forEach((completer) {
+        _requestedParts.remove(path)!.forEach((completer) {
           completer.completeError(exception, stackTrace);
         });
         _clearLibraryContextAfterException();
@@ -1137,9 +1144,9 @@
       String path = _partsToAnalyze.first;
       _partsToAnalyze.remove(path);
       try {
-        AnalysisResult result = _computeAnalysisResult(path,
+        var result = _computeAnalysisResult(path,
             withUnit: _priorityFiles.contains(path),
-            asIsIfPartWithoutLibrary: true);
+            asIsIfPartWithoutLibrary: true)!;
         _resultController.add(result);
       } catch (exception, stackTrace) {
         _reportException(path, exception, stackTrace);
@@ -1152,8 +1159,8 @@
     if (_unitElementSignatureParts.isNotEmpty) {
       String path = _unitElementSignatureParts.keys.first;
       String signature =
-          _computeUnitElementSignature(path, asIsIfPartWithoutLibrary: true);
-      _unitElementSignatureParts.remove(path).forEach((completer) {
+          _computeUnitElementSignature(path, asIsIfPartWithoutLibrary: true)!;
+      _unitElementSignatureParts.remove(path)!.forEach((completer) {
         completer.complete(signature);
       });
       return;
@@ -1163,8 +1170,8 @@
     if (_unitElementRequestedParts.isNotEmpty) {
       String path = _unitElementRequestedParts.keys.first;
       UnitElementResult result =
-          _computeUnitElement(path, asIsIfPartWithoutLibrary: true);
-      _unitElementRequestedParts.remove(path).forEach((completer) {
+          _computeUnitElement(path, asIsIfPartWithoutLibrary: true)!;
+      _unitElementRequestedParts.remove(path)!.forEach((completer) {
         completer.complete(result);
       });
       return;
@@ -1173,7 +1180,7 @@
     // Compute errors in a part.
     if (_errorsRequestedParts.isNotEmpty) {
       var path = _errorsRequestedParts.keys.first;
-      var completers = _errorsRequestedParts.remove(path);
+      var completers = _errorsRequestedParts.remove(path)!;
       var result = _computeErrors(path: path, asIsIfPartWithoutLibrary: true);
       completers.forEach((completer) {
         completer.complete(result);
@@ -1213,7 +1220,7 @@
 
   /// Handles a notification from the [FileTracker] that there has been a change
   /// of state.
-  void _changeHook(String path) {
+  void _changeHook(String? path) {
     _createNewSession(path);
     clearLibraryContext();
     _priorityResults.clear();
@@ -1241,7 +1248,7 @@
   /// Return [AnalysisResult._UNCHANGED] if [skipIfSameSignature] is `true` and
   /// the resolved signature of the file in its library is the same as the one
   /// that was the most recently produced to the client.
-  AnalysisResult _computeAnalysisResult(String path,
+  AnalysisResult? _computeAnalysisResult(String path,
       {bool withUnit = false,
       bool asIsIfPartWithoutLibrary = false,
       bool skipIfSameSignature = false}) {
@@ -1256,14 +1263,14 @@
   }
 
   /// Unwrapped implementation of [_computeAnalysisResult].
-  AnalysisResult _computeAnalysisResult2(String path,
+  AnalysisResult? _computeAnalysisResult2(String path,
       {bool withUnit = false,
       bool asIsIfPartWithoutLibrary = false,
       bool skipIfSameSignature = false}) {
     FileState file = _fsState.getFileForPath(path);
 
     // Prepare the library - the file itself, or the known library.
-    FileState library = file.isPart ? file.library : file;
+    FileState? library = file.isPart ? file.library : file;
     if (library == null) {
       if (asIsIfPartWithoutLibrary) {
         library = file;
@@ -1286,7 +1293,7 @@
 
     // If we don't need the fully resolved unit, check for the cached result.
     if (!withUnit) {
-      List<int> bytes = _byteStore.get(key);
+      List<int>? bytes = _byteStore.get(key);
       if (bytes != null) {
         return _getAnalysisResultFromBytes(file, signature, bytes);
       }
@@ -1298,16 +1305,22 @@
       try {
         _testView.numOfAnalyzedLibraries++;
 
-        if (!_fsState.getFileForUri(Uri.parse('dart:core')).exists) {
+        var dartCoreUri = Uri.parse('dart:core');
+        var dartCoreFile = _fsState.getFileForUri(dartCoreUri);
+        if (dartCoreFile == null || !dartCoreFile.exists) {
           return _newMissingDartLibraryResult(file, 'dart:core');
         }
-        if (!_fsState.getFileForUri(Uri.parse('dart:async')).exists) {
+
+        var dartAsyncUri = Uri.parse('dart:async');
+        var dartAsyncFile = _fsState.getFileForUri(dartAsyncUri);
+        if (dartAsyncFile == null || !dartAsyncFile.exists) {
           return _newMissingDartLibraryResult(file, 'dart:async');
         }
-        var libraryContext = _createLibraryContext(library);
+
+        var libraryContext = _createLibraryContext(library!);
 
         LibraryAnalyzer analyzer = LibraryAnalyzer(
-            analysisOptions,
+            analysisOptions as AnalysisOptionsImpl,
             declaredVariables,
             sourceFactory,
             libraryContext.isLibraryUri,
@@ -1318,10 +1331,10 @@
             testingData: testingData);
         Map<FileState, UnitAnalysisResult> results = analyzer.analyze();
 
-        List<int> bytes;
-        CompilationUnit resolvedUnit;
+        late List<int> bytes;
+        late CompilationUnit resolvedUnit;
         for (FileState unitFile in results.keys) {
-          UnitAnalysisResult unitResult = results[unitFile];
+          UnitAnalysisResult unitResult = results[unitFile]!;
           List<int> unitBytes =
               _serializeResolvedUnit(unitResult.unit, unitResult.errors);
           String unitSignature = _getResolvedUnitSignature(library, unitFile);
@@ -1335,8 +1348,7 @@
 
         // Return the result, full or partial.
         _logger.writeln('Computed new analysis result.');
-        AnalysisResult result = _getAnalysisResultFromBytes(
-            file, signature, bytes,
+        var result = _getAnalysisResultFromBytes(file, signature, bytes,
             content: withUnit ? file.content : null,
             resolvedUnit: withUnit ? resolvedUnit : null);
         if (withUnit && _priorityFiles.contains(path)) {
@@ -1344,8 +1356,8 @@
         }
         return result;
       } catch (exception, stackTrace) {
-        String contextKey =
-            _storeExceptionContext(path, library, exception, stackTrace);
+        String? contextKey =
+            _storeExceptionContext(path, library!, exception, stackTrace);
         throw _ExceptionState(exception, stackTrace, contextKey);
       }
     });
@@ -1360,18 +1372,18 @@
     for (var name in variableNames) {
       var value = declaredVariables.get(name);
       buffer.addString(name);
-      buffer.addString(value);
+      buffer.addString(value!);
     }
 
     var bytes = buffer.toByteList();
     return Uint8List.fromList(bytes).buffer.asUint32List();
   }
 
-  ErrorsResult _computeErrors({
-    @required String path,
-    @required bool asIsIfPartWithoutLibrary,
+  ErrorsResult? _computeErrors({
+    required String path,
+    required bool asIsIfPartWithoutLibrary,
   }) {
-    ResolvedUnitResult analysisResult = _computeAnalysisResult(path,
+    var analysisResult = _computeAnalysisResult(path,
         withUnit: false, asIsIfPartWithoutLibrary: asIsIfPartWithoutLibrary);
 
     if (analysisResult == null) {
@@ -1383,9 +1395,9 @@
   }
 
   AnalysisDriverUnitIndex _computeIndex(String path) {
-    AnalysisResult analysisResult = _computeAnalysisResult(path,
+    var analysisResult = _computeAnalysisResult(path,
         withUnit: false, asIsIfPartWithoutLibrary: true);
-    return analysisResult._index;
+    return analysisResult!._index!;
   }
 
   /// Return the newly computed resolution result of the library with the
@@ -1404,7 +1416,7 @@
       var libraryContext = _createLibraryContext(library);
 
       LibraryAnalyzer analyzer = LibraryAnalyzer(
-          analysisOptions,
+          analysisOptions as AnalysisOptionsImpl,
           declaredVariables,
           sourceFactory,
           libraryContext.isLibraryUri,
@@ -1418,20 +1430,18 @@
 
       for (var unitFile in unitResults.keys) {
         if (unitFile.path != null) {
-          var unitResult = unitResults[unitFile];
+          var unitResult = unitResults[unitFile]!;
           resolvedUnits.add(
-            AnalysisResult(
+            ResolvedUnitResultImpl(
               currentSession,
-              unitFile.path,
+              unitFile.path!,
               unitFile.uri,
               unitFile.exists,
               unitFile.content,
               unitFile.lineInfo,
               unitFile.isPart,
-              null,
               unitResult.unit,
               unitResult.errors,
-              null,
             ),
           );
         }
@@ -1439,7 +1449,7 @@
 
       return ResolvedLibraryResultImpl(
         currentSession,
-        library.path,
+        library.path!,
         library.uri,
         resolvedUnits.first.libraryElement,
         resolvedUnits,
@@ -1447,12 +1457,12 @@
     });
   }
 
-  UnitElementResult _computeUnitElement(String path,
+  UnitElementResult? _computeUnitElement(String path,
       {bool asIsIfPartWithoutLibrary = false}) {
     FileState file = _fsState.getFileForPath(path);
 
     // Prepare the library - the file itself, or the known library.
-    FileState library = file.isPart ? file.library : file;
+    FileState? library = file.isPart ? file.library : file;
     if (library == null) {
       if (asIsIfPartWithoutLibrary) {
         library = file;
@@ -1463,7 +1473,7 @@
 
     return _logger.run('Compute unit element for $path', () {
       _logger.writeln('Work in $name');
-      var libraryContext = _createLibraryContext(library);
+      var libraryContext = _createLibraryContext(library!);
       var element = libraryContext.computeUnitElement(library, file);
       return UnitElementResultImpl(
         currentSession,
@@ -1475,12 +1485,12 @@
     });
   }
 
-  String _computeUnitElementSignature(String path,
+  String? _computeUnitElementSignature(String path,
       {bool asIsIfPartWithoutLibrary = false}) {
     FileState file = _fsState.getFileForPath(path);
 
     // Prepare the library - the file itself, or the known library.
-    FileState library = file.isPart ? file.library : file;
+    FileState? library = file.isPart ? file.library : file;
     if (library == null) {
       if (asIsIfPartWithoutLibrary) {
         library = file;
@@ -1530,7 +1540,7 @@
   /// Return the context in which the [library] should be analyzed.
   LibraryContext _createLibraryContext(FileState library) {
     if (_libraryContext != null) {
-      if (_libraryContext.pack()) {
+      if (_libraryContext!.pack()) {
         clearLibraryContext();
       }
     }
@@ -1549,17 +1559,17 @@
           targetLibrary: library,
         );
       } else {
-        _libraryContext.load2(library);
+        _libraryContext!.load2(library);
       }
     });
 
-    return _libraryContext;
+    return _libraryContext!;
   }
 
   /// Create a new analysis session, so invalidating the current one.
-  void _createNewSession(String path) {
+  void _createNewSession(String? path) {
     if (onCurrentSessionAboutToBeDiscarded != null) {
-      onCurrentSessionAboutToBeDiscarded(path);
+      onCurrentSessionAboutToBeDiscarded!(path);
     }
     _currentSession = AnalysisSessionImpl(this);
   }
@@ -1618,13 +1628,13 @@
   /// optional [content] and [resolvedUnit].
   AnalysisResult _getAnalysisResultFromBytes(
       FileState file, String signature, List<int> bytes,
-      {String content, CompilationUnit resolvedUnit}) {
+      {String? content, CompilationUnit? resolvedUnit}) {
     var unit = AnalysisDriverResolvedUnit.fromBuffer(bytes);
     List<AnalysisError> errors = _getErrorsFromSerialized(file, unit.errors);
     _updateHasErrorOrWarningFlag(file, errors);
     return AnalysisResult(
         currentSession,
-        file.path,
+        file.path!,
         file.uri,
         file.exists,
         content,
@@ -1641,7 +1651,7 @@
       FileState file, List<AnalysisDriverUnitError> serialized) {
     List<AnalysisError> errors = <AnalysisError>[];
     for (AnalysisDriverUnitError error in serialized) {
-      var analysisError = ErrorEncoding.decode(file.source, error);
+      var analysisError = ErrorEncoding.decode(file.source!, error);
       if (analysisError != null) {
         errors.add(analysisError);
       }
@@ -1671,26 +1681,26 @@
     // TODO(scheglov) Find a better way to report this.
     return AnalysisResult(
         currentSession,
-        file.path,
+        file.path!,
         file.uri,
         file.exists,
         null,
         file.lineInfo,
         file.isPart,
-        null,
+        'missing',
         null,
         [
-          AnalysisError(file.source, 0, 0,
+          AnalysisError(file.source!, 0, 0,
               CompileTimeErrorCode.MISSING_DART_LIBRARY, [missingUri])
         ],
         null);
   }
 
   void _reportException(String path, Object exception, StackTrace stackTrace) {
-    String contextKey;
+    String? contextKey;
     if (exception is _ExceptionState) {
-      var state = exception as _ExceptionState;
-      exception = state.exception;
+      var state = exception;
+      exception = exception.exception;
       stackTrace = state.stackTrace;
       contextKey = state.contextKey;
     }
@@ -1700,7 +1710,10 @@
     var fileContentMap = <String, String>{};
     var libraryFile = _fsState.getFileForPath(path);
     for (var file in libraryFile.libraryFiles) {
-      fileContentMap[file.path] = file.content;
+      var path = file.path;
+      if (path != null) {
+        fileContentMap[path] = file.content;
+      }
     }
 
     _exceptionController.add(
@@ -1728,7 +1741,7 @@
         .toBuffer();
   }
 
-  String _storeExceptionContext(String path, FileState libraryFile,
+  String? _storeExceptionContext(String path, FileState libraryFile,
       Object exception, StackTrace stackTrace) {
     if (allowedNumberOfContextsToWrite <= 0) {
       return null;
@@ -1739,7 +1752,7 @@
       List<AnalysisDriverExceptionFileBuilder> contextFiles = libraryFile
           .transitiveFiles
           .map((file) => AnalysisDriverExceptionFileBuilder(
-              path: file.path, content: file.content))
+              path: file.path!, content: file.content))
           .toList();
       contextFiles.sort((a, b) => a.path.compareTo(b.path));
       AnalysisDriverExceptionContextBuilder contextBuilder =
@@ -1873,7 +1886,7 @@
   final PerformanceLog _logger;
 
   /// The object used to watch as analysis drivers are created and deleted.
-  final DriverWatcher driverWatcher;
+  final DriverWatcher? driverWatcher;
 
   final List<AnalysisDriverGeneric> _drivers = [];
   final Monitor _hasWork = Monitor();
@@ -1885,7 +1898,7 @@
   /// than work priorities in drivers.
   ///
   /// Don't use outside of Analyzer and Analysis Server.
-  SchedulerWorker outOfBandWorker;
+  SchedulerWorker? outOfBandWorker;
 
   AnalysisDriverScheduler(this._logger, {this.driverWatcher});
 
@@ -1964,7 +1977,7 @@
     // Give other microtasks the time to run before doing the analysis cycle.
     await null;
     Stopwatch timer = Stopwatch()..start();
-    PerformanceLogSection analysisSection;
+    PerformanceLogSection? analysisSection;
     while (true) {
       // Pump the event queue.
       if (timer.elapsedMilliseconds > _MS_BEFORE_PUMPING_EVENT_QUEUE) {
@@ -1981,7 +1994,7 @@
       }
 
       // Find the driver with the highest priority.
-      AnalysisDriverGeneric bestDriver;
+      late AnalysisDriverGeneric bestDriver;
       AnalysisDriverPriority bestPriority = AnalysisDriverPriority.nothing;
       for (AnalysisDriverGeneric driver in _drivers) {
         AnalysisDriverPriority priority = driver.workPriority;
@@ -1992,10 +2005,10 @@
       }
 
       if (outOfBandWorker != null) {
-        var workerPriority = outOfBandWorker.workPriority;
+        var workerPriority = outOfBandWorker!.workPriority;
         if (workerPriority != AnalysisDriverPriority.nothing) {
           if (workerPriority.index > bestPriority.index) {
-            await outOfBandWorker.performWork();
+            await outOfBandWorker!.performWork();
             _hasWork.notify();
             continue;
           }
@@ -2064,8 +2077,7 @@
 /// Every result is independent, and is not guaranteed to be consistent with
 /// any previously returned result, even inside of the same library.
 class AnalysisResult extends ResolvedUnitResultImpl {
-  static final _UNCHANGED = AnalysisResult(
-      null, null, null, null, null, null, null, null, null, null, null);
+  static final _UNCHANGED = _UnchangedAnalysisResult();
 
   /// The signature of the result based on the content of the file, and the
   /// transitive closure of files imported and exported by the library of
@@ -2073,18 +2085,18 @@
   final String _signature;
 
   /// The index of the unit.
-  final AnalysisDriverUnitIndex _index;
+  final AnalysisDriverUnitIndex? _index;
 
   AnalysisResult(
       AnalysisSession session,
       String path,
       Uri uri,
       bool exists,
-      String content,
+      String? content,
       LineInfo lineInfo,
       bool isPart,
       this._signature,
-      CompilationUnit unit,
+      CompilationUnit? unit,
       List<AnalysisError> errors,
       this._index)
       : super(session, path, uri, exists, content, lineInfo, isPart, unit,
@@ -2097,19 +2109,19 @@
 abstract class DriverWatcher {
   /// The context manager has just added the given analysis [driver]. This method
   /// must be called before the driver has been allowed to perform any analysis.
-  void addedDriver(AnalysisDriver driver, ContextRoot contextRoot);
+  void addedDriver(AnalysisDriver driver, ContextRoot? contextRoot);
 
   /// The context manager has just removed the given analysis [driver].
   void removedDriver(AnalysisDriver driver);
 }
 
 class ErrorEncoding {
-  static AnalysisError decode(
+  static AnalysisError? decode(
     Source source,
     AnalysisDriverUnitError error,
   ) {
     String errorName = error.uniqueName;
-    ErrorCode errorCode =
+    ErrorCode? errorCode =
         errorCodeByUniqueName(errorName) ?? _lintCodeByUniqueName(errorName);
     if (errorCode == null) {
       // This could fail because the error code is no longer defined, or, in
@@ -2120,19 +2132,16 @@
       return null;
     }
 
-    List<DiagnosticMessageImpl> contextMessages;
-    if (error.contextMessages.isNotEmpty) {
-      contextMessages = <DiagnosticMessageImpl>[];
-      for (var message in error.contextMessages) {
-        contextMessages.add(
-          DiagnosticMessageImpl(
-            filePath: message.filePath,
-            length: message.length,
-            message: message.message,
-            offset: message.offset,
-          ),
-        );
-      }
+    var contextMessages = <DiagnosticMessageImpl>[];
+    for (var message in error.contextMessages) {
+      contextMessages.add(
+        DiagnosticMessageImpl(
+          filePath: message.filePath,
+          length: message.length,
+          message: message.message,
+          offset: message.offset,
+        ),
+      );
     }
 
     return AnalysisError.forValues(
@@ -2142,24 +2151,21 @@
       errorCode,
       error.message,
       error.correction.isEmpty ? null : error.correction,
-      contextMessages: contextMessages ?? const [],
+      contextMessages: contextMessages,
     );
   }
 
   static AnalysisDriverUnitErrorBuilder encode(AnalysisError error) {
-    List<DiagnosticMessageBuilder> contextMessages;
-    if (error.contextMessages != null) {
-      contextMessages = <DiagnosticMessageBuilder>[];
-      for (var message in error.contextMessages) {
-        contextMessages.add(
-          DiagnosticMessageBuilder(
-            filePath: message.filePath,
-            length: message.length,
-            message: message.message,
-            offset: message.offset,
-          ),
-        );
-      }
+    var contextMessages = <DiagnosticMessageBuilder>[];
+    for (var message in error.contextMessages) {
+      contextMessages.add(
+        DiagnosticMessageBuilder(
+          filePath: message.filePath,
+          length: message.length,
+          message: message.message,
+          offset: message.offset,
+        ),
+      );
     }
 
     return AnalysisDriverUnitErrorBuilder(
@@ -2167,14 +2173,14 @@
       length: error.length,
       uniqueName: error.errorCode.uniqueName,
       message: error.message,
-      correction: error.correction,
+      correction: error.correction ?? '',
       contextMessages: contextMessages,
     );
   }
 
   /// Return the lint code with the given [errorName], or `null` if there is no
   /// lint registered with that name.
-  static ErrorCode _lintCodeByUniqueName(String errorName) {
+  static ErrorCode? _lintCodeByUniqueName(String errorName) {
     return linter.Registry.ruleRegistry.codeForUniqueName(errorName);
   }
 }
@@ -2200,14 +2206,14 @@
   /// the exception happened was stored, this field is the key of the context
   /// in the byte store. May be `null` if the context is unknown, the maximum
   /// number of context to store was reached, etc.
-  final String contextKey;
+  final String? contextKey;
 
   ExceptionResult({
-    @required this.filePath,
-    @required this.fileContentMap,
-    @required this.fileContent,
-    @required this.exception,
-    @required this.contextKey,
+    required this.filePath,
+    required this.fileContentMap,
+    required this.fileContent,
+    required this.exception,
+    required this.contextKey,
   });
 }
 
@@ -2228,10 +2234,10 @@
   final AnalysisDriver driver;
 
   bool isCompleted = false;
-  Completer<void> completer = Completer<void>();
+  Completer<void>? completer = Completer<void>();
 
-  Iterator<Folder> folderIterator;
-  List<String> files = [];
+  Iterator<Folder>? folderIterator;
+  List<String>? files = [];
   int fileIndex = 0;
 
   _DiscoverAvailableFilesTask(this.driver);
@@ -2241,14 +2247,14 @@
   /// task should continue to be run.
   void perform() {
     if (folderIterator == null) {
-      files.addAll(driver.addedFiles);
+      files!.addAll(driver.addedFiles);
 
       // Discover SDK libraries.
       var dartSdk = driver._sourceFactory.dartSdk;
       if (dartSdk != null) {
         for (var sdkLibrary in dartSdk.sdkLibraries) {
-          var file = dartSdk.mapDartUri(sdkLibrary.shortName).fullName;
-          files.add(file);
+          var file = dartSdk.mapDartUri(sdkLibrary.shortName)!.fullName;
+          files!.add(file);
         }
       }
 
@@ -2263,8 +2269,8 @@
 
     // List each package/lib folder recursively.
     Stopwatch timer = Stopwatch()..start();
-    while (folderIterator.moveNext()) {
-      var folder = folderIterator.current;
+    while (folderIterator!.moveNext()) {
+      var folder = folderIterator!.current;
       _appendFilesRecursively(folder);
 
       // Note: must check if we are exiting before calling moveNext()
@@ -2275,11 +2281,11 @@
     }
 
     // Get know files one by one.
-    while (fileIndex < files.length) {
+    while (fileIndex < files!.length) {
       if (timer.elapsedMilliseconds > _MS_WORK_INTERVAL) {
         return;
       }
-      var file = files[fileIndex++];
+      var file = files![fileIndex++];
       driver._fsState.getFileForPath(file);
     }
 
@@ -2289,7 +2295,7 @@
 
     // Complete and clean up.
     isCompleted = true;
-    completer.complete();
+    completer!.complete();
     completer = null;
   }
 
@@ -2299,7 +2305,7 @@
         if (child is File) {
           var path = child.path;
           if (AnalysisEngine.isDartFileName(path)) {
-            files.add(path);
+            files!.add(path);
           }
         } else if (child is Folder) {
           _appendFilesRecursively(child);
@@ -2316,7 +2322,7 @@
 
   /// The key under which the context of the exception was stored, or `null`
   /// if unknown, the maximum number of context to store was reached, etc.
-  final String contextKey;
+  final String? contextKey;
 
   _ExceptionState(this.exception, this.stackTrace, this.contextKey);
 
@@ -2388,8 +2394,8 @@
   final Completer<List<String>> completer = Completer<List<String>>();
 
   int fileStamp = -1;
-  List<FileState> filesToCheck;
-  int filesToCheckIndex;
+  List<FileState>? filesToCheck;
+  int filesToCheckIndex = -1;
 
   final List<String> referencingFiles = <String>[];
 
@@ -2417,14 +2423,14 @@
     }
 
     Stopwatch timer = Stopwatch()..start();
-    while (filesToCheckIndex < filesToCheck.length) {
+    while (filesToCheckIndex < filesToCheck!.length) {
       if (filesToCheckIndex % _WORK_FILES == 0 &&
           timer.elapsedMilliseconds > _MS_WORK_INTERVAL) {
         return false;
       }
-      FileState file = filesToCheck[filesToCheckIndex++];
+      FileState file = filesToCheck![filesToCheckIndex++];
       if (file.referencedNames.contains(name)) {
-        referencingFiles.add(file.path);
+        referencingFiles.add(file.path!);
       }
     }
 
@@ -2433,3 +2439,8 @@
     return true;
   }
 }
+
+class _UnchangedAnalysisResult implements AnalysisResult {
+  @override
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver_based_analysis_context.dart b/pkg/analyzer/lib/src/dart/analysis/driver_based_analysis_context.dart
index 13ebb84..7178759 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver_based_analysis_context.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver_based_analysis_context.dart
@@ -24,14 +24,14 @@
   final AnalysisDriver driver;
 
   /// The [Workspace] for this context, `null` if not yet created.
-  Workspace _workspace;
+  Workspace? _workspace;
 
   /// Initialize a newly created context that uses the given [resourceProvider]
   /// to access the file system and that is based on the given analysis
   /// [driver].
   DriverBasedAnalysisContext(
       this.resourceProvider, this.contextRoot, this.driver,
-      {Workspace workspace})
+      {Workspace? workspace})
       : _workspace = workspace {
     driver.analysisContext = this;
   }
@@ -43,7 +43,7 @@
   AnalysisSession get currentSession => driver.currentSession;
 
   @override
-  Folder get sdkRoot {
+  Folder? get sdkRoot {
     var sdk = driver.sourceFactory.dartSdk;
     if (sdk is FolderBasedDartSdk) {
       return sdk.directory;
diff --git a/pkg/analyzer/lib/src/dart/analysis/experiments.dart b/pkg/analyzer/lib/src/dart/analysis/experiments.dart
index 560bd68..af9d727 100644
--- a/pkg/analyzer/lib/src/dart/analysis/experiments.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/experiments.dart
@@ -71,11 +71,11 @@
   @visibleForTesting
   factory ExperimentStatus.forTesting(
       // ignore:avoid_unused_constructor_parameters
-      {String sdkVersion,
+      {String? sdkVersion,
       List<Feature> additionalFeatures = const []}) {
     var explicitFlags = decodeExplicitFlags([]);
-    for (ExperimentalFeature feature in additionalFeatures) {
-      explicitFlags.enabled[feature.index] = true;
+    for (var feature in additionalFeatures) {
+      explicitFlags.enabled[(feature as ExperimentalFeature).index] = true;
     }
 
     var sdkLanguageVersion = latestSdkLanguageVersion;
@@ -147,8 +147,8 @@
   /// unrecognized flags are ignored, conflicting flags are resolved in favor of
   /// the flag appearing last.
   factory ExperimentStatus.fromStrings2({
-    @required Version sdkLanguageVersion,
-    @required List<String> flags,
+    required Version sdkLanguageVersion,
+    required List<String> flags,
     // TODO(scheglov) use restrictEnableFlagsToVersion
   }) {
     var explicitFlags = decodeExplicitFlags(flags);
diff --git a/pkg/analyzer/lib/src/dart/analysis/experiments_impl.dart b/pkg/analyzer/lib/src/dart/analysis/experiments_impl.dart
index b6d0a12..07cad9d 100644
--- a/pkg/analyzer/lib/src/dart/analysis/experiments_impl.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/experiments_impl.dart
@@ -109,10 +109,10 @@
 ///
 /// Features in [explicitDisabledFlags] are always disabled.
 List<bool> restrictEnableFlagsToVersion({
-  @required Version sdkLanguageVersion,
-  @required List<bool> explicitEnabledFlags,
-  @required List<bool> explicitDisabledFlags,
-  @required Version version,
+  required Version sdkLanguageVersion,
+  required List<bool> explicitEnabledFlags,
+  required List<bool> explicitDisabledFlags,
+  required Version version,
 }) {
   var decodedFlags = List.filled(_knownFeatures.length, false);
   for (var feature in _knownFeatures.values) {
@@ -193,7 +193,7 @@
   var previousFlagValue = <int, bool>{};
   for (int flagIndex = 0; flagIndex < flags.length; flagIndex++) {
     var flag = flags[flagIndex];
-    ExperimentalFeature feature;
+    ExperimentalFeature? feature;
     bool requestedValue;
     if (flag.startsWith('no-')) {
       feature = _knownFeatures[flag.substring(3)];
@@ -210,8 +210,8 @@
           : IllegalUseOfExpiredFlag(flagIndex, feature);
     } else if (previousFlagIndex.containsKey(feature.index) &&
         previousFlagValue[feature.index] != requestedValue) {
-      yield ConflictingFlags(
-          flagIndex, previousFlagIndex[feature.index], feature, requestedValue);
+      yield ConflictingFlags(flagIndex, previousFlagIndex[feature.index]!,
+          feature, requestedValue);
     } else {
       previousFlagIndex[feature.index] = flagIndex;
       previousFlagValue[feature.index] = requestedValue;
@@ -230,7 +230,7 @@
   var result = <int, bool>{};
   for (int flagIndex = 0; flagIndex < flags.length; flagIndex++) {
     var flag = flags[flagIndex];
-    ExperimentalFeature feature;
+    ExperimentalFeature? feature;
     bool requestedValue;
     if (flag.startsWith('no-')) {
       feature = _knownFeatures[flag.substring(3)];
@@ -326,30 +326,28 @@
 
   /// The first language version in which this feature can be enabled using
   /// the [enableString] experimental flag.
-  final Version experimentalReleaseVersion;
+  final Version? experimentalReleaseVersion;
 
   @override
-  final Version releaseVersion;
+  final Version? releaseVersion;
 
   ExperimentalFeature({
-    @required this.index,
-    @required this.enableString,
-    @required this.isEnabledByDefault,
-    @required this.isExpired,
-    @required this.documentation,
-    @required this.experimentalReleaseVersion,
-    @required this.releaseVersion,
-  })  : assert(index != null),
-        assert(isEnabledByDefault
+    required this.index,
+    required this.enableString,
+    required this.isEnabledByDefault,
+    required this.isExpired,
+    required this.documentation,
+    required this.experimentalReleaseVersion,
+    required this.releaseVersion,
+  }) : assert(isEnabledByDefault
             ? releaseVersion != null
-            : releaseVersion == null),
-        assert(enableString != null);
+            : releaseVersion == null);
 
   /// The string to disable the feature.
   String get disableString => 'no-$enableString';
 
   @override
-  String get experimentalFlag => isExpired ? null : enableString;
+  String? get experimentalFlag => isExpired ? null : enableString;
 
   @override
   FeatureStatus get status {
diff --git a/pkg/analyzer/lib/src/dart/analysis/feature_set_provider.dart b/pkg/analyzer/lib/src/dart/analysis/feature_set_provider.dart
index 771dfe8..6d38db2 100644
--- a/pkg/analyzer/lib/src/dart/analysis/feature_set_provider.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/feature_set_provider.dart
@@ -9,7 +9,6 @@
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/util/uri.dart';
-import 'package:meta/meta.dart';
 import 'package:pub_semver/pub_semver.dart';
 
 class FeatureSetProvider {
@@ -26,14 +25,14 @@
   final FeatureSet _nonPackageDefaultFeatureSet;
 
   FeatureSetProvider._({
-    @required Version sdkLanguageVersion,
-    @required AllowedExperiments allowedExperiments,
-    @required ResourceProvider resourceProvider,
-    @required Packages packages,
-    @required FeatureSet packageDefaultFeatureSet,
-    @required Version nonPackageDefaultLanguageVersion,
-    @required FeatureSet nonPackageDefaultFeatureSet,
-  })  : _sdkLanguageVersion = sdkLanguageVersion,
+    required Version sdkLanguageVersion,
+    required AllowedExperiments allowedExperiments,
+    required ResourceProvider resourceProvider,
+    required Packages packages,
+    required FeatureSet packageDefaultFeatureSet,
+    required Version nonPackageDefaultLanguageVersion,
+    required FeatureSet nonPackageDefaultFeatureSet,
+  })   : _sdkLanguageVersion = sdkLanguageVersion,
         _allowedExperiments = allowedExperiments,
         _resourceProvider = resourceProvider,
         _packages = packages,
@@ -42,10 +41,6 @@
         _nonPackageDefaultFeatureSet = nonPackageDefaultFeatureSet;
 
   FeatureSet featureSetForExperiments(List<String> experiments) {
-    if (experiments == null) {
-      return null;
-    }
-
     return FeatureSet.fromEnableFlags2(
       sdkLanguageVersion: _sdkLanguageVersion,
       flags: experiments,
@@ -113,7 +108,7 @@
   ///
   /// If unable to find a package through other mechanisms mechanisms, or it is
   /// an unrecognized uri scheme, then the package is looked up by [path].
-  Package _findPackage(Uri uri, String path) {
+  Package? _findPackage(Uri uri, String path) {
     if (uri.isScheme('package') || uri.isScheme('asset')) {
       var pathSegments = uri.pathSegments;
       if (pathSegments.isNotEmpty) {
@@ -135,14 +130,14 @@
   }
 
   static FeatureSetProvider build({
-    @required SourceFactory sourceFactory,
-    @required ResourceProvider resourceProvider,
-    @required Packages packages,
-    @required FeatureSet packageDefaultFeatureSet,
-    @required Version nonPackageDefaultLanguageVersion,
-    @required FeatureSet nonPackageDefaultFeatureSet,
+    required SourceFactory sourceFactory,
+    required ResourceProvider resourceProvider,
+    required Packages packages,
+    required FeatureSet packageDefaultFeatureSet,
+    required Version nonPackageDefaultLanguageVersion,
+    required FeatureSet nonPackageDefaultFeatureSet,
   }) {
-    var sdk = sourceFactory.dartSdk;
+    var sdk = sourceFactory.dartSdk!;
     var allowedExperiments = _experimentsForSdk(sdk);
     return FeatureSetProvider._(
       sdkLanguageVersion: sdk.languageVersion,
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_byte_store.dart b/pkg/analyzer/lib/src/dart/analysis/file_byte_store.dart
index 506fb2a..f40d219 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_byte_store.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_byte_store.dart
@@ -27,7 +27,7 @@
 /// [FileByteStore] instead and let the main process to perform eviction.
 class EvictingFileByteStore implements ByteStore {
   static bool _cleanUpSendPortShouldBePrepared = true;
-  static SendPort _cleanUpSendPort;
+  static SendPort? _cleanUpSendPort;
 
   final String _cachePath;
   final int _maxSizeBytes;
@@ -42,7 +42,7 @@
   }
 
   @override
-  List<int> get(String key) => _fileByteStore.get(key);
+  List<int>? get(String key) => _fileByteStore.get(key);
 
   @override
   void put(String key, List<int> bytes) {
@@ -71,7 +71,7 @@
       _evictionIsolateIsRunning = true;
       try {
         ReceivePort response = ReceivePort();
-        _cleanUpSendPort.send(
+        _cleanUpSendPort!.send(
             CacheCleanUpRequest(_cachePath, _maxSizeBytes, response.sendPort));
         await response.first;
       } finally {
@@ -84,7 +84,7 @@
   /// This function is started in a new isolate, receives cache folder clean up
   /// requests and evicts older files from the folder.
   static void _cacheCleanUpFunction(Object message) {
-    SendPort initialReplyTo = message;
+    var initialReplyTo = message as SendPort;
     ReceivePort port = ReceivePort();
     initialReplyTo.send(port.sendPort);
     port.listen((request) {
@@ -123,8 +123,8 @@
       }
     }
     files.sort((a, b) {
-      return fileStatMap[a].accessed.millisecondsSinceEpoch -
-          fileStatMap[b].accessed.millisecondsSinceEpoch;
+      return fileStatMap[a]!.accessed.millisecondsSinceEpoch -
+          fileStatMap[b]!.accessed.millisecondsSinceEpoch;
     });
 
     // Delete files until the current size is less than the max.
@@ -135,7 +135,7 @@
       try {
         file.deleteSync();
       } catch (_) {}
-      currentSizeBytes -= fileStatMap[file].size;
+      currentSizeBytes -= fileStatMap[file]!.size;
     }
   }
 }
@@ -157,10 +157,10 @@
             '-temp-$pid${tempNameSuffix.isEmpty ? '' : '-$tempNameSuffix'}';
 
   @override
-  List<int> get(String key) {
+  List<int>? get(String key) {
     if (!_canShard(key)) return null;
 
-    List<int> bytes = _writeInProgress[key];
+    var bytes = _writeInProgress[key];
     if (bytes != null) {
       return bytes;
     }
@@ -227,7 +227,7 @@
 
   /// If the [rawBytes] have the valid version and checksum, extract and
   /// return the data from it. Otherwise return `null`.
-  List<int> getData(List<int> rawBytes) {
+  List<int>? getData(List<int> rawBytes) {
     // There must be at least the version and the checksum in the raw bytes.
     if (rawBytes.length < 4) {
       return null;
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_state.dart b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
index 0e20865..ae5b920 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_state.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
@@ -59,12 +59,12 @@
   /// overlay does not override the content of the file.
   ///
   /// The [path] must be absolute and normalized.
-  String operator [](String path) => _map[path];
+  String? operator [](String path) => _map[path];
 
   /// Return the new [content] of the file with the given [path].
   ///
   /// The [path] must be absolute and normalized.
-  void operator []=(String path, String content) {
+  void operator []=(String path, String? content) {
     if (content == null) {
       _map.remove(path);
     } else {
@@ -84,18 +84,18 @@
   final FileSystemState _fsState;
 
   /// The absolute path of the file.
-  final String path;
+  final String? path;
 
   /// The absolute URI of the file.
   final Uri uri;
 
   /// The [Source] of the file with the [uri].
-  final Source source;
+  final Source? source;
 
   /// The [WorkspacePackage] that contains this file.
   ///
   /// It might be `null` if the file is outside of the workspace.
-  final WorkspacePackage workspacePackage;
+  final WorkspacePackage? workspacePackage;
 
   /// Return `true` if this file is a stub created for a file in the provided
   /// external summary store. The values of most properties are not the same
@@ -111,40 +111,40 @@
   ///
   /// This feature set is then restricted, with the [_packageLanguageVersion],
   /// or with a `@dart` language override token in the file header.
-  final FeatureSet _contextFeatureSet;
+  final FeatureSet? _contextFeatureSet;
 
   /// The language version for the package that contains this file.
-  final Version packageLanguageVersion;
+  final Version? packageLanguageVersion;
 
   int id = fileObjectId++;
-  int refreshId;
+  int? refreshId;
 
-  bool _exists;
-  String _content;
-  String _contentHash;
-  LineInfo _lineInfo;
-  Set<String> _definedClassMemberNames;
-  Set<String> _definedTopLevelNames;
-  Set<String> _referencedNames;
-  List<int> _unlinkedSignature;
-  String _unlinkedKey;
-  String _astKey;
-  AnalysisDriverUnlinkedUnit _driverUnlinkedUnit;
-  List<int> _apiSignature;
+  bool? _exists;
+  String? _content;
+  String? _contentHash;
+  LineInfo? _lineInfo;
+  Set<String>? _definedClassMemberNames;
+  Set<String>? _definedTopLevelNames;
+  Set<String>? _referencedNames;
+  List<int>? _unlinkedSignature;
+  String? _unlinkedKey;
+  String? _astKey;
+  AnalysisDriverUnlinkedUnit? _driverUnlinkedUnit;
+  List<int>? _apiSignature;
 
-  UnlinkedUnit2 _unlinked2;
+  UnlinkedUnit2? _unlinked2;
 
-  List<FileState> _importedFiles;
-  List<FileState> _exportedFiles;
-  List<FileState> _partedFiles;
-  List<FileState> _libraryFiles;
+  List<FileState?>? _importedFiles;
+  List<FileState?>? _exportedFiles;
+  List<FileState?>? _partedFiles;
+  List<FileState>? _libraryFiles;
 
-  Set<FileState> _directReferencedFiles;
-  Set<FileState> _directReferencedLibraries;
+  Set<FileState>? _directReferencedFiles;
+  Set<FileState>? _directReferencedLibraries;
 
-  LibraryCycle _libraryCycle;
-  String _transitiveSignature;
-  String _transitiveSignatureLinked;
+  LibraryCycle? _libraryCycle;
+  String? _transitiveSignature;
+  String? _transitiveSignatureLinked;
 
   /// The flag that shows whether the file has an error or warning that
   /// might be fixed by a change to another file.
@@ -173,24 +173,24 @@
   }
 
   /// The unlinked API signature of the file.
-  List<int> get apiSignature => _apiSignature;
+  List<int> get apiSignature => _apiSignature!;
 
   /// The content of the file.
-  String get content => _content;
+  String get content => _content!;
 
   /// The MD5 hash of the [content].
-  String get contentHash => _contentHash;
+  String get contentHash => _contentHash!;
 
   /// The class member names defined by the file.
   Set<String> get definedClassMemberNames {
     return _definedClassMemberNames ??=
-        _driverUnlinkedUnit.definedClassMemberNames.toSet();
+        _driverUnlinkedUnit!.definedClassMemberNames.toSet();
   }
 
   /// The top-level names defined by the file.
   Set<String> get definedTopLevelNames {
     return _definedTopLevelNames ??=
-        _driverUnlinkedUnit.definedTopLevelNames.toSet();
+        _driverUnlinkedUnit!.definedTopLevelNames.toSet();
   }
 
   /// Return the set of all directly referenced files - imported, exported or
@@ -213,62 +213,62 @@
   }
 
   /// Return `true` if the file exists.
-  bool get exists => _exists;
+  bool get exists => _exists!;
 
   /// The list of files this file exports.
-  List<FileState> get exportedFiles {
+  List<FileState?> get exportedFiles {
     if (_exportedFiles == null) {
-      _exportedFiles = <FileState>[];
-      for (var directive in _unlinked2.exports) {
+      _exportedFiles = <FileState?>[];
+      for (var directive in _unlinked2!.exports) {
         var uri = _selectRelativeUri(directive);
         var file = _fileForRelativeUri(uri);
-        _exportedFiles.add(file);
+        _exportedFiles!.add(file);
       }
     }
-    return _exportedFiles;
+    return _exportedFiles!;
   }
 
   @override
   int get hashCode => uri.hashCode;
 
   /// The list of files this file imports.
-  List<FileState> get importedFiles {
+  List<FileState?> get importedFiles {
     if (_importedFiles == null) {
-      _importedFiles = <FileState>[];
-      for (var directive in _unlinked2.imports) {
+      _importedFiles = <FileState?>[];
+      for (var directive in _unlinked2!.imports) {
         var uri = _selectRelativeUri(directive);
         var file = _fileForRelativeUri(uri);
-        _importedFiles.add(file);
+        _importedFiles!.add(file);
       }
     }
-    return _importedFiles;
+    return _importedFiles!;
   }
 
-  LibraryCycle get internal_libraryCycle => _libraryCycle;
+  LibraryCycle? get internal_libraryCycle => _libraryCycle;
 
   /// Return `true` if the file is a stub created for a library in the provided
   /// external summary store.
   bool get isExternalLibrary {
     return _fsState.externalSummaries != null &&
-        _fsState.externalSummaries.hasLinkedLibrary(uriStr);
+        _fsState.externalSummaries!.hasLinkedLibrary(uriStr);
   }
 
   /// Return `true` if the file does not have a `library` directive, and has a
   /// `part of` directive, so is probably a part.
   bool get isPart {
     if (_fsState.externalSummaries != null &&
-        _fsState.externalSummaries.hasUnlinkedUnit(uriStr)) {
-      return _fsState.externalSummaries.isPartUnit(uriStr);
+        _fsState.externalSummaries!.hasUnlinkedUnit(uriStr)) {
+      return _fsState.externalSummaries!.isPartUnit(uriStr);
     }
-    return !_unlinked2.hasLibraryDirective && _unlinked2.hasPartOfDirective;
+    return !_unlinked2!.hasLibraryDirective && _unlinked2!.hasPartOfDirective;
   }
 
   /// If the file [isPart], return a currently know library the file is a part
   /// of. Return `null` if a library is not known, for example because we have
   /// not processed a library file yet.
-  FileState get library {
+  FileState? get library {
     _fsState.readPartsForLibraries();
-    List<FileState> libraries = _fsState._partToLibraries[this];
+    List<FileState>? libraries = _fsState._partToLibraries[this];
     if (libraries == null || libraries.isEmpty) {
       return null;
     } else {
@@ -290,7 +290,7 @@
       computeLibraryCycle(_fsState._saltForElements, this);
     }
 
-    return _libraryCycle;
+    return _libraryCycle!;
   }
 
   /// The list of files files that this library consists of, i.e. this library
@@ -303,15 +303,15 @@
   }
 
   /// Return information about line in the file.
-  LineInfo get lineInfo => _lineInfo;
+  LineInfo get lineInfo => _lineInfo!;
 
   /// The list of files this library file references as parts.
-  List<FileState> get partedFiles {
+  List<FileState?> get partedFiles {
     if (_partedFiles == null) {
-      _partedFiles = <FileState>[];
-      for (var uri in _unlinked2.parts) {
+      _partedFiles = <FileState?>[];
+      for (var uri in _unlinked2!.parts) {
         var file = _fileForRelativeUri(uri);
-        _partedFiles.add(file);
+        _partedFiles!.add(file);
         if (file != null) {
           _fsState._partToLibraries
               .putIfAbsent(file, () => <FileState>[])
@@ -319,12 +319,12 @@
         }
       }
     }
-    return _partedFiles;
+    return _partedFiles!;
   }
 
   /// The external names referenced by the file.
   Set<String> get referencedNames {
-    return _referencedNames ??= _driverUnlinkedUnit.referencedNames.toSet();
+    return _referencedNames ??= _driverUnlinkedUnit!.referencedNames.toSet();
   }
 
   @visibleForTesting
@@ -349,7 +349,8 @@
   /// transitive closure of imported / exported files.
   String get transitiveSignature {
     libraryCycle; // sets _transitiveSignature
-    return _transitiveSignature;
+    _transitiveSignature ??= _invalidTransitiveSignature;
+    return _transitiveSignature!;
   }
 
   /// The value `transitiveSignature.linked` is used often, so we cache it.
@@ -358,30 +359,37 @@
   }
 
   /// The [UnlinkedUnit2] of the file.
-  UnlinkedUnit2 get unlinked2 => _unlinked2;
+  UnlinkedUnit2 get unlinked2 => _unlinked2!;
 
   /// The MD5 signature based on the content, feature sets, language version.
-  List<int> get unlinkedSignature => _unlinkedSignature;
+  List<int> get unlinkedSignature => _unlinkedSignature!;
 
   /// Return the [uri] string.
   String get uriStr => uri.toString();
 
+  String get _invalidTransitiveSignature {
+    return (ApiSignature()
+          ..addString(path!)
+          ..addBytes(unlinkedSignature))
+        .toHex();
+  }
+
   @override
   bool operator ==(Object other) {
     return other is FileState && other.uri == uri;
   }
 
-  Uint8List getAstBytes({CompilationUnit unit}) {
-    var bytes = _fsState._byteStore.get(_astKey);
+  Uint8List getAstBytes({CompilationUnit? unit}) {
+    var bytes = _fsState._byteStore.get(_astKey!) as Uint8List?;
     if (bytes == null) {
       unit ??= parse();
       bytes = writeUnitToBytes(unit: unit);
-      _fsState._byteStore.put(_astKey, bytes);
+      _fsState._byteStore.put(_astKey!, bytes);
     }
     return bytes;
   }
 
-  void internal_setLibraryCycle(LibraryCycle cycle, String signature) {
+  void internal_setLibraryCycle(LibraryCycle? cycle, String? signature) {
     if (cycle == null) {
       _libraryCycle = null;
       _transitiveSignature = null;
@@ -395,7 +403,7 @@
   /// Return a new parsed unresolved [CompilationUnit].
   ///
   /// If an exception happens during parsing, an empty unit is returned.
-  CompilationUnit parse([AnalysisErrorListener errorListener]) {
+  CompilationUnit parse([AnalysisErrorListener? errorListener]) {
     errorListener ??= AnalysisErrorListener.NULL_LISTENER;
     try {
       return _parse(errorListener);
@@ -424,7 +432,7 @@
     _invalidateCurrentUnresolvedData();
 
     {
-      var rawFileState = _fsState._fileContentCache.get(path, allowCached);
+      var rawFileState = _fsState._fileContentCache.get(path!, allowCached);
       _content = rawFileState.content;
       _exists = rawFileState.exists;
       _contentHash = rawFileState.contentHash;
@@ -434,21 +442,22 @@
     {
       var signature = ApiSignature();
       signature.addUint32List(_fsState._saltForUnlinked);
-      signature.addFeatureSet(_contextFeatureSet);
-      signature.addLanguageVersion(packageLanguageVersion);
-      signature.addString(_contentHash);
-      signature.addBool(_exists);
+      signature.addFeatureSet(_contextFeatureSet!);
+      signature.addLanguageVersion(packageLanguageVersion!);
+      signature.addString(_contentHash!);
+      signature.addBool(_exists!);
       _unlinkedSignature = signature.toByteList();
-      var signatureHex = hex.encode(_unlinkedSignature);
+      var signatureHex = hex.encode(_unlinkedSignature!);
       _unlinkedKey = '$signatureHex.unlinked2';
       // TODO(scheglov) Use the path as the key, and store the signature.
       _astKey = '$signatureHex.ast';
     }
 
     // Prepare bytes of the unlinked bundle - existing or new.
-    List<int> bytes;
+    // TODO(migration): should not be nullable
+    List<int>? bytes;
     {
-      bytes = _fsState._byteStore.get(_unlinkedKey);
+      bytes = _fsState._byteStore.get(_unlinkedKey!);
       if (bytes == null || bytes.isEmpty) {
         CompilationUnit unit = parse();
         _fsState._logger.run('Create unlinked for $path', () {
@@ -463,20 +472,20 @@
             referencedNames: referencedNames,
             subtypedNames: subtypedNames,
           ).toBuffer();
-          _fsState._byteStore.put(_unlinkedKey, bytes);
-          counterUnlinkedBytes += bytes.length;
-          counterUnlinkedLinkedBytes += bytes.length;
+          _fsState._byteStore.put(_unlinkedKey!, bytes!);
+          counterUnlinkedBytes += bytes!.length;
+          counterUnlinkedLinkedBytes += bytes!.length;
         });
       }
     }
 
     // Read the unlinked bundle.
-    _driverUnlinkedUnit = AnalysisDriverUnlinkedUnit.fromBuffer(bytes);
-    _unlinked2 = _driverUnlinkedUnit.unit2;
-    _lineInfo = LineInfo(_unlinked2.lineStarts);
+    _driverUnlinkedUnit = AnalysisDriverUnlinkedUnit.fromBuffer(bytes!);
+    _unlinked2 = _driverUnlinkedUnit!.unit2;
+    _lineInfo = LineInfo(_unlinked2!.lineStarts);
 
     // Prepare API signature.
-    var newApiSignature = Uint8List.fromList(_unlinked2.apiSignature);
+    var newApiSignature = Uint8List.fromList(_unlinked2!.apiSignature);
     bool apiSignatureChanged = _apiSignature != null &&
         !_equalByteLists(_apiSignature, newApiSignature);
     _apiSignature = newApiSignature;
@@ -491,14 +500,14 @@
       var libraries = _fsState._partToLibraries[this];
       if (libraries != null) {
         for (var library in libraries) {
-          library.libraryCycle?.invalidate();
+          library.libraryCycle.invalidate();
         }
       }
     }
 
     // This file is potentially not a library for its previous parts anymore.
     if (_partedFiles != null) {
-      for (FileState part in _partedFiles) {
+      for (var part in _partedFiles!) {
         _fsState._partToLibraries[part]?.remove(this);
       }
     }
@@ -515,7 +524,7 @@
     _libraryFiles = null;
 
     // Update mapping from subtyped names to files.
-    for (var name in _driverUnlinkedUnit.subtypedNames) {
+    for (var name in _driverUnlinkedUnit!.subtypedNames) {
       var files = _fsState._subtypedNameToFiles[name];
       if (files == null) {
         files = <FileState>{};
@@ -546,13 +555,13 @@
     var unit = astFactory.compilationUnit(
       beginToken: token,
       endToken: token,
-      featureSet: _contextFeatureSet,
+      featureSet: _contextFeatureSet!,
     ) as CompilationUnitImpl;
 
     unit.lineInfo = LineInfo(const <int>[0]);
 
     unit.languageVersion = LibraryLanguageVersion(
-      package: packageLanguageVersion,
+      package: packageLanguageVersion!,
       override: null,
     );
 
@@ -561,7 +570,7 @@
 
   /// Return the [FileState] for the given [relativeUri], or `null` if the
   /// URI cannot be parsed, cannot correspond any file, etc.
-  FileState _fileForRelativeUri(String relativeUri) {
+  FileState? _fileForRelativeUri(String relativeUri) {
     if (relativeUri.isEmpty) {
       return null;
     }
@@ -585,7 +594,7 @@
     _referencedNames = null;
 
     if (_driverUnlinkedUnit != null) {
-      for (var name in _driverUnlinkedUnit.subtypedNames) {
+      for (var name in _driverUnlinkedUnit!.subtypedNames) {
         var files = _fsState._subtypedNameToFiles[name];
         files?.remove(this);
       }
@@ -598,18 +607,18 @@
     }
 
     CharSequenceReader reader = CharSequenceReader(content);
-    Scanner scanner = Scanner(source, reader, errorListener)
+    Scanner scanner = Scanner(source!, reader, errorListener)
       ..configureFeatures(
-        featureSetForOverriding: _contextFeatureSet,
-        featureSet: _contextFeatureSet.restrictToVersion(
-          packageLanguageVersion,
+        featureSetForOverriding: _contextFeatureSet!,
+        featureSet: _contextFeatureSet!.restrictToVersion(
+          packageLanguageVersion!,
         ),
       );
     Token token = scanner.tokenize(reportScannerErrors: false);
     LineInfo lineInfo = LineInfo(scanner.lineStarts);
 
     Parser parser = Parser(
-      source,
+      source!,
       errorListener,
       featureSet: scanner.featureSet,
     );
@@ -631,7 +640,7 @@
 
     var unitImpl = unit as CompilationUnitImpl;
     unitImpl.languageVersion = LibraryLanguageVersion(
-      package: packageLanguageVersion,
+      package: packageLanguageVersion!,
       override: scanner.overrideVersion,
     );
 
@@ -696,12 +705,12 @@
       parts: parts,
       hasLibraryDirective: hasLibraryDirective,
       hasPartOfDirective: hasPartOfDirective,
-      lineStarts: unit.lineInfo.lineStarts,
+      lineStarts: unit.lineInfo!.lineStarts,
     );
   }
 
   /// Return `true` if the given byte lists are equal.
-  static bool _equalByteLists(List<int> a, List<int> b) {
+  static bool _equalByteLists(List<int>? a, List<int>? b) {
     if (a == null) {
       return b == null;
     } else if (b == null) {
@@ -741,7 +750,7 @@
 
   FileStateTestView(this.file);
 
-  String get unlinkedKey => file._unlinkedKey;
+  String get unlinkedKey => file._unlinkedKey!;
 }
 
 /// Information about known file system state.
@@ -750,9 +759,9 @@
   final ResourceProvider _resourceProvider;
   final String contextName;
   final ByteStore _byteStore;
-  final FileContentOverlay _contentOverlay;
+  final FileContentOverlay? _contentOverlay;
   final SourceFactory _sourceFactory;
-  final Workspace _workspace;
+  final Workspace? _workspace;
   final DeclaredVariables _declaredVariables;
   final Uint32List _saltForUnlinked;
   final Uint32List _saltForElements;
@@ -766,7 +775,7 @@
   /// While walking the file graph, when we reach a file that exists in the
   /// external store, we add a stub [FileState], but don't attempt to read its
   /// content, or its unlinked unit, or imported libraries, etc.
-  final SummaryDataStore externalSummaries;
+  final SummaryDataStore? externalSummaries;
 
   /// Mapping from a URI to the corresponding [FileState].
   final Map<Uri, FileState> _uriToFile = {};
@@ -802,9 +811,9 @@
 
   /// The cache of content of files, possibly shared with other file system
   /// states with the same resource provider and the content overlay.
-  _FileContentCache _fileContentCache;
+  late final _FileContentCache _fileContentCache;
 
-  FileSystemStateTestView _testView;
+  late final FileSystemStateTestView _testView;
 
   FileSystemState(
     this._logger,
@@ -835,7 +844,7 @@
   FeatureSet contextFeatureSet(
     String path,
     Uri uri,
-    WorkspacePackage workspacePackage,
+    WorkspacePackage? workspacePackage,
   ) {
     var workspacePackageExperiments = workspacePackage?.enabledExperiments;
     if (workspacePackageExperiments != null) {
@@ -850,7 +859,7 @@
   Version contextLanguageVersion(
     String path,
     Uri uri,
-    WorkspacePackage workspacePackage,
+    WorkspacePackage? workspacePackage,
   ) {
     var workspaceLanguageVersion = workspacePackage?.languageVersion;
     if (workspaceLanguageVersion != null) {
@@ -866,11 +875,11 @@
   /// Here "canonical" means that if the [path] is in a package `lib` then the
   /// returned file will have the `package:` style URI.
   FileState getFileForPath(String path) {
-    FileState file = _pathToCanonicalFile[path];
+    FileState? file = _pathToCanonicalFile[path];
     if (file == null) {
       File resource = _resourceProvider.getFile(path);
       Source fileSource = resource.createSource();
-      Uri uri = _sourceFactory.restoreUri(fileSource);
+      Uri? uri = _sourceFactory.restoreUri(fileSource);
       // Try to get the existing instance.
       file = _uriToFile[uri];
       // If we have a file, call it the canonical one and return it.
@@ -879,8 +888,8 @@
         return file;
       }
       // Create a new file.
-      FileSource uriSource = FileSource(resource, uri);
-      WorkspacePackage workspacePackage = _workspace?.findPackageFor(path);
+      FileSource uriSource = FileSource(resource, uri!);
+      WorkspacePackage? workspacePackage = _workspace?.findPackageFor(path);
       FeatureSet featureSet = contextFeatureSet(path, uri, workspacePackage);
       Version packageLanguageVersion =
           contextLanguageVersion(path, uri, workspacePackage);
@@ -898,21 +907,21 @@
   /// "unresolved" file if the [uri] is invalid, e.g. a `package:` URI without
   /// a package name. The returned file has the last known state since if was
   /// last refreshed.
-  FileState getFileForUri(Uri uri) {
-    FileState file = _uriToFile[uri];
+  FileState? getFileForUri(Uri uri) {
+    FileState? file = _uriToFile[uri];
     if (file == null) {
       // If the external store has this URI, create a stub file for it.
       // We are given all required unlinked and linked summaries for it.
       if (externalSummaries != null) {
         String uriStr = uri.toString();
-        if (externalSummaries.hasLinkedLibrary(uriStr)) {
+        if (externalSummaries!.hasLinkedLibrary(uriStr)) {
           file = FileState._external(this, uri);
           _uriToFile[uri] = file;
           return file;
         }
       }
 
-      Source uriSource = _sourceFactory.resolveUri(null, uri.toString());
+      Source? uriSource = _sourceFactory.resolveUri(null, uri.toString());
 
       // If the URI cannot be resolved, for example because the factory
       // does not understand the scheme, return the unresolved file instance.
@@ -923,7 +932,7 @@
       String path = uriSource.fullName;
       File resource = _resourceProvider.getFile(path);
       FileSource source = FileSource(resource, uri);
-      WorkspacePackage workspacePackage = _workspace?.findPackageFor(path);
+      WorkspacePackage? workspacePackage = _workspace?.findPackageFor(path);
       FeatureSet featureSet = contextFeatureSet(path, uri, workspacePackage);
       Version packageLanguageVersion =
           contextLanguageVersion(path, uri, workspacePackage);
@@ -940,7 +949,7 @@
   /// list has at least one item, and the first item is the canonical file.
   List<FileState> getFilesForPath(String path) {
     FileState canonicalFile = getFileForPath(path);
-    List<FileState> allFiles = _pathToFiles[path].toList();
+    List<FileState> allFiles = _pathToFiles[path]!.toList();
     if (allFiles.length == 1) {
       return allFiles;
     }
@@ -951,7 +960,7 @@
 
   /// Return files where the given [name] is subtyped, i.e. used in `extends`,
   /// `with` or `implements` clauses.
-  Set<FileState> getFilesSubtypingName(String name) {
+  Set<FileState>? getFilesSubtypingName(String name) {
     return _subtypedNameToFiles[name];
   }
 
@@ -961,12 +970,12 @@
   /// resolved to another file, e.g. a generated one in Bazel, Gn, etc, we
   /// cannot analyze the original file.
   bool hasUri(String path) {
-    bool flag = _hasUriForPath[path];
+    bool? flag = _hasUriForPath[path];
     if (flag == null) {
       File resource = _resourceProvider.getFile(path);
       Source fileSource = resource.createSource();
-      Uri uri = _sourceFactory.restoreUri(fileSource);
-      Source uriSource = _sourceFactory.forUri2(uri);
+      Uri? uri = _sourceFactory.restoreUri(fileSource);
+      Source? uriSource = _sourceFactory.forUri2(uri!);
       flag = uriSource?.fullName == path;
       _hasUriForPath[path] = flag;
     }
@@ -1068,7 +1077,7 @@
   static final _instances2 = Expando<_FileContentCache>();
 
   final ResourceProvider _resourceProvider;
-  final FileContentOverlay _contentOverlay;
+  final FileContentOverlay? _contentOverlay;
   final Map<String, _FileContent> _pathToFile = {};
 
   _FileContentCache(this._resourceProvider, this._contentOverlay);
@@ -1085,11 +1094,11 @@
     var file = allowCached ? _pathToFile[path] : null;
     if (file == null) {
       List<int> contentBytes;
-      String content;
+      String? content;
       bool exists;
       try {
         if (_contentOverlay != null) {
-          content = _contentOverlay[path];
+          content = _contentOverlay![path];
         }
         if (content != null) {
           contentBytes = utf8.encode(content);
@@ -1119,8 +1128,8 @@
   }
 
   static _FileContentCache getInstance(
-      ResourceProvider resourceProvider, FileContentOverlay contentOverlay) {
-    Expando<_FileContentCache> providerToInstance;
+      ResourceProvider resourceProvider, FileContentOverlay? contentOverlay) {
+    Expando<_FileContentCache>? providerToInstance;
     if (contentOverlay != null) {
       providerToInstance = _instances[contentOverlay];
       if (providerToInstance == null) {
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_tracker.dart b/pkg/analyzer/lib/src/dart/analysis/file_tracker.dart
index 29fe48e..d6caee6 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_tracker.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_tracker.dart
@@ -9,7 +9,7 @@
 /// added, changed, or removed, and therefore more analysis may be necessary.
 /// [path] is the path of the file that was added, changed, or removed, or
 /// `null` if multiple files were added, changed, or removed.
-typedef FileTrackerChangeHook = void Function(String path);
+typedef FileTrackerChangeHook = void Function(String? path);
 
 /// Maintains the file system state needed by the analysis driver, as well as
 /// information about files that have changed and the impact of those changes.
diff --git a/pkg/analyzer/lib/src/dart/analysis/index.dart b/pkg/analyzer/lib/src/dart/analysis/index.dart
index 821fe60..55feba8 100644
--- a/pkg/analyzer/lib/src/dart/analysis/index.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/index.dart
@@ -12,11 +12,11 @@
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:meta/meta.dart';
 
-Element declaredParameterElement(
+Element? declaredParameterElement(
   SimpleIdentifier node,
-  Element element,
+  Element? element,
 ) {
-  if (element.enclosingElement != null) {
+  if (element == null || element.enclosingElement != null) {
     return element;
   }
 
@@ -24,7 +24,7 @@
   /// synthetic [ParameterElement]s, disconnected from the rest of the
   /// element model. But we want to index these parameter references
   /// as references to declared parameters.
-  ParameterElement namedParameterElement(ExecutableElement executable) {
+  ParameterElement? namedParameterElement(ExecutableElement? executable) {
     if (executable == null) {
       return null;
     }
@@ -61,7 +61,7 @@
 /// Return the [CompilationUnitElement] that should be used for [element].
 /// Throw [StateError] if the [element] is not linked into a unit.
 CompilationUnitElement getUnitElement(Element element) {
-  for (Element e = element; e != null; e = e.enclosingElement) {
+  for (Element? e = element; e != null; e = e.enclosingElement) {
     if (e is CompilationUnitElement) {
       return e;
     }
@@ -78,29 +78,29 @@
 }
 
 class ElementNameComponents {
-  final String parameterName;
-  final String classMemberName;
-  final String unitMemberName;
+  final String? parameterName;
+  final String? classMemberName;
+  final String? unitMemberName;
 
   factory ElementNameComponents(Element element) {
-    String parameterName;
+    String? parameterName;
     if (element is ParameterElement) {
       parameterName = element.name;
-      element = element.enclosingElement;
+      element = element.enclosingElement!;
     }
 
-    String classMemberName;
+    String? classMemberName;
     if (element.enclosingElement is ClassElement ||
         element.enclosingElement is ExtensionElement) {
-      classMemberName = element.name;
-      element = element.enclosingElement;
+      classMemberName = element.name!;
+      element = element.enclosingElement!;
     }
 
-    String unitMemberName;
+    String? unitMemberName;
     if (element.enclosingElement is CompilationUnitElement) {
       unitMemberName = element.name;
       if (element is ExtensionElement && unitMemberName == null) {
-        var enclosingUnit = element.enclosingElement as CompilationUnitElement;
+        var enclosingUnit = element.enclosingElement;
         var indexOf = enclosingUnit.extensions.indexOf(element);
         unitMemberName = 'extension-$indexOf';
       }
@@ -137,18 +137,17 @@
     } else if (element.isSynthetic) {
       if (elementKind == ElementKind.CONSTRUCTOR) {
         kind = IndexSyntheticElementKind.constructor;
-        element = element.enclosingElement;
-      } else if (elementKind == ElementKind.FUNCTION &&
-          element.name == 'loadLibrary') {
+        element = element.enclosingElement!;
+      } else if (element is FunctionElement && element.name == 'loadLibrary') {
         kind = IndexSyntheticElementKind.loadLibrary;
         element = element.library;
       } else if (elementKind == ElementKind.FIELD) {
-        FieldElement field = element;
+        var field = element as FieldElement;
         kind = IndexSyntheticElementKind.field;
-        element = field.getter ?? field.setter;
+        element = (field.getter ?? field.setter)!;
       } else if (elementKind == ElementKind.GETTER ||
           elementKind == ElementKind.SETTER) {
-        PropertyAccessorElement accessor = element;
+        var accessor = element as PropertyAccessorElement;
         Element enclosing = element.enclosingElement;
         bool isEnumGetter = enclosing is ClassElement && enclosing.isEnum;
         if (isEnumGetter && accessor.name == 'index') {
@@ -163,17 +162,16 @@
               : IndexSyntheticElementKind.setter;
           element = accessor.variable;
         }
-      } else if (elementKind == ElementKind.METHOD) {
+      } else if (element is MethodElement) {
         Element enclosing = element.enclosingElement;
         bool isEnumMethod = enclosing is ClassElement && enclosing.isEnum;
         if (isEnumMethod && element.name == 'toString') {
           kind = IndexSyntheticElementKind.enumToString;
           element = enclosing;
         }
-      } else if (elementKind == ElementKind.TOP_LEVEL_VARIABLE) {
-        TopLevelVariableElement property = element;
+      } else if (element is TopLevelVariableElement) {
         kind = IndexSyntheticElementKind.topLevelVariable;
-        element = property.getter ?? property.setter;
+        element = (element.getter ?? element.setter)!;
       } else {
         throw ArgumentError(
             'Unsupported synthetic element ${element.runtimeType}');
@@ -207,7 +205,7 @@
 
   /// The unique id of the element.  It is set after indexing of the whole
   /// package is done and we are assembling the full package index.
-  int id;
+  late int id;
 
   _ElementInfo(this.unitId, this.nameIdUnitMember, this.nameIdClassMember,
       this.nameIdParameter, this.kind);
@@ -270,7 +268,7 @@
   final List<_SubtypeInfo> subtypes = [];
 
   /// The [_StringInfo] to use for `null` strings.
-  _StringInfo nullString;
+  late final _StringInfo nullString;
 
   _IndexAssembler() {
     nullString = _getStringInfo(NULL_STRING);
@@ -381,7 +379,7 @@
   /// Return the unique [_ElementInfo] corresponding the [element].  The field
   /// [_ElementInfo.id] is filled by [assemble] during final sorting.
   _ElementInfo _getElementInfo(Element element) {
-    element = element.declaration;
+    element = element.declaration!;
     return elementMap.putIfAbsent(element, () {
       CompilationUnitElement unitElement = getUnitElement(element);
       int unitId = _getUnitId(unitElement);
@@ -391,7 +389,7 @@
 
   /// Return the unique [_StringInfo] corresponding the given [string].  The
   /// field [_StringInfo.id] is filled by [assemble] during final sorting.
-  _StringInfo _getStringInfo(String string) {
+  _StringInfo _getStringInfo(String? string) {
     if (string == null) {
       return nullString;
     }
@@ -444,20 +442,18 @@
 
   _IndexContributor(this.assembler);
 
-  void recordIsAncestorOf(Element descendant) {
+  void recordIsAncestorOf(ClassElement descendant) {
     _recordIsAncestorOf(descendant, descendant, false, <ClassElement>[]);
   }
 
   /// Record that the name [node] has a relation of the given [kind].
   void recordNameRelation(
       SimpleIdentifier node, IndexRelationKind kind, bool isQualified) {
-    if (node != null) {
-      assembler.addNameRelation(node.name, kind, node.offset, isQualified);
-    }
+    assembler.addNameRelation(node.name, kind, node.offset, isQualified);
   }
 
   /// Record reference to the given operator [Element].
-  void recordOperatorReference(Token operator, Element element) {
+  void recordOperatorReference(Token operator, Element? element) {
     recordRelationToken(element, IndexRelationKind.IS_INVOKED_BY, operator);
   }
 
@@ -465,9 +461,9 @@
   /// of the given [node].  The flag [isQualified] is `true` if [node] has an
   /// explicit or implicit qualifier, so cannot be shadowed by a local
   /// declaration.
-  void recordRelation(
-      Element element, IndexRelationKind kind, AstNode node, bool isQualified) {
-    if (element != null && node != null) {
+  void recordRelation(Element? element, IndexRelationKind kind, AstNode node,
+      bool isQualified) {
+    if (element != null) {
       recordRelationOffset(
           element, kind, node.offset, node.length, isQualified);
     }
@@ -477,12 +473,13 @@
   /// [offset] and [length].  The flag [isQualified] is `true` if the relation
   /// has an explicit or implicit qualifier, so [element] cannot be shadowed by
   /// a local declaration.
-  void recordRelationOffset(Element element, IndexRelationKind kind, int offset,
-      int length, bool isQualified) {
+  void recordRelationOffset(Element? element, IndexRelationKind kind,
+      int offset, int length, bool isQualified) {
+    if (element == null) return;
+
     // Ignore elements that can't be referenced outside of the unit.
-    ElementKind elementKind = element?.kind;
-    if (elementKind == null ||
-        elementKind == ElementKind.DYNAMIC ||
+    ElementKind elementKind = element.kind;
+    if (elementKind == ElementKind.DYNAMIC ||
         elementKind == ElementKind.ERROR ||
         elementKind == ElementKind.LABEL ||
         elementKind == ElementKind.LOCAL_VARIABLE ||
@@ -497,11 +494,11 @@
     }
     // Ignore named parameters of synthetic functions, e.g. created for LUB.
     // These functions are not bound to a source, we cannot index them.
-    if (elementKind == ElementKind.PARAMETER &&
-        element is ParameterElement &&
-        (element.enclosingElement == null ||
-            element.enclosingElement.isSynthetic)) {
-      return;
+    if (elementKind == ElementKind.PARAMETER && element is ParameterElement) {
+      var enclosingElement = element.enclosingElement;
+      if (enclosingElement == null || enclosingElement.isSynthetic) {
+        return;
+      }
     }
     // Elements for generic function types are enclosed by the compilation
     // units, but don't have names. So, we cannot index references to their
@@ -518,34 +515,30 @@
   /// Record that [element] has a relation of the given [kind] at the location
   /// of the given [token].
   void recordRelationToken(
-      Element element, IndexRelationKind kind, Token token) {
-    if (element != null && token != null) {
-      recordRelationOffset(element, kind, token.offset, token.length, true);
-    }
+      Element? element, IndexRelationKind kind, Token token) {
+    recordRelationOffset(element, kind, token.offset, token.length, true);
   }
 
   /// Record a relation between a super [typeName] and its [Element].
   void recordSuperType(TypeName typeName, IndexRelationKind kind) {
-    Identifier name = typeName?.name;
-    if (name != null) {
-      Element element = name.staticElement;
-      bool isQualified;
-      SimpleIdentifier relNode;
-      if (name is PrefixedIdentifier) {
-        isQualified = true;
-        relNode = name.identifier;
-      } else {
-        isQualified = false;
-        relNode = name;
-      }
-      recordRelation(element, kind, relNode, isQualified);
-      recordRelation(
-          element, IndexRelationKind.IS_REFERENCED_BY, relNode, isQualified);
-      typeName.typeArguments?.accept(this);
+    Identifier name = typeName.name;
+    Element? element = name.staticElement;
+    bool isQualified;
+    SimpleIdentifier relNode;
+    if (name is PrefixedIdentifier) {
+      isQualified = true;
+      relNode = name.identifier;
+    } else {
+      isQualified = false;
+      relNode = name as SimpleIdentifier;
     }
+    recordRelation(element, kind, relNode, isQualified);
+    recordRelation(
+        element, IndexRelationKind.IS_REFERENCED_BY, relNode, isQualified);
+    typeName.typeArguments?.accept(this);
   }
 
-  void recordUriReference(Element element, StringLiteral uri) {
+  void recordUriReference(Element? element, StringLiteral uri) {
     recordRelation(element, IndexRelationKind.IS_REFERENCED_BY, uri, true);
   }
 
@@ -564,19 +557,20 @@
   @override
   void visitClassDeclaration(ClassDeclaration node) {
     _addSubtypeForClassDeclaration(node);
+    var declaredElement = node.declaredElement!;
     if (node.extendsClause == null) {
-      ClassElement objectElement = node.declaredElement.supertype?.element;
+      ClassElement? objectElement = declaredElement.supertype?.element;
       recordRelationOffset(objectElement, IndexRelationKind.IS_EXTENDED_BY,
           node.name.offset, 0, true);
     }
-    recordIsAncestorOf(node.declaredElement);
+    recordIsAncestorOf(declaredElement);
     super.visitClassDeclaration(node);
   }
 
   @override
   void visitClassTypeAlias(ClassTypeAlias node) {
     _addSubtypeForClassTypeAlis(node);
-    recordIsAncestorOf(node.declaredElement);
+    recordIsAncestorOf(node.declaredElement!);
     super.visitClassTypeAlias(node);
   }
 
@@ -604,22 +598,20 @@
 
   @override
   void visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
-    SimpleIdentifier fieldName = node.fieldName;
-    if (fieldName != null) {
-      Element element = fieldName.staticElement;
-      recordRelation(element, IndexRelationKind.IS_WRITTEN_BY, fieldName, true);
-    }
-    node.expression?.accept(this);
+    var fieldName = node.fieldName;
+    var element = fieldName.staticElement;
+    recordRelation(element, IndexRelationKind.IS_WRITTEN_BY, fieldName, true);
+    node.expression.accept(this);
   }
 
   @override
   void visitConstructorName(ConstructorName node) {
-    ConstructorElement element = node.staticElement;
+    ConstructorElement? element = node.staticElement;
     element = _getActualConstructorElement(element);
     // record relation
     if (node.name != null) {
-      int offset = node.period.offset;
-      int length = node.name.end - offset;
+      int offset = node.period!.offset;
+      int length = node.name!.end - offset;
       recordRelationOffset(
           element, IndexRelationKind.IS_REFERENCED_BY, offset, length, true);
     } else {
@@ -632,14 +624,14 @@
 
   @override
   void visitExportDirective(ExportDirective node) {
-    ExportElement element = node.element;
+    ExportElement? element = node.element;
     recordUriReference(element?.exportedLibrary, node.uri);
     super.visitExportDirective(node);
   }
 
   @override
   void visitExpression(Expression node) {
-    ParameterElement parameterElement = node.staticParameterElement;
+    ParameterElement? parameterElement = node.staticParameterElement;
     if (parameterElement != null && parameterElement.isOptionalPositional) {
       recordRelationOffset(parameterElement, IndexRelationKind.IS_REFERENCED_BY,
           node.offset, 0, true);
@@ -661,14 +653,14 @@
 
   @override
   void visitImportDirective(ImportDirective node) {
-    ImportElement element = node.element;
+    ImportElement? element = node.element;
     recordUriReference(element?.importedLibrary, node.uri);
     super.visitImportDirective(node);
   }
 
   @override
   void visitIndexExpression(IndexExpression node) {
-    MethodElement element = node.writeOrReadElement;
+    Element? element = node.writeOrReadElement;
     if (element is MethodElement) {
       Token operator = node.leftBracket;
       recordRelationToken(element, IndexRelationKind.IS_INVOKED_BY, operator);
@@ -682,7 +674,7 @@
   @override
   void visitMethodInvocation(MethodInvocation node) {
     SimpleIdentifier name = node.methodName;
-    Element element = name.staticElement;
+    Element? element = name.staticElement;
     // unresolved name invocation
     bool isQualified = node.realTarget != null;
     if (element == null) {
@@ -695,13 +687,13 @@
     recordRelation(element, kind, name, isQualified);
     node.target?.accept(this);
     node.typeArguments?.accept(this);
-    node.argumentList?.accept(this);
+    node.argumentList.accept(this);
   }
 
   @override
   void visitMixinDeclaration(MixinDeclaration node) {
     _addSubtypeForMixinDeclaration(node);
-    recordIsAncestorOf(node.declaredElement);
+    recordIsAncestorOf(node.declaredElement!);
     super.visitMixinDeclaration(node);
   }
 
@@ -714,7 +706,7 @@
 
   @override
   void visitPartDirective(PartDirective node) {
-    CompilationUnitElement element = node.element;
+    var element = node.element as CompilationUnitElement?;
     if (element?.source != null) {
       recordUriReference(element, node.uri);
     }
@@ -736,10 +728,10 @@
   @override
   void visitRedirectingConstructorInvocation(
       RedirectingConstructorInvocation node) {
-    ConstructorElement element = node.staticElement;
+    var element = node.staticElement;
     if (node.constructorName != null) {
-      int offset = node.period.offset;
-      int length = node.constructorName.end - offset;
+      int offset = node.period!.offset;
+      int length = node.constructorName!.end - offset;
       recordRelationOffset(
           element, IndexRelationKind.IS_REFERENCED_BY, offset, length, true);
     } else {
@@ -757,7 +749,7 @@
       return;
     }
 
-    Element element = node.writeOrReadElement;
+    Element? element = node.writeOrReadElement;
     if (node is SimpleIdentifier && element is ParameterElement) {
       element = declaredParameterElement(node, element);
     }
@@ -779,7 +771,7 @@
     }
     // this.field parameter
     if (element is FieldFormalParameterElement) {
-      AstNode parent = node.parent;
+      AstNode parent = node.parent!;
       IndexRelationKind kind =
           parent is FieldFormalParameter && parent.identifier == node
               ? IndexRelationKind.IS_WRITTEN_BY
@@ -798,10 +790,10 @@
 
   @override
   void visitSuperConstructorInvocation(SuperConstructorInvocation node) {
-    ConstructorElement element = node.staticElement;
+    var element = node.staticElement;
     if (node.constructorName != null) {
-      int offset = node.period.offset;
-      int length = node.constructorName.end - offset;
+      int offset = node.period!.offset;
+      int length = node.constructorName!.end - offset;
       recordRelationOffset(
           element, IndexRelationKind.IS_REFERENCED_BY, offset, length, true);
     } else {
@@ -809,12 +801,12 @@
       recordRelationOffset(
           element, IndexRelationKind.IS_REFERENCED_BY, offset, 0, true);
     }
-    node.argumentList?.accept(this);
+    node.argumentList.accept(this);
   }
 
   @override
   void visitTypeName(TypeName node) {
-    AstNode parent = node.parent;
+    AstNode parent = node.parent!;
     if (parent is ClassTypeAlias && parent.superclass == node) {
       recordSuperType(node, IndexRelationKind.IS_EXTENDED_BY);
     } else {
@@ -831,11 +823,11 @@
 
   /// Record the given class as a subclass of its direct superclasses.
   void _addSubtype(String name,
-      {TypeName superclass,
-      WithClause withClause,
-      OnClause onClause,
-      ImplementsClause implementsClause,
-      List<ClassMember> memberNodes}) {
+      {TypeName? superclass,
+      WithClause? withClause,
+      OnClause? onClause,
+      ImplementsClause? implementsClause,
+      required List<ClassMember> memberNodes}) {
     List<String> supertypes = [];
     List<String> members = [];
 
@@ -847,8 +839,8 @@
           element.name;
     }
 
-    void addSupertype(TypeName type) {
-      Element element = type?.name?.staticElement;
+    void addSupertype(TypeName? type) {
+      var element = type?.name.staticElement;
       if (element is ClassElement) {
         String id = getClassElementId(element);
         supertypes.add(id);
@@ -856,16 +848,14 @@
     }
 
     addSupertype(superclass);
-    withClause?.mixinTypes?.forEach(addSupertype);
-    onClause?.superclassConstraints?.forEach(addSupertype);
-    implementsClause?.interfaces?.forEach(addSupertype);
+    withClause?.mixinTypes.forEach(addSupertype);
+    onClause?.superclassConstraints.forEach(addSupertype);
+    implementsClause?.interfaces.forEach(addSupertype);
 
     void addMemberName(SimpleIdentifier identifier) {
-      if (identifier != null) {
-        String name = identifier.name;
-        if (name != null && name.isNotEmpty) {
-          members.add(name);
-        }
+      String name = identifier.name;
+      if (name.isNotEmpty) {
+        members.add(name);
       }
     }
 
@@ -914,9 +904,9 @@
   /// If the given [constructor] is a synthetic constructor created for a
   /// [ClassTypeAlias], return the actual constructor of a [ClassDeclaration]
   /// which is invoked.  Return `null` if a redirection cycle is detected.
-  ConstructorElement _getActualConstructorElement(
-      ConstructorElement constructor) {
-    Set<ConstructorElement> seenConstructors = <ConstructorElement>{};
+  ConstructorElement? _getActualConstructorElement(
+      ConstructorElement? constructor) {
+    var seenConstructors = <ConstructorElement?>{};
     while (constructor != null &&
         constructor.isSynthetic &&
         constructor.redirectedConstructor != null) {
@@ -935,15 +925,12 @@
     if (node.isQualified) {
       return true;
     }
-    AstNode parent = node.parent;
+    AstNode parent = node.parent!;
     return parent is Combinator || parent is Label;
   }
 
   void _recordIsAncestorOf(Element descendant, ClassElement ancestor,
       bool includeThis, List<ClassElement> visitedElements) {
-    if (ancestor == null) {
-      return;
-    }
     if (visitedElements.contains(ancestor)) {
       return;
     }
@@ -955,7 +942,7 @@
           ancestor, IndexRelationKind.IS_ANCESTOR_OF, offset, length, false);
     }
     {
-      InterfaceType superType = ancestor.supertype;
+      var superType = ancestor.supertype;
       if (superType != null) {
         _recordIsAncestorOf(
             descendant, superType.element, true, visitedElements);
@@ -991,7 +978,7 @@
 
   /// The unique id of the string.  It is set after indexing of the whole
   /// package is done and we are assembling the full package index.
-  int id;
+  late int id;
 
   _StringInfo(this.value);
 }
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index dc113ba..1f449ba 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -73,14 +73,14 @@
   final AnalysisContext _context;
   final LinkedElementFactory _elementFactory;
 
-  LibraryElement _libraryElement;
+  late final LibraryElementImpl _libraryElement;
 
   final Map<FileState, LineInfo> _fileToLineInfo = {};
 
   final Map<FileState, IgnoreInfo> _fileToIgnoreInfo = {};
   final Map<FileState, RecordingErrorListener> _errorListeners = {};
   final Map<FileState, ErrorReporter> _errorReporters = {};
-  final TestingData _testingData;
+  final TestingData? _testingData;
   final List<UsedImportedElements> _usedImportedElementsList = [];
   final List<UsedLocalElements> _usedLocalElementsList = [];
 
@@ -95,7 +95,7 @@
       this._elementFactory,
       this._inheritance,
       this._library,
-      {TestingData testingData})
+      {TestingData? testingData})
       : _testingData = testingData;
 
   TypeProviderImpl get _typeProvider => _libraryElement.typeProvider;
@@ -123,10 +123,10 @@
     }
     timerLibraryAnalyzerFreshUnit.stop();
 
-    _libraryElement = _elementFactory.libraryOfUri(_library.uriStr);
+    _libraryElement = _elementFactory.libraryOfUri2(_library.uriStr);
 
     // Resolve URIs in directives to corresponding sources.
-    FeatureSet featureSet = units[_library].featureSet;
+    FeatureSet featureSet = units[_library]!.featureSet;
     units.forEach((file, unit) {
       _validateFeatureSet(unit, featureSet);
       _resolveUriBasedDirectives(file, unit);
@@ -170,7 +170,7 @@
 
     if (_analysisOptions.lint) {
       var allUnits = _library.libraryFiles
-          .map((file) => LinterContextUnit(file.content, units[file]))
+          .map((file) => LinterContextUnit(file.content, units[file]!))
           .toList();
       for (int i = 0; i < allUnits.length; i++) {
         _computeLints(_library.libraryFiles[i], allUnits[i], allUnits);
@@ -186,7 +186,7 @@
     for (var file in _library.libraryFiles) {
       if (file.source != null) {
         IgnoreValidator(_getErrorReporter(file), _getErrorListener(file).errors,
-                _fileToIgnoreInfo[file], _fileToLineInfo[file])
+                _fileToIgnoreInfo[file]!, _fileToLineInfo[file]!)
             .reportErrors();
       }
     }
@@ -214,7 +214,7 @@
     var elementToUnit = <CompilationUnitElement, CompilationUnit>{};
     for (var entry in units.entries) {
       var unit = entry.value;
-      elementToUnit[unit.declaredElement] = unit;
+      elementToUnit[unit.declaredElement!] = unit;
     }
 
     for (var directive in libraryUnit.directives) {
@@ -427,17 +427,17 @@
       return errors;
     }
 
-    IgnoreInfo ignoreInfo = _fileToIgnoreInfo[file];
+    IgnoreInfo ignoreInfo = _fileToIgnoreInfo[file]!;
     if (!ignoreInfo.hasIgnores) {
       return errors;
     }
 
-    LineInfo lineInfo = _fileToLineInfo[file];
+    LineInfo lineInfo = _fileToLineInfo[file]!;
 
     bool isIgnored(AnalysisError error) {
       var code = error.errorCode;
       // Don't allow error severity issues to be ignored.
-      if (!IgnoreValidator.isIgnorable(file.path, code)) {
+      if (!IgnoreValidator.isIgnorable(file.path!, code)) {
         return false;
       }
 
@@ -477,7 +477,7 @@
       RecordingErrorListener listener = _getErrorListener(file);
       return ErrorReporter(
         listener,
-        file.source,
+        file.source!,
         isNonNullableByDefault: _libraryElement.isNonNullableByDefault,
       );
     });
@@ -485,18 +485,18 @@
 
   /// Return the name of the library that the given part is declared to be a
   /// part of, or `null` if the part does not contain a part-of directive.
-  _NameOrSource _getPartLibraryNameOrUri(Source partSource,
+  _NameOrSource? _getPartLibraryNameOrUri(Source partSource,
       CompilationUnit partUnit, List<Directive> directivesToResolve) {
     for (Directive directive in partUnit.directives) {
       if (directive is PartOfDirective) {
         directivesToResolve.add(directive);
-        LibraryIdentifier libraryName = directive.libraryName;
+        LibraryIdentifier? libraryName = directive.libraryName;
         if (libraryName != null) {
           return _NameOrSource(libraryName.name, null);
         }
-        String uri = directive.uri?.stringValue;
+        String? uri = directive.uri?.stringValue;
         if (uri != null) {
-          Source librarySource = _sourceFactory.resolveUri(partSource, uri);
+          Source? librarySource = _sourceFactory.resolveUri(partSource, uri);
           if (librarySource != null) {
             return _NameOrSource(null, librarySource);
           }
@@ -527,7 +527,7 @@
     String content = file.content;
     CompilationUnit unit = file.parse(errorListener);
 
-    LineInfo lineInfo = unit.lineInfo;
+    LineInfo lineInfo = unit.lineInfo!;
     _fileToLineInfo[file] = lineInfo;
     _fileToIgnoreInfo[file] = IgnoreInfo.forDart(unit, content);
 
@@ -535,7 +535,7 @@
   }
 
   void _resolveDirectives(Map<FileState, CompilationUnit> units) {
-    CompilationUnit definingCompilationUnit = units[_library];
+    CompilationUnit definingCompilationUnit = units[_library]!;
     definingCompilationUnit.element = _libraryElement.definingCompilationUnit;
 
     bool matchNodeElement(Directive node, Element element) {
@@ -544,7 +544,7 @@
 
     ErrorReporter libraryErrorReporter = _getErrorReporter(_library);
 
-    LibraryIdentifier libraryNameNode;
+    LibraryIdentifier? libraryNameNode;
     var seenPartSources = <Source>{};
     var directivesToResolve = <Directive>[];
     int partDirectiveIndex = 0;
@@ -558,7 +558,7 @@
           if (matchNodeElement(directive, importElement)) {
             directive.element = importElement;
             directive.prefix?.staticElement = importElement.prefix;
-            Source source = importElement.importedLibrary?.source;
+            Source? source = importElement.importedLibrary?.source;
             if (source != null && !_isLibrarySource(source)) {
               libraryErrorReporter.reportErrorForNode(
                   CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY,
@@ -571,7 +571,7 @@
         for (ExportElement exportElement in _libraryElement.exports) {
           if (matchNodeElement(directive, exportElement)) {
             directive.element = exportElement;
-            Source source = exportElement.exportedLibrary?.source;
+            Source? source = exportElement.exportedLibrary?.source;
             if (source != null && !_isLibrarySource(source)) {
               libraryErrorReporter.reportErrorForNode(
                   CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY,
@@ -583,17 +583,17 @@
       } else if (directive is PartDirective) {
         StringLiteral partUri = directive.uri;
 
-        FileState partFile = _library.partedFiles[partDirectiveIndex++];
+        var partFile = _library.partedFiles[partDirectiveIndex++];
         if (partFile == null) {
           continue;
         }
 
-        var partUnit = units[partFile];
+        var partUnit = units[partFile]!;
         var partElement = _libraryElement.parts[partElementIndex++];
         partUnit.element = partElement;
         directive.element = partElement;
 
-        Source partSource = directive.uriSource;
+        Source? partSource = directive.uriSource;
         if (partSource == null) {
           continue;
         }
@@ -611,7 +611,7 @@
         // name or uri as the library.
         //
         if (_isExistingSource(partSource)) {
-          _NameOrSource nameOrSource = _getPartLibraryNameOrUri(
+          _NameOrSource? nameOrSource = _getPartLibraryNameOrUri(
               partSource, partUnit, directivesToResolve);
           if (nameOrSource == null) {
             libraryErrorReporter.reportErrorForNode(
@@ -619,7 +619,7 @@
                 partUri,
                 [partUri.toSource()]);
           } else {
-            String name = nameOrSource.name;
+            String? name = nameOrSource.name;
             if (name != null) {
               if (libraryNameNode == null) {
                 libraryErrorReporter.reportErrorForNode(
@@ -633,7 +633,7 @@
                     [libraryNameNode.name, name]);
               }
             } else {
-              Source source = nameOrSource.source;
+              Source source = nameOrSource.source!;
               if (source != _library.source) {
                 libraryErrorReporter.reportErrorForNode(
                     CompileTimeErrorCode.PART_OF_DIFFERENT_LIBRARY,
@@ -660,14 +660,14 @@
   }
 
   void _resolveFile(FileState file, CompilationUnit unit) {
-    Source source = file.source;
+    var source = file.source;
     if (source == null) {
       return;
     }
 
     RecordingErrorListener errorListener = _getErrorListener(file);
 
-    CompilationUnitElementImpl unitElement = unit.declaredElement;
+    var unitElement = unit.declaredElement as CompilationUnitElementImpl;
 
     // TODO(scheglov) Hack: set types for top-level variables
     // Otherwise TypeResolverVisitor will set declared types, and because we
@@ -698,12 +698,12 @@
     // Nothing for RESOLVED_UNIT9?
     // Nothing for RESOLVED_UNIT10?
 
-    FlowAnalysisHelper flowAnalysisHelper;
+    FlowAnalysisHelper? flowAnalysisHelper;
     if (unit.featureSet.isEnabled(Feature.non_nullable)) {
       flowAnalysisHelper =
           FlowAnalysisHelper(_typeSystem, _testingData != null);
       _testingData?.recordFlowAnalysisDataForTesting(
-          file.uri, flowAnalysisHelper.dataForTesting);
+          file.uri, flowAnalysisHelper.dataForTesting!);
     }
 
     unit.accept(ResolverVisitor(
@@ -713,13 +713,13 @@
 
   /// Return the result of resolve the given [uriContent], reporting errors
   /// against the [uriLiteral].
-  Source _resolveUri(FileState file, bool isImport, StringLiteral uriLiteral,
-      String uriContent) {
-    UriValidationCode code =
+  Source? _resolveUri(FileState file, bool isImport, StringLiteral uriLiteral,
+      String? uriContent) {
+    UriValidationCode? code =
         UriBasedDirectiveImpl.validateUri(isImport, uriLiteral, uriContent);
     if (code == null) {
       try {
-        Uri.parse(uriContent);
+        Uri.parse(uriContent!);
       } on FormatException {
         return null;
       }
@@ -742,9 +742,9 @@
     for (Directive directive in unit.directives) {
       if (directive is UriBasedDirective) {
         StringLiteral uriLiteral = directive.uri;
-        String uriContent = uriLiteral.stringValue?.trim();
+        String? uriContent = uriLiteral.stringValue?.trim();
         directive.uriContent = uriContent;
-        Source defaultSource = _resolveUri(
+        Source? defaultSource = _resolveUri(
             file, directive is ImportDirective, uriLiteral, uriContent);
         directive.uriSource = defaultSource;
       }
@@ -757,8 +757,8 @@
         );
         for (var configuration in directive.configurations) {
           var uriLiteral = configuration.uri;
-          String uriContent = uriLiteral.stringValue?.trim();
-          Source defaultSource = _resolveUri(
+          String? uriContent = uriLiteral.stringValue?.trim();
+          Source? defaultSource = _resolveUri(
               file, directive is ImportDirective, uriLiteral, uriContent);
           configuration.uriSource = defaultSource;
         }
@@ -774,7 +774,7 @@
         return configuration.uri.stringValue ?? '';
       }
     }
-    return directive.uri?.stringValue ?? '';
+    return directive.uri.stringValue ?? '';
   }
 
   /// Validate that the feature set associated with the compilation [unit] is
@@ -790,8 +790,8 @@
   /// report an error if it does not.
   void _validateUriBasedDirective(
       FileState file, UriBasedDirectiveImpl directive) {
-    String uriContent;
-    Source source;
+    String? uriContent;
+    Source? source;
     if (directive is NamespaceDirectiveImpl) {
       uriContent = directive.selectedUriContent;
       source = directive.selectedSource;
@@ -823,7 +823,7 @@
   /// exists and report an error if it does not.
   void _validateUriBasedDirectives(FileState file, CompilationUnit unit) {
     for (Directive directive in unit.directives) {
-      if (directive is UriBasedDirective) {
+      if (directive is UriBasedDirectiveImpl) {
         _validateUriBasedDirective(file, directive);
       }
     }
@@ -841,8 +841,8 @@
 
 /// Either the name or the source associated with a part-of directive.
 class _NameOrSource {
-  final String name;
-  final Source source;
+  final String? name;
+  final Source? source;
 
   _NameOrSource(this.name, this.source);
 }
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_context.dart b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
index 411150a..d13ec6e 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_context.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
@@ -16,14 +16,13 @@
 import 'package:analyzer/src/dart/analysis/session.dart';
 import 'package:analyzer/src/exception/exception.dart';
 import 'package:analyzer/src/generated/engine.dart'
-    show AnalysisContext, AnalysisOptions;
+    show AnalysisContext, AnalysisOptionsImpl;
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:analyzer/src/summary2/bundle_reader.dart';
 import 'package:analyzer/src/summary2/link.dart' as link2;
 import 'package:analyzer/src/summary2/linked_element_factory.dart';
 import 'package:analyzer/src/summary2/reference.dart';
-import 'package:meta/meta.dart';
 
 var counterLinkedLibraries = 0;
 var counterLoadedLibraries = 0;
@@ -44,7 +43,7 @@
   final PerformanceLog logger;
   final ByteStore byteStore;
   final AnalysisSessionImpl analysisSession;
-  final SummaryDataStore externalSummaries;
+  final SummaryDataStore? externalSummaries;
   final SummaryDataStore store = SummaryDataStore([]);
 
   /// The size of the linked data that is loaded by this context.
@@ -52,20 +51,20 @@
   /// We use it as an approximation for the heap size of elements.
   final int _linkedDataInBytes = 0;
 
-  AnalysisContextImpl analysisContext;
-  LinkedElementFactory elementFactory;
+  late final AnalysisContextImpl analysisContext;
+  late LinkedElementFactory elementFactory;
 
   LibraryContext({
-    @required this.testView,
-    @required AnalysisSessionImpl session,
-    @required PerformanceLog logger,
-    @required ByteStore byteStore,
-    @required AnalysisOptions analysisOptions,
-    @required DeclaredVariables declaredVariables,
-    @required SourceFactory sourceFactory,
-    @required this.externalSummaries,
-    @required FileState targetLibrary,
-  })  : logger = logger,
+    required this.testView,
+    required AnalysisSessionImpl session,
+    required PerformanceLog logger,
+    required ByteStore byteStore,
+    required AnalysisOptionsImpl analysisOptions,
+    required DeclaredVariables declaredVariables,
+    required SourceFactory sourceFactory,
+    required this.externalSummaries,
+    required FileState targetLibrary,
+  })   : logger = logger,
         byteStore = byteStore,
         analysisSession = session {
     var synchronousSession =
@@ -82,12 +81,13 @@
         .getChild(library.uriStr)
         .getChild('@unit')
         .getChild(unit.uriStr);
-    return elementFactory.elementOfReference(reference);
+    var element = elementFactory.elementOfReference(reference);
+    return element as CompilationUnitElement;
   }
 
   /// Get the [LibraryElement] for the given library.
   LibraryElement getLibraryElement(FileState library) {
-    return elementFactory.libraryOfUri(library.uriStr);
+    return elementFactory.libraryOfUri2(library.uriStr);
   }
 
   /// Return `true` if the given [uri] is known to be a library.
@@ -132,14 +132,14 @@
         }
       }
 
-      var resolutionKey = cycle.transitiveSignature + '.linked_bundle';
-      var resolutionBytes = byteStore.get(resolutionKey);
+      var resolutionKey = cycle.transitiveSignature! + '.linked_bundle';
+      var resolutionBytes = byteStore.get(resolutionKey) as Uint8List?;
 
       if (resolutionBytes == null) {
         librariesLinkedTimer.start();
 
         testView.linkedCycles.add(
-          cycle.libraries.map((e) => e.path).toSet(),
+          cycle.libraries.map((e) => e.path!).toSet(),
         );
 
         timerInputLibraries.start();
@@ -155,7 +155,7 @@
             var isSynthetic = !file.exists;
             var unit = file.parse();
 
-            String partUriStr;
+            String? partUriStr;
             if (partIndex >= 0) {
               partUriStr = libraryFile.unlinked2.parts[partIndex];
             }
@@ -164,7 +164,7 @@
             inputUnits.add(
               link2.LinkInputUnit(
                 partUriStr,
-                file.source,
+                file.source!,
                 isSynthetic,
                 unit,
               ),
@@ -175,14 +175,15 @@
               var existingLibraryReference =
                   elementFactory.rootReference[libraryFile.uriStr];
               if (existingLibraryReference != null) {
-                var existingElement = existingLibraryReference.element;
+                var existingElement =
+                    existingLibraryReference.element as LibraryElement?;
                 if (existingElement != null) {
                   var buffer = StringBuffer();
 
                   buffer.writeln('[The library is already loaded]');
                   buffer.writeln();
 
-                  var existingSource = existingElement?.source;
+                  var existingSource = existingElement.source;
                   buffer.writeln('[oldUri: ${existingSource.uri}]');
                   buffer.writeln('[oldPath: ${existingSource.fullName}]');
                   buffer.writeln('[newUri: ${libraryFile.uriStr}]');
@@ -284,7 +285,7 @@
       Reference.root(),
     );
     if (externalSummaries != null) {
-      for (var bundle in externalSummaries.bundles) {
+      for (var bundle in externalSummaries!.bundles) {
         elementFactory.addBundle(
           BundleReader(
             elementFactory: elementFactory,
@@ -298,9 +299,9 @@
 
   /// Ensure that type provider is created.
   void _createElementFactoryTypeProvider() {
-    if (analysisContext.typeProviderNonNullableByDefault == null) {
-      var dartCore = elementFactory.libraryOfUri('dart:core');
-      var dartAsync = elementFactory.libraryOfUri('dart:async');
+    if (!analysisContext.hasTypeProvider) {
+      var dartCore = elementFactory.libraryOfUri2('dart:core');
+      var dartAsync = elementFactory.libraryOfUri2('dart:async');
       elementFactory.createTypeProviders(dartCore, dartAsync);
     }
   }
@@ -308,8 +309,7 @@
   /// The [exception] was caught during the [cycle] linking.
   ///
   /// Throw another exception that wraps the given one, with more information.
-  @alwaysThrows
-  void _throwLibraryCycleLinkException(
+  Never _throwLibraryCycleLinkException(
     LibraryCycle cycle,
     Object exception,
     StackTrace stackTrace,
@@ -317,7 +317,7 @@
     var fileContentMap = <String, String>{};
     for (var libraryFile in cycle.libraries) {
       for (var file in libraryFile.libraryFiles) {
-        fileContentMap[file.path] = file.content;
+        fileContentMap[file.path!] = file.content;
       }
     }
     throw CaughtExceptionWithFiles(exception, stackTrace, fileContentMap);
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_graph.dart b/pkg/analyzer/lib/src/dart/analysis/library_graph.dart
index 08cb6aa..f4dcec5 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_graph.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_graph.dart
@@ -36,7 +36,7 @@
   /// transitive signatures of the cycles that the [libraries] reference
   /// directly.  So, indirectly it is based on the transitive closure of all
   /// files that [libraries] reference (but we don't compute these files).
-  String transitiveSignature;
+  String? transitiveSignature;
 
   /// The map from a library in [libraries] to its transitive signature.
   ///
@@ -110,8 +110,8 @@
 
     // Sort libraries to produce stable signatures.
     scc.sort((first, second) {
-      var firstPath = first.file.path;
-      var secondPath = second.file.path;
+      var firstPath = first.file.path!;
+      var secondPath = second.file.path!;
       return firstPath.compareTo(secondPath);
     });
 
@@ -128,7 +128,7 @@
     for (var node in scc) {
       cycle.libraries.add(node.file);
 
-      signature.addLanguageVersion(node.file.packageLanguageVersion);
+      signature.addLanguageVersion(node.file.packageLanguageVersion!);
       signature.addString(node.file.uriStr);
 
       signature.addInt(node.file.libraryFiles.length);
@@ -145,7 +145,7 @@
     for (var node in scc) {
       var librarySignatureBuilder = ApiSignature()
         ..addString(node.file.uriStr)
-        ..addString(cycle.transitiveSignature);
+        ..addString(cycle.transitiveSignature!);
       var librarySignature = librarySignatureBuilder.toHex();
 
       node.file.internal_setLibraryCycle(
@@ -173,7 +173,7 @@
 
       if (cycle.directDependencies.add(referencedCycle)) {
         referencedCycle._directUsers.add(cycle);
-        signature.addString(referencedCycle.transitiveSignature);
+        signature.addString(referencedCycle.transitiveSignature!);
       }
     }
   }
diff --git a/pkg/analyzer/lib/src/dart/analysis/mutex.dart b/pkg/analyzer/lib/src/dart/analysis/mutex.dart
index 938f6a2..e4533c9 100644
--- a/pkg/analyzer/lib/src/dart/analysis/mutex.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/mutex.dart
@@ -18,14 +18,14 @@
 ///       m.release();
 ///     }
 class Mutex {
-  Completer<void> _lock;
+  Completer<void>? _lock;
 
   /// Acquire a lock.
   ///
   /// Returns a [Future] that will be completed when the lock has been acquired.
   Future<void> acquire() async {
     while (_lock != null) {
-      await _lock.future;
+      await _lock!.future;
     }
     _lock = Completer<void>();
   }
@@ -47,7 +47,7 @@
     if (_lock == null) {
       throw StateError('No lock to release.');
     }
-    _lock.complete();
+    _lock!.complete();
     _lock = null;
   }
 }
diff --git a/pkg/analyzer/lib/src/dart/analysis/performance_logger.dart b/pkg/analyzer/lib/src/dart/analysis/performance_logger.dart
index 245f058..0418984 100644
--- a/pkg/analyzer/lib/src/dart/analysis/performance_logger.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/performance_logger.dart
@@ -4,7 +4,7 @@
 
 /// This class is used to gather and print performance information.
 class PerformanceLog {
-  final StringSink sink;
+  final StringSink? sink;
   int _level = 0;
 
   PerformanceLog(this.sink);
@@ -59,7 +59,7 @@
   void writeln(String msg) {
     if (sink != null) {
       String indent = '\t' * _level;
-      sink.writeln('$indent$msg');
+      sink!.writeln('$indent$msg');
     }
   }
 }
diff --git a/pkg/analyzer/lib/src/dart/analysis/referenced_names.dart b/pkg/analyzer/lib/src/dart/analysis/referenced_names.dart
index 7c05adf..2461021 100644
--- a/pkg/analyzer/lib/src/dart/analysis/referenced_names.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/referenced_names.dart
@@ -17,7 +17,7 @@
 Set<String> computeSubtypedNames(CompilationUnit unit) {
   Set<String> subtypedNames = <String>{};
 
-  void _addSubtypedName(TypeName type) {
+  void _addSubtypedName(TypeName? type) {
     if (type != null) {
       Identifier name = type.name;
       if (name is SimpleIdentifier) {
@@ -28,7 +28,7 @@
     }
   }
 
-  void _addSubtypedNames(List<TypeName> types) {
+  void _addSubtypedNames(List<TypeName>? types) {
     types?.forEach(_addSubtypedName);
   }
 
@@ -39,7 +39,7 @@
       _addSubtypedNames(declaration.implementsClause?.interfaces);
     } else if (declaration is ClassTypeAlias) {
       _addSubtypedName(declaration.superclass);
-      _addSubtypedNames(declaration.withClause?.mixinTypes);
+      _addSubtypedNames(declaration.withClause.mixinTypes);
       _addSubtypedNames(declaration.implementsClause?.interfaces);
     } else if (declaration is MixinDeclaration) {
       _addSubtypedNames(declaration.onClause?.superclassConstraints);
@@ -52,8 +52,8 @@
 
 /// Chained set of local names, that hide corresponding external names.
 class _LocalNameScope {
-  final _LocalNameScope enclosing;
-  Set<String> names;
+  final _LocalNameScope? enclosing;
+  Set<String>? names;
 
   _LocalNameScope(this.enclosing);
 
@@ -132,14 +132,13 @@
     return scope;
   }
 
-  void add(SimpleIdentifier identifier) {
+  void add(SimpleIdentifier? identifier) {
     if (identifier != null) {
-      names ??= <String>{};
-      names.add(identifier.name);
+      (names ??= <String>{}).add(identifier.name);
     }
   }
 
-  void addFormalParameters(FormalParameterList parameterList) {
+  void addFormalParameters(FormalParameterList? parameterList) {
     if (parameterList != null) {
       parameterList.parameters
           .map((p) => p is NormalFormalParameter ? p.identifier : null)
@@ -147,7 +146,7 @@
     }
   }
 
-  void addTypeParameters(TypeParameterList typeParameterList) {
+  void addTypeParameters(TypeParameterList? typeParameterList) {
     if (typeParameterList != null) {
       typeParameterList.typeParameters.map((p) => p.name).forEach(add);
     }
@@ -160,11 +159,11 @@
   }
 
   bool contains(String name) {
-    if (names != null && names.contains(name)) {
+    if (names != null && names!.contains(name)) {
       return true;
     }
     if (enclosing != null) {
-      return enclosing.contains(name);
+      return enclosing!.contains(name);
     }
     return false;
   }
@@ -257,8 +256,9 @@
 
   @override
   void visitImportDirective(ImportDirective node) {
-    if (node.prefix != null) {
-      importPrefixNames.add(node.prefix.name);
+    var prefix = node.prefix;
+    if (prefix != null) {
+      importPrefixNames.add(prefix.name);
     }
     super.visitImportDirective(node);
   }
@@ -281,7 +281,7 @@
       return;
     }
     // Ignore class names references from constructors.
-    AstNode parent = node.parent;
+    var parent = node.parent!;
     if (parent is ConstructorDeclaration && parent.returnType == node) {
       return;
     }
@@ -304,7 +304,7 @@
 
   static bool _isNameExpressionLabel(AstNode parent) {
     if (parent is Label) {
-      AstNode parent2 = parent?.parent;
+      var parent2 = parent.parent;
       return parent2 is NamedExpression && parent2.name == parent;
     }
     return false;
diff --git a/pkg/analyzer/lib/src/dart/analysis/results.dart b/pkg/analyzer/lib/src/dart/analysis/results.dart
index d16c22d..f8932cd 100644
--- a/pkg/analyzer/lib/src/dart/analysis/results.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/results.dart
@@ -17,7 +17,7 @@
   final AnalysisSession session;
 
   @override
-  final String path;
+  final String? path;
 
   @override
   final Uri uri;
@@ -33,10 +33,10 @@
   final AstNode node;
 
   @override
-  final ParsedUnitResult parsedUnit;
+  final ParsedUnitResult? parsedUnit;
 
   @override
-  final ResolvedUnitResult resolvedUnit;
+  final ResolvedUnitResult? resolvedUnit;
 
   ElementDeclarationResultImpl(
       this.element, this.node, this.parsedUnit, this.resolvedUnit);
@@ -69,10 +69,10 @@
 class ParsedLibraryResultImpl extends AnalysisResultImpl
     implements ParsedLibraryResult {
   @override
-  final List<ParsedUnitResult> units;
+  final List<ParsedUnitResult>? units;
 
   ParsedLibraryResultImpl(
-      AnalysisSession session, String path, Uri uri, this.units)
+      AnalysisSession session, String? path, Uri uri, this.units)
       : super(session, path, uri);
 
   ParsedLibraryResultImpl.external(AnalysisSession session, Uri uri)
@@ -87,13 +87,20 @@
   }
 
   @override
-  ElementDeclarationResult getElementDeclaration(Element element) {
+  ElementDeclarationResult? getElementDeclaration(Element element) {
     if (state != ResultState.VALID) {
       throw StateError('The result is not valid: $state');
     }
 
-    var elementPath = element.source.fullName;
-    var unitResult = units.firstWhere(
+    if (element is CompilationUnitElement ||
+        element is LibraryElement ||
+        element.isSynthetic ||
+        element.nameOffset == -1) {
+      return null;
+    }
+
+    var elementPath = element.source!.fullName;
+    var unitResult = units!.firstWhere(
       (r) => r.path == elementPath,
       orElse: () {
         var elementStr = element.getDisplayString(withNullability: true);
@@ -102,14 +109,14 @@
       },
     );
 
-    if (element.isSynthetic || element.nameOffset == -1) {
-      return null;
-    }
-
     var locator = _DeclarationByElementLocator(element);
     unitResult.unit.accept(locator);
     var declaration = locator.result;
 
+    if (declaration == null) {
+      return null;
+    }
+
     return ElementDeclarationResultImpl(element, declaration, unitResult, null);
   }
 }
@@ -145,19 +152,19 @@
   ParseStringResultImpl(this.content, this.unit, this.errors);
 
   @override
-  LineInfo get lineInfo => unit.lineInfo;
+  LineInfo get lineInfo => unit.lineInfo!;
 }
 
 class ResolvedLibraryResultImpl extends AnalysisResultImpl
     implements ResolvedLibraryResult {
   @override
-  final LibraryElement element;
+  final LibraryElement? element;
 
   @override
-  final List<ResolvedUnitResult> units;
+  final List<ResolvedUnitResult>? units;
 
   ResolvedLibraryResultImpl(
-      AnalysisSession session, String path, Uri uri, this.element, this.units)
+      AnalysisSession session, String? path, Uri uri, this.element, this.units)
       : super(session, path, uri);
 
   ResolvedLibraryResultImpl.external(AnalysisSession session, Uri uri)
@@ -172,16 +179,23 @@
   }
 
   @override
-  TypeProvider get typeProvider => element.typeProvider;
+  TypeProvider get typeProvider => element!.typeProvider;
 
   @override
-  ElementDeclarationResult getElementDeclaration(Element element) {
+  ElementDeclarationResult? getElementDeclaration(Element element) {
     if (state != ResultState.VALID) {
       throw StateError('The result is not valid: $state');
     }
 
-    var elementPath = element.source.fullName;
-    var unitResult = units.firstWhere(
+    if (element is CompilationUnitElement ||
+        element is LibraryElement ||
+        element.isSynthetic ||
+        element.nameOffset == -1) {
+      return null;
+    }
+
+    var elementPath = element.source!.fullName;
+    var unitResult = units!.firstWhere(
       (r) => r.path == elementPath,
       orElse: () {
         var elementStr = element.getDisplayString(withNullability: true);
@@ -190,14 +204,19 @@
       },
     );
 
-    if (element.isSynthetic || element.nameOffset == -1) {
-      return null;
+    var unit = unitResult.unit;
+    if (unit == null) {
+      throw StateError('The result has no unit');
     }
 
     var locator = _DeclarationByElementLocator(element);
-    unitResult.unit.accept(locator);
+    unit.accept(locator);
     var declaration = locator.result;
 
+    if (declaration == null) {
+      return null;
+    }
+
     return ElementDeclarationResultImpl(element, declaration, null, unitResult);
   }
 }
@@ -208,10 +227,10 @@
   final bool exists;
 
   @override
-  final String content;
+  final String? content;
 
   @override
-  final CompilationUnit unit;
+  final CompilationUnit? unit;
 
   @override
   final List<AnalysisError> errors;
@@ -229,7 +248,13 @@
       : super(session, path, uri, lineInfo, isPart);
 
   @override
-  LibraryElement get libraryElement => unit.declaredElement.library;
+  LibraryElement get libraryElement {
+    var unit = this.unit;
+    if (unit == null) {
+      throw StateError('The result has no unit');
+    }
+    return unit.declaredElement!.library;
+  }
 
   @override
   ResultState get state => exists ? ResultState.VALID : ResultState.NOT_A_FILE;
@@ -238,7 +263,7 @@
   TypeProvider get typeProvider => libraryElement.typeProvider;
 
   @override
-  TypeSystemImpl get typeSystem => libraryElement.typeSystem;
+  TypeSystemImpl get typeSystem => libraryElement.typeSystem as TypeSystemImpl;
 }
 
 class UnitElementResultImpl extends AnalysisResultImpl
@@ -259,7 +284,7 @@
 
 class _DeclarationByElementLocator extends GeneralizingAstVisitor<void> {
   final Element element;
-  AstNode result;
+  AstNode? result;
 
   _DeclarationByElementLocator(this.element);
 
@@ -344,7 +369,7 @@
     super.visitNode(node);
   }
 
-  bool _hasOffset(AstNode node) {
+  bool _hasOffset(AstNode? node) {
     return node?.offset == element.nameOffset;
   }
 }
diff --git a/pkg/analyzer/lib/src/dart/analysis/search.dart b/pkg/analyzer/lib/src/dart/analysis/search.dart
index ba8695d..fa87c88 100644
--- a/pkg/analyzer/lib/src/dart/analysis/search.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/search.dart
@@ -19,9 +19,12 @@
 Element _getEnclosingElement(CompilationUnitElement unitElement, int offset) {
   var finder = _ContainingElementFinder(offset);
   unitElement.accept(finder);
-  Element element = finder.containingElement;
-  assert(element != null,
-      'No containing element in ${unitElement.source.fullName} at $offset');
+  var element = finder.containingElement;
+  if (element == null) {
+    throw StateError(
+      'No containing element in ${unitElement.source.fullName} at $offset',
+    );
+  }
   return element;
 }
 
@@ -51,7 +54,7 @@
     List<String> files = await _driver.getFilesDefiningClassMemberName(name);
     for (String file in files) {
       if (searchedFiles.add(file, this)) {
-        UnitElementResult unitResult = await _driver.getUnitElement(file);
+        var unitResult = await _driver.getUnitElement(file);
         if (unitResult != null) {
           unitResult.element.types.forEach(addElements);
           unitResult.element.mixins.forEach(addElements);
@@ -63,7 +66,7 @@
 
   /// Returns references to the [element].
   Future<List<SearchResult>> references(
-      Element element, SearchedFiles searchedFiles) async {
+      Element? element, SearchedFiles searchedFiles) async {
     if (element == null) {
       return const <SearchResult>[];
     }
@@ -75,12 +78,11 @@
         element is PropertyAccessorElement && element.isSetter ||
         element is TypeAliasElement) {
       return _searchReferences(element, searchedFiles);
-    } else if (kind == ElementKind.COMPILATION_UNIT) {
+    } else if (element is CompilationUnitElement) {
       return _searchReferences_CompilationUnit(element);
-    } else if (kind == ElementKind.GETTER) {
+    } else if (element is PropertyAccessorElement && element.isGetter) {
       return _searchReferences_Getter(element, searchedFiles);
-    } else if (kind == ElementKind.FIELD ||
-        kind == ElementKind.TOP_LEVEL_VARIABLE) {
+    } else if (element is PropertyInducingElement) {
       return _searchReferences_Field(element, searchedFiles);
     } else if (kind == ElementKind.FUNCTION || kind == ElementKind.METHOD) {
       if (element.enclosingElement is ExecutableElement) {
@@ -88,18 +90,18 @@
             element, (n) => n is Block, searchedFiles);
       }
       return _searchReferences_Function(element, searchedFiles);
-    } else if (kind == ElementKind.IMPORT) {
+    } else if (element is ImportElement) {
       return _searchReferences_Import(element, searchedFiles);
     } else if (kind == ElementKind.LABEL ||
         kind == ElementKind.LOCAL_VARIABLE) {
       return _searchReferences_Local(element, (n) => n is Block, searchedFiles);
-    } else if (kind == ElementKind.LIBRARY) {
+    } else if (element is LibraryElement) {
       return _searchReferences_Library(element, searchedFiles);
-    } else if (kind == ElementKind.PARAMETER) {
+    } else if (element is ParameterElement) {
       return _searchReferences_Parameter(element, searchedFiles);
-    } else if (kind == ElementKind.PREFIX) {
+    } else if (element is PrefixElement) {
       return _searchReferences_Prefix(element, searchedFiles);
-    } else if (kind == ElementKind.TYPE_PARAMETER) {
+    } else if (element is TypeParameterElement) {
       return _searchReferences_Local(
           element, (n) => n.parent is CompilationUnit, searchedFiles);
     }
@@ -112,7 +114,7 @@
   /// [Search] object, so should be only searched by it to avoid duplicate
   /// results; and updated to take ownership if the file is not owned yet.
   Future<List<SearchResult>> subTypes(
-      ClassElement type, SearchedFiles searchedFiles) async {
+      ClassElement? type, SearchedFiles searchedFiles) async {
     if (type == null) {
       return const <SearchResult>[];
     }
@@ -127,14 +129,14 @@
 
   /// Return direct [SubtypeResult]s for either the [type] or [subtype].
   Future<List<SubtypeResult>> subtypes(SearchedFiles searchedFiles,
-      {ClassElement type, SubtypeResult subtype}) async {
+      {ClassElement? type, SubtypeResult? subtype}) async {
     String name;
     String id;
     if (type != null) {
       name = type.name;
       id = '${type.librarySource.uri};${type.source.uri};$name';
     } else {
-      name = subtype.name;
+      name = subtype!.name;
       id = subtype.id;
     }
 
@@ -147,8 +149,8 @@
 
     if (files != null) {
       for (FileState file in files) {
-        if (searchedFiles.add(file.path, this)) {
-          AnalysisDriverUnitIndex index = await _driver.getIndex(file.path);
+        if (searchedFiles.add(file.path!, this)) {
+          var index = await _driver.getIndex(file.path!);
           if (index != null) {
             var request = _IndexRequest(index);
             request.addSubtypes(id, results, file);
@@ -172,7 +174,7 @@
 
     List<FileState> knownFiles = _driver.fsState.knownFiles.toList();
     for (FileState file in knownFiles) {
-      UnitElementResult unitResult = await _driver.getUnitElement(file.path);
+      var unitResult = await _driver.getUnitElement(file.path!);
       if (unitResult != null) {
         CompilationUnitElement unitElement = unitResult.element;
         unitElement.accessors.forEach(addElement);
@@ -190,7 +192,7 @@
 
   /// Returns unresolved references to the given [name].
   Future<List<SearchResult>> unresolvedMemberReferences(
-      String name, SearchedFiles searchedFiles) async {
+      String? name, SearchedFiles searchedFiles) async {
     if (name == null) {
       return const <SearchResult>[];
     }
@@ -202,7 +204,7 @@
     List<SearchResult> results = [];
     for (String file in files) {
       if (searchedFiles.add(file, this)) {
-        AnalysisDriverUnitIndex index = await _driver.getIndex(file);
+        var index = await _driver.getIndex(file);
         if (index != null) {
           _IndexRequest request = _IndexRequest(index);
           var fileResults = await request.getUnresolvedMemberReferences(
@@ -236,14 +238,14 @@
 
     // Prepare the list of files that reference the element name.
     List<String> files = <String>[];
-    String path = element.source.fullName;
+    String path = element.source!.fullName;
     if (name.startsWith('_')) {
-      String libraryPath = element.library.source.fullName;
+      String libraryPath = element.library!.source.fullName;
       if (searchedFiles.add(libraryPath, this)) {
         FileState library = _driver.fsState.getFileForPath(libraryPath);
         for (FileState file in library.libraryFiles) {
           if (file.path == path || file.referencedNames.contains(name)) {
-            files.add(file.path);
+            files.add(file.path!);
           }
         }
       }
@@ -268,7 +270,7 @@
       Element element,
       Map<IndexRelationKind, SearchResultKind> relationToResultKind,
       String file) async {
-    AnalysisDriverUnitIndex index = await _driver.getIndex(file);
+    var index = await _driver.getIndex(file);
     if (index != null) {
       _IndexRequest request = _IndexRequest(index);
       int elementId = request.findElementId(element);
@@ -280,8 +282,8 @@
     }
   }
 
-  Future<CompilationUnitElement> _getUnitElement(String file) async {
-    UnitElementResult result = await _driver.getUnitElement(file);
+  Future<CompilationUnitElement?> _getUnitElement(String file) async {
+    var result = await _driver.getUnitElement(file);
     return result?.element;
   }
 
@@ -314,7 +316,7 @@
               const {
                 IndexRelationKind.IS_REFERENCED_BY: SearchResultKind.REFERENCE
               },
-              file.path);
+              file.path!);
         }
       }
     }
@@ -324,8 +326,8 @@
   Future<List<SearchResult>> _searchReferences_Field(
       PropertyInducingElement field, SearchedFiles searchedFiles) async {
     List<SearchResult> results = <SearchResult>[];
-    PropertyAccessorElement getter = field.getter;
-    PropertyAccessorElement setter = field.setter;
+    PropertyAccessorElement? getter = field.getter;
+    PropertyAccessorElement? setter = field.setter;
     if (!field.isSynthetic) {
       await _addResults(results, field, searchedFiles, const {
         IndexRelationKind.IS_WRITTEN_BY: SearchResultKind.WRITE,
@@ -348,7 +350,7 @@
   Future<List<SearchResult>> _searchReferences_Function(
       Element element, SearchedFiles searchedFiles) async {
     List<SearchResult> results = <SearchResult>[];
-    await _addResults(results, element.declaration, searchedFiles, const {
+    await _addResults(results, element.declaration!, searchedFiles, const {
       IndexRelationKind.IS_REFERENCED_BY: SearchResultKind.REFERENCE,
       IndexRelationKind.IS_INVOKED_BY: SearchResultKind.INVOCATION
     });
@@ -376,10 +378,10 @@
     LibraryElement libraryElement = element.library;
     for (CompilationUnitElement unitElement in libraryElement.units) {
       String unitPath = unitElement.source.fullName;
-      ResolvedUnitResult unitResult = await _driver.getResult(unitPath);
+      ResolvedUnitResult unitResult = (await _driver.getResult(unitPath))!;
       _ImportElementReferencesVisitor visitor =
           _ImportElementReferencesVisitor(element, unitElement);
-      unitResult.unit.accept(visitor);
+      unitResult.unit!.accept(visitor);
       results.addAll(visitor.results);
     }
     return results;
@@ -395,15 +397,15 @@
     List<SearchResult> results = <SearchResult>[];
     for (CompilationUnitElement unitElement in element.units) {
       String unitPath = unitElement.source.fullName;
-      ResolvedUnitResult unitResult = await _driver.getResult(unitPath);
-      CompilationUnit unit = unitResult.unit;
+      ResolvedUnitResult unitResult = (await _driver.getResult(unitPath))!;
+      CompilationUnit unit = unitResult.unit!;
       for (Directive directive in unit.directives) {
         if (directive is PartOfDirective && directive.element == element) {
           results.add(SearchResult._(
-              unit.declaredElement,
+              unit.declaredElement!,
               SearchResultKind.REFERENCE,
-              directive.libraryName.offset,
-              directive.libraryName.length,
+              directive.libraryName!.offset,
+              directive.libraryName!.length,
               true,
               false));
         }
@@ -414,33 +416,33 @@
 
   Future<List<SearchResult>> _searchReferences_Local(Element element,
       bool Function(AstNode n) isRootNode, SearchedFiles searchedFiles) async {
-    String path = element.source.fullName;
+    String path = element.source!.fullName;
     if (!searchedFiles.add(path, this)) {
       return const <SearchResult>[];
     }
 
     // Prepare the unit.
-    ResolvedUnitResult unitResult = await _driver.getResult(path);
-    CompilationUnit unit = unitResult.unit;
+    ResolvedUnitResult unitResult = (await _driver.getResult(path))!;
+    var unit = unitResult.unit;
     if (unit == null) {
       return const <SearchResult>[];
     }
 
     // Prepare the node.
-    AstNode node = NodeLocator(element.nameOffset).searchWithin(unit);
+    var node = NodeLocator(element.nameOffset).searchWithin(unit);
     if (node == null) {
       return const <SearchResult>[];
     }
 
     // Prepare the enclosing node.
-    AstNode enclosingNode = node.thisOrAncestorMatching(isRootNode);
+    var enclosingNode = node.thisOrAncestorMatching(isRootNode);
     if (enclosingNode == null) {
       return const <SearchResult>[];
     }
 
     // Find the matches.
     _LocalReferencesVisitor visitor =
-        _LocalReferencesVisitor(element, unit.declaredElement);
+        _LocalReferencesVisitor(element, unit.declaredElement!);
     enclosingNode.accept(visitor);
     return visitor.results;
   }
@@ -451,7 +453,7 @@
     results.addAll(await _searchReferences_Local(
       parameter,
       (AstNode node) {
-        AstNode parent = node.parent;
+        var parent = node.parent;
         return parent is ClassDeclaration || parent is CompilationUnit;
       },
       searchedFiles,
@@ -473,10 +475,10 @@
     LibraryElement libraryElement = element.library;
     for (CompilationUnitElement unitElement in libraryElement.units) {
       String unitPath = unitElement.source.fullName;
-      ResolvedUnitResult unitResult = await _driver.getResult(unitPath);
+      ResolvedUnitResult unitResult = (await _driver.getResult(unitPath))!;
       _LocalReferencesVisitor visitor =
           _LocalReferencesVisitor(element, unitElement);
-      unitResult.unit.accept(visitor);
+      unitResult.unit!.accept(visitor);
       results.addAll(visitor.results);
     }
     return results;
@@ -501,7 +503,7 @@
   }
 
   void ownAnalyzed(Search search) {
-    var contextRoot = search._driver.analysisContext.contextRoot;
+    var contextRoot = search._driver.analysisContext!.contextRoot;
     for (var path in contextRoot.analyzedFiles()) {
       if (path.endsWith('.dart')) {
         add(path, search);
@@ -531,8 +533,7 @@
   final bool isQualified;
 
   SearchResult._(this.enclosingElement, this.kind, this.offset, this.length,
-      this.isResolved, this.isQualified)
-      : assert(enclosingElement != null);
+      this.isResolved, this.isQualified);
 
   @override
   String toString() {
@@ -580,7 +581,7 @@
 /// A visitor that finds the deep-most [Element] that contains the [offset].
 class _ContainingElementFinder extends GeneralizingElementVisitor<void> {
   final int offset;
-  Element containingElement;
+  Element? containingElement;
 
   _ContainingElementFinder(this.offset);
 
@@ -588,8 +589,8 @@
   void visitElement(Element element) {
     if (element is ElementImpl) {
       if (element.codeOffset != null &&
-          element.codeOffset <= offset &&
-          offset <= element.codeOffset + element.codeLength) {
+          element.codeOffset! <= offset &&
+          offset <= element.codeOffset! + element.codeLength!) {
         containingElement = element;
         super.visitElement(element);
       }
@@ -604,7 +605,7 @@
   final ImportElement importElement;
   final CompilationUnitElement enclosingUnitElement;
 
-  Set<Element> importedElements;
+  late final Set<Element> importedElements;
 
   _ImportElementReferencesVisitor(
       ImportElement element, this.enclosingUnitElement)
@@ -625,7 +626,7 @@
     }
     if (importElement.prefix != null) {
       if (node.staticElement == importElement.prefix) {
-        AstNode parent = node.parent;
+        var parent = node.parent;
         if (parent is PrefixedIdentifier && parent.prefix == node) {
           var element = parent.writeOrReadElement?.declaration;
           if (importedElements.contains(element)) {
@@ -745,7 +746,8 @@
   Future<List<SearchResult>> getRelations(
       int elementId,
       Map<IndexRelationKind, SearchResultKind> relationToResultKind,
-      Future<CompilationUnitElement> Function() getEnclosingUnitElement) async {
+      Future<CompilationUnitElement?> Function()
+          getEnclosingUnitElement) async {
     // Find the first usage of the element.
     int i = _findFirstOccurrence(index.usedElements, elementId);
     if (i == -1) {
@@ -753,12 +755,12 @@
     }
     // Create locations for every usage of the element.
     List<SearchResult> results = <SearchResult>[];
-    CompilationUnitElement enclosingUnitElement;
+    CompilationUnitElement? enclosingUnitElement;
     for (;
         i < index.usedElements.length && index.usedElements[i] == elementId;
         i++) {
       IndexRelationKind relationKind = index.usedElementKinds[i];
-      SearchResultKind resultKind = relationToResultKind[relationKind];
+      SearchResultKind? resultKind = relationToResultKind[relationKind];
       if (resultKind != null) {
         int offset = index.usedElementOffsets[i];
         enclosingUnitElement ??= await getEnclosingUnitElement();
@@ -780,7 +782,7 @@
 
   /// Return the identifier of [str] in the [index] or `-1` if [str] is not
   /// used in the [index].
-  int getStringId(String str) {
+  int getStringId(String? str) {
     if (str == null) {
       return index.nullStringId;
     }
@@ -814,7 +816,8 @@
   Future<List<SearchResult>> getUnresolvedMemberReferences(
       String name,
       Map<IndexRelationKind, SearchResultKind> relationToResultKind,
-      Future<CompilationUnitElement> Function() getEnclosingUnitElement) async {
+      Future<CompilationUnitElement?> Function()
+          getEnclosingUnitElement) async {
     // Find the name identifier.
     int nameId = getStringId(name);
     if (nameId == -1) {
@@ -829,10 +832,10 @@
 
     // Create results for every usage of the name.
     List<SearchResult> results = <SearchResult>[];
-    CompilationUnitElement enclosingUnitElement;
+    CompilationUnitElement? enclosingUnitElement;
     for (; i < index.usedNames.length && index.usedNames[i] == nameId; i++) {
       IndexRelationKind relationKind = index.usedNameKinds[i];
-      SearchResultKind resultKind = relationToResultKind[relationKind];
+      SearchResultKind? resultKind = relationToResultKind[relationKind];
       if (resultKind != null) {
         int offset = index.usedNameOffsets[i];
         enclosingUnitElement ??= await getEnclosingUnitElement();
@@ -888,7 +891,7 @@
       return;
     }
     if (node.staticElement == element) {
-      AstNode parent = node.parent;
+      var parent = node.parent;
       SearchResultKind kind = SearchResultKind.REFERENCE;
       if (element is FunctionElement) {
         if (parent is MethodInvocation && parent.methodName == node) {
diff --git a/pkg/analyzer/lib/src/dart/analysis/session.dart b/pkg/analyzer/lib/src/dart/analysis/session.dart
index 4bfedf3..7754ffa 100644
--- a/pkg/analyzer/lib/src/dart/analysis/session.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/session.dart
@@ -8,16 +8,15 @@
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/analysis/uri_converter.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart' as driver;
 import 'package:analyzer/src/dart/analysis/uri_converter.dart';
 import 'package:analyzer/src/dart/element/class_hierarchy.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
+import 'package:analyzer/src/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl;
 import 'package:analyzer/src/generated/source.dart';
-import 'package:meta/meta.dart';
 
 /// A concrete implementation of an analysis session.
 class AnalysisSessionImpl implements AnalysisSession {
@@ -25,7 +24,7 @@
   final driver.AnalysisDriver _driver;
 
   /// The URI converter used to convert between URI's and file paths.
-  UriConverter _uriConverter;
+  UriConverter? _uriConverter;
 
   /// The cache of libraries for URIs.
   final Map<String, LibraryElement> _uriToLibraryCache = {};
@@ -37,7 +36,7 @@
   AnalysisSessionImpl(this._driver);
 
   @override
-  AnalysisContext get analysisContext => _driver?.analysisContext;
+  AnalysisContext get analysisContext => _driver.analysisContext!;
 
   @override
   DeclaredVariables get declaredVariables => _driver.declaredVariables;
@@ -60,7 +59,7 @@
   driver.AnalysisDriver getDriver() => _driver;
 
   @override
-  Future<ErrorsResult> getErrors(String path) {
+  Future<ErrorsResult?> getErrors(String path) {
     _checkConsistency();
     return _driver.getErrors(path);
   }
@@ -116,19 +115,19 @@
   }
 
   @override
-  Future<ResolvedUnitResult> getResolvedUnit(String path) {
+  Future<ResolvedUnitResult?> getResolvedUnit(String path) {
     _checkConsistency();
     return _driver.getResult(path);
   }
 
   @override
-  Future<SourceKind> getSourceKind(String path) {
+  Future<SourceKind?> getSourceKind(String path) {
     _checkConsistency();
     return _driver.getSourceKind(path);
   }
 
   @override
-  Future<UnitElementResult> getUnitElement(String path) {
+  Future<UnitElementResult?> getUnitElement(String path) {
     _checkConsistency();
     return _driver.getUnitElement(path);
   }
@@ -164,11 +163,11 @@
 
   final DeclaredVariables declaredVariables;
 
-  TypeProvider _typeProviderLegacy;
-  TypeProvider _typeProviderNonNullableByDefault;
+  TypeProviderImpl? _typeProviderLegacy;
+  TypeProviderImpl? _typeProviderNonNullableByDefault;
 
-  TypeSystemImpl _typeSystemLegacy;
-  TypeSystemImpl _typeSystemNonNullableByDefault;
+  TypeSystemImpl? _typeSystemLegacy;
+  TypeSystemImpl? _typeSystemNonNullableByDefault;
 
   SynchronousSession(this._analysisOptions, this.declaredVariables);
 
@@ -188,20 +187,22 @@
     );
   }
 
-  TypeProvider get typeProviderLegacy {
-    return _typeProviderLegacy;
+  bool get hasTypeProvider => _typeProviderNonNullableByDefault != null;
+
+  TypeProviderImpl get typeProviderLegacy {
+    return _typeProviderLegacy!;
   }
 
-  TypeProvider get typeProviderNonNullableByDefault {
-    return _typeProviderNonNullableByDefault;
+  TypeProviderImpl get typeProviderNonNullableByDefault {
+    return _typeProviderNonNullableByDefault!;
   }
 
   TypeSystemImpl get typeSystemLegacy {
-    return _typeSystemLegacy;
+    return _typeSystemLegacy!;
   }
 
   TypeSystemImpl get typeSystemNonNullableByDefault {
-    return _typeSystemNonNullableByDefault;
+    return _typeSystemNonNullableByDefault!;
   }
 
   void clearTypeProvider() {
@@ -213,8 +214,8 @@
   }
 
   void setTypeProviders({
-    @required TypeProvider legacy,
-    @required TypeProvider nonNullableByDefault,
+    required TypeProviderImpl legacy,
+    required TypeProviderImpl nonNullableByDefault,
   }) {
     if (_typeProviderLegacy != null ||
         _typeProviderNonNullableByDefault != null) {
@@ -228,14 +229,14 @@
       implicitCasts: _analysisOptions.implicitCasts,
       isNonNullableByDefault: false,
       strictInference: _analysisOptions.strictInference,
-      typeProvider: _typeProviderLegacy,
+      typeProvider: legacy,
     );
 
     _typeSystemNonNullableByDefault = TypeSystemImpl(
       implicitCasts: _analysisOptions.implicitCasts,
       isNonNullableByDefault: true,
       strictInference: _analysisOptions.strictInference,
-      typeProvider: _typeProviderNonNullableByDefault,
+      typeProvider: nonNullableByDefault,
     );
   }
 }
diff --git a/pkg/analyzer/lib/src/dart/analysis/session_helper.dart b/pkg/analyzer/lib/src/dart/analysis/session_helper.dart
index a7d78a6..235e67d 100644
--- a/pkg/analyzer/lib/src/dart/analysis/session_helper.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/session_helper.dart
@@ -21,7 +21,7 @@
   /// Return the [ClassElement] with the given [className] that is exported
   /// from the library with the given [libraryUri], or `null` if the library
   /// does not export a class with such name.
-  Future<ClassElement> getClass(String libraryUri, String className) async {
+  Future<ClassElement?> getClass(String libraryUri, String className) async {
     var libraryElement = await session.getLibraryByUri(libraryUri);
     var element = libraryElement.exportNamespace.get(className);
     if (element is ClassElement) {
@@ -33,9 +33,9 @@
 
   /// Return the declaration of the [element], or `null` is the [element]
   /// is synthetic, or is declared in a file that is not a part of a library.
-  Future<ElementDeclarationResult> getElementDeclaration(
+  Future<ElementDeclarationResult?> getElementDeclaration(
       Element element) async {
-    var libraryPath = element.library.source.fullName;
+    var libraryPath = element.library!.source.fullName;
 
     // This should not happen in valid code, but sometimes we treat a file
     // with a `part of` directive as a library, because there is no library
@@ -49,12 +49,12 @@
   }
 
   /// Return the resolved unit that declares the given [element].
-  Future<ResolvedUnitResult> getResolvedUnitByElement(Element element) async {
-    var libraryPath = element.library.source.fullName;
+  Future<ResolvedUnitResult?> getResolvedUnitByElement(Element element) async {
+    var libraryPath = element.library!.source.fullName;
     var resolvedLibrary = await _getResolvedLibrary(libraryPath);
 
-    var unitPath = element.source.fullName;
-    return resolvedLibrary.units.singleWhere((resolvedUnit) {
+    var unitPath = element.source!.fullName;
+    return resolvedLibrary.units!.singleWhere((resolvedUnit) {
       return resolvedUnit.path == unitPath;
     });
   }
@@ -62,7 +62,7 @@
   /// Return the [PropertyAccessorElement] with the given [name] that is
   /// exported from the library with the given [uri], or `null` if the
   /// library does not export a top-level accessor with such name.
-  Future<PropertyAccessorElement> getTopLevelPropertyAccessor(
+  Future<PropertyAccessorElement?> getTopLevelPropertyAccessor(
       String uri, String name) async {
     var libraryElement = await session.getLibraryByUri(uri);
     var element = libraryElement.exportNamespace.get(name);
diff --git a/pkg/analyzer/lib/src/dart/analysis/status.dart b/pkg/analyzer/lib/src/dart/analysis/status.dart
index af6c6b8..5c15c9e 100644
--- a/pkg/analyzer/lib/src/dart/analysis/status.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/status.dart
@@ -56,7 +56,7 @@
 
   /// If non-null, a completer which should be completed on the next transition
   /// to idle.
-  Completer<void> _idleCompleter;
+  Completer<void>? _idleCompleter;
 
   /// Return the last status sent to the [stream].
   AnalysisStatus get currentStatus => _currentStatus;
diff --git a/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart b/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart
index 6968796..7f59be6 100644
--- a/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart
@@ -55,12 +55,14 @@
     addToken(node.rightBracket);
   }
 
-  void addFunctionBodyModifiers(FunctionBody node) {
-    signature.addBool(node.isSynchronous);
-    signature.addBool(node.isGenerator);
+  void addFunctionBodyModifiers(FunctionBody? node) {
+    if (node != null) {
+      signature.addBool(node.isSynchronous);
+      signature.addBool(node.isGenerator);
+    }
   }
 
-  void addNode(AstNode node) {
+  void addNode(AstNode? node) {
     if (node != null) {
       addTokens(node.beginToken, node.endToken);
     }
@@ -79,10 +81,10 @@
   /// Appends tokens from [begin] (including), to [end] (also including).
   void addTokens(Token begin, Token end) {
     if (begin is CommentToken) {
-      begin = (begin as CommentToken).parent;
+      begin = begin.parent!;
     }
 
-    Token token = begin;
+    Token? token = begin;
     while (token != null) {
       addToken(token);
 
@@ -111,13 +113,13 @@
         includeInitializers) {
       addTokens(node.beginToken, node.endToken);
     } else {
-      addTokens(node.beginToken, variableList.type.endToken);
+      addTokens(node.beginToken, variableList.type!.endToken);
 
       signature.addInt(variableList.variables.length);
       for (var variable in variableList.variables) {
         addTokens(variable.beginToken, variable.name.endToken);
         signature.addBool(variable.initializer != null);
-        addToken(variable.endToken.next); // `,` or `;`
+        addToken(variable.endToken.next!); // `,` or `;`
       }
     }
   }
diff --git a/pkg/analyzer/lib/src/dart/analysis/uri_converter.dart b/pkg/analyzer/lib/src/dart/analysis/uri_converter.dart
index da5f7e4..6a13f86 100644
--- a/pkg/analyzer/lib/src/dart/analysis/uri_converter.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/uri_converter.dart
@@ -18,11 +18,11 @@
   DriverBasedUriConverter(this.driver);
 
   @override
-  Uri pathToUri(String path, {String containingPath}) {
+  Uri? pathToUri(String path, {String? containingPath}) {
     ResourceProvider provider = driver.resourceProvider;
     if (containingPath != null) {
       Context context = provider.pathContext;
-      String root = driver.contextRoot.root;
+      String root = driver.contextRoot!.root;
       if (context.isWithin(root, path) &&
           context.isWithin(root, containingPath)) {
         String relativePath =
@@ -37,5 +37,5 @@
   }
 
   @override
-  String uriToPath(Uri uri) => driver.sourceFactory.forUri2(uri)?.fullName;
+  String? uriToPath(Uri uri) => driver.sourceFactory.forUri2(uri)?.fullName;
 }
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 59fd5c6..807f627 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -12,12 +12,9 @@
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/src/dart/ast/to_source_visitor.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/fasta/token_utils.dart' as util show findPrevious;
-import 'package:analyzer/src/generated/engine.dart' show AnalysisEngine;
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/source.dart' show LineInfo, Source;
 import 'package:analyzer/src/generated/utilities_dart.dart';
@@ -34,7 +31,7 @@
 ///        [StringLiteral] [StringLiteral]+
 class AdjacentStringsImpl extends StringLiteralImpl implements AdjacentStrings {
   /// The strings that are implicitly concatenated.
-  NodeList<StringLiteral> _strings;
+  late final NodeList<StringLiteral> _strings;
 
   /// Initialize a newly created list of adjacent strings. To be syntactically
   /// valid, the list of [strings] must contain at least two elements.
@@ -43,20 +40,20 @@
   }
 
   @override
-  Token get beginToken => _strings.beginToken;
+  Token get beginToken => _strings.beginToken!;
 
   @override
   Iterable<SyntacticEntity> get childEntities =>
       ChildEntities()..addAll(_strings);
 
   @override
-  Token get endToken => _strings.endToken;
+  Token get endToken => _strings.endToken!;
 
   @override
   NodeList<StringLiteral> get strings => _strings;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitAdjacentStrings(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitAdjacentStrings(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -67,7 +64,7 @@
   void _appendStringValue(StringBuffer buffer) {
     int length = strings.length;
     for (int i = 0; i < length; i++) {
-      StringLiteralImpl stringLiteral = strings[i];
+      var stringLiteral = strings[i] as StringLiteralImpl;
       stringLiteral._appendStringValue(buffer);
     }
   }
@@ -78,15 +75,15 @@
 abstract class AnnotatedNodeImpl extends AstNodeImpl implements AnnotatedNode {
   /// The documentation comment associated with this node, or `null` if this
   /// node does not have a documentation comment associated with it.
-  CommentImpl _comment;
+  CommentImpl? _comment;
 
   /// The annotations associated with this node.
-  NodeList<Annotation> _metadata;
+  late final NodeList<Annotation> _metadata;
 
   /// Initialize a newly created annotated node. Either or both of the [comment]
   /// and [metadata] can be `null` if the node does not have the corresponding
   /// attribute.
-  AnnotatedNodeImpl(CommentImpl comment, List<Annotation> metadata) {
+  AnnotatedNodeImpl(CommentImpl? comment, List<Annotation>? metadata) {
     _comment = _becomeParentOf(comment);
     _metadata = NodeListImpl<Annotation>(this, metadata);
   }
@@ -97,12 +94,12 @@
       if (_metadata.isEmpty) {
         return firstTokenAfterCommentAndMetadata;
       }
-      return _metadata.beginToken;
+      return _metadata.beginToken!;
     } else if (_metadata.isEmpty) {
-      return _comment.beginToken;
+      return _comment!.beginToken;
     }
-    Token commentToken = _comment.beginToken;
-    Token metadataToken = _metadata.beginToken;
+    Token commentToken = _comment!.beginToken;
+    Token metadataToken = _metadata.beginToken!;
     if (commentToken.offset < metadataToken.offset) {
       return commentToken;
     }
@@ -110,11 +107,11 @@
   }
 
   @override
-  Comment get documentationComment => _comment;
+  Comment? get documentationComment => _comment;
 
   @override
-  set documentationComment(Comment comment) {
-    _comment = _becomeParentOf(comment as CommentImpl);
+  set documentationComment(Comment? comment) {
+    _comment = _becomeParentOf(comment as CommentImpl?);
   }
 
   @override
@@ -123,7 +120,7 @@
   @override
   List<AstNode> get sortedCommentAndAnnotations {
     return <AstNode>[]
-      ..add(_comment)
+      ..add(_comment!)
       ..addAll(_metadata)
       ..sort(AstNode.LEXICAL_ORDER);
   }
@@ -163,7 +160,7 @@
       return true;
     }
     Annotation firstAnnotation = _metadata[0];
-    return _comment.offset < firstAnnotation.offset;
+    return _comment!.offset < firstAnnotation.offset;
   }
 }
 
@@ -181,47 +178,47 @@
 
   /// The name of the class defining the constructor that is being invoked or
   /// the name of the field that is being referenced.
-  IdentifierImpl _name;
+  late IdentifierImpl _name;
 
   /// The period before the constructor name, or `null` if this annotation is
   /// not the invocation of a named constructor.
   @override
-  Token period;
+  Token? period;
 
   /// The name of the constructor being invoked, or `null` if this annotation is
   /// not the invocation of a named constructor.
-  SimpleIdentifierImpl _constructorName;
+  SimpleIdentifierImpl? _constructorName;
 
   /// The arguments to the constructor being invoked, or `null` if this
   /// annotation is not the invocation of a constructor.
-  ArgumentListImpl _arguments;
+  ArgumentListImpl? _arguments;
 
   /// The element associated with this annotation, or `null` if the AST
   /// structure has not been resolved or if this annotation could not be
   /// resolved.
-  Element _element;
+  Element? _element;
 
   /// The element annotation representing this annotation in the element model.
   @override
-  ElementAnnotation elementAnnotation;
+  ElementAnnotation? elementAnnotation;
 
   /// Initialize a newly created annotation. Both the [period] and the
   /// [constructorName] can be `null` if the annotation is not referencing a
   /// named constructor. The [arguments] can be `null` if the annotation is not
   /// referencing a constructor.
   AnnotationImpl(this.atSign, IdentifierImpl name, this.period,
-      SimpleIdentifierImpl constructorName, ArgumentListImpl arguments) {
-    _name = _becomeParentOf(name);
+      SimpleIdentifierImpl? constructorName, ArgumentListImpl? arguments) {
+    _name = _becomeParentOf(name)!;
     _constructorName = _becomeParentOf(constructorName);
     _arguments = _becomeParentOf(arguments);
   }
 
   @override
-  ArgumentList get arguments => _arguments;
+  ArgumentList? get arguments => _arguments;
 
   @override
-  set arguments(ArgumentList arguments) {
-    _arguments = _becomeParentOf(arguments as ArgumentListImpl);
+  set arguments(ArgumentList? arguments) {
+    _arguments = _becomeParentOf(arguments as ArgumentListImpl?);
   }
 
   @override
@@ -236,34 +233,34 @@
     ..add(_arguments);
 
   @override
-  SimpleIdentifier get constructorName => _constructorName;
+  SimpleIdentifier? get constructorName => _constructorName;
 
   @override
-  set constructorName(SimpleIdentifier name) {
-    _constructorName = _becomeParentOf(name as SimpleIdentifierImpl);
+  set constructorName(SimpleIdentifier? name) {
+    _constructorName = _becomeParentOf(name as SimpleIdentifierImpl?);
   }
 
   @override
-  Element get element {
+  Element? get element {
     if (_element != null) {
-      return _element;
-    } else if (_constructorName == null && _name != null) {
+      return _element!;
+    } else if (_constructorName == null) {
       return _name.staticElement;
     }
     return null;
   }
 
   @override
-  set element(Element element) {
+  set element(Element? element) {
     _element = element;
   }
 
   @override
   Token get endToken {
     if (_arguments != null) {
-      return _arguments.endToken;
+      return _arguments!.endToken;
     } else if (_constructorName != null) {
-      return _constructorName.endToken;
+      return _constructorName!.endToken;
     }
     return _name.endToken;
   }
@@ -273,15 +270,18 @@
 
   @override
   set name(Identifier name) {
-    _name = _becomeParentOf(name as IdentifierImpl);
+    _name = _becomeParentOf(name as IdentifierImpl)!;
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitAnnotation(this);
+  AstNode get parent => super.parent!;
+
+  @override
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitAnnotation(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _name?.accept(visitor);
+    _name.accept(visitor);
     _constructorName?.accept(visitor);
     _arguments?.accept(visitor);
   }
@@ -302,7 +302,7 @@
   Token leftParenthesis;
 
   /// The expressions producing the values of the arguments.
-  NodeList<Expression> _arguments;
+  late final NodeList<Expression> _arguments;
 
   /// The right parenthesis.
   @override
@@ -314,7 +314,7 @@
   /// determined based on static type information. The list must be the same
   /// length as the number of arguments, but can contain `null` entries if a
   /// given argument does not correspond to a formal parameter.
-  List<ParameterElement> _correspondingStaticParameters;
+  List<ParameterElement?>? _correspondingStaticParameters;
 
   /// Initialize a newly created list of arguments. The list of [arguments] can
   /// be `null` if there are no arguments.
@@ -336,11 +336,11 @@
     ..addAll(_arguments)
     ..add(rightParenthesis);
 
-  List<ParameterElement> get correspondingStaticParameters =>
+  List<ParameterElement?>? get correspondingStaticParameters =>
       _correspondingStaticParameters;
 
   @override
-  set correspondingStaticParameters(List<ParameterElement> parameters) {
+  set correspondingStaticParameters(List<ParameterElement?>? parameters) {
     if (parameters != null && parameters.length != _arguments.length) {
       throw ArgumentError(
           "Expected ${_arguments.length} parameters, not ${parameters.length}");
@@ -352,7 +352,7 @@
   Token get endToken => rightParenthesis;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitArgumentList(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitArgumentList(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -368,9 +368,9 @@
   ///   being invoked,
   /// then return the parameter element representing the parameter to which the
   /// value of the given expression will be bound. Otherwise, return `null`.
-  ParameterElement _getStaticParameterElementFor(Expression expression) {
+  ParameterElement? _getStaticParameterElementFor(Expression expression) {
     if (_correspondingStaticParameters == null ||
-        _correspondingStaticParameters.length != _arguments.length) {
+        _correspondingStaticParameters!.length != _arguments.length) {
       // Either the AST structure has not been resolved, the invocation of which
       // this list is a part could not be resolved, or the argument list was
       // modified after the parameters were set.
@@ -381,7 +381,7 @@
       // The expression isn't a child of this node.
       return null;
     }
-    return _correspondingStaticParameters[index];
+    return _correspondingStaticParameters![index];
   }
 }
 
@@ -391,14 +391,14 @@
 ///        [Expression] 'as' [TypeName]
 class AsExpressionImpl extends ExpressionImpl implements AsExpression {
   /// The expression used to compute the value being cast.
-  ExpressionImpl _expression;
+  late ExpressionImpl _expression;
 
   /// The 'as' operator.
   @override
   Token asOperator;
 
   /// The type being cast to.
-  TypeAnnotationImpl _type;
+  late TypeAnnotationImpl _type;
 
   /// Initialize a newly created as expression.
   AsExpressionImpl(
@@ -437,12 +437,12 @@
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitAsExpression(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitAsExpression(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _expression?.accept(visitor);
-    _type?.accept(visitor);
+    _expression.accept(visitor);
+    _type.accept(visitor);
   }
 }
 
@@ -459,14 +459,14 @@
   Token leftParenthesis;
 
   /// The condition that is being asserted to be `true`.
-  ExpressionImpl _condition;
+  late ExpressionImpl _condition;
 
   @override
-  Token comma;
+  Token? comma;
 
   /// The message to report if the assertion fails, or `null` if no message was
   /// supplied.
-  ExpressionImpl _message;
+  ExpressionImpl? _message;
 
   @override
   Token rightParenthesis;
@@ -477,7 +477,7 @@
       this.leftParenthesis,
       ExpressionImpl condition,
       this.comma,
-      ExpressionImpl message,
+      ExpressionImpl? message,
       this.rightParenthesis) {
     _condition = _becomeParentOf(condition);
     _message = _becomeParentOf(message);
@@ -507,19 +507,19 @@
   Token get endToken => rightParenthesis;
 
   @override
-  Expression get message => _message;
+  Expression? get message => _message;
 
   @override
-  set message(Expression expression) {
-    _message = _becomeParentOf(expression as ExpressionImpl);
+  set message(Expression? expression) {
+    _message = _becomeParentOf(expression as ExpressionImpl?);
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitAssertInitializer(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitAssertInitializer(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _condition?.accept(visitor);
+    _condition.accept(visitor);
     message?.accept(visitor);
   }
 }
@@ -536,14 +536,14 @@
   Token leftParenthesis;
 
   /// The condition that is being asserted to be `true`.
-  ExpressionImpl _condition;
+  late ExpressionImpl _condition;
 
   @override
-  Token comma;
+  Token? comma;
 
   /// The message to report if the assertion fails, or `null` if no message was
   /// supplied.
-  ExpressionImpl _message;
+  ExpressionImpl? _message;
 
   @override
   Token rightParenthesis;
@@ -557,7 +557,7 @@
       this.leftParenthesis,
       ExpressionImpl condition,
       this.comma,
-      ExpressionImpl message,
+      ExpressionImpl? message,
       this.rightParenthesis,
       this.semicolon) {
     _condition = _becomeParentOf(condition);
@@ -589,19 +589,19 @@
   Token get endToken => semicolon;
 
   @override
-  Expression get message => _message;
+  Expression? get message => _message;
 
   @override
-  set message(Expression expression) {
+  set message(Expression? expression) {
     _message = _becomeParentOf(expression as ExpressionImpl);
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitAssertStatement(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitAssertStatement(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _condition?.accept(visitor);
+    _condition.accept(visitor);
     message?.accept(visitor);
   }
 }
@@ -614,41 +614,25 @@
     with NullShortableExpressionImpl, CompoundAssignmentExpressionImpl
     implements AssignmentExpression {
   /// The expression used to compute the left hand side.
-  ExpressionImpl _leftHandSide;
+  late ExpressionImpl _leftHandSide;
 
   /// The assignment operator being applied.
   @override
   Token operator;
 
   /// The expression used to compute the right hand side.
-  ExpressionImpl _rightHandSide;
+  late ExpressionImpl _rightHandSide;
 
   /// The element associated with the operator based on the static type of the
   /// left-hand-side, or `null` if the AST structure has not been resolved, if
   /// the operator is not a compound operator, or if the operator could not be
   /// resolved.
   @override
-  MethodElement staticElement;
+  MethodElement? staticElement;
 
   /// Initialize a newly created assignment expression.
   AssignmentExpressionImpl(ExpressionImpl leftHandSide, this.operator,
       ExpressionImpl rightHandSide) {
-    if (leftHandSide == null || rightHandSide == null) {
-      String message;
-      if (leftHandSide == null) {
-        if (rightHandSide == null) {
-          message = "Both the left-hand and right-hand sides are null";
-        } else {
-          message = "The left-hand size is null";
-        }
-      } else {
-        message = "The right-hand size is null";
-      }
-      // TODO(39284): should this exception be silent?
-      AnalysisEngine.instance.instrumentationService.logException(
-          SilentException(message, AnalysisException(message), null),
-          StackTrace.current);
-    }
     _leftHandSide = _becomeParentOf(leftHandSide);
     _rightHandSide = _becomeParentOf(rightHandSide);
   }
@@ -683,14 +667,14 @@
   }
 
   @override
-  AstNode get _nullShortingExtensionCandidate => parent;
+  AstNode? get _nullShortingExtensionCandidate => parent;
 
   /// If the AST structure has been resolved, and the function being invoked is
   /// known based on static type information, then return the parameter element
   /// representing the parameter to which the value of the right operand will be
   /// bound. Otherwise, return `null`.
-  ParameterElement get _staticParameterElementForRightHandSide {
-    Element executableElement;
+  ParameterElement? get _staticParameterElementForRightHandSide {
+    Element? executableElement;
     if (operator.type != TokenType.EQ) {
       executableElement = staticElement;
     } else {
@@ -712,12 +696,13 @@
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitAssignmentExpression(this);
+  E? accept<E>(AstVisitor<E> visitor) =>
+      visitor.visitAssignmentExpression(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _leftHandSide?.accept(visitor);
-    _rightHandSide?.accept(visitor);
+    _leftHandSide.accept(visitor);
+    _rightHandSide.accept(visitor);
   }
 
   @override
@@ -741,11 +726,11 @@
 abstract class AstNodeImpl implements AstNode {
   /// The parent of the node, or `null` if the node is the root of an AST
   /// structure.
-  AstNode _parent;
+  AstNode? _parent;
 
   /// A table mapping the names of properties to their values, or `null` if this
   /// node does not have any properties associated with it.
-  Map<String, Object> _propertyMap;
+  Map<String, Object>? _propertyMap;
 
   @override
   int get end => offset + length;
@@ -757,28 +742,22 @@
   int get length {
     Token beginToken = this.beginToken;
     Token endToken = this.endToken;
-    if (beginToken == null || endToken == null) {
-      return -1;
-    }
     return endToken.offset + endToken.length - beginToken.offset;
   }
 
   @override
   int get offset {
     Token beginToken = this.beginToken;
-    if (beginToken == null) {
-      return -1;
-    }
     return beginToken.offset;
   }
 
   @override
-  AstNode get parent => _parent;
+  AstNode? get parent => _parent;
 
   @override
   AstNode get root {
     AstNode root = this;
-    AstNode parent = this.parent;
+    var parent = this.parent;
     while (parent != null) {
       root = parent;
       parent = root.parent;
@@ -787,48 +766,48 @@
   }
 
   @override
-  Token findPrevious(Token target) =>
+  Token? findPrevious(Token target) =>
       util.findPrevious(beginToken, target) ?? parent?.findPrevious(target);
 
   @override
-  E getProperty<E>(String name) {
+  E? getProperty<E>(String name) {
     if (_propertyMap == null) {
       return null;
     }
-    return _propertyMap[name] as E;
+    return _propertyMap![name] as E?;
   }
 
   @override
-  void setProperty(String name, Object value) {
+  void setProperty(String name, Object? value) {
     if (value == null) {
       if (_propertyMap != null) {
-        _propertyMap.remove(name);
-        if (_propertyMap.isEmpty) {
+        _propertyMap!.remove(name);
+        if (_propertyMap!.isEmpty) {
           _propertyMap = null;
         }
       }
     } else {
       _propertyMap ??= HashMap<String, Object>();
-      _propertyMap[name] = value;
+      _propertyMap![name] = value;
     }
   }
 
   @override
-  E thisOrAncestorMatching<E extends AstNode>(Predicate<AstNode> predicate) {
-    AstNode node = this;
+  E? thisOrAncestorMatching<E extends AstNode>(Predicate<AstNode> predicate) {
+    AstNode? node = this;
     while (node != null && !predicate(node)) {
       node = node.parent;
     }
-    return node as E;
+    return node as E?;
   }
 
   @override
-  E thisOrAncestorOfType<E extends AstNode>() {
-    AstNode node = this;
+  E? thisOrAncestorOfType<E extends AstNode>() {
+    AstNode? node = this;
     while (node != null && node is! E) {
       node = node.parent;
     }
-    return node as E;
+    return node as E?;
   }
 
   @override
@@ -843,7 +822,7 @@
 
   /// Make this node the parent of the given [child] node. Return the child
   /// node.
-  T _becomeParentOf<T extends AstNodeImpl>(T child) {
+  T _becomeParentOf<T extends AstNodeImpl?>(T child) {
     if (child != null) {
       child._parent = this;
     }
@@ -861,7 +840,7 @@
   Token awaitKeyword;
 
   /// The expression whose value is being waited on.
-  ExpressionImpl _expression;
+  late ExpressionImpl _expression;
 
   /// Initialize a newly created await expression.
   AwaitExpressionImpl(this.awaitKeyword, ExpressionImpl expression) {
@@ -870,10 +849,7 @@
 
   @override
   Token get beginToken {
-    if (awaitKeyword != null) {
-      return awaitKeyword;
-    }
-    return _expression.beginToken;
+    return awaitKeyword;
   }
 
   @override
@@ -895,11 +871,11 @@
   Precedence get precedence => Precedence.prefix;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitAwaitExpression(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitAwaitExpression(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _expression?.accept(visitor);
+    _expression.accept(visitor);
   }
 }
 
@@ -909,23 +885,23 @@
 ///        [Expression] [Token] [Expression]
 class BinaryExpressionImpl extends ExpressionImpl implements BinaryExpression {
   /// The expression used to compute the left operand.
-  ExpressionImpl _leftOperand;
+  late ExpressionImpl _leftOperand;
 
   /// The binary operator being applied.
   @override
   Token operator;
 
   /// The expression used to compute the right operand.
-  ExpressionImpl _rightOperand;
+  late ExpressionImpl _rightOperand;
 
   /// The element associated with the operator based on the static type of the
   /// left operand, or `null` if the AST structure has not been resolved, if the
   /// operator is not user definable, or if the operator could not be resolved.
   @override
-  MethodElement staticElement;
+  MethodElement? staticElement;
 
   @override
-  FunctionType staticInvokeType;
+  FunctionType? staticInvokeType;
 
   /// Initialize a newly created binary expression.
   BinaryExpressionImpl(
@@ -964,12 +940,12 @@
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitBinaryExpression(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitBinaryExpression(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _leftOperand?.accept(visitor);
-    _rightOperand?.accept(visitor);
+    _leftOperand.accept(visitor);
+    _rightOperand.accept(visitor);
   }
 }
 
@@ -982,15 +958,15 @@
   /// The token representing the 'async' or 'sync' keyword, or `null` if there
   /// is no such keyword.
   @override
-  Token keyword;
+  Token? keyword;
 
   /// The star optionally following the 'async' or 'sync' keyword, or `null` if
   /// there is wither no such keyword or no star.
   @override
-  Token star;
+  Token? star;
 
   /// The block representing the body of the function.
-  BlockImpl _block;
+  late BlockImpl _block;
 
   /// Initialize a newly created function body consisting of a block of
   /// statements. The [keyword] can be `null` if there is no keyword specified
@@ -1003,7 +979,7 @@
   @override
   Token get beginToken {
     if (keyword != null) {
-      return keyword;
+      return keyword!;
     }
     return _block.beginToken;
   }
@@ -1024,22 +1000,20 @@
   Token get endToken => _block.endToken;
 
   @override
-  bool get isAsynchronous =>
-      keyword != null && keyword.lexeme == Keyword.ASYNC.lexeme;
+  bool get isAsynchronous => keyword?.lexeme == Keyword.ASYNC.lexeme;
 
   @override
   bool get isGenerator => star != null;
 
   @override
-  bool get isSynchronous =>
-      keyword == null || keyword.lexeme != Keyword.ASYNC.lexeme;
+  bool get isSynchronous => keyword?.lexeme != Keyword.ASYNC.lexeme;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitBlockFunctionBody(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitBlockFunctionBody(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _block?.accept(visitor);
+    _block.accept(visitor);
   }
 }
 
@@ -1053,7 +1027,7 @@
   Token leftBracket;
 
   /// The statements contained in the block.
-  NodeList<Statement> _statements;
+  late NodeList<Statement> _statements;
 
   /// The right curly bracket.
   @override
@@ -1080,7 +1054,7 @@
   NodeList<Statement> get statements => _statements;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitBlock(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitBlock(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -1117,7 +1091,7 @@
   bool get isSynthetic => literal.isSynthetic;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitBooleanLiteral(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitBooleanLiteral(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -1135,7 +1109,7 @@
   Token breakKeyword;
 
   /// The label associated with the statement, or `null` if there is no label.
-  SimpleIdentifierImpl _label;
+  SimpleIdentifierImpl? _label;
 
   /// The semicolon terminating the statement.
   @override
@@ -1149,12 +1123,12 @@
   /// resolved. Note that if the source code has errors, the target might be
   /// invalid (e.g. trying to break to a switch case).
   @override
-  AstNode target;
+  AstNode? target;
 
   /// Initialize a newly created break statement. The [label] can be `null` if
   /// there is no label associated with the statement.
   BreakStatementImpl(
-      this.breakKeyword, SimpleIdentifierImpl label, this.semicolon) {
+      this.breakKeyword, SimpleIdentifierImpl? label, this.semicolon) {
     _label = _becomeParentOf(label);
   }
 
@@ -1169,15 +1143,15 @@
   Token get endToken => semicolon;
 
   @override
-  SimpleIdentifier get label => _label;
+  SimpleIdentifier? get label => _label;
 
   @override
-  set label(SimpleIdentifier identifier) {
-    _label = _becomeParentOf(identifier as SimpleIdentifierImpl);
+  set label(SimpleIdentifier? identifier) {
+    _label = _becomeParentOf(identifier as SimpleIdentifierImpl?);
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitBreakStatement(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitBreakStatement(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -1203,10 +1177,10 @@
     with NullShortableExpressionImpl
     implements CascadeExpression {
   /// The target of the cascade sections.
-  ExpressionImpl _target;
+  late ExpressionImpl _target;
 
   /// The cascade sections sharing the common target.
-  NodeList<Expression> _cascadeSections;
+  late NodeList<Expression> _cascadeSections;
 
   /// Initialize a newly created cascade expression. The list of
   /// [cascadeSections] must contain at least one element.
@@ -1228,11 +1202,11 @@
     ..addAll(_cascadeSections);
 
   @override
-  Token get endToken => _cascadeSections.endToken;
+  Token get endToken => _cascadeSections.endToken!;
 
   @override
   bool get isNullAware {
-    return target.endToken.next.type == TokenType.QUESTION_PERIOD_PERIOD;
+    return target.endToken.next!.type == TokenType.QUESTION_PERIOD_PERIOD;
   }
 
   @override
@@ -1247,14 +1221,14 @@
   }
 
   @override
-  AstNode get _nullShortingExtensionCandidate => null;
+  AstNode? get _nullShortingExtensionCandidate => null;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitCascadeExpression(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitCascadeExpression(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _target?.accept(visitor);
+    _target.accept(visitor);
     _cascadeSections.accept(visitor);
   }
 
@@ -1276,40 +1250,40 @@
   /// The token representing the 'on' keyword, or `null` if there is no 'on'
   /// keyword.
   @override
-  Token onKeyword;
+  Token? onKeyword;
 
   /// The type of exceptions caught by this catch clause, or `null` if this
   /// catch clause catches every type of exception.
-  TypeAnnotationImpl _exceptionType;
+  TypeAnnotationImpl? _exceptionType;
 
   /// The token representing the 'catch' keyword, or `null` if there is no
   /// 'catch' keyword.
   @override
-  Token catchKeyword;
+  Token? catchKeyword;
 
   /// The left parenthesis, or `null` if there is no 'catch' keyword.
   @override
-  Token leftParenthesis;
+  Token? leftParenthesis;
 
   /// The parameter whose value will be the exception that was thrown, or `null`
   /// if there is no 'catch' keyword.
-  SimpleIdentifierImpl _exceptionParameter;
+  SimpleIdentifierImpl? _exceptionParameter;
 
   /// The comma separating the exception parameter from the stack trace
   /// parameter, or `null` if there is no stack trace parameter.
   @override
-  Token comma;
+  Token? comma;
 
   /// The parameter whose value will be the stack trace associated with the
   /// exception, or `null` if there is no stack trace parameter.
-  SimpleIdentifierImpl _stackTraceParameter;
+  SimpleIdentifierImpl? _stackTraceParameter;
 
   /// The right parenthesis, or `null` if there is no 'catch' keyword.
   @override
-  Token rightParenthesis;
+  Token? rightParenthesis;
 
   /// The body of the catch block.
-  BlockImpl _body;
+  late BlockImpl _body;
 
   /// Initialize a newly created catch clause. The [onKeyword] and
   /// [exceptionType] can be `null` if the clause will catch all exceptions. The
@@ -1317,14 +1291,15 @@
   /// parameter is not defined.
   CatchClauseImpl(
       this.onKeyword,
-      TypeAnnotationImpl exceptionType,
+      TypeAnnotationImpl? exceptionType,
       this.catchKeyword,
       this.leftParenthesis,
-      SimpleIdentifierImpl exceptionParameter,
+      SimpleIdentifierImpl? exceptionParameter,
       this.comma,
-      SimpleIdentifierImpl stackTraceParameter,
+      SimpleIdentifierImpl? stackTraceParameter,
       this.rightParenthesis,
-      BlockImpl body) {
+      BlockImpl body)
+      : assert(onKeyword != null || catchKeyword != null) {
     _exceptionType = _becomeParentOf(exceptionType);
     _exceptionParameter = _becomeParentOf(exceptionParameter);
     _stackTraceParameter = _becomeParentOf(stackTraceParameter);
@@ -1334,9 +1309,9 @@
   @override
   Token get beginToken {
     if (onKeyword != null) {
-      return onKeyword;
+      return onKeyword!;
     }
-    return catchKeyword;
+    return catchKeyword!;
   }
 
   @override
@@ -1363,38 +1338,38 @@
   Token get endToken => _body.endToken;
 
   @override
-  SimpleIdentifier get exceptionParameter => _exceptionParameter;
+  SimpleIdentifier? get exceptionParameter => _exceptionParameter;
 
   @override
-  set exceptionParameter(SimpleIdentifier parameter) {
-    _exceptionParameter = _becomeParentOf(parameter as SimpleIdentifierImpl);
+  set exceptionParameter(SimpleIdentifier? parameter) {
+    _exceptionParameter = _becomeParentOf(parameter as SimpleIdentifierImpl?);
   }
 
   @override
-  TypeAnnotation get exceptionType => _exceptionType;
+  TypeAnnotation? get exceptionType => _exceptionType;
 
   @override
-  set exceptionType(TypeAnnotation exceptionType) {
-    _exceptionType = _becomeParentOf(exceptionType as TypeAnnotationImpl);
+  set exceptionType(TypeAnnotation? exceptionType) {
+    _exceptionType = _becomeParentOf(exceptionType as TypeAnnotationImpl?);
   }
 
   @override
-  SimpleIdentifier get stackTraceParameter => _stackTraceParameter;
+  SimpleIdentifier? get stackTraceParameter => _stackTraceParameter;
 
   @override
-  set stackTraceParameter(SimpleIdentifier parameter) {
-    _stackTraceParameter = _becomeParentOf(parameter as SimpleIdentifierImpl);
+  set stackTraceParameter(SimpleIdentifier? parameter) {
+    _stackTraceParameter = _becomeParentOf(parameter as SimpleIdentifierImpl?);
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitCatchClause(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitCatchClause(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
     _exceptionType?.accept(visitor);
     _exceptionParameter?.accept(visitor);
     _stackTraceParameter?.accept(visitor);
-    _body?.accept(visitor);
+    _body.accept(visitor);
   }
 }
 
@@ -1409,14 +1384,14 @@
   Iterator<SyntacticEntity> get iterator => _entities.iterator;
 
   /// Add an AST node or token as the next child entity, if it is not `null`.
-  void add(SyntacticEntity entity) {
+  void add(SyntacticEntity? entity) {
     if (entity != null) {
       _entities.add(entity);
     }
   }
 
   /// Add the given items as the next child entities, if [items] is not `null`.
-  void addAll(Iterable<SyntacticEntity> items) {
+  void addAll(Iterable<SyntacticEntity>? items) {
     if (items != null) {
       _entities.addAll(items);
     }
@@ -1435,7 +1410,7 @@
     implements ClassDeclaration {
   /// The 'abstract' keyword, or `null` if the keyword was absent.
   @override
-  Token abstractKeyword;
+  Token? abstractKeyword;
 
   /// The token representing the 'class' keyword.
   @override
@@ -1443,15 +1418,15 @@
 
   /// The extends clause for the class, or `null` if the class does not extend
   /// any other class.
-  ExtendsClauseImpl _extendsClause;
+  ExtendsClauseImpl? _extendsClause;
 
   /// The with clause for the class, or `null` if the class does not have a with
   /// clause.
-  WithClauseImpl _withClause;
+  WithClauseImpl? _withClause;
 
   /// The native clause for the class, or `null` if the class does not have a
   /// native clause.
-  NativeClauseImpl _nativeClause;
+  NativeClauseImpl? _nativeClause;
 
   /// Initialize a newly created class declaration. Either or both of the
   /// [comment] and [metadata] can be `null` if the class does not have the
@@ -1462,15 +1437,15 @@
   /// corresponding clause. The list of [members] can be `null` if the class
   /// does not have any members.
   ClassDeclarationImpl(
-      CommentImpl comment,
-      List<Annotation> metadata,
+      CommentImpl? comment,
+      List<Annotation>? metadata,
       this.abstractKeyword,
       this.classKeyword,
       SimpleIdentifierImpl name,
-      TypeParameterListImpl typeParameters,
-      ExtendsClauseImpl extendsClause,
-      WithClauseImpl withClause,
-      ImplementsClauseImpl implementsClause,
+      TypeParameterListImpl? typeParameters,
+      ExtendsClauseImpl? extendsClause,
+      WithClauseImpl? withClause,
+      ImplementsClauseImpl? implementsClause,
       Token leftBracket,
       List<ClassMember> members,
       Token rightBracket)
@@ -1495,20 +1470,20 @@
     ..add(rightBracket);
 
   @override
-  ClassElement get declaredElement => _name?.staticElement as ClassElement;
+  ClassElement? get declaredElement => _name.staticElement as ClassElement?;
 
   @override
-  ExtendsClause get extendsClause => _extendsClause;
+  ExtendsClause? get extendsClause => _extendsClause;
 
   @override
-  set extendsClause(ExtendsClause extendsClause) {
-    _extendsClause = _becomeParentOf(extendsClause as ExtendsClauseImpl);
+  set extendsClause(ExtendsClause? extendsClause) {
+    _extendsClause = _becomeParentOf(extendsClause as ExtendsClauseImpl?);
   }
 
   @override
   Token get firstTokenAfterCommentAndMetadata {
     if (abstractKeyword != null) {
-      return abstractKeyword;
+      return abstractKeyword!;
     }
     return classKeyword;
   }
@@ -1517,32 +1492,32 @@
   bool get isAbstract => abstractKeyword != null;
 
   @override
-  NativeClause get nativeClause => _nativeClause;
+  NativeClause? get nativeClause => _nativeClause;
 
   @override
-  set nativeClause(NativeClause nativeClause) {
-    _nativeClause = _becomeParentOf(nativeClause as NativeClauseImpl);
+  set nativeClause(NativeClause? nativeClause) {
+    _nativeClause = _becomeParentOf(nativeClause as NativeClauseImpl?);
   }
 
   @override
-  WithClause get withClause => _withClause;
+  WithClause? get withClause => _withClause;
 
   @override
-  set withClause(WithClause withClause) {
-    _withClause = _becomeParentOf(withClause as WithClauseImpl);
+  set withClause(WithClause? withClause) {
+    _withClause = _becomeParentOf(withClause as WithClauseImpl?);
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitClassDeclaration(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitClassDeclaration(this);
 
   @override
-  ConstructorDeclaration getConstructor(String name) {
+  ConstructorDeclaration? getConstructor(String? name) {
     int length = _members.length;
     for (int i = 0; i < length; i++) {
       ClassMember classMember = _members[i];
       if (classMember is ConstructorDeclaration) {
         ConstructorDeclaration constructor = classMember;
-        SimpleIdentifier constructorName = constructor.name;
+        SimpleIdentifier? constructorName = constructor.name;
         if (name == null && constructorName == null) {
           return constructor;
         }
@@ -1557,7 +1532,7 @@
   @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
-    _name?.accept(visitor);
+    _name.accept(visitor);
     _typeParameters?.accept(visitor);
     _extendsClause?.accept(visitor);
     _withClause?.accept(visitor);
@@ -1572,7 +1547,7 @@
   /// Initialize a newly created member of a class. Either or both of the
   /// [comment] and [metadata] can be `null` if the member does not have the
   /// corresponding attribute.
-  ClassMemberImpl(CommentImpl comment, List<Annotation> metadata)
+  ClassMemberImpl(CommentImpl? comment, List<Annotation>? metadata)
       : super(comment, metadata);
 }
 
@@ -1580,29 +1555,29 @@
     extends NamedCompilationUnitMemberImpl implements ClassOrMixinDeclaration {
   /// The type parameters for the class or mixin,
   /// or `null` if the declaration does not have any type parameters.
-  TypeParameterListImpl _typeParameters;
+  TypeParameterListImpl? _typeParameters;
 
   /// The implements clause for the class or mixin,
   /// or `null` if the declaration does not implement any interfaces.
-  ImplementsClauseImpl _implementsClause;
+  ImplementsClauseImpl? _implementsClause;
 
   /// The left curly bracket.
   @override
   Token leftBracket;
 
   /// The members defined by the class or mixin.
-  NodeList<ClassMember> _members;
+  late NodeList<ClassMember> _members;
 
   /// The right curly bracket.
   @override
   Token rightBracket;
 
   ClassOrMixinDeclarationImpl(
-      CommentImpl comment,
-      List<Annotation> metadata,
+      CommentImpl? comment,
+      List<Annotation>? metadata,
       SimpleIdentifierImpl name,
-      TypeParameterListImpl typeParameters,
-      ImplementsClauseImpl implementsClause,
+      TypeParameterListImpl? typeParameters,
+      ImplementsClauseImpl? implementsClause,
       this.leftBracket,
       List<ClassMember> members,
       this.rightBracket)
@@ -1616,25 +1591,25 @@
   Token get endToken => rightBracket;
 
   @override
-  ImplementsClause get implementsClause => _implementsClause;
+  ImplementsClause? get implementsClause => _implementsClause;
 
-  set implementsClause(ImplementsClause implementsClause) {
+  set implementsClause(ImplementsClause? implementsClause) {
     _implementsClause =
-        _becomeParentOf(implementsClause as ImplementsClauseImpl);
+        _becomeParentOf(implementsClause as ImplementsClauseImpl?);
   }
 
   @override
   NodeList<ClassMember> get members => _members;
 
   @override
-  TypeParameterList get typeParameters => _typeParameters;
+  TypeParameterList? get typeParameters => _typeParameters;
 
-  set typeParameters(TypeParameterList typeParameters) {
-    _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl);
+  set typeParameters(TypeParameterList? typeParameters) {
+    _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl?);
   }
 
   @override
-  VariableDeclaration getField(String name) {
+  VariableDeclaration? getField(String name) {
     int memberLength = _members.length;
     for (int i = 0; i < memberLength; i++) {
       ClassMember classMember = _members[i];
@@ -1645,8 +1620,7 @@
         int fieldLength = fields.length;
         for (int i = 0; i < fieldLength; i++) {
           VariableDeclaration field = fields[i];
-          SimpleIdentifier fieldName = field.name;
-          if (fieldName != null && name == fieldName.name) {
+          if (name == field.name.name) {
             return field;
           }
         }
@@ -1656,14 +1630,13 @@
   }
 
   @override
-  MethodDeclaration getMethod(String name) {
+  MethodDeclaration? getMethod(String name) {
     int length = _members.length;
     for (int i = 0; i < length; i++) {
       ClassMember classMember = _members[i];
       if (classMember is MethodDeclaration) {
         MethodDeclaration method = classMember;
-        SimpleIdentifier methodName = method.name;
-        if (methodName != null && name == methodName.name) {
+        if (name == method.name.name) {
           return method;
         }
       }
@@ -1685,7 +1658,7 @@
     implements ClassTypeAlias {
   /// The type parameters for the class, or `null` if the class does not have
   /// any type parameters.
-  TypeParameterListImpl _typeParameters;
+  TypeParameterListImpl? _typeParameters;
 
   /// The token for the '=' separating the name from the definition.
   @override
@@ -1694,17 +1667,17 @@
   /// The token for the 'abstract' keyword, or `null` if this is not defining an
   /// abstract class.
   @override
-  Token abstractKeyword;
+  Token? abstractKeyword;
 
   /// The name of the superclass of the class being declared.
-  TypeNameImpl _superclass;
+  late TypeNameImpl _superclass;
 
   /// The with clause for this class.
-  WithClauseImpl _withClause;
+  late WithClauseImpl _withClause;
 
   /// The implements clause for this class, or `null` if there is no implements
   /// clause.
-  ImplementsClauseImpl _implementsClause;
+  ImplementsClauseImpl? _implementsClause;
 
   /// Initialize a newly created class type alias. Either or both of the
   /// [comment] and [metadata] can be `null` if the class type alias does not
@@ -1713,16 +1686,16 @@
   /// `null` if the class is not abstract. The [implementsClause] can be `null`
   /// if the class does not implement any interfaces.
   ClassTypeAliasImpl(
-      CommentImpl comment,
-      List<Annotation> metadata,
+      CommentImpl? comment,
+      List<Annotation>? metadata,
       Token keyword,
       SimpleIdentifierImpl name,
-      TypeParameterListImpl typeParameters,
+      TypeParameterListImpl? typeParameters,
       this.equals,
       this.abstractKeyword,
       TypeNameImpl superclass,
       WithClauseImpl withClause,
-      ImplementsClauseImpl implementsClause,
+      ImplementsClauseImpl? implementsClause,
       Token semicolon)
       : super(comment, metadata, keyword, name, semicolon) {
     _typeParameters = _becomeParentOf(typeParameters);
@@ -1744,23 +1717,23 @@
     ..add(semicolon);
 
   @override
-  ClassElement get declaredElement => _name?.staticElement as ClassElement;
+  ClassElement? get declaredElement => _name.staticElement as ClassElement?;
 
   @override
   Token get firstTokenAfterCommentAndMetadata {
     if (abstractKeyword != null) {
-      return abstractKeyword;
+      return abstractKeyword!;
     }
     return typedefKeyword;
   }
 
   @override
-  ImplementsClause get implementsClause => _implementsClause;
+  ImplementsClause? get implementsClause => _implementsClause;
 
   @override
-  set implementsClause(ImplementsClause implementsClause) {
+  set implementsClause(ImplementsClause? implementsClause) {
     _implementsClause =
-        _becomeParentOf(implementsClause as ImplementsClauseImpl);
+        _becomeParentOf(implementsClause as ImplementsClauseImpl?);
   }
 
   @override
@@ -1775,10 +1748,10 @@
   }
 
   @override
-  TypeParameterList get typeParameters => _typeParameters;
+  TypeParameterList? get typeParameters => _typeParameters;
 
   @override
-  set typeParameters(TypeParameterList typeParameters) {
+  set typeParameters(TypeParameterList? typeParameters) {
     _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl);
   }
 
@@ -1791,15 +1764,15 @@
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitClassTypeAlias(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitClassTypeAlias(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
-    _name?.accept(visitor);
+    _name.accept(visitor);
     _typeParameters?.accept(visitor);
-    _superclass?.accept(visitor);
-    _withClause?.accept(visitor);
+    _superclass.accept(visitor);
+    _withClause.accept(visitor);
     _implementsClause?.accept(visitor);
   }
 }
@@ -1852,7 +1825,7 @@
   /// The references embedded within the documentation comment. This list will
   /// be empty unless this is a documentation comment that has references embedded
   /// within it.
-  NodeList<CommentReference> _references;
+  late NodeList<CommentReference> _references;
 
   /// Initialize a newly created comment. The list of [tokens] must contain at
   /// least one token. The [_type] is the type of the comment. The list of
@@ -1885,7 +1858,7 @@
   NodeList<CommentReference> get references => _references;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitComment(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitComment(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -1894,11 +1867,11 @@
 
   /// Create a block comment consisting of the given [tokens].
   static Comment createBlockComment(List<Token> tokens) =>
-      CommentImpl(tokens, CommentType.BLOCK, null);
+      CommentImpl(tokens, CommentType.BLOCK, const <CommentReference>[]);
 
   /// Create a documentation comment consisting of the given [tokens].
-  static Comment createDocumentationComment(List<Token> tokens) =>
-      CommentImpl(tokens, CommentType.DOCUMENTATION, <CommentReference>[]);
+  static Comment createDocumentationComment(List<Token> tokens) => CommentImpl(
+      tokens, CommentType.DOCUMENTATION, const <CommentReference>[]);
 
   /// Create a documentation comment consisting of the given [tokens] and having
   /// the given [references] embedded within it.
@@ -1908,7 +1881,7 @@
 
   /// Create an end-of-line comment consisting of the given [tokens].
   static Comment createEndOfLineComment(List<Token> tokens) =>
-      CommentImpl(tokens, CommentType.END_OF_LINE, null);
+      CommentImpl(tokens, CommentType.END_OF_LINE, const <CommentReference>[]);
 }
 
 /// A reference to a Dart element that is found within a documentation comment.
@@ -1919,10 +1892,10 @@
   /// The token representing the 'new' keyword, or `null` if there was no 'new'
   /// keyword.
   @override
-  Token newKeyword;
+  Token? newKeyword;
 
   /// The identifier being referenced.
-  IdentifierImpl _identifier;
+  late IdentifierImpl _identifier;
 
   /// Initialize a newly created reference to a Dart element. The [newKeyword]
   /// can be `null` if the reference is not to a constructor.
@@ -1949,11 +1922,11 @@
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitCommentReference(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitCommentReference(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _identifier?.accept(visitor);
+    _identifier.accept(visitor);
   }
 }
 
@@ -2007,13 +1980,13 @@
 
   /// The script tag at the beginning of the compilation unit, or `null` if
   /// there is no script tag in this compilation unit.
-  ScriptTagImpl _scriptTag;
+  ScriptTagImpl? _scriptTag;
 
   /// The directives contained in this compilation unit.
-  NodeList<Directive> _directives;
+  late NodeList<Directive> _directives;
 
   /// The declarations contained in this compilation unit.
-  NodeList<CompilationUnitMember> _declarations;
+  late NodeList<CompilationUnitMember> _declarations;
 
   /// The last token in the token stream that was parsed to form this
   /// compilation unit. This token should always have a type of [TokenType.EOF].
@@ -2023,14 +1996,14 @@
   /// The element associated with this compilation unit, or `null` if the AST
   /// structure has not been resolved.
   @override
-  CompilationUnitElement declaredElement;
+  CompilationUnitElement? declaredElement;
 
   /// The line information for this compilation unit.
   @override
-  LineInfo lineInfo;
+  LineInfo? lineInfo;
 
   /// The language version information.
-  LibraryLanguageVersion languageVersion;
+  LibraryLanguageVersion? languageVersion;
 
   @override
   final FeatureSet featureSet;
@@ -2038,7 +2011,7 @@
   /// Data that is read during loading this node from summary, but is not
   /// fully applied yet. For example in many cases we don't need the
   /// documentation comment, and it is expensive to decode strings.
-  Object summaryData;
+  Object? summaryData;
 
   /// Initialize a newly created compilation unit to have the given directives
   /// and declarations. The [scriptTag] can be `null` if there is no script tag
@@ -2047,9 +2020,9 @@
   /// be `null` if there are no declarations in the compilation unit.
   CompilationUnitImpl(
       this.beginToken,
-      ScriptTagImpl scriptTag,
-      List<Directive> directives,
-      List<CompilationUnitMember> declarations,
+      ScriptTagImpl? scriptTag,
+      List<Directive>? directives,
+      List<CompilationUnitMember>? declarations,
       this.endToken,
       this.featureSet) {
     _scriptTag = _becomeParentOf(scriptTag);
@@ -2075,13 +2048,13 @@
   NodeList<Directive> get directives => _directives;
 
   @override
-  set element(CompilationUnitElement element) {
+  set element(CompilationUnitElement? element) {
     declaredElement = element;
   }
 
   @override
-  LanguageVersionToken get languageVersionToken {
-    CommentToken comment = beginToken.precedingComments;
+  LanguageVersionToken? get languageVersionToken {
+    Token? comment = beginToken.precedingComments;
     while (comment != null) {
       if (comment is LanguageVersionToken) {
         return comment;
@@ -2094,9 +2067,6 @@
   @override
   int get length {
     Token endToken = this.endToken;
-    if (endToken == null) {
-      return 0;
-    }
     return endToken.offset + endToken.length;
   }
 
@@ -2104,11 +2074,11 @@
   int get offset => 0;
 
   @override
-  ScriptTag get scriptTag => _scriptTag;
+  ScriptTag? get scriptTag => _scriptTag;
 
   @override
-  set scriptTag(ScriptTag scriptTag) {
-    _scriptTag = _becomeParentOf(scriptTag as ScriptTagImpl);
+  set scriptTag(ScriptTag? scriptTag) {
+    _scriptTag = _becomeParentOf(scriptTag as ScriptTagImpl?);
   }
 
   @override
@@ -2131,7 +2101,7 @@
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitCompilationUnit(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitCompilationUnit(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -2166,22 +2136,22 @@
   /// Initialize a newly created generic compilation unit member. Either or both
   /// of the [comment] and [metadata] can be `null` if the member does not have
   /// the corresponding attribute.
-  CompilationUnitMemberImpl(CommentImpl comment, List<Annotation> metadata)
+  CompilationUnitMemberImpl(CommentImpl? comment, List<Annotation>? metadata)
       : super(comment, metadata);
 }
 
 mixin CompoundAssignmentExpressionImpl implements CompoundAssignmentExpression {
   @override
-  Element readElement;
+  Element? readElement;
 
   @override
-  Element writeElement;
+  Element? writeElement;
 
   @override
-  DartType readType;
+  DartType? readType;
 
   @override
-  DartType writeType;
+  DartType? writeType;
 }
 
 /// A conditional expression.
@@ -2191,21 +2161,21 @@
 class ConditionalExpressionImpl extends ExpressionImpl
     implements ConditionalExpression {
   /// The condition used to determine which of the expressions is executed next.
-  ExpressionImpl _condition;
+  late ExpressionImpl _condition;
 
   /// The token used to separate the condition from the then expression.
   @override
   Token question;
 
   /// The expression that is executed if the condition evaluates to `true`.
-  ExpressionImpl _thenExpression;
+  late ExpressionImpl _thenExpression;
 
   /// The token used to separate the then expression from the else expression.
   @override
   Token colon;
 
   /// The expression that is executed if the condition evaluates to `false`.
-  ExpressionImpl _elseExpression;
+  late ExpressionImpl _elseExpression;
 
   /// Initialize a newly created conditional expression.
   ConditionalExpressionImpl(
@@ -2261,14 +2231,14 @@
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) =>
+  E? accept<E>(AstVisitor<E> visitor) =>
       visitor.visitConditionalExpression(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _condition?.accept(visitor);
-    _thenExpression?.accept(visitor);
-    _elseExpression?.accept(visitor);
+    _condition.accept(visitor);
+    _thenExpression.accept(visitor);
+    _elseExpression.accept(visitor);
   }
 }
 
@@ -2289,27 +2259,27 @@
   @override
   Token leftParenthesis;
 
-  DottedNameImpl _name;
+  late DottedNameImpl _name;
 
   @override
-  Token equalToken;
+  Token? equalToken;
 
-  StringLiteralImpl _value;
+  StringLiteralImpl? _value;
 
   @override
   Token rightParenthesis;
 
-  StringLiteralImpl _uri;
+  late StringLiteralImpl _uri;
 
   @override
-  Source uriSource;
+  Source? uriSource;
 
   ConfigurationImpl(
       this.ifKeyword,
       this.leftParenthesis,
       DottedNameImpl name,
       this.equalToken,
-      StringLiteralImpl value,
+      StringLiteralImpl? value,
       this.rightParenthesis,
       StringLiteralImpl libraryUri) {
     _name = _becomeParentOf(name);
@@ -2350,21 +2320,21 @@
   }
 
   @override
-  StringLiteral get value => _value;
+  StringLiteral? get value => _value;
 
   @override
-  set value(StringLiteral value) {
+  set value(StringLiteral? value) {
     _value = _becomeParentOf(value as StringLiteralImpl);
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitConfiguration(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitConfiguration(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _name?.accept(visitor);
+    _name.accept(visitor);
     _value?.accept(visitor);
-    _uri?.accept(visitor);
+    _uri.accept(visitor);
   }
 }
 
@@ -2396,56 +2366,56 @@
   /// The token for the 'external' keyword, or `null` if the constructor is not
   /// external.
   @override
-  Token externalKeyword;
+  Token? externalKeyword;
 
   /// The token for the 'const' keyword, or `null` if the constructor is not a
   /// const constructor.
   @override
-  Token constKeyword;
+  Token? constKeyword;
 
   /// The token for the 'factory' keyword, or `null` if the constructor is not a
   /// factory constructor.
   @override
-  Token factoryKeyword;
+  Token? factoryKeyword;
 
   /// The type of object being created. This can be different than the type in
   /// which the constructor is being declared if the constructor is the
   /// implementation of a factory constructor.
-  IdentifierImpl _returnType;
+  late IdentifierImpl _returnType;
 
   /// The token for the period before the constructor name, or `null` if the
   /// constructor being declared is unnamed.
   @override
-  Token period;
+  Token? period;
 
   /// The name of the constructor, or `null` if the constructor being declared
   /// is unnamed.
-  SimpleIdentifierImpl _name;
+  SimpleIdentifierImpl? _name;
 
   /// The parameters associated with the constructor.
-  FormalParameterListImpl _parameters;
+  late FormalParameterListImpl _parameters;
 
   /// The token for the separator (colon or equals) before the initializer list
   /// or redirection, or `null` if there are no initializers.
   @override
-  Token separator;
+  Token? separator;
 
   /// The initializers associated with the constructor.
-  NodeList<ConstructorInitializer> _initializers;
+  late NodeList<ConstructorInitializer> _initializers;
 
   /// The name of the constructor to which this constructor will be redirected,
   /// or `null` if this is not a redirecting factory constructor.
-  ConstructorNameImpl _redirectedConstructor;
+  ConstructorNameImpl? _redirectedConstructor;
 
   /// The body of the constructor, or `null` if the constructor does not have a
   /// body.
-  FunctionBodyImpl _body;
+  FunctionBodyImpl? _body;
 
   /// The element associated with this constructor, or `null` if the AST
   /// structure has not been resolved or if this constructor could not be
   /// resolved.
   @override
-  ConstructorElement declaredElement;
+  ConstructorElement? declaredElement;
 
   /// Initialize a newly created constructor declaration. The [externalKeyword]
   /// can be `null` if the constructor is not external. Either or both of the
@@ -2461,19 +2431,19 @@
   /// does not redirect to a different constructor. The [body] can be `null` if
   /// the constructor does not have a body.
   ConstructorDeclarationImpl(
-      CommentImpl comment,
-      List<Annotation> metadata,
+      CommentImpl? comment,
+      List<Annotation>? metadata,
       this.externalKeyword,
       this.constKeyword,
       this.factoryKeyword,
       IdentifierImpl returnType,
       this.period,
-      SimpleIdentifierImpl name,
+      SimpleIdentifierImpl? name,
       FormalParameterListImpl parameters,
       this.separator,
-      List<ConstructorInitializer> initializers,
-      ConstructorNameImpl redirectedConstructor,
-      FunctionBodyImpl body)
+      List<ConstructorInitializer>? initializers,
+      ConstructorNameImpl? redirectedConstructor,
+      FunctionBodyImpl? body)
       : super(comment, metadata) {
     _returnType = _becomeParentOf(returnType);
     _name = _becomeParentOf(name);
@@ -2484,11 +2454,11 @@
   }
 
   @override
-  FunctionBody get body => _body;
+  FunctionBody? get body => _body;
 
   @override
-  set body(FunctionBody functionBody) {
-    _body = _becomeParentOf(functionBody as FunctionBodyImpl);
+  set body(FunctionBody? functionBody) {
+    _body = _becomeParentOf(functionBody as FunctionBodyImpl?);
   }
 
   @override
@@ -2508,16 +2478,16 @@
   @override
   Token get endToken {
     if (_body != null) {
-      return _body.endToken;
+      return _body!.endToken;
     } else if (_initializers.isNotEmpty) {
-      return _initializers.endToken;
+      return _initializers.endToken!;
     }
     return _parameters.endToken;
   }
 
   @override
   Token get firstTokenAfterCommentAndMetadata {
-    Token leftMost =
+    Token? leftMost =
         Token.lexicallyFirst([externalKeyword, constKeyword, factoryKeyword]);
     if (leftMost != null) {
       return leftMost;
@@ -2529,11 +2499,11 @@
   NodeList<ConstructorInitializer> get initializers => _initializers;
 
   @override
-  SimpleIdentifier get name => _name;
+  SimpleIdentifier? get name => _name;
 
   @override
-  set name(SimpleIdentifier identifier) {
-    _name = _becomeParentOf(identifier as SimpleIdentifierImpl);
+  set name(SimpleIdentifier? identifier) {
+    _name = _becomeParentOf(identifier as SimpleIdentifierImpl?);
   }
 
   @override
@@ -2545,10 +2515,10 @@
   }
 
   @override
-  ConstructorName get redirectedConstructor => _redirectedConstructor;
+  ConstructorName? get redirectedConstructor => _redirectedConstructor;
 
   @override
-  set redirectedConstructor(ConstructorName redirectedConstructor) {
+  set redirectedConstructor(ConstructorName? redirectedConstructor) {
     _redirectedConstructor =
         _becomeParentOf(redirectedConstructor as ConstructorNameImpl);
   }
@@ -2562,15 +2532,15 @@
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) =>
+  E? accept<E>(AstVisitor<E> visitor) =>
       visitor.visitConstructorDeclaration(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
-    _returnType?.accept(visitor);
+    _returnType.accept(visitor);
     _name?.accept(visitor);
-    _parameters?.accept(visitor);
+    _parameters.accept(visitor);
     _initializers.accept(visitor);
     _redirectedConstructor?.accept(visitor);
     _body?.accept(visitor);
@@ -2585,22 +2555,22 @@
     implements ConstructorFieldInitializer {
   /// The token for the 'this' keyword, or `null` if there is no 'this' keyword.
   @override
-  Token thisKeyword;
+  Token? thisKeyword;
 
   /// The token for the period after the 'this' keyword, or `null` if there is
-  /// no'this' keyword.
+  /// no 'this' keyword.
   @override
-  Token period;
+  Token? period;
 
   /// The name of the field being initialized.
-  SimpleIdentifierImpl _fieldName;
+  late SimpleIdentifierImpl _fieldName;
 
   /// The token for the equal sign between the field name and the expression.
   @override
   Token equals;
 
   /// The expression computing the value to which the field will be initialized.
-  ExpressionImpl _expression;
+  late ExpressionImpl _expression;
 
   /// Initialize a newly created field initializer to initialize the field with
   /// the given name to the value of the given expression. The [thisKeyword] and
@@ -2614,7 +2584,7 @@
   @override
   Token get beginToken {
     if (thisKeyword != null) {
-      return thisKeyword;
+      return thisKeyword!;
     }
     return _fieldName.beginToken;
   }
@@ -2647,13 +2617,13 @@
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) =>
+  E? accept<E>(AstVisitor<E> visitor) =>
       visitor.visitConstructorFieldInitializer(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _fieldName?.accept(visitor);
-    _expression?.accept(visitor);
+    _fieldName.accept(visitor);
+    _expression.accept(visitor);
   }
 }
 
@@ -2672,27 +2642,27 @@
 ///        type ('.' identifier)?
 class ConstructorNameImpl extends AstNodeImpl implements ConstructorName {
   /// The name of the type defining the constructor.
-  TypeNameImpl _type;
+  late TypeNameImpl _type;
 
   /// The token for the period before the constructor name, or `null` if the
   /// specified constructor is the unnamed constructor.
   @override
-  Token period;
+  Token? period;
 
   /// The name of the constructor, or `null` if the specified constructor is the
   /// unnamed constructor.
-  SimpleIdentifierImpl _name;
+  SimpleIdentifierImpl? _name;
 
   /// The element associated with this constructor name based on static type
   /// information, or `null` if the AST structure has not been resolved or if
   /// this constructor name could not be resolved.
   @override
-  ConstructorElement staticElement;
+  ConstructorElement? staticElement;
 
   /// Initialize a newly created constructor name. The [period] and [name] can
   /// be`null` if the constructor being named is the unnamed constructor.
   ConstructorNameImpl(
-      TypeNameImpl type, this.period, SimpleIdentifierImpl name) {
+      TypeNameImpl type, this.period, SimpleIdentifierImpl? name) {
     _type = _becomeParentOf(type);
     _name = _becomeParentOf(name);
   }
@@ -2707,17 +2677,17 @@
   @override
   Token get endToken {
     if (_name != null) {
-      return _name.endToken;
+      return _name!.endToken;
     }
     return _type.endToken;
   }
 
   @override
-  SimpleIdentifier get name => _name;
+  SimpleIdentifier? get name => _name;
 
   @override
-  set name(SimpleIdentifier name) {
-    _name = _becomeParentOf(name as SimpleIdentifierImpl);
+  set name(SimpleIdentifier? name) {
+    _name = _becomeParentOf(name as SimpleIdentifierImpl?);
   }
 
   @override
@@ -2729,11 +2699,11 @@
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitConstructorName(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitConstructorName(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _type?.accept(visitor);
+    _type.accept(visitor);
     _name?.accept(visitor);
   }
 }
@@ -2748,7 +2718,7 @@
   Token continueKeyword;
 
   /// The label associated with the statement, or `null` if there is no label.
-  SimpleIdentifierImpl _label;
+  SimpleIdentifierImpl? _label;
 
   /// The semicolon terminating the statement.
   @override
@@ -2761,12 +2731,12 @@
   /// Note that if the source code has errors, the target may be invalid (e.g.
   /// the target may be in an enclosing function).
   @override
-  AstNode target;
+  AstNode? target;
 
   /// Initialize a newly created continue statement. The [label] can be `null`
   /// if there is no label associated with the statement.
   ContinueStatementImpl(
-      this.continueKeyword, SimpleIdentifierImpl label, this.semicolon) {
+      this.continueKeyword, SimpleIdentifierImpl? label, this.semicolon) {
     _label = _becomeParentOf(label);
   }
 
@@ -2781,15 +2751,15 @@
   Token get endToken => semicolon;
 
   @override
-  SimpleIdentifier get label => _label;
+  SimpleIdentifier? get label => _label;
 
   @override
-  set label(SimpleIdentifier identifier) {
-    _label = _becomeParentOf(identifier as SimpleIdentifierImpl);
+  set label(SimpleIdentifier? identifier) {
+    _label = _becomeParentOf(identifier as SimpleIdentifierImpl?);
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitContinueStatement(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitContinueStatement(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -2804,7 +2774,7 @@
   /// Initialize a newly created declaration. Either or both of the [comment]
   /// and [metadata] can be `null` if the declaration does not have the
   /// corresponding attribute.
-  DeclarationImpl(CommentImpl comment, List<Annotation> metadata)
+  DeclarationImpl(CommentImpl? comment, List<Annotation>? metadata)
       : super(comment, metadata);
 }
 
@@ -2817,21 +2787,21 @@
   /// The token representing either the 'final', 'const' or 'var' keyword, or
   /// `null` if no keyword was used.
   @override
-  Token keyword;
+  Token? keyword;
 
   /// The name of the declared type of the parameter, or `null` if the parameter
   /// does not have a declared type.
-  TypeAnnotationImpl _type;
+  TypeAnnotationImpl? _type;
 
   /// The name of the variable being declared.
-  SimpleIdentifierImpl _identifier;
+  late SimpleIdentifierImpl _identifier;
 
   /// Initialize a newly created formal parameter. Either or both of the
   /// [comment] and [metadata] can be `null` if the declaration does not have
   /// the corresponding attribute. The [keyword] can be `null` if a type name is
   /// given. The [type] must be `null` if the keyword is 'var'.
-  DeclaredIdentifierImpl(CommentImpl comment, List<Annotation> metadata,
-      this.keyword, TypeAnnotationImpl type, SimpleIdentifierImpl identifier)
+  DeclaredIdentifierImpl(CommentImpl? comment, List<Annotation>? metadata,
+      this.keyword, TypeAnnotationImpl? type, SimpleIdentifierImpl identifier)
       : super(comment, metadata) {
     _type = _becomeParentOf(type);
     _identifier = _becomeParentOf(identifier);
@@ -2842,10 +2812,7 @@
       super._childEntities..add(keyword)..add(_type)..add(_identifier);
 
   @override
-  LocalVariableElement get declaredElement {
-    if (_identifier == null) {
-      return null;
-    }
+  LocalVariableElement? get declaredElement {
     return _identifier.staticElement as LocalVariableElement;
   }
 
@@ -2855,9 +2822,9 @@
   @override
   Token get firstTokenAfterCommentAndMetadata {
     if (keyword != null) {
-      return keyword;
+      return keyword!;
     } else if (_type != null) {
-      return _type.beginToken;
+      return _type!.beginToken;
     }
     return _identifier.beginToken;
   }
@@ -2877,21 +2844,21 @@
   bool get isFinal => keyword?.keyword == Keyword.FINAL;
 
   @override
-  TypeAnnotation get type => _type;
+  TypeAnnotation? get type => _type;
 
   @override
-  set type(TypeAnnotation type) {
-    _type = _becomeParentOf(type as TypeAnnotationImpl);
+  set type(TypeAnnotation? type) {
+    _type = _becomeParentOf(type as TypeAnnotationImpl?);
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitDeclaredIdentifier(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitDeclaredIdentifier(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     _type?.accept(visitor);
-    _identifier?.accept(visitor);
+    _identifier.accept(visitor);
   }
 }
 
@@ -2923,7 +2890,7 @@
 class DefaultFormalParameterImpl extends FormalParameterImpl
     implements DefaultFormalParameter {
   /// The formal parameter with which the default value is associated.
-  NormalFormalParameterImpl _parameter;
+  late NormalFormalParameterImpl _parameter;
 
   /// The kind of this parameter.
   @override
@@ -2932,16 +2899,16 @@
   /// The token separating the parameter from the default value, or `null` if
   /// there is no default value.
   @override
-  Token separator;
+  Token? separator;
 
   /// The expression computing the default value for the parameter, or `null` if
   /// there is no default value.
-  ExpressionImpl _defaultValue;
+  ExpressionImpl? _defaultValue;
 
   /// Initialize a newly created default formal parameter. The [separator] and
   /// [defaultValue] can be `null` if there is no default value.
   DefaultFormalParameterImpl(NormalFormalParameterImpl parameter, this.kind,
-      this.separator, ExpressionImpl defaultValue) {
+      this.separator, ExpressionImpl? defaultValue) {
     _parameter = _becomeParentOf(parameter);
     _defaultValue = _becomeParentOf(defaultValue);
   }
@@ -2954,35 +2921,35 @@
       ChildEntities()..add(_parameter)..add(separator)..add(_defaultValue);
 
   @override
-  Token get covariantKeyword => null;
+  Token? get covariantKeyword => null;
 
   @override
-  ParameterElement get declaredElement => _parameter.declaredElement;
+  ParameterElement? get declaredElement => _parameter.declaredElement;
 
   @override
-  Expression get defaultValue => _defaultValue;
+  Expression? get defaultValue => _defaultValue;
 
   @override
-  set defaultValue(Expression expression) {
-    _defaultValue = _becomeParentOf(expression as ExpressionImpl);
+  set defaultValue(Expression? expression) {
+    _defaultValue = _becomeParentOf(expression as ExpressionImpl?);
   }
 
   @override
   Token get endToken {
     if (_defaultValue != null) {
-      return _defaultValue.endToken;
+      return _defaultValue!.endToken;
     }
     return _parameter.endToken;
   }
 
   @override
-  SimpleIdentifier get identifier => _parameter.identifier;
+  SimpleIdentifier? get identifier => _parameter.identifier;
 
   @override
-  bool get isConst => _parameter != null && _parameter.isConst;
+  bool get isConst => _parameter.isConst;
 
   @override
-  bool get isFinal => _parameter != null && _parameter.isFinal;
+  bool get isFinal => _parameter.isFinal;
 
   @override
   NodeList<Annotation> get metadata => _parameter.metadata;
@@ -2996,15 +2963,15 @@
   }
 
   @override
-  Token get requiredKeyword => null;
+  Token? get requiredKeyword => null;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) =>
+  E? accept<E>(AstVisitor<E> visitor) =>
       visitor.visitDefaultFormalParameter(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _parameter?.accept(visitor);
+    _parameter.accept(visitor);
     _defaultValue?.accept(visitor);
   }
 }
@@ -3020,20 +2987,20 @@
 abstract class DirectiveImpl extends AnnotatedNodeImpl implements Directive {
   /// The element associated with this directive, or `null` if the AST structure
   /// has not been resolved or if this directive could not be resolved.
-  Element _element;
+  Element? _element;
 
   /// Initialize a newly create directive. Either or both of the [comment] and
   /// [metadata] can be `null` if the directive does not have the corresponding
   /// attribute.
-  DirectiveImpl(CommentImpl comment, List<Annotation> metadata)
+  DirectiveImpl(CommentImpl? comment, List<Annotation>? metadata)
       : super(comment, metadata);
 
   @override
-  Element get element => _element;
+  Element? get element => _element;
 
   /// Set the element associated with this directive to be the given [element].
   @override
-  set element(Element element) {
+  set element(Element? element) {
     _element = element;
   }
 }
@@ -3048,7 +3015,7 @@
   Token doKeyword;
 
   /// The body of the loop.
-  StatementImpl _body;
+  late StatementImpl _body;
 
   /// The token representing the 'while' keyword.
   @override
@@ -3059,7 +3026,7 @@
   Token leftParenthesis;
 
   /// The condition that determines when the loop will terminate.
-  ExpressionImpl _condition;
+  late ExpressionImpl _condition;
 
   /// The right parenthesis.
   @override
@@ -3115,12 +3082,12 @@
   Token get endToken => semicolon;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitDoStatement(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitDoStatement(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _body?.accept(visitor);
-    _condition?.accept(visitor);
+    _body.accept(visitor);
+    _condition.accept(visitor);
   }
 }
 
@@ -3130,7 +3097,7 @@
 ///        [SimpleIdentifier] ('.' [SimpleIdentifier])*
 class DottedNameImpl extends AstNodeImpl implements DottedName {
   /// The components of the identifier.
-  NodeList<SimpleIdentifier> _components;
+  late NodeList<SimpleIdentifier> _components;
 
   /// Initialize a newly created dotted name.
   DottedNameImpl(List<SimpleIdentifier> components) {
@@ -3138,7 +3105,7 @@
   }
 
   @override
-  Token get beginToken => _components.beginToken;
+  Token get beginToken => _components.beginToken!;
 
   @override
   // TODO(paulberry): add "." tokens.
@@ -3149,10 +3116,10 @@
   NodeList<SimpleIdentifier> get components => _components;
 
   @override
-  Token get endToken => _components.endToken;
+  Token get endToken => _components.endToken!;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitDottedName(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitDottedName(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -3190,7 +3157,7 @@
   Token get endToken => literal;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitDoubleLiteral(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitDoubleLiteral(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -3224,7 +3191,7 @@
   Token get endToken => semicolon;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitEmptyFunctionBody(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitEmptyFunctionBody(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -3258,7 +3225,7 @@
   bool get isSynthetic => semicolon.isSynthetic;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitEmptyStatement(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitEmptyStatement(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -3271,14 +3238,14 @@
     with HasAstLinkedContext
     implements EnumConstantDeclaration {
   /// The name of the constant.
-  SimpleIdentifierImpl _name;
+  late SimpleIdentifierImpl _name;
 
   /// Initialize a newly created enum constant declaration. Either or both of
   /// the [comment] and [metadata] can be `null` if the constant does not have
   /// the corresponding attribute. (Technically, enum constants cannot have
   /// metadata, but we allow it for consistency.)
-  EnumConstantDeclarationImpl(
-      CommentImpl comment, List<Annotation> metadata, SimpleIdentifierImpl name)
+  EnumConstantDeclarationImpl(CommentImpl? comment, List<Annotation>? metadata,
+      SimpleIdentifierImpl name)
       : super(comment, metadata) {
     _name = _becomeParentOf(name);
   }
@@ -3288,7 +3255,7 @@
       super._childEntities..add(_name);
 
   @override
-  FieldElement get declaredElement => _name?.staticElement as FieldElement;
+  FieldElement get declaredElement => _name.staticElement as FieldElement;
 
   @override
   Token get endToken => _name.endToken;
@@ -3305,13 +3272,13 @@
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) =>
+  E? accept<E>(AstVisitor<E> visitor) =>
       visitor.visitEnumConstantDeclaration(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
-    _name?.accept(visitor);
+    _name.accept(visitor);
   }
 }
 
@@ -3332,7 +3299,7 @@
   Token leftBracket;
 
   /// The enumeration constants being declared.
-  NodeList<EnumConstantDeclaration> _constants;
+  late NodeList<EnumConstantDeclaration> _constants;
 
   /// The right curly bracket.
   @override
@@ -3343,8 +3310,8 @@
   /// the corresponding attribute. The list of [constants] must contain at least
   /// one value.
   EnumDeclarationImpl(
-      CommentImpl comment,
-      List<Annotation> metadata,
+      CommentImpl? comment,
+      List<Annotation>? metadata,
       this.enumKeyword,
       SimpleIdentifierImpl name,
       this.leftBracket,
@@ -3367,7 +3334,7 @@
   NodeList<EnumConstantDeclaration> get constants => _constants;
 
   @override
-  ClassElement get declaredElement => _name?.staticElement as ClassElement;
+  ClassElement? get declaredElement => _name.staticElement as ClassElement?;
 
   @override
   Token get endToken => rightBracket;
@@ -3376,12 +3343,12 @@
   Token get firstTokenAfterCommentAndMetadata => enumKeyword;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitEnumDeclaration(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitEnumDeclaration(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
-    _name?.accept(visitor);
+    _name.accept(visitor);
     _constants.accept(visitor);
   }
 }
@@ -3407,12 +3374,12 @@
   /// corresponding attribute. The list of [combinators] can be `null` if there
   /// are no combinators.
   ExportDirectiveImpl(
-      CommentImpl comment,
-      List<Annotation> metadata,
+      CommentImpl? comment,
+      List<Annotation>? metadata,
       Token keyword,
       StringLiteralImpl libraryUri,
-      List<Configuration> configurations,
-      List<Combinator> combinators,
+      List<Configuration>? configurations,
+      List<Combinator>? combinators,
       Token semicolon)
       : super(comment, metadata, keyword, libraryUri, configurations,
             combinators, semicolon);
@@ -3425,18 +3392,15 @@
     ..add(semicolon);
 
   @override
-  ExportElement get element => super.element as ExportElement;
+  ExportElement? get element => super.element as ExportElement?;
 
   @override
-  LibraryElement get uriElement {
-    if (element != null) {
-      return element.exportedLibrary;
-    }
-    return null;
+  LibraryElement? get uriElement {
+    return element?.exportedLibrary;
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitExportDirective(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitExportDirective(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -3455,7 +3419,7 @@
   /// The token representing the 'async' keyword, or `null` if there is no such
   /// keyword.
   @override
-  Token keyword;
+  Token? keyword;
 
   /// The token introducing the expression that represents the body of the
   /// function.
@@ -3463,11 +3427,11 @@
   Token functionDefinition;
 
   /// The expression representing the body of the function.
-  ExpressionImpl _expression;
+  late ExpressionImpl _expression;
 
   /// The semicolon terminating the statement.
   @override
-  Token semicolon;
+  Token? semicolon;
 
   /// Initialize a newly created function body consisting of a block of
   /// statements. The [keyword] can be `null` if the function body is not an
@@ -3480,7 +3444,7 @@
   @override
   Token get beginToken {
     if (keyword != null) {
-      return keyword;
+      return keyword!;
     }
     return functionDefinition;
   }
@@ -3495,7 +3459,7 @@
   @override
   Token get endToken {
     if (semicolon != null) {
-      return semicolon;
+      return semicolon!;
     }
     return _expression.endToken;
   }
@@ -3515,12 +3479,12 @@
   bool get isSynchronous => keyword == null;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) =>
+  E? accept<E>(AstVisitor<E> visitor) =>
       visitor.visitExpressionFunctionBody(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _expression?.accept(visitor);
+    _expression.accept(visitor);
   }
 }
 
@@ -3535,7 +3499,7 @@
   /// The static type of this expression, or `null` if the AST structure has not
   /// been resolved.
   @override
-  DartType staticType;
+  DartType? staticType;
 
   /// An expression _e_ is said to _occur in a constant context_,
   /// * if _e_ is an element of a constant list literal, or a key or value of an
@@ -3566,7 +3530,7 @@
         child is SpreadElement ||
         child is IfElement ||
         child is ForElement) {
-      AstNode parent = child.parent;
+      var parent = child.parent;
       if (parent is TypedLiteralImpl && parent.constKeyword != null) {
         // Inside an explicitly `const` list or map literal.
         return true;
@@ -3578,13 +3542,15 @@
         // Inside an annotation.
         return true;
       } else if (parent is VariableDeclaration) {
-        AstNode grandParent = parent.parent;
+        var grandParent = parent.parent;
         // Inside the initializer for a `const` variable declaration.
         return grandParent is VariableDeclarationList &&
             grandParent.keyword?.keyword == Keyword.CONST;
       } else if (parent is SwitchCase) {
         // Inside a switch case.
         return true;
+      } else if (parent == null) {
+        break;
       }
       child = parent;
     }
@@ -3595,8 +3561,8 @@
   bool get isAssignable => false;
 
   @override
-  ParameterElement get staticParameterElement {
-    AstNode parent = this.parent;
+  ParameterElement? get staticParameterElement {
+    var parent = this.parent;
     if (parent is ArgumentListImpl) {
       return parent._getStaticParameterElementFor(this);
     } else if (parent is IndexExpressionImpl) {
@@ -3634,12 +3600,12 @@
 class ExpressionStatementImpl extends StatementImpl
     implements ExpressionStatement {
   /// The expression that comprises the statement.
-  ExpressionImpl _expression;
+  late ExpressionImpl _expression;
 
   /// The semicolon terminating the statement, or `null` if the expression is a
   /// function expression and therefore isn't followed by a semicolon.
   @override
-  Token semicolon;
+  Token? semicolon;
 
   /// Initialize a newly created expression statement.
   ExpressionStatementImpl(ExpressionImpl expression, this.semicolon) {
@@ -3656,7 +3622,7 @@
   @override
   Token get endToken {
     if (semicolon != null) {
-      return semicolon;
+      return semicolon!;
     }
     return _expression.endToken;
   }
@@ -3670,14 +3636,15 @@
   }
 
   @override
-  bool get isSynthetic => _expression.isSynthetic && semicolon.isSynthetic;
+  bool get isSynthetic =>
+      _expression.isSynthetic && (semicolon == null || semicolon!.isSynthetic);
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitExpressionStatement(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitExpressionStatement(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _expression?.accept(visitor);
+    _expression.accept(visitor);
   }
 }
 
@@ -3691,7 +3658,7 @@
   Token extendsKeyword;
 
   /// The name of the class that is being extended.
-  TypeNameImpl _superclass;
+  late TypeNameImpl _superclass;
 
   /// Initialize a newly created extends clause.
   ExtendsClauseImpl(this.extendsKeyword, TypeNameImpl superclass) {
@@ -3717,11 +3684,11 @@
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitExtendsClause(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitExtendsClause(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _superclass?.accept(visitor);
+    _superclass.accept(visitor);
   }
 }
 
@@ -3740,35 +3707,35 @@
 
   /// The name of the extension, or `null` if the extension does not have a
   /// name.
-  SimpleIdentifierImpl _name;
+  SimpleIdentifierImpl? _name;
 
   /// The type parameters for the extension, or `null` if the extension does not
   /// have any type parameters.
-  TypeParameterListImpl _typeParameters;
+  TypeParameterListImpl? _typeParameters;
 
   @override
   Token onKeyword;
 
   /// The type that is being extended.
-  TypeAnnotationImpl _extendedType;
+  late TypeAnnotationImpl _extendedType;
 
   @override
   Token leftBracket;
 
   /// The members being added to the extended class.
-  NodeList<ClassMember> _members;
+  late NodeList<ClassMember> _members;
 
   @override
   Token rightBracket;
 
-  ExtensionElement _declaredElement;
+  ExtensionElement? _declaredElement;
 
   ExtensionDeclarationImpl(
-      CommentImpl comment,
-      List<Annotation> metadata,
+      CommentImpl? comment,
+      List<Annotation>? metadata,
       this.extensionKeyword,
-      SimpleIdentifierImpl name,
-      TypeParameterListImpl typeParameters,
+      SimpleIdentifierImpl? name,
+      TypeParameterListImpl? typeParameters,
       this.onKeyword,
       TypeAnnotationImpl extendedType,
       this.leftBracket,
@@ -3793,10 +3760,10 @@
     ..add(rightBracket);
 
   @override
-  ExtensionElement get declaredElement => _declaredElement;
+  ExtensionElement? get declaredElement => _declaredElement;
 
   /// Set the element declared by this declaration to the given [element].
-  set declaredElement(ExtensionElement element) {
+  set declaredElement(ExtensionElement? element) {
     _declaredElement = element;
   }
 
@@ -3817,28 +3784,29 @@
   NodeList<ClassMember> get members => _members;
 
   @override
-  SimpleIdentifier get name => _name;
+  SimpleIdentifier? get name => _name;
 
-  set name(SimpleIdentifier identifier) {
-    _name = _becomeParentOf(identifier as SimpleIdentifierImpl);
+  set name(SimpleIdentifier? identifier) {
+    _name = _becomeParentOf(identifier as SimpleIdentifierImpl?);
   }
 
   @override
-  TypeParameterList get typeParameters => _typeParameters;
+  TypeParameterList? get typeParameters => _typeParameters;
 
-  set typeParameters(TypeParameterList typeParameters) {
-    _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl);
+  set typeParameters(TypeParameterList? typeParameters) {
+    _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl?);
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitExtensionDeclaration(this);
+  E? accept<E>(AstVisitor<E> visitor) =>
+      visitor.visitExtensionDeclaration(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     name?.accept(visitor);
     _typeParameters?.accept(visitor);
-    _extendedType?.accept(visitor);
+    _extendedType.accept(visitor);
     _members.accept(visitor);
   }
 }
@@ -3852,23 +3820,23 @@
     implements ExtensionOverride {
   /// The list of arguments to the override. In valid code this will contain a
   /// single argument, which evaluates to the object being extended.
-  ArgumentListImpl _argumentList;
+  late ArgumentListImpl _argumentList;
 
   /// The name of the extension being selected.
-  IdentifierImpl _extensionName;
+  late IdentifierImpl _extensionName;
 
   /// The type arguments to be applied to the extension, or `null` if no type
   /// arguments were provided.
-  TypeArgumentListImpl _typeArguments;
+  TypeArgumentListImpl? _typeArguments;
 
   @override
-  List<DartType> typeArgumentTypes;
+  List<DartType>? typeArgumentTypes;
 
   @override
-  DartType extendedType;
+  DartType? extendedType;
 
   ExtensionOverrideImpl(IdentifierImpl extensionName,
-      TypeArgumentListImpl typeArguments, ArgumentListImpl argumentList) {
+      TypeArgumentListImpl? typeArguments, ArgumentListImpl argumentList) {
     _extensionName = _becomeParentOf(extensionName);
     _typeArguments = _becomeParentOf(typeArguments);
     _argumentList = _becomeParentOf(argumentList);
@@ -3882,7 +3850,7 @@
   }
 
   @override
-  Token get beginToken => _extensionName?.beginToken;
+  Token get beginToken => _extensionName.beginToken;
 
   @override
   Iterable<SyntacticEntity> get childEntities => ChildEntities()
@@ -3902,7 +3870,7 @@
 
   @override
   bool get isNullAware {
-    var nextType = argumentList.endToken.next.type;
+    var nextType = argumentList.endToken.next!.type;
     return nextType == TokenType.QUESTION_PERIOD ||
         nextType == TokenType.QUESTION;
   }
@@ -3911,25 +3879,27 @@
   Precedence get precedence => Precedence.postfix;
 
   @override
-  ExtensionElement get staticElement => extensionName.staticElement;
-
-  @override
-  TypeArgumentList get typeArguments => _typeArguments;
-
-  set typeArguments(TypeArgumentList typeArguments) {
-    _typeArguments = _becomeParentOf(typeArguments as TypeArgumentListImpl);
+  ExtensionElement? get staticElement {
+    return extensionName.staticElement as ExtensionElement?;
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) {
+  TypeArgumentList? get typeArguments => _typeArguments;
+
+  set typeArguments(TypeArgumentList? typeArguments) {
+    _typeArguments = _becomeParentOf(typeArguments as TypeArgumentListImpl?);
+  }
+
+  @override
+  E? accept<E>(AstVisitor<E> visitor) {
     return visitor.visitExtensionOverride(this);
   }
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _extensionName?.accept(visitor);
+    _extensionName.accept(visitor);
     _typeArguments?.accept(visitor);
-    _argumentList?.accept(visitor);
+    _argumentList.accept(visitor);
   }
 }
 
@@ -3941,22 +3911,22 @@
     with HasAstLinkedContext
     implements FieldDeclaration {
   @override
-  Token abstractKeyword;
+  Token? abstractKeyword;
 
   /// The 'covariant' keyword, or `null` if the keyword was not used.
   @override
-  Token covariantKeyword;
+  Token? covariantKeyword;
 
   @override
-  Token externalKeyword;
+  Token? externalKeyword;
 
   /// The token representing the 'static' keyword, or `null` if the fields are
   /// not static.
   @override
-  Token staticKeyword;
+  Token? staticKeyword;
 
   /// The fields being declared.
-  VariableDeclarationListImpl _fieldList;
+  late VariableDeclarationListImpl _fieldList;
 
   /// The semicolon terminating the declaration.
   @override
@@ -3967,8 +3937,8 @@
   /// the corresponding attribute. The [staticKeyword] can be `null` if the
   /// field is not a static field.
   FieldDeclarationImpl(
-      CommentImpl comment,
-      List<Annotation> metadata,
+      CommentImpl? comment,
+      List<Annotation>? metadata,
       this.abstractKeyword,
       this.covariantKeyword,
       this.externalKeyword,
@@ -3984,7 +3954,7 @@
       super._childEntities..add(staticKeyword)..add(_fieldList)..add(semicolon);
 
   @override
-  Element get declaredElement => null;
+  Element? get declaredElement => null;
 
   @override
   Token get endToken => semicolon;
@@ -4000,13 +3970,13 @@
   @override
   Token get firstTokenAfterCommentAndMetadata {
     if (abstractKeyword != null) {
-      return abstractKeyword;
+      return abstractKeyword!;
     } else if (externalKeyword != null) {
-      return externalKeyword;
+      return externalKeyword!;
     } else if (covariantKeyword != null) {
-      return covariantKeyword;
+      return covariantKeyword!;
     } else if (staticKeyword != null) {
-      return staticKeyword;
+      return staticKeyword!;
     }
     return _fieldList.beginToken;
   }
@@ -4015,12 +3985,12 @@
   bool get isStatic => staticKeyword != null;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitFieldDeclaration(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitFieldDeclaration(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
-    _fieldList?.accept(visitor);
+    _fieldList.accept(visitor);
   }
 }
 
@@ -4035,11 +4005,11 @@
   /// The token representing either the 'final', 'const' or 'var' keyword, or
   /// `null` if no keyword was used.
   @override
-  Token keyword;
+  Token? keyword;
 
   /// The name of the declared type of the parameter, or `null` if the parameter
   /// does not have a declared type.
-  TypeAnnotationImpl _type;
+  TypeAnnotationImpl? _type;
 
   /// The token representing the 'this' keyword.
   @override
@@ -4051,14 +4021,14 @@
 
   /// The type parameters associated with the method, or `null` if the method is
   /// not a generic method.
-  TypeParameterListImpl _typeParameters;
+  TypeParameterListImpl? _typeParameters;
 
   /// The parameters of the function-typed parameter, or `null` if this is not a
   /// function-typed field formal parameter.
-  FormalParameterListImpl _parameters;
+  FormalParameterListImpl? _parameters;
 
   @override
-  Token question;
+  Token? question;
 
   /// Initialize a newly created formal parameter. Either or both of the
   /// [comment] and [metadata] can be `null` if the parameter does not have the
@@ -4068,17 +4038,17 @@
   /// [parameters] can be `null` if this is not a function-typed field formal
   /// parameter.
   FieldFormalParameterImpl(
-      CommentImpl comment,
-      List<Annotation> metadata,
-      Token covariantKeyword,
-      Token requiredKeyword,
+      CommentImpl? comment,
+      List<Annotation>? metadata,
+      Token? covariantKeyword,
+      Token? requiredKeyword,
       this.keyword,
-      TypeAnnotationImpl type,
+      TypeAnnotationImpl? type,
       this.thisKeyword,
       this.period,
       SimpleIdentifierImpl identifier,
-      TypeParameterListImpl typeParameters,
-      FormalParameterListImpl parameters,
+      TypeParameterListImpl? typeParameters,
+      FormalParameterListImpl? parameters,
       this.question)
       : super(
             comment, metadata, covariantKeyword, requiredKeyword, identifier) {
@@ -4091,15 +4061,15 @@
   Token get beginToken {
     NodeList<Annotation> metadata = this.metadata;
     if (metadata.isNotEmpty) {
-      return metadata.beginToken;
+      return metadata.beginToken!;
     } else if (requiredKeyword != null) {
-      return requiredKeyword;
+      return requiredKeyword!;
     } else if (covariantKeyword != null) {
-      return covariantKeyword;
+      return covariantKeyword!;
     } else if (keyword != null) {
-      return keyword;
+      return keyword!;
     } else if (_type != null) {
-      return _type.beginToken;
+      return _type!.beginToken;
     }
     return thisKeyword;
   }
@@ -4119,43 +4089,47 @@
   }
 
   @override
+  SimpleIdentifier get identifier => super.identifier!;
+
+  @override
   bool get isConst => keyword?.keyword == Keyword.CONST;
 
   @override
   bool get isFinal => keyword?.keyword == Keyword.FINAL;
 
   @override
-  FormalParameterList get parameters => _parameters;
+  FormalParameterList? get parameters => _parameters;
 
   @override
-  set parameters(FormalParameterList parameters) {
-    _parameters = _becomeParentOf(parameters as FormalParameterListImpl);
+  set parameters(FormalParameterList? parameters) {
+    _parameters = _becomeParentOf(parameters as FormalParameterListImpl?);
   }
 
   @override
-  TypeAnnotation get type => _type;
+  TypeAnnotation? get type => _type;
 
   @override
-  set type(TypeAnnotation type) {
+  set type(TypeAnnotation? type) {
     _type = _becomeParentOf(type as TypeAnnotationImpl);
   }
 
   @override
-  TypeParameterList get typeParameters => _typeParameters;
+  TypeParameterList? get typeParameters => _typeParameters;
 
   @override
-  set typeParameters(TypeParameterList typeParameters) {
-    _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl);
+  set typeParameters(TypeParameterList? typeParameters) {
+    _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl?);
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitFieldFormalParameter(this);
+  E? accept<E>(AstVisitor<E> visitor) =>
+      visitor.visitFieldFormalParameter(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     _type?.accept(visitor);
-    identifier?.accept(visitor);
+    identifier.accept(visitor);
     _typeParameters?.accept(visitor);
     _parameters?.accept(visitor);
   }
@@ -4167,7 +4141,7 @@
   Token inKeyword;
 
   /// The expression evaluated to produce the iterator.
-  ExpressionImpl _iterable;
+  late ExpressionImpl _iterable;
 
   /// Initialize a newly created for-each statement whose loop control variable
   /// is declared internally (in the for-loop part). The [awaitKeyword] can be
@@ -4195,14 +4169,14 @@
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _iterable?.accept(visitor);
+    _iterable.accept(visitor);
   }
 }
 
 class ForEachPartsWithDeclarationImpl extends ForEachPartsImpl
     implements ForEachPartsWithDeclaration {
   /// The declaration of the loop variable.
-  DeclaredIdentifierImpl _loopVariable;
+  late DeclaredIdentifierImpl _loopVariable;
 
   /// Initialize a newly created for-each statement whose loop control variable
   /// is declared internally (inside the for-loop part).
@@ -4228,12 +4202,12 @@
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) =>
+  E? accept<E>(AstVisitor<E> visitor) =>
       visitor.visitForEachPartsWithDeclaration(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _loopVariable?.accept(visitor);
+    _loopVariable.accept(visitor);
     super.visitChildren(visitor);
   }
 }
@@ -4241,7 +4215,7 @@
 class ForEachPartsWithIdentifierImpl extends ForEachPartsImpl
     implements ForEachPartsWithIdentifier {
   /// The loop variable.
-  SimpleIdentifierImpl _identifier;
+  late SimpleIdentifierImpl _identifier;
 
   /// Initialize a newly created for-each statement whose loop control variable
   /// is declared externally (outside the for-loop part).
@@ -4267,13 +4241,13 @@
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) =>
+  E? accept<E>(AstVisitor<E> visitor) =>
       visitor.visitForEachPartsWithIdentifier(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _identifier?.accept(visitor);
-    _iterable?.accept(visitor);
+    _identifier.accept(visitor);
+    _iterable.accept(visitor);
   }
 }
 
@@ -4281,11 +4255,11 @@
     with ForMixin
     implements ForElement {
   /// The body of the loop.
-  CollectionElementImpl _body;
+  late CollectionElementImpl _body;
 
   /// Initialize a newly created for element.
   ForElementImpl(
-      Token awaitKeyword,
+      Token? awaitKeyword,
       Token forKeyword,
       Token leftParenthesis,
       ForLoopPartsImpl forLoopParts,
@@ -4315,12 +4289,12 @@
   Token get endToken => _body.endToken;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitForElement(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitForElement(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _forLoopParts?.accept(visitor);
-    _body?.accept(visitor);
+    _forLoopParts.accept(visitor);
+    _body.accept(visitor);
   }
 }
 
@@ -4336,15 +4310,15 @@
   /// Data that is read during loading this node from summary, but is not
   /// fully applied yet. For example in many cases we don't need the
   /// documentation comment, and it is expensive to decode strings.
-  Object summaryData;
+  Object? summaryData;
 
   @override
-  ParameterElement get declaredElement {
-    SimpleIdentifier identifier = this.identifier;
+  ParameterElement? get declaredElement {
+    var identifier = this.identifier;
     if (identifier == null) {
       return null;
     }
-    return identifier.staticElement as ParameterElement;
+    return identifier.staticElement as ParameterElement?;
   }
 
   @override
@@ -4383,7 +4357,7 @@
     } else if (node is SimpleFormalParameterImpl) {
       node.declaredElement = element;
     } else {
-      node.identifier.staticElement = element;
+      node.identifier!.staticElement = element;
     }
   }
 }
@@ -4421,17 +4395,17 @@
   Token leftParenthesis;
 
   /// The parameters associated with the method.
-  NodeList<FormalParameter> _parameters;
+  late NodeList<FormalParameter> _parameters;
 
   /// The left square bracket ('[') or left curly brace ('{') introducing the
   /// optional parameters, or `null` if there are no optional parameters.
   @override
-  Token leftDelimiter;
+  Token? leftDelimiter;
 
   /// The right square bracket (']') or right curly brace ('}') terminating the
   /// optional parameters, or `null` if there are no optional parameters.
   @override
-  Token rightDelimiter;
+  Token? rightDelimiter;
 
   /// The right parenthesis.
   @override
@@ -4460,7 +4434,7 @@
     int length = _parameters.length;
     for (int i = 0; i < length; i++) {
       FormalParameter parameter = _parameters[i];
-      if (leftDelimiterNeeded && leftDelimiter.offset < parameter.offset) {
+      if (leftDelimiterNeeded && leftDelimiter!.offset < parameter.offset) {
         result.add(leftDelimiter);
         leftDelimiterNeeded = false;
       }
@@ -4473,11 +4447,11 @@
   Token get endToken => rightParenthesis;
 
   @override
-  List<ParameterElement> get parameterElements {
+  List<ParameterElement?> get parameterElements {
     int count = _parameters.length;
-    List<ParameterElement> types = List<ParameterElement>.filled(count, null);
+    var types = <ParameterElement?>[];
     for (int i = 0; i < count; i++) {
-      types[i] = _parameters[i].declaredElement;
+      types.add(_parameters[i].declaredElement);
     }
     return types;
   }
@@ -4486,7 +4460,7 @@
   NodeList<FormalParameter> get parameters => _parameters;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitFormalParameterList(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitFormalParameterList(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -4495,15 +4469,15 @@
 }
 
 mixin ForMixin on AstNodeImpl {
-  Token awaitKeyword;
+  Token? awaitKeyword;
 
-  Token forKeyword;
+  late Token forKeyword;
 
-  Token leftParenthesis;
+  late Token leftParenthesis;
 
-  ForLoopPartsImpl _forLoopParts;
+  late ForLoopPartsImpl _forLoopParts;
 
-  Token rightParenthesis;
+  late Token rightParenthesis;
 
   @override
   Token get beginToken => awaitKeyword ?? forKeyword;
@@ -4529,20 +4503,20 @@
 
   /// The condition used to determine when to terminate the loop, or `null` if
   /// there is no condition.
-  ExpressionImpl _condition;
+  ExpressionImpl? _condition;
 
   @override
   Token rightSeparator;
 
   /// The list of expressions run after each execution of the loop body.
-  NodeList<Expression> _updaters;
+  late NodeList<Expression> _updaters;
 
   /// Initialize a newly created for statement. Either the [variableList] or the
   /// [initialization] must be `null`. Either the [condition] and the list of
   /// [updaters] can be `null` if the loop does not have the corresponding
   /// attribute.
-  ForPartsImpl(this.leftSeparator, ExpressionImpl condition,
-      this.rightSeparator, List<Expression> updaters) {
+  ForPartsImpl(this.leftSeparator, ExpressionImpl? condition,
+      this.rightSeparator, List<Expression>? updaters) {
     _condition = _becomeParentOf(condition);
     _updaters = NodeListImpl<Expression>(this, updaters);
   }
@@ -4558,14 +4532,14 @@
     ..addAll(_updaters);
 
   @override
-  Expression get condition => _condition;
+  Expression? get condition => _condition;
 
-  set condition(Expression expression) {
-    _condition = _becomeParentOf(expression as ExpressionImpl);
+  set condition(Expression? expression) {
+    _condition = _becomeParentOf(expression as ExpressionImpl?);
   }
 
   @override
-  Token get endToken => _updaters?.endToken ?? rightSeparator;
+  Token get endToken => _updaters.endToken ?? rightSeparator;
 
   @override
   NodeList<Expression> get updaters => _updaters;
@@ -4582,7 +4556,7 @@
   /// The declaration of the loop variables, or `null` if there are no
   /// variables.  Note that a for statement cannot have both a variable list and
   /// an initialization expression, but can validly have neither.
-  VariableDeclarationListImpl _variableList;
+  late VariableDeclarationListImpl _variableList;
 
   /// Initialize a newly created for statement. Both the [condition] and the
   /// list of [updaters] can be `null` if the loop does not have the
@@ -4590,15 +4564,15 @@
   ForPartsWithDeclarationsImpl(
       VariableDeclarationListImpl variableList,
       Token leftSeparator,
-      ExpressionImpl condition,
+      ExpressionImpl? condition,
       Token rightSeparator,
-      List<Expression> updaters)
+      List<Expression>? updaters)
       : super(leftSeparator, condition, rightSeparator, updaters) {
     _variableList = _becomeParentOf(variableList);
   }
 
   @override
-  Token get beginToken => _variableList?.beginToken ?? super.beginToken;
+  Token get beginToken => _variableList.beginToken;
 
   @override
   Iterable<SyntacticEntity> get childEntities => ChildEntities()
@@ -4608,18 +4582,18 @@
   @override
   VariableDeclarationList get variables => _variableList;
 
-  set variables(VariableDeclarationList variableList) {
+  set variables(VariableDeclarationList? variableList) {
     _variableList =
         _becomeParentOf(variableList as VariableDeclarationListImpl);
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) =>
+  E? accept<E>(AstVisitor<E> visitor) =>
       visitor.visitForPartsWithDeclarations(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _variableList?.accept(visitor);
+    _variableList.accept(visitor);
     super.visitChildren(visitor);
   }
 }
@@ -4629,13 +4603,17 @@
   /// The initialization expression, or `null` if there is no initialization
   /// expression. Note that a for statement cannot have both a variable list and
   /// an initialization expression, but can validly have neither.
-  ExpressionImpl _initialization;
+  ExpressionImpl? _initialization;
 
   /// Initialize a newly created for statement. Both the [condition] and the
   /// list of [updaters] can be `null` if the loop does not have the
   /// corresponding attribute.
-  ForPartsWithExpressionImpl(ExpressionImpl initialization, Token leftSeparator,
-      ExpressionImpl condition, Token rightSeparator, List<Expression> updaters)
+  ForPartsWithExpressionImpl(
+      ExpressionImpl? initialization,
+      Token leftSeparator,
+      ExpressionImpl? condition,
+      Token rightSeparator,
+      List<Expression>? updaters)
       : super(leftSeparator, condition, rightSeparator, updaters) {
     _initialization = _becomeParentOf(initialization);
   }
@@ -4649,14 +4627,14 @@
     ..addAll(super.childEntities);
 
   @override
-  Expression get initialization => _initialization;
+  Expression? get initialization => _initialization;
 
-  set initialization(Expression initialization) {
-    _initialization = _becomeParentOf(initialization as ExpressionImpl);
+  set initialization(Expression? initialization) {
+    _initialization = _becomeParentOf(initialization as ExpressionImpl?);
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) =>
+  E? accept<E>(AstVisitor<E> visitor) =>
       visitor.visitForPartsWithExpression(this);
 
   @override
@@ -4670,11 +4648,11 @@
     with ForMixin
     implements ForStatement {
   /// The body of the loop.
-  StatementImpl _body;
+  late StatementImpl _body;
 
   /// Initialize a newly created for statement.
   ForStatementImpl(
-      Token awaitKeyword,
+      Token? awaitKeyword,
       Token forKeyword,
       Token leftParenthesis,
       ForLoopPartsImpl forLoopParts,
@@ -4704,12 +4682,12 @@
   Token get endToken => _body.endToken;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitForStatement(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitForStatement(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _forLoopParts?.accept(visitor);
-    _body?.accept(visitor);
+    _forLoopParts.accept(visitor);
+    _body.accept(visitor);
   }
 }
 
@@ -4723,7 +4701,7 @@
   /// Additional information about local variables and parameters that are
   /// declared within this function body or any enclosing function body.  `null`
   /// if resolution has not yet been performed.
-  LocalVariableInfo localVariableInfo;
+  LocalVariableInfo? localVariableInfo;
 
   /// Return `true` if this function body is asynchronous.
   @override
@@ -4740,19 +4718,19 @@
   /// Return the token representing the 'async' or 'sync' keyword, or `null` if
   /// there is no such keyword.
   @override
-  Token get keyword => null;
+  Token? get keyword => null;
 
   /// Return the star following the 'async' or 'sync' keyword, or `null` if
   /// there is no star.
   @override
-  Token get star => null;
+  Token? get star => null;
 
   @override
   bool isPotentiallyMutatedInClosure(VariableElement variable) {
     if (localVariableInfo == null) {
       throw StateError('Resolution has not yet been performed');
     }
-    return localVariableInfo.potentiallyMutatedInClosure.contains(variable);
+    return localVariableInfo!.potentiallyMutatedInClosure.contains(variable);
   }
 
   @override
@@ -4760,7 +4738,7 @@
     if (localVariableInfo == null) {
       throw StateError('Resolution has not yet been performed');
     }
-    return localVariableInfo.potentiallyMutatedInScope.contains(variable);
+    return localVariableInfo!.potentiallyMutatedInScope.contains(variable);
   }
 }
 
@@ -4778,18 +4756,18 @@
   /// The token representing the 'external' keyword, or `null` if this is not an
   /// external function.
   @override
-  Token externalKeyword;
+  Token? externalKeyword;
 
   /// The return type of the function, or `null` if no return type was declared.
-  TypeAnnotationImpl _returnType;
+  TypeAnnotationImpl? _returnType;
 
   /// The token representing the 'get' or 'set' keyword, or `null` if this is a
   /// function declaration rather than a property declaration.
   @override
-  Token propertyKeyword;
+  Token? propertyKeyword;
 
   /// The function expression being wrapped.
-  FunctionExpressionImpl _functionExpression;
+  late FunctionExpressionImpl _functionExpression;
 
   /// Initialize a newly created function declaration. Either or both of the
   /// [comment] and [metadata] can be `null` if the function does not have the
@@ -4798,10 +4776,10 @@
   /// return type was specified. The [propertyKeyword] can be `null` if the
   /// function is neither a getter or a setter.
   FunctionDeclarationImpl(
-      CommentImpl comment,
-      List<Annotation> metadata,
+      CommentImpl? comment,
+      List<Annotation>? metadata,
       this.externalKeyword,
-      TypeAnnotationImpl returnType,
+      TypeAnnotationImpl? returnType,
       this.propertyKeyword,
       SimpleIdentifierImpl name,
       FunctionExpressionImpl functionExpression)
@@ -4819,8 +4797,8 @@
     ..add(_functionExpression);
 
   @override
-  ExecutableElement get declaredElement =>
-      _name?.staticElement as ExecutableElement;
+  ExecutableElement? get declaredElement =>
+      _name.staticElement as ExecutableElement?;
 
   @override
   Token get endToken => _functionExpression.endToken;
@@ -4828,15 +4806,13 @@
   @override
   Token get firstTokenAfterCommentAndMetadata {
     if (externalKeyword != null) {
-      return externalKeyword;
+      return externalKeyword!;
     } else if (_returnType != null) {
-      return _returnType.beginToken;
+      return _returnType!.beginToken;
     } else if (propertyKeyword != null) {
-      return propertyKeyword;
-    } else if (_name != null) {
-      return _name.beginToken;
+      return propertyKeyword!;
     }
-    return _functionExpression.beginToken;
+    return _name.beginToken;
   }
 
   @override
@@ -4855,22 +4831,22 @@
   bool get isSetter => propertyKeyword?.keyword == Keyword.SET;
 
   @override
-  TypeAnnotation get returnType => _returnType;
+  TypeAnnotation? get returnType => _returnType;
 
   @override
-  set returnType(TypeAnnotation type) {
+  set returnType(TypeAnnotation? type) {
     _returnType = _becomeParentOf(type as TypeAnnotationImpl);
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitFunctionDeclaration(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitFunctionDeclaration(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     _returnType?.accept(visitor);
-    _name?.accept(visitor);
-    _functionExpression?.accept(visitor);
+    _name.accept(visitor);
+    _functionExpression.accept(visitor);
   }
 }
 
@@ -4878,7 +4854,7 @@
 class FunctionDeclarationStatementImpl extends StatementImpl
     implements FunctionDeclarationStatement {
   /// The function declaration being wrapped.
-  FunctionDeclarationImpl _functionDeclaration;
+  late FunctionDeclarationImpl _functionDeclaration;
 
   /// Initialize a newly created function declaration statement.
   FunctionDeclarationStatementImpl(
@@ -4906,12 +4882,12 @@
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) =>
+  E? accept<E>(AstVisitor<E> visitor) =>
       visitor.visitFunctionDeclarationStatement(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _functionDeclaration?.accept(visitor);
+    _functionDeclaration.accept(visitor);
   }
 }
 
@@ -4923,21 +4899,21 @@
     implements FunctionExpression {
   /// The type parameters associated with the method, or `null` if the method is
   /// not a generic method.
-  TypeParameterListImpl _typeParameters;
+  TypeParameterListImpl? _typeParameters;
 
   /// The parameters associated with the function, or `null` if the function is
   /// part of a top-level getter.
-  FormalParameterListImpl _parameters;
+  FormalParameterListImpl? _parameters;
 
   /// The body of the function, or `null` if this is an external function.
-  FunctionBodyImpl _body;
+  FunctionBodyImpl? _body;
 
   @override
-  ExecutableElement declaredElement;
+  ExecutableElement? declaredElement;
 
   /// Initialize a newly created function declaration.
-  FunctionExpressionImpl(TypeParameterListImpl typeParameters,
-      FormalParameterListImpl parameters, FunctionBodyImpl body) {
+  FunctionExpressionImpl(TypeParameterListImpl? typeParameters,
+      FormalParameterListImpl? parameters, FunctionBodyImpl? body) {
     _typeParameters = _becomeParentOf(typeParameters);
     _parameters = _becomeParentOf(parameters);
     _body = _becomeParentOf(body);
@@ -4946,11 +4922,11 @@
   @override
   Token get beginToken {
     if (_typeParameters != null) {
-      return _typeParameters.beginToken;
+      return _typeParameters!.beginToken;
     } else if (_parameters != null) {
-      return _parameters.beginToken;
+      return _parameters!.beginToken;
     } else if (_body != null) {
-      return _body.beginToken;
+      return _body!.beginToken;
     }
     // This should never be reached because external functions must be named,
     // hence either the body or the name should be non-null.
@@ -4958,11 +4934,11 @@
   }
 
   @override
-  FunctionBody get body => _body;
+  FunctionBody? get body => _body;
 
   @override
-  set body(FunctionBody functionBody) {
-    _body = _becomeParentOf(functionBody as FunctionBodyImpl);
+  set body(FunctionBody? functionBody) {
+    _body = _becomeParentOf(functionBody as FunctionBodyImpl?);
   }
 
   @override
@@ -4972,9 +4948,9 @@
   @override
   Token get endToken {
     if (_body != null) {
-      return _body.endToken;
+      return _body!.endToken;
     } else if (_parameters != null) {
-      return _parameters.endToken;
+      return _parameters!.endToken;
     }
     // This should never be reached because external functions must be named,
     // hence either the body or the name should be non-null.
@@ -4982,26 +4958,26 @@
   }
 
   @override
-  FormalParameterList get parameters => _parameters;
+  FormalParameterList? get parameters => _parameters;
 
   @override
-  set parameters(FormalParameterList parameters) {
-    _parameters = _becomeParentOf(parameters as FormalParameterListImpl);
+  set parameters(FormalParameterList? parameters) {
+    _parameters = _becomeParentOf(parameters as FormalParameterListImpl?);
   }
 
   @override
   Precedence get precedence => Precedence.primary;
 
   @override
-  TypeParameterList get typeParameters => _typeParameters;
+  TypeParameterList? get typeParameters => _typeParameters;
 
   @override
-  set typeParameters(TypeParameterList typeParameters) {
-    _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl);
+  set typeParameters(TypeParameterList? typeParameters) {
+    _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl?);
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitFunctionExpression(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitFunctionExpression(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -5022,17 +4998,17 @@
     with NullShortableExpressionImpl
     implements FunctionExpressionInvocation {
   /// The expression producing the function being invoked.
-  ExpressionImpl _function;
+  late ExpressionImpl _function;
 
   /// The element associated with the function being invoked based on static
   /// type information, or `null` if the AST structure has not been resolved or
   /// the function could not be resolved.
   @override
-  ExecutableElement staticElement;
+  ExecutableElement? staticElement;
 
   /// Initialize a newly created function expression invocation.
   FunctionExpressionInvocationImpl(ExpressionImpl function,
-      TypeArgumentListImpl typeArguments, ArgumentListImpl argumentList)
+      TypeArgumentListImpl? typeArguments, ArgumentListImpl argumentList)
       : super(typeArguments, argumentList) {
     _function = _becomeParentOf(function);
   }
@@ -5059,17 +5035,17 @@
   Precedence get precedence => Precedence.postfix;
 
   @override
-  AstNode get _nullShortingExtensionCandidate => parent;
+  AstNode? get _nullShortingExtensionCandidate => parent;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) =>
+  E? accept<E>(AstVisitor<E> visitor) =>
       visitor.visitFunctionExpressionInvocation(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _function?.accept(visitor);
+    _function.accept(visitor);
     _typeArguments?.accept(visitor);
-    _argumentList?.accept(visitor);
+    _argumentList.accept(visitor);
   }
 
   @override
@@ -5088,14 +5064,14 @@
     implements FunctionTypeAlias {
   /// The name of the return type of the function type being defined, or `null`
   /// if no return type was given.
-  TypeAnnotationImpl _returnType;
+  TypeAnnotationImpl? _returnType;
 
   /// The type parameters for the function type, or `null` if the function type
   /// does not have any type parameters.
-  TypeParameterListImpl _typeParameters;
+  TypeParameterListImpl? _typeParameters;
 
   /// The parameters associated with the function type.
-  FormalParameterListImpl _parameters;
+  late FormalParameterListImpl _parameters;
 
   /// Initialize a newly created function type alias. Either or both of the
   /// [comment] and [metadata] can be `null` if the function does not have the
@@ -5103,12 +5079,12 @@
   /// was specified. The [typeParameters] can be `null` if the function has no
   /// type parameters.
   FunctionTypeAliasImpl(
-      CommentImpl comment,
-      List<Annotation> metadata,
+      CommentImpl? comment,
+      List<Annotation>? metadata,
       Token keyword,
-      TypeAnnotationImpl returnType,
+      TypeAnnotationImpl? returnType,
       SimpleIdentifierImpl name,
-      TypeParameterListImpl typeParameters,
+      TypeParameterListImpl? typeParameters,
       FormalParameterListImpl parameters,
       Token semicolon)
       : super(comment, metadata, keyword, name, semicolon) {
@@ -5127,8 +5103,8 @@
     ..add(semicolon);
 
   @override
-  FunctionTypeAliasElement get declaredElement =>
-      _name?.staticElement as FunctionTypeAliasElement;
+  FunctionTypeAliasElement? get declaredElement =>
+      _name.staticElement as FunctionTypeAliasElement?;
 
   @override
   FormalParameterList get parameters => _parameters;
@@ -5139,31 +5115,31 @@
   }
 
   @override
-  TypeAnnotation get returnType => _returnType;
+  TypeAnnotation? get returnType => _returnType;
 
   @override
-  set returnType(TypeAnnotation type) {
-    _returnType = _becomeParentOf(type as TypeAnnotationImpl);
+  set returnType(TypeAnnotation? type) {
+    _returnType = _becomeParentOf(type as TypeAnnotationImpl?);
   }
 
   @override
-  TypeParameterList get typeParameters => _typeParameters;
+  TypeParameterList? get typeParameters => _typeParameters;
 
   @override
-  set typeParameters(TypeParameterList typeParameters) {
-    _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl);
+  set typeParameters(TypeParameterList? typeParameters) {
+    _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl?);
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitFunctionTypeAlias(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitFunctionTypeAlias(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     _returnType?.accept(visitor);
-    _name?.accept(visitor);
+    _name.accept(visitor);
     _typeParameters?.accept(visitor);
-    _parameters?.accept(visitor);
+    _parameters.accept(visitor);
   }
 }
 
@@ -5176,30 +5152,30 @@
     implements FunctionTypedFormalParameter {
   /// The return type of the function, or `null` if the function does not have a
   /// return type.
-  TypeAnnotationImpl _returnType;
+  TypeAnnotationImpl? _returnType;
 
   /// The type parameters associated with the function, or `null` if the
   /// function is not a generic function.
-  TypeParameterListImpl _typeParameters;
+  TypeParameterListImpl? _typeParameters;
 
   /// The parameters of the function-typed parameter.
-  FormalParameterListImpl _parameters;
+  late FormalParameterListImpl _parameters;
 
   @override
-  Token question;
+  Token? question;
 
   /// Initialize a newly created formal parameter. Either or both of the
   /// [comment] and [metadata] can be `null` if the parameter does not have the
   /// corresponding attribute. The [returnType] can be `null` if no return type
   /// was specified.
   FunctionTypedFormalParameterImpl(
-      CommentImpl comment,
-      List<Annotation> metadata,
-      Token covariantKeyword,
-      Token requiredKeyword,
-      TypeAnnotationImpl returnType,
+      CommentImpl? comment,
+      List<Annotation>? metadata,
+      Token? covariantKeyword,
+      Token? requiredKeyword,
+      TypeAnnotationImpl? returnType,
       SimpleIdentifierImpl identifier,
-      TypeParameterListImpl typeParameters,
+      TypeParameterListImpl? typeParameters,
       FormalParameterListImpl parameters,
       this.question)
       : super(
@@ -5213,15 +5189,15 @@
   Token get beginToken {
     NodeList<Annotation> metadata = this.metadata;
     if (metadata.isNotEmpty) {
-      return metadata.beginToken;
+      return metadata.beginToken!;
     } else if (requiredKeyword != null) {
-      return requiredKeyword;
+      return requiredKeyword!;
     } else if (covariantKeyword != null) {
-      return covariantKeyword;
+      return covariantKeyword!;
     } else if (_returnType != null) {
-      return _returnType.beginToken;
+      return _returnType!.beginToken;
     }
-    return identifier?.beginToken;
+    return identifier.beginToken;
   }
 
   @override
@@ -5232,6 +5208,9 @@
   Token get endToken => question ?? _parameters.endToken;
 
   @override
+  SimpleIdentifier get identifier => super.identifier!;
+
+  @override
   bool get isConst => false;
 
   @override
@@ -5246,32 +5225,32 @@
   }
 
   @override
-  TypeAnnotation get returnType => _returnType;
+  TypeAnnotation? get returnType => _returnType;
 
   @override
-  set returnType(TypeAnnotation type) {
-    _returnType = _becomeParentOf(type as TypeAnnotationImpl);
+  set returnType(TypeAnnotation? type) {
+    _returnType = _becomeParentOf(type as TypeAnnotationImpl?);
   }
 
   @override
-  TypeParameterList get typeParameters => _typeParameters;
+  TypeParameterList? get typeParameters => _typeParameters;
 
   @override
-  set typeParameters(TypeParameterList typeParameters) {
-    _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl);
+  set typeParameters(TypeParameterList? typeParameters) {
+    _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl?);
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) =>
+  E? accept<E>(AstVisitor<E> visitor) =>
       visitor.visitFunctionTypedFormalParameter(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     _returnType?.accept(visitor);
-    identifier?.accept(visitor);
+    identifier.accept(visitor);
     _typeParameters?.accept(visitor);
-    _parameters?.accept(visitor);
+    _parameters.accept(visitor);
   }
 }
 
@@ -5307,31 +5286,31 @@
     implements GenericFunctionType {
   /// The name of the return type of the function type being defined, or
   /// `null` if no return type was given.
-  TypeAnnotationImpl _returnType;
+  TypeAnnotationImpl? _returnType;
 
   @override
   Token functionKeyword;
 
   /// The type parameters for the function type, or `null` if the function type
   /// does not have any type parameters.
-  TypeParameterListImpl _typeParameters;
+  TypeParameterListImpl? _typeParameters;
 
   /// The parameters associated with the function type.
-  FormalParameterListImpl _parameters;
+  late FormalParameterListImpl _parameters;
 
   @override
-  Token question;
+  Token? question;
 
   @override
-  DartType type;
+  DartType? type;
 
   /// Return the element associated with the function type, or `null` if the
   /// AST structure has not been resolved.
-  GenericFunctionTypeElement declaredElement;
+  GenericFunctionTypeElement? declaredElement;
 
   /// Initialize a newly created generic function type.
-  GenericFunctionTypeImpl(TypeAnnotationImpl returnType, this.functionKeyword,
-      TypeParameterListImpl typeParameters, FormalParameterListImpl parameters,
+  GenericFunctionTypeImpl(TypeAnnotationImpl? returnType, this.functionKeyword,
+      TypeParameterListImpl? typeParameters, FormalParameterListImpl parameters,
       {this.question}) {
     _returnType = _becomeParentOf(returnType);
     _typeParameters = _becomeParentOf(typeParameters);
@@ -5361,28 +5340,27 @@
   }
 
   @override
-  TypeAnnotation get returnType => _returnType;
+  TypeAnnotation? get returnType => _returnType;
 
   @override
-  set returnType(TypeAnnotation type) {
-    _returnType = _becomeParentOf(type as TypeAnnotationImpl);
+  set returnType(TypeAnnotation? type) {
+    _returnType = _becomeParentOf(type as TypeAnnotationImpl?);
   }
 
   /// Return the type parameters for the function type, or `null` if the
   /// function type does not have any type parameters.
   @override
-  TypeParameterList get typeParameters => _typeParameters;
+  TypeParameterList? get typeParameters => _typeParameters;
 
   /// Set the type parameters for the function type to the given list of
   /// [typeParameters].
   @override
-  set typeParameters(TypeParameterList typeParameters) {
-    _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl);
+  set typeParameters(TypeParameterList? typeParameters) {
+    _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl?);
   }
 
-  // TODO: implement type
   @override
-  E accept<E>(AstVisitor<E> visitor) {
+  E? accept<E>(AstVisitor<E> visitor) {
     return visitor.visitGenericFunctionType(this);
   }
 
@@ -5390,7 +5368,7 @@
   void visitChildren(AstVisitor visitor) {
     _returnType?.accept(visitor);
     _typeParameters?.accept(visitor);
-    _parameters?.accept(visitor);
+    _parameters.accept(visitor);
   }
 }
 
@@ -5403,11 +5381,11 @@
     with HasAstLinkedContext
     implements GenericTypeAlias {
   /// The type being defined by the alias.
-  TypeAnnotationImpl _type;
+  late TypeAnnotationImpl _type;
 
   /// The type parameters for the function type, or `null` if the function
   /// type does not have any type parameters.
-  TypeParameterListImpl _typeParameters;
+  TypeParameterListImpl? _typeParameters;
 
   @override
   Token equals;
@@ -5417,11 +5395,11 @@
   /// the corresponding attribute. The [typeParameters] can be `null` if there
   /// are no type parameters.
   GenericTypeAliasImpl(
-      CommentImpl comment,
-      List<Annotation> metadata,
+      CommentImpl? comment,
+      List<Annotation>? metadata,
       Token typedefToken,
       SimpleIdentifierImpl name,
-      TypeParameterListImpl typeParameters,
+      TypeParameterListImpl? typeParameters,
       this.equals,
       TypeAnnotationImpl type,
       Token semicolon)
@@ -5440,7 +5418,7 @@
     ..add(_type);
 
   @override
-  Element get declaredElement => name.staticElement;
+  Element? get declaredElement => name.staticElement;
 
   /// The type of function being defined by the alias.
   ///
@@ -5448,14 +5426,14 @@
   /// a [_type] which is not a [GenericFunctionTypeImpl].  In that case `null`
   /// is returned.
   @override
-  GenericFunctionType get functionType {
+  GenericFunctionType? get functionType {
     var type = _type;
     return type is GenericFunctionTypeImpl ? type : null;
   }
 
   @override
-  set functionType(GenericFunctionType functionType) {
-    _type = _becomeParentOf(functionType as TypeAnnotationImpl);
+  set functionType(GenericFunctionType? functionType) {
+    _type = _becomeParentOf(functionType as GenericFunctionTypeImpl?)!;
   }
 
   @override
@@ -5467,29 +5445,29 @@
   }
 
   @override
-  TypeParameterList get typeParameters => _typeParameters;
+  TypeParameterList? get typeParameters => _typeParameters;
 
   @override
-  set typeParameters(TypeParameterList typeParameters) {
-    _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl);
+  set typeParameters(TypeParameterList? typeParameters) {
+    _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl?);
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) {
+  E? accept<E>(AstVisitor<E> visitor) {
     return visitor.visitGenericTypeAlias(this);
   }
 
   @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
-    name?.accept(visitor);
+    name.accept(visitor);
     _typeParameters?.accept(visitor);
-    _type?.accept(visitor);
+    _type.accept(visitor);
   }
 }
 
 mixin HasAstLinkedContext {
-  AstLinkedContext linkedContext;
+  AstLinkedContext? linkedContext;
 }
 
 /// A combinator that restricts the names being imported to those that are not
@@ -5499,7 +5477,7 @@
 ///        'hide' [SimpleIdentifier] (',' [SimpleIdentifier])*
 class HideCombinatorImpl extends CombinatorImpl implements HideCombinator {
   /// The list of names from the library that are hidden by this combinator.
-  NodeList<SimpleIdentifier> _hiddenNames;
+  late NodeList<SimpleIdentifier> _hiddenNames;
 
   /// Initialize a newly created import show combinator.
   HideCombinatorImpl(Token keyword, List<SimpleIdentifier> hiddenNames)
@@ -5513,13 +5491,13 @@
     ..addAll(_hiddenNames);
 
   @override
-  Token get endToken => _hiddenNames.endToken;
+  Token get endToken => _hiddenNames.endToken!;
 
   @override
   NodeList<SimpleIdentifier> get hiddenNames => _hiddenNames;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitHideCombinator(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitHideCombinator(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -5541,11 +5519,11 @@
     with IfMixin
     implements IfElement {
   /// The element to be executed if the condition is `true`.
-  CollectionElementImpl _thenElement;
+  late CollectionElementImpl _thenElement;
 
   /// The element to be executed if the condition is `false`, or `null` if there
   /// is no such element.
-  CollectionElementImpl _elseElement;
+  CollectionElementImpl? _elseElement;
 
   /// Initialize a newly created for element.
   IfElementImpl(
@@ -5554,8 +5532,8 @@
       ExpressionImpl condition,
       Token rightParenthesis,
       CollectionElementImpl thenElement,
-      Token elseKeyword,
-      CollectionElementImpl elseElement) {
+      Token? elseKeyword,
+      CollectionElementImpl? elseElement) {
     this.ifKeyword = ifKeyword;
     this.leftParenthesis = leftParenthesis;
     _condition = _becomeParentOf(condition);
@@ -5573,10 +5551,10 @@
     ..add(_elseElement);
 
   @override
-  CollectionElement get elseElement => _elseElement;
+  CollectionElement? get elseElement => _elseElement;
 
-  set elseElement(CollectionElement element) {
-    _elseElement = _becomeParentOf(element as CollectionElementImpl);
+  set elseElement(CollectionElement? element) {
+    _elseElement = _becomeParentOf(element as CollectionElementImpl?);
   }
 
   @override
@@ -5590,27 +5568,27 @@
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitIfElement(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitIfElement(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
-    _thenElement?.accept(visitor);
+    _thenElement.accept(visitor);
     _elseElement?.accept(visitor);
   }
 }
 
 mixin IfMixin on AstNodeImpl {
-  Token ifKeyword;
+  late Token ifKeyword;
 
-  Token leftParenthesis;
+  late Token leftParenthesis;
 
   /// The condition used to determine which of the branches is executed next.
-  ExpressionImpl _condition;
+  late ExpressionImpl _condition;
 
-  Token rightParenthesis;
+  late Token rightParenthesis;
 
-  Token elseKeyword;
+  Token? elseKeyword;
 
   @override
   Token get beginToken => ifKeyword;
@@ -5630,7 +5608,7 @@
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _condition?.accept(visitor);
+    _condition.accept(visitor);
   }
 }
 
@@ -5642,11 +5620,11 @@
     with IfMixin
     implements IfStatement {
   /// The statement that is executed if the condition evaluates to `true`.
-  StatementImpl _thenStatement;
+  late StatementImpl _thenStatement;
 
   /// The statement that is executed if the condition evaluates to `false`, or
   /// `null` if there is no else statement.
-  StatementImpl _elseStatement;
+  StatementImpl? _elseStatement;
 
   /// Initialize a newly created if statement. The [elseKeyword] and
   /// [elseStatement] can be `null` if there is no else clause.
@@ -5656,8 +5634,8 @@
       ExpressionImpl condition,
       Token rightParenthesis,
       StatementImpl thenStatement,
-      Token elseKeyword,
-      StatementImpl elseStatement) {
+      Token? elseKeyword,
+      StatementImpl? elseStatement) {
     this.ifKeyword = ifKeyword;
     this.leftParenthesis = leftParenthesis;
     _condition = _becomeParentOf(condition);
@@ -5678,17 +5656,17 @@
     ..add(_elseStatement);
 
   @override
-  Statement get elseStatement => _elseStatement;
+  Statement? get elseStatement => _elseStatement;
 
   @override
-  set elseStatement(Statement statement) {
-    _elseStatement = _becomeParentOf(statement as StatementImpl);
+  set elseStatement(Statement? statement) {
+    _elseStatement = _becomeParentOf(statement as StatementImpl?);
   }
 
   @override
   Token get endToken {
     if (_elseStatement != null) {
-      return _elseStatement.endToken;
+      return _elseStatement!.endToken;
     }
     return _thenStatement.endToken;
   }
@@ -5702,12 +5680,12 @@
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitIfStatement(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitIfStatement(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _condition?.accept(visitor);
-    _thenStatement?.accept(visitor);
+    _condition.accept(visitor);
+    _thenStatement.accept(visitor);
     _elseStatement?.accept(visitor);
   }
 }
@@ -5722,7 +5700,7 @@
   Token implementsKeyword;
 
   /// The interfaces that are being implemented.
-  NodeList<TypeName> _interfaces;
+  late NodeList<TypeName> _interfaces;
 
   /// Initialize a newly created implements clause.
   ImplementsClauseImpl(this.implementsKeyword, List<TypeName> interfaces) {
@@ -5739,13 +5717,13 @@
     ..addAll(interfaces);
 
   @override
-  Token get endToken => _interfaces.endToken;
+  Token get endToken => _interfaces.endToken!;
 
   @override
   NodeList<TypeName> get interfaces => _interfaces;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitImplementsClause(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitImplementsClause(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -5766,16 +5744,16 @@
   /// The token representing the 'deferred' keyword, or `null` if the imported
   /// is not deferred.
   @override
-  Token deferredKeyword;
+  Token? deferredKeyword;
 
   /// The token representing the 'as' keyword, or `null` if the imported names
   /// are not prefixed.
   @override
-  Token asKeyword;
+  Token? asKeyword;
 
   /// The prefix to be used with the imported names, or `null` if the imported
   /// names are not prefixed.
-  SimpleIdentifierImpl _prefix;
+  SimpleIdentifierImpl? _prefix;
 
   /// Initialize a newly created import directive. Either or both of the
   /// [comment] and [metadata] can be `null` if the function does not have the
@@ -5784,15 +5762,15 @@
   /// does not specify a prefix. The list of [combinators] can be `null` if
   /// there are no combinators.
   ImportDirectiveImpl(
-      CommentImpl comment,
-      List<Annotation> metadata,
+      CommentImpl? comment,
+      List<Annotation>? metadata,
       Token keyword,
       StringLiteralImpl libraryUri,
-      List<Configuration> configurations,
+      List<Configuration>? configurations,
       this.deferredKeyword,
       this.asKeyword,
-      SimpleIdentifierImpl prefix,
-      List<Combinator> combinators,
+      SimpleIdentifierImpl? prefix,
+      List<Combinator>? combinators,
       Token semicolon)
       : super(comment, metadata, keyword, libraryUri, configurations,
             combinators, semicolon) {
@@ -5810,27 +5788,23 @@
     ..add(semicolon);
 
   @override
-  ImportElement get element => super.element as ImportElement;
+  ImportElement? get element => super.element as ImportElement?;
 
   @override
-  SimpleIdentifier get prefix => _prefix;
+  SimpleIdentifier? get prefix => _prefix;
 
   @override
-  set prefix(SimpleIdentifier identifier) {
-    _prefix = _becomeParentOf(identifier as SimpleIdentifierImpl);
+  set prefix(SimpleIdentifier? identifier) {
+    _prefix = _becomeParentOf(identifier as SimpleIdentifierImpl?);
   }
 
   @override
-  LibraryElement get uriElement {
-    ImportElement element = this.element;
-    if (element == null) {
-      return null;
-    }
-    return element.importedLibrary;
+  LibraryElement? get uriElement {
+    return element?.importedLibrary;
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitImportDirective(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitImportDirective(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -5849,20 +5823,20 @@
     with NullShortableExpressionImpl
     implements IndexExpression {
   @override
-  Token period;
+  Token? period;
 
   /// The expression used to compute the object being indexed, or `null` if this
   /// index expression is part of a cascade expression.
-  ExpressionImpl _target;
+  ExpressionImpl? _target;
 
   @override
-  Token question;
+  Token? question;
 
   @override
   Token leftBracket;
 
   /// The expression used to compute the index.
-  ExpressionImpl _index;
+  late ExpressionImpl _index;
 
   @override
   Token rightBracket;
@@ -5871,7 +5845,7 @@
   /// target, or `null` if the AST structure has not been resolved or if the
   /// operator could not be resolved.
   @override
-  MethodElement staticElement;
+  MethodElement? staticElement;
 
   /// Initialize a newly created index expression that is a child of a cascade
   /// expression.
@@ -5891,9 +5865,9 @@
   @override
   Token get beginToken {
     if (_target != null) {
-      return _target.beginToken;
+      return _target!.beginToken;
     }
-    return period;
+    return period!;
   }
 
   @override
@@ -5929,7 +5903,7 @@
     return question != null ||
         (leftBracket.type == TokenType.OPEN_SQUARE_BRACKET &&
             period != null &&
-            period.type == TokenType.QUESTION_PERIOD_PERIOD);
+            period!.type == TokenType.QUESTION_PERIOD_PERIOD);
   }
 
   @override
@@ -5940,15 +5914,15 @@
     if (isCascaded) {
       return _ancestorCascade.target;
     }
-    return _target;
+    return _target!;
   }
 
   @override
-  Expression get target => _target;
+  Expression? get target => _target;
 
   @override
-  set target(Expression expression) {
-    _target = _becomeParentOf(expression as ExpressionImpl);
+  set target(Expression? expression) {
+    _target = _becomeParentOf(expression as ExpressionImpl?);
   }
 
   /// Return the cascade that contains this [IndexExpression].
@@ -5956,7 +5930,7 @@
   /// We expect that [isCascaded] is `true`.
   CascadeExpression get _ancestorCascade {
     assert(isCascaded);
-    for (var ancestor = parent;; ancestor = ancestor.parent) {
+    for (var ancestor = parent!;; ancestor = ancestor.parent!) {
       if (ancestor is CascadeExpression) {
         return ancestor;
       }
@@ -5964,14 +5938,14 @@
   }
 
   @override
-  AstNode get _nullShortingExtensionCandidate => parent;
+  AstNode get _nullShortingExtensionCandidate => parent!;
 
   /// If the AST structure has been resolved, and the function being invoked is
   /// known based on static type information, then return the parameter element
   /// representing the parameter to which the value of the index expression will
   /// be bound. Otherwise, return `null`.
-  ParameterElement get _staticParameterElementForIndex {
-    Element element = staticElement;
+  ParameterElement? get _staticParameterElementForIndex {
+    Element? element = staticElement;
 
     var parent = this.parent;
     if (parent is CompoundAssignmentExpression) {
@@ -5990,12 +5964,12 @@
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitIndexExpression(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitIndexExpression(this);
 
   @override
   bool inGetterContext() {
     // TODO(brianwilkerson) Convert this to a getter.
-    AstNode parent = this.parent;
+    AstNode parent = this.parent!;
     if (parent is AssignmentExpression) {
       AssignmentExpression assignment = parent;
       if (identical(assignment.leftHandSide, this) &&
@@ -6009,7 +5983,7 @@
   @override
   bool inSetterContext() {
     // TODO(brianwilkerson) Convert this to a getter.
-    AstNode parent = this.parent;
+    AstNode parent = this.parent!;
     if (parent is PrefixExpression) {
       return parent.operator.type.isIncrementOperator;
     } else if (parent is PostfixExpression) {
@@ -6023,7 +5997,7 @@
   @override
   void visitChildren(AstVisitor visitor) {
     _target?.accept(visitor);
-    _index?.accept(visitor);
+    _index.accept(visitor);
   }
 
   @override
@@ -6044,24 +6018,24 @@
   /// The 'new' or 'const' keyword used to indicate how an object should be
   /// created, or `null` if the keyword is implicit.
   @override
-  Token keyword;
+  Token? keyword;
 
   /// The name of the constructor to be invoked.
-  ConstructorNameImpl _constructorName;
+  late ConstructorNameImpl _constructorName;
 
   /// The type arguments associated with the constructor, rather than with the
   /// class in which the constructor is defined. It is always an error if there
   /// are type arguments because Dart doesn't currently support generic
   /// constructors, but we capture them in the AST in order to recover better.
-  TypeArgumentListImpl _typeArguments;
+  TypeArgumentListImpl? _typeArguments;
 
   /// The list of arguments to the constructor.
-  ArgumentListImpl _argumentList;
+  late ArgumentListImpl _argumentList;
 
   /// Initialize a newly created instance creation expression.
   InstanceCreationExpressionImpl(this.keyword,
       ConstructorNameImpl constructorName, ArgumentListImpl argumentList,
-      {TypeArgumentListImpl typeArguments}) {
+      {TypeArgumentListImpl? typeArguments}) {
     _constructorName = _becomeParentOf(constructorName);
     _typeArguments = _becomeParentOf(typeArguments);
     _argumentList = _becomeParentOf(argumentList);
@@ -6099,7 +6073,7 @@
   @override
   bool get isConst {
     if (!isImplicit) {
-      return keyword.keyword == Keyword.CONST;
+      return keyword!.keyword == Keyword.CONST;
     } else {
       return inConstantContext;
     }
@@ -6115,25 +6089,25 @@
   /// with the class in which the constructor is defined. It is always an error
   /// if there are type arguments because Dart doesn't currently support generic
   /// constructors, but we capture them in the AST in order to recover better.
-  TypeArgumentList get typeArguments => _typeArguments;
+  TypeArgumentList? get typeArguments => _typeArguments;
 
   /// Return the type arguments associated with the constructor, rather than
   /// with the class in which the constructor is defined. It is always an error
   /// if there are type arguments because Dart doesn't currently support generic
   /// constructors, but we capture them in the AST in order to recover better.
-  set typeArguments(TypeArgumentList typeArguments) {
-    _typeArguments = _becomeParentOf(typeArguments as TypeArgumentListImpl);
+  set typeArguments(TypeArgumentList? typeArguments) {
+    _typeArguments = _becomeParentOf(typeArguments as TypeArgumentListImpl?);
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) =>
+  E? accept<E>(AstVisitor<E> visitor) =>
       visitor.visitInstanceCreationExpression(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _constructorName?.accept(visitor);
+    _constructorName.accept(visitor);
     _typeArguments?.accept(visitor);
-    _argumentList?.accept(visitor);
+    _argumentList.accept(visitor);
   }
 }
 
@@ -6156,7 +6130,7 @@
 
   /// The value of the literal.
   @override
-  int value = 0;
+  int? value = 0;
 
   /// Initialize a newly created integer literal.
   IntegerLiteralImpl(this.literal, this.value);
@@ -6177,13 +6151,13 @@
   /// the literal is the child of a negation operation. The literal value itself
   /// will always be positive.
   bool get immediatelyNegated {
-    AstNode parent = this.parent; // Capture for type propagation.
+    AstNode parent = this.parent!; // Capture for type propagation.
     return parent is PrefixExpression &&
         parent.operator.type == TokenType.MINUS;
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitIntegerLiteral(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitIntegerLiteral(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -6197,7 +6171,7 @@
       return true;
     }
 
-    BigInt fullPrecision = BigInt.tryParse(lexeme);
+    var fullPrecision = BigInt.tryParse(lexeme);
     if (fullPrecision == null) {
       return false;
     }
@@ -6266,12 +6240,12 @@
 
   /// The expression to be evaluated for the value to be converted into a
   /// string.
-  ExpressionImpl _expression;
+  late ExpressionImpl _expression;
 
   /// The right curly bracket, or `null` if the expression is an identifier
   /// without brackets.
   @override
-  Token rightBracket;
+  Token? rightBracket;
 
   /// Initialize a newly created interpolation expression.
   InterpolationExpressionImpl(
@@ -6287,12 +6261,7 @@
       ChildEntities()..add(leftBracket)..add(_expression)..add(rightBracket);
 
   @override
-  Token get endToken {
-    if (rightBracket != null) {
-      return rightBracket;
-    }
-    return _expression.endToken;
-  }
+  Token get endToken => rightBracket ?? _expression.endToken;
 
   @override
   Expression get expression => _expression;
@@ -6303,12 +6272,12 @@
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) =>
+  E? accept<E>(AstVisitor<E> visitor) =>
       visitor.visitInterpolationExpression(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _expression?.accept(visitor);
+    _expression.accept(visitor);
   }
 }
 
@@ -6346,7 +6315,7 @@
   Token get endToken => contents;
 
   @override
-  StringInterpolation get parent => super.parent;
+  StringInterpolation get parent => super.parent as StringInterpolation;
 
   StringLexemeHelper get _lexemeHelper {
     String lexeme = contents.lexeme;
@@ -6355,7 +6324,7 @@
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitInterpolationString(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitInterpolationString(this);
 
   @override
   void visitChildren(AstVisitor visitor) {}
@@ -6366,21 +6335,21 @@
 abstract class InvocationExpressionImpl extends ExpressionImpl
     implements InvocationExpression {
   /// The list of arguments to the function.
-  ArgumentListImpl _argumentList;
+  late ArgumentListImpl _argumentList;
 
   /// The type arguments to be applied to the method being invoked, or `null` if
   /// no type arguments were provided.
-  TypeArgumentListImpl _typeArguments;
+  TypeArgumentListImpl? _typeArguments;
 
   @override
-  List<DartType> typeArgumentTypes;
+  List<DartType>? typeArgumentTypes;
 
   @override
-  DartType staticInvokeType;
+  DartType? staticInvokeType;
 
   /// Initialize a newly created invocation.
   InvocationExpressionImpl(
-      TypeArgumentListImpl typeArguments, ArgumentListImpl argumentList) {
+      TypeArgumentListImpl? typeArguments, ArgumentListImpl argumentList) {
     _typeArguments = _becomeParentOf(typeArguments);
     _argumentList = _becomeParentOf(argumentList);
   }
@@ -6393,10 +6362,10 @@
   }
 
   @override
-  TypeArgumentList get typeArguments => _typeArguments;
+  TypeArgumentList? get typeArguments => _typeArguments;
 
-  set typeArguments(TypeArgumentList typeArguments) {
-    _typeArguments = _becomeParentOf(typeArguments as TypeArgumentListImpl);
+  set typeArguments(TypeArgumentList? typeArguments) {
+    _typeArguments = _becomeParentOf(typeArguments as TypeArgumentListImpl?);
   }
 }
 
@@ -6406,7 +6375,7 @@
 ///        [Expression] 'is' '!'? [TypeName]
 class IsExpressionImpl extends ExpressionImpl implements IsExpression {
   /// The expression used to compute the value whose type is being tested.
-  ExpressionImpl _expression;
+  late ExpressionImpl _expression;
 
   /// The is operator.
   @override
@@ -6414,10 +6383,10 @@
 
   /// The not operator, or `null` if the sense of the test is not negated.
   @override
-  Token notOperator;
+  Token? notOperator;
 
   /// The name of the type being tested for.
-  TypeAnnotationImpl _type;
+  late TypeAnnotationImpl _type;
 
   /// Initialize a newly created is expression. The [notOperator] can be `null`
   /// if the sense of the test is not negated.
@@ -6460,12 +6429,12 @@
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitIsExpression(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitIsExpression(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _expression?.accept(visitor);
-    _type?.accept(visitor);
+    _expression.accept(visitor);
+    _type.accept(visitor);
   }
 }
 
@@ -6475,10 +6444,10 @@
 ///       [Label]+ [Statement]
 class LabeledStatementImpl extends StatementImpl implements LabeledStatement {
   /// The labels being associated with the statement.
-  NodeList<Label> _labels;
+  late NodeList<Label> _labels;
 
   /// The statement with which the labels are being associated.
-  StatementImpl _statement;
+  late StatementImpl _statement;
 
   /// Initialize a newly created labeled statement.
   LabeledStatementImpl(List<Label> labels, StatementImpl statement) {
@@ -6489,7 +6458,7 @@
   @override
   Token get beginToken {
     if (_labels.isNotEmpty) {
-      return _labels.beginToken;
+      return _labels.beginToken!;
     }
     return _statement.beginToken;
   }
@@ -6517,12 +6486,12 @@
   Statement get unlabeled => _statement.unlabeled;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitLabeledStatement(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitLabeledStatement(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
     _labels.accept(visitor);
-    _statement?.accept(visitor);
+    _statement.accept(visitor);
   }
 }
 
@@ -6532,7 +6501,7 @@
 ///        [SimpleIdentifier] ':'
 class LabelImpl extends AstNodeImpl implements Label {
   /// The label being associated with the statement.
-  SimpleIdentifierImpl _label;
+  late SimpleIdentifierImpl _label;
 
   /// The colon that separates the label from the statement.
   @override
@@ -6562,11 +6531,11 @@
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitLabel(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitLabel(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _label?.accept(visitor);
+    _label.accept(visitor);
   }
 }
 
@@ -6580,7 +6549,7 @@
   Token libraryKeyword;
 
   /// The name of the library being defined.
-  LibraryIdentifierImpl _name;
+  late LibraryIdentifierImpl _name;
 
   /// The semicolon terminating the directive.
   @override
@@ -6589,12 +6558,12 @@
   /// Data that is read during loading this node from summary, but is not
   /// fully applied yet. For example in many cases we don't need the
   /// documentation comment, and it is expensive to decode strings.
-  Object summaryData;
+  Object? summaryData;
 
   /// Initialize a newly created library directive. Either or both of the
   /// [comment] and [metadata] can be `null` if the directive does not have the
   /// corresponding attribute.
-  LibraryDirectiveImpl(CommentImpl comment, List<Annotation> metadata,
+  LibraryDirectiveImpl(CommentImpl? comment, List<Annotation>? metadata,
       this.libraryKeyword, LibraryIdentifierImpl name, this.semicolon)
       : super(comment, metadata) {
     _name = _becomeParentOf(name);
@@ -6622,12 +6591,12 @@
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitLibraryDirective(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitLibraryDirective(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
-    _name?.accept(visitor);
+    _name.accept(visitor);
   }
 }
 
@@ -6638,7 +6607,7 @@
 class LibraryIdentifierImpl extends IdentifierImpl
     implements LibraryIdentifier {
   /// The components of the identifier.
-  NodeList<SimpleIdentifier> _components;
+  late NodeList<SimpleIdentifier> _components;
 
   /// Initialize a newly created prefixed identifier.
   LibraryIdentifierImpl(List<SimpleIdentifier> components) {
@@ -6646,7 +6615,7 @@
   }
 
   @override
-  Token get beginToken => _components.beginToken;
+  Token get beginToken => _components.beginToken!;
 
   @override
   // TODO(paulberry): add "." tokens.
@@ -6657,7 +6626,7 @@
   NodeList<SimpleIdentifier> get components => _components;
 
   @override
-  Token get endToken => _components.endToken;
+  Token get endToken => _components.endToken!;
 
   @override
   String get name {
@@ -6680,10 +6649,10 @@
   Precedence get precedence => Precedence.postfix;
 
   @override
-  Element get staticElement => null;
+  Element? get staticElement => null;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitLibraryIdentifier(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitLibraryIdentifier(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -6697,7 +6666,7 @@
   Token leftBracket;
 
   /// The expressions used to compute the elements of the list.
-  NodeList<CollectionElement> _elements;
+  late NodeList<CollectionElement> _elements;
 
   /// The right square bracket.
   @override
@@ -6707,7 +6676,7 @@
   /// if the literal is not a constant. The [typeArguments] can be `null` if no
   /// type arguments were declared. The list of [elements] can be `null` if the
   /// list is empty.
-  ListLiteralImpl(Token constKeyword, TypeArgumentListImpl typeArguments,
+  ListLiteralImpl(Token? constKeyword, TypeArgumentListImpl? typeArguments,
       this.leftBracket, List<Expression> elements, this.rightBracket)
       : super(constKeyword, typeArguments) {
     _elements = NodeListImpl<Expression>(this, elements);
@@ -6719,8 +6688,8 @@
   /// [typeArguments] can be `null` if no type arguments were declared. The list
   /// of [elements] can be `null` if the list is empty.
   ListLiteralImpl.experimental(
-      Token constKeyword,
-      TypeArgumentListImpl typeArguments,
+      Token? constKeyword,
+      TypeArgumentListImpl? typeArguments,
       this.leftBracket,
       List<CollectionElement> elements,
       this.rightBracket)
@@ -6731,9 +6700,9 @@
   @override
   Token get beginToken {
     if (constKeyword != null) {
-      return constKeyword;
+      return constKeyword!;
     }
-    TypeArgumentList typeArguments = this.typeArguments;
+    var typeArguments = this.typeArguments;
     if (typeArguments != null) {
       return typeArguments.beginToken;
     }
@@ -6754,7 +6723,7 @@
   Token get endToken => rightBracket;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitListLiteral(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitListLiteral(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -6798,14 +6767,14 @@
 class MapLiteralEntryImpl extends CollectionElementImpl
     implements MapLiteralEntry {
   /// The expression computing the key with which the value will be associated.
-  ExpressionImpl _key;
+  late ExpressionImpl _key;
 
   /// The colon that separates the key from the value.
   @override
   Token separator;
 
   /// The expression computing the value that will be associated with the key.
-  ExpressionImpl _value;
+  late ExpressionImpl _value;
 
   /// Initialize a newly created map literal entry.
   MapLiteralEntryImpl(
@@ -6841,12 +6810,12 @@
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitMapLiteralEntry(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitMapLiteralEntry(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _key?.accept(visitor);
-    _value?.accept(visitor);
+    _key.accept(visitor);
+    _value.accept(visitor);
   }
 }
 
@@ -6868,39 +6837,39 @@
   /// The token for the 'external' keyword, or `null` if the constructor is not
   /// external.
   @override
-  Token externalKeyword;
+  Token? externalKeyword;
 
   /// The token representing the 'abstract' or 'static' keyword, or `null` if
   /// neither modifier was specified.
   @override
-  Token modifierKeyword;
+  Token? modifierKeyword;
 
   /// The return type of the method, or `null` if no return type was declared.
-  TypeAnnotationImpl _returnType;
+  TypeAnnotationImpl? _returnType;
 
   /// The token representing the 'get' or 'set' keyword, or `null` if this is a
   /// method declaration rather than a property declaration.
   @override
-  Token propertyKeyword;
+  Token? propertyKeyword;
 
   /// The token representing the 'operator' keyword, or `null` if this method
   /// does not declare an operator.
   @override
-  Token operatorKeyword;
+  Token? operatorKeyword;
 
   /// The name of the method.
-  SimpleIdentifierImpl _name;
+  late SimpleIdentifierImpl _name;
 
   /// The type parameters associated with the method, or `null` if the method is
   /// not a generic method.
-  TypeParameterListImpl _typeParameters;
+  TypeParameterListImpl? _typeParameters;
 
   /// The parameters associated with the method, or `null` if this method
   /// declares a getter.
-  FormalParameterListImpl _parameters;
+  FormalParameterListImpl? _parameters;
 
   /// The body of the method.
-  FunctionBodyImpl _body;
+  late FunctionBodyImpl _body;
 
   /// Initialize a newly created method declaration. Either or both of the
   /// [comment] and [metadata] can be `null` if the declaration does not have
@@ -6912,16 +6881,16 @@
   /// `null` if the method does not implement an operator. The [parameters] must
   /// be `null` if this method declares a getter.
   MethodDeclarationImpl(
-      CommentImpl comment,
-      List<Annotation> metadata,
+      CommentImpl? comment,
+      List<Annotation>? metadata,
       this.externalKeyword,
       this.modifierKeyword,
-      TypeAnnotationImpl returnType,
+      TypeAnnotationImpl? returnType,
       this.propertyKeyword,
       this.operatorKeyword,
       SimpleIdentifierImpl name,
-      TypeParameterListImpl typeParameters,
-      FormalParameterListImpl parameters,
+      TypeParameterListImpl? typeParameters,
+      FormalParameterListImpl? parameters,
       FunctionBodyImpl body)
       : super(comment, metadata) {
     _returnType = _becomeParentOf(returnType);
@@ -6956,8 +6925,8 @@
   /// a [PropertyAccessorElement] if this represents the declaration of either a
   /// getter or a setter.
   @override
-  ExecutableElement get declaredElement =>
-      _name?.staticElement as ExecutableElement;
+  ExecutableElement? get declaredElement =>
+      _name.staticElement as ExecutableElement?;
 
   @override
   Token get endToken => _body.endToken;
@@ -6965,15 +6934,15 @@
   @override
   Token get firstTokenAfterCommentAndMetadata {
     if (externalKeyword != null) {
-      return externalKeyword;
+      return externalKeyword!;
     } else if (modifierKeyword != null) {
-      return modifierKeyword;
+      return modifierKeyword!;
     } else if (_returnType != null) {
-      return _returnType.beginToken;
+      return _returnType!.beginToken;
     } else if (propertyKeyword != null) {
-      return propertyKeyword;
+      return propertyKeyword!;
     } else if (operatorKeyword != null) {
-      return operatorKeyword;
+      return operatorKeyword!;
     }
     return _name.beginToken;
   }
@@ -7006,40 +6975,40 @@
   }
 
   @override
-  FormalParameterList get parameters => _parameters;
+  FormalParameterList? get parameters => _parameters;
 
   @override
-  set parameters(FormalParameterList parameters) {
-    _parameters = _becomeParentOf(parameters as FormalParameterListImpl);
+  set parameters(FormalParameterList? parameters) {
+    _parameters = _becomeParentOf(parameters as FormalParameterListImpl?);
   }
 
   @override
-  TypeAnnotation get returnType => _returnType;
+  TypeAnnotation? get returnType => _returnType;
 
   @override
-  set returnType(TypeAnnotation type) {
-    _returnType = _becomeParentOf(type as TypeAnnotationImpl);
+  set returnType(TypeAnnotation? type) {
+    _returnType = _becomeParentOf(type as TypeAnnotationImpl?);
   }
 
   @override
-  TypeParameterList get typeParameters => _typeParameters;
+  TypeParameterList? get typeParameters => _typeParameters;
 
   @override
-  set typeParameters(TypeParameterList typeParameters) {
-    _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl);
+  set typeParameters(TypeParameterList? typeParameters) {
+    _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl?);
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitMethodDeclaration(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitMethodDeclaration(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     _returnType?.accept(visitor);
-    _name?.accept(visitor);
+    _name.accept(visitor);
     _typeParameters?.accept(visitor);
     _parameters?.accept(visitor);
-    _body?.accept(visitor);
+    _body.accept(visitor);
   }
 }
 
@@ -7056,29 +7025,29 @@
     implements MethodInvocation {
   /// The expression producing the object on which the method is defined, or
   /// `null` if there is no target (that is, the target is implicitly `this`).
-  ExpressionImpl _target;
+  ExpressionImpl? _target;
 
   /// The operator that separates the target from the method name, or `null`
   /// if there is no target. In an ordinary method invocation this will be a
   /// period ('.'). In a cascade section this will be the cascade operator
   /// ('..' | '?..').
   @override
-  Token operator;
+  Token? operator;
 
   /// The name of the method being invoked.
-  SimpleIdentifierImpl _methodName;
+  late SimpleIdentifierImpl _methodName;
 
   /// The invoke type of the [methodName] if the target element is a getter,
   /// or `null` otherwise.
-  DartType _methodNameType;
+  DartType? _methodNameType;
 
   /// Initialize a newly created method invocation. The [target] and [operator]
   /// can be `null` if there is no target.
   MethodInvocationImpl(
-      ExpressionImpl target,
+      ExpressionImpl? target,
       this.operator,
       SimpleIdentifierImpl methodName,
-      TypeArgumentListImpl typeArguments,
+      TypeArgumentListImpl? typeArguments,
       ArgumentListImpl argumentList)
       : super(typeArguments, argumentList) {
     _target = _becomeParentOf(target);
@@ -7088,9 +7057,9 @@
   @override
   Token get beginToken {
     if (_target != null) {
-      return _target.beginToken;
+      return _target!.beginToken;
     } else if (operator != null) {
-      return operator;
+      return operator!;
     }
     return _methodName.beginToken;
   }
@@ -7111,8 +7080,8 @@
   @override
   bool get isCascaded =>
       operator != null &&
-      (operator.type == TokenType.PERIOD_PERIOD ||
-          operator.type == TokenType.QUESTION_PERIOD_PERIOD);
+      (operator!.type == TokenType.PERIOD_PERIOD ||
+          operator!.type == TokenType.QUESTION_PERIOD_PERIOD);
 
   @override
   bool get isNullAware {
@@ -7120,8 +7089,8 @@
       return _ancestorCascade.isNullAware;
     }
     return operator != null &&
-        (operator.type == TokenType.QUESTION_PERIOD ||
-            operator.type == TokenType.QUESTION_PERIOD_PERIOD);
+        (operator!.type == TokenType.QUESTION_PERIOD ||
+            operator!.type == TokenType.QUESTION_PERIOD_PERIOD);
   }
 
   @override
@@ -7139,12 +7108,12 @@
   /// returning an [ExecutableElement] so that it can be invoked in this
   /// [MethodInvocation], then this type is the type of the getter, and the
   /// [staticInvokeType] is the invoked type of the returned element.
-  DartType get methodNameType => _methodNameType ?? staticInvokeType;
+  DartType? get methodNameType => _methodNameType ?? staticInvokeType;
 
   /// Set the [methodName] invoke type, only if the target element is a getter.
   /// Otherwise, the target element itself is invoked, [_methodNameType] is
   /// `null`, and the getter will return [staticInvokeType].
-  set methodNameType(DartType methodNameType) {
+  set methodNameType(DartType? methodNameType) {
     _methodNameType = methodNameType;
   }
 
@@ -7152,7 +7121,7 @@
   Precedence get precedence => Precedence.postfix;
 
   @override
-  Expression get realTarget {
+  Expression? get realTarget {
     if (isCascaded) {
       return _ancestorCascade.target;
     }
@@ -7160,11 +7129,11 @@
   }
 
   @override
-  Expression get target => _target;
+  Expression? get target => _target;
 
   @override
-  set target(Expression expression) {
-    _target = _becomeParentOf(expression as ExpressionImpl);
+  set target(Expression? expression) {
+    _target = _becomeParentOf(expression as ExpressionImpl?);
   }
 
   /// Return the cascade that contains this [IndexExpression].
@@ -7172,7 +7141,7 @@
   /// We expect that [isCascaded] is `true`.
   CascadeExpression get _ancestorCascade {
     assert(isCascaded);
-    for (var ancestor = parent;; ancestor = ancestor.parent) {
+    for (var ancestor = parent!;; ancestor = ancestor.parent!) {
       if (ancestor is CascadeExpression) {
         return ancestor;
       }
@@ -7180,17 +7149,17 @@
   }
 
   @override
-  AstNode get _nullShortingExtensionCandidate => parent;
+  AstNode? get _nullShortingExtensionCandidate => parent;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitMethodInvocation(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitMethodInvocation(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
     _target?.accept(visitor);
-    _methodName?.accept(visitor);
+    _methodName.accept(visitor);
     _typeArguments?.accept(visitor);
-    _argumentList?.accept(visitor);
+    _argumentList.accept(visitor);
   }
 
   @override
@@ -7210,7 +7179,7 @@
 
   /// The on clause for the mixin, or `null` if the mixin does not have any
   /// super-class constraints.
-  OnClauseImpl _onClause;
+  OnClauseImpl? _onClause;
 
   /// Initialize a newly created mixin declaration. Either or both of the
   /// [comment] and [metadata] can be `null` if the mixin does not have the
@@ -7220,13 +7189,13 @@
   /// corresponding clause. The list of [members] can be `null` if the mixin
   /// does not have any members.
   MixinDeclarationImpl(
-      CommentImpl comment,
-      List<Annotation> metadata,
+      CommentImpl? comment,
+      List<Annotation>? metadata,
       this.mixinKeyword,
       SimpleIdentifierImpl name,
-      TypeParameterListImpl typeParameters,
-      OnClauseImpl onClause,
-      ImplementsClauseImpl implementsClause,
+      TypeParameterListImpl? typeParameters,
+      OnClauseImpl? onClause,
+      ImplementsClauseImpl? implementsClause,
       Token leftBracket,
       List<ClassMember> members,
       Token rightBracket)
@@ -7247,7 +7216,7 @@
     ..add(rightBracket);
 
   @override
-  ClassElement get declaredElement => _name?.staticElement as ClassElement;
+  ClassElement? get declaredElement => _name.staticElement as ClassElement?;
 
   @override
   Token get firstTokenAfterCommentAndMetadata {
@@ -7255,10 +7224,10 @@
   }
 
   @override
-  ImplementsClause get implementsClause => _implementsClause;
+  ImplementsClause? get implementsClause => _implementsClause;
 
   @override
-  set implementsClause(ImplementsClause implementsClause) {
+  set implementsClause(ImplementsClause? implementsClause) {
     _implementsClause =
         _becomeParentOf(implementsClause as ImplementsClauseImpl);
   }
@@ -7267,28 +7236,27 @@
   NodeList<ClassMember> get members => _members;
 
   @override
-  OnClause get onClause => _onClause;
+  OnClause? get onClause => _onClause;
 
-  set onClause(OnClause onClause) {
-    _onClause = _becomeParentOf(onClause as OnClauseImpl);
+  set onClause(OnClause? onClause) {
+    _onClause = _becomeParentOf(onClause as OnClauseImpl?);
   }
 
   @override
-  @override
-  TypeParameterList get typeParameters => _typeParameters;
+  TypeParameterList? get typeParameters => _typeParameters;
 
   @override
-  set typeParameters(TypeParameterList typeParameters) {
-    _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl);
+  set typeParameters(TypeParameterList? typeParameters) {
+    _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl?);
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitMixinDeclaration(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitMixinDeclaration(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
-    _name?.accept(visitor);
+    _name.accept(visitor);
     _typeParameters?.accept(visitor);
     _onClause?.accept(visitor);
     _implementsClause?.accept(visitor);
@@ -7300,13 +7268,13 @@
 abstract class NamedCompilationUnitMemberImpl extends CompilationUnitMemberImpl
     implements NamedCompilationUnitMember {
   /// The name of the member being declared.
-  SimpleIdentifierImpl _name;
+  late SimpleIdentifierImpl _name;
 
   /// Initialize a newly created compilation unit member with the given [name].
   /// Either or both of the [comment] and [metadata] can be `null` if the member
   /// does not have the corresponding attribute.
-  NamedCompilationUnitMemberImpl(
-      CommentImpl comment, List<Annotation> metadata, SimpleIdentifierImpl name)
+  NamedCompilationUnitMemberImpl(CommentImpl? comment,
+      List<Annotation>? metadata, SimpleIdentifierImpl name)
       : super(comment, metadata) {
     _name = _becomeParentOf(name);
   }
@@ -7327,10 +7295,10 @@
 ///        [Label] [Expression]
 class NamedExpressionImpl extends ExpressionImpl implements NamedExpression {
   /// The name associated with the expression.
-  LabelImpl _name;
+  late LabelImpl _name;
 
   /// The expression with which the name is associated.
-  ExpressionImpl _expression;
+  late ExpressionImpl _expression;
 
   /// Initialize a newly created named expression..
   NamedExpressionImpl(LabelImpl name, ExpressionImpl expression) {
@@ -7346,8 +7314,8 @@
       ChildEntities()..add(_name)..add(_expression);
 
   @override
-  ParameterElement get element {
-    Element element = _name.label.staticElement;
+  ParameterElement? get element {
+    var element = _name.label.staticElement;
     if (element is ParameterElement) {
       return element;
     }
@@ -7377,12 +7345,12 @@
   Precedence get precedence => Precedence.none;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitNamedExpression(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitNamedExpression(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _name?.accept(visitor);
-    _expression?.accept(visitor);
+    _name.accept(visitor);
+    _expression.accept(visitor);
   }
 }
 
@@ -7399,32 +7367,32 @@
 
   /// The configurations used to control which library will actually be loaded
   /// at run-time.
-  NodeList<Configuration> _configurations;
+  late NodeList<Configuration> _configurations;
 
   /// The combinators used to control which names are imported or exported.
-  NodeList<Combinator> _combinators;
+  late NodeList<Combinator> _combinators;
 
   /// The semicolon terminating the directive.
   @override
   Token semicolon;
 
   @override
-  String selectedUriContent;
+  String? selectedUriContent;
 
   @override
-  Source selectedSource;
+  Source? selectedSource;
 
   /// Initialize a newly created namespace directive. Either or both of the
   /// [comment] and [metadata] can be `null` if the directive does not have the
   /// corresponding attribute. The list of [combinators] can be `null` if there
   /// are no combinators.
   NamespaceDirectiveImpl(
-      CommentImpl comment,
-      List<Annotation> metadata,
+      CommentImpl? comment,
+      List<Annotation>? metadata,
       this.keyword,
       StringLiteralImpl libraryUri,
-      List<Configuration> configurations,
-      List<Combinator> combinators,
+      List<Configuration>? configurations,
+      List<Combinator>? combinators,
       this.semicolon)
       : super(comment, metadata, libraryUri) {
     _configurations = NodeListImpl<Configuration>(this, configurations);
@@ -7444,7 +7412,7 @@
   Token get firstTokenAfterCommentAndMetadata => keyword;
 
   @override
-  LibraryElement get uriElement;
+  LibraryElement? get uriElement;
 }
 
 /// The "native" clause in an class declaration.
@@ -7457,10 +7425,10 @@
   Token nativeKeyword;
 
   /// The name of the native object that implements the class.
-  StringLiteralImpl _name;
+  StringLiteralImpl? _name;
 
   /// Initialize a newly created native clause.
-  NativeClauseImpl(this.nativeKeyword, StringLiteralImpl name) {
+  NativeClauseImpl(this.nativeKeyword, StringLiteralImpl? name) {
     _name = _becomeParentOf(name);
   }
 
@@ -7472,18 +7440,20 @@
       ChildEntities()..add(nativeKeyword)..add(_name);
 
   @override
-  Token get endToken => _name.endToken;
-
-  @override
-  StringLiteral get name => _name;
-
-  @override
-  set name(StringLiteral name) {
-    _name = _becomeParentOf(name as StringLiteralImpl);
+  Token get endToken {
+    return _name?.endToken ?? nativeKeyword;
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitNativeClause(this);
+  StringLiteral? get name => _name;
+
+  @override
+  set name(StringLiteral? name) {
+    _name = _becomeParentOf(name as StringLiteralImpl?);
+  }
+
+  @override
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitNativeClause(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -7503,7 +7473,7 @@
   Token nativeKeyword;
 
   /// The string literal, after the 'native' token.
-  StringLiteralImpl _stringLiteral;
+  StringLiteralImpl? _stringLiteral;
 
   /// The token representing the semicolon that marks the end of the function
   /// body.
@@ -7513,7 +7483,7 @@
   /// Initialize a newly created function body consisting of the 'native' token,
   /// a string literal, and a semicolon.
   NativeFunctionBodyImpl(
-      this.nativeKeyword, StringLiteralImpl stringLiteral, this.semicolon) {
+      this.nativeKeyword, StringLiteralImpl? stringLiteral, this.semicolon) {
     _stringLiteral = _becomeParentOf(stringLiteral);
   }
 
@@ -7528,15 +7498,15 @@
   Token get endToken => semicolon;
 
   @override
-  StringLiteral get stringLiteral => _stringLiteral;
+  StringLiteral? get stringLiteral => _stringLiteral;
 
   @override
-  set stringLiteral(StringLiteral stringLiteral) {
-    _stringLiteral = _becomeParentOf(stringLiteral as StringLiteralImpl);
+  set stringLiteral(StringLiteral? stringLiteral) {
+    _stringLiteral = _becomeParentOf(stringLiteral as StringLiteralImpl?);
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitNativeFunctionBody(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitNativeFunctionBody(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -7555,12 +7525,12 @@
   /// Initialize a newly created list of nodes such that all of the nodes that
   /// are added to the list will have their parent set to the given [owner]. The
   /// list will initially be populated with the given [elements].
-  NodeListImpl(this._owner, [List<E> elements]) {
+  NodeListImpl(this._owner, [List<E>? elements]) {
     addAll(elements);
   }
 
   @override
-  Token get beginToken {
+  Token? get beginToken {
     if (_elements.isEmpty) {
       return null;
     }
@@ -7568,7 +7538,7 @@
   }
 
   @override
-  Token get endToken {
+  Token? get endToken {
     int length = _elements.length;
     if (length == 0) {
       return null;
@@ -7618,7 +7588,7 @@
   }
 
   @override
-  bool addAll(Iterable<E> nodes) {
+  bool addAll(Iterable<E>? nodes) {
     if (nodes != null && nodes.isNotEmpty) {
       if (nodes is List<E>) {
         int length = nodes.length;
@@ -7691,55 +7661,55 @@
     implements NormalFormalParameter {
   /// The documentation comment associated with this parameter, or `null` if
   /// this parameter does not have a documentation comment associated with it.
-  CommentImpl _comment;
+  CommentImpl? _comment;
 
   /// The annotations associated with this parameter.
-  NodeList<Annotation> _metadata;
+  late NodeList<Annotation> _metadata;
 
   /// The 'covariant' keyword, or `null` if the keyword was not used.
   @override
-  Token covariantKeyword;
+  Token? covariantKeyword;
 
   /// The 'required' keyword, or `null` if the keyword was not used.
   @override
-  Token requiredKeyword;
+  Token? requiredKeyword;
 
   /// The name of the parameter being declared.
-  SimpleIdentifierImpl _identifier;
+  SimpleIdentifierImpl? _identifier;
 
   /// Initialize a newly created formal parameter. Either or both of the
   /// [comment] and [metadata] can be `null` if the parameter does not have the
   /// corresponding attribute.
   NormalFormalParameterImpl(
-      CommentImpl comment,
-      List<Annotation> metadata,
+      CommentImpl? comment,
+      List<Annotation>? metadata,
       this.covariantKeyword,
       this.requiredKeyword,
-      SimpleIdentifierImpl identifier) {
+      SimpleIdentifierImpl? identifier) {
     _comment = _becomeParentOf(comment);
     _metadata = NodeListImpl<Annotation>(this, metadata);
     _identifier = _becomeParentOf(identifier);
   }
 
   @override
-  Comment get documentationComment => _comment;
+  Comment? get documentationComment => _comment;
 
   @override
-  set documentationComment(Comment comment) {
-    _comment = _becomeParentOf(comment as CommentImpl);
+  set documentationComment(Comment? comment) {
+    _comment = _becomeParentOf(comment as CommentImpl?);
   }
 
   @override
-  SimpleIdentifier get identifier => _identifier;
+  SimpleIdentifier? get identifier => _identifier;
 
   @override
-  set identifier(SimpleIdentifier identifier) {
-    _identifier = _becomeParentOf(identifier as SimpleIdentifierImpl);
+  set identifier(SimpleIdentifier? identifier) {
+    _identifier = _becomeParentOf(identifier as SimpleIdentifierImpl?);
   }
 
   @override
   ParameterKind get kind {
-    AstNode parent = this.parent;
+    var parent = this.parent;
     if (parent is DefaultFormalParameterImpl) {
       return parent.kind;
     }
@@ -7758,7 +7728,7 @@
   @override
   List<AstNode> get sortedCommentAndAnnotations {
     return <AstNode>[]
-      ..add(_comment)
+      ..add(_comment!)
       ..addAll(_metadata)
       ..sort(AstNode.LEXICAL_ORDER);
   }
@@ -7800,7 +7770,7 @@
       return true;
     }
     Annotation firstAnnotation = _metadata[0];
-    return _comment.offset < firstAnnotation.offset;
+    return _comment!.offset < firstAnnotation.offset;
   }
 }
 
@@ -7826,7 +7796,7 @@
   Token get endToken => literal;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitNullLiteral(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitNullLiteral(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -7854,7 +7824,7 @@
   /// Usually this is just the node's parent, however if `this` is the base of
   /// a cascade section, it will be the cascade expression itself, which may be
   /// a more distant ancestor.
-  AstNode get _nullShortingExtensionCandidate;
+  AstNode? get _nullShortingExtensionCandidate;
 
   /// Indicates whether the effect of any null-shorting within [descendant]
   /// (which should be a descendant of `this`) should extend to include `this`.
@@ -7870,7 +7840,7 @@
   Token onKeyword;
 
   /// The classes are super-class constraints for the mixin.
-  NodeList<TypeName> _superclassConstraints;
+  late NodeList<TypeName> _superclassConstraints;
 
   /// Initialize a newly created on clause.
   OnClauseImpl(this.onKeyword, List<TypeName> superclassConstraints) {
@@ -7888,13 +7858,13 @@
     ..addAll(superclassConstraints);
 
   @override
-  Token get endToken => _superclassConstraints.endToken;
+  Token get endToken => _superclassConstraints.endToken!;
 
   @override
   NodeList<TypeName> get superclassConstraints => _superclassConstraints;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitOnClause(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitOnClause(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -7913,7 +7883,7 @@
   Token leftParenthesis;
 
   /// The expression within the parentheses.
-  ExpressionImpl _expression;
+  late ExpressionImpl _expression;
 
   /// The right parenthesis.
   @override
@@ -7954,18 +7924,18 @@
     // degenerate case.
     Expression expression = _expression;
     while (expression is ParenthesizedExpressionImpl) {
-      expression = (expression as ParenthesizedExpressionImpl)._expression;
+      expression = expression._expression;
     }
     return expression;
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) =>
+  E? accept<E>(AstVisitor<E> visitor) =>
       visitor.visitParenthesizedExpression(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _expression?.accept(visitor);
+    _expression.accept(visitor);
   }
 }
 
@@ -7985,7 +7955,7 @@
   /// Initialize a newly created part directive. Either or both of the [comment]
   /// and [metadata] can be `null` if the directive does not have the
   /// corresponding attribute.
-  PartDirectiveImpl(CommentImpl comment, List<Annotation> metadata,
+  PartDirectiveImpl(CommentImpl? comment, List<Annotation>? metadata,
       this.partKeyword, StringLiteralImpl partUri, this.semicolon)
       : super(comment, metadata, partUri);
 
@@ -8003,10 +7973,10 @@
   Token get keyword => partKeyword;
 
   @override
-  CompilationUnitElement get uriElement => element as CompilationUnitElement;
+  CompilationUnitElement? get uriElement => element as CompilationUnitElement?;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitPartDirective(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitPartDirective(this);
 }
 
 /// A part-of directive.
@@ -8023,12 +7993,12 @@
   Token ofKeyword;
 
   /// The URI of the library that the containing compilation unit is part of.
-  StringLiteralImpl _uri;
+  StringLiteralImpl? _uri;
 
   /// The name of the library that the containing compilation unit is part of,
   /// or `null` if no name was given (typically because a library URI was
   /// provided).
-  LibraryIdentifierImpl _libraryName;
+  LibraryIdentifierImpl? _libraryName;
 
   /// The semicolon terminating the directive.
   @override
@@ -8038,12 +8008,12 @@
   /// [comment] and [metadata] can be `null` if the directive does not have the
   /// corresponding attribute.
   PartOfDirectiveImpl(
-      CommentImpl comment,
-      List<Annotation> metadata,
+      CommentImpl? comment,
+      List<Annotation>? metadata,
       this.partKeyword,
       this.ofKeyword,
-      StringLiteralImpl uri,
-      LibraryIdentifierImpl libraryName,
+      StringLiteralImpl? uri,
+      LibraryIdentifierImpl? libraryName,
       this.semicolon)
       : super(comment, metadata) {
     _uri = _becomeParentOf(uri);
@@ -8068,23 +8038,23 @@
   Token get keyword => partKeyword;
 
   @override
-  LibraryIdentifier get libraryName => _libraryName;
+  LibraryIdentifier? get libraryName => _libraryName;
 
   @override
-  set libraryName(LibraryIdentifier libraryName) {
-    _libraryName = _becomeParentOf(libraryName as LibraryIdentifierImpl);
+  set libraryName(LibraryIdentifier? libraryName) {
+    _libraryName = _becomeParentOf(libraryName as LibraryIdentifierImpl?);
   }
 
   @override
-  StringLiteral get uri => _uri;
+  StringLiteral? get uri => _uri;
 
   @override
-  set uri(StringLiteral uri) {
-    _uri = _becomeParentOf(uri as StringLiteralImpl);
+  set uri(StringLiteral? uri) {
+    _uri = _becomeParentOf(uri as StringLiteralImpl?);
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitPartOfDirective(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitPartOfDirective(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -8102,7 +8072,7 @@
     with NullShortableExpressionImpl, CompoundAssignmentExpressionImpl
     implements PostfixExpression {
   /// The expression computing the operand for the operator.
-  ExpressionImpl _operand;
+  late ExpressionImpl _operand;
 
   /// The postfix operator being applied to the operand.
   @override
@@ -8112,7 +8082,7 @@
   /// operand, or `null` if the AST structure has not been resolved, if the
   /// operator is not user definable, or if the operator could not be resolved.
   @override
-  MethodElement staticElement;
+  MethodElement? staticElement;
 
   /// Initialize a newly created postfix expression.
   PostfixExpressionImpl(ExpressionImpl operand, this.operator) {
@@ -8141,17 +8111,17 @@
   Precedence get precedence => Precedence.postfix;
 
   @override
-  AstNode get _nullShortingExtensionCandidate => parent;
+  AstNode? get _nullShortingExtensionCandidate => parent;
 
   /// If the AST structure has been resolved, and the function being invoked is
   /// known based on static type information, then return the parameter element
   /// representing the parameter to which the value of the operand will be
   /// bound.  Otherwise, return `null`.
-  ParameterElement get _staticParameterElementForOperand {
+  ParameterElement? get _staticParameterElementForOperand {
     if (staticElement == null) {
       return null;
     }
-    List<ParameterElement> parameters = staticElement.parameters;
+    List<ParameterElement> parameters = staticElement!.parameters;
     if (parameters.isEmpty) {
       return null;
     }
@@ -8159,11 +8129,11 @@
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitPostfixExpression(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitPostfixExpression(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _operand?.accept(visitor);
+    _operand.accept(visitor);
   }
 
   @override
@@ -8178,14 +8148,14 @@
 class PrefixedIdentifierImpl extends IdentifierImpl
     implements PrefixedIdentifier {
   /// The prefix associated with the library in which the identifier is defined.
-  SimpleIdentifierImpl _prefix;
+  late SimpleIdentifierImpl _prefix;
 
   /// The period used to separate the prefix from the identifier.
   @override
   Token period;
 
   /// The identifier being prefixed.
-  SimpleIdentifierImpl _identifier;
+  late SimpleIdentifierImpl _identifier;
 
   /// Initialize a newly created prefixed identifier.
   PrefixedIdentifierImpl(SimpleIdentifierImpl prefix, this.period,
@@ -8194,11 +8164,6 @@
     _identifier = _becomeParentOf(identifier);
   }
 
-  /// Initialize a newly created prefixed identifier that does not take
-  /// ownership of the components. The resulting node is only for temporary use,
-  /// such as by resolution.
-  PrefixedIdentifierImpl.temp(this._prefix, this._identifier) : period = null;
-
   @override
   Token get beginToken => _prefix.beginToken;
 
@@ -8219,7 +8184,7 @@
 
   @override
   bool get isDeferred {
-    Element element = _prefix.staticElement;
+    Element? element = _prefix.staticElement;
     if (element is PrefixElement) {
       List<ImportElement> imports =
           element.enclosingElement.getImportsWithPrefix(element);
@@ -8246,20 +8211,17 @@
   }
 
   @override
-  Element get staticElement {
-    if (_identifier == null) {
-      return null;
-    }
+  Element? get staticElement {
     return _identifier.staticElement;
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitPrefixedIdentifier(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitPrefixedIdentifier(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _prefix?.accept(visitor);
-    _identifier?.accept(visitor);
+    _prefix.accept(visitor);
+    _identifier.accept(visitor);
   }
 }
 
@@ -8275,13 +8237,13 @@
   Token operator;
 
   /// The expression computing the operand for the operator.
-  ExpressionImpl _operand;
+  late ExpressionImpl _operand;
 
   /// The element associated with the operator based on the static type of the
   /// operand, or `null` if the AST structure has not been resolved, if the
   /// operator is not user definable, or if the operator could not be resolved.
   @override
-  MethodElement staticElement;
+  MethodElement? staticElement;
 
   /// Initialize a newly created prefix expression.
   PrefixExpressionImpl(this.operator, ExpressionImpl operand) {
@@ -8310,17 +8272,17 @@
   Precedence get precedence => Precedence.prefix;
 
   @override
-  AstNode get _nullShortingExtensionCandidate => parent;
+  AstNode? get _nullShortingExtensionCandidate => parent;
 
   /// If the AST structure has been resolved, and the function being invoked is
   /// known based on static type information, then return the parameter element
   /// representing the parameter to which the value of the operand will be
   /// bound.  Otherwise, return `null`.
-  ParameterElement get _staticParameterElementForOperand {
+  ParameterElement? get _staticParameterElementForOperand {
     if (staticElement == null) {
       return null;
     }
-    List<ParameterElement> parameters = staticElement.parameters;
+    List<ParameterElement> parameters = staticElement!.parameters;
     if (parameters.isEmpty) {
       return null;
     }
@@ -8328,11 +8290,11 @@
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitPrefixExpression(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitPrefixExpression(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _operand?.accept(visitor);
+    _operand.accept(visitor);
   }
 
   @override
@@ -8352,18 +8314,18 @@
     with NullShortableExpressionImpl
     implements PropertyAccess {
   /// The expression computing the object defining the property being accessed.
-  ExpressionImpl _target;
+  ExpressionImpl? _target;
 
   /// The property access operator.
   @override
   Token operator;
 
   /// The name of the property being accessed.
-  SimpleIdentifierImpl _propertyName;
+  late SimpleIdentifierImpl _propertyName;
 
   /// Initialize a newly created property access expression.
-  PropertyAccessImpl(
-      ExpressionImpl target, this.operator, SimpleIdentifierImpl propertyName) {
+  PropertyAccessImpl(ExpressionImpl? target, this.operator,
+      SimpleIdentifierImpl propertyName) {
     _target = _becomeParentOf(target);
     _propertyName = _becomeParentOf(propertyName);
   }
@@ -8371,7 +8333,7 @@
   @override
   Token get beginToken {
     if (_target != null) {
-      return _target.beginToken;
+      return _target!.beginToken;
     }
     return operator;
   }
@@ -8388,18 +8350,16 @@
 
   @override
   bool get isCascaded =>
-      operator != null &&
-      (operator.type == TokenType.PERIOD_PERIOD ||
-          operator.type == TokenType.QUESTION_PERIOD_PERIOD);
+      operator.type == TokenType.PERIOD_PERIOD ||
+      operator.type == TokenType.QUESTION_PERIOD_PERIOD;
 
   @override
   bool get isNullAware {
     if (isCascaded) {
       return _ancestorCascade.isNullAware;
     }
-    return operator != null &&
-        (operator.type == TokenType.QUESTION_PERIOD ||
-            operator.type == TokenType.QUESTION_PERIOD_PERIOD);
+    return operator.type == TokenType.QUESTION_PERIOD ||
+        operator.type == TokenType.QUESTION_PERIOD_PERIOD;
   }
 
   @override
@@ -8418,15 +8378,15 @@
     if (isCascaded) {
       return _ancestorCascade.target;
     }
-    return _target;
+    return _target!;
   }
 
   @override
-  Expression get target => _target;
+  Expression? get target => _target;
 
   @override
-  set target(Expression expression) {
-    _target = _becomeParentOf(expression as ExpressionImpl);
+  set target(Expression? expression) {
+    _target = _becomeParentOf(expression as ExpressionImpl?);
   }
 
   /// Return the cascade that contains this [IndexExpression].
@@ -8434,7 +8394,7 @@
   /// We expect that [isCascaded] is `true`.
   CascadeExpression get _ancestorCascade {
     assert(isCascaded);
-    for (var ancestor = parent;; ancestor = ancestor.parent) {
+    for (var ancestor = parent!;; ancestor = ancestor.parent!) {
       if (ancestor is CascadeExpression) {
         return ancestor;
       }
@@ -8442,15 +8402,15 @@
   }
 
   @override
-  AstNode get _nullShortingExtensionCandidate => parent;
+  AstNode? get _nullShortingExtensionCandidate => parent;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitPropertyAccess(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitPropertyAccess(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
     _target?.accept(visitor);
-    _propertyName?.accept(visitor);
+    _propertyName.accept(visitor);
   }
 
   @override
@@ -8471,27 +8431,27 @@
   /// The token for the period before the name of the constructor that is being
   /// invoked, or `null` if the unnamed constructor is being invoked.
   @override
-  Token period;
+  Token? period;
 
   /// The name of the constructor that is being invoked, or `null` if the
   /// unnamed constructor is being invoked.
-  SimpleIdentifierImpl _constructorName;
+  SimpleIdentifierImpl? _constructorName;
 
   /// The list of arguments to the constructor.
-  ArgumentListImpl _argumentList;
+  late ArgumentListImpl _argumentList;
 
   /// The element associated with the constructor based on static type
   /// information, or `null` if the AST structure has not been resolved or if
   /// the constructor could not be resolved.
   @override
-  ConstructorElement staticElement;
+  ConstructorElement? staticElement;
 
   /// Initialize a newly created redirecting invocation to invoke the
   /// constructor with the given name with the given arguments. The
   /// [constructorName] can be `null` if the constructor being invoked is the
   /// unnamed constructor.
   RedirectingConstructorInvocationImpl(this.thisKeyword, this.period,
-      SimpleIdentifierImpl constructorName, ArgumentListImpl argumentList) {
+      SimpleIdentifierImpl? constructorName, ArgumentListImpl argumentList) {
     _constructorName = _becomeParentOf(constructorName);
     _argumentList = _becomeParentOf(argumentList);
   }
@@ -8515,24 +8475,24 @@
     ..add(_argumentList);
 
   @override
-  SimpleIdentifier get constructorName => _constructorName;
+  SimpleIdentifier? get constructorName => _constructorName;
 
   @override
-  set constructorName(SimpleIdentifier identifier) {
-    _constructorName = _becomeParentOf(identifier as SimpleIdentifierImpl);
+  set constructorName(SimpleIdentifier? identifier) {
+    _constructorName = _becomeParentOf(identifier as SimpleIdentifierImpl?);
   }
 
   @override
   Token get endToken => _argumentList.endToken;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) =>
+  E? accept<E>(AstVisitor<E> visitor) =>
       visitor.visitRedirectingConstructorInvocation(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
     _constructorName?.accept(visitor);
-    _argumentList?.accept(visitor);
+    _argumentList.accept(visitor);
   }
 }
 
@@ -8563,7 +8523,7 @@
   Precedence get precedence => Precedence.assignment;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitRethrowExpression(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitRethrowExpression(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -8582,7 +8542,7 @@
 
   /// The expression computing the value to be returned, or `null` if no
   /// explicit value was provided.
-  ExpressionImpl _expression;
+  ExpressionImpl? _expression;
 
   /// The semicolon terminating the statement.
   @override
@@ -8591,7 +8551,7 @@
   /// Initialize a newly created return statement. The [expression] can be
   /// `null` if no explicit value was provided.
   ReturnStatementImpl(
-      this.returnKeyword, ExpressionImpl expression, this.semicolon) {
+      this.returnKeyword, ExpressionImpl? expression, this.semicolon) {
     _expression = _becomeParentOf(expression);
   }
 
@@ -8606,15 +8566,15 @@
   Token get endToken => semicolon;
 
   @override
-  Expression get expression => _expression;
+  Expression? get expression => _expression;
 
   @override
-  set expression(Expression expression) {
-    _expression = _becomeParentOf(expression as ExpressionImpl);
+  set expression(Expression? expression) {
+    _expression = _becomeParentOf(expression as ExpressionImpl?);
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitReturnStatement(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitReturnStatement(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -8646,7 +8606,7 @@
   Token get endToken => scriptTag;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitScriptTag(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitScriptTag(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -8659,14 +8619,14 @@
   Token leftBracket;
 
   /// The syntactic elements in the set.
-  NodeList<CollectionElement> _elements;
+  late NodeList<CollectionElement> _elements;
 
   @override
   Token rightBracket;
 
   /// A representation of whether this literal represents a map or a set, or
   /// whether the kind has not or cannot be determined.
-  _SetOrMapKind _resolvedKind;
+  _SetOrMapKind _resolvedKind = _SetOrMapKind.unresolved;
 
   /// The context type computed by
   /// [ResolverVisitor._computeSetOrMapContextType].
@@ -8679,25 +8639,24 @@
   ///
   /// The context pushed down by type inference is null, whereas the
   /// `contextType` is `Map<dynamic, dynamic>`.
-  InterfaceType contextType;
+  InterfaceType? contextType;
 
   /// Initialize a newly created set or map literal. The [constKeyword] can be
   /// `null` if the literal is not a constant. The [typeArguments] can be `null`
   /// if no type arguments were declared. The [elements] can be `null` if the
   /// set is empty.
-  SetOrMapLiteralImpl(Token constKeyword, TypeArgumentListImpl typeArguments,
+  SetOrMapLiteralImpl(Token? constKeyword, TypeArgumentListImpl? typeArguments,
       this.leftBracket, List<CollectionElement> elements, this.rightBracket)
       : super(constKeyword, typeArguments) {
     _elements = NodeListImpl<CollectionElement>(this, elements);
-    _resolvedKind = _SetOrMapKind.unresolved;
   }
 
   @override
   Token get beginToken {
     if (constKeyword != null) {
-      return constKeyword;
+      return constKeyword!;
     }
-    TypeArgumentList typeArguments = this.typeArguments;
+    var typeArguments = this.typeArguments;
     if (typeArguments != null) {
       return typeArguments.beginToken;
     }
@@ -8724,7 +8683,7 @@
   bool get isSet => _resolvedKind == _SetOrMapKind.set;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitSetOrMapLiteral(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitSetOrMapLiteral(this);
 
   void becomeMap() {
     assert(_resolvedKind == _SetOrMapKind.unresolved ||
@@ -8757,7 +8716,7 @@
 class ShowCombinatorImpl extends CombinatorImpl implements ShowCombinator {
   /// The list of names from the library that are made visible by this
   /// combinator.
-  NodeList<SimpleIdentifier> _shownNames;
+  late NodeList<SimpleIdentifier> _shownNames;
 
   /// Initialize a newly created import show combinator.
   ShowCombinatorImpl(Token keyword, List<SimpleIdentifier> shownNames)
@@ -8772,13 +8731,13 @@
     ..addAll(_shownNames);
 
   @override
-  Token get endToken => _shownNames.endToken;
+  Token get endToken => _shownNames.endToken!;
 
   @override
   NodeList<SimpleIdentifier> get shownNames => _shownNames;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitShowCombinator(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitShowCombinator(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -8795,30 +8754,30 @@
   /// The token representing either the 'final', 'const' or 'var' keyword, or
   /// `null` if no keyword was used.
   @override
-  Token keyword;
+  Token? keyword;
 
   /// The name of the declared type of the parameter, or `null` if the parameter
   /// does not have a declared type.
-  TypeAnnotationImpl _type;
+  TypeAnnotationImpl? _type;
 
   @override
   // TODO(brianwilkerson) This overrides a concrete implementation in which the
   // element is assumed to be stored in the `identifier`, but there is no
   // corresponding inherited setter. This seems inconsistent and error prone.
-  ParameterElement declaredElement;
+  ParameterElement? declaredElement;
 
   /// Initialize a newly created formal parameter. Either or both of the
   /// [comment] and [metadata] can be `null` if the parameter does not have the
   /// corresponding attribute. The [keyword] can be `null` if a type was
   /// specified. The [type] must be `null` if the keyword is 'var'.
   SimpleFormalParameterImpl(
-      CommentImpl comment,
-      List<Annotation> metadata,
-      Token covariantKeyword,
-      Token requiredKeyword,
+      CommentImpl? comment,
+      List<Annotation>? metadata,
+      Token? covariantKeyword,
+      Token? requiredKeyword,
       this.keyword,
-      TypeAnnotationImpl type,
-      SimpleIdentifierImpl identifier)
+      TypeAnnotationImpl? type,
+      SimpleIdentifierImpl? identifier)
       : super(
             comment, metadata, covariantKeyword, requiredKeyword, identifier) {
     _type = _becomeParentOf(type);
@@ -8828,17 +8787,17 @@
   Token get beginToken {
     NodeList<Annotation> metadata = this.metadata;
     if (metadata.isNotEmpty) {
-      return metadata.beginToken;
+      return metadata.beginToken!;
     } else if (requiredKeyword != null) {
-      return requiredKeyword;
+      return requiredKeyword!;
     } else if (covariantKeyword != null) {
-      return covariantKeyword;
+      return covariantKeyword!;
     } else if (keyword != null) {
-      return keyword;
+      return keyword!;
     } else if (_type != null) {
-      return _type.beginToken;
+      return _type!.beginToken;
     }
-    return identifier?.beginToken;
+    return identifier!.beginToken;
   }
 
   @override
@@ -8846,7 +8805,7 @@
       super._childEntities..add(keyword)..add(_type)..add(identifier);
 
   @override
-  Token get endToken => identifier?.endToken ?? type?.endToken;
+  Token get endToken => identifier?.endToken ?? type!.endToken;
 
   @override
   bool get isConst => keyword?.keyword == Keyword.CONST;
@@ -8855,15 +8814,15 @@
   bool get isFinal => keyword?.keyword == Keyword.FINAL;
 
   @override
-  TypeAnnotation get type => _type;
+  TypeAnnotation? get type => _type;
 
   @override
-  set type(TypeAnnotation type) {
-    _type = _becomeParentOf(type as TypeAnnotationImpl);
+  set type(TypeAnnotation? type) {
+    _type = _becomeParentOf(type as TypeAnnotationImpl?);
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) =>
+  E? accept<E>(AstVisitor<E> visitor) =>
       visitor.visitSimpleFormalParameter(this);
 
   @override
@@ -8890,10 +8849,10 @@
   /// The element associated with this identifier based on static type
   /// information, or `null` if the AST structure has not been resolved or if
   /// this identifier could not be resolved.
-  Element _staticElement;
+  Element? _staticElement;
 
   @override
-  List<DartType> tearOffTypeArgumentTypes;
+  List<DartType>? tearOffTypeArgumentTypes;
 
   /// Initialize a newly created identifier.
   SimpleIdentifierImpl(this.token);
@@ -8909,7 +8868,7 @@
 
   @override
   bool get isQualified {
-    AstNode parent = this.parent;
+    AstNode parent = this.parent!;
     if (parent is PrefixedIdentifier) {
       return identical(parent.identifier, this);
     } else if (parent is PropertyAccess) {
@@ -8956,18 +8915,18 @@
   /// All three [readElement], [writeElement], and [referenceElement] can be
   /// `null` when the AST structure has not been resolved, or this identifier
   /// could not be resolved.
-  Element get referenceElement => null;
+  Element? get referenceElement => null;
 
   @override
-  Element get staticElement => _staticElement;
+  Element? get staticElement => _staticElement;
 
   @override
-  set staticElement(Element element) {
+  set staticElement(Element? element) {
     _staticElement = element;
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitSimpleIdentifier(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitSimpleIdentifier(this);
 
   @override
   bool inDeclarationContext() => false;
@@ -8975,7 +8934,7 @@
   @override
   bool inGetterContext() {
     // TODO(brianwilkerson) Convert this to a getter.
-    AstNode initialParent = this.parent;
+    AstNode initialParent = this.parent!;
     AstNode parent = initialParent;
     AstNode target = this;
     // skip prefix
@@ -8983,13 +8942,13 @@
       if (identical(initialParent.prefix, this)) {
         return true;
       }
-      parent = initialParent.parent;
+      parent = initialParent.parent!;
       target = initialParent;
     } else if (initialParent is PropertyAccess) {
       if (identical(initialParent.target, this)) {
         return true;
       }
-      parent = initialParent.parent;
+      parent = initialParent.parent!;
       target = initialParent;
     }
     // skip label
@@ -9028,7 +8987,7 @@
   @override
   bool inSetterContext() {
     // TODO(brianwilkerson) Convert this to a getter.
-    AstNode initialParent = this.parent;
+    AstNode initialParent = this.parent!;
     AstNode parent = initialParent;
     AstNode target = this;
     // skip prefix
@@ -9037,13 +8996,13 @@
       if (identical(initialParent.prefix, this)) {
         return false;
       }
-      parent = initialParent.parent;
+      parent = initialParent.parent!;
       target = initialParent;
     } else if (initialParent is PropertyAccess) {
       if (identical(initialParent.target, this)) {
         return false;
       }
-      parent = initialParent.parent;
+      parent = initialParent.parent!;
       target = initialParent;
     }
     // analyze usage
@@ -9092,7 +9051,7 @@
   Token literal;
 
   /// The value of the literal.
-  String _value;
+  late String _value;
 
   /// Initialize a newly created simple string literal.
   SimpleStringLiteralImpl(this.literal, String value) {
@@ -9139,7 +9098,7 @@
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitSimpleStringLiteral(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitSimpleStringLiteral(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -9165,7 +9124,7 @@
   @override
   Token spreadOperator;
 
-  ExpressionImpl _expression;
+  late ExpressionImpl _expression;
 
   SpreadElementImpl(this.spreadOperator, ExpressionImpl expression) {
     _expression = _becomeParentOf(expression);
@@ -9193,13 +9152,13 @@
       spreadOperator.type == TokenType.PERIOD_PERIOD_PERIOD_QUESTION;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) {
+  E? accept<E>(AstVisitor<E> visitor) {
     return visitor.visitSpreadElement(this);
   }
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _expression?.accept(visitor);
+    _expression.accept(visitor);
   }
 }
 
@@ -9233,7 +9192,7 @@
 class StringInterpolationImpl extends SingleStringLiteralImpl
     implements StringInterpolation {
   /// The elements that will be composed to produce the resulting string.
-  NodeList<InterpolationElement> _elements;
+  late NodeList<InterpolationElement> _elements;
 
   /// Initialize a newly created string interpolation expression.
   StringInterpolationImpl(List<InterpolationElement> elements) {
@@ -9241,7 +9200,7 @@
   }
 
   @override
-  Token get beginToken => _elements.beginToken;
+  Token get beginToken => _elements.beginToken!;
 
   @override
   Iterable<SyntacticEntity> get childEntities =>
@@ -9249,13 +9208,13 @@
 
   @override
   int get contentsEnd {
-    InterpolationString element = _elements.last;
+    var element = _elements.last as InterpolationString;
     return element.contentsEnd;
   }
 
   @override
   int get contentsOffset {
-    InterpolationString element = _elements.first;
+    var element = _elements.first as InterpolationString;
     return element.contentsOffset;
   }
 
@@ -9264,7 +9223,7 @@
   NodeList<InterpolationElement> get elements => _elements;
 
   @override
-  Token get endToken => _elements.endToken;
+  Token get endToken => _elements.endToken!;
 
   @override
   bool get isMultiline => _firstHelper.isMultiline;
@@ -9276,13 +9235,13 @@
   bool get isSingleQuoted => _firstHelper.isSingleQuoted;
 
   StringLexemeHelper get _firstHelper {
-    InterpolationString lastString = _elements.first;
+    var lastString = _elements.first as InterpolationString;
     String lexeme = lastString.contents.lexeme;
     return StringLexemeHelper(lexeme, true, false);
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitStringInterpolation(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitStringInterpolation(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -9305,7 +9264,7 @@
   bool isSingleQuoted = false;
   bool isMultiline = false;
   int start = 0;
-  int end;
+  late int end;
 
   StringLexemeHelper(this.lexeme, this.isFirst, this.isLast) {
     if (isFirst) {
@@ -9394,7 +9353,7 @@
 ///      | [StringInterpolation]
 abstract class StringLiteralImpl extends LiteralImpl implements StringLiteral {
   @override
-  String get stringValue {
+  String? get stringValue {
     StringBuffer buffer = StringBuffer();
     try {
       _appendStringValue(buffer);
@@ -9424,27 +9383,27 @@
   /// The token for the period before the name of the constructor that is being
   /// invoked, or `null` if the unnamed constructor is being invoked.
   @override
-  Token period;
+  Token? period;
 
   /// The name of the constructor that is being invoked, or `null` if the
   /// unnamed constructor is being invoked.
-  SimpleIdentifierImpl _constructorName;
+  SimpleIdentifierImpl? _constructorName;
 
   /// The list of arguments to the constructor.
-  ArgumentListImpl _argumentList;
+  late ArgumentListImpl _argumentList;
 
   /// The element associated with the constructor based on static type
   /// information, or `null` if the AST structure has not been resolved or if
   /// the constructor could not be resolved.
   @override
-  ConstructorElement staticElement;
+  ConstructorElement? staticElement;
 
   /// Initialize a newly created super invocation to invoke the inherited
   /// constructor with the given name with the given arguments. The [period] and
   /// [constructorName] can be `null` if the constructor being invoked is the
   /// unnamed constructor.
   SuperConstructorInvocationImpl(this.superKeyword, this.period,
-      SimpleIdentifierImpl constructorName, ArgumentListImpl argumentList) {
+      SimpleIdentifierImpl? constructorName, ArgumentListImpl argumentList) {
     _constructorName = _becomeParentOf(constructorName);
     _argumentList = _becomeParentOf(argumentList);
   }
@@ -9468,24 +9427,24 @@
     ..add(_argumentList);
 
   @override
-  SimpleIdentifier get constructorName => _constructorName;
+  SimpleIdentifier? get constructorName => _constructorName;
 
   @override
-  set constructorName(SimpleIdentifier identifier) {
-    _constructorName = _becomeParentOf(identifier as SimpleIdentifierImpl);
+  set constructorName(SimpleIdentifier? identifier) {
+    _constructorName = _becomeParentOf(identifier as SimpleIdentifierImpl?);
   }
 
   @override
   Token get endToken => _argumentList.endToken;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) =>
+  E? accept<E>(AstVisitor<E> visitor) =>
       visitor.visitSuperConstructorInvocation(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
     _constructorName?.accept(visitor);
-    _argumentList?.accept(visitor);
+    _argumentList.accept(visitor);
   }
 }
 
@@ -9515,7 +9474,7 @@
   Precedence get precedence => Precedence.primary;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitSuperExpression(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitSuperExpression(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -9529,7 +9488,7 @@
 ///        [SimpleIdentifier]* 'case' [Expression] ':' [Statement]*
 class SwitchCaseImpl extends SwitchMemberImpl implements SwitchCase {
   /// The expression controlling whether the statements will be executed.
-  ExpressionImpl _expression;
+  late ExpressionImpl _expression;
 
   /// Initialize a newly created switch case. The list of [labels] can be `null`
   /// if there are no labels.
@@ -9556,12 +9515,12 @@
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitSwitchCase(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitSwitchCase(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
     labels.accept(visitor);
-    _expression?.accept(visitor);
+    _expression.accept(visitor);
     statements.accept(visitor);
   }
 }
@@ -9585,7 +9544,7 @@
     ..addAll(statements);
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitSwitchDefault(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitSwitchDefault(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -9601,7 +9560,7 @@
 ///      | switchDefault
 abstract class SwitchMemberImpl extends AstNodeImpl implements SwitchMember {
   /// The labels associated with the switch member.
-  NodeList<Label> _labels;
+  late NodeList<Label> _labels;
 
   /// The token representing the 'case' or 'default' keyword.
   @override
@@ -9612,7 +9571,7 @@
   Token colon;
 
   /// The statements that will be executed if this switch member is selected.
-  NodeList<Statement> _statements;
+  late NodeList<Statement> _statements;
 
   /// Initialize a newly created switch member. The list of [labels] can be
   /// `null` if there are no labels.
@@ -9625,7 +9584,7 @@
   @override
   Token get beginToken {
     if (_labels.isNotEmpty) {
-      return _labels.beginToken;
+      return _labels.beginToken!;
     }
     return keyword;
   }
@@ -9633,7 +9592,7 @@
   @override
   Token get endToken {
     if (_statements.isNotEmpty) {
-      return _statements.endToken;
+      return _statements.endToken!;
     }
     return colon;
   }
@@ -9660,7 +9619,7 @@
 
   /// The expression used to determine which of the switch members will be
   /// selected.
-  ExpressionImpl _expression;
+  late ExpressionImpl _expression;
 
   /// The right parenthesis.
   @override
@@ -9671,7 +9630,7 @@
   Token leftBracket;
 
   /// The switch members that can be selected by the expression.
-  NodeList<SwitchMember> _members;
+  late NodeList<SwitchMember> _members;
 
   /// The right curly bracket.
   @override
@@ -9719,11 +9678,11 @@
   NodeList<SwitchMember> get members => _members;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitSwitchStatement(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitSwitchStatement(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _expression?.accept(visitor);
+    _expression.accept(visitor);
     _members.accept(visitor);
   }
 }
@@ -9757,7 +9716,7 @@
   Token get endToken => components[components.length - 1];
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitSymbolLiteral(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitSymbolLiteral(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -9791,7 +9750,7 @@
   Precedence get precedence => Precedence.primary;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitThisExpression(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitThisExpression(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -9809,7 +9768,7 @@
   Token throwKeyword;
 
   /// The expression computing the exception to be thrown.
-  ExpressionImpl _expression;
+  late ExpressionImpl _expression;
 
   /// Initialize a newly created throw expression.
   ThrowExpressionImpl(this.throwKeyword, ExpressionImpl expression) {
@@ -9825,10 +9784,7 @@
 
   @override
   Token get endToken {
-    if (_expression != null) {
-      return _expression.endToken;
-    }
-    return throwKeyword;
+    return _expression.endToken;
   }
 
   @override
@@ -9843,11 +9799,11 @@
   Precedence get precedence => Precedence.assignment;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitThrowExpression(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitThrowExpression(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _expression?.accept(visitor);
+    _expression.accept(visitor);
   }
 }
 
@@ -9860,10 +9816,10 @@
     with HasAstLinkedContext
     implements TopLevelVariableDeclaration {
   /// The top-level variables being declared.
-  VariableDeclarationListImpl _variableList;
+  late VariableDeclarationListImpl _variableList;
 
   @override
-  Token externalKeyword;
+  Token? externalKeyword;
 
   /// The semicolon terminating the declaration.
   @override
@@ -9873,8 +9829,8 @@
   /// of the [comment] and [metadata] can be `null` if the variable does not
   /// have the corresponding attribute.
   TopLevelVariableDeclarationImpl(
-      CommentImpl comment,
-      List<Annotation> metadata,
+      CommentImpl? comment,
+      List<Annotation>? metadata,
       this.externalKeyword,
       VariableDeclarationListImpl variableList,
       this.semicolon)
@@ -9887,7 +9843,7 @@
       super._childEntities..add(_variableList)..add(semicolon);
 
   @override
-  Element get declaredElement => null;
+  Element? get declaredElement => null;
 
   @override
   Token get endToken => semicolon;
@@ -9905,13 +9861,13 @@
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) =>
+  E? accept<E>(AstVisitor<E> visitor) =>
       visitor.visitTopLevelVariableDeclaration(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
-    _variableList?.accept(visitor);
+    _variableList.accept(visitor);
   }
 }
 
@@ -9928,19 +9884,19 @@
   Token tryKeyword;
 
   /// The body of the statement.
-  BlockImpl _body;
+  late BlockImpl _body;
 
   /// The catch clauses contained in the try statement.
-  NodeList<CatchClause> _catchClauses;
+  late NodeList<CatchClause> _catchClauses;
 
   /// The token representing the 'finally' keyword, or `null` if the statement
   /// does not contain a finally clause.
   @override
-  Token finallyKeyword;
+  Token? finallyKeyword;
 
   /// The finally block contained in the try statement, or `null` if the
   /// statement does not contain a finally clause.
-  BlockImpl _finallyBlock;
+  BlockImpl? _finallyBlock;
 
   /// Initialize a newly created try statement. The list of [catchClauses] can
   /// be`null` if there are no catch clauses. The [finallyKeyword] and
@@ -9950,7 +9906,7 @@
       BlockImpl body,
       List<CatchClause> catchClauses,
       this.finallyKeyword,
-      BlockImpl finallyBlock) {
+      BlockImpl? finallyBlock) {
     _body = _becomeParentOf(body);
     _catchClauses = NodeListImpl<CatchClause>(this, catchClauses);
     _finallyBlock = _becomeParentOf(finallyBlock);
@@ -9981,29 +9937,29 @@
   @override
   Token get endToken {
     if (_finallyBlock != null) {
-      return _finallyBlock.endToken;
+      return _finallyBlock!.endToken;
     } else if (finallyKeyword != null) {
-      return finallyKeyword;
+      return finallyKeyword!;
     } else if (_catchClauses.isNotEmpty) {
-      return _catchClauses.endToken;
+      return _catchClauses.endToken!;
     }
     return _body.endToken;
   }
 
   @override
-  Block get finallyBlock => _finallyBlock;
+  Block? get finallyBlock => _finallyBlock;
 
   @override
-  set finallyBlock(Block block) {
-    _finallyBlock = _becomeParentOf(block as BlockImpl);
+  set finallyBlock(Block? block) {
+    _finallyBlock = _becomeParentOf(block as BlockImpl?);
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitTryStatement(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitTryStatement(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _body?.accept(visitor);
+    _body.accept(visitor);
     _catchClauses.accept(visitor);
     _finallyBlock?.accept(visitor);
   }
@@ -10030,7 +9986,7 @@
   /// Initialize a newly created type alias. Either or both of the [comment] and
   /// [metadata] can be `null` if the declaration does not have the
   /// corresponding attribute.
-  TypeAliasImpl(CommentImpl comment, List<Annotation> metadata,
+  TypeAliasImpl(CommentImpl? comment, List<Annotation>? metadata,
       this.typedefKeyword, SimpleIdentifierImpl name, this.semicolon)
       : super(comment, metadata, name);
 
@@ -10059,7 +10015,7 @@
   Token leftBracket;
 
   /// The type arguments associated with the type.
-  NodeList<TypeAnnotation> _arguments;
+  late NodeList<TypeAnnotation> _arguments;
 
   /// The right bracket.
   @override
@@ -10088,7 +10044,7 @@
   Token get endToken => rightBracket;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitTypeArgumentList(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitTypeArgumentList(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -10105,16 +10061,16 @@
   /// The token representing the 'const' keyword, or `null` if the literal is
   /// not a constant.
   @override
-  Token constKeyword;
+  Token? constKeyword;
 
   /// The type argument associated with this literal, or `null` if no type
   /// arguments were declared.
-  TypeArgumentListImpl _typeArguments;
+  TypeArgumentListImpl? _typeArguments;
 
   /// Initialize a newly created typed literal. The [constKeyword] can be
   /// `null` if the literal is not a constant. The [typeArguments] can be `null`
   /// if no type arguments were declared.
-  TypedLiteralImpl(this.constKeyword, TypeArgumentListImpl typeArguments) {
+  TypedLiteralImpl(this.constKeyword, TypeArgumentListImpl? typeArguments) {
     _typeArguments = _becomeParentOf(typeArguments);
   }
 
@@ -10124,11 +10080,11 @@
   }
 
   @override
-  TypeArgumentList get typeArguments => _typeArguments;
+  TypeArgumentList? get typeArguments => _typeArguments;
 
   @override
-  set typeArguments(TypeArgumentList typeArguments) {
-    _typeArguments = _becomeParentOf(typeArguments as TypeArgumentListImpl);
+  set typeArguments(TypeArgumentList? typeArguments) {
+    _typeArguments = _becomeParentOf(typeArguments as TypeArgumentListImpl?);
   }
 
   ChildEntities get _childEntities =>
@@ -10146,23 +10102,23 @@
 ///        [Identifier] typeArguments? '?'?
 class TypeNameImpl extends TypeAnnotationImpl implements TypeName {
   /// The name of the type.
-  IdentifierImpl _name;
+  late IdentifierImpl _name;
 
   /// The type arguments associated with the type, or `null` if there are no
   /// type arguments.
-  TypeArgumentListImpl _typeArguments;
+  TypeArgumentListImpl? _typeArguments;
 
   @override
-  Token question;
+  Token? question;
 
   /// The type being named, or `null` if the AST structure has not been
   /// resolved.
   @override
-  DartType type;
+  DartType? type;
 
   /// Initialize a newly created type name. The [typeArguments] can be `null` if
   /// there are no type arguments.
-  TypeNameImpl(IdentifierImpl name, TypeArgumentListImpl typeArguments,
+  TypeNameImpl(IdentifierImpl name, TypeArgumentListImpl? typeArguments,
       {this.question}) {
     _name = _becomeParentOf(name);
     _typeArguments = _becomeParentOf(typeArguments);
@@ -10184,7 +10140,7 @@
     if (identifier is! PrefixedIdentifier) {
       return false;
     }
-    return (identifier as PrefixedIdentifier).isDeferred;
+    return identifier.isDeferred;
   }
 
   @override
@@ -10199,19 +10155,19 @@
   }
 
   @override
-  TypeArgumentList get typeArguments => _typeArguments;
+  TypeArgumentList? get typeArguments => _typeArguments;
 
   @override
-  set typeArguments(TypeArgumentList typeArguments) {
-    _typeArguments = _becomeParentOf(typeArguments as TypeArgumentListImpl);
+  set typeArguments(TypeArgumentList? typeArguments) {
+    _typeArguments = _becomeParentOf(typeArguments as TypeArgumentListImpl?);
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitTypeName(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitTypeName(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _name?.accept(visitor);
+    _name.accept(visitor);
     _typeArguments?.accept(visitor);
   }
 }
@@ -10224,43 +10180,43 @@
 ///    typeParameterVariance ::= 'out' | 'inout' | 'in'
 class TypeParameterImpl extends DeclarationImpl implements TypeParameter {
   /// The name of the type parameter.
-  SimpleIdentifierImpl _name;
+  late SimpleIdentifierImpl _name;
 
   /// The token representing the variance modifier keyword, or `null` if
   /// there is no explicit variance modifier, meaning legacy covariance.
-  Token varianceKeyword;
+  Token? varianceKeyword;
 
   /// The token representing the 'extends' keyword, or `null` if there is no
   /// explicit upper bound.
   @override
-  Token extendsKeyword;
+  Token? extendsKeyword;
 
   /// The name of the upper bound for legal arguments, or `null` if there is no
   /// explicit upper bound.
-  TypeAnnotationImpl _bound;
+  TypeAnnotationImpl? _bound;
 
   /// Data that is read during loading this node from summary, but is not
   /// fully applied yet. For example in many cases we don't need the
   /// documentation comment, and it is expensive to decode strings.
-  Object summaryData;
+  Object? summaryData;
 
   /// Initialize a newly created type parameter. Either or both of the [comment]
   /// and [metadata] can be `null` if the parameter does not have the
   /// corresponding attribute. The [extendsKeyword] and [bound] can be `null` if
   /// the parameter does not have an upper bound.
-  TypeParameterImpl(CommentImpl comment, List<Annotation> metadata,
-      SimpleIdentifierImpl name, this.extendsKeyword, TypeAnnotationImpl bound)
+  TypeParameterImpl(CommentImpl? comment, List<Annotation>? metadata,
+      SimpleIdentifierImpl name, this.extendsKeyword, TypeAnnotationImpl? bound)
       : super(comment, metadata) {
     _name = _becomeParentOf(name);
     _bound = _becomeParentOf(bound);
   }
 
   @override
-  TypeAnnotation get bound => _bound;
+  TypeAnnotation? get bound => _bound;
 
   @override
-  set bound(TypeAnnotation type) {
-    _bound = _becomeParentOf(type as TypeAnnotationImpl);
+  set bound(TypeAnnotation? type) {
+    _bound = _becomeParentOf(type as TypeAnnotationImpl?);
   }
 
   @override
@@ -10268,15 +10224,15 @@
       super._childEntities..add(_name)..add(extendsKeyword)..add(_bound);
 
   @override
-  TypeParameterElement get declaredElement =>
-      _name?.staticElement as TypeParameterElement;
+  TypeParameterElement? get declaredElement =>
+      _name.staticElement as TypeParameterElement?;
 
   @override
   Token get endToken {
     if (_bound == null) {
       return _name.endToken;
     }
-    return _bound.endToken;
+    return _bound!.endToken;
   }
 
   @override
@@ -10291,12 +10247,12 @@
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitTypeParameter(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitTypeParameter(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
-    _name?.accept(visitor);
+    _name.accept(visitor);
     _bound?.accept(visitor);
   }
 }
@@ -10311,7 +10267,7 @@
   final Token leftBracket;
 
   /// The type parameters in the list.
-  NodeList<TypeParameter> _typeParameters;
+  late NodeList<TypeParameter> _typeParameters;
 
   /// The right angle bracket.
   @override
@@ -10339,7 +10295,7 @@
   NodeList<TypeParameter> get typeParameters => _typeParameters;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitTypeParameterList(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitTypeParameterList(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -10360,19 +10316,19 @@
   static const String _DART_EXT_SCHEME = "dart-ext:";
 
   /// The URI referenced by this directive.
-  StringLiteralImpl _uri;
+  late StringLiteralImpl _uri;
 
   @override
-  String uriContent;
+  String? uriContent;
 
   @override
-  Source uriSource;
+  Source? uriSource;
 
   /// Initialize a newly create URI-based directive. Either or both of the
   /// [comment] and [metadata] can be `null` if the directive does not have the
   /// corresponding attribute.
   UriBasedDirectiveImpl(
-      CommentImpl comment, List<Annotation> metadata, StringLiteralImpl uri)
+      CommentImpl? comment, List<Annotation>? metadata, StringLiteralImpl uri)
       : super(comment, metadata) {
     _uri = _becomeParentOf(uri);
   }
@@ -10385,20 +10341,20 @@
     _uri = _becomeParentOf(uri as StringLiteralImpl);
   }
 
-  UriValidationCode validate() {
+  UriValidationCode? validate() {
     return validateUri(this is ImportDirective, uri, uriContent);
   }
 
   @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
-    _uri?.accept(visitor);
+    _uri.accept(visitor);
   }
 
   /// Validate this directive, but do not check for existence. Return a code
   /// indicating the problem if there is one, or `null` no problem.
-  static UriValidationCode validateUri(
-      bool isImport, StringLiteral uriLiteral, String uriContent) {
+  static UriValidationCode? validateUri(
+      bool isImport, StringLiteral uriLiteral, String? uriContent) {
     if (uriLiteral is StringInterpolation) {
       return UriValidationCode.URI_WITH_INTERPOLATION;
     }
@@ -10457,16 +10413,16 @@
 class VariableDeclarationImpl extends DeclarationImpl
     implements VariableDeclaration {
   /// The name of the variable being declared.
-  SimpleIdentifierImpl _name;
+  late SimpleIdentifierImpl _name;
 
   /// The equal sign separating the variable name from the initial value, or
   /// `null` if the initial value was not specified.
   @override
-  Token equals;
+  Token? equals;
 
   /// The expression used to compute the initial value for the variable, or
   /// `null` if the initial value was not specified.
-  ExpressionImpl _initializer;
+  ExpressionImpl? _initializer;
 
   /// When this node is read as a part of summaries, we usually don't want
   /// to read the [initializer], but we need to know if there is one in
@@ -10477,7 +10433,7 @@
   /// Initialize a newly created variable declaration. The [equals] and
   /// [initializer] can be `null` if there is no initializer.
   VariableDeclarationImpl(
-      SimpleIdentifierImpl name, this.equals, ExpressionImpl initializer)
+      SimpleIdentifierImpl name, this.equals, ExpressionImpl? initializer)
       : super(null, null) {
     _name = _becomeParentOf(name);
     _initializer = _becomeParentOf(initializer);
@@ -10488,17 +10444,17 @@
       super._childEntities..add(_name)..add(equals)..add(_initializer);
 
   @override
-  VariableElement get declaredElement =>
-      _name?.staticElement as VariableElement;
+  VariableElement? get declaredElement =>
+      _name.staticElement as VariableElement?;
 
   /// This overridden implementation of [documentationComment] looks in the
   /// grandparent node for Dartdoc comments if no documentation is specifically
   /// available on the node.
   @override
-  Comment get documentationComment {
-    Comment comment = super.documentationComment;
+  Comment? get documentationComment {
+    Comment? comment = super.documentationComment;
     if (comment == null) {
-      AstNode node = parent?.parent;
+      var node = parent?.parent;
       if (node is AnnotatedNode) {
         return node.documentationComment;
       }
@@ -10509,7 +10465,7 @@
   @override
   Token get endToken {
     if (_initializer != null) {
-      return _initializer.endToken;
+      return _initializer!.endToken;
     }
     return _name.endToken;
   }
@@ -10518,28 +10474,28 @@
   Token get firstTokenAfterCommentAndMetadata => _name.beginToken;
 
   @override
-  Expression get initializer => _initializer;
+  Expression? get initializer => _initializer;
 
   @override
-  set initializer(Expression expression) {
-    _initializer = _becomeParentOf(expression as ExpressionImpl);
+  set initializer(Expression? expression) {
+    _initializer = _becomeParentOf(expression as ExpressionImpl?);
   }
 
   @override
   bool get isConst {
-    AstNode parent = this.parent;
+    var parent = this.parent;
     return parent is VariableDeclarationList && parent.isConst;
   }
 
   @override
   bool get isFinal {
-    AstNode parent = this.parent;
+    var parent = this.parent;
     return parent is VariableDeclarationList && parent.isFinal;
   }
 
   @override
   bool get isLate {
-    AstNode parent = this.parent;
+    var parent = this.parent;
     return parent is VariableDeclarationList && parent.isLate;
   }
 
@@ -10552,12 +10508,12 @@
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitVariableDeclaration(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitVariableDeclaration(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
-    _name?.accept(visitor);
+    _name.accept(visitor);
     _initializer?.accept(visitor);
   }
 }
@@ -10578,30 +10534,30 @@
   /// The token representing the 'final', 'const' or 'var' keyword, or `null` if
   /// no keyword was included.
   @override
-  Token keyword;
+  Token? keyword;
 
   /// The token representing the 'late' keyword, or `null` if the late modifier
   /// was not included.
   @override
-  Token lateKeyword;
+  Token? lateKeyword;
 
   /// The type of the variables being declared, or `null` if no type was
   /// provided.
-  TypeAnnotationImpl _type;
+  TypeAnnotationImpl? _type;
 
   /// A list containing the individual variables being declared.
-  NodeList<VariableDeclaration> _variables;
+  late NodeList<VariableDeclaration> _variables;
 
   /// Initialize a newly created variable declaration list. Either or both of
   /// the [comment] and [metadata] can be `null` if the variable list does not
   /// have the corresponding attribute. The [keyword] can be `null` if a type
   /// was specified. The [type] must be `null` if the keyword is 'var'.
   VariableDeclarationListImpl(
-      CommentImpl comment,
-      List<Annotation> metadata,
+      CommentImpl? comment,
+      List<Annotation>? metadata,
       this.lateKeyword,
       this.keyword,
-      TypeAnnotationImpl type,
+      TypeAnnotationImpl? type,
       List<VariableDeclaration> variables)
       : super(comment, metadata) {
     _type = _becomeParentOf(type);
@@ -10616,18 +10572,18 @@
     ..addAll(_variables);
 
   @override
-  Token get endToken => _variables.endToken;
+  Token get endToken => _variables.endToken!;
 
   @override
   Token get firstTokenAfterCommentAndMetadata {
     if (lateKeyword != null) {
-      return lateKeyword;
+      return lateKeyword!;
     } else if (keyword != null) {
-      return keyword;
+      return keyword!;
     } else if (_type != null) {
-      return _type.beginToken;
+      return _type!.beginToken;
     }
-    return _variables.beginToken;
+    return _variables.beginToken!;
   }
 
   @override
@@ -10640,18 +10596,18 @@
   bool get isLate => lateKeyword != null;
 
   @override
-  TypeAnnotation get type => _type;
+  TypeAnnotation? get type => _type;
 
   @override
-  set type(TypeAnnotation type) {
-    _type = _becomeParentOf(type as TypeAnnotationImpl);
+  set type(TypeAnnotation? type) {
+    _type = _becomeParentOf(type as TypeAnnotationImpl?);
   }
 
   @override
   NodeList<VariableDeclaration> get variables => _variables;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) =>
+  E? accept<E>(AstVisitor<E> visitor) =>
       visitor.visitVariableDeclarationList(this);
 
   @override
@@ -10670,7 +10626,7 @@
 class VariableDeclarationStatementImpl extends StatementImpl
     implements VariableDeclarationStatement {
   /// The variables being declared.
-  VariableDeclarationListImpl _variableList;
+  late VariableDeclarationListImpl _variableList;
 
   /// The semicolon terminating the statement.
   @override
@@ -10701,12 +10657,12 @@
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) =>
+  E? accept<E>(AstVisitor<E> visitor) =>
       visitor.visitVariableDeclarationStatement(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _variableList?.accept(visitor);
+    _variableList.accept(visitor);
   }
 }
 
@@ -10724,14 +10680,14 @@
   Token leftParenthesis;
 
   /// The expression used to determine whether to execute the body of the loop.
-  ExpressionImpl _condition;
+  late ExpressionImpl _condition;
 
   /// The right parenthesis.
   @override
   Token rightParenthesis;
 
   /// The body of the loop.
-  StatementImpl _body;
+  late StatementImpl _body;
 
   /// Initialize a newly created while statement.
   WhileStatementImpl(this.whileKeyword, this.leftParenthesis,
@@ -10771,12 +10727,12 @@
   Token get endToken => _body.endToken;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitWhileStatement(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitWhileStatement(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _condition?.accept(visitor);
-    _body?.accept(visitor);
+    _condition.accept(visitor);
+    _body.accept(visitor);
   }
 }
 
@@ -10790,7 +10746,7 @@
   Token withKeyword;
 
   /// The names of the mixins that were specified.
-  NodeList<TypeName> _mixinTypes;
+  late NodeList<TypeName> _mixinTypes;
 
   /// Initialize a newly created with clause.
   WithClauseImpl(this.withKeyword, List<TypeName> mixinTypes) {
@@ -10807,13 +10763,13 @@
     ..addAll(_mixinTypes);
 
   @override
-  Token get endToken => _mixinTypes.endToken;
+  Token get endToken => _mixinTypes.endToken!;
 
   @override
   NodeList<TypeName> get mixinTypes => _mixinTypes;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitWithClause(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitWithClause(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -10832,10 +10788,10 @@
 
   /// The star optionally following the 'yield' keyword.
   @override
-  Token star;
+  Token? star;
 
   /// The expression whose value will be yielded.
-  ExpressionImpl _expression;
+  late ExpressionImpl _expression;
 
   /// The semicolon following the expression.
   @override
@@ -10850,10 +10806,7 @@
 
   @override
   Token get beginToken {
-    if (yieldKeyword != null) {
-      return yieldKeyword;
-    }
-    return _expression.beginToken;
+    return yieldKeyword;
   }
 
   @override
@@ -10865,10 +10818,7 @@
 
   @override
   Token get endToken {
-    if (semicolon != null) {
-      return semicolon;
-    }
-    return _expression.endToken;
+    return semicolon;
   }
 
   @override
@@ -10880,11 +10830,11 @@
   }
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitYieldStatement(this);
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitYieldStatement(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
-    _expression?.accept(visitor);
+    _expression.accept(visitor);
   }
 }
 
diff --git a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
index f1a91b6..63e7e6a 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
@@ -8,7 +8,6 @@
 import 'package:analyzer/dart/ast/ast_factory.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
-import 'package:meta/meta.dart';
 
 /// Concrete implementation of [AstFactory] based on the standard AST
 /// implementation.
@@ -18,9 +17,14 @@
       AdjacentStringsImpl(strings);
 
   @override
-  Annotation annotation(Token atSign, Identifier name, Token period,
-          SimpleIdentifier constructorName, ArgumentList arguments) =>
-      AnnotationImpl(atSign, name, period, constructorName, arguments);
+  Annotation annotation(Token atSign, Identifier name, Token? period,
+          SimpleIdentifier? constructorName, ArgumentList? arguments) =>
+      AnnotationImpl(
+          atSign,
+          name as IdentifierImpl,
+          period,
+          constructorName as SimpleIdentifierImpl?,
+          arguments as ArgumentListImpl?);
 
   @override
   ArgumentList argumentList(Token leftParenthesis, List<Expression> arguments,
@@ -30,44 +34,58 @@
   @override
   AsExpression asExpression(
           Expression expression, Token asOperator, TypeAnnotation type) =>
-      AsExpressionImpl(expression, asOperator, type);
+      AsExpressionImpl(
+          expression as ExpressionImpl, asOperator, type as TypeAnnotationImpl);
 
   @override
   AssertInitializer assertInitializer(
           Token assertKeyword,
           Token leftParenthesis,
           Expression condition,
-          Token comma,
-          Expression message,
+          Token? comma,
+          Expression? message,
           Token rightParenthesis) =>
-      AssertInitializerImpl(assertKeyword, leftParenthesis, condition, comma,
-          message, rightParenthesis);
+      AssertInitializerImpl(
+          assertKeyword,
+          leftParenthesis,
+          condition as ExpressionImpl,
+          comma,
+          message as ExpressionImpl?,
+          rightParenthesis);
 
   @override
   AssertStatement assertStatement(
           Token assertKeyword,
           Token leftParenthesis,
           Expression condition,
-          Token comma,
-          Expression message,
+          Token? comma,
+          Expression? message,
           Token rightParenthesis,
           Token semicolon) =>
-      AssertStatementImpl(assertKeyword, leftParenthesis, condition, comma,
-          message, rightParenthesis, semicolon);
+      AssertStatementImpl(
+          assertKeyword,
+          leftParenthesis,
+          condition as ExpressionImpl,
+          comma,
+          message as ExpressionImpl?,
+          rightParenthesis,
+          semicolon);
 
   @override
   AssignmentExpression assignmentExpression(
           Expression leftHandSide, Token operator, Expression rightHandSide) =>
-      AssignmentExpressionImpl(leftHandSide, operator, rightHandSide);
+      AssignmentExpressionImpl(leftHandSide as ExpressionImpl, operator,
+          rightHandSide as ExpressionImpl);
 
   @override
   AwaitExpression awaitExpression(Token awaitKeyword, Expression expression) =>
-      AwaitExpressionImpl(awaitKeyword, expression);
+      AwaitExpressionImpl(awaitKeyword, expression as ExpressionImpl);
 
   @override
   BinaryExpression binaryExpression(
           Expression leftOperand, Token operator, Expression rightOperand) =>
-      BinaryExpressionImpl(leftOperand, operator, rightOperand);
+      BinaryExpressionImpl(leftOperand as ExpressionImpl, operator,
+          rightOperand as ExpressionImpl);
 
   @override
   Block block(
@@ -79,8 +97,9 @@
       CommentImpl.createBlockComment(tokens);
 
   @override
-  BlockFunctionBody blockFunctionBody(Token keyword, Token star, Block block) =>
-      BlockFunctionBodyImpl(keyword, star, block);
+  BlockFunctionBody blockFunctionBody(
+          Token? keyword, Token? star, Block block) =>
+      BlockFunctionBodyImpl(keyword, star, block as BlockImpl);
 
   @override
   BooleanLiteral booleanLiteral(Token literal, bool value) =>
@@ -88,104 +107,105 @@
 
   @override
   BreakStatement breakStatement(
-          Token breakKeyword, SimpleIdentifier label, Token semicolon) =>
-      BreakStatementImpl(breakKeyword, label, semicolon);
+          Token breakKeyword, SimpleIdentifier? label, Token semicolon) =>
+      BreakStatementImpl(
+          breakKeyword, label as SimpleIdentifierImpl?, semicolon);
 
   @override
   CascadeExpression cascadeExpression(
           Expression target, List<Expression> cascadeSections) =>
-      CascadeExpressionImpl(target, cascadeSections);
+      CascadeExpressionImpl(target as ExpressionImpl, cascadeSections);
 
   @override
   CatchClause catchClause(
-          Token onKeyword,
-          TypeAnnotation exceptionType,
-          Token catchKeyword,
-          Token leftParenthesis,
-          SimpleIdentifier exceptionParameter,
-          Token comma,
-          SimpleIdentifier stackTraceParameter,
-          Token rightParenthesis,
+          Token? onKeyword,
+          TypeAnnotation? exceptionType,
+          Token? catchKeyword,
+          Token? leftParenthesis,
+          SimpleIdentifier? exceptionParameter,
+          Token? comma,
+          SimpleIdentifier? stackTraceParameter,
+          Token? rightParenthesis,
           Block body) =>
       CatchClauseImpl(
           onKeyword,
-          exceptionType,
+          exceptionType as TypeAnnotationImpl?,
           catchKeyword,
           leftParenthesis,
-          exceptionParameter,
+          exceptionParameter as SimpleIdentifierImpl?,
           comma,
-          stackTraceParameter,
+          stackTraceParameter as SimpleIdentifierImpl?,
           rightParenthesis,
-          body);
+          body as BlockImpl);
 
   @override
   ClassDeclaration classDeclaration(
-          Comment comment,
-          List<Annotation> metadata,
-          Token abstractKeyword,
+          Comment? comment,
+          List<Annotation>? metadata,
+          Token? abstractKeyword,
           Token classKeyword,
           SimpleIdentifier name,
-          TypeParameterList typeParameters,
-          ExtendsClause extendsClause,
-          WithClause withClause,
-          ImplementsClause implementsClause,
+          TypeParameterList? typeParameters,
+          ExtendsClause? extendsClause,
+          WithClause? withClause,
+          ImplementsClause? implementsClause,
           Token leftBracket,
           List<ClassMember> members,
           Token rightBracket) =>
       ClassDeclarationImpl(
-          comment,
+          comment as CommentImpl?,
           metadata,
           abstractKeyword,
           classKeyword,
-          name,
-          typeParameters,
-          extendsClause,
-          withClause,
-          implementsClause,
+          name as SimpleIdentifierImpl,
+          typeParameters as TypeParameterListImpl?,
+          extendsClause as ExtendsClauseImpl?,
+          withClause as WithClauseImpl?,
+          implementsClause as ImplementsClauseImpl?,
           leftBracket,
           members,
           rightBracket);
 
   @override
   ClassTypeAlias classTypeAlias(
-          Comment comment,
-          List<Annotation> metadata,
+          Comment? comment,
+          List<Annotation>? metadata,
           Token keyword,
           SimpleIdentifier name,
-          TypeParameterList typeParameters,
+          TypeParameterList? typeParameters,
           Token equals,
-          Token abstractKeyword,
+          Token? abstractKeyword,
           TypeName superclass,
           WithClause withClause,
-          ImplementsClause implementsClause,
+          ImplementsClause? implementsClause,
           Token semicolon) =>
       ClassTypeAliasImpl(
-          comment,
+          comment as CommentImpl?,
           metadata,
           keyword,
-          name,
-          typeParameters,
+          name as SimpleIdentifierImpl,
+          typeParameters as TypeParameterListImpl?,
           equals,
           abstractKeyword,
-          superclass,
-          withClause,
-          implementsClause,
+          superclass as TypeNameImpl,
+          withClause as WithClauseImpl,
+          implementsClause as ImplementsClauseImpl?,
           semicolon);
 
   @override
-  CommentReference commentReference(Token newKeyword, Identifier identifier) =>
-      CommentReferenceImpl(newKeyword, identifier);
+  CommentReference commentReference(Token? newKeyword, Identifier identifier) =>
+      CommentReferenceImpl(newKeyword, identifier as IdentifierImpl);
 
   @override
   CompilationUnit compilationUnit(
-          {Token beginToken,
-          ScriptTag scriptTag,
-          List<Directive> directives,
-          List<CompilationUnitMember> declarations,
-          Token endToken,
-          FeatureSet featureSet}) =>
-      CompilationUnitImpl(beginToken, scriptTag, directives, declarations,
-          endToken, featureSet);
+          {required Token beginToken,
+          ScriptTag? scriptTag,
+          List<Directive>? directives,
+          List<CompilationUnitMember>? declarations,
+          required Token endToken,
+          required FeatureSet featureSet}) =>
+      CompilationUnitImpl(beginToken, scriptTag as ScriptTagImpl?, directives,
+          declarations, endToken, featureSet);
 
   @override
   ConditionalExpression conditionalExpression(
@@ -195,87 +215,105 @@
           Token colon,
           Expression elseExpression) =>
       ConditionalExpressionImpl(
-          condition, question, thenExpression, colon, elseExpression);
+          condition as ExpressionImpl,
+          question,
+          thenExpression as ExpressionImpl,
+          colon,
+          elseExpression as ExpressionImpl);
 
   @override
   Configuration configuration(
           Token ifKeyword,
           Token leftParenthesis,
           DottedName name,
-          Token equalToken,
-          StringLiteral value,
+          Token? equalToken,
+          StringLiteral? value,
           Token rightParenthesis,
           StringLiteral libraryUri) =>
-      ConfigurationImpl(ifKeyword, leftParenthesis, name, equalToken, value,
-          rightParenthesis, libraryUri);
+      ConfigurationImpl(
+          ifKeyword,
+          leftParenthesis,
+          name as DottedNameImpl,
+          equalToken,
+          value as StringLiteralImpl?,
+          rightParenthesis,
+          libraryUri as StringLiteralImpl);
 
   @override
   ConstructorDeclaration constructorDeclaration(
-          Comment comment,
-          List<Annotation> metadata,
-          Token externalKeyword,
-          Token constKeyword,
-          Token factoryKeyword,
+          Comment? comment,
+          List<Annotation>? metadata,
+          Token? externalKeyword,
+          Token? constKeyword,
+          Token? factoryKeyword,
           Identifier returnType,
-          Token period,
-          SimpleIdentifier name,
+          Token? period,
+          SimpleIdentifier? name,
           FormalParameterList parameters,
-          Token separator,
-          List<ConstructorInitializer> initializers,
-          ConstructorName redirectedConstructor,
-          FunctionBody body) =>
+          Token? separator,
+          List<ConstructorInitializer>? initializers,
+          ConstructorName? redirectedConstructor,
+          FunctionBody? body) =>
       ConstructorDeclarationImpl(
-          comment,
+          comment as CommentImpl?,
           metadata,
           externalKeyword,
           constKeyword,
           factoryKeyword,
-          returnType,
+          returnType as IdentifierImpl,
           period,
-          name,
-          parameters,
+          name as SimpleIdentifierImpl?,
+          parameters as FormalParameterListImpl,
           separator,
           initializers,
-          redirectedConstructor,
-          body);
+          redirectedConstructor as ConstructorNameImpl?,
+          body as FunctionBodyImpl?);
 
   @override
   ConstructorFieldInitializer constructorFieldInitializer(
-          Token thisKeyword,
-          Token period,
+          Token? thisKeyword,
+          Token? period,
           SimpleIdentifier fieldName,
           Token equals,
           Expression expression) =>
       ConstructorFieldInitializerImpl(
-          thisKeyword, period, fieldName, equals, expression);
+          thisKeyword,
+          period,
+          fieldName as SimpleIdentifierImpl,
+          equals,
+          expression as ExpressionImpl);
 
   @override
   ConstructorName constructorName(
-          TypeName type, Token period, SimpleIdentifier name) =>
-      ConstructorNameImpl(type, period, name);
+          TypeName type, Token? period, SimpleIdentifier? name) =>
+      ConstructorNameImpl(
+          type as TypeNameImpl, period, name as SimpleIdentifierImpl?);
 
   @override
   ContinueStatement continueStatement(
-          Token continueKeyword, SimpleIdentifier label, Token semicolon) =>
-      ContinueStatementImpl(continueKeyword, label, semicolon);
+          Token continueKeyword, SimpleIdentifier? label, Token semicolon) =>
+      ContinueStatementImpl(
+          continueKeyword, label as SimpleIdentifierImpl?, semicolon);
 
   @override
   DeclaredIdentifier declaredIdentifier(
-          Comment comment,
-          List<Annotation> metadata,
-          Token keyword,
-          TypeAnnotation type,
+          Comment? comment,
+          List<Annotation>? metadata,
+          Token? keyword,
+          TypeAnnotation? type,
           SimpleIdentifier identifier) =>
-      DeclaredIdentifierImpl(comment, metadata, keyword, type, identifier);
+      DeclaredIdentifierImpl(comment as CommentImpl?, metadata, keyword,
+          type as TypeAnnotationImpl?, identifier as SimpleIdentifierImpl);
 
   @override
   DefaultFormalParameter defaultFormalParameter(NormalFormalParameter parameter,
-          ParameterKind kind, Token separator, Expression defaultValue) =>
-      DefaultFormalParameterImpl(parameter, kind, separator, defaultValue);
+          ParameterKind kind, Token? separator, Expression? defaultValue) =>
+      DefaultFormalParameterImpl(parameter as NormalFormalParameterImpl, kind,
+          separator, defaultValue as ExpressionImpl?);
 
   @override
   Comment documentationComment(List<Token> tokens,
-          [List<CommentReference> references]) =>
+          [List<CommentReference>? references]) =>
       CommentImpl.createDocumentationCommentWithReferences(
           tokens, references ?? <CommentReference>[]);
 
@@ -288,8 +326,14 @@
           Expression condition,
           Token rightParenthesis,
           Token semicolon) =>
-      DoStatementImpl(doKeyword, body, whileKeyword, leftParenthesis, condition,
-          rightParenthesis, semicolon);
+      DoStatementImpl(
+          doKeyword,
+          body as StatementImpl,
+          whileKeyword,
+          leftParenthesis,
+          condition as ExpressionImpl,
+          rightParenthesis,
+          semicolon);
 
   @override
   DottedName dottedName(List<SimpleIdentifier> components) =>
@@ -312,273 +356,338 @@
       CommentImpl.createEndOfLineComment(tokens);
 
   @override
-  EnumConstantDeclaration enumConstantDeclaration(
-          Comment comment, List<Annotation> metadata, SimpleIdentifier name) =>
-      EnumConstantDeclarationImpl(comment, metadata, name);
+  EnumConstantDeclaration enumConstantDeclaration(Comment? comment,
+          List<Annotation>? metadata, SimpleIdentifier name) =>
+      EnumConstantDeclarationImpl(
+          comment as CommentImpl?, metadata, name as SimpleIdentifierImpl);
 
   @override
   EnumDeclaration enumDeclaration(
-          Comment comment,
-          List<Annotation> metadata,
+          Comment? comment,
+          List<Annotation>? metadata,
           Token enumKeyword,
           SimpleIdentifier name,
           Token leftBracket,
           List<EnumConstantDeclaration> constants,
           Token rightBracket) =>
-      EnumDeclarationImpl(comment, metadata, enumKeyword, name, leftBracket,
-          constants, rightBracket);
+      EnumDeclarationImpl(comment as CommentImpl?, metadata, enumKeyword,
+          name as SimpleIdentifierImpl, leftBracket, constants, rightBracket);
 
   @override
   ExportDirective exportDirective(
-          Comment comment,
-          List<Annotation> metadata,
+          Comment? comment,
+          List<Annotation>? metadata,
           Token keyword,
           StringLiteral libraryUri,
-          List<Configuration> configurations,
-          List<Combinator> combinators,
+          List<Configuration>? configurations,
+          List<Combinator>? combinators,
           Token semicolon) =>
-      ExportDirectiveImpl(comment, metadata, keyword, libraryUri,
-          configurations, combinators, semicolon);
+      ExportDirectiveImpl(
+          comment as CommentImpl?,
+          metadata,
+          keyword,
+          libraryUri as StringLiteralImpl,
+          configurations,
+          combinators,
+          semicolon);
 
   @override
-  ExpressionFunctionBody expressionFunctionBody(Token keyword,
-          Token functionDefinition, Expression expression, Token semicolon) =>
+  ExpressionFunctionBody expressionFunctionBody(Token? keyword,
+          Token functionDefinition, Expression expression, Token? semicolon) =>
       ExpressionFunctionBodyImpl(
-          keyword, functionDefinition, expression, semicolon);
+          keyword, functionDefinition, expression as ExpressionImpl, semicolon);
 
   @override
   ExpressionStatement expressionStatement(
-          Expression expression, Token semicolon) =>
-      ExpressionStatementImpl(expression, semicolon);
+          Expression expression, Token? semicolon) =>
+      ExpressionStatementImpl(expression as ExpressionImpl, semicolon);
 
   @override
   ExtendsClause extendsClause(Token extendsKeyword, TypeName superclass) =>
-      ExtendsClauseImpl(extendsKeyword, superclass);
+      ExtendsClauseImpl(extendsKeyword, superclass as TypeNameImpl);
 
   @override
   ExtensionDeclaration extensionDeclaration(
-          {Comment comment,
-          List<Annotation> metadata,
-          Token extensionKeyword,
-          @required SimpleIdentifier name,
-          TypeParameterList typeParameters,
-          Token onKeyword,
-          @required TypeAnnotation extendedType,
-          Token leftBracket,
-          List<ClassMember> members,
-          Token rightBracket}) =>
+          {Comment? comment,
+          List<Annotation>? metadata,
+          required Token extensionKeyword,
+          required SimpleIdentifier? name,
+          TypeParameterList? typeParameters,
+          required Token onKeyword,
+          required TypeAnnotation extendedType,
+          required Token leftBracket,
+          required List<ClassMember> members,
+          required Token rightBracket}) =>
       ExtensionDeclarationImpl(
-          comment,
+          comment as CommentImpl?,
           metadata,
           extensionKeyword,
-          name,
-          typeParameters,
+          name as SimpleIdentifierImpl?,
+          typeParameters as TypeParameterListImpl?,
           onKeyword,
-          extendedType,
+          extendedType as TypeAnnotationImpl,
           leftBracket,
           members,
           rightBracket);
 
   @override
   ExtensionOverride extensionOverride(
-          {@required Identifier extensionName,
-          TypeArgumentList typeArguments,
-          @required ArgumentList argumentList}) =>
-      ExtensionOverrideImpl(extensionName, typeArguments, argumentList);
+          {required Identifier extensionName,
+          TypeArgumentList? typeArguments,
+          required ArgumentList argumentList}) =>
+      ExtensionOverrideImpl(
+          extensionName as IdentifierImpl,
+          typeArguments as TypeArgumentListImpl?,
+          argumentList as ArgumentListImpl);
 
   @override
   FieldDeclaration fieldDeclaration2(
-          {Comment comment,
-          List<Annotation> metadata,
-          Token abstractKeyword,
-          Token covariantKeyword,
-          Token externalKeyword,
-          Token staticKeyword,
-          @required VariableDeclarationList fieldList,
-          @required Token semicolon}) =>
-      FieldDeclarationImpl(comment, metadata, abstractKeyword, covariantKeyword,
-          externalKeyword, staticKeyword, fieldList, semicolon);
+          {Comment? comment,
+          List<Annotation>? metadata,
+          Token? abstractKeyword,
+          Token? covariantKeyword,
+          Token? externalKeyword,
+          Token? staticKeyword,
+          required VariableDeclarationList fieldList,
+          required Token semicolon}) =>
+      FieldDeclarationImpl(
+          comment as CommentImpl?,
+          metadata,
+          abstractKeyword,
+          covariantKeyword,
+          externalKeyword,
+          staticKeyword,
+          fieldList as VariableDeclarationListImpl,
+          semicolon);
 
   @override
   FieldFormalParameter fieldFormalParameter2(
-          {Comment comment,
-          List<Annotation> metadata,
-          Token covariantKeyword,
-          Token requiredKeyword,
-          Token keyword,
-          TypeAnnotation type,
-          @required Token thisKeyword,
-          @required Token period,
-          @required SimpleIdentifier identifier,
-          TypeParameterList typeParameters,
-          FormalParameterList parameters,
-          Token question}) =>
+          {Comment? comment,
+          List<Annotation>? metadata,
+          Token? covariantKeyword,
+          Token? requiredKeyword,
+          Token? keyword,
+          TypeAnnotation? type,
+          required Token thisKeyword,
+          required Token period,
+          required SimpleIdentifier identifier,
+          TypeParameterList? typeParameters,
+          FormalParameterList? parameters,
+          Token? question}) =>
       FieldFormalParameterImpl(
-          comment,
+          comment as CommentImpl?,
           metadata,
           covariantKeyword,
           requiredKeyword,
           keyword,
-          type,
+          type as TypeAnnotationImpl?,
           thisKeyword,
           period,
-          identifier,
-          typeParameters,
-          parameters,
+          identifier as SimpleIdentifierImpl,
+          typeParameters as TypeParameterListImpl?,
+          parameters as FormalParameterListImpl?,
           question);
 
   @override
   ForEachPartsWithDeclaration forEachPartsWithDeclaration(
-          {DeclaredIdentifier loopVariable,
-          Token inKeyword,
-          Expression iterable}) =>
-      ForEachPartsWithDeclarationImpl(loopVariable, inKeyword, iterable);
+          {required DeclaredIdentifier loopVariable,
+          required Token inKeyword,
+          required Expression iterable}) =>
+      ForEachPartsWithDeclarationImpl(loopVariable as DeclaredIdentifierImpl,
+          inKeyword, iterable as ExpressionImpl);
 
   @override
   ForEachPartsWithIdentifier forEachPartsWithIdentifier(
-          {SimpleIdentifier identifier,
-          Token inKeyword,
-          Expression iterable}) =>
-      ForEachPartsWithIdentifierImpl(identifier, inKeyword, iterable);
+          {required SimpleIdentifier identifier,
+          required Token inKeyword,
+          required Expression iterable}) =>
+      ForEachPartsWithIdentifierImpl(identifier as SimpleIdentifierImpl,
+          inKeyword, iterable as ExpressionImpl);
 
   @override
   ForElement forElement(
-          {Token awaitKeyword,
-          Token forKeyword,
-          Token leftParenthesis,
-          ForLoopParts forLoopParts,
-          Token rightParenthesis,
-          CollectionElement body}) =>
-      ForElementImpl(awaitKeyword, forKeyword, leftParenthesis, forLoopParts,
-          rightParenthesis, body);
+          {Token? awaitKeyword,
+          required Token forKeyword,
+          required Token leftParenthesis,
+          required ForLoopParts forLoopParts,
+          required Token rightParenthesis,
+          required CollectionElement body}) =>
+      ForElementImpl(
+          awaitKeyword,
+          forKeyword,
+          leftParenthesis,
+          forLoopParts as ForLoopPartsImpl,
+          rightParenthesis,
+          body as CollectionElementImpl);
 
   @override
   FormalParameterList formalParameterList(
           Token leftParenthesis,
           List<FormalParameter> parameters,
-          Token leftDelimiter,
-          Token rightDelimiter,
+          Token? leftDelimiter,
+          Token? rightDelimiter,
           Token rightParenthesis) =>
       FormalParameterListImpl(leftParenthesis, parameters, leftDelimiter,
           rightDelimiter, rightParenthesis);
 
   @override
   ForPartsWithDeclarations forPartsWithDeclarations(
-          {VariableDeclarationList variables,
-          Token leftSeparator,
-          Expression condition,
-          Token rightSeparator,
-          List<Expression> updaters}) =>
+          {required VariableDeclarationList variables,
+          required Token leftSeparator,
+          Expression? condition,
+          required Token rightSeparator,
+          List<Expression>? updaters}) =>
       ForPartsWithDeclarationsImpl(
-          variables, leftSeparator, condition, rightSeparator, updaters);
+          variables as VariableDeclarationListImpl,
+          leftSeparator,
+          condition as ExpressionImpl?,
+          rightSeparator,
+          updaters);
 
   @override
   ForPartsWithExpression forPartsWithExpression(
-          {Expression initialization,
-          Token leftSeparator,
-          Expression condition,
-          Token rightSeparator,
-          List<Expression> updaters}) =>
+          {Expression? initialization,
+          required Token leftSeparator,
+          Expression? condition,
+          required Token rightSeparator,
+          List<Expression>? updaters}) =>
       ForPartsWithExpressionImpl(
-          initialization, leftSeparator, condition, rightSeparator, updaters);
+          initialization as ExpressionImpl?,
+          leftSeparator,
+          condition as ExpressionImpl?,
+          rightSeparator,
+          updaters);
 
   @override
   ForStatement forStatement(
-      {Token awaitKeyword,
-      Token forKeyword,
-      Token leftParenthesis,
-      ForLoopParts forLoopParts,
-      Token rightParenthesis,
-      Statement body}) {
-    return ForStatementImpl(awaitKeyword, forKeyword, leftParenthesis,
-        forLoopParts, rightParenthesis, body);
+      {Token? awaitKeyword,
+      required Token forKeyword,
+      required Token leftParenthesis,
+      required ForLoopParts forLoopParts,
+      required Token rightParenthesis,
+      required Statement body}) {
+    return ForStatementImpl(
+        awaitKeyword,
+        forKeyword,
+        leftParenthesis,
+        forLoopParts as ForLoopPartsImpl,
+        rightParenthesis,
+        body as StatementImpl);
   }
 
   @override
   FunctionDeclaration functionDeclaration(
-          Comment comment,
-          List<Annotation> metadata,
-          Token externalKeyword,
-          TypeAnnotation returnType,
-          Token propertyKeyword,
+          Comment? comment,
+          List<Annotation>? metadata,
+          Token? externalKeyword,
+          TypeAnnotation? returnType,
+          Token? propertyKeyword,
           SimpleIdentifier name,
           FunctionExpression functionExpression) =>
-      FunctionDeclarationImpl(comment, metadata, externalKeyword, returnType,
-          propertyKeyword, name, functionExpression);
+      FunctionDeclarationImpl(
+          comment as CommentImpl?,
+          metadata,
+          externalKeyword,
+          returnType as TypeAnnotationImpl?,
+          propertyKeyword,
+          name as SimpleIdentifierImpl,
+          functionExpression as FunctionExpressionImpl);
 
   @override
   FunctionDeclarationStatement functionDeclarationStatement(
           FunctionDeclaration functionDeclaration) =>
-      FunctionDeclarationStatementImpl(functionDeclaration);
+      FunctionDeclarationStatementImpl(
+          functionDeclaration as FunctionDeclarationImpl);
 
   @override
-  FunctionExpression functionExpression(TypeParameterList typeParameters,
-          FormalParameterList parameters, FunctionBody body) =>
-      FunctionExpressionImpl(typeParameters, parameters, body);
+  FunctionExpression functionExpression(TypeParameterList? typeParameters,
+          FormalParameterList? parameters, FunctionBody? body) =>
+      FunctionExpressionImpl(typeParameters as TypeParameterListImpl?,
+          parameters as FormalParameterListImpl?, body as FunctionBodyImpl?);
 
   @override
   FunctionExpressionInvocation functionExpressionInvocation(Expression function,
-          TypeArgumentList typeArguments, ArgumentList argumentList) =>
-      FunctionExpressionInvocationImpl(function, typeArguments, argumentList);
+          TypeArgumentList? typeArguments, ArgumentList argumentList) =>
+      FunctionExpressionInvocationImpl(
+          function as ExpressionImpl,
+          typeArguments as TypeArgumentListImpl?,
+          argumentList as ArgumentListImpl);
 
   @override
   FunctionTypeAlias functionTypeAlias(
-          Comment comment,
-          List<Annotation> metadata,
+          Comment? comment,
+          List<Annotation>? metadata,
           Token keyword,
-          TypeAnnotation returnType,
+          TypeAnnotation? returnType,
           SimpleIdentifier name,
-          TypeParameterList typeParameters,
+          TypeParameterList? typeParameters,
           FormalParameterList parameters,
           Token semicolon) =>
-      FunctionTypeAliasImpl(comment, metadata, keyword, returnType, name,
-          typeParameters, parameters, semicolon);
+      FunctionTypeAliasImpl(
+          comment as CommentImpl?,
+          metadata,
+          keyword,
+          returnType as TypeAnnotationImpl?,
+          name as SimpleIdentifierImpl,
+          typeParameters as TypeParameterListImpl?,
+          parameters as FormalParameterListImpl,
+          semicolon);
 
   @override
   FunctionTypedFormalParameter functionTypedFormalParameter2(
-          {Comment comment,
-          List<Annotation> metadata,
-          Token covariantKeyword,
-          Token requiredKeyword,
-          TypeAnnotation returnType,
-          @required SimpleIdentifier identifier,
-          TypeParameterList typeParameters,
-          @required FormalParameterList parameters,
-          Token question}) =>
+          {Comment? comment,
+          List<Annotation>? metadata,
+          Token? covariantKeyword,
+          Token? requiredKeyword,
+          TypeAnnotation? returnType,
+          required SimpleIdentifier identifier,
+          TypeParameterList? typeParameters,
+          required FormalParameterList parameters,
+          Token? question}) =>
       FunctionTypedFormalParameterImpl(
-          comment,
+          comment as CommentImpl?,
           metadata,
           covariantKeyword,
           requiredKeyword,
-          returnType,
-          identifier,
-          typeParameters,
-          parameters,
+          returnType as TypeAnnotationImpl?,
+          identifier as SimpleIdentifierImpl,
+          typeParameters as TypeParameterListImpl?,
+          parameters as FormalParameterListImpl,
           question);
 
   @override
   GenericFunctionType genericFunctionType(
-          TypeAnnotation returnType,
+          TypeAnnotation? returnType,
           Token functionKeyword,
-          TypeParameterList typeParameters,
+          TypeParameterList? typeParameters,
           FormalParameterList parameters,
-          {Token question}) =>
+          {Token? question}) =>
       GenericFunctionTypeImpl(
-          returnType, functionKeyword, typeParameters, parameters,
+          returnType as TypeAnnotationImpl?,
+          functionKeyword,
+          typeParameters as TypeParameterListImpl?,
+          parameters as FormalParameterListImpl,
           question: question);
 
   @override
   GenericTypeAlias genericTypeAlias(
-          Comment comment,
-          List<Annotation> metadata,
+          Comment? comment,
+          List<Annotation>? metadata,
           Token typedefKeyword,
           SimpleIdentifier name,
-          TypeParameterList typeParameters,
+          TypeParameterList? typeParameters,
           Token equals,
           TypeAnnotation type,
           Token semicolon) =>
-      GenericTypeAliasImpl(comment, metadata, typedefKeyword, name,
-          typeParameters, equals, type, semicolon);
+      GenericTypeAliasImpl(
+          comment as CommentImpl?,
+          metadata,
+          typedefKeyword,
+          name as SimpleIdentifierImpl,
+          typeParameters as TypeParameterListImpl?,
+          equals,
+          type as TypeAnnotationImpl,
+          semicolon);
 
   @override
   HideCombinator hideCombinator(
@@ -587,15 +696,21 @@
 
   @override
   IfElement ifElement(
-          {Token ifKeyword,
-          Token leftParenthesis,
-          Expression condition,
-          Token rightParenthesis,
-          CollectionElement thenElement,
-          Token elseKeyword,
-          CollectionElement elseElement}) =>
-      IfElementImpl(ifKeyword, leftParenthesis, condition, rightParenthesis,
-          thenElement, elseKeyword, elseElement);
+          {required Token ifKeyword,
+          required Token leftParenthesis,
+          required Expression condition,
+          required Token rightParenthesis,
+          required CollectionElement thenElement,
+          Token? elseKeyword,
+          CollectionElement? elseElement}) =>
+      IfElementImpl(
+          ifKeyword,
+          leftParenthesis,
+          condition as ExpressionImpl,
+          rightParenthesis,
+          thenElement as CollectionElementImpl,
+          elseKeyword,
+          elseElement as CollectionElementImpl?);
 
   @override
   IfStatement ifStatement(
@@ -604,10 +719,16 @@
           Expression condition,
           Token rightParenthesis,
           Statement thenStatement,
-          Token elseKeyword,
-          Statement elseStatement) =>
-      IfStatementImpl(ifKeyword, leftParenthesis, condition, rightParenthesis,
-          thenStatement, elseKeyword, elseStatement);
+          Token? elseKeyword,
+          Statement? elseStatement) =>
+      IfStatementImpl(
+          ifKeyword,
+          leftParenthesis,
+          condition as ExpressionImpl,
+          rightParenthesis,
+          thenStatement as StatementImpl,
+          elseKeyword,
+          elseStatement as StatementImpl?);
 
   @override
   ImplementsClause implementsClause(
@@ -616,63 +737,67 @@
 
   @override
   ImportDirective importDirective(
-          Comment comment,
-          List<Annotation> metadata,
+          Comment? comment,
+          List<Annotation>? metadata,
           Token keyword,
           StringLiteral libraryUri,
-          List<Configuration> configurations,
-          Token deferredKeyword,
-          Token asKeyword,
-          SimpleIdentifier prefix,
-          List<Combinator> combinators,
+          List<Configuration>? configurations,
+          Token? deferredKeyword,
+          Token? asKeyword,
+          SimpleIdentifier? prefix,
+          List<Combinator>? combinators,
           Token semicolon) =>
       ImportDirectiveImpl(
-          comment,
+          comment as CommentImpl?,
           metadata,
           keyword,
-          libraryUri,
+          libraryUri as StringLiteralImpl,
           configurations,
           deferredKeyword,
           asKeyword,
-          prefix,
+          prefix as SimpleIdentifierImpl?,
           combinators,
           semicolon);
 
   @override
   IndexExpression indexExpressionForCascade2(
-          {@required Token period,
-          Token question,
-          @required Token leftBracket,
-          @required Expression index,
-          @required Token rightBracket}) =>
+          {required Token period,
+          Token? question,
+          required Token leftBracket,
+          required Expression index,
+          required Token rightBracket}) =>
       IndexExpressionImpl.forCascade(
-          period, question, leftBracket, index, rightBracket);
+          period, question, leftBracket, index as ExpressionImpl, rightBracket);
 
   @override
   IndexExpression indexExpressionForTarget2(
-          {@required Expression target,
-          Token question,
-          @required Token leftBracket,
-          @required Expression index,
-          @required Token rightBracket}) =>
-      IndexExpressionImpl.forTarget(
-          target, question, leftBracket, index, rightBracket);
+          {required Expression target,
+          Token? question,
+          required Token leftBracket,
+          required Expression index,
+          required Token rightBracket}) =>
+      IndexExpressionImpl.forTarget(target as ExpressionImpl, question,
+          leftBracket, index as ExpressionImpl, rightBracket);
 
   @override
-  InstanceCreationExpression instanceCreationExpression(Token keyword,
+  InstanceCreationExpression instanceCreationExpression(Token? keyword,
           ConstructorName constructorName, ArgumentList argumentList,
-          {TypeArgumentList typeArguments}) =>
-      InstanceCreationExpressionImpl(keyword, constructorName, argumentList,
-          typeArguments: typeArguments);
+          {TypeArgumentList? typeArguments}) =>
+      InstanceCreationExpressionImpl(
+          keyword,
+          constructorName as ConstructorNameImpl,
+          argumentList as ArgumentListImpl,
+          typeArguments: typeArguments as TypeArgumentListImpl?);
 
   @override
-  IntegerLiteral integerLiteral(Token literal, int value) =>
+  IntegerLiteral integerLiteral(Token literal, int? value) =>
       IntegerLiteralImpl(literal, value);
 
   @override
   InterpolationExpression interpolationExpression(
-          Token leftBracket, Expression expression, Token rightBracket) =>
-      InterpolationExpressionImpl(leftBracket, expression, rightBracket);
+          Token leftBracket, Expression expression, Token? rightBracket) =>
+      InterpolationExpressionImpl(
+          leftBracket, expression as ExpressionImpl, rightBracket);
 
   @override
   InterpolationString interpolationString(Token contents, String value) =>
@@ -680,116 +805,137 @@
 
   @override
   IsExpression isExpression(Expression expression, Token isOperator,
-          Token notOperator, TypeAnnotation type) =>
-      IsExpressionImpl(expression, isOperator, notOperator, type);
+          Token? notOperator, TypeAnnotation type) =>
+      IsExpressionImpl(expression as ExpressionImpl, isOperator, notOperator,
+          type as TypeAnnotationImpl);
 
   @override
-  Label label(SimpleIdentifier label, Token colon) => LabelImpl(label, colon);
+  Label label(SimpleIdentifier label, Token colon) =>
+      LabelImpl(label as SimpleIdentifierImpl, colon);
 
   @override
   LabeledStatement labeledStatement(List<Label> labels, Statement statement) =>
-      LabeledStatementImpl(labels, statement);
+      LabeledStatementImpl(labels, statement as StatementImpl);
 
   @override
-  LibraryDirective libraryDirective(Comment comment, List<Annotation> metadata,
-          Token libraryKeyword, LibraryIdentifier name, Token semicolon) =>
-      LibraryDirectiveImpl(comment, metadata, libraryKeyword, name, semicolon);
+  LibraryDirective libraryDirective(
+          Comment? comment,
+          List<Annotation>? metadata,
+          Token libraryKeyword,
+          LibraryIdentifier name,
+          Token semicolon) =>
+      LibraryDirectiveImpl(comment as CommentImpl?, metadata, libraryKeyword,
+          name as LibraryIdentifierImpl, semicolon);
 
   @override
   LibraryIdentifier libraryIdentifier(List<SimpleIdentifier> components) =>
       LibraryIdentifierImpl(components);
 
   @override
-  ListLiteral listLiteral(Token constKeyword, TypeArgumentList typeArguments,
+  ListLiteral listLiteral(Token? constKeyword, TypeArgumentList? typeArguments,
       Token leftBracket, List<CollectionElement> elements, Token rightBracket) {
-    if (elements == null || elements is List<Expression>) {
+    if (elements is List<Expression>) {
       return ListLiteralImpl(
-          constKeyword, typeArguments, leftBracket, elements, rightBracket);
+          constKeyword,
+          typeArguments as TypeArgumentListImpl?,
+          leftBracket,
+          elements,
+          rightBracket);
     }
     return ListLiteralImpl.experimental(
-        constKeyword, typeArguments, leftBracket, elements, rightBracket);
+        constKeyword,
+        typeArguments as TypeArgumentListImpl?,
+        leftBracket,
+        elements,
+        rightBracket);
   }
 
   @override
   MapLiteralEntry mapLiteralEntry(
           Expression key, Token separator, Expression value) =>
-      MapLiteralEntryImpl(key, separator, value);
+      MapLiteralEntryImpl(
+          key as ExpressionImpl, separator, value as ExpressionImpl);
 
   @override
   MethodDeclaration methodDeclaration(
-          Comment comment,
-          List<Annotation> metadata,
-          Token externalKeyword,
-          Token modifierKeyword,
-          TypeAnnotation returnType,
-          Token propertyKeyword,
-          Token operatorKeyword,
+          Comment? comment,
+          List<Annotation>? metadata,
+          Token? externalKeyword,
+          Token? modifierKeyword,
+          TypeAnnotation? returnType,
+          Token? propertyKeyword,
+          Token? operatorKeyword,
           SimpleIdentifier name,
-          TypeParameterList typeParameters,
-          FormalParameterList parameters,
+          TypeParameterList? typeParameters,
+          FormalParameterList? parameters,
           FunctionBody body) =>
       MethodDeclarationImpl(
-          comment,
+          comment as CommentImpl?,
           metadata,
           externalKeyword,
           modifierKeyword,
-          returnType,
+          returnType as TypeAnnotationImpl?,
           propertyKeyword,
           operatorKeyword,
-          name,
-          typeParameters,
-          parameters,
-          body);
+          name as SimpleIdentifierImpl,
+          typeParameters as TypeParameterListImpl?,
+          parameters as FormalParameterListImpl?,
+          body as FunctionBodyImpl);
 
   @override
   MethodInvocation methodInvocation(
-          Expression target,
-          Token operator,
+          Expression? target,
+          Token? operator,
           SimpleIdentifier methodName,
-          TypeArgumentList typeArguments,
+          TypeArgumentList? typeArguments,
           ArgumentList argumentList) =>
       MethodInvocationImpl(
-          target, operator, methodName, typeArguments, argumentList);
+          target as ExpressionImpl?,
+          operator,
+          methodName as SimpleIdentifierImpl,
+          typeArguments as TypeArgumentListImpl?,
+          argumentList as ArgumentListImpl);
 
   @override
   MixinDeclaration mixinDeclaration(
-          Comment comment,
-          List<Annotation> metadata,
+          Comment? comment,
+          List<Annotation>? metadata,
           Token mixinKeyword,
           SimpleIdentifier name,
-          TypeParameterList typeParameters,
-          OnClause onClause,
-          ImplementsClause implementsClause,
+          TypeParameterList? typeParameters,
+          OnClause? onClause,
+          ImplementsClause? implementsClause,
           Token leftBracket,
           List<ClassMember> members,
           Token rightBracket) =>
       MixinDeclarationImpl(
-          comment,
+          comment as CommentImpl?,
           metadata,
           mixinKeyword,
-          name,
-          typeParameters,
-          onClause,
-          implementsClause,
+          name as SimpleIdentifierImpl,
+          typeParameters as TypeParameterListImpl?,
+          onClause as OnClauseImpl?,
+          implementsClause as ImplementsClauseImpl?,
           leftBracket,
           members,
           rightBracket);
 
   @override
   NamedExpression namedExpression(Label name, Expression expression) =>
-      NamedExpressionImpl(name, expression);
+      NamedExpressionImpl(name as LabelImpl, expression as ExpressionImpl);
 
   @override
-  NativeClause nativeClause(Token nativeKeyword, StringLiteral name) =>
-      NativeClauseImpl(nativeKeyword, name);
+  NativeClause nativeClause(Token nativeKeyword, StringLiteral? name) =>
+      NativeClauseImpl(nativeKeyword, name as StringLiteralImpl?);
 
   @override
   NativeFunctionBody nativeFunctionBody(
-          Token nativeKeyword, StringLiteral stringLiteral, Token semicolon) =>
-      NativeFunctionBodyImpl(nativeKeyword, stringLiteral, semicolon);
+          Token nativeKeyword, StringLiteral? stringLiteral, Token semicolon) =>
+      NativeFunctionBodyImpl(
+          nativeKeyword, stringLiteral as StringLiteralImpl?, semicolon);
 
   @override
-  NodeList<E> nodeList<E extends AstNode>(AstNode owner, [List<E> elements]) =>
+  NodeList<E> nodeList<E extends AstNode>(AstNode owner, [List<E>? elements]) =>
       NodeListImpl<E>(owner as AstNodeImpl, elements);
 
   @override
@@ -803,51 +949,63 @@
   ParenthesizedExpression parenthesizedExpression(Token leftParenthesis,
           Expression expression, Token rightParenthesis) =>
       ParenthesizedExpressionImpl(
-          leftParenthesis, expression, rightParenthesis);
+          leftParenthesis, expression as ExpressionImpl, rightParenthesis);
 
   @override
-  PartDirective partDirective(Comment comment, List<Annotation> metadata,
+  PartDirective partDirective(Comment? comment, List<Annotation>? metadata,
           Token partKeyword, StringLiteral partUri, Token semicolon) =>
-      PartDirectiveImpl(comment, metadata, partKeyword, partUri, semicolon);
+      PartDirectiveImpl(comment as CommentImpl?, metadata, partKeyword,
+          partUri as StringLiteralImpl, semicolon);
 
   @override
   PartOfDirective partOfDirective(
-          Comment comment,
-          List<Annotation> metadata,
+          Comment? comment,
+          List<Annotation>? metadata,
           Token partKeyword,
           Token ofKeyword,
-          StringLiteral uri,
-          LibraryIdentifier libraryName,
+          StringLiteral? uri,
+          LibraryIdentifier? libraryName,
           Token semicolon) =>
-      PartOfDirectiveImpl(comment, metadata, partKeyword, ofKeyword, uri,
-          libraryName, semicolon);
+      PartOfDirectiveImpl(
+          comment as CommentImpl?,
+          metadata,
+          partKeyword,
+          ofKeyword,
+          uri as StringLiteralImpl?,
+          libraryName as LibraryIdentifierImpl?,
+          semicolon);
 
   @override
   PostfixExpression postfixExpression(Expression operand, Token operator) =>
-      PostfixExpressionImpl(operand, operator);
+      PostfixExpressionImpl(operand as ExpressionImpl, operator);
 
   @override
   PrefixedIdentifier prefixedIdentifier(
           SimpleIdentifier prefix, Token period, SimpleIdentifier identifier) =>
-      PrefixedIdentifierImpl(prefix, period, identifier);
+      PrefixedIdentifierImpl(prefix as SimpleIdentifierImpl, period,
+          identifier as SimpleIdentifierImpl);
 
   @override
   PrefixExpression prefixExpression(Token operator, Expression operand) =>
-      PrefixExpressionImpl(operator, operand);
+      PrefixExpressionImpl(operator, operand as ExpressionImpl);
 
   @override
   PropertyAccess propertyAccess(
-          Expression target, Token operator, SimpleIdentifier propertyName) =>
-      PropertyAccessImpl(target, operator, propertyName);
+          Expression? target, Token operator, SimpleIdentifier propertyName) =>
+      PropertyAccessImpl(target as ExpressionImpl?, operator,
+          propertyName as SimpleIdentifierImpl);
 
   @override
   RedirectingConstructorInvocation redirectingConstructorInvocation(
           Token thisKeyword,
-          Token period,
-          SimpleIdentifier constructorName,
+          Token? period,
+          SimpleIdentifier? constructorName,
           ArgumentList argumentList) =>
       RedirectingConstructorInvocationImpl(
-          thisKeyword, period, constructorName, argumentList);
+          thisKeyword,
+          period,
+          constructorName as SimpleIdentifierImpl?,
+          argumentList as ArgumentListImpl);
 
   @override
   RethrowExpression rethrowExpression(Token rethrowKeyword) =>
@@ -855,21 +1013,22 @@
 
   @override
   ReturnStatement returnStatement(
-          Token returnKeyword, Expression expression, Token semicolon) =>
-      ReturnStatementImpl(returnKeyword, expression, semicolon);
+          Token returnKeyword, Expression? expression, Token semicolon) =>
+      ReturnStatementImpl(
+          returnKeyword, expression as ExpressionImpl?, semicolon);
 
   @override
   ScriptTag scriptTag(Token scriptTag) => ScriptTagImpl(scriptTag);
 
   @override
   SetOrMapLiteral setOrMapLiteral(
-          {Token constKeyword,
-          TypeArgumentList typeArguments,
-          Token leftBracket,
-          List<CollectionElement> elements,
-          Token rightBracket}) =>
-      SetOrMapLiteralImpl(
-          constKeyword, typeArguments, leftBracket, elements, rightBracket);
+          {Token? constKeyword,
+          TypeArgumentList? typeArguments,
+          required Token leftBracket,
+          required List<CollectionElement> elements,
+          required Token rightBracket}) =>
+      SetOrMapLiteralImpl(constKeyword, typeArguments as TypeArgumentListImpl?,
+          leftBracket, elements, rightBracket);
 
   @override
   ShowCombinator showCombinator(
@@ -878,15 +1037,21 @@
 
   @override
   SimpleFormalParameter simpleFormalParameter2(
-          {Comment comment,
-          List<Annotation> metadata,
-          Token covariantKeyword,
-          Token requiredKeyword,
-          Token keyword,
-          TypeAnnotation type,
-          @required SimpleIdentifier identifier}) =>
-      SimpleFormalParameterImpl(comment, metadata, covariantKeyword,
-          requiredKeyword, keyword, type, identifier);
+          {Comment? comment,
+          List<Annotation>? metadata,
+          Token? covariantKeyword,
+          Token? requiredKeyword,
+          Token? keyword,
+          TypeAnnotation? type,
+          required SimpleIdentifier? identifier}) =>
+      SimpleFormalParameterImpl(
+          comment as CommentImpl?,
+          metadata,
+          covariantKeyword,
+          requiredKeyword,
+          keyword,
+          type as TypeAnnotationImpl?,
+          identifier as SimpleIdentifierImpl?);
 
   @override
   SimpleIdentifier simpleIdentifier(Token token, {bool isDeclaration = false}) {
@@ -901,8 +1066,9 @@
       SimpleStringLiteralImpl(literal, value);
 
   @override
-  SpreadElement spreadElement({Token spreadOperator, Expression expression}) =>
-      SpreadElementImpl(spreadOperator, expression);
+  SpreadElement spreadElement(
+          {required Token spreadOperator, required Expression expression}) =>
+      SpreadElementImpl(spreadOperator, expression as ExpressionImpl);
 
   @override
   StringInterpolation stringInterpolation(
@@ -912,11 +1078,14 @@
   @override
   SuperConstructorInvocation superConstructorInvocation(
           Token superKeyword,
-          Token period,
-          SimpleIdentifier constructorName,
+          Token? period,
+          SimpleIdentifier? constructorName,
           ArgumentList argumentList) =>
       SuperConstructorInvocationImpl(
-          superKeyword, period, constructorName, argumentList);
+          superKeyword,
+          period,
+          constructorName as SimpleIdentifierImpl?,
+          argumentList as ArgumentListImpl);
 
   @override
   SuperExpression superExpression(Token superKeyword) =>
@@ -925,7 +1094,8 @@
   @override
   SwitchCase switchCase(List<Label> labels, Token keyword,
           Expression expression, Token colon, List<Statement> statements) =>
-      SwitchCaseImpl(labels, keyword, expression, colon, statements);
+      SwitchCaseImpl(
+          labels, keyword, expression as ExpressionImpl, colon, statements);
 
   @override
   SwitchDefault switchDefault(List<Label> labels, Token keyword, Token colon,
@@ -941,8 +1111,14 @@
           Token leftBracket,
           List<SwitchMember> members,
           Token rightBracket) =>
-      SwitchStatementImpl(switchKeyword, leftParenthesis, expression,
-          rightParenthesis, leftBracket, members, rightBracket);
+      SwitchStatementImpl(
+          switchKeyword,
+          leftParenthesis,
+          expression as ExpressionImpl,
+          rightParenthesis,
+          leftBracket,
+          members,
+          rightBracket);
 
   @override
   SymbolLiteral symbolLiteral(Token poundSign, List<Token> components) =>
@@ -954,27 +1130,31 @@
 
   @override
   ThrowExpression throwExpression(Token throwKeyword, Expression expression) =>
-      ThrowExpressionImpl(throwKeyword, expression);
+      ThrowExpressionImpl(throwKeyword, expression as ExpressionImpl);
 
   @override
   TopLevelVariableDeclaration topLevelVariableDeclaration(
-          Comment comment,
-          List<Annotation> metadata,
+          Comment? comment,
+          List<Annotation>? metadata,
           VariableDeclarationList variableList,
           Token semicolon,
-          {Token externalKeyword}) =>
+          {Token? externalKeyword}) =>
       TopLevelVariableDeclarationImpl(
-          comment, metadata, externalKeyword, variableList, semicolon);
+          comment as CommentImpl?,
+          metadata,
+          externalKeyword,
+          variableList as VariableDeclarationListImpl,
+          semicolon);
 
   @override
   TryStatement tryStatement(
           Token tryKeyword,
           Block body,
           List<CatchClause> catchClauses,
-          Token finallyKeyword,
-          Block finallyBlock) =>
-      TryStatementImpl(
-          tryKeyword, body, catchClauses, finallyKeyword, finallyBlock);
+          Token? finallyKeyword,
+          Block? finallyBlock) =>
+      TryStatementImpl(tryKeyword, body as BlockImpl, catchClauses,
+          finallyKeyword, finallyBlock as BlockImpl?);
 
   @override
   TypeArgumentList typeArgumentList(Token leftBracket,
@@ -982,23 +1162,39 @@
       TypeArgumentListImpl(leftBracket, arguments, rightBracket);
 
   @override
-  TypeName typeName(Identifier name, TypeArgumentList typeArguments,
-          {Token question}) =>
-      TypeNameImpl(name, typeArguments, question: question);
+  TypeName typeName(Identifier name, TypeArgumentList? typeArguments,
+          {Token? question}) =>
+      TypeNameImpl(
+          name as IdentifierImpl, typeArguments as TypeArgumentListImpl?,
+          question: question);
 
   @override
-  TypeParameter typeParameter(Comment comment, List<Annotation> metadata,
-          SimpleIdentifier name, Token extendsKeyword, TypeAnnotation bound) =>
-      TypeParameterImpl(comment, metadata, name, extendsKeyword, bound);
+  TypeParameter typeParameter(
+          Comment? comment,
+          List<Annotation>? metadata,
+          SimpleIdentifier name,
+          Token? extendsKeyword,
+          TypeAnnotation? bound) =>
+      TypeParameterImpl(
+          comment as CommentImpl?,
+          metadata,
+          name as SimpleIdentifierImpl,
+          extendsKeyword,
+          bound as TypeAnnotationImpl?);
 
   TypeParameter typeParameter2(
-          {Comment comment,
-          List<Annotation> metadata,
-          SimpleIdentifier name,
-          Token extendsKeyword,
-          TypeAnnotation bound,
-          Token varianceKeyword}) =>
-      TypeParameterImpl(comment, metadata, name, extendsKeyword, bound)
+          {Comment? comment,
+          List<Annotation>? metadata,
+          required SimpleIdentifier name,
+          Token? extendsKeyword,
+          TypeAnnotation? bound,
+          Token? varianceKeyword}) =>
+      TypeParameterImpl(
+          comment as CommentImpl?,
+          metadata,
+          name as SimpleIdentifierImpl,
+          extendsKeyword,
+          bound as TypeAnnotationImpl?)
         ..varianceKeyword = varianceKeyword;
 
   @override
@@ -1008,48 +1204,51 @@
 
   @override
   VariableDeclaration variableDeclaration(
-          SimpleIdentifier name, Token equals, Expression initializer) =>
-      VariableDeclarationImpl(name, equals, initializer);
+          SimpleIdentifier name, Token? equals, Expression? initializer) =>
+      VariableDeclarationImpl(
+          name as SimpleIdentifierImpl, equals, initializer as ExpressionImpl?);
 
   @override
   VariableDeclarationList variableDeclarationList(
-          Comment comment,
-          List<Annotation> metadata,
-          Token keyword,
-          TypeAnnotation type,
+          Comment? comment,
+          List<Annotation>? metadata,
+          Token? keyword,
+          TypeAnnotation? type,
           List<VariableDeclaration> variables) =>
-      VariableDeclarationListImpl(
-          comment, metadata, null, keyword, type, variables);
+      VariableDeclarationListImpl(comment as CommentImpl?, metadata, null,
+          keyword, type as TypeAnnotationImpl?, variables);
 
   @override
   VariableDeclarationList variableDeclarationList2(
-      {Comment comment,
-      List<Annotation> metadata,
-      Token lateKeyword,
-      Token keyword,
-      TypeAnnotation type,
-      List<VariableDeclaration> variables}) {
-    return VariableDeclarationListImpl(
-        comment, metadata, lateKeyword, keyword, type, variables);
+      {Comment? comment,
+      List<Annotation>? metadata,
+      Token? lateKeyword,
+      Token? keyword,
+      TypeAnnotation? type,
+      required List<VariableDeclaration> variables}) {
+    return VariableDeclarationListImpl(comment as CommentImpl?, metadata,
+        lateKeyword, keyword, type as TypeAnnotationImpl?, variables);
   }
 
   @override
   VariableDeclarationStatement variableDeclarationStatement(
           VariableDeclarationList variableList, Token semicolon) =>
-      VariableDeclarationStatementImpl(variableList, semicolon);
+      VariableDeclarationStatementImpl(
+          variableList as VariableDeclarationListImpl, semicolon);
 
   @override
   WhileStatement whileStatement(Token whileKeyword, Token leftParenthesis,
           Expression condition, Token rightParenthesis, Statement body) =>
-      WhileStatementImpl(
-          whileKeyword, leftParenthesis, condition, rightParenthesis, body);
+      WhileStatementImpl(whileKeyword, leftParenthesis,
+          condition as ExpressionImpl, rightParenthesis, body as StatementImpl);
 
   @override
   WithClause withClause(Token withKeyword, List<TypeName> mixinTypes) =>
       WithClauseImpl(withKeyword, mixinTypes);
 
   @override
-  YieldStatement yieldStatement(Token yieldKeyword, Token star,
+  YieldStatement yieldStatement(Token yieldKeyword, Token? star,
           Expression expression, Token semicolon) =>
-      YieldStatementImpl(yieldKeyword, star, expression, semicolon);
+      YieldStatementImpl(
+          yieldKeyword, star, expression as ExpressionImpl, semicolon);
 }
diff --git a/pkg/analyzer/lib/src/dart/ast/constant_evaluator.dart b/pkg/analyzer/lib/src/dart/ast/constant_evaluator.dart
index b1da5de..f2e5968 100644
--- a/pkg/analyzer/lib/src/dart/ast/constant_evaluator.dart
+++ b/pkg/analyzer/lib/src/dart/ast/constant_evaluator.dart
@@ -98,10 +98,10 @@
   static Object NOT_A_CONSTANT = Object();
 
   @override
-  Object visitAdjacentStrings(AdjacentStrings node) {
+  Object? visitAdjacentStrings(AdjacentStrings node) {
     StringBuffer buffer = StringBuffer();
     for (StringLiteral string in node.strings) {
-      Object value = string.accept(this);
+      var value = string.accept(this);
       if (identical(value, NOT_A_CONSTANT)) {
         return value;
       }
@@ -111,12 +111,12 @@
   }
 
   @override
-  Object visitBinaryExpression(BinaryExpression node) {
-    Object leftOperand = node.leftOperand.accept(this);
+  Object? visitBinaryExpression(BinaryExpression node) {
+    var leftOperand = node.leftOperand.accept(this);
     if (identical(leftOperand, NOT_A_CONSTANT)) {
       return leftOperand;
     }
-    Object rightOperand = node.rightOperand.accept(this);
+    var rightOperand = node.rightOperand.accept(this);
     if (identical(rightOperand, NOT_A_CONSTANT)) {
       return rightOperand;
     }
@@ -235,17 +235,17 @@
   }
 
   @override
-  Object visitBooleanLiteral(BooleanLiteral node) => node.value ? true : false;
+  Object? visitBooleanLiteral(BooleanLiteral node) => node.value ? true : false;
 
   @override
-  Object visitDoubleLiteral(DoubleLiteral node) => node.value;
+  Object? visitDoubleLiteral(DoubleLiteral node) => node.value;
 
   @override
-  Object visitIntegerLiteral(IntegerLiteral node) => node.value;
+  Object? visitIntegerLiteral(IntegerLiteral node) => node.value;
 
   @override
-  Object visitInterpolationExpression(InterpolationExpression node) {
-    Object value = node.expression.accept(this);
+  Object? visitInterpolationExpression(InterpolationExpression node) {
+    var value = node.expression.accept(this);
     if (value == null || value is bool || value is String || value is num) {
       return value;
     }
@@ -253,14 +253,14 @@
   }
 
   @override
-  Object visitInterpolationString(InterpolationString node) => node.value;
+  Object? visitInterpolationString(InterpolationString node) => node.value;
 
   @override
-  Object visitListLiteral(ListLiteral node) {
-    List<Object> list = <Object>[];
+  Object? visitListLiteral(ListLiteral node) {
+    List<Object?> list = <Object>[];
     for (CollectionElement element in node.elements) {
       if (element is Expression) {
-        Object value = element.accept(this);
+        var value = element.accept(this);
         if (identical(value, NOT_A_CONSTANT)) {
           return value;
         }
@@ -275,25 +275,25 @@
   }
 
   @override
-  Object visitMethodInvocation(MethodInvocation node) => visitNode(node);
+  Object? visitMethodInvocation(MethodInvocation node) => visitNode(node);
 
   @override
-  Object visitNode(AstNode node) => NOT_A_CONSTANT;
+  Object? visitNode(AstNode node) => NOT_A_CONSTANT;
 
   @override
-  Object visitNullLiteral(NullLiteral node) => null;
+  Object? visitNullLiteral(NullLiteral node) => null;
 
   @override
-  Object visitParenthesizedExpression(ParenthesizedExpression node) =>
+  Object? visitParenthesizedExpression(ParenthesizedExpression node) =>
       node.expression.accept(this);
 
   @override
-  Object visitPrefixedIdentifier(PrefixedIdentifier node) =>
+  Object? visitPrefixedIdentifier(PrefixedIdentifier node) =>
       _getConstantValue(null);
 
   @override
-  Object visitPrefixExpression(PrefixExpression node) {
-    Object operand = node.operand.accept(this);
+  Object? visitPrefixExpression(PrefixExpression node) {
+    var operand = node.operand.accept(this);
     if (identical(operand, NOT_A_CONSTANT)) {
       return operand;
     }
@@ -321,18 +321,18 @@
   }
 
   @override
-  Object visitPropertyAccess(PropertyAccess node) => _getConstantValue(null);
+  Object? visitPropertyAccess(PropertyAccess node) => _getConstantValue(null);
 
   @override
-  Object visitSetOrMapLiteral(SetOrMapLiteral node) {
+  Object? visitSetOrMapLiteral(SetOrMapLiteral node) {
     // There are a lot of constants that this class does not support, so we
     // didn't add support for set literals. As a result, this assumes that we're
     // looking at a map literal until we prove otherwise.
-    Map<String, Object> map = HashMap<String, Object>();
+    Map<String, Object?> map = HashMap<String, Object>();
     for (CollectionElement element in node.elements) {
       if (element is MapLiteralEntry) {
-        Object key = element.key.accept(this);
-        Object value = element.value.accept(this);
+        var key = element.key.accept(this);
+        var value = element.value.accept(this);
         if (key is String && !identical(value, NOT_A_CONSTANT)) {
           map[key] = value;
         } else {
@@ -348,17 +348,17 @@
   }
 
   @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) =>
+  Object? visitSimpleIdentifier(SimpleIdentifier node) =>
       _getConstantValue(null);
 
   @override
-  Object visitSimpleStringLiteral(SimpleStringLiteral node) => node.value;
+  Object? visitSimpleStringLiteral(SimpleStringLiteral node) => node.value;
 
   @override
-  Object visitStringInterpolation(StringInterpolation node) {
+  Object? visitStringInterpolation(StringInterpolation node) {
     StringBuffer buffer = StringBuffer();
     for (InterpolationElement element in node.elements) {
-      Object value = element.accept(this);
+      var value = element.accept(this);
       if (identical(value, NOT_A_CONSTANT)) {
         return value;
       }
@@ -368,7 +368,7 @@
   }
 
   @override
-  Object visitSymbolLiteral(SymbolLiteral node) {
+  Object? visitSymbolLiteral(SymbolLiteral node) {
     // TODO(brianwilkerson) This isn't optimal because a Symbol is not a String.
     StringBuffer buffer = StringBuffer();
     for (Token component in node.components) {
@@ -382,7 +382,7 @@
 
   /// Return the constant value of the static constant represented by the given
   /// [element].
-  Object _getConstantValue(Element element) {
+  Object _getConstantValue(Element? element) {
     // TODO(brianwilkerson) Implement this
 //    if (element is FieldElement) {
 //      FieldElement field = element;
diff --git a/pkg/analyzer/lib/src/dart/ast/element_locator.dart b/pkg/analyzer/lib/src/dart/ast/element_locator.dart
index e646c4e..8159d3a 100644
--- a/pkg/analyzer/lib/src/dart/ast/element_locator.dart
+++ b/pkg/analyzer/lib/src/dart/ast/element_locator.dart
@@ -11,7 +11,7 @@
 class ElementLocator {
   /// Return the element associated with the given [node], or `null` if there
   /// is no element associated with the node.
-  static Element locate(AstNode node) {
+  static Element? locate(AstNode? node) {
     if (node == null) return null;
 
     var mapper = _ElementMapper();
@@ -22,47 +22,47 @@
 /// Visitor that maps nodes to elements.
 class _ElementMapper extends GeneralizingAstVisitor<Element> {
   @override
-  Element visitAnnotation(Annotation node) {
+  Element? visitAnnotation(Annotation node) {
     return node.element;
   }
 
   @override
-  Element visitAssignmentExpression(AssignmentExpression node) {
+  Element? visitAssignmentExpression(AssignmentExpression node) {
     return node.staticElement;
   }
 
   @override
-  Element visitBinaryExpression(BinaryExpression node) {
+  Element? visitBinaryExpression(BinaryExpression node) {
     return node.staticElement;
   }
 
   @override
-  Element visitClassDeclaration(ClassDeclaration node) {
+  Element? visitClassDeclaration(ClassDeclaration node) {
     return node.declaredElement;
   }
 
   @override
-  Element visitCompilationUnit(CompilationUnit node) {
+  Element? visitCompilationUnit(CompilationUnit node) {
     return node.declaredElement;
   }
 
   @override
-  Element visitConstructorDeclaration(ConstructorDeclaration node) {
+  Element? visitConstructorDeclaration(ConstructorDeclaration node) {
     return node.declaredElement;
   }
 
   @override
-  Element visitExportDirective(ExportDirective node) {
+  Element? visitExportDirective(ExportDirective node) {
     return node.element;
   }
 
   @override
-  Element visitFunctionDeclaration(FunctionDeclaration node) {
+  Element? visitFunctionDeclaration(FunctionDeclaration node) {
     return node.declaredElement;
   }
 
   @override
-  Element visitIdentifier(Identifier node) {
+  Element? visitIdentifier(Identifier node) {
     var parent = node.parent;
     if (parent is Annotation) {
       // Type name in Annotation
@@ -98,57 +98,57 @@
   }
 
   @override
-  Element visitImportDirective(ImportDirective node) {
+  Element? visitImportDirective(ImportDirective node) {
     return node.element;
   }
 
   @override
-  Element visitIndexExpression(IndexExpression node) {
+  Element? visitIndexExpression(IndexExpression node) {
     return node.staticElement;
   }
 
   @override
-  Element visitInstanceCreationExpression(InstanceCreationExpression node) {
+  Element? visitInstanceCreationExpression(InstanceCreationExpression node) {
     return node.constructorName.staticElement;
   }
 
   @override
-  Element visitLibraryDirective(LibraryDirective node) {
+  Element? visitLibraryDirective(LibraryDirective node) {
     return node.element;
   }
 
   @override
-  Element visitMethodDeclaration(MethodDeclaration node) {
+  Element? visitMethodDeclaration(MethodDeclaration node) {
     return node.declaredElement;
   }
 
   @override
-  Element visitMethodInvocation(MethodInvocation node) {
+  Element? visitMethodInvocation(MethodInvocation node) {
     return node.methodName.staticElement;
   }
 
   @override
-  Element visitPartOfDirective(PartOfDirective node) {
+  Element? visitPartOfDirective(PartOfDirective node) {
     return node.element;
   }
 
   @override
-  Element visitPostfixExpression(PostfixExpression node) {
+  Element? visitPostfixExpression(PostfixExpression node) {
     return node.staticElement;
   }
 
   @override
-  Element visitPrefixedIdentifier(PrefixedIdentifier node) {
+  Element? visitPrefixedIdentifier(PrefixedIdentifier node) {
     return node.staticElement;
   }
 
   @override
-  Element visitPrefixExpression(PrefixExpression node) {
+  Element? visitPrefixExpression(PrefixExpression node) {
     return node.staticElement;
   }
 
   @override
-  Element visitStringLiteral(StringLiteral node) {
+  Element? visitStringLiteral(StringLiteral node) {
     var parent = node.parent;
     if (parent is UriBasedDirective) {
       return parent.uriElement;
@@ -157,7 +157,7 @@
   }
 
   @override
-  Element visitVariableDeclaration(VariableDeclaration node) {
+  Element? visitVariableDeclaration(VariableDeclaration node) {
     return node.declaredElement;
   }
 }
diff --git a/pkg/analyzer/lib/src/dart/ast/extensions.dart b/pkg/analyzer/lib/src/dart/ast/extensions.dart
index 2063cd9..2a92953 100644
--- a/pkg/analyzer/lib/src/dart/ast/extensions.dart
+++ b/pkg/analyzer/lib/src/dart/ast/extensions.dart
@@ -8,7 +8,7 @@
 import 'package:analyzer/src/dart/ast/ast.dart';
 
 /// TODO(scheglov) https://github.com/dart-lang/sdk/issues/43608
-Element _readElement(AstNode node) {
+Element? _readElement(AstNode node) {
   var parent = node.parent;
 
   if (parent is AssignmentExpression && parent.leftHandSide == node) {
@@ -31,7 +31,7 @@
 }
 
 /// TODO(scheglov) https://github.com/dart-lang/sdk/issues/43608
-Element _writeElement(AstNode node) {
+Element? _writeElement(AstNode node) {
   var parent = node.parent;
 
   if (parent is AssignmentExpression && parent.leftHandSide == node) {
@@ -54,7 +54,7 @@
 }
 
 /// TODO(scheglov) https://github.com/dart-lang/sdk/issues/43608
-DartType _writeType(AstNode node) {
+DartType? _writeType(AstNode node) {
   var parent = node.parent;
 
   if (parent is AssignmentExpression && parent.leftHandSide == node) {
@@ -88,7 +88,10 @@
   AstNode get typeOrSelf {
     var self = this;
     if (self is SimpleFormalParameter) {
-      return self.type;
+      var type = self.type;
+      if (type != null) {
+        return type;
+      }
     }
     return self;
   }
@@ -96,26 +99,26 @@
 
 /// TODO(scheglov) https://github.com/dart-lang/sdk/issues/43608
 extension IdentifierExtension on Identifier {
-  Element get writeElement {
+  Element? get writeElement {
     return _writeElement(this);
   }
 
-  Element get readElement {
+  Element? get readElement {
     return _readElement(this);
   }
 
-  Element get writeOrReadElement {
+  Element? get writeOrReadElement {
     return _writeElement(this) ?? staticElement;
   }
 
-  DartType get writeOrReadType {
+  DartType? get writeOrReadType {
     return _writeType(this) ?? staticType;
   }
 }
 
 /// TODO(scheglov) https://github.com/dart-lang/sdk/issues/43608
 extension IndexExpressionExtension on IndexExpression {
-  Element get writeOrReadElement {
+  Element? get writeOrReadElement {
     return _writeElement(this) ?? staticElement;
   }
 }
diff --git a/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart b/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart
index 38736b4..2758b97 100644
--- a/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart
@@ -30,7 +30,7 @@
 
   /// Safely visit the given [node].
   @protected
-  void safelyVisitNode(AstNode node) {
+  void safelyVisitNode(AstNode? node) {
     if (node != null) {
       node.accept(this);
     }
@@ -46,19 +46,12 @@
   @protected
   void safelyVisitNodeListWithSeparator(
       NodeList<AstNode> nodes, String separator) {
-    if (nodes != null) {
-      int size = nodes.length;
-      for (int i = 0; i < size; i++) {
-        if (i > 0) {
-          sink.write(separator);
-        }
-        var node = nodes[i];
-        if (node != null) {
-          node.accept(this);
-        } else {
-          sink.write('<null>');
-        }
+    int size = nodes.length;
+    for (int i = 0; i < size; i++) {
+      if (i > 0) {
+        sink.write(separator);
       }
+      nodes[i].accept(this);
     }
   }
 
@@ -67,16 +60,14 @@
   @protected
   void safelyVisitNodeListWithSeparatorAndPrefix(
       String prefix, NodeList<AstNode> nodes, String separator) {
-    if (nodes != null) {
-      int size = nodes.length;
-      if (size > 0) {
-        sink.write(prefix);
-        for (int i = 0; i < size; i++) {
-          if (i > 0) {
-            sink.write(separator);
-          }
-          nodes[i].accept(this);
+    int size = nodes.length;
+    if (size > 0) {
+      sink.write(prefix);
+      for (int i = 0; i < size; i++) {
+        if (i > 0) {
+          sink.write(separator);
         }
+        nodes[i].accept(this);
       }
     }
   }
@@ -86,24 +77,22 @@
   @protected
   void safelyVisitNodeListWithSeparatorAndSuffix(
       NodeList<AstNode> nodes, String separator, String suffix) {
-    if (nodes != null) {
-      int size = nodes.length;
-      if (size > 0) {
-        for (int i = 0; i < size; i++) {
-          if (i > 0) {
-            sink.write(separator);
-          }
-          nodes[i].accept(this);
+    int size = nodes.length;
+    if (size > 0) {
+      for (int i = 0; i < size; i++) {
+        if (i > 0) {
+          sink.write(separator);
         }
-        sink.write(suffix);
+        nodes[i].accept(this);
       }
+      sink.write(suffix);
     }
   }
 
   /// Safely visit the given [node], printing the [prefix] before the node if it
   /// is non-`null`.
   @protected
-  void safelyVisitNodeWithPrefix(String prefix, AstNode node) {
+  void safelyVisitNodeWithPrefix(String prefix, AstNode? node) {
     if (node != null) {
       sink.write(prefix);
       node.accept(this);
@@ -113,7 +102,7 @@
   /// Safely visit the given [node], printing the [suffix] after the node if it
   /// is non-`null`.
   @protected
-  void safelyVisitNodeWithSuffix(AstNode node, String suffix) {
+  void safelyVisitNodeWithSuffix(AstNode? node, String suffix) {
     if (node != null) {
       node.accept(this);
       sink.write(suffix);
@@ -122,7 +111,7 @@
 
   /// Safely visit the given [token].
   @protected
-  void safelyVisitToken(Token token) {
+  void safelyVisitToken(Token? token) {
     if (token != null) {
       sink.write(token.lexeme);
     }
@@ -131,7 +120,7 @@
   /// Safely visit the given [token], printing the [suffix] after the token if
   /// it is non-`null`.
   @protected
-  void safelyVisitTokenWithSuffix(Token token, String suffix) {
+  void safelyVisitTokenWithSuffix(Token? token, String suffix) {
     if (token != null) {
       sink.write(token.lexeme);
       sink.write(suffix);
@@ -220,7 +209,7 @@
 
   @override
   void visitBlockFunctionBody(BlockFunctionBody node) {
-    Token keyword = node.keyword;
+    var keyword = node.keyword;
     if (keyword != null) {
       sink.write(keyword.lexeme);
       if (node.star != null) {
@@ -305,7 +294,7 @@
 
   @override
   void visitCompilationUnit(CompilationUnit node) {
-    ScriptTag scriptTag = node.scriptTag;
+    var scriptTag = node.scriptTag;
     NodeList<Directive> directives = node.directives;
     safelyVisitNode(scriptTag);
     String prefix = scriptTag == null ? "" : " ";
@@ -343,7 +332,7 @@
     safelyVisitNode(node.parameters);
     safelyVisitNodeListWithSeparatorAndPrefix(" : ", node.initializers, ", ");
     safelyVisitNodeWithPrefix(" = ", node.redirectedConstructor);
-    safelyVisitFunctionWithPrefix(" ", node.body);
+    safelyVisitFunctionWithPrefix(" ", node.body!);
   }
 
   @override
@@ -382,10 +371,10 @@
     }
     safelyVisitNode(node.parameter);
     if (node.separator != null) {
-      if (node.separator.lexeme != ":") {
+      if (node.separator!.lexeme != ":") {
         sink.write(" ");
       }
-      sink.write(node.separator.lexeme);
+      sink.write(node.separator!.lexeme);
       safelyVisitNodeWithPrefix(" ", node.defaultValue);
     }
   }
@@ -446,12 +435,12 @@
 
   @override
   void visitExpressionFunctionBody(ExpressionFunctionBody node) {
-    Token keyword = node.keyword;
+    var keyword = node.keyword;
     if (keyword != null) {
       sink.write(keyword.lexeme);
       sink.write(' ');
     }
-    sink.write('${node.functionDefinition?.lexeme} ');
+    sink.write('${node.functionDefinition.lexeme} ');
     safelyVisitNode(node.expression);
     if (node.semicolon != null) {
       sink.write(';');
@@ -539,7 +528,7 @@
 
   @override
   void visitFormalParameterList(FormalParameterList node) {
-    String groupEnd;
+    String? groupEnd;
     sink.write('(');
     NodeList<FormalParameter> parameters = node.parameters;
     int size = parameters.length;
@@ -827,11 +816,11 @@
   @override
   void visitMethodInvocation(MethodInvocation node) {
     if (node.isCascaded) {
-      sink.write(node.operator.lexeme);
+      sink.write(node.operator!.lexeme);
     } else {
       if (node.target != null) {
-        node.target.accept(this);
-        sink.write(node.operator.lexeme);
+        node.target!.accept(this);
+        sink.write(node.operator!.lexeme);
       }
     }
     safelyVisitNode(node.methodName);
@@ -950,7 +939,7 @@
 
   @override
   void visitReturnStatement(ReturnStatement node) {
-    Expression expression = node.expression;
+    var expression = node.expression;
     if (expression == null) {
       sink.write("return;");
     } else {
@@ -1108,8 +1097,9 @@
     safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     // TODO (kallentu) : Clean up TypeParameterImpl casting once variance is
     // added to the interface.
-    if ((node as TypeParameterImpl).varianceKeyword != null) {
-      sink.write((node as TypeParameterImpl).varianceKeyword.lexeme + ' ');
+    var varianceKeyword = (node as TypeParameterImpl).varianceKeyword;
+    if (varianceKeyword != null) {
+      sink.write(varianceKeyword.lexeme + ' ');
     }
     safelyVisitNode(node.name);
     safelyVisitNodeWithPrefix(" extends ", node.bound);
@@ -1170,15 +1160,13 @@
   }
 
   void _writeOperand(Expression node, Expression operand) {
-    if (operand != null) {
-      bool needsParenthesis = operand.precedence < node.precedence;
-      if (needsParenthesis) {
-        sink.write('(');
-      }
-      operand.accept(this);
-      if (needsParenthesis) {
-        sink.write(')');
-      }
+    bool needsParenthesis = operand.precedence < node.precedence;
+    if (needsParenthesis) {
+      sink.write('(');
+    }
+    operand.accept(this);
+    if (needsParenthesis) {
+      sink.write(')');
     }
   }
 }
diff --git a/pkg/analyzer/lib/src/dart/ast/utilities.dart b/pkg/analyzer/lib/src/dart/ast/utilities.dart
index 6e0c1a8..3f388e56b 100644
--- a/pkg/analyzer/lib/src/dart/ast/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/ast/utilities.dart
@@ -34,10 +34,10 @@
   final Map<Token, Token> _clonedTokens = Map<Token, Token>.identity();
 
   /// The next original token to clone.
-  Token _nextToClone;
+  Token? _nextToClone;
 
   /// The last cloned token.
-  Token _lastCloned;
+  Token? _lastCloned;
 
   /// The offset of the last cloned token.
   int _lastClonedOffset = -1;
@@ -50,9 +50,6 @@
 
   /// Return a clone of the given [node].
   E cloneNode<E extends AstNode>(E node) {
-    if (node == null) {
-      return null;
-    }
     return node.accept(this) as E;
   }
 
@@ -67,8 +64,16 @@
     return clonedNodes;
   }
 
+  /// Return a clone of the given [node].
+  E? cloneNullableNode<E extends AstNode>(E? node) {
+    if (node == null) {
+      return null;
+    }
+    return node.accept(this) as E;
+  }
+
   /// Clone the given [token] if tokens are supposed to be cloned.
-  Token cloneToken(Token token) {
+  Token? cloneNullableToken(Token? token) {
     if (cloneTokens) {
       if (token == null) {
         return null;
@@ -76,9 +81,19 @@
       if (_lastClonedOffset <= token.offset) {
         _cloneTokens(_nextToClone ?? token, token.offset);
       }
-      Token clone = _clonedTokens[token];
-      assert(clone != null);
-      return clone;
+      return _clonedTokens[token]!;
+    } else {
+      return token;
+    }
+  }
+
+  /// Clone the given [token] if tokens are supposed to be cloned.
+  Token cloneToken(Token token) {
+    if (cloneTokens) {
+      if (_lastClonedOffset <= token.offset) {
+        _cloneTokens(_nextToClone ?? token, token.offset);
+      }
+      return _clonedTokens[token]!;
     } else {
       return token;
     }
@@ -100,9 +115,9 @@
   Annotation visitAnnotation(Annotation node) => astFactory.annotation(
       cloneToken(node.atSign),
       cloneNode(node.name),
-      cloneToken(node.period),
-      cloneNode(node.constructorName),
-      cloneNode(node.arguments));
+      cloneNullableToken(node.period),
+      cloneNullableNode(node.constructorName),
+      cloneNullableNode(node.arguments));
 
   @override
   ArgumentList visitArgumentList(ArgumentList node) => astFactory.argumentList(
@@ -122,8 +137,8 @@
           cloneToken(node.assertKeyword),
           cloneToken(node.leftParenthesis),
           cloneNode(node.condition),
-          cloneToken(node.comma),
-          cloneNode(node.message),
+          cloneNullableToken(node.comma),
+          cloneNullableNode(node.message),
           cloneToken(node.rightParenthesis));
 
   @override
@@ -132,8 +147,8 @@
           cloneToken(node.assertKeyword),
           cloneToken(node.leftParenthesis),
           cloneNode(node.condition),
-          cloneToken(node.comma),
-          cloneNode(node.message),
+          cloneNullableToken(node.comma),
+          cloneNullableNode(node.message),
           cloneToken(node.rightParenthesis),
           cloneToken(node.semicolon));
 
@@ -158,8 +173,8 @@
 
   @override
   BlockFunctionBody visitBlockFunctionBody(BlockFunctionBody node) =>
-      astFactory.blockFunctionBody(cloneToken(node.keyword),
-          cloneToken(node.star), cloneNode(node.block));
+      astFactory.blockFunctionBody(cloneNullableToken(node.keyword),
+          cloneNullableToken(node.star), cloneNode(node.block));
 
   @override
   BooleanLiteral visitBooleanLiteral(BooleanLiteral node) =>
@@ -168,7 +183,7 @@
   @override
   BreakStatement visitBreakStatement(BreakStatement node) =>
       astFactory.breakStatement(cloneToken(node.breakKeyword),
-          cloneNode(node.label), cloneToken(node.semicolon));
+          cloneNullableNode(node.label), cloneToken(node.semicolon));
 
   @override
   CascadeExpression visitCascadeExpression(CascadeExpression node) =>
@@ -177,49 +192,49 @@
 
   @override
   CatchClause visitCatchClause(CatchClause node) => astFactory.catchClause(
-      cloneToken(node.onKeyword),
-      cloneNode(node.exceptionType),
-      cloneToken(node.catchKeyword),
-      cloneToken(node.leftParenthesis),
-      cloneNode(node.exceptionParameter),
-      cloneToken(node.comma),
-      cloneNode(node.stackTraceParameter),
-      cloneToken(node.rightParenthesis),
+      cloneNullableToken(node.onKeyword),
+      cloneNullableNode(node.exceptionType),
+      cloneNullableToken(node.catchKeyword),
+      cloneNullableToken(node.leftParenthesis),
+      cloneNullableNode(node.exceptionParameter),
+      cloneNullableToken(node.comma),
+      cloneNullableNode(node.stackTraceParameter),
+      cloneNullableToken(node.rightParenthesis),
       cloneNode(node.body));
 
   @override
   ClassDeclaration visitClassDeclaration(ClassDeclaration node) {
     ClassDeclaration copy = astFactory.classDeclaration(
-        cloneNode(node.documentationComment),
+        cloneNullableNode(node.documentationComment),
         cloneNodeList(node.metadata),
-        cloneToken(node.abstractKeyword),
+        cloneNullableToken(node.abstractKeyword),
         cloneToken(node.classKeyword),
         cloneNode(node.name),
-        cloneNode(node.typeParameters),
-        cloneNode(node.extendsClause),
-        cloneNode(node.withClause),
-        cloneNode(node.implementsClause),
+        cloneNullableNode(node.typeParameters),
+        cloneNullableNode(node.extendsClause),
+        cloneNullableNode(node.withClause),
+        cloneNullableNode(node.implementsClause),
         cloneToken(node.leftBracket),
         cloneNodeList(node.members),
         cloneToken(node.rightBracket));
-    copy.nativeClause = cloneNode(node.nativeClause);
+    copy.nativeClause = cloneNullableNode(node.nativeClause);
     return copy;
   }
 
   @override
   ClassTypeAlias visitClassTypeAlias(ClassTypeAlias node) {
-    cloneToken(node.abstractKeyword);
+    cloneNullableToken(node.abstractKeyword);
     return astFactory.classTypeAlias(
-        cloneNode(node.documentationComment),
+        cloneNullableNode(node.documentationComment),
         cloneNodeList(node.metadata),
         cloneToken(node.typedefKeyword),
         cloneNode(node.name),
-        cloneNode(node.typeParameters),
+        cloneNullableNode(node.typeParameters),
         cloneToken(node.equals),
-        cloneToken(node.abstractKeyword),
+        cloneNullableToken(node.abstractKeyword),
         cloneNode(node.superclass),
         cloneNode(node.withClause),
-        cloneNode(node.implementsClause),
+        cloneNullableNode(node.implementsClause),
         cloneToken(node.semicolon));
   }
 
@@ -240,7 +255,7 @@
     // separate from the compilation unit's token stream.
     // Clone the tokens in that stream here and add them to _clondedTokens
     // for use when cloning the comment reference.
-    Token token = node.beginToken;
+    Token? token = node.beginToken;
     Token lastCloned = Token.eof(-1);
     while (token != null) {
       Token clone = token.copy();
@@ -253,14 +268,14 @@
       token = token.next;
     }
     return astFactory.commentReference(
-        cloneToken(node.newKeyword), cloneNode(node.identifier));
+        cloneNullableToken(node.newKeyword), cloneNode(node.identifier));
   }
 
   @override
   CompilationUnit visitCompilationUnit(CompilationUnit node) {
     CompilationUnit clone = astFactory.compilationUnit(
         beginToken: cloneToken(node.beginToken),
-        scriptTag: cloneNode(node.scriptTag),
+        scriptTag: cloneNullableNode(node.scriptTag),
         directives: cloneNodeList(node.directives),
         declarations: cloneNodeList(node.declarations),
         endToken: cloneToken(node.endToken),
@@ -285,8 +300,8 @@
           cloneToken(node.ifKeyword),
           cloneToken(node.leftParenthesis),
           cloneNode(node.name),
-          cloneToken(node.equalToken),
-          cloneNode(node.value),
+          cloneNullableToken(node.equalToken),
+          cloneNullableNode(node.value),
           cloneToken(node.rightParenthesis),
           cloneNode(node.uri));
 
@@ -294,54 +309,57 @@
   ConstructorDeclaration visitConstructorDeclaration(
           ConstructorDeclaration node) =>
       astFactory.constructorDeclaration(
-          cloneNode(node.documentationComment),
+          cloneNullableNode(node.documentationComment),
           cloneNodeList(node.metadata),
-          cloneToken(node.externalKeyword),
-          cloneToken(node.constKeyword),
-          cloneToken(node.factoryKeyword),
+          cloneNullableToken(node.externalKeyword),
+          cloneNullableToken(node.constKeyword),
+          cloneNullableToken(node.factoryKeyword),
           cloneNode(node.returnType),
-          cloneToken(node.period),
-          cloneNode(node.name),
+          cloneNullableToken(node.period),
+          cloneNullableNode(node.name),
           cloneNode(node.parameters),
-          cloneToken(node.separator),
+          cloneNullableToken(node.separator),
           cloneNodeList(node.initializers),
-          cloneNode(node.redirectedConstructor),
-          cloneNode(node.body));
+          cloneNullableNode(node.redirectedConstructor),
+          cloneNullableNode(node.body));
 
   @override
   ConstructorFieldInitializer visitConstructorFieldInitializer(
           ConstructorFieldInitializer node) =>
       astFactory.constructorFieldInitializer(
-          cloneToken(node.thisKeyword),
-          cloneToken(node.period),
+          cloneNullableToken(node.thisKeyword),
+          cloneNullableToken(node.period),
           cloneNode(node.fieldName),
           cloneToken(node.equals),
           cloneNode(node.expression));
 
   @override
   ConstructorName visitConstructorName(ConstructorName node) =>
-      astFactory.constructorName(
-          cloneNode(node.type), cloneToken(node.period), cloneNode(node.name));
+      astFactory.constructorName(cloneNode(node.type),
+          cloneNullableToken(node.period), cloneNullableNode(node.name));
 
   @override
   ContinueStatement visitContinueStatement(ContinueStatement node) =>
       astFactory.continueStatement(cloneToken(node.continueKeyword),
-          cloneNode(node.label), cloneToken(node.semicolon));
+          cloneNullableNode(node.label), cloneToken(node.semicolon));
 
   @override
   DeclaredIdentifier visitDeclaredIdentifier(DeclaredIdentifier node) =>
       astFactory.declaredIdentifier(
-          cloneNode(node.documentationComment),
+          cloneNullableNode(node.documentationComment),
           cloneNodeList(node.metadata),
-          cloneToken(node.keyword),
-          cloneNode(node.type),
+          cloneNullableToken(node.keyword),
+          cloneNullableNode(node.type),
           cloneNode(node.identifier));
 
   @override
   DefaultFormalParameter visitDefaultFormalParameter(
           covariant DefaultFormalParameterImpl node) =>
-      astFactory.defaultFormalParameter(cloneNode(node.parameter), node.kind,
-          cloneToken(node.separator), cloneNode(node.defaultValue));
+      astFactory.defaultFormalParameter(
+          cloneNode(node.parameter),
+          node.kind,
+          cloneNullableToken(node.separator),
+          cloneNullableNode(node.defaultValue));
 
   @override
   DoStatement visitDoStatement(DoStatement node) => astFactory.doStatement(
@@ -371,13 +389,15 @@
 
   @override
   AstNode visitEnumConstantDeclaration(EnumConstantDeclaration node) =>
-      astFactory.enumConstantDeclaration(cloneNode(node.documentationComment),
-          cloneNodeList(node.metadata), cloneNode(node.name));
+      astFactory.enumConstantDeclaration(
+          cloneNullableNode(node.documentationComment),
+          cloneNodeList(node.metadata),
+          cloneNode(node.name));
 
   @override
   EnumDeclaration visitEnumDeclaration(EnumDeclaration node) =>
       astFactory.enumDeclaration(
-          cloneNode(node.documentationComment),
+          cloneNullableNode(node.documentationComment),
           cloneNodeList(node.metadata),
           cloneToken(node.enumKeyword),
           cloneNode(node.name),
@@ -387,14 +407,14 @@
 
   @override
   ExportDirective visitExportDirective(ExportDirective node) {
-    ExportDirectiveImpl directive = astFactory.exportDirective(
-        cloneNode(node.documentationComment),
+    var directive = astFactory.exportDirective(
+        cloneNullableNode(node.documentationComment),
         cloneNodeList(node.metadata),
         cloneToken(node.keyword),
         cloneNode(node.uri),
         cloneNodeList(node.configurations),
         cloneNodeList(node.combinators),
-        cloneToken(node.semicolon));
+        cloneToken(node.semicolon)) as ExportDirectiveImpl;
     directive.selectedUriContent = node.selectedUriContent;
     directive.selectedSource = node.selectedSource;
     directive.uriSource = node.uriSource;
@@ -406,15 +426,15 @@
   ExpressionFunctionBody visitExpressionFunctionBody(
           ExpressionFunctionBody node) =>
       astFactory.expressionFunctionBody(
-          cloneToken(node.keyword),
+          cloneNullableToken(node.keyword),
           cloneToken(node.functionDefinition),
           cloneNode(node.expression),
-          cloneToken(node.semicolon));
+          cloneNullableToken(node.semicolon));
 
   @override
   ExpressionStatement visitExpressionStatement(ExpressionStatement node) =>
       astFactory.expressionStatement(
-          cloneNode(node.expression), cloneToken(node.semicolon));
+          cloneNode(node.expression), cloneNullableToken(node.semicolon));
 
   @override
   ExtendsClause visitExtendsClause(ExtendsClause node) =>
@@ -424,11 +444,11 @@
   @override
   ExtensionDeclaration visitExtensionDeclaration(ExtensionDeclaration node) =>
       astFactory.extensionDeclaration(
-          comment: cloneNode(node.documentationComment),
+          comment: cloneNullableNode(node.documentationComment),
           metadata: cloneNodeList(node.metadata),
           extensionKeyword: cloneToken(node.extensionKeyword),
-          name: cloneNode(node.name),
-          typeParameters: cloneNode(node.typeParameters),
+          name: cloneNullableNode(node.name),
+          typeParameters: cloneNullableNode(node.typeParameters),
           onKeyword: cloneToken(node.onKeyword),
           extendedType: cloneNode(node.extendedType),
           leftBracket: cloneToken(node.leftBracket),
@@ -439,35 +459,35 @@
   ExtensionOverride visitExtensionOverride(ExtensionOverride node) =>
       astFactory.extensionOverride(
           extensionName: cloneNode(node.extensionName),
-          typeArguments: cloneNode(node.typeArguments),
+          typeArguments: cloneNullableNode(node.typeArguments),
           argumentList: cloneNode(node.argumentList));
 
   @override
   FieldDeclaration visitFieldDeclaration(FieldDeclaration node) =>
       astFactory.fieldDeclaration2(
-          comment: cloneNode(node.documentationComment),
+          comment: cloneNullableNode(node.documentationComment),
           metadata: cloneNodeList(node.metadata),
-          abstractKeyword: cloneToken(node.abstractKeyword),
-          covariantKeyword: cloneToken(node.covariantKeyword),
-          externalKeyword: cloneToken(node.externalKeyword),
-          staticKeyword: cloneToken(node.staticKeyword),
+          abstractKeyword: cloneNullableToken(node.abstractKeyword),
+          covariantKeyword: cloneNullableToken(node.covariantKeyword),
+          externalKeyword: cloneNullableToken(node.externalKeyword),
+          staticKeyword: cloneNullableToken(node.staticKeyword),
           fieldList: cloneNode(node.fields),
           semicolon: cloneToken(node.semicolon));
 
   @override
   FieldFormalParameter visitFieldFormalParameter(FieldFormalParameter node) =>
       astFactory.fieldFormalParameter2(
-          comment: cloneNode(node.documentationComment),
+          comment: cloneNullableNode(node.documentationComment),
           metadata: cloneNodeList(node.metadata),
-          covariantKeyword: cloneToken(node.covariantKeyword),
-          keyword: cloneToken(node.keyword),
-          type: cloneNode(node.type),
+          covariantKeyword: cloneNullableToken(node.covariantKeyword),
+          keyword: cloneNullableToken(node.keyword),
+          type: cloneNullableNode(node.type),
           thisKeyword: cloneToken(node.thisKeyword),
           period: cloneToken(node.period),
           identifier: cloneNode(node.identifier),
-          typeParameters: cloneNode(node.typeParameters),
-          parameters: cloneNode(node.parameters),
-          question: cloneToken(node.question));
+          typeParameters: cloneNullableNode(node.typeParameters),
+          parameters: cloneNullableNode(node.parameters),
+          question: cloneNullableToken(node.question));
 
   @override
   ForEachPartsWithDeclaration visitForEachPartsWithDeclaration(
@@ -487,7 +507,7 @@
 
   @override
   ForElement visitForElement(ForElement node) => astFactory.forElement(
-      awaitKeyword: cloneToken(node.awaitKeyword),
+      awaitKeyword: cloneNullableToken(node.awaitKeyword),
       forKeyword: cloneToken(node.forKeyword),
       leftParenthesis: cloneToken(node.leftParenthesis),
       forLoopParts: cloneNode(node.forLoopParts),
@@ -499,8 +519,8 @@
       astFactory.formalParameterList(
           cloneToken(node.leftParenthesis),
           cloneNodeList(node.parameters),
-          cloneToken(node.leftDelimiter),
-          cloneToken(node.rightDelimiter),
+          cloneNullableToken(node.leftDelimiter),
+          cloneNullableToken(node.rightDelimiter),
           cloneToken(node.rightParenthesis));
 
   @override
@@ -509,7 +529,7 @@
       astFactory.forPartsWithDeclarations(
           variables: cloneNode(node.variables),
           leftSeparator: cloneToken(node.leftSeparator),
-          condition: cloneNode(node.condition),
+          condition: cloneNullableNode(node.condition),
           rightSeparator: cloneToken(node.rightSeparator),
           updaters: cloneNodeList(node.updaters));
 
@@ -517,15 +537,15 @@
   ForPartsWithExpression visitForPartsWithExpression(
           ForPartsWithExpression node) =>
       astFactory.forPartsWithExpression(
-          initialization: cloneNode(node.initialization),
+          initialization: cloneNullableNode(node.initialization),
           leftSeparator: cloneToken(node.leftSeparator),
-          condition: cloneNode(node.condition),
+          condition: cloneNullableNode(node.condition),
           rightSeparator: cloneToken(node.rightSeparator),
           updaters: cloneNodeList(node.updaters));
 
   @override
   ForStatement visitForStatement(ForStatement node) => astFactory.forStatement(
-      awaitKeyword: cloneToken(node.awaitKeyword),
+      awaitKeyword: cloneNullableToken(node.awaitKeyword),
       forKeyword: cloneToken(node.forKeyword),
       leftParenthesis: cloneToken(node.leftParenthesis),
       forLoopParts: cloneNode(node.forLoopParts),
@@ -535,11 +555,11 @@
   @override
   FunctionDeclaration visitFunctionDeclaration(FunctionDeclaration node) =>
       astFactory.functionDeclaration(
-          cloneNode(node.documentationComment),
+          cloneNullableNode(node.documentationComment),
           cloneNodeList(node.metadata),
-          cloneToken(node.externalKeyword),
-          cloneNode(node.returnType),
-          cloneToken(node.propertyKeyword),
+          cloneNullableToken(node.externalKeyword),
+          cloneNullableNode(node.returnType),
+          cloneNullableToken(node.propertyKeyword),
           cloneNode(node.name),
           cloneNode(node.functionExpression));
 
@@ -551,24 +571,24 @@
 
   @override
   FunctionExpression visitFunctionExpression(FunctionExpression node) =>
-      astFactory.functionExpression(cloneNode(node.typeParameters),
-          cloneNode(node.parameters), cloneNode(node.body));
+      astFactory.functionExpression(cloneNullableNode(node.typeParameters),
+          cloneNullableNode(node.parameters), cloneNullableNode(node.body));
 
   @override
   FunctionExpressionInvocation visitFunctionExpressionInvocation(
           FunctionExpressionInvocation node) =>
       astFactory.functionExpressionInvocation(cloneNode(node.function),
-          cloneNode(node.typeArguments), cloneNode(node.argumentList));
+          cloneNullableNode(node.typeArguments), cloneNode(node.argumentList));
 
   @override
   FunctionTypeAlias visitFunctionTypeAlias(FunctionTypeAlias node) =>
       astFactory.functionTypeAlias(
-          cloneNode(node.documentationComment),
+          cloneNullableNode(node.documentationComment),
           cloneNodeList(node.metadata),
           cloneToken(node.typedefKeyword),
-          cloneNode(node.returnType),
+          cloneNullableNode(node.returnType),
           cloneNode(node.name),
-          cloneNode(node.typeParameters),
+          cloneNullableNode(node.typeParameters),
           cloneNode(node.parameters),
           cloneToken(node.semicolon));
 
@@ -576,32 +596,32 @@
   FunctionTypedFormalParameter visitFunctionTypedFormalParameter(
           FunctionTypedFormalParameter node) =>
       astFactory.functionTypedFormalParameter2(
-          comment: cloneNode(node.documentationComment),
+          comment: cloneNullableNode(node.documentationComment),
           metadata: cloneNodeList(node.metadata),
-          covariantKeyword: cloneToken(node.covariantKeyword),
-          returnType: cloneNode(node.returnType),
+          covariantKeyword: cloneNullableToken(node.covariantKeyword),
+          returnType: cloneNullableNode(node.returnType),
           identifier: cloneNode(node.identifier),
-          typeParameters: cloneNode(node.typeParameters),
+          typeParameters: cloneNullableNode(node.typeParameters),
           parameters: cloneNode(node.parameters),
-          question: cloneToken(node.question));
+          question: cloneNullableToken(node.question));
 
   @override
   AstNode visitGenericFunctionType(GenericFunctionType node) =>
       astFactory.genericFunctionType(
-          cloneNode(node.returnType),
+          cloneNullableNode(node.returnType),
           cloneToken(node.functionKeyword),
-          cloneNode(node.typeParameters),
+          cloneNullableNode(node.typeParameters),
           cloneNode(node.parameters),
-          question: cloneToken(node.question));
+          question: cloneNullableToken(node.question));
 
   @override
   AstNode visitGenericTypeAlias(GenericTypeAlias node) =>
       astFactory.genericTypeAlias(
-          cloneNode(node.documentationComment),
+          cloneNullableNode(node.documentationComment),
           cloneNodeList(node.metadata),
           cloneToken(node.typedefKeyword),
           cloneNode(node.name),
-          cloneNode(node.typeParameters),
+          cloneNullableNode(node.typeParameters),
           cloneToken(node.equals),
           cloneNode(node.type),
           cloneToken(node.semicolon));
@@ -618,8 +638,8 @@
       condition: cloneNode(node.condition),
       rightParenthesis: cloneToken(node.rightParenthesis),
       thenElement: cloneNode(node.thenElement),
-      elseKeyword: cloneToken(node.elseKeyword),
-      elseElement: cloneNode(node.elseElement));
+      elseKeyword: cloneNullableToken(node.elseKeyword),
+      elseElement: cloneNullableNode(node.elseElement));
 
   @override
   IfStatement visitIfStatement(IfStatement node) => astFactory.ifStatement(
@@ -628,8 +648,8 @@
       cloneNode(node.condition),
       cloneToken(node.rightParenthesis),
       cloneNode(node.thenStatement),
-      cloneToken(node.elseKeyword),
-      cloneNode(node.elseStatement));
+      cloneNullableToken(node.elseKeyword),
+      cloneNullableNode(node.elseStatement));
 
   @override
   ImplementsClause visitImplementsClause(ImplementsClause node) =>
@@ -638,17 +658,17 @@
 
   @override
   ImportDirective visitImportDirective(ImportDirective node) {
-    ImportDirectiveImpl directive = astFactory.importDirective(
-        cloneNode(node.documentationComment),
+    var directive = astFactory.importDirective(
+        cloneNullableNode(node.documentationComment),
         cloneNodeList(node.metadata),
         cloneToken(node.keyword),
         cloneNode(node.uri),
         cloneNodeList(node.configurations),
-        cloneToken(node.deferredKeyword),
-        cloneToken(node.asKeyword),
-        cloneNode(node.prefix),
+        cloneNullableToken(node.deferredKeyword),
+        cloneNullableToken(node.asKeyword),
+        cloneNullableNode(node.prefix),
         cloneNodeList(node.combinators),
-        cloneToken(node.semicolon));
+        cloneToken(node.semicolon)) as ImportDirectiveImpl;
     directive.selectedUriContent = node.selectedUriContent;
     directive.selectedSource = node.selectedSource;
     directive.uriSource = node.uriSource;
@@ -658,10 +678,10 @@
 
   @override
   IndexExpression visitIndexExpression(IndexExpression node) {
-    Token period = node.period;
+    var period = node.period;
     if (period == null) {
       return astFactory.indexExpressionForTarget2(
-          target: cloneNode(node.target),
+          target: cloneNode(node.target!),
           leftBracket: cloneToken(node.leftBracket),
           index: cloneNode(node.index),
           rightBracket: cloneToken(node.rightBracket));
@@ -677,7 +697,7 @@
   @override
   InstanceCreationExpression visitInstanceCreationExpression(
           InstanceCreationExpression node) =>
-      astFactory.instanceCreationExpression(cloneToken(node.keyword),
+      astFactory.instanceCreationExpression(cloneNullableToken(node.keyword),
           cloneNode(node.constructorName), cloneNode(node.argumentList));
 
   @override
@@ -688,7 +708,7 @@
   InterpolationExpression visitInterpolationExpression(
           InterpolationExpression node) =>
       astFactory.interpolationExpression(cloneToken(node.leftBracket),
-          cloneNode(node.expression), cloneToken(node.rightBracket));
+          cloneNode(node.expression), cloneNullableToken(node.rightBracket));
 
   @override
   InterpolationString visitInterpolationString(InterpolationString node) =>
@@ -698,7 +718,7 @@
   IsExpression visitIsExpression(IsExpression node) => astFactory.isExpression(
       cloneNode(node.expression),
       cloneToken(node.isOperator),
-      cloneToken(node.notOperator),
+      cloneNullableToken(node.notOperator),
       cloneNode(node.type));
 
   @override
@@ -712,7 +732,7 @@
   @override
   LibraryDirective visitLibraryDirective(LibraryDirective node) =>
       astFactory.libraryDirective(
-          cloneNode(node.documentationComment),
+          cloneNullableNode(node.documentationComment),
           cloneNodeList(node.metadata),
           cloneToken(node.libraryKeyword),
           cloneNode(node.name),
@@ -724,8 +744,8 @@
 
   @override
   ListLiteral visitListLiteral(ListLiteral node) => astFactory.listLiteral(
-      cloneToken(node.constKeyword),
-      cloneNode(node.typeArguments),
+      cloneNullableToken(node.constKeyword),
+      cloneNullableNode(node.typeArguments),
       cloneToken(node.leftBracket),
       cloneNodeList(node.elements),
       cloneToken(node.rightBracket));
@@ -738,37 +758,37 @@
   @override
   MethodDeclaration visitMethodDeclaration(MethodDeclaration node) =>
       astFactory.methodDeclaration(
-          cloneNode(node.documentationComment),
+          cloneNullableNode(node.documentationComment),
           cloneNodeList(node.metadata),
-          cloneToken(node.externalKeyword),
-          cloneToken(node.modifierKeyword),
-          cloneNode(node.returnType),
-          cloneToken(node.propertyKeyword),
-          cloneToken(node.operatorKeyword),
+          cloneNullableToken(node.externalKeyword),
+          cloneNullableToken(node.modifierKeyword),
+          cloneNullableNode(node.returnType),
+          cloneNullableToken(node.propertyKeyword),
+          cloneNullableToken(node.operatorKeyword),
           cloneNode(node.name),
-          cloneNode(node.typeParameters),
-          cloneNode(node.parameters),
+          cloneNullableNode(node.typeParameters),
+          cloneNullableNode(node.parameters),
           cloneNode(node.body));
 
   @override
   MethodInvocation visitMethodInvocation(MethodInvocation node) =>
       astFactory.methodInvocation(
-          cloneNode(node.target),
-          cloneToken(node.operator),
+          cloneNullableNode(node.target),
+          cloneNullableToken(node.operator),
           cloneNode(node.methodName),
-          cloneNode(node.typeArguments),
+          cloneNullableNode(node.typeArguments),
           cloneNode(node.argumentList));
 
   @override
   AstNode visitMixinDeclaration(MixinDeclaration node) =>
       astFactory.mixinDeclaration(
-          cloneNode(node.documentationComment),
+          cloneNullableNode(node.documentationComment),
           cloneNodeList(node.metadata),
           cloneToken(node.mixinKeyword),
           cloneNode(node.name),
-          cloneNode(node.typeParameters),
-          cloneNode(node.onClause),
-          cloneNode(node.implementsClause),
+          cloneNullableNode(node.typeParameters),
+          cloneNullableNode(node.onClause),
+          cloneNullableNode(node.implementsClause),
           cloneToken(node.leftBracket),
           cloneNodeList(node.members),
           cloneToken(node.rightBracket));
@@ -779,12 +799,12 @@
 
   @override
   AstNode visitNativeClause(NativeClause node) => astFactory.nativeClause(
-      cloneToken(node.nativeKeyword), cloneNode(node.name));
+      cloneToken(node.nativeKeyword), cloneNullableNode(node.name));
 
   @override
   NativeFunctionBody visitNativeFunctionBody(NativeFunctionBody node) =>
       astFactory.nativeFunctionBody(cloneToken(node.nativeKeyword),
-          cloneNode(node.stringLiteral), cloneToken(node.semicolon));
+          cloneNullableNode(node.stringLiteral), cloneToken(node.semicolon));
 
   @override
   NullLiteral visitNullLiteral(NullLiteral node) =>
@@ -803,7 +823,7 @@
   @override
   PartDirective visitPartDirective(PartDirective node) {
     PartDirective directive = astFactory.partDirective(
-        cloneNode(node.documentationComment),
+        cloneNullableNode(node.documentationComment),
         cloneNodeList(node.metadata),
         cloneToken(node.partKeyword),
         cloneNode(node.uri),
@@ -816,12 +836,12 @@
   @override
   PartOfDirective visitPartOfDirective(PartOfDirective node) =>
       astFactory.partOfDirective(
-          cloneNode(node.documentationComment),
+          cloneNullableNode(node.documentationComment),
           cloneNodeList(node.metadata),
           cloneToken(node.partKeyword),
           cloneToken(node.ofKeyword),
-          cloneNode(node.uri),
-          cloneNode(node.libraryName),
+          cloneNullableNode(node.uri),
+          cloneNullableNode(node.libraryName),
           cloneToken(node.semicolon));
 
   @override
@@ -839,7 +859,7 @@
 
   @override
   PropertyAccess visitPropertyAccess(PropertyAccess node) =>
-      astFactory.propertyAccess(cloneNode(node.target),
+      astFactory.propertyAccess(cloneNullableNode(node.target),
           cloneToken(node.operator), cloneNode(node.propertyName));
 
   @override
@@ -847,8 +867,8 @@
           RedirectingConstructorInvocation node) =>
       astFactory.redirectingConstructorInvocation(
           cloneToken(node.thisKeyword),
-          cloneToken(node.period),
-          cloneNode(node.constructorName),
+          cloneNullableToken(node.period),
+          cloneNullableNode(node.constructorName),
           cloneNode(node.argumentList));
 
   @override
@@ -858,7 +878,7 @@
   @override
   ReturnStatement visitReturnStatement(ReturnStatement node) =>
       astFactory.returnStatement(cloneToken(node.returnKeyword),
-          cloneNode(node.expression), cloneToken(node.semicolon));
+          cloneNullableNode(node.expression), cloneToken(node.semicolon));
 
   @override
   ScriptTag visitScriptTag(ScriptTag node) =>
@@ -867,8 +887,8 @@
   @override
   SetOrMapLiteral visitSetOrMapLiteral(SetOrMapLiteral node) {
     var result = astFactory.setOrMapLiteral(
-        constKeyword: cloneToken(node.constKeyword),
-        typeArguments: cloneNode(node.typeArguments),
+        constKeyword: cloneNullableToken(node.constKeyword),
+        typeArguments: cloneNullableNode(node.typeArguments),
         leftBracket: cloneToken(node.leftBracket),
         elements: cloneNodeList(node.elements),
         rightBracket: cloneToken(node.rightBracket));
@@ -888,12 +908,12 @@
   SimpleFormalParameter visitSimpleFormalParameter(
           SimpleFormalParameter node) =>
       astFactory.simpleFormalParameter2(
-          comment: cloneNode(node.documentationComment),
+          comment: cloneNullableNode(node.documentationComment),
           metadata: cloneNodeList(node.metadata),
-          covariantKeyword: cloneToken(node.covariantKeyword),
-          keyword: cloneToken(node.keyword),
-          type: cloneNode(node.type),
-          identifier: cloneNode(node.identifier));
+          covariantKeyword: cloneNullableToken(node.covariantKeyword),
+          keyword: cloneNullableToken(node.keyword),
+          type: cloneNullableNode(node.type),
+          identifier: cloneNullableNode(node.identifier));
 
   @override
   SimpleIdentifier visitSimpleIdentifier(SimpleIdentifier node) =>
@@ -919,8 +939,8 @@
           SuperConstructorInvocation node) =>
       astFactory.superConstructorInvocation(
           cloneToken(node.superKeyword),
-          cloneToken(node.period),
-          cloneNode(node.constructorName),
+          cloneNullableToken(node.period),
+          cloneNullableNode(node.constructorName),
           cloneNode(node.argumentList));
 
   @override
@@ -972,19 +992,19 @@
   TopLevelVariableDeclaration visitTopLevelVariableDeclaration(
           TopLevelVariableDeclaration node) =>
       astFactory.topLevelVariableDeclaration(
-          cloneNode(node.documentationComment),
+          cloneNullableNode(node.documentationComment),
           cloneNodeList(node.metadata),
           cloneNode(node.variables),
           cloneToken(node.semicolon),
-          externalKeyword: cloneToken(node.externalKeyword));
+          externalKeyword: cloneNullableToken(node.externalKeyword));
 
   @override
   TryStatement visitTryStatement(TryStatement node) => astFactory.tryStatement(
       cloneToken(node.tryKeyword),
       cloneNode(node.body),
       cloneNodeList(node.catchClauses),
-      cloneToken(node.finallyKeyword),
-      cloneNode(node.finallyBlock));
+      cloneNullableToken(node.finallyKeyword),
+      cloneNullableNode(node.finallyBlock));
 
   @override
   TypeArgumentList visitTypeArgumentList(TypeArgumentList node) =>
@@ -992,22 +1012,22 @@
           cloneNodeList(node.arguments), cloneToken(node.rightBracket));
 
   @override
-  TypeName visitTypeName(TypeName node) =>
-      astFactory.typeName(cloneNode(node.name), cloneNode(node.typeArguments),
-          question: cloneToken(node.question));
+  TypeName visitTypeName(TypeName node) => astFactory.typeName(
+      cloneNode(node.name), cloneNullableNode(node.typeArguments),
+      question: cloneNullableToken(node.question));
 
   @override
   TypeParameter visitTypeParameter(TypeParameter node) =>
       // TODO (kallentu) : Clean up TypeParameterImpl and AstFactoryImpl casting
       // once variance is added to the interface.
       (astFactory as AstFactoryImpl).typeParameter2(
-          comment: cloneNode(node.documentationComment),
+          comment: cloneNullableNode(node.documentationComment),
           metadata: cloneNodeList(node.metadata),
           name: cloneNode(node.name),
-          extendsKeyword: cloneToken(node.extendsKeyword),
-          bound: cloneNode(node.bound),
+          extendsKeyword: cloneNullableToken(node.extendsKeyword),
+          bound: cloneNullableNode(node.bound),
           varianceKeyword:
-              cloneToken((node as TypeParameterImpl).varianceKeyword));
+              cloneNullableToken((node as TypeParameterImpl).varianceKeyword));
 
   @override
   TypeParameterList visitTypeParameterList(TypeParameterList node) =>
@@ -1017,16 +1037,16 @@
   @override
   VariableDeclaration visitVariableDeclaration(VariableDeclaration node) =>
       astFactory.variableDeclaration(cloneNode(node.name),
-          cloneToken(node.equals), cloneNode(node.initializer));
+          cloneNullableToken(node.equals), cloneNullableNode(node.initializer));
 
   @override
   VariableDeclarationList visitVariableDeclarationList(
           VariableDeclarationList node) =>
       astFactory.variableDeclarationList(
-          cloneNode(node.documentationComment),
+          cloneNullableNode(node.documentationComment),
           cloneNodeList(node.metadata),
-          cloneToken(node.keyword),
-          cloneNode(node.type),
+          cloneNullableToken(node.keyword),
+          cloneNullableNode(node.type),
           cloneNodeList(node.variables));
 
   @override
@@ -1052,7 +1072,7 @@
   YieldStatement visitYieldStatement(YieldStatement node) =>
       astFactory.yieldStatement(
           cloneToken(node.yieldKeyword),
-          cloneToken(node.star),
+          cloneNullableToken(node.star),
           cloneNode(node.expression),
           cloneToken(node.semicolon));
 
@@ -1063,12 +1083,12 @@
   /// We cannot clone tokens as we visit nodes because not every token is a part
   /// of a node, E.g. commas in argument lists are not represented in AST. But
   /// we need to the sequence of tokens that is identical to the original one.
-  void _cloneTokens(Token token, int stopAfter) {
+  void _cloneTokens(Token? token, int stopAfter) {
     if (token == null) {
       return;
     }
     Token nonComment(Token token) {
-      return token is CommentToken ? token.parent : token;
+      return token is CommentToken ? token.parent! : token;
     }
 
     token = nonComment(token);
@@ -1076,16 +1096,16 @@
     while (token != null) {
       Token clone = token.copy();
       {
-        CommentToken c1 = token.precedingComments;
-        CommentToken c2 = clone.precedingComments;
+        CommentToken? c1 = token.precedingComments;
+        CommentToken? c2 = clone.precedingComments;
         while (c1 != null && c2 != null) {
           _clonedTokens[c1] = c2;
-          c1 = c1.next;
-          c2 = c2.next;
+          c1 = c1.next as CommentToken?;
+          c2 = c2.next as CommentToken?;
         }
       }
       _clonedTokens[token] = clone;
-      _lastCloned.setNext(clone);
+      _lastCloned!.setNext(clone);
       _lastCloned = clone;
       if (token.type == TokenType.EOF) {
         break;
@@ -1101,7 +1121,7 @@
 
   /// Return a clone of the given [node].
   static AstNode clone(AstNode node) {
-    return node.accept(AstCloner());
+    return node.accept(AstCloner())!;
   }
 }
 
@@ -1111,7 +1131,7 @@
   /// The AST node with which the node being visited is to be compared. This is
   /// only valid at the beginning of each visit method (until [isEqualNodes] is
   /// invoked).
-  AstNode _other;
+  AstNode? _other;
 
   /// Notify that [first] and second have different length.
   /// This implementation returns `false`. Subclasses can override and throw.
@@ -1122,18 +1142,18 @@
   /// Check whether the values of the [first] and [second] nodes are [equal].
   /// Subclasses can override to throw.
   bool failIfNotEqual(
-      AstNode first, Object firstValue, AstNode second, Object secondValue) {
+      AstNode first, Object? firstValue, AstNode second, Object? secondValue) {
     return firstValue == secondValue;
   }
 
   /// Check whether [second] is null. Subclasses can override to throw.
-  bool failIfNotNull(Object first, Object second) {
+  bool failIfNotNull(Object? first, Object? second) {
     return second == null;
   }
 
   /// Notify that [first] is not `null` while [second] one is `null`.
   /// This implementation returns `false`. Subclasses can override and throw.
-  bool failIsNull(Object first, Object second) {
+  bool failIsNull(Object first, Object? second) {
     return false;
   }
 
@@ -1148,7 +1168,7 @@
   ///
   /// *Note:* This method is only visible for testing purposes and should not be
   /// used by clients.
-  bool isEqualNodes(AstNode first, AstNode second) {
+  bool isEqualNodes(AstNode? first, AstNode? second) {
     if (first == null) {
       return failIfNotNull(first, second);
     } else if (second == null) {
@@ -1157,7 +1177,7 @@
       return failRuntimeType(first, second);
     }
     _other = second;
-    return first.accept(this);
+    return first.accept(this)!;
   }
 
   /// Return `true` if the [first] token and the [second] token have the same
@@ -1165,7 +1185,7 @@
   ///
   /// *Note:* This method is only visible for testing purposes and should not be
   /// used by clients.
-  bool isEqualTokens(Token first, Token second) {
+  bool isEqualTokens(Token? first, Token? second) {
     if (first == null) {
       return failIfNotNull(first, second);
     } else if (second == null) {
@@ -2304,7 +2324,7 @@
 
   /// Return `true` if the [first] and [second] lists of AST nodes have the same
   /// size and corresponding elements are equal.
-  bool _isEqualNodeLists(NodeList first, NodeList second) {
+  bool _isEqualNodeLists(NodeList? first, NodeList? second) {
     if (first == null) {
       return failIfNotNull(first, second);
     } else if (second == null) {
@@ -2382,14 +2402,10 @@
   /// visitors to visit the nodes of an AST structure.
   ExceptionHandlingDelegatingAstVisitor(
       Iterable<AstVisitor<T>> delegates, this.handler)
-      : super(delegates) {
-    if (handler == null) {
-      throw ArgumentError('A handler must be provided');
-    }
-  }
+      : super(delegates);
 
   @override
-  T visitNode(AstNode node) {
+  T? visitNode(AstNode node) {
     delegates.forEach((delegate) {
       try {
         node.accept(delegate);
@@ -2407,7 +2423,7 @@
       AstNode node, Object visitor, dynamic exception, StackTrace stackTrace) {
     StringBuffer buffer = StringBuffer();
     buffer.write('Exception while using a ${visitor.runtimeType} to visit a ');
-    AstNode currentNode = node;
+    AstNode? currentNode = node;
     bool first = true;
     while (currentNode != null) {
       if (first) {
@@ -2437,23 +2453,23 @@
 
   /// The element that was found that corresponds to the given source range, or
   /// `null` if there is no such element.
-  AstNode _foundNode;
+  AstNode? _foundNode;
 
   /// Initialize a newly created locator to locate an [AstNode] by locating the
   /// node within an AST structure that corresponds to the given range of
   /// characters (between the [startOffset] and [endOffset] in the source.
-  NodeLocator(int startOffset, [int endOffset])
+  NodeLocator(int startOffset, [int? endOffset])
       : _startOffset = startOffset,
         _endOffset = endOffset ?? startOffset;
 
   /// Return the node that was found that corresponds to the given source range
   /// or `null` if there is no such node.
-  AstNode get foundNode => _foundNode;
+  AstNode? get foundNode => _foundNode;
 
   /// Search within the given AST [node] for an identifier representing an
   /// element in the specified source range. Return the element that was found,
   /// or `null` if no element was found.
-  AstNode searchWithin(AstNode node) {
+  AstNode? searchWithin(AstNode? node) {
     if (node == null) {
       return null;
     }
@@ -2488,7 +2504,7 @@
       if (endToken.type == TokenType.EOF || endToken.length > 0) {
         break;
       }
-      endToken = endToken.previous;
+      endToken = endToken.previous!;
     }
     int end = endToken.end;
     int start = node.offset;
@@ -2528,20 +2544,20 @@
   final int _endOffset;
 
   /// The found node or `null` if there is no such node.
-  AstNode _foundNode;
+  AstNode? _foundNode;
 
   /// Initialize a newly created locator to locate the deepest [AstNode] for
   /// which `node.offset <= [startOffset]` and `[endOffset] < node.end`.
   ///
   /// If [endOffset] is not provided, then it is considered the same as the
   /// given [startOffset].
-  NodeLocator2(int startOffset, [int endOffset])
+  NodeLocator2(int startOffset, [int? endOffset])
       : _startOffset = startOffset,
         _endOffset = endOffset ?? startOffset;
 
   /// Search within the given AST [node] and return the node that was found,
   /// or `null` if no node was found.
-  AstNode searchWithin(AstNode node) {
+  AstNode? searchWithin(AstNode? node) {
     if (node == null) {
       return null;
     }
@@ -2577,7 +2593,7 @@
       if (endToken.type == TokenType.EOF || endToken.length > 0) {
         break;
       }
-      endToken = endToken.previous;
+      endToken = endToken.previous!;
     }
     int end = endToken.end;
     int start = node.offset;
@@ -3282,7 +3298,7 @@
   }
 
   @override
-  bool visitGenericFunctionType(GenericFunctionType node) {
+  bool? visitGenericFunctionType(GenericFunctionType node) {
     if (identical(node.returnType, _oldNode)) {
       node.returnType = _newNode as TypeAnnotation;
       return true;
@@ -3960,17 +3976,15 @@
   /// Throws an [ArgumentError] if either node is `null`, if the old node does
   /// not have a parent node, or if the AST structure has been corrupted.
   static bool replace(AstNode oldNode, AstNode newNode) {
-    if (oldNode == null || newNode == null) {
-      throw ArgumentError("The old and new nodes must be non-null");
-    } else if (identical(oldNode, newNode)) {
+    if (identical(oldNode, newNode)) {
       return true;
     }
-    AstNode parent = oldNode.parent;
+    var parent = oldNode.parent;
     if (parent == null) {
       throw ArgumentError("The old node is not a child of another node");
     }
     NodeReplacer replacer = NodeReplacer(oldNode, newNode);
-    return parent.accept(replacer);
+    return parent.accept(replacer)!;
   }
 }
 
@@ -3981,7 +3995,7 @@
   /// The AST node with which the node being visited is to be compared. This is
   /// only valid at the beginning of each visit method (until [isEqualNodes] is
   /// invoked).
-  AstNode _toNode;
+  AstNode? _toNode;
 
   @override
   bool visitAdjacentStrings(AdjacentStrings node) {
@@ -4255,7 +4269,7 @@
 
   @override
   bool visitConstructorDeclaration(ConstructorDeclaration node) {
-    ConstructorDeclarationImpl toNode = _toNode as ConstructorDeclaration;
+    var toNode = _toNode as ConstructorDeclarationImpl;
     if (_and(
         _isEqualNodes(node.documentationComment, toNode.documentationComment),
         _isEqualNodeLists(node.metadata, toNode.metadata),
@@ -4588,7 +4602,7 @@
 
   @override
   bool visitFunctionExpression(FunctionExpression node) {
-    FunctionExpressionImpl toNode = _toNode as FunctionExpression;
+    var toNode = _toNode as FunctionExpressionImpl;
     if (_and(_isEqualNodes(node.parameters, toNode.parameters),
         _isEqualNodes(node.body, toNode.body))) {
       toNode.declaredElement = node.declaredElement;
@@ -5417,7 +5431,7 @@
 
   /// Return `true` if the [first] and [second] lists of AST nodes have the same
   /// size and corresponding elements are equal.
-  bool _isEqualNodeLists(NodeList first, NodeList second) {
+  bool _isEqualNodeLists(NodeList? first, NodeList? second) {
     if (first == null) {
       return second == null;
     } else if (second == null) {
@@ -5439,14 +5453,14 @@
   /// Return `true` if the [fromNode] and [toNode] have the same structure. As a
   /// side-effect, if the nodes do have the same structure, any resolution data
   /// from the first node will be copied to the second node.
-  bool _isEqualNodes(AstNode fromNode, AstNode toNode) {
+  bool _isEqualNodes(AstNode? fromNode, AstNode? toNode) {
     if (fromNode == null) {
       return toNode == null;
     } else if (toNode == null) {
       return false;
     } else if (fromNode.runtimeType == toNode.runtimeType) {
       _toNode = toNode;
-      return fromNode.accept(this);
+      return fromNode.accept(this)!;
     }
     //
     // Check for a simple transformation caused by entering a period.
@@ -5455,13 +5469,13 @@
       SimpleIdentifier prefix = toNode.prefix;
       if (fromNode.runtimeType == prefix.runtimeType) {
         _toNode = prefix;
-        return fromNode.accept(this);
+        return fromNode.accept(this)!;
       }
     } else if (toNode is PropertyAccess) {
-      Expression target = toNode.target;
+      var target = toNode.target;
       if (fromNode.runtimeType == target.runtimeType) {
         _toNode = target;
-        return fromNode.accept(this);
+        return fromNode.accept(this)!;
       }
     }
     return false;
@@ -5483,7 +5497,7 @@
   }
 
   /// Return `true` if the [first] and [second] tokens have the same structure.
-  bool _isEqualTokens(Token first, Token second) {
+  bool _isEqualTokens(Token? first, Token? second) {
     if (first == null) {
       return second == null;
     } else if (second == null) {
@@ -5507,9 +5521,9 @@
 /// Completion test code coverage is 95%. The two basic blocks that are not
 /// executed cannot be executed. They are included for future reference.
 class ScopedNameFinder extends GeneralizingAstVisitor<void> {
-  Declaration _declarationNode;
+  Declaration? _declarationNode;
 
-  AstNode _immediateChild;
+  AstNode? _immediateChild;
 
   final Map<String, SimpleIdentifier> _locals =
       HashMap<String, SimpleIdentifier>();
@@ -5520,7 +5534,7 @@
 
   ScopedNameFinder(this._position);
 
-  Declaration get declaration => _declarationNode;
+  Declaration? get declaration => _declarationNode;
 
   Map<String, SimpleIdentifier> get locals => _locals;
 
@@ -5579,9 +5593,9 @@
 
   @override
   void visitFunctionExpression(FunctionExpression node) {
-    if (node.parameters != null &&
-        !identical(_immediateChild, node.parameters)) {
-      _addParameters(node.parameters.parameters);
+    var parameters = node.parameters;
+    if (parameters != null && !identical(_immediateChild, parameters)) {
+      _addParameters(parameters.parameters);
     }
     super.visitFunctionExpression(node);
   }
@@ -5589,19 +5603,16 @@
   @override
   void visitMethodDeclaration(MethodDeclaration node) {
     _declarationNode = node;
-    if (node.parameters != null &&
-        !identical(_immediateChild, node.parameters)) {
-      _addParameters(node.parameters.parameters);
+    var parameters = node.parameters;
+    if (parameters != null && !identical(_immediateChild, parameters)) {
+      _addParameters(parameters.parameters);
     }
   }
 
   @override
   void visitNode(AstNode node) {
     _immediateChild = node;
-    AstNode parent = node.parent;
-    if (parent != null) {
-      parent.accept(this);
-    }
+    node.parent?.accept(this);
   }
 
   @override
@@ -5626,7 +5637,7 @@
     }
   }
 
-  void _addToScope(SimpleIdentifier identifier) {
+  void _addToScope(SimpleIdentifier? identifier) {
     if (identifier != null && _isInRange(identifier)) {
       String name = identifier.name;
       if (!_locals.containsKey(name)) {
diff --git a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
index e517f1d..4f10340 100644
--- a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
+++ b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
@@ -43,7 +43,7 @@
   final InterfaceType _intType;
 
   /// The current library that is being analyzed.
-  final LibraryElement _currentLibrary;
+  final LibraryElementImpl _currentLibrary;
 
   final ConstantEvaluationEngine _evaluationEngine;
 
@@ -52,7 +52,7 @@
   /// Initialize a newly created constant verifier.
   ConstantVerifier(
     ErrorReporter errorReporter,
-    LibraryElement currentLibrary,
+    LibraryElementImpl currentLibrary,
     DeclaredVariables declaredVariables,
   ) : this._(
           errorReporter,
@@ -77,7 +77,7 @@
   void visitAnnotation(Annotation node) {
     super.visitAnnotation(node);
     // check annotation creation
-    Element element = node.element;
+    var element = node.element;
     if (element is ConstructorElement) {
       // should be 'const' constructor
       if (!element.isConst) {
@@ -86,7 +86,7 @@
         return;
       }
       // should have arguments
-      ArgumentList argumentList = node.arguments;
+      var argumentList = node.arguments;
       if (argumentList == null) {
         _errorReporter.reportErrorForNode(
             CompileTimeErrorCode.NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS, node);
@@ -102,7 +102,8 @@
     if (node.constKeyword != null) {
       _validateConstructorInitializers(node);
       if (node.factoryKeyword == null) {
-        _validateFieldInitializers(node.parent, node);
+        _validateFieldInitializers(
+            node.parent as ClassOrMixinDeclaration, node);
       }
     }
     _validateDefaultValues(node.parameters);
@@ -125,7 +126,7 @@
 
       // We need to evaluate the constant to see if any errors occur during its
       // evaluation.
-      ConstructorElement constructor = node.constructorName.staticElement;
+      var constructor = node.constructorName.staticElement;
       if (constructor != null) {
         ConstantVisitor constantVisitor =
             ConstantVisitor(_evaluationEngine, _currentLibrary, _errorReporter);
@@ -146,7 +147,7 @@
   void visitListLiteral(ListLiteral node) {
     super.visitListLiteral(node);
     if (node.isConst) {
-      InterfaceType nodeType = node.staticType;
+      var nodeType = node.staticType as InterfaceType;
       DartType elementType = nodeType.typeArguments[0];
       var verifier = _ConstLiteralVerifier(
         this,
@@ -171,7 +172,7 @@
     super.visitSetOrMapLiteral(node);
     if (node.isSet) {
       if (node.isConst) {
-        InterfaceType nodeType = node.staticType;
+        var nodeType = node.staticType as InterfaceType;
         var elementType = nodeType.typeArguments[0];
         var duplicateElements = <Expression, Expression>{};
         var verifier = _ConstLiteralVerifier(
@@ -185,16 +186,14 @@
         for (CollectionElement element in node.elements) {
           verifier.verify(element);
         }
-        for (var duplicateElement in duplicateElements.keys) {
+        for (var duplicateEntry in duplicateElements.entries) {
           _errorReporter.reportError(_diagnosticFactory.equalElementsInConstSet(
-              _errorReporter.source,
-              duplicateElement,
-              duplicateElements[duplicateElement]));
+              _errorReporter.source, duplicateEntry.key, duplicateEntry.value));
         }
       }
     } else if (node.isMap) {
       if (node.isConst) {
-        InterfaceType nodeType = node.staticType;
+        var nodeType = node.staticType as InterfaceType;
         var keyType = nodeType.typeArguments[0];
         var valueType = nodeType.typeArguments[1];
         bool reportEqualKeys = true;
@@ -212,11 +211,11 @@
           verifier.verify(entry);
         }
         if (reportEqualKeys) {
-          for (var duplicateKeyElement in duplicateKeyElements.keys) {
+          for (var duplicateEntry in duplicateKeyElements.entries) {
             _errorReporter.reportError(_diagnosticFactory.equalKeysInConstMap(
                 _errorReporter.source,
-                duplicateKeyElement,
-                duplicateKeyElements[duplicateKeyElement]));
+                duplicateEntry.key,
+                duplicateEntry.value));
           }
         }
       }
@@ -236,10 +235,10 @@
   @override
   void visitVariableDeclaration(VariableDeclaration node) {
     super.visitVariableDeclaration(node);
-    Expression initializer = node.initializer;
+    var initializer = node.initializer;
     if (initializer != null && (node.isConst || node.isFinal)) {
-      VariableElementImpl element = node.declaredElement as VariableElementImpl;
-      EvaluationResultImpl result = element.evaluationResult;
+      var element = node.declaredElement as VariableElementImpl;
+      var result = element.evaluationResult;
       if (result == null) {
         // Variables marked "const" should have had their values computed by
         // ConstantValueComputer.  Other variables will only have had their
@@ -271,16 +270,13 @@
     }
     TypeName typeName = type;
     Identifier name = typeName.name;
-    if (name == null) {
-      return;
-    }
     // should not be a type parameter
     if (name.staticElement is TypeParameterElement) {
       _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS, name);
     }
     // check type arguments
-    TypeArgumentList typeArguments = typeName.typeArguments;
+    var typeArguments = typeName.typeArguments;
     if (typeArguments != null) {
       for (TypeAnnotation argument in typeArguments.arguments) {
         _checkForConstWithTypeParameters(argument);
@@ -290,7 +286,7 @@
 
   /// @return `true` if given [Type] implements operator <i>==</i>, and it is
   ///         not <i>int</i> or <i>String</i>.
-  bool _implementsEqualsWhenNotAllowed(DartType type) {
+  bool _implementsEqualsWhenNotAllowed(DartType? type) {
     // ignore int or String
     if (type == null ||
         type.element == _intType.element ||
@@ -300,11 +296,10 @@
       return true;
     }
     // prepare ClassElement
-    Element element = type.element;
+    var element = type.element;
     if (element is ClassElement) {
       // lookup for ==
-      MethodElement method =
-          element.lookUpConcreteMethod("==", _currentLibrary);
+      var method = element.lookUpConcreteMethod("==", _currentLibrary);
       if (method == null ||
           (method.enclosingElement as ClassElement).isDartCoreObject) {
         return false;
@@ -338,7 +333,7 @@
   ///
   /// @param errors the errors that need to be reported
   /// @param errorCode the error code to be used
-  void _reportErrors(List<AnalysisError> errors, ErrorCode errorCode) {
+  void _reportErrors(List<AnalysisError> errors, ErrorCode? errorCode) {
     int length = errors.length;
     for (int i = 0; i < length; i++) {
       AnalysisError data = errors[i];
@@ -388,9 +383,6 @@
   /// Validates that all arguments in the [argumentList] are potentially
   /// constant expressions.
   void _reportNotPotentialConstantsArguments(ArgumentList argumentList) {
-    if (argumentList == null) {
-      return;
-    }
     for (Expression argument in argumentList.arguments) {
       _reportNotPotentialConstants(argument);
     }
@@ -410,14 +402,14 @@
   /// @param errorCode the error code to be used if the expression is not a
   ///        compile time constant
   /// @return the value of the compile time constant
-  DartObjectImpl _validate(Expression expression, ErrorCode errorCode) {
+  DartObjectImpl? _validate(Expression expression, ErrorCode errorCode) {
     RecordingErrorListener errorListener = RecordingErrorListener();
     ErrorReporter subErrorReporter = ErrorReporter(
       errorListener,
       _errorReporter.source,
       isNonNullableByDefault: _currentLibrary.isNonNullableByDefault,
     );
-    DartObjectImpl result = expression.accept(
+    var result = expression.accept(
         ConstantVisitor(_evaluationEngine, _currentLibrary, subErrorReporter));
     _reportErrors(errorListener.errors, errorCode);
     return result;
@@ -442,7 +434,7 @@
     for (ConstructorInitializer initializer in initializers) {
       if (initializer is AssertInitializer) {
         _reportNotPotentialConstants(initializer.condition);
-        Expression message = initializer.message;
+        var message = initializer.message;
         if (message != null) {
           _reportNotPotentialConstants(message);
         }
@@ -460,14 +452,14 @@
   /// the given list is a compile time constant.
   ///
   /// @param parameters the list of parameters to be validated
-  void _validateDefaultValues(FormalParameterList parameters) {
+  void _validateDefaultValues(FormalParameterList? parameters) {
     if (parameters == null) {
       return;
     }
     for (FormalParameter parameter in parameters.parameters) {
       if (parameter is DefaultFormalParameter) {
-        Expression defaultValue = parameter.defaultValue;
-        DartObjectImpl result;
+        var defaultValue = parameter.defaultValue;
+        DartObjectImpl? result;
         if (defaultValue == null) {
           result = DartObjectImpl(
             _typeSystem,
@@ -505,7 +497,7 @@
       if (member is FieldDeclaration && !member.isStatic) {
         for (VariableDeclaration variableDeclaration
             in member.fields.variables) {
-          Expression initializer = variableDeclaration.initializer;
+          var initializer = variableDeclaration.initializer;
           if (initializer != null) {
             // Ignore any errors produced during validation--if the constant
             // can't be evaluated we'll just report a single error.
@@ -516,13 +508,13 @@
               _errorReporter.source,
               isNonNullableByDefault: _currentLibrary.isNonNullableByDefault,
             );
-            DartObjectImpl result = initializer.accept(ConstantVisitor(
+            var result = initializer.accept(ConstantVisitor(
                 _evaluationEngine, _currentLibrary, subErrorReporter));
             if (result == null) {
               _errorReporter.reportErrorForToken(
                   CompileTimeErrorCode
                       .CONST_CONSTRUCTOR_WITH_FIELD_INITIALIZED_BY_NON_CONST,
-                  errorSite.constKeyword,
+                  errorSite.constKeyword!,
                   [variableDeclaration.name.name]);
             }
           }
@@ -536,12 +528,12 @@
     // compare all types with the most popular type rather than the first
     // type.
     bool foundError = false;
-    DartType firstType;
+    DartType? firstType;
     for (var switchMember in node.members) {
       if (switchMember is SwitchCase) {
         Expression expression = switchMember.expression;
 
-        DartObjectImpl expressionValue = _validate(
+        var expressionValue = _validate(
           expression,
           CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION,
         );
@@ -588,12 +580,12 @@
   }
 
   void _validateSwitchStatement_nullSafety(SwitchStatement node) {
-    var switchType = node.expression.staticType;
+    var switchType = node.expression.staticType!;
     for (var switchMember in node.members) {
       if (switchMember is SwitchCase) {
         Expression expression = switchMember.expression;
 
-        DartObjectImpl expressionValue = _validate(
+        var expressionValue = _validate(
           expression,
           CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION,
         );
@@ -632,15 +624,15 @@
 
 class _ConstLiteralVerifier {
   final ConstantVerifier verifier;
-  final Map<DartObject, Expression> mapUniqueKeys;
-  final Map<Expression, Expression> mapDuplicateKeyExpressions;
+  final Map<DartObject, Expression>? mapUniqueKeys;
+  final Map<Expression, Expression>? mapDuplicateKeyExpressions;
   final ErrorCode errorCode;
-  final DartType listElementType;
-  final DartType mapKeyType;
-  final DartType mapValueType;
-  final DartType setElementType;
-  final Map<DartObject, Expression> setUniqueValues;
-  final Map<Expression, Expression> setDuplicateExpressions;
+  final DartType? listElementType;
+  final DartType? mapKeyType;
+  final DartType? mapValueType;
+  final DartType? setElementType;
+  final Map<DartObject, Expression>? setUniqueValues;
+  final Map<Expression, Expression>? setDuplicateExpressions;
   final bool forList;
   final bool forMap;
   final bool forSet;
@@ -649,7 +641,7 @@
     this.verifier, {
     this.mapUniqueKeys,
     this.mapDuplicateKeyExpressions,
-    this.errorCode,
+    required this.errorCode,
     this.listElementType,
     this.mapKeyType,
     this.mapValueType,
@@ -661,7 +653,7 @@
     this.forSet = false,
   });
 
-  ErrorCode get _fromDeferredErrorCode {
+  ErrorCode? get _fromDeferredErrorCode {
     if (forList) {
       return CompileTimeErrorCode
           .NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY;
@@ -679,7 +671,7 @@
 
       if (_fromDeferredErrorCode != null) {
         verifier._reportErrorIfFromDeferredLibrary(
-            element, _fromDeferredErrorCode);
+            element, _fromDeferredErrorCode!);
       }
 
       if (forList) {
@@ -709,12 +701,12 @@
       if (conditionBool) {
         thenValid = verify(element.thenElement);
         if (element.elseElement != null) {
-          elseValid = _reportNotPotentialConstants(element.elseElement);
+          elseValid = _reportNotPotentialConstants(element.elseElement!);
         }
       } else {
         thenValid = _reportNotPotentialConstants(element.thenElement);
         if (element.elseElement != null) {
-          elseValid = verify(element.elseElement);
+          elseValid = verify(element.elseElement!);
         }
       }
 
@@ -757,7 +749,9 @@
         errorCode = CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT;
       } else if (forMap) {
         errorCode = CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT;
-        for (var parent = notConst; parent != null; parent = parent.parent) {
+        for (AstNode? parent = notConst;
+            parent != null;
+            parent = parent.parent) {
           if (parent is MapLiteralEntry) {
             if (parent.key == notConst) {
               errorCode = CompileTimeErrorCode.NON_CONSTANT_MAP_KEY;
@@ -769,6 +763,8 @@
         }
       } else if (forSet) {
         errorCode = CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT;
+      } else {
+        throw UnimplementedError();
       }
       verifier._errorReporter.reportErrorForNode(errorCode, notConst);
     }
@@ -777,7 +773,7 @@
   }
 
   bool _validateListExpression(Expression expression, DartObjectImpl value) {
-    if (!verifier._runtimeTypeMatch(value, listElementType)) {
+    if (!verifier._runtimeTypeMatch(value, listElementType!)) {
       verifier._errorReporter.reportErrorForNode(
         CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,
         expression,
@@ -822,13 +818,13 @@
     }
 
     if (forSet) {
-      var iterableValue = listValue ?? setValue;
+      var iterableValue = (listValue ?? setValue)!;
       for (var item in iterableValue) {
         Expression expression = element.expression;
-        if (setUniqueValues.containsKey(item)) {
-          setDuplicateExpressions[expression] = setUniqueValues[item];
+        if (setUniqueValues!.containsKey(item)) {
+          setDuplicateExpressions![expression] = setUniqueValues![item]!;
         } else {
-          setUniqueValues[item] = expression;
+          setUniqueValues![item] = expression;
         }
       }
     }
@@ -854,7 +850,7 @@
     if (keyValue != null) {
       var keyType = keyValue.type;
 
-      if (!verifier._runtimeTypeMatch(keyValue, mapKeyType)) {
+      if (!verifier._runtimeTypeMatch(keyValue, mapKeyType!)) {
         verifier._errorReporter.reportErrorForNode(
           CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE,
           keyExpression,
@@ -875,15 +871,15 @@
         CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY,
       );
 
-      if (mapUniqueKeys.containsKey(keyValue)) {
-        mapDuplicateKeyExpressions[keyExpression] = mapUniqueKeys[keyValue];
+      if (mapUniqueKeys!.containsKey(keyValue)) {
+        mapDuplicateKeyExpressions![keyExpression] = mapUniqueKeys![keyValue]!;
       } else {
-        mapUniqueKeys[keyValue] = keyExpression;
+        mapUniqueKeys![keyValue] = keyExpression;
       }
     }
 
     if (valueValue != null) {
-      if (!verifier._runtimeTypeMatch(valueValue, mapValueType)) {
+      if (!verifier._runtimeTypeMatch(valueValue, mapValueType!)) {
         verifier._errorReporter.reportErrorForNode(
           CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE,
           valueExpression,
@@ -904,21 +900,18 @@
     if (value.isNull && _isNullableSpread(element)) {
       return true;
     }
-    Map<DartObject, DartObject> map = value.toMapValue();
+    var map = value.toMapValue();
     if (map != null) {
       // TODO(brianwilkerson) Figure out how to improve the error messages. They
       //  currently point to the whole spread expression, but the key and/or
       //  value being referenced might not be located there (if it's referenced
       //  through a const variable).
-      for (var entry in map.entries) {
-        DartObjectImpl keyValue = entry.key;
-        if (keyValue != null) {
-          if (mapUniqueKeys.containsKey(keyValue)) {
-            mapDuplicateKeyExpressions[element.expression] =
-                mapUniqueKeys[keyValue];
-          } else {
-            mapUniqueKeys[keyValue] = element.expression;
-          }
+      for (var keyValue in map.keys) {
+        if (mapUniqueKeys!.containsKey(keyValue)) {
+          mapDuplicateKeyExpressions![element.expression] =
+              mapUniqueKeys![keyValue]!;
+        } else {
+          mapUniqueKeys![keyValue] = element.expression;
         }
       }
       return true;
@@ -931,7 +924,7 @@
   }
 
   bool _validateSetExpression(Expression expression, DartObjectImpl value) {
-    if (!verifier._runtimeTypeMatch(value, setElementType)) {
+    if (!verifier._runtimeTypeMatch(value, setElementType!)) {
       verifier._errorReporter.reportErrorForNode(
         CompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE,
         expression,
@@ -954,10 +947,10 @@
       CompileTimeErrorCode.SET_ELEMENT_FROM_DEFERRED_LIBRARY,
     );
 
-    if (setUniqueValues.containsKey(value)) {
-      setDuplicateExpressions[expression] = setUniqueValues[value];
+    if (setUniqueValues!.containsKey(value)) {
+      setDuplicateExpressions![expression] = setUniqueValues![value]!;
     } else {
-      setUniqueValues[value] = expression;
+      setUniqueValues![value] = expression;
     }
 
     return true;
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
index 329422d..672647e 100644
--- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart
+++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
@@ -81,7 +81,7 @@
   bool checkFromEnvironmentArguments(
       LibraryElementImpl library,
       List<Expression> arguments,
-      List<DartObjectImpl> argumentValues,
+      List<DartObjectImpl?> argumentValues,
       Map<String, DartObjectImpl> namedArgumentValues,
       InterfaceType expectedDefaultValueType) {
     int argumentCount = arguments.length;
@@ -91,7 +91,7 @@
     if (arguments[0] is NamedExpression) {
       return false;
     }
-    if (argumentValues[0].type != library.typeProvider.stringType) {
+    if (argumentValues[0]!.type != library.typeProvider.stringType) {
       return false;
     }
     if (argumentCount == 2) {
@@ -101,7 +101,7 @@
           return false;
         }
         ParameterizedType defaultValueType =
-            namedArgumentValues[_DEFAULT_VALUE_PARAM].type;
+            namedArgumentValues[_DEFAULT_VALUE_PARAM]!.type;
         if (!(defaultValueType == expectedDefaultValueType ||
             defaultValueType == library.typeProvider.nullType)) {
           return false;
@@ -120,8 +120,8 @@
   /// `false` if there is an error.
   bool checkSymbolArguments(
       LibraryElementImpl library,
-      NodeList<Expression> arguments,
-      List<DartObjectImpl> argumentValues,
+      List<Expression> arguments,
+      List<DartObjectImpl?> argumentValues,
       Map<String, DartObjectImpl> namedArgumentValues) {
     if (arguments.length != 1) {
       return false;
@@ -129,11 +129,11 @@
     if (arguments[0] is NamedExpression) {
       return false;
     }
-    if (argumentValues[0].type != library.typeProvider.stringType) {
+    if (argumentValues[0]!.type != library.typeProvider.stringType) {
       return false;
     }
-    String name = argumentValues[0].toStringValue();
-    return isValidPublicSymbol(name);
+    var name = argumentValues[0]?.toStringValue();
+    return name != null && isValidPublicSymbol(name);
   }
 
   /// Compute the constant value associated with the given [constant].
@@ -143,18 +143,18 @@
       constant = element.declaration as ConstantEvaluationTarget;
     }
 
-    var library = constant.library;
+    var library = constant.library as LibraryElementImpl;
     if (constant is ParameterElementImpl) {
       if (constant.isOptional) {
-        Expression defaultValue = constant.constantInitializer;
+        var defaultValue = constant.constantInitializer;
         if (defaultValue != null) {
           RecordingErrorListener errorListener = RecordingErrorListener();
           ErrorReporter errorReporter = ErrorReporter(
             errorListener,
-            constant.source,
+            constant.source!,
             isNonNullableByDefault: library.isNonNullableByDefault,
           );
-          DartObjectImpl dartObject = defaultValue
+          var dartObject = defaultValue
               .accept(ConstantVisitor(this, library, errorReporter));
           constant.evaluationResult =
               EvaluationResultImpl(dartObject, errorListener.errors);
@@ -165,15 +165,15 @@
         }
       }
     } else if (constant is VariableElementImpl) {
-      Expression constantInitializer = constant.constantInitializer;
+      var constantInitializer = constant.constantInitializer;
       if (constantInitializer != null) {
         RecordingErrorListener errorListener = RecordingErrorListener();
         ErrorReporter errorReporter = ErrorReporter(
           errorListener,
-          constant.source,
+          constant.source!,
           isNonNullableByDefault: library.isNonNullableByDefault,
         );
-        DartObjectImpl dartObject = constantInitializer
+        var dartObject = constantInitializer
             .accept(ConstantVisitor(this, library, errorReporter));
         // Only check the type for truly const declarations (don't check final
         // fields with initializers, since their types may be generic.  The type
@@ -202,8 +202,8 @@
         constant.isConstantEvaluated = true;
       }
     } else if (constant is ElementAnnotationImpl) {
-      Annotation constNode = constant.annotationAst;
-      Element element = constant.element;
+      var constNode = constant.annotationAst;
+      var element = constant.element;
       if (element is PropertyAccessorElement &&
           element.variable is VariableElement) {
         // The annotation is a reference to a compile-time constant variable.
@@ -229,10 +229,10 @@
         );
         ConstantVisitor constantVisitor =
             ConstantVisitor(this, library, errorReporter);
-        DartObjectImpl result = evaluateConstructorCall(
+        var result = evaluateConstructorCall(
             library,
             constNode,
-            constNode.arguments.arguments,
+            constNode.arguments!.arguments,
             element,
             constantVisitor,
             errorReporter);
@@ -267,21 +267,19 @@
       ConstantEvaluationTarget constant, ReferenceFinderCallback callback) {
     ReferenceFinder referenceFinder = ReferenceFinder(callback);
     if (constant is ConstructorElement) {
-      constant = (constant as ConstructorElement).declaration;
+      constant = constant.declaration;
     }
     if (constant is VariableElement) {
       var declaration = constant.declaration as VariableElementImpl;
-      Expression initializer = declaration.constantInitializer;
+      var initializer = declaration.constantInitializer;
       if (initializer != null) {
         initializer.accept(referenceFinder);
       }
     } else if (constant is ConstructorElementImpl) {
       if (constant.isConst) {
-        ConstructorElement redirectedConstructor =
-            getConstRedirectedConstructor(constant);
+        var redirectedConstructor = getConstRedirectedConstructor(constant);
         if (redirectedConstructor != null) {
-          ConstructorElement redirectedConstructorBase =
-              redirectedConstructor?.declaration;
+          var redirectedConstructorBase = redirectedConstructor.declaration;
           callback(redirectedConstructorBase);
           return;
         } else if (constant.isFactory) {
@@ -296,23 +294,20 @@
           return;
         }
         bool defaultSuperInvocationNeeded = true;
-        List<ConstructorInitializer> initializers =
-            constant.constantInitializers;
-        if (initializers != null) {
-          for (ConstructorInitializer initializer in initializers) {
-            if (initializer is SuperConstructorInvocation ||
-                initializer is RedirectingConstructorInvocation) {
-              defaultSuperInvocationNeeded = false;
-            }
-            initializer.accept(referenceFinder);
+        var initializers = constant.constantInitializers;
+        for (ConstructorInitializer initializer in initializers) {
+          if (initializer is SuperConstructorInvocation ||
+              initializer is RedirectingConstructorInvocation) {
+            defaultSuperInvocationNeeded = false;
           }
+          initializer.accept(referenceFinder);
         }
         if (defaultSuperInvocationNeeded) {
           // No explicit superconstructor invocation found, so we need to
           // manually insert a reference to the implicit superconstructor.
-          InterfaceType superclass = constant.returnType.superclass;
+          var superclass = constant.returnType.superclass;
           if (superclass != null && !superclass.isDartCoreObject) {
-            ConstructorElement unnamedConstructor =
+            var unnamedConstructor =
                 superclass.element.unnamedConstructor?.declaration;
             if (unnamedConstructor != null) {
               callback(unnamedConstructor);
@@ -334,7 +329,7 @@
       }
     } else if (constant is ElementAnnotationImpl) {
       Annotation constNode = constant.annotationAst;
-      Element element = constant.element;
+      var element = constant.element;
       if (element is PropertyAccessorElement &&
           element.variable is VariableElement) {
         // The annotation is a reference to a compile-time constant variable,
@@ -348,15 +343,8 @@
         // This could happen in the event of invalid code.  The error will be
         // reported at constant evaluation time.
       }
-      if (constNode == null) {
-        // We cannot determine what element the annotation is on, nor the offset
-        // of the annotation, so there's not a lot of information in this
-        // message, but it's better than getting an exception.
-        // https://github.com/dart-lang/sdk/issues/26811
-        AnalysisEngine.instance.instrumentationService.logInfo(
-            'No annotationAst for $constant in ${constant.compilationUnit}');
-      } else if (constNode.arguments != null) {
-        constNode.arguments.accept(referenceFinder);
+      if (constNode.arguments != null) {
+        constNode.arguments!.accept(referenceFinder);
       }
     } else if (constant is VariableElement) {
       // constant is a VariableElement but not a VariableElementImpl.  This can
@@ -373,18 +361,18 @@
     }
   }
 
-  DartObjectImpl evaluateConstructorCall(
+  DartObjectImpl? evaluateConstructorCall(
       LibraryElementImpl library,
       AstNode node,
       List<Expression> arguments,
       ConstructorElement constructor,
       ConstantVisitor constantVisitor,
       ErrorReporter errorReporter,
-      {ConstructorInvocation invocation}) {
+      {ConstructorInvocation? invocation}) {
     if (!constructor.isConst) {
       if (node is InstanceCreationExpression && node.keyword != null) {
         errorReporter.reportErrorForToken(
-            CompileTimeErrorCode.CONST_WITH_NON_CONST, node.keyword);
+            CompileTimeErrorCode.CONST_WITH_NON_CONST, node.keyword!);
       } else {
         errorReporter.reportErrorForNode(
             CompileTimeErrorCode.CONST_WITH_NON_CONST, node);
@@ -405,9 +393,9 @@
     }
 
     int argumentCount = arguments.length;
-    var argumentValues = List<DartObjectImpl>.filled(argumentCount, null);
-    Map<String, NamedExpression> namedNodes;
-    Map<String, DartObjectImpl> namedValues;
+    var argumentValues = List<DartObjectImpl?>.filled(argumentCount, null);
+    Map<String, NamedExpression>? namedNodes;
+    Map<String, DartObjectImpl>? namedValues;
     for (int i = 0; i < argumentCount; i++) {
       Expression argument = arguments[i];
       if (argument is NamedExpression) {
@@ -444,8 +432,8 @@
               CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, node);
           return null;
         }
-        String variableName =
-            argumentCount < 1 ? null : argumentValues[0].toStringValue();
+        String? variableName =
+            argumentCount < 1 ? null : argumentValues[0]?.toStringValue();
         if (definingClass == library.typeProvider.boolElement) {
           return FromEnvironmentEvaluator(
             library.typeSystem,
@@ -464,7 +452,8 @@
         }
       } else if (constructor.name == 'hasEnvironment' &&
           definingClass == library.typeProvider.boolElement) {
-        var name = argumentCount < 1 ? null : argumentValues[0].toStringValue();
+        var name =
+            argumentCount < 1 ? null : argumentValues[0]?.toStringValue();
         return FromEnvironmentEvaluator(
           library.typeSystem,
           _declaredVariables,
@@ -478,7 +467,7 @@
               CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, node);
           return null;
         }
-        String argumentValue = argumentValues[0].toStringValue();
+        var argumentValue = argumentValues[0]?.toStringValue();
         return DartObjectImpl(
           library.typeSystem,
           definingType,
@@ -497,19 +486,7 @@
       );
     }
     var constructorBase = constructor.declaration as ConstructorElementImpl;
-    List<ConstructorInitializer> initializers =
-        constructorBase.constantInitializers;
-    if (initializers == null) {
-      // This can happen in some cases where there are compile errors in the
-      // code being analyzed (for example if the code is trying to create a
-      // const instance using a non-const constructor, or the node we're
-      // visiting is involved in a cycle).  The error has already been reported,
-      // so consider it an unknown value to suppress further errors.
-      return DartObjectImpl.validWithUnknownValue(
-        library.typeSystem,
-        definingType,
-      );
-    }
+    var initializers = constructorBase.constantInitializers;
 
     var fieldMap = HashMap<String, DartObjectImpl>();
 
@@ -532,7 +509,7 @@
       if ((field.isFinal || field.isConst) &&
           !field.isStatic &&
           field is ConstFieldElementImpl) {
-        DartObjectImpl fieldValue = field.evaluationResult?.value;
+        var fieldValue = field.evaluationResult?.value;
 
         // It is possible that the evaluation result is null.
         // This happens for example when we have duplicate fields.
@@ -543,8 +520,7 @@
         // Match the value and the type.
         DartType fieldType =
             FieldMember.from(field, constructor.returnType).type;
-        if (fieldValue != null &&
-            !runtimeTypeMatch(library, fieldValue, fieldType)) {
+        if (!runtimeTypeMatch(library, fieldValue, fieldType)) {
           errorReporter.reportErrorForNode(
               CompileTimeErrorCode.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH,
               node,
@@ -562,8 +538,8 @@
     for (int i = 0; i < parameterCount; i++) {
       ParameterElement parameter = parameters[i];
       ParameterElement baseParameter = parameter.declaration;
-      DartObjectImpl argumentValue;
-      AstNode errorTarget;
+      DartObjectImpl? argumentValue;
+      AstNode? errorTarget;
       if (baseParameter.isNamed) {
         argumentValue = namedValues[baseParameter.name];
         errorTarget = namedNodes[baseParameter.name];
@@ -578,7 +554,7 @@
       if (argumentValue == null && baseParameter is ParameterElementImpl) {
         // The parameter is an optional positional parameter for which no value
         // was provided, so use the default value.
-        EvaluationResultImpl evaluationResult = baseParameter.evaluationResult;
+        var evaluationResult = baseParameter.evaluationResult;
         if (evaluationResult == null) {
           // No default was provided, so the default value is null.
           argumentValue = _nullObject(library);
@@ -594,7 +570,7 @@
               [argumentValue.type, parameter.type]);
         }
         if (baseParameter.isInitializingFormal) {
-          FieldElement field = (parameter as FieldFormalParameterElement).field;
+          var field = (parameter as FieldFormalParameterElement).field;
           if (field != null) {
             DartType fieldType = field.type;
             if (fieldType != parameter.type) {
@@ -622,19 +598,18 @@
     }
     ConstantVisitor initializerVisitor = ConstantVisitor(
       this,
-      constructor.library,
+      constructor.library as LibraryElementImpl,
       externalErrorReporter,
       lexicalEnvironment: parameterMap,
       substitution: Substitution.fromInterfaceType(definingType),
     );
-    String superName;
-    NodeList<Expression> superArguments;
+    String? superName;
+    NodeList<Expression>? superArguments;
     for (var i = 0; i < initializers.length; i++) {
       var initializer = initializers[i];
       if (initializer is ConstructorFieldInitializer) {
         Expression initializerExpression = initializer.expression;
-        DartObjectImpl evaluationResult =
-            initializerExpression?.accept(initializerVisitor);
+        var evaluationResult = initializerExpression.accept(initializerVisitor);
         if (evaluationResult != null) {
           String fieldName = initializer.fieldName.name;
           if (fieldMap.containsKey(fieldName)) {
@@ -642,7 +617,7 @@
                 CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, node);
           }
           fieldMap[fieldName] = evaluationResult;
-          PropertyAccessorElement getter = definingType.getGetter(fieldName);
+          var getter = definingType.getGetter(fieldName);
           if (getter != null) {
             PropertyInducingElement field = getter.variable;
             if (!runtimeTypeMatch(library, evaluationResult, field.type)) {
@@ -657,7 +632,7 @@
               CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, node);
         }
       } else if (initializer is SuperConstructorInvocation) {
-        SimpleIdentifier name = initializer.constructorName;
+        var name = initializer.constructorName;
         if (name != null) {
           superName = name.name;
         }
@@ -665,12 +640,12 @@
       } else if (initializer is RedirectingConstructorInvocation) {
         // This is a redirecting constructor, so just evaluate the constructor
         // it redirects to.
-        ConstructorElement constructor = initializer.staticElement;
+        var constructor = initializer.staticElement;
         if (constructor != null && constructor.isConst) {
           // Instantiate the constructor with the in-scope type arguments.
           constructor = ConstructorMember.from(constructor, definingType);
 
-          DartObjectImpl result = evaluateConstructorCall(
+          var result = evaluateConstructorCall(
               library,
               node,
               initializer.argumentList.arguments,
@@ -685,12 +660,8 @@
           return result;
         }
       } else if (initializer is AssertInitializer) {
-        Expression condition = initializer.condition;
-        if (condition == null) {
-          errorReporter.reportErrorForNode(
-              CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, node);
-        }
-        DartObjectImpl evaluationResult = condition.accept(initializerVisitor);
+        var condition = initializer.condition;
+        var evaluationResult = condition.accept(initializerVisitor);
         if (evaluationResult == null ||
             !evaluationResult.isBool ||
             evaluationResult.toBoolValue() == false) {
@@ -701,15 +672,16 @@
       }
     }
     // Evaluate explicit or implicit call to super().
-    InterfaceType superclass = definingType.superclass;
+    var superclass = definingType.superclass;
     if (superclass != null && !superclass.isDartCoreObject) {
-      ConstructorElement superConstructor =
+      var superConstructor =
           superclass.lookUpConstructor(superName, constructor.library);
       if (superConstructor != null) {
-        superArguments ??= astFactory.nodeList<Expression>(null);
+        superArguments ??= astFactory.nodeList<Expression>(node);
 
         if (constructor is ConstructorMember && constructor.isLegacy) {
-          superConstructor = Member.legacy(superConstructor);
+          superConstructor =
+              Member.legacy(superConstructor) as ConstructorElement;
         }
 
         evaluateSuperConstructorCall(library, node, fieldMap, superConstructor,
@@ -731,12 +703,12 @@
       LibraryElementImpl library,
       AstNode node,
       Map<String, DartObjectImpl> fieldMap,
-      ConstructorElement superConstructor,
+      ConstructorElement? superConstructor,
       List<Expression> superArguments,
       ConstantVisitor initializerVisitor,
       ErrorReporter errorReporter) {
     if (superConstructor != null && superConstructor.isConst) {
-      DartObjectImpl evaluationResult = evaluateConstructorCall(library, node,
+      var evaluationResult = evaluateConstructorCall(library, node,
           superArguments, superConstructor, initializerVisitor, errorReporter);
       if (evaluationResult != null) {
         fieldMap[GenericState.SUPERCLASS_FIELD] = evaluationResult;
@@ -752,18 +724,15 @@
   /// possible and then a const factory constructor will be returned.
   ConstructorElement followConstantRedirectionChain(
       ConstructorElement constructor) {
-    HashSet<ConstructorElement> constructorsVisited =
-        HashSet<ConstructorElement>();
+    var constructorsVisited = <ConstructorElement>{};
     while (true) {
-      ConstructorElement redirectedConstructor =
-          getConstRedirectedConstructor(constructor);
+      var redirectedConstructor = getConstRedirectedConstructor(constructor);
       if (redirectedConstructor == null) {
         break;
       } else {
-        ConstructorElement constructorBase = constructor?.declaration;
+        var constructorBase = constructor.declaration;
         constructorsVisited.add(constructorBase);
-        ConstructorElement redirectedConstructorBase =
-            redirectedConstructor?.declaration;
+        var redirectedConstructorBase = redirectedConstructor.declaration;
         if (constructorsVisited.contains(redirectedConstructorBase)) {
           // Cycle in redirecting factory constructors--this is not allowed
           // and is checked elsewhere--see
@@ -788,8 +757,8 @@
       RecordingErrorListener errorListener = RecordingErrorListener();
       ErrorReporter errorReporter = ErrorReporter(
         errorListener,
-        constant.source,
-        isNonNullableByDefault: constant.library.isNonNullableByDefault,
+        constant.source!,
+        isNonNullableByDefault: constant.library!.isNonNullableByDefault,
       );
       // TODO(paulberry): It would be really nice if we could extract enough
       // information from the 'cycle' argument to provide the user with a
@@ -813,7 +782,7 @@
 
   /// If [constructor] redirects to another const constructor, return the
   /// const constructor it redirects to.  Otherwise return `null`.
-  ConstructorElement getConstRedirectedConstructor(
+  ConstructorElement? getConstRedirectedConstructor(
       ConstructorElement constructor) {
     if (!constructor.isFactory) {
       return null;
@@ -827,8 +796,7 @@
       // let [evaluateInstanceCreationExpression] handle it specially.
       return null;
     }
-    ConstructorElement redirectedConstructor =
-        constructor.redirectedConstructor;
+    var redirectedConstructor = constructor.redirectedConstructor;
     if (redirectedConstructor == null) {
       // This can happen if constructor is an external factory constructor.
       return null;
@@ -881,7 +849,7 @@
   bool get isConstantEvaluated;
 
   /// The library with this constant.
-  LibraryElement get library;
+  LibraryElement? get library;
 }
 
 /// Interface used by unit tests to verify correct dependency analysis during
@@ -941,17 +909,17 @@
   final ConstantEvaluationEngine evaluationEngine;
 
   /// The library that contains the constant expression being evaluated.
-  final LibraryElement _library;
+  final LibraryElementImpl _library;
 
-  final Map<String, DartObjectImpl> _lexicalEnvironment;
-  final Substitution _substitution;
+  final Map<String, DartObjectImpl>? _lexicalEnvironment;
+  final Substitution? _substitution;
 
   /// Error reporter that we use to report errors accumulated while computing
   /// the constant.
   final ErrorReporter _errorReporter;
 
   /// Helper class used to compute constant values.
-  DartObjectComputer _dartObjectComputer;
+  late final DartObjectComputer _dartObjectComputer;
 
   /// Initialize a newly created constant visitor. The [evaluationEngine] is
   /// used to evaluate instance creation expressions. The [lexicalEnvironment]
@@ -965,8 +933,8 @@
     this.evaluationEngine,
     this._library,
     this._errorReporter, {
-    Map<String, DartObjectImpl> lexicalEnvironment,
-    Substitution substitution,
+    Map<String, DartObjectImpl>? lexicalEnvironment,
+    Substitution? substitution,
   })  : _lexicalEnvironment = lexicalEnvironment,
         _substitution = substitution {
     _dartObjectComputer = DartObjectComputer(
@@ -985,8 +953,8 @@
   TypeProvider get _typeProvider => _library.typeProvider;
 
   @override
-  DartObjectImpl visitAdjacentStrings(AdjacentStrings node) {
-    DartObjectImpl result;
+  DartObjectImpl? visitAdjacentStrings(AdjacentStrings node) {
+    DartObjectImpl? result;
     for (StringLiteral string in node.strings) {
       if (result == null) {
         result = string.accept(this);
@@ -999,16 +967,16 @@
   }
 
   @override
-  DartObjectImpl visitAsExpression(AsExpression node) {
-    DartObjectImpl expressionResult = node.expression.accept(this);
-    DartObjectImpl typeResult = node.type.accept(this);
+  DartObjectImpl? visitAsExpression(AsExpression node) {
+    var expressionResult = node.expression.accept(this);
+    var typeResult = node.type.accept(this);
     return _dartObjectComputer.castToType(node, expressionResult, typeResult);
   }
 
   @override
-  DartObjectImpl visitBinaryExpression(BinaryExpression node) {
+  DartObjectImpl? visitBinaryExpression(BinaryExpression node) {
     TokenType operatorType = node.operator.type;
-    DartObjectImpl leftResult = node.leftOperand.accept(this);
+    var leftResult = node.leftOperand.accept(this);
     // evaluate lazy operators
     if (operatorType == TokenType.AMPERSAND_AMPERSAND) {
       return _dartObjectComputer.lazyAnd(
@@ -1021,7 +989,7 @@
           node, leftResult, () => node.rightOperand.accept(this));
     }
     // evaluate eager operators
-    DartObjectImpl rightResult = node.rightOperand.accept(this);
+    var rightResult = node.rightOperand.accept(this);
     if (operatorType == TokenType.AMPERSAND) {
       return _dartObjectComputer.eagerAnd(node, leftResult, rightResult);
     } else if (operatorType == TokenType.BANG_EQ) {
@@ -1077,9 +1045,9 @@
   }
 
   @override
-  DartObjectImpl visitConditionalExpression(ConditionalExpression node) {
-    Expression condition = node.condition;
-    DartObjectImpl conditionResult = condition.accept(this);
+  DartObjectImpl? visitConditionalExpression(ConditionalExpression node) {
+    var condition = node.condition;
+    var conditionResult = condition.accept(this);
 
     if (conditionResult == null) {
       return conditionResult;
@@ -1118,14 +1086,14 @@
   }
 
   @override
-  DartObjectImpl visitInstanceCreationExpression(
+  DartObjectImpl? visitInstanceCreationExpression(
       InstanceCreationExpression node) {
     if (!node.isConst) {
       // TODO(brianwilkerson) Figure out which error to report.
       _error(node, null);
       return null;
     }
-    ConstructorElement constructor = node.constructorName.staticElement;
+    var constructor = node.constructorName.staticElement;
     if (constructor == null) {
       // Couldn't resolve the constructor so we can't compute a value.  No
       // problem - the error has already been reported.
@@ -1153,8 +1121,8 @@
   }
 
   @override
-  DartObjectImpl visitInterpolationExpression(InterpolationExpression node) {
-    DartObjectImpl result = node.expression.accept(this);
+  DartObjectImpl? visitInterpolationExpression(InterpolationExpression node) {
+    var result = node.expression.accept(this);
     if (result != null && !result.isBoolNumStringOrNull) {
       _error(node, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING);
       return null;
@@ -1172,14 +1140,14 @@
   }
 
   @override
-  DartObjectImpl visitIsExpression(IsExpression node) {
-    DartObjectImpl expressionResult = node.expression.accept(this);
-    DartObjectImpl typeResult = node.type.accept(this);
+  DartObjectImpl? visitIsExpression(IsExpression node) {
+    var expressionResult = node.expression.accept(this);
+    var typeResult = node.type.accept(this);
     return _dartObjectComputer.typeTest(node, expressionResult, typeResult);
   }
 
   @override
-  DartObjectImpl visitListLiteral(ListLiteral node) {
+  DartObjectImpl? visitListLiteral(ListLiteral node) {
     if (!node.isConst) {
       _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.MISSING_CONST_IN_LIST_LITERAL, node);
@@ -1193,7 +1161,7 @@
     if (errorOccurred) {
       return null;
     }
-    DartType nodeType = node.staticType;
+    var nodeType = node.staticType;
     DartType elementType =
         nodeType is InterfaceType && nodeType.typeArguments.isNotEmpty
             ? nodeType.typeArguments[0]
@@ -1203,18 +1171,18 @@
   }
 
   @override
-  DartObjectImpl visitMethodInvocation(MethodInvocation node) {
-    Element element = node.methodName.staticElement;
+  DartObjectImpl? visitMethodInvocation(MethodInvocation node) {
+    var element = node.methodName.staticElement;
     if (element is FunctionElement) {
       if (element.name == "identical") {
         NodeList<Expression> arguments = node.argumentList.arguments;
         if (arguments.length == 2) {
-          Element enclosingElement = element.enclosingElement;
+          var enclosingElement = element.enclosingElement;
           if (enclosingElement is CompilationUnitElement) {
             LibraryElement library = enclosingElement.library;
             if (library.isDartCore) {
-              DartObjectImpl leftArgument = arguments[0].accept(this);
-              DartObjectImpl rightArgument = arguments[1].accept(this);
+              var leftArgument = arguments[0].accept(this);
+              var rightArgument = arguments[1].accept(this);
               return _dartObjectComputer.isIdentical(
                   node, leftArgument, rightArgument);
             }
@@ -1228,11 +1196,11 @@
   }
 
   @override
-  DartObjectImpl visitNamedExpression(NamedExpression node) =>
+  DartObjectImpl? visitNamedExpression(NamedExpression node) =>
       node.expression.accept(this);
 
   @override
-  DartObjectImpl visitNode(AstNode node) {
+  DartObjectImpl? visitNode(AstNode node) {
     // TODO(brianwilkerson) Figure out which error to report.
     _error(node, null);
     return null;
@@ -1244,25 +1212,26 @@
   }
 
   @override
-  DartObjectImpl visitParenthesizedExpression(ParenthesizedExpression node) =>
+  DartObjectImpl? visitParenthesizedExpression(ParenthesizedExpression node) =>
       node.expression.accept(this);
 
   @override
-  DartObjectImpl visitPrefixedIdentifier(PrefixedIdentifier node) {
+  DartObjectImpl? visitPrefixedIdentifier(PrefixedIdentifier node) {
     SimpleIdentifier prefixNode = node.prefix;
-    Element prefixElement = prefixNode.staticElement;
+    var prefixElement = prefixNode.staticElement;
     // String.length
     if (prefixElement is! PrefixElement &&
         prefixElement is! ClassElement &&
         prefixElement is! ExtensionElement) {
-      DartObjectImpl prefixResult = prefixNode.accept(this);
-      if (_isStringLength(prefixResult, node.identifier)) {
+      var prefixResult = prefixNode.accept(this);
+      if (prefixResult != null &&
+          _isStringLength(prefixResult, node.identifier)) {
         return prefixResult.stringLength(typeSystem);
       }
     }
     // importPrefix.CONST
     if (prefixElement is! PrefixElement && prefixElement is! ExtensionElement) {
-      DartObjectImpl prefixResult = prefixNode.accept(this);
+      var prefixResult = prefixNode.accept(this);
       if (prefixResult == null) {
         // The error has already been reported.
         return null;
@@ -1273,8 +1242,8 @@
   }
 
   @override
-  DartObjectImpl visitPrefixExpression(PrefixExpression node) {
-    DartObjectImpl operand = node.operand.accept(this);
+  DartObjectImpl? visitPrefixExpression(PrefixExpression node) {
+    var operand = node.operand.accept(this);
     if (operand != null && operand.isNull) {
       _error(node, CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
       return null;
@@ -1293,10 +1262,12 @@
   }
 
   @override
-  DartObjectImpl visitPropertyAccess(PropertyAccess node) {
-    if (node.target != null) {
-      DartObjectImpl prefixResult = node.target.accept(this);
-      if (_isStringLength(prefixResult, node.propertyName)) {
+  DartObjectImpl? visitPropertyAccess(PropertyAccess node) {
+    var target = node.target;
+    if (target != null) {
+      var prefixResult = target.accept(this);
+      if (prefixResult != null &&
+          _isStringLength(prefixResult, node.propertyName)) {
         return prefixResult.stringLength(typeSystem);
       }
     }
@@ -1304,7 +1275,7 @@
   }
 
   @override
-  DartObjectImpl visitSetOrMapLiteral(SetOrMapLiteral node) {
+  DartObjectImpl? visitSetOrMapLiteral(SetOrMapLiteral node) {
     // Note: due to dartbug.com/33441, it's possible that a set/map literal
     // resynthesized from a summary will have neither its `isSet` or `isMap`
     // boolean set to `true`.  We work around the problem by assuming such
@@ -1328,7 +1299,7 @@
       }
       DartType keyType = _typeProvider.dynamicType;
       DartType valueType = _typeProvider.dynamicType;
-      DartType nodeType = node.staticType;
+      var nodeType = node.staticType;
       if (nodeType is InterfaceType) {
         var typeArguments = nodeType.typeArguments;
         if (typeArguments.length >= 2) {
@@ -1352,7 +1323,7 @@
       if (errorOccurred) {
         return null;
       }
-      DartType nodeType = node.staticType;
+      var nodeType = node.staticType;
       DartType elementType =
           nodeType is InterfaceType && nodeType.typeArguments.isNotEmpty
               ? nodeType.typeArguments[0]
@@ -1363,10 +1334,10 @@
   }
 
   @override
-  DartObjectImpl visitSimpleIdentifier(SimpleIdentifier node) {
+  DartObjectImpl? visitSimpleIdentifier(SimpleIdentifier node) {
     if (_lexicalEnvironment != null &&
-        _lexicalEnvironment.containsKey(node.name)) {
-      return _lexicalEnvironment[node.name];
+        _lexicalEnvironment!.containsKey(node.name)) {
+      return _lexicalEnvironment![node.name];
     }
     return _getConstantValue(node, node.staticElement);
   }
@@ -1381,8 +1352,8 @@
   }
 
   @override
-  DartObjectImpl visitStringInterpolation(StringInterpolation node) {
-    DartObjectImpl result;
+  DartObjectImpl? visitStringInterpolation(StringInterpolation node) {
+    DartObjectImpl? result;
     bool first = true;
     for (InterpolationElement element in node.elements) {
       if (first) {
@@ -1414,14 +1385,19 @@
   }
 
   @override
-  DartObjectImpl visitTypeName(TypeName node) {
+  DartObjectImpl? visitTypeName(TypeName node) {
     var type = node.type;
+
+    if (type == null) {
+      return null;
+    }
+
     if (!_isNonNullableByDefault && hasTypeParameterReference(type)) {
       return super.visitTypeName(node);
     }
 
     if (_substitution != null) {
-      type = _substitution.substituteType(type);
+      type = _substitution!.substituteType(type);
     }
 
     return DartObjectImpl(
@@ -1438,25 +1414,25 @@
     if (element is ForElement) {
       _error(element, null);
     } else if (element is IfElement) {
-      bool conditionValue = _evaluateCondition(element.condition);
+      var conditionValue = _evaluateCondition(element.condition);
       if (conditionValue == null) {
         return true;
       } else if (conditionValue) {
         return _addElementsToList(list, element.thenElement);
       } else if (element.elseElement != null) {
-        return _addElementsToList(list, element.elseElement);
+        return _addElementsToList(list, element.elseElement!);
       }
       return false;
     } else if (element is Expression) {
-      DartObjectImpl value = element.accept(this);
+      var value = element.accept(this);
       if (value == null) {
         return true;
       }
       list.add(value);
       return false;
     } else if (element is SpreadElement) {
-      DartObjectImpl elementResult = element.expression.accept(this);
-      List<DartObject> value = elementResult?.toListValue();
+      var elementResult = element.expression.accept(this);
+      var value = elementResult?.toListValue();
       if (value == null) {
         return true;
       }
@@ -1475,26 +1451,26 @@
     if (element is ForElement) {
       _error(element, null);
     } else if (element is IfElement) {
-      bool conditionValue = _evaluateCondition(element.condition);
+      var conditionValue = _evaluateCondition(element.condition);
       if (conditionValue == null) {
         return true;
       } else if (conditionValue) {
         return _addElementsToMap(map, element.thenElement);
       } else if (element.elseElement != null) {
-        return _addElementsToMap(map, element.elseElement);
+        return _addElementsToMap(map, element.elseElement!);
       }
       return false;
     } else if (element is MapLiteralEntry) {
-      DartObjectImpl keyResult = element.key.accept(this);
-      DartObjectImpl valueResult = element.value.accept(this);
+      var keyResult = element.key.accept(this);
+      var valueResult = element.value.accept(this);
       if (keyResult == null || valueResult == null) {
         return true;
       }
       map[keyResult] = valueResult;
       return false;
     } else if (element is SpreadElement) {
-      DartObjectImpl elementResult = element.expression.accept(this);
-      Map<DartObjectImpl, DartObjectImpl> value = elementResult?.toMapValue();
+      var elementResult = element.expression.accept(this);
+      var value = elementResult?.toMapValue();
       if (value == null) {
         return true;
       }
@@ -1512,25 +1488,25 @@
     if (element is ForElement) {
       _error(element, null);
     } else if (element is IfElement) {
-      bool conditionValue = _evaluateCondition(element.condition);
+      var conditionValue = _evaluateCondition(element.condition);
       if (conditionValue == null) {
         return true;
       } else if (conditionValue) {
         return _addElementsToSet(set, element.thenElement);
       } else if (element.elseElement != null) {
-        return _addElementsToSet(set, element.elseElement);
+        return _addElementsToSet(set, element.elseElement!);
       }
       return false;
     } else if (element is Expression) {
-      DartObjectImpl value = element.accept(this);
+      var value = element.accept(this);
       if (value == null) {
         return true;
       }
       set.add(value);
       return false;
     } else if (element is SpreadElement) {
-      DartObjectImpl elementResult = element.expression.accept(this);
-      Set<DartObject> value = elementResult?.toSetValue();
+      var elementResult = element.expression.accept(this);
+      var value = elementResult?.toSetValue();
       if (value == null) {
         return true;
       }
@@ -1543,9 +1519,9 @@
 
   /// Create an error associated with the given [node]. The error will have the
   /// given error [code].
-  void _error(AstNode node, ErrorCode code) {
+  void _error(AstNode node, ErrorCode? code) {
     if (code == null) {
-      var parent = node?.parent;
+      var parent = node.parent;
       var parent2 = parent?.parent;
       if (parent is ArgumentList &&
           parent2 is InstanceCreationExpression &&
@@ -1555,19 +1531,18 @@
         code = CompileTimeErrorCode.INVALID_CONSTANT;
       }
     }
-    _errorReporter.reportErrorForNode(
-        code ?? CompileTimeErrorCode.INVALID_CONSTANT, node);
+    _errorReporter.reportErrorForNode(code, node);
   }
 
   /// Evaluate the given [condition] with the assumption that it must be a
   /// `bool`.
-  bool _evaluateCondition(Expression condition) {
-    DartObjectImpl conditionResult = condition.accept(this);
-    bool conditionValue = conditionResult?.toBoolValue();
+  bool? _evaluateCondition(Expression condition) {
+    var conditionResult = condition.accept(this);
+    var conditionValue = conditionResult?.toBoolValue();
     if (conditionValue == null) {
       if (conditionResult?.type != _typeProvider.boolType) {
         // TODO(brianwilkerson) Figure out why the static type is sometimes null.
-        DartType staticType = condition.staticType;
+        var staticType = condition.staticType;
         if (staticType == null ||
             typeSystem.isAssignableTo2(staticType, _typeProvider.boolType)) {
           // If the static type is not assignable, then we will have already
@@ -1584,9 +1559,9 @@
   /// Return the constant value of the static constant represented by the given
   /// [element]. The [node] is the node to be used if an error needs to be
   /// reported.
-  DartObjectImpl _getConstantValue(Expression node, Element element) {
+  DartObjectImpl? _getConstantValue(Expression node, Element? element) {
     element = element?.declaration;
-    Element variableElement =
+    var variableElement =
         element is PropertyAccessorElement ? element.variable : element;
 
     if (node is SimpleIdentifier &&
@@ -1601,7 +1576,7 @@
       // and errors for other constant expressions. In either case we have
       // already computed values of all dependencies first (or detect a cycle),
       // so the value has already been computed and we can just return it.
-      EvaluationResultImpl value = variableElement.evaluationResult;
+      var value = variableElement.evaluationResult;
       if (variableElement.isConst && value != null) {
         return value.value;
       }
@@ -1664,7 +1639,7 @@
   /// [identifier] is "length".
   bool _isStringLength(
       DartObjectImpl targetResult, SimpleIdentifier identifier) {
-    if (targetResult?.type?.element != _typeProvider.stringElement) {
+    if (targetResult.type.element != _typeProvider.stringElement) {
       return false;
     }
     return identifier.name == 'length' &&
@@ -1689,7 +1664,7 @@
   /// Return the value of the given [expression], or a representation of 'null'
   /// if the expression cannot be evaluated.
   DartObjectImpl _valueOf(Expression expression) {
-    DartObjectImpl expressionValue = expression.accept(this);
+    var expressionValue = expression.accept(this);
     if (expressionValue != null) {
       return expressionValue;
     }
@@ -1707,8 +1682,8 @@
 
   DartObjectComputer(this._typeSystem, this._errorReporter);
 
-  DartObjectImpl add(BinaryExpression node, DartObjectImpl leftOperand,
-      DartObjectImpl rightOperand) {
+  DartObjectImpl? add(BinaryExpression node, DartObjectImpl? leftOperand,
+      DartObjectImpl? rightOperand) {
     if (leftOperand != null && rightOperand != null) {
       try {
         return leftOperand.add(_typeSystem, rightOperand);
@@ -1723,8 +1698,8 @@
   /// Return the result of applying boolean conversion to the
   /// [evaluationResult]. The [node] is the node against which errors should be
   /// reported.
-  DartObjectImpl applyBooleanConversion(
-      AstNode node, DartObjectImpl evaluationResult) {
+  DartObjectImpl? applyBooleanConversion(
+      AstNode node, DartObjectImpl? evaluationResult) {
     if (evaluationResult != null) {
       try {
         return evaluationResult.convertToBool(_typeSystem);
@@ -1735,7 +1710,7 @@
     return null;
   }
 
-  DartObjectImpl bitNot(Expression node, DartObjectImpl evaluationResult) {
+  DartObjectImpl? bitNot(Expression node, DartObjectImpl? evaluationResult) {
     if (evaluationResult != null) {
       try {
         return evaluationResult.bitNot(_typeSystem);
@@ -1746,8 +1721,8 @@
     return null;
   }
 
-  DartObjectImpl castToType(
-      AsExpression node, DartObjectImpl expression, DartObjectImpl type) {
+  DartObjectImpl? castToType(
+      AsExpression node, DartObjectImpl? expression, DartObjectImpl? type) {
     if (expression != null && type != null) {
       try {
         return expression.castToType(_typeSystem, type);
@@ -1758,8 +1733,8 @@
     return null;
   }
 
-  DartObjectImpl concatenate(Expression node, DartObjectImpl leftOperand,
-      DartObjectImpl rightOperand) {
+  DartObjectImpl? concatenate(Expression node, DartObjectImpl? leftOperand,
+      DartObjectImpl? rightOperand) {
     if (leftOperand != null && rightOperand != null) {
       try {
         return leftOperand.concatenate(_typeSystem, rightOperand);
@@ -1770,8 +1745,8 @@
     return null;
   }
 
-  DartObjectImpl divide(BinaryExpression node, DartObjectImpl leftOperand,
-      DartObjectImpl rightOperand) {
+  DartObjectImpl? divide(BinaryExpression node, DartObjectImpl? leftOperand,
+      DartObjectImpl? rightOperand) {
     if (leftOperand != null && rightOperand != null) {
       try {
         return leftOperand.divide(_typeSystem, rightOperand);
@@ -1782,8 +1757,8 @@
     return null;
   }
 
-  DartObjectImpl eagerAnd(BinaryExpression node, DartObjectImpl leftOperand,
-      DartObjectImpl rightOperand) {
+  DartObjectImpl? eagerAnd(BinaryExpression node, DartObjectImpl? leftOperand,
+      DartObjectImpl? rightOperand) {
     if (leftOperand != null && rightOperand != null) {
       try {
         return leftOperand.eagerAnd(_typeSystem, rightOperand);
@@ -1794,8 +1769,8 @@
     return null;
   }
 
-  DartObjectImpl eagerOr(BinaryExpression node, DartObjectImpl leftOperand,
-      DartObjectImpl rightOperand) {
+  DartObjectImpl? eagerOr(BinaryExpression node, DartObjectImpl? leftOperand,
+      DartObjectImpl? rightOperand) {
     if (leftOperand != null && rightOperand != null) {
       try {
         return leftOperand.eagerOr(_typeSystem, rightOperand);
@@ -1806,8 +1781,8 @@
     return null;
   }
 
-  DartObjectImpl eagerQuestionQuestion(Expression node,
-      DartObjectImpl leftOperand, DartObjectImpl rightOperand) {
+  DartObjectImpl? eagerQuestionQuestion(Expression node,
+      DartObjectImpl? leftOperand, DartObjectImpl? rightOperand) {
     if (leftOperand != null && rightOperand != null) {
       if (leftOperand.isNull) {
         return rightOperand;
@@ -1817,8 +1792,8 @@
     return null;
   }
 
-  DartObjectImpl eagerXor(BinaryExpression node, DartObjectImpl leftOperand,
-      DartObjectImpl rightOperand) {
+  DartObjectImpl? eagerXor(BinaryExpression node, DartObjectImpl? leftOperand,
+      DartObjectImpl? rightOperand) {
     if (leftOperand != null && rightOperand != null) {
       try {
         return leftOperand.eagerXor(_typeSystem, rightOperand);
@@ -1829,8 +1804,8 @@
     return null;
   }
 
-  DartObjectImpl equalEqual(Expression node, DartObjectImpl leftOperand,
-      DartObjectImpl rightOperand) {
+  DartObjectImpl? equalEqual(Expression node, DartObjectImpl? leftOperand,
+      DartObjectImpl? rightOperand) {
     if (leftOperand != null && rightOperand != null) {
       try {
         return leftOperand.equalEqual(_typeSystem, rightOperand);
@@ -1841,8 +1816,8 @@
     return null;
   }
 
-  DartObjectImpl greaterThan(BinaryExpression node, DartObjectImpl leftOperand,
-      DartObjectImpl rightOperand) {
+  DartObjectImpl? greaterThan(BinaryExpression node,
+      DartObjectImpl? leftOperand, DartObjectImpl? rightOperand) {
     if (leftOperand != null && rightOperand != null) {
       try {
         return leftOperand.greaterThan(_typeSystem, rightOperand);
@@ -1853,8 +1828,8 @@
     return null;
   }
 
-  DartObjectImpl greaterThanOrEqual(BinaryExpression node,
-      DartObjectImpl leftOperand, DartObjectImpl rightOperand) {
+  DartObjectImpl? greaterThanOrEqual(BinaryExpression node,
+      DartObjectImpl? leftOperand, DartObjectImpl? rightOperand) {
     if (leftOperand != null && rightOperand != null) {
       try {
         return leftOperand.greaterThanOrEqual(_typeSystem, rightOperand);
@@ -1865,8 +1840,8 @@
     return null;
   }
 
-  DartObjectImpl integerDivide(BinaryExpression node,
-      DartObjectImpl leftOperand, DartObjectImpl rightOperand) {
+  DartObjectImpl? integerDivide(BinaryExpression node,
+      DartObjectImpl? leftOperand, DartObjectImpl? rightOperand) {
     if (leftOperand != null && rightOperand != null) {
       try {
         return leftOperand.integerDivide(_typeSystem, rightOperand);
@@ -1877,8 +1852,8 @@
     return null;
   }
 
-  DartObjectImpl isIdentical(Expression node, DartObjectImpl leftOperand,
-      DartObjectImpl rightOperand) {
+  DartObjectImpl? isIdentical(Expression node, DartObjectImpl? leftOperand,
+      DartObjectImpl? rightOperand) {
     if (leftOperand != null && rightOperand != null) {
       try {
         return leftOperand.isIdentical2(_typeSystem, rightOperand);
@@ -1889,8 +1864,8 @@
     return null;
   }
 
-  DartObjectImpl lazyAnd(BinaryExpression node, DartObjectImpl leftOperand,
-      DartObjectImpl Function() rightOperandComputer) {
+  DartObjectImpl? lazyAnd(BinaryExpression node, DartObjectImpl? leftOperand,
+      DartObjectImpl? Function() rightOperandComputer) {
     if (leftOperand != null) {
       try {
         return leftOperand.lazyAnd(_typeSystem, rightOperandComputer);
@@ -1901,8 +1876,8 @@
     return null;
   }
 
-  DartObjectImpl lazyEqualEqual(Expression node, DartObjectImpl leftOperand,
-      DartObjectImpl rightOperand) {
+  DartObjectImpl? lazyEqualEqual(Expression node, DartObjectImpl? leftOperand,
+      DartObjectImpl? rightOperand) {
     if (leftOperand != null && rightOperand != null) {
       try {
         return leftOperand.lazyEqualEqual(_typeSystem, rightOperand);
@@ -1913,8 +1888,8 @@
     return null;
   }
 
-  DartObjectImpl lazyOr(BinaryExpression node, DartObjectImpl leftOperand,
-      DartObjectImpl Function() rightOperandComputer) {
+  DartObjectImpl? lazyOr(BinaryExpression node, DartObjectImpl? leftOperand,
+      DartObjectImpl? Function() rightOperandComputer) {
     if (leftOperand != null) {
       try {
         return leftOperand.lazyOr(_typeSystem, rightOperandComputer);
@@ -1925,10 +1900,10 @@
     return null;
   }
 
-  DartObjectImpl lazyQuestionQuestion(
+  DartObjectImpl? lazyQuestionQuestion(
       Expression node,
-      DartObjectImpl leftOperand,
-      DartObjectImpl Function() rightOperandComputer) {
+      DartObjectImpl? leftOperand,
+      DartObjectImpl? Function() rightOperandComputer) {
     if (leftOperand != null) {
       if (leftOperand.isNull) {
         return rightOperandComputer();
@@ -1938,8 +1913,8 @@
     return null;
   }
 
-  DartObjectImpl lessThan(BinaryExpression node, DartObjectImpl leftOperand,
-      DartObjectImpl rightOperand) {
+  DartObjectImpl? lessThan(BinaryExpression node, DartObjectImpl? leftOperand,
+      DartObjectImpl? rightOperand) {
     if (leftOperand != null && rightOperand != null) {
       try {
         return leftOperand.lessThan(_typeSystem, rightOperand);
@@ -1950,8 +1925,8 @@
     return null;
   }
 
-  DartObjectImpl lessThanOrEqual(BinaryExpression node,
-      DartObjectImpl leftOperand, DartObjectImpl rightOperand) {
+  DartObjectImpl? lessThanOrEqual(BinaryExpression node,
+      DartObjectImpl? leftOperand, DartObjectImpl? rightOperand) {
     if (leftOperand != null && rightOperand != null) {
       try {
         return leftOperand.lessThanOrEqual(_typeSystem, rightOperand);
@@ -1962,7 +1937,8 @@
     return null;
   }
 
-  DartObjectImpl logicalNot(Expression node, DartObjectImpl evaluationResult) {
+  DartObjectImpl? logicalNot(
+      Expression node, DartObjectImpl? evaluationResult) {
     if (evaluationResult != null) {
       try {
         return evaluationResult.logicalNot(_typeSystem);
@@ -1973,8 +1949,8 @@
     return null;
   }
 
-  DartObjectImpl logicalShiftRight(BinaryExpression node,
-      DartObjectImpl leftOperand, DartObjectImpl rightOperand) {
+  DartObjectImpl? logicalShiftRight(BinaryExpression node,
+      DartObjectImpl? leftOperand, DartObjectImpl? rightOperand) {
     if (leftOperand != null && rightOperand != null) {
       try {
         return leftOperand.logicalShiftRight(_typeSystem, rightOperand);
@@ -1985,8 +1961,8 @@
     return null;
   }
 
-  DartObjectImpl minus(BinaryExpression node, DartObjectImpl leftOperand,
-      DartObjectImpl rightOperand) {
+  DartObjectImpl? minus(BinaryExpression node, DartObjectImpl? leftOperand,
+      DartObjectImpl? rightOperand) {
     if (leftOperand != null && rightOperand != null) {
       try {
         return leftOperand.minus(_typeSystem, rightOperand);
@@ -1997,7 +1973,7 @@
     return null;
   }
 
-  DartObjectImpl negated(Expression node, DartObjectImpl evaluationResult) {
+  DartObjectImpl? negated(Expression node, DartObjectImpl? evaluationResult) {
     if (evaluationResult != null) {
       try {
         return evaluationResult.negated(_typeSystem);
@@ -2008,8 +1984,8 @@
     return null;
   }
 
-  DartObjectImpl notEqual(BinaryExpression node, DartObjectImpl leftOperand,
-      DartObjectImpl rightOperand) {
+  DartObjectImpl? notEqual(BinaryExpression node, DartObjectImpl? leftOperand,
+      DartObjectImpl? rightOperand) {
     if (leftOperand != null && rightOperand != null) {
       try {
         return leftOperand.notEqual(_typeSystem, rightOperand);
@@ -2020,8 +1996,8 @@
     return null;
   }
 
-  DartObjectImpl performToString(
-      AstNode node, DartObjectImpl evaluationResult) {
+  DartObjectImpl? performToString(
+      AstNode node, DartObjectImpl? evaluationResult) {
     if (evaluationResult != null) {
       try {
         return evaluationResult.performToString(_typeSystem);
@@ -2032,8 +2008,8 @@
     return null;
   }
 
-  DartObjectImpl remainder(BinaryExpression node, DartObjectImpl leftOperand,
-      DartObjectImpl rightOperand) {
+  DartObjectImpl? remainder(BinaryExpression node, DartObjectImpl? leftOperand,
+      DartObjectImpl? rightOperand) {
     if (leftOperand != null && rightOperand != null) {
       try {
         return leftOperand.remainder(_typeSystem, rightOperand);
@@ -2044,8 +2020,8 @@
     return null;
   }
 
-  DartObjectImpl shiftLeft(BinaryExpression node, DartObjectImpl leftOperand,
-      DartObjectImpl rightOperand) {
+  DartObjectImpl? shiftLeft(BinaryExpression node, DartObjectImpl? leftOperand,
+      DartObjectImpl? rightOperand) {
     if (leftOperand != null && rightOperand != null) {
       try {
         return leftOperand.shiftLeft(_typeSystem, rightOperand);
@@ -2056,8 +2032,8 @@
     return null;
   }
 
-  DartObjectImpl shiftRight(BinaryExpression node, DartObjectImpl leftOperand,
-      DartObjectImpl rightOperand) {
+  DartObjectImpl? shiftRight(BinaryExpression node, DartObjectImpl? leftOperand,
+      DartObjectImpl? rightOperand) {
     if (leftOperand != null && rightOperand != null) {
       try {
         return leftOperand.shiftRight(_typeSystem, rightOperand);
@@ -2071,12 +2047,12 @@
   /// Return the result of invoking the 'length' getter on the
   /// [evaluationResult]. The [node] is the node against which errors should be
   /// reported.
-  EvaluationResultImpl stringLength(
+  EvaluationResultImpl? stringLength(
       Expression node, EvaluationResultImpl evaluationResult) {
-    if (evaluationResult.value != null) {
+    var value = evaluationResult.value;
+    if (value != null) {
       try {
-        return EvaluationResultImpl(
-            evaluationResult.value.stringLength(_typeSystem));
+        return EvaluationResultImpl(value.stringLength(_typeSystem));
       } on EvaluationException catch (exception) {
         _errorReporter.reportErrorForNode(exception.errorCode, node);
       }
@@ -2084,8 +2060,8 @@
     return EvaluationResultImpl(null);
   }
 
-  DartObjectImpl times(BinaryExpression node, DartObjectImpl leftOperand,
-      DartObjectImpl rightOperand) {
+  DartObjectImpl? times(BinaryExpression node, DartObjectImpl? leftOperand,
+      DartObjectImpl? rightOperand) {
     if (leftOperand != null && rightOperand != null) {
       try {
         return leftOperand.times(_typeSystem, rightOperand);
@@ -2096,8 +2072,8 @@
     return null;
   }
 
-  DartObjectImpl typeTest(
-      IsExpression node, DartObjectImpl expression, DartObjectImpl type) {
+  DartObjectImpl? typeTest(
+      IsExpression node, DartObjectImpl? expression, DartObjectImpl? type) {
     if (expression != null && type != null) {
       try {
         DartObjectImpl result = expression.hasType(_typeSystem, type);
@@ -2117,11 +2093,11 @@
 class EvaluationResult {
   // TODO(brianwilkerson) Merge with EvaluationResultImpl
   /// The value of the expression.
-  final DartObject value;
+  final DartObject? value;
 
   /// The errors that should be reported for the expression(s) that were
   /// evaluated.
-  final List<AnalysisError> _errors;
+  final List<AnalysisError>? _errors;
 
   /// Initialize a newly created result object with the given [value] and set of
   /// [_errors]. Clients should use one of the factory methods: [forErrors] and
@@ -2157,13 +2133,13 @@
   /// The errors encountered while trying to evaluate the compile time constant.
   /// These errors may or may not have prevented the expression from being a
   /// valid compile time constant.
-  List<AnalysisError> _errors;
+  late final List<AnalysisError> _errors;
 
   /// The value of the expression, or `null` if the value couldn't be computed
   /// due to errors.
-  final DartObjectImpl value;
+  final DartObjectImpl? value;
 
-  EvaluationResultImpl(this.value, [List<AnalysisError> errors]) {
+  EvaluationResultImpl(this.value, [List<AnalysisError>? errors]) {
     _errors = errors ?? <AnalysisError>[];
   }
 
diff --git a/pkg/analyzer/lib/src/dart/constant/from_environment_evaluator.dart b/pkg/analyzer/lib/src/dart/constant/from_environment_evaluator.dart
index c1260a8..022dc2b 100644
--- a/pkg/analyzer/lib/src/dart/constant/from_environment_evaluator.dart
+++ b/pkg/analyzer/lib/src/dart/constant/from_environment_evaluator.dart
@@ -22,12 +22,12 @@
   /// parsed as a boolean, return the default value from [namedValues]. If no
   /// default value, return the default value of the default value from
   /// the [constructor], possibly a [DartObject] representing 'null'.
-  DartObject getBool2(
-    String name,
+  DartObjectImpl getBool2(
+    String? name,
     Map<String, DartObjectImpl> namedValues,
     ConstructorElement constructor,
   ) {
-    var str = _declaredVariables.get(name);
+    var str = name != null ? _declaredVariables.get(name) : null;
     if (str == 'true') {
       return DartObjectImpl(
         _typeSystem,
@@ -44,7 +44,7 @@
     }
 
     if (namedValues.containsKey(_defaultValue)) {
-      return namedValues[_defaultValue];
+      return namedValues[_defaultValue]!;
     }
 
     return _defaultValueDefaultValue(constructor);
@@ -55,12 +55,12 @@
   /// parsed as an integer, return the default value from [namedValues]. If no
   /// default value, return the default value of the default value from
   /// the [constructor], possibly a [DartObject] representing 'null'.
-  DartObject getInt2(
-    String name,
+  DartObjectImpl getInt2(
+    String? name,
     Map<String, DartObjectImpl> namedValues,
     ConstructorElement constructor,
   ) {
-    var str = _declaredVariables.get(name);
+    var str = name != null ? _declaredVariables.get(name) : null;
     if (str != null) {
       try {
         var value = int.parse(str);
@@ -75,7 +75,7 @@
     }
 
     if (namedValues.containsKey(_defaultValue)) {
-      return namedValues[_defaultValue];
+      return namedValues[_defaultValue]!;
     }
 
     var defaultDefault = _defaultValueDefaultValue(constructor);
@@ -97,12 +97,12 @@
   /// parsed as a boolean, return the default value from [namedValues]. If no
   /// default value, return the default value of the default value from
   /// the [constructor], possibly a [DartObject] representing 'null'.
-  DartObject getString2(
-    String name,
+  DartObjectImpl getString2(
+    String? name,
     Map<String, DartObjectImpl> namedValues,
     ConstructorElement constructor,
   ) {
-    String str = _declaredVariables.get(name);
+    var str = name != null ? _declaredVariables.get(name) : null;
     if (str != null) {
       return DartObjectImpl(
         _typeSystem,
@@ -112,7 +112,7 @@
     }
 
     if (namedValues.containsKey(_defaultValue)) {
-      return namedValues[_defaultValue];
+      return namedValues[_defaultValue]!;
     }
 
     var defaultDefault = _defaultValueDefaultValue(constructor);
@@ -129,8 +129,8 @@
     return defaultDefault;
   }
 
-  DartObject hasEnvironment(String name) {
-    var value = _declaredVariables.get(name) != null;
+  DartObjectImpl hasEnvironment(String? name) {
+    var value = name != null && _declaredVariables.get(name) != null;
     return DartObjectImpl(
       _typeSystem,
       _typeSystem.typeProvider.boolType,
@@ -138,9 +138,10 @@
     );
   }
 
-  static DartObject _defaultValueDefaultValue(ConstructorElement constructor) {
+  static DartObjectImpl _defaultValueDefaultValue(
+      ConstructorElement constructor) {
     return constructor.parameters
         .singleWhere((parameter) => parameter.name == _defaultValue)
-        .computeConstantValue();
+        .computeConstantValue() as DartObjectImpl;
   }
 }
diff --git a/pkg/analyzer/lib/src/dart/constant/potentially_constant.dart b/pkg/analyzer/lib/src/dart/constant/potentially_constant.dart
index 8149a3b..d1e6db7 100644
--- a/pkg/analyzer/lib/src/dart/constant/potentially_constant.dart
+++ b/pkg/analyzer/lib/src/dart/constant/potentially_constant.dart
@@ -7,7 +7,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type.dart';
-import 'package:meta/meta.dart';
 
 /// Some [ConstructorElement]s can be temporary marked as "const" to check
 /// if doing this is valid.
@@ -18,7 +17,7 @@
 /// Return the list of nodes that are not potentially constant.
 List<AstNode> getNotPotentiallyConstants(
   AstNode node, {
-  @required bool isNonNullableByDefault,
+  required bool isNonNullableByDefault,
 }) {
   var collector = _Collector(
     isNonNullableByDefault: isNonNullableByDefault,
@@ -54,7 +53,7 @@
   final bool isNonNullableByDefault;
   final List<AstNode> nodes = [];
 
-  _Collector({@required this.isNonNullableByDefault});
+  _Collector({required this.isNonNullableByDefault});
 
   void collect(AstNode node) {
     if (node is BooleanLiteral ||
@@ -182,7 +181,7 @@
       collect(node.condition);
       collect(node.thenElement);
       if (node.elseElement != null) {
-        collect(node.elseElement);
+        collect(node.elseElement!);
       }
       return;
     }
@@ -248,9 +247,9 @@
   }
 
   void _methodInvocation(MethodInvocation node) {
-    var arguments = node.argumentList?.arguments;
-    if (arguments?.length == 2 && node.methodName.name == 'identical') {
-      var library = node.methodName?.staticElement?.library;
+    var arguments = node.argumentList.arguments;
+    if (arguments.length == 2 && node.methodName.name == 'identical') {
+      var library = node.methodName.staticElement?.library;
       if (library?.isDartCore == true) {
         collect(arguments[0]);
         collect(arguments[1]);
@@ -261,12 +260,14 @@
   }
 
   void _propertyAccess(PropertyAccess node) {
+    // CascadeExpression is not a constant, so the target is never null.
+    var target = node.target!;
+
     if (node.propertyName.name == 'length') {
-      collect(node.target);
+      collect(target);
       return;
     }
 
-    var target = node.target;
     if (target is PrefixedIdentifier) {
       if (target.isDeferred) {
         nodes.add(node);
@@ -294,7 +295,7 @@
 
     if (node is ListLiteral) {
       var typeArguments = node.typeArguments?.arguments;
-      if (typeArguments?.length == 1) {
+      if (typeArguments != null && typeArguments.length == 1) {
         var elementType = typeArguments[0];
         if (!isConstantTypeExpression(elementType)) {
           nodes.add(elementType);
@@ -309,14 +310,14 @@
 
     if (node is SetOrMapLiteral) {
       var typeArguments = node.typeArguments?.arguments;
-      if (typeArguments?.length == 1) {
+      if (typeArguments != null && typeArguments.length == 1) {
         var elementType = typeArguments[0];
         if (!isConstantTypeExpression(elementType)) {
           nodes.add(elementType);
         }
       }
 
-      if (typeArguments?.length == 2) {
+      if (typeArguments != null && typeArguments.length == 2) {
         var keyType = typeArguments[0];
         var valueType = typeArguments[1];
         if (!isConstantTypeExpression(keyType)) {
@@ -342,10 +343,10 @@
 class _ConstantTypeChecker {
   final bool potentially;
 
-  _ConstantTypeChecker({@required this.potentially});
+  _ConstantTypeChecker({required this.potentially});
 
   /// Return `true` if the [node] is a constant type expression.
-  bool check(TypeAnnotation node) {
+  bool check(TypeAnnotation? node) {
     if (potentially) {
       if (node is TypeName) {
         var element = node.name.staticElement;
@@ -394,13 +395,11 @@
         }
       }
 
-      var formalParameters = node.parameters?.parameters;
-      if (formalParameters != null) {
-        for (var parameter in formalParameters) {
-          if (parameter is SimpleFormalParameter) {
-            if (!check(parameter.type)) {
-              return false;
-            }
+      var formalParameters = node.parameters.parameters;
+      for (var parameter in formalParameters) {
+        if (parameter is SimpleFormalParameter) {
+          if (!check(parameter.type)) {
+            return false;
           }
         }
       }
diff --git a/pkg/analyzer/lib/src/dart/constant/utilities.dart b/pkg/analyzer/lib/src/dart/constant/utilities.dart
index 077ccf5..4325063 100644
--- a/pkg/analyzer/lib/src/dart/constant/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/constant/utilities.dart
@@ -38,7 +38,8 @@
 
   @override
   FunctionExpression visitFunctionExpression(FunctionExpression node) {
-    FunctionExpressionImpl expression = super.visitFunctionExpression(node);
+    var expression =
+        super.visitFunctionExpression(node) as FunctionExpressionImpl;
     expression.declaredElement = node.declaredElement;
     return expression;
   }
@@ -77,14 +78,14 @@
 
   @override
   PrefixedIdentifier visitPrefixedIdentifier(PrefixedIdentifier node) {
-    PrefixedIdentifierImpl copy = super.visitPrefixedIdentifier(node);
+    var copy = super.visitPrefixedIdentifier(node) as PrefixedIdentifierImpl;
     copy.staticType = node.staticType;
     return copy;
   }
 
   @override
   PropertyAccess visitPropertyAccess(PropertyAccess node) {
-    PropertyAccessImpl copy = super.visitPropertyAccess(node);
+    var copy = super.visitPropertyAccess(node) as PropertyAccessImpl;
     copy.staticType = node.staticType;
     return copy;
   }
@@ -110,7 +111,7 @@
 
   @override
   SimpleIdentifier visitSimpleIdentifier(SimpleIdentifier node) {
-    SimpleIdentifierImpl copy = super.visitSimpleIdentifier(node);
+    var copy = super.visitSimpleIdentifier(node) as SimpleIdentifierImpl;
     copy.staticElement = node.staticElement;
     copy.staticType = node.staticType;
     copy.tearOffTypeArgumentTypes = node.tearOffTypeArgumentTypes;
@@ -190,10 +191,8 @@
   /// Add dependencies of a [CollectionElement] or [Expression] (which is a type
   /// of [CollectionElement]).
   void _find(CollectionElement node) {
-    if (node != null) {
-      ReferenceFinder referenceFinder = ReferenceFinder(dependencies.add);
-      node.accept(referenceFinder);
-    }
+    ReferenceFinder referenceFinder = ReferenceFinder(dependencies.add);
+    node.accept(referenceFinder);
   }
 }
 
@@ -213,7 +212,7 @@
   @override
   void visitAnnotation(Annotation node) {
     super.visitAnnotation(node);
-    ElementAnnotation elementAnnotation = node.elementAnnotation;
+    var elementAnnotation = node.elementAnnotation;
     if (elementAnnotation == null) {
       // Analyzer ignores annotations on "part of" directives and on enum
       // constant declarations.
@@ -228,7 +227,7 @@
   @override
   void visitClassDeclaration(ClassDeclaration node) {
     bool prevTreatFinalInstanceVarAsConst = treatFinalInstanceVarAsConst;
-    if (node.declaredElement.constructors
+    if (node.declaredElement!.constructors
         .any((ConstructorElement e) => e.isConst)) {
       // Instance vars marked "final" need to be included in the dependency
       // graph, since constant constructors implicitly use the values in their
@@ -246,7 +245,7 @@
   void visitConstructorDeclaration(ConstructorDeclaration node) {
     super.visitConstructorDeclaration(node);
     if (node.constKeyword != null) {
-      ConstructorElement element = node.declaredElement;
+      var element = node.declaredElement;
       if (element != null) {
         constantsToCompute.add(element);
         constantsToCompute.addAll(element.parameters);
@@ -257,26 +256,24 @@
   @override
   void visitDefaultFormalParameter(DefaultFormalParameter node) {
     super.visitDefaultFormalParameter(node);
-    Expression defaultValue = node.defaultValue;
+    var defaultValue = node.defaultValue;
     if (defaultValue != null && node.declaredElement != null) {
-      constantsToCompute.add(node.declaredElement);
+      constantsToCompute.add(node.declaredElement!);
     }
   }
 
   @override
   void visitVariableDeclaration(VariableDeclaration node) {
     super.visitVariableDeclaration(node);
-    Expression initializer = node.initializer;
-    VariableElement element = node.declaredElement;
+    var initializer = node.initializer;
+    var element = node.declaredElement!;
     if (initializer != null &&
         (node.isConst ||
             treatFinalInstanceVarAsConst &&
                 element is FieldElement &&
                 node.isFinal &&
                 !element.isStatic)) {
-      if (element != null) {
-        constantsToCompute.add(element);
-      }
+      constantsToCompute.add(element);
     }
   }
 }
@@ -296,8 +293,7 @@
   @override
   void visitInstanceCreationExpression(InstanceCreationExpression node) {
     if (node.isConst) {
-      ConstructorElement constructor =
-          node.constructorName.staticElement?.declaration;
+      var constructor = node.constructorName.staticElement?.declaration;
       if (constructor != null) {
         _callback(constructor);
       }
@@ -318,7 +314,7 @@
   void visitRedirectingConstructorInvocation(
       RedirectingConstructorInvocation node) {
     super.visitRedirectingConstructorInvocation(node);
-    ConstructorElement target = node.staticElement?.declaration;
+    var target = node.staticElement?.declaration;
     if (target != null) {
       _callback(target);
     }
@@ -326,8 +322,8 @@
 
   @override
   void visitSimpleIdentifier(SimpleIdentifier node) {
-    Element staticElement = node.staticElement;
-    Element element = staticElement is PropertyAccessorElement
+    var staticElement = node.staticElement;
+    var element = staticElement is PropertyAccessorElement
         ? staticElement.variable
         : staticElement;
     if (element is VariableElement && element.isConst) {
@@ -338,7 +334,7 @@
   @override
   void visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     super.visitSuperConstructorInvocation(node);
-    ConstructorElement constructor = node.staticElement?.declaration;
+    var constructor = node.staticElement?.declaration;
     if (constructor != null) {
       _callback(constructor);
     }
diff --git a/pkg/analyzer/lib/src/dart/constant/value.dart b/pkg/analyzer/lib/src/dart/constant/value.dart
index af14481..19cc0a5 100644
--- a/pkg/analyzer/lib/src/dart/constant/value.dart
+++ b/pkg/analyzer/lib/src/dart/constant/value.dart
@@ -27,13 +27,13 @@
   static BoolState UNKNOWN_VALUE = BoolState(null);
 
   /// The value of this instance.
-  final bool value;
+  final bool? value;
 
   /// Initialize a newly created state to represent the given [value].
   BoolState(this.value);
 
   @override
-  int get hashCode => value == null ? 0 : (value ? 2 : 3);
+  int get hashCode => value == null ? 0 : (value! ? 2 : 3);
 
   @override
   bool get isBool => true;
@@ -59,7 +59,7 @@
     if (value == null) {
       return StringState.UNKNOWN_VALUE;
     }
-    return StringState(value ? "true" : "false");
+    return StringState(value! ? "true" : "false");
   }
 
   @override
@@ -74,7 +74,7 @@
       return UNKNOWN_VALUE;
     }
     if (rightOperand is BoolState) {
-      bool rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return UNKNOWN_VALUE;
       }
@@ -84,23 +84,23 @@
   }
 
   @override
-  BoolState lazyAnd(InstanceState Function() rightOperandComputer) {
+  BoolState lazyAnd(InstanceState? Function() rightOperandComputer) {
     if (value == false) {
       return FALSE_STATE;
     }
-    InstanceState rightOperand = rightOperandComputer();
+    var rightOperand = rightOperandComputer();
     assertBool(rightOperand);
-    return value == null ? UNKNOWN_VALUE : rightOperand.convertToBool();
+    return value == null ? UNKNOWN_VALUE : rightOperand!.convertToBool();
   }
 
   @override
-  BoolState lazyOr(InstanceState Function() rightOperandComputer) {
+  BoolState lazyOr(InstanceState? Function() rightOperandComputer) {
     if (value == true) {
       return TRUE_STATE;
     }
-    InstanceState rightOperand = rightOperandComputer();
+    var rightOperand = rightOperandComputer();
     assertBool(rightOperand);
-    return value == null ? UNKNOWN_VALUE : rightOperand.convertToBool();
+    return value == null ? UNKNOWN_VALUE : rightOperand!.convertToBool();
   }
 
   @override
@@ -108,11 +108,12 @@
     if (value == null) {
       return UNKNOWN_VALUE;
     }
-    return value ? FALSE_STATE : TRUE_STATE;
+    return value! ? FALSE_STATE : TRUE_STATE;
   }
 
   @override
-  String toString() => value == null ? "-unknown-" : (value ? "true" : "false");
+  String toString() =>
+      value == null ? "-unknown-" : (value! ? "true" : "false");
 
   /// Return the boolean state representing the given boolean [value].
   static BoolState from(bool value) =>
@@ -126,7 +127,7 @@
 
   /// Values of specified arguments, actual values for positional, and `null`
   /// for named (which are provided as [namedArguments]).
-  final List<DartObjectImpl> _argumentValues;
+  final List<DartObjectImpl?> _argumentValues;
 
   /// The named arguments passed to the constructor.
   final Map<String, DartObjectImpl> namedArguments;
@@ -136,7 +137,15 @@
 
   /// The positional arguments passed to the constructor.
   List<DartObjectImpl> get positionalArguments {
-    return _argumentValues.takeWhile((v) => v != null).toList();
+    var result = <DartObjectImpl>[];
+    for (var argument in _argumentValues) {
+      if (argument != null) {
+        result.add(argument);
+      } else {
+        break;
+      }
+    }
+    return result;
   }
 }
 
@@ -158,7 +167,7 @@
     TypeSystemImpl typeSystem,
     ParameterizedType type,
   ) {
-    if (type.element.library.isDartCore) {
+    if (type.element!.library!.isDartCore) {
       if (type.isDartCoreBool) {
         return DartObjectImpl(typeSystem, type, BoolState.UNKNOWN_VALUE);
       } else if (type.isDartCoreDouble) {
@@ -172,7 +181,7 @@
     return DartObjectImpl(typeSystem, type, GenericState.UNKNOWN_VALUE);
   }
 
-  Map<String, DartObjectImpl> get fields => _state.fields;
+  Map<String, DartObjectImpl>? get fields => _state.fields;
 
   @override
   int get hashCode => JenkinsSmiHash.hash2(type.hashCode, _state.hashCode);
@@ -257,6 +266,11 @@
     _assertType(castType);
     var resultType = (castType._state as TypeState)._type;
 
+    // If we don't know the type, we cannot prove that the cast will fail.
+    if (resultType == null) {
+      return this;
+    }
+
     // We don't know the actual value of a type parameter.
     // So, the object type might be a subtype of the result type.
     if (hasTypeParameterReference(resultType)) {
@@ -418,7 +432,7 @@
   }
 
   @override
-  DartObject getField(String name) {
+  DartObject? getField(String name) {
     InstanceState state = _state;
     if (state is GenericState) {
       return state.fields[name];
@@ -428,7 +442,7 @@
 
   /// Gets the constructor that was called to create this value, if this is a
   /// const constructor invocation. Otherwise returns null.
-  ConstructorInvocation getInvocation() {
+  ConstructorInvocation? getInvocation() {
     InstanceState state = _state;
     if (state is GenericState) {
       return state.invocation;
@@ -468,7 +482,7 @@
   /// [testedType].
   DartObjectImpl hasType(TypeSystemImpl typeSystem, DartObjectImpl testedType) {
     _assertType(testedType);
-    DartType typeType = (testedType._state as TypeState)._type;
+    var typeType = (testedType._state as TypeState)._type;
     BoolState state;
     if (isNull) {
       if (typeType == typeSystem.typeProvider.objectType ||
@@ -478,6 +492,8 @@
       } else {
         state = BoolState.FALSE_STATE;
       }
+    } else if (typeType == null) {
+      state = BoolState.TRUE_STATE;
     } else {
       state = BoolState.from(typeSystem.isSubtypeOf2(type, typeType));
     }
@@ -549,7 +565,7 @@
   /// Throws an [EvaluationException] if the operator is not appropriate for an
   /// object of this kind.
   DartObjectImpl lazyAnd(TypeSystemImpl typeSystem,
-      DartObjectImpl Function() rightOperandComputer) {
+      DartObjectImpl? Function() rightOperandComputer) {
     return DartObjectImpl(
       typeSystem,
       typeSystem.typeProvider.boolType,
@@ -590,7 +606,7 @@
   /// Throws an [EvaluationException] if the operator is not appropriate for an
   /// object of this kind.
   DartObjectImpl lazyOr(TypeSystemImpl typeSystem,
-          DartObjectImpl Function() rightOperandComputer) =>
+          DartObjectImpl? Function() rightOperandComputer) =>
       DartObjectImpl(
         typeSystem,
         typeSystem.typeProvider.boolType,
@@ -810,7 +826,7 @@
   }
 
   @override
-  bool toBoolValue() {
+  bool? toBoolValue() {
     InstanceState state = _state;
     if (state is BoolState) {
       return state.value;
@@ -819,7 +835,7 @@
   }
 
   @override
-  double toDoubleValue() {
+  double? toDoubleValue() {
     InstanceState state = _state;
     if (state is DoubleState) {
       return state.value;
@@ -828,13 +844,13 @@
   }
 
   @override
-  ExecutableElement toFunctionValue() {
+  ExecutableElement? toFunctionValue() {
     InstanceState state = _state;
     return state is FunctionState ? state._element : null;
   }
 
   @override
-  int toIntValue() {
+  int? toIntValue() {
     InstanceState state = _state;
     if (state is IntState) {
       return state.value;
@@ -843,7 +859,7 @@
   }
 
   @override
-  List<DartObject> toListValue() {
+  List<DartObject>? toListValue() {
     InstanceState state = _state;
     if (state is ListState) {
       return state._elements;
@@ -852,7 +868,7 @@
   }
 
   @override
-  Map<DartObject, DartObject> toMapValue() {
+  Map<DartObjectImpl, DartObjectImpl>? toMapValue() {
     InstanceState state = _state;
     if (state is MapState) {
       return state._entries;
@@ -861,7 +877,7 @@
   }
 
   @override
-  Set<DartObject> toSetValue() {
+  Set<DartObject>? toSetValue() {
     InstanceState state = _state;
     if (state is SetState) {
       return state._elements;
@@ -875,7 +891,7 @@
   }
 
   @override
-  String toStringValue() {
+  String? toStringValue() {
     InstanceState state = _state;
     if (state is StringState) {
       return state.value;
@@ -884,7 +900,7 @@
   }
 
   @override
-  String toSymbolValue() {
+  String? toSymbolValue() {
     InstanceState state = _state;
     if (state is SymbolState) {
       return state.value;
@@ -893,7 +909,7 @@
   }
 
   @override
-  DartType toTypeValue() {
+  DartType? toTypeValue() {
     InstanceState state = _state;
     if (state is TypeState) {
       return state._type;
@@ -916,7 +932,7 @@
   static DoubleState UNKNOWN_VALUE = DoubleState(null);
 
   /// The value of this instance.
-  final double value;
+  final double? value;
 
   /// Initialize a newly created state to represent a double with the given
   /// [value].
@@ -942,17 +958,17 @@
       return UNKNOWN_VALUE;
     }
     if (rightOperand is IntState) {
-      int rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return UNKNOWN_VALUE;
       }
-      return DoubleState(value + rightValue.toDouble());
+      return DoubleState(value! + rightValue.toDouble());
     } else if (rightOperand is DoubleState) {
-      double rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return UNKNOWN_VALUE;
       }
-      return DoubleState(value + rightValue);
+      return DoubleState(value! + rightValue);
     }
     throw EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
@@ -972,17 +988,17 @@
       return UNKNOWN_VALUE;
     }
     if (rightOperand is IntState) {
-      int rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return UNKNOWN_VALUE;
       }
-      return DoubleState(value / rightValue.toDouble());
+      return DoubleState(value! / rightValue.toDouble());
     } else if (rightOperand is DoubleState) {
-      double rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return UNKNOWN_VALUE;
       }
-      return DoubleState(value / rightValue);
+      return DoubleState(value! / rightValue);
     }
     throw EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
@@ -994,17 +1010,17 @@
       return BoolState.UNKNOWN_VALUE;
     }
     if (rightOperand is IntState) {
-      int rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return BoolState.UNKNOWN_VALUE;
       }
-      return BoolState.from(value > rightValue.toDouble());
+      return BoolState.from(value! > rightValue.toDouble());
     } else if (rightOperand is DoubleState) {
-      double rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return BoolState.UNKNOWN_VALUE;
       }
-      return BoolState.from(value > rightValue);
+      return BoolState.from(value! > rightValue);
     }
     throw EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
@@ -1016,17 +1032,17 @@
       return BoolState.UNKNOWN_VALUE;
     }
     if (rightOperand is IntState) {
-      int rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return BoolState.UNKNOWN_VALUE;
       }
-      return BoolState.from(value >= rightValue.toDouble());
+      return BoolState.from(value! >= rightValue.toDouble());
     } else if (rightOperand is DoubleState) {
-      double rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return BoolState.UNKNOWN_VALUE;
       }
-      return BoolState.from(value >= rightValue);
+      return BoolState.from(value! >= rightValue);
     }
     throw EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
@@ -1038,20 +1054,20 @@
       return IntState.UNKNOWN_VALUE;
     }
     if (rightOperand is IntState) {
-      int rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return IntState.UNKNOWN_VALUE;
       }
-      double result = value / rightValue.toDouble();
+      var result = value! / rightValue.toDouble();
       if (result.isFinite) {
         return IntState(result.toInt());
       }
     } else if (rightOperand is DoubleState) {
-      double rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return IntState.UNKNOWN_VALUE;
       }
-      double result = value / rightValue;
+      double result = value! / rightValue;
       if (result.isFinite) {
         return IntState(result.toInt());
       }
@@ -1065,13 +1081,13 @@
       return BoolState.UNKNOWN_VALUE;
     }
     if (rightOperand is DoubleState) {
-      double rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return BoolState.UNKNOWN_VALUE;
       }
       return BoolState.from(value == rightValue);
     } else if (rightOperand is IntState) {
-      int rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return BoolState.UNKNOWN_VALUE;
       }
@@ -1087,17 +1103,17 @@
       return BoolState.UNKNOWN_VALUE;
     }
     if (rightOperand is IntState) {
-      int rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return BoolState.UNKNOWN_VALUE;
       }
-      return BoolState.from(value < rightValue.toDouble());
+      return BoolState.from(value! < rightValue.toDouble());
     } else if (rightOperand is DoubleState) {
-      double rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return BoolState.UNKNOWN_VALUE;
       }
-      return BoolState.from(value < rightValue);
+      return BoolState.from(value! < rightValue);
     }
     throw EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
@@ -1109,17 +1125,17 @@
       return BoolState.UNKNOWN_VALUE;
     }
     if (rightOperand is IntState) {
-      int rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return BoolState.UNKNOWN_VALUE;
       }
-      return BoolState.from(value <= rightValue.toDouble());
+      return BoolState.from(value! <= rightValue.toDouble());
     } else if (rightOperand is DoubleState) {
-      double rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return BoolState.UNKNOWN_VALUE;
       }
-      return BoolState.from(value <= rightValue);
+      return BoolState.from(value! <= rightValue);
     }
     throw EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
@@ -1131,17 +1147,17 @@
       return UNKNOWN_VALUE;
     }
     if (rightOperand is IntState) {
-      int rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return UNKNOWN_VALUE;
       }
-      return DoubleState(value - rightValue.toDouble());
+      return DoubleState(value! - rightValue.toDouble());
     } else if (rightOperand is DoubleState) {
-      double rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return UNKNOWN_VALUE;
       }
-      return DoubleState(value - rightValue);
+      return DoubleState(value! - rightValue);
     }
     throw EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
@@ -1151,7 +1167,7 @@
     if (value == null) {
       return UNKNOWN_VALUE;
     }
-    return DoubleState(-value);
+    return DoubleState(-value!);
   }
 
   @override
@@ -1161,17 +1177,17 @@
       return UNKNOWN_VALUE;
     }
     if (rightOperand is IntState) {
-      int rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return UNKNOWN_VALUE;
       }
-      return DoubleState(value % rightValue.toDouble());
+      return DoubleState(value! % rightValue.toDouble());
     } else if (rightOperand is DoubleState) {
-      double rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return UNKNOWN_VALUE;
       }
-      return DoubleState(value % rightValue);
+      return DoubleState(value! % rightValue);
     }
     throw EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
@@ -1183,17 +1199,17 @@
       return UNKNOWN_VALUE;
     }
     if (rightOperand is IntState) {
-      int rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return UNKNOWN_VALUE;
       }
-      return DoubleState(value * rightValue.toDouble());
+      return DoubleState(value! * rightValue.toDouble());
     } else if (rightOperand is DoubleState) {
-      double rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return UNKNOWN_VALUE;
       }
-      return DoubleState(value * rightValue);
+      return DoubleState(value! * rightValue);
     }
     throw EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
@@ -1214,7 +1230,7 @@
 /// The state of an object representing a function.
 class FunctionState extends InstanceState {
   /// The element representing the function being modeled.
-  final ExecutableElement _element;
+  final ExecutableElement? _element;
 
   /// Initialize a newly created state to represent the function with the given
   /// [element].
@@ -1235,7 +1251,7 @@
     if (_element == null) {
       return StringState.UNKNOWN_VALUE;
     }
-    return StringState(_element.name);
+    return StringState(_element!.name);
   }
 
   @override
@@ -1249,7 +1265,7 @@
       return BoolState.UNKNOWN_VALUE;
     }
     if (rightOperand is FunctionState) {
-      ExecutableElement rightElement = rightOperand._element;
+      var rightElement = rightOperand._element;
       if (rightElement == null) {
         return BoolState.UNKNOWN_VALUE;
       }
@@ -1259,7 +1275,7 @@
   }
 
   @override
-  String toString() => _element == null ? "-unknown-" : _element.name;
+  String toString() => _element?.name ?? "-unknown-";
 }
 
 /// The state of an object representing a Dart object for which there is no more
@@ -1276,7 +1292,7 @@
   final Map<String, DartObjectImpl> _fieldMap;
 
   /// Information about the constructor invoked to generate this instance.
-  final ConstructorInvocation invocation;
+  final ConstructorInvocation? invocation;
 
   /// Initialize a newly created state to represent a newly created object. The
   /// [fieldMap] contains the values of the fields of the instance.
@@ -1359,7 +1375,7 @@
 abstract class InstanceState {
   /// If this represents a generic dart object, return a map from its field
   /// names to their values. Otherwise return null.
-  Map<String, DartObjectImpl> get fields => null;
+  Map<String, DartObjectImpl>? get fields => null;
 
   /// Return `true` if this object represents an object whose type is 'bool'.
   bool get isBool => false;
@@ -1395,7 +1411,7 @@
   }
 
   /// Throw an exception if the given [state] does not represent a boolean value.
-  void assertBool(InstanceState state) {
+  void assertBool(InstanceState? state) {
     if (state is! BoolState) {
       throw EvaluationException(CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL);
     }
@@ -1560,14 +1576,14 @@
   ///
   /// Throws an [EvaluationException] if the operator is not appropriate for an
   /// object of this kind.
-  BoolState lazyAnd(InstanceState Function() rightOperandComputer) {
+  BoolState lazyAnd(InstanceState? Function() rightOperandComputer) {
     assertBool(this);
     if (convertToBool() == BoolState.FALSE_STATE) {
-      return this;
+      return this as BoolState;
     }
-    InstanceState rightOperand = rightOperandComputer();
+    var rightOperand = rightOperandComputer();
     assertBool(rightOperand);
-    return rightOperand.convertToBool();
+    return rightOperand!.convertToBool();
   }
 
   /// Return the result of invoking the '==' operator on this object with the
@@ -1587,14 +1603,14 @@
   ///
   /// Throws an [EvaluationException] if the operator is not appropriate for an
   /// object of this kind.
-  BoolState lazyOr(InstanceState Function() rightOperandComputer) {
+  BoolState lazyOr(InstanceState? Function() rightOperandComputer) {
     assertBool(this);
     if (convertToBool() == BoolState.TRUE_STATE) {
-      return this;
+      return this as BoolState;
     }
-    InstanceState rightOperand = rightOperandComputer();
+    var rightOperand = rightOperandComputer();
     assertBool(rightOperand);
-    return rightOperand.convertToBool();
+    return rightOperand!.convertToBool();
   }
 
   /// Return the result of invoking the '&lt;' operator on this object with the
@@ -1627,8 +1643,8 @@
   BoolState logicalAnd(InstanceState rightOperand) {
     assertBool(this);
     assertBool(rightOperand);
-    bool leftValue = convertToBool().value;
-    bool rightValue = rightOperand.convertToBool().value;
+    var leftValue = convertToBool().value;
+    var rightValue = rightOperand.convertToBool().value;
     if (leftValue == null || rightValue == null) {
       return BoolState.UNKNOWN_VALUE;
     }
@@ -1652,8 +1668,8 @@
   BoolState logicalOr(InstanceState rightOperand) {
     assertBool(this);
     assertBool(rightOperand);
-    bool leftValue = convertToBool().value;
-    bool rightValue = rightOperand.convertToBool().value;
+    var leftValue = convertToBool().value;
+    var rightValue = rightOperand.convertToBool().value;
     if (leftValue == null || rightValue == null) {
       return BoolState.UNKNOWN_VALUE;
     }
@@ -1679,8 +1695,8 @@
   BoolState logicalXor(InstanceState rightOperand) {
     assertBool(this);
     assertBool(rightOperand);
-    bool leftValue = convertToBool().value;
-    bool rightValue = rightOperand.convertToBool().value;
+    var leftValue = convertToBool().value;
+    var rightValue = rightOperand.convertToBool().value;
     if (leftValue == null || rightValue == null) {
       return BoolState.UNKNOWN_VALUE;
     }
@@ -1767,7 +1783,7 @@
   static IntState UNKNOWN_VALUE = IntState(null);
 
   /// The value of this instance.
-  final int value;
+  final int? value;
 
   /// Initialize a newly created state to represent an int with the given
   /// [value].
@@ -1799,17 +1815,17 @@
       return UNKNOWN_VALUE;
     }
     if (rightOperand is IntState) {
-      int rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return UNKNOWN_VALUE;
       }
-      return IntState(value + rightValue);
+      return IntState(value! + rightValue);
     } else if (rightOperand is DoubleState) {
-      double rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return DoubleState.UNKNOWN_VALUE;
       }
-      return DoubleState(value.toDouble() + rightValue);
+      return DoubleState(value!.toDouble() + rightValue);
     }
     throw EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
@@ -1821,11 +1837,11 @@
       return UNKNOWN_VALUE;
     }
     if (rightOperand is IntState) {
-      int rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return UNKNOWN_VALUE;
       }
-      return IntState(value & rightValue);
+      return IntState(value! & rightValue);
     }
     throw EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
@@ -1835,7 +1851,7 @@
     if (value == null) {
       return UNKNOWN_VALUE;
     }
-    return IntState(~value);
+    return IntState(~value!);
   }
 
   @override
@@ -1845,11 +1861,11 @@
       return UNKNOWN_VALUE;
     }
     if (rightOperand is IntState) {
-      int rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return UNKNOWN_VALUE;
       }
-      return IntState(value | rightValue);
+      return IntState(value! | rightValue);
     }
     throw EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
@@ -1861,11 +1877,11 @@
       return UNKNOWN_VALUE;
     }
     if (rightOperand is IntState) {
-      int rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return UNKNOWN_VALUE;
       }
-      return IntState(value ^ rightValue);
+      return IntState(value! ^ rightValue);
     }
     throw EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
@@ -1885,18 +1901,18 @@
       return DoubleState.UNKNOWN_VALUE;
     }
     if (rightOperand is IntState) {
-      int rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return DoubleState.UNKNOWN_VALUE;
       } else {
-        return DoubleState(value.toDouble() / rightValue.toDouble());
+        return DoubleState(value!.toDouble() / rightValue.toDouble());
       }
     } else if (rightOperand is DoubleState) {
-      double rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return DoubleState.UNKNOWN_VALUE;
       }
-      return DoubleState(value.toDouble() / rightValue);
+      return DoubleState(value!.toDouble() / rightValue);
     }
     throw EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
@@ -1908,17 +1924,17 @@
       return BoolState.UNKNOWN_VALUE;
     }
     if (rightOperand is IntState) {
-      int rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return BoolState.UNKNOWN_VALUE;
       }
-      return BoolState.from(value.compareTo(rightValue) > 0);
+      return BoolState.from(value!.compareTo(rightValue) > 0);
     } else if (rightOperand is DoubleState) {
-      double rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return BoolState.UNKNOWN_VALUE;
       }
-      return BoolState.from(value.toDouble() > rightValue);
+      return BoolState.from(value!.toDouble() > rightValue);
     }
     throw EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
@@ -1930,17 +1946,17 @@
       return BoolState.UNKNOWN_VALUE;
     }
     if (rightOperand is IntState) {
-      int rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return BoolState.UNKNOWN_VALUE;
       }
-      return BoolState.from(value.compareTo(rightValue) >= 0);
+      return BoolState.from(value!.compareTo(rightValue) >= 0);
     } else if (rightOperand is DoubleState) {
-      double rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return BoolState.UNKNOWN_VALUE;
       }
-      return BoolState.from(value.toDouble() >= rightValue);
+      return BoolState.from(value!.toDouble() >= rightValue);
     }
     throw EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
@@ -1952,19 +1968,19 @@
       return UNKNOWN_VALUE;
     }
     if (rightOperand is IntState) {
-      int rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return UNKNOWN_VALUE;
       } else if (rightValue == 0) {
         throw EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_IDBZE);
       }
-      return IntState(value ~/ rightValue);
+      return IntState(value! ~/ rightValue);
     } else if (rightOperand is DoubleState) {
-      double rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return UNKNOWN_VALUE;
       }
-      double result = value.toDouble() / rightValue;
+      double result = value!.toDouble() / rightValue;
       if (result.isFinite) {
         return IntState(result.toInt());
       }
@@ -1978,17 +1994,17 @@
       return BoolState.UNKNOWN_VALUE;
     }
     if (rightOperand is IntState) {
-      int rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return BoolState.UNKNOWN_VALUE;
       }
       return BoolState.from(value == rightValue);
     } else if (rightOperand is DoubleState) {
-      double rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return BoolState.UNKNOWN_VALUE;
       }
-      return BoolState.from(rightValue == value.toDouble());
+      return BoolState.from(rightValue == value!.toDouble());
     }
     return BoolState.FALSE_STATE;
   }
@@ -2000,17 +2016,17 @@
       return BoolState.UNKNOWN_VALUE;
     }
     if (rightOperand is IntState) {
-      int rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return BoolState.UNKNOWN_VALUE;
       }
-      return BoolState.from(value.compareTo(rightValue) < 0);
+      return BoolState.from(value!.compareTo(rightValue) < 0);
     } else if (rightOperand is DoubleState) {
-      double rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return BoolState.UNKNOWN_VALUE;
       }
-      return BoolState.from(value.toDouble() < rightValue);
+      return BoolState.from(value!.toDouble() < rightValue);
     }
     throw EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
@@ -2022,17 +2038,17 @@
       return BoolState.UNKNOWN_VALUE;
     }
     if (rightOperand is IntState) {
-      int rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return BoolState.UNKNOWN_VALUE;
       }
-      return BoolState.from(value.compareTo(rightValue) <= 0);
+      return BoolState.from(value!.compareTo(rightValue) <= 0);
     } else if (rightOperand is DoubleState) {
-      double rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return BoolState.UNKNOWN_VALUE;
       }
-      return BoolState.from(value.toDouble() <= rightValue);
+      return BoolState.from(value!.toDouble() <= rightValue);
     }
     throw EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
@@ -2044,7 +2060,7 @@
       return UNKNOWN_VALUE;
     }
     if (rightOperand is IntState) {
-      int rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return UNKNOWN_VALUE;
       } else if (rightValue.bitLength > 31) {
@@ -2061,7 +2077,7 @@
           // in the left operand to be shifted out of the value.
           return IntState(0);
         }
-        return IntState(value ~/ divisor);
+        return IntState(value! ~/ divisor);
       }
     }
     throw EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
@@ -2077,17 +2093,17 @@
       return UNKNOWN_VALUE;
     }
     if (rightOperand is IntState) {
-      int rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return UNKNOWN_VALUE;
       }
-      return IntState(value - rightValue);
+      return IntState(value! - rightValue);
     } else if (rightOperand is DoubleState) {
-      double rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return DoubleState.UNKNOWN_VALUE;
       }
-      return DoubleState(value.toDouble() - rightValue);
+      return DoubleState(value!.toDouble() - rightValue);
     }
     throw EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
@@ -2097,7 +2113,7 @@
     if (value == null) {
       return UNKNOWN_VALUE;
     }
-    return IntState(-value);
+    return IntState(-value!);
   }
 
   @override
@@ -2110,19 +2126,19 @@
       return UNKNOWN_VALUE;
     }
     if (rightOperand is IntState) {
-      int rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return UNKNOWN_VALUE;
       }
       if (rightValue != 0) {
-        return IntState(value % rightValue);
+        return IntState(value! % rightValue);
       }
     } else if (rightOperand is DoubleState) {
-      double rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return DoubleState.UNKNOWN_VALUE;
       }
-      return DoubleState(value.toDouble() % rightValue);
+      return DoubleState(value!.toDouble() % rightValue);
     }
     throw EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
@@ -2134,14 +2150,14 @@
       return UNKNOWN_VALUE;
     }
     if (rightOperand is IntState) {
-      int rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return UNKNOWN_VALUE;
       } else if (rightValue.bitLength > 31) {
         return UNKNOWN_VALUE;
       }
       if (rightValue >= 0) {
-        return IntState(value << rightValue);
+        return IntState(value! << rightValue);
       }
     }
     throw EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
@@ -2154,14 +2170,14 @@
       return UNKNOWN_VALUE;
     }
     if (rightOperand is IntState) {
-      int rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return UNKNOWN_VALUE;
       } else if (rightValue.bitLength > 31) {
         return UNKNOWN_VALUE;
       }
       if (rightValue >= 0) {
-        return IntState(value >> rightValue);
+        return IntState(value! >> rightValue);
       }
     }
     throw EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
@@ -2177,17 +2193,17 @@
       return UNKNOWN_VALUE;
     }
     if (rightOperand is IntState) {
-      int rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return UNKNOWN_VALUE;
       }
-      return IntState(value * rightValue);
+      return IntState(value! * rightValue);
     } else if (rightOperand is DoubleState) {
-      double rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return DoubleState.UNKNOWN_VALUE;
       }
-      return DoubleState(value.toDouble() * rightValue);
+      return DoubleState(value!.toDouble() * rightValue);
     }
     throw EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
@@ -2302,8 +2318,8 @@
         return true;
       }
       for (DartObjectImpl key in _entries.keys) {
-        DartObjectImpl value = _entries[key];
-        DartObjectImpl otherValue = otherElements[key];
+        var value = _entries[key];
+        var otherValue = otherElements[key];
         if (value != otherValue) {
           return false;
         }
@@ -2487,7 +2503,7 @@
   static StringState UNKNOWN_VALUE = StringState(null);
 
   /// The value of this instance.
-  final String value;
+  final String? value;
 
   /// Initialize a newly created state to represent the given [value].
   StringState(this.value);
@@ -2514,7 +2530,7 @@
       return UNKNOWN_VALUE;
     }
     if (rightOperand is StringState) {
-      String rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return UNKNOWN_VALUE;
       }
@@ -2538,7 +2554,7 @@
       return BoolState.UNKNOWN_VALUE;
     }
     if (rightOperand is StringState) {
-      String rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return BoolState.UNKNOWN_VALUE;
       }
@@ -2552,7 +2568,7 @@
     if (value == null) {
       return IntState.UNKNOWN_VALUE;
     }
-    return IntState(value.length);
+    return IntState(value!.length);
   }
 
   @override
@@ -2562,7 +2578,7 @@
 /// The state of an object representing a symbol.
 class SymbolState extends InstanceState {
   /// The value of this instance.
-  final String value;
+  final String? value;
 
   /// Initialize a newly created state to represent the given [value].
   SymbolState(this.value);
@@ -2597,7 +2613,7 @@
       return BoolState.UNKNOWN_VALUE;
     }
     if (rightOperand is SymbolState) {
-      String rightValue = rightOperand.value;
+      var rightValue = rightOperand.value;
       if (rightValue == null) {
         return BoolState.UNKNOWN_VALUE;
       }
@@ -2613,7 +2629,7 @@
 /// The state of an object representing a type.
 class TypeState extends InstanceState {
   /// The element representing the type being modeled.
-  final DartType _type;
+  final DartType? _type;
 
   /// Initialize a newly created state to represent the given [value].
   TypeState(this._type);
@@ -2633,7 +2649,7 @@
     if (_type == null) {
       return StringState.UNKNOWN_VALUE;
     }
-    return StringState(_type.getDisplayString(withNullability: false));
+    return StringState(_type!.getDisplayString(withNullability: false));
   }
 
   @override
@@ -2648,13 +2664,13 @@
       return BoolState.UNKNOWN_VALUE;
     }
     if (rightOperand is TypeState) {
-      DartType rightType = rightOperand._type;
+      var rightType = rightOperand._type;
       if (rightType == null) {
         return BoolState.UNKNOWN_VALUE;
       }
 
       return BoolState.from(
-        typeSystem.runtimeTypesEqual(_type, rightType),
+        typeSystem.runtimeTypesEqual(_type!, rightType),
       );
     }
     return BoolState.FALSE_STATE;
diff --git a/pkg/analyzer/lib/src/dart/element/class_hierarchy.dart b/pkg/analyzer/lib/src/dart/element/class_hierarchy.dart
index 7559fa2..0a44e08 100644
--- a/pkg/analyzer/lib/src/dart/element/class_hierarchy.dart
+++ b/pkg/analyzer/lib/src/dart/element/class_hierarchy.dart
@@ -7,7 +7,6 @@
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type_algebra.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
-import 'package:meta/meta.dart';
 
 class ClassHierarchy {
   final Map<ClassElement, _Hierarchy> _map = {};
@@ -49,7 +48,7 @@
     var typeSystem = library.typeSystem;
     var interfacesMerger = InterfacesMerger(typeSystem);
 
-    void append(InterfaceType type) {
+    void append(InterfaceType? type) {
       if (type == null) {
         return;
       }
@@ -59,8 +58,10 @@
       var substitution = Substitution.fromInterfaceType(type);
       var rawInterfaces = implementedInterfaces(type.element);
       for (var rawInterface in rawInterfaces) {
-        var newInterface = substitution.substituteType(rawInterface);
-        newInterface = library.toLegacyTypeIfOptOut(newInterface);
+        var newInterface =
+            substitution.substituteType(rawInterface) as InterfaceType;
+        newInterface =
+            library.toLegacyTypeIfOptOut(newInterface) as InterfaceType;
         interfacesMerger.add(newInterface);
       }
     }
@@ -79,8 +80,9 @@
     var errors = <ClassHierarchyError>[];
     var interfaces = <InterfaceType>[];
     for (var collector in interfacesMerger._map.values) {
-      if (collector._error != null) {
-        errors.add(collector._error);
+      var error = collector._error;
+      if (error != null) {
+        errors.add(error);
       }
       interfaces.add(collector.type);
     }
@@ -131,7 +133,7 @@
     classResult.update(type);
   }
 
-  void addWithSupertypes(InterfaceType type) {
+  void addWithSupertypes(InterfaceType? type) {
     if (type != null) {
       for (var superType in type.allSupertypes) {
         add(superType);
@@ -144,14 +146,14 @@
 class _ClassInterfaceType {
   final TypeSystemImpl _typeSystem;
 
-  ClassHierarchyError _error;
+  ClassHierarchyError? _error;
 
-  InterfaceType _singleType;
-  InterfaceType _currentResult;
+  InterfaceType? _singleType;
+  InterfaceType? _currentResult;
 
   _ClassInterfaceType(this._typeSystem);
 
-  InterfaceType get type => _currentResult ?? _singleType;
+  InterfaceType get type => (_currentResult ?? _singleType)!;
 
   void update(InterfaceType type) {
     if (_error != null) {
@@ -166,27 +168,28 @@
         } else if (type == _singleType) {
           return;
         } else {
-          _currentResult = _typeSystem.normalize(_singleType);
+          _currentResult = _typeSystem.normalize(_singleType!) as InterfaceType;
         }
       }
 
       var normType = _typeSystem.normalize(type);
       try {
-        _currentResult = _typeSystem.topMerge(_currentResult, normType);
+        _currentResult =
+            _typeSystem.topMerge(_currentResult!, normType) as InterfaceType;
       } catch (e) {
         _error = IncompatibleInterfacesClassHierarchyError(
-          _currentResult,
+          _currentResult!,
           type,
         );
       }
     } else {
-      var legacyType = _typeSystem.toLegacyType(type);
+      var legacyType = _typeSystem.toLegacyType(type) as InterfaceType;
       if (_currentResult == null) {
         _currentResult = legacyType;
       } else {
         if (legacyType != _currentResult) {
           _error = IncompatibleInterfacesClassHierarchyError(
-            _currentResult,
+            _currentResult!,
             legacyType,
           );
         }
@@ -200,7 +203,7 @@
   List<InterfaceType> interfaces;
 
   _Hierarchy({
-    @required this.errors,
-    @required this.interfaces,
+    required this.errors,
+    required this.interfaces,
   });
 }
diff --git a/pkg/analyzer/lib/src/dart/element/display_string_builder.dart b/pkg/analyzer/lib/src/dart/element/display_string_builder.dart
index 20affb1..c5adcb6 100644
--- a/pkg/analyzer/lib/src/dart/element/display_string_builder.dart
+++ b/pkg/analyzer/lib/src/dart/element/display_string_builder.dart
@@ -10,7 +10,6 @@
 import 'package:analyzer/src/dart/element/type_algebra.dart';
 import 'package:analyzer/src/dart/resolver/variance.dart';
 import 'package:analyzer/src/generated/element_type_provider.dart';
-import 'package:meta/meta.dart';
 
 class ElementDisplayStringBuilder {
   final StringBuffer _buffer = StringBuffer();
@@ -19,8 +18,8 @@
   final bool withNullability;
 
   ElementDisplayStringBuilder({
-    @required this.skipAllDynamicArguments,
-    @required this.withNullability,
+    required this.skipAllDynamicArguments,
+    required this.withNullability,
   });
 
   @override
@@ -29,11 +28,7 @@
   }
 
   void writeAbstractElement(ElementImpl element) {
-    if (element.name != null) {
-      _write(element.name);
-    } else {
-      _write('<unnamed $runtimeType>');
-    }
+    _write(element.name ?? '<unnamed $runtimeType>');
   }
 
   void writeClassElement(ClassElementImpl element) {
@@ -52,8 +47,8 @@
   }
 
   void writeCompilationUnitElement(CompilationUnitElementImpl element) {
-    var path = element.source?.fullName;
-    _write(path ?? '{compilation unit}');
+    var path = element.source.fullName;
+    _write(path);
   }
 
   void writeConstructorElement(ConstructorElement element) {
@@ -97,9 +92,10 @@
 
   void writeExtensionElement(ExtensionElementImpl element) {
     _write('extension ');
-    _write(element.displayName ?? '(unnamed)');
+    _write(element.displayName);
     _writeTypeParameters(element.typeParameters);
-    _writeTypeIfNotNull(' on ', element.extendedType);
+    _write(' on ');
+    _writeType(element.extendedType);
   }
 
   void writeFormalParameter(ParameterElement element) {
@@ -187,9 +183,10 @@
 
     _write(element.displayName);
 
-    if (element.bound != null) {
+    var bound = element.bound;
+    if (bound != null) {
       _write(' extends ');
-      _writeType(element.bound);
+      _writeType(bound);
     }
   }
 
@@ -197,9 +194,10 @@
     _write(type.element.displayName);
     _writeNullability(type.nullabilitySuffix);
 
-    if (type.promotedBound != null) {
+    var promotedBound = type.promotedBound;
+    if (promotedBound != null) {
       _write(' & ');
-      _writeType(type.promotedBound);
+      _writeType(promotedBound);
     }
   }
 
@@ -223,7 +221,7 @@
 
   void _writeFormalParameters(
     List<ParameterElement> parameters, {
-    @required bool forElement,
+    required bool forElement,
   }) {
     _write('(');
 
@@ -299,14 +297,7 @@
     _write('>');
   }
 
-  void _writeTypeIfNotNull(String prefix, DartType type) {
-    if (type != null) {
-      _write(prefix);
-      _writeType(type);
-    }
-  }
-
-  void _writeTypeIfNotObject(String prefix, DartType type) {
+  void _writeTypeIfNotObject(String prefix, DartType? type) {
     if (type != null && !type.isDartCoreObject) {
       _write(prefix);
       _writeType(type);
@@ -344,7 +335,7 @@
 
   void _writeWithoutDelimiters(
     ParameterElement element, {
-    @required bool forElement,
+    required bool forElement,
   }) {
     if (element.isRequiredNamed) {
       _write('required ');
@@ -357,9 +348,12 @@
       _write(element.displayName);
     }
 
-    if (forElement && element.defaultValueCode != null) {
-      _write(' = ');
-      _write(element.defaultValueCode);
+    if (forElement) {
+      var defaultValueCode = element.defaultValueCode;
+      if (defaultValueCode != null) {
+        _write(' = ');
+        _write(defaultValueCode);
+      }
     }
   }
 
@@ -370,7 +364,7 @@
 
     var referencedTypeParameters = <TypeParameterElement>{};
 
-    void collectTypeParameters(DartType type) {
+    void collectTypeParameters(DartType? type) {
       if (type is TypeParameterType) {
         referencedTypeParameters.add(type.element);
       } else if (type is FunctionType) {
@@ -417,7 +411,7 @@
           .freshTypeParameterCreated(newTypeParameter, typeParameter);
     }
 
-    return replaceTypeParameters(type, newTypeParameters);
+    return replaceTypeParameters(type as FunctionTypeImpl, newTypeParameters);
   }
 }
 
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 146592c..54a847a 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -45,23 +45,22 @@
 import 'package:analyzer/src/summary2/reference.dart';
 import 'package:analyzer/src/task/inference_error.dart';
 import 'package:analyzer/src/util/comment.dart';
-import 'package:meta/meta.dart';
 
 /// A concrete implementation of a [ClassElement].
-abstract class AbstractClassElementImpl extends ElementImpl
+abstract class AbstractClassElementImpl extends _ExistingElementImpl
     implements ClassElement {
   /// The type defined by the class.
-  InterfaceType _thisType;
+  InterfaceType? _thisType;
 
   /// A list containing all of the accessors (getters and setters) contained in
   /// this class.
-  List<PropertyAccessorElement> _accessors;
+  List<PropertyAccessorElement>? _accessors;
 
   /// A list containing all of the fields contained in this class.
-  List<FieldElement> _fields;
+  List<FieldElement>? _fields;
 
   /// A list containing all of the methods contained in this class.
-  List<MethodElement> _methods;
+  List<MethodElement>? _methods;
 
   /// Initialize a newly created class element to have the given [name] at the
   /// given [offset] in the file that contains the declaration of this element.
@@ -93,6 +92,11 @@
   String get displayName => name;
 
   @override
+  CompilationUnitElementImpl get enclosingElement {
+    return _enclosingElement as CompilationUnitElementImpl;
+  }
+
+  @override
   List<FieldElement> get fields => _fields ?? const <FieldElement>[];
 
   /// Set the fields contained in this class to the given [fields].
@@ -131,14 +135,14 @@
         nullabilitySuffix: _noneOrStarSuffix,
       );
     }
-    return _thisType;
+    return _thisType!;
   }
 
   @override
-  T accept<T>(ElementVisitor<T> visitor) => visitor.visitClassElement(this);
+  T? accept<T>(ElementVisitor<T> visitor) => visitor.visitClassElement(this);
 
   @override
-  FieldElement getField(String name) {
+  FieldElement? getField(String name) {
     for (FieldElement fieldElement in fields) {
       if (name == fieldElement.name) {
         return fieldElement;
@@ -148,7 +152,7 @@
   }
 
   @override
-  PropertyAccessorElement getGetter(String getterName) {
+  PropertyAccessorElement? getGetter(String getterName) {
     int length = accessors.length;
     for (int i = 0; i < length; i++) {
       PropertyAccessorElement accessor = accessors[i];
@@ -160,7 +164,7 @@
   }
 
   @override
-  MethodElement getMethod(String methodName) {
+  MethodElement? getMethod(String methodName) {
     int length = methods.length;
     for (int i = 0; i < length; i++) {
       MethodElement method = methods[i];
@@ -172,14 +176,14 @@
   }
 
   @override
-  PropertyAccessorElement getSetter(String setterName) {
+  PropertyAccessorElement? getSetter(String setterName) {
     return getSetterFromAccessors(setterName, accessors);
   }
 
   @override
   InterfaceType instantiate({
-    @required List<DartType> typeArguments,
-    @required NullabilitySuffix nullabilitySuffix,
+    required List<DartType> typeArguments,
+    required NullabilitySuffix nullabilitySuffix,
   }) {
     if (typeArguments.length != typeParameters.length) {
       var ta = 'typeArguments.length (${typeArguments.length})';
@@ -194,20 +198,20 @@
   }
 
   @override
-  MethodElement lookUpConcreteMethod(
+  MethodElement? lookUpConcreteMethod(
           String methodName, LibraryElement library) =>
       _first(_implementationsOfMethod(methodName).where(
           (MethodElement method) =>
               !method.isAbstract && method.isAccessibleIn(library)));
 
   @override
-  PropertyAccessorElement lookUpGetter(
+  PropertyAccessorElement? lookUpGetter(
           String getterName, LibraryElement library) =>
       _first(_implementationsOfGetter(getterName).where(
           (PropertyAccessorElement getter) => getter.isAccessibleIn(library)));
 
   @override
-  PropertyAccessorElement lookUpInheritedConcreteGetter(
+  PropertyAccessorElement? lookUpInheritedConcreteGetter(
           String getterName, LibraryElement library) =>
       _first(_implementationsOfGetter(getterName).where(
           (PropertyAccessorElement getter) =>
@@ -215,7 +219,7 @@
               getter.isAccessibleIn(library) &&
               getter.enclosingElement != this));
 
-  ExecutableElement lookUpInheritedConcreteMember(
+  ExecutableElement? lookUpInheritedConcreteMember(
       String name, LibraryElement library) {
     if (name.endsWith('=')) {
       return lookUpInheritedConcreteSetter(name, library);
@@ -226,7 +230,7 @@
   }
 
   @override
-  MethodElement lookUpInheritedConcreteMethod(
+  MethodElement? lookUpInheritedConcreteMethod(
           String methodName, LibraryElement library) =>
       _first(_implementationsOfMethod(methodName).where(
           (MethodElement method) =>
@@ -235,7 +239,7 @@
               method.enclosingElement != this));
 
   @override
-  PropertyAccessorElement lookUpInheritedConcreteSetter(
+  PropertyAccessorElement? lookUpInheritedConcreteSetter(
           String setterName, LibraryElement library) =>
       _first(_implementationsOfSetter(setterName).where(
           (PropertyAccessorElement setter) =>
@@ -244,7 +248,7 @@
               setter.enclosingElement != this));
 
   @override
-  MethodElement lookUpInheritedMethod(
+  MethodElement? lookUpInheritedMethod(
           String methodName, LibraryElement library) =>
       _first(_implementationsOfMethod(methodName).where(
           (MethodElement method) =>
@@ -252,12 +256,12 @@
               method.enclosingElement != this));
 
   @override
-  MethodElement lookUpMethod(String methodName, LibraryElement library) =>
+  MethodElement? lookUpMethod(String methodName, LibraryElement library) =>
       _first(_implementationsOfMethod(methodName)
           .where((MethodElement method) => method.isAccessibleIn(library)));
 
   @override
-  PropertyAccessorElement lookUpSetter(
+  PropertyAccessorElement? lookUpSetter(
           String setterName, LibraryElement library) =>
       _first(_implementationsOfSetter(setterName).where(
           (PropertyAccessorElement setter) => setter.isAccessibleIn(library)));
@@ -267,7 +271,7 @@
   /// This method should be used only for error recovery during analysis,
   /// when instance access to a static class member, defined in this class,
   /// or a superclass.
-  PropertyAccessorElement lookupStaticGetter(
+  PropertyAccessorElement? lookupStaticGetter(
       String name, LibraryElement library) {
     return _first(_implementationsOfGetter(name).where((element) {
       return element.isStatic && element.isAccessibleIn(library);
@@ -279,7 +283,7 @@
   /// This method should be used only for error recovery during analysis,
   /// when instance access to a static class member, defined in this class,
   /// or a superclass.
-  MethodElement lookupStaticMethod(String name, LibraryElement library) {
+  MethodElement? lookupStaticMethod(String name, LibraryElement library) {
     return _first(_implementationsOfMethod(name).where((element) {
       return element.isStatic && element.isAccessibleIn(library);
     }));
@@ -290,7 +294,7 @@
   /// This method should be used only for error recovery during analysis,
   /// when instance access to a static class member, defined in this class,
   /// or a superclass.
-  PropertyAccessorElement lookupStaticSetter(
+  PropertyAccessorElement? lookupStaticSetter(
       String name, LibraryElement library) {
     return _first(_implementationsOfSetter(name).where((element) {
       return element.isStatic && element.isAccessibleIn(library);
@@ -317,15 +321,15 @@
   /// Object contains a definition of the getter it will occur last.
   Iterable<PropertyAccessorElement> _implementationsOfGetter(
       String getterName) sync* {
-    ClassElement classElement = this;
+    ClassElement? classElement = this;
     HashSet<ClassElement> visitedClasses = HashSet<ClassElement>();
     while (classElement != null && visitedClasses.add(classElement)) {
-      PropertyAccessorElement getter = classElement.getGetter(getterName);
+      var getter = classElement.getGetter(getterName);
       if (getter != null) {
         yield getter;
       }
       for (InterfaceType mixin in classElement.mixins.reversed) {
-        getter = mixin.element?.getGetter(getterName);
+        getter = mixin.element.getGetter(getterName);
         if (getter != null) {
           yield getter;
         }
@@ -346,15 +350,15 @@
   /// this class contains a definition of the method it will occur first, if
   /// Object contains a definition of the method it will occur last.
   Iterable<MethodElement> _implementationsOfMethod(String methodName) sync* {
-    ClassElement classElement = this;
+    ClassElement? classElement = this;
     HashSet<ClassElement> visitedClasses = HashSet<ClassElement>();
     while (classElement != null && visitedClasses.add(classElement)) {
-      MethodElement method = classElement.getMethod(methodName);
+      var method = classElement.getMethod(methodName);
       if (method != null) {
         yield method;
       }
       for (InterfaceType mixin in classElement.mixins.reversed) {
-        method = mixin.element?.getMethod(methodName);
+        method = mixin.element.getMethod(methodName);
         if (method != null) {
           yield method;
         }
@@ -376,15 +380,15 @@
   /// Object contains a definition of the setter it will occur last.
   Iterable<PropertyAccessorElement> _implementationsOfSetter(
       String setterName) sync* {
-    ClassElement classElement = this;
+    ClassElement? classElement = this;
     HashSet<ClassElement> visitedClasses = HashSet<ClassElement>();
     while (classElement != null && visitedClasses.add(classElement)) {
-      PropertyAccessorElement setter = classElement.getSetter(setterName);
+      var setter = classElement.getSetter(setterName);
       if (setter != null) {
         yield setter;
       }
       for (InterfaceType mixin in classElement.mixins.reversed) {
-        setter = mixin.element?.getSetter(setterName);
+        setter = mixin.element.getSetter(setterName);
         if (setter != null) {
           yield setter;
         }
@@ -393,7 +397,7 @@
     }
   }
 
-  static PropertyAccessorElement getSetterFromAccessors(
+  static PropertyAccessorElement? getSetterFromAccessors(
       String setterName, List<PropertyAccessorElement> accessors) {
     // TODO (jwren) revisit- should we append '=' here or require clients to
     // include it?
@@ -411,7 +415,7 @@
 
   /// Return the first element from the given [iterable], or `null` if the
   /// iterable is empty.
-  static E _first<E>(Iterable<E> iterable) {
+  static E? _first<E>(Iterable<E> iterable) {
     if (iterable.isEmpty) {
       return null;
     }
@@ -423,15 +427,15 @@
 class ClassElementImpl extends AbstractClassElementImpl
     with TypeParameterizedElementMixin {
   /// The superclass of the class, or `null` for [Object].
-  InterfaceType _supertype;
+  InterfaceType? _supertype;
 
   /// A list containing all of the mixins that are applied to the class being
   /// extended in order to derive the superclass of this class.
-  List<InterfaceType> _mixins;
+  List<InterfaceType>? _mixins;
 
   /// A list containing all of the interfaces that are implemented by this
   /// class.
-  List<InterfaceType> _interfaces;
+  List<InterfaceType>? _interfaces;
 
   /// For classes which are not mixin applications, a list containing all of the
   /// constructors contained in this class, or `null` if the list of
@@ -440,14 +444,14 @@
   /// For classes which are mixin applications, the list of constructors is
   /// computed on the fly by the [constructors] getter, and this field is
   /// `null`.
-  List<ConstructorElement> _constructors;
+  List<ConstructorElement>? _constructors;
 
   /// A flag indicating whether the types associated with the instance members
   /// of this class have been inferred.
   bool hasBeenInferred = false;
 
   /// This callback is set during mixins inference to handle reentrant calls.
-  List<InterfaceType> Function(ClassElementImpl) linkedMixinInferenceCallback;
+  List<InterfaceType>? Function(ClassElementImpl)? linkedMixinInferenceCallback;
 
   /// TODO(scheglov) implement as modifier
   bool _isSimplyBounded = true;
@@ -464,18 +468,18 @@
     } else if (linkedNode is ClassTypeAlias) {
       linkedNode.name.staticElement = this;
     }
-    hasBeenInferred = !linkedContext.isLinking;
+    hasBeenInferred = !linkedContext!.isLinking;
   }
 
   @override
   List<PropertyAccessorElement> get accessors {
-    if (_accessors != null) return _accessors;
+    if (_accessors != null) return _accessors!;
 
     if (linkedNode != null) {
       if (linkedNode is ClassOrMixinDeclaration) {
         _createPropertiesAndAccessors();
         assert(_accessors != null);
-        return _accessors;
+        return _accessors!;
       } else {
         return _accessors = const [];
       }
@@ -491,17 +495,17 @@
   }
 
   @override
-  int get codeLength {
+  int? get codeLength {
     if (linkedNode != null) {
-      return linkedContext.getCodeLength(linkedNode);
+      return linkedContext!.getCodeLength(linkedNode!);
     }
     return super.codeLength;
   }
 
   @override
-  int get codeOffset {
+  int? get codeOffset {
     if (linkedNode != null) {
-      return linkedContext.getCodeOffset(linkedNode);
+      return linkedContext!.getCodeOffset(linkedNode!);
     }
     return super.codeOffset;
   }
@@ -509,7 +513,7 @@
   @override
   List<ConstructorElement> get constructors {
     if (_constructors != null) {
-      return _constructors;
+      return _constructors!;
     }
 
     if (isMixinApplication) {
@@ -517,10 +521,10 @@
     }
 
     if (linkedNode != null) {
-      linkedContext.applyResolution(linkedNode);
-      var context = enclosingUnit.linkedContext;
-      var containerRef = reference.getChild('@constructor');
-      _constructors = context.getConstructors(linkedNode).map((node) {
+      linkedContext!.applyResolution(linkedNode!);
+      var context = enclosingUnit.linkedContext!;
+      var containerRef = reference!.getChild('@constructor');
+      _constructors = context.getConstructors(linkedNode!).map((node) {
         var name = node.name?.name ?? '';
         var reference = containerRef.getChild(name);
         var element = node.declaredElement;
@@ -528,7 +532,7 @@
         return element;
       }).toList();
 
-      if (_constructors.isEmpty) {
+      if (_constructors!.isEmpty) {
         return _constructors = [
           ConstructorElementImpl.forLinkedNode(
             this,
@@ -537,19 +541,20 @@
           )
             ..isSynthetic = true
             ..name = ''
-            ..nameOffset = -1,
+            ..nameOffset = -1
+            .._constantInitializers = const [],
         ];
       }
     }
 
-    if (_constructors.isEmpty) {
+    if (_constructors!.isEmpty) {
       var constructor = ConstructorElementImpl('', -1);
       constructor.isSynthetic = true;
       constructor.enclosingElement = this;
       _constructors = <ConstructorElement>[constructor];
     }
 
-    return _constructors;
+    return _constructors!;
   }
 
   /// Set the constructors contained in this class to the given [constructors].
@@ -564,10 +569,10 @@
   }
 
   @override
-  String get documentationComment {
+  String? get documentationComment {
     if (linkedNode != null) {
-      var context = enclosingUnit.linkedContext;
-      var comment = context.getDocumentationComment(linkedNode);
+      var context = enclosingUnit.linkedContext!;
+      var comment = context.getDocumentationComment(linkedNode!);
       return getCommentNodeRawText(comment);
     }
     return super.documentationComment;
@@ -575,14 +580,14 @@
 
   @override
   List<FieldElement> get fields {
-    if (_fields != null) return _fields;
+    if (_fields != null) return _fields!;
 
     if (linkedNode != null) {
       if (linkedNode is ClassOrMixinDeclaration) {
-        linkedContext.applyResolution(linkedNode);
+        linkedContext!.applyResolution(linkedNode!);
         _createPropertiesAndAccessors();
         assert(_fields != null);
-        return _fields;
+        return _fields!;
       } else {
         _fields = const [];
       }
@@ -614,12 +619,9 @@
           classesToVisit.add(mixinElement);
         }
         // check super
-        InterfaceType supertype = currentElement.supertype;
+        InterfaceType? supertype = currentElement.supertype;
         if (supertype != null) {
-          ClassElement superElement = supertype.element;
-          if (superElement != null) {
-            classesToVisit.add(superElement);
-          }
+          classesToVisit.add(supertype.element);
         }
       }
     }
@@ -631,9 +633,9 @@
   /// from the one declared in class `Object`, as per the Dart Language
   /// Specification (section 10.4).
   bool get hasNoSuchMethod {
-    MethodElement method = lookUpConcreteMethod(
+    MethodElement? method = lookUpConcreteMethod(
         FunctionElement.NO_SUCH_METHOD_METHOD_NAME, library);
-    var definingClass = method?.enclosingElement as ClassElement;
+    var definingClass = method?.enclosingElement as ClassElement?;
     return definingClass != null && !definingClass.isDartCoreObject;
   }
 
@@ -662,13 +664,13 @@
 
   List<InterfaceType> get interfacesInternal {
     if (_interfaces != null) {
-      return _interfaces;
+      return _interfaces!;
     }
 
     if (linkedNode != null) {
-      linkedContext.applyResolution(linkedNode);
-      var context = enclosingUnit.linkedContext;
-      var implementsClause = context.getImplementsClause(linkedNode);
+      linkedContext!.applyResolution(linkedNode!);
+      var context = enclosingUnit.linkedContext!;
+      var implementsClause = context.getImplementsClause(linkedNode!);
       if (implementsClause != null) {
         return _interfaces = implementsClause.interfaces
             .map((node) => node.type)
@@ -685,7 +687,7 @@
   @override
   bool get isAbstract {
     if (linkedNode != null) {
-      return enclosingUnit.linkedContext.isAbstract(linkedNode);
+      return enclosingUnit.linkedContext!.isAbstract(linkedNode!);
     }
     return hasModifier(Modifier.ABSTRACT);
   }
@@ -715,7 +717,7 @@
   @override
   bool get isSimplyBounded {
     if (linkedNode != null) {
-      linkedContext.applyResolution(linkedNode);
+      linkedContext!.applyResolution(linkedNode!);
     }
     return _isSimplyBounded;
   }
@@ -727,7 +729,8 @@
 
   @override
   bool get isValidMixin {
-    if (!supertype.isDartCoreObject) {
+    var supertype = this.supertype;
+    if (supertype != null && !supertype.isDartCoreObject) {
       return false;
     }
     for (ConstructorElement constructor in constructors) {
@@ -744,20 +747,20 @@
   @override
   List<MethodElement> get methods {
     if (_methods != null) {
-      return _methods;
+      return _methods!;
     }
 
     if (linkedNode != null) {
-      linkedContext.applyResolution(linkedNode);
-      var context = enclosingUnit.linkedContext;
-      var containerRef = reference.getChild('@method');
+      linkedContext!.applyResolution(linkedNode!);
+      var context = enclosingUnit.linkedContext!;
+      var containerRef = reference!.getChild('@method');
       return _methods = context
-          .getMethods(linkedNode)
+          .getMethods(linkedNode as CompilationUnitMember)
           .where((node) => node.propertyKeyword == null)
           .map((node) {
         var name = node.name.name;
         var reference = containerRef.getChild(name);
-        var element = node.declaredElement as MethodElement;
+        var element = node.declaredElement as MethodElement?;
         element ??= MethodElementImpl.forLinkedNode(this, reference, node);
         return element;
       }).toList();
@@ -777,17 +780,17 @@
   @override
   List<InterfaceType> get mixins {
     if (linkedMixinInferenceCallback != null) {
-      _mixins = linkedMixinInferenceCallback(this);
+      _mixins = linkedMixinInferenceCallback!(this);
     }
 
     if (_mixins != null) {
-      return _mixins;
+      return _mixins!;
     }
 
     if (linkedNode != null) {
-      linkedContext.applyResolution(linkedNode);
-      var context = enclosingUnit.linkedContext;
-      var withClause = context.getWithClause(linkedNode);
+      linkedContext!.applyResolution(linkedNode!);
+      var context = enclosingUnit.linkedContext!;
+      var withClause = context.getWithClause(linkedNode!);
       if (withClause != null) {
         return _mixins = withClause.mixinTypes
             .map((node) => node.type)
@@ -808,15 +811,15 @@
   @override
   String get name {
     if (linkedNode != null) {
-      return reference.name;
+      return reference!.name;
     }
-    return super.name;
+    return super.name!;
   }
 
   @override
   int get nameOffset {
     if (linkedNode != null) {
-      return enclosingUnit.linkedContext.getNameOffset(linkedNode);
+      return enclosingUnit.linkedContext!.getNameOffset(linkedNode!);
     }
     return super.nameOffset;
   }
@@ -827,18 +830,18 @@
   List<String> get superInvokedNames => const <String>[];
 
   @override
-  InterfaceType get supertype {
-    if (_supertype != null) return _supertype;
+  InterfaceType? get supertype {
+    if (_supertype != null) return _supertype!;
 
     if (hasModifier(Modifier.DART_CORE_OBJECT)) {
       return null;
     }
 
     if (linkedNode != null) {
-      linkedContext.applyResolution(linkedNode);
-      var type = linkedContext.getSuperclass(linkedNode)?.type;
+      linkedContext!.applyResolution(linkedNode!);
+      var type = linkedContext!.getSuperclass(linkedNode!)?.type;
       if (_isInterfaceTypeClass(type)) {
-        return _supertype = type;
+        return _supertype = type as InterfaceType;
       }
       if (library.isDartCore && name == 'Object') {
         setModifier(Modifier.DART_CORE_OBJECT, true);
@@ -849,7 +852,7 @@
     return _supertype;
   }
 
-  set supertype(InterfaceType supertype) {
+  set supertype(InterfaceType? supertype) {
     _supertype = supertype;
   }
 
@@ -863,10 +866,9 @@
   }
 
   @override
-  ConstructorElement get unnamedConstructor {
+  ConstructorElement? get unnamedConstructor {
     for (ConstructorElement element in constructors) {
-      String name = element.displayName;
-      if (name == null || name.isEmpty) {
+      if (element.name.isEmpty) {
         return element;
       }
     }
@@ -879,7 +881,7 @@
   }
 
   @override
-  ConstructorElement getNamedConstructor(String name) =>
+  ConstructorElement? getNamedConstructor(String name) =>
       getNamedConstructorFromList(name, constructors);
 
   @override
@@ -895,7 +897,7 @@
   /// application classes which have been visited on the way to reaching this
   /// one (this is used to detect cycles).
   List<ConstructorElement> _computeMixinAppConstructors(
-      [List<ClassElementImpl> visitedClasses]) {
+      [List<ClassElementImpl>? visitedClasses]) {
     if (supertype == null) {
       // Shouldn't ever happen, since the only classes with no supertype are
       // Object and mixins, and they aren't a mixin application. But for
@@ -904,7 +906,7 @@
       return <ConstructorElement>[];
     }
 
-    var superElement = supertype.element as ClassElementImpl;
+    var superElement = supertype!.element as ClassElementImpl;
 
     // First get the list of constructors of the superclass which need to be
     // forwarded to this class.
@@ -940,11 +942,11 @@
     var superClassParameters = superElement.typeParameters;
     List<DartType> argumentTypes = List<DartType>.filled(
         superClassParameters.length, DynamicTypeImpl.instance);
-    for (int i = 0; i < supertype.typeArguments.length; i++) {
+    for (int i = 0; i < supertype!.typeArguments.length; i++) {
       if (i >= argumentTypes.length) {
         break;
       }
-      argumentTypes[i] = supertype.typeArguments[i];
+      argumentTypes[i] = supertype!.typeArguments[i];
     }
     var substitution =
         Substitution.fromPairs(superClassParameters, argumentTypes);
@@ -956,13 +958,14 @@
     // substituting type parameters as appropriate.
     return constructorsToForward
         .map((ConstructorElement superclassConstructor) {
-      var containerRef = reference.getChild('@constructor');
+      var containerRef = reference!.getChild('@constructor');
       var name = superclassConstructor.name;
       var implicitConstructor = ConstructorElementImpl.forLinkedNode(
           this, containerRef.getChild(name), null);
       implicitConstructor.isSynthetic = true;
       implicitConstructor.name = name;
       implicitConstructor.nameOffset = -1;
+      implicitConstructor._constantInitializers = const [];
       implicitConstructor.redirectedConstructor = superclassConstructor;
       var hasMixinWithInstanceVariables = mixins.any(typeHasInstanceVariables);
       implicitConstructor.isConst =
@@ -970,8 +973,7 @@
       List<ParameterElement> superParameters = superclassConstructor.parameters;
       int count = superParameters.length;
       if (count > 0) {
-        List<ParameterElement> implicitParameters =
-            List<ParameterElement>.filled(count, null);
+        var implicitParameters = <ParameterElement>[];
         for (int i = 0; i < count; i++) {
           ParameterElement superParameter = superParameters[i];
           ParameterElementImpl implicitParameter;
@@ -989,7 +991,7 @@
           implicitParameter.isSynthetic = true;
           implicitParameter.type =
               substitution.substituteType(superParameter.type);
-          implicitParameters[i] = implicitParameter;
+          implicitParameters.add(implicitParameter);
         }
         implicitConstructor.parameters = implicitParameters;
       }
@@ -1006,21 +1008,21 @@
     var accessorList = <PropertyAccessorElement>[];
     var fieldList = <FieldElement>[];
 
-    var fields = context.getFields(linkedNode);
+    var fields = context!.getFields(linkedNode as CompilationUnitMember);
     for (var field in fields) {
       var name = field.name.name;
-      var fieldElement = field.declaredElement as FieldElementImpl;
+      var fieldElement = field.declaredElement as FieldElementImpl?;
       fieldElement ??= FieldElementImpl.forLinkedNodeFactory(
-          this, reference.getChild('@field').getChild(name), field);
+          this, reference!.getChild('@field').getChild(name), field);
       fieldList.add(fieldElement);
 
-      accessorList.add(fieldElement.getter);
+      accessorList.add(fieldElement.getter!);
       if (fieldElement.setter != null) {
-        accessorList.add(fieldElement.setter);
+        accessorList.add(fieldElement.setter!);
       }
     }
 
-    var methods = context.getMethods(linkedNode);
+    var methods = context.getMethods(linkedNode as CompilationUnitMember);
     for (var method in methods) {
       var isGetter = method.isGetter;
       var isSetter = method.isSetter;
@@ -1028,17 +1030,17 @@
 
       var name = method.name.name;
       var containerRef = isGetter
-          ? reference.getChild('@getter')
-          : reference.getChild('@setter');
+          ? reference!.getChild('@getter')
+          : reference!.getChild('@setter');
 
       var accessorElement =
-          method.declaredElement as PropertyAccessorElementImpl;
+          method.declaredElement as PropertyAccessorElementImpl?;
       accessorElement ??= PropertyAccessorElementImpl.forLinkedNode(
           this, containerRef.getChild(name), method);
       accessorList.add(accessorElement);
 
-      var fieldRef = reference.getChild('@field').getChild(name);
-      FieldElementImpl field = fieldRef.element;
+      var fieldRef = reference!.getChild('@field').getChild(name);
+      var field = fieldRef.element as FieldElementImpl?;
       if (field == null) {
         field = FieldElementImpl(name, -1);
         fieldRef.element = field;
@@ -1065,7 +1067,7 @@
 
   /// Return `true` if the given [type] is an [InterfaceType] that can be used
   /// as a class.
-  bool _isInterfaceTypeClass(DartType type) {
+  bool _isInterfaceTypeClass(DartType? type) {
     if (type is InterfaceType) {
       var element = type.element;
       if (element.isEnum || element.isMixin) {
@@ -1100,11 +1102,10 @@
     return false;
   }
 
-  static ConstructorElement getNamedConstructorFromList(
+  static ConstructorElement? getNamedConstructorFromList(
       String name, List<ConstructorElement> constructors) {
     for (ConstructorElement element in constructors) {
-      String elementName = element.name;
-      if (elementName != null && elementName == name) {
+      if (element.name == name) {
         return element;
       }
     }
@@ -1116,14 +1117,14 @@
 class CompilationUnitElementImpl extends UriReferencedElementImpl
     implements CompilationUnitElement {
   @override
-  final LinkedUnitContext linkedContext;
+  final LinkedUnitContext? linkedContext;
 
   /// The source that corresponds to this compilation unit.
   @override
-  Source source;
+  late Source source;
 
   @override
-  LineInfo lineInfo;
+  LineInfo? lineInfo;
 
   /// The source of the library containing this compilation unit.
   ///
@@ -1131,40 +1132,40 @@
   /// except that it does not require the containing [LibraryElement] to be
   /// computed.
   @override
-  Source librarySource;
+  late Source librarySource;
 
   /// A list containing all of the top-level accessors (getters and setters)
   /// contained in this compilation unit.
-  List<PropertyAccessorElement> _accessors;
+  List<PropertyAccessorElement>? _accessors;
 
   /// A list containing all of the enums contained in this compilation unit.
-  List<ClassElement> _enums;
+  List<ClassElement>? _enums;
 
   /// A list containing all of the extensions contained in this compilation
   /// unit.
-  List<ExtensionElement> _extensions;
+  List<ExtensionElement>? _extensions;
 
   /// A list containing all of the top-level functions contained in this
   /// compilation unit.
-  List<FunctionElement> _functions;
+  List<FunctionElement>? _functions;
 
   /// A list containing all of the mixins contained in this compilation unit.
-  List<ClassElement> _mixins;
+  List<ClassElement>? _mixins;
 
   /// A list containing all of the function type aliases contained in this
   /// compilation unit.
   @Deprecated('Use typeAliases instead')
-  List<FunctionTypeAliasElement> _functionTypeAliases;
+  List<FunctionTypeAliasElement>? _functionTypeAliases;
 
   /// A list containing all of the type aliases contained in this compilation
   /// unit.
-  List<TypeAliasElement> _typeAliases;
+  List<TypeAliasElement>? _typeAliases;
 
   /// A list containing all of the classes contained in this compilation unit.
-  List<ClassElement> _types;
+  List<ClassElement>? _types;
 
   /// A list containing all of the variables contained in this compilation unit.
-  List<TopLevelVariableElement> _variables;
+  List<TopLevelVariableElement>? _variables;
 
   /// Initialize a newly created compilation unit element to have the given
   /// [name].
@@ -1181,12 +1182,12 @@
 
   @override
   List<PropertyAccessorElement> get accessors {
-    if (_accessors != null) return _accessors;
+    if (_accessors != null) return _accessors!;
 
     if (linkedNode != null) {
       _createPropertiesAndAccessors(this);
       assert(_accessors != null);
-      return _accessors;
+      return _accessors!;
     }
 
     return _accessors ?? const <PropertyAccessorElement>[];
@@ -1204,17 +1205,17 @@
   @override
   int get codeLength {
     if (linkedNode != null) {
-      return linkedContext.getCodeLength(linkedNode);
+      return linkedContext!.getCodeLength(linkedNode!);
     }
-    return super.codeLength;
+    return super.codeLength!;
   }
 
   @override
   int get codeOffset {
     if (linkedNode != null) {
-      return linkedContext.getCodeOffset(linkedNode);
+      return linkedContext!.getCodeOffset(linkedNode!);
     }
-    return super.codeOffset;
+    return super.codeOffset!;
   }
 
   @override
@@ -1228,11 +1229,11 @@
 
   @override
   List<ClassElement> get enums {
-    if (_enums != null) return _enums;
+    if (_enums != null) return _enums!;
 
     if (linkedNode != null) {
-      var containerRef = reference.getChild('@enum');
-      CompilationUnit linkedNode = this.linkedNode;
+      var containerRef = reference!.getChild('@enum');
+      var linkedNode = this.linkedNode as CompilationUnit;
       _enums = linkedNode.declarations.whereType<EnumDeclaration>().map((node) {
         var name = node.name.name;
         var reference = containerRef.getChild(name);
@@ -1256,16 +1257,17 @@
   @override
   List<ExtensionElement> get extensions {
     if (_extensions != null) {
-      return _extensions;
+      /// TODO(migration): use empty sentinel value instead of null
+      return _extensions!;
     }
 
     if (linkedNode != null) {
-      CompilationUnit linkedNode = this.linkedNode;
-      var containerRef = reference.getChild('@extension');
+      var linkedNode = this.linkedNode as CompilationUnit;
+      var containerRef = reference!.getChild('@extension');
       _extensions = <ExtensionElement>[];
       var nextUnnamedExtensionId = 0;
       for (var node in linkedNode.declarations) {
-        if (node is ExtensionDeclaration) {
+        if (node is ExtensionDeclarationImpl) {
           var nameIdentifier = node.name;
           var refName = nameIdentifier != null
               ? nameIdentifier.name
@@ -1273,10 +1275,10 @@
           var reference = containerRef.getChild(refName);
           var element = node.declaredElement;
           element ??= ExtensionElementImpl.forLinkedNode(this, reference, node);
-          _extensions.add(element);
+          _extensions!.add(element);
         }
       }
-      return _extensions;
+      return _extensions!;
     }
     return _extensions ?? const <ExtensionElement>[];
   }
@@ -1292,17 +1294,17 @@
 
   @override
   List<FunctionElement> get functions {
-    if (_functions != null) return _functions;
+    if (_functions != null) return _functions!;
 
     if (linkedNode != null) {
-      var containerRef = reference.getChild('@function');
-      return _functions = linkedContext.unit_withDeclarations.declarations
+      var containerRef = reference!.getChild('@function');
+      return _functions = linkedContext!.unit_withDeclarations.declarations
           .whereType<FunctionDeclaration>()
           .where((node) => !node.isGetter && !node.isSetter)
           .map((node) {
         var name = node.name.name;
         var reference = containerRef.getChild(name);
-        var element = node.declaredElement as FunctionElement;
+        var element = node.declaredElement as FunctionElement?;
         element ??= FunctionElementImpl.forLinkedNode(this, reference, node);
         return element;
       }).toList();
@@ -1346,7 +1348,7 @@
   @override
   bool get isSynthetic {
     if (linkedContext != null) {
-      return linkedContext.isSynthetic;
+      return linkedContext!.isSynthetic;
     }
     return super.isSynthetic;
   }
@@ -1356,16 +1358,16 @@
 
   @override
   List<ClassElement> get mixins {
-    if (_mixins != null) return _mixins;
+    if (_mixins != null) return _mixins!;
 
     if (linkedNode != null) {
-      CompilationUnit linkedNode = this.linkedNode;
-      var containerRef = reference.getChild('@mixin');
+      var linkedNode = this.linkedNode as CompilationUnit;
+      var containerRef = reference!.getChild('@mixin');
       var declarations = linkedNode.declarations;
       return _mixins = declarations.whereType<MixinDeclaration>().map((node) {
         var name = node.name.name;
         var reference = containerRef.getChild(name);
-        var element = node.declaredElement as MixinElementImpl;
+        var element = node.declaredElement as MixinElementImpl?;
         element ??= MixinElementImpl.forLinkedNode(this, reference, node);
         return element;
       }).toList();
@@ -1376,20 +1378,20 @@
 
   /// Set the mixins contained in this compilation unit to the given [mixins].
   set mixins(List<ClassElement> mixins) {
-    for (MixinElementImpl type in mixins) {
-      type.enclosingElement = this;
+    for (var type in mixins) {
+      (type as MixinElementImpl).enclosingElement = this;
     }
     _mixins = mixins;
   }
 
   @override
   List<TopLevelVariableElement> get topLevelVariables {
-    if (_variables != null) return _variables;
+    if (_variables != null) return _variables!;
 
     if (linkedNode != null) {
       _createPropertiesAndAccessors(this);
       assert(_variables != null);
-      return _variables;
+      return _variables!;
     }
 
     return _variables ?? const <TopLevelVariableElement>[];
@@ -1406,12 +1408,12 @@
 
   @override
   List<TypeAliasElement> get typeAliases {
-    if (_typeAliases != null) return _typeAliases;
+    if (_typeAliases != null) return _typeAliases!;
 
     if (linkedNode != null) {
-      var containerRef = reference.getChild('@typeAlias');
+      var containerRef = reference!.getChild('@typeAlias');
       _typeAliases = <TypeAliasElement>[];
-      for (var node in linkedContext.unit_withDeclarations.declarations) {
+      for (var node in linkedContext!.unit_withDeclarations.declarations) {
         String name;
         if (node is FunctionTypeAlias) {
           name = node.name.name;
@@ -1422,10 +1424,10 @@
         }
 
         var reference = containerRef.getChild(name);
-        var element = node.declaredElement as TypeAliasElement;
-        element ??=
-            TypeAliasElementImpl.forLinkedNodeFactory(this, reference, node);
-        _typeAliases.add(element);
+        var element = node.declaredElement as TypeAliasElement?;
+        element ??= TypeAliasElementImpl.forLinkedNodeFactory(
+            this, reference, node as TypeAlias);
+        _typeAliases!.add(element);
       }
     }
 
@@ -1434,38 +1436,38 @@
 
   /// Set the type aliases contained in this compilation unit to [typeAliases].
   set typeAliases(List<TypeAliasElement> typeAliases) {
-    for (TypeAliasElement typeAlias in typeAliases) {
+    for (var typeAlias in typeAliases) {
       (typeAlias as ElementImpl).enclosingElement = this;
     }
     _typeAliases = typeAliases;
   }
 
   @override
-  TypeParameterizedElementMixin get typeParameterContext => null;
+  TypeParameterizedElementMixin? get typeParameterContext => null;
 
   @override
   List<ClassElement> get types {
-    if (_types != null) return _types;
+    if (_types != null) return _types!;
 
     if (linkedNode != null) {
-      var containerRef = reference.getChild('@class');
+      var containerRef = reference!.getChild('@class');
       _types = <ClassElement>[];
-      for (var node in linkedContext.unit_withDeclarations.declarations) {
+      for (var node in linkedContext!.unit_withDeclarations.declarations) {
         if (node is ClassDeclaration) {
           var name = node.name.name;
           var reference = containerRef.getChild(name);
           var element = node.declaredElement;
           element ??= ClassElementImpl.forLinkedNode(this, reference, node);
-          _types.add(element);
+          _types!.add(element);
         } else if (node is ClassTypeAlias) {
           var name = node.name.name;
           var reference = containerRef.getChild(name);
           var element = node.declaredElement;
           element ??= ClassElementImpl.forLinkedNode(this, reference, node);
-          _types.add(element);
+          _types!.add(element);
         }
       }
-      return _types;
+      return _types!;
     }
 
     return _types ?? const <ClassElement>[];
@@ -1490,7 +1492,7 @@
       object is CompilationUnitElementImpl && source == object.source;
 
   @override
-  T accept<T>(ElementVisitor<T> visitor) =>
+  T? accept<T>(ElementVisitor<T> visitor) =>
       visitor.visitCompilationUnitElement(this);
 
   @override
@@ -1499,7 +1501,7 @@
   }
 
   @override
-  ClassElement getEnum(String enumName) {
+  ClassElement? getEnum(String enumName) {
     for (ClassElement enumDeclaration in enums) {
       if (enumDeclaration.name == enumName) {
         return enumDeclaration;
@@ -1509,7 +1511,7 @@
   }
 
   @override
-  ClassElement getType(String className) {
+  ClassElement? getType(String className) {
     for (ClassElement type in types) {
       if (type.name == className) {
         return type;
@@ -1541,14 +1543,15 @@
         <CompilationUnitElementImpl, List<TopLevelVariableElement>>{};
 
     var units = unit.library.units;
-    for (CompilationUnitElementImpl unit in units) {
-      var context = unit.linkedContext;
+    for (var unit in units) {
+      var unitImpl = unit as CompilationUnitElementImpl;
+      var context = unitImpl.linkedContext!;
 
       var accessorList = <PropertyAccessorElement>[];
-      accessorMap[unit] = accessorList;
+      accessorMap[unitImpl] = accessorList;
 
       var variableList = <TopLevelVariableElement>[];
-      variableMap[unit] = variableList;
+      variableMap[unitImpl] = variableList;
 
       // TODO(scheglov) Bad, we want to read only functions / variables.
       var unitNode = context.unit_withDeclarations;
@@ -1557,18 +1560,19 @@
       var variables = context.topLevelVariables(unitNode);
       for (var variable in variables) {
         var variableElement =
-            variable.declaredElement as TopLevelVariableElementImpl;
+            variable.declaredElement as TopLevelVariableElementImpl?;
         if (variableElement == null) {
           var name = variable.name.name;
-          var reference = unit.reference.getChild('@variable').getChild(name);
+          var reference =
+              unitImpl.reference!.getChild('@variable').getChild(name);
           variableElement = TopLevelVariableElementImpl.forLinkedNodeFactory(
-              unit, reference, variable);
+              unitImpl, reference, variable);
         }
         variableList.add(variableElement);
 
-        accessorList.add(variableElement.getter);
+        accessorList.add(variableElement.getter!);
         if (variableElement.setter != null) {
-          accessorList.add(variableElement.setter);
+          accessorList.add(variableElement.setter!);
         }
       }
 
@@ -1580,21 +1584,22 @@
 
           var name = node.name.name;
           var containerRef = isGetter
-              ? unit.reference.getChild('@getter')
-              : unit.reference.getChild('@setter');
+              ? unitImpl.reference!.getChild('@getter')
+              : unitImpl.reference!.getChild('@setter');
 
           var accessorElement =
-              node.declaredElement as PropertyAccessorElementImpl;
+              node.declaredElement as PropertyAccessorElementImpl?;
           accessorElement ??= PropertyAccessorElementImpl.forLinkedNode(
-              unit, containerRef.getChild(name), node);
+              unitImpl, containerRef.getChild(name), node);
           accessorList.add(accessorElement);
 
-          var fieldRef = unit.reference.getChild('@variable').getChild(name);
-          TopLevelVariableElementImpl field = fieldRef.element;
+          var fieldRef =
+              unitImpl.reference!.getChild('@variable').getChild(name);
+          var field = fieldRef.element as TopLevelVariableElementImpl?;
           if (field == null) {
             field = TopLevelVariableElementImpl(name, -1);
             fieldRef.element = field;
-            field.enclosingElement = unit;
+            field.enclosingElement = unitImpl;
             field.isSynthetic = true;
             field.isFinal = isGetter;
             variableList.add(field);
@@ -1612,9 +1617,10 @@
       }
     }
 
-    for (CompilationUnitElementImpl unit in units) {
-      unit._accessors = accessorMap[unit];
-      unit._variables = variableMap[unit];
+    for (var unit in units) {
+      var unitImpl = unit as CompilationUnitElementImpl;
+      unitImpl._accessors = accessorMap[unit];
+      unitImpl._variables = variableMap[unit];
     }
   }
 }
@@ -1641,28 +1647,29 @@
 class ConstFieldElementImpl_EnumValue extends ConstFieldElementImpl_ofEnum {
   final int _index;
 
-  ConstFieldElementImpl_EnumValue(EnumElementImpl enumElement, this._index)
-      : super(enumElement);
+  ConstFieldElementImpl_EnumValue(
+      EnumElementImpl enumElement, String name, this._index)
+      : super(enumElement, name);
 
   ConstFieldElementImpl_EnumValue.forLinkedNode(EnumElementImpl enumElement,
       Reference reference, AstNode linkedNode, this._index)
       : super.forLinkedNode(enumElement, reference, linkedNode);
 
   @override
-  Expression get constantInitializer => null;
+  Expression? get constantInitializer => null;
 
   @override
-  String get documentationComment {
+  String? get documentationComment {
     if (linkedNode != null) {
-      var context = enclosingUnit.linkedContext;
-      var comment = context.getDocumentationComment(linkedNode);
+      var context = enclosingUnit.linkedContext!;
+      var comment = context.getDocumentationComment(linkedNode!);
       return getCommentNodeRawText(comment);
     }
     return super.documentationComment;
   }
 
   @override
-  EvaluationResultImpl get evaluationResult {
+  EvaluationResultImpl? get evaluationResult {
     if (_evaluationResult == null) {
       Map<String, DartObjectImpl> fieldMap = <String, DartObjectImpl>{
         'index': DartObjectImpl(
@@ -1697,7 +1704,7 @@
   @override
   String get name {
     if (linkedNode != null) {
-      return reference.name;
+      return reference!.name;
     }
     return super.name;
   }
@@ -1705,13 +1712,14 @@
   @override
   int get nameOffset {
     if (linkedNode != null) {
-      return enclosingUnit.linkedContext.getNameOffset(linkedNode);
+      return enclosingUnit.linkedContext!.getNameOffset(linkedNode!);
     }
     return super.nameOffset;
   }
 
   @override
-  InterfaceType get type => ElementTypeProvider.current.getFieldType(this);
+  InterfaceType get type =>
+      ElementTypeProvider.current.getFieldType(this) as InterfaceType;
 
   @override
   InterfaceType get typeInternal => _enum.thisType;
@@ -1720,17 +1728,17 @@
 /// The synthetic `values` field of an enum.
 class ConstFieldElementImpl_EnumValues extends ConstFieldElementImpl_ofEnum {
   ConstFieldElementImpl_EnumValues(EnumElementImpl enumElement)
-      : super(enumElement) {
+      : super(enumElement, 'values') {
     isSynthetic = true;
   }
 
   @override
   EvaluationResultImpl get evaluationResult {
     if (_evaluationResult == null) {
-      List<DartObjectImpl> constantValues = <DartObjectImpl>[];
+      var constantValues = <DartObjectImpl>[];
       for (FieldElement field in _enum.fields) {
         if (field is ConstFieldElementImpl_EnumValue) {
-          constantValues.add(field.evaluationResult.value);
+          constantValues.add(field.evaluationResult!.value!);
         }
       }
       _evaluationResult = EvaluationResultImpl(
@@ -1741,21 +1749,22 @@
         ),
       );
     }
-    return _evaluationResult;
+    return _evaluationResult!;
   }
 
   @override
   String get name => 'values';
 
   @override
-  InterfaceType get type => ElementTypeProvider.current.getFieldType(this);
+  InterfaceType get type =>
+      ElementTypeProvider.current.getFieldType(this) as InterfaceType;
 
   @override
   InterfaceType get typeInternal {
     if (_type == null) {
       return _type = library.typeProvider.listType2(_enum.thisType);
     }
-    return _type;
+    return _type as InterfaceType;
   }
 }
 
@@ -1763,7 +1772,7 @@
 abstract class ConstFieldElementImpl_ofEnum extends ConstFieldElementImpl {
   final EnumElementImpl _enum;
 
-  ConstFieldElementImpl_ofEnum(this._enum) : super(null, -1) {
+  ConstFieldElementImpl_ofEnum(this._enum, String name) : super(name, -1) {
     enclosingElement = _enum;
   }
 
@@ -1820,18 +1829,18 @@
     with ConstructorElementMixin
     implements ConstructorElement {
   /// The constructor to which this constructor is redirecting.
-  ConstructorElement _redirectedConstructor;
+  ConstructorElement? _redirectedConstructor;
 
   /// The initializers for this constructor (used for evaluating constant
   /// instance creation expressions).
-  List<ConstructorInitializer> _constantInitializers;
+  List<ConstructorInitializer>? _constantInitializers;
 
   /// The offset of the `.` before this constructor name or `null` if not named.
-  int _periodOffset;
+  int? _periodOffset;
 
   /// Return the offset of the character immediately following the last
   /// character of this constructor's name, or `null` if not named.
-  int _nameEnd;
+  int? _nameEnd;
 
   /// For every constructor we initially set this flag to `true`, and then
   /// set it to `false` during computing constant values if we detect that it
@@ -1846,7 +1855,7 @@
   ConstructorElementImpl(String name, int offset) : super(name, offset);
 
   ConstructorElementImpl.forLinkedNode(ClassElementImpl enclosingClass,
-      Reference reference, ConstructorDeclarationImpl linkedNode)
+      Reference reference, ConstructorDeclarationImpl? linkedNode)
       : super.forLinkedNode(enclosingClass, reference, linkedNode) {
     linkedNode?.declaredElement = this;
   }
@@ -1854,16 +1863,16 @@
   /// Return the constant initializers for this element, which will be empty if
   /// there are no initializers, or `null` if there was an error in the source.
   List<ConstructorInitializer> get constantInitializers {
-    if (_constantInitializers != null) return _constantInitializers;
+    if (_constantInitializers != null) return _constantInitializers!;
 
     if (linkedNode != null) {
-      linkedContext.applyResolution(linkedNode);
-      return _constantInitializers = linkedContext.getConstructorInitializers(
-        linkedNode,
+      linkedContext!.applyResolution(linkedNode!);
+      return _constantInitializers = linkedContext!.getConstructorInitializers(
+        linkedNode as ConstructorDeclaration,
       );
     }
 
-    return _constantInitializers;
+    return _constantInitializers!;
   }
 
   set constantInitializers(List<ConstructorInitializer> constantInitializers) {
@@ -1876,7 +1885,7 @@
   @override
   String get displayName {
     if (linkedNode != null) {
-      return reference.name;
+      return reference!.name;
     }
     return super.displayName;
   }
@@ -1888,7 +1897,7 @@
   @override
   bool get isConst {
     if (linkedNode != null) {
-      ConstructorDeclaration linkedNode = this.linkedNode;
+      var linkedNode = this.linkedNode as ConstructorDeclaration;
       return linkedNode.constKeyword != null;
     }
     return hasModifier(Modifier.CONST);
@@ -1912,7 +1921,7 @@
   @override
   bool get isFactory {
     if (linkedNode != null) {
-      ConstructorDeclaration linkedNode = this.linkedNode;
+      var linkedNode = this.linkedNode as ConstructorDeclaration;
       return linkedNode.factoryKeyword != null;
     }
     return hasModifier(Modifier.FACTORY);
@@ -1930,19 +1939,11 @@
   ElementKind get kind => ElementKind.CONSTRUCTOR;
 
   @override
-  String get name {
-    if (linkedNode != null) {
-      return reference.name;
-    }
-    return super.name;
-  }
-
-  @override
-  int get nameEnd {
+  int? get nameEnd {
     if (linkedNode != null) {
       var node = linkedNode as ConstructorDeclaration;
       if (node.name != null) {
-        return node.name.end;
+        return node.name!.end;
       } else {
         return node.returnType.end;
       }
@@ -1951,12 +1952,12 @@
     return _nameEnd;
   }
 
-  set nameEnd(int nameEnd) {
+  set nameEnd(int? nameEnd) {
     _nameEnd = nameEnd;
   }
 
   @override
-  int get periodOffset {
+  int? get periodOffset {
     if (linkedNode != null) {
       var node = linkedNode as ConstructorDeclaration;
       return node.period?.offset;
@@ -1965,22 +1966,24 @@
     return _periodOffset;
   }
 
-  set periodOffset(int periodOffset) {
+  set periodOffset(int? periodOffset) {
     _periodOffset = periodOffset;
   }
 
   @override
-  ConstructorElement get redirectedConstructor {
+  ConstructorElement? get redirectedConstructor {
     if (_redirectedConstructor != null) return _redirectedConstructor;
 
     if (linkedNode != null) {
-      linkedContext.applyResolution(linkedNode);
-      var context = enclosingUnit.linkedContext;
+      linkedContext!.applyResolution(linkedNode!);
+      var context = enclosingUnit.linkedContext!;
       if (isFactory) {
-        var node = context.getConstructorRedirected(linkedNode);
+        var node = context
+            .getConstructorRedirected(linkedNode as ConstructorDeclaration);
         return _redirectedConstructor = node?.staticElement;
       } else {
-        var initializers = context.getConstructorInitializers(linkedNode);
+        var initializers = context
+            .getConstructorInitializers(linkedNode as ConstructorDeclaration);
         for (var initializer in initializers) {
           if (initializer is RedirectingConstructorInvocation) {
             return _redirectedConstructor = initializer.staticElement;
@@ -1993,13 +1996,14 @@
     return _redirectedConstructor;
   }
 
-  set redirectedConstructor(ConstructorElement redirectedConstructor) {
+  set redirectedConstructor(ConstructorElement? redirectedConstructor) {
     _redirectedConstructor = redirectedConstructor;
   }
 
   @override
   InterfaceType get returnType =>
-      ElementTypeProvider.current.getExecutableReturnType(this);
+      ElementTypeProvider.current.getExecutableReturnType(this)
+          as InterfaceType;
 
   @override
   set returnType(DartType returnType) {
@@ -2008,7 +2012,7 @@
 
   @override
   InterfaceType get returnTypeInternal {
-    return _returnType ??= enclosingElement.thisType;
+    return (_returnType ??= enclosingElement.thisType) as InterfaceType;
   }
 
   @override
@@ -2031,7 +2035,7 @@
   }
 
   @override
-  T accept<T>(ElementVisitor<T> visitor) =>
+  T? accept<T>(ElementVisitor<T> visitor) =>
       visitor.visitConstructorElement(this);
 
   @override
@@ -2043,7 +2047,7 @@
   /// of formal parameters, are evaluated.
   void computeConstantDependencies() {
     if (!isConstantEvaluated) {
-      AnalysisOptionsImpl analysisOptions = context.analysisOptions;
+      var analysisOptions = context.analysisOptions as AnalysisOptionsImpl;
       computeConstants(library.typeProvider, library.typeSystem,
           context.declaredVariables, [this], analysisOptions.experimentStatus);
     }
@@ -2055,8 +2059,7 @@
   @override
   bool get isDefaultConstructor {
     // unnamed
-    var name = this.name;
-    if (name != null && name.isNotEmpty) {
+    if (name.isNotEmpty) {
       return false;
     }
     // no required parameters
@@ -2101,28 +2104,28 @@
   /// initializers.  However, analyzer also needs to handle incorrect Dart code,
   /// in which case there might be some constant variables that lack
   /// initializers.
-  Expression _constantInitializer;
+  Expression? _constantInitializer;
 
-  EvaluationResultImpl _evaluationResult;
+  EvaluationResultImpl? _evaluationResult;
 
-  Expression get constantInitializer {
-    if (_constantInitializer != null) return _constantInitializer;
+  Expression? get constantInitializer {
+    if (_constantInitializer != null) return _constantInitializer!;
 
     if (linkedNode != null) {
-      linkedContext.applyResolution(linkedNode);
-      return _constantInitializer = linkedContext.getInitializer(linkedNode);
+      linkedContext!.applyResolution(linkedNode!);
+      return _constantInitializer = linkedContext!.getInitializer(linkedNode!);
     }
 
     return _constantInitializer;
   }
 
-  set constantInitializer(Expression constantInitializer) {
+  set constantInitializer(Expression? constantInitializer) {
     _constantInitializer = constantInitializer;
   }
 
-  EvaluationResultImpl get evaluationResult => _evaluationResult;
+  EvaluationResultImpl? get evaluationResult => _evaluationResult;
 
-  set evaluationResult(EvaluationResultImpl evaluationResult) {
+  set evaluationResult(EvaluationResultImpl? evaluationResult) {
     _evaluationResult = evaluationResult;
   }
 
@@ -2133,10 +2136,10 @@
   /// to be computed if it had not previously been computed, or `null` if either
   /// this variable was not declared with the 'const' modifier or if the value
   /// of this variable could not be computed because of errors.
-  DartObject computeConstantValue() {
+  DartObject? computeConstantValue() {
     if (evaluationResult == null) {
-      AnalysisOptionsImpl analysisOptions = context.analysisOptions;
-      computeConstants(library.typeProvider, library.typeSystem,
+      var analysisOptions = context.analysisOptions as AnalysisOptionsImpl;
+      computeConstants(library!.typeProvider, library!.typeSystem,
           context.declaredVariables, [this], analysisOptions.experimentStatus);
     }
     return evaluationResult?.value;
@@ -2152,7 +2155,7 @@
       : super(name, nameOffset);
 
   DefaultFieldFormalParameterElementImpl.forLinkedNode(
-      ElementImpl enclosing, Reference reference, AstNode linkedNode)
+      ElementImpl enclosing, Reference? reference, FormalParameter linkedNode)
       : super.forLinkedNode(enclosing, reference, linkedNode);
 }
 
@@ -2161,11 +2164,11 @@
     with ConstVariableElement {
   /// Initialize a newly created parameter element to have the given [name] and
   /// [nameOffset].
-  DefaultParameterElementImpl(String name, int nameOffset)
+  DefaultParameterElementImpl(String? name, int nameOffset)
       : super(name, nameOffset);
 
   DefaultParameterElementImpl.forLinkedNode(
-      ElementImpl enclosing, Reference reference, AstNode linkedNode)
+      ElementImpl enclosing, Reference? reference, FormalParameter linkedNode)
       : super.forLinkedNode(enclosing, reference, linkedNode);
 }
 
@@ -2187,7 +2190,7 @@
   ElementKind get kind => ElementKind.DYNAMIC;
 
   @override
-  T accept<T>(ElementVisitor<T> visitor) => null;
+  T? accept<T>(ElementVisitor<T> visitor) => null;
 }
 
 /// A concrete implementation of an [ElementAnnotation].
@@ -2295,19 +2298,19 @@
   static const String _VISIBLE_FOR_TESTING_VARIABLE_NAME = "visibleForTesting";
 
   @override
-  Element element;
+  Element? element;
 
   /// The compilation unit in which this annotation appears.
   CompilationUnitElementImpl compilationUnit;
 
   /// The AST of the annotation itself, cloned from the resolved AST for the
   /// source code.
-  Annotation annotationAst;
+  late Annotation annotationAst;
 
   /// The result of evaluating this annotation as a compile-time constant
   /// expression, or `null` if the compilation unit containing the variable has
   /// not been resolved.
-  EvaluationResultImpl evaluationResult;
+  EvaluationResultImpl? evaluationResult;
 
   /// Initialize a newly created annotation. The given [compilationUnit] is the
   /// compilation unit in which the annotation appears.
@@ -2323,19 +2326,19 @@
   @override
   bool get isAlwaysThrows =>
       element is PropertyAccessorElement &&
-      element.name == _ALWAYS_THROWS_VARIABLE_NAME &&
-      element.library?.name == _META_LIB_NAME;
+      element!.name == _ALWAYS_THROWS_VARIABLE_NAME &&
+      element!.library!.name == _META_LIB_NAME;
 
   @override
   bool get isConstantEvaluated => evaluationResult != null;
 
   @override
   bool get isDeprecated {
-    if (element?.library?.isDartCore == true) {
+    if (element?.library!.isDartCore == true) {
       if (element is ConstructorElement) {
-        return element.enclosingElement.name == _DEPRECATED_CLASS_NAME;
+        return element!.enclosingElement!.name == _DEPRECATED_CLASS_NAME;
       } else if (element is PropertyAccessorElement) {
-        return element.name == _DEPRECATED_VARIABLE_NAME;
+        return element!.name == _DEPRECATED_VARIABLE_NAME;
       }
     }
     return false;
@@ -2344,119 +2347,119 @@
   @override
   bool get isDoNotStore =>
       element is PropertyAccessorElement &&
-      element.name == _DO_NOT_STORE_VARIABLE_NAME &&
-      element.library?.name == _META_LIB_NAME;
+      element!.name == _DO_NOT_STORE_VARIABLE_NAME &&
+      element!.library!.name == _META_LIB_NAME;
 
   @override
   bool get isFactory =>
       element is PropertyAccessorElement &&
-      element.name == _FACTORY_VARIABLE_NAME &&
-      element.library?.name == _META_LIB_NAME;
+      element!.name == _FACTORY_VARIABLE_NAME &&
+      element!.library!.name == _META_LIB_NAME;
 
   @override
   bool get isImmutable =>
       element is PropertyAccessorElement &&
-      element.name == _IMMUTABLE_VARIABLE_NAME &&
-      element.library?.name == _META_LIB_NAME;
+      element!.name == _IMMUTABLE_VARIABLE_NAME &&
+      element!.library!.name == _META_LIB_NAME;
 
   @override
   bool get isInternal =>
       element is PropertyAccessorElement &&
-      element.name == _INTERNAL_VARIABLE_NAME &&
-      element.library?.name == _META_LIB_NAME;
+      element!.name == _INTERNAL_VARIABLE_NAME &&
+      element!.library!.name == _META_LIB_NAME;
 
   @override
   bool get isIsTest =>
       element is PropertyAccessorElement &&
-      element.name == _IS_TEST_VARIABLE_NAME &&
-      element.library?.name == _META_LIB_NAME;
+      element!.name == _IS_TEST_VARIABLE_NAME &&
+      element!.library!.name == _META_LIB_NAME;
 
   @override
   bool get isIsTestGroup =>
       element is PropertyAccessorElement &&
-      element.name == _IS_TEST_GROUP_VARIABLE_NAME &&
-      element.library?.name == _META_LIB_NAME;
+      element!.name == _IS_TEST_GROUP_VARIABLE_NAME &&
+      element!.library!.name == _META_LIB_NAME;
 
   @override
   bool get isJS =>
       element is ConstructorElement &&
-      element.enclosingElement.name == _JS_CLASS_NAME &&
-      element.library?.name == _JS_LIB_NAME;
+      element!.enclosingElement!.name == _JS_CLASS_NAME &&
+      element!.library!.name == _JS_LIB_NAME;
 
   @override
   bool get isLiteral =>
       element is PropertyAccessorElement &&
-      element.name == _LITERAL_VARIABLE_NAME &&
-      element.library?.name == _META_LIB_NAME;
+      element!.name == _LITERAL_VARIABLE_NAME &&
+      element!.library!.name == _META_LIB_NAME;
 
   @override
   bool get isMustCallSuper =>
       element is PropertyAccessorElement &&
-      element.name == _MUST_CALL_SUPER_VARIABLE_NAME &&
-      element.library?.name == _META_LIB_NAME;
+      element!.name == _MUST_CALL_SUPER_VARIABLE_NAME &&
+      element!.library!.name == _META_LIB_NAME;
 
   @override
   bool get isNonVirtual =>
       element is PropertyAccessorElement &&
-      element.name == _NON_VIRTUAL_VARIABLE_NAME &&
-      element.library?.name == _META_LIB_NAME;
+      element!.name == _NON_VIRTUAL_VARIABLE_NAME &&
+      element!.library!.name == _META_LIB_NAME;
 
   @override
   bool get isOptionalTypeArgs =>
       element is PropertyAccessorElement &&
-      element.name == _OPTIONAL_TYPE_ARGS_VARIABLE_NAME &&
-      element.library?.name == _META_LIB_NAME;
+      element!.name == _OPTIONAL_TYPE_ARGS_VARIABLE_NAME &&
+      element!.library!.name == _META_LIB_NAME;
 
   @override
   bool get isOverride =>
       element is PropertyAccessorElement &&
-      element.name == _OVERRIDE_VARIABLE_NAME &&
-      element.library?.isDartCore == true;
+      element!.name == _OVERRIDE_VARIABLE_NAME &&
+      element!.library!.isDartCore == true;
 
   @override
   bool get isProtected =>
       element is PropertyAccessorElement &&
-      element.name == _PROTECTED_VARIABLE_NAME &&
-      element.library?.name == _META_LIB_NAME;
+      element!.name == _PROTECTED_VARIABLE_NAME &&
+      element!.library!.name == _META_LIB_NAME;
 
   @override
   bool get isProxy =>
       element is PropertyAccessorElement &&
-      element.name == PROXY_VARIABLE_NAME &&
-      element.library?.isDartCore == true;
+      element!.name == PROXY_VARIABLE_NAME &&
+      element!.library!.isDartCore == true;
 
   @override
   bool get isRequired =>
       element is ConstructorElement &&
-          element.enclosingElement.name == _REQUIRED_CLASS_NAME &&
-          element.library?.name == _META_LIB_NAME ||
+          element!.enclosingElement!.name == _REQUIRED_CLASS_NAME &&
+          element!.library!.name == _META_LIB_NAME ||
       element is PropertyAccessorElement &&
-          element.name == _REQUIRED_VARIABLE_NAME &&
-          element.library?.name == _META_LIB_NAME;
+          element!.name == _REQUIRED_VARIABLE_NAME &&
+          element!.library!.name == _META_LIB_NAME;
 
   @override
   bool get isSealed =>
       element is PropertyAccessorElement &&
-      element.name == _SEALED_VARIABLE_NAME &&
-      element.library?.name == _META_LIB_NAME;
+      element!.name == _SEALED_VARIABLE_NAME &&
+      element!.library!.name == _META_LIB_NAME;
 
   @override
   bool get isTarget =>
       element is ConstructorElement &&
-      element.enclosingElement.name == _TARGET_CLASS_NAME &&
-      element.library?.name == _META_META_LIB_NAME;
+      element!.enclosingElement!.name == _TARGET_CLASS_NAME &&
+      element!.library!.name == _META_META_LIB_NAME;
 
   @override
   bool get isVisibleForTemplate =>
       element is PropertyAccessorElement &&
-      element.name == _VISIBLE_FOR_TEMPLATE_VARIABLE_NAME &&
-      element.library?.name == _NG_META_LIB_NAME;
+      element!.name == _VISIBLE_FOR_TEMPLATE_VARIABLE_NAME &&
+      element!.library!.name == _NG_META_LIB_NAME;
 
   @override
   bool get isVisibleForTesting =>
       element is PropertyAccessorElement &&
-      element.name == _VISIBLE_FOR_TESTING_VARIABLE_NAME &&
-      element.library?.name == _META_LIB_NAME;
+      element!.name == _VISIBLE_FOR_TESTING_VARIABLE_NAME &&
+      element!.library!.name == _META_LIB_NAME;
 
   @override
   LibraryElement get library => compilationUnit.library;
@@ -2469,10 +2472,10 @@
   Source get source => compilationUnit.source;
 
   @override
-  DartObject computeConstantValue() {
+  DartObject? computeConstantValue() {
     if (evaluationResult == null) {
-      AnalysisOptionsImpl analysisOptions = context.analysisOptions;
-      LibraryElement library = compilationUnit.library;
+      var analysisOptions = context.analysisOptions as AnalysisOptionsImpl;
+      var library = compilationUnit.library;
       computeConstants(library.typeProvider, library.typeSystem,
           context.declaredVariables, [this], analysisOptions.experimentStatus);
     }
@@ -2499,13 +2502,13 @@
 
   /// The enclosing element of this element, or `null` if this element is at the
   /// root of the element structure.
-  ElementImpl _enclosingElement;
+  ElementImpl? _enclosingElement;
 
-  Reference reference;
-  final AstNode linkedNode;
+  Reference? reference;
+  final AstNode? linkedNode;
 
   /// The name of this element.
-  String _name;
+  String? _name;
 
   /// The offset of the name of this element in the file that contains the
   /// declaration of this element.
@@ -2515,32 +2518,32 @@
   int _modifiers = 0;
 
   /// A list containing all of the metadata associated with this element.
-  List<ElementAnnotation> _metadata;
+  List<ElementAnnotation>? _metadata;
 
   /// A cached copy of the calculated hashCode for this element.
-  int _cachedHashCode;
+  int? _cachedHashCode;
 
   /// A cached copy of the calculated location for this element.
-  ElementLocation _cachedLocation;
+  ElementLocation? _cachedLocation;
 
   /// The documentation comment for this element.
-  String _docComment;
+  String? _docComment;
 
   /// The offset of the beginning of the element's code in the file that
   /// contains the element, or `null` if the element is synthetic.
-  int _codeOffset;
+  int? _codeOffset;
 
   /// The length of the element's code, or `null` if the element is synthetic.
-  int _codeLength;
+  int? _codeLength;
 
   /// The language version for the library.
-  LibraryLanguageVersion _languageVersion;
+  LibraryLanguageVersion? _languageVersion;
 
   /// Initialize a newly created element to have the given [name] at the given
   /// [_nameOffset].
-  ElementImpl(String name, this._nameOffset, {this.reference})
+  ElementImpl(String? name, this._nameOffset, {this.reference})
       : linkedNode = null {
-    _name = StringUtilities.intern(name);
+    _name = name != null ? StringUtilities.intern(name) : null;
     reference?.element = this;
   }
 
@@ -2556,46 +2559,43 @@
         linkedNode = null;
 
   /// The length of the element's code, or `null` if the element is synthetic.
-  int get codeLength => _codeLength;
+  int? get codeLength => _codeLength;
 
   /// The offset of the beginning of the element's code in the file that
   /// contains the element, or `null` if the element is synthetic.
-  int get codeOffset => _codeOffset;
+  int? get codeOffset => _codeOffset;
 
   @override
   AnalysisContext get context {
-    if (_enclosingElement == null) {
-      return null;
-    }
-    return _enclosingElement.context;
+    return _enclosingElement!.context;
   }
 
   @override
   Element get declaration => this;
 
   @override
-  String get displayName => _name;
+  String get displayName => _name ?? '';
 
   @override
-  String get documentationComment => _docComment;
+  String? get documentationComment => _docComment;
 
   /// The documentation comment source for this element.
-  set documentationComment(String doc) {
+  set documentationComment(String? doc) {
     _docComment = doc?.replaceAll('\r\n', '\n');
   }
 
   @override
-  Element get enclosingElement => _enclosingElement;
+  Element? get enclosingElement => _enclosingElement;
 
   /// Set the enclosing element of this element to the given [element].
-  set enclosingElement(Element element) {
-    _enclosingElement = element as ElementImpl;
+  set enclosingElement(Element? element) {
+    _enclosingElement = element as ElementImpl?;
   }
 
   /// Return the enclosing unit element (which might be the same as `this`), or
   /// `null` if this element is not contained in any compilation unit.
   CompilationUnitElementImpl get enclosingUnit {
-    return _enclosingElement?.enclosingUnit;
+    return _enclosingElement!.enclosingUnit;
   }
 
   @override
@@ -2823,10 +2823,10 @@
 
   /// Return an identifier that uniquely identifies this element among the
   /// children of this element's parent.
-  String get identifier => name;
+  String get identifier => name!;
 
   bool get isNonFunctionTypeAliasesEnabled {
-    return library.featureSet.isEnabled(Feature.nonfunction_type_aliases);
+    return library!.featureSet.isEnabled(Feature.nonfunction_type_aliases);
   }
 
   @override
@@ -2844,7 +2844,7 @@
   @override
   bool get isSynthetic {
     if (linkedNode != null) {
-      return linkedNode.isSynthetic;
+      return linkedNode!.isSynthetic;
     }
     return hasModifier(Modifier.SYNTHETIC);
   }
@@ -2855,33 +2855,27 @@
   }
 
   @override
-  LibraryElement get library => thisOrAncestorOfType();
+  LibraryElementImpl? get library => thisOrAncestorOfType();
 
   @override
-  Source get librarySource => library?.source;
+  Source? get librarySource => library?.source;
 
-  LinkedUnitContext get linkedContext {
-    return _enclosingElement.linkedContext;
+  LinkedUnitContext? get linkedContext {
+    return (enclosingElement as ElementImpl).linkedContext;
   }
 
   @override
   ElementLocation get location {
-    if (_cachedLocation == null) {
-      if (library == null) {
-        return ElementLocationImpl.con1(this);
-      }
-      _cachedLocation = ElementLocationImpl.con1(this);
-    }
-    return _cachedLocation;
+    return _cachedLocation ??= ElementLocationImpl.con1(this);
   }
 
   @override
   List<ElementAnnotation> get metadata {
-    if (_metadata != null) return _metadata;
+    if (_metadata != null) return _metadata!;
 
     if (linkedNode != null) {
-      linkedContext.applyResolution(linkedNode);
-      var metadata = linkedContext.getMetadata(linkedNode);
+      linkedContext!.applyResolution(linkedNode!);
+      var metadata = linkedContext!.getMetadata(linkedNode!);
       return _metadata = _buildAnnotations2(enclosingUnit, metadata);
     }
 
@@ -2893,15 +2887,15 @@
   }
 
   @override
-  String get name => _name;
+  String? get name => _name;
 
   /// Changes the name of this element.
-  set name(String name) {
+  set name(String? name) {
     _name = name;
   }
 
   @override
-  int get nameLength => displayName != null ? displayName.length : 0;
+  int get nameLength => displayName.length;
 
   @override
   int get nameOffset => _nameOffset;
@@ -2914,26 +2908,23 @@
 
   @override
   AnalysisSession get session {
-    return _enclosingElement?.session;
+    return _enclosingElement!.session;
   }
 
   @override
-  Source get source {
-    if (_enclosingElement == null) {
-      return null;
-    }
-    return _enclosingElement.source;
+  Source? get source {
+    return enclosingElement?.source;
   }
 
   /// Return the context to resolve type parameters in, or `null` if neither
   /// this element nor any of its ancestors is of a kind that can declare type
   /// parameters.
-  TypeParameterizedElementMixin get typeParameterContext {
+  TypeParameterizedElementMixin? get typeParameterContext {
     return _enclosingElement?.typeParameterContext;
   }
 
   NullabilitySuffix get _noneOrStarSuffix {
-    return library?.isNonNullableByDefault == true
+    return library!.isNonNullableByDefault == true
         ? NullabilitySuffix.none
         : NullabilitySuffix.star;
   }
@@ -2966,7 +2957,7 @@
   }
 
   @override
-  String getDisplayString({@required bool withNullability}) {
+  String getDisplayString({required bool withNullability}) {
     var builder = ElementDisplayStringBuilder(
       skipAllDynamicArguments: false,
       withNullability: withNullability,
@@ -2976,13 +2967,10 @@
   }
 
   @override
-  String getExtendedDisplayName(String shortName) {
+  String getExtendedDisplayName(String? shortName) {
     shortName ??= displayName;
-    Source source = this.source;
-    if (source != null) {
-      return "$shortName (${source.fullName})";
-    }
-    return shortName;
+    var source = this.source;
+    return "$shortName (${source?.fullName})";
   }
 
   /// Return `true` if this element has the given [modifier] associated with it.
@@ -2990,8 +2978,8 @@
       BooleanArray.get(_modifiers, modifier.ordinal);
 
   @override
-  bool isAccessibleIn(LibraryElement library) {
-    if (Identifier.isPrivateName(name)) {
+  bool isAccessibleIn(LibraryElement? library) {
+    if (Identifier.isPrivateName(name!)) {
       return library == this.library;
     }
     return true;
@@ -2999,10 +2987,8 @@
 
   /// Use the given [visitor] to visit all of the [children] in the given array.
   void safelyVisitChildren(List<Element> children, ElementVisitor visitor) {
-    if (children != null) {
-      for (Element child in children) {
-        child.accept(visitor);
-      }
+    for (Element child in children) {
+      child.accept(visitor);
     }
   }
 
@@ -3020,7 +3006,7 @@
 
   @override
   E thisOrAncestorMatching<E extends Element>(Predicate<Element> predicate) {
-    Element element = this;
+    Element? element = this;
     while (element != null && !predicate(element)) {
       element = element.enclosingElement;
     }
@@ -3028,12 +3014,12 @@
   }
 
   @override
-  E thisOrAncestorOfType<E extends Element>() {
-    Element element = this;
+  E? thisOrAncestorOfType<E extends Element>() {
+    Element? element = this;
     while (element != null && element is! E) {
       element = element.enclosingElement;
     }
-    return element as E;
+    return element as E?;
   }
 
   @override
@@ -3054,12 +3040,12 @@
       return const <ElementAnnotation>[];
     }
 
-    var annotations = List<ElementAnnotation>.filled(length, null);
+    var annotations = <ElementAnnotation>[];
     for (int i = 0; i < length; i++) {
       var ast = nodeList[i];
-      annotations[i] = ElementAnnotationImpl(unit)
+      annotations.add(ElementAnnotationImpl(unit)
         ..annotationAst = ast
-        ..element = ast.element;
+        ..element = ast.element);
     }
     return annotations;
   }
@@ -3067,8 +3053,8 @@
   /// If the given [type] is a generic function type, then the element
   /// associated with the type is implicitly a child of this element and should
   /// be visited by the given [visitor].
-  void _safelyVisitPossibleChild(DartType type, ElementVisitor visitor) {
-    Element element = type?.element;
+  void _safelyVisitPossibleChild(DartType? type, ElementVisitor visitor) {
+    var element = type?.element;
     if (element is GenericFunctionTypeElementImpl &&
         element.enclosingElement is! FunctionTypeAliasElement) {
       element.accept(visitor);
@@ -3098,21 +3084,21 @@
   static const int _SEPARATOR_CHAR = 0x3B;
 
   /// The path to the element whose location is represented by this object.
-  List<String> _components;
+  late final List<String> _components;
 
   /// The object managing [indexKeyId] and [indexLocationId].
-  Object indexOwner;
+  Object? indexOwner;
 
   /// A cached id of this location in index.
-  int indexKeyId;
+  int? indexKeyId;
 
   /// A cached id of this location in index.
-  int indexLocationId;
+  int? indexLocationId;
 
   /// Initialize a newly created location to represent the given [element].
   ElementLocationImpl.con1(Element element) {
     List<String> components = <String>[];
-    Element ancestor = element;
+    Element? ancestor = element;
     while (ancestor != null) {
       components.insert(0, (ancestor as ElementImpl).identifier);
       ancestor = ancestor.enclosingElement;
@@ -3247,17 +3233,17 @@
   List<InterfaceType> get allSupertypes => <InterfaceType>[supertype];
 
   @override
-  int get codeLength {
+  int? get codeLength {
     if (linkedNode != null) {
-      return linkedContext.getCodeLength(linkedNode);
+      return linkedContext!.getCodeLength(linkedNode!);
     }
     return super.codeLength;
   }
 
   @override
-  int get codeOffset {
+  int? get codeOffset {
     if (linkedNode != null) {
-      return linkedContext.getCodeOffset(linkedNode);
+      return linkedContext!.getCodeOffset(linkedNode!);
     }
     return super.codeOffset;
   }
@@ -3276,10 +3262,10 @@
   }
 
   @override
-  String get documentationComment {
+  String? get documentationComment {
     if (linkedNode != null) {
-      var context = enclosingUnit.linkedContext;
-      var comment = context.getDocumentationComment(linkedNode);
+      var context = enclosingUnit.linkedContext!;
+      var comment = context.getDocumentationComment(linkedNode!);
       return getCommentNodeRawText(comment);
     }
     return super.documentationComment;
@@ -3338,15 +3324,15 @@
   @override
   String get name {
     if (linkedNode != null) {
-      return reference.name;
+      return reference!.name;
     }
-    return super.name;
+    return super.name!;
   }
 
   @override
   int get nameOffset {
     if (linkedNode != null) {
-      return enclosingUnit.linkedContext.getNameOffset(linkedNode);
+      return enclosingUnit.linkedContext!.getNameOffset(linkedNode!);
     }
 
     return super.nameOffset;
@@ -3360,7 +3346,7 @@
       const <TypeParameterElement>[];
 
   @override
-  ConstructorElement get unnamedConstructor => null;
+  ConstructorElement? get unnamedConstructor => null;
 
   @override
   void appendTo(ElementDisplayStringBuilder builder) {
@@ -3374,13 +3360,13 @@
     method.enclosingElement = this;
     if (linkedNode != null) {
       method.returnType = library.typeProvider.stringType;
-      method.reference = reference.getChild('@method').getChild('toString');
+      method.reference = reference!.getChild('@method').getChild('toString');
     }
     _methods = <MethodElement>[method];
   }
 
   @override
-  ConstructorElement getNamedConstructor(String name) => null;
+  ConstructorElement? getNamedConstructor(String name) => null;
 
   void _resynthesizeMembers2() {
     var fields = <FieldElementImpl>[];
@@ -3395,7 +3381,7 @@
         ..type = library.typeProvider.intType;
       fields.add(field);
       getters.add(PropertyAccessorElementImpl_ImplicitGetter(field,
-          reference: reference.getChild('@getter').getChild('index'))
+          reference: reference!.getChild('@getter').getChild('index'))
         ..enclosingElement = this);
     }
 
@@ -3404,12 +3390,12 @@
       var field = ConstFieldElementImpl_EnumValues(this);
       fields.add(field);
       getters.add(PropertyAccessorElementImpl_ImplicitGetter(field,
-          reference: reference.getChild('@getter').getChild('values'))
+          reference: reference!.getChild('@getter').getChild('values'))
         ..enclosingElement = this);
     }
 
     // Build fields for all enum constants.
-    var containerRef = reference.getChild('@constant');
+    var containerRef = reference!.getChild('@constant');
     var constants = (linkedNode as EnumDeclaration).constants;
     for (var i = 0; i < constants.length; ++i) {
       var constant = constants[i];
@@ -3418,7 +3404,7 @@
       var field = ConstFieldElementImpl_EnumValue.forLinkedNode(
           this, reference, constant, i);
       fields.add(field);
-      getters.add(field.getter);
+      getters.add(field.getter as PropertyAccessorElementImpl);
     }
 
     _fields = fields;
@@ -3428,27 +3414,27 @@
 }
 
 /// A base class for concrete implementations of an [ExecutableElement].
-abstract class ExecutableElementImpl extends ElementImpl
+abstract class ExecutableElementImpl extends _ExistingElementImpl
     with TypeParameterizedElementMixin
     implements ExecutableElement, ElementImplWithFunctionType {
   /// A list containing all of the parameters defined by this executable
   /// element.
-  List<ParameterElement> _parameters;
+  List<ParameterElement>? _parameters;
 
   /// The inferred return type of this executable element.
-  DartType _returnType;
+  DartType? _returnType;
 
   /// The type of function defined by this executable element.
-  FunctionType _type;
+  FunctionType? _type;
 
   /// Initialize a newly created executable element to have the given [name] and
   /// [offset].
-  ExecutableElementImpl(String name, int offset, {Reference reference})
+  ExecutableElementImpl(String name, int offset, {Reference? reference})
       : super(name, offset, reference: reference);
 
   /// Initialize using the given linked node.
   ExecutableElementImpl.forLinkedNode(
-      ElementImpl enclosing, Reference reference, AstNode linkedNode)
+      ElementImpl enclosing, Reference reference, AstNode? linkedNode)
       : super.forLinkedNode(enclosing, reference, linkedNode) {
     if (linkedNode is MethodDeclaration) {
       linkedNode.name.staticElement = this;
@@ -3458,17 +3444,17 @@
   }
 
   @override
-  int get codeLength {
+  int? get codeLength {
     if (linkedNode != null) {
-      return linkedContext.getCodeLength(linkedNode);
+      return linkedContext!.getCodeLength(linkedNode!);
     }
     return super.codeLength;
   }
 
   @override
-  int get codeOffset {
+  int? get codeOffset {
     if (linkedNode != null) {
-      return linkedContext.getCodeOffset(linkedNode);
+      return linkedContext!.getCodeOffset(linkedNode!);
     }
     return super.codeOffset;
   }
@@ -3476,25 +3462,28 @@
   @override
   String get displayName {
     if (linkedNode != null) {
-      return reference.name;
+      return reference!.name;
     }
     return super.displayName;
   }
 
   @override
-  String get documentationComment {
+  String? get documentationComment {
     if (linkedNode != null) {
-      var context = enclosingUnit.linkedContext;
-      var comment = context.getDocumentationComment(linkedNode);
+      var context = enclosingUnit.linkedContext!;
+      var comment = context.getDocumentationComment(linkedNode!);
       return getCommentNodeRawText(comment);
     }
     return super.documentationComment;
   }
 
   @override
+  Element get enclosingElement => super.enclosingElement!;
+
+  @override
   bool get hasImplicitReturnType {
     if (linkedNode != null) {
-      return linkedContext.hasImplicitReturnType(linkedNode);
+      return linkedContext!.hasImplicitReturnType(linkedNode!);
     }
     return hasModifier(Modifier.IMPLICIT_TYPE);
   }
@@ -3507,7 +3496,8 @@
   @override
   bool get isAbstract {
     if (linkedNode != null) {
-      return !isExternal && enclosingUnit.linkedContext.isAbstract(linkedNode);
+      return !isExternal &&
+          enclosingUnit.linkedContext!.isAbstract(linkedNode!);
     }
     return hasModifier(Modifier.ABSTRACT);
   }
@@ -3515,7 +3505,7 @@
   @override
   bool get isAsynchronous {
     if (linkedNode != null) {
-      return enclosingUnit.linkedContext.isAsynchronous(linkedNode);
+      return enclosingUnit.linkedContext!.isAsynchronous(linkedNode!);
     }
     return hasModifier(Modifier.ASYNCHRONOUS);
   }
@@ -3528,7 +3518,7 @@
   @override
   bool get isExternal {
     if (linkedNode != null) {
-      return enclosingUnit.linkedContext.isExternal(linkedNode);
+      return enclosingUnit.linkedContext!.isExternal(linkedNode!);
     }
     return hasModifier(Modifier.EXTERNAL);
   }
@@ -3541,7 +3531,7 @@
   @override
   bool get isGenerator {
     if (linkedNode != null) {
-      return enclosingUnit.linkedContext.isGenerator(linkedNode);
+      return enclosingUnit.linkedContext!.isGenerator(linkedNode!);
     }
     return hasModifier(Modifier.GENERATOR);
   }
@@ -3560,15 +3550,15 @@
   @override
   String get name {
     if (linkedNode != null) {
-      return reference.name;
+      return reference!.name;
     }
-    return super.name;
+    return super.name!;
   }
 
   @override
   int get nameOffset {
     if (linkedNode != null) {
-      return enclosingUnit.linkedContext.getNameOffset(linkedNode);
+      return enclosingUnit.linkedContext!.getNameOffset(linkedNode!);
     }
 
     return super.nameOffset;
@@ -3592,13 +3582,13 @@
   ///
   /// In most cases, the [parameters] getter should be used instead.
   List<ParameterElement> get parametersInternal {
-    if (_parameters != null) return _parameters;
+    if (_parameters != null) return _parameters!;
 
     if (linkedNode != null) {
-      linkedContext.applyResolution(linkedNode);
-      var context = enclosingUnit.linkedContext;
-      var containerRef = reference.getChild('@parameter');
-      var formalParameters = context.getFormalParameters(linkedNode);
+      linkedContext!.applyResolution(linkedNode!);
+      var context = enclosingUnit.linkedContext!;
+      var containerRef = reference!.getChild('@parameter');
+      var formalParameters = context.getFormalParameters(linkedNode!);
       _parameters = ParameterElementImpl.forLinkedNodeList(
         this,
         context,
@@ -3628,13 +3618,13 @@
 
   @override
   DartType get returnTypeInternal {
-    if (_returnType != null) return _returnType;
+    if (_returnType != null) return _returnType!;
 
     if (linkedNode != null) {
-      linkedContext.applyResolution(linkedNode);
-      return _returnType;
+      linkedContext!.applyResolution(linkedNode!);
+      return _returnType!;
     }
-    return _returnType;
+    return _returnType!;
   }
 
   @override
@@ -3646,7 +3636,7 @@
 
   @override
   FunctionType get typeInternal {
-    if (_type != null) return _type;
+    if (_type != null) return _type!;
 
     return _type = FunctionTypeImpl(
       typeFormals: typeParameters,
@@ -3684,11 +3674,11 @@
 class ExportElementImpl extends UriReferencedElementImpl
     implements ExportElement {
   /// The library that is exported from this library by this export directive.
-  LibraryElement _exportedLibrary;
+  LibraryElement? _exportedLibrary;
 
   /// The combinators that were specified as part of the export directive in the
   /// order in which they were specified.
-  List<NamespaceCombinator> _combinators;
+  List<NamespaceCombinator>? _combinators;
 
   /// Initialize a newly created export element at the given [offset].
   ExportElementImpl(int offset) : super(null, offset);
@@ -3701,12 +3691,12 @@
 
   @override
   List<NamespaceCombinator> get combinators {
-    if (_combinators != null) return _combinators;
+    if (_combinators != null) return _combinators!;
 
     if (linkedNode != null) {
-      ExportDirective node = linkedNode;
+      var node = linkedNode as ExportDirective;
       return _combinators = ImportElementImpl._buildCombinators2(
-        enclosingUnit.linkedContext,
+        enclosingUnit.linkedContext!,
         node.combinators,
       );
     }
@@ -3720,27 +3710,27 @@
 
   @override
   CompilationUnitElementImpl get enclosingUnit {
-    LibraryElementImpl enclosingLibrary = enclosingElement;
+    var enclosingLibrary = enclosingElement as LibraryElementImpl;
     return enclosingLibrary._definingCompilationUnit;
   }
 
   @override
-  LibraryElement get exportedLibrary {
+  LibraryElement? get exportedLibrary {
     if (_exportedLibrary != null) return _exportedLibrary;
 
     if (linkedNode != null) {
-      linkedContext.applyResolution(linkedNode);
+      linkedContext!.applyResolution(linkedNode!);
     }
 
     return _exportedLibrary;
   }
 
-  set exportedLibrary(LibraryElement exportedLibrary) {
+  set exportedLibrary(LibraryElement? exportedLibrary) {
     _exportedLibrary = exportedLibrary;
   }
 
   @override
-  String get identifier => exportedLibrary.name;
+  String get identifier => exportedLibrary!.name!;
 
   @override
   ElementKind get kind => ElementKind.EXPORT;
@@ -3748,16 +3738,16 @@
   @override
   int get nameOffset {
     if (linkedNode != null) {
-      return linkedContext.getDirectiveOffset(linkedNode);
+      return linkedContext!.getDirectiveOffset(linkedNode as Directive);
     }
 
     return super.nameOffset;
   }
 
   @override
-  String get uri {
+  String? get uri {
     if (linkedNode != null) {
-      ExportDirective node = linkedNode;
+      var node = linkedNode as ExportDirective;
       return node.uri.stringValue;
     }
 
@@ -3765,7 +3755,7 @@
   }
 
   @override
-  T accept<T>(ElementVisitor<T> visitor) => visitor.visitExportElement(this);
+  T? accept<T>(ElementVisitor<T> visitor) => visitor.visitExportElement(this);
 
   @override
   void appendTo(ElementDisplayStringBuilder builder) {
@@ -3774,21 +3764,21 @@
 }
 
 /// A concrete implementation of an [ExtensionElement].
-class ExtensionElementImpl extends ElementImpl
+class ExtensionElementImpl extends _ExistingElementImpl
     with TypeParameterizedElementMixin
     implements ExtensionElement {
   /// The type being extended.
-  DartType _extendedType;
+  DartType? _extendedType;
 
   /// A list containing all of the accessors (getters and setters) contained in
   /// this extension.
-  List<PropertyAccessorElement> _accessors;
+  List<PropertyAccessorElement>? _accessors;
 
   /// A list containing all of the fields contained in this extension.
-  List<FieldElement> _fields;
+  List<FieldElement>? _fields;
 
   /// A list containing all of the methods contained in this extension.
-  List<MethodElement> _methods;
+  List<MethodElement>? _methods;
 
   /// Initialize a newly created extension element to have the given [name] at
   /// the given [offset] in the file that contains the declaration of this
@@ -3805,14 +3795,14 @@
   @override
   List<PropertyAccessorElement> get accessors {
     if (_accessors != null) {
-      return _accessors;
+      return _accessors!;
     }
 
     if (linkedNode != null) {
       if (linkedNode is ExtensionDeclaration) {
         _createPropertiesAndAccessors();
         assert(_accessors != null);
-        return _accessors;
+        return _accessors!;
       } else {
         return _accessors = const [];
       }
@@ -3829,17 +3819,17 @@
   }
 
   @override
-  int get codeLength {
+  int? get codeLength {
     if (linkedNode != null) {
-      return linkedContext.getCodeLength(linkedNode);
+      return linkedContext!.getCodeLength(linkedNode!);
     }
     return super.codeLength;
   }
 
   @override
-  int get codeOffset {
+  int? get codeOffset {
     if (linkedNode != null) {
-      return linkedContext.getCodeOffset(linkedNode);
+      return linkedContext!.getCodeOffset(linkedNode!);
     }
     return super.codeOffset;
   }
@@ -3848,16 +3838,21 @@
   String get displayName => name ?? '';
 
   @override
-  String get documentationComment {
+  String? get documentationComment {
     if (linkedNode != null) {
-      var context = enclosingUnit.linkedContext;
-      var comment = context.getDocumentationComment(linkedNode);
+      var context = enclosingUnit.linkedContext!;
+      var comment = context.getDocumentationComment(linkedNode!);
       return getCommentNodeRawText(comment);
     }
     return super.documentationComment;
   }
 
   @override
+  CompilationUnitElementImpl get enclosingElement {
+    return _enclosingElement as CompilationUnitElementImpl;
+  }
+
+  @override
   DartType get extendedType =>
       ElementTypeProvider.current.getExtendedType(this);
 
@@ -3866,27 +3861,28 @@
   }
 
   DartType get extendedTypeInternal {
-    if (_extendedType != null) return _extendedType;
+    if (_extendedType != null) return _extendedType!;
 
     if (linkedNode != null) {
       var linkedNode = this.linkedNode as ExtensionDeclaration;
-      return _extendedType = linkedNode.extendedType.type;
+      linkedContext!.applyResolution(linkedNode);
+      return _extendedType = linkedNode.extendedType.type!;
     }
 
-    return _extendedType;
+    return _extendedType!;
   }
 
   @override
   List<FieldElement> get fields {
     if (_fields != null) {
-      return _fields;
+      return _fields!;
     }
 
     if (linkedNode != null) {
       if (linkedNode is ExtensionDeclaration) {
         _createPropertiesAndAccessors();
         assert(_fields != null);
-        return _fields;
+        return _fields!;
       } else {
         return _fields = const [];
       }
@@ -3905,7 +3901,7 @@
   @override
   String get identifier {
     if (linkedNode != null) {
-      return reference.name;
+      return reference!.name;
     }
     return super.identifier;
   }
@@ -3919,19 +3915,19 @@
   @override
   List<MethodElement> get methods {
     if (_methods != null) {
-      return _methods;
+      return _methods!;
     }
 
     if (linkedNode != null) {
-      var context = enclosingUnit.linkedContext;
-      var containerRef = reference.getChild('@method');
+      var context = enclosingUnit.linkedContext!;
+      var containerRef = reference!.getChild('@method');
       return _methods = context
-          .getMethods(linkedNode)
+          .getMethods(linkedNode as CompilationUnitMember)
           .where((node) => node.propertyKeyword == null)
           .map((node) {
         var name = node.name.name;
         var reference = containerRef.getChild(name);
-        var element = node.declaredElement as MethodElement;
+        var element = node.declaredElement as MethodElement?;
         element ??= MethodElementImpl.forLinkedNode(this, reference, node);
         return element;
       }).toList();
@@ -3948,7 +3944,7 @@
   }
 
   @override
-  String get name {
+  String? get name {
     if (linkedNode != null) {
       return (linkedNode as ExtensionDeclaration).name?.name;
     }
@@ -3958,7 +3954,7 @@
   @override
   int get nameOffset {
     if (linkedNode != null) {
-      return enclosingUnit.linkedContext.getNameOffset(linkedNode);
+      return enclosingUnit.linkedContext!.getNameOffset(linkedNode!);
     }
 
     return super.nameOffset;
@@ -3974,7 +3970,7 @@
   }
 
   @override
-  T accept<T>(ElementVisitor<T> visitor) {
+  T? accept<T>(ElementVisitor<T> visitor) {
     return visitor.visitExtensionElement(this);
   }
 
@@ -3984,7 +3980,7 @@
   }
 
   @override
-  PropertyAccessorElement getGetter(String getterName) {
+  PropertyAccessorElement? getGetter(String getterName) {
     int length = accessors.length;
     for (int i = 0; i < length; i++) {
       PropertyAccessorElement accessor = accessors[i];
@@ -3996,7 +3992,7 @@
   }
 
   @override
-  MethodElement getMethod(String methodName) {
+  MethodElement? getMethod(String methodName) {
     int length = methods.length;
     for (int i = 0; i < length; i++) {
       MethodElement method = methods[i];
@@ -4008,7 +4004,7 @@
   }
 
   @override
-  PropertyAccessorElement getSetter(String setterName) {
+  PropertyAccessorElement? getSetter(String setterName) {
     return AbstractClassElementImpl.getSetterFromAccessors(
         setterName, accessors);
   }
@@ -4027,25 +4023,25 @@
     assert(_accessors == null);
     assert(_fields == null);
 
-    var context = enclosingUnit.linkedContext;
+    var context = enclosingUnit.linkedContext!;
     var accessorList = <PropertyAccessorElement>[];
     var fieldList = <FieldElement>[];
 
-    var fields = context.getFields(linkedNode);
+    var fields = context.getFields(linkedNode as CompilationUnitMember);
     for (var field in fields) {
       var name = field.name.name;
-      var fieldElement = field.declaredElement as FieldElementImpl;
+      var fieldElement = field.declaredElement as FieldElementImpl?;
       fieldElement ??= FieldElementImpl.forLinkedNodeFactory(
-          this, reference.getChild('@field').getChild(name), field);
+          this, reference!.getChild('@field').getChild(name), field);
       fieldList.add(fieldElement);
 
-      accessorList.add(fieldElement.getter);
+      accessorList.add(fieldElement.getter!);
       if (fieldElement.setter != null) {
-        accessorList.add(fieldElement.setter);
+        accessorList.add(fieldElement.setter!);
       }
     }
 
-    var methods = context.getMethods(linkedNode);
+    var methods = context.getMethods(linkedNode as CompilationUnitMember);
     for (var method in methods) {
       var isGetter = method.isGetter;
       var isSetter = method.isSetter;
@@ -4053,17 +4049,17 @@
 
       var name = method.name.name;
       var containerRef = isGetter
-          ? reference.getChild('@getter')
-          : reference.getChild('@setter');
+          ? reference!.getChild('@getter')
+          : reference!.getChild('@setter');
 
       var accessorElement =
-          method.declaredElement as PropertyAccessorElementImpl;
+          method.declaredElement as PropertyAccessorElementImpl?;
       accessorElement ??= PropertyAccessorElementImpl.forLinkedNode(
           this, containerRef.getChild(name), method);
       accessorList.add(accessorElement);
 
-      var fieldRef = reference.getChild('@field').getChild(name);
-      FieldElementImpl field = fieldRef.element;
+      var fieldRef = reference!.getChild('@field').getChild(name);
+      var field = fieldRef.element as FieldElementImpl?;
       if (field == null) {
         field = FieldElementImpl(name, -1);
         fieldRef.element = field;
@@ -4109,7 +4105,7 @@
       linkedNode.name.staticElement = this;
     }
     if (!linkedNode.isSynthetic) {
-      var enclosingRef = enclosing.reference;
+      var enclosingRef = enclosing.reference!;
 
       getter = PropertyAccessorElementImpl_ImplicitGetter(
         this,
@@ -4127,7 +4123,7 @@
 
   factory FieldElementImpl.forLinkedNodeFactory(
       ElementImpl enclosing, Reference reference, AstNode linkedNode) {
-    var context = enclosing.enclosingUnit.linkedContext;
+    var context = enclosing.enclosingUnit.linkedContext!;
     if (context.shouldBeConstFieldElement(linkedNode)) {
       return ConstFieldElementImpl.forLinkedNode(
         enclosing,
@@ -4144,7 +4140,7 @@
   @override
   bool get isAbstract {
     if (linkedNode != null) {
-      return enclosingUnit.linkedContext.isAbstract(linkedNode);
+      return enclosingUnit.linkedContext!.isAbstract(linkedNode!);
     }
     return hasModifier(Modifier.ABSTRACT);
   }
@@ -4152,7 +4148,7 @@
   @override
   bool get isCovariant {
     if (linkedNode != null) {
-      return linkedContext.isExplicitlyCovariant(linkedNode);
+      return linkedContext!.isExplicitlyCovariant(linkedNode!);
     }
 
     return hasModifier(Modifier.COVARIANT);
@@ -4172,7 +4168,7 @@
   @override
   bool get isExternal {
     if (linkedNode != null) {
-      return enclosingUnit.linkedContext.isExternal(linkedNode);
+      return enclosingUnit.linkedContext!.isExternal(linkedNode!);
     }
     return hasModifier(Modifier.EXTERNAL);
   }
@@ -4180,7 +4176,7 @@
   @override
   bool get isStatic {
     if (linkedNode != null) {
-      return enclosingUnit.linkedContext.isStatic(linkedNode);
+      return enclosingUnit.linkedContext!.isStatic(linkedNode!);
     }
     return hasModifier(Modifier.STATIC);
   }
@@ -4194,7 +4190,7 @@
   ElementKind get kind => ElementKind.FIELD;
 
   @override
-  T accept<T>(ElementVisitor<T> visitor) => visitor.visitFieldElement(this);
+  T? accept<T>(ElementVisitor<T> visitor) => visitor.visitFieldElement(this);
 }
 
 /// A [ParameterElementImpl] that has the additional information of the
@@ -4202,7 +4198,7 @@
 class FieldFormalParameterElementImpl extends ParameterElementImpl
     implements FieldFormalParameterElement {
   /// The field associated with this field formal parameter.
-  FieldElement _field;
+  FieldElement? _field;
 
   /// Initialize a newly created parameter element to have the given [name] and
   /// [nameOffset].
@@ -4210,22 +4206,22 @@
       : super(name, nameOffset);
 
   FieldFormalParameterElementImpl.forLinkedNode(
-      ElementImpl enclosing, Reference reference, AstNode linkedNode)
+      ElementImpl enclosing, Reference? reference, FormalParameter linkedNode)
       : super.forLinkedNode(enclosing, reference, linkedNode);
 
   @override
-  FieldElement get field {
+  FieldElement? get field {
     if (_field == null) {
-      String fieldName;
+      String? fieldName;
       if (linkedNode != null) {
-        fieldName = linkedContext.getFieldFormalParameterName(linkedNode);
+        fieldName = linkedContext!.getFieldFormalParameterName(linkedNode!);
       }
       if (fieldName != null) {
-        Element enclosingConstructor = enclosingElement;
+        Element enclosingConstructor = enclosingElement!;
         if (enclosingConstructor is ConstructorElement) {
           Element enclosingClass = enclosingConstructor.enclosingElement;
           if (enclosingClass is ClassElement) {
-            FieldElement field = enclosingClass.getField(fieldName);
+            var field = enclosingClass.getField(fieldName);
             if (field != null && !field.isSynthetic) {
               _field = field;
             }
@@ -4236,7 +4232,7 @@
     return _field;
   }
 
-  set field(FieldElement field) {
+  set field(FieldElement? field) {
     _field = field;
   }
 
@@ -4249,7 +4245,7 @@
   }
 
   @override
-  T accept<T>(ElementVisitor<T> visitor) =>
+  T? accept<T>(ElementVisitor<T> visitor) =>
       visitor.visitFieldFormalParameterElement(this);
 }
 
@@ -4286,7 +4282,7 @@
   @override
   String get displayName {
     if (linkedNode != null) {
-      return reference.name;
+      return reference!.name;
     }
     return super.displayName;
   }
@@ -4294,7 +4290,7 @@
   @override
   String get identifier {
     String identifier = super.identifier;
-    Element enclosing = enclosingElement;
+    Element? enclosing = enclosingElement;
     if (enclosing is ExecutableElement || enclosing is VariableElement) {
       identifier += "@$nameOffset";
     }
@@ -4313,15 +4309,7 @@
   ElementKind get kind => ElementKind.FUNCTION;
 
   @override
-  String get name {
-    if (linkedNode != null) {
-      return reference.name;
-    }
-    return super.name;
-  }
-
-  @override
-  T accept<T>(ElementVisitor<T> visitor) => visitor.visitFunctionElement(this);
+  T? accept<T>(ElementVisitor<T> visitor) => visitor.visitFunctionElement(this);
 }
 
 class FunctionTypeAliasElementImpl extends TypeAliasElementImpl
@@ -4338,14 +4326,14 @@
   }
 
   @override
-  T accept<T>(ElementVisitor<T> visitor) {
+  T? accept<T>(ElementVisitor<T> visitor) {
     return visitor.visitFunctionTypeAliasElement(this);
   }
 
   @override
   FunctionType instantiate({
-    List<DartType> typeArguments,
-    NullabilitySuffix nullabilitySuffix,
+    required List<DartType> typeArguments,
+    required NullabilitySuffix nullabilitySuffix,
   }) {
     var type = super.instantiate(
       typeArguments: typeArguments,
@@ -4363,33 +4351,33 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class FunctionTypedElementImpl
-    implements ElementImpl, FunctionTypedElement {
+    implements _ExistingElementImpl, FunctionTypedElement {
   set returnType(DartType returnType);
 }
 
 /// The element used for a generic function type.
 ///
 /// Clients may not extend, implement or mix-in this class.
-class GenericFunctionTypeElementImpl extends ElementImpl
+class GenericFunctionTypeElementImpl extends _ExistingElementImpl
     with TypeParameterizedElementMixin
     implements
         GenericFunctionTypeElement,
         FunctionTypedElementImpl,
         ElementImplWithFunctionType {
   /// The declared return type of the function.
-  DartType _returnType;
+  DartType? _returnType;
 
   /// The elements representing the parameters of the function.
-  List<ParameterElement> _parameters;
+  List<ParameterElement>? _parameters;
 
   /// Is `true` if the type has the question mark, so is nullable.
   bool _isNullable = false;
 
   /// The type defined by this element.
-  FunctionType _type;
+  FunctionType? _type;
 
   GenericFunctionTypeElementImpl.forLinkedNode(
-      ElementImpl enclosingElement, Reference reference, AstNode linkedNode)
+      ElementImpl enclosingElement, Reference? reference, AstNode linkedNode)
       : super.forLinkedNode(enclosingElement, reference, linkedNode) {
     if (linkedNode is GenericFunctionTypeImpl) {
       linkedNode.declaredElement = this;
@@ -4427,12 +4415,12 @@
   List<ParameterElement> get parameters {
     if (_parameters == null) {
       if (linkedNode != null) {
-        var context = enclosingUnit.linkedContext;
+        var context = enclosingUnit.linkedContext!;
         return _parameters = ParameterElementImpl.forLinkedNodeList(
           this,
           context,
           null,
-          context.getFormalParameters(linkedNode),
+          context.getFormalParameters(linkedNode!),
         );
       }
     }
@@ -4463,11 +4451,11 @@
   DartType get returnTypeInternal {
     if (_returnType == null) {
       if (linkedNode != null) {
-        var context = enclosingUnit.linkedContext;
-        return _returnType = context.getReturnType(linkedNode);
+        var context = enclosingUnit.linkedContext!;
+        return _returnType = context.getReturnType(linkedNode!);
       }
     }
-    return _returnType;
+    return _returnType!;
   }
 
   @override
@@ -4481,7 +4469,7 @@
 
   @override
   FunctionType get typeInternal {
-    if (_type != null) return _type;
+    if (_type != null) return _type!;
 
     return _type = FunctionTypeImpl(
       typeFormals: typeParameters,
@@ -4513,7 +4501,7 @@
   }
 
   @override
-  T accept<T>(ElementVisitor<T> visitor) {
+  T? accept<T>(ElementVisitor<T> visitor) {
     return visitor.visitGenericFunctionTypeElement(this);
   }
 
@@ -4533,12 +4521,12 @@
 
 /// A concrete implementation of a [HideElementCombinator].
 class HideElementCombinatorImpl implements HideElementCombinator {
-  final LinkedUnitContext linkedContext;
-  final HideCombinator linkedNode;
+  final LinkedUnitContext? linkedContext;
+  final HideCombinator? linkedNode;
 
   /// The names that are not to be made visible in the importing library even if
   /// they are defined in the imported library.
-  List<String> _hiddenNames;
+  List<String>? _hiddenNames;
 
   HideElementCombinatorImpl()
       : linkedContext = null,
@@ -4548,10 +4536,10 @@
 
   @override
   List<String> get hiddenNames {
-    if (_hiddenNames != null) return _hiddenNames;
+    if (_hiddenNames != null) return _hiddenNames!;
 
     if (linkedNode != null) {
-      return _hiddenNames = linkedNode.hiddenNames.map((i) => i.name).toList();
+      return _hiddenNames = linkedNode!.hiddenNames.map((i) => i.name).toList();
     }
 
     return _hiddenNames ?? const <String>[];
@@ -4584,18 +4572,18 @@
   int _prefixOffset = 0;
 
   /// The library that is imported into this library by this import directive.
-  LibraryElement _importedLibrary;
+  LibraryElement? _importedLibrary;
 
   /// The combinators that were specified as part of the import directive in the
   /// order in which they were specified.
-  List<NamespaceCombinator> _combinators;
+  List<NamespaceCombinator>? _combinators;
 
   /// The prefix that was specified as part of the import directive, or `null
   ///` if there was no prefix specified.
-  PrefixElement _prefix;
+  PrefixElement? _prefix;
 
   /// The cached value of [namespace].
-  Namespace _namespace;
+  Namespace? _namespace;
 
   /// Initialize a newly created import element at the given [offset].
   /// The offset may be `-1` if the import is synthetic.
@@ -4609,12 +4597,12 @@
 
   @override
   List<NamespaceCombinator> get combinators {
-    if (_combinators != null) return _combinators;
+    if (_combinators != null) return _combinators!;
 
     if (linkedNode != null) {
-      ImportDirective node = linkedNode;
+      var node = linkedNode as ImportDirective;
       return _combinators = ImportElementImpl._buildCombinators2(
-        enclosingUnit.linkedContext,
+        enclosingUnit.linkedContext!,
         node.combinators,
       );
     }
@@ -4628,32 +4616,32 @@
 
   @override
   CompilationUnitElementImpl get enclosingUnit {
-    LibraryElementImpl enclosingLibrary = enclosingElement;
+    var enclosingLibrary = enclosingElement as LibraryElementImpl;
     return enclosingLibrary._definingCompilationUnit;
   }
 
   @override
-  String get identifier => "${importedLibrary.identifier}@$nameOffset";
+  String get identifier => "${importedLibrary?.identifier}@$nameOffset";
 
   @override
-  LibraryElement get importedLibrary {
+  LibraryElement? get importedLibrary {
     if (_importedLibrary != null) return _importedLibrary;
 
     if (linkedNode != null) {
-      linkedContext.applyResolution(linkedNode);
+      linkedContext!.applyResolution(linkedNode!);
     }
 
     return _importedLibrary;
   }
 
-  set importedLibrary(LibraryElement importedLibrary) {
+  set importedLibrary(LibraryElement? importedLibrary) {
     _importedLibrary = importedLibrary;
   }
 
   @override
   bool get isDeferred {
     if (linkedNode != null) {
-      ImportDirective linkedNode = this.linkedNode;
+      var linkedNode = this.linkedNode as ImportDirective;
       return linkedNode.deferredKeyword != null;
     }
     return hasModifier(Modifier.DEFERRED);
@@ -4670,7 +4658,7 @@
   @override
   int get nameOffset {
     if (linkedNode != null) {
-      return linkedContext.getDirectiveOffset(linkedNode);
+      return linkedContext!.getDirectiveOffset(linkedNode as Directive);
     }
 
     return super.nameOffset;
@@ -4683,18 +4671,18 @@
   }
 
   @override
-  PrefixElement get prefix {
+  PrefixElement? get prefix {
     if (_prefix != null) return _prefix;
 
     if (linkedNode != null) {
-      ImportDirective linkedNode = this.linkedNode;
+      var linkedNode = this.linkedNode as ImportDirective;
       var prefix = linkedNode.prefix;
       if (prefix != null) {
         var name = prefix.name;
         var library = enclosingElement as LibraryElementImpl;
         _prefix = PrefixElementImpl.forLinkedNode(
           library,
-          library.reference.getChild('@prefix').getChild(name),
+          library.reference!.getChild('@prefix').getChild(name),
           prefix,
         );
       }
@@ -4703,14 +4691,14 @@
     return _prefix;
   }
 
-  set prefix(PrefixElement prefix) {
+  set prefix(PrefixElement? prefix) {
     _prefix = prefix;
   }
 
   @override
   int get prefixOffset {
     if (linkedNode != null) {
-      ImportDirective node = linkedNode;
+      var node = linkedNode as ImportDirective;
       return node.prefix?.offset ?? -1;
     }
     return _prefixOffset;
@@ -4721,9 +4709,9 @@
   }
 
   @override
-  String get uri {
+  String? get uri {
     if (linkedNode != null) {
-      ImportDirective node = linkedNode;
+      var node = linkedNode as ImportDirective;
       return node.uri.stringValue;
     }
 
@@ -4731,7 +4719,7 @@
   }
 
   @override
-  T accept<T>(ElementVisitor<T> visitor) => visitor.visitImportElement(this);
+  T? accept<T>(ElementVisitor<T> visitor) => visitor.visitImportElement(this);
 
   @override
   void appendTo(ElementDisplayStringBuilder builder) {
@@ -4796,11 +4784,15 @@
   ElementKind get kind => ElementKind.LABEL;
 
   @override
-  T accept<T>(ElementVisitor<T> visitor) => visitor.visitLabelElement(this);
+  String get name => super.name!;
+
+  @override
+  T? accept<T>(ElementVisitor<T> visitor) => visitor.visitLabelElement(this);
 }
 
 /// A concrete implementation of a [LibraryElement].
-class LibraryElementImpl extends ElementImpl implements LibraryElement {
+class LibraryElementImpl extends _ExistingElementImpl
+    implements LibraryElement {
   /// The analysis context in which this library is defined.
   @override
   final AnalysisContext context;
@@ -4808,33 +4800,35 @@
   @override
   final AnalysisSession session;
 
-  @override
-  TypeProviderImpl typeProvider;
+  bool hasTypeProviderSystemSet = false;
 
   @override
-  TypeSystemImpl typeSystem;
+  late TypeProviderImpl typeProvider;
+
+  @override
+  late TypeSystemImpl typeSystem;
 
   /// The context of the defining unit.
   @override
-  final LinkedUnitContext linkedContext;
+  final LinkedUnitContext? linkedContext;
 
   @override
   final FeatureSet featureSet;
 
   /// The compilation unit that defines this library.
-  CompilationUnitElement _definingCompilationUnit;
+  late CompilationUnitElementImpl _definingCompilationUnit;
 
   /// The entry point for this library, or `null` if this library does not have
   /// an entry point.
-  FunctionElement _entryPoint;
+  FunctionElement? _entryPoint;
 
   /// A list containing specifications of all of the imports defined in this
   /// library.
-  List<ImportElement> _imports;
+  List<ImportElement>? _imports;
 
   /// A list containing specifications of all of the exports defined in this
   /// library.
-  List<ExportElement> _exports;
+  List<ExportElement>? _exports;
 
   /// A list containing all of the compilation units that are included in this
   /// library using a `part` directive.
@@ -4843,24 +4837,24 @@
   /// The element representing the synthetic function `loadLibrary` that is
   /// defined for this library, or `null` if the element has not yet been
   /// created.
-  FunctionElement _loadLibraryFunction;
+  late FunctionElement _loadLibraryFunction;
 
   @override
   final int nameLength;
 
   /// The export [Namespace] of this library, `null` if it has not been
   /// computed yet.
-  Namespace _exportNamespace;
+  Namespace? _exportNamespace;
 
   /// The public [Namespace] of this library, `null` if it has not been
   /// computed yet.
-  Namespace _publicNamespace;
+  Namespace? _publicNamespace;
 
   /// The cached list of prefixes.
-  List<PrefixElement> _prefixes;
+  List<PrefixElement>? _prefixes;
 
   /// The scope of this library, `null` if it has not been created yet.
-  LibraryScope _scope;
+  LibraryScope? _scope;
 
   /// Initialize a newly created library element in the given [context] to have
   /// the given [name] and [offset].
@@ -4886,20 +4880,12 @@
 
   @override
   int get codeLength {
-    CompilationUnitElement unit = _definingCompilationUnit;
-    if (unit is CompilationUnitElementImpl) {
-      return unit.codeLength;
-    }
-    return null;
+    return _definingCompilationUnit.codeLength;
   }
 
   @override
   int get codeOffset {
-    CompilationUnitElement unit = _definingCompilationUnit;
-    if (unit is CompilationUnitElementImpl) {
-      return unit.codeOffset;
-    }
-    return null;
+    return _definingCompilationUnit.codeOffset;
   }
 
   @override
@@ -4915,17 +4901,22 @@
   }
 
   @override
-  String get documentationComment {
+  String? get documentationComment {
     if (linkedNode != null) {
-      var comment = linkedContext.getLibraryDocumentationComment();
+      var comment = linkedContext!.getLibraryDocumentationComment();
       return getCommentNodeRawText(comment);
     }
     return super.documentationComment;
   }
 
   @override
-  FunctionElement get entryPoint {
-    if (_entryPoint != null) return _entryPoint;
+  CompilationUnitElementImpl get enclosingUnit {
+    return _definingCompilationUnit;
+  }
+
+  @override
+  FunctionElement? get entryPoint {
+    if (_entryPoint != null) return _entryPoint!;
 
     if (linkedContext != null) {
       var namespace = library.exportNamespace;
@@ -4939,7 +4930,7 @@
     return _entryPoint;
   }
 
-  set entryPoint(FunctionElement entryPoint) {
+  set entryPoint(FunctionElement? entryPoint) {
     _entryPoint = entryPoint;
   }
 
@@ -4947,7 +4938,7 @@
   List<LibraryElement> get exportedLibraries {
     HashSet<LibraryElement> libraries = HashSet<LibraryElement>();
     for (ExportElement element in exports) {
-      LibraryElement library = element.exportedLibrary;
+      var library = element.exportedLibrary;
       if (library != null) {
         libraries.add(library);
       }
@@ -4957,14 +4948,14 @@
 
   @override
   Namespace get exportNamespace {
-    if (_exportNamespace != null) return _exportNamespace;
+    if (_exportNamespace != null) return _exportNamespace!;
 
     if (linkedNode != null) {
-      var elements = linkedContext.elementFactory;
+      var elements = linkedContext!.elementFactory;
       return _exportNamespace = elements.buildExportNamespace(source.uri);
     }
 
-    return _exportNamespace;
+    return _exportNamespace!;
   }
 
   set exportNamespace(Namespace exportNamespace) {
@@ -4973,13 +4964,13 @@
 
   @override
   List<ExportElement> get exports {
-    if (_exports != null) return _exports;
+    if (_exports != null) return _exports!;
 
     if (linkedNode != null) {
-      var unit = linkedContext.unit_withDirectives;
+      var unit = linkedContext!.unit_withDirectives;
       return _exports = unit.directives
           .whereType<ExportDirective>()
-          .map((node) => node.element)
+          .map((node) => node.element!)
           .toList();
     }
 
@@ -4998,7 +4989,7 @@
   @override
   bool get hasExtUri {
     if (linkedNode != null) {
-      var unit = linkedContext.unit_withDirectives;
+      var unit = linkedContext!.unit_withDirectives;
       for (var import in unit.directives) {
         if (import is ImportDirective) {
           var uriLiteral = import.uri;
@@ -5023,11 +5014,8 @@
 
   @override
   bool get hasLoadLibraryFunction {
-    if (_definingCompilationUnit.hasLoadLibraryFunction) {
-      return true;
-    }
-    for (int i = 0; i < _parts.length; i++) {
-      if (_parts[i].hasLoadLibraryFunction) {
+    for (int i = 0; i < units.length; i++) {
+      if (units[i].hasLoadLibraryFunction) {
         return true;
       }
     }
@@ -5041,7 +5029,7 @@
   List<LibraryElement> get importedLibraries {
     HashSet<LibraryElement> libraries = HashSet<LibraryElement>();
     for (ImportElement element in imports) {
-      LibraryElement library = element.importedLibrary;
+      var library = element.importedLibrary;
       if (library != null) {
         libraries.add(library);
       }
@@ -5051,27 +5039,27 @@
 
   @override
   List<ImportElement> get imports {
-    if (_imports != null) return _imports;
+    if (_imports != null) return _imports!;
 
     if (linkedNode != null) {
-      var unit = linkedContext.unit_withDirectives;
+      var unit = linkedContext!.unit_withDirectives;
       _imports = unit.directives
           .whereType<ImportDirective>()
-          .map((node) => node.element)
+          .map((node) => node.element!)
           .toList();
-      var hasCore = _imports.any((import) {
+      var hasCore = _imports!.any((import) {
         return import.importedLibrary?.isDartCore ?? false;
       });
       if (!hasCore) {
-        var elements = linkedContext.elementFactory;
-        _imports.add(
+        var elements = linkedContext!.elementFactory;
+        _imports!.add(
           ImportElementImpl(-1)
-            ..importedLibrary = elements.libraryOfUri('dart:core')
+            ..importedLibrary = elements.libraryOfUri2('dart:core')
             ..isSynthetic = true
             ..uri = 'dart:core',
         );
       }
-      return _imports;
+      return _imports!;
     }
 
     return _imports ??= const <ImportElement>[];
@@ -5082,7 +5070,7 @@
   set imports(List<ImportElement> imports) {
     for (ImportElement importElement in imports) {
       (importElement as ImportElementImpl).enclosingElement = this;
-      PrefixElementImpl prefix = importElement.prefix as PrefixElementImpl;
+      var prefix = importElement.prefix as PrefixElementImpl?;
       if (prefix != null) {
         prefix.enclosingElement = this;
       }
@@ -5103,11 +5091,8 @@
 
   @override
   bool get isInSdk {
-    Uri uri = definingCompilationUnit.source?.uri;
-    if (uri != null) {
-      return DartUriResolver.isDartUri(uri);
-    }
-    return false;
+    var uri = definingCompilationUnit.source.uri;
+    return DartUriResolver.isDartUri(uri);
   }
 
   @override
@@ -5122,11 +5107,11 @@
   /// 'dart:html' libraries.
   bool get isOrImportsBrowserLibrary {
     List<LibraryElement> visited = <LibraryElement>[];
-    Source htmlLibSource = context.sourceFactory.forUri(DartSdk.DART_HTML);
+    var htmlLibSource = context.sourceFactory.forUri(DartSdk.DART_HTML);
     visited.add(this);
     for (int index = 0; index < visited.length; index++) {
       LibraryElement library = visited[index];
-      Source source = library.definingCompilationUnit.source;
+      var source = library.definingCompilationUnit.source;
       if (source == htmlLibSource) {
         return true;
       }
@@ -5147,7 +5132,7 @@
   @override
   bool get isSynthetic {
     if (linkedNode != null) {
-      return linkedContext.isSynthetic;
+      return linkedContext!.isSynthetic;
     }
     return super.isSynthetic;
   }
@@ -5157,36 +5142,36 @@
 
   @override
   LibraryLanguageVersion get languageVersion {
-    if (_languageVersion != null) return _languageVersion;
+    if (_languageVersion != null) return _languageVersion!;
 
     if (linkedNode != null) {
-      _languageVersion = linkedContext.getLanguageVersion(linkedNode);
-      return _languageVersion;
+      _languageVersion =
+          linkedContext!.getLanguageVersion(linkedNode as CompilationUnit);
+      return _languageVersion!;
     }
 
     _languageVersion = LibraryLanguageVersion(
       package: ExperimentStatus.currentVersion,
       override: null,
     );
-    return _languageVersion;
+    return _languageVersion!;
   }
 
   @override
-  LibraryElement get library => this;
+  LibraryElementImpl get library => this;
 
   @override
   FunctionElement get loadLibraryFunction {
-    assert(_loadLibraryFunction != null);
     return _loadLibraryFunction;
   }
 
   @override
   List<ElementAnnotation> get metadata {
-    if (_metadata != null) return _metadata;
+    if (_metadata != null) return _metadata!;
 
     if (linkedNode != null) {
-      var metadata = linkedContext.getLibraryMetadata();
-      return _metadata = _buildAnnotations2(definingCompilationUnit, metadata);
+      var metadata = linkedContext!.getLibraryMetadata();
+      return _metadata = _buildAnnotations2(_definingCompilationUnit, metadata);
     }
 
     return super.metadata;
@@ -5212,14 +5197,14 @@
 
   @override
   Namespace get publicNamespace {
-    if (_publicNamespace != null) return _publicNamespace;
+    if (_publicNamespace != null) return _publicNamespace!;
 
     if (linkedNode != null) {
       return _publicNamespace =
           NamespaceBuilder().createPublicNamespaceForLibrary(this);
     }
 
-    return _publicNamespace;
+    return _publicNamespace!;
   }
 
   set publicNamespace(Namespace publicNamespace) {
@@ -5233,9 +5218,6 @@
 
   @override
   Source get source {
-    if (_definingCompilationUnit == null) {
-      return null;
-    }
     return _definingCompilationUnit.source;
   }
 
@@ -5262,7 +5244,7 @@
   }
 
   @override
-  T accept<T>(ElementVisitor<T> visitor) => visitor.visitLibraryElement(this);
+  T? accept<T>(ElementVisitor<T> visitor) => visitor.visitLibraryElement(this);
 
   /// Create the [FunctionElement] to be returned by [loadLibraryFunction].
   /// The [typeProvider] must be already set.
@@ -5274,8 +5256,8 @@
           ..returnType = typeProvider.futureDynamicType;
   }
 
-  ClassElement getEnum(String name) {
-    ClassElement element = _definingCompilationUnit.getEnum(name);
+  ClassElement? getEnum(String name) {
+    var element = _definingCompilationUnit.getEnum(name);
     if (element != null) {
       return element;
     }
@@ -5294,14 +5276,14 @@
   }
 
   @override
-  ClassElement getType(String className) {
+  ClassElement? getType(String className) {
     return getTypeFromParts(className, _definingCompilationUnit, _parts);
   }
 
   @override
   T toLegacyElementIfOptOut<T extends Element>(T element) {
     if (isNonNullableByDefault) return element;
-    return Member.legacy(element);
+    return Member.legacy(element) as T;
   }
 
   @override
@@ -5313,7 +5295,7 @@
   @override
   void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
-    _definingCompilationUnit?.accept(visitor);
+    _definingCompilationUnit.accept(visitor);
     safelyVisitChildren(exports, visitor);
     safelyVisitChildren(imports, visitor);
     safelyVisitChildren(_parts, visitor);
@@ -5323,7 +5305,7 @@
       List<ImportElement> imports) {
     HashSet<PrefixElement> prefixes = HashSet<PrefixElement>();
     for (ImportElement element in imports) {
-      PrefixElement prefix = element.prefix;
+      var prefix = element.prefix;
       if (prefix != null) {
         prefixes.add(prefix);
       }
@@ -5343,11 +5325,11 @@
     return importList;
   }
 
-  static ClassElement getTypeFromParts(
+  static ClassElement? getTypeFromParts(
       String className,
       CompilationUnitElement definingCompilationUnit,
       List<CompilationUnitElement> parts) {
-    ClassElement type = definingCompilationUnit.getType(className);
+    var type = definingCompilationUnit.getType(className);
     if (type != null) {
       return type;
     }
@@ -5365,7 +5347,7 @@
 class LocalVariableElementImpl extends NonParameterVariableElementImpl
     implements LocalVariableElement {
   @override
-  bool hasInitializer;
+  late bool hasInitializer;
 
   /// Initialize a newly created method element to have the given [name] and
   /// [offset].
@@ -5390,7 +5372,7 @@
   ElementKind get kind => ElementKind.LOCAL_VARIABLE;
 
   @override
-  T accept<T>(ElementVisitor<T> visitor) =>
+  T? accept<T>(ElementVisitor<T> visitor) =>
       visitor.visitLocalVariableElement(this);
 }
 
@@ -5403,7 +5385,7 @@
 
   /// The error reported during type inference for this variable, or `null` if
   /// this variable is not a subject of type inference, or there was no error.
-  TopLevelInferenceError typeInferenceError;
+  TopLevelInferenceError? typeInferenceError;
 
   /// Initialize a newly created method element to have the given [name] at the
   /// given [offset].
@@ -5448,7 +5430,7 @@
   @override
   bool get isStatic {
     if (linkedNode != null) {
-      return enclosingUnit.linkedContext.isStatic(linkedNode);
+      return enclosingUnit.linkedContext!.isStatic(linkedNode!);
     }
     return hasModifier(Modifier.STATIC);
   }
@@ -5467,11 +5449,11 @@
     if (name == '-' && parametersInternal.isEmpty) {
       return 'unary-';
     }
-    return super.name;
+    return name;
   }
 
   @override
-  T accept<T>(ElementVisitor<T> visitor) => visitor.visitMethodElement(this);
+  T? accept<T>(ElementVisitor<T> visitor) => visitor.visitMethodElement(this);
 }
 
 /// A [ClassElementImpl] representing a mixin declaration.
@@ -5482,10 +5464,10 @@
 
   /// A list containing all of the superclass constraints that are defined for
   /// the mixin.
-  List<InterfaceType> _superclassConstraints;
+  List<InterfaceType>? _superclassConstraints;
 
   @override
-  List<String> superInvokedNames;
+  late List<String> superInvokedNames;
 
   /// Initialize a newly created class element to have the given [name] at the
   /// given [offset] in the file that contains the declaration of this element.
@@ -5508,12 +5490,12 @@
 
   @override
   List<InterfaceType> get superclassConstraints {
-    if (_superclassConstraints != null) return _superclassConstraints;
+    if (_superclassConstraints != null) return _superclassConstraints!;
 
     var linkedNode = this.linkedNode;
     if (linkedNode is MixinDeclaration) {
-      linkedContext.applyResolution(linkedNode);
-      List<InterfaceType> constraints;
+      linkedContext!.applyResolution(linkedNode);
+      List<InterfaceType>? constraints;
       var onClause = linkedNode.onClause;
       if (onClause != null) {
         constraints = onClause.superclassConstraints
@@ -5536,10 +5518,10 @@
   }
 
   @override
-  InterfaceType get supertype => null;
+  InterfaceType? get supertype => null;
 
   @override
-  set supertype(InterfaceType supertype) {
+  set supertype(InterfaceType? supertype) {
     throw StateError('Attempt to set a supertype for a mixin declaratio.');
   }
 
@@ -5686,16 +5668,16 @@
       this.context, this.session, this.name, this.conflictingElements);
 
   @override
-  Element get declaration => null;
+  Element? get declaration => null;
 
   @override
   String get displayName => name;
 
   @override
-  String get documentationComment => null;
+  String? get documentationComment => null;
 
   @override
-  Element get enclosingElement => null;
+  Element? get enclosingElement => null;
 
   @override
   bool get hasAlwaysThrows => false;
@@ -5753,11 +5735,7 @@
 
   @override
   bool get isPrivate {
-    String name = displayName;
-    if (name == null) {
-      return false;
-    }
-    return Identifier.isPrivateName(name);
+    throw UnimplementedError();
   }
 
   @override
@@ -5772,32 +5750,32 @@
   ElementKind get kind => ElementKind.ERROR;
 
   @override
-  LibraryElement get library => null;
+  LibraryElement? get library => null;
 
   @override
-  Source get librarySource => null;
+  Source? get librarySource => null;
 
   @override
-  ElementLocation get location => null;
+  ElementLocation? get location => null;
 
   @override
   List<ElementAnnotation> get metadata => const <ElementAnnotation>[];
 
   @override
-  int get nameLength => displayName != null ? displayName.length : 0;
+  int get nameLength => 0;
 
   @override
   int get nameOffset => -1;
 
   @override
-  Source get source => null;
+  Source? get source => null;
 
   @override
-  T accept<T>(ElementVisitor<T> visitor) =>
+  T? accept<T>(ElementVisitor<T> visitor) =>
       visitor.visitMultiplyDefinedElement(this);
 
   @override
-  String getDisplayString({@required bool withNullability}) {
+  String getDisplayString({required bool withNullability}) {
     var elementsStr = conflictingElements.map((e) {
       return e.getDisplayString(
         withNullability: withNullability,
@@ -5807,7 +5785,7 @@
   }
 
   @override
-  String getExtendedDisplayName(String shortName) {
+  String getExtendedDisplayName(String? shortName) {
     if (shortName != null) {
       return shortName;
     }
@@ -5815,7 +5793,7 @@
   }
 
   @override
-  bool isAccessibleIn(LibraryElement library) {
+  bool isAccessibleIn(LibraryElement? library) {
     for (Element element in conflictingElements) {
       if (element.isAccessibleIn(library)) {
         return true;
@@ -5825,11 +5803,11 @@
   }
 
   @override
-  E thisOrAncestorMatching<E extends Element>(Predicate<Element> predicate) =>
+  E? thisOrAncestorMatching<E extends Element>(Predicate<Element> predicate) =>
       null;
 
   @override
-  E thisOrAncestorOfType<E extends Element>() => null;
+  E? thisOrAncestorOfType<E extends Element>() => null;
 
   @override
   String toString() {
@@ -5863,8 +5841,7 @@
 /// The synthetic element representing the declaration of the type `Never`.
 class NeverElementImpl extends ElementImpl implements TypeDefiningElement {
   /// Return the unique instance of this class.
-  static NeverElementImpl get instance =>
-      NeverTypeImpl.instance.element as NeverElementImpl;
+  static NeverElementImpl get instance => NeverTypeImpl.instance.element;
 
   /// Initialize a newly created instance of this class. Instances of this class
   /// should <b>not</b> be created except as part of creating the type
@@ -5878,10 +5855,10 @@
   ElementKind get kind => ElementKind.NEVER;
 
   @override
-  T accept<T>(ElementVisitor<T> visitor) => null;
+  T? accept<T>(ElementVisitor<T> visitor) => null;
 
   DartType instantiate({
-    @required NullabilitySuffix nullabilitySuffix,
+    required NullabilitySuffix nullabilitySuffix,
   }) {
     switch (nullabilitySuffix) {
       case NullabilitySuffix.question:
@@ -5891,12 +5868,12 @@
       case NullabilitySuffix.none:
         return NeverTypeImpl.instance;
     }
-    throw StateError('Unsupported nullability: $nullabilitySuffix');
   }
 }
 
 /// A [VariableElementImpl], which is not a parameter.
-abstract class NonParameterVariableElementImpl extends VariableElementImpl {
+abstract class NonParameterVariableElementImpl extends VariableElementImpl
+    with _HasLibraryMixin {
   /// Initialize a newly created variable element to have the given [name] and
   /// [offset].
   NonParameterVariableElementImpl(String name, int offset)
@@ -5907,47 +5884,51 @@
       : super.forLinkedNode(enclosing, reference, linkedNode);
 
   @override
-  int get codeLength {
+  int? get codeLength {
     if (linkedNode != null) {
-      return linkedContext.getCodeLength(linkedNode);
+      return linkedContext!.getCodeLength(linkedNode!);
     }
     return super.codeLength;
   }
 
   @override
-  int get codeOffset {
+  int? get codeOffset {
     if (linkedNode != null) {
-      return linkedContext.getCodeOffset(linkedNode);
+      return linkedContext!.getCodeOffset(linkedNode!);
     }
     return super.codeOffset;
   }
 
   @override
-  String get documentationComment {
+  String? get documentationComment {
     if (linkedNode != null) {
-      var context = enclosingUnit.linkedContext;
-      var comment = context.getDocumentationComment(linkedNode);
+      var context = enclosingUnit.linkedContext!;
+      var comment = context.getDocumentationComment(linkedNode!);
       return getCommentNodeRawText(comment);
     }
     return super.documentationComment;
   }
 
   @override
+  Element get enclosingElement => super.enclosingElement!;
+
+  @override
   bool get hasImplicitType {
     if (linkedNode != null) {
-      return linkedContext.hasImplicitType(linkedNode);
+      return linkedContext!.hasImplicitType(linkedNode!);
     }
     return super.hasImplicitType;
   }
 
   bool get hasInitializer {
-    return linkedNode != null && linkedContext.hasInitializer(linkedNode);
+    return linkedNode != null &&
+        linkedContext!.hasInitializer(linkedNode as VariableDeclarationImpl);
   }
 
   @override
   String get name {
     if (linkedNode != null) {
-      return reference.name;
+      return reference!.name;
     }
     return super.name;
   }
@@ -5955,7 +5936,7 @@
   @override
   int get nameOffset {
     if (linkedNode != null) {
-      return enclosingUnit.linkedContext.getNameOffset(linkedNode);
+      return enclosingUnit.linkedContext!.getNameOffset(linkedNode!);
     }
 
     return super.nameOffset;
@@ -5977,18 +5958,18 @@
   /// A list containing all of the parameters defined by this parameter element.
   /// There will only be parameters if this parameter is a function typed
   /// parameter.
-  List<ParameterElement> _parameters;
+  List<ParameterElement>? _parameters;
 
   /// A list containing all of the type parameters defined for this parameter
   /// element. There will only be parameters if this parameter is a function
   /// typed parameter.
-  List<TypeParameterElement> _typeParameters;
+  List<TypeParameterElement>? _typeParameters;
 
   /// The kind of this parameter.
-  ParameterKind _parameterKind;
+  ParameterKind? _parameterKind;
 
   /// The Dart code of the default value.
-  String _defaultValueCode;
+  String? _defaultValueCode;
 
   /// True if this parameter inherits from a covariant parameter. This happens
   /// when it overrides a method in a supertype that has a corresponding
@@ -5997,17 +5978,17 @@
 
   /// Initialize a newly created parameter element to have the given [name] and
   /// [nameOffset].
-  ParameterElementImpl(String name, int nameOffset) : super(name, nameOffset);
+  ParameterElementImpl(String? name, int nameOffset) : super(name, nameOffset);
 
   ParameterElementImpl.forLinkedNode(
-      ElementImpl enclosing, Reference reference, FormalParameter linkedNode)
+      ElementImpl enclosing, Reference? reference, FormalParameter linkedNode)
       : super.forLinkedNode(enclosing, reference, linkedNode) {
     assert(linkedNode.isNamed || reference == null);
     FormalParameterImpl.setDeclaredElement(linkedNode, this);
   }
 
   factory ParameterElementImpl.forLinkedNodeFactory(
-      ElementImpl enclosing, Reference reference, FormalParameter node) {
+      ElementImpl enclosing, Reference? reference, FormalParameter node) {
     if (node is FieldFormalParameter) {
       return FieldFormalParameterElementImpl.forLinkedNode(
         enclosing,
@@ -6024,7 +6005,7 @@
 
   /// Creates a synthetic parameter with [name], [type] and [kind].
   factory ParameterElementImpl.synthetic(
-      String name, DartType type, ParameterKind kind) {
+      String? name, DartType type, ParameterKind kind) {
     ParameterElementImpl element = ParameterElementImpl(name, -1);
     element.type = type;
     element.isSynthetic = true;
@@ -6036,7 +6017,7 @@
   ParameterElement get declaration => this;
 
   @override
-  String get defaultValueCode {
+  String? get defaultValueCode {
     var linkedNode = this.linkedNode;
     if (linkedNode is DefaultFormalParameter) {
       return linkedNode.defaultValue?.toSource();
@@ -6046,8 +6027,10 @@
   }
 
   /// Set Dart code of the default value.
-  set defaultValueCode(String defaultValueCode) {
-    _defaultValueCode = StringUtilities.intern(defaultValueCode);
+  set defaultValueCode(String? defaultValueCode) {
+    _defaultValueCode = defaultValueCode != null
+        ? StringUtilities.intern(defaultValueCode)
+        : null;
   }
 
   @override
@@ -6058,7 +6041,7 @@
   @override
   bool get hasImplicitType {
     if (linkedNode != null) {
-      return linkedContext.hasImplicitType(linkedNode);
+      return linkedContext!.hasImplicitType(linkedNode!);
     }
     return super.hasImplicitType;
   }
@@ -6074,7 +6057,7 @@
   /// Return true if this parameter is explicitly marked as being covariant.
   bool get isExplicitlyCovariant {
     if (linkedNode != null) {
-      return linkedContext.isExplicitlyCovariant(linkedNode);
+      return linkedContext!.isExplicitlyCovariant(linkedNode!);
     }
     return hasModifier(Modifier.COVARIANT);
   }
@@ -6088,7 +6071,7 @@
   @override
   bool get isFinal {
     if (linkedNode != null) {
-      FormalParameter linkedNode = this.linkedNode;
+      var linkedNode = this.linkedNode as FormalParameter;
       return linkedNode.isFinal;
     }
     return super.isFinal;
@@ -6106,7 +6089,8 @@
   @override
   String get name {
     if (linkedNode != null) {
-      return linkedContext.getFormalParameterName(linkedNode);
+      return linkedContext!
+          .getFormalParameterName(linkedNode as FormalParameter);
     }
     return super.name;
   }
@@ -6114,7 +6098,7 @@
   @override
   int get nameOffset {
     if (linkedNode != null) {
-      return enclosingUnit.linkedContext.getNameOffset(linkedNode);
+      return enclosingUnit.linkedContext!.getNameOffset(linkedNode!);
     }
 
     return super.nameOffset;
@@ -6122,13 +6106,15 @@
 
   @override
   ParameterKind get parameterKind {
-    if (_parameterKind != null) return _parameterKind;
+    if (_parameterKind != null) return _parameterKind!;
 
     if (linkedNode != null) {
       var linkedNode = this.linkedNode as FormalParameterImpl;
       return linkedNode.kind;
     }
-    return _parameterKind;
+
+    // TODO(migration): Make it impossible by construction.
+    throw StateError('The kind must set.');
   }
 
   set parameterKind(ParameterKind parameterKind) {
@@ -6137,11 +6123,11 @@
 
   @override
   List<ParameterElement> get parameters {
-    if (_parameters != null) return _parameters;
+    if (_parameters != null) return _parameters!;
 
     if (linkedNode != null) {
-      var context = enclosingUnit.linkedContext;
-      var formalParameters = context.getFormalParameters(linkedNode);
+      var context = enclosingUnit.linkedContext!;
+      var formalParameters = context.getFormalParameters(linkedNode!);
       if (formalParameters != null) {
         return _parameters = ParameterElementImpl.forLinkedNodeList(
           this,
@@ -6168,10 +6154,10 @@
 
   @override
   List<TypeParameterElement> get typeParameters {
-    if (_typeParameters != null) return _typeParameters;
+    if (_typeParameters != null) return _typeParameters!;
 
     if (linkedNode != null) {
-      var typeParameters = linkedContext.getTypeParameters2(linkedNode);
+      var typeParameters = linkedContext!.getTypeParameters2(linkedNode!);
       if (typeParameters == null) {
         return _typeParameters = const [];
       }
@@ -6196,7 +6182,8 @@
   }
 
   @override
-  T accept<T>(ElementVisitor<T> visitor) => visitor.visitParameterElement(this);
+  T? accept<T>(ElementVisitor<T> visitor) =>
+      visitor.visitParameterElement(this);
 
   @override
   void appendTo(ElementDisplayStringBuilder builder) {
@@ -6215,8 +6202,8 @@
   static List<ParameterElement> forLinkedNodeList(
       ElementImpl enclosing,
       LinkedUnitContext context,
-      Reference containerRef,
-      List<FormalParameter> formalParameters) {
+      Reference? containerRef,
+      List<FormalParameter>? formalParameters) {
     if (formalParameters == null) {
       return const [];
     }
@@ -6229,7 +6216,7 @@
 
       if (node is DefaultFormalParameter) {
         NormalFormalParameter parameterNode = node.parameter;
-        Reference reference;
+        Reference? reference;
         if (node.isNamed) {
           var name = parameterNode.identifier?.name ?? '';
           reference = containerRef?.getChild(name);
@@ -6270,7 +6257,7 @@
 
   @override
   bool get inheritsCovariant {
-    PropertyInducingElement variable = setter.variable;
+    var variable = setter.variable;
     if (variable is FieldElementImpl) {
       return variable.inheritsCovariant;
     }
@@ -6279,7 +6266,7 @@
 
   @override
   set inheritsCovariant(bool value) {
-    PropertyInducingElement variable = setter.variable;
+    var variable = setter.variable;
     if (variable is FieldElementImpl) {
       variable.inheritsCovariant = value;
     }
@@ -6295,7 +6282,7 @@
 
   @override
   bool get isExplicitlyCovariant {
-    PropertyInducingElement variable = setter.variable;
+    var variable = setter.variable;
     if (variable is FieldElementImpl) {
       return variable.isCovariant;
     }
@@ -6365,9 +6352,9 @@
 }
 
 /// A concrete implementation of a [PrefixElement].
-class PrefixElementImpl extends ElementImpl implements PrefixElement {
+class PrefixElementImpl extends _ExistingElementImpl implements PrefixElement {
   /// The scope of this prefix, `null` if it has not been created yet.
-  PrefixScope _scope;
+  PrefixScope? _scope;
 
   /// Initialize a newly created method element to have the given [name] and
   /// [nameOffset].
@@ -6390,9 +6377,9 @@
   @override
   String get name {
     if (linkedNode != null) {
-      return reference.name;
+      return reference!.name;
     }
-    return super.name;
+    return super.name!;
   }
 
   @override
@@ -6407,7 +6394,7 @@
   Scope get scope => _scope ??= PrefixScope(enclosingElement, this);
 
   @override
-  T accept<T>(ElementVisitor<T> visitor) => visitor.visitPrefixElement(this);
+  T? accept<T>(ElementVisitor<T> visitor) => visitor.visitPrefixElement(this);
 
   @override
   void appendTo(ElementDisplayStringBuilder builder) {
@@ -6420,7 +6407,7 @@
     implements PropertyAccessorElement {
   /// The variable associated with this accessor.
   @override
-  PropertyInducingElement variable;
+  late PropertyInducingElement variable;
 
   /// Initialize a newly created property accessor element to have the given
   /// [name] and [offset].
@@ -6433,7 +6420,7 @@
   /// Initialize a newly created synthetic property accessor element to be
   /// associated with the given [variable].
   PropertyAccessorElementImpl.forVariable(PropertyInducingElementImpl variable,
-      {Reference reference})
+      {Reference? reference})
       : super(variable.name, variable.nameOffset, reference: reference) {
     this.variable = variable;
     isAbstract = variable is FieldElementImpl && variable.isAbstract;
@@ -6442,16 +6429,16 @@
   }
 
   @override
-  PropertyAccessorElement get correspondingGetter {
-    if (isGetter || variable == null) {
+  PropertyAccessorElement? get correspondingGetter {
+    if (isGetter) {
       return null;
     }
     return variable.getter;
   }
 
   @override
-  PropertyAccessorElement get correspondingSetter {
-    if (isSetter || variable == null) {
+  PropertyAccessorElement? get correspondingSetter {
+    if (isSetter) {
       return null;
     }
     return variable.setter;
@@ -6475,7 +6462,7 @@
   @override
   bool get isGetter {
     if (linkedNode != null) {
-      return enclosingUnit.linkedContext.isGetter(linkedNode);
+      return enclosingUnit.linkedContext!.isGetter(linkedNode!);
     }
     return hasModifier(Modifier.GETTER);
   }
@@ -6488,7 +6475,7 @@
   @override
   bool get isSetter {
     if (linkedNode != null) {
-      return enclosingUnit.linkedContext.isSetter(linkedNode);
+      return enclosingUnit.linkedContext!.isSetter(linkedNode!);
     }
     return hasModifier(Modifier.SETTER);
   }
@@ -6501,7 +6488,7 @@
   @override
   bool get isStatic {
     if (linkedNode != null) {
-      return enclosingUnit.linkedContext.isStatic(linkedNode);
+      return enclosingUnit.linkedContext!.isStatic(linkedNode!);
     }
     return hasModifier(Modifier.STATIC);
   }
@@ -6522,7 +6509,7 @@
   @override
   String get name {
     if (linkedNode != null) {
-      var name = reference.name;
+      var name = reference!.name;
       if (isSetter) {
         return '$name=';
       }
@@ -6535,7 +6522,7 @@
   }
 
   @override
-  T accept<T>(ElementVisitor<T> visitor) =>
+  T? accept<T>(ElementVisitor<T> visitor) =>
       visitor.visitPropertyAccessorElement(this);
 
   @override
@@ -6553,14 +6540,16 @@
   /// Create the implicit getter and bind it to the [property].
   PropertyAccessorElementImpl_ImplicitGetter(
       PropertyInducingElementImpl property,
-      {Reference reference})
+      {Reference? reference})
       : super.forVariable(property, reference: reference) {
     property.getter = this;
-    enclosingElement = property.enclosingElement;
     reference?.element = this;
   }
 
   @override
+  Element get enclosingElement => variable.enclosingElement!;
+
+  @override
   bool get hasImplicitReturnType => variable.hasImplicitType;
 
   @override
@@ -6588,7 +6577,7 @@
 
   @override
   FunctionType get typeInternal {
-    if (_type != null) return _type;
+    if (_type != null) return _type!;
 
     var type = FunctionTypeImpl(
       typeFormals: const <TypeParameterElement>[],
@@ -6599,9 +6588,7 @@
     );
 
     // Don't cache, because types change during top-level inference.
-    if (enclosingElement != null &&
-        linkedContext != null &&
-        !linkedContext.isLinking) {
+    if (linkedContext != null && !linkedContext!.isLinking) {
       _type = type;
     }
 
@@ -6615,13 +6602,15 @@
   /// Create the implicit setter and bind it to the [property].
   PropertyAccessorElementImpl_ImplicitSetter(
       PropertyInducingElementImpl property,
-      {Reference reference})
+      {Reference? reference})
       : super.forVariable(property, reference: reference) {
     property.setter = this;
-    enclosingElement = property.enclosingElement;
   }
 
   @override
+  Element get enclosingElement => variable.enclosingElement!;
+
+  @override
   bool get isSetter => true;
 
   @override
@@ -6657,7 +6646,7 @@
 
   @override
   FunctionType get typeInternal {
-    if (_type != null) return _type;
+    if (_type != null) return _type!;
 
     var type = FunctionTypeImpl(
       typeFormals: const <TypeParameterElement>[],
@@ -6668,9 +6657,7 @@
     );
 
     // Don't cache, because types change during top-level inference.
-    if (enclosingElement != null &&
-        linkedContext != null &&
-        !linkedContext.isLinking) {
+    if (linkedContext != null && !linkedContext!.isLinking) {
       _type = type;
     }
 
@@ -6683,21 +6670,21 @@
     extends NonParameterVariableElementImpl implements PropertyInducingElement {
   /// The getter associated with this element.
   @override
-  PropertyAccessorElement getter;
+  PropertyAccessorElement? getter;
 
   /// The setter associated with this element, or `null` if the element is
   /// effectively `final` and therefore does not have a setter associated with
   /// it.
   @override
-  PropertyAccessorElement setter;
+  PropertyAccessorElement? setter;
 
   /// This field is set during linking, and performs type inference for
   /// this property. After linking this field is always `null`.
-  PropertyInducingElementTypeInference typeInference;
+  PropertyInducingElementTypeInference? typeInference;
 
   /// The error reported during type inference for this variable, or `null` if
   /// this variable is not a subject of type inference, or there was no error.
-  TopLevelInferenceError typeInferenceError;
+  TopLevelInferenceError? typeInferenceError;
 
   /// Initialize a newly created synthetic element to have the given [name] and
   /// [offset].
@@ -6715,7 +6702,7 @@
   @override
   bool get isLate {
     if (linkedNode != null) {
-      return enclosingUnit.linkedContext.isLate(linkedNode);
+      return enclosingUnit.linkedContext!.isLate(linkedNode!);
     }
     return hasModifier(Modifier.LATE);
   }
@@ -6725,10 +6712,10 @@
 
   @override
   DartType get typeInternal {
-    if (_type != null) return _type;
+    if (_type != null) return _type!;
 
     if (linkedNode != null) {
-      linkedContext.applyResolution(linkedNode);
+      linkedContext!.applyResolution(linkedNode!);
 
       // While performing inference during linking, the first step is to collect
       // dependencies. During this step we resolve the expression, but we might
@@ -6736,17 +6723,17 @@
       // we give some type. A better solution would be to infer recursively, but
       // we are not doing this yet.
       if (_type == null) {
-        assert(linkedContext.isLinking);
+        assert(linkedContext!.isLinking);
         return DynamicTypeImpl.instance;
       }
 
-      return _type;
+      return _type!;
     }
     if (isSynthetic && _type == null) {
       if (getter != null) {
-        _type = getter.returnType;
+        _type = getter!.returnType;
       } else if (setter != null) {
-        List<ParameterElement> parameters = setter.parameters;
+        List<ParameterElement> parameters = setter!.parameters;
         _type = parameters.isNotEmpty
             ? parameters[0].type
             : DynamicTypeImpl.instance;
@@ -6779,12 +6766,12 @@
 
 /// A concrete implementation of a [ShowElementCombinator].
 class ShowElementCombinatorImpl implements ShowElementCombinator {
-  final LinkedUnitContext linkedContext;
-  final ShowCombinator linkedNode;
+  final LinkedUnitContext? linkedContext;
+  final ShowCombinator? linkedNode;
 
   /// The names that are to be made visible in the importing library if they are
   /// defined in the imported library.
-  List<String> _shownNames;
+  List<String>? _shownNames;
 
   /// The offset of the character immediately following the last character of
   /// this node.
@@ -6802,7 +6789,7 @@
   @override
   int get end {
     if (linkedNode != null) {
-      return linkedNode.end;
+      return linkedNode!.end;
     }
     return _end;
   }
@@ -6814,7 +6801,7 @@
   @override
   int get offset {
     if (linkedNode != null) {
-      return linkedNode.keyword.offset;
+      return linkedNode!.keyword.offset;
     }
     return _offset;
   }
@@ -6825,10 +6812,10 @@
 
   @override
   List<String> get shownNames {
-    if (_shownNames != null) return _shownNames;
+    if (_shownNames != null) return _shownNames!;
 
     if (linkedNode != null) {
-      return _shownNames = linkedNode.shownNames.map((i) => i.name).toList();
+      return _shownNames = linkedNode!.shownNames.map((i) => i.name).toList();
     }
 
     return _shownNames ?? const <String>[];
@@ -6867,7 +6854,7 @@
       linkedNode.name.staticElement = this;
     }
     if (!linkedNode.isSynthetic) {
-      var enclosingRef = enclosing.reference;
+      var enclosingRef = enclosing.reference!;
 
       getter = PropertyAccessorElementImpl_ImplicitGetter(
         this,
@@ -6885,7 +6872,7 @@
 
   factory TopLevelVariableElementImpl.forLinkedNodeFactory(
       ElementImpl enclosing, Reference reference, AstNode linkedNode) {
-    if (enclosing.enclosingUnit.linkedContext.isConst(linkedNode)) {
+    if (enclosing.enclosingUnit.linkedContext!.isConst(linkedNode)) {
       return ConstTopLevelVariableElementImpl.forLinkedNode(
         enclosing,
         reference,
@@ -6905,7 +6892,7 @@
   @override
   bool get isExternal {
     if (linkedNode != null) {
-      return enclosingUnit.linkedContext.isExternal(linkedNode);
+      return enclosingUnit.linkedContext!.isExternal(linkedNode!);
     }
     return hasModifier(Modifier.EXTERNAL);
   }
@@ -6917,14 +6904,14 @@
   ElementKind get kind => ElementKind.TOP_LEVEL_VARIABLE;
 
   @override
-  T accept<T>(ElementVisitor<T> visitor) =>
+  T? accept<T>(ElementVisitor<T> visitor) =>
       visitor.visitTopLevelVariableElement(this);
 }
 
 /// An element that represents [GenericTypeAlias].
 ///
 /// Clients may not extend, implement or mix-in this class.
-class TypeAliasElementImpl extends ElementImpl
+class TypeAliasElementImpl extends _ExistingElementImpl
     with TypeParameterizedElementMixin
     implements TypeAliasElement {
   /// TODO(scheglov) implement as modifier
@@ -6936,8 +6923,8 @@
   bool hasSelfReference = false;
 
   bool _isAliasedElementReady = false;
-  ElementImpl _aliasedElement;
-  DartType _aliasedType;
+  ElementImpl? _aliasedElement;
+  DartType? _aliasedType;
 
   TypeAliasElementImpl(String name, int nameOffset) : super(name, nameOffset);
 
@@ -6974,14 +6961,14 @@
   }
 
   @override
-  ElementImpl get aliasedElement {
+  ElementImpl? get aliasedElement {
     _ensureAliasedElement();
     return _aliasedElement;
   }
 
   @override
   DartType get aliasedType {
-    if (_aliasedType != null) return _aliasedType;
+    if (_aliasedType != null) return _aliasedType!;
 
     _ensureAliasedElement();
 
@@ -7001,7 +6988,7 @@
       _aliasedType = (_aliasedElement as GenericFunctionTypeElementImpl).type;
     }
 
-    return _aliasedType;
+    return _aliasedType!;
   }
 
   set aliasedType(DartType rawType) {
@@ -7011,27 +6998,27 @@
   @override
   int get codeLength {
     if (linkedNode != null) {
-      return linkedContext.getCodeLength(linkedNode);
+      return linkedContext!.getCodeLength(linkedNode!);
     }
-    return super.codeLength;
+    return super.codeLength!;
   }
 
   @override
   int get codeOffset {
     if (linkedNode != null) {
-      return linkedContext.getCodeOffset(linkedNode);
+      return linkedContext!.getCodeOffset(linkedNode!);
     }
-    return super.codeOffset;
+    return super.codeOffset!;
   }
 
   @override
   String get displayName => name;
 
   @override
-  String get documentationComment {
+  String? get documentationComment {
     if (linkedNode != null) {
-      var context = enclosingUnit.linkedContext;
-      var comment = context.getDocumentationComment(linkedNode);
+      var context = enclosingUnit.linkedContext!;
+      var comment = context.getDocumentationComment(linkedNode!);
       return getCommentNodeRawText(comment);
     }
     return super.documentationComment;
@@ -7053,15 +7040,15 @@
   @override
   String get name {
     if (linkedNode != null) {
-      return reference.name;
+      return reference!.name;
     }
-    return super.name;
+    return super.name!;
   }
 
   @override
   int get nameOffset {
     if (linkedNode != null) {
-      return enclosingUnit.linkedContext.getNameOffset(linkedNode);
+      return enclosingUnit.linkedContext!.getNameOffset(linkedNode!);
     }
 
     return super.nameOffset;
@@ -7077,7 +7064,7 @@
   }
 
   @override
-  T accept<T>(ElementVisitor<T> visitor) {
+  T? accept<T>(ElementVisitor<T> visitor) {
     return visitor.visitTypeAliasElement(this);
   }
 
@@ -7088,8 +7075,8 @@
 
   @override
   DartType instantiate({
-    List<DartType> typeArguments,
-    NullabilitySuffix nullabilitySuffix,
+    required List<DartType> typeArguments,
+    required NullabilitySuffix nullabilitySuffix,
   }) {
     if (hasSelfReference) {
       if (isNonFunctionTypeAliasesEnabled) {
@@ -7138,19 +7125,20 @@
         var type = linkedNode.type;
         if (type is GenericFunctionTypeImpl) {
           _aliasedElement =
-              type.declaredElement as GenericFunctionTypeElementImpl;
+              type.declaredElement as GenericFunctionTypeElementImpl?;
           // TODO(scheglov) Do we need this?
           // We probably should set it when linking and when applying.
-          // TODO(scheglov) And remove the reference.
+          // TODO(scheglov) And remove the reference!.
           _aliasedElement ??= GenericFunctionTypeElementImpl.forLinkedNode(
             this,
-            reference.getChild('@function'),
+            reference!.getChild('@function'),
             type,
           );
         } else if (isNonFunctionTypeAliasesEnabled) {
           // No element for `typedef A<T> = List<T>;`
         } else {
           _aliasedElement = GenericFunctionTypeElementImpl.forOffset(-1)
+            ..enclosingElement = this
             ..typeParameters = const <TypeParameterElement>[]
             ..parameters = const <ParameterElement>[]
             ..returnType = DynamicTypeImpl.instance;
@@ -7159,11 +7147,11 @@
         // TODO(scheglov) Same as above (both).
         _aliasedElement = GenericFunctionTypeElementImpl.forLinkedNode(
           this,
-          reference.getChild('@function'),
+          reference!.getChild('@function'),
           linkedNode,
         );
       }
-      linkedContext.applyResolution(linkedNode);
+      linkedContext!.applyResolution(linkedNode);
     }
   }
 
@@ -7183,15 +7171,15 @@
   /// The default value of the type parameter. It is used to provide the
   /// corresponding missing type argument in type annotations and as the
   /// fall-back type value in type inference.
-  DartType defaultType;
+  DartType? defaultType;
 
   /// The type representing the bound associated with this parameter, or `null`
   /// if this parameter does not have an explicit bound.
-  DartType _bound;
+  DartType? _bound;
 
   /// The value representing the variance modifier keyword, or `null` if
   /// there is no explicit variance modifier, meaning legacy covariance.
-  Variance _variance;
+  Variance? _variance;
 
   /// Initialize a newly created method element to have the given [name] and
   /// [offset].
@@ -7210,13 +7198,14 @@
   }
 
   @override
-  DartType get bound => ElementTypeProvider.current.getTypeParameterBound(this);
+  DartType? get bound =>
+      ElementTypeProvider.current.getTypeParameterBound(this);
 
-  set bound(DartType bound) {
+  set bound(DartType? bound) {
     _bound = bound;
   }
 
-  DartType get boundInternal {
+  DartType? get boundInternal {
     if (_bound != null) return _bound;
 
     var linkedNode = this.linkedNode;
@@ -7230,17 +7219,17 @@
   @override
   int get codeLength {
     if (linkedNode != null) {
-      return linkedContext.getCodeLength(linkedNode);
+      return linkedContext!.getCodeLength(linkedNode!);
     }
-    return super.codeLength;
+    return super.codeLength!;
   }
 
   @override
   int get codeOffset {
     if (linkedNode != null) {
-      return linkedContext.getCodeOffset(linkedNode);
+      return linkedContext!.getCodeOffset(linkedNode!);
     }
-    return super.codeOffset;
+    return super.codeOffset!;
   }
 
   @override
@@ -7262,13 +7251,13 @@
       var node = linkedNode as TypeParameter;
       return node.name.name;
     }
-    return super.name;
+    return super.name!;
   }
 
   @override
   int get nameOffset {
     if (linkedNode != null) {
-      return enclosingUnit.linkedContext.getNameOffset(linkedNode);
+      return enclosingUnit.linkedContext!.getNameOffset(linkedNode!);
     }
 
     return super.nameOffset;
@@ -7278,7 +7267,7 @@
     return _variance ?? Variance.covariant;
   }
 
-  set variance(Variance newVariance) => _variance = newVariance;
+  set variance(Variance? newVariance) => _variance = newVariance;
 
   @override
   bool operator ==(Object other) {
@@ -7295,7 +7284,7 @@
   }
 
   @override
-  T accept<T>(ElementVisitor<T> visitor) =>
+  T? accept<T>(ElementVisitor<T> visitor) =>
       visitor.visitTypeParameterElement(this);
 
   @override
@@ -7305,7 +7294,7 @@
 
   @override
   TypeParameterType instantiate({
-    @required NullabilitySuffix nullabilitySuffix,
+    required NullabilitySuffix nullabilitySuffix,
   }) {
     return TypeParameterTypeImpl(
       element: this,
@@ -7316,22 +7305,22 @@
 
 /// Mixin representing an element which can have type parameters.
 mixin TypeParameterizedElementMixin
-    implements TypeParameterizedElement, ElementImpl {
+    implements _ExistingElementImpl, TypeParameterizedElement {
   /// A cached list containing the type parameters declared by this element
   /// directly, or `null` if the elements have not been created yet. This does
   /// not include type parameters that are declared by any enclosing elements.
-  List<TypeParameterElement> _typeParameterElements;
+  List<TypeParameterElement>? _typeParameterElements;
 
   @override
   bool get isSimplyBounded => true;
 
   @override
   List<TypeParameterElement> get typeParameters {
-    if (_typeParameterElements != null) return _typeParameterElements;
+    if (_typeParameterElements != null) return _typeParameterElements!;
 
     if (linkedNode != null) {
-      linkedContext.applyResolution(linkedNode);
-      var typeParameters = linkedContext.getTypeParameters2(linkedNode);
+      linkedContext!.applyResolution(linkedNode!);
+      var typeParameters = linkedContext!.getTypeParameters2(linkedNode!);
       if (typeParameters == null) {
         return _typeParameterElements = const [];
       }
@@ -7348,7 +7337,7 @@
 }
 
 /// A concrete implementation of a [UriReferencedElement].
-abstract class UriReferencedElementImpl extends ElementImpl
+abstract class UriReferencedElementImpl extends _ExistingElementImpl
     implements UriReferencedElement {
   /// The offset of the URI in the file, or `-1` if this node is synthetic.
   int _uriOffset = -1;
@@ -7358,14 +7347,14 @@
   int _uriEnd = -1;
 
   /// The URI that is specified by this directive.
-  String _uri;
+  String? _uri;
 
   /// Initialize a newly created import element to have the given [name] and
   /// [offset]. The offset may be `-1` if the element is synthetic.
-  UriReferencedElementImpl(String name, int offset) : super(name, offset);
+  UriReferencedElementImpl(String? name, int offset) : super(name, offset);
 
   UriReferencedElementImpl.forLinkedNode(
-      ElementImpl enclosing, Reference reference, AstNode linkedNode)
+      ElementImpl enclosing, Reference? reference, AstNode linkedNode)
       : super.forLinkedNode(enclosing, reference, linkedNode);
 
   /// Initialize using the given serialized information.
@@ -7374,10 +7363,10 @@
 
   /// Return the URI that is specified by this directive.
   @override
-  String get uri => _uri;
+  String? get uri => _uri;
 
   /// Set the URI that is specified by this directive to be the given [uri].
-  set uri(String uri) {
+  set uri(String? uri) {
     _uri = uri;
   }
 
@@ -7407,14 +7396,14 @@
 abstract class VariableElementImpl extends ElementImpl
     implements VariableElement {
   /// The type of this variable.
-  DartType _type;
+  DartType? _type;
 
   /// Initialize a newly created variable element to have the given [name] and
   /// [offset].
-  VariableElementImpl(String name, int offset) : super(name, offset);
+  VariableElementImpl(String? name, int offset) : super(name, offset);
 
   VariableElementImpl.forLinkedNode(
-      ElementImpl enclosing, Reference reference, AstNode linkedNode)
+      ElementImpl enclosing, Reference? reference, AstNode linkedNode)
       : super.forLinkedNode(enclosing, reference, linkedNode);
 
   /// Initialize using the given serialized information.
@@ -7428,7 +7417,7 @@
   /// initializers.  However, analyzer also needs to handle incorrect Dart code,
   /// in which case there might be some constant variables that lack
   /// initializers.
-  Expression get constantInitializer => null;
+  Expression? get constantInitializer => null;
 
   @override
   VariableElement get declaration => this;
@@ -7440,11 +7429,11 @@
   /// compile-time constant expression, or `null` if this variable is not a
   /// 'const' variable, if it does not have an initializer, or if the
   /// compilation unit containing the variable has not been resolved.
-  EvaluationResultImpl get evaluationResult => null;
+  EvaluationResultImpl? get evaluationResult => null;
 
   /// Set the result of evaluating this variable's initializer as a compile-time
   /// constant expression to the given [result].
-  set evaluationResult(EvaluationResultImpl result) {
+  set evaluationResult(EvaluationResultImpl? result) {
     throw StateError("Invalid attempt to set a compile-time constant result");
   }
 
@@ -7461,7 +7450,7 @@
   @override
   bool get isConst {
     if (linkedNode != null) {
-      return enclosingUnit.linkedContext.isConst(linkedNode);
+      return enclosingUnit.linkedContext!.isConst(linkedNode!);
     }
     return hasModifier(Modifier.CONST);
   }
@@ -7477,7 +7466,7 @@
   @override
   bool get isFinal {
     if (linkedNode != null) {
-      return enclosingUnit.linkedContext.isFinal(linkedNode);
+      return enclosingUnit.linkedContext!.isFinal(linkedNode!);
     }
     return hasModifier(Modifier.FINAL);
   }
@@ -7491,6 +7480,9 @@
   bool get isStatic => hasModifier(Modifier.STATIC);
 
   @override
+  String get name => super.name!;
+
+  @override
   DartType get type => ElementTypeProvider.current.getVariableType(this);
 
   set type(DartType type) {
@@ -7501,7 +7493,7 @@
   /// [ElementTypeProvider].
   ///
   /// In most cases, the element's `returnType` getter should be used instead.
-  DartType get typeInternal => _type;
+  DartType get typeInternal => _type!;
 
   @override
   void appendTo(ElementDisplayStringBuilder builder) {
@@ -7509,5 +7501,29 @@
   }
 
   @override
-  DartObject computeConstantValue() => null;
+  DartObject? computeConstantValue() => null;
+}
+
+abstract class _ExistingElementImpl extends ElementImpl with _HasLibraryMixin {
+  _ExistingElementImpl(String? name, int offset, {Reference? reference})
+      : super(name, offset, reference: reference);
+
+  _ExistingElementImpl.forLinkedNode(
+      ElementImpl? enclosingElement, Reference? reference, AstNode? linkedNode)
+      : super.forLinkedNode(enclosingElement, reference, linkedNode);
+
+  /// Initialize using the given serialized information.
+  _ExistingElementImpl.forSerialized(ElementImpl enclosingUnit)
+      : super.forSerialized(enclosingUnit);
+}
+
+mixin _HasLibraryMixin on ElementImpl {
+  @override
+  LibraryElementImpl get library => thisOrAncestorOfType()!;
+
+  @override
+  Source get librarySource => library.source;
+
+  @override
+  Source get source => enclosingElement!.source!;
 }
diff --git a/pkg/analyzer/lib/src/dart/element/extensions.dart b/pkg/analyzer/lib/src/dart/element/extensions.dart
index 1fccef8..f600bd9 100644
--- a/pkg/analyzer/lib/src/dart/element/extensions.dart
+++ b/pkg/analyzer/lib/src/dart/element/extensions.dart
@@ -34,7 +34,7 @@
     }
     var ancestor = enclosingElement;
     if (ancestor is ClassElement || ancestor is ExtensionElement) {
-      if (ancestor.hasDoNotStore) {
+      if (ancestor!.hasDoNotStore) {
         return true;
       }
       ancestor = ancestor.enclosingElement;
@@ -46,7 +46,7 @@
 
 extension ParameterElementExtensions on ParameterElement {
   /// Return [ParameterElement] with the specified properties replaced.
-  ParameterElement copyWith({DartType type, ParameterKind kind}) {
+  ParameterElement copyWith({DartType? type, ParameterKind? kind}) {
     return ParameterElementImpl.synthetic(
       name,
       type ?? this.type,
diff --git a/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart b/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart
index 43bd5eb..56c791f 100644
--- a/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart
+++ b/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart
@@ -7,13 +7,13 @@
 import 'package:analyzer/dart/ast/ast.dart' show AstNode, ConstructorName;
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/error/listener.dart' show ErrorReporter;
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/nullability_eliminator.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_algebra.dart';
 import 'package:analyzer/src/dart/element/type_constraint_gatherer.dart';
+import 'package:analyzer/src/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/element/type_schema.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/error/codes.dart'
@@ -60,13 +60,13 @@
 
   bool get isNonNullableByDefault => _typeSystem.isNonNullableByDefault;
 
-  TypeProvider get typeProvider => _typeSystem.typeProvider;
+  TypeProviderImpl get typeProvider => _typeSystem.typeProvider;
 
   /// Apply an argument constraint, which asserts that the [argument] staticType
   /// is a subtype of the [parameterType].
   void constrainArgument(
       DartType argumentType, DartType parameterType, String parameterName,
-      {ClassElement genericClass}) {
+      {ClassElement? genericClass}) {
     var origin = _TypeConstraintFromArgument(
       argumentType,
       parameterType,
@@ -118,10 +118,10 @@
   /// `_` to precisely represent an unknown type. If [downwardsInferPhase] is
   /// false, we are on our final inference pass, have all available information
   /// including argument types, and must not conclude `_` for any type formal.
-  List<DartType> infer(List<TypeParameterElement> typeFormals,
+  List<DartType>? infer(List<TypeParameterElement> typeFormals,
       {bool considerExtendsClause = true,
-      ErrorReporter errorReporter,
-      AstNode errorNode,
+      ErrorReporter? errorReporter,
+      AstNode? errorNode,
       bool failAtError = false,
       bool downwardsInferPhase = false}) {
     // Initialize the inferred type array.
@@ -134,22 +134,23 @@
     for (int i = 0; i < typeFormals.length; i++) {
       // TODO (kallentu) : Clean up TypeParameterElementImpl casting once
       // variance is added to the interface.
-      TypeParameterElementImpl typeParam = typeFormals[i];
-      _TypeConstraint extendsClause;
-      if (considerExtendsClause && typeParam.bound != null) {
+      var typeParam = typeFormals[i] as TypeParameterElementImpl;
+      _TypeConstraint? extendsClause;
+      var bound = typeParam.bound;
+      if (considerExtendsClause && bound != null) {
         extendsClause = _TypeConstraint.fromExtends(
           typeParam,
           Substitution.fromPairs(typeFormals, inferredTypes)
-              .substituteType(typeParam.bound),
+              .substituteType(bound),
           isNonNullableByDefault: isNonNullableByDefault,
         );
       }
 
+      var constraints = _constraints[typeParam]!;
       inferredTypes[i] = downwardsInferPhase
-          ? _inferTypeParameterFromContext(
-              _constraints[typeParam], extendsClause,
+          ? _inferTypeParameterFromContext(constraints, extendsClause,
               isContravariant: typeParam.variance.isContravariant)
-          : _inferTypeParameterFromAll(_constraints[typeParam], extendsClause,
+          : _inferTypeParameterFromAll(constraints, extendsClause,
               isContravariant: typeParam.variance.isContravariant,
               preferUpwardsInference: !typeParam.isLegacyCovariant);
     }
@@ -164,7 +165,7 @@
     var knownTypes = <TypeParameterElement, DartType>{};
     for (int i = 0; i < typeFormals.length; i++) {
       TypeParameterElement typeParam = typeFormals[i];
-      var constraints = _constraints[typeParam];
+      var constraints = _constraints[typeParam]!;
 
       var typeParamBound = typeParam.bound;
       if (typeParamBound != null) {
@@ -193,7 +194,7 @@
         if (failAtError) return null;
         errorReporter?.reportErrorForNode(
             CompileTimeErrorCode.COULD_NOT_INFER,
-            errorNode,
+            errorNode!,
             [typeParam.name, _formatError(typeParam, inferred, constraints)]);
 
         // Heuristic: even if we failed, keep the erroneous type.
@@ -204,10 +205,10 @@
 
       if (inferred is FunctionType && inferred.typeFormals.isNotEmpty) {
         if (failAtError) return null;
-        var typeFormals = (inferred as FunctionType).typeFormals;
+        var typeFormals = inferred.typeFormals;
         var typeFormalsStr = typeFormals.map(_elementStr).join(', ');
         errorReporter?.reportErrorForNode(
-            CompileTimeErrorCode.COULD_NOT_INFER, errorNode, [
+            CompileTimeErrorCode.COULD_NOT_INFER, errorNode!, [
           typeParam.name,
           ' Inferred candidate type ${_typeStr(inferred)} has type parameters'
               ' [$typeFormalsStr], but a function with'
@@ -259,7 +260,7 @@
             .substituteType(typeParam.bound ?? typeProvider.objectType);
         // TODO(jmesserly): improve this error message.
         errorReporter?.reportErrorForNode(
-            CompileTimeErrorCode.COULD_NOT_INFER, errorNode, [
+            CompileTimeErrorCode.COULD_NOT_INFER, errorNode!, [
           typeParam.name,
           "\nRecursive bound cannot be instantiated: '$typeParamBound'."
               "\nConsider passing explicit type argument(s) "
@@ -278,7 +279,7 @@
   /// unsuccessful, any constraints that were accumulated during the match
   /// attempt have been rewound (see [_rewindConstraints]).
   bool tryMatchSubtypeOf(DartType t1, DartType t2, _TypeConstraintOrigin origin,
-      {@required bool covariant}) {
+      {required bool covariant}) {
     var gatherer = TypeConstraintGatherer(
       typeSystem: _typeSystem,
       typeParameters: _typeParameters,
@@ -288,7 +289,8 @@
       var constraints = gatherer.computeConstraints();
       for (var entry in constraints.entries) {
         if (!entry.value.isEmpty) {
-          _constraints[entry.key].add(
+          var constraint = _constraints[entry.key]!;
+          constraint.add(
             _TypeConstraint(
               origin,
               entry.key,
@@ -329,7 +331,7 @@
   /// type parameter which means we choose the upper bound rather than the
   /// lower bound for normally covariant type parameters.
   DartType _chooseTypeFromConstraints(Iterable<_TypeConstraint> constraints,
-      {bool toKnownType = false, @required bool isContravariant}) {
+      {bool toKnownType = false, required bool isContravariant}) {
     DartType lower = UnknownInferredType.instance;
     DartType upper = UnknownInferredType.instance;
     for (var constraint in constraints) {
@@ -425,8 +427,8 @@
   }
 
   DartType _inferTypeParameterFromAll(
-      List<_TypeConstraint> constraints, _TypeConstraint extendsClause,
-      {@required bool isContravariant, @required bool preferUpwardsInference}) {
+      List<_TypeConstraint> constraints, _TypeConstraint? extendsClause,
+      {required bool isContravariant, required bool preferUpwardsInference}) {
     // See if we already fixed this type from downwards inference.
     // If so, then we aren't allowed to change it based on argument types unless
     // [preferUpwardsInference] is true.
@@ -450,8 +452,8 @@
   }
 
   DartType _inferTypeParameterFromContext(
-      Iterable<_TypeConstraint> constraints, _TypeConstraint extendsClause,
-      {@required bool isContravariant}) {
+      Iterable<_TypeConstraint> constraints, _TypeConstraint? extendsClause,
+      {required bool isContravariant}) {
     DartType t = _chooseTypeFromConstraints(constraints,
         isContravariant: isContravariant);
     if (UnknownInferredType.isUnknown(t)) {
@@ -532,12 +534,12 @@
   final _TypeConstraintOrigin origin;
 
   _TypeConstraint(this.origin, this.typeParameter,
-      {DartType upper, DartType lower})
+      {DartType? upper, DartType? lower})
       : super(upper: upper, lower: lower);
 
   _TypeConstraint.fromExtends(
       TypeParameterElement element, DartType extendsType,
-      {@required bool isNonNullableByDefault})
+      {required bool isNonNullableByDefault})
       : this(
             _TypeConstraintFromExtendsClause(
               element,
@@ -565,11 +567,11 @@
   final DartType argumentType;
   final DartType parameterType;
   final String parameterName;
-  final ClassElement genericClass;
+  final ClassElement? genericClass;
 
   _TypeConstraintFromArgument(
       this.argumentType, this.parameterType, this.parameterName,
-      {this.genericClass, @required bool isNonNullableByDefault})
+      {this.genericClass, required bool isNonNullableByDefault})
       : super(isNonNullableByDefault: isNonNullableByDefault);
 
   @override
@@ -579,13 +581,13 @@
     // available.
     String prefix;
     if (genericClass != null &&
-        (genericClass.name == "List" || genericClass.name == "Map") &&
-        genericClass.library.isDartCore == true) {
+        (genericClass!.name == "List" || genericClass!.name == "Map") &&
+        genericClass!.library.isDartCore == true) {
       // This will become:
       //     "List element"
       //     "Map key"
       //     "Map value"
-      prefix = "${genericClass.name} $parameterName";
+      prefix = "${genericClass!.name} $parameterName";
     } else {
       prefix = "Parameter '$parameterName'";
     }
@@ -603,7 +605,7 @@
   final DartType extendsType;
 
   _TypeConstraintFromExtendsClause(this.typeParam, this.extendsType,
-      {@required bool isNonNullableByDefault})
+      {required bool isNonNullableByDefault})
       : super(isNonNullableByDefault: isNonNullableByDefault);
 
   @override
@@ -620,7 +622,7 @@
   final DartType functionType;
 
   _TypeConstraintFromFunctionContext(this.functionType, this.contextType,
-      {@required bool isNonNullableByDefault})
+      {required bool isNonNullableByDefault})
       : super(isNonNullableByDefault: isNonNullableByDefault);
 
   @override
@@ -638,7 +640,7 @@
   final DartType declaredType;
 
   _TypeConstraintFromReturnType(this.declaredType, this.contextType,
-      {@required bool isNonNullableByDefault})
+      {required bool isNonNullableByDefault})
       : super(isNonNullableByDefault: isNonNullableByDefault);
 
   @override
@@ -657,7 +659,7 @@
 abstract class _TypeConstraintOrigin {
   final bool isNonNullableByDefault;
 
-  _TypeConstraintOrigin({@required this.isNonNullableByDefault});
+  _TypeConstraintOrigin({required this.isNonNullableByDefault});
 
   List<String> formatError();
 
@@ -709,7 +711,7 @@
   /// offer the most constrained (strongest) result type.
   final DartType lowerBound;
 
-  _TypeRange({DartType lower, DartType upper})
+  _TypeRange({DartType? lower, DartType? upper})
       : lowerBound = lower ?? UnknownInferredType.instance,
         upperBound = upper ?? UnknownInferredType.instance;
 
@@ -718,7 +720,7 @@
   /// For example, if [typeName] is 'T' and the range has bounds int and Object
   /// respectively, the returned string will be 'int <: T <: Object'.
   @visibleForTesting
-  String format(String typeName, {@required bool withNullability}) {
+  String format(String typeName, {required bool withNullability}) {
     String typeStr(DartType type) {
       return type.getDisplayString(withNullability: withNullability);
     }
diff --git a/pkg/analyzer/lib/src/dart/element/greatest_lower_bound.dart b/pkg/analyzer/lib/src/dart/element/greatest_lower_bound.dart
index 6998a82..1e9aebf 100644
--- a/pkg/analyzer/lib/src/dart/element/greatest_lower_bound.dart
+++ b/pkg/analyzer/lib/src/dart/element/greatest_lower_bound.dart
@@ -204,7 +204,7 @@
     assert(T1_nullability == NullabilitySuffix.none);
     assert(T2_nullability == NullabilitySuffix.none);
 
-    if (T1 is FunctionType && T2 is FunctionType) {
+    if (T1 is FunctionTypeImpl && T2 is FunctionTypeImpl) {
       return _functionType(T1, T2);
     }
 
@@ -219,18 +219,18 @@
     }
 
     // FutureOr<S1>
-    if (T1 is InterfaceType && T1.isDartAsyncFutureOr) {
+    if (T1 is InterfaceTypeImpl && T1.isDartAsyncFutureOr) {
       var S1 = T1.typeArguments[0];
       // DOWN(FutureOr<S1>, FutureOr<S2>) = FutureOr(S)
       //   S = DOWN(S1, S2)
-      if (T2 is InterfaceType && T2.isDartAsyncFutureOr) {
+      if (T2 is InterfaceTypeImpl && T2.isDartAsyncFutureOr) {
         var S2 = T2.typeArguments[0];
         var S = getGreatestLowerBound(S1, S2);
         return _typeProvider.futureOrType2(S);
       }
       // DOWN(FutureOr<S1>, Future<S2>) = Future(S)
       //   S = DOWN(S1, S2)
-      if (T2 is InterfaceType && T2.isDartAsyncFuture) {
+      if (T2 is InterfaceTypeImpl && T2.isDartAsyncFuture) {
         var S2 = T2.typeArguments[0];
         var S = getGreatestLowerBound(S1, S2);
         return _typeProvider.futureType2(S);
@@ -240,11 +240,11 @@
     }
 
     // FutureOr<S2>
-    if (T2 is InterfaceType && T2.isDartAsyncFutureOr) {
+    if (T2 is InterfaceTypeImpl && T2.isDartAsyncFutureOr) {
       var S2 = T2.typeArguments[0];
       // DOWN(Future<S1>, FutureOr<S2>) = Future<S>
       //   S = DOWN(S1, S2)
-      if (T1 is InterfaceType && T1.isDartAsyncFuture) {
+      if (T1 is InterfaceTypeImpl && T1.isDartAsyncFuture) {
         var S1 = T1.typeArguments[0];
         var S = getGreatestLowerBound(S1, S2);
         return _typeProvider.futureType2(S);
diff --git a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
index a2b00e9..8d44190 100644
--- a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
+++ b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
@@ -10,7 +10,6 @@
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/error/correct_override.dart';
 import 'package:analyzer/src/generated/utilities_general.dart';
-import 'package:meta/meta.dart';
 
 /// Failure because of there is no most specific signature in [candidates].
 class CandidatesConflict extends Conflict {
@@ -18,8 +17,8 @@
   final List<ExecutableElement> candidates;
 
   CandidatesConflict({
-    @required Name name,
-    @required this.candidates,
+    required Name name,
+    required this.candidates,
   }) : super(name);
 }
 
@@ -37,9 +36,9 @@
   final ExecutableElement method;
 
   GetterMethodConflict({
-    @required Name name,
-    @required this.getter,
-    @required this.method,
+    required Name name,
+    required this.getter,
+    required this.method,
   }) : super(name);
 }
 
@@ -58,12 +57,12 @@
   ///
   /// If such signature does not exist, return `null`, and if [conflicts] is
   /// not `null`, add a new [Conflict] to it.
-  ExecutableElement combineSignatures({
-    @required ClassElement targetClass,
-    @required List<ExecutableElement> candidates,
-    @required bool doTopMerge,
-    @required Name name,
-    List<Conflict> conflicts,
+  ExecutableElement? combineSignatures({
+    required ClassElement targetClass,
+    required List<ExecutableElement> candidates,
+    required bool doTopMerge,
+    required Name name,
+    List<Conflict>? conflicts,
   }) {
     // If just one candidate, it is always valid.
     if (candidates.length == 1) {
@@ -79,9 +78,9 @@
 
     var validOverrides = <ExecutableElement>[];
     for (var i = 0; i < candidates.length; i++) {
-      var validOverride = candidates[i];
+      ExecutableElement? validOverride = candidates[i];
       var overrideHelper = CorrectOverrideHelper(
-        library: targetClass.library,
+        library: targetClass.library as LibraryElementImpl,
         thisMember: validOverride,
       );
       for (var j = 0; j < candidates.length; j++) {
@@ -107,7 +106,7 @@
     }
 
     if (doTopMerge) {
-      var typeSystem = targetClass.library.typeSystem;
+      var typeSystem = targetClass.library.typeSystem as TypeSystemImpl;
       return _topMerge(typeSystem, targetClass, validOverrides);
     } else {
       return validOverrides.first;
@@ -115,7 +114,7 @@
   }
 
   /// Return the result of [getInherited2] with [type] substitution.
-  ExecutableElement getInherited(InterfaceType type, Name name) {
+  ExecutableElement? getInherited(InterfaceType type, Name name) {
     var rawElement = getInherited2(type.element, name);
     if (rawElement == null) {
       return null;
@@ -133,7 +132,7 @@
   /// at all, or because there is no the most specific signature.
   ///
   /// This is equivalent to `getInheritedMap2(type)[name]`.
-  ExecutableElement getInherited2(ClassElement element, Name name) {
+  ExecutableElement? getInherited2(ClassElement element, Name name) {
     return getInheritedMap2(element)[name];
   }
 
@@ -192,21 +191,17 @@
       interface._inheritedMap = {};
       _findMostSpecificFromNamedCandidates(
         element,
-        interface._inheritedMap,
+        interface._inheritedMap!,
         interface._overridden,
         doTopMerge: false,
       );
     }
-    return interface._inheritedMap;
+    return interface._inheritedMap!;
   }
 
   /// Return the interface of the given [element].  It might include
   /// private members, not necessary accessible in all libraries.
   Interface getInterface(ClassElement element) {
-    if (element == null) {
-      return Interface._empty;
-    }
-
     var result = _interfaces[element];
     if (result != null) {
       return result;
@@ -232,7 +227,7 @@
   }
 
   /// Return the result of [getMember2] with [type] substitution.
-  ExecutableElement getMember(
+  ExecutableElement? getMember(
     InterfaceType type,
     Name name, {
     bool concrete = false,
@@ -265,7 +260,7 @@
   /// If [forMixinIndex] is specified, only the nominal superclass, and the
   /// given number of mixins after it are considered.  For example for `1` in
   /// `class C extends S with M1, M2, M3`, only `S` and `M1` are considered.
-  ExecutableElement getMember2(
+  ExecutableElement? getMember2(
     ClassElement element,
     Name name, {
     bool concrete = false,
@@ -295,14 +290,14 @@
   /// with the given [name], defined in the [type], would override; or `null`
   /// if no members would be overridden.
   @Deprecated('Use getOverridden2')
-  List<ExecutableElement> getOverridden(InterfaceType type, Name name) {
+  List<ExecutableElement>? getOverridden(InterfaceType type, Name name) {
     return getOverridden2(type.element, name);
   }
 
   /// Return all members of mixins, superclasses, and interfaces that a member
   /// with the given [name], defined in the [element], would override; or `null`
   /// if no members would be overridden.
-  List<ExecutableElement> getOverridden2(ClassElement element, Name name) {
+  List<ExecutableElement>? getOverridden2(ClassElement element, Name name) {
     var interface = getInterface(element);
     return interface._overridden[name];
   }
@@ -316,19 +311,20 @@
   }
 
   void _addCandidates({
-    @required Map<Name, List<ExecutableElement>> namedCandidates,
-    @required Substitution substitution,
-    @required Interface interface,
-    @required bool isNonNullableByDefault,
+    required Map<Name, List<ExecutableElement>> namedCandidates,
+    required MapSubstitution substitution,
+    required Interface interface,
+    required bool isNonNullableByDefault,
   }) {
     var map = interface.map;
-    for (var name in map.keys) {
-      var candidate = map[name];
+    for (var entry in map.entries) {
+      var name = entry.key;
+      var candidate = entry.value;
 
       candidate = ExecutableMember.from2(candidate, substitution);
 
       if (!isNonNullableByDefault) {
-        candidate = Member.legacy(candidate);
+        candidate = Member.legacy(candidate) as ExecutableElement;
       }
 
       var candidates = namedCandidates[name];
@@ -359,10 +355,10 @@
   }
 
   void _addMixinMembers({
-    @required Map<Name, ExecutableElement> implemented,
-    @required Substitution substitution,
-    @required Interface mixin,
-    @required bool isNonNullableByDefault,
+    required Map<Name, ExecutableElement> implemented,
+    required MapSubstitution substitution,
+    required Interface mixin,
+    required bool isNonNullableByDefault,
   }) {
     for (var entry in mixin.implemented.entries) {
       var executable = entry.value;
@@ -378,7 +374,7 @@
       executable = ExecutableMember.from2(executable, substitution);
 
       if (!isNonNullableByDefault) {
-        executable = Member.legacy(executable);
+        executable = Member.legacy(executable) as ExecutableElement;
       }
 
       implemented[entry.key] = executable;
@@ -388,7 +384,7 @@
   /// Check that all [candidates] for the given [name] have the same kind, all
   /// getters, all methods, or all setter.  If a conflict found, return the
   /// new [Conflict] instance that describes it.
-  Conflict _checkForGetterMethodConflict(
+  Conflict? _checkForGetterMethodConflict(
       Name name, List<ExecutableElement> candidates) {
     assert(candidates.length > 1);
 
@@ -412,8 +408,8 @@
       return null;
     }
 
-    ExecutableElement getter;
-    ExecutableElement method;
+    ExecutableElement? getter;
+    ExecutableElement? method;
     for (var candidate in candidates) {
       var kind = candidate.kind;
       if (kind == ElementKind.GETTER) {
@@ -423,7 +419,7 @@
         method ??= candidate;
       }
     }
-    return GetterMethodConflict(name: name, getter: getter, method: method);
+    return GetterMethodConflict(name: name, getter: getter!, method: method!);
   }
 
   /// The given [namedCandidates] maps names to candidates from direct
@@ -435,16 +431,17 @@
     ClassElement targetClass,
     Map<Name, ExecutableElement> map,
     Map<Name, List<ExecutableElement>> namedCandidates, {
-    @required bool doTopMerge,
+    required bool doTopMerge,
   }) {
     var conflicts = <Conflict>[];
 
-    for (var name in namedCandidates.keys) {
+    for (var entry in namedCandidates.entries) {
+      var name = entry.key;
       if (map.containsKey(name)) {
         continue;
       }
 
-      var candidates = namedCandidates[name];
+      var candidates = entry.value;
 
       var combinedSignature = combineSignatures(
         targetClass: targetClass,
@@ -471,7 +468,7 @@
     var superImplemented = <Map<Name, ExecutableElement>>[];
     var implemented = <Name, ExecutableElement>{};
 
-    Interface superTypeInterface;
+    Interface? superTypeInterface;
     var superType = element.supertype;
     if (superType != null) {
       var substitution = Substitution.fromInterfaceType(superType);
@@ -487,7 +484,7 @@
         var executable = entry.value;
         executable = ExecutableMember.from2(executable, substitution);
         if (!isNonNullableByDefault) {
-          executable = Member.legacy(executable);
+          executable = Member.legacy(executable) as ExecutableElement;
         }
         implemented[entry.key] = executable;
       }
@@ -520,14 +517,16 @@
       var mixinConflicts = <Conflict>[];
       for (var name in mixinInterface.map.keys) {
         var candidate = ExecutableMember.from2(
-          mixinInterface.map[name],
+          mixinInterface.map[name]!,
           substitution,
         );
 
         var currentList = namedCandidates[name];
         if (currentList == null) {
           namedCandidates[name] = [
-            isNonNullableByDefault ? candidate : Member.legacy(candidate),
+            isNonNullableByDefault
+                ? candidate
+                : Member.legacy(candidate) as ExecutableElement,
           ];
           continue;
         }
@@ -535,7 +534,9 @@
         var current = currentList.single;
         if (candidate.enclosingElement == mixinElement) {
           namedCandidates[name] = [
-            isNonNullableByDefault ? candidate : Member.legacy(candidate),
+            isNonNullableByDefault
+                ? candidate
+                : Member.legacy(candidate) as ExecutableElement,
           ];
           if (current.kind != candidate.kind) {
             var currentIsGetter = current.kind == ElementKind.GETTER;
@@ -563,7 +564,9 @@
         );
         for (var entry in map.entries) {
           namedCandidates[entry.key] = [
-            isNonNullableByDefault ? entry.value : Member.legacy(entry.value),
+            isNonNullableByDefault
+                ? entry.value
+                : Member.legacy(entry.value) as ExecutableElement,
           ];
         }
       }
@@ -620,10 +623,11 @@
       var noSuchMethod = implemented[_noSuchMethodName];
       if (noSuchMethod != null && !_isDeclaredInObject(noSuchMethod)) {
         var superForwarders = superTypeInterface?._noSuchMethodForwarders;
-        for (var name in interface.keys) {
+        for (var entry in interface.entries) {
+          var name = entry.key;
           if (!implemented.containsKey(name) ||
               superForwarders != null && superForwarders.contains(name)) {
-            implemented[name] = interface[name];
+            implemented[name] = entry.value;
             noSuchMethodForwarders.add(name);
           }
         }
@@ -634,7 +638,6 @@
     /// the corresponding mixins applied in the class.
     for (var mixinConflicts in mixinsConflicts) {
       if (mixinConflicts.isNotEmpty) {
-        conflicts ??= [];
         conflicts.addAll(mixinConflicts);
       }
     }
@@ -646,7 +649,7 @@
       noSuchMethodForwarders,
       namedCandidates,
       superImplemented,
-      conflicts ?? const [],
+      conflicts,
     );
   }
 
@@ -706,7 +709,7 @@
       {},
       interfaceCandidates,
       [superInterface],
-      <Conflict>[...?superConflicts, ...?interfaceConflicts],
+      <Conflict>[...superConflicts, ...interfaceConflicts],
     );
   }
 
@@ -740,16 +743,18 @@
       return first;
     }
 
-    FunctionType resultType;
+    FunctionType? resultType;
     for (var executable in validOverrides) {
       var type = executable.type;
       var normalizedType = typeSystem.normalize(type) as FunctionType;
       if (resultType == null) {
         resultType = normalizedType;
       } else {
-        resultType = typeSystem.topMerge(resultType, normalizedType);
+        resultType =
+            typeSystem.topMerge(resultType, normalizedType) as FunctionType;
       }
     }
+    resultType!;
 
     for (var executable in validOverrides) {
       if (executable.type == resultType) {
@@ -850,7 +855,7 @@
 
   /// The map of names to the most specific signatures from the mixins,
   /// superclasses, or interfaces.
-  Map<Name, ExecutableElement> _inheritedMap;
+  Map<Name, ExecutableElement>? _inheritedMap;
 
   Interface._(
     this.map,
@@ -872,7 +877,7 @@
 class Name {
   /// If the name is private, the URI of the defining library.
   /// Otherwise, it is `null`.
-  final Uri libraryUri;
+  final Uri? libraryUri;
 
   /// The name of this name object.
   /// If the name starts with `_`, then the name is private.
@@ -886,7 +891,7 @@
   @override
   final int hashCode;
 
-  factory Name(Uri libraryUri, String name) {
+  factory Name(Uri? libraryUri, String name) {
     if (name.startsWith('_')) {
       var hashCode = JenkinsSmiHash.hash2(libraryUri.hashCode, name.hashCode);
       return Name._internal(libraryUri, name, false, hashCode);
diff --git a/pkg/analyzer/lib/src/dart/element/least_greatest_closure.dart b/pkg/analyzer/lib/src/dart/element/least_greatest_closure.dart
index c800909..0d4ee9a 100644
--- a/pkg/analyzer/lib/src/dart/element/least_greatest_closure.dart
+++ b/pkg/analyzer/lib/src/dart/element/least_greatest_closure.dart
@@ -8,7 +8,6 @@
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_algebra.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
-import 'package:meta/meta.dart';
 
 class LeastGreatestClosureHelper extends ReplacementVisitor {
   final TypeSystemImpl typeSystem;
@@ -17,15 +16,15 @@
   final DartType bottomType;
   final Set<TypeParameterElement> eliminationTargets;
 
-  bool _isLeastClosure;
+  late final bool _isLeastClosure;
   bool _isCovariant = true;
 
   LeastGreatestClosureHelper({
-    @required this.typeSystem,
-    @required this.topType,
-    @required this.topFunctionType,
-    @required this.bottomType,
-    @required this.eliminationTargets,
+    required this.typeSystem,
+    required this.topType,
+    required this.topFunctionType,
+    required this.bottomType,
+    required this.eliminationTargets,
   });
 
   DartType get _functionReplacement {
@@ -62,7 +61,7 @@
   }
 
   @override
-  DartType visitFunctionType(FunctionType node) {
+  DartType? visitFunctionType(FunctionType node) {
     // - if `S` is
     //   `T Function<X0 extends B0, ...., Xk extends Bk>(T0 x0, ...., Tn xn,
     //       [Tn+1 xn+1, ..., Tm xm])`
@@ -82,7 +81,7 @@
   }
 
   @override
-  DartType visitTypeParameterType(TypeParameterType node) {
+  DartType? visitTypeParameterType(TypeParameterType node) {
     if (eliminationTargets.contains(node.element)) {
       var replacement = _typeParameterReplacement as TypeImpl;
       return replacement.withNullability(
diff --git a/pkg/analyzer/lib/src/dart/element/least_upper_bound.dart b/pkg/analyzer/lib/src/dart/element/least_upper_bound.dart
index 7a031c7..325bdc0 100644
--- a/pkg/analyzer/lib/src/dart/element/least_upper_bound.dart
+++ b/pkg/analyzer/lib/src/dart/element/least_upper_bound.dart
@@ -69,11 +69,11 @@
 
   /// Return the superclass of this type, or `null` if this type represents
   /// the class 'Object'.
-  InstantiatedClass get superclass {
+  InstantiatedClass? get superclass {
     var supertype = element.supertype;
     if (supertype == null) return null;
 
-    supertype = _substitution.substituteType(supertype);
+    supertype = _substitution.substituteType(supertype) as InterfaceType;
     return InstantiatedClass.of(supertype);
   }
 
@@ -124,7 +124,7 @@
     return buffer.toString();
   }
 
-  InterfaceType withNullability(NullabilitySuffix nullability) {
+  InterfaceTypeImpl withNullability(NullabilitySuffix nullability) {
     return InterfaceTypeImpl(
       element: element,
       typeArguments: arguments,
@@ -135,11 +135,12 @@
   List<InstantiatedClass> _toInstantiatedClasses(
     List<InterfaceType> interfaces,
   ) {
-    var result = List<InstantiatedClass>.filled(interfaces.length, null);
+    var result = <InstantiatedClass>[];
     for (var i = 0; i < interfaces.length; i++) {
       var interface = interfaces[i];
-      var substituted = _substitution.substituteType(interface);
-      result[i] = InstantiatedClass.of(substituted);
+      var substituted =
+          _substitution.substituteType(interface) as InterfaceType;
+      result.add(InstantiatedClass.of(substituted));
     }
 
     return result;
@@ -196,19 +197,19 @@
       assert(args1.length == args2.length);
       assert(args1.length == params.length);
 
-      var args = List<DartType>.filled(args1.length, null);
+      var args = <DartType>[];
       for (int i = 0; i < args1.length; i++) {
         // TODO (kallentu) : Clean up TypeParameterElementImpl casting once
         // variance is added to the interface.
         Variance parameterVariance =
             (params[i] as TypeParameterElementImpl).variance;
         if (parameterVariance.isCovariant) {
-          args[i] = typeSystem.getLeastUpperBound(args1[i], args2[i]);
+          args.add(typeSystem.getLeastUpperBound(args1[i], args2[i]));
         } else if (parameterVariance.isContravariant) {
           if (typeSystem is TypeSystemImpl) {
-            args[i] = typeSystem.getGreatestLowerBound(args1[i], args2[i]);
+            args.add(typeSystem.getGreatestLowerBound(args1[i], args2[i]));
           } else {
-            args[i] = typeSystem.getLeastUpperBound(args1[i], args2[i]);
+            args.add(typeSystem.getLeastUpperBound(args1[i], args2[i]));
           }
         } else if (parameterVariance.isInvariant) {
           if (!typeSystem.isSubtypeOf2(args1[i], args2[i]) ||
@@ -221,7 +222,7 @@
           }
           // TODO (kallentu) : Fix asymmetric bounds behavior for invariant type
           //  parameters.
-          args[i] = args1[i];
+          args.add(args1[i]);
         } else {
           throw StateError('Type parameter ${params[i]} has unknown '
               'variance $parameterVariance for bounds calculation.');
@@ -426,8 +427,7 @@
     }
     // Should be impossible--there should always be exactly one type with the
     // maximum depth.
-    assert(false);
-    return null;
+    throw StateError('Empty path: $types');
   }
 
   /// Return the intersection of the [first] and [second] sets of types, where
@@ -682,7 +682,7 @@
 
     // UP(T Function<...>(...), S Function<...>(...)) = Function
     // And other, more interesting variants.
-    if (T1 is FunctionType && T2 is FunctionType) {
+    if (T1 is FunctionTypeImpl && T2 is FunctionTypeImpl) {
       return _functionType(T1, T2);
     }
 
@@ -705,7 +705,10 @@
     // UP(T1, T2) = T1 if T2 <: T1
     // And other, more complex variants of interface types.
     var helper = InterfaceLeastUpperBoundHelper(_typeSystem);
-    return helper.compute(T1, T2);
+    return helper.compute(
+      T1 as InterfaceTypeImpl,
+      T2 as InterfaceTypeImpl,
+    );
   }
 
   /// Compute the least upper bound of function types [f] and [g].
@@ -830,7 +833,7 @@
     );
   }
 
-  DartType _futureOr(DartType T1, DartType T2) {
+  DartType? _futureOr(DartType T1, DartType T2) {
     var T1_futureOr = T1 is InterfaceType && T1.isDartAsyncFutureOr
         ? T1.typeArguments[0]
         : null;
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart
index 20ebc91..011fa49 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -16,7 +16,6 @@
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
-import 'package:meta/meta.dart';
 
 /// A constructor element defined in a parameterized type where the values of
 /// the type parameters are known.
@@ -37,6 +36,9 @@
   ConstructorElement get declaration => super.declaration as ConstructorElement;
 
   @override
+  String get displayName => declaration.displayName;
+
+  @override
   ClassElement get enclosingElement => declaration.enclosingElement;
 
   @override
@@ -49,13 +51,16 @@
   bool get isFactory => declaration.isFactory;
 
   @override
-  int get nameEnd => declaration.nameEnd;
+  String get name => declaration.name;
 
   @override
-  int get periodOffset => declaration.periodOffset;
+  int? get nameEnd => declaration.nameEnd;
 
   @override
-  ConstructorElement get redirectedConstructor {
+  int? get periodOffset => declaration.periodOffset;
+
+  @override
+  ConstructorElement? get redirectedConstructor {
     var element = this.declaration.redirectedConstructor;
     if (element == null) {
       return null;
@@ -64,11 +69,11 @@
     ConstructorElement declaration;
     MapSubstitution substitution;
     if (element is ConstructorMember) {
-      declaration = element._declaration;
+      declaration = element._declaration as ConstructorElement;
       var map = <TypeParameterElement, DartType>{};
       var elementMap = element._substitution.map;
       for (var typeParameter in elementMap.keys) {
-        var type = elementMap[typeParameter];
+        var type = elementMap[typeParameter]!;
         map[typeParameter] = _substitution.substituteType(type);
       }
       substitution = Substitution.fromMap(map);
@@ -84,7 +89,7 @@
   InterfaceType get returnType => type.returnType as InterfaceType;
 
   @override
-  T accept<T>(ElementVisitor<T> visitor) =>
+  T? accept<T>(ElementVisitor<T> visitor) =>
       visitor.visitConstructorElement(this);
 
   @override
@@ -99,24 +104,18 @@
   /// the original constructor if no member was created.
   static ConstructorElement from(
       ConstructorElement constructor, InterfaceType definingType) {
-    if (constructor == null || definingType.typeArguments.isEmpty) {
-      return constructor;
-    }
-
-    FunctionType baseType = constructor.type;
-    if (baseType == null) {
-      // TODO(brianwilkerson) We need to understand when this can happen.
+    if (definingType.typeArguments.isEmpty) {
       return constructor;
     }
 
     var isLegacy = false;
     if (constructor is ConstructorMember) {
-      isLegacy = (constructor as ConstructorMember).isLegacy;
+      isLegacy = constructor.isLegacy;
       constructor = constructor.declaration;
     }
 
     return ConstructorMember(
-      constructor.library.typeProvider,
+      constructor.library.typeProvider as TypeProviderImpl,
       constructor,
       Substitution.fromInterfaceType(definingType),
       isLegacy,
@@ -130,7 +129,7 @@
   @override
   final List<TypeParameterElement> typeParameters;
 
-  FunctionType _type;
+  FunctionType? _type;
 
   /// Initialize a newly created element to represent a callable element (like a
   /// method or function or property), based on the [declaration], and applied
@@ -151,6 +150,9 @@
   ExecutableElement get declaration => super.declaration as ExecutableElement;
 
   @override
+  String get displayName => declaration.displayName;
+
+  @override
   bool get hasImplicitReturnType => declaration.hasImplicitReturnType;
 
   @override
@@ -193,11 +195,11 @@
 
   @override
   FunctionType get type {
-    if (_type != null) return _type;
+    if (_type != null) return _type!;
 
-    _type = _substitution.substituteType(declaration.type);
-    _type = _toLegacyType(_type);
-    return _type;
+    _type = _substitution.substituteType(declaration.type) as FunctionType;
+    _type = _toLegacyType(_type!) as FunctionType;
+    return _type!;
   }
 
   @override
@@ -215,10 +217,6 @@
     ExecutableElement element,
     MapSubstitution substitution,
   ) {
-    if (element == null) {
-      return null;
-    }
-
     TypeProviderImpl typeProvider;
     var isLegacy = false;
     var combined = substitution;
@@ -293,7 +291,7 @@
         );
 
   @override
-  FieldElement get field {
+  FieldElement? get field {
     var field = (declaration as FieldFormalParameterElement).field;
     if (field == null) {
       return null;
@@ -309,7 +307,7 @@
   bool get isCovariant => declaration.isCovariant;
 
   @override
-  T accept<T>(ElementVisitor<T> visitor) =>
+  T? accept<T>(ElementVisitor<T> visitor) =>
       visitor.visitFieldFormalParameterElement(this);
 }
 
@@ -329,10 +327,13 @@
   FieldElement get declaration => super.declaration as FieldElement;
 
   @override
+  String get displayName => declaration.displayName;
+
+  @override
   Element get enclosingElement => declaration.enclosingElement;
 
   @override
-  PropertyAccessorElement get getter {
+  PropertyAccessorElement? get getter {
     var baseGetter = declaration.getter;
     if (baseGetter == null) {
       return null;
@@ -357,7 +358,10 @@
   bool get isExternal => declaration.isExternal;
 
   @override
-  PropertyAccessorElement get setter {
+  String get name => declaration.name;
+
+  @override
+  PropertyAccessorElement? get setter {
     var baseSetter = declaration.setter;
     if (baseSetter == null) {
       return null;
@@ -367,7 +371,7 @@
   }
 
   @override
-  T accept<T>(ElementVisitor<T> visitor) => visitor.visitFieldElement(this);
+  T? accept<T>(ElementVisitor<T> visitor) => visitor.visitFieldElement(this);
 
   /// If the given [field]'s type is different when any type parameters from the
   /// defining type's declaration are replaced with the actual type arguments
@@ -375,11 +379,11 @@
   /// field. Return the member that was created, or the base field if no member
   /// was created.
   static FieldElement from(FieldElement field, InterfaceType definingType) {
-    if (field == null || definingType.typeArguments.isEmpty) {
+    if (definingType.typeArguments.isEmpty) {
       return field;
     }
     return FieldMember(
-      field.library.typeProvider,
+      field.library.typeProvider as TypeProviderImpl,
       field,
       Substitution.fromInterfaceType(definingType),
       false,
@@ -393,7 +397,7 @@
     if (substitution.map.isEmpty) {
       return element;
     }
-    var typeProvider = element.library.typeProvider;
+    var typeProvider = element.library.typeProvider as TypeProviderImpl;
     return FieldMember(typeProvider, element, substitution, false);
   }
 }
@@ -410,13 +414,19 @@
         );
 
   @override
-  FunctionElement get declaration => super.declaration;
+  FunctionElement get declaration => super.declaration as FunctionElement;
+
+  @override
+  Element get enclosingElement => declaration.enclosingElement;
 
   @override
   bool get isEntryPoint => declaration.isEntryPoint;
 
   @override
-  T accept<T>(ElementVisitor<T> visitor) {
+  String get name => declaration.name;
+
+  @override
+  T? accept<T>(ElementVisitor<T> visitor) {
     return visitor.visitFunctionElement(this);
   }
 }
@@ -455,10 +465,10 @@
   String get displayName => _declaration.displayName;
 
   @override
-  String get documentationComment => _declaration.documentationComment;
+  String? get documentationComment => _declaration.documentationComment;
 
   @override
-  Element get enclosingElement => _declaration.enclosingElement;
+  Element? get enclosingElement => _declaration.enclosingElement;
 
   @override
   bool get hasAlwaysThrows => _declaration.hasAlwaysThrows;
@@ -530,19 +540,19 @@
   ElementKind get kind => _declaration.kind;
 
   @override
-  LibraryElement get library => _declaration.library;
+  LibraryElement get library => _declaration.library!;
 
   @override
-  Source get librarySource => _declaration.librarySource;
+  Source get librarySource => _declaration.librarySource!;
 
   @override
-  ElementLocation get location => _declaration.location;
+  ElementLocation get location => _declaration.location!;
 
   @override
   List<ElementAnnotation> get metadata => _declaration.metadata;
 
   @override
-  String get name => _declaration.name;
+  String? get name => _declaration.name;
 
   @override
   int get nameLength => _declaration.nameLength;
@@ -554,7 +564,7 @@
   AnalysisSession get session => _declaration.session;
 
   @override
-  Source get source => _declaration.source;
+  Source get source => _declaration.source!;
 
   /// The substitution for type parameters referenced in the base element.
   MapSubstitution get substitution => _substitution;
@@ -563,7 +573,7 @@
   void appendTo(ElementDisplayStringBuilder builder);
 
   @override
-  String getDisplayString({@required bool withNullability}) {
+  String getDisplayString({required bool withNullability}) {
     var builder = ElementDisplayStringBuilder(
       skipAllDynamicArguments: false,
       withNullability: withNullability,
@@ -573,29 +583,27 @@
   }
 
   @override
-  String getExtendedDisplayName(String shortName) =>
+  String getExtendedDisplayName(String? shortName) =>
       _declaration.getExtendedDisplayName(shortName);
 
   @override
-  bool isAccessibleIn(LibraryElement library) =>
+  bool isAccessibleIn(LibraryElement? library) =>
       _declaration.isAccessibleIn(library);
 
   /// Use the given [visitor] to visit all of the [children].
   void safelyVisitChildren(List<Element> children, ElementVisitor visitor) {
     // TODO(brianwilkerson) Make this private
-    if (children != null) {
-      for (Element child in children) {
-        child.accept(visitor);
-      }
+    for (Element child in children) {
+      child.accept(visitor);
     }
   }
 
   @override
-  E thisOrAncestorMatching<E extends Element>(Predicate<Element> predicate) =>
+  E? thisOrAncestorMatching<E extends Element>(Predicate<Element> predicate) =>
       declaration.thisOrAncestorMatching(predicate);
 
   @override
-  E thisOrAncestorOfType<E extends Element>() =>
+  E? thisOrAncestorOfType<E extends Element>() =>
       declaration.thisOrAncestorOfType<E>();
 
   @override
@@ -630,12 +638,12 @@
         var member = element as Member;
         return ConstructorMember(
           member._typeProvider,
-          member._declaration,
+          member._declaration as ConstructorElement,
           member._substitution,
           true,
         );
       } else {
-        var typeProvider = element.library.typeProvider;
+        var typeProvider = element.library.typeProvider as TypeProviderImpl;
         return ConstructorMember(
             typeProvider, element, Substitution.empty, true);
       }
@@ -645,8 +653,9 @@
       } else {
         var typeProvider = element is Member
             ? (element as Member)._typeProvider
-            : element.library.typeProvider;
-        return FunctionMember(typeProvider, element.declaration, true);
+            : element.library.typeProvider as TypeProviderImpl;
+        return FunctionMember(
+            typeProvider, element.declaration as FunctionElement, true);
       }
     } else if (element is MethodElement) {
       if (!element.library.isNonNullableByDefault) {
@@ -655,12 +664,12 @@
         var member = element as Member;
         return MethodMember(
           member._typeProvider,
-          member._declaration,
+          member._declaration as MethodElement,
           member._substitution,
           true,
         );
       } else {
-        var typeProvider = element.library.typeProvider;
+        var typeProvider = element.library.typeProvider as TypeProviderImpl;
         return MethodMember(typeProvider, element, Substitution.empty, true);
       }
     } else if (element is PropertyAccessorElement) {
@@ -670,12 +679,12 @@
         var member = element as Member;
         return PropertyAccessorMember(
           member._typeProvider,
-          member._declaration,
+          member._declaration as PropertyAccessorElement,
           member._substitution,
           true,
         );
       } else {
-        var typeProvider = element.library.typeProvider;
+        var typeProvider = element.library.typeProvider as TypeProviderImpl;
         return PropertyAccessorMember(
             typeProvider, element, Substitution.empty, true);
       }
@@ -722,19 +731,23 @@
   Element get enclosingElement => declaration.enclosingElement;
 
   @override
-  T accept<T>(ElementVisitor<T> visitor) => visitor.visitMethodElement(this);
+  String get name => declaration.name;
+
+  @override
+  T? accept<T>(ElementVisitor<T> visitor) => visitor.visitMethodElement(this);
 
   /// If the given [method]'s type is different when any type parameters from
   /// the defining type's declaration are replaced with the actual type
   /// arguments from the [definingType], create a method member representing the
   /// given method. Return the member that was created, or the base method if no
   /// member was created.
-  static MethodElement from(MethodElement method, InterfaceType definingType) {
+  static MethodElement? from(
+      MethodElement? method, InterfaceType definingType) {
     if (method == null || definingType.typeArguments.isEmpty) {
       return method;
     }
 
-    var typeProvider = method.library.typeProvider;
+    var typeProvider = method.library.typeProvider as TypeProviderImpl;
     return MethodMember(
       typeProvider,
       method,
@@ -750,7 +763,7 @@
     if (substitution.map.isEmpty) {
       return element;
     }
-    var typeProvider = element.library.typeProvider;
+    var typeProvider = element.library.typeProvider as TypeProviderImpl;
     return MethodMember(typeProvider, element, substitution, false);
   }
 }
@@ -796,10 +809,10 @@
   ParameterElement get declaration => super.declaration as ParameterElement;
 
   @override
-  String get defaultValueCode => declaration.defaultValueCode;
+  String? get defaultValueCode => declaration.defaultValueCode;
 
   @override
-  Element get enclosingElement => declaration.enclosingElement;
+  Element? get enclosingElement => declaration.enclosingElement;
 
   @override
   bool get hasDefaultValue => declaration.hasDefaultValue;
@@ -813,6 +826,9 @@
   @override
   bool get isInitializingFormal => declaration.isInitializingFormal;
 
+  @override
+  String get name => declaration.name;
+
   @deprecated
   @override
   ParameterKind get parameterKind {
@@ -833,7 +849,8 @@
   }
 
   @override
-  T accept<T>(ElementVisitor<T> visitor) => visitor.visitParameterElement(this);
+  T? accept<T>(ElementVisitor<T> visitor) =>
+      visitor.visitParameterElement(this);
 
   @override
   void appendTo(ElementDisplayStringBuilder builder) {
@@ -879,7 +896,7 @@
   ) : super(typeProvider, declaration, substitution, isLegacy, typeParameters);
 
   @override
-  PropertyAccessorElement get correspondingGetter {
+  PropertyAccessorElement? get correspondingGetter {
     var baseGetter = declaration.correspondingGetter;
     if (baseGetter == null) {
       return null;
@@ -889,7 +906,7 @@
   }
 
   @override
-  PropertyAccessorElement get correspondingSetter {
+  PropertyAccessorElement? get correspondingSetter {
     var baseSetter = declaration.correspondingSetter;
     if (baseSetter == null) {
       return null;
@@ -912,6 +929,9 @@
   bool get isSetter => declaration.isSetter;
 
   @override
+  String get name => declaration.name;
+
+  @override
   PropertyInducingElement get variable {
     // TODO
     PropertyInducingElement variable = declaration.variable;
@@ -925,7 +945,7 @@
   }
 
   @override
-  T accept<T>(ElementVisitor<T> visitor) =>
+  T? accept<T>(ElementVisitor<T> visitor) =>
       visitor.visitPropertyAccessorElement(this);
 
   @override
@@ -941,13 +961,13 @@
   /// arguments from the [definingType], create an accessor member representing
   /// the given accessor. Return the member that was created, or the base
   /// accessor if no member was created.
-  static PropertyAccessorElement from(
-      PropertyAccessorElement accessor, InterfaceType definingType) {
+  static PropertyAccessorElement? from(
+      PropertyAccessorElement? accessor, InterfaceType definingType) {
     if (accessor == null || definingType.typeArguments.isEmpty) {
       return accessor;
     }
 
-    var typeProvider = accessor.library.typeProvider;
+    var typeProvider = accessor.library.typeProvider as TypeProviderImpl;
     return PropertyAccessorMember(
       typeProvider,
       accessor,
@@ -967,10 +987,14 @@
   ) : super(typeProvider, declaration, substitution, isLegacy);
 
   @override
-  TopLevelVariableElement get declaration => _declaration;
+  TopLevelVariableElement get declaration =>
+      _declaration as TopLevelVariableElement;
 
   @override
-  PropertyAccessorElement get getter {
+  String get displayName => declaration.displayName;
+
+  @override
+  PropertyAccessorElement? get getter {
     var baseGetter = declaration.getter;
     if (baseGetter == null) {
       return null;
@@ -986,7 +1010,10 @@
   bool get isExternal => declaration.isExternal;
 
   @override
-  PropertyAccessorElement get setter {
+  String get name => declaration.name;
+
+  @override
+  PropertyAccessorElement? get setter {
     var baseSetter = declaration.setter;
     if (baseSetter == null) {
       return null;
@@ -996,7 +1023,7 @@
   }
 
   @override
-  T accept<T>(ElementVisitor<T> visitor) {
+  T? accept<T>(ElementVisitor<T> visitor) {
     return visitor.visitTopLevelVariableElement(this);
   }
 }
@@ -1004,7 +1031,7 @@
 /// A variable element defined in a parameterized type where the values of the
 /// type parameters are known.
 abstract class VariableMember extends Member implements VariableElement {
-  DartType _type;
+  DartType? _type;
 
   /// Initialize a newly created element to represent a variable, based on the
   /// [declaration], with applied [substitution].
@@ -1038,11 +1065,11 @@
 
   @override
   DartType get type {
-    if (_type != null) return _type;
+    if (_type != null) return _type!;
 
     _type = _substitution.substituteType(declaration.type);
-    _type = _toLegacyType(_type);
-    return _type;
+    _type = _toLegacyType(_type!);
+    return _type!;
   }
 
   @override
@@ -1051,12 +1078,12 @@
   }
 
   @override
-  DartObject computeConstantValue() => declaration.computeConstantValue();
+  DartObject? computeConstantValue() => declaration.computeConstantValue();
 }
 
 class _SubstitutedTypeParameters {
   final List<TypeParameterElement> elements;
-  final Substitution substitution;
+  final MapSubstitution substitution;
 
   factory _SubstitutedTypeParameters(
     List<TypeParameterElement> elements,
@@ -1068,14 +1095,16 @@
 
     // Create type formals with specialized bounds.
     // For example `<U extends T>` where T comes from an outer scope.
-    var newElements = List<TypeParameterElement>.filled(elements.length, null);
-    var newTypes = List<TypeParameterType>.filled(elements.length, null);
-    for (int i = 0; i < newElements.length; i++) {
+    var newElements = <TypeParameterElement>[];
+    var newTypes = <TypeParameterType>[];
+    for (int i = 0; i < elements.length; i++) {
       var element = elements[i];
       var newElement = TypeParameterElementImpl.synthetic(element.name);
-      newElements[i] = newElement;
-      newTypes[i] = newElement.instantiate(
-        nullabilitySuffix: NullabilitySuffix.none,
+      newElements.add(newElement);
+      newTypes.add(
+        newElement.instantiate(
+          nullabilitySuffix: NullabilitySuffix.none,
+        ),
       );
     }
 
diff --git a/pkg/analyzer/lib/src/dart/element/normalize.dart b/pkg/analyzer/lib/src/dart/element/normalize.dart
index 4f00b3f..52f8639 100644
--- a/pkg/analyzer/lib/src/dart/element/normalize.dart
+++ b/pkg/analyzer/lib/src/dart/element/normalize.dart
@@ -35,9 +35,10 @@
   FunctionTypeImpl _functionType(FunctionType functionType) {
     var fresh = getFreshTypeParameters(functionType.typeFormals);
     for (var typeParameter in fresh.freshTypeParameters) {
-      if (typeParameter.bound != null) {
+      var bound = typeParameter.bound;
+      if (bound != null) {
         var typeParameterImpl = typeParameter as TypeParameterElementImpl;
-        typeParameterImpl.bound = _normalize(typeParameter.bound);
+        typeParameterImpl.bound = _normalize(bound);
       }
     }
 
@@ -132,7 +133,7 @@
 
     // NORM(X extends T)
     // NORM(X & T)
-    if (T is TypeParameterType) {
+    if (T is TypeParameterTypeImpl) {
       return _typeParameterType(T);
     }
 
@@ -145,13 +146,13 @@
     }
 
     // NORM(R Function<X extends B>(S)) = R1 Function(X extends B1>(S1)
-    return _functionType(T);
+    return _functionType(T as FunctionType);
   }
 
   /// NORM(T?)
-  DartType _nullabilityQuestion(TypeImpl T) {
+  DartType _nullabilityQuestion(DartType T) {
     // * let S be NORM(T)
-    var T_none = T.withNullability(NullabilitySuffix.none);
+    var T_none = (T as TypeImpl).withNullability(NullabilitySuffix.none);
     var S = _normalize(T_none);
     var S_nullability = S.nullabilitySuffix;
 
@@ -205,9 +206,9 @@
   }
 
   /// NORM(T*)
-  DartType _nullabilityStar(TypeImpl T) {
+  DartType _nullabilityStar(DartType T) {
     // * let S be NORM(T)
-    var T_none = T.withNullability(NullabilitySuffix.none);
+    var T_none = (T as TypeImpl).withNullability(NullabilitySuffix.none);
     var S = _normalize(T_none);
     var S_nullability = S.nullabilitySuffix;
 
@@ -237,9 +238,10 @@
     var element = T.element;
 
     // NORM(X & T)
-    if (T.promotedBound != null) {
+    var promotedBound = T.promotedBound;
+    if (promotedBound != null) {
       // let S be NORM(T)
-      var S = _normalize(T.promotedBound);
+      var S = _normalize(promotedBound);
       return _typeParameterType_promoted(element, S);
     }
 
diff --git a/pkg/analyzer/lib/src/dart/element/nullability_eliminator.dart b/pkg/analyzer/lib/src/dart/element/nullability_eliminator.dart
index 63e7084..c00d3e3 100644
--- a/pkg/analyzer/lib/src/dart/element/nullability_eliminator.dart
+++ b/pkg/analyzer/lib/src/dart/element/nullability_eliminator.dart
@@ -19,7 +19,7 @@
   }
 
   @override
-  NullabilitySuffix visitNullability(DartType type) {
+  NullabilitySuffix? visitNullability(DartType type) {
     if (type.nullabilitySuffix != NullabilitySuffix.star) {
       return NullabilitySuffix.star;
     }
@@ -27,7 +27,7 @@
   }
 
   @override
-  ParameterKind visitParameterKind(ParameterKind kind) {
+  ParameterKind? visitParameterKind(ParameterKind kind) {
     if (kind == ParameterKind.NAMED_REQUIRED) {
       return ParameterKind.NAMED;
     }
@@ -38,11 +38,7 @@
   /// return a new type with legacy nullability suffixes. Otherwise return the
   /// original instance.
   static DartType perform(TypeProviderImpl typeProvider, DartType type) {
-    if (type == null) {
-      return type;
-    }
-
     var visitor = NullabilityEliminator(typeProvider);
-    return type.accept<DartType>(visitor) ?? type;
+    return type.accept(visitor) ?? type;
   }
 }
diff --git a/pkg/analyzer/lib/src/dart/element/replace_top_bottom_visitor.dart b/pkg/analyzer/lib/src/dart/element/replace_top_bottom_visitor.dart
index 1799c09..1d9c2ca 100644
--- a/pkg/analyzer/lib/src/dart/element/replace_top_bottom_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/element/replace_top_bottom_visitor.dart
@@ -8,7 +8,6 @@
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/dart/resolver/variance.dart';
-import 'package:meta/meta.dart';
 
 /// Replace every "top" type in a covariant position with [_bottomType].
 /// Replace every "bottom" type in a contravariant position with [_topType].
@@ -107,8 +106,8 @@
   }
 
   DartType _typeAliasInstantiation(DartType type, Variance variance) {
-    var aliasElement = type.aliasElement;
-    var aliasArguments = type.aliasArguments;
+    var aliasElement = type.aliasElement!;
+    var aliasArguments = type.aliasArguments!;
 
     var typeParameters = aliasElement.typeParameters;
     assert(typeParameters.length == aliasArguments.length);
@@ -134,10 +133,10 @@
   /// resulting type.  If the type contains no instances of Top or Bottom, the
   /// original type object is returned to avoid unnecessary allocation.
   static DartType run({
-    @required DartType topType,
-    @required DartType bottomType,
-    @required TypeSystemImpl typeSystem,
-    @required DartType type,
+    required DartType topType,
+    required DartType bottomType,
+    required TypeSystemImpl typeSystem,
+    required DartType type,
   }) {
     var visitor = ReplaceTopBottomVisitor._(typeSystem, topType, bottomType);
     return visitor.process(type, Variance.covariant);
diff --git a/pkg/analyzer/lib/src/dart/element/replacement_visitor.dart b/pkg/analyzer/lib/src/dart/element/replacement_visitor.dart
index c2380d8..8f1d3e5 100644
--- a/pkg/analyzer/lib/src/dart/element/replacement_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/element/replacement_visitor.dart
@@ -15,26 +15,25 @@
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/summary2/function_type_builder.dart';
 import 'package:analyzer/src/summary2/named_type_builder.dart';
-import 'package:meta/meta.dart';
 
 /// Helper visitor that clones a type if a nested type is replaced, and
 /// otherwise returns `null`.
 class ReplacementVisitor
     implements
-        TypeVisitor<DartType>,
-        InferenceTypeVisitor<DartType>,
-        LinkingTypeVisitor<DartType> {
+        TypeVisitor<DartType?>,
+        InferenceTypeVisitor<DartType?>,
+        LinkingTypeVisitor<DartType?> {
   const ReplacementVisitor();
 
   void changeVariance() {}
 
-  DartType createFunctionType({
-    @required FunctionType type,
-    @required List<DartType> newAliasArguments,
-    @required List<TypeParameterElement> newTypeParameters,
-    @required List<ParameterElement> newParameters,
-    @required DartType newReturnType,
-    @required NullabilitySuffix newNullability,
+  DartType? createFunctionType({
+    required FunctionType type,
+    required List<DartType>? newAliasArguments,
+    required List<TypeParameterElement>? newTypeParameters,
+    required List<ParameterElement>? newParameters,
+    required DartType? newReturnType,
+    required NullabilitySuffix? newNullability,
   }) {
     if (newNullability == null &&
         newReturnType == null &&
@@ -52,12 +51,12 @@
     );
   }
 
-  DartType createFunctionTypeBuilder({
-    @required FunctionTypeBuilder type,
-    @required List<TypeParameterElement> newTypeParameters,
-    @required List<ParameterElement> newParameters,
-    @required DartType newReturnType,
-    @required NullabilitySuffix newNullability,
+  DartType? createFunctionTypeBuilder({
+    required FunctionTypeBuilder type,
+    required List<TypeParameterElement>? newTypeParameters,
+    required List<ParameterElement>? newParameters,
+    required DartType? newReturnType,
+    required NullabilitySuffix? newNullability,
   }) {
     if (newNullability == null &&
         newReturnType == null &&
@@ -73,11 +72,11 @@
     );
   }
 
-  DartType createInterfaceType({
-    @required InterfaceType type,
-    @required List<DartType> newAliasArguments,
-    @required List<DartType> newTypeArguments,
-    @required NullabilitySuffix newNullability,
+  DartType? createInterfaceType({
+    required InterfaceType type,
+    required List<DartType>? newAliasArguments,
+    required List<DartType>? newTypeArguments,
+    required NullabilitySuffix? newNullability,
   }) {
     if (newAliasArguments == null &&
         newTypeArguments == null &&
@@ -94,10 +93,10 @@
     );
   }
 
-  NamedTypeBuilder createNamedTypeBuilder({
-    @required NamedTypeBuilder type,
-    @required List<DartType> newTypeArguments,
-    @required NullabilitySuffix newNullability,
+  NamedTypeBuilder? createNamedTypeBuilder({
+    required NamedTypeBuilder type,
+    required List<DartType>? newTypeArguments,
+    required NullabilitySuffix? newNullability,
   }) {
     if (newTypeArguments == null && newNullability == null) {
       return null;
@@ -111,21 +110,21 @@
     );
   }
 
-  DartType createNeverType({
-    @required NeverTypeImpl type,
-    @required NullabilitySuffix newNullability,
+  DartType? createNeverType({
+    required NeverType type,
+    required NullabilitySuffix? newNullability,
   }) {
     if (newNullability == null) {
       return null;
     }
 
-    return type.withNullability(newNullability);
+    return (type as TypeImpl).withNullability(newNullability);
   }
 
-  DartType createPromotedTypeParameterType({
-    @required TypeParameterType type,
-    @required NullabilitySuffix newNullability,
-    @required DartType newPromotedBound,
+  DartType? createPromotedTypeParameterType({
+    required TypeParameterType type,
+    required NullabilitySuffix? newNullability,
+    required DartType? newPromotedBound,
   }) {
     if (newNullability == null && newPromotedBound == null) {
       return null;
@@ -139,9 +138,9 @@
     );
   }
 
-  DartType createTypeParameterType({
-    @required TypeParameterType type,
-    @required NullabilitySuffix newNullability,
+  DartType? createTypeParameterType({
+    required TypeParameterType type,
+    required NullabilitySuffix? newNullability,
   }) {
     if (newNullability == null) {
       return null;
@@ -149,20 +148,20 @@
 
     return TypeParameterTypeImpl(
       element: type.element,
-      nullabilitySuffix: newNullability ?? type.nullabilitySuffix,
+      nullabilitySuffix: newNullability,
     );
   }
 
   @override
-  DartType visitDynamicType(DynamicType type) {
+  DartType? visitDynamicType(DynamicType type) {
     return null;
   }
 
   @override
-  DartType visitFunctionType(FunctionType node) {
+  DartType? visitFunctionType(FunctionType node) {
     var newNullability = visitNullability(node);
 
-    List<TypeParameterElement> newTypeParameters;
+    List<TypeParameterElement>? newTypeParameters;
     for (var i = 0; i < node.typeFormals.length; i++) {
       var typeParameter = node.typeFormals[i];
       var bound = typeParameter.bound;
@@ -177,7 +176,7 @@
       }
     }
 
-    Substitution substitution;
+    Substitution? substitution;
     if (newTypeParameters != null) {
       var map = <TypeParameterElement, DartType>{};
       for (var i = 0; i < newTypeParameters.length; ++i) {
@@ -200,7 +199,7 @@
       }
     }
 
-    DartType visitType(DartType type) {
+    DartType? visitType(DartType? type) {
       if (type == null) return null;
       var result = type.accept(this);
       if (substitution != null) {
@@ -211,7 +210,7 @@
 
     var newReturnType = visitType(node.returnType);
 
-    List<DartType> newAliasArguments;
+    List<DartType>? newAliasArguments;
     var aliasArguments = node.aliasArguments;
     if (aliasArguments != null) {
       for (var i = 0; i < aliasArguments.length; i++) {
@@ -225,7 +224,7 @@
 
     changeVariance();
 
-    List<ParameterElement> newParameters;
+    List<ParameterElement>? newParameters;
     for (var i = 0; i < node.parameters.length; i++) {
       var parameter = node.parameters[i];
 
@@ -258,10 +257,10 @@
   }
 
   @override
-  DartType visitFunctionTypeBuilder(FunctionTypeBuilder node) {
+  DartType? visitFunctionTypeBuilder(FunctionTypeBuilder node) {
     var newNullability = visitNullability(node);
 
-    List<TypeParameterElement> newTypeParameters;
+    List<TypeParameterElement>? newTypeParameters;
     for (var i = 0; i < node.typeFormals.length; i++) {
       var typeParameter = node.typeFormals[i];
       var bound = typeParameter.bound;
@@ -276,7 +275,7 @@
       }
     }
 
-    Substitution substitution;
+    Substitution? substitution;
     if (newTypeParameters != null) {
       var map = <TypeParameterElement, DartType>{};
       for (var i = 0; i < newTypeParameters.length; ++i) {
@@ -299,7 +298,7 @@
       }
     }
 
-    DartType visitType(DartType type) {
+    DartType? visitType(DartType? type) {
       if (type == null) return null;
       var result = type.accept(this);
       if (substitution != null) {
@@ -312,7 +311,7 @@
 
     changeVariance();
 
-    List<ParameterElement> newParameters;
+    List<ParameterElement>? newParameters;
     for (var i = 0; i < node.parameters.length; i++) {
       var parameter = node.parameters[i];
 
@@ -344,7 +343,7 @@
   }
 
   @override
-  DartType visitInterfaceType(InterfaceType type) {
+  DartType? visitInterfaceType(InterfaceType type) {
     var newNullability = visitNullability(type);
 
     var aliasElement = type.aliasElement;
@@ -369,7 +368,7 @@
   }
 
   @override
-  DartType visitNamedTypeBuilder(NamedTypeBuilder type) {
+  DartType? visitNamedTypeBuilder(NamedTypeBuilder type) {
     var newNullability = visitNullability(type);
 
     var parameters = const <TypeParameterElement>[];
@@ -389,7 +388,7 @@
   }
 
   @override
-  DartType visitNeverType(NeverType type) {
+  DartType? visitNeverType(NeverType type) {
     var newNullability = visitNullability(type);
 
     return createNeverType(
@@ -398,25 +397,27 @@
     );
   }
 
-  NullabilitySuffix visitNullability(DartType type) {
+  NullabilitySuffix? visitNullability(DartType type) {
     return null;
   }
 
-  ParameterKind visitParameterKind(ParameterKind kind) {
+  ParameterKind? visitParameterKind(ParameterKind kind) {
     return null;
   }
 
-  DartType visitTypeArgument(
-      TypeParameterElement parameter, DartType argument) {
+  DartType? visitTypeArgument(
+    TypeParameterElement parameter,
+    DartType argument,
+  ) {
     return argument.accept(this);
   }
 
-  DartType visitTypeParameterBound(DartType type) {
+  DartType? visitTypeParameterBound(DartType type) {
     return type.accept(this);
   }
 
   @override
-  DartType visitTypeParameterType(TypeParameterType type) {
+  DartType? visitTypeParameterType(TypeParameterType type) {
     var newNullability = visitNullability(type);
 
     var promotedBound = (type as TypeParameterTypeImpl).promotedBound;
@@ -436,18 +437,18 @@
   }
 
   @override
-  DartType visitUnknownInferredType(UnknownInferredType type) {
+  DartType? visitUnknownInferredType(UnknownInferredType type) {
     return null;
   }
 
   @override
-  DartType visitVoidType(VoidType type) {
+  DartType? visitVoidType(VoidType type) {
     return null;
   }
 
-  List<DartType> _typeArguments(
+  List<DartType>? _typeArguments(
     List<TypeParameterElement> parameters,
-    List<DartType> arguments,
+    List<DartType>? arguments,
   ) {
     if (arguments == null) {
       return null;
@@ -457,7 +458,7 @@
       return null;
     }
 
-    List<DartType> newArguments;
+    List<DartType>? newArguments;
     for (var i = 0; i < arguments.length; i++) {
       var substitution = visitTypeArgument(parameters[i], arguments[i]);
       if (substitution != null) {
diff --git a/pkg/analyzer/lib/src/dart/element/runtime_type_equality.dart b/pkg/analyzer/lib/src/dart/element/runtime_type_equality.dart
index 07be5ad..319da39 100644
--- a/pkg/analyzer/lib/src/dart/element/runtime_type_equality.dart
+++ b/pkg/analyzer/lib/src/dart/element/runtime_type_equality.dart
@@ -139,7 +139,7 @@
   /// Determines if the two lists of type parameters are equal.  If they are,
   /// returns a [_TypeParametersResult] indicating the substitutions necessary
   /// to demonstrate their equality.  If they aren't, returns `null`.
-  _TypeParametersResult _typeParameters(
+  _TypeParametersResult? _typeParameters(
     List<TypeParameterElement> T1_parameters,
     List<TypeParameterElement> T2_parameters,
   ) {
diff --git a/pkg/analyzer/lib/src/dart/element/scope.dart b/pkg/analyzer/lib/src/dart/element/scope.dart
index 2622bd1..e084086 100644
--- a/pkg/analyzer/lib/src/dart/element/scope.dart
+++ b/pkg/analyzer/lib/src/dart/element/scope.dart
@@ -7,7 +7,6 @@
 import 'package:analyzer/src/context/source.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/resolver/scope.dart' as impl;
-import 'package:meta/meta.dart';
 
 /// The scope defined by a class.
 class ClassScope extends EnclosedScope {
@@ -112,8 +111,8 @@
   }
 
   bool shouldIgnoreUndefined({
-    @required String prefix,
-    @required String name,
+    required String? prefix,
+    required String name,
   }) {
     for (var importElement in _element.imports) {
       if (importElement.prefix?.name == prefix &&
@@ -174,9 +173,9 @@
   final Map<String, Element> _getters = {};
   final Map<String, Element> _setters = {};
   final Set<ExtensionElement> _extensions = {};
-  LibraryElement _deferredLibrary;
+  LibraryElement? _deferredLibrary;
 
-  PrefixScope(this._library, PrefixElement prefix) {
+  PrefixScope(this._library, PrefixElement? prefix) {
     for (var import in _library.imports) {
       if (import.prefix == prefix) {
         var elements = impl.NamespaceBuilder().getImportedElements(import);
@@ -190,8 +189,9 @@
 
   @override
   ScopeLookupResult lookup(String id) {
-    if (_deferredLibrary != null && id == FunctionElement.LOAD_LIBRARY_NAME) {
-      return ScopeLookupResult(_deferredLibrary.loadLibraryFunction, null);
+    var deferredLibrary = _deferredLibrary;
+    if (deferredLibrary != null && id == FunctionElement.LOAD_LIBRARY_NAME) {
+      return ScopeLookupResult(deferredLibrary.loadLibraryFunction, null);
     }
 
     var getter = _getters[id];
@@ -217,8 +217,8 @@
   }
 
   void _addTo({
-    @required Map<String, Element> map,
-    @required Element element,
+    required Map<String, Element> map,
+    required Element element,
   }) {
     var id = element.displayName;
 
@@ -249,7 +249,7 @@
     return MultiplyDefinedElementImpl(
       _library.context,
       _library.session,
-      conflictingElements.first.name,
+      conflictingElements.first.name!,
       conflictingElements.toList(),
     );
   }
@@ -272,7 +272,7 @@
     if (element is MultiplyDefinedElement) {
       return false;
     }
-    return element.library.isInSdk;
+    return element.library!.isInSdk;
   }
 }
 
@@ -288,7 +288,7 @@
 class _LibraryImportScope implements Scope {
   final LibraryElement _library;
   final PrefixScope _nullPrefixScope;
-  List<ExtensionElement> _extensions;
+  List<ExtensionElement>? _extensions;
 
   _LibraryImportScope(LibraryElement library)
       : _library = library,
diff --git a/pkg/analyzer/lib/src/dart/element/subtype.dart b/pkg/analyzer/lib/src/dart/element/subtype.dart
index 80b0c80..85a9387 100644
--- a/pkg/analyzer/lib/src/dart/element/subtype.dart
+++ b/pkg/analyzer/lib/src/dart/element/subtype.dart
@@ -190,12 +190,15 @@
 
     // Right Promoted Variable: if `T1` is a promoted type variable `X1 & S1`:
     //   * `T0 <: T1` iff `T0 <: X1` and `T0 <: S1`
-    if (T1 is TypeParameterTypeImpl && T1.promotedBound != null) {
-      var X1 = TypeParameterTypeImpl(
-        element: T1.element,
-        nullabilitySuffix: T1.nullabilitySuffix,
-      );
-      return isSubtypeOf(T0, X1) && isSubtypeOf(T0, T1.promotedBound);
+    if (T1 is TypeParameterTypeImpl) {
+      var T1_promotedBound = T1.promotedBound;
+      if (T1_promotedBound != null) {
+        var X1 = TypeParameterTypeImpl(
+          element: T1.element,
+          nullabilitySuffix: T1.nullabilitySuffix,
+        );
+        return isSubtypeOf(T0, X1) && isSubtypeOf(T0, T1_promotedBound);
+      }
     }
 
     // Right FutureOr: if `T1` is `FutureOr<S1>` then:
@@ -468,7 +471,8 @@
     for (var interface in subElement.allSupertypes) {
       if (interface.element == superElement) {
         var substitution = Substitution.fromInterfaceType(subType);
-        var substitutedInterface = substitution.substituteType(interface);
+        var substitutedInterface =
+            substitution.substituteType(interface) as InterfaceType;
         return _interfaceArguments(
           superElement,
           substitutedInterface,
diff --git a/pkg/analyzer/lib/src/dart/element/top_merge.dart b/pkg/analyzer/lib/src/dart/element/top_merge.dart
index 8fb1327..c79f91b 100644
--- a/pkg/analyzer/lib/src/dart/element/top_merge.dart
+++ b/pkg/analyzer/lib/src/dart/element/top_merge.dart
@@ -137,7 +137,7 @@
       var T_none = (T as TypeImpl).withNullability(NullabilitySuffix.none);
       var S_none = (S as TypeImpl).withNullability(NullabilitySuffix.none);
       var R_none = topMerge(T_none, S_none) as TypeImpl;
-      return R_none?.withNullability(resultNullability);
+      return R_none.withNullability(resultNullability);
     }
 
     assert(T_nullability == NullabilitySuffix.none);
@@ -178,11 +178,11 @@
     }
 
     List<TypeParameterElement> R_typeParameters;
-    Substitution T_Substitution;
-    Substitution S_Substitution;
+    Substitution? T_Substitution;
+    Substitution? S_Substitution;
 
     DartType mergeTypes(DartType T, DartType S) {
-      if (T_Substitution != null) {
+      if (T_Substitution != null && S_Substitution != null) {
         T = T_Substitution.substituteType(T);
         S = S_Substitution.substituteType(S);
       }
@@ -212,7 +212,7 @@
       throw _TopMergeStateError(T, S, 'Different number of formal parameters');
     }
 
-    var R_parameters = List<ParameterElement>.filled(T_parameters.length, null);
+    var R_parameters = <ParameterElement>[];
     for (var i = 0; i < T_parameters.length; i++) {
       var T_parameter = T_parameters[i];
       var S_parameter = S_parameters[i];
@@ -254,9 +254,11 @@
         R_type = mergeTypes(T_parameter.type, S_parameter.type);
       }
 
-      R_parameters[i] = T_parameter.copyWith(
-        type: R_type,
-        kind: R_kind,
+      R_parameters.add(
+        T_parameter.copyWith(
+          type: R_type,
+          kind: R_kind,
+        ),
       );
     }
 
@@ -278,10 +280,10 @@
     if (T_arguments.isEmpty) {
       return T;
     } else {
-      var arguments = List<DartType>.filled(T_arguments.length, null);
-      for (var i = 0; i < T_arguments.length; i++) {
-        arguments[i] = topMerge(T_arguments[i], S_arguments[i]);
-      }
+      var arguments = List.generate(
+        T_arguments.length,
+        (i) => topMerge(T_arguments[i], S_arguments[i]),
+      );
       return T.element.instantiate(
         typeArguments: arguments,
         nullabilitySuffix: NullabilitySuffix.none,
@@ -289,7 +291,7 @@
     }
   }
 
-  ParameterKind _parameterKind(
+  ParameterKind? _parameterKind(
     ParameterElement T_parameter,
     ParameterElement S_parameter,
   ) {
@@ -314,7 +316,7 @@
     return null;
   }
 
-  _MergeTypeParametersResult _typeParameters(
+  _MergeTypeParametersResult? _typeParameters(
     List<TypeParameterElement> aParameters,
     List<TypeParameterElement> bParameters,
   ) {
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index 88848f7..8cf0fb0 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -19,9 +19,7 @@
 import 'package:analyzer/src/dart/element/type_algebra.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/generated/element_type_provider.dart';
-import 'package:analyzer/src/generated/engine.dart' show AnalysisEngine;
 import 'package:analyzer/src/generated/utilities_dart.dart';
-import 'package:meta/meta.dart';
 
 /// Transforms the given [list] by applying [transform] to all its elements.
 ///
@@ -108,13 +106,13 @@
   final NullabilitySuffix nullabilitySuffix;
 
   FunctionTypeImpl({
-    @required List<TypeParameterElement> typeFormals,
-    @required List<ParameterElement> parameters,
-    @required DartType returnType,
-    @required NullabilitySuffix nullabilitySuffix,
-    Element element,
-    TypeAliasElement aliasElement,
-    List<DartType> aliasArguments,
+    required List<TypeParameterElement> typeFormals,
+    required List<ParameterElement> parameters,
+    required DartType returnType,
+    required NullabilitySuffix nullabilitySuffix,
+    Element? element,
+    TypeAliasElement? aliasElement,
+    List<DartType>? aliasArguments,
   })  : typeFormals = typeFormals,
         parameters = _sortNamedParameters(parameters),
         returnType = returnType,
@@ -123,7 +121,7 @@
             aliasElement: aliasElement, aliasArguments: aliasArguments);
 
   @override
-  FunctionTypedElement get element {
+  FunctionTypedElement? get element {
     // TODO(scheglov) https://github.com/dart-lang/sdk/issues/44629
     // TODO(scheglov) Can we just construct it with the right element?
     var aliasedElement = aliasElement?.aliasedElement;
@@ -164,7 +162,7 @@
 
   @Deprecated('Check element, or use getDisplayString()')
   @override
-  String get name => null;
+  String? get name => null;
 
   @override
   Map<String, DartType> get namedParameterTypes {
@@ -237,7 +235,7 @@
       // To test this, we instantiate both types with the same (unique) type
       // variables, and see if the result is equal.
       if (typeFormals.isNotEmpty) {
-        List<DartType> freshVariables = FunctionTypeImpl.relateTypeFormals(
+        var freshVariables = FunctionTypeImpl.relateTypeFormals(
             this, other, (t, s, _, __) => t == s);
         if (freshVariables == null) {
           return false;
@@ -301,7 +299,7 @@
       var elementImpl = element as TypeParameterElementImpl;
       assert(!parameters.contains(elementImpl));
 
-      var bound = elementImpl.bound as TypeImpl;
+      var bound = elementImpl.bound as TypeImpl?;
       if (bound != null && bound.referencesAny(parameters)) {
         return true;
       }
@@ -358,11 +356,11 @@
   ///
   /// If [boundsRelation] is omitted, uses [returnRelation]. This is for
   /// backwards compatibility, and convenience for Dart 1 type system methods.
-  static bool relate(FunctionType t, DartType other,
+  static bool relate(FunctionType t, DartType? other,
       bool Function(DartType t, DartType s) returnRelation,
-      {bool Function(ParameterElement t, ParameterElement s) parameterRelation,
+      {bool Function(ParameterElement t, ParameterElement s)? parameterRelation,
       bool Function(DartType bound2, DartType bound1,
-              TypeParameterElement formal2, TypeParameterElement formal1)
+              TypeParameterElement formal2, TypeParameterElement formal1)?
           boundsRelation}) {
     parameterRelation ??= (t, s) => returnRelation(t.type, s.type);
     boundsRelation ??= (t, s, _, __) => returnRelation(t, s);
@@ -380,9 +378,9 @@
     }
 
     // This type cast is safe, because we checked it above.
-    FunctionType s = other as FunctionType;
+    FunctionType s = other;
     if (t.typeFormals.isNotEmpty) {
-      List<DartType> freshVariables = relateTypeFormals(t, s, boundsRelation);
+      var freshVariables = relateTypeFormals(t, s, boundsRelation);
       if (freshVariables == null) {
         return false;
       }
@@ -469,7 +467,7 @@
       if (tParam == null) {
         return false;
       }
-      var sParam = sNamed[key];
+      var sParam = sNamed[key]!;
       if (!parameterRelation(tParam, sParam)) {
         return false;
       }
@@ -516,7 +514,7 @@
   /// used to instantiate both function types, allowing further comparison.
   /// For example, given `<T>T -> T` and `<U>U -> U` we can instantiate them
   /// with `F` to get `F -> F` and `F -> F`, which we can see are equal.
-  static List<DartType> relateTypeFormals(
+  static List<TypeParameterType>? relateTypeFormals(
       FunctionType f1,
       FunctionType f2,
       bool Function(DartType bound2, DartType bound1,
@@ -527,7 +525,7 @@
     return relateTypeFormals2(params1, params2, relation);
   }
 
-  static List<DartType> relateTypeFormals2(
+  static List<TypeParameterType>? relateTypeFormals2(
       List<TypeParameterElement> params1,
       List<TypeParameterElement> params2,
       bool Function(DartType bound2, DartType bound1,
@@ -542,7 +540,7 @@
     // {variablesFresh/variables2}
     List<TypeParameterElement> variables1 = <TypeParameterElement>[];
     List<TypeParameterElement> variables2 = <TypeParameterElement>[];
-    List<DartType> variablesFresh = <DartType>[];
+    var variablesFresh = <TypeParameterType>[];
     for (int i = 0; i < count; i++) {
       TypeParameterElement p1 = params1[i];
       TypeParameterElement p2 = params2[i];
@@ -550,7 +548,7 @@
           TypeParameterElementImpl.synthetic(p2.name);
       ElementTypeProvider.current.freshTypeParameterCreated(pFresh, p2);
 
-      DartType variableFresh = pFresh.instantiate(
+      var variableFresh = pFresh.instantiate(
         nullabilitySuffix: NullabilitySuffix.none,
       );
 
@@ -609,7 +607,7 @@
   static List<ParameterElement> _sortNamedParameters(
     List<ParameterElement> parameters,
   ) {
-    int firstNamedParameterIndex;
+    int? firstNamedParameterIndex;
 
     // Check if already sorted.
     var namedParametersAlreadySorted = true;
@@ -632,7 +630,7 @@
 
     // Sort named parameters.
     var namedParameters =
-        parameters.sublist(firstNamedParameterIndex, parameters.length);
+        parameters.sublist(firstNamedParameterIndex!, parameters.length);
     namedParameters.sort((a, b) => a.name.compareTo(b.name));
 
     // Combine into a new list, with sorted named parameters.
@@ -652,20 +650,20 @@
   final NullabilitySuffix nullabilitySuffix;
 
   /// Cached [ConstructorElement]s - members or raw elements.
-  List<ConstructorElement> _constructors;
+  List<ConstructorElement>? _constructors;
 
   /// Cached [PropertyAccessorElement]s - members or raw elements.
-  List<PropertyAccessorElement> _accessors;
+  List<PropertyAccessorElement>? _accessors;
 
   /// Cached [MethodElement]s - members or raw elements.
-  List<MethodElement> _methods;
+  List<MethodElement>? _methods;
 
   InterfaceTypeImpl({
-    @required ClassElement element,
-    @required this.typeArguments,
-    @required this.nullabilitySuffix,
-    TypeAliasElement aliasElement,
-    List<DartType> aliasArguments,
+    required ClassElement element,
+    required this.typeArguments,
+    required this.nullabilitySuffix,
+    TypeAliasElement? aliasElement,
+    List<DartType>? aliasArguments,
   }) : super(
           element,
           aliasElement: aliasElement,
@@ -676,14 +674,13 @@
   List<PropertyAccessorElement> get accessors {
     if (_accessors == null) {
       List<PropertyAccessorElement> accessors = element.accessors;
-      List<PropertyAccessorElement> members =
-          List<PropertyAccessorElement>.filled(accessors.length, null);
+      var members = <PropertyAccessorElement>[];
       for (int i = 0; i < accessors.length; i++) {
-        members[i] = PropertyAccessorMember.from(accessors[i], this);
+        members.add(PropertyAccessorMember.from(accessors[i], this)!);
       }
       _accessors = members;
     }
-    return _accessors;
+    return _accessors!;
   }
 
   @override
@@ -698,18 +695,17 @@
   List<ConstructorElement> get constructors {
     if (_constructors == null) {
       List<ConstructorElement> constructors = element.constructors;
-      List<ConstructorElement> members =
-          List<ConstructorElement>.filled(constructors.length, null);
+      var members = <ConstructorElement>[];
       for (int i = 0; i < constructors.length; i++) {
-        members[i] = ConstructorMember.from(constructors[i], this);
+        members.add(ConstructorMember.from(constructors[i], this));
       }
       _constructors = members;
     }
-    return _constructors;
+    return _constructors!;
   }
 
   @override
-  ClassElement get element => super.element;
+  ClassElement get element => super.element as ClassElement;
 
   @override
   int get hashCode {
@@ -800,14 +796,13 @@
   List<MethodElement> get methods {
     if (_methods == null) {
       List<MethodElement> methods = element.methods;
-      List<MethodElement> members =
-          List<MethodElement>.filled(methods.length, null);
+      var members = <MethodElement>[];
       for (int i = 0; i < methods.length; i++) {
-        members[i] = MethodMember.from(methods[i], this);
+        members.add(MethodMember.from(methods[i], this)!);
       }
       _methods = members;
     }
-    return _methods;
+    return _methods!;
   }
 
   @override
@@ -821,13 +816,14 @@
   String get name => element.name;
 
   @override
-  InterfaceType get superclass {
-    InterfaceType supertype = element.supertype;
+  InterfaceType? get superclass {
+    var supertype = element.supertype;
     if (supertype == null) {
       return null;
     }
 
-    return Substitution.fromInterfaceType(this).substituteType(supertype);
+    return Substitution.fromInterfaceType(this).substituteType(supertype)
+        as InterfaceType;
   }
 
   @override
@@ -875,7 +871,7 @@
   }
 
   @override
-  InterfaceType asInstanceOf(ClassElement targetElement) {
+  InterfaceType? asInstanceOf(ClassElement targetElement) {
     if (element == targetElement) {
       return this;
     }
@@ -883,7 +879,7 @@
     for (var rawInterface in element.allSupertypes) {
       if (rawInterface.element == targetElement) {
         var substitution = Substitution.fromInterfaceType(this);
-        return substitution.substituteType(rawInterface);
+        return substitution.substituteType(rawInterface) as InterfaceType;
       }
     }
 
@@ -891,22 +887,22 @@
   }
 
   @override
-  PropertyAccessorElement getGetter(String getterName) =>
+  PropertyAccessorElement? getGetter(String getterName) =>
       PropertyAccessorMember.from(element.getGetter(getterName), this);
 
   @override
-  MethodElement getMethod(String methodName) =>
+  MethodElement? getMethod(String methodName) =>
       MethodMember.from(element.getMethod(methodName), this);
 
   @override
-  PropertyAccessorElement getSetter(String setterName) =>
+  PropertyAccessorElement? getSetter(String setterName) =>
       PropertyAccessorMember.from(element.getSetter(setterName), this);
 
   @override
-  ConstructorElement lookUpConstructor(
-      String constructorName, LibraryElement library) {
+  ConstructorElement? lookUpConstructor(
+      String? constructorName, LibraryElement library) {
     // prepare base ConstructorElement
-    ConstructorElement constructorElement;
+    ConstructorElement? constructorElement;
     if (constructorName == null) {
       constructorElement = element.unnamedConstructor;
     } else {
@@ -923,9 +919,9 @@
 
   @deprecated
   @override
-  PropertyAccessorElement lookUpGetter(
-      String getterName, LibraryElement library) {
-    PropertyAccessorElement element = getGetter(getterName);
+  PropertyAccessorElement? lookUpGetter(
+      String getterName, LibraryElement? library) {
+    var element = getGetter(getterName);
     if (element != null && element.isAccessibleIn(library)) {
       return element;
     }
@@ -933,7 +929,7 @@
   }
 
   @override
-  PropertyAccessorElement lookUpGetter2(
+  PropertyAccessorElement? lookUpGetter2(
     String name,
     LibraryElement library, {
     bool concrete = false,
@@ -973,26 +969,28 @@
 
   @deprecated
   @override
-  PropertyAccessorElement lookUpGetterInSuperclass(
-      String getterName, LibraryElement library) {
+  PropertyAccessorElement? lookUpGetterInSuperclass(
+      String getterName, LibraryElement? library) {
     for (InterfaceType mixin in mixins.reversed) {
-      PropertyAccessorElement element = mixin.getGetter(getterName);
+      var element = mixin.getGetter(getterName);
       if (element != null && element.isAccessibleIn(library)) {
         return element;
       }
     }
     for (InterfaceType constraint in superclassConstraints) {
-      PropertyAccessorElement element = constraint.getGetter(getterName);
+      var element = constraint.getGetter(getterName);
       if (element != null && element.isAccessibleIn(library)) {
         return element;
       }
     }
     HashSet<ClassElement> visitedClasses = HashSet<ClassElement>();
-    InterfaceType supertype = superclass;
-    ClassElement supertypeElement = supertype?.element;
-    while (supertype != null && !visitedClasses.contains(supertypeElement)) {
+    var supertype = superclass;
+    var supertypeElement = supertype?.element;
+    while (supertype != null &&
+        supertypeElement != null &&
+        !visitedClasses.contains(supertypeElement)) {
       visitedClasses.add(supertypeElement);
-      PropertyAccessorElement element = supertype.getGetter(getterName);
+      var element = supertype.getGetter(getterName);
       if (element != null && element.isAccessibleIn(library)) {
         return element;
       }
@@ -1010,9 +1008,9 @@
 
   @deprecated
   @override
-  PropertyAccessorElement lookUpInheritedGetter(String name,
-      {LibraryElement library, bool thisType = true}) {
-    PropertyAccessorElement result;
+  PropertyAccessorElement? lookUpInheritedGetter(String name,
+      {LibraryElement? library, bool thisType = true}) {
+    PropertyAccessorElement? result;
     if (thisType) {
       result = lookUpGetter(name, library);
     } else {
@@ -1027,10 +1025,9 @@
 
   @deprecated
   @override
-  ExecutableElement lookUpInheritedGetterOrMethod(String name,
-      {LibraryElement library}) {
-    ExecutableElement result =
-        lookUpGetter(name, library) ?? lookUpMethod(name, library);
+  ExecutableElement? lookUpInheritedGetterOrMethod(String name,
+      {LibraryElement? library}) {
+    var result = lookUpGetter(name, library) ?? lookUpMethod(name, library);
 
     if (result != null) {
       return result;
@@ -1044,27 +1041,27 @@
   }
 
   @deprecated
-  ExecutableElement lookUpInheritedMember(String name, LibraryElement library,
+  ExecutableElement? lookUpInheritedMember(String name, LibraryElement library,
       {bool concrete = false,
       bool forSuperInvocation = false,
-      int startMixinIndex,
+      int? startMixinIndex,
       bool setter = false,
       bool thisType = false}) {
     HashSet<ClassElement> visitedClasses = HashSet<ClassElement>();
 
     /// TODO(scheglov) Remove [includeSupers]. It is used only to work around
     /// the problem with Flutter code base (using old super-mixins).
-    ExecutableElement lookUpImpl(InterfaceTypeImpl type,
+    ExecutableElement? lookUpImpl(InterfaceType? type,
         {bool acceptAbstract = false,
         bool includeType = true,
         bool inMixin = false,
-        int startMixinIndex}) {
+        int? startMixinIndex}) {
       if (type == null || !visitedClasses.add(type.element)) {
         return null;
       }
 
       if (includeType) {
-        ExecutableElement result;
+        ExecutableElement? result;
         if (setter) {
           result = type.getSetter(name);
         } else {
@@ -1133,9 +1130,9 @@
 
   @deprecated
   @override
-  MethodElement lookUpInheritedMethod(String name,
-      {LibraryElement library, bool thisType = true}) {
-    MethodElement result;
+  MethodElement? lookUpInheritedMethod(String name,
+      {LibraryElement? library, bool thisType = true}) {
+    MethodElement? result;
     if (thisType) {
       result = lookUpMethod(name, library);
     } else {
@@ -1150,9 +1147,9 @@
 
   @deprecated
   @override
-  PropertyAccessorElement lookUpInheritedSetter(String name,
-      {LibraryElement library, bool thisType = true}) {
-    PropertyAccessorElement result;
+  PropertyAccessorElement? lookUpInheritedSetter(String name,
+      {LibraryElement? library, bool thisType = true}) {
+    PropertyAccessorElement? result;
     if (thisType) {
       result = lookUpSetter(name, library);
     } else {
@@ -1167,8 +1164,8 @@
 
   @deprecated
   @override
-  MethodElement lookUpMethod(String methodName, LibraryElement library) {
-    MethodElement element = getMethod(methodName);
+  MethodElement? lookUpMethod(String methodName, LibraryElement? library) {
+    var element = getMethod(methodName);
     if (element != null && element.isAccessibleIn(library)) {
       return element;
     }
@@ -1176,7 +1173,7 @@
   }
 
   @override
-  MethodElement lookUpMethod2(
+  MethodElement? lookUpMethod2(
     String name,
     LibraryElement library, {
     bool concrete = false,
@@ -1216,26 +1213,28 @@
 
   @deprecated
   @override
-  MethodElement lookUpMethodInSuperclass(
-      String methodName, LibraryElement library) {
+  MethodElement? lookUpMethodInSuperclass(
+      String methodName, LibraryElement? library) {
     for (InterfaceType mixin in mixins.reversed) {
-      MethodElement element = mixin.getMethod(methodName);
+      var element = mixin.getMethod(methodName);
       if (element != null && element.isAccessibleIn(library)) {
         return element;
       }
     }
     for (InterfaceType constraint in superclassConstraints) {
-      MethodElement element = constraint.getMethod(methodName);
+      var element = constraint.getMethod(methodName);
       if (element != null && element.isAccessibleIn(library)) {
         return element;
       }
     }
     HashSet<ClassElement> visitedClasses = HashSet<ClassElement>();
-    InterfaceType supertype = superclass;
-    ClassElement supertypeElement = supertype?.element;
-    while (supertype != null && !visitedClasses.contains(supertypeElement)) {
+    var supertype = superclass;
+    var supertypeElement = supertype?.element;
+    while (supertype != null &&
+        supertypeElement != null &&
+        !visitedClasses.contains(supertypeElement)) {
       visitedClasses.add(supertypeElement);
-      MethodElement element = supertype.getMethod(methodName);
+      var element = supertype.getMethod(methodName);
       if (element != null && element.isAccessibleIn(library)) {
         return element;
       }
@@ -1253,9 +1252,9 @@
 
   @deprecated
   @override
-  PropertyAccessorElement lookUpSetter(
-      String setterName, LibraryElement library) {
-    PropertyAccessorElement element = getSetter(setterName);
+  PropertyAccessorElement? lookUpSetter(
+      String setterName, LibraryElement? library) {
+    var element = getSetter(setterName);
     if (element != null && element.isAccessibleIn(library)) {
       return element;
     }
@@ -1263,7 +1262,7 @@
   }
 
   @override
-  PropertyAccessorElement lookUpSetter2(
+  PropertyAccessorElement? lookUpSetter2(
     String name,
     LibraryElement library, {
     bool concrete = false,
@@ -1303,26 +1302,28 @@
 
   @deprecated
   @override
-  PropertyAccessorElement lookUpSetterInSuperclass(
-      String setterName, LibraryElement library) {
+  PropertyAccessorElement? lookUpSetterInSuperclass(
+      String setterName, LibraryElement? library) {
     for (InterfaceType mixin in mixins.reversed) {
-      PropertyAccessorElement element = mixin.getSetter(setterName);
+      var element = mixin.getSetter(setterName);
       if (element != null && element.isAccessibleIn(library)) {
         return element;
       }
     }
     for (InterfaceType constraint in superclassConstraints) {
-      PropertyAccessorElement element = constraint.getSetter(setterName);
+      var element = constraint.getSetter(setterName);
       if (element != null && element.isAccessibleIn(library)) {
         return element;
       }
     }
     HashSet<ClassElement> visitedClasses = HashSet<ClassElement>();
-    InterfaceType supertype = superclass;
-    ClassElement supertypeElement = supertype?.element;
-    while (supertype != null && !visitedClasses.contains(supertypeElement)) {
+    var supertype = superclass;
+    var supertypeElement = supertype?.element;
+    while (supertype != null &&
+        supertypeElement != null &&
+        !visitedClasses.contains(supertypeElement)) {
       visitedClasses.add(supertypeElement);
-      PropertyAccessorElement element = supertype.getSetter(setterName);
+      var element = supertype.getSetter(setterName);
       if (element != null && element.isAccessibleIn(library)) {
         return element;
       }
@@ -1364,16 +1365,16 @@
     if (typeParameters.isEmpty) return defined;
 
     var substitution = Substitution.fromInterfaceType(this);
-    var result = List<InterfaceType>.filled(defined.length, null);
+    var result = <InterfaceType>[];
     for (int i = 0; i < defined.length; i++) {
-      result[i] = substitution.substituteType(defined[i]);
+      result.add(substitution.substituteType(defined[i]) as InterfaceType);
     }
     return result;
   }
 
   /// If there is a single type which is at least as specific as all of the
   /// types in [types], return it.  Otherwise return `null`.
-  static DartType findMostSpecificType(
+  static DartType? findMostSpecificType(
       List<DartType> types, TypeSystemImpl typeSystem) {
     // The << relation ("more specific than") is a partial ordering on types,
     // so to find the most specific type of a set, we keep a bucket of the most
@@ -1439,8 +1440,8 @@
     if (first.element == second.element) {
       return _leastUpperBound(first, second);
     }
-    TypeSystemImpl typeSystem = first.element.library.typeSystem;
-    return typeSystem.getLeastUpperBound(first, second);
+    var typeSystem = first.element.library.typeSystem as TypeSystemImpl;
+    return typeSystem.getLeastUpperBound(first, second) as InterfaceType;
   }
 
   /// Return the "least upper bound" of the given types under the assumption
@@ -1467,7 +1468,10 @@
     if (argumentCount == 0) {
       return firstType;
     }
-    List<DartType> lubArguments = List<DartType>.filled(argumentCount, null);
+    var lubArguments = List<DartType>.filled(
+      argumentCount,
+      DynamicTypeImpl.instance,
+    );
     for (int i = 0; i < argumentCount; i++) {
       //
       // Ideally we would take the least upper bound of the two argument types,
@@ -1477,9 +1481,6 @@
       if (firstArguments[i] == secondArguments[i]) {
         lubArguments[i] = firstArguments[i];
       }
-      if (lubArguments[i] == null) {
-        lubArguments[i] = DynamicTypeImpl.instance;
-      }
     }
 
     NullabilitySuffix computeNullability() {
@@ -1509,12 +1510,12 @@
   /// search should include the target type. The [visitedInterfaces] is a set
   /// containing all of the interfaces that have been examined, used to prevent
   /// infinite recursion and to optimize the search.
-  static T _lookUpMemberInInterfaces<T extends ExecutableElement>(
+  static T? _lookUpMemberInInterfaces<T extends ExecutableElement>(
       InterfaceType targetType,
       bool includeTargetType,
-      LibraryElement library,
+      LibraryElement? library,
       HashSet<ClassElement> visitedInterfaces,
-      T Function(InterfaceType type) getMember) {
+      T? Function(InterfaceType type) getMember) {
     // TODO(brianwilkerson) This isn't correct. Section 8.1.1 of the
     // specification (titled "Inheritance and Overriding" under "Interfaces")
     // describes a much more complex scheme for finding the inherited member.
@@ -1524,33 +1525,33 @@
       return null;
     }
     if (includeTargetType) {
-      ExecutableElement member = getMember(targetType);
+      var member = getMember(targetType);
       if (member != null && member.isAccessibleIn(library)) {
         return member;
       }
     }
     for (InterfaceType interfaceType in targetType.interfaces) {
-      ExecutableElement member = _lookUpMemberInInterfaces(
+      var member = _lookUpMemberInInterfaces(
           interfaceType, true, library, visitedInterfaces, getMember);
       if (member != null) {
         return member;
       }
     }
     for (InterfaceType constraint in targetType.superclassConstraints) {
-      ExecutableElement member = _lookUpMemberInInterfaces(
+      var member = _lookUpMemberInInterfaces(
           constraint, true, library, visitedInterfaces, getMember);
       if (member != null) {
         return member;
       }
     }
     for (InterfaceType mixinType in targetType.mixins.reversed) {
-      ExecutableElement member = _lookUpMemberInInterfaces(
+      var member = _lookUpMemberInInterfaces(
           mixinType, true, library, visitedInterfaces, getMember);
       if (member != null) {
         return member;
       }
     }
-    InterfaceType superclass = targetType.superclass;
+    var superclass = targetType.superclass;
     if (superclass == null) {
       return null;
     }
@@ -1591,6 +1592,9 @@
   NeverTypeImpl._(this.nullabilitySuffix) : super(NeverElementImpl());
 
   @override
+  NeverElementImpl get element => super.element as NeverElementImpl;
+
+  @override
   int get hashCode => 0;
 
   @override
@@ -1637,7 +1641,6 @@
       case NullabilitySuffix.none:
         return instance;
     }
-    throw StateError('Unexpected nullabilitySuffix: $nullabilitySuffix');
   }
 }
 
@@ -1645,14 +1648,14 @@
 /// representing the declared type of elements in the element model.
 abstract class TypeImpl implements DartType {
   @override
-  final List<DartType> aliasArguments;
+  final List<DartType>? aliasArguments;
 
   @override
-  final TypeAliasElement aliasElement;
+  final TypeAliasElement? aliasElement;
 
   /// The element representing the declaration of this type, or `null` if the
   /// type has not, or cannot, be associated with an element.
-  final Element _element;
+  final Element? _element;
 
   /// Initialize a newly created type to be declared by the given [element].
   TypeImpl(this._element, {this.aliasElement, this.aliasArguments})
@@ -1669,7 +1672,7 @@
   }
 
   @override
-  Element get element => _element;
+  Element? get element => _element;
 
   @override
   bool get isBottom => false;
@@ -1732,12 +1735,12 @@
   void appendTo(ElementDisplayStringBuilder builder);
 
   @override
-  InterfaceType asInstanceOf(ClassElement element) => null;
+  InterfaceType? asInstanceOf(ClassElement element) => null;
 
   @override
   String getDisplayString({
     bool skipAllDynamicArguments = false,
-    @required bool withNullability,
+    required bool withNullability,
   }) {
     var builder = ElementDisplayStringBuilder(
       skipAllDynamicArguments: skipAllDynamicArguments,
@@ -1779,15 +1782,6 @@
       return false;
     }
     for (int i = 0; i < first.length; i++) {
-      if (first[i] == null) {
-        AnalysisEngine.instance.instrumentationService
-            .logInfo('Found null type argument in TypeImpl.equalArrays');
-        return second[i] == null;
-      } else if (second[i] == null) {
-        AnalysisEngine.instance.instrumentationService
-            .logInfo('Found null type argument in TypeImpl.equalArrays');
-        return false;
-      }
       if (first[i] != second[i]) {
         return false;
       }
@@ -1805,13 +1799,13 @@
   ///
   /// 'null' indicates that the type parameter's bound has not been promoted and
   /// is therefore the same as the bound of [element].
-  final DartType promotedBound;
+  final DartType? promotedBound;
 
   /// Initialize a newly created type parameter type to be declared by the given
   /// [element] and to have the given name.
   TypeParameterTypeImpl({
-    @required TypeParameterElement element,
-    @required this.nullabilitySuffix,
+    required TypeParameterElement element,
+    required this.nullabilitySuffix,
     this.promotedBound,
   }) : super(element);
 
@@ -1820,7 +1814,7 @@
       promotedBound ?? element.bound ?? DynamicTypeImpl.instance;
 
   @override
-  ElementLocation get definition => element.location;
+  ElementLocation get definition => element.location!;
 
   @override
   TypeParameterElement get element => super.element as TypeParameterElement;
@@ -1888,8 +1882,8 @@
   }
 
   @override
-  InterfaceType asInstanceOf(ClassElement element) {
-    return bound?.asInstanceOf(element);
+  InterfaceType? asInstanceOf(ClassElement element) {
+    return bound.asInstanceOf(element);
   }
 
   @override
@@ -1900,25 +1894,26 @@
   @override
   DartType resolveToBound(DartType objectType) {
     if (promotedBound != null) {
-      return promotedBound;
+      return promotedBound!;
     }
 
-    if (element.bound == null) {
+    var bound = element.bound;
+    if (bound == null) {
       return objectType;
     }
 
     NullabilitySuffix newNullabilitySuffix;
     if (nullabilitySuffix == NullabilitySuffix.question ||
-        element.bound.nullabilitySuffix == NullabilitySuffix.question) {
+        bound.nullabilitySuffix == NullabilitySuffix.question) {
       newNullabilitySuffix = NullabilitySuffix.question;
     } else if (nullabilitySuffix == NullabilitySuffix.star ||
-        element.bound.nullabilitySuffix == NullabilitySuffix.star) {
+        bound.nullabilitySuffix == NullabilitySuffix.star) {
       newNullabilitySuffix = NullabilitySuffix.star;
     } else {
       newNullabilitySuffix = NullabilitySuffix.none;
     }
 
-    return (element.bound.resolveToBound(objectType) as TypeImpl)
+    return (bound.resolveToBound(objectType) as TypeImpl)
         .withNullability(newNullabilitySuffix);
   }
 
diff --git a/pkg/analyzer/lib/src/dart/element/type_algebra.dart b/pkg/analyzer/lib/src/dart/element/type_algebra.dart
index a06c562..4d72f96 100644
--- a/pkg/analyzer/lib/src/dart/element/type_algebra.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_algebra.dart
@@ -156,7 +156,7 @@
 
   const Substitution();
 
-  DartType getSubstitute(TypeParameterElement parameter, bool upperBound);
+  DartType? getSubstitute(TypeParameterElement parameter, bool upperBound);
 
   DartType substituteType(DartType type, {bool contravariant = false}) {
     var visitor = _TopSubstitutor(this, contravariant);
@@ -240,7 +240,7 @@
   _CombinedSubstitution(this.first, this.second);
 
   @override
-  DartType getSubstitute(TypeParameterElement parameter, bool upperBound) {
+  DartType? getSubstitute(TypeParameterElement parameter, bool upperBound) {
     return first.getSubstitute(parameter, upperBound) ??
         second.getSubstitute(parameter, upperBound);
   }
@@ -258,14 +258,13 @@
       return const <TypeParameterElement>[];
     }
 
-    var freshElements =
-        List<TypeParameterElement>.filled(elements.length, null);
+    var freshElements = <TypeParameterElement>[];
     for (var i = 0; i < elements.length; i++) {
       // TODO (kallentu) : Clean up TypeParameterElementImpl casting once
       // variance is added to the interface.
       var element = elements[i] as TypeParameterElementImpl;
       var freshElement = TypeParameterElementImpl(element.name, -1);
-      freshElements[i] = freshElement;
+      freshElements.add(freshElement);
       var freshType = freshElement.instantiate(
         nullabilitySuffix: NullabilitySuffix.none,
       );
@@ -278,9 +277,10 @@
 
     for (var i = 0; i < freshElements.length; i++) {
       var element = elements[i];
-      if (element.bound != null) {
-        TypeParameterElementImpl freshElement = freshElements[i];
-        freshElement.bound = element.bound.accept(this);
+      var bound = element.bound;
+      if (bound != null) {
+        var freshElement = freshElements[i] as TypeParameterElementImpl;
+        freshElement.bound = bound.accept(this);
       }
     }
 
@@ -288,7 +288,7 @@
   }
 
   @override
-  DartType lookup(TypeParameterElement parameter, bool upperBound) {
+  DartType? lookup(TypeParameterElement parameter, bool upperBound) {
     return substitution[parameter];
   }
 }
@@ -300,7 +300,7 @@
   _MapSubstitution(this.map);
 
   @override
-  DartType getSubstitute(TypeParameterElement parameter, bool upperBound) {
+  DartType? getSubstitute(TypeParameterElement parameter, bool upperBound) {
     return map[parameter];
   }
 
@@ -347,7 +347,7 @@
   }
 
   @override
-  DartType lookup(TypeParameterElement parameter, bool upperBound) {
+  DartType? lookup(TypeParameterElement parameter, bool upperBound) {
     return substitution.getSubstitute(parameter, upperBound);
   }
 }
@@ -357,7 +357,7 @@
         TypeVisitor<DartType>,
         InferenceTypeVisitor<DartType>,
         LinkingTypeVisitor<DartType> {
-  final _TypeSubstitutor outer;
+  final _TypeSubstitutor? outer;
   bool covariantContext = true;
 
   /// The number of times a variable from this environment has been used in
@@ -369,14 +369,14 @@
   int useCounter = 0;
 
   _TypeSubstitutor(this.outer) {
-    covariantContext = outer == null ? true : outer.covariantContext;
+    covariantContext = outer == null ? true : outer!.covariantContext;
   }
 
   void bumpCountersUntil(_TypeSubstitutor target) {
     var substitutor = this;
     while (substitutor != target) {
       substitutor.useCounter++;
-      substitutor = substitutor.outer;
+      substitutor = substitutor.outer!;
     }
     target.useCounter++;
   }
@@ -384,8 +384,8 @@
   List<TypeParameterElement> freshTypeParameters(
       List<TypeParameterElement> elements);
 
-  DartType getSubstitute(TypeParameterElement parameter) {
-    var environment = this;
+  DartType? getSubstitute(TypeParameterElement parameter) {
+    _TypeSubstitutor? environment = this;
     while (environment != null) {
       var replacement = environment.lookup(parameter, covariantContext);
       if (replacement != null) {
@@ -401,7 +401,7 @@
     covariantContext = !covariantContext;
   }
 
-  DartType lookup(TypeParameterElement parameter, bool upperBound);
+  DartType? lookup(TypeParameterElement parameter, bool upperBound);
 
   _FreshTypeParametersSubstitutor newInnerEnvironment() {
     return _FreshTypeParametersSubstitutor(this);
@@ -443,7 +443,10 @@
     inner.invertVariance();
 
     var returnType = type.returnType.accept(inner);
-    var aliasArguments = _mapList(type.aliasArguments);
+
+    var aliasArguments = type.aliasArguments;
+    var newAliasArguments =
+        aliasArguments != null ? _mapList(aliasArguments) : null;
 
     if (useCounter == before) return type;
 
@@ -453,7 +456,7 @@
       returnType: returnType,
       nullabilitySuffix: type.nullabilitySuffix,
       aliasElement: type.aliasElement,
-      aliasArguments: aliasArguments,
+      aliasArguments: newAliasArguments,
     );
   }
 
@@ -563,7 +566,6 @@
   DartType visitVoidType(VoidType type) => type;
 
   List<DartType> _mapList(List<DartType> types) {
-    if (types == null) return null;
     return types.map((e) => e.accept(this)).toList();
   }
 }
@@ -575,7 +577,7 @@
   _UpperLowerBoundsSubstitution(this.upper, this.lower);
 
   @override
-  DartType getSubstitute(TypeParameterElement parameter, bool upperBound) {
+  DartType? getSubstitute(TypeParameterElement parameter, bool upperBound) {
     return upperBound ? upper[parameter] : lower[parameter];
   }
 
diff --git a/pkg/analyzer/lib/src/dart/element/type_constraint_gatherer.dart b/pkg/analyzer/lib/src/dart/element/type_constraint_gatherer.dart
index c3040b2..c729106 100644
--- a/pkg/analyzer/lib/src/dart/element/type_constraint_gatherer.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_constraint_gatherer.dart
@@ -10,7 +10,6 @@
 import 'package:analyzer/src/dart/element/type_algebra.dart';
 import 'package:analyzer/src/dart/element/type_schema.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
-import 'package:meta/meta.dart';
 
 /// A constraint on the type [parameter] that we're inferring.
 /// We require that `lower <: parameter <: upper`.
@@ -42,8 +41,8 @@
   final List<TypeConstraint> _constraints = [];
 
   TypeConstraintGatherer({
-    @required TypeSystemImpl typeSystem,
-    @required Iterable<TypeParameterElement> typeParameters,
+    required TypeSystemImpl typeSystem,
+    required Iterable<TypeParameterElement> typeParameters,
   }) : _typeSystem = typeSystem {
     _typeParameters.addAll(typeParameters);
   }
@@ -69,7 +68,7 @@
 
     for (var constraint in _constraints) {
       var parameter = constraint.parameter;
-      var mergedConstraint = result[parameter];
+      var mergedConstraint = result[parameter]!;
 
       var lower = _typeSystem.getLeastUpperBound(
         mergedConstraint.lower,
@@ -560,7 +559,7 @@
       if (interface.element == C1) {
         var substitution = Substitution.fromInterfaceType(P);
         return _interfaceType_arguments(
-          substitution.substituteType(interface),
+          substitution.substituteType(interface) as InterfaceType,
           Q,
           leftSchema,
         );
diff --git a/pkg/analyzer/lib/src/dart/element/type_demotion.dart b/pkg/analyzer/lib/src/dart/element/type_demotion.dart
index 9421190..92390a4 100644
--- a/pkg/analyzer/lib/src/dart/element/type_demotion.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_demotion.dart
@@ -6,7 +6,6 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/replacement_visitor.dart';
 import 'package:analyzer/src/dart/element/type.dart';
-import 'package:meta/meta.dart';
 
 /// Visitor that replaces all promoted type variables the type variable itself
 /// and/or replaces all legacy types with non-nullable types.
@@ -17,12 +16,12 @@
   final bool nonNullifyTypes;
 
   const DemotionNonNullificationVisitor({
-    @required this.demoteTypeVariables,
-    @required this.nonNullifyTypes,
+    required this.demoteTypeVariables,
+    required this.nonNullifyTypes,
   }) : assert(demoteTypeVariables || nonNullifyTypes);
 
   @override
-  NullabilitySuffix visitNullability(DartType type) {
+  NullabilitySuffix? visitNullability(DartType type) {
     if (nonNullifyTypes && type.nullabilitySuffix == NullabilitySuffix.star) {
       return NullabilitySuffix.none;
     }
@@ -30,7 +29,7 @@
   }
 
   @override
-  DartType visitTypeParameterType(TypeParameterType type) {
+  DartType? visitTypeParameterType(TypeParameterType type) {
     var newNullability = visitNullability(type);
 
     if (demoteTypeVariables) {
diff --git a/pkg/analyzer/lib/src/dart/element/type_provider.dart b/pkg/analyzer/lib/src/dart/element/type_provider.dart
index 8806048..332009e 100644
--- a/pkg/analyzer/lib/src/dart/element/type_provider.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_provider.dart
@@ -7,14 +7,13 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/element/type.dart';
-import 'package:meta/meta.dart';
 
 /// Provide common functionality shared by the various TypeProvider
 /// implementations.
 abstract class TypeProviderBase implements TypeProvider {
   @override
   bool isObjectGetter(String id) {
-    PropertyAccessorElement element = objectType.element.getGetter(id);
+    var element = objectType.element.getGetter(id);
     return element != null && !element.isStatic;
   }
 
@@ -25,7 +24,7 @@
 
   @override
   bool isObjectMethod(String id) {
-    MethodElement element = objectType.element.getMethod(id);
+    var element = objectType.element.getMethod(id);
     return element != null && !element.isStatic;
   }
 }
@@ -38,56 +37,56 @@
   /// If `false`, then legacy types are returned.
   final bool isNonNullableByDefault;
 
-  ClassElement _boolElement;
-  ClassElement _doubleElement;
-  ClassElement _futureElement;
-  ClassElement _futureOrElement;
-  ClassElement _intElement;
-  ClassElement _iterableElement;
-  ClassElement _listElement;
-  ClassElement _mapElement;
-  ClassElement _nullElement;
-  ClassElement _numElement;
-  ClassElement _objectElement;
-  ClassElement _setElement;
-  ClassElement _streamElement;
-  ClassElement _stringElement;
-  ClassElement _symbolElement;
+  ClassElement? _boolElement;
+  ClassElement? _doubleElement;
+  ClassElement? _futureElement;
+  ClassElement? _futureOrElement;
+  ClassElement? _intElement;
+  ClassElement? _iterableElement;
+  ClassElement? _listElement;
+  ClassElement? _mapElement;
+  ClassElement? _nullElement;
+  ClassElement? _numElement;
+  ClassElement? _objectElement;
+  ClassElement? _setElement;
+  ClassElement? _streamElement;
+  ClassElement? _stringElement;
+  ClassElement? _symbolElement;
 
-  InterfaceType _boolType;
-  InterfaceType _deprecatedType;
-  InterfaceType _doubleType;
-  InterfaceType _doubleTypeQuestion;
-  InterfaceType _functionType;
-  InterfaceType _futureDynamicType;
-  InterfaceType _futureNullType;
-  InterfaceType _futureOrNullType;
-  InterfaceType _intType;
-  InterfaceType _intTypeQuestion;
-  InterfaceType _iterableDynamicType;
-  InterfaceType _iterableObjectType;
-  InterfaceType _mapObjectObjectType;
-  InterfaceType _nullType;
-  InterfaceType _numType;
-  InterfaceType _numTypeQuestion;
-  InterfaceType _objectType;
-  InterfaceType _stackTraceType;
-  InterfaceType _streamDynamicType;
-  InterfaceType _stringType;
-  InterfaceType _symbolType;
-  InterfaceType _typeType;
+  InterfaceType? _boolType;
+  InterfaceType? _deprecatedType;
+  InterfaceType? _doubleType;
+  InterfaceType? _doubleTypeQuestion;
+  InterfaceType? _functionType;
+  InterfaceType? _futureDynamicType;
+  InterfaceType? _futureNullType;
+  InterfaceType? _futureOrNullType;
+  InterfaceType? _intType;
+  InterfaceType? _intTypeQuestion;
+  InterfaceType? _iterableDynamicType;
+  InterfaceType? _iterableObjectType;
+  InterfaceType? _mapObjectObjectType;
+  InterfaceType? _nullType;
+  InterfaceType? _numType;
+  InterfaceType? _numTypeQuestion;
+  InterfaceType? _objectType;
+  InterfaceType? _stackTraceType;
+  InterfaceType? _streamDynamicType;
+  InterfaceType? _stringType;
+  InterfaceType? _symbolType;
+  InterfaceType? _typeType;
 
-  InterfaceTypeImpl _nullStar;
+  InterfaceType? _nullStar;
 
-  Set<ClassElement> _nonSubtypableClasses;
+  Set<ClassElement>? _nonSubtypableClasses;
 
   /// Initialize a newly created type provider to provide the types defined in
   /// the given [coreLibrary] and [asyncLibrary].
   TypeProviderImpl({
-    @required LibraryElement coreLibrary,
-    @required LibraryElement asyncLibrary,
-    @required bool isNonNullableByDefault,
-  })  : _coreLibrary = coreLibrary,
+    required LibraryElement coreLibrary,
+    required LibraryElement asyncLibrary,
+    required bool isNonNullableByDefault,
+  })   : _coreLibrary = coreLibrary,
         _asyncLibrary = asyncLibrary,
         isNonNullableByDefault = isNonNullableByDefault;
 
@@ -116,14 +115,13 @@
   }
 
   @override
-  ClassElement /*!*/ get boolElement {
+  ClassElement get boolElement {
     return _boolElement ??= _getClassElement(_coreLibrary, 'bool');
   }
 
   @override
-  InterfaceType /*!*/ get boolType {
-    _boolType ??= _getType(_coreLibrary, "bool");
-    return _boolType;
+  InterfaceType get boolType {
+    return _boolType ??= _getType(_coreLibrary, "bool");
   }
 
   @override
@@ -135,143 +133,132 @@
   }
 
   @override
-  InterfaceType /*!*/ get deprecatedType {
-    _deprecatedType ??= _getType(_coreLibrary, "Deprecated");
-    return _deprecatedType;
+  InterfaceType get deprecatedType {
+    return _deprecatedType ??= _getType(_coreLibrary, "Deprecated");
   }
 
   @override
-  ClassElement /*!*/ get doubleElement {
+  ClassElement get doubleElement {
     return _doubleElement ??= _getClassElement(_coreLibrary, "double");
   }
 
   @override
-  InterfaceType /*!*/ get doubleType {
-    _doubleType ??= _getType(_coreLibrary, "double");
-    return _doubleType;
+  InterfaceType get doubleType {
+    return _doubleType ??= _getType(_coreLibrary, "double");
   }
 
-  InterfaceType /*!*/ get doubleTypeQuestion =>
+  InterfaceType get doubleTypeQuestion =>
       _doubleTypeQuestion ??= (doubleType as InterfaceTypeImpl)
           .withNullability(NullabilitySuffix.question);
 
   @override
-  DartType /*!*/ get dynamicType => DynamicTypeImpl.instance;
+  DartType get dynamicType => DynamicTypeImpl.instance;
 
   @override
-  InterfaceType /*!*/ get functionType {
-    _functionType ??= _getType(_coreLibrary, "Function");
-    return _functionType;
+  InterfaceType get functionType {
+    return _functionType ??= _getType(_coreLibrary, "Function");
   }
 
   @override
-  InterfaceType /*!*/ get futureDynamicType {
-    _futureDynamicType ??= InterfaceTypeImpl(
+  InterfaceType get futureDynamicType {
+    return _futureDynamicType ??= InterfaceTypeImpl(
       element: futureElement,
       typeArguments: [dynamicType],
       nullabilitySuffix: _nullabilitySuffix,
     );
-    return _futureDynamicType;
   }
 
   @override
-  ClassElement /*!*/ get futureElement {
+  ClassElement get futureElement {
     return _futureElement ??= _getClassElement(_asyncLibrary, 'Future');
   }
 
   @override
-  InterfaceType /*!*/ get futureNullType {
-    _futureNullType ??= InterfaceTypeImpl(
+  InterfaceType get futureNullType {
+    return _futureNullType ??= InterfaceTypeImpl(
       element: futureElement,
       typeArguments: [nullType],
       nullabilitySuffix: _nullabilitySuffix,
     );
-    return _futureNullType;
   }
 
   @override
-  ClassElement /*!*/ get futureOrElement {
+  ClassElement get futureOrElement {
     return _futureOrElement ??= _getClassElement(_asyncLibrary, 'FutureOr');
   }
 
   @override
-  InterfaceType /*!*/ get futureOrNullType {
-    _futureOrNullType ??= InterfaceTypeImpl(
+  InterfaceType get futureOrNullType {
+    return _futureOrNullType ??= InterfaceTypeImpl(
       element: futureOrElement,
       typeArguments: [nullType],
       nullabilitySuffix: _nullabilitySuffix,
     );
-    return _futureOrNullType;
   }
 
   @override
-  ClassElement /*!*/ get intElement {
+  ClassElement get intElement {
     return _intElement ??= _getClassElement(_coreLibrary, "int");
   }
 
   @override
-  InterfaceType /*!*/ get intType {
-    _intType ??= _getType(_coreLibrary, "int");
-    return _intType;
+  InterfaceType get intType {
+    return _intType ??= _getType(_coreLibrary, "int");
   }
 
-  InterfaceType /*!*/ get intTypeQuestion =>
+  InterfaceType get intTypeQuestion =>
       _intTypeQuestion ??= (intType as InterfaceTypeImpl)
           .withNullability(NullabilitySuffix.question);
 
   @override
-  InterfaceType /*!*/ get iterableDynamicType {
-    _iterableDynamicType ??= InterfaceTypeImpl(
+  InterfaceType get iterableDynamicType {
+    return _iterableDynamicType ??= InterfaceTypeImpl(
       element: iterableElement,
       typeArguments: [dynamicType],
       nullabilitySuffix: _nullabilitySuffix,
     );
-    return _iterableDynamicType;
   }
 
   @override
-  ClassElement /*!*/ get iterableElement {
+  ClassElement get iterableElement {
     return _iterableElement ??= _getClassElement(_coreLibrary, 'Iterable');
   }
 
   @override
-  InterfaceType /*!*/ get iterableObjectType {
-    _iterableObjectType ??= InterfaceTypeImpl(
+  InterfaceType get iterableObjectType {
+    return _iterableObjectType ??= InterfaceTypeImpl(
       element: iterableElement,
       typeArguments: [objectType],
       nullabilitySuffix: _nullabilitySuffix,
     );
-    return _iterableObjectType;
   }
 
   @override
-  ClassElement /*!*/ get listElement {
+  ClassElement get listElement {
     return _listElement ??= _getClassElement(_coreLibrary, 'List');
   }
 
   @override
-  ClassElement /*!*/ get mapElement {
+  ClassElement get mapElement {
     return _mapElement ??= _getClassElement(_coreLibrary, 'Map');
   }
 
   @override
-  InterfaceType /*!*/ get mapObjectObjectType {
-    _mapObjectObjectType ??= InterfaceTypeImpl(
+  InterfaceType get mapObjectObjectType {
+    return _mapObjectObjectType ??= InterfaceTypeImpl(
       element: mapElement,
       typeArguments: [objectType, objectType],
       nullabilitySuffix: _nullabilitySuffix,
     );
-    return _mapObjectObjectType;
   }
 
   @override
-  DartType /*!*/ get neverType => isNonNullableByDefault
+  DartType get neverType => isNonNullableByDefault
       ? NeverTypeImpl.instance
       : NeverTypeImpl.instanceLegacy;
 
   @override
-  Set<ClassElement> /*!*/ get nonSubtypableClasses =>
-      _nonSubtypableClasses ??= {
+  Set<ClassElement> get nonSubtypableClasses => _nonSubtypableClasses ??= {
         boolElement,
         doubleElement,
         futureOrElement,
@@ -282,11 +269,11 @@
       };
 
   @override
-  ClassElement /*!*/ get nullElement {
+  ClassElement get nullElement {
     return _nullElement ??= _getClassElement(_coreLibrary, 'Null');
   }
 
-  InterfaceTypeImpl /*!*/ get nullStar {
+  InterfaceType get nullStar {
     return _nullStar ??= nullElement.instantiate(
       typeArguments: const [],
       nullabilitySuffix: NullabilitySuffix.star,
@@ -294,88 +281,80 @@
   }
 
   @override
-  InterfaceType /*!*/ get nullType {
-    _nullType ??= _getType(_coreLibrary, "Null");
-    return _nullType;
+  InterfaceType get nullType {
+    return _nullType ??= _getType(_coreLibrary, "Null");
   }
 
   @override
-  ClassElement /*!*/ get numElement {
+  ClassElement get numElement {
     return _numElement ??= _getClassElement(_coreLibrary, 'num');
   }
 
   @override
-  InterfaceType /*!*/ get numType {
-    _numType ??= _getType(_coreLibrary, "num");
-    return _numType;
+  InterfaceType get numType {
+    return _numType ??= _getType(_coreLibrary, "num");
   }
 
-  InterfaceType /*!*/ get numTypeQuestion =>
+  InterfaceType get numTypeQuestion =>
       _numTypeQuestion ??= (numType as InterfaceTypeImpl)
           .withNullability(NullabilitySuffix.question);
 
-  ClassElement /*!*/ get objectElement {
+  ClassElement get objectElement {
     return _objectElement ??= _getClassElement(_coreLibrary, 'Object');
   }
 
   @override
-  InterfaceType /*!*/ get objectType {
-    _objectType ??= _getType(_coreLibrary, "Object");
-    return _objectType;
+  InterfaceType get objectType {
+    return _objectType ??= _getType(_coreLibrary, "Object");
   }
 
   @override
-  ClassElement /*!*/ get setElement {
+  ClassElement get setElement {
     return _setElement ??= _getClassElement(_coreLibrary, 'Set');
   }
 
   @override
-  InterfaceType /*!*/ get stackTraceType {
-    _stackTraceType ??= _getType(_coreLibrary, "StackTrace");
-    return _stackTraceType;
+  InterfaceType get stackTraceType {
+    return _stackTraceType ??= _getType(_coreLibrary, "StackTrace");
   }
 
   @override
-  InterfaceType /*!*/ get streamDynamicType {
-    _streamDynamicType ??= InterfaceTypeImpl(
+  InterfaceType get streamDynamicType {
+    return _streamDynamicType ??= InterfaceTypeImpl(
       element: streamElement,
       typeArguments: [dynamicType],
       nullabilitySuffix: _nullabilitySuffix,
     );
-    return _streamDynamicType;
   }
 
   @override
-  ClassElement /*!*/ get streamElement {
+  ClassElement get streamElement {
     return _streamElement ??= _getClassElement(_asyncLibrary, 'Stream');
   }
 
   @override
-  ClassElement /*!*/ get stringElement {
+  ClassElement get stringElement {
     return _stringElement ??= _getClassElement(_coreLibrary, 'String');
   }
 
   @override
-  InterfaceType /*!*/ get stringType {
-    _stringType ??= _getType(_coreLibrary, "String");
-    return _stringType;
+  InterfaceType get stringType {
+    return _stringType ??= _getType(_coreLibrary, "String");
   }
 
   @override
-  ClassElement /*!*/ get symbolElement {
+  ClassElement get symbolElement {
     return _symbolElement ??= _getClassElement(_coreLibrary, 'Symbol');
   }
 
   @override
-  InterfaceType /*!*/ get symbolType {
-    _symbolType ??= _getType(_coreLibrary, "Symbol");
-    return _symbolType;
+  InterfaceType get symbolType {
+    return _symbolType ??= _getType(_coreLibrary, "Symbol");
   }
 
   @override
-  InterfaceType /*!*/ get typeType {
-    _typeType ??= _getType(_coreLibrary, "Type");
-    return _typeType;
+  InterfaceType get typeType {
+    return _typeType ??= _getType(_coreLibrary, "Type");
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/element/type_schema_elimination.dart b/pkg/analyzer/lib/src/dart/element/type_schema_elimination.dart
index 56e772a5..8072b7b 100644
--- a/pkg/analyzer/lib/src/dart/element/type_schema_elimination.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_schema_elimination.dart
@@ -5,7 +5,6 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/replacement_visitor.dart';
 import 'package:analyzer/src/dart/element/type_schema.dart';
-import 'package:meta/meta.dart';
 
 /// Visitor that computes least and greatest closures of a type schema.
 ///
@@ -38,10 +37,10 @@
   /// resulting type.  If the schema contains no instances of `_`, the original
   /// schema object is returned to avoid unnecessary allocation.
   static DartType run({
-    @required DartType topType,
-    @required DartType bottomType,
-    @required bool isLeastClosure,
-    @required DartType schema,
+    required DartType topType,
+    required DartType bottomType,
+    required bool isLeastClosure,
+    required DartType schema,
   }) {
     var visitor = TypeSchemaEliminationVisitor._(
       topType,
diff --git a/pkg/analyzer/lib/src/dart/element/type_system.dart b/pkg/analyzer/lib/src/dart/element/type_system.dart
index 9b2ab91..51ceee2 100644
--- a/pkg/analyzer/lib/src/dart/element/type_system.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_system.dart
@@ -31,7 +31,6 @@
 import 'package:analyzer/src/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/element/type_schema.dart';
 import 'package:analyzer/src/dart/element/type_schema_elimination.dart';
-import 'package:meta/meta.dart';
 
 /// The [TypeSystem] implementation.
 class TypeSystemImpl implements TypeSystem {
@@ -53,28 +52,28 @@
   bool strictInference;
 
   /// The cached instance of `Object?`.
-  InterfaceTypeImpl _objectQuestion;
+  InterfaceTypeImpl? _objectQuestion;
 
   /// The cached instance of `Object*`.
-  InterfaceTypeImpl _objectStar;
+  InterfaceTypeImpl? _objectStar;
 
   /// The cached instance of `Object!`.
-  InterfaceTypeImpl _objectNone;
+  InterfaceTypeImpl? _objectNone;
 
   /// The cached instance of `Null!`.
-  InterfaceTypeImpl _nullNone;
+  InterfaceTypeImpl? _nullNone;
 
-  GreatestLowerBoundHelper _greatestLowerBoundHelper;
-  LeastUpperBoundHelper _leastUpperBoundHelper;
+  late final GreatestLowerBoundHelper _greatestLowerBoundHelper;
+  late final LeastUpperBoundHelper _leastUpperBoundHelper;
 
   /// The implementation of the subtyping relation.
-  SubtypeHelper _subtypeHelper;
+  late final SubtypeHelper _subtypeHelper;
 
   TypeSystemImpl({
-    @required this.implicitCasts,
-    @required this.isNonNullableByDefault,
-    @required this.strictInference,
-    @required TypeProvider typeProvider,
+    required this.implicitCasts,
+    required this.isNonNullableByDefault,
+    required this.strictInference,
+    required TypeProvider typeProvider,
   }) : typeProvider = typeProvider as TypeProviderImpl {
     _greatestLowerBoundHelper = GreatestLowerBoundHelper(this);
     _leastUpperBoundHelper = LeastUpperBoundHelper(this);
@@ -82,19 +81,19 @@
   }
 
   InterfaceTypeImpl get nullNone =>
-      _nullNone ??= (typeProvider.nullType as TypeImpl)
+      _nullNone ??= (typeProvider.nullType as InterfaceTypeImpl)
           .withNullability(NullabilitySuffix.none);
 
   InterfaceTypeImpl get objectNone =>
-      _objectNone ??= (typeProvider.objectType as TypeImpl)
+      _objectNone ??= (typeProvider.objectType as InterfaceTypeImpl)
           .withNullability(NullabilitySuffix.none);
 
   InterfaceTypeImpl get objectQuestion =>
-      _objectQuestion ??= (typeProvider.objectType as TypeImpl)
+      _objectQuestion ??= (typeProvider.objectType as InterfaceTypeImpl)
           .withNullability(NullabilitySuffix.question);
 
   InterfaceTypeImpl get objectStar =>
-      _objectStar ??= (typeProvider.objectType as TypeImpl)
+      _objectStar ??= (typeProvider.objectType as InterfaceTypeImpl)
           .withNullability(NullabilitySuffix.star);
 
   /// Returns true iff the type [t] accepts function types, and requires an
@@ -106,7 +105,7 @@
   /// - `FutureOr<T>` where T is one of the two cases above.
   ///
   /// Note that this returns false if [t] is a top type such as Object.
-  bool acceptsFunctionType(DartType t) {
+  bool acceptsFunctionType(DartType? t) {
     if (t == null) return false;
     if (t.isDartAsyncFutureOr) {
       return acceptsFunctionType((t as InterfaceType).typeArguments[0]);
@@ -217,7 +216,7 @@
   }
 
   @override
-  TypeImpl flatten(DartType type) {
+  DartType flatten(DartType type) {
     if (identical(type, UnknownInferredType.instance)) {
       return type;
     }
@@ -227,7 +226,7 @@
     NullabilitySuffix nullabilitySuffix = type.nullabilitySuffix;
     if (nullabilitySuffix != NullabilitySuffix.none) {
       var S = (type as TypeImpl).withNullability(NullabilitySuffix.none);
-      return flatten(S).withNullability(nullabilitySuffix);
+      return (flatten(S) as TypeImpl).withNullability(nullabilitySuffix);
     }
 
     if (type is InterfaceType) {
@@ -252,7 +251,7 @@
       // types, since they are by definition less specific.
       List<DartType> candidateTypes =
           _searchTypeHierarchyForFutureTypeParameters(type);
-      DartType flattenResult =
+      var flattenResult =
           InterfaceTypeImpl.findMostSpecificType(candidateTypes, this);
       if (flattenResult != null) {
         return flattenResult;
@@ -316,7 +315,7 @@
     if (mixinElement.isMixin) {
       candidates = mixinElement.superclassConstraints;
     } else {
-      candidates = [mixinElement.supertype];
+      candidates = [mixinElement.supertype!];
       candidates.addAll(mixinElement.mixins);
       if (mixinElement.isMixinApplication) {
         candidates.removeLast();
@@ -329,7 +328,7 @@
 
   /// Given a type t, if t is an interface type with a call method defined,
   /// return the function type for the call method, otherwise return null.
-  FunctionType getCallMethodType(DartType t) {
+  FunctionType? getCallMethodType(DartType t) {
     if (t is InterfaceType) {
       return t.lookUpMethod2('call', t.element.library)?.type;
     }
@@ -420,9 +419,9 @@
   /// If this function is called with a [contextType] that is also
   /// uninstantiated, or a [fnType] that is already instantiated, it will have
   /// no effect and return `null`.
-  List<DartType> inferFunctionTypeInstantiation(
+  List<DartType>? inferFunctionTypeInstantiation(
       FunctionType contextType, FunctionType fnType,
-      {ErrorReporter errorReporter, AstNode errorNode}) {
+      {ErrorReporter? errorReporter, AstNode? errorNode}) {
     if (contextType.typeFormals.isNotEmpty || fnType.typeFormals.isEmpty) {
       return const <DartType>[];
     }
@@ -463,15 +462,15 @@
   /// they originated, so we can issue an error message tracing back to the
   /// argument values, type parameter "extends" clause, or the return type
   /// context.
-  List<DartType> inferGenericFunctionOrType({
-    ClassElement genericClass,
-    @required List<TypeParameterElement> typeParameters,
-    @required List<ParameterElement> parameters,
-    @required DartType declaredReturnType,
-    @required List<DartType> argumentTypes,
-    @required DartType contextReturnType,
-    ErrorReporter errorReporter,
-    AstNode errorNode,
+  List<DartType>? inferGenericFunctionOrType({
+    ClassElement? genericClass,
+    required List<TypeParameterElement> typeParameters,
+    required List<ParameterElement> parameters,
+    required DartType declaredReturnType,
+    required List<DartType> argumentTypes,
+    required DartType? contextReturnType,
+    ErrorReporter? errorReporter,
+    AstNode? errorNode,
     bool downwards = false,
     bool isConst = false,
   }) {
@@ -519,24 +518,20 @@
   // TODO(scheglov) Move this method to elements for classes, typedefs,
   //  and generic functions; compute lazily and cache.
   DartType instantiateToBounds(DartType type,
-      {List<bool> hasError, Map<TypeParameterElement, DartType> knownTypes}) {
+      {List<bool>? hasError, Map<TypeParameterElement, DartType>? knownTypes}) {
     List<TypeParameterElement> typeFormals = typeFormalsAsElements(type);
     List<DartType> arguments = instantiateTypeFormalsToBounds(typeFormals,
         hasError: hasError, knownTypes: knownTypes);
-    if (arguments == null) {
-      return type;
-    }
-
     return instantiateType(type, arguments);
   }
 
   @override
   DartType instantiateToBounds2({
-    ClassElement classElement,
+    ClassElement? classElement,
     @Deprecated("Use 'typeAliasElement' instead")
-        FunctionTypeAliasElement functionTypeAliasElement,
-    TypeAliasElement typeAliasElement,
-    @required NullabilitySuffix nullabilitySuffix,
+        FunctionTypeAliasElement? functionTypeAliasElement,
+    TypeAliasElement? typeAliasElement,
+    required NullabilitySuffix nullabilitySuffix,
   }) {
     typeAliasElement ??= functionTypeAliasElement;
     if (classElement != null) {
@@ -546,7 +541,7 @@
         typeArguments: typeArguments,
         nullabilitySuffix: nullabilitySuffix,
       );
-      type = toLegacyType(type);
+      type = toLegacyType(type) as InterfaceType;
       return type;
     } else if (typeAliasElement != null) {
       var typeParameters = typeAliasElement.typeParameters;
@@ -586,8 +581,8 @@
   /// https://github.com/dart-lang/sdk/issues/27526#issuecomment-260021397
   List<DartType> instantiateTypeFormalsToBounds(
       List<TypeParameterElement> typeFormals,
-      {List<bool> hasError,
-      Map<TypeParameterElement, DartType> knownTypes}) {
+      {List<bool>? hasError,
+      Map<TypeParameterElement, DartType>? knownTypes}) {
     int count = typeFormals.length;
     if (count == 0) {
       return const <DartType>[];
@@ -602,19 +597,16 @@
     for (TypeParameterElement typeParameter in typeFormals) {
       all.add(typeParameter);
       if (!defaults.containsKey(typeParameter)) {
-        if (typeParameter.bound == null) {
-          defaults[typeParameter] = DynamicTypeImpl.instance;
-        } else {
-          partials[typeParameter] = typeParameter.bound;
-        }
+        var bound = typeParameter.bound ?? DynamicTypeImpl.instance;
+        partials[typeParameter] = bound;
       }
     }
 
-    List<TypeParameterElement> getFreeParameters(DartType rootType) {
-      List<TypeParameterElement> parameters;
+    List<TypeParameterElement>? getFreeParameters(DartType rootType) {
+      List<TypeParameterElement>? parameters;
       Set<DartType> visitedTypes = HashSet<DartType>();
 
-      void appendParameters(DartType type) {
+      void appendParameters(DartType? type) {
         if (type == null) {
           return;
         }
@@ -626,7 +618,7 @@
           var element = type.element;
           if (all.contains(element)) {
             parameters ??= <TypeParameterElement>[];
-            parameters.add(element);
+            parameters!.add(element);
           }
         } else {
           if (type is FunctionType) {
@@ -648,8 +640,8 @@
     while (hasProgress) {
       hasProgress = false;
       for (TypeParameterElement parameter in partials.keys) {
-        DartType value = partials[parameter];
-        List<TypeParameterElement> freeParameters = getFreeParameters(value);
+        DartType value = partials[parameter]!;
+        var freeParameters = getFreeParameters(value);
         if (freeParameters == null) {
           defaults[parameter] = value;
           partials.remove(parameter);
@@ -685,12 +677,12 @@
       // to be Phi(B)
       for (TypeParameterElement parameter in partials.keys) {
         defaults[parameter] = Substitution.fromPairs(domain, range)
-            .substituteType(partials[parameter]);
+            .substituteType(partials[parameter]!);
       }
     }
 
     List<DartType> orderedArguments =
-        typeFormals.map((p) => defaults[p]).toList();
+        typeFormals.map((p) => defaults[p]!).toList();
     return orderedArguments;
   }
 
@@ -935,14 +927,12 @@
       }
 
       // MOREBOTTOM(X extends T, Y extends S) = MOREBOTTOM(T, S)
-      var T_bound = T_element.bound;
-      var S_bound = S_element.bound;
       // The invariant of the larger algorithm that this is only called with
       // types that satisfy `BOTTOM(T)` or `NULL(T)`, and all such types, if
       // they are type variables, have bounds which themselves are
       // `BOTTOM` or `NULL` types.
-      assert(T_bound != null);
-      assert(S_bound != null);
+      var T_bound = T_element.bound!;
+      var S_bound = S_element.bound!;
       return isMoreBottom(T_bound, S_bound);
     }
 
@@ -1033,9 +1023,9 @@
     }
 
     // MORETOP(FutureOr<T>, FutureOr<S>) = MORETOP(T, S)
-    if (T is InterfaceType &&
+    if (T is InterfaceTypeImpl &&
         T.isDartAsyncFutureOr &&
-        S is InterfaceType &&
+        S is InterfaceTypeImpl &&
         S.isDartAsyncFutureOr) {
       assert(T_nullability == NullabilitySuffix.none);
       assert(S_nullability == NullabilitySuffix.none);
@@ -1052,7 +1042,7 @@
     if (type.isDynamic || type.isVoid || type.isDartCoreNull) {
       return false;
     } else if (type is TypeParameterTypeImpl && type.promotedBound != null) {
-      return isNonNullable(type.promotedBound);
+      return isNonNullable(type.promotedBound!);
     } else if (type.nullabilitySuffix == NullabilitySuffix.question) {
       return false;
     } else if (type is InterfaceType && type.isDartAsyncFutureOr) {
@@ -1093,7 +1083,7 @@
     if (type.isDynamic || type.isVoid || type.isDartCoreNull) {
       return true;
     } else if (type is TypeParameterTypeImpl && type.promotedBound != null) {
-      return isNullable(type.promotedBound);
+      return isNullable(type.promotedBound!);
     } else if (type.nullabilitySuffix == NullabilitySuffix.question) {
       return true;
     } else if (type.isDartAsyncFutureOr) {
@@ -1104,7 +1094,7 @@
 
   /// Return `true` for any type which is in the equivalence class of `Object`.
   bool isObject(DartType type) {
-    TypeImpl typeImpl = type;
+    var typeImpl = type as TypeImpl;
     if (typeImpl.nullabilitySuffix != NullabilitySuffix.none) {
       return false;
     }
@@ -1115,7 +1105,7 @@
     }
 
     // OBJECT(FutureOr<T>) is OBJECT(T)
-    if (type is InterfaceType && type.isDartAsyncFutureOr) {
+    if (type is InterfaceTypeImpl && type.isDartAsyncFutureOr) {
       var T = type.typeArguments[0];
       return isObject(T);
     }
@@ -1191,7 +1181,7 @@
     }
 
     // TOP(FutureOr<T>) is TOP(T)
-    if (type is InterfaceType && type.isDartAsyncFutureOr) {
+    if (type is InterfaceTypeImpl && type.isDartAsyncFutureOr) {
       assert(nullabilitySuffix == NullabilitySuffix.none);
       var T = type.typeArguments[0];
       return isTop(T);
@@ -1273,15 +1263,15 @@
 
   /// Returns a nullable version of [type].  The result would be equivalent to
   /// the union `type | Null` (if we supported union types).
-  DartType makeNullable(TypeImpl type) {
+  DartType makeNullable(DartType type) {
     // TODO(paulberry): handle type parameter types
-    return type.withNullability(NullabilitySuffix.question);
+    return (type as TypeImpl).withNullability(NullabilitySuffix.question);
   }
 
   /// Attempts to find the appropriate substitution for the [mixinElement]
   /// type parameters that can be applied to [srcTypes] to make it equal to
   /// [destTypes].  If no such substitution can be found, `null` is returned.
-  List<DartType> matchSupertypeConstraints(
+  List<DartType>? matchSupertypeConstraints(
     ClassElement mixinElement,
     List<DartType> srcTypes,
     List<DartType> destTypes,
@@ -1296,7 +1286,7 @@
     var inferredTypes = inferrer.infer(
       typeParameters,
       considerExtendsClause: false,
-    );
+    )!;
     inferredTypes =
         inferredTypes.map(_removeBoundsOfGenericFunctionTypes).toList();
     var substitution = Substitution.fromPairs(typeParameters, inferredTypes);
@@ -1351,7 +1341,7 @@
 
       // NonNull(X & T) = X & NonNull(T)
       if (type.promotedBound != null) {
-        var promotedBound = promoteToNonNull(type.promotedBound);
+        var promotedBound = promoteToNonNull(type.promotedBound!);
         return TypeParameterTypeImpl(
           element: element,
           nullabilitySuffix: NullabilitySuffix.none,
@@ -1360,8 +1350,8 @@
       }
 
       // NonNull(X) = X & NonNull(B), where B is the bound of X
-      var promotedBound = element.bound != null
-          ? promoteToNonNull(element.bound)
+      DartType? promotedBound = element.bound != null
+          ? promoteToNonNull(element.bound!)
           : typeProvider.objectType;
       if (identical(promotedBound, element.bound)) {
         promotedBound = null;
@@ -1379,8 +1369,12 @@
   /// Determine the type of a binary expression with the given [operator] whose
   /// left operand has the type [leftType] and whose right operand has the type
   /// [rightType], given that resolution has so far produced the [currentType].
-  DartType refineBinaryExpressionType(DartType leftType, TokenType operator,
-      DartType rightType, DartType currentType, MethodElement operatorElement) {
+  DartType refineBinaryExpressionType(
+      DartType leftType,
+      TokenType operator,
+      DartType rightType,
+      DartType currentType,
+      MethodElement? operatorElement) {
     if (isNonNullableByDefault) {
       if (operatorElement == null) return currentType;
       return _refineNumericInvocationTypeNullSafe(
@@ -1396,9 +1390,14 @@
   /// [methodElement], the context surrounding the method invocation is
   /// [invocationContext], and the context type produced so far by resolution is
   /// [currentType].
-  DartType refineNumericInvocationContext(DartType targetType,
-      Element methodElement, DartType invocationContext, DartType currentType) {
-    if (methodElement is MethodElement && isNonNullableByDefault) {
+  DartType refineNumericInvocationContext(
+      DartType? targetType,
+      Element? methodElement,
+      DartType? invocationContext,
+      DartType currentType) {
+    if (targetType != null &&
+        methodElement is MethodElement &&
+        isNonNullableByDefault) {
       return _refineNumericInvocationContextNullSafe(
           targetType, methodElement, invocationContext, currentType);
     } else {
@@ -1415,7 +1414,7 @@
   /// TODO(scheglov) I expected that [methodElement] is [MethodElement].
   DartType refineNumericInvocationType(
       DartType targetType,
-      Element methodElement,
+      Element? methodElement,
       List<DartType> argumentTypes,
       DartType currentType) {
     if (methodElement is MethodElement && isNonNullableByDefault) {
@@ -1501,7 +1500,7 @@
 
   /// Tries to promote from the first type from the second type, and returns the
   /// promoted type if it succeeds, otherwise null.
-  DartType tryPromoteToType(DartType to, DartType from) {
+  DartType? tryPromoteToType(DartType to, DartType from) {
     // Allow promoting to a subtype, for example:
     //
     //     f(Base b) {
@@ -1518,7 +1517,7 @@
     // For a type parameter `T extends U`, allow promoting the upper bound
     // `U` to `S` where `S <: U`, yielding a type parameter `T extends S`.
     if (from is TypeParameterType) {
-      if (isSubtypeOf2(to, from.bound ?? DynamicTypeImpl.instance)) {
+      if (isSubtypeOf2(to, from.bound)) {
         var declaration = from.element.declaration;
         return TypeParameterTypeImpl(
           element: declaration,
@@ -1547,8 +1546,8 @@
   }
 
   void updateOptions({
-    @required bool implicitCasts,
-    @required bool strictInference,
+    required bool implicitCasts,
+    required bool strictInference,
   }) {
     this.implicitCasts = implicitCasts;
     this.strictInference = strictInference;
@@ -1559,7 +1558,7 @@
   ) {
     return typeParameters.map((typeParameter) {
       var typeParameterImpl = typeParameter as TypeParameterElementImpl;
-      return typeParameterImpl.defaultType;
+      return typeParameterImpl.defaultType!;
     }).toList();
   }
 
@@ -1583,8 +1582,7 @@
             operator == TokenType.MINUS ||
             operator == TokenType.STAR ||
             operator == TokenType.SLASH) {
-          InterfaceTypeImpl doubleType = typeProvider.doubleType;
-          return doubleType;
+          return typeProvider.doubleType;
         }
       }
       return currentType;
@@ -1607,8 +1605,7 @@
           operator == TokenType.PLUS_EQ ||
           operator == TokenType.STAR_EQ) {
         if (rightType.isDartCoreDouble) {
-          InterfaceTypeImpl doubleType = typeProvider.doubleType;
-          return doubleType;
+          return typeProvider.doubleType;
         }
       }
       // int op int
@@ -1625,8 +1622,7 @@
           operator == TokenType.PLUS_PLUS ||
           operator == TokenType.MINUS_MINUS) {
         if (rightType.isDartCoreInt) {
-          InterfaceTypeImpl intType = typeProvider.intType;
-          return intType;
+          return typeProvider.intType;
         }
       }
     }
@@ -1637,7 +1633,7 @@
   DartType _refineNumericInvocationContextNullSafe(
       DartType targetType,
       MethodElement methodElement,
-      DartType invocationContext,
+      DartType? invocationContext,
       DartType currentType) {
     // If the method being invoked comes from an extension, don't refine the
     // type because we can only make guarantees about methods defined in the
@@ -1865,16 +1861,17 @@
 
   /// Starting from the given [type], search its class hierarchy for types of
   /// the form Future<R>, and return a list of the resulting R's.
-  List<DartType> _searchTypeHierarchyForFutureTypeParameters(DartType type) {
+  List<DartType> _searchTypeHierarchyForFutureTypeParameters(
+      InterfaceType type) {
     List<DartType> result = <DartType>[];
     HashSet<ClassElement> visitedClasses = HashSet<ClassElement>();
-    void recurse(InterfaceTypeImpl type) {
+    void recurse(InterfaceType type) {
       if (type.isDartAsyncFuture && type.typeArguments.isNotEmpty) {
         result.add(type.typeArguments[0]);
       }
       if (visitedClasses.add(type.element)) {
         if (type.superclass != null) {
-          recurse(type.superclass);
+          recurse(type.superclass!);
         }
         for (InterfaceType interface in type.interfaces) {
           recurse(interface);
@@ -1900,8 +1897,8 @@
   }
 
   static DartType run({
-    @required DartType bottomType,
-    @required DartType type,
+    required DartType bottomType,
+    required DartType type,
   }) {
     var visitor = _RemoveBoundsOfGenericFunctionTypeVisitor._(bottomType);
     var result = type.accept(visitor);
diff --git a/pkg/analyzer/lib/src/dart/element/type_visitor.dart b/pkg/analyzer/lib/src/dart/element/type_visitor.dart
index a10644a..262ec60 100644
--- a/pkg/analyzer/lib/src/dart/element/type_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_visitor.dart
@@ -43,7 +43,8 @@
         type.returnType,
         ...type.typeFormals
             .map((formal) => formal.bound)
-            .where((type) => type != null),
+            .where((type) => type != null)
+            .map((type) => type!),
         ...type.parameters.map((param) => param.type),
       ]);
 
diff --git a/pkg/analyzer/lib/src/dart/error/ffi_code.dart b/pkg/analyzer/lib/src/dart/error/ffi_code.dart
index 63e796e..250c01c 100644
--- a/pkg/analyzer/lib/src/dart/error/ffi_code.dart
+++ b/pkg/analyzer/lib/src/dart/error/ffi_code.dart
@@ -4,7 +4,6 @@
 
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/src/error/analyzer_error_code.dart';
-import 'package:meta/meta.dart';
 
 // It is hard to visually separate each code's _doc comment_ from its published
 // _documentation comment_ when each is written as an end-of-line comment.
@@ -291,12 +290,12 @@
   ///
   /// If [hasPublishedDocs] is `true` then a URL for the docs will be generated.
   const FfiCode({
-    String correction,
+    String? correction,
     bool hasPublishedDocs = false,
-    @required String message,
-    @required String name,
-    String uniqueName,
+    required String message,
+    required String name,
     ErrorType type = ErrorType.COMPILE_TIME_ERROR,
+    String? uniqueName,
   })  : type = type,
         super(
           correction: correction,
diff --git a/pkg/analyzer/lib/src/dart/error/hint_codes.dart b/pkg/analyzer/lib/src/dart/error/hint_codes.dart
index 28463aa..f55ecc1 100644
--- a/pkg/analyzer/lib/src/dart/error/hint_codes.dart
+++ b/pkg/analyzer/lib/src/dart/error/hint_codes.dart
@@ -3055,9 +3055,9 @@
   const HintCode(
     String name,
     String message, {
-    String correction,
+    String? correction,
     bool hasPublishedDocs = false,
-    String uniqueName,
+    String? uniqueName,
   }) : super(
           correction: correction,
           hasPublishedDocs: hasPublishedDocs,
diff --git a/pkg/analyzer/lib/src/dart/error/lint_codes.dart b/pkg/analyzer/lib/src/dart/error/lint_codes.dart
index cc1f0c2..d2c467a 100644
--- a/pkg/analyzer/lib/src/dart/error/lint_codes.dart
+++ b/pkg/analyzer/lib/src/dart/error/lint_codes.dart
@@ -13,8 +13,8 @@
   const LintCode(
     String name,
     String message, {
-    String correction,
-    String uniqueName,
+    String? correction,
+    String? uniqueName,
   }) : super(
           correction: correction,
           message: message,
@@ -42,7 +42,7 @@
 @Deprecated('Use SecurityLintCode and its uniqueName')
 class LintCodeWithUniqueName extends LintCode {
   const LintCodeWithUniqueName(String name, String uniqueName, String message,
-      {String correction})
+      {String? correction})
       : super(name, message, uniqueName: uniqueName, correction: correction);
 }
 
@@ -52,7 +52,7 @@
 /// suppressed with `// ignore:` or `// ignore_for_file:` comments.
 class SecurityLintCode extends LintCode {
   const SecurityLintCode(String name, String message,
-      {String uniqueName, String correction})
+      {String? uniqueName, String? correction})
       : super(name, message,
             uniqueName: uniqueName ?? 'LintCode.$name', correction: correction);
 
@@ -64,6 +64,6 @@
 class SecurityLintCodeWithUniqueName extends SecurityLintCode {
   const SecurityLintCodeWithUniqueName(
       String name, String uniqueName, String message,
-      {String correction})
+      {String? correction})
       : super(name, message, uniqueName: uniqueName, correction: correction);
 }
diff --git a/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart b/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
index 8472e01..57029cf 100644
--- a/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
+++ b/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
@@ -927,9 +927,9 @@
   const ParserErrorCode(
     String name,
     String message, {
-    String correction,
+    String? correction,
     bool hasPublishedDocs = false,
-    String uniqueName,
+    String? uniqueName,
   }) : super(
           correction: correction,
           hasPublishedDocs: hasPublishedDocs,
diff --git a/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart b/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
index 23291d0..8225f80 100644
--- a/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
+++ b/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
@@ -6,7 +6,7 @@
 
 part of 'syntactic_errors.dart';
 
-final fastaAnalyzerErrorCodes = <ErrorCode>[
+final fastaAnalyzerErrorCodes = <ErrorCode?>[
   null,
   _EQUALITY_CANNOT_BE_EQUALITY_OPERAND,
   _CONTINUE_OUTSIDE_OF_LOOP,
diff --git a/pkg/analyzer/lib/src/dart/micro/analysis_context.dart b/pkg/analyzer/lib/src/dart/micro/analysis_context.dart
index 3d8351e..530ff1f 100644
--- a/pkg/analyzer/lib/src/dart/micro/analysis_context.dart
+++ b/pkg/analyzer/lib/src/dart/micro/analysis_context.dart
@@ -11,22 +11,23 @@
 import 'package:analyzer/src/context/builder.dart';
 import 'package:analyzer/src/context/context.dart';
 import 'package:analyzer/src/dart/analysis/context_root.dart';
+import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/results.dart';
 import 'package:analyzer/src/dart/analysis/session.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/dart/micro/resolve_file.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl;
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/util/performance/operation_performance.dart';
 import 'package:analyzer/src/workspace/workspace.dart';
-import 'package:meta/meta.dart';
 
 MicroContextObjects createMicroContextObjects({
-  @required FileResolver fileResolver,
-  @required AnalysisOptionsImpl analysisOptions,
-  @required SourceFactory sourceFactory,
-  @required ContextRootImpl root,
-  @required ResourceProvider resourceProvider,
-  @required Workspace workspace,
+  required FileResolver fileResolver,
+  required AnalysisOptionsImpl analysisOptions,
+  required SourceFactory sourceFactory,
+  required ContextRootImpl root,
+  required ResourceProvider resourceProvider,
+  required Workspace workspace,
 }) {
   var declaredVariables = DeclaredVariables();
   var synchronousSession = SynchronousSession(
@@ -74,11 +75,11 @@
   final _MicroAnalysisContextImpl analysisContext2;
 
   MicroContextObjects({
-    @required this.declaredVariables,
-    @required this.synchronousSession,
-    @required this.analysisSession,
-    @required this.analysisContext,
-    @required this.analysisContext2,
+    required this.declaredVariables,
+    required this.synchronousSession,
+    required this.analysisSession,
+    required this.analysisContext,
+    required this.analysisContext2,
   });
 
   set analysisOptions(AnalysisOptionsImpl analysisOptions) {
@@ -90,6 +91,11 @@
   }
 }
 
+class _FakeAnalysisDriver implements AnalysisDriver {
+  @override
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
 class _MicroAnalysisContextImpl implements AnalysisContext {
   final FileResolver fileResolver;
   final SynchronousSession synchronousSession;
@@ -100,12 +106,12 @@
   final ContextRoot contextRoot;
 
   @override
-  _MicroAnalysisSessionImpl currentSession;
+  late _MicroAnalysisSessionImpl currentSession;
 
   final DeclaredVariables declaredVariables;
 
   final SourceFactory sourceFactory;
-  Workspace _workspace;
+  Workspace? _workspace;
 
   _MicroAnalysisContextImpl(
     this.fileResolver,
@@ -114,7 +120,7 @@
     this.declaredVariables,
     this.sourceFactory,
     this.resourceProvider, {
-    Workspace workspace,
+    Workspace? workspace,
   }) : _workspace = workspace;
 
   @override
@@ -123,7 +129,7 @@
   }
 
   @override
-  Folder get sdkRoot => null;
+  Folder? get sdkRoot => null;
 
   @override
   Workspace get workspace {
@@ -148,12 +154,12 @@
   final SourceFactory sourceFactory;
 
   @override
-  _MicroAnalysisContextImpl analysisContext;
+  late _MicroAnalysisContextImpl analysisContext;
 
   _MicroAnalysisSessionImpl(
     this.declaredVariables,
     this.sourceFactory,
-  ) : super(null);
+  ) : super(_FakeAnalysisDriver());
 
   @override
   ResourceProvider get resourceProvider =>
@@ -169,11 +175,15 @@
 
   @override
   FileResult getFile(String path) {
+    var fileContext = analysisContext.fileResolver.getFileContext(
+      path: path,
+      performance: OperationPerformanceImpl('<default>'),
+    );
     return FileResultImpl(
       this,
       path,
-      uriConverter.pathToUri(path),
-      null,
+      fileContext.file.uri,
+      fileContext.file.lineInfo,
       false,
     );
   }
@@ -206,14 +216,14 @@
   _UriConverterImpl(this.resourceProvider, this.sourceFactory);
 
   @override
-  Uri pathToUri(String path, {String containingPath}) {
+  Uri? pathToUri(String path, {String? containingPath}) {
     var fileUri = resourceProvider.pathContext.toUri(path);
-    var fileSource = sourceFactory.forUri2(fileUri);
+    var fileSource = sourceFactory.forUri2(fileUri)!;
     return sourceFactory.restoreUri(fileSource);
   }
 
   @override
-  String uriToPath(Uri uri) {
+  String? uriToPath(Uri uri) {
     return sourceFactory.forUri2(uri)?.fullName;
   }
 }
diff --git a/pkg/analyzer/lib/src/dart/micro/cider_byte_store.dart b/pkg/analyzer/lib/src/dart/micro/cider_byte_store.dart
index 2d4c16b..fc56800 100644
--- a/pkg/analyzer/lib/src/dart/micro/cider_byte_store.dart
+++ b/pkg/analyzer/lib/src/dart/micro/cider_byte_store.dart
@@ -25,7 +25,7 @@
   /// [signature].
   ///
   /// Return `null` if the association does not exist.
-  CacheData get(String key, List<int> signature);
+  CacheData? get(String key, List<int> signature);
 
   /// Associate the given [bytes] with the [key] and [signature]. Return the
   /// [CacheData].
@@ -44,14 +44,14 @@
   int idCounter = 0;
 
   /// This field gets value only during testing.
-  CiderByteStoreTestView testView;
+  CiderByteStoreTestView? testView;
 
   CiderCachedByteStore(int maxCacheSize)
       : _cache = Cache<String, CiderCacheEntry>(
             maxCacheSize, (v) => v.data.bytes.length);
 
   @override
-  CacheData get(String key, List<int> signature) {
+  CacheData? get(String key, List<int> signature) {
     var entry = _cache.get(key, () => null);
 
     if (entry != null &&
diff --git a/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart b/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
index 12a7a75..f5686bf 100644
--- a/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
@@ -8,8 +8,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/context/builder.dart';
 import 'package:analyzer/src/context/source.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
@@ -48,7 +46,6 @@
 import 'package:analyzer/src/task/strong/checker.dart';
 import 'package:analyzer/src/util/performance/operation_performance.dart';
 import 'package:analyzer/src/workspace/workspace.dart';
-import 'package:meta/meta.dart';
 import 'package:pub_semver/pub_semver.dart';
 
 /// Analyzer of a single library.
@@ -61,14 +58,13 @@
   final DeclaredVariables _declaredVariables;
   final SourceFactory _sourceFactory;
   final FileState _library;
-  final ResourceProvider _resourceProvider;
 
   final InheritanceManager3 _inheritance;
   final bool Function(Uri) _isLibraryUri;
   final AnalysisContext _context;
   final LinkedElementFactory _elementFactory;
 
-  LibraryElement _libraryElement;
+  late LibraryElementImpl _libraryElement;
 
   final Map<FileState, LineInfo> _fileToLineInfo = {};
 
@@ -96,7 +92,6 @@
     this._elementFactory,
     this._inheritance,
     this._library,
-    this._resourceProvider,
     this.getFileContent,
   );
 
@@ -106,9 +101,9 @@
 
   /// Compute analysis results for all units of the library.
   Map<FileState, UnitAnalysisResult> analyzeSync({
-    @required String completionPath,
-    @required int completionOffset,
-    @required OperationPerformanceImpl performance,
+    required String? completionPath,
+    required int? completionOffset,
+    required OperationPerformanceImpl performance,
   }) {
     var forCompletion = completionPath != null;
     var units = <FileState, CompilationUnit>{};
@@ -136,7 +131,7 @@
     });
 
     performance.run('libraryElement', (performance) {
-      _libraryElement = _elementFactory.libraryOfUri(_library.uriStr);
+      _libraryElement = _elementFactory.libraryOfUri2(_library.uriStr);
     });
 
     performance.run('resolveDirectives', (performance) {
@@ -205,8 +200,8 @@
   }
 
   void _computeDiagnostics({
-    @required OperationPerformanceImpl performance,
-    @required Map<FileState, CompilationUnit> units,
+    required OperationPerformanceImpl performance,
+    required Map<FileState, CompilationUnit> units,
   }) {
     performance.run('computeVerifyErrors', (performance) {
       units.forEach((file, unit) {
@@ -238,7 +233,7 @@
       performance.run('computeLints', (performance) {
         var allUnits = _library.libraryFiles.map((file) {
           var content = getFileContent(file);
-          return LinterContextUnit(content, units[file]);
+          return LinterContextUnit(content, units[file]!);
         }).toList();
         for (int i = 0; i < allUnits.length; i++) {
           _computeLints(_library.libraryFiles[i], allUnits[i], allUnits);
@@ -249,19 +244,13 @@
     // This must happen after all other diagnostics have been computed but
     // before the list of diagnostics has been filtered.
     for (var file in _library.libraryFiles) {
-      if (file.source != null) {
-        IgnoreValidator(_getErrorReporter(file), _getErrorListener(file).errors,
-                _fileToIgnoreInfo[file], _fileToLineInfo[file])
-            .reportErrors();
-      }
+      IgnoreValidator(_getErrorReporter(file), _getErrorListener(file).errors,
+              _fileToIgnoreInfo[file]!, _fileToLineInfo[file]!)
+          .reportErrors();
     }
   }
 
   void _computeHints(FileState file, CompilationUnit unit) {
-    if (file.source == null) {
-      return;
-    }
-
     AnalysisErrorListener errorListener = _getErrorListener(file);
     ErrorReporter errorReporter = _getErrorReporter(file);
 
@@ -335,9 +324,6 @@
   void _computeLints(FileState file, LinterContextUnit currentUnit,
       List<LinterContextUnit> allUnits) {
     var unit = currentUnit.unit;
-    if (file.source == null) {
-      return;
-    }
 
     ErrorReporter errorReporter = _getErrorReporter(file);
 
@@ -371,10 +357,6 @@
   }
 
   void _computeVerifyErrors(FileState file, CompilationUnit unit) {
-    if (file.source == null) {
-      return;
-    }
-
     RecordingErrorListener errorListener = _getErrorListener(file);
 
     CodeChecker checker = CodeChecker(
@@ -420,12 +402,12 @@
       return errors;
     }
 
-    IgnoreInfo ignoreInfo = _fileToIgnoreInfo[file];
+    IgnoreInfo ignoreInfo = _fileToIgnoreInfo[file]!;
     if (!ignoreInfo.hasIgnores) {
       return errors;
     }
 
-    LineInfo lineInfo = _fileToLineInfo[file];
+    LineInfo lineInfo = _fileToLineInfo[file]!;
 
     bool isIgnored(AnalysisError error) {
       int errorLine = lineInfo.getLocation(error.offset).lineNumber;
@@ -458,37 +440,26 @@
     });
   }
 
-  WorkspacePackage _getPackage(CompilationUnit unit) {
+  WorkspacePackage? _getPackage(CompilationUnit unit) {
     final libraryPath = _library.source.fullName;
-    Workspace workspace =
-        unit.declaredElement.session?.analysisContext?.workspace;
-
-    // If there is no driver setup (as in test environments), we need to create
-    // a workspace ourselves.
-    // todo (pq): fix tests or otherwise de-dup this logic shared w/ resolver.
-    if (workspace == null) {
-      final builder = ContextBuilder(
-          _resourceProvider, null /* sdkManager */, null /* contentCache */);
-      workspace = ContextBuilder.createWorkspace(
-          _resourceProvider, libraryPath, builder);
-    }
-    return workspace?.findPackageFor(libraryPath);
+    var workspace = unit.declaredElement!.session.analysisContext.workspace;
+    return workspace.findPackageFor(libraryPath);
   }
 
   /// Return the name of the library that the given part is declared to be a
   /// part of, or `null` if the part does not contain a part-of directive.
-  _NameOrSource _getPartLibraryNameOrUri(Source partSource,
+  _NameOrSource? _getPartLibraryNameOrUri(Source partSource,
       CompilationUnit partUnit, List<Directive> directivesToResolve) {
     for (Directive directive in partUnit.directives) {
       if (directive is PartOfDirective) {
         directivesToResolve.add(directive);
-        LibraryIdentifier libraryName = directive.libraryName;
+        var libraryName = directive.libraryName;
         if (libraryName != null) {
           return _NameOrSource(libraryName.name, null);
         }
-        String uri = directive.uri?.stringValue;
+        var uri = directive.uri?.stringValue;
         if (uri != null) {
-          Source librarySource = _sourceFactory.resolveUri(partSource, uri);
+          var librarySource = _sourceFactory.resolveUri(partSource, uri);
           if (librarySource != null) {
             return _NameOrSource(null, librarySource);
           }
@@ -514,8 +485,8 @@
 
   /// Return a  parsed unresolved [CompilationUnit].
   CompilationUnit _parse({
-    @required FileState file,
-    @required OperationPerformanceImpl performance,
+    required FileState file,
+    required OperationPerformanceImpl performance,
   }) {
     String content = getFileContent(file);
 
@@ -525,7 +496,7 @@
     AnalysisErrorListener errorListener = _getErrorListener(file);
     CompilationUnit unit = file.parse(errorListener, content);
 
-    LineInfo lineInfo = unit.lineInfo;
+    LineInfo lineInfo = unit.lineInfo!;
     _fileToLineInfo[file] = lineInfo;
     _fileToIgnoreInfo[file] = IgnoreInfo.forDart(unit, content);
 
@@ -534,7 +505,7 @@
 
   void _resolveDirectives(
     Map<FileState, CompilationUnit> units,
-    String completionPath,
+    String? completionPath,
   ) {
     if (completionPath != null) {
       var completionUnit = units.values.first;
@@ -542,7 +513,7 @@
       return;
     }
 
-    CompilationUnit definingCompilationUnit = units[_library];
+    CompilationUnit definingCompilationUnit = units[_library]!;
     definingCompilationUnit.element = _libraryElement.definingCompilationUnit;
 
     bool matchNodeElement(Directive node, Element element) {
@@ -551,7 +522,7 @@
 
     ErrorReporter libraryErrorReporter = _getErrorReporter(_library);
 
-    LibraryIdentifier libraryNameNode;
+    LibraryIdentifier? libraryNameNode;
     var seenPartSources = <Source>{};
     var directivesToResolve = <Directive>[];
     int partIndex = 0;
@@ -564,7 +535,7 @@
           if (matchNodeElement(directive, importElement)) {
             directive.element = importElement;
             directive.prefix?.staticElement = importElement.prefix;
-            Source source = importElement.importedLibrary?.source;
+            var source = importElement.importedLibrary?.source;
             if (source != null && !_isLibrarySource(source)) {
               ErrorCode errorCode = CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY;
               libraryErrorReporter.reportErrorForNode(
@@ -576,7 +547,7 @@
         for (ExportElement exportElement in _libraryElement.exports) {
           if (matchNodeElement(directive, exportElement)) {
             directive.element = exportElement;
-            Source source = exportElement.exportedLibrary?.source;
+            var source = exportElement.exportedLibrary?.source;
             if (source != null && !_isLibrarySource(source)) {
               libraryErrorReporter.reportErrorForNode(
                   CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY,
@@ -589,13 +560,13 @@
         StringLiteral partUri = directive.uri;
 
         FileState partFile = _library.partedFiles[partIndex];
-        CompilationUnit partUnit = units[partFile];
+        CompilationUnit partUnit = units[partFile]!;
         CompilationUnitElement partElement = _libraryElement.parts[partIndex];
         partUnit.element = partElement;
         directive.element = partElement;
         partIndex++;
 
-        Source partSource = directive.uriSource;
+        var partSource = directive.uriSource;
         if (partSource == null) {
           continue;
         }
@@ -613,7 +584,7 @@
         // name or uri as the library.
         //
         if (_isExistingSource(partSource)) {
-          _NameOrSource nameOrSource = _getPartLibraryNameOrUri(
+          var nameOrSource = _getPartLibraryNameOrUri(
               partSource, partUnit, directivesToResolve);
           if (nameOrSource == null) {
             libraryErrorReporter.reportErrorForNode(
@@ -621,7 +592,7 @@
                 partUri,
                 [partUri.toSource()]);
           } else {
-            String name = nameOrSource.name;
+            var name = nameOrSource.name;
             if (name != null) {
               if (libraryNameNode == null) {
                 libraryErrorReporter.reportErrorForNode(
@@ -635,7 +606,7 @@
                     [libraryNameNode.name, name]);
               }
             } else {
-              Source source = nameOrSource.source;
+              var source = nameOrSource.source!;
               if (source != _library.source) {
                 libraryErrorReporter.reportErrorForNode(
                     CompileTimeErrorCode.PART_OF_DIFFERENT_LIBRARY,
@@ -662,18 +633,15 @@
   }
 
   void _resolveFile({
-    @required int completionOffset,
-    @required FileState file,
-    @required CompilationUnit unit,
+    required int? completionOffset,
+    required FileState file,
+    required CompilationUnit unit,
   }) {
     Source source = file.source;
-    if (source == null) {
-      return;
-    }
 
     RecordingErrorListener errorListener = _getErrorListener(file);
 
-    CompilationUnitElement unitElement = unit.declaredElement;
+    var unitElement = unit.declaredElement as CompilationUnitElementImpl;
 
     // TODO(scheglov) Hack: set types for top-level variables
     // Otherwise TypeResolverVisitor will set declared types, and because we
@@ -704,7 +672,7 @@
     // Nothing for RESOLVED_UNIT9?
     // Nothing for RESOLVED_UNIT10?
 
-    FlowAnalysisHelper flowAnalysisHelper;
+    FlowAnalysisHelper? flowAnalysisHelper;
     if (unit.featureSet.isEnabled(Feature.non_nullable)) {
       flowAnalysisHelper = FlowAnalysisHelper(_typeSystem, false);
     }
@@ -724,7 +692,7 @@
       if (nodeToResolve != null) {
         var can = resolverVisitor.prepareForResolving(nodeToResolve);
         if (can) {
-          nodeToResolve?.accept(resolverVisitor);
+          nodeToResolve.accept(resolverVisitor);
           donePartialResolution = true;
         }
       }
@@ -737,16 +705,11 @@
 
   /// Return the result of resolve the given [uriContent], reporting errors
   /// against the [uriLiteral].
-  Source _resolveUri(FileState file, bool isImport, StringLiteral uriLiteral,
-      String uriContent) {
-    UriValidationCode code =
+  Source? _resolveUri(FileState file, bool isImport, StringLiteral uriLiteral,
+      String? uriContent) {
+    var code =
         UriBasedDirectiveImpl.validateUri(isImport, uriLiteral, uriContent);
     if (code == null) {
-      try {
-        Uri.parse(uriContent);
-      } on FormatException {
-        return null;
-      }
       return _sourceFactory.resolveUri(file.source, uriContent);
     } else if (code == UriValidationCode.URI_WITH_DART_EXT_SCHEME) {
       return null;
@@ -766,16 +729,16 @@
     for (Directive directive in unit.directives) {
       if (directive is UriBasedDirective) {
         StringLiteral uriLiteral = directive.uri;
-        String uriContent = uriLiteral.stringValue?.trim();
+        var uriContent = uriLiteral.stringValue?.trim();
         directive.uriContent = uriContent;
-        Source defaultSource = _resolveUri(
+        var defaultSource = _resolveUri(
             file, directive is ImportDirective, uriLiteral, uriContent);
         directive.uriSource = defaultSource;
       }
     }
   }
 
-  CompilationUnitElement _unitElementWithPath(String path) {
+  CompilationUnitElement? _unitElementWithPath(String path) {
     for (var unitElement in _libraryElement.units) {
       if (unitElement.source.fullName == path) {
         return unitElement;
@@ -797,7 +760,7 @@
   /// report an error if it does not.
   void _validateUriBasedDirective(
       FileState file, UriBasedDirectiveImpl directive) {
-    Source source = directive.uriSource;
+    var source = directive.uriSource;
     if (source != null) {
       if (_isExistingSource(source)) {
         return;
@@ -821,8 +784,8 @@
   /// Check each directive in the given [unit] to see if the referenced source
   /// exists and report an error if it does not.
   void _validateUriBasedDirectives(FileState file, CompilationUnit unit) {
-    for (Directive directive in unit.directives) {
-      if (directive is UriBasedDirective) {
+    for (var directive in unit.directives) {
+      if (directive is UriBasedDirectiveImpl) {
         _validateUriBasedDirective(file, directive);
       }
     }
@@ -840,8 +803,8 @@
 
 /// Either the name or the source associated with a part-of directive.
 class _NameOrSource {
-  final String name;
-  final Source source;
+  final String? name;
+  final Source? source;
 
   _NameOrSource(this.name, this.source);
 }
diff --git a/pkg/analyzer/lib/src/dart/micro/library_graph.dart b/pkg/analyzer/lib/src/dart/micro/library_graph.dart
index 971bc79..f5e42bb 100644
--- a/pkg/analyzer/lib/src/dart/micro/library_graph.dart
+++ b/pkg/analyzer/lib/src/dart/micro/library_graph.dart
@@ -33,7 +33,6 @@
 import 'package:analyzer/src/workspace/workspace.dart';
 import 'package:collection/collection.dart';
 import 'package:convert/convert.dart';
-import 'package:meta/meta.dart';
 import 'package:pub_semver/pub_semver.dart';
 
 /// Ensure that the [FileState.libraryCycle] for the [file] and anything it
@@ -58,7 +57,7 @@
   /// The [WorkspacePackage] that contains this file.
   ///
   /// It might be `null` if the file is outside of the workspace.
-  final WorkspacePackage workspacePackage;
+  final WorkspacePackage? workspacePackage;
 
   /// The [FeatureSet] for all files in the analysis context.
   ///
@@ -82,16 +81,16 @@
   final Set<FileState> directReferencedFiles = {};
   final Set<FileState> directReferencedLibraries = {};
   final List<FileState> libraryFiles = [];
-  FileState partOfLibrary;
+  FileState? partOfLibrary;
 
-  List<int> _digest;
-  bool _exists;
-  List<int> _apiSignature;
-  UnlinkedUnit2 unlinked2;
-  LibraryCycle _libraryCycle;
+  late List<int> _digest;
+  late bool _exists;
+  late List<int> _apiSignature;
+  late UnlinkedUnit2 unlinked2;
+  LibraryCycle? _libraryCycle;
 
   /// id of the cache entry.
-  int id;
+  late int id;
 
   FileState._(
     this._fsState,
@@ -115,7 +114,7 @@
     if (_libraryCycle == null) {
       computeLibraryCycle(_fsState._linkedSalt, this);
     }
-    return _libraryCycle;
+    return _libraryCycle!;
   }
 
   LineInfo get lineInfo => LineInfo(unlinked2.lineStarts);
@@ -215,7 +214,7 @@
   }
 
   void refresh({
-    @required OperationPerformanceImpl performance,
+    required OperationPerformanceImpl performance,
   }) {
     _fsState.testView.refreshedFiles.add(path);
     performance.getDataInt('count').increment();
@@ -228,7 +227,8 @@
     String unlinkedKey = path;
 
     // Prepare bytes of the unlinked bundle - existing or new.
-    List<int> bytes;
+    // TODO(migration): should not be nullable
+    List<int>? bytes;
     {
       var cacheData = _fsState._byteStore.get(unlinkedKey, _digest);
       bytes = cacheData?.bytes;
@@ -247,21 +247,21 @@
         performance.run('unlinked', (performance) {
           var unlinkedBuilder = serializeAstCiderUnlinked(_digest, unit);
           bytes = unlinkedBuilder.toBuffer();
-          performance.getDataInt('length').add(bytes.length);
-          cacheData = _fsState._byteStore.putGet(unlinkedKey, _digest, bytes);
-          bytes = cacheData.bytes;
+          performance.getDataInt('length').add(bytes!.length);
+          cacheData = _fsState._byteStore.putGet(unlinkedKey, _digest, bytes!);
+          bytes = cacheData!.bytes;
         });
 
         performance.run('prefetch', (_) {
-          unlinked2 = CiderUnlinkedUnit.fromBuffer(bytes).unlinkedUnit;
+          unlinked2 = CiderUnlinkedUnit.fromBuffer(bytes!).unlinkedUnit!;
           _prefetchDirectReferences(unlinked2);
         });
       }
-      id = cacheData.id;
+      id = cacheData!.id;
     }
 
     // Read the unlinked bundle.
-    unlinked2 = CiderUnlinkedUnit.fromBuffer(bytes).unlinkedUnit;
+    unlinked2 = CiderUnlinkedUnit.fromBuffer(bytes!).unlinkedUnit!;
     _apiSignature = Uint8List.fromList(unlinked2.apiSignature);
 
     // Build the graph.
@@ -300,7 +300,7 @@
           performance: performance,
         );
         if (partOfLibrary != null) {
-          directReferencedFiles.add(partOfLibrary);
+          directReferencedFiles.add(partOfLibrary!);
         }
       }
     }
@@ -320,9 +320,9 @@
     return path;
   }
 
-  FileState _fileForRelativeUri({
-    @required String relativeUri,
-    @required OperationPerformanceImpl performance,
+  FileState? _fileForRelativeUri({
+    required String relativeUri,
+    required OperationPerformanceImpl performance,
   }) {
     if (relativeUri.isEmpty) {
       return null;
@@ -379,7 +379,7 @@
     for (var uri in unlinked2.parts) {
       findPathForUri(uri);
     }
-    _fsState.prefetchFiles(paths.toList());
+    _fsState.prefetchFiles!(paths.toList());
   }
 
   static CiderUnlinkedUnitBuilder serializeAstCiderUnlinked(
@@ -409,7 +409,7 @@
       } else if (directive is PartOfDirective) {
         hasPartOfDirective = true;
         if (directive.uri != null) {
-          partOfUriStr = directive.uri.stringValue;
+          partOfUriStr = directive.uri!.stringValue!;
         }
       }
     }
@@ -428,7 +428,7 @@
       hasLibraryDirective: hasLibraryDirective,
       hasPartOfDirective: hasPartOfDirective,
       partOfUri: partOfUriStr,
-      lineStarts: unit.lineInfo.lineStarts,
+      lineStarts: unit.lineInfo!.lineStarts,
     );
     return CiderUnlinkedUnitBuilder(
         contentDigest: digest, unlinkedUnit: unlinkedBuilder);
@@ -470,7 +470,7 @@
 
   /// A function that fetches the given list of files. This function can be used
   /// to batch file reads in systems where file fetches are expensive.
-  final void Function(List<String> paths) prefetchFiles;
+  final void Function(List<String> paths)? prefetchFiles;
 
   final FileSystemStateTimers timers2 = FileSystemStateTimers();
 
@@ -522,7 +522,7 @@
   FeatureSet contextFeatureSet(
     String path,
     Uri uri,
-    WorkspacePackage workspacePackage,
+    WorkspacePackage? workspacePackage,
   ) {
     var workspacePackageExperiments = workspacePackage?.enabledExperiments;
     if (workspacePackageExperiments != null) {
@@ -537,7 +537,7 @@
   Version contextLanguageVersion(
     String path,
     Uri uri,
-    WorkspacePackage workspacePackage,
+    WorkspacePackage? workspacePackage,
   ) {
     var workspaceLanguageVersion = workspacePackage?.languageVersion;
     if (workspaceLanguageVersion != null) {
@@ -548,18 +548,18 @@
   }
 
   FileState getFileForPath({
-    @required String path,
-    @required OperationPerformanceImpl performance,
+    required String path,
+    required OperationPerformanceImpl performance,
   }) {
     var file = _pathToFile[path];
     if (file == null) {
       var fileUri = _resourceProvider.pathContext.toUri(path);
       var uri = _sourceFactory.restoreUri(
         _FakeSource(path, fileUri),
-      );
+      )!;
 
-      var source = _sourceFactory.forUri2(uri);
-      var workspacePackage = _workspace?.findPackageFor(path);
+      var source = _sourceFactory.forUri2(uri)!;
+      var workspacePackage = _workspace.findPackageFor(path);
       var featureSet = contextFeatureSet(path, uri, workspacePackage);
       var packageLanguageVersion =
           contextLanguageVersion(path, uri, workspacePackage);
@@ -570,7 +570,7 @@
       _uriToFile[uri] = file;
 
       performance.run('refresh', (performance) {
-        file.refresh(
+        file!.refresh(
           performance: performance,
         );
       });
@@ -578,11 +578,11 @@
     return file;
   }
 
-  FileState getFileForUri({
-    @required Uri uri,
-    @required OperationPerformanceImpl performance,
+  FileState? getFileForUri({
+    required Uri uri,
+    required OperationPerformanceImpl performance,
   }) {
-    FileState file = _uriToFile[uri];
+    var file = _uriToFile[uri];
     if (file == null) {
       var source = _sourceFactory.forUri2(uri);
       if (source == null) {
@@ -590,7 +590,7 @@
       }
       var path = source.fullName;
 
-      var workspacePackage = _workspace?.findPackageFor(path);
+      var workspacePackage = _workspace.findPackageFor(path);
       var featureSet = contextFeatureSet(path, uri, workspacePackage);
       var packageLanguageVersion =
           contextLanguageVersion(path, uri, workspacePackage);
@@ -607,7 +607,7 @@
     return file;
   }
 
-  String getPathForUri(Uri uri) {
+  String? getPathForUri(Uri uri) {
     var source = _sourceFactory.forUri2(uri);
     if (source == null) {
       return null;
@@ -624,13 +624,13 @@
     var deps = HashSet<String>();
     for (var path in files) {
       unusedFiles.remove(path);
-      _pathToFile[path].collectAllReferencedFiles(deps);
+      _pathToFile[path]!.collectAllReferencedFiles(deps);
     }
     for (var path in deps) {
       unusedFiles.remove(path);
     }
     for (var path in unusedFiles) {
-      var file = _pathToFile.remove(path);
+      var file = _pathToFile.remove(path)!;
       _uriToFile.remove(file.uri);
       removedFiles.add(file);
     }
@@ -696,16 +696,18 @@
   /// the signatures of the cycles that the [libraries] reference
   /// directly.  So, indirectly it is based on the transitive closure of all
   /// files that [libraries] reference (but we don't compute these files).
-  List<int> signature;
+  late List<int> signature;
 
   /// The hash of all the paths of the files in this cycle.
-  String cyclePathsHash;
+  late String cyclePathsHash;
 
-  /// id of the ast cache entry.
-  int astId;
+  /// The ID of the ast cache entry.
+  /// It is `null` if we failed to load libraries of the cycle.
+  int? astId;
 
-  /// id of the resolution cache entry.
-  int resolutionId;
+  /// The ID of the resolution cache entry.
+  /// It is `null` if we failed to load libraries of the cycle.
+  int? resolutionId;
 
   LibraryCycle();
 
diff --git a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
index 84d29d8..c58fb75 100644
--- a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
+++ b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
@@ -36,7 +36,6 @@
 import 'package:analyzer/src/task/options.dart';
 import 'package:analyzer/src/util/performance/operation_performance.dart';
 import 'package:analyzer/src/workspace/workspace.dart';
-import 'package:meta/meta.dart';
 import 'package:yaml/yaml.dart';
 
 const M = 1024 * 1024 /*1 MiB*/;
@@ -64,18 +63,18 @@
 
   /// A function that fetches the given list of files. This function can be used
   /// to batch file reads in systems where file fetches are expensive.
-  final void Function(List<String> paths) prefetchFiles;
+  final void Function(List<String> paths)? prefetchFiles;
 
   final Workspace workspace;
 
   /// This field gets value only during testing.
-  FileResolverTestView testView;
+  FileResolverTestView? testView;
 
-  FileSystemState fsState;
+  FileSystemState? fsState;
 
-  MicroContextObjects contextObjects;
+  MicroContextObjects? contextObjects;
 
-  _LibraryContext libraryContext;
+  _LibraryContext? libraryContext;
 
   /// List of ids for cache elements that are invalidated. Track elements that
   /// are invalidated during [changeFile]. Used in [releaseAndClearRemovedIds]
@@ -89,8 +88,8 @@
     SourceFactory sourceFactory,
     String Function(String path) getFileDigest,
     void Function(List<String> paths) prefetchFiles, {
-    @required Workspace workspace,
-    @deprecated Duration libraryContextResetTimeout,
+    required Workspace workspace,
+    @deprecated Duration? libraryContextResetTimeout,
   }) : this.from(
           logger: logger,
           resourceProvider: resourceProvider,
@@ -103,23 +102,21 @@
         );
 
   FileResolver.from({
-    @required PerformanceLog logger,
-    @required ResourceProvider resourceProvider,
-    @required SourceFactory sourceFactory,
-    @required String Function(String path) getFileDigest,
-    @required void Function(List<String> paths) prefetchFiles,
-    @required Workspace workspace,
-    CiderByteStore byteStore,
-    @deprecated Duration libraryContextResetTimeout,
+    required PerformanceLog logger,
+    required ResourceProvider resourceProvider,
+    required SourceFactory sourceFactory,
+    required String Function(String path) getFileDigest,
+    required void Function(List<String> paths)? prefetchFiles,
+    required Workspace workspace,
+    CiderByteStore? byteStore,
+    @deprecated Duration? libraryContextResetTimeout,
   })  : logger = logger,
         sourceFactory = sourceFactory,
         resourceProvider = resourceProvider,
         getFileDigest = getFileDigest,
         prefetchFiles = prefetchFiles,
-        workspace = workspace {
-    byteStore ??= CiderCachedByteStore(memoryCacheSize);
-    this.byteStore = byteStore;
-  }
+        workspace = workspace,
+        byteStore = byteStore ?? CiderCachedByteStore(memoryCacheSize);
 
   /// Update the resolver to reflect the fact that the file with the given
   /// [path] was changed. We need to make sure that when this file, of any file
@@ -133,7 +130,7 @@
 
     // Remove this file and all files that transitively depend on it.
     var removedFiles = <FileState>[];
-    fsState.changeFile(path, removedFiles);
+    fsState!.changeFile(path, removedFiles);
 
     // Schedule disposing references to cached unlinked data.
     for (var removedFile in removedFiles) {
@@ -143,23 +140,23 @@
     // Remove libraries represented by removed files.
     // If we need these libraries later, we will relink and reattach them.
     if (libraryContext != null) {
-      libraryContext.remove(removedFiles, removedCacheIds);
+      libraryContext!.remove(removedFiles, removedCacheIds);
     }
   }
 
   /// Collects all the cached artifacts and add all the cache id's for the
   /// removed artifacts to [removedCacheIds].
   void collectSharedDataIdentifiers() {
-    removedCacheIds.addAll(fsState.collectSharedDataIdentifiers());
-    removedCacheIds.addAll(libraryContext.collectSharedDataIdentifiers());
+    removedCacheIds.addAll(fsState!.collectSharedDataIdentifiers());
+    removedCacheIds.addAll(libraryContext!.collectSharedDataIdentifiers());
   }
 
   @deprecated
   void dispose() {}
 
   ErrorsResult getErrors({
-    @required String path,
-    OperationPerformanceImpl performance,
+    required String path,
+    OperationPerformanceImpl? performance,
   }) {
     _throwIfNotAbsoluteNormalizedPath(path);
 
@@ -168,7 +165,7 @@
     return logger.run('Get errors for $path', () {
       var fileContext = getFileContext(
         path: path,
-        performance: performance,
+        performance: performance!,
       );
       var file = fileContext.file;
 
@@ -179,11 +176,11 @@
 
       var errorsKey = file.path + '.errors';
       var bytes = byteStore.get(errorsKey, errorsSignature)?.bytes;
-      List<AnalysisError> errors;
+      List<AnalysisError>? errors;
       if (bytes != null) {
         var data = CiderUnitErrors.fromBuffer(bytes);
         errors = data.errors.map((error) {
-          return ErrorEncoding.decode(file.source, error);
+          return ErrorEncoding.decode(file.source, error)!;
         }).toList();
       }
 
@@ -202,7 +199,7 @@
       }
 
       return ErrorsResultImpl(
-        contextObjects.analysisSession,
+        contextObjects!.analysisSession,
         path,
         file.uri,
         file.lineInfo,
@@ -214,8 +211,8 @@
 
   @deprecated
   ErrorsResult getErrors2({
-    @required String path,
-    OperationPerformanceImpl performance,
+    required String path,
+    OperationPerformanceImpl? performance,
   }) {
     return getErrors(
       path: path,
@@ -224,8 +221,8 @@
   }
 
   FileContext getFileContext({
-    @required String path,
-    @required OperationPerformanceImpl performance,
+    required String path,
+    required OperationPerformanceImpl performance,
   }) {
     return performance.run('fileContext', (performance) {
       var analysisOptions = performance.run('analysisOptions', (performance) {
@@ -240,7 +237,7 @@
       });
 
       var file = performance.run('fileForPath', (performance) {
-        return fsState.getFileForPath(
+        return fsState!.getFileForPath(
           path: path,
           performance: performance,
         );
@@ -251,12 +248,12 @@
   }
 
   String getLibraryLinkedSignature({
-    @required String path,
-    @required OperationPerformanceImpl performance,
+    required String path,
+    required OperationPerformanceImpl performance,
   }) {
     _throwIfNotAbsoluteNormalizedPath(path);
 
-    var file = fsState.getFileForPath(
+    var file = fsState!.getFileForPath(
       path: path,
       performance: performance,
     );
@@ -284,7 +281,7 @@
   /// from bytes, which will be done by [getErrors]. It is OK for it to
   /// spend some more time on this.
   void linkLibraries({
-    @required String path,
+    required String path,
   }) {
     _throwIfNotAbsoluteNormalizedPath(path);
 
@@ -297,7 +294,7 @@
     var file = fileContext.file;
     var libraryFile = file.partOfLibrary ?? file;
 
-    libraryContext.load2(
+    libraryContext!.load2(
       targetLibrary: libraryFile,
       performance: performance,
     );
@@ -316,7 +313,7 @@
   /// [FileState]'s. Adds the cache id's for the removed [FileState]'s to
   /// [removedCacheIds].
   void removeFilesNotNecessaryForAnalysisOf(List<String> files) {
-    var removedFiles = fsState.removeUnusedFiles(files);
+    var removedFiles = fsState!.removeUnusedFiles(files);
     for (var removedFile in removedFiles) {
       removedCacheIds.add(removedFile.id);
     }
@@ -324,10 +321,10 @@
 
   /// The [completionLine] and [completionColumn] are zero based.
   ResolvedUnitResult resolve({
-    int completionLine,
-    int completionColumn,
-    @required String path,
-    OperationPerformanceImpl performance,
+    int? completionLine,
+    int? completionColumn,
+    required String path,
+    OperationPerformanceImpl? performance,
   }) {
     _throwIfNotAbsoluteNormalizedPath(path);
 
@@ -336,19 +333,19 @@
     return logger.run('Resolve $path', () {
       var fileContext = getFileContext(
         path: path,
-        performance: performance,
+        performance: performance!,
       );
       var file = fileContext.file;
       var libraryFile = file.partOfLibrary ?? file;
 
-      int completionOffset;
+      int? completionOffset;
       if (completionLine != null && completionColumn != null) {
         var lineOffset = file.lineInfo.getOffsetOfLine(completionLine);
         completionOffset = lineOffset + completionColumn;
       }
 
       performance.run('libraryContext', (performance) {
-        libraryContext.load2(
+        libraryContext!.load2(
           targetLibrary: libraryFile,
           performance: performance,
         );
@@ -360,24 +357,23 @@
       var errorListener = RecordingErrorListener();
       var unit = file.parse(errorListener, content);
 
-      Map<FileState, UnitAnalysisResult> results;
+      late Map<FileState, UnitAnalysisResult> results;
 
       logger.run('Compute analysis results', () {
         var libraryAnalyzer = LibraryAnalyzer(
           fileContext.analysisOptions,
-          contextObjects.declaredVariables,
+          contextObjects!.declaredVariables,
           sourceFactory,
           (_) => true, // _isLibraryUri
-          contextObjects.analysisContext,
-          libraryContext.elementFactory,
-          contextObjects.inheritanceManager,
+          contextObjects!.analysisContext,
+          libraryContext!.elementFactory,
+          contextObjects!.inheritanceManager,
           libraryFile,
-          resourceProvider,
           (file) => file.getContentWithSameDigest(),
         );
 
         try {
-          results = performance.run('analyze', (performance) {
+          results = performance!.run('analyze', (performance) {
             return NullSafetyUnderstandingFlag.enableNullSafetyTypes(() {
               return libraryAnalyzer.analyzeSync(
                 completionPath: completionOffset != null ? path : null,
@@ -399,15 +395,15 @@
           );
         }
       });
-      UnitAnalysisResult fileResult = results[file];
+      UnitAnalysisResult fileResult = results[file]!;
 
       return ResolvedUnitResultImpl(
-        contextObjects.analysisSession,
+        contextObjects!.analysisSession,
         path,
         file.uri,
         file.exists,
         content,
-        unit.lineInfo,
+        unit.lineInfo!,
         false, // isPart
         fileResult.unit,
         fileResult.errors,
@@ -429,7 +425,7 @@
   /// for another.
   void _createContext(String path, AnalysisOptionsImpl fileAnalysisOptions) {
     if (contextObjects != null) {
-      contextObjects.analysisOptions = fileAnalysisOptions;
+      contextObjects!.analysisOptions = fileAnalysisOptions;
       return;
     }
 
@@ -479,14 +475,14 @@
         logger,
         resourceProvider,
         byteStore,
-        contextObjects,
+        contextObjects!,
       );
     }
   }
 
-  File _findOptionsFile(Folder folder) {
+  File? _findOptionsFile(Folder? folder) {
     while (folder != null) {
-      File packagesFile =
+      var packagesFile =
           _getFile(folder, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
       if (packagesFile != null) {
         return packagesFile;
@@ -505,17 +501,17 @@
   ///
   /// Otherwise, return the default options.
   AnalysisOptionsImpl _getAnalysisOptions({
-    @required String path,
-    @required OperationPerformanceImpl performance,
+    required String path,
+    required OperationPerformanceImpl performance,
   }) {
-    YamlMap optionMap;
+    YamlMap? optionMap;
 
     var separator = resourceProvider.pathContext.separator;
     var isThirdParty = path
             .contains('${separator}third_party${separator}dart$separator') ||
         path.contains('${separator}third_party${separator}dart_lang$separator');
 
-    File optionsFile;
+    File? optionsFile;
     if (!isThirdParty) {
       optionsFile = performance.run('findOptionsFile', (_) {
         var folder = resourceProvider.getFile(path).parent;
@@ -527,7 +523,7 @@
       performance.run('getOptionsFromFile', (_) {
         try {
           var optionsProvider = AnalysisOptionsProvider(sourceFactory);
-          optionMap = optionsProvider.getOptionsFromFile(optionsFile);
+          optionMap = optionsProvider.getOptionsFromFile(optionsFile!);
         } catch (e) {
           // ignored
         }
@@ -564,7 +560,7 @@
 
     if (optionMap != null) {
       performance.run('applyToAnalysisOptions', (_) {
-        applyToAnalysisOptions(options, optionMap);
+        applyToAnalysisOptions(options, optionMap!);
       });
     }
 
@@ -596,7 +592,7 @@
     }
   }
 
-  static File _getFile(Folder directory, String name) {
+  static File? _getFile(Folder directory, String name) {
     Resource resource = directory.getChild(name);
     if (resource is File && resource.exists) {
       return resource;
@@ -622,7 +618,7 @@
   final CiderByteStore byteStore;
   final MicroContextObjects contextObjects;
 
-  LinkedElementFactory elementFactory;
+  late final LinkedElementFactory elementFactory;
 
   Set<LibraryCycle> loadedBundles = Set.identity();
 
@@ -643,9 +639,16 @@
   /// artifacts.
   Set<int> collectSharedDataIdentifiers() {
     var idSet = <int>{};
+
+    void addIfNotNull(int? id) {
+      if (id != null) {
+        idSet.add(id);
+      }
+    }
+
     for (var cycle in loadedBundles) {
-      idSet.add(cycle.astId);
-      idSet.add(cycle.resolutionId);
+      addIfNotNull(cycle.astId);
+      addIfNotNull(cycle.resolutionId);
     }
     loadedBundles.clear();
     return idSet;
@@ -653,8 +656,8 @@
 
   /// Load data required to access elements of the given [targetLibrary].
   void load2({
-    @required FileState targetLibrary,
-    @required OperationPerformanceImpl performance,
+    required FileState targetLibrary,
+    required OperationPerformanceImpl performance,
   }) {
     var librariesLinked = 0;
     var librariesLinkedTimer = Stopwatch();
@@ -682,7 +685,6 @@
         var inputLibraries = <link2.LinkInputLibrary>[];
         for (var libraryFile in cycle.libraries) {
           var librarySource = libraryFile.source;
-          if (librarySource == null) continue;
 
           var inputUnits = <link2.LinkInputUnit>[];
           var partIndex = -1;
@@ -698,7 +700,7 @@
               content,
             );
 
-            String partUriStr;
+            String? partUriStr;
             if (partIndex >= 0) {
               partUriStr = libraryFile.unlinked2.parts[partIndex];
             }
@@ -741,14 +743,14 @@
         performance.getDataInt('bytesGet').add(resolutionBytes.length);
         performance.getDataInt('libraryLoadCount').add(cycle.libraries.length);
       }
-      cycle.astId = astData.id;
-      cycle.resolutionId = resolutionData.id;
+      cycle.astId = astData!.id;
+      cycle.resolutionId = resolutionData!.id;
 
       elementFactory.addBundle(
         BundleReader(
           elementFactory: elementFactory,
-          astBytes: astBytes,
-          resolutionBytes: resolutionBytes,
+          astBytes: astBytes as Uint8List,
+          resolutionBytes: resolutionBytes as Uint8List,
         ),
       );
 
@@ -775,10 +777,17 @@
     );
 
     var removedSet = removed.toSet();
+
+    void addIfNotNull(int? id) {
+      if (id != null) {
+        removedIds.add(id);
+      }
+    }
+
     loadedBundles.removeWhere((cycle) {
       if (cycle.libraries.any(removedSet.contains)) {
-        removedIds.add(cycle.astId);
-        removedIds.add(cycle.resolutionId);
+        addIfNotNull(cycle.astId);
+        addIfNotNull(cycle.resolutionId);
         return true;
       }
       return false;
@@ -788,9 +797,9 @@
   /// Ensure that type provider is created.
   void _createElementFactoryTypeProvider() {
     var analysisContext = contextObjects.analysisContext;
-    if (analysisContext.typeProviderNonNullableByDefault == null) {
-      var dartCore = elementFactory.libraryOfUri('dart:core');
-      var dartAsync = elementFactory.libraryOfUri('dart:async');
+    if (!analysisContext.hasTypeProvider) {
+      var dartCore = elementFactory.libraryOfUri2('dart:core');
+      var dartAsync = elementFactory.libraryOfUri2('dart:async');
       elementFactory.createTypeProviders(dartCore, dartAsync);
     }
   }
diff --git a/pkg/analyzer/lib/src/dart/resolver/annotation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/annotation_resolver.dart
index 6b31839..a02ad16 100644
--- a/pkg/analyzer/lib/src/dart/resolver/annotation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/annotation_resolver.dart
@@ -28,13 +28,14 @@
     _resolve1(node);
 
     node.constructorName?.accept(_resolver);
-    Element element = node.element;
+    var element = node.element;
     if (element is ExecutableElement) {
       InferenceContext.setType(node.arguments, element.type);
     }
     node.arguments?.accept(_resolver);
 
-    ElementAnnotationImpl elementAnnotationImpl = node.elementAnnotation;
+    var elementAnnotationImpl =
+        node.elementAnnotation as ElementAnnotationImpl?;
     if (elementAnnotationImpl == null) {
       // Analyzer ignores annotations on "part of" directives.
       assert(parent is PartDirective || parent is PartOfDirective);
@@ -135,14 +136,13 @@
 
   void _resolveAnnotationConstructorInvocationArguments(
       Annotation annotation, ConstructorElement constructor) {
-    ArgumentList argumentList = annotation.arguments;
+    var argumentList = annotation.arguments;
     // error will be reported in ConstantVerifier
     if (argumentList == null) {
       return;
     }
     // resolve arguments to parameters
-    List<ParameterElement> parameters =
-        _resolveArgumentsToFunction(argumentList, constructor);
+    var parameters = _resolveArgumentsToFunction(argumentList, constructor);
     if (parameters != null) {
       argumentList.correspondingStaticParameters = parameters;
     }
@@ -150,8 +150,8 @@
 
   /// Continues resolution of the given [annotation].
   void _resolveAnnotationElement(Annotation annotation) {
-    SimpleIdentifier nameNode1;
-    SimpleIdentifier nameNode2;
+    late final SimpleIdentifier nameNode1;
+    SimpleIdentifier? nameNode2;
     {
       Identifier annName = annotation.name;
       if (annName is PrefixedIdentifier) {
@@ -162,14 +162,14 @@
         nameNode2 = null;
       }
     }
-    SimpleIdentifier nameNode3 = annotation.constructorName;
-    ConstructorElement constructor;
+    SimpleIdentifier? nameNode3 = annotation.constructorName;
+    ConstructorElement? constructor;
     bool undefined = false;
     //
     // CONST or Class(args)
     //
-    if (nameNode1 != null && nameNode2 == null && nameNode3 == null) {
-      Element element1 = nameNode1.staticElement;
+    if (nameNode2 == null && nameNode3 == null) {
+      var element1 = nameNode1.staticElement;
       // TODO(scheglov) Must be const.
       if (element1 is VariableElement) {
         return;
@@ -191,9 +191,9 @@
     //
     // prefix.CONST or prefix.Class() or Class.CONST or Class.constructor(args)
     //
-    if (nameNode1 != null && nameNode2 != null && nameNode3 == null) {
-      Element element1 = nameNode1.staticElement;
-      Element element2 = nameNode2.staticElement;
+    if (nameNode2 != null && nameNode3 == null) {
+      var element1 = nameNode1.staticElement;
+      var element2 = nameNode2.staticElement;
       // Class.CONST - not resolved yet
       if (element1 is ClassElement) {
         element2 = element1.lookUpGetter(nameNode2.name, _definingLibrary);
@@ -228,16 +228,15 @@
     //
     // prefix.Class.CONST or prefix.Class.constructor(args)
     //
-    if (nameNode1 != null && nameNode2 != null && nameNode3 != null) {
-      Element element2 = nameNode2.staticElement;
+    if (nameNode2 != null && nameNode3 != null) {
+      var element2 = nameNode2.staticElement;
       // element2 should be ClassElement
       if (element2 is ClassElement) {
         String name3 = nameNode3.name;
         // prefix.Class.CONST
-        PropertyAccessorElement getter =
-            element2.lookUpGetter(name3, _definingLibrary);
+        var getter = element2.lookUpGetter(name3, _definingLibrary);
         if (getter != null) {
-          getter = _resolver.toLegacyElement(getter);
+          getter = _resolver.toLegacyElement(getter)!;
           nameNode3.staticElement = getter;
           annotation.element = getter;
           _resolveAnnotationElementGetter(annotation, getter);
@@ -287,8 +286,8 @@
   /// the arguments, or `null` if no correspondence could be computed.
   ///
   /// TODO(scheglov) this is duplicate
-  List<ParameterElement> _resolveArgumentsToFunction(
-      ArgumentList argumentList, ExecutableElement executableElement) {
+  List<ParameterElement?>? _resolveArgumentsToFunction(
+      ArgumentList argumentList, ExecutableElement? executableElement) {
     if (executableElement == null) {
       return null;
     }
@@ -303,7 +302,7 @@
   /// correspond to the arguments.
   ///
   /// TODO(scheglov) this is duplicate
-  List<ParameterElement> _resolveArgumentsToParameters(
+  List<ParameterElement?> _resolveArgumentsToParameters(
       ArgumentList argumentList, List<ParameterElement> parameters) {
     return ResolverVisitor.resolveArgumentsToParameters(
         argumentList, parameters, _errorReporter.reportErrorForNode);
diff --git a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
index a71a826..a767e17 100644
--- a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
@@ -16,7 +16,6 @@
 import 'package:analyzer/src/dart/resolver/type_property_resolver.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/resolver.dart';
-import 'package:meta/meta.dart';
 
 /// Helper for resolving [AssignmentExpression]s.
 class AssignmentExpressionResolver {
@@ -26,7 +25,7 @@
   final AssignmentExpressionShared _assignmentShared;
 
   AssignmentExpressionResolver({
-    @required ResolverVisitor resolver,
+    required ResolverVisitor resolver,
   })  : _resolver = resolver,
         _typePropertyResolver = resolver.typePropertyResolver,
         _inferenceHelper = resolver.inferenceHelper,
@@ -60,24 +59,27 @@
 
     if (hasRead) {
       _resolver.setReadElement(left, readElement);
+      _resolveOperator(node);
     }
     _resolver.setWriteElement(left, writeElement);
     _resolver.migrationResolutionHooks
         ?.setCompoundAssignmentExpressionTypes(node);
 
-    _resolveOperator(node);
+    // TODO(scheglov) Use VariableElement and do in resolveForWrite() ?
+    _assignmentShared.checkFinalAlreadyAssigned(left);
 
     {
       var leftType = node.writeType;
       if (writeElement is VariableElement) {
-        leftType = _resolver.localVariableTypeProvider.getType(left);
+        leftType = _resolver.localVariableTypeProvider
+            .getType(left as SimpleIdentifier);
       }
-      _setRhsContext(node, leftType, operator, right);
+      _setRhsContext(node, leftType!, operator, right);
     }
 
     var flow = _resolver.flowAnalysis?.flow;
     if (flow != null && isIfNull) {
-      flow.ifNullExpression_rightBegin(left, node.readType);
+      flow.ifNullExpression_rightBegin(left, node.readType!);
     }
 
     right.accept(_resolver);
@@ -85,8 +87,8 @@
     _resolveTypes(node);
 
     if (flow != null) {
-      if (writeElement is VariableElement) {
-        flow.write(writeElement, node.staticType, hasRead ? null : right);
+      if (writeElement is PromotableElement) {
+        flow.write(writeElement, node.staticType!, hasRead ? null : right);
       }
       if (isIfNull) {
         flow.ifNullExpression_end();
@@ -123,8 +125,7 @@
   /// See [StaticWarningCode.USE_OF_VOID_RESULT].
   /// TODO(scheglov) this is duplicate
   bool _checkForUseOfVoidResult(Expression expression) {
-    if (expression == null ||
-        !identical(expression.staticType, VoidTypeImpl.instance)) {
+    if (!identical(expression.staticType, VoidTypeImpl.instance)) {
       return false;
     }
 
@@ -145,14 +146,11 @@
     var operator = node.operator;
     var operatorType = operator.type;
 
-    var leftType = node.readType;
+    var leftType = node.readType!;
     if (identical(leftType, NeverTypeImpl.instance)) {
       return;
     }
 
-    // TODO(scheglov) Use VariableElement and do in resolveForWrite() ?
-    _assignmentShared.checkFinalAlreadyAssigned(left);
-
     // Values of the type void cannot be used.
     // Example: `y += 0`, is not allowed.
     if (operatorType != TokenType.EQ) {
@@ -182,7 +180,7 @@
       receiverErrorNode: left,
       nameErrorEntity: operator,
     );
-    node.staticElement = result.getter;
+    node.staticElement = result.getter as MethodElement?;
     if (result.needsGetterError) {
       _errorReporter.reportErrorForToken(
         CompileTimeErrorCode.UNDEFINED_OPERATOR,
@@ -198,17 +196,17 @@
 
     var operator = node.operator.type;
     if (operator == TokenType.EQ) {
-      assignedType = node.rightHandSide.staticType;
+      assignedType = node.rightHandSide.staticType!;
       nodeType = assignedType;
     } else if (operator == TokenType.QUESTION_QUESTION_EQ) {
-      var leftType = node.readType;
+      var leftType = node.readType!;
 
       // The LHS value will be used only if it is non-null.
       if (_isNonNullableByDefault) {
         leftType = _typeSystem.promoteToNonNull(leftType);
       }
 
-      assignedType = node.rightHandSide.staticType;
+      assignedType = node.rightHandSide.staticType!;
       nodeType = _typeSystem.getLeastUpperBound(leftType, assignedType);
     } else if (operator == TokenType.AMPERSAND_AMPERSAND_EQ ||
         operator == TokenType.BAR_BAR_EQ) {
@@ -217,8 +215,8 @@
     } else {
       var operatorElement = node.staticElement;
       if (operatorElement != null) {
-        var leftType = node.readType;
-        var rightType = node.rightHandSide.staticType;
+        var leftType = node.readType!;
+        var rightType = node.rightHandSide.staticType!;
         assignedType = _typeSystem.refineBinaryExpressionType(
           leftType,
           operator,
@@ -236,7 +234,7 @@
 
     // TODO(scheglov) Remove from ErrorVerifier?
     _checkForInvalidAssignment(
-      node.writeType,
+      node.writeType!,
       node.rightHandSide,
       assignedType,
     );
@@ -273,7 +271,7 @@
   final ResolverVisitor _resolver;
 
   AssignmentExpressionShared({
-    @required ResolverVisitor resolver,
+    required ResolverVisitor resolver,
   }) : _resolver = resolver;
 
   ErrorReporter get _errorReporter => _resolver.errorReporter;
@@ -282,11 +280,11 @@
     var flow = _resolver.flowAnalysis?.flow;
     if (flow != null && left is SimpleIdentifier) {
       var element = left.staticElement;
-      if (element is VariableElement) {
+      if (element is PromotableElement) {
         var assigned =
-            _resolver.flowAnalysis.isDefinitelyAssigned(left, element);
+            _resolver.flowAnalysis!.isDefinitelyAssigned(left, element);
         var unassigned =
-            _resolver.flowAnalysis.isDefinitelyUnassigned(left, element);
+            _resolver.flowAnalysis!.isDefinitelyUnassigned(left, element);
 
         if (element.isFinal) {
           if (element.isLate) {
diff --git a/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart b/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
index 377e713..26596c8 100644
--- a/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
@@ -10,7 +10,6 @@
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:meta/meta.dart';
 
 /// Helper for [MethodInvocation]s into [InstanceCreationExpression] to support
 /// the optional `new` and `const` feature, or [ExtensionOverride].
@@ -27,14 +26,14 @@
       return node;
     }
 
-    Expression target = node.target;
+    var target = node.target;
     if (target == null) {
       // Possible cases: C() or C<>()
       if (node.realTarget != null) {
         // This isn't a constructor invocation because it's in a cascade.
         return node;
       }
-      Element element = nameScope.lookup(methodName.name).getter;
+      var element = nameScope.lookup(methodName.name).getter;
       if (element is ClassElement) {
         return _toInstanceCreation_type(
           node: node,
@@ -60,7 +59,7 @@
         // This isn't a constructor invocation because a null aware operator is
         // being used.
       }
-      Element element = nameScope.lookup(target.name).getter;
+      var element = nameScope.lookup(target.name).getter;
       if (element is ClassElement) {
         // class C { C.named(); }
         // C.named()
@@ -72,7 +71,7 @@
         );
       } else if (element is PrefixElement) {
         // Possible cases: p.C() or p.C<>()
-        Element prefixedElement = element.scope.lookup(methodName.name).getter;
+        var prefixedElement = element.scope.lookup(methodName.name).getter;
         if (prefixedElement is ClassElement) {
           return _toInstanceCreation_prefix_type(
             node: node,
@@ -81,7 +80,7 @@
           );
         } else if (prefixedElement is ExtensionElement) {
           PrefixedIdentifier extensionName =
-              astFactory.prefixedIdentifier(target, node.operator, methodName);
+              astFactory.prefixedIdentifier(target, node.operator!, methodName);
           ExtensionOverride extensionOverride = astFactory.extensionOverride(
               extensionName: extensionName,
               typeArguments: node.typeArguments,
@@ -141,10 +140,10 @@
   }
 
   AstNode _instanceCreation_prefix_type_name({
-    @required MethodInvocation node,
-    @required PrefixedIdentifier typeNameIdentifier,
-    @required SimpleIdentifier constructorIdentifier,
-    @required ClassElement classElement,
+    required MethodInvocation node,
+    required PrefixedIdentifier typeNameIdentifier,
+    required SimpleIdentifier constructorIdentifier,
+    required ClassElement classElement,
   }) {
     var constructorElement = classElement.getNamedConstructor(
       constructorIdentifier.name,
@@ -171,13 +170,13 @@
   }
 
   InstanceCreationExpression _toInstanceCreation_prefix_type({
-    @required MethodInvocation node,
-    @required SimpleIdentifier prefixIdentifier,
-    @required SimpleIdentifier typeIdentifier,
+    required MethodInvocation node,
+    required SimpleIdentifier prefixIdentifier,
+    required SimpleIdentifier typeIdentifier,
   }) {
     var typeName = astFactory.typeName(
         astFactory.prefixedIdentifier(
-            prefixIdentifier, node.operator, typeIdentifier),
+            prefixIdentifier, node.operator!, typeIdentifier),
         node.typeArguments);
     var constructorName = astFactory.constructorName(typeName, null, null);
     var instanceCreationExpression = astFactory.instanceCreationExpression(
@@ -187,8 +186,8 @@
   }
 
   InstanceCreationExpression _toInstanceCreation_type({
-    @required MethodInvocation node,
-    @required SimpleIdentifier typeIdentifier,
+    required MethodInvocation node,
+    required SimpleIdentifier typeIdentifier,
   }) {
     var typeName = astFactory.typeName(typeIdentifier, node.typeArguments);
     var constructorName = astFactory.constructorName(typeName, null, null);
@@ -199,10 +198,10 @@
   }
 
   AstNode _toInstanceCreation_type_constructor({
-    @required MethodInvocation node,
-    @required SimpleIdentifier typeIdentifier,
-    @required SimpleIdentifier constructorIdentifier,
-    @required ClassElement classElement,
+    required MethodInvocation node,
+    required SimpleIdentifier typeIdentifier,
+    required SimpleIdentifier constructorIdentifier,
+    required ClassElement classElement,
   }) {
     var name = constructorIdentifier.name;
     var constructorElement = classElement.getNamedConstructor(name);
diff --git a/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
index 603b9d1..1c8de42 100644
--- a/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
@@ -17,7 +17,6 @@
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/type_promotion_manager.dart';
-import 'package:meta/meta.dart';
 
 /// Helper for resolving [BinaryExpression]s.
 class BinaryExpressionResolver {
@@ -27,8 +26,8 @@
   final InvocationInferenceHelper _inferenceHelper;
 
   BinaryExpressionResolver({
-    @required ResolverVisitor resolver,
-    @required TypePromotionManager promoteManager,
+    required ResolverVisitor resolver,
+    required TypePromotionManager promoteManager,
   })  : _resolver = resolver,
         _promoteManager = promoteManager,
         _typePropertyResolver = resolver.typePropertyResolver,
@@ -79,15 +78,7 @@
   /// TODO(scheglov) this is duplicate
   void _analyzeLeastUpperBoundTypes(
       Expression node, DartType staticType1, DartType staticType2) {
-    // TODO(brianwilkerson) Determine whether this can still happen.
-    staticType1 ??= DynamicTypeImpl.instance;
-
-    // TODO(brianwilkerson) Determine whether this can still happen.
-    staticType2 ??= DynamicTypeImpl.instance;
-
-    DartType staticType =
-        _typeSystem.getLeastUpperBound(staticType1, staticType2) ??
-            DynamicTypeImpl.instance;
+    var staticType = _typeSystem.getLeastUpperBound(staticType1, staticType2);
 
     staticType = _resolver.toLegacyTypeIfOptOut(staticType);
 
@@ -102,7 +93,7 @@
     );
   }
 
-  void _resolveEqual(BinaryExpressionImpl node, {@required bool notEqual}) {
+  void _resolveEqual(BinaryExpressionImpl node, {required bool notEqual}) {
     var left = node.leftOperand;
     left.accept(_resolver);
     left = node.leftOperand;
@@ -110,7 +101,7 @@
     var flow = _resolver.flowAnalysis?.flow;
     var leftExtensionOverride = left is ExtensionOverride;
     if (!leftExtensionOverride) {
-      flow?.equalityOp_rightBegin(left, left.staticType);
+      flow?.equalityOp_rightBegin(left, left.staticType!);
     }
 
     var right = node.rightOperand;
@@ -118,7 +109,7 @@
     right = node.rightOperand;
 
     if (!leftExtensionOverride) {
-      flow?.equalityOp_end(node, right, right.staticType, notEqual: notEqual);
+      flow?.equalityOp_end(node, right, right.staticType!, notEqual: notEqual);
     }
 
     _resolveUserDefinableElement(
@@ -142,7 +133,7 @@
 
     left.accept(_resolver);
     left = node.leftOperand;
-    var leftType = left.staticType;
+    var leftType = left.staticType!;
 
     var rightContextType = InferenceContext.getContext(node);
     if (rightContextType == null || rightContextType.isDynamic) {
@@ -155,7 +146,7 @@
     right = node.rightOperand;
     flow?.ifNullExpression_end();
 
-    var rightType = right.staticType;
+    var rightType = right.staticType!;
     if (_isNonNullableByDefault) {
       var promotedLeftType = _typeSystem.promoteToNonNull(leftType);
       _analyzeLeastUpperBoundTypes(node, promotedLeftType, rightType);
@@ -183,7 +174,7 @@
       right.accept(_resolver);
       right = node.rightOperand;
 
-      _resolver.nullSafetyDeadCodeVerifier?.flowEnd(right);
+      _resolver.nullSafetyDeadCodeVerifier.flowEnd(right);
       flow?.logicalBinaryOp_end(node, right, isAnd: true);
     } else {
       _promoteManager.visitBinaryExpression_and_rhs(
@@ -220,7 +211,7 @@
     right.accept(_resolver);
     right = node.rightOperand;
 
-    _resolver.nullSafetyDeadCodeVerifier?.flowEnd(right);
+    _resolver.nullSafetyDeadCodeVerifier.flowEnd(right);
     flow?.logicalBinaryOp_end(node, right, isAnd: false);
 
     _checkNonBoolOperand(left, '||');
@@ -234,7 +225,7 @@
   ///
   /// TODO(scheglov) this is duplicate
   DartType _resolveTypeParameter(DartType type) =>
-      type?.resolveToBound(_typeProvider.objectType);
+      type.resolveToBound(_typeProvider.objectType);
 
   void _resolveUnsupportedOperator(BinaryExpressionImpl node) {
     node.leftOperand.accept(_resolver);
@@ -279,8 +270,9 @@
     Expression leftOperand = node.leftOperand;
 
     if (leftOperand is ExtensionOverride) {
-      ExtensionElement extension = leftOperand.extensionName.staticElement;
-      MethodElement member = extension.getMethod(methodName);
+      var extension =
+          leftOperand.extensionName.staticElement as ExtensionElement;
+      var member = extension.getMethod(methodName);
       if (member == null) {
         _errorReporter.reportErrorForToken(
           CompileTimeErrorCode.UNDEFINED_EXTENSION_OPERATOR,
@@ -293,7 +285,7 @@
       return;
     }
 
-    var leftType = leftOperand.staticType;
+    var leftType = leftOperand.staticType!;
     leftType = _resolveTypeParameter(leftType);
 
     if (identical(leftType, NeverTypeImpl.instance)) {
@@ -316,7 +308,7 @@
       nameErrorEntity: node,
     );
 
-    node.staticElement = result.getter;
+    node.staticElement = result.getter as MethodElement?;
     node.staticInvokeType = result.getter?.type;
     if (result.needsGetterError) {
       if (leftOperand is SuperExpression) {
@@ -338,8 +330,13 @@
   void _resolveUserDefinableType(BinaryExpressionImpl node) {
     var leftOperand = node.leftOperand;
 
-    var leftType = leftOperand.staticType;
-    leftType = _resolveTypeParameter(leftType);
+    DartType leftType;
+    if (leftOperand is ExtensionOverride) {
+      leftType = leftOperand.extendedType!;
+    } else {
+      leftType = leftOperand.staticType!;
+      leftType = _resolveTypeParameter(leftType);
+    }
 
     if (identical(leftType, NeverTypeImpl.instance)) {
       _inferenceHelper.recordStaticType(node, NeverTypeImpl.instance);
@@ -352,7 +349,7 @@
       staticType = _typeSystem.refineBinaryExpressionType(
         leftType,
         node.operator.type,
-        node.rightOperand.staticType,
+        node.rightOperand.staticType!,
         staticType,
         node.staticElement,
       );
diff --git a/pkg/analyzer/lib/src/dart/resolver/body_inference_context.dart b/pkg/analyzer/lib/src/dart/resolver/body_inference_context.dart
index b470871..ed9a552 100644
--- a/pkg/analyzer/lib/src/dart/resolver/body_inference_context.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/body_inference_context.dart
@@ -8,7 +8,6 @@
 import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
-import 'package:meta/meta.dart';
 
 class BodyInferenceContext {
   static const _key = 'BodyInferenceContext';
@@ -19,15 +18,15 @@
 
   /// The context type, computed from the imposed return type schema.
   /// Might be `null` if an empty typing context.
-  final DartType contextType;
+  final DartType? contextType;
 
   /// Types of all `return` or `yield` statements in the body.
   final List<DartType> _returnTypes = [];
 
   factory BodyInferenceContext({
-    @required TypeSystemImpl typeSystem,
-    @required FunctionBody node,
-    @required DartType imposedType,
+    required TypeSystemImpl typeSystem,
+    required FunctionBody node,
+    required DartType? imposedType,
   }) {
     var contextType = _contextTypeForImposed(typeSystem, node, imposedType);
 
@@ -43,21 +42,21 @@
   }
 
   BodyInferenceContext._({
-    @required TypeSystemImpl typeSystem,
-    @required bool isAsynchronous,
-    @required bool isGenerator,
-    @required this.contextType,
-  })  : _typeSystem = typeSystem,
+    required TypeSystemImpl typeSystem,
+    required bool isAsynchronous,
+    required bool isGenerator,
+    required this.contextType,
+  })   : _typeSystem = typeSystem,
         _isAsynchronous = isAsynchronous,
         _isGenerator = isGenerator;
 
   TypeProvider get _typeProvider => _typeSystem.typeProvider;
 
-  void addReturnExpression(Expression expression) {
+  void addReturnExpression(Expression? expression) {
     if (expression == null) {
       _returnTypes.add(_typeProvider.nullType);
     } else {
-      var type = expression.staticType;
+      var type = expression.staticType!;
       if (_isAsynchronous) {
         type = _typeSystem.flatten(type);
       }
@@ -66,7 +65,7 @@
   }
 
   void addYield(YieldStatement node) {
-    var expressionType = node.expression.staticType;
+    var expressionType = node.expression.staticType!;
 
     if (node.star == null) {
       _returnTypes.add(expressionType);
@@ -85,7 +84,7 @@
   }
 
   DartType computeInferredReturnType({
-    @required bool endOfBlockIsReachable,
+    required bool endOfBlockIsReachable,
   }) {
     var actualReturnedType = _computeActualReturnedType(
       endOfBlockIsReachable: endOfBlockIsReachable,
@@ -140,7 +139,7 @@
   }
 
   DartType _computeActualReturnedType({
-    @required bool endOfBlockIsReachable,
+    required bool endOfBlockIsReachable,
   }) {
     if (_isGenerator) {
       if (_returnTypes.isEmpty) {
@@ -155,11 +154,11 @@
     return _returnTypes.fold(initialType, _typeSystem.getLeastUpperBound);
   }
 
-  static BodyInferenceContext of(FunctionBody node) {
+  static BodyInferenceContext? of(FunctionBody node) {
     return node.getProperty(_key);
   }
 
-  static DartType _argumentOf(DartType type, ClassElement element) {
+  static DartType? _argumentOf(DartType type, ClassElement element) {
     var elementType = type.asInstanceOf(element);
     if (elementType != null) {
       return elementType.typeArguments[0];
@@ -167,10 +166,10 @@
     return null;
   }
 
-  static DartType _contextTypeForImposed(
+  static DartType? _contextTypeForImposed(
     TypeSystemImpl typeSystem,
     FunctionBody node,
-    DartType imposedType,
+    DartType? imposedType,
   ) {
     if (imposedType == null) {
       return null;
diff --git a/pkg/analyzer/lib/src/dart/resolver/exit_detector.dart b/pkg/analyzer/lib/src/dart/resolver/exit_detector.dart
index 4c10a69..2b66120 100644
--- a/pkg/analyzer/lib/src/dart/resolver/exit_detector.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/exit_detector.dart
@@ -22,7 +22,7 @@
   bool _enclosingBlockContainsContinue = false;
 
   /// Add node when a labelled `break` is encountered.
-  final Set<AstNode> _enclosingBlockBreaksLabel = <AstNode>{};
+  final Set<AstNode?> _enclosingBlockBreaksLabel = <AstNode?>{};
 
   @override
   bool visitArgumentList(ArgumentList node) =>
@@ -116,19 +116,16 @@
 
   @override
   bool visitConditionalExpression(ConditionalExpression node) {
-    Expression conditionExpression = node.condition;
-    Expression thenStatement = node.thenExpression;
-    Expression elseStatement = node.elseExpression;
+    var conditionExpression = node.condition;
+    var thenExpression = node.thenExpression;
+    var elseExpression = node.elseExpression;
     // TODO(jwren) Do we want to take constant expressions into account,
     // evaluate if(false) {} differently than if(<condition>), when <condition>
     // evaluates to a constant false value?
     if (_nodeExits(conditionExpression)) {
       return true;
     }
-    if (thenStatement == null || elseStatement == null) {
-      return false;
-    }
-    return thenStatement.accept(this) && elseStatement.accept(this);
+    return thenExpression.accept(this)! && elseExpression.accept(this)!;
   }
 
   @override
@@ -188,17 +185,16 @@
       ForLoopParts forLoopParts = node.forLoopParts;
       if (forLoopParts is ForParts) {
         if (forLoopParts is ForPartsWithDeclarations) {
-          if (forLoopParts.variables != null &&
-              _visitVariableDeclarations(forLoopParts.variables.variables)) {
+          if (_visitVariableDeclarations(forLoopParts.variables.variables)) {
             return true;
           }
         } else if (forLoopParts is ForPartsWithExpression) {
-          if (forLoopParts.initialization != null &&
-              _nodeExits(forLoopParts.initialization)) {
+          var initialization = forLoopParts.initialization;
+          if (initialization != null && _nodeExits(initialization)) {
             return true;
           }
         }
-        Expression conditionExpression = forLoopParts.condition;
+        var conditionExpression = forLoopParts.condition;
         if (conditionExpression != null && _nodeExits(conditionExpression)) {
           return true;
         }
@@ -248,9 +244,9 @@
         _nodeExits(node.body);
         return iterableExits;
       }
-      VariableDeclarationList variables;
-      Expression initialization;
-      Expression condition;
+      VariableDeclarationList? variables;
+      Expression? initialization;
+      Expression? condition;
       NodeList<Expression> updaters;
       if (parts is ForPartsWithDeclarations) {
         variables = parts.variables;
@@ -260,6 +256,8 @@
         initialization = parts.initialization;
         condition = parts.condition;
         updaters = parts.updaters;
+      } else {
+        throw UnimplementedError();
       }
       if (variables != null &&
           _visitVariableDeclarations(variables.variables)) {
@@ -303,7 +301,7 @@
     if (_nodeExits(node.function)) {
       return true;
     }
-    return node.argumentList.accept(this);
+    return node.argumentList.accept(this)!;
   }
 
   @override
@@ -314,14 +312,14 @@
 
   @override
   bool visitIfElement(IfElement node) {
-    Expression conditionExpression = node.condition;
-    CollectionElement thenElement = node.thenElement;
-    CollectionElement elseElement = node.elseElement;
+    var conditionExpression = node.condition;
+    var thenElement = node.thenElement;
+    var elseElement = node.elseElement;
     if (_nodeExits(conditionExpression)) {
       return true;
     }
 
-    bool conditionValue = _knownConditionValue(conditionExpression);
+    var conditionValue = _knownConditionValue(conditionExpression);
     if (conditionValue == true) {
       return _nodeExits(thenElement);
     } else if (conditionValue == false && elseElement != null) {
@@ -330,7 +328,7 @@
 
     bool thenExits = _nodeExits(thenElement);
     bool elseExits = _nodeExits(elseElement);
-    if (thenElement == null || elseElement == null) {
+    if (elseElement == null) {
       return false;
     }
     return thenExits && elseExits;
@@ -338,14 +336,14 @@
 
   @override
   bool visitIfStatement(IfStatement node) {
-    Expression conditionExpression = node.condition;
-    Statement thenStatement = node.thenStatement;
-    Statement elseStatement = node.elseStatement;
+    var conditionExpression = node.condition;
+    var thenStatement = node.thenStatement;
+    var elseStatement = node.elseStatement;
     if (_nodeExits(conditionExpression)) {
       return true;
     }
 
-    bool conditionValue = _knownConditionValue(conditionExpression);
+    var conditionValue = _knownConditionValue(conditionExpression);
     if (conditionValue == true) {
       return _nodeExits(thenStatement);
     } else if (conditionValue == false && elseStatement != null) {
@@ -354,7 +352,7 @@
 
     bool thenExits = _nodeExits(thenStatement);
     bool elseExits = _nodeExits(elseStatement);
-    if (thenStatement == null || elseStatement == null) {
+    if (elseStatement == null) {
       return false;
     }
     return thenExits && elseExits;
@@ -377,7 +375,7 @@
       _nodeExits(node.argumentList);
 
   @override
-  bool visitIsExpression(IsExpression node) => node.expression.accept(this);
+  bool visitIsExpression(IsExpression node) => node.expression.accept(this)!;
 
   @override
   bool visitLabel(Label node) => false;
@@ -414,16 +412,16 @@
 
   @override
   bool visitMethodInvocation(MethodInvocation node) {
-    Expression target = node.realTarget;
+    var target = node.realTarget;
     if (target != null) {
-      if (target.accept(this)) {
+      if (target.accept(this)!) {
         return true;
       }
       if (node.isNullAware) {
         return false;
       }
     }
-    Element element = node.methodName.staticElement;
+    var element = node.methodName.staticElement;
     if (_elementExits(element)) {
       return true;
     }
@@ -432,7 +430,7 @@
 
   @override
   bool visitNamedExpression(NamedExpression node) =>
-      node.expression.accept(this);
+      node.expression.accept(this)!;
 
   @override
   bool visitNode(AstNode node) {
@@ -442,7 +440,7 @@
 
   @override
   bool visitParenthesizedExpression(ParenthesizedExpression node) =>
-      node.expression.accept(this);
+      node.expression.accept(this)!;
 
   @override
   bool visitPostfixExpression(PostfixExpression node) => false;
@@ -452,11 +450,8 @@
 
   @override
   bool visitPropertyAccess(PropertyAccess node) {
-    Expression target = node.realTarget;
-    if (target != null && target.accept(this)) {
-      return true;
-    }
-    return false;
+    var target = node.realTarget;
+    return target.accept(this)!;
   }
 
   @override
@@ -512,7 +507,7 @@
         // For switch members with no statements, don't visit the children.
         // Otherwise, if there children statements don't exit, mark this as a
         // non-exiting case.
-        if (switchMember.statements.isNotEmpty && !switchMember.accept(this)) {
+        if (switchMember.statements.isNotEmpty && !switchMember.accept(this)!) {
           hasNonExitingCase = true;
         }
       }
@@ -553,9 +548,9 @@
 
   @override
   bool visitVariableDeclaration(VariableDeclaration node) {
-    Expression initializer = node.initializer;
+    var initializer = node.initializer;
     if (initializer != null) {
-      return initializer.accept(this);
+      return initializer.accept(this)!;
     }
     return false;
   }
@@ -568,7 +563,7 @@
   bool visitVariableDeclarationStatement(VariableDeclarationStatement node) {
     NodeList<VariableDeclaration> variables = node.variables.variables;
     for (int i = 0; i < variables.length; i++) {
-      if (variables[i].accept(this)) {
+      if (variables[i].accept(this)!) {
         return true;
       }
     }
@@ -581,7 +576,7 @@
     _enclosingBlockContainsBreak = false;
     try {
       Expression conditionExpression = node.condition;
-      if (conditionExpression.accept(this)) {
+      if (conditionExpression.accept(this)!) {
         return true;
       }
       node.body.accept(this);
@@ -613,7 +608,7 @@
 
   /// If the given [expression] has a known Boolean value, return the known
   /// value, otherwise return `null`.
-  bool _knownConditionValue(Expression conditionExpression) {
+  bool? _knownConditionValue(Expression conditionExpression) {
     // TODO(jwren) Do we want to take all constant expressions into account?
     if (conditionExpression is BooleanLiteral) {
       return conditionExpression.value;
@@ -622,16 +617,16 @@
   }
 
   /// Return `true` if the given [node] exits.
-  bool _nodeExits(AstNode node) {
+  bool _nodeExits(AstNode? node) {
     if (node == null) {
       return false;
     }
-    return node.accept(this);
+    return node.accept(this)!;
   }
 
   bool _visitExpressions(NodeList<Expression> expressions) {
     for (int i = expressions.length - 1; i >= 0; i--) {
-      if (expressions[i].accept(this)) {
+      if (expressions[i].accept(this)!) {
         return true;
       }
     }
@@ -640,7 +635,7 @@
 
   bool _visitStatements(NodeList<Statement> statements) {
     for (int i = 0; i < statements.length; i++) {
-      if (statements[i].accept(this)) {
+      if (statements[i].accept(this)!) {
         return true;
       }
     }
@@ -650,7 +645,7 @@
   bool _visitVariableDeclarations(
       NodeList<VariableDeclaration> variableDeclarations) {
     for (int i = variableDeclarations.length - 1; i >= 0; i--) {
-      if (variableDeclarations[i].accept(this)) {
+      if (variableDeclarations[i].accept(this)!) {
         return true;
       }
     }
@@ -662,7 +657,7 @@
     return ExitDetector()._nodeExits(node);
   }
 
-  static bool _elementExits(Element element) {
+  static bool _elementExits(Element? element) {
     if (element is ExecutableElement) {
       var declaration = element.declaration;
       return declaration.hasAlwaysThrows ||
diff --git a/pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart
index a35cc79..1765615 100644
--- a/pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart
@@ -81,10 +81,10 @@
   ///
   /// The [node] is fully resolved, and its type arguments are set.
   ResolutionResult getOverrideMember(ExtensionOverride node, String name) {
-    ExtensionElement element = node.extensionName.staticElement;
+    var element = node.extensionName.staticElement as ExtensionElement;
 
-    ExecutableElement getter;
-    ExecutableElement setter;
+    ExecutableElement? getter;
+    ExecutableElement? setter;
     if (name == '[]') {
       getter = element.getMethod('[]');
       setter = element.getMethod('[]=');
@@ -99,11 +99,13 @@
 
     var substitution = Substitution.fromPairs(
       element.typeParameters,
-      node.typeArgumentTypes,
+      node.typeArgumentTypes!,
     );
 
-    var getterMember = ExecutableMember.from2(getter, substitution);
-    var setterMember = ExecutableMember.from2(setter, substitution);
+    var getterMember =
+        getter != null ? ExecutableMember.from2(getter, substitution) : null;
+    var setterMember =
+        setter != null ? ExecutableMember.from2(setter, substitution) : null;
 
     getterMember = _resolver.toLegacyElement(getterMember);
     setterMember = _resolver.toLegacyElement(setterMember);
@@ -114,14 +116,16 @@
   /// Perform upward inference for the override.
   void resolveOverride(ExtensionOverride node) {
     var nodeImpl = node as ExtensionOverrideImpl;
-    var element = node.staticElement;
+    var element = node.staticElement!;
     var typeParameters = element.typeParameters;
 
     if (!_isValidContext(node)) {
-      _errorReporter.reportErrorForNode(
-        CompileTimeErrorCode.EXTENSION_OVERRIDE_WITHOUT_ACCESS,
-        node,
-      );
+      if (!_isCascadeTarget(node)) {
+        _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.EXTENSION_OVERRIDE_WITHOUT_ACCESS,
+          node,
+        );
+      }
       nodeImpl.staticType = _dynamicType;
     }
 
@@ -137,13 +141,13 @@
     }
 
     var receiverExpression = arguments[0];
-    var receiverType = receiverExpression.staticType;
+    var receiverType = receiverExpression.staticType!;
 
     if (node.isNullAware) {
       receiverType = _typeSystem.promoteToNonNull(receiverType);
     }
 
-    var typeArgumentTypes = _inferTypeArguments(node, receiverType);
+    var typeArgumentTypes = _inferTypeArguments(node, receiverType)!;
     nodeImpl.typeArgumentTypes = typeArgumentTypes;
 
     var substitution = Substitution.fromPairs(
@@ -163,7 +167,7 @@
     if (receiverType.isVoid) {
       _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.USE_OF_VOID_RESULT, receiverExpression);
-    } else if (!_typeSystem.isAssignableTo2(receiverType, node.extendedType)) {
+    } else if (!_typeSystem.isAssignableTo2(receiverType, node.extendedType!)) {
       _errorReporter.reportErrorForNode(
         CompileTimeErrorCode.EXTENSION_OVERRIDE_ARGUMENT_NOT_ASSIGNABLE,
         receiverExpression,
@@ -177,7 +181,7 @@
   /// The context of the invocation that is made through the override does
   /// not affect the type inference of the override and the receiver.
   void setOverrideReceiverContextType(ExtensionOverride node) {
-    var element = node.staticElement;
+    var element = node.staticElement!;
     var typeParameters = element.typeParameters;
 
     var arguments = node.argumentList.arguments;
@@ -190,7 +194,7 @@
     if (typeArguments != null) {
       var arguments = typeArguments.arguments;
       if (arguments.length == typeParameters.length) {
-        typeArgumentTypes = arguments.map((a) => a.type).toList();
+        typeArgumentTypes = arguments.map((a) => a.type!).toList();
       } else {
         typeArgumentTypes = _listOfDynamic(typeParameters);
       }
@@ -212,7 +216,7 @@
 
   void _checkTypeArgumentsMatchingBounds(
     List<TypeParameterElement> typeParameters,
-    TypeArgumentList typeArgumentList,
+    TypeArgumentList? typeArgumentList,
     List<DartType> typeArgumentTypes,
     Substitution substitution,
   ) {
@@ -236,7 +240,7 @@
 
   /// Return the most specific extension or `null` if no single one can be
   /// identified.
-  _InstantiatedExtension _chooseMostSpecific(
+  _InstantiatedExtension? _chooseMostSpecific(
       List<_InstantiatedExtension> extensions) {
     for (var i = 0; i < extensions.length; i++) {
       var e1 = extensions[i];
@@ -328,8 +332,8 @@
         }
       }
       if (name == '[]') {
-        ExecutableElement getter;
-        ExecutableElement setter;
+        ExecutableElement? getter;
+        ExecutableElement? setter;
         for (var method in extension.methods) {
           if (method.name == '[]') {
             getter = method;
@@ -367,11 +371,11 @@
   /// If the number of explicit type arguments is different than the number
   /// of extension's type parameters, or inference fails, return `dynamic`
   /// for all type parameters.
-  List<DartType> _inferTypeArguments(
+  List<DartType>? _inferTypeArguments(
     ExtensionOverride node,
     DartType receiverType,
   ) {
-    var element = node.staticElement;
+    var element = node.staticElement!;
     var typeParameters = element.typeParameters;
     var typeArguments = node.typeArguments;
 
@@ -381,7 +385,7 @@
         if (typeParameters.isEmpty) {
           return const <DartType>[];
         }
-        return arguments.map((a) => a.type).toList();
+        return arguments.map((a) => a.type!).toList();
       } else {
         _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_EXTENSION,
@@ -461,12 +465,16 @@
     return List<DartType>.filled(parameters.length, _dynamicType);
   }
 
+  static bool _isCascadeTarget(ExtensionOverride node) {
+    var parent = node.parent;
+    return parent is CascadeExpression && parent.target == node;
+  }
+
   /// Return `true` if the extension override [node] is being used as a target
   /// of an operation that might be accessing an instance member.
   static bool _isValidContext(ExtensionOverride node) {
-    AstNode parent = node.parent;
+    var parent = node.parent;
     return parent is BinaryExpression && parent.leftOperand == node ||
-        parent is CascadeExpression && parent.target == node ||
         parent is FunctionExpressionInvocation && parent.function == node ||
         parent is IndexExpression && parent.target == node ||
         parent is MethodInvocation && parent.target == node ||
@@ -477,8 +485,8 @@
 
 class _CandidateExtension {
   final ExtensionElement extension;
-  final ExecutableElement getter;
-  final ExecutableElement setter;
+  final ExecutableElement? getter;
+  final ExecutableElement? setter;
 
   _CandidateExtension(this.extension, {this.getter, this.setter})
       : assert(getter != null || setter != null);
@@ -497,17 +505,19 @@
 
   ExtensionElement get extension => candidate.extension;
 
-  ExecutableElement get getter {
-    if (candidate.getter == null) {
+  ExecutableElement? get getter {
+    var getter = candidate.getter;
+    if (getter == null) {
       return null;
     }
-    return ExecutableMember.from2(candidate.getter, substitution);
+    return ExecutableMember.from2(getter, substitution);
   }
 
-  ExecutableElement get setter {
-    if (candidate.setter == null) {
+  ExecutableElement? get setter {
+    var setter = candidate.setter;
+    if (setter == null) {
       return null;
     }
-    return ExecutableMember.from2(candidate.setter, substitution);
+    return ExecutableMember.from2(setter, substitution);
   }
 }
diff --git a/pkg/analyzer/lib/src/dart/resolver/flow_analysis_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/flow_analysis_visitor.dart
index 1e46e61..4a01f6e 100644
--- a/pkg/analyzer/lib/src/dart/resolver/flow_analysis_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/flow_analysis_visitor.dart
@@ -8,7 +8,6 @@
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/dart/element/type_system.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_system.dart' show TypeSystemImpl;
 import 'package:analyzer/src/generated/migration.dart';
@@ -53,16 +52,16 @@
   final TypeSystemTypeOperations _typeOperations;
 
   /// Precomputed sets of potentially assigned variables.
-  AssignedVariables<AstNode, PromotableElement> assignedVariables;
+  AssignedVariables<AstNode, PromotableElement>? assignedVariables;
 
   /// The result for post-resolution stages of analysis, for testing only.
-  final FlowAnalysisDataForTesting dataForTesting;
+  final FlowAnalysisDataForTesting? dataForTesting;
 
   /// The current flow, when resolving a function body, or `null` otherwise.
-  FlowAnalysis<AstNode, Statement, Expression, PromotableElement, DartType>
+  FlowAnalysis<AstNode, Statement, Expression, PromotableElement, DartType>?
       flow;
 
-  FlowAnalysisHelper(TypeSystem typeSystem, bool retainDataForTesting)
+  FlowAnalysisHelper(TypeSystemImpl typeSystem, bool retainDataForTesting)
       : this._(TypeSystemTypeOperations(typeSystem),
             retainDataForTesting ? FlowAnalysisDataForTesting() : null);
 
@@ -78,14 +77,14 @@
     var expression = node.expression;
     var typeAnnotation = node.type;
 
-    flow.asExpression_end(expression, typeAnnotation.type);
+    flow!.asExpression_end(expression, typeAnnotation.type!);
   }
 
   void assignmentExpression(AssignmentExpression node) {
     if (flow == null) return null;
 
     if (node.operator.type == TokenType.QUESTION_QUESTION_EQ) {
-      flow.ifNullExpression_rightBegin(node.leftHandSide, node.readType);
+      flow!.ifNullExpression_rightBegin(node.leftHandSide, node.readType!);
     }
   }
 
@@ -93,72 +92,76 @@
     if (flow == null) return null;
 
     if (node.operator.type == TokenType.QUESTION_QUESTION_EQ) {
-      flow.ifNullExpression_end();
+      flow!.ifNullExpression_end();
     }
   }
 
   void breakStatement(BreakStatement node) {
     var target = getLabelTarget(node, node.label?.staticElement);
-    flow.handleBreak(target);
+    if (target != null) {
+      flow!.handleBreak(target);
+    }
   }
 
   /// Mark the [node] as unreachable if it is not covered by another node that
   /// is already known to be unreachable.
   void checkUnreachableNode(AstNode node) {
     if (flow == null) return;
-    if (flow.isReachable) return;
+    if (flow!.isReachable) return;
 
     if (dataForTesting != null) {
-      dataForTesting.unreachableNodes.add(node);
+      dataForTesting!.unreachableNodes.add(node);
     }
   }
 
   void continueStatement(ContinueStatement node) {
     var target = getLabelTarget(node, node.label?.staticElement);
-    flow.handleContinue(target);
+    if (target != null) {
+      flow!.handleContinue(target);
+    }
   }
 
   void executableDeclaration_enter(
-      AstNode node, FormalParameterList parameters, bool isClosure) {
+      AstNode node, FormalParameterList? parameters, bool isClosure) {
     if (isClosure) {
-      flow.functionExpression_begin(node);
+      flow!.functionExpression_begin(node);
     }
 
     if (parameters != null) {
       for (var parameter in parameters.parameters) {
-        flow.declare(parameter.declaredElement, true);
+        flow!.declare(parameter.declaredElement!, true);
       }
     }
   }
 
   void executableDeclaration_exit(FunctionBody body, bool isClosure) {
     if (isClosure) {
-      flow.functionExpression_end();
+      flow!.functionExpression_end();
     }
-    if (!flow.isReachable) {
-      dataForTesting?.functionBodiesThatDontComplete?.add(body);
+    if (!flow!.isReachable) {
+      dataForTesting?.functionBodiesThatDontComplete.add(body);
     }
   }
 
-  void for_bodyBegin(AstNode node, Expression condition) {
-    flow.for_bodyBegin(node is Statement ? node : null, condition);
+  void for_bodyBegin(AstNode node, Expression? condition) {
+    flow!.for_bodyBegin(node is Statement ? node : null, condition);
   }
 
   void for_conditionBegin(AstNode node) {
-    flow.for_conditionBegin(node);
+    flow!.for_conditionBegin(node);
   }
 
   bool isDefinitelyAssigned(
     SimpleIdentifier node,
     PromotableElement element,
   ) {
-    var isAssigned = flow.isAssigned(element);
+    var isAssigned = flow!.isAssigned(element);
 
     if (dataForTesting != null) {
       if (isAssigned) {
-        dataForTesting.definitelyAssigned.add(node);
+        dataForTesting!.definitelyAssigned.add(node);
       } else {
-        dataForTesting.notDefinitelyAssigned.add(node);
+        dataForTesting!.notDefinitelyAssigned.add(node);
       }
     }
 
@@ -169,10 +172,10 @@
     SimpleIdentifier node,
     PromotableElement element,
   ) {
-    var isUnassigned = flow.isUnassigned(element);
+    var isUnassigned = flow!.isUnassigned(element);
 
     if (dataForTesting != null && isUnassigned) {
-      dataForTesting.definitelyUnassigned.add(node);
+      dataForTesting!.definitelyUnassigned.add(node);
     }
 
     return isUnassigned;
@@ -184,37 +187,37 @@
     var expression = node.expression;
     var typeAnnotation = node.type;
 
-    flow.isExpression_end(
+    flow!.isExpression_end(
       node,
       expression,
       node.notOperator != null,
-      typeAnnotation.type,
+      typeAnnotation.type!,
     );
   }
 
   void labeledStatement_enter(LabeledStatement node) {
     if (flow == null) return;
 
-    flow.labeledStatement_begin(node);
+    flow!.labeledStatement_begin(node);
   }
 
   void labeledStatement_exit(LabeledStatement node) {
     if (flow == null) return;
 
-    flow.labeledStatement_end();
+    flow!.labeledStatement_end();
   }
 
   void topLevelDeclaration_enter(
-      Declaration node, FormalParameterList parameters, FunctionBody body) {
-    assert(node != null);
+      Declaration node, FormalParameterList? parameters, FunctionBody? body) {
     assert(flow == null);
     assignedVariables = computeAssignedVariables(node, parameters,
         retainDataForTesting: dataForTesting != null);
     if (dataForTesting != null) {
-      dataForTesting.assignedVariables[node] = assignedVariables;
+      dataForTesting!.assignedVariables[node] = assignedVariables
+          as AssignedVariablesForTesting<AstNode, PromotableElement>;
     }
     flow = FlowAnalysis<AstNode, Statement, Expression, PromotableElement,
-        DartType>(_typeOperations, assignedVariables);
+        DartType>(_typeOperations, assignedVariables!);
   }
 
   void topLevelDeclaration_exit() {
@@ -225,7 +228,7 @@
     this.flow = null;
     assignedVariables = null;
 
-    flow.finish();
+    flow!.finish();
   }
 
   void variableDeclarationList(VariableDeclarationList node) {
@@ -233,14 +236,15 @@
       var variables = node.variables;
       for (var i = 0; i < variables.length; ++i) {
         var variable = variables[i];
-        flow.declare(variable.declaredElement, variable.initializer != null);
+        flow!.declare(variable.declaredElement as PromotableElement,
+            variable.initializer != null);
       }
     }
   }
 
   /// Computes the [AssignedVariables] map for the given [node].
   static AssignedVariables<AstNode, PromotableElement> computeAssignedVariables(
-      Declaration node, FormalParameterList parameters,
+      Declaration node, FormalParameterList? parameters,
       {bool retainDataForTesting = false}) {
     AssignedVariables<AstNode, PromotableElement> assignedVariables =
         retainDataForTesting
@@ -256,14 +260,14 @@
   /// Return the target of the `break` or `continue` statement with the
   /// [element] label. The [element] might be `null` (when the statement does
   /// not specify a label), so the default enclosing target is returned.
-  static Statement getLabelTarget(AstNode node, Element element) {
+  static Statement? getLabelTarget(AstNode? node, Element? element) {
     for (; node != null; node = node.parent) {
       if (element == null) {
         if (node is DoStatement ||
             node is ForStatement ||
             node is SwitchStatement ||
             node is WhileStatement) {
-          return node;
+          return node as Statement;
         }
       } else {
         if (node is LabeledStatement) {
@@ -305,12 +309,12 @@
   final MigrationResolutionHooks migrationResolutionHooks;
 
   FlowAnalysisHelperForMigration(
-      TypeSystem typeSystem, this.migrationResolutionHooks)
+      TypeSystemImpl typeSystem, this.migrationResolutionHooks)
       : super(typeSystem, false);
 
   @override
   void topLevelDeclaration_enter(
-      Declaration node, FormalParameterList parameters, FunctionBody body) {
+      Declaration node, FormalParameterList? parameters, FunctionBody? body) {
     super.topLevelDeclaration_enter(node, parameters, body);
     migrationResolutionHooks.setFlowAnalysis(flow);
   }
@@ -365,7 +369,7 @@
   }
 
   @override
-  DartType tryPromoteToType(DartType to, DartType from) {
+  DartType? tryPromoteToType(DartType to, DartType from) {
     return typeSystem.tryPromoteToType(to, from);
   }
 
@@ -390,7 +394,7 @@
 
     if (left is SimpleIdentifier) {
       var element = left.staticElement;
-      if (element is VariableElement) {
+      if (element is PromotableElement) {
         assignedVariables.write(element);
       }
     }
@@ -532,7 +536,7 @@
   @override
   void visitSimpleIdentifier(SimpleIdentifier node) {
     var element = node.staticElement;
-    if (element is VariableElement &&
+    if (element is PromotableElement &&
         node.inGetterContext() &&
         node.parent is! FormalParameter &&
         node.parent is! CatchClause) {
@@ -572,12 +576,12 @@
 
   @override
   void visitVariableDeclaration(VariableDeclaration node) {
-    var grandParent = node.parent.parent;
+    var grandParent = node.parent!.parent;
     if (grandParent is TopLevelVariableDeclaration ||
         grandParent is FieldDeclaration) {
       throw StateError('Should not visit top level declarations');
     }
-    var declaredElement = node.declaredElement;
+    var declaredElement = node.declaredElement as PromotableElement;
     assignedVariables.declare(declaredElement);
     if (declaredElement.isLate && node.initializer != null) {
       assignedVariables.beginNode();
@@ -595,10 +599,10 @@
     assignedVariables.endNode(node);
   }
 
-  void _declareParameters(FormalParameterList parameters) {
+  void _declareParameters(FormalParameterList? parameters) {
     if (parameters == null) return;
     for (var parameter in parameters.parameters) {
-      assignedVariables.declare(parameter.declaredElement);
+      assignedVariables.declare(parameter.declaredElement!);
     }
   }
 
@@ -607,7 +611,7 @@
       if (forLoopParts is ForPartsWithExpression) {
         forLoopParts.initialization?.accept(this);
       } else if (forLoopParts is ForPartsWithDeclarations) {
-        forLoopParts.variables?.accept(this);
+        forLoopParts.variables.accept(this);
       } else {
         throw StateError('Unrecognized for loop parts');
       }
@@ -615,7 +619,7 @@
       assignedVariables.beginNode();
       forLoopParts.condition?.accept(this);
       body.accept(this);
-      forLoopParts.updaters?.accept(this);
+      forLoopParts.updaters.accept(this);
       assignedVariables.endNode(node);
     } else if (forLoopParts is ForEachParts) {
       var iterable = forLoopParts.iterable;
@@ -624,11 +628,11 @@
 
       if (forLoopParts is ForEachPartsWithIdentifier) {
         var element = forLoopParts.identifier.staticElement;
-        if (element is VariableElement) {
+        if (element is PromotableElement) {
           assignedVariables.write(element);
         }
       } else if (forLoopParts is ForEachPartsWithDeclaration) {
-        var variable = forLoopParts.loopVariable.declaredElement;
+        var variable = forLoopParts.loopVariable.declaredElement!;
         assignedVariables.declare(variable);
       } else {
         throw StateError('Unrecognized for loop parts');
diff --git a/pkg/analyzer/lib/src/dart/resolver/for_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/for_resolver.dart
index 5c977b9..d074408 100644
--- a/pkg/analyzer/lib/src/dart/resolver/for_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/for_resolver.dart
@@ -12,14 +12,13 @@
 import 'package:analyzer/src/dart/resolver/assignment_expression_resolver.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/resolver.dart';
-import 'package:meta/meta.dart';
 
 /// Helper for resolving [ForStatement]s and [ForElement]s.
 class ForResolver {
   final ResolverVisitor _resolver;
 
   ForResolver({
-    @required ResolverVisitor resolver,
+    required ResolverVisitor resolver,
   }) : _resolver = resolver;
 
   void resolveElement(ForElementImpl node) {
@@ -46,8 +45,8 @@
   /// a type for the elements being iterated over.  Inference is based
   /// on the type of the iterator or stream over which the foreach loop
   /// is defined.
-  DartType _computeForEachElementType(Expression iterable, bool isAsync) {
-    DartType iterableType = iterable.staticType;
+  DartType? _computeForEachElementType(Expression iterable, bool isAsync) {
+    var iterableType = iterable.staticType;
     if (iterableType == null) return null;
     iterableType =
         iterableType.resolveToBound(_resolver.typeProvider.objectType);
@@ -56,7 +55,7 @@
         ? _resolver.typeProvider.streamElement
         : _resolver.typeProvider.iterableElement;
 
-    InterfaceType iteratedType = iterableType.asInstanceOf(iteratedElement);
+    var iteratedType = iterableType.asInstanceOf(iteratedElement);
 
     if (iteratedType != null) {
       var elementType = iteratedType.typeArguments.single;
@@ -74,23 +73,23 @@
     AstNode body,
   ) {
     Expression iterable = forEachParts.iterable;
-    DeclaredIdentifier loopVariable;
-    SimpleIdentifier identifier;
-    Element identifierElement;
+    DeclaredIdentifier? loopVariable;
+    SimpleIdentifier? identifier;
+    Element? identifierElement;
     if (forEachParts is ForEachPartsWithDeclaration) {
       loopVariable = forEachParts.loopVariable;
     } else if (forEachParts is ForEachPartsWithIdentifier) {
       identifier = forEachParts.identifier;
       // TODO(scheglov) replace with lexical lookup
-      identifier?.accept(_resolver);
+      identifier.accept(_resolver);
       AssignmentExpressionShared(
         resolver: _resolver,
       ).checkFinalAlreadyAssigned(identifier);
     }
 
-    DartType valueType;
+    DartType? valueType;
     if (loopVariable != null) {
-      TypeAnnotation typeAnnotation = loopVariable.type;
+      var typeAnnotation = loopVariable.type;
       valueType = typeAnnotation?.type ?? UnknownInferredType.instance;
     }
     if (identifier != null) {
@@ -111,7 +110,7 @@
       InferenceContext.setType(iterable, targetType);
     }
 
-    iterable?.accept(_resolver);
+    iterable.accept(_resolver);
     iterable = forEachParts.iterable;
 
     _resolver.nullableDereferenceVerifier.expression(iterable,
@@ -129,12 +128,13 @@
     }
 
     if (loopVariable != null) {
-      _resolver.flowAnalysis?.flow?.declare(loopVariable.declaredElement, true);
+      _resolver.flowAnalysis?.flow
+          ?.declare(loopVariable.declaredElement!, true);
     }
 
     _resolver.flowAnalysis?.flow?.forEach_bodyBegin(
       node,
-      identifierElement is VariableElement
+      identifierElement is PromotableElement
           ? identifierElement
           : loopVariable?.declaredElement,
       elementType ?? DynamicTypeImpl.instance,
@@ -147,7 +147,7 @@
 
   void _forParts(AstNode node, ForParts forParts, AstNode body) {
     if (forParts is ForPartsWithDeclarations) {
-      forParts.variables?.accept(_resolver);
+      forParts.variables.accept(_resolver);
     } else if (forParts is ForPartsWithExpression) {
       forParts.initialization?.accept(_resolver);
     }
@@ -158,7 +158,7 @@
     if (condition != null) {
       InferenceContext.setType(condition, _resolver.typeProvider.boolType);
       condition.accept(_resolver);
-      condition = forParts.condition;
+      condition = forParts.condition!;
       _resolver.boolExpressionVerifier.checkForNonBoolCondition(condition);
     }
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/function_expression_invocation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/function_expression_invocation_resolver.dart
index 28cd2ec..a85d35e 100644
--- a/pkg/analyzer/lib/src/dart/resolver/function_expression_invocation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/function_expression_invocation_resolver.dart
@@ -14,7 +14,6 @@
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/error/nullable_dereference_verifier.dart';
 import 'package:analyzer/src/generated/resolver.dart';
-import 'package:meta/meta.dart';
 
 /// Helper for resolving [FunctionExpressionInvocation]s.
 class FunctionExpressionInvocationResolver {
@@ -23,8 +22,8 @@
   final InvocationInferenceHelper _inferenceHelper;
 
   FunctionExpressionInvocationResolver({
-    @required ResolverVisitor resolver,
-  })  : _resolver = resolver,
+    required ResolverVisitor resolver,
+  })   : _resolver = resolver,
         _typePropertyResolver = resolver.typePropertyResolver,
         _inferenceHelper = resolver.inferenceHelper;
 
@@ -82,7 +81,7 @@
   }
 
   void _resolveReceiverExtensionOverride(
-    FunctionExpressionInvocation node,
+    FunctionExpressionInvocationImpl node,
     ExtensionOverride function,
   ) {
     var result = _extensionResolver.getOverrideMember(
@@ -126,7 +125,7 @@
     );
     var callElement = result.getter;
 
-    if (callElement?.kind != ElementKind.METHOD) {
+    if (callElement == null || callElement.kind != ElementKind.METHOD) {
       _unresolved(node, DynamicTypeImpl.instance);
       return;
     }
@@ -150,7 +149,7 @@
     var typeArguments = node.typeArguments;
     if (typeArguments != null) {
       node.typeArgumentTypes = typeArguments.arguments
-          .map((typeArgument) => typeArgument.type)
+          .map((typeArgument) => typeArgument.type!)
           .toList();
     } else {
       node.typeArgumentTypes = const <DartType>[];
diff --git a/pkg/analyzer/lib/src/dart/resolver/function_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/function_expression_resolver.dart
index cc7c606..830360d 100644
--- a/pkg/analyzer/lib/src/dart/resolver/function_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/function_expression_resolver.dart
@@ -13,18 +13,18 @@
 import 'package:analyzer/src/generated/migration.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/type_promotion_manager.dart';
-import 'package:meta/meta.dart';
+import 'package:collection/collection.dart';
 
 class FunctionExpressionResolver {
   final ResolverVisitor _resolver;
-  final MigrationResolutionHooks _migrationResolutionHooks;
+  final MigrationResolutionHooks? _migrationResolutionHooks;
   final InvocationInferenceHelper _inferenceHelper;
   final TypePromotionManager _promoteManager;
 
   FunctionExpressionResolver({
-    @required ResolverVisitor resolver,
-    @required MigrationResolutionHooks migrationResolutionHooks,
-    @required TypePromotionManager promoteManager,
+    required ResolverVisitor resolver,
+    required MigrationResolutionHooks? migrationResolutionHooks,
+    required TypePromotionManager promoteManager,
   })  : _resolver = resolver,
         _migrationResolutionHooks = migrationResolutionHooks,
         _inferenceHelper = resolver.inferenceHelper,
@@ -36,11 +36,11 @@
 
   void resolve(FunctionExpression node) {
     var isFunctionDeclaration = node.parent is FunctionDeclaration;
-    var body = node.body;
+    var body = node.body!;
 
     if (_resolver.flowAnalysis != null) {
-      if (_resolver.flowAnalysis.flow != null && !isFunctionDeclaration) {
-        _resolver.flowAnalysis
+      if (_resolver.flowAnalysis!.flow != null && !isFunctionDeclaration) {
+        _resolver.flowAnalysis!
             .executableDeclaration_enter(node, node.parameters, true);
       }
     } else {
@@ -63,15 +63,15 @@
     _resolve2(node);
 
     if (_resolver.flowAnalysis != null) {
-      if (_resolver.flowAnalysis.flow != null && !isFunctionDeclaration) {
-        var bodyContext = BodyInferenceContext.of(node.body);
+      if (_resolver.flowAnalysis!.flow != null && !isFunctionDeclaration) {
+        var bodyContext = BodyInferenceContext.of(node.body!);
         _resolver.checkForBodyMayCompleteNormally(
           returnType: bodyContext?.contextType,
           body: body,
           errorNode: body,
         );
-        _resolver.flowAnalysis.flow?.functionExpression_end();
-        _resolver.nullSafetyDeadCodeVerifier?.flowEnd(node);
+        _resolver.flowAnalysis!.flow?.functionExpression_end();
+        _resolver.nullSafetyDeadCodeVerifier.flowEnd(node);
       }
     } else {
       _promoteManager.exitFunctionBody();
@@ -80,7 +80,7 @@
 
   /// Infer types of implicitly typed formal parameters.
   void _inferFormalParameters(
-    FormalParameterList node,
+    FormalParameterList? node,
     FunctionType contextType,
   ) {
     if (node == null) {
@@ -90,7 +90,7 @@
     void inferType(ParameterElementImpl p, DartType inferredType) {
       // Check that there is no declared type, and that we have not already
       // inferred a type in some fashion.
-      if (p.hasImplicitType && (p.type == null || p.type.isDynamic)) {
+      if (p.hasImplicitType && p.type.isDynamic) {
         // If no type is declared for a parameter and there is a
         // corresponding parameter in the context type schema with type
         // schema `K`, the parameter is given an inferred type `T` where `T`
@@ -105,8 +105,8 @@
               : _typeSystem.objectStar;
         }
         if (_migrationResolutionHooks != null) {
-          inferredType = _migrationResolutionHooks.modifyInferredParameterType(
-              p, inferredType);
+          inferredType = _migrationResolutionHooks!
+              .modifyInferredParameterType(p, inferredType);
         } else {
           inferredType = _typeSystem.nonNullifyLegacy(inferredType);
         }
@@ -116,14 +116,15 @@
       }
     }
 
-    List<ParameterElement> parameters = node.parameterElements;
+    var parameters = node.parameterElements.whereNotNull();
     {
       Iterator<ParameterElement> positional =
           parameters.where((p) => p.isPositional).iterator;
       Iterator<ParameterElement> fnPositional =
           contextType.parameters.where((p) => p.isPositional).iterator;
       while (positional.moveNext() && fnPositional.moveNext()) {
-        inferType(positional.current, fnPositional.current.type);
+        inferType(positional.current as ParameterElementImpl,
+            fnPositional.current.type);
       }
     }
 
@@ -131,11 +132,11 @@
       Map<String, DartType> namedParameterTypes =
           contextType.namedParameterTypes;
       Iterable<ParameterElement> named = parameters.where((p) => p.isNamed);
-      for (ParameterElementImpl p in named) {
+      for (var p in named) {
         if (!namedParameterTypes.containsKey(p.name)) {
           continue;
         }
-        inferType(p, namedParameterTypes[p.name]);
+        inferType(p as ParameterElementImpl, namedParameterTypes[p.name]!);
       }
     }
   }
@@ -143,7 +144,7 @@
   /// Infers the return type of a local function, either a lambda or
   /// (in strong mode) a local function declaration.
   DartType _inferLocalFunctionReturnType(FunctionExpression node) {
-    FunctionBody body = node.body;
+    var body = node.body;
     return InferenceContext.getContext(body) ?? DynamicTypeImpl.instance;
   }
 
@@ -152,8 +153,8 @@
   ///
   /// Return `null` is the number of element in [typeParameterList] is not
   /// the same as the number of type parameters in the [type].
-  FunctionType _matchTypeParameters(
-      TypeParameterList typeParameterList, FunctionType type) {
+  FunctionType? _matchTypeParameters(
+      TypeParameterList? typeParameterList, FunctionType type) {
     if (typeParameterList == null) {
       if (type.typeFormals.isEmpty) {
         return type;
@@ -167,7 +168,7 @@
     }
 
     return type.instantiate(typeParameters.map((typeParameter) {
-      return typeParameter.declaredElement.instantiate(
+      return typeParameter.declaredElement!.instantiate(
         nullabilitySuffix: _resolver.noneOrStarSuffix,
       );
     }).toList());
@@ -188,7 +189,7 @@
     var parent = node.parent;
     if (parent is FunctionDeclaration) {
       // Local function without declared return type.
-      return node.parent.parent is FunctionDeclarationStatement &&
+      return parent.parent is FunctionDeclarationStatement &&
           parent.returnType == null;
     } else {
       // Pure function expression.
diff --git a/pkg/analyzer/lib/src/dart/resolver/invocation_inference_helper.dart b/pkg/analyzer/lib/src/dart/resolver/invocation_inference_helper.dart
index e5edabb..0215f6e 100644
--- a/pkg/analyzer/lib/src/dart/resolver/invocation_inference_helper.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/invocation_inference_helper.dart
@@ -13,22 +13,21 @@
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/migration.dart';
 import 'package:analyzer/src/generated/resolver.dart';
-import 'package:meta/meta.dart';
 
 class InvocationInferenceHelper {
   final ResolverVisitor _resolver;
   final ErrorReporter _errorReporter;
   final TypeSystemImpl _typeSystem;
-  final MigrationResolutionHooks _migrationResolutionHooks;
+  final MigrationResolutionHooks? _migrationResolutionHooks;
 
-  List<DartType> _typeArgumentTypes;
-  FunctionType _invokeType;
+  List<DartType>? _typeArgumentTypes;
+  FunctionType? _invokeType;
 
   InvocationInferenceHelper(
-      {@required ResolverVisitor resolver,
-      @required ErrorReporter errorReporter,
-      @required TypeSystemImpl typeSystem,
-      @required MigrationResolutionHooks migrationResolutionHooks})
+      {required ResolverVisitor resolver,
+      required ErrorReporter errorReporter,
+      required TypeSystemImpl typeSystem,
+      required MigrationResolutionHooks? migrationResolutionHooks})
       : _resolver = resolver,
         _errorReporter = errorReporter,
         _typeSystem = typeSystem,
@@ -36,7 +35,7 @@
 
   /// Compute the return type of the method or function represented by the given
   /// type that is being invoked.
-  DartType computeInvokeReturnType(DartType type) {
+  DartType computeInvokeReturnType(DartType? type) {
     if (type is FunctionType) {
       return type.returnType;
     } else {
@@ -44,9 +43,9 @@
     }
   }
 
-  FunctionType inferArgumentTypesForGeneric(AstNode inferenceNode,
-      DartType uninstantiatedType, TypeArgumentList typeArguments,
-      {AstNode errorNode, bool isConst = false}) {
+  FunctionType? inferArgumentTypesForGeneric(AstNode inferenceNode,
+      DartType? uninstantiatedType, TypeArgumentList? typeArguments,
+      {AstNode? errorNode, bool isConst = false}) {
     errorNode ??= inferenceNode;
     uninstantiatedType = _getFreshType(uninstantiatedType);
     if (typeArguments == null &&
@@ -72,10 +71,9 @@
 
   void inferArgumentTypesForInvocation(
     InvocationExpression node,
-    DartType type,
+    DartType? type,
   ) {
-    DartType inferred =
-        inferArgumentTypesForGeneric(node, type, node.typeArguments);
+    var inferred = inferArgumentTypesForGeneric(node, type, node.typeArguments);
     InferenceContext.setType(
         node.argumentList, inferred ?? node.staticInvokeType);
   }
@@ -87,12 +85,12 @@
   /// the argument types.
   void inferGenericInvocationExpression(
     InvocationExpression node,
-    DartType type,
+    DartType? type,
   ) {
     ArgumentList arguments = node.argumentList;
     var freshType = _getFreshType(type);
 
-    FunctionType inferred = inferGenericInvoke(
+    var inferred = inferGenericInvoke(
         node, freshType, node.typeArguments, arguments, node.function);
     if (inferred != null && inferred != node.staticInvokeType) {
       // Fix up the parameter elements based on inferred method.
@@ -109,10 +107,10 @@
   ///
   /// This takes into account both the context type, as well as information from
   /// the argument types.
-  FunctionType inferGenericInvoke(
+  FunctionType? inferGenericInvoke(
       Expression node,
-      DartType fnType,
-      TypeArgumentList typeArguments,
+      DartType? fnType,
+      TypeArgumentList? typeArguments,
       ArgumentList argumentList,
       AstNode errorNode,
       {bool isConst = false}) {
@@ -120,7 +118,7 @@
         fnType is FunctionType &&
         fnType.typeFormals.isNotEmpty) {
       // Get the parameters that correspond to the uninstantiated generic.
-      List<DartType> typeArgs = _inferUpwards(
+      var typeArgs = _inferUpwards(
         rawType: fnType,
         argumentList: argumentList,
         contextType: InferenceContext.getContext(node),
@@ -140,7 +138,7 @@
     // for FunctionExpressionInvocation(s), so set it here, if not inferred.
     if (node is FunctionExpressionInvocationImpl) {
       if (typeArguments != null) {
-        var typeArgs = typeArguments.arguments.map((n) => n.type).toList();
+        var typeArgs = typeArguments.arguments.map((n) => n.type!).toList();
         node.typeArgumentTypes = typeArgs;
       } else {
         node.typeArgumentTypes = const <DartType>[];
@@ -165,7 +163,7 @@
         tearOffType,
         errorReporter: _resolver.errorReporter,
         errorNode: expression,
-      );
+      )!;
       (identifier as SimpleIdentifierImpl).tearOffTypeArgumentTypes =
           typeArguments;
       if (typeArguments.isNotEmpty) {
@@ -182,22 +180,14 @@
   ///
   /// TODO(scheglov) this is duplication
   void recordStaticType(Expression expression, DartType type) {
-    if (_migrationResolutionHooks != null) {
-      // TODO(scheglov) type cannot be null
-      type = _migrationResolutionHooks.modifyExpressionType(
-        expression,
-        type ?? DynamicTypeImpl.instance,
-      );
+    var hooks = _migrationResolutionHooks;
+    if (hooks != null) {
+      type = hooks.modifyExpressionType(expression, type);
     }
 
-    // TODO(scheglov) type cannot be null
-    if (type == null) {
-      expression.staticType = DynamicTypeImpl.instance;
-    } else {
-      expression.staticType = type;
-      if (_typeSystem.isBottom(type)) {
-        _resolver.flowAnalysis?.flow?.handleExit();
-      }
+    expression.staticType = type;
+    if (_typeSystem.isBottom(type)) {
+      _resolver.flowAnalysis?.flow?.handleExit();
     }
   }
 
@@ -207,8 +197,8 @@
   /// is its not yet instantiated type. Here we perform downwards inference,
   /// resolution of arguments, and upwards inference.
   void resolveFunctionExpressionInvocation({
-    @required FunctionExpressionInvocationImpl node,
-    @required FunctionType rawType,
+    required FunctionExpressionInvocationImpl node,
+    required FunctionType rawType,
   }) {
     _resolveInvocation(
       rawType: rawType,
@@ -229,8 +219,8 @@
   /// is its not yet instantiated type. Here we perform downwards inference,
   /// resolution of arguments, and upwards inference.
   void resolveMethodInvocation({
-    @required MethodInvocationImpl node,
-    @required FunctionType rawType,
+    required MethodInvocationImpl node,
+    required FunctionType rawType,
   }) {
     _resolveInvocation(
       rawType: rawType,
@@ -244,19 +234,26 @@
     node.typeArgumentTypes = _typeArgumentTypes;
     node.staticInvokeType = _invokeType;
 
-    var returnType = _typeSystem.refineNumericInvocationType(
-        node.realTarget?.staticType,
+    var returnType = computeInvokeReturnType(_invokeType);
+    var targetType = node.realTarget?.staticType;
+    if (targetType != null) {
+      returnType = _typeSystem.refineNumericInvocationType(
+        targetType,
         node.methodName.staticElement,
-        [for (var argument in node.argumentList.arguments) argument.staticType],
-        computeInvokeReturnType(_invokeType));
+        [
+          for (var argument in node.argumentList.arguments) argument.staticType!
+        ],
+        returnType,
+      );
+    }
     recordStaticType(node, returnType);
   }
 
-  List<DartType> _inferDownwards({
-    @required FunctionType rawType,
-    @required DartType contextType,
-    @required bool isConst,
-    @required AstNode errorNode,
+  List<DartType>? _inferDownwards({
+    required FunctionType rawType,
+    required DartType? contextType,
+    required bool isConst,
+    required AstNode errorNode,
   }) {
     return _typeSystem.inferGenericFunctionOrType(
       typeParameters: rawType.typeFormals,
@@ -272,27 +269,27 @@
   }
 
   /// TODO(scheglov) Instead of [isConst] sanitize [contextType] before calling.
-  List<DartType> _inferUpwards({
-    @required FunctionType rawType,
-    @required DartType contextType,
-    @required ArgumentList argumentList,
-    @required bool isConst,
-    @required AstNode errorNode,
+  List<DartType>? _inferUpwards({
+    required FunctionType rawType,
+    required DartType? contextType,
+    required ArgumentList argumentList,
+    required bool isConst,
+    required AstNode errorNode,
   }) {
-    rawType = _getFreshType(rawType);
+    rawType = _getFreshType(rawType) as FunctionType;
 
     // Get the parameters that correspond to the uninstantiated generic.
-    List<ParameterElement> rawParameters =
+    List<ParameterElement?> rawParameters =
         ResolverVisitor.resolveArgumentsToParameters(
             argumentList, rawType.parameters, null);
 
     List<ParameterElement> params = <ParameterElement>[];
     List<DartType> argTypes = <DartType>[];
     for (int i = 0, length = rawParameters.length; i < length; i++) {
-      ParameterElement parameter = rawParameters[i];
+      ParameterElement? parameter = rawParameters[i];
       if (parameter != null) {
         params.add(parameter);
-        argTypes.add(argumentList.arguments[i].staticType);
+        argTypes.add(argumentList.arguments[i].staticType!);
       }
     }
     var typeArgs = _typeSystem.inferGenericFunctionOrType(
@@ -308,12 +305,12 @@
     return typeArgs;
   }
 
-  bool _isCallToIdentical(AstNode invocation) {
+  bool _isCallToIdentical(AstNode? invocation) {
     if (invocation is MethodInvocation) {
       var invokedMethod = invocation.methodName.staticElement;
       return invokedMethod != null &&
           invokedMethod.name == 'identical' &&
-          invokedMethod.library.isDartCore;
+          invokedMethod.library!.isDartCore;
     }
     return false;
   }
@@ -324,12 +321,12 @@
   }
 
   void _resolveInvocation({
-    @required FunctionType rawType,
-    @required DartType contextType,
-    @required TypeArgumentList typeArgumentList,
-    @required ArgumentList argumentList,
-    @required bool isConst,
-    @required AstNode errorNode,
+    required FunctionType rawType,
+    required DartType? contextType,
+    required TypeArgumentList? typeArgumentList,
+    required ArgumentList argumentList,
+    required bool isConst,
+    required AstNode errorNode,
   }) {
     if (typeArgumentList != null) {
       _resolveInvocationWithTypeArguments(
@@ -346,15 +343,15 @@
         errorNode: errorNode,
       );
     }
-    _setCorrespondingParameters(argumentList, _invokeType);
+    _setCorrespondingParameters(argumentList, _invokeType!);
   }
 
   void _resolveInvocationWithoutTypeArguments({
-    @required FunctionType rawType,
-    @required DartType contextType,
-    @required ArgumentList argumentList,
-    @required bool isConst,
-    @required AstNode errorNode,
+    required FunctionType rawType,
+    required DartType? contextType,
+    required ArgumentList argumentList,
+    required bool isConst,
+    required AstNode errorNode,
   }) {
     var typeParameters = rawType.typeFormals;
 
@@ -365,14 +362,14 @@
       _typeArgumentTypes = const <DartType>[];
       _invokeType = rawType;
     } else {
-      rawType = _getFreshType(rawType);
+      rawType = _getFreshType(rawType) as FunctionType;
 
-      List<DartType> downwardsTypeArguments = _inferDownwards(
+      var downwardsTypeArguments = _inferDownwards(
         rawType: rawType,
         contextType: contextType,
         isConst: isConst,
         errorNode: errorNode,
-      );
+      )!;
 
       var downwardsInvokeType = rawType.instantiate(downwardsTypeArguments);
       InferenceContext.setType(argumentList, downwardsInvokeType);
@@ -386,14 +383,14 @@
         isConst: isConst,
         errorNode: errorNode,
       );
-      _invokeType = rawType.instantiate(_typeArgumentTypes);
+      _invokeType = rawType.instantiate(_typeArgumentTypes!);
     }
   }
 
   void _resolveInvocationWithTypeArguments({
-    FunctionType rawType,
-    TypeArgumentList typeArgumentList,
-    ArgumentList argumentList,
+    required FunctionType rawType,
+    required TypeArgumentList typeArgumentList,
+    required ArgumentList argumentList,
   }) {
     var typeParameters = rawType.typeFormals;
 
@@ -414,7 +411,7 @@
       );
     } else {
       typeArguments = typeArgumentList.arguments
-          .map((typeArgument) => typeArgument.type)
+          .map((typeArgument) => typeArgument.type!)
           .toList(growable: true);
     }
 
@@ -439,7 +436,7 @@
     argumentList.correspondingStaticParameters = parameters;
   }
 
-  static DartType _getFreshType(DartType type) {
+  static DartType? _getFreshType(DartType? type) {
     if (type is FunctionType) {
       var parameters = getFreshTypeParameters(type.typeFormals);
       return parameters.applyToFunctionType(type);
diff --git a/pkg/analyzer/lib/src/dart/resolver/legacy_type_asserter.dart b/pkg/analyzer/lib/src/dart/resolver/legacy_type_asserter.dart
index 6942809..77ca27a 100644
--- a/pkg/analyzer/lib/src/dart/resolver/legacy_type_asserter.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/legacy_type_asserter.dart
@@ -52,7 +52,7 @@
   void visitClassMember(ClassMember node) {
     final element = node.declaredElement;
     if (element is ExecutableElement) {
-      _assertLegacyType(element?.type);
+      _assertLegacyType(element.type);
     }
     super.visitClassMember(node);
   }
@@ -114,7 +114,7 @@
     super.visitVariableDeclaration(node);
   }
 
-  void _assertLegacyElement(Element element) {
+  void _assertLegacyElement(Element? element) {
     if (element is ExecutableElement) {
       _assertLegacyType(element.type);
     } else if (element is VariableElement) {
@@ -122,7 +122,7 @@
     }
   }
 
-  void _assertLegacyType(DartType type) {
+  void _assertLegacyType(DartType? type) {
     if (type == null) {
       return;
     }
diff --git a/pkg/analyzer/lib/src/dart/resolver/lexical_lookup.dart b/pkg/analyzer/lib/src/dart/resolver/lexical_lookup.dart
index 6417634..f9256ea 100644
--- a/pkg/analyzer/lib/src/dart/resolver/lexical_lookup.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/lexical_lookup.dart
@@ -6,7 +6,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/extensions.dart';
 import 'package:analyzer/src/generated/resolver.dart';
-import 'package:meta/meta.dart';
 
 class LexicalLookup {
   final ResolverVisitor _resolver;
@@ -14,8 +13,8 @@
   LexicalLookup(this._resolver);
 
   LexicalLookupResult perform({
-    @required SimpleIdentifier node,
-    @required bool setter,
+    required SimpleIdentifier node,
+    required bool setter,
   }) {
     var id = node.name;
     var scopeResult = _resolver.nameScope.lookup(id);
@@ -31,7 +30,7 @@
             requested: _resolver.toLegacyElement(scopeSetter),
           );
         }
-        if (!scopeGetter.isInstanceMember) {
+        if (!scopeGetter!.isInstanceMember) {
           return LexicalLookupResult(
             recovery: _resolver.toLegacyElement(scopeGetter),
           );
@@ -90,8 +89,8 @@
 }
 
 class LexicalLookupResult {
-  final Element requested;
-  final Element recovery;
+  final Element? requested;
+  final Element? recovery;
 
   LexicalLookupResult({this.requested, this.recovery});
 }
diff --git a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
index a3349c3..58e5bf1 100644
--- a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
@@ -20,7 +20,6 @@
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/super_context.dart';
 import 'package:analyzer/src/generated/variable_type_provider.dart';
-import 'package:meta/meta.dart';
 
 class MethodInvocationResolver {
   /// Resolver visitor is separated from the elements resolver, which calls
@@ -58,16 +57,16 @@
   final MigratableAstInfoProvider _migratableAstInfoProvider;
 
   /// The invocation being resolved.
-  MethodInvocationImpl _invocation;
+  MethodInvocationImpl? _invocation;
 
   /// The [Name] object of the invocation being resolved by [resolve].
-  Name _currentName;
+  Name? _currentName;
 
   MethodInvocationResolver(
     this._resolver,
     this._migratableAstInfoProvider, {
-    @required InvocationInferenceHelper inferenceHelper,
-  })  : _typeType = _resolver.typeProvider.typeType,
+    required InvocationInferenceHelper inferenceHelper,
+  })   : _typeType = _resolver.typeProvider.typeType,
         _inheritance = _resolver.inheritance,
         _definingLibrary = _resolver.definingLibrary,
         _definingLibraryUri = _resolver.definingLibrary.source.uri,
@@ -80,14 +79,14 @@
 
   TypeSystemImpl get _typeSystem => _resolver.typeSystem;
 
-  void resolve(MethodInvocation node) {
+  void resolve(MethodInvocationImpl node) {
     _invocation = node;
 
     SimpleIdentifier nameNode = node.methodName;
     String name = nameNode.name;
     _currentName = Name(_definingLibraryUri, name);
 
-    Expression receiver = node.realTarget;
+    var receiver = node.realTarget;
 
     if (receiver == null) {
       _resolveReceiverNull(node, nameNode, name);
@@ -142,7 +141,7 @@
       }
     }
 
-    DartType receiverType = receiver.staticType;
+    DartType receiverType = receiver.staticType!;
 
     if (_typeSystem.isDynamicBounded(receiverType)) {
       _resolveReceiverDynamicBounded(node);
@@ -246,8 +245,8 @@
 
   void _reportUndefinedFunction(
     MethodInvocation node, {
-    @required String prefix,
-    @required String name,
+    required String? prefix,
+    required String name,
   }) {
     _setDynamicResolution(node);
 
@@ -308,11 +307,11 @@
 
   /// Given that we are accessing a property of the given [classElement] with the
   /// given [propertyName], return the element that represents the property.
-  Element _resolveElement(
+  Element? _resolveElement(
       ClassElement classElement, SimpleIdentifier propertyName) {
     // TODO(scheglov) Replace with class hierarchy.
     String name = propertyName.name;
-    Element element;
+    Element? element;
     if (propertyName.inSetterContext()) {
       element = classElement.getSetter(name);
     }
@@ -362,7 +361,7 @@
       _resolver.errorReporter.reportErrorForNode(
         CompileTimeErrorCode.UNDEFINED_EXTENSION_METHOD,
         nameNode,
-        [name, override.staticElement.name],
+        [name, override.staticElement!.name],
       );
       return;
     }
@@ -528,9 +527,9 @@
 
     DartType receiverType;
     if (_resolver.enclosingClass != null) {
-      receiverType = _resolver.enclosingClass.thisType;
+      receiverType = _resolver.enclosingClass!.thisType;
     } else if (_resolver.enclosingExtension != null) {
-      receiverType = _resolver.enclosingExtension.extendedType;
+      receiverType = _resolver.enclosingExtension!.extendedType;
     } else {
       return _reportUndefinedFunction(
         node,
@@ -561,7 +560,7 @@
         element = _resolver.toLegacyElement(element);
         if (element is ExecutableElement) {
           nameNode.staticElement = element;
-          return _setResolution(node, element.type);
+          return _setResolution(node, (element as ExecutableElement).type);
         }
       }
     }
@@ -599,8 +598,8 @@
     }
 
     var target = _inheritance.getMember2(
-      enclosingClass,
-      _currentName,
+      enclosingClass!,
+      _currentName!,
       forSuper: true,
     );
     target = _resolver.toLegacyElement(target);
@@ -618,7 +617,7 @@
     // Otherwise, this is an error.
     // But we would like to give the user at least some resolution.
     // So, we try to find the interface target.
-    target = _inheritance.getInherited2(enclosingClass, _currentName);
+    target = _inheritance.getInherited2(enclosingClass, _currentName!);
     if (target != null) {
       nameNode.staticElement = target;
       _setResolution(node, target.type);
@@ -639,12 +638,12 @@
   }
 
   void _resolveReceiverType({
-    @required MethodInvocation node,
-    @required Expression receiver,
-    @required DartType receiverType,
-    @required SimpleIdentifier nameNode,
-    @required String name,
-    @required Expression receiverErrorNode,
+    required MethodInvocation node,
+    required Expression? receiver,
+    required DartType receiverType,
+    required SimpleIdentifier nameNode,
+    required String name,
+    required Expression receiverErrorNode,
   }) {
     var result = _resolver.typePropertyResolver.resolve(
       receiver: receiver,
@@ -701,7 +700,7 @@
     }
 
     var element = _resolveElement(receiver, nameNode);
-    element = _resolver.toLegacyElement(element);
+    element = _resolver.toLegacyElement(element) as ExecutableElement?;
     if (element != null) {
       if (element is ExecutableElement) {
         nameNode.staticElement = element;
@@ -748,13 +747,13 @@
       if (target is SimpleIdentifier && target.staticElement is PrefixElement) {
         functionExpression = astFactory.prefixedIdentifier(
           target,
-          node.operator,
+          node.operator!,
           node.methodName,
         );
       } else {
         functionExpression = astFactory.propertyAccess(
           target,
-          node.operator,
+          node.operator!,
           node.methodName,
         );
       }
@@ -788,12 +787,12 @@
   ///
   /// TODO(scheglov) when we do inference in this resolver, do we need this?
   void _setExplicitTypeArgumentTypes() {
-    var typeArgumentList = _invocation.typeArguments;
+    var typeArgumentList = _invocation!.typeArguments;
     if (typeArgumentList != null) {
       var arguments = typeArgumentList.arguments;
-      _invocation.typeArgumentTypes = arguments.map((n) => n.type).toList();
+      _invocation!.typeArgumentTypes = arguments.map((n) => n.type!).toList();
     } else {
-      _invocation.typeArgumentTypes = [];
+      _invocation!.typeArgumentTypes = [];
     }
   }
 
@@ -808,7 +807,8 @@
     }
 
     if (type is FunctionType) {
-      _inferenceHelper.resolveMethodInvocation(node: node, rawType: type);
+      _inferenceHelper.resolveMethodInvocation(
+          node: node as MethodInvocationImpl, rawType: type);
       return;
     }
 
@@ -823,16 +823,16 @@
   /// this method resolver. If we rewrite a [MethodInvocation] node, this
   /// method will return the resulting [FunctionExpressionInvocation], so
   /// that the resolver visitor will know to continue resolving this new node.
-  static FunctionExpressionInvocation getRewriteResult(MethodInvocation node) {
+  static FunctionExpressionInvocation? getRewriteResult(MethodInvocation node) {
     return node.getProperty(_rewriteResultKey);
   }
 
   /// Checks whether the given [expression] is a reference to a class. If it is
   /// then the element representing the class is returned, otherwise `null` is
   /// returned.
-  static ClassElement getTypeReference(Expression expression) {
+  static ClassElement? getTypeReference(Expression expression) {
     if (expression is Identifier) {
-      Element staticElement = expression.staticElement;
+      var staticElement = expression.staticElement;
       if (staticElement is ClassElement) {
         return staticElement;
       }
diff --git a/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart
index 322b65c..08ebc32 100644
--- a/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart
@@ -16,7 +16,6 @@
 import 'package:analyzer/src/dart/resolver/type_property_resolver.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/resolver.dart';
-import 'package:meta/meta.dart';
 
 /// Helper for resolving [PostfixExpression]s.
 class PostfixExpressionResolver {
@@ -26,7 +25,7 @@
   final AssignmentExpressionShared _assignmentShared;
 
   PostfixExpressionResolver({
-    @required ResolverVisitor resolver,
+    required ResolverVisitor resolver,
   })  : _resolver = resolver,
         _typePropertyResolver = resolver.typePropertyResolver,
         _inferenceHelper = resolver.inferenceHelper,
@@ -63,7 +62,7 @@
     // TODO(scheglov) Use VariableElement and do in resolveForWrite() ?
     _assignmentShared.checkFinalAlreadyAssigned(operand);
 
-    var receiverType = node.readType;
+    var receiverType = node.readType!;
     _resolve1(node, receiverType);
     _resolve2(node, receiverType);
   }
@@ -74,7 +73,7 @@
   /// TODO(scheglov) this is duplicate
   void _checkForInvalidAssignmentIncDec(
       PostfixExpression node, Expression operand, DartType type) {
-    var operandWriteType = node.writeType;
+    var operandWriteType = node.writeType!;
     if (!_typeSystem.isAssignableTo2(type, operandWriteType)) {
       _resolver.errorReporter.reportErrorForNode(
         CompileTimeErrorCode.INVALID_ASSIGNMENT,
@@ -90,18 +89,16 @@
   /// @return the static return type that was computed
   ///
   /// TODO(scheglov) this is duplicate
-  DartType _computeStaticReturnType(Element element) {
+  DartType _computeStaticReturnType(Element? element) {
     if (element is PropertyAccessorElement) {
       //
       // This is a function invocation expression disguised as something else.
       // We are invoking a getter and then invoking the returned function.
       //
       FunctionType propertyType = element.type;
-      if (propertyType != null) {
-        return _resolver.inferenceHelper.computeInvokeReturnType(
-          propertyType.returnType,
-        );
-      }
+      return _resolver.inferenceHelper.computeInvokeReturnType(
+        propertyType.returnType,
+      );
     } else if (element is ExecutableElement) {
       return _resolver.inferenceHelper.computeInvokeReturnType(element.type);
     }
@@ -139,7 +136,7 @@
       receiverErrorNode: operand,
       nameErrorEntity: operand,
     );
-    node.staticElement = result.getter;
+    node.staticElement = result.getter as MethodElement?;
     if (result.needsGetterError) {
       if (operand is SuperExpression) {
         _errorReporter.reportErrorForToken(
@@ -209,7 +206,7 @@
     operand.accept(_resolver);
     operand = node.operand;
 
-    var operandType = operand.staticType;
+    var operandType = operand.staticType!;
 
     var type = _typeSystem.promoteToNonNull(operandType);
     _inferenceHelper.recordStaticType(node, type);
diff --git a/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart
index 6a060aa..6901f05 100644
--- a/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart
@@ -16,7 +16,6 @@
 import 'package:analyzer/src/dart/resolver/type_property_resolver.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/resolver.dart';
-import 'package:meta/meta.dart';
 
 /// Helper for resolving [PrefixExpression]s.
 class PrefixExpressionResolver {
@@ -26,7 +25,7 @@
   final AssignmentExpressionShared _assignmentShared;
 
   PrefixExpressionResolver({
-    @required ResolverVisitor resolver,
+    required ResolverVisitor resolver,
   })  : _resolver = resolver,
         _typePropertyResolver = resolver.typePropertyResolver,
         _inferenceHelper = resolver.inferenceHelper,
@@ -78,7 +77,7 @@
   /// TODO(scheglov) this is duplicate
   void _checkForInvalidAssignmentIncDec(
       PrefixExpressionImpl node, DartType type) {
-    var operandWriteType = node.writeType;
+    var operandWriteType = node.writeType!;
     if (!_typeSystem.isAssignableTo2(type, operandWriteType)) {
       _resolver.errorReporter.reportErrorForNode(
         CompileTimeErrorCode.INVALID_ASSIGNMENT,
@@ -94,18 +93,16 @@
   /// @return the static return type that was computed
   ///
   /// TODO(scheglov) this is duplicate
-  DartType _computeStaticReturnType(Element element) {
+  DartType _computeStaticReturnType(Element? element) {
     if (element is PropertyAccessorElement) {
       //
       // This is a function invocation expression disguised as something else.
       // We are invoking a getter and then invoking the returned function.
       //
-      FunctionType propertyType = element.type;
-      if (propertyType != null) {
-        return _resolver.inferenceHelper.computeInvokeReturnType(
-          propertyType.returnType,
-        );
-      }
+      var propertyType = element.type;
+      return _resolver.inferenceHelper.computeInvokeReturnType(
+        propertyType.returnType,
+      );
     } else if (element is ExecutableElement) {
       return _resolver.inferenceHelper.computeInvokeReturnType(element.type);
     }
@@ -145,8 +142,8 @@
       Expression operand = node.operand;
       String methodName = _getPrefixOperator(node);
       if (operand is ExtensionOverride) {
-        ExtensionElement element = operand.extensionName.staticElement;
-        MethodElement member = element.getMethod(methodName);
+        var element = operand.extensionName.staticElement as ExtensionElement;
+        var member = element.getMethod(methodName);
         if (member == null) {
           _errorReporter.reportErrorForToken(
               CompileTimeErrorCode.UNDEFINED_EXTENSION_OPERATOR,
@@ -157,7 +154,7 @@
         return;
       }
 
-      var readType = node.readType ?? operand.staticType;
+      var readType = node.readType ?? operand.staticType!;
       if (identical(readType, NeverTypeImpl.instance)) {
         _resolver.errorReporter.reportErrorForNode(
           HintCode.RECEIVER_OF_TYPE_NEVER,
@@ -173,7 +170,7 @@
         receiverErrorNode: operand,
         nameErrorEntity: operand,
       );
-      node.staticElement = result.getter;
+      node.staticElement = result.getter as MethodElement?;
       if (result.needsGetterError) {
         if (operand is SuperExpression) {
           _errorReporter.reportErrorForToken(
@@ -198,13 +195,13 @@
       _recordStaticType(node, NeverTypeImpl.instance);
     } else {
       // The other cases are equivalent to invoking a method.
-      ExecutableElement staticMethodElement = node.staticElement;
+      var staticMethodElement = node.staticElement;
       DartType staticType = _computeStaticReturnType(staticMethodElement);
       Expression operand = node.operand;
       if (operand is ExtensionOverride) {
         // No special handling for incremental operators.
       } else if (operator.isIncrementOperator) {
-        if (node.readType.isDartCoreInt) {
+        if (node.readType!.isDartCoreInt) {
           staticType = _typeProvider.intType;
         } else {
           _checkForInvalidAssignmentIncDec(node, staticType);
diff --git a/pkg/analyzer/lib/src/dart/resolver/prefixed_identifier_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/prefixed_identifier_resolver.dart
index a6e5194..56da5f9 100644
--- a/pkg/analyzer/lib/src/dart/resolver/prefixed_identifier_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/prefixed_identifier_resolver.dart
@@ -79,7 +79,7 @@
     } else if (element is VariableElement) {
       type = element.type;
     } else if (result.functionTypeCallType != null) {
-      type = result.functionTypeCallType;
+      type = result.functionTypeCallType!;
     }
 
     type = _inferenceHelper.inferTearOff(node, identifier, type);
@@ -96,24 +96,15 @@
   /// TODO(scheglov) this is duplicate
   DartType _getTypeOfProperty(PropertyAccessorElement accessor) {
     FunctionType functionType = accessor.type;
-    if (functionType == null) {
-      // TODO(brianwilkerson) Report this internal error. This happens when we
-      // are analyzing a reference to a property before we have analyzed the
-      // declaration of the property or when the property does not have a
-      // defined type.
-      return DynamicTypeImpl.instance;
-    }
     if (accessor.isSetter) {
       List<DartType> parameterTypes = functionType.normalParameterTypes;
-      if (parameterTypes != null && parameterTypes.isNotEmpty) {
+      if (parameterTypes.isNotEmpty) {
         return parameterTypes[0];
       }
-      PropertyAccessorElement getter = accessor.variable.getter;
+      var getter = accessor.variable.getter;
       if (getter != null) {
         functionType = getter.type;
-        if (functionType != null) {
-          return functionType.returnType;
-        }
+        return functionType.returnType;
       }
       return DynamicTypeImpl.instance;
     }
diff --git a/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
index a649b31..9a7c23b 100644
--- a/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
@@ -18,7 +18,6 @@
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/super_context.dart';
-import 'package:meta/meta.dart';
 
 class PropertyElementResolver {
   final ResolverVisitor _resolver;
@@ -34,13 +33,11 @@
   TypeSystemImpl get _typeSystem => _resolver.typeSystem;
 
   PropertyElementResolverResult resolveIndexExpression({
-    @required IndexExpression node,
-    @required bool hasRead,
-    @required bool hasWrite,
+    required IndexExpression node,
+    required bool hasRead,
+    required bool hasWrite,
   }) {
     var target = node.realTarget;
-    var targetType = target.staticType;
-    targetType = _resolveTypeParameter(targetType);
 
     if (target is ExtensionOverride) {
       var result = _extensionResolver.getOverrideMember(target, '[]');
@@ -50,7 +47,7 @@
         _reportUnresolvedIndex(
           node,
           CompileTimeErrorCode.UNDEFINED_EXTENSION_OPERATOR,
-          ['[]', target.staticElement.name],
+          ['[]', target.staticElement!.name],
         );
       }
 
@@ -58,13 +55,16 @@
         _reportUnresolvedIndex(
           node,
           CompileTimeErrorCode.UNDEFINED_EXTENSION_OPERATOR,
-          ['[]=', target.staticElement.name],
+          ['[]=', target.staticElement!.name],
         );
       }
 
       return _toIndexResult(result);
     }
 
+    var targetType = target.staticType!;
+    targetType = _resolveTypeParameter(targetType);
+
     if (targetType.isVoid) {
       // TODO(scheglov) Report directly in TypePropertyResolver?
       _reportUnresolvedIndex(
@@ -123,9 +123,9 @@
   }
 
   PropertyElementResolverResult resolvePrefixedIdentifier({
-    @required PrefixedIdentifier node,
-    @required bool hasRead,
-    @required bool hasWrite,
+    required PrefixedIdentifier node,
+    required bool hasRead,
+    required bool hasWrite,
     bool forAnnotation = false,
   }) {
     var prefix = node.prefix;
@@ -153,9 +153,9 @@
   }
 
   PropertyElementResolverResult resolvePropertyAccess({
-    @required PropertyAccess node,
-    @required bool hasRead,
-    @required bool hasWrite,
+    required PropertyAccess node,
+    required bool hasRead,
+    required bool hasWrite,
   }) {
     var target = node.realTarget;
     var propertyName = node.propertyName;
@@ -189,20 +189,20 @@
   }
 
   PropertyElementResolverResult resolveSimpleIdentifier({
-    @required SimpleIdentifier node,
-    @required bool hasRead,
-    @required bool hasWrite,
+    required SimpleIdentifier node,
+    required bool hasRead,
+    required bool hasWrite,
   }) {
-    Element readElementRequested;
-    Element readElementRecovery;
+    Element? readElementRequested;
+    Element? readElementRecovery;
     if (hasRead) {
       var readLookup = _resolver.lexicalLookup(node: node, setter: false);
       readElementRequested = readLookup.requested;
       _resolver.checkReadOfNotAssignedLocalVariable(node, readElementRequested);
     }
 
-    Element writeElementRequested;
-    Element writeElementRecovery;
+    Element? writeElementRequested;
+    Element? writeElementRecovery;
     if (hasWrite) {
       var writeLookup = _resolver.lexicalLookup(node: node, setter: true);
       writeElementRequested = writeLookup.requested;
@@ -226,7 +226,7 @@
 
   void _checkExtensionOverrideStaticMember(
     SimpleIdentifier propertyName,
-    ExecutableElement element,
+    ExecutableElement? element,
   ) {
     if (element != null && element.isStatic) {
       _errorReporter.reportErrorForNode(
@@ -250,9 +250,9 @@
     );
   }
 
-  DartType _computeIndexContextType({
-    @required ExecutableElement readElement,
-    @required ExecutableElement writeElement,
+  DartType? _computeIndexContextType({
+    required ExecutableElement? readElement,
+    required ExecutableElement? writeElement,
   }) {
     var method = writeElement ?? readElement;
     var parameters = method is MethodElement ? method.parameters : null;
@@ -271,7 +271,7 @@
   void _reportUnresolvedIndex(
     IndexExpression node,
     ErrorCode errorCode, [
-    List<Object> arguments = const [],
+    List<Object?> arguments = const [],
   ]) {
     var leftBracket = node.leftBracket;
     var rightBracket = node.rightBracket;
@@ -282,12 +282,12 @@
   }
 
   PropertyElementResolverResult _resolve({
-    @required Expression target,
-    @required bool isCascaded,
-    @required bool isNullAware,
-    @required SimpleIdentifier propertyName,
-    @required bool hasRead,
-    @required bool hasWrite,
+    required Expression target,
+    required bool isCascaded,
+    required bool isNullAware,
+    required SimpleIdentifier propertyName,
+    required bool hasRead,
+    required bool hasWrite,
   }) {
     //
     // If this property access is of the form 'C.m' where 'C' is a class,
@@ -336,7 +336,7 @@
       }
     }
 
-    var targetType = target.staticType;
+    var targetType = target.staticType!;
 
     if (targetType is FunctionType && propertyName.name == 'call') {
       return PropertyElementResolverResult(
@@ -390,17 +390,17 @@
   }
 
   PropertyElementResolverResult _resolveTargetClassElement({
-    @required ClassElement typeReference,
-    @required bool isCascaded,
-    @required SimpleIdentifier propertyName,
-    @required bool hasRead,
-    @required bool hasWrite,
+    required ClassElement typeReference,
+    required bool isCascaded,
+    required SimpleIdentifier propertyName,
+    required bool hasRead,
+    required bool hasWrite,
   }) {
     if (isCascaded) {
       typeReference = _resolver.typeProvider.typeType.element;
     }
 
-    ExecutableElement readElement;
+    ExecutableElement? readElement;
     if (hasRead) {
       readElement = typeReference.getGetter(propertyName.name);
       if (readElement != null && !_isAccessible(readElement)) {
@@ -429,8 +429,8 @@
       }
     }
 
-    ExecutableElement writeElement;
-    ExecutableElement writeElementRecovery;
+    ExecutableElement? writeElement;
+    ExecutableElement? writeElementRecovery;
     if (hasWrite) {
       writeElement = typeReference.getSetter(propertyName.name);
       if (writeElement != null) {
@@ -463,14 +463,14 @@
   }
 
   PropertyElementResolverResult _resolveTargetExtensionElement({
-    @required ExtensionElement extension,
-    @required SimpleIdentifier propertyName,
-    @required bool hasRead,
-    @required bool hasWrite,
+    required ExtensionElement extension,
+    required SimpleIdentifier propertyName,
+    required bool hasRead,
+    required bool hasWrite,
   }) {
     var memberName = propertyName.name;
 
-    ExecutableElement readElement;
+    ExecutableElement? readElement;
     if (hasRead) {
       readElement ??= extension.getGetter(memberName);
       readElement ??= extension.getMethod(memberName);
@@ -487,7 +487,7 @@
       }
     }
 
-    ExecutableElement writeElement;
+    ExecutableElement? writeElement;
     if (hasWrite) {
       writeElement = extension.getSetter(memberName);
 
@@ -510,10 +510,10 @@
   }
 
   PropertyElementResolverResult _resolveTargetExtensionOverride({
-    @required ExtensionOverride target,
-    @required SimpleIdentifier propertyName,
-    @required bool hasRead,
-    @required bool hasWrite,
+    required ExtensionOverride target,
+    required SimpleIdentifier propertyName,
+    required bool hasRead,
+    required bool hasWrite,
   }) {
     if (target.parent is CascadeExpression) {
       // Report this error and recover by treating it like a non-cascade.
@@ -523,12 +523,12 @@
       );
     }
 
-    ExtensionElement element = target.extensionName.staticElement;
-    String memberName = propertyName.name;
+    var element = target.extensionName.staticElement!;
+    var memberName = propertyName.name;
 
     var result = _extensionResolver.getOverrideMember(target, memberName);
 
-    ExecutableElement readElement;
+    ExecutableElement? readElement;
     if (hasRead) {
       readElement = result.getter;
       if (readElement == null) {
@@ -541,7 +541,7 @@
       _checkExtensionOverrideStaticMember(propertyName, readElement);
     }
 
-    ExecutableElement writeElement;
+    ExecutableElement? writeElement;
     if (hasWrite) {
       writeElement = result.setter;
       if (writeElement == null) {
@@ -561,11 +561,11 @@
   }
 
   PropertyElementResolverResult _resolveTargetPrefixElement({
-    @required PrefixElement target,
-    @required SimpleIdentifier identifier,
-    @required bool hasRead,
-    @required bool hasWrite,
-    @required bool forAnnotation,
+    required PrefixElement target,
+    required SimpleIdentifier identifier,
+    required bool hasRead,
+    required bool hasWrite,
+    required bool forAnnotation,
   }) {
     var lookupResult = target.scope.lookup(identifier.name);
 
@@ -595,18 +595,18 @@
   }
 
   PropertyElementResolverResult _resolveTargetSuperExpression({
-    @required SuperExpression target,
-    @required SimpleIdentifier propertyName,
-    @required bool hasRead,
-    @required bool hasWrite,
+    required SuperExpression target,
+    required SimpleIdentifier propertyName,
+    required bool hasRead,
+    required bool hasWrite,
   }) {
     if (SuperContext.of(target) != SuperContext.valid) {
       return PropertyElementResolverResult();
     }
     var targetType = target.staticType;
 
-    ExecutableElement readElement;
-    ExecutableElement writeElement;
+    ExecutableElement? readElement;
+    ExecutableElement? writeElement;
 
     if (targetType is InterfaceTypeImpl) {
       if (hasRead) {
@@ -658,8 +658,8 @@
             inherited: true,
           );
           if (writeElement != null) {
-            ClassElementImpl receiverSuperClass =
-                targetType.element.supertype.element;
+            var receiverSuperClass =
+                targetType.element.supertype!.element as ClassElementImpl;
             if (!receiverSuperClass.hasNoSuchMethod) {
               _errorReporter.reportErrorForNode(
                 CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE,
@@ -709,15 +709,15 @@
 }
 
 class PropertyElementResolverResult {
-  final Element readElementRequested;
-  final Element readElementRecovery;
-  final Element writeElementRequested;
-  final Element writeElementRecovery;
-  final FunctionType functionTypeCallType;
+  final Element? readElementRequested;
+  final Element? readElementRecovery;
+  final Element? writeElementRequested;
+  final Element? writeElementRecovery;
+  final FunctionType? functionTypeCallType;
 
   /// If [IndexExpression] is resolved, the context type of the index.
   /// Might be `null` if `[]` or `[]=` are not resolved or invalid.
-  final DartType indexContextType;
+  final DartType? indexContextType;
 
   PropertyElementResolverResult({
     this.readElementRequested,
@@ -728,11 +728,11 @@
     this.functionTypeCallType,
   });
 
-  Element get readElement {
+  Element? get readElement {
     return readElementRequested ?? readElementRecovery;
   }
 
-  Element get writeElement {
+  Element? get writeElement {
     return writeElementRequested ?? writeElementRecovery;
   }
 }
diff --git a/pkg/analyzer/lib/src/dart/resolver/resolution_result.dart b/pkg/analyzer/lib/src/dart/resolver/resolution_result.dart
index 3a19d28..130268c 100644
--- a/pkg/analyzer/lib/src/dart/resolver/resolution_result.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/resolution_result.dart
@@ -18,7 +18,7 @@
   final _ResolutionResultState state;
 
   /// Return the element that is invoked for reading.
-  final ExecutableElement getter;
+  final ExecutableElement? getter;
 
   /// If `true`, then the [getter] is `null`, and this is an error that has
   /// not yet been reported, and the client should report it.
@@ -31,7 +31,7 @@
   final bool needsGetterError;
 
   /// Return the element that is invoked for writing.
-  final ExecutableElement setter;
+  final ExecutableElement? setter;
 
   /// If `true`, then the [setter] is `null`, and this is an error that has
   /// not yet been reported, and the client should report it.
@@ -47,9 +47,9 @@
   /// reading and / or writing result.
   ResolutionResult({
     this.getter,
-    this.needsGetterError,
+    this.needsGetterError = true,
     this.setter,
-    this.needsSetterError,
+    this.needsSetterError = true,
   }) : state = _ResolutionResultState.single;
 
   /// Initialize a newly created result with no elements and the given [state].
diff --git a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
index 8ad526f..b5eef7b 100644
--- a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
@@ -22,14 +22,13 @@
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/declaration_resolver.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
-import 'package:meta/meta.dart';
 
 class ElementHolder {
   final ElementImpl _element;
   final List<TypeParameterElementImpl> _typeParameters = [];
   final List<ParameterElementImpl> _parameters = [];
 
-  ElementHolder(this._element) : assert(_element != null);
+  ElementHolder(this._element);
 
   List<ParameterElementImpl> get parameters => _parameters;
 
@@ -71,25 +70,25 @@
   /// visited. For example when we visit a method, its element is resynthesized
   /// from the summary, and we get resynthesized elements for type parameters
   /// and formal parameters to apply to corresponding AST nodes.
-  ElementWalker _elementWalker;
+  ElementWalker? _elementWalker;
 
   /// The scope used to resolve identifiers.
   Scope _nameScope;
 
   /// The scope used to resolve labels for `break` and `continue` statements,
   /// or `null` if no labels have been defined in the current context.
-  LabelScope _labelScope;
+  LabelScope? _labelScope;
 
   /// The container to add newly created elements that should be put into the
   /// enclosing element.
   ElementHolder _elementHolder;
 
   factory ResolutionVisitor({
-    @required CompilationUnitElementImpl unitElement,
-    @required AnalysisErrorListener errorListener,
-    @required FeatureSet featureSet,
-    @required Scope nameScope,
-    ElementWalker elementWalker,
+    required CompilationUnitElementImpl unitElement,
+    required AnalysisErrorListener errorListener,
+    required FeatureSet featureSet,
+    required Scope nameScope,
+    ElementWalker? elementWalker,
   }) {
     var libraryElement = unitElement.library;
     var typeProvider = libraryElement.typeProvider;
@@ -181,7 +180,7 @@
           element.type = type;
           exceptionNode.staticType = type;
         } else {
-          element.type = exceptionTypeNode.type;
+          element.type = exceptionTypeNode.type!;
           exceptionNode.staticType = exceptionTypeNode.type;
         }
 
@@ -212,7 +211,7 @@
 
   @override
   void visitClassDeclaration(ClassDeclaration node) {
-    ClassElementImpl element = _elementWalker.getClass();
+    ClassElementImpl element = _elementWalker!.getClass();
     node.name.staticElement = element;
     _typeNameResolver.enclosingClass = element;
 
@@ -248,7 +247,7 @@
 
   @override
   void visitClassTypeAlias(ClassTypeAlias node) {
-    ClassElementImpl element = _elementWalker.getClass();
+    ClassElementImpl element = _elementWalker!.getClass();
     node.name.staticElement = element;
     _typeNameResolver.enclosingClass = element;
 
@@ -276,7 +275,7 @@
 
   @override
   void visitConstructorDeclaration(ConstructorDeclaration node) {
-    ConstructorElementImpl element = _elementWalker.getConstructor();
+    ConstructorElementImpl element = _elementWalker!.getConstructor();
     (node as ConstructorDeclarationImpl).declaredElement = element;
     node.name?.staticElement = element;
 
@@ -321,8 +320,8 @@
       element.hasImplicitType = true;
       element.type = _dynamicType;
     } else {
-      node.type.accept(this);
-      element.type = node.type.type;
+      node.type!.accept(this);
+      element.type = node.type!.type!;
     }
 
     _setCodeRange(element, node);
@@ -331,11 +330,11 @@
   @override
   void visitDefaultFormalParameter(covariant DefaultFormalParameterImpl node) {
     NormalFormalParameter normalParameter = node.parameter;
-    SimpleIdentifier nameNode = normalParameter.identifier;
+    SimpleIdentifier? nameNode = normalParameter.identifier;
 
     ParameterElementImpl element;
     if (_elementWalker != null) {
-      element = _elementWalker.getParameter();
+      element = _elementWalker!.getParameter();
     } else {
       var name = nameNode?.name ?? '';
       var nameOffset = nameNode?.offset ?? -1;
@@ -379,7 +378,7 @@
 
   @override
   void visitEnumConstantDeclaration(EnumConstantDeclaration node) {
-    var element = _elementWalker.getVariable();
+    var element = _elementWalker!.getVariable();
     node.name.staticElement = element;
 
     node.metadata.accept(this);
@@ -388,7 +387,7 @@
 
   @override
   void visitEnumDeclaration(EnumDeclaration node) {
-    EnumElementImpl element = _elementWalker.getEnum();
+    EnumElementImpl element = _elementWalker!.getEnum();
     node.name.staticElement = element;
 
     node.metadata.accept(this);
@@ -407,14 +406,14 @@
     _withElementWalker(null, () {
       super.visitExportDirective(node);
       if (node.element != null) {
-        _setElementAnnotations(node.metadata, node.element.metadata);
+        _setElementAnnotations(node.metadata, node.element!.metadata);
       }
     });
   }
 
   @override
   void visitExtensionDeclaration(ExtensionDeclaration node) {
-    var element = _elementWalker.getExtension();
+    var element = _elementWalker!.getExtension();
     (node as ExtensionDeclarationImpl).declaredElement = element;
     node.name?.staticElement = element;
 
@@ -437,7 +436,8 @@
   @override
   void visitFieldDeclaration(FieldDeclaration node) {
     super.visitFieldDeclaration(node);
-    FieldElement firstFieldElement = node.fields.variables[0].declaredElement;
+    var firstFieldElement =
+        node.fields.variables[0].declaredElement as FieldElement;
     _setElementAnnotations(node.metadata, firstFieldElement.metadata);
   }
 
@@ -445,11 +445,12 @@
   void visitFieldFormalParameter(covariant FieldFormalParameterImpl node) {
     FieldFormalParameterElementImpl element;
     if (node.parent is DefaultFormalParameter) {
-      element = node.declaredElement;
+      element = node.declaredElement as FieldFormalParameterElementImpl;
     } else {
       var nameNode = node.identifier;
       if (_elementWalker != null) {
-        element = _elementWalker.getParameter();
+        element =
+            _elementWalker!.getParameter() as FieldFormalParameterElementImpl;
       } else {
         // Only for recovery, this should not happen in valid code.
         element = FieldFormalParameterElementImpl(
@@ -502,17 +503,17 @@
     ExecutableElementImpl element;
     if (_elementWalker != null) {
       element = node.isGetter || node.isSetter
-          ? _elementWalker.getAccessor()
-          : _elementWalker.getFunction();
+          ? _elementWalker!.getAccessor()
+          : _elementWalker!.getFunction();
       node.name.staticElement = element;
     } else {
-      element = node.declaredElement;
+      element = node.declaredElement as ExecutableElementImpl;
 
       _setCodeRange(element, node);
       setElementDocumentationComment(element, node);
       element.metadata = _createElementAnnotations(node.metadata);
 
-      FunctionBody body = node.functionExpression.body;
+      var body = node.functionExpression.body as FunctionBody;
       if (node.externalKeyword != null || body is NativeFunctionBody) {
         element.isExternal = true;
       }
@@ -524,10 +525,10 @@
       }
     }
 
-    FunctionExpressionImpl expression = node.functionExpression;
+    var expression = node.functionExpression as FunctionExpressionImpl;
     expression.declaredElement = element;
 
-    node.metadata?.accept(this);
+    node.metadata.accept(this);
     _setElementAnnotations(node.metadata, element.metadata);
 
     var holder = ElementHolder(element);
@@ -554,7 +555,7 @@
 
             _defineParameters(element.parameters);
             _withElementWalker(null, () {
-              expression.body.accept(this);
+              expression.body!.accept(this);
             });
           });
         },
@@ -578,8 +579,9 @@
     (node as FunctionExpressionImpl).declaredElement = element;
 
     element.hasImplicitReturnType = true;
+    element.returnType = DynamicTypeImpl.instance;
 
-    FunctionBody body = node.body;
+    FunctionBody body = node.body!;
     element.isAsynchronous = body.isAsynchronous;
     element.isGenerator = body.isGenerator;
 
@@ -590,11 +592,11 @@
         node.typeParameters?.accept(this);
         element.typeParameters = holder.typeParameters;
 
-        node.parameters.accept(this);
+        node.parameters!.accept(this);
         element.parameters = holder.parameters;
 
         _defineParameters(element.parameters);
-        node.body.accept(this);
+        node.body!.accept(this);
       });
     });
 
@@ -603,10 +605,10 @@
 
   @override
   void visitFunctionTypeAlias(FunctionTypeAlias node) {
-    var element = _elementWalker.getTypedef();
+    var element = _elementWalker!.getTypedef() as FunctionTypeAliasElementImpl;
     node.name.staticElement = element;
 
-    node.metadata?.accept(this);
+    node.metadata.accept(this);
     _setElementAnnotations(node.metadata, element.metadata);
 
     _withElementWalker(ElementWalker.forTypedef(element), () {
@@ -614,7 +616,7 @@
         _buildTypeParameterElements(node.typeParameters);
         node.typeParameters?.accept(this);
         node.returnType?.accept(this);
-        node.parameters?.accept(this);
+        node.parameters.accept(this);
       });
     });
   }
@@ -625,11 +627,11 @@
   ) {
     ParameterElementImpl element;
     if (node.parent is DefaultFormalParameter) {
-      element = node.declaredElement;
+      element = node.declaredElement as ParameterElementImpl;
     } else {
       SimpleIdentifier nameNode = node.identifier;
       if (_elementWalker != null) {
-        element = _elementWalker.getParameter();
+        element = _elementWalker!.getParameter();
       } else {
         element = ParameterElementImpl(nameNode.name, nameNode.offset);
         _elementHolder.addParameter(element);
@@ -642,7 +644,7 @@
       nameNode.staticElement = element;
     }
 
-    node.metadata?.accept(this);
+    node.metadata.accept(this);
     element.metadata = _createElementAnnotations(node.metadata);
 
     var holder = ElementHolder(element);
@@ -711,12 +713,12 @@
       nullabilitySuffix: _getNullability(node.question != null),
     );
     element.type = type;
-    (node as GenericFunctionTypeImpl).type = type;
+    node.type = type;
   }
 
   @override
   void visitGenericTypeAlias(GenericTypeAlias node) {
-    var element = _elementWalker.getTypedef();
+    var element = _elementWalker!.getTypedef();
     node.name.staticElement = element;
 
     node.metadata.accept(this);
@@ -726,7 +728,7 @@
       _withNameScope(() {
         _buildTypeParameterElements(node.typeParameters);
         node.typeParameters?.accept(this);
-        node.type?.accept(this);
+        node.type.accept(this);
       });
     });
   }
@@ -736,7 +738,7 @@
     _withElementWalker(null, () {
       super.visitImportDirective(node);
       if (node.element != null) {
-        _setElementAnnotations(node.metadata, node.element.metadata);
+        _setElementAnnotations(node.metadata, node.element!.metadata);
       }
     });
   }
@@ -769,7 +771,7 @@
     super.visitLibraryDirective(node);
     ++_libraryDirectiveIndex;
     if (node.element != null && _libraryDirectiveIndex == 1) {
-      _setElementAnnotations(node.metadata, node.element.metadata);
+      _setElementAnnotations(node.metadata, node.element!.metadata);
     } else {
       for (var annotation in node.metadata) {
         annotation.elementAnnotation = ElementAnnotationImpl(_unitElement);
@@ -780,8 +782,8 @@
   @override
   void visitMethodDeclaration(MethodDeclaration node) {
     ExecutableElementImpl element = node.isGetter || node.isSetter
-        ? _elementWalker.getAccessor()
-        : _elementWalker.getFunction();
+        ? _elementWalker!.getAccessor()
+        : _elementWalker!.getFunction();
     node.name.staticElement = element;
 
     node.metadata.accept(this);
@@ -798,7 +800,7 @@
         _withElementWalker(null, () {
           _withElementHolder(ElementHolder(element), () {
             _defineParameters(element.parameters);
-            node.body?.accept(this);
+            node.body.accept(this);
           });
         });
       });
@@ -817,7 +819,7 @@
 
   @override
   void visitMixinDeclaration(MixinDeclaration node) {
-    var element = _elementWalker.getMixin();
+    var element = _elementWalker!.getMixin();
     node.name.staticElement = element;
 
     node.metadata.accept(this);
@@ -843,7 +845,7 @@
     _withElementWalker(null, () {
       super.visitPartDirective(node);
       if (node.element != null) {
-        _setElementAnnotations(node.metadata, node.element.metadata);
+        _setElementAnnotations(node.metadata, node.element!.metadata);
       }
     });
   }
@@ -852,11 +854,11 @@
   void visitSimpleFormalParameter(covariant SimpleFormalParameterImpl node) {
     ParameterElementImpl element;
     if (node.parent is DefaultFormalParameter) {
-      element = node.declaredElement;
+      element = node.declaredElement as ParameterElementImpl;
     } else {
-      SimpleIdentifier nameNode = node.identifier;
+      var nameNode = node.identifier;
       if (_elementWalker != null) {
-        element = _elementWalker.getParameter();
+        element = _elementWalker!.getParameter();
       } else {
         if (nameNode != null) {
           element = ParameterElementImpl(nameNode.name, nameNode.offset);
@@ -921,15 +923,15 @@
     _typeNameResolver.resolveTypeName(node);
 
     if (_typeNameResolver.rewriteResult != null) {
-      _typeNameResolver.rewriteResult.accept(this);
+      _typeNameResolver.rewriteResult!.accept(this);
     }
   }
 
   @override
   void visitTypeParameter(TypeParameter node) {
-    TypeParameterElementImpl element = node.declaredElement;
+    var element = node.declaredElement as TypeParameterElementImpl;
 
-    node.metadata?.accept(this);
+    node.metadata.accept(this);
     _setElementAnnotations(node.metadata, element.metadata);
 
     var boundNode = node.bound;
@@ -943,17 +945,17 @@
 
   @override
   void visitVariableDeclaration(VariableDeclaration node) {
-    Expression initializerNode = node.initializer;
+    var initializerNode = node.initializer;
 
     VariableElementImpl element;
     if (_elementWalker != null) {
-      element = _elementWalker.getVariable();
+      element = _elementWalker!.getVariable();
       node.name.staticElement = element;
     } else {
-      LocalVariableElementImpl localElement = node.declaredElement;
+      var localElement = node.declaredElement as LocalVariableElementImpl;
       element = localElement;
 
-      VariableDeclarationList varList = node.parent;
+      var varList = node.parent as VariableDeclarationList;
       localElement.hasImplicitType = varList.type == null;
       localElement.hasInitializer = initializerNode != null;
       localElement.type = varList.type?.type ?? _dynamicType;
@@ -995,7 +997,7 @@
       var element = variable.declaredElement as ElementImpl;
       element.metadata = elementAnnotations;
 
-      var offset = (i == 0 ? node.parent : variable).offset;
+      var offset = (i == 0 ? node.parent! : variable).offset;
       var length = variable.end - offset;
       element.setCodeRange(offset, length);
     }
@@ -1069,7 +1071,7 @@
   /// Ensure that each type parameters from the [typeParameterList] has its
   /// element set, either from the [_elementWalker] or new, and define these
   /// elements in the [_nameScope].
-  void _buildTypeParameterElements(TypeParameterList typeParameterList) {
+  void _buildTypeParameterElements(TypeParameterList? typeParameterList) {
     if (typeParameterList == null) return;
 
     for (var typeParameter in typeParameterList.typeParameters) {
@@ -1077,7 +1079,7 @@
 
       TypeParameterElementImpl element;
       if (_elementWalker != null) {
-        element = _elementWalker.getTypeParameter();
+        element = _elementWalker!.getTypeParameter();
       } else {
         element = TypeParameterElementImpl(name.name, name.offset);
         _elementHolder.addTypeParameter(element);
@@ -1139,7 +1141,7 @@
     return NullabilitySuffix.star;
   }
 
-  void _resolveImplementsClause(ImplementsClause clause) {
+  void _resolveImplementsClause(ImplementsClause? clause) {
     if (clause == null) return;
 
     _resolveTypes(
@@ -1148,7 +1150,7 @@
     );
   }
 
-  void _resolveOnClause(OnClause clause) {
+  void _resolveOnClause(OnClause? clause) {
     if (clause == null) return;
 
     _resolveTypes(
@@ -1182,7 +1184,7 @@
     visitTypeName(typeName);
     _typeNameResolver.classHierarchy_typeName = null;
 
-    DartType type = typeName.type;
+    DartType type = typeName.type!;
     if (type is InterfaceType) {
       ClassElement element = type.element;
       if (element.isEnum || element.isMixin && asClass) {
@@ -1215,7 +1217,7 @@
     }
   }
 
-  void _resolveWithClause(WithClause clause) {
+  void _resolveWithClause(WithClause? clause) {
     if (clause == null) return;
 
     for (var typeName in clause.mixinTypes) {
@@ -1244,7 +1246,7 @@
   }
 
   /// Make the given [walker] be the current one while running [f].
-  void _withElementWalker(ElementWalker walker, void Function() f) {
+  void _withElementWalker(ElementWalker? walker, void Function() f) {
     var current = _elementWalker;
     try {
       _elementWalker = walker;
diff --git a/pkg/analyzer/lib/src/dart/resolver/scope.dart b/pkg/analyzer/lib/src/dart/resolver/scope.dart
index b9c2384..83348d9 100644
--- a/pkg/analyzer/lib/src/dart/resolver/scope.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/scope.dart
@@ -11,7 +11,6 @@
 import 'package:analyzer/src/dart/element/scope.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/generated/engine.dart';
-import 'package:meta/meta.dart';
 
 /// The scope defined by a block.
 class BlockScope {
@@ -24,16 +23,16 @@
     for (int i = 0; i < statementCount; i++) {
       Statement statement = statements[i];
       if (statement is LabeledStatement) {
-        statement = (statement as LabeledStatement).statement;
+        statement = statement.statement;
       }
       if (statement is VariableDeclarationStatement) {
         NodeList<VariableDeclaration> variables = statement.variables.variables;
         int variableCount = variables.length;
         for (int j = 0; j < variableCount; j++) {
-          yield variables[j].declaredElement;
+          yield variables[j].declaredElement!;
         }
       } else if (statement is FunctionDeclarationStatement) {
-        yield statement.functionDeclaration.declaredElement;
+        yield statement.functionDeclaration.declaredElement!;
       }
     }
   }
@@ -46,11 +45,11 @@
   static const ImplicitLabelScope ROOT = ImplicitLabelScope._(null, null);
 
   /// The implicit label scope enclosing this implicit label scope.
-  final ImplicitLabelScope outerScope;
+  final ImplicitLabelScope? outerScope;
 
   /// The statement that acts as a target for break and/or continue statements
   /// at this scoping level.
-  final Statement statement;
+  final Statement? statement;
 
   /// Initialize a newly created scope, enclosed within the [outerScope],
   /// representing the given [statement].
@@ -58,14 +57,14 @@
 
   /// Return the statement which should be the target of an unlabeled `break` or
   /// `continue` statement, or `null` if there is no appropriate target.
-  Statement getTarget(bool isContinue) {
+  Statement? getTarget(bool isContinue) {
     if (outerScope == null) {
       // This scope represents the top-level of a function body, so it doesn't
       // match either break or continue.
       return null;
     }
     if (isContinue && statement is SwitchStatement) {
-      return outerScope.getTarget(isContinue);
+      return outerScope!.getTarget(isContinue);
     }
     return statement;
   }
@@ -80,7 +79,7 @@
 /// A scope in which a single label is defined.
 class LabelScope {
   /// The label scope enclosing this label scope.
-  final LabelScope _outerScope;
+  final LabelScope? _outerScope;
 
   /// The label defined in this scope.
   final String _label;
@@ -98,7 +97,7 @@
 
   /// Return the LabelScope which defines [targetLabel], or `null` if it is not
   /// defined in this scope.
-  LabelScope lookup(String targetLabel) {
+  LabelScope? lookup(String targetLabel) {
     if (_label == targetLabel) {
       return this;
     }
@@ -125,12 +124,12 @@
 
   /// Return the element in this namespace that is available to the containing
   /// scope using the given name, or `null` if there is no such element.
-  Element get(String name) => _definedNames[name];
+  Element? get(String name) => _definedNames[name];
 
   /// Return the element in this namespace whose name is the result of combining
   /// the [prefix] and the [name], separated by a period, or `null` if there is
   /// no such element.
-  Element getPrefixed(String prefix, String name) => null;
+  Element? getPrefixed(String prefix, String name) => null;
 }
 
 /// The builder used to build a namespace. Namespace builders are thread-safe
@@ -139,7 +138,7 @@
   /// Create a namespace representing the export namespace of the given
   /// [element].
   Namespace createExportNamespaceForDirective(ExportElement element) {
-    LibraryElement exportedLibrary = element.exportedLibrary;
+    var exportedLibrary = element.exportedLibrary;
     if (exportedLibrary == null) {
       //
       // The exported library will be null if the URI does not reference a valid
@@ -162,7 +161,7 @@
   /// Create a namespace representing the import namespace of the given
   /// [element].
   Namespace createImportNamespaceForDirective(ImportElement element) {
-    LibraryElement importedLibrary = element.importedLibrary;
+    var importedLibrary = element.importedLibrary;
     if (importedLibrary == null) {
       //
       // The imported library will be null if the URI does not reference a valid
@@ -172,7 +171,7 @@
     }
     Map<String, Element> exportedNames = _getExportMapping(importedLibrary);
     exportedNames = _applyCombinators(exportedNames, element.combinators);
-    PrefixElement prefix = element.prefix;
+    var prefix = element.prefix;
     if (prefix != null) {
       return PrefixedNamespace(prefix.name, exportedNames);
     }
@@ -213,19 +212,10 @@
     return _applyCombinators(map, element.combinators).values;
   }
 
-  /// Add all of the names in the given [namespace] to the table of
-  /// [definedNames].
-  void _addAllFromNamespace(
-      Map<String, Element> definedNames, Namespace namespace) {
-    if (namespace != null) {
-      definedNames.addAll(namespace.definedNames);
-    }
-  }
-
   /// Add the given [element] to the table of [definedNames] if it has a
   /// publicly visible name.
   void _addIfPublic(Map<String, Element> definedNames, Element element) {
-    String name = element.name;
+    var name = element.name;
     if (name != null && name.isNotEmpty && !Identifier.isPrivateName(name)) {
       definedNames[name] = element;
     }
@@ -277,51 +267,8 @@
     return definedNames;
   }
 
-  /// Create a mapping table representing the export namespace of the given
-  /// [library]. The set of [visitedElements] contains the libraries that do not
-  /// need to be visited when processing the export directives of the given
-  /// library because all of the names defined by them will be added by another
-  /// library.
-  Map<String, Element> _computeExportMapping(
-      LibraryElement library, HashSet<LibraryElement> visitedElements) {
-    visitedElements.add(library);
-    try {
-      Map<String, Element> definedNames = HashMap<String, Element>();
-      for (ExportElement element in library.exports) {
-        LibraryElement exportedLibrary = element.exportedLibrary;
-        if (exportedLibrary != null &&
-            !visitedElements.contains(exportedLibrary)) {
-          //
-          // The exported library will be null if the URI does not reference a
-          // valid library.
-          //
-          Map<String, Element> exportedNames =
-              _computeExportMapping(exportedLibrary, visitedElements);
-          exportedNames = _applyCombinators(exportedNames, element.combinators);
-          definedNames.addAll(exportedNames);
-        }
-      }
-      _addAllFromNamespace(
-        definedNames,
-        createPublicNamespaceForLibrary(library),
-      );
-      return definedNames;
-    } finally {
-      visitedElements.remove(library);
-    }
-  }
-
   Map<String, Element> _getExportMapping(LibraryElement library) {
-    if (library.exportNamespace != null) {
-      return library.exportNamespace.definedNames;
-    }
-    if (library is LibraryElementImpl) {
-      Map<String, Element> exportMapping =
-          _computeExportMapping(library, HashSet<LibraryElement>());
-      library.exportNamespace = Namespace(exportMapping);
-      return exportMapping;
-    }
-    return _computeExportMapping(library, HashSet<LibraryElement>());
+    return library.exportNamespace.definedNames;
   }
 
   /// Return a new map of names which has all the names from [definedNames]
@@ -341,7 +288,7 @@
       Map<String, Element> definedNames, List<String> shownNames) {
     Map<String, Element> newNames = HashMap<String, Element>();
     for (String name in shownNames) {
-      Element element = definedNames[name];
+      var element = definedNames[name];
       if (element != null) {
         newNames[name] = element;
       }
@@ -386,7 +333,7 @@
   }
 
   @override
-  Element get(String name) {
+  Element? get(String name) {
     if (name.length > _length && name.startsWith(_prefix)) {
       if (name.codeUnitAt(_length) == '.'.codeUnitAt(0)) {
         return _definedNames[name.substring(_length + 1)];
@@ -396,7 +343,7 @@
   }
 
   @override
-  Element getPrefixed(String prefix, String name) {
+  Element? getPrefixed(String prefix, String name) {
     if (prefix == _prefix) {
       return _definedNames[name];
     }
@@ -425,8 +372,8 @@
   /// (might be `null`) and [name] is not defined should be ignored (from the
   /// perspective of error reporting).
   bool shouldIgnoreUndefined2({
-    @required String prefix,
-    @required String name,
+    required String? prefix,
+    required String name,
   }) {
     return _enclosingLibraryScope.shouldIgnoreUndefined(
       prefix: prefix,
@@ -439,7 +386,7 @@
   }
 
   LibraryScope get _enclosingLibraryScope {
-    var scope = this;
+    Scope? scope = this;
     while (scope != null) {
       if (scope is LibraryScope) {
         return scope;
diff --git a/pkg/analyzer/lib/src/dart/resolver/simple_identifier_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/simple_identifier_resolver.dart
index 785ea9f..9cb37d0 100644
--- a/pkg/analyzer/lib/src/dart/resolver/simple_identifier_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/simple_identifier_resolver.dart
@@ -19,7 +19,7 @@
 
 class SimpleIdentifierResolver {
   final ResolverVisitor _resolver;
-  final FlowAnalysisHelper _flowAnalysis;
+  final FlowAnalysisHelper? _flowAnalysis;
 
   SimpleIdentifierResolver(this._resolver, this._flowAnalysis);
 
@@ -50,24 +50,15 @@
   /// TODO(scheglov) this is duplicate
   DartType _getTypeOfProperty(PropertyAccessorElement accessor) {
     FunctionType functionType = accessor.type;
-    if (functionType == null) {
-      // TODO(brianwilkerson) Report this internal error. This happens when we
-      // are analyzing a reference to a property before we have analyzed the
-      // declaration of the property or when the property does not have a
-      // defined type.
-      return DynamicTypeImpl.instance;
-    }
     if (accessor.isSetter) {
-      List<DartType> parameterTypes = functionType.normalParameterTypes;
-      if (parameterTypes != null && parameterTypes.isNotEmpty) {
+      var parameterTypes = functionType.normalParameterTypes;
+      if (parameterTypes.isNotEmpty) {
         return parameterTypes[0];
       }
-      PropertyAccessorElement getter = accessor.variable.getter;
+      var getter = accessor.variable.getter;
       if (getter != null) {
         functionType = getter.type;
-        if (functionType != null) {
-          return functionType.returnType;
-        }
+        return functionType.returnType;
       }
       return DynamicTypeImpl.instance;
     }
@@ -101,7 +92,7 @@
   /// * it is the prefix in an import directive, or
   /// * it is the prefix in a prefixed identifier.
   bool _isValidAsPrefix(SimpleIdentifier node) {
-    AstNode parent = node.parent;
+    var parent = node.parent;
     if (parent is ImportDirective) {
       return identical(parent.prefix, node);
     } else if (parent is PrefixedIdentifier) {
@@ -120,22 +111,14 @@
   ///
   /// TODO(scheglov) this is duplicate
   void _recordStaticType(Expression expression, DartType type) {
-    if (_resolver.migrationResolutionHooks != null) {
-      // TODO(scheglov) type cannot be null
-      type = _resolver.migrationResolutionHooks.modifyExpressionType(
-        expression,
-        type ?? DynamicTypeImpl.instance,
-      );
+    var hooks = _resolver.migrationResolutionHooks;
+    if (hooks != null) {
+      type = hooks.modifyExpressionType(expression, type);
     }
 
-    // TODO(scheglov) type cannot be null
-    if (type == null) {
-      expression.staticType = DynamicTypeImpl.instance;
-    } else {
-      expression.staticType = type;
-      if (_resolver.typeSystem.isBottom(type)) {
-        _flowAnalysis?.flow?.handleExit();
-      }
+    expression.staticType = type;
+    if (_resolver.typeSystem.isBottom(type)) {
+      _flowAnalysis?.flow?.handleExit();
     }
   }
 
@@ -157,7 +140,7 @@
         node.staticElement is ParameterElement) {
       return;
     }
-    AstNode parent = node.parent;
+    var parent = node.parent;
     if (parent is FieldFormalParameter) {
       return;
     } else if (parent is ConstructorFieldInitializer &&
@@ -189,10 +172,9 @@
       hasWrite: hasWrite,
     );
 
-    // Element element = _resolver.elementResolver.resolveSimpleIdentifier(node);
-    Element element = hasRead ? result.readElement : result.writeElement;
+    var element = hasRead ? result.readElement : result.writeElement;
 
-    ClassElement enclosingClass = _resolver.enclosingClass;
+    var enclosingClass = _resolver.enclosingClass;
     if (_isFactoryConstructorReturnType(node) &&
         !identical(element, enclosingClass)) {
       _errorReporter.reportErrorForNode(
@@ -232,7 +214,7 @@
   }
 
   void _resolve2(SimpleIdentifier node) {
-    Element element = node.staticElement;
+    var element = node.staticElement;
 
     if (element is ExtensionElement) {
       _setExtensionIdentifierType(node);
@@ -315,7 +297,7 @@
   /// Return `true` if the given [identifier] is the return type of a
   /// constructor declaration.
   static bool _isConstructorReturnType(SimpleIdentifier identifier) {
-    AstNode parent = identifier.parent;
+    var parent = identifier.parent;
     if (parent is ConstructorDeclaration) {
       return identical(parent.returnType, identifier);
     }
@@ -325,7 +307,7 @@
   /// Return `true` if the given [identifier] is the return type of a factory
   /// constructor.
   static bool _isFactoryConstructorReturnType(SimpleIdentifier identifier) {
-    AstNode parent = identifier.parent;
+    var parent = identifier.parent;
     if (parent is ConstructorDeclaration) {
       return identical(parent.returnType, identifier) &&
           parent.factoryKeyword != null;
diff --git a/pkg/analyzer/lib/src/dart/resolver/type_name_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/type_name_resolver.dart
index 38e717a..c019b77 100644
--- a/pkg/analyzer/lib/src/dart/resolver/type_name_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/type_name_resolver.dart
@@ -26,29 +26,29 @@
   final bool isNonNullableByDefault;
   final ErrorReporter errorReporter;
 
-  Scope nameScope;
+  late Scope nameScope;
 
   /// If not `null`, the element of the [ClassDeclaration], or the
   /// [ClassTypeAlias] being resolved.
-  ClassElement enclosingClass;
+  ClassElement? enclosingClass;
 
   /// If not `null`, a direct child of an [ExtendsClause], [WithClause],
   /// or [ImplementsClause].
-  TypeName classHierarchy_typeName;
+  TypeName? classHierarchy_typeName;
 
   /// If not `null`, a direct child the [WithClause] in the [enclosingClass].
-  TypeName withClause_typeName;
+  TypeName? withClause_typeName;
 
   /// If not `null`, the [TypeName] of the redirected constructor being
   /// resolved, in the [enclosingClass].
-  TypeName redirectedConstructor_typeName;
+  TypeName? redirectedConstructor_typeName;
 
   /// If [resolveTypeName] finds out that the given [TypeName] with a
   /// [PrefixedIdentifier] name is actually the name of a class and the name of
   /// the constructor, it rewrites the [ConstructorName] to correctly represent
   /// the type and the constructor name, and set this field to the rewritten
   /// [ConstructorName]. Otherwise this field will be set `null`.
-  ConstructorName rewriteResult;
+  ConstructorName? rewriteResult;
 
   TypeNameResolver(this.typeSystem, TypeProvider typeProvider,
       this.isNonNullableByDefault, this.errorReporter)
@@ -116,8 +116,9 @@
   }
 
   /// Return type arguments, exactly [parameterCount].
-  List<DartType> _buildTypeArguments(TypeName node, int parameterCount) {
-    var arguments = node.typeArguments.arguments;
+  List<DartType> _buildTypeArguments(
+      TypeName node, TypeArgumentList argumentList, int parameterCount) {
+    var arguments = argumentList.arguments;
     var argumentCount = arguments.length;
 
     if (argumentCount != parameterCount) {
@@ -133,12 +134,10 @@
       return const <DartType>[];
     }
 
-    var typeArguments = List<DartType>.filled(parameterCount, null);
-    for (var i = 0; i < parameterCount; i++) {
-      typeArguments[i] = arguments[i].type;
-    }
-
-    return typeArguments;
+    return List.generate(
+      parameterCount,
+      (i) => arguments[i].type!,
+    );
   }
 
   NullabilitySuffix _getNullability(TypeName node) {
@@ -167,8 +166,8 @@
           parameters: const [],
           declaredReturnType: element.thisType,
           argumentTypes: const [],
-          contextReturnType: enclosingClass.thisType,
-        );
+          contextReturnType: enclosingClass!.thisType,
+        )!;
         return element.instantiate(
           typeArguments: typeArguments,
           nullabilitySuffix: _noneOrStarSuffix,
@@ -185,6 +184,7 @@
       if (element is ClassElement) {
         var typeArguments = _buildTypeArguments(
           node,
+          argumentList,
           element.typeParameters.length,
         );
         return element.instantiate(
@@ -194,6 +194,7 @@
       } else if (element is TypeAliasElement) {
         var typeArguments = _buildTypeArguments(
           node,
+          argumentList,
           element.typeParameters.length,
         );
         var type = element.instantiate(
@@ -206,13 +207,13 @@
         _ErrorHelper(errorReporter).reportNewWithNonType(node);
         return dynamicType;
       } else if (element is DynamicElementImpl) {
-        _buildTypeArguments(node, 0);
+        _buildTypeArguments(node, argumentList, 0);
         return DynamicTypeImpl.instance;
       } else if (element is NeverElementImpl) {
-        _buildTypeArguments(node, 0);
+        _buildTypeArguments(node, argumentList, 0);
         return _instantiateElementNever(nullability);
       } else if (element is TypeParameterElement) {
-        _buildTypeArguments(node, 0);
+        _buildTypeArguments(node, argumentList, 0);
         return element.instantiate(
           nullabilitySuffix: nullability,
         );
@@ -224,7 +225,7 @@
 
     if (element is ClassElement) {
       if (identical(node, withClause_typeName)) {
-        for (var mixin in enclosingClass.mixins) {
+        for (var mixin in enclosingClass!.mixins) {
           if (mixin.element == element) {
             return mixin;
           }
@@ -270,7 +271,7 @@
     }
   }
 
-  void _resolveToElement(TypeName node, Element element) {
+  void _resolveToElement(TypeName node, Element? element) {
     if (element == null) {
       node.type = dynamicType;
       if (!nameScope.shouldIgnoreUndefined(node.name)) {
@@ -394,8 +395,9 @@
   }
 
   static bool _isInstanceCreation(TypeName node) {
-    return node.parent is ConstructorName &&
-        node.parent.parent is InstanceCreationExpression;
+    var parent = node.parent;
+    return parent is ConstructorName &&
+        parent.parent is InstanceCreationExpression;
   }
 }
 
@@ -425,7 +427,7 @@
     return false;
   }
 
-  void reportNullOrNonTypeElement(TypeName node, Element element) {
+  void reportNullOrNonTypeElement(TypeName node, Element? element) {
     var identifier = node.name;
     var errorNode = _getErrorNode(node);
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/type_property_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/type_property_resolver.dart
index b12e424..fc603c5 100644
--- a/pkg/analyzer/lib/src/dart/resolver/type_property_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/type_property_resolver.dart
@@ -14,7 +14,6 @@
 import 'package:analyzer/src/dart/resolver/resolution_result.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/resolver.dart';
-import 'package:meta/meta.dart';
 
 /// Helper for resolving properties (getters, setters, or methods).
 class TypePropertyResolver {
@@ -25,19 +24,19 @@
   final TypeProviderImpl _typeProvider;
   final ExtensionMemberResolver _extensionResolver;
 
-  Expression _receiver;
-  SyntacticEntity _nameErrorEntity;
-  String _name;
+  late Expression? _receiver;
+  late SyntacticEntity _nameErrorEntity;
+  late String _name;
 
-  bool _needsGetterError;
-  bool _reportedGetterError;
-  ExecutableElement _getterRequested;
-  ExecutableElement _getterRecovery;
+  bool _needsGetterError = false;
+  bool _reportedGetterError = false;
+  ExecutableElement? _getterRequested;
+  ExecutableElement? _getterRecovery;
 
-  bool _needsSetterError;
-  bool _reportedSetterError;
-  ExecutableElement _setterRequested;
-  ExecutableElement _setterRecovery;
+  bool _needsSetterError = false;
+  bool _reportedSetterError = false;
+  ExecutableElement? _setterRequested;
+  ExecutableElement? _setterRecovery;
 
   TypePropertyResolver(this._resolver)
       : _definingLibrary = _resolver.definingLibrary,
@@ -59,13 +58,12 @@
   ///
   /// The [nameErrorEntity] is used to report the ambiguous extension issue.
   ResolutionResult resolve({
-    @required Expression receiver,
-    @required DartType receiverType,
-    @required String name,
-    @required AstNode receiverErrorNode,
-    @required SyntacticEntity nameErrorEntity,
+    required Expression? receiver,
+    required DartType receiverType,
+    required String name,
+    required AstNode receiverErrorNode,
+    required SyntacticEntity nameErrorEntity,
   }) {
-    assert(receiverType != null);
     _receiver = receiver;
     _name = name;
     _nameErrorEntity = nameErrorEntity;
@@ -98,8 +96,7 @@
         errorCode = CompileTimeErrorCode.UNCHECKED_INVOCATION_OF_NULLABLE_VALUE;
       } else {
         if (parentExpression is CascadeExpression) {
-          parentExpression =
-              (parentExpression as CascadeExpression).cascadeSections.first;
+          parentExpression = parentExpression.cascadeSections.first;
         }
         if (parentExpression is BinaryExpression) {
           errorCode = CompileTimeErrorCode
@@ -240,7 +237,7 @@
     bool ifNullSafe = false,
   }) {
     if (_typeSystem.isNonNullableByDefault ? ifNullSafe : ifLegacy) {
-      return type?.resolveToBound(_typeProvider.objectType);
+      return type.resolveToBound(_typeProvider.objectType);
     } else {
       return type;
     }
diff --git a/pkg/analyzer/lib/src/dart/resolver/typed_literal_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/typed_literal_resolver.dart
index e701244..d6c2dfc 100644
--- a/pkg/analyzer/lib/src/dart/resolver/typed_literal_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/typed_literal_resolver.dart
@@ -18,7 +18,6 @@
 import 'package:analyzer/src/generated/migratable_ast_info_provider.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
-import 'package:meta/meta.dart';
 
 /// Helper for resolving [ListLiteral]s and [SetOrMapLiteral]s.
 class TypedLiteralResolver {
@@ -71,12 +70,12 @@
   }
 
   void resolveListLiteral(ListLiteral node) {
-    InterfaceType listType;
+    InterfaceType? listType;
 
-    List<TypeAnnotation> typeArguments = node.typeArguments?.arguments;
+    var typeArguments = node.typeArguments?.arguments;
     if (typeArguments != null) {
       if (typeArguments.length == 1) {
-        DartType elementType = typeArguments[0].type;
+        DartType elementType = typeArguments[0].type!;
         if (!elementType.isDynamic) {
           listType = _typeProvider.listType2(elementType);
         }
@@ -102,11 +101,11 @@
     (node as SetOrMapLiteralImpl).becomeUnresolved();
     var typeArguments = node.typeArguments?.arguments;
 
-    InterfaceType literalType;
+    InterfaceType? literalType;
     var literalResolution = _computeSetOrMapResolution(node);
     if (literalResolution.kind == _LiteralResolutionKind.set) {
       if (typeArguments != null && typeArguments.length == 1) {
-        var elementType = typeArguments[0].type;
+        var elementType = typeArguments[0].type!;
         literalType = _typeProvider.setType2(elementType);
       } else {
         literalType =
@@ -114,8 +113,8 @@
       }
     } else if (literalResolution.kind == _LiteralResolutionKind.map) {
       if (typeArguments != null && typeArguments.length == 2) {
-        var keyType = typeArguments[0].type;
-        var valueType = typeArguments[1].type;
+        var keyType = typeArguments[0].type!;
+        var valueType = typeArguments[1].type!;
         literalType = _typeProvider.mapType2(keyType, valueType);
       } else {
         literalType =
@@ -137,7 +136,7 @@
             node.typeArguments == null &&
             node.isMap) {
           // The node is really an empty set literal with no type arguments.
-          (node as SetOrMapLiteralImpl).becomeMap();
+          node.becomeMap();
         }
       } else if (typeArguments.length == 2) {
         DartType keyType = typeArguments[0];
@@ -145,9 +144,9 @@
         _pushCollectionTypesDownToAll(_getSetOrMapElements(node),
             iterableType: literalType, keyType: keyType, valueType: valueType);
       }
-      (node as SetOrMapLiteralImpl).contextType = literalType;
+      node.contextType = literalType;
     } else {
-      (node as SetOrMapLiteralImpl).contextType = null;
+      node.contextType = null;
     }
 
     node.visitChildren(_resolver);
@@ -156,7 +155,7 @@
 
   DartType _computeElementType(CollectionElement element) {
     if (element is Expression) {
-      return element.staticType;
+      return element.staticType!;
     } else if (element is ForElement) {
       return _computeElementType(element.body);
     } else if (element is IfElement) {
@@ -174,7 +173,7 @@
       // This error will be reported elsewhere.
       return _typeProvider.dynamicType;
     } else if (element is SpreadElement) {
-      var expressionType = element.expression.staticType;
+      var expressionType = element.expression.staticType!;
 
       var iterableType = expressionType.asInstanceOf(
         _typeProvider.iterableElement,
@@ -216,7 +215,7 @@
   _LiteralResolution _computeSetOrMapResolution(SetOrMapLiteral literal) {
     _LiteralResolution typeArgumentsResolution =
         _fromTypeArguments(literal.typeArguments?.arguments);
-    DartType contextType = InferenceContext.getContext(literal);
+    var contextType = InferenceContext.getContext(literal);
     _LiteralResolution contextResolution = _fromContextType(contextType);
     _LeafElements elementCounts = _LeafElements(_getSetOrMapElements(literal));
     _LiteralResolution elementResolution = elementCounts.resolution;
@@ -271,7 +270,7 @@
   ///
   /// If [contextType] implements `Map`, but not `Iterable`, then *e* is a map
   /// literal.
-  _LiteralResolution _fromContextType(DartType contextType) {
+  _LiteralResolution _fromContextType(DartType? contextType) {
     if (contextType != null) {
       var unwrappedContextType = _typeSystem.futureOrBase(contextType);
       // TODO(brianwilkerson) Find out what the "greatest closure" is and use that
@@ -306,14 +305,14 @@
   }
 
   /// Return the resolution that is indicated by the given [arguments].
-  _LiteralResolution _fromTypeArguments(List<TypeAnnotation> arguments) {
+  _LiteralResolution _fromTypeArguments(List<TypeAnnotation>? arguments) {
     if (arguments != null) {
       if (arguments.length == 1) {
         return _LiteralResolution(_LiteralResolutionKind.set,
-            _typeProvider.setType2(arguments[0].type));
+            _typeProvider.setType2(arguments[0].type!));
       } else if (arguments.length == 2) {
         return _LiteralResolution(_LiteralResolutionKind.map,
-            _typeProvider.mapType2(arguments[0].type, arguments[1].type));
+            _typeProvider.mapType2(arguments[0].type!, arguments[1].type!));
       }
     }
     return _LiteralResolution(_LiteralResolutionKind.ambiguous, null);
@@ -326,10 +325,10 @@
       _migratableAstInfoProvider.getSetOrMapElements(node);
 
   _InferredCollectionElementTypeInformation _inferCollectionElementType(
-      CollectionElement element) {
+      CollectionElement? element) {
     if (element is Expression) {
       return _InferredCollectionElementTypeInformation(
-          elementType: element.staticType, keyType: null, valueType: null);
+          elementType: element.staticType!, keyType: null, valueType: null);
     } else if (element is ForElement) {
       return _inferCollectionElementType(element.body);
     } else if (element is IfElement) {
@@ -348,7 +347,7 @@
           keyType: element.key.staticType,
           valueType: element.value.staticType);
     } else if (element is SpreadElement) {
-      DartType expressionType = element.expression.staticType;
+      var expressionType = element.expression.staticType!;
 
       var iterableType = expressionType.asInstanceOf(
         _typeProvider.iterableElement,
@@ -417,8 +416,8 @@
     }
   }
 
-  DartType _inferListType(ListLiteral node, {bool downwards = false}) {
-    DartType contextType = InferenceContext.getContext(node);
+  InterfaceType? _inferListType(ListLiteral node, {bool downwards = false}) {
+    var contextType = InferenceContext.getContext(node);
 
     var element = _typeProvider.listElement;
     var typeParameters = element.typeParameters;
@@ -460,15 +459,15 @@
       isConst: node.isConst,
       errorReporter: _errorReporter,
       errorNode: node,
-    );
+    )!;
     return element.instantiate(
       typeArguments: typeArguments,
       nullabilitySuffix: _noneOrStarSuffix,
     );
   }
 
-  InterfaceType _inferMapTypeDownwards(
-      SetOrMapLiteral node, DartType contextType) {
+  InterfaceType? _inferMapTypeDownwards(
+      SetOrMapLiteral node, DartType? contextType) {
     if (contextType == null) {
       return null;
     }
@@ -484,7 +483,7 @@
       isConst: node.isConst,
       errorReporter: _errorReporter,
       errorNode: node,
-    );
+    )!;
     return element.instantiate(
       typeArguments: typeArguments,
       nullabilitySuffix: _noneOrStarSuffix,
@@ -493,7 +492,7 @@
 
   DartType _inferSetOrMapLiteralType(SetOrMapLiteral literal) {
     var literalImpl = literal as SetOrMapLiteralImpl;
-    DartType contextType = literalImpl.contextType;
+    var contextType = literalImpl.contextType;
     literalImpl.contextType = null; // Not needed anymore.
     List<CollectionElement> elements = _getSetOrMapElements(literal);
     List<_InferredCollectionElementTypeInformation> inferredTypes = [];
@@ -565,7 +564,8 @@
     return _typeProvider.dynamicType;
   }
 
-  DartType _inferSetTypeDownwards(SetOrMapLiteral node, DartType contextType) {
+  InterfaceType? _inferSetTypeDownwards(
+      SetOrMapLiteral node, DartType? contextType) {
     if (contextType == null) {
       return null;
     }
@@ -581,18 +581,18 @@
       isConst: node.isConst,
       errorReporter: _errorReporter,
       errorNode: node,
-    );
+    )!;
     return element.instantiate(
       typeArguments: typeArguments,
       nullabilitySuffix: _noneOrStarSuffix,
     );
   }
 
-  void _pushCollectionTypesDown(CollectionElement element,
-      {DartType elementType,
-      @required DartType iterableType,
-      DartType keyType,
-      DartType valueType}) {
+  void _pushCollectionTypesDown(CollectionElement? element,
+      {DartType? elementType,
+      required DartType iterableType,
+      DartType? keyType,
+      DartType? valueType}) {
     if (element is Expression) {
       InferenceContext.setType(element, elementType);
     } else if (element is ForElement) {
@@ -624,11 +624,10 @@
   }
 
   void _pushCollectionTypesDownToAll(List<CollectionElement> elements,
-      {DartType elementType,
-      @required DartType iterableType,
-      DartType keyType,
-      DartType valueType}) {
-    assert(iterableType != null);
+      {DartType? elementType,
+      required DartType iterableType,
+      DartType? keyType,
+      DartType? valueType}) {
     for (CollectionElement element in elements) {
       _pushCollectionTypesDown(element,
           elementType: elementType,
@@ -657,16 +656,13 @@
   }
 
   void _resolveListLiteral2(ListLiteral node) {
-    List<TypeAnnotation> typeArguments = node.typeArguments?.arguments;
+    var typeArguments = node.typeArguments?.arguments;
 
     // If we have explicit arguments, use them.
     if (typeArguments != null) {
       DartType elementType = _dynamicType;
-      if (typeArguments != null && typeArguments.length == 1) {
-        DartType argumentType = typeArguments[0].type;
-        if (argumentType != null) {
-          elementType = argumentType;
-        }
+      if (typeArguments.length == 1) {
+        elementType = typeArguments[0].type!;
       }
       _recordStaticType(
         node,
@@ -681,12 +677,12 @@
     DartType listDynamicType = _typeProvider.listType2(_dynamicType);
 
     // If there are no type arguments, try to infer some arguments.
-    DartType inferred = _inferListType(node);
+    var inferred = _inferListType(node);
 
     if (inferred != listDynamicType) {
       // TODO(brianwilkerson) Determine whether we need to make the inferred
       //  type non-nullable here or whether it will already be non-nullable.
-      _recordStaticType(node, inferred);
+      _recordStaticType(node, inferred!);
       return;
     }
 
@@ -703,7 +699,7 @@
     if (typeArguments != null) {
       if (typeArguments.length == 1) {
         (node as SetOrMapLiteralImpl).becomeSet();
-        var elementType = typeArguments[0].type;
+        var elementType = typeArguments[0].type!;
         _recordStaticType(
           node,
           _typeProvider.setElement.instantiate(
@@ -714,8 +710,8 @@
         return;
       } else if (typeArguments.length == 2) {
         (node as SetOrMapLiteralImpl).becomeMap();
-        var keyType = typeArguments[0].type;
-        var valueType = typeArguments[1].type;
+        var keyType = typeArguments[0].type!;
+        var valueType = typeArguments[1].type!;
         _recordStaticType(
           node,
           _typeProvider.mapElement.instantiate(
@@ -755,7 +751,7 @@
     _recordStaticType(node, literalType);
   }
 
-  DartType _toMapType(SetOrMapLiteral node, DartType contextType,
+  DartType _toMapType(SetOrMapLiteral node, DartType? contextType,
       List<_InferredCollectionElementTypeInformation> inferredTypes) {
     DartType dynamicType = _typeProvider.dynamicType;
 
@@ -768,16 +764,15 @@
       nullabilitySuffix: _noneOrStarSuffix,
     );
 
-    var parameters =
-        List<ParameterElement>.filled(2 * inferredTypes.length, null);
-    var argumentTypes = List<DartType>.filled(2 * inferredTypes.length, null);
+    var parameters = <ParameterElement>[];
+    var argumentTypes = <DartType>[];
     for (var i = 0; i < inferredTypes.length; i++) {
-      parameters[2 * i + 0] = ParameterElementImpl.synthetic(
-          'key', genericKeyType, ParameterKind.POSITIONAL);
-      parameters[2 * i + 1] = ParameterElementImpl.synthetic(
-          'value', genericValueType, ParameterKind.POSITIONAL);
-      argumentTypes[2 * i + 0] = inferredTypes[i].keyType ?? dynamicType;
-      argumentTypes[2 * i + 1] = inferredTypes[i].valueType ?? dynamicType;
+      parameters.add(ParameterElementImpl.synthetic(
+          'key', genericKeyType, ParameterKind.POSITIONAL));
+      parameters.add(ParameterElementImpl.synthetic(
+          'value', genericValueType, ParameterKind.POSITIONAL));
+      argumentTypes.add(inferredTypes[i].keyType ?? dynamicType);
+      argumentTypes.add(inferredTypes[i].valueType ?? dynamicType);
     }
 
     var typeArguments = _typeSystem.inferGenericFunctionOrType(
@@ -786,14 +781,14 @@
       declaredReturnType: element.thisType,
       argumentTypes: argumentTypes,
       contextReturnType: contextType,
-    );
+    )!;
     return element.instantiate(
       typeArguments: typeArguments,
       nullabilitySuffix: _noneOrStarSuffix,
     );
   }
 
-  DartType _toSetType(SetOrMapLiteral node, DartType contextType,
+  DartType _toSetType(SetOrMapLiteral node, DartType? contextType,
       List<_InferredCollectionElementTypeInformation> inferredTypes) {
     DartType dynamicType = _typeProvider.dynamicType;
 
@@ -803,12 +798,12 @@
       nullabilitySuffix: _noneOrStarSuffix,
     );
 
-    var parameters = List<ParameterElement>.filled(inferredTypes.length, null);
-    var argumentTypes = List<DartType>.filled(inferredTypes.length, null);
+    var parameters = <ParameterElement>[];
+    var argumentTypes = <DartType>[];
     for (var i = 0; i < inferredTypes.length; i++) {
-      parameters[i] = ParameterElementImpl.synthetic(
-          'element', genericElementType, ParameterKind.POSITIONAL);
-      argumentTypes[i] = inferredTypes[i].elementType ?? dynamicType;
+      parameters.add(ParameterElementImpl.synthetic(
+          'element', genericElementType, ParameterKind.POSITIONAL));
+      argumentTypes.add(inferredTypes[i].elementType ?? dynamicType);
     }
 
     var typeArguments = _typeSystem.inferGenericFunctionOrType(
@@ -817,7 +812,7 @@
       declaredReturnType: element.thisType,
       argumentTypes: argumentTypes,
       contextReturnType: contextType,
-    );
+    )!;
     return element.instantiate(
       typeArguments: typeArguments,
       nullabilitySuffix: _noneOrStarSuffix,
@@ -826,9 +821,9 @@
 }
 
 class _InferredCollectionElementTypeInformation {
-  final DartType elementType;
-  final DartType keyType;
-  final DartType valueType;
+  final DartType? elementType;
+  final DartType? keyType;
+  final DartType? valueType;
 
   _InferredCollectionElementTypeInformation(
       {this.elementType, this.keyType, this.valueType});
@@ -838,13 +833,13 @@
       _InferredCollectionElementTypeInformation thenInfo,
       _InferredCollectionElementTypeInformation elseInfo) {
     if (thenInfo.isDynamic) {
-      DartType dynamic = thenInfo.elementType;
+      var dynamic = thenInfo.elementType!;
       return _InferredCollectionElementTypeInformation(
           elementType: _dynamicOrNull(elseInfo.elementType, dynamic),
           keyType: _dynamicOrNull(elseInfo.keyType, dynamic),
           valueType: _dynamicOrNull(elseInfo.valueType, dynamic));
     } else if (elseInfo.isDynamic) {
-      DartType dynamic = elseInfo.elementType;
+      DartType dynamic = elseInfo.elementType!;
       return _InferredCollectionElementTypeInformation(
           elementType: _dynamicOrNull(thenInfo.elementType, dynamic),
           keyType: _dynamicOrNull(thenInfo.keyType, dynamic),
@@ -865,11 +860,11 @@
 
   bool get isDynamic =>
       elementType != null &&
-      elementType.isDynamic &&
+      elementType!.isDynamic &&
       keyType != null &&
-      keyType.isDynamic &&
+      keyType!.isDynamic &&
       valueType != null &&
-      valueType.isDynamic;
+      valueType!.isDynamic;
 
   bool get mustBeMap => canBeMap && elementType == null;
 
@@ -880,15 +875,15 @@
     return '($elementType, $keyType, $valueType)';
   }
 
-  static DartType _dynamicOrNull(DartType type, DartType dynamic) {
+  static DartType? _dynamicOrNull(DartType? type, DartType dynamic) {
     if (type == null) {
       return null;
     }
     return dynamic;
   }
 
-  static DartType _leastUpperBoundOfTypes(
-      TypeSystemImpl typeSystem, DartType first, DartType second) {
+  static DartType? _leastUpperBoundOfTypes(
+      TypeSystemImpl typeSystem, DartType? first, DartType? second) {
     if (first == null) {
       return second;
     } else if (second == null) {
@@ -927,7 +922,7 @@
   }
 
   /// Recursively add the given collection [element] to the counts.
-  void _count(CollectionElement element) {
+  void _count(CollectionElement? element) {
     if (element is Expression) {
       if (_isComplete(element)) {
         expressionCount++;
@@ -972,7 +967,7 @@
 
   /// The type that should be used as the inference context when performing type
   /// inference for the literal.
-  DartType contextType;
+  DartType? contextType;
 
   /// Initialize a newly created resolution.
   _LiteralResolution(this.kind, this.contextType);
diff --git a/pkg/analyzer/lib/src/dart/resolver/variable_declaration_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/variable_declaration_resolver.dart
index 10da629..68efd6c 100644
--- a/pkg/analyzer/lib/src/dart/resolver/variable_declaration_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/variable_declaration_resolver.dart
@@ -11,7 +11,6 @@
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/resolver.dart';
-import 'package:meta/meta.dart';
 
 /// Helper for resolving [VariableDeclaration]s.
 class VariableDeclarationResolver {
@@ -19,8 +18,8 @@
   final bool _strictInference;
 
   VariableDeclarationResolver({
-    @required ResolverVisitor resolver,
-    @required bool strictInference,
+    required ResolverVisitor resolver,
+    required bool strictInference,
   })  : _resolver = resolver,
         _strictInference = strictInference;
 
@@ -40,7 +39,7 @@
       return;
     }
 
-    var element = node.declaredElement;
+    var element = node.declaredElement!;
     var isTopLevel =
         element is FieldElement || element is TopLevelVariableElement;
 
@@ -55,7 +54,7 @@
     initializer = node.initializer;
 
     if (parent.type == null) {
-      _setInferredType(element, initializer.staticType);
+      _setInferredType(element, initializer!.staticType!);
     }
 
     if (isTopLevel) {
@@ -70,7 +69,7 @@
     // evaluate the const constructor).
     if (element is ConstVariableElement) {
       (element as ConstVariableElement).constantInitializer =
-          ConstantAstCloner().cloneNode(initializer);
+          ConstantAstCloner().cloneNullableNode(initializer);
     }
   }
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart
index 672ed6f..41678af 100644
--- a/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart
@@ -11,17 +11,16 @@
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/resolver.dart';
-import 'package:meta/meta.dart';
 
 /// Helper for resolving [YieldStatement]s.
 class YieldStatementResolver {
   final ResolverVisitor _resolver;
 
   YieldStatementResolver({
-    @required ResolverVisitor resolver,
+    required ResolverVisitor resolver,
   }) : _resolver = resolver;
 
-  ExecutableElement get _enclosingFunction => _resolver.enclosingFunction;
+  ExecutableElement get _enclosingFunction => _resolver.enclosingFunction!;
 
   ErrorReporter get _errorReporter => _resolver.errorReporter;
 
@@ -30,7 +29,7 @@
   TypeSystemImpl get _typeSystem => _resolver.typeSystem;
 
   void resolve(YieldStatement node) {
-    if (_enclosingFunction?.isGenerator ?? false) {
+    if (_enclosingFunction.isGenerator) {
       _resolve_generator(node);
     } else {
       _resolve_notGenerator(node);
@@ -73,7 +72,7 @@
     var declaredReturnType = _enclosingFunction.returnType;
 
     var expression = node.expression;
-    var expressionType = expression.staticType;
+    var expressionType = expression.staticType!;
 
     DartType impliedReturnType;
     if (isYieldEach) {
@@ -84,15 +83,13 @@
       impliedReturnType = _typeProvider.streamType2(expressionType);
     }
 
-    if (declaredReturnType != null) {
-      if (!_typeSystem.isAssignableTo2(impliedReturnType, declaredReturnType)) {
-        _errorReporter.reportErrorForNode(
-          CompileTimeErrorCode.YIELD_OF_INVALID_TYPE,
-          expression,
-          [impliedReturnType, declaredReturnType],
-        );
-        return;
-      }
+    if (!_typeSystem.isAssignableTo2(impliedReturnType, declaredReturnType)) {
+      _errorReporter.reportErrorForNode(
+        CompileTimeErrorCode.YIELD_OF_INVALID_TYPE,
+        expression,
+        [impliedReturnType, declaredReturnType],
+      );
+      return;
     }
 
     if (isYieldEach) {
diff --git a/pkg/analyzer/lib/src/dart/scanner/scanner.dart b/pkg/analyzer/lib/src/dart/scanner/scanner.dart
index 48aab67..2e85266 100644
--- a/pkg/analyzer/lib/src/dart/scanner/scanner.dart
+++ b/pkg/analyzer/lib/src/dart/scanner/scanner.dart
@@ -15,7 +15,6 @@
 import 'package:analyzer/src/dart/scanner/reader.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:meta/meta.dart';
 import 'package:pub_semver/pub_semver.dart';
 
 export 'package:analyzer/src/dart/error/syntactic_errors.dart';
@@ -44,14 +43,14 @@
   /// If the file has [fasta.LanguageVersionToken], it is allowed to use the
   /// language version greater than the one specified in the package config.
   /// So, we need to know the full feature set for the context.
-  FeatureSet _featureSetForOverriding;
+  late final FeatureSet _featureSetForOverriding;
 
   /// The flag specifying whether documentation comments should be parsed.
   bool _preserveComments = true;
 
   final List<int> lineStarts = <int>[];
 
-  /*late final*/ Token firstToken;
+  late final Token firstToken;
 
   /// A flag indicating whether the scanner should recognize the `>>>` operator
   /// and the `>>>=` operator.
@@ -65,9 +64,9 @@
   /// Use [configureFeatures] rather than this field.
   bool enableNonNullable = false;
 
-  Version _overrideVersion;
+  Version? _overrideVersion;
 
-  FeatureSet _featureSet;
+  late FeatureSet _featureSet;
 
   /// Initialize a newly created scanner to scan characters from the given
   /// [source]. The given character [reader] will be used to read the characters
@@ -79,7 +78,7 @@
           contents: reader.getContents(), offset: reader.offset);
 
   factory Scanner.fasta(Source source, AnalysisErrorListener errorListener,
-      {String contents, int offset = -1}) {
+      {String? contents, int offset = -1}) {
     return Scanner._(
         source, contents ?? source.contents.data, offset, errorListener);
   }
@@ -101,7 +100,7 @@
 
   /// The language version override specified for this compilation unit using a
   /// token like '// @dart = 2.7', or `null` if no override is specified.
-  Version get overrideVersion => _overrideVersion;
+  Version? get overrideVersion => _overrideVersion;
 
   set preserveComments(bool preserveComments) {
     _preserveComments = preserveComments;
@@ -113,8 +112,8 @@
   /// that callers are forced to use this API.  Note that this would be a
   /// breaking change.
   void configureFeatures({
-    @required FeatureSet featureSetForOverriding,
-    @required FeatureSet featureSet,
+    required FeatureSet featureSetForOverriding,
+    required FeatureSet featureSet,
   }) {
     _featureSetForOverriding = featureSetForOverriding;
     _featureSet = featureSet;
@@ -123,7 +122,7 @@
   }
 
   void reportError(
-      ScannerErrorCode errorCode, int offset, List<Object> arguments) {
+      ScannerErrorCode errorCode, int offset, List<Object?>? arguments) {
     _errorListener
         .onError(AnalysisError(source, offset, 1, errorCode, arguments));
   }
@@ -146,11 +145,7 @@
   /// Set [reportScannerErrors] `true` when using the old parser.
   Token tokenize({bool reportScannerErrors = true}) {
     fasta.ScannerResult result = fasta.scanString(_contents,
-        configuration: _featureSet != null
-            ? buildConfig(_featureSet)
-            : fasta.ScannerConfiguration(
-                enableTripleShift: enableGtGtGt,
-                enableNonNullable: enableNonNullable),
+        configuration: buildConfig(_featureSet),
         includeComments: _preserveComments,
         languageVersionChanged: _languageVersionChanged);
 
@@ -170,8 +165,8 @@
       // The default recovery strategy used by scanString
       // places all error tokens at the head of the stream.
       while (token.type == TokenType.BAD_INPUT) {
-        translateErrorToken(token, reportError);
-        token = token.next;
+        translateErrorToken(token as fasta.ErrorToken, reportError);
+        token = token.next!;
       }
     }
 
@@ -181,7 +176,7 @@
       final int delta = _readerOffset + 1;
       do {
         token.offset += delta;
-        token = token.next;
+        token = token.next!;
       } while (!token.isEof);
     }
     return firstToken;
@@ -194,7 +189,9 @@
     if (overrideMajor < 0 || overrideMinor < 0) {
       return;
     }
-    _overrideVersion = Version(overrideMajor, overrideMinor, 0);
+
+    var overrideVersion = Version(overrideMajor, overrideMinor, 0);
+    _overrideVersion = overrideVersion;
 
     var latestVersion = ExperimentStatus.currentVersion;
     if (overrideVersion > latestVersion) {
@@ -209,17 +206,15 @@
       );
       _overrideVersion = null;
     } else {
-      if (_featureSet != null) {
-        _featureSet = _featureSetForOverriding.restrictToVersion(
-          _overrideVersion,
-        );
-        scanner.configuration = buildConfig(_featureSet);
-      }
+      _featureSet = _featureSetForOverriding.restrictToVersion(
+        overrideVersion,
+      );
+      scanner.configuration = buildConfig(_featureSet);
     }
   }
 
   /// Return a ScannerConfiguration based upon the specified feature set.
-  static fasta.ScannerConfiguration buildConfig(FeatureSet featureSet) =>
+  static fasta.ScannerConfiguration buildConfig(FeatureSet? featureSet) =>
       featureSet == null
           ? fasta.ScannerConfiguration()
           : fasta.ScannerConfiguration(
diff --git a/pkg/analyzer/lib/src/dart/sdk/sdk.dart b/pkg/analyzer/lib/src/dart/sdk/sdk.dart
index 8b55ebf..2a1a0ec 100644
--- a/pkg/analyzer/lib/src/dart/sdk/sdk.dart
+++ b/pkg/analyzer/lib/src/dart/sdk/sdk.dart
@@ -29,16 +29,16 @@
 /// library map.
 abstract class AbstractDartSdk implements DartSdk {
   /// The resource provider used to access the file system.
-  /*late final*/ ResourceProvider resourceProvider;
+  late final ResourceProvider resourceProvider;
 
   /// A mapping from Dart library URI's to the library represented by that URI.
   LibraryMap libraryMap = LibraryMap();
 
   /// The mapping from Dart URI's to the corresponding sources.
-  final Map<String, Source> _uriToSourceMap = HashMap<String, Source>();
+  final Map<String, Source?> _uriToSourceMap = HashMap<String, Source?>();
 
   @override
-  List<SdkLibrary> get sdkLibraries => libraryMap.sdkLibraries;
+  List<SdkLibraryImpl> get sdkLibraries => libraryMap.sdkLibraries;
 
   /// Return the path separator used by the resource provider.
   String get separator => resourceProvider.pathContext.separator;
@@ -66,10 +66,10 @@
   }
 
   @override
-  Source fromFileUri(Uri uri) {
+  Source? fromFileUri(Uri uri) {
     File file =
         resourceProvider.getFile(resourceProvider.pathContext.fromUri(uri));
-    String path = _getPath(file);
+    String? path = _getPath(file);
     if (path == null) {
       return null;
     }
@@ -83,12 +83,12 @@
     return null;
   }
 
-  String getRelativePathFromFile(File file);
+  String? getRelativePathFromFile(File file);
 
   @override
-  SdkLibrary getSdkLibrary(String dartUri) => libraryMap.getLibrary(dartUri);
+  SdkLibrary? getSdkLibrary(String dartUri) => libraryMap.getLibrary(dartUri);
 
-  Source internalMapDartUri(String dartUri) {
+  Source? internalMapDartUri(String dartUri) {
     // TODO(brianwilkerson) Figure out how to unify the implementations in the
     // two subclasses.
     String libraryName;
@@ -101,7 +101,7 @@
       libraryName = dartUri;
       relativePath = "";
     }
-    SdkLibrary library = getSdkLibrary(libraryName);
+    SdkLibrary? library = getSdkLibrary(libraryName);
     if (library == null) {
       return null;
     }
@@ -130,8 +130,8 @@
   }
 
   @override
-  Source mapDartUri(String /*!*/ dartUri) {
-    Source source = _uriToSourceMap[dartUri];
+  Source? mapDartUri(String dartUri) {
+    Source? source = _uriToSourceMap[dartUri];
     if (source == null) {
       source = internalMapDartUri(dartUri);
       _uriToSourceMap[dartUri] = source;
@@ -139,21 +139,21 @@
     return source;
   }
 
-  String _getPath(File file) {
+  String? _getPath(File file) {
     List<SdkLibrary> libraries = libraryMap.sdkLibraries;
     int length = libraries.length;
-    List<String> paths = List.filled(length, null);
-    String filePath = getRelativePathFromFile(file);
+    String? filePath = getRelativePathFromFile(file);
     if (filePath == null) {
       return null;
     }
+    List<String> paths = <String>[];
     for (int i = 0; i < length; i++) {
       SdkLibrary library = libraries[i];
       String libraryPath = library.path.replaceAll('/', separator);
       if (filePath == libraryPath) {
         return library.shortName;
       }
-      paths[i] = libraryPath;
+      paths.add(libraryPath);
     }
     for (int i = 0; i < length; i++) {
       SdkLibrary library = libraries[i];
@@ -178,7 +178,7 @@
 
   static const String _EMBEDDED_LIB_MAP_KEY = 'embedded_libs';
 
-  Version _languageVersion;
+  late final Version _languageVersion;
 
   final Map<String, String> _urlMappings = HashMap<String, String>();
 
@@ -186,8 +186,8 @@
   /// https://github.com/dart-lang/sdk/issues/42890
   EmbedderSdk(
     ResourceProvider resourceProvider,
-    Map<Folder, YamlMap> embedderYamls, {
-    Version languageVersion,
+    Map<Folder, YamlMap>? embedderYamls, {
+    Version? languageVersion,
   }) {
     this.resourceProvider = resourceProvider;
     _languageVersion =
@@ -196,11 +196,11 @@
   }
 
   @override
-  String get allowedExperimentsJson {
+  String? get allowedExperimentsJson {
     var coreSource = mapDartUri('dart:core');
     if (coreSource != null) {
       var coreFile = resourceProvider.getFile(coreSource.fullName);
-      var embeddedFolder = coreFile.parent.parent;
+      var embeddedFolder = coreFile.parent!.parent!;
       try {
         return embeddedFolder
             .getChildAssumingFolder('_internal')
@@ -225,7 +225,7 @@
   String getRelativePathFromFile(File file) => file.path;
 
   @override
-  Source internalMapDartUri(String dartUri) {
+  Source? internalMapDartUri(String dartUri) {
     String libraryName;
     String relativePath;
     int index = dartUri.indexOf('/');
@@ -236,7 +236,7 @@
       libraryName = dartUri;
       relativePath = "";
     }
-    SdkLibrary library = getSdkLibrary(libraryName);
+    SdkLibrary? library = getSdkLibrary(libraryName);
     if (library == null) {
       return null;
     }
@@ -351,17 +351,17 @@
   final Folder _sdkDirectory;
 
   /// The directory within the SDK directory that contains the libraries.
-  /*late final*/ Folder _libraryDirectory;
+  Folder? _libraryDirectory;
 
   /// The revision number of this SDK, or `"0"` if the revision number cannot be
   /// discovered.
-  /*late final*/ String _sdkVersion;
+  String? _sdkVersion;
 
   /// The cached language version of this SDK.
-  /*late final*/ Version _languageVersion;
+  Version? _languageVersion;
 
   /// The file containing the pub executable.
-  /*late final*/ File _pubExecutable;
+  File? _pubExecutable;
 
   /// Initialize a newly created SDK to represent the Dart SDK installed in the
   /// [sdkDirectory].
@@ -373,15 +373,11 @@
 
   @override
   String get allowedExperimentsJson {
-    try {
-      return _sdkDirectory
-          .getChildAssumingFolder('lib')
-          .getChildAssumingFolder('_internal')
-          .getChildAssumingFile('allowed_experiments.json')
-          .readAsStringSync();
-    } catch (_) {
-      return null;
-    }
+    return _sdkDirectory
+        .getChildAssumingFolder('lib')
+        .getChildAssumingFolder('_internal')
+        .getChildAssumingFile('allowed_experiments.json')
+        .readAsStringSync();
   }
 
   /// Return the directory containing the SDK.
@@ -400,7 +396,7 @@
       _languageVersion = languageVersionFromSdkVersion(sdkVersionStr);
     }
 
-    return _languageVersion;
+    return _languageVersion!;
   }
 
   /// Return the directory within the SDK directory that contains the libraries.
@@ -424,19 +420,16 @@
   @override
   String get sdkVersion {
     if (_sdkVersion == null) {
-      _sdkVersion = DartSdk.DEFAULT_VERSION;
       File revisionFile =
           _sdkDirectory.getChildAssumingFile(_VERSION_FILE_NAME);
       try {
         String revision = revisionFile.readAsStringSync();
-        if (revision != null) {
-          _sdkVersion = revision.trim();
-        }
+        _sdkVersion = revision.trim();
       } on FileSystemException {
-        // Fall through to return the default.
+        return _sdkVersion = DartSdk.DEFAULT_VERSION;
       }
     }
-    return _sdkVersion;
+    return _sdkVersion!;
   }
 
   /// Determine the search order for trying to locate the [_LIBRARIES_FILE].
@@ -460,7 +453,7 @@
   }
 
   @override
-  String getRelativePathFromFile(File file) {
+  String? getRelativePathFromFile(File file) {
     String filePath = file.path;
     String libPath = libraryDirectory.path;
     if (!filePath.startsWith("$libPath$separator")) {
@@ -473,13 +466,14 @@
   /// Return the initialized library map.
   LibraryMap initialLibraryMap() {
     List<String> searchedPaths = <String>[];
-    /*late*/ StackTrace lastStackTrace;
-    /*late*/ Object lastException;
+    late StackTrace lastStackTrace;
+    late Object lastException;
     for (File librariesFile in _libraryMapLocations) {
       try {
         String contents = librariesFile.readAsStringSync();
         return SdkLibrariesReader().readFromFile(librariesFile, contents);
       } catch (exception, stackTrace) {
+        print('[exception: $exception][stackTrace: $stackTrace]');
         searchedPaths.add(librariesFile.path);
         lastException = exception;
         lastStackTrace = stackTrace;
@@ -497,7 +491,7 @@
   }
 
   @override
-  Source internalMapDartUri(String dartUri) {
+  Source? internalMapDartUri(String dartUri) {
     String libraryName;
     String relativePath;
     int index = dartUri.indexOf('/');
@@ -508,14 +502,14 @@
       libraryName = dartUri;
       relativePath = "";
     }
-    SdkLibrary library = getSdkLibrary(libraryName);
+    SdkLibrary? library = getSdkLibrary(libraryName);
     if (library == null) {
       return null;
     }
     try {
       File file = libraryDirectory.getChildAssumingFile(library.path);
       if (relativePath.isNotEmpty) {
-        File relativeFile = file.parent.getChildAssumingFile(relativePath);
+        File relativeFile = file.parent!.getChildAssumingFile(relativePath);
         if (relativeFile.path == file.path) {
           // The relative file is the library, so return a Source for the
           // library rather than the part format.
@@ -568,6 +562,7 @@
       content: libraryFileContents,
       featureSet: featureSet,
       throwIfDiagnostics: false,
+      path: source.fullName,
     );
     var unit = parseResult.unit;
 
diff --git a/pkg/analyzer/lib/src/dartdoc/dartdoc_directive_info.dart b/pkg/analyzer/lib/src/dartdoc/dartdoc_directive_info.dart
index 79be2df..2bcb023 100644
--- a/pkg/analyzer/lib/src/dartdoc/dartdoc_directive_info.dart
+++ b/pkg/analyzer/lib/src/dartdoc/dartdoc_directive_info.dart
@@ -46,8 +46,8 @@
   /// there is one.
   void extractTemplate(String comment) {
     for (Match match in templateRegExp.allMatches(comment)) {
-      String name = match.group(1).trim();
-      String body = match.group(2).trim();
+      String name = match.group(1)!.trim();
+      String body = match.group(2)!.trim();
       templateMap[name] = _stripDelimiters(body).join('\n');
     }
   }
@@ -62,10 +62,10 @@
     List<String> lines = _stripDelimiters(comment);
     for (int i = lines.length - 1; i >= 0; i--) {
       String line = lines[i];
-      Match match = macroRegExp.firstMatch(line);
+      var match = macroRegExp.firstMatch(line);
       if (match != null) {
-        String name = match.group(1);
-        String value = templateMap[name];
+        var name = match.group(1)!;
+        var value = templateMap[name];
         if (value != null) {
           lines[i] = value;
         }
@@ -74,7 +74,7 @@
 
       match = videoRegExp.firstMatch(line);
       if (match != null) {
-        String uri = match.group(2);
+        var uri = match.group(2);
         if (uri != null && uri.isNotEmpty) {
           String label = uri;
           if (label.startsWith('https://')) {
@@ -90,9 +90,6 @@
 
   /// Remove the delimiters from the given [comment].
   List<String> _stripDelimiters(String comment) {
-    if (comment == null) {
-      return null;
-    }
     //
     // Remove /** */.
     //
diff --git a/pkg/analyzer/lib/src/diagnostic/diagnostic.dart b/pkg/analyzer/lib/src/diagnostic/diagnostic.dart
index d45ad279..aeeb56e 100644
--- a/pkg/analyzer/lib/src/diagnostic/diagnostic.dart
+++ b/pkg/analyzer/lib/src/diagnostic/diagnostic.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/diagnostic/diagnostic.dart';
-import 'package:meta/meta.dart';
 
 /// A concrete implementation of a diagnostic message.
 class DiagnosticMessageImpl implements DiagnosticMessage {
@@ -23,8 +22,8 @@
   /// the file at the given [filePath] at the given [offset] and with the given
   /// [length].
   DiagnosticMessageImpl(
-      {@required this.filePath,
-      @required this.length,
-      @required this.message,
-      @required this.offset});
+      {required this.filePath,
+      required this.length,
+      required this.message,
+      required this.offset});
 }
diff --git a/pkg/analyzer/lib/src/diagnostic/diagnostic_factory.dart b/pkg/analyzer/lib/src/diagnostic/diagnostic_factory.dart
index 14c09b7..45533a1 100644
--- a/pkg/analyzer/lib/src/diagnostic/diagnostic_factory.dart
+++ b/pkg/analyzer/lib/src/diagnostic/diagnostic_factory.dart
@@ -7,7 +7,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/diagnostic/diagnostic.dart';
 import 'package:analyzer/error/error.dart';
-import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/src/diagnostic/diagnostic.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/source.dart';
@@ -71,14 +70,14 @@
   /// before it was declared.
   AnalysisError referencedBeforeDeclaration(
       Source source, Identifier identifier,
-      {Element element}) {
+      {Element? element}) {
     String name = identifier.name;
-    Element staticElement = element ?? identifier.staticElement;
-    List<DiagnosticMessage> contextMessages;
+    Element staticElement = element ?? identifier.staticElement!;
+    List<DiagnosticMessage>? contextMessages;
     int declarationOffset = staticElement.nameOffset;
-    if (declarationOffset >= 0 && staticElement != null) {
-      CompilationUnitElement unit = staticElement.thisOrAncestorOfType();
-      CharacterLocation location = unit.lineInfo.getLocation(declarationOffset);
+    if (declarationOffset >= 0) {
+      CompilationUnitElement unit = staticElement.thisOrAncestorOfType()!;
+      var location = unit.lineInfo!.getLocation(declarationOffset);
       contextMessages = [
         DiagnosticMessageImpl(
             filePath: source.fullName,
diff --git a/pkg/analyzer/lib/src/error.dart b/pkg/analyzer/lib/src/error.dart
index 1de5c30..3d7c559 100644
--- a/pkg/analyzer/lib/src/error.dart
+++ b/pkg/analyzer/lib/src/error.dart
@@ -22,7 +22,7 @@
     // Print a less friendly string representation to ensure that
     // error.source.contents is not executed, as .contents it isn't async
     String sourceName = error.source.shortName;
-    sourceName ??= '<unknown source>';
+    // sourceName ??= '<unknown source>';
     builder.write("Error in $sourceName: ${error.message}");
 
 //    var content = error.source.contents.data;
diff --git a/pkg/analyzer/lib/src/error/analyzer_error_code.dart b/pkg/analyzer/lib/src/error/analyzer_error_code.dart
index a3543a2..2b07046 100644
--- a/pkg/analyzer/lib/src/error/analyzer_error_code.dart
+++ b/pkg/analyzer/lib/src/error/analyzer_error_code.dart
@@ -3,18 +3,17 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/error/error.dart';
-import 'package:meta/meta.dart';
 
 /// A superclass for error codes that can have a url associated with them.
 abstract class AnalyzerErrorCode extends ErrorCode {
   /// Initialize a newly created error code.
   const AnalyzerErrorCode({
-    String correction,
+    String? correction,
     bool hasPublishedDocs = false,
     bool isUnresolvedIdentifier = false,
-    @required String message,
-    @required String name,
-    @required String uniqueName,
+    required String message,
+    required String name,
+    required String uniqueName,
   }) : super(
           correction: correction,
           hasPublishedDocs: hasPublishedDocs,
diff --git a/pkg/analyzer/lib/src/error/assignment_verifier.dart b/pkg/analyzer/lib/src/error/assignment_verifier.dart
index b3f762b..4b64931 100644
--- a/pkg/analyzer/lib/src/error/assignment_verifier.dart
+++ b/pkg/analyzer/lib/src/error/assignment_verifier.dart
@@ -8,7 +8,6 @@
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:meta/meta.dart';
 
 /// Helper for verifying resolution of assignments, in form of explicit
 /// an [AssignmentExpression], or a [PrefixExpression] or [PostfixExpression]
@@ -30,10 +29,10 @@
   /// it is not `null`, we report [CompileTimeErrorCode.UNDEFINED_SETTER]
   /// instead of a more generic [CompileTimeErrorCode.UNDEFINED_IDENTIFIER].
   void verify({
-    @required SimpleIdentifier node,
-    @required Element requested,
-    @required Element recovery,
-    @required Object receiverTypeObject,
+    required SimpleIdentifier node,
+    required Element? requested,
+    required Element? recovery,
+    required Object? receiverTypeObject,
   }) {
     if (requested != null) {
       if (requested is VariableElement) {
diff --git a/pkg/analyzer/lib/src/error/best_practices_verifier.dart b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
index cbb6ab5..3c842d0 100644
--- a/pkg/analyzer/lib/src/error/best_practices_verifier.dart
+++ b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
@@ -11,7 +11,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/element/element.dart';
@@ -19,6 +18,7 @@
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/dart/element/member.dart' show ExecutableMember;
 import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/dart/resolver/body_inference_context.dart';
 import 'package:analyzer/src/dart/resolver/exit_detector.dart';
@@ -46,7 +46,7 @@
 
   /// The class containing the AST nodes being visited, or `null` if we are not
   /// in the scope of a class.
-  ClassElementImpl _enclosingClass;
+  ClassElementImpl? _enclosingClass;
 
   /// A flag indicating whether a surrounding member is annotated as
   /// `@doNotStore`.
@@ -76,10 +76,10 @@
   final CatchErrorVerifier _catchErrorVerifier;
 
   /// The [WorkspacePackage] in which [_currentLibrary] is declared.
-  final WorkspacePackage _workspacePackage;
+  final WorkspacePackage? _workspacePackage;
 
   /// The [LinterContext] used for possible const calculations.
-  LinterContext _linterContext;
+  late final LinterContext _linterContext;
 
   /// Is `true` if the library being analyzed is non-nullable by default.
   final bool _isNonNullableByDefault;
@@ -92,16 +92,16 @@
   /// @param errorReporter the error reporter
   BestPracticesVerifier(
     this._errorReporter,
-    TypeProvider typeProvider,
+    TypeProviderImpl typeProvider,
     this._currentLibrary,
     CompilationUnit unit,
     String content, {
-    @required TypeSystemImpl typeSystem,
-    @required InheritanceManager3 inheritanceManager,
-    @required DeclaredVariables declaredVariables,
-    @required AnalysisOptions analysisOptions,
-    @required WorkspacePackage workspacePackage,
-  })  : _nullType = typeProvider.nullType,
+    required TypeSystemImpl typeSystem,
+    required InheritanceManager3 inheritanceManager,
+    required DeclaredVariables declaredVariables,
+    required AnalysisOptions analysisOptions,
+    required WorkspacePackage? workspacePackage,
+  })   : _nullType = typeProvider.nullType,
         _typeSystem = typeSystem,
         _isNonNullableByDefault = typeSystem.isNonNullableByDefault,
         _strictInference =
@@ -119,7 +119,7 @@
     _inDoNotStoreMember = _currentLibrary.hasDoNotStore;
 
     _linterContext = LinterContextImpl(
-      null /* allUnits */,
+      [],
       LinterContextUnit(content, unit),
       declaredVariables,
       typeProvider,
@@ -132,12 +132,12 @@
 
   bool get _inPublicPackageApi {
     return _workspacePackage != null &&
-        _workspacePackage.sourceIsInPublicApi(_currentLibrary.source);
+        _workspacePackage!.sourceIsInPublicApi(_currentLibrary.source);
   }
 
   @override
   void visitAnnotation(Annotation node) {
-    ElementAnnotation element = node.elementAnnotation;
+    var element = node.elementAnnotation;
     if (element == null) {
       return;
     }
@@ -158,20 +158,22 @@
       var parentElement = parent is Declaration ? parent.declaredElement : null;
       if (parent is TopLevelVariableDeclaration) {
         for (VariableDeclaration variable in parent.variables.variables) {
-          if (Identifier.isPrivateName(variable.declaredElement.name)) {
+          var element = variable.declaredElement as TopLevelVariableElement;
+          if (Identifier.isPrivateName(element.name)) {
             _errorReporter.reportErrorForNode(
                 HintCode.INVALID_INTERNAL_ANNOTATION, variable, []);
           }
         }
       } else if (parent is FieldDeclaration) {
         for (VariableDeclaration variable in parent.fields.variables) {
-          if (Identifier.isPrivateName(variable.declaredElement.name)) {
+          var element = variable.declaredElement as FieldElement;
+          if (Identifier.isPrivateName(element.name)) {
             _errorReporter.reportErrorForNode(
                 HintCode.INVALID_INTERNAL_ANNOTATION, variable, []);
           }
         }
       } else if (parent is ConstructorDeclaration) {
-        var class_ = parent.declaredElement.enclosingElement;
+        var class_ = parent.declaredElement!.enclosingElement;
         if (class_.isPrivate || (parentElement?.isPrivate ?? false)) {
           _errorReporter.reportErrorForNode(
               HintCode.INVALID_INTERNAL_ANNOTATION, node, []);
@@ -184,8 +186,7 @@
             .reportErrorForNode(HintCode.INVALID_INTERNAL_ANNOTATION, node, []);
       }
     } else if (element.isLiteral == true) {
-      if (parent is! ConstructorDeclaration ||
-          (parent as ConstructorDeclaration).constKeyword == null) {
+      if (parent is! ConstructorDeclaration || parent.constKeyword == null) {
         _errorReporter
             .reportErrorForNode(HintCode.INVALID_LITERAL_ANNOTATION, node, []);
       }
@@ -195,7 +196,7 @@
           _errorReporter.reportErrorForNode(
               HintCode.INVALID_NON_VIRTUAL_ANNOTATION,
               node,
-              [node.element.name]);
+              [node.element!.name]);
         }
       } else if (parent is MethodDeclaration) {
         if (parent.parent is ExtensionDeclaration ||
@@ -204,16 +205,18 @@
           _errorReporter.reportErrorForNode(
               HintCode.INVALID_NON_VIRTUAL_ANNOTATION,
               node,
-              [node.element.name]);
+              [node.element!.name]);
         }
       } else {
         _errorReporter.reportErrorForNode(
-            HintCode.INVALID_NON_VIRTUAL_ANNOTATION, node, [node.element.name]);
+            HintCode.INVALID_NON_VIRTUAL_ANNOTATION,
+            node,
+            [node.element!.name]);
       }
     } else if (element.isSealed == true) {
       if (!(parent is ClassDeclaration || parent is ClassTypeAlias)) {
         _errorReporter.reportErrorForNode(
-            HintCode.INVALID_SEALED_ANNOTATION, node, [node.element.name]);
+            HintCode.INVALID_SEALED_ANNOTATION, node, [node.element!.name]);
       }
     } else if (element.isVisibleForTemplate == true ||
         element.isVisibleForTesting == true) {
@@ -227,19 +230,21 @@
 
         if (parent is TopLevelVariableDeclaration) {
           for (VariableDeclaration variable in parent.variables.variables) {
-            if (Identifier.isPrivateName(variable.declaredElement.name)) {
-              reportInvalidAnnotation(variable.declaredElement);
+            var element = variable.declaredElement as TopLevelVariableElement;
+            if (Identifier.isPrivateName(element.name)) {
+              reportInvalidAnnotation(element);
             }
           }
         } else if (parent is FieldDeclaration) {
           for (VariableDeclaration variable in parent.fields.variables) {
-            if (Identifier.isPrivateName(variable.declaredElement.name)) {
-              reportInvalidAnnotation(variable.declaredElement);
+            var element = variable.declaredElement as FieldElement;
+            if (Identifier.isPrivateName(element.name)) {
+              reportInvalidAnnotation(element);
             }
           }
         } else if (parent.declaredElement != null &&
-            Identifier.isPrivateName(parent.declaredElement.name)) {
-          reportInvalidAnnotation(parent.declaredElement);
+            Identifier.isPrivateName(parent.declaredElement!.name!)) {
+          reportInvalidAnnotation(parent.declaredElement!);
         }
       } else {
         // Something other than a declaration was annotated. Whatever this is,
@@ -250,11 +255,11 @@
     var kinds = _targetKindsFor(element);
     if (kinds.isNotEmpty) {
       if (!_isValidTarget(parent, kinds)) {
-        var invokedElement = element.element;
+        var invokedElement = element.element!;
         var name = invokedElement.name;
         if (invokedElement is ConstructorElement) {
           var className = invokedElement.enclosingElement.name;
-          if (name.isEmpty) {
+          if (name!.isEmpty) {
             name = className;
           } else {
             name = '$className.$name';
@@ -308,7 +313,7 @@
 
     bool wasInDoNotStoreMember = _inDoNotStoreMember;
     _deprecatedVerifier.pushInDeprecatedValue(element.hasDeprecated);
-    if (element != null && element.hasDoNotStore) {
+    if (element.hasDoNotStore) {
       _inDoNotStoreMember = true;
     }
 
@@ -335,17 +340,17 @@
 
   @override
   void visitConstructorDeclaration(ConstructorDeclaration node) {
-    if (!_isNonNullableByDefault && node.declaredElement.isFactory) {
+    if (!_isNonNullableByDefault && node.declaredElement!.isFactory) {
       if (node.body is BlockFunctionBody) {
         // Check the block for a return statement, if not, create the hint.
-        if (!ExitDetector.exits(node.body)) {
+        if (!ExitDetector.exits(node.body!)) {
           _errorReporter.reportErrorForNode(
               HintCode.MISSING_RETURN, node, [node.returnType.name]);
         }
       }
     }
     _checkStrictInferenceInParameters(node.parameters,
-        body: node.body, initializers: node.initializers);
+        body: node.body!, initializers: node.initializers);
     super.visitConstructorDeclaration(node);
   }
 
@@ -375,11 +380,11 @@
     try {
       super.visitFieldDeclaration(node);
       for (var field in node.fields.variables) {
-        ExecutableElement getOverriddenPropertyAccessor() {
+        ExecutableElement? getOverriddenPropertyAccessor() {
           final element = field.declaredElement;
           if (element is PropertyAccessorElement || element is FieldElement) {
-            Name name = Name(_currentLibrary.source.uri, element.name);
-            Element enclosingElement = element.enclosingElement;
+            Name name = Name(_currentLibrary.source.uri, element!.name!);
+            Element enclosingElement = element.enclosingElement!;
             if (enclosingElement is ClassElement) {
               var overridden = _inheritanceManager
                   .getMember2(enclosingElement, name, forSuper: true);
@@ -401,7 +406,7 @@
           _errorReporter.reportErrorForNode(
               HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER,
               field.name,
-              [field.name, overriddenElement.enclosingElement.name]);
+              [field.name, overriddenElement!.enclosingElement.name]);
         }
 
         _checkForAssignmentOfDoNotStore(field.initializer);
@@ -420,13 +425,13 @@
   @override
   void visitFunctionDeclaration(FunctionDeclaration node) {
     bool wasInDoNotStoreMember = _inDoNotStoreMember;
-    ExecutableElement element = node.declaredElement;
+    ExecutableElement element = node.declaredElement!;
     _deprecatedVerifier.pushInDeprecatedValue(element.hasDeprecated);
-    if (element != null && element.hasDoNotStore) {
+    if (element.hasDoNotStore) {
       _inDoNotStoreMember = true;
     }
     try {
-      _checkForMissingReturn(node.functionExpression.body, node);
+      _checkForMissingReturn(node.functionExpression.body!, node);
 
       // Return types are inferred only on non-recursive local functions.
       if (node.parent is CompilationUnit && !node.isSetter) {
@@ -451,9 +456,9 @@
   @override
   void visitFunctionExpression(FunctionExpression node) {
     if (node.parent is! FunctionDeclaration) {
-      _checkForMissingReturn(node.body, node);
+      _checkForMissingReturn(node.body!, node);
     }
-    DartType functionType = InferenceContext.getContext(node);
+    var functionType = InferenceContext.getContext(node);
     if (functionType is! FunctionType) {
       _checkStrictInferenceInParameters(node.parameters, body: node.body);
     }
@@ -495,7 +500,7 @@
   void visitGenericTypeAlias(GenericTypeAlias node) {
     if (node.functionType != null) {
       _checkStrictInferenceReturnType(
-          node.functionType.returnType, node, node.name.name);
+          node.functionType!.returnType, node, node.name.name);
     }
     super.visitGenericTypeAlias(node);
   }
@@ -503,7 +508,7 @@
   @override
   void visitImportDirective(ImportDirective node) {
     _deprecatedVerifier.importDirective(node);
-    ImportElement importElement = node.element;
+    var importElement = node.element;
     if (importElement != null && importElement.isDeferred) {
       _checkForLoadLibraryFunction(node, importElement);
     }
@@ -534,28 +539,28 @@
   @override
   void visitMethodDeclaration(MethodDeclaration node) {
     bool wasInDoNotStoreMember = _inDoNotStoreMember;
-    ExecutableElement element = node.declaredElement;
-    Element enclosingElement = element?.enclosingElement;
+    var element = node.declaredElement!;
+    var enclosingElement = element.enclosingElement;
 
-    Name name = Name(_currentLibrary.source.uri, element?.name ?? '');
+    Name name = Name(_currentLibrary.source.uri, element.name);
 
     bool elementIsOverride() =>
         element is ClassMemberElement && enclosingElement is ClassElement
             ? _inheritanceManager.getOverridden2(enclosingElement, name) != null
             : false;
-    ExecutableElement getConcreteOverriddenElement() =>
+    ExecutableElement? getConcreteOverriddenElement() =>
         element is ClassMemberElement && enclosingElement is ClassElement
             ? _inheritanceManager.getMember2(enclosingElement, name,
                 forSuper: true)
             : null;
-    ExecutableElement getOverriddenPropertyAccessor() =>
+    ExecutableElement? getOverriddenPropertyAccessor() =>
         element is PropertyAccessorElement && enclosingElement is ClassElement
             ? _inheritanceManager.getMember2(enclosingElement, name,
                 forSuper: true)
             : null;
 
     _deprecatedVerifier.pushInDeprecatedValue(element.hasDeprecated);
-    if (element != null && element.hasDoNotStore) {
+    if (element.hasDoNotStore) {
       _inDoNotStoreMember = true;
     }
     try {
@@ -570,7 +575,7 @@
       }
       _checkStrictInferenceInParameters(node.parameters, body: node.body);
 
-      ExecutableElement overriddenElement = getConcreteOverriddenElement();
+      var overriddenElement = getConcreteOverriddenElement();
       if (overriddenElement == null && (node.isSetter || node.isGetter)) {
         overriddenElement = getOverriddenPropertyAccessor();
       }
@@ -579,7 +584,7 @@
         _errorReporter.reportErrorForNode(
             HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER,
             node.name,
-            [node.name, overriddenElement.enclosingElement.name]);
+            [node.name, overriddenElement!.enclosingElement.name]);
       }
 
       super.visitMethodDeclaration(node);
@@ -599,7 +604,7 @@
 
   @override
   void visitMixinDeclaration(MixinDeclaration node) {
-    var element = node.declaredElement;
+    var element = node.declaredElement as ClassElementImpl;
     _enclosingClass = element;
     _invalidAccessVerifier._enclosingClass = _enclosingClass;
 
@@ -620,7 +625,7 @@
   void visitPostfixExpression(PostfixExpression node) {
     _deprecatedVerifier.postfixExpression(node);
     if (node.operator.type == TokenType.BANG &&
-        node.operand.staticType.isDartCoreNull) {
+        node.operand.staticType!.isDartCoreNull) {
       _errorReporter.reportErrorForNode(HintCode.NULL_CHECK_ALWAYS_FAILS, node);
     }
     super.visitPostfixExpression(node);
@@ -697,12 +702,8 @@
   bool _checkAllTypeChecks(IsExpression node) {
     Expression expression = node.expression;
     TypeAnnotation typeName = node.type;
-    var lhsType = expression.staticType as TypeImpl;
     var rhsType = typeName.type as TypeImpl;
-    if (lhsType == null || rhsType == null) {
-      return false;
-    }
-    String rhsNameStr = typeName is TypeName ? typeName.name.name : null;
+    var rhsNameStr = typeName is TypeName ? typeName.name.name : null;
     // if x is dynamic
     if (rhsType.isDynamic && rhsNameStr == Keyword.DYNAMIC.lexeme) {
       if (node.notOperator == null) {
@@ -716,8 +717,8 @@
       }
       return true;
     }
-    Element rhsElement = rhsType.element;
-    LibraryElement libraryElement = rhsElement?.library;
+    var rhsElement = rhsType.element;
+    var libraryElement = rhsElement?.library;
     if (libraryElement != null && libraryElement.isDartCore) {
       // `is Null` or `is! Null`
       if (rhsNameStr == _NULL_TYPE_NAME) {
@@ -771,7 +772,7 @@
     return false;
   }
 
-  void _checkForAssignmentOfDoNotStore(Expression expression) {
+  void _checkForAssignmentOfDoNotStore(Expression? expression) {
     var expressionMap = _getSubExpressionsMarkedDoNotStore(expression);
     for (var entry in expressionMap.entries) {
       _errorReporter.reportErrorForNode(
@@ -795,20 +796,20 @@
     }
     // Return if the '/' operator is not defined in core, or if we don't know
     // its static type
-    MethodElement methodElement = node.staticElement;
+    var methodElement = node.staticElement;
     if (methodElement == null) {
       return false;
     }
     LibraryElement libraryElement = methodElement.library;
-    if (libraryElement != null && !libraryElement.isDartCore) {
+    if (!libraryElement.isDartCore) {
       return false;
     }
     // Report error if the (x/y) has toInt() invoked on it
-    AstNode parent = node.parent;
+    var parent = node.parent;
     if (parent is ParenthesizedExpression) {
       ParenthesizedExpression parenthesizedExpression =
           _wrapParenthesizedExpression(parent);
-      AstNode grandParent = parenthesizedExpression.parent;
+      var grandParent = parenthesizedExpression.parent;
       if (grandParent is MethodInvocation) {
         if (_TO_INT_METHOD_NAME == grandParent.methodName.name &&
             grandParent.argumentList.arguments.isEmpty) {
@@ -836,7 +837,8 @@
     for (final expression in expressions) {
       final constEvaluation = _linterContext.evaluateConstant(expression);
       if (constEvaluation.errors.isEmpty) {
-        if (!alreadySeen.add(constEvaluation.value)) {
+        var value = constEvaluation.value;
+        if (value != null && !alreadySeen.add(value)) {
           var errorCode = node.isSet
               ? HintCode.EQUAL_ELEMENTS_IN_SET
               : HintCode.EQUAL_KEYS_IN_MAP;
@@ -883,7 +885,7 @@
           }
         }
         if (element.supertype != null) {
-          return isOrInheritsImmutable(element.supertype.element, visited);
+          return isOrInheritsImmutable(element.supertype!.element, visited);
         }
       }
       return false;
@@ -910,7 +912,7 @@
         if (element.supertype != null) {
           nonFinalFields = nonFinalFields.followedBy(
               definedOrInheritedNonFinalInstanceFields(
-                  element.supertype.element, visited));
+                  element.supertype!.element, visited));
         }
       }
       return nonFinalFields;
@@ -964,7 +966,7 @@
           [libraryElement.displayName]);
     }
     var exportNamespace =
-        NamespaceBuilder().createExportNamespaceForDirective(node.element);
+        NamespaceBuilder().createExportNamespaceForDirective(node.element!);
     exportNamespace.definedNames.forEach((String name, Element element) {
       if (element.hasInternal) {
         _errorReporter.reportErrorForNode(
@@ -993,7 +995,7 @@
   void _checkForInvalidFactory(MethodDeclaration decl) {
     // Check declaration.
     // Note that null return types are expected to be flagged by other analyses.
-    DartType returnType = decl.returnType?.type;
+    var returnType = decl.returnType?.type;
     if (returnType is VoidType) {
       _errorReporter.reportErrorForNode(HintCode.INVALID_FACTORY_METHOD_DECL,
           decl.name, [decl.name.toString()]);
@@ -1009,7 +1011,7 @@
     }
 
     // `new Foo()` or `null`.
-    bool factoryExpression(Expression expression) =>
+    bool factoryExpression(Expression? expression) =>
         expression is InstanceCreationExpression || expression is NullLiteral;
 
     if (body is ExpressionFunctionBody && factoryExpression(body.expression)) {
@@ -1037,7 +1039,7 @@
     // ClassElement, but [_checkForInvalidSealedSuperclass] should only be
     // called with a [ClassOrMixinDeclaration], or a [ClassTypeAlias]. The
     // `declaredElement` of these specific classes is a [ClassElement].
-    ClassElement element = node.declaredElement;
+    var element = node.declaredElement as ClassElement;
     // TODO(srawlins): Perhaps replace this with a getter on Element, like
     // `Element.hasOrInheritsSealed`?
     for (InterfaceType supertype in element.allSupertypes) {
@@ -1077,14 +1079,14 @@
 
     void checkLeftRight(HintCode errorCode) {
       if (node.leftOperand is NullLiteral) {
-        var rightType = node.rightOperand.staticType;
+        var rightType = node.rightOperand.staticType!;
         if (_typeSystem.isStrictlyNonNullable(rightType)) {
           reportStartEnd(errorCode, node.leftOperand, node.operator);
         }
       }
 
       if (node.rightOperand is NullLiteral) {
-        var leftType = node.leftOperand.staticType;
+        var leftType = node.leftOperand.staticType!;
         if (_typeSystem.isStrictlyNonNullable(leftType)) {
           reportStartEnd(errorCode, node.operator, node.rightOperand);
         }
@@ -1102,7 +1104,7 @@
   /// marked with [literal].
   void _checkForLiteralConstructorUse(InstanceCreationExpression node) {
     ConstructorName constructorName = node.constructorName;
-    ConstructorElement constructor = constructorName.staticElement;
+    ConstructorElement? constructor = constructorName.staticElement;
     if (constructor == null) {
       return;
     }
@@ -1134,7 +1136,7 @@
   /// See [CompileTimeErrorCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION].
   bool _checkForLoadLibraryFunction(
       ImportDirective node, ImportElement importElement) {
-    LibraryElement importedLibrary = importElement.importedLibrary;
+    LibraryElement? importedLibrary = importElement.importedLibrary;
     if (importedLibrary == null) {
       return false;
     }
@@ -1171,7 +1173,7 @@
       return;
     }
 
-    var bodyContext = BodyInferenceContext.of(body);
+    var bodyContext = BodyInferenceContext.of(body)!;
     // TODO(scheglov) Update InferenceContext to record any type, dynamic.
     var returnType = bodyContext.contextType ?? DynamicTypeImpl.instance;
 
@@ -1207,7 +1209,7 @@
       return;
     }
 
-    if (_typeSystem.isPotentiallyNullable(type.type)) {
+    if (_typeSystem.isPotentiallyNullable(type.type!)) {
       _errorReporter.reportErrorForNode(
         HintCode.NULLABLE_TYPE_IN_CATCH_CLAUSE,
         type,
@@ -1216,7 +1218,7 @@
   }
 
   /// Produce several null-aware related hints.
-  void _checkForNullAwareHints(Expression node, Token operator) {
+  void _checkForNullAwareHints(Expression node, Token? operator) {
     if (_isNonNullableByDefault) {
       return;
     }
@@ -1290,14 +1292,15 @@
     }
   }
 
-  void _checkForReturnOfDoNotStore(Expression expression) {
+  void _checkForReturnOfDoNotStore(Expression? expression) {
     if (_inDoNotStoreMember) {
       return;
     }
     var expressionMap = _getSubExpressionsMarkedDoNotStore(expression);
     if (expressionMap.isNotEmpty) {
-      Declaration parent = expression.thisOrAncestorMatching(
-          (e) => e is FunctionDeclaration || e is MethodDeclaration);
+      var parent = expression!.thisOrAncestorMatching(
+              (e) => e is FunctionDeclaration || e is MethodDeclaration)
+          as Declaration?;
       if (parent == null) {
         return;
       }
@@ -1305,7 +1308,7 @@
         _errorReporter.reportErrorForNode(
           HintCode.RETURN_OF_DO_NOT_STORE,
           entry.key,
-          [entry.value.name, parent.declaredElement.displayName],
+          [entry.value.name, parent.declaredElement!.displayName],
         );
       }
     }
@@ -1320,14 +1323,14 @@
     if (node.name.name != FunctionElement.NO_SUCH_METHOD_METHOD_NAME) {
       return false;
     }
-    bool isNonObjectNoSuchMethodInvocation(Expression invocation) {
+    bool isNonObjectNoSuchMethodInvocation(Expression? invocation) {
       if (invocation is MethodInvocation &&
           invocation.target is SuperExpression &&
           invocation.argumentList.arguments.length == 1) {
         SimpleIdentifier name = invocation.methodName;
         if (name.name == FunctionElement.NO_SUCH_METHOD_METHOD_NAME) {
-          Element methodElement = name.staticElement;
-          Element classElement = methodElement?.enclosingElement;
+          var methodElement = name.staticElement;
+          var classElement = methodElement?.enclosingElement;
           return methodElement is MethodElement &&
               classElement is ClassElement &&
               !classElement.isDartCoreObject;
@@ -1365,7 +1368,7 @@
         requiredParameters.where((p) => p.isPositional);
     final namedParamsWithRequiredAndDefault = requiredParameters
         .where((p) => p.isNamed)
-        .where((p) => p.declaredElement.defaultValueCode != null);
+        .where((p) => p.declaredElement!.defaultValueCode != null);
     for (final param in nonNamedParamsWithRequired.where((p) => p.isOptional)) {
       _errorReporter.reportErrorForNode(
           HintCode.INVALID_REQUIRED_OPTIONAL_POSITIONAL_PARAM,
@@ -1391,9 +1394,9 @@
   /// reported. If [initializers] and [body] are both null, the parameters are
   /// assumed to originate from a typedef, function-typed parameter, or function
   /// which is abstract or external.
-  void _checkStrictInferenceInParameters(FormalParameterList parameters,
-      {List<ConstructorInitializer> initializers, FunctionBody body}) {
-    _UsedParameterVisitor usedParameterVisitor;
+  void _checkStrictInferenceInParameters(FormalParameterList? parameters,
+      {List<ConstructorInitializer>? initializers, FunctionBody? body}) {
+    _UsedParameterVisitor? usedParameterVisitor;
 
     bool isParameterReferenced(SimpleFormalParameter parameter) {
       if ((body == null || body is EmptyFunctionBody) && initializers == null) {
@@ -1405,19 +1408,19 @@
         // Visit the function body and initializers once to determine whether
         // each of the parameters is referenced.
         usedParameterVisitor = _UsedParameterVisitor(
-            parameters.parameters.map((p) => p.declaredElement).toSet());
-        body?.accept(usedParameterVisitor);
-        for (var initializer in initializers ?? []) {
-          initializer.accept(usedParameterVisitor);
+            parameters!.parameters.map((p) => p.declaredElement!).toSet());
+        body?.accept(usedParameterVisitor!);
+        for (var initializer in initializers ?? <ConstructorInitializer>[]) {
+          initializer.accept(usedParameterVisitor!);
         }
       }
 
-      return usedParameterVisitor.isUsed(parameter.declaredElement);
+      return usedParameterVisitor!.isUsed(parameter.declaredElement!);
     }
 
     void checkParameterTypeIsKnown(SimpleFormalParameter parameter) {
       if (parameter.type == null && isParameterReferenced(parameter)) {
-        ParameterElement element = parameter.declaredElement;
+        ParameterElement element = parameter.declaredElement!;
         _errorReporter.reportErrorForNode(
           HintCode.INFERENCE_FAILURE_ON_UNTYPED_PARAMETER,
           parameter,
@@ -1431,8 +1434,9 @@
         if (parameter is SimpleFormalParameter) {
           checkParameterTypeIsKnown(parameter);
         } else if (parameter is DefaultFormalParameter) {
-          if (parameter.parameter is SimpleFormalParameter) {
-            checkParameterTypeIsKnown(parameter.parameter);
+          var nonDefault = parameter.parameter;
+          if (nonDefault is SimpleFormalParameter) {
+            checkParameterTypeIsKnown(nonDefault);
           }
         }
       }
@@ -1441,7 +1445,7 @@
 
   /// In "strict-inference" mode, check that [returnType] is specified.
   void _checkStrictInferenceReturnType(
-      AstNode returnType, AstNode reportNode, String displayName) {
+      AstNode? returnType, AstNode reportNode, String displayName) {
     if (!_strictInference) {
       return;
     }
@@ -1456,11 +1460,11 @@
   /// Return subexpressions that are marked `@doNotStore`, as a map so that
   /// corresponding elements can be used in the diagnostic message.
   Map<Expression, Element> _getSubExpressionsMarkedDoNotStore(
-      Expression expression,
-      {Map<Expression, Element> addTo}) {
+      Expression? expression,
+      {Map<Expression, Element>? addTo}) {
     var expressions = addTo ?? <Expression, Element>{};
 
-    Element element;
+    Element? element;
     if (expression is PropertyAccess) {
       element = expression.propertyName.staticElement;
       // Tear-off.
@@ -1492,23 +1496,23 @@
       }
     }
     if (element is PropertyAccessorElement && element.isSynthetic) {
-      element = (element as PropertyAccessorElement).variable;
+      element = element.variable;
     }
 
     if (element != null && element.hasOrInheritsDoNotStore) {
-      expressions[expression] = element;
+      expressions[expression!] = element;
     }
 
     return expressions;
   }
 
-  bool _isLibraryInWorkspacePackage(LibraryElement library) {
+  bool _isLibraryInWorkspacePackage(LibraryElement? library) {
     if (_workspacePackage == null || library == null) {
       // Better to not make a big claim that they _are_ in the same package,
       // if we were unable to determine what package [_currentLibrary] is in.
       return false;
     }
-    return _workspacePackage.contains(library.source);
+    return _workspacePackage!.contains(library.source);
   }
 
   /// Return `true` if it is valid to have an annotation on the given [target]
@@ -1559,7 +1563,7 @@
   /// Return the target kinds defined for the given [annotation].
   Set<TargetKind> _targetKindsFor(ElementAnnotation annotation) {
     var element = annotation.element;
-    ClassElement classElement;
+    ClassElement? classElement;
     if (element is PropertyAccessorElement) {
       if (element.isGetter) {
         var type = element.returnType;
@@ -1575,10 +1579,10 @@
     }
     for (var annotation in classElement.metadata) {
       if (annotation.isTarget) {
-        var value = annotation.computeConstantValue();
+        var value = annotation.computeConstantValue()!;
         var kinds = <TargetKind>{};
-        for (var kindObject in value.getField('kinds').toSetValue()) {
-          var index = kindObject.getField('index').toIntValue();
+        for (var kindObject in value.getField('kinds')!.toSetValue()!) {
+          var index = kindObject.getField('index')!.toIntValue()!;
           kinds.add(TargetKind.values[index]);
         }
         return kinds;
@@ -1593,8 +1597,8 @@
   /// Returns `true` if and only if an unnecessary cast hint should be generated
   /// on [node].  See [HintCode.UNNECESSARY_CAST].
   static bool isUnnecessaryCast(AsExpression node, TypeSystemImpl typeSystem) {
-    var leftType = node.expression.staticType;
-    var rightType = node.type.type;
+    var leftType = node.expression.staticType!;
+    var rightType = node.type.type!;
 
     // `dynamicValue as SomeType` is a valid use case.
     if (leftType.isDynamic) {
@@ -1626,13 +1630,13 @@
           : parent.thenExpression;
 
       var currentType = typeSystem.leastUpperBound(
-        node.staticType,
-        other.staticType,
+        node.staticType!,
+        other.staticType!,
       );
 
       var typeWithoutCast = typeSystem.leastUpperBound(
-        node.expression.staticType,
-        other.staticType,
+        node.expression.staticType!,
+        other.staticType!,
       );
 
       if (typeWithoutCast != currentType) {
@@ -1648,7 +1652,7 @@
     return identifier?.name ?? '';
   }
 
-  static bool _hasNonVirtualAnnotation(ExecutableElement element) {
+  static bool _hasNonVirtualAnnotation(ExecutableElement? element) {
     if (element == null) {
       return false;
     }
@@ -1670,7 +1674,7 @@
   ///         expression, that does not have a parenthesized expression parent
   static ParenthesizedExpression _wrapParenthesizedExpression(
       ParenthesizedExpression parenthesizedExpression) {
-    AstNode parent = parenthesizedExpression.parent;
+    var parent = parenthesizedExpression.parent;
     if (parent is ParenthesizedExpression) {
       return _wrapParenthesizedExpression(parent);
     }
@@ -1689,12 +1693,12 @@
 
   final ErrorReporter _errorReporter;
   final LibraryElement _library;
-  final WorkspacePackage _workspacePackage;
+  final WorkspacePackage? _workspacePackage;
 
-  bool _inTemplateSource;
-  bool _inTestDirectory;
+  late final bool _inTemplateSource;
+  late final bool _inTestDirectory;
 
-  ClassElement _enclosingClass;
+  ClassElement? _enclosingClass;
 
   _InvalidAccessVerifier(
       this._errorReporter, this._library, this._workspacePackage) {
@@ -1723,11 +1727,11 @@
 
     // This is the same logic used in [checkForDeprecatedMemberUseAtIdentifier]
     // to avoid reporting an error twice for named constructors.
-    AstNode parent = identifier.parent;
+    var parent = identifier.parent;
     if (parent is ConstructorName && identical(identifier, parent.name)) {
       return;
     }
-    AstNode grandparent = parent?.parent;
+    var grandparent = parent?.parent;
 
     var element = grandparent is ConstructorName
         ? grandparent.staticElement
@@ -1748,7 +1752,7 @@
   void verifyImport(ImportDirective node) {
     var element = node.uriElement;
     if (_hasInternal(element) &&
-        !_isLibraryInWorkspacePackage(element.library)) {
+        !_isLibraryInWorkspacePackage(element!.library)) {
       _errorReporter.reportErrorForNode(HintCode.INVALID_USE_OF_INTERNAL_MEMBER,
           node, [node.uri.stringValue]);
     }
@@ -1761,7 +1765,7 @@
     }
     var element = node.staticElement;
     if (_hasInternal(element) &&
-        !_isLibraryInWorkspacePackage(element.library)) {
+        !_isLibraryInWorkspacePackage(element!.library)) {
       _errorReporter.reportErrorForNode(
           HintCode.INVALID_USE_OF_INTERNAL_MEMBER, node, [element.name]);
     }
@@ -1793,7 +1797,7 @@
       SimpleIdentifier identifier, Element element) {
     bool hasProtected = _hasProtected(element);
     if (hasProtected) {
-      ClassElement definingClass = element.enclosingElement;
+      var definingClass = element.enclosingElement as ClassElement;
       if (_hasTypeOrSuperType(_enclosingClass, definingClass)) {
         return;
       }
@@ -1830,29 +1834,29 @@
       node = identifier;
     }
 
-    Element definingClass = element.enclosingElement;
+    var definingClass = element.enclosingElement;
     if (hasProtected) {
       _errorReporter.reportErrorForNode(
           HintCode.INVALID_USE_OF_PROTECTED_MEMBER,
           node,
-          [name, definingClass.source.uri]);
+          [name, definingClass!.source!.uri]);
     }
     if (hasVisibleForTemplate) {
       _errorReporter.reportErrorForNode(
           HintCode.INVALID_USE_OF_VISIBLE_FOR_TEMPLATE_MEMBER,
           node,
-          [name, definingClass.source.uri]);
+          [name, definingClass!.source!.uri]);
     }
 
     if (hasVisibleForTesting) {
       _errorReporter.reportErrorForNode(
           HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER,
           node,
-          [name, definingClass.source.uri]);
+          [name, definingClass!.source!.uri]);
     }
   }
 
-  bool _hasInternal(Element element) {
+  bool _hasInternal(Element? element) {
     if (element == null) {
       return false;
     }
@@ -1879,14 +1883,14 @@
     return false;
   }
 
-  bool _hasTypeOrSuperType(ClassElement element, ClassElement superElement) {
+  bool _hasTypeOrSuperType(ClassElement? element, ClassElement superElement) {
     if (element == null) {
       return false;
     }
     return element.thisType.asInstanceOf(superElement) != null;
   }
 
-  bool _hasVisibleForTemplate(Element element) {
+  bool _hasVisibleForTemplate(Element? element) {
     if (element == null) {
       return false;
     }
@@ -1901,9 +1905,6 @@
   }
 
   bool _hasVisibleForTesting(Element element) {
-    if (element == null) {
-      return false;
-    }
     if (element.hasVisibleForTesting) {
       return true;
     }
@@ -1923,15 +1924,15 @@
 
   bool _inExportDirective(SimpleIdentifier identifier) =>
       identifier.parent is Combinator &&
-      identifier.parent.parent is ExportDirective;
+      identifier.parent!.parent is ExportDirective;
 
-  bool _isLibraryInWorkspacePackage(LibraryElement library) {
+  bool _isLibraryInWorkspacePackage(LibraryElement? library) {
     if (_workspacePackage == null || library == null) {
       // Better to not make a big claim that they _are_ in the same package,
       // if we were unable to determine what package [_currentLibrary] is in.
       return false;
     }
-    return _workspacePackage.contains(library.source);
+    return _workspacePackage!.contains(library.source);
   }
 }
 
@@ -1949,12 +1950,12 @@
 
   @override
   void visitSimpleIdentifier(SimpleIdentifier node) {
-    Element element = node.staticElement;
+    var element = node.staticElement;
     if (element is ExecutableMember) {
       element = element.declaration;
     }
     if (_parameters.contains(element)) {
-      _usedParameters.add(element);
+      _usedParameters.add(element as ParameterElement);
     }
   }
 }
@@ -1990,6 +1991,5 @@
       case TargetKind.typedefType:
         return 'typedefs';
     }
-    throw 'Remove this when this library is converted to null-safety';
   }
 }
diff --git a/pkg/analyzer/lib/src/error/bool_expression_verifier.dart b/pkg/analyzer/lib/src/error/bool_expression_verifier.dart
index c5a7253..3fa1459 100644
--- a/pkg/analyzer/lib/src/error/bool_expression_verifier.dart
+++ b/pkg/analyzer/lib/src/error/bool_expression_verifier.dart
@@ -11,7 +11,6 @@
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/error/nullable_dereference_verifier.dart';
-import 'package:meta/meta.dart';
 
 /// Helper for verifying expression that should be of type bool.
 class BoolExpressionVerifier {
@@ -23,10 +22,10 @@
   final InterfaceType _boolType;
 
   BoolExpressionVerifier({
-    @required TypeSystemImpl typeSystem,
-    @required ErrorReporter errorReporter,
-    @required NullableDereferenceVerifier nullableDereferenceVerifier,
-  })  : _typeSystem = typeSystem,
+    required TypeSystemImpl typeSystem,
+    required ErrorReporter errorReporter,
+    required NullableDereferenceVerifier nullableDereferenceVerifier,
+  })   : _typeSystem = typeSystem,
         _errorReporter = errorReporter,
         _nullableDereferenceVerifier = nullableDereferenceVerifier,
         _boolElement = typeSystem.typeProvider.boolElement,
@@ -46,8 +45,8 @@
   /// Verify that the given [expression] is of type 'bool', and report
   /// [errorCode] if not, or a nullability error if its improperly nullable.
   void checkForNonBoolExpression(Expression expression,
-      {@required ErrorCode errorCode, List<Object> arguments}) {
-    var type = expression.staticType;
+      {required ErrorCode errorCode, List<Object>? arguments}) {
+    var type = expression.staticType!;
     if (!_checkForUseOfVoidResult(expression) &&
         !_typeSystem.isAssignableTo2(type, _boolType)) {
       if (type.element == _boolElement) {
@@ -73,8 +72,7 @@
   /// are void, such as identifiers.
   // TODO(scheglov) Move this in a separate verifier.
   bool _checkForUseOfVoidResult(Expression expression) {
-    if (expression == null ||
-        !identical(expression.staticType, VoidTypeImpl.instance)) {
+    if (!identical(expression.staticType, VoidTypeImpl.instance)) {
       return false;
     }
 
diff --git a/pkg/analyzer/lib/src/error/catch_error_verifier.dart b/pkg/analyzer/lib/src/error/catch_error_verifier.dart
index 98d775a0..da72645 100644
--- a/pkg/analyzer/lib/src/error/catch_error_verifier.dart
+++ b/pkg/analyzer/lib/src/error/catch_error_verifier.dart
@@ -5,9 +5,9 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/dart/element/type_provider.dart';
-import 'package:analyzer/dart/element/type_system.dart';
 import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/src/dart/element/type_provider.dart';
+import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/error/return_type_verifier.dart';
 import 'package:analyzer/src/generated/error_verifier.dart';
@@ -16,9 +16,9 @@
 class CatchErrorVerifier {
   final ErrorReporter _errorReporter;
 
-  final TypeProvider _typeProvider;
+  final TypeProviderImpl _typeProvider;
 
-  final TypeSystem _typeSystem;
+  final TypeSystemImpl _typeSystem;
 
   final ReturnTypeVerifier _returnTypeVerifier;
 
@@ -28,16 +28,15 @@
           typeSystem: _typeSystem,
           errorReporter: _errorReporter,
         );
+
   void verifyMethodInvocation(MethodInvocation node) {
-    // TODO(https://github.com/dart-lang/sdk/issues/35825): Verify the
-    // parameters of a function passed to `Future.catchError` as well.
     var target = node.realTarget;
     if (target == null) {
       return;
     }
     var methodName = node.methodName;
     if (!(methodName.name == 'catchError' &&
-        target.staticType.isDartAsyncFuture)) {
+        target.staticType!.isDartAsyncFuture)) {
       return;
     }
     if (node.argumentList.arguments.isEmpty) {
@@ -52,8 +51,9 @@
     var targetFutureType = targetType.typeArguments.first;
     var expectedReturnType = _typeProvider.futureOrType2(targetFutureType);
     if (callback is FunctionExpression) {
-      _checkOnErrorFunctionType(
-          callback, callback.staticType, expectedReturnType);
+      // TODO(migration): should be FunctionType, not nullable
+      var callbackType = callback.staticType as FunctionType;
+      _checkOnErrorFunctionType(callback, callbackType, expectedReturnType);
       var catchErrorOnErrorExecutable = EnclosingExecutableContext(
           callback.declaredElement,
           isAsynchronous: true,
@@ -61,7 +61,7 @@
       var returnStatementVerifier =
           _ReturnStatementVerifier(_returnTypeVerifier);
       _returnTypeVerifier.enclosingExecutable = catchErrorOnErrorExecutable;
-      callback.body.accept(returnStatementVerifier);
+      callback.body!.accept(returnStatementVerifier);
     } else {
       var callbackType = callback.staticType;
       if (callbackType is FunctionType) {
@@ -85,14 +85,12 @@
     }
 
     var parameters = expressionType.parameters;
-    if (parameters == null || parameters.isEmpty) {
+    if (parameters.isEmpty) {
       return report();
     }
     var firstParameter = parameters.first;
     if (firstParameter.isNamed) {
       return report();
-    } else if (firstParameter.isOptionalPositional) {
-      return report();
     } else {
       if (!_typeSystem.isSubtypeOf(
           _typeProvider.objectType, firstParameter.type)) {
@@ -103,8 +101,6 @@
       var secondParameter = parameters[1];
       if (secondParameter.isNamed) {
         return report();
-      } else if (firstParameter.isOptionalPositional) {
-        return report();
       } else {
         if (!_typeSystem.isSubtypeOf(
             _typeProvider.stackTraceType, secondParameter.type)) {
@@ -131,7 +127,9 @@
 /// Visits a function body, looking for return statements.
 class _ReturnStatementVerifier extends RecursiveAstVisitor<void> {
   final ReturnTypeVerifier _returnTypeVerifier;
+
   _ReturnStatementVerifier(this._returnTypeVerifier);
+
   @override
   void visitExpressionFunctionBody(ExpressionFunctionBody node) {
     _returnTypeVerifier.verifyExpressionFunctionBody(node);
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index 38ef844..4a053ab 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -12836,10 +12836,10 @@
   const CompileTimeErrorCode(
     String name,
     String message, {
-    String correction,
+    String? correction,
     bool hasPublishedDocs = false,
     bool isUnresolvedIdentifier = false,
-    String uniqueName,
+    String? uniqueName,
   }) : super(
           correction: correction,
           hasPublishedDocs: hasPublishedDocs,
@@ -12929,7 +12929,7 @@
    * created from the optional [correction] template.
    */
   const LanguageCode(String name, String message,
-      {String correction, bool hasPublishedDocs = false})
+      {String? correction, bool hasPublishedDocs = false})
       : super(
           correction: correction,
           hasPublishedDocs: hasPublishedDocs,
@@ -13253,10 +13253,10 @@
   const StaticWarningCode(
     String name,
     String message, {
-    String correction,
+    String? correction,
     bool hasPublishedDocs = false,
     bool isUnresolvedIdentifier = false,
-    String uniqueName,
+    String? uniqueName,
   }) : super(
           correction: correction,
           hasPublishedDocs: hasPublishedDocs,
@@ -13333,7 +13333,7 @@
    * created from the optional [correction] template.
    */
   const StrongModeCode(ErrorType type, String name, String message,
-      {String correction, bool hasPublishedDocs = false})
+      {String? correction, bool hasPublishedDocs = false})
       : type = type,
         super(
           correction: correction,
diff --git a/pkg/analyzer/lib/src/error/constructor_fields_verifier.dart b/pkg/analyzer/lib/src/error/constructor_fields_verifier.dart
index f3cea21..260bbb6 100644
--- a/pkg/analyzer/lib/src/error/constructor_fields_verifier.dart
+++ b/pkg/analyzer/lib/src/error/constructor_fields_verifier.dart
@@ -8,7 +8,6 @@
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:meta/meta.dart';
 
 /// Verifier for initializing fields in constructors.
 class ConstructorFieldsVerifier {
@@ -22,7 +21,7 @@
   ///
   /// [_InitState.notInit] or [_InitState.initInDeclaration] is set for each
   /// field. Later [verify] is called to verify each constructor of the class.
-  Map<FieldElement, _InitState> _initialFieldMap;
+  Map<FieldElement, _InitState>? _initialFieldMap;
 
   /// The state of fields in the current constructor.
   Map<FieldElement, _InitState> _fieldMap = {};
@@ -31,14 +30,14 @@
   bool _hasRedirectingConstructorInvocation = false;
 
   ConstructorFieldsVerifier({
-    @required TypeSystemImpl typeSystem,
-    @required ErrorReporter errorReporter,
-  })  : _typeSystem = typeSystem,
+    required TypeSystemImpl typeSystem,
+    required ErrorReporter errorReporter,
+  })   : _typeSystem = typeSystem,
         _errorReporter = errorReporter;
 
   void enterClass(ClassDeclaration node) {
     _isInNativeClass = node.nativeClause != null;
-    _initFieldsMap(node.declaredElement);
+    _initFieldsMap(node.declaredElement!);
   }
 
   void leaveClass() {
@@ -64,7 +63,7 @@
       return;
     }
 
-    _fieldMap = Map.of(_initialFieldMap);
+    _fieldMap = Map.of(_initialFieldMap!);
     _hasRedirectingConstructorInvocation = false;
 
     _updateWithParameters(node);
@@ -98,7 +97,7 @@
     _initialFieldMap = <FieldElement, _InitState>{};
     for (var field in element.fields) {
       if (!field.isSynthetic) {
-        _initialFieldMap[field] = field.hasInitializer
+        _initialFieldMap![field] = field.hasInitializer
             ? _InitState.initInDeclaration
             : _InitState.notInit;
       }
@@ -165,9 +164,9 @@
       }
       if (initializer is ConstructorFieldInitializer) {
         SimpleIdentifier fieldName = initializer.fieldName;
-        Element element = fieldName.staticElement;
+        var element = fieldName.staticElement;
         if (element is FieldElement) {
-          _InitState state = _fieldMap[element];
+          var state = _fieldMap[element];
           if (state == _InitState.notInit) {
             _fieldMap[element] = _InitState.initInInitializer;
           } else if (state == _InitState.initInDeclaration) {
@@ -201,10 +200,13 @@
     for (FormalParameter parameter in formalParameters) {
       parameter = _baseParameter(parameter);
       if (parameter is FieldFormalParameter) {
-        FieldElement fieldElement =
+        var fieldElement =
             (parameter.declaredElement as FieldFormalParameterElementImpl)
                 .field;
-        _InitState state = _fieldMap[fieldElement];
+        if (fieldElement == null) {
+          continue;
+        }
+        _InitState? state = _fieldMap[fieldElement];
         if (state == _InitState.notInit) {
           _fieldMap[fieldElement] = _InitState.initInFieldFormal;
         } else if (state == _InitState.initInDeclaration) {
diff --git a/pkg/analyzer/lib/src/error/correct_override.dart b/pkg/analyzer/lib/src/error/correct_override.dart
index f456ab8..db8a2ee 100644
--- a/pkg/analyzer/lib/src/error/correct_override.dart
+++ b/pkg/analyzer/lib/src/error/correct_override.dart
@@ -15,19 +15,18 @@
 import 'package:analyzer/src/dart/element/type_algebra.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:meta/meta.dart';
 
 class CorrectOverrideHelper {
   final LibraryElementImpl _library;
   final TypeSystemImpl _typeSystem;
 
   final ExecutableElement _thisMember;
-  FunctionType _thisTypeForSubtype;
+  FunctionType? _thisTypeForSubtype;
 
   CorrectOverrideHelper({
-    @required LibraryElement library,
-    @required ExecutableElement thisMember,
-  })  : _library = library,
+    required LibraryElementImpl library,
+    required ExecutableElement thisMember,
+  })   : _library = library,
         _typeSystem = library.typeSystem,
         _thisMember = thisMember {
     _computeThisTypeForSubtype();
@@ -35,21 +34,21 @@
 
   /// Return `true` if [_thisMember] is a correct override of [superMember].
   bool isCorrectOverrideOf({
-    @required ExecutableElement superMember,
+    required ExecutableElement superMember,
   }) {
     superMember = _library.toLegacyElementIfOptOut(superMember);
 
     var superType = superMember.type;
-    return _typeSystem.isSubtypeOf2(_thisTypeForSubtype, superType);
+    return _typeSystem.isSubtypeOf2(_thisTypeForSubtype!, superType);
   }
 
   /// If [_thisMember] is not a correct override of [superMember], report the
   /// error.
   void verify({
-    @required ExecutableElement superMember,
-    @required ErrorReporter errorReporter,
-    @required AstNode errorNode,
-    ErrorCode errorCode,
+    required ExecutableElement superMember,
+    required ErrorReporter errorReporter,
+    required AstNode errorNode,
+    ErrorCode? errorCode,
   }) {
     var isCorrect = isCorrectOverrideOf(superMember: superMember);
     if (!isCorrect) {
@@ -72,7 +71,7 @@
   void _computeThisTypeForSubtype() {
     var parameters = _thisMember.parameters;
 
-    List<ParameterElement> newParameters;
+    List<ParameterElement>? newParameters;
     for (var i = 0; i < parameters.length; i++) {
       var parameter = parameters[i];
       if (parameter.isCovariant) {
@@ -106,14 +105,14 @@
   final ExecutableElement _thisMember;
 
   CovariantParametersVerifier({
-    @required ExecutableElement thisMember,
-  })  : _session = thisMember.library.session,
-        _typeSystem = thisMember.library.typeSystem,
+    required ExecutableElement thisMember,
+  })   : _session = thisMember.library.session as AnalysisSessionImpl,
+        _typeSystem = thisMember.library.typeSystem as TypeSystemImpl,
         _thisMember = thisMember;
 
   void verify({
-    @required ErrorReporter errorReporter,
-    @required AstNode errorNode,
+    required ErrorReporter errorReporter,
+    required AstNode errorNode,
   }) {
     var superParameters = _superParameters();
     for (var entry in superParameters.entries) {
@@ -142,7 +141,7 @@
 
   List<_SuperMember> _superMembers() {
     var classHierarchy = _session.classHierarchy;
-    var classElement = _thisMember.enclosingElement;
+    var classElement = _thisMember.enclosingElement as ClassElement;
     var interfaces = classHierarchy.implementedInterfaces(classElement);
 
     var superMembers = <_SuperMember>[];
@@ -161,7 +160,7 @@
   Map<ParameterElement, List<_SuperParameter>> _superParameters() {
     var result = <ParameterElement, List<_SuperParameter>>{};
 
-    List<_SuperMember> superMembers;
+    List<_SuperMember>? superMembers;
     var parameters = _thisMember.parameters;
     for (var i = 0; i < parameters.length; i++) {
       var parameter = parameters[i];
@@ -215,7 +214,7 @@
 
   /// Return a member from [classElement] that corresponds to the [proto],
   /// or `null` if no such member exist.
-  static ExecutableElement _correspondingMember(
+  static ExecutableElement? _correspondingMember(
     ClassElement classElement,
     ExecutableElement proto,
   ) {
@@ -233,7 +232,7 @@
 
   /// Return an element of [parameters] that corresponds for the [proto],
   /// or `null` if no such parameter exist.
-  static ParameterElement _correspondingParameter(
+  static ParameterElement? _correspondingParameter(
     List<ParameterElement> parameters,
     ParameterElement proto,
     int protoIndex,
@@ -270,5 +269,5 @@
 
   _SuperParameter(this.element, this.type);
 
-  ExecutableElement get member => element.enclosingElement;
+  ExecutableElement get member => element.enclosingElement as ExecutableElement;
 }
diff --git a/pkg/analyzer/lib/src/error/dead_code_verifier.dart b/pkg/analyzer/lib/src/error/dead_code_verifier.dart
index 24eefd2..6425888 100644
--- a/pkg/analyzer/lib/src/error/dead_code_verifier.dart
+++ b/pkg/analyzer/lib/src/error/dead_code_verifier.dart
@@ -31,7 +31,7 @@
   final ErrorReporter _errorReporter;
 
   /// The object used to track the usage of labels within a given label scope.
-  _LabelTracker labelTracker;
+  _LabelTracker? labelTracker;
 
   DeadCodeVerifier(this._errorReporter);
 
@@ -47,10 +47,10 @@
 
   @override
   void visitExportDirective(ExportDirective node) {
-    ExportElement exportElement = node.element;
+    ExportElement? exportElement = node.element;
     if (exportElement != null) {
       // The element is null when the URI is invalid.
-      LibraryElement library = exportElement.exportedLibrary;
+      LibraryElement? library = exportElement.exportedLibrary;
       if (library != null && !library.isSynthetic) {
         for (Combinator combinator in node.combinators) {
           _checkCombinator(library, combinator);
@@ -62,11 +62,11 @@
 
   @override
   void visitImportDirective(ImportDirective node) {
-    ImportElement importElement = node.element;
+    ImportElement? importElement = node.element;
     if (importElement != null) {
       // The element is null when the URI is invalid, but not when the URI is
       // valid but refers to a non-existent file.
-      LibraryElement library = importElement.importedLibrary;
+      LibraryElement? library = importElement.importedLibrary;
       if (library != null && !library.isSynthetic) {
         for (Combinator combinator in node.combinators) {
           _checkCombinator(library, combinator);
@@ -116,7 +116,7 @@
     }
     for (SimpleIdentifier name in names) {
       String nameStr = name.name;
-      Element element = namespace.get(nameStr);
+      Element? element = namespace.get(nameStr);
       element ??= namespace.get("$nameStr=");
       if (element == null) {
         _errorReporter
@@ -128,11 +128,11 @@
   /// Exit the most recently entered label scope after reporting any labels that
   /// were not referenced within that scope.
   void _popLabels() {
-    for (Label label in labelTracker.unusedLabels()) {
+    for (Label label in labelTracker!.unusedLabels()) {
       _errorReporter
           .reportErrorForNode(HintCode.UNUSED_LABEL, label, [label.label.name]);
     }
-    labelTracker = labelTracker.outerTracker;
+    labelTracker = labelTracker!.outerTracker;
   }
 
   /// Enter a new label scope in which the given [labels] are defined.
@@ -152,14 +152,9 @@
   /// Initialize a newly created dead code verifier that will report dead code
   /// to the given [errorReporter] and will use the given [typeSystem] if one is
   /// provided.
-  LegacyDeadCodeVerifier(this._errorReporter, {TypeSystemImpl typeSystem})
-      : _typeSystem = typeSystem ??
-            TypeSystemImpl(
-              implicitCasts: true,
-              isNonNullableByDefault: false,
-              strictInference: false,
-              typeProvider: null,
-            );
+  LegacyDeadCodeVerifier(this._errorReporter,
+      {required TypeSystemImpl typeSystem})
+      : _typeSystem = typeSystem;
 
   @override
   void visitBinaryExpression(BinaryExpression node) {
@@ -169,22 +164,22 @@
     if (isAmpAmp || isBarBar) {
       Expression lhsCondition = node.leftOperand;
       if (!_isDebugConstant(lhsCondition)) {
-        EvaluationResultImpl lhsResult = _getConstantBooleanValue(lhsCondition);
+        var lhsResult = _getConstantBooleanValue(lhsCondition);
         if (lhsResult != null) {
-          bool value = lhsResult.value.toBoolValue();
+          var value = lhsResult.value?.toBoolValue();
           if (value == true && isBarBar) {
             // Report error on "else" block: true || !e!
             _errorReporter.reportErrorForNode(
                 HintCode.DEAD_CODE, node.rightOperand);
             // Only visit the LHS:
-            lhsCondition?.accept(this);
+            lhsCondition.accept(this);
             return;
           } else if (value == false && isAmpAmp) {
             // Report error on "if" block: false && !e!
             _errorReporter.reportErrorForNode(
                 HintCode.DEAD_CODE, node.rightOperand);
             // Only visit the LHS:
-            lhsCondition?.accept(this);
+            lhsCondition.accept(this);
             return;
           }
         }
@@ -224,22 +219,21 @@
   @override
   void visitConditionalExpression(ConditionalExpression node) {
     Expression conditionExpression = node.condition;
-    conditionExpression?.accept(this);
+    conditionExpression.accept(this);
     if (!_isDebugConstant(conditionExpression)) {
-      EvaluationResultImpl result =
-          _getConstantBooleanValue(conditionExpression);
+      var result = _getConstantBooleanValue(conditionExpression);
       if (result != null) {
-        if (result.value.toBoolValue() == true) {
+        if (result.value?.toBoolValue() == true) {
           // Report error on "else" block: true ? 1 : !2!
           _errorReporter.reportErrorForNode(
               HintCode.DEAD_CODE, node.elseExpression);
-          node.thenExpression?.accept(this);
+          node.thenExpression.accept(this);
           return;
         } else {
           // Report error on "if" block: false ? !1! : 2
           _errorReporter.reportErrorForNode(
               HintCode.DEAD_CODE, node.thenExpression);
-          node.elseExpression?.accept(this);
+          node.elseExpression.accept(this);
           return;
         }
       }
@@ -250,17 +244,16 @@
   @override
   void visitIfElement(IfElement node) {
     Expression conditionExpression = node.condition;
-    conditionExpression?.accept(this);
+    conditionExpression.accept(this);
     if (!_isDebugConstant(conditionExpression)) {
-      EvaluationResultImpl result =
-          _getConstantBooleanValue(conditionExpression);
+      var result = _getConstantBooleanValue(conditionExpression);
       if (result != null) {
-        if (result.value.toBoolValue() == true) {
+        if (result.value?.toBoolValue() == true) {
           // Report error on else block: if(true) {} else {!}
-          CollectionElement elseElement = node.elseElement;
+          var elseElement = node.elseElement;
           if (elseElement != null) {
             _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, elseElement);
-            node.thenElement?.accept(this);
+            node.thenElement.accept(this);
             return;
           }
         } else {
@@ -278,18 +271,17 @@
   @override
   void visitIfStatement(IfStatement node) {
     Expression conditionExpression = node.condition;
-    conditionExpression?.accept(this);
+    conditionExpression.accept(this);
     if (!_isDebugConstant(conditionExpression)) {
-      EvaluationResultImpl result =
-          _getConstantBooleanValue(conditionExpression);
+      var result = _getConstantBooleanValue(conditionExpression);
       if (result != null) {
-        if (result.value.toBoolValue() == true) {
+        if (result.value?.toBoolValue() == true) {
           // Report error on else block: if(true) {} else {!}
-          Statement elseStatement = node.elseStatement;
+          var elseStatement = node.elseStatement;
           if (elseStatement != null) {
             _errorReporter.reportErrorForNode(
                 HintCode.DEAD_CODE, elseStatement);
-            node.thenStatement?.accept(this);
+            node.thenStatement.accept(this);
             return;
           }
         } else {
@@ -318,7 +310,7 @@
 
   @override
   void visitTryStatement(TryStatement node) {
-    node.body?.accept(this);
+    node.body.accept(this);
     node.finallyBlock?.accept(this);
 
     var verifier = _CatchClausesVerifier(
@@ -347,19 +339,18 @@
   @override
   void visitWhileStatement(WhileStatement node) {
     Expression conditionExpression = node.condition;
-    conditionExpression?.accept(this);
+    conditionExpression.accept(this);
     if (!_isDebugConstant(conditionExpression)) {
-      EvaluationResultImpl result =
-          _getConstantBooleanValue(conditionExpression);
+      var result = _getConstantBooleanValue(conditionExpression);
       if (result != null) {
-        if (result.value.toBoolValue() == false) {
+        if (result.value?.toBoolValue() == false) {
           // Report error on while block: while (false) {!}
           _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, node.body);
           return;
         }
       }
     }
-    node.body?.accept(this);
+    node.body.accept(this);
   }
 
   /// Given some list of [statements], loop through the list searching for dead
@@ -381,7 +372,7 @@
     int size = statements.length;
     for (int i = 0; i < size; i++) {
       Statement currentStatement = statements[i];
-      currentStatement?.accept(this);
+      currentStatement.accept(this);
       if (statementExits(currentStatement) && i != size - 1) {
         Statement nextStatement = statements[i + 1];
         Statement lastStatement = statements[size - 1];
@@ -405,7 +396,7 @@
   /// Given some [expression], return [ValidResult.RESULT_TRUE] if it is `true`,
   /// [ValidResult.RESULT_FALSE] if it is `false`, or `null` if the expression
   /// is not a constant boolean value.
-  EvaluationResultImpl _getConstantBooleanValue(Expression expression) {
+  EvaluationResultImpl? _getConstantBooleanValue(Expression expression) {
     if (expression is BooleanLiteral) {
       return EvaluationResultImpl(
         DartObjectImpl(
@@ -433,7 +424,7 @@
   /// Return `true` if the given [expression] is resolved to a constant
   /// variable.
   bool _isDebugConstant(Expression expression) {
-    Element element;
+    Element? element;
     if (expression is Identifier) {
       element = expression.staticElement;
     } else if (expression is PropertyAccess) {
@@ -441,7 +432,7 @@
     }
     if (element is PropertyAccessorElement) {
       PropertyInducingElement variable = element.variable;
-      return variable != null && variable.isConst;
+      return variable.isConst;
     }
     return false;
   }
@@ -474,7 +465,7 @@
 class NullSafetyDeadCodeVerifier {
   final TypeSystemImpl _typeSystem;
   final ErrorReporter _errorReporter;
-  final FlowAnalysisHelper _flowAnalysis;
+  final FlowAnalysisHelper? _flowAnalysis;
 
   /// The stack of verifiers of (potentially nested) try statements.
   final List<_CatchClausesVerifier> _catchClausesVerifiers = [];
@@ -488,7 +479,7 @@
   ///
   /// When this field is not `null`, and we see an unreachable node, this new
   /// node is ignored, because it continues the same dead code range.
-  AstNode _firstDeadNode;
+  AstNode? _firstDeadNode;
 
   NullSafetyDeadCodeVerifier(
     this._typeSystem,
@@ -505,7 +496,7 @@
         return;
       }
 
-      var parent = _firstDeadNode.parent;
+      var parent = _firstDeadNode!.parent;
       if (parent is Assertion && identical(_firstDeadNode, parent.message)) {
         // Don't report "dead code" for the message part of an assert statement,
         // because this causes nuisance warnings for redundant `!= null`
@@ -516,26 +507,26 @@
         // But we trim it to the last statement for presentation purposes.
         if (node != _firstDeadNode) {
           if (node is FunctionDeclaration) {
-            node = (node as FunctionDeclaration).functionExpression.body;
+            node = node.functionExpression.body!;
           }
           if (node is FunctionExpression) {
-            node = (node as FunctionExpression).body;
+            node = node.body!;
           }
           if (node is MethodDeclaration) {
-            node = (node as MethodDeclaration).body;
+            node = node.body;
           }
           if (node is BlockFunctionBody) {
-            node = (node as BlockFunctionBody).block;
+            node = node.block;
           }
           if (node is Block && node.statements.isNotEmpty) {
-            node = (node as Block).statements.last;
+            node = node.statements.last;
           }
           if (node is SwitchMember && node.statements.isNotEmpty) {
-            node = (node as SwitchMember).statements.last;
+            node = node.statements.last;
           }
         }
 
-        var offset = _firstDeadNode.offset;
+        var offset = _firstDeadNode!.offset;
         var length = node.end - offset;
         _errorReporter.reportErrorForOffset(HintCode.DEAD_CODE, offset, length);
       }
@@ -580,9 +571,9 @@
     if (node is Comment) return;
 
     if (_flowAnalysis == null) return;
-    _flowAnalysis.checkUnreachableNode(node);
+    _flowAnalysis!.checkUnreachableNode(node);
 
-    var flow = _flowAnalysis.flow;
+    var flow = _flowAnalysis!.flow;
     if (flow == null) return;
 
     if (flow.isReachable) return;
@@ -661,14 +652,14 @@
 /// An object used to track the usage of labels within a single label scope.
 class _LabelTracker {
   /// The tracker for the outer label scope.
-  final _LabelTracker outerTracker;
+  final _LabelTracker? outerTracker;
 
   /// The labels whose usage is being tracked.
   final List<Label> labels;
 
   /// A list of flags corresponding to the list of [labels] indicating whether
   /// the corresponding label has been used.
-  List<bool> used;
+  late final List<bool> used;
 
   /// A map from the names of labels to the index of the label in [labels].
   final Map<String, int> labelMap = <String, int>{};
@@ -682,13 +673,13 @@
   }
 
   /// Record that the label with the given [labelName] has been used.
-  void recordUsage(String labelName) {
+  void recordUsage(String? labelName) {
     if (labelName != null) {
-      int index = labelMap[labelName];
+      var index = labelMap[labelName];
       if (index != null) {
         used[index] = true;
       } else if (outerTracker != null) {
-        outerTracker.recordUsage(labelName);
+        outerTracker!.recordUsage(labelName);
       }
     }
   }
diff --git a/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart b/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart
index 6bcabc9..cebd550 100644
--- a/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart
+++ b/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart
@@ -3,16 +3,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/constant/value.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/listener.dart';
-import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/error/hint_codes.dart';
 import 'package:analyzer/src/workspace/workspace.dart';
+import 'package:collection/collection.dart';
 
 class DeprecatedMemberUseVerifier {
-  final WorkspacePackage _workspacePackage;
+  final WorkspacePackage? _workspacePackage;
   final ErrorReporter _errorReporter;
 
   /// We push a new value every time when we enter into a scope which
@@ -107,7 +106,7 @@
     }
 
     // Report full ConstructorName, not just the constructor name.
-    AstNode parent = node.parent;
+    var parent = node.parent;
     if (parent is ConstructorName && identical(node, parent.name)) {
       return;
     }
@@ -134,7 +133,7 @@
   /// Given some [element], look at the associated metadata and report the use
   /// of the member if it is declared as deprecated. If a diagnostic is reported
   /// it should be reported at the given [node].
-  void _checkForDeprecated(Element element, AstNode node) {
+  void _checkForDeprecated(Element? element, AstNode node) {
     if (!_isDeprecated(element)) {
       return;
     }
@@ -161,7 +160,7 @@
       errorNode = node.name.label;
     }
 
-    String displayName = element.displayName;
+    String displayName = element!.displayName;
     if (element is ConstructorElement) {
       // TODO(jwren) We should modify ConstructorElement.getDisplayName(),
       // or have the logic centralized elsewhere, instead of doing this logic
@@ -180,9 +179,8 @@
         displayName = "${invokeClass.name}.${element.displayName}";
       }
     }
-    LibraryElement library =
-        element is LibraryElement ? element : element.library;
-    String message = _deprecatedMessage(element);
+    var library = element is LibraryElement ? element : element.library;
+    var message = _deprecatedMessage(element);
     if (message == null || message.isEmpty) {
       _errorReporter.reportErrorForNode(
         _isLibraryInWorkspacePackage(library)
@@ -202,7 +200,7 @@
     }
   }
 
-  void _invocationArguments(Element element, ArgumentList arguments) {
+  void _invocationArguments(Element? element, ArgumentList arguments) {
     element = element?.declaration;
     if (element is ExecutableElement) {
       _visitParametersAndArguments(
@@ -217,13 +215,13 @@
     }
   }
 
-  bool _isLibraryInWorkspacePackage(LibraryElement library) {
+  bool _isLibraryInWorkspacePackage(LibraryElement? library) {
     // Better to not make a big claim that they _are_ in the same package,
     // if we were unable to determine what package [_currentLibrary] is in.
     if (_workspacePackage == null || library == null) {
       return false;
     }
-    return _workspacePackage.contains(library.source);
+    return _workspacePackage!.contains(library.source);
   }
 
   void _simpleIdentifier(SimpleIdentifier identifier) {
@@ -233,33 +231,30 @@
   /// Return the message in the deprecated annotation on the given [element], or
   /// `null` if the element doesn't have a deprecated annotation or if the
   /// annotation does not have a message.
-  static String _deprecatedMessage(Element element) {
+  static String? _deprecatedMessage(Element element) {
     // Implicit getters/setters.
     if (element.isSynthetic && element is PropertyAccessorElement) {
-      element = (element as PropertyAccessorElement).variable;
+      element = element.variable;
     }
-    ElementAnnotationImpl annotation = element.metadata.firstWhere(
-      (e) => e.isDeprecated,
-      orElse: () => null,
-    );
+    var annotation = element.metadata.firstWhereOrNull((e) => e.isDeprecated);
     if (annotation == null || annotation.element is PropertyAccessorElement) {
       return null;
     }
-    DartObject constantValue = annotation.computeConstantValue();
+    var constantValue = annotation.computeConstantValue();
     return constantValue?.getField('message')?.toStringValue() ??
         constantValue?.getField('expires')?.toStringValue();
   }
 
   static bool _hasDeprecatedAnnotation(List<Annotation> annotations) {
     for (var i = 0; i < annotations.length; i++) {
-      if (annotations[i].elementAnnotation.isDeprecated) {
+      if (annotations[i].elementAnnotation!.isDeprecated) {
         return true;
       }
     }
     return false;
   }
 
-  static bool _isDeprecated(Element element) {
+  static bool _isDeprecated(Element? element) {
     if (element == null) {
       return false;
     }
@@ -267,18 +262,15 @@
     if (element is PropertyAccessorElement && element.isSynthetic) {
       // TODO(brianwilkerson) Why isn't this the implementation for PropertyAccessorElement?
       Element variable = element.variable;
-      if (variable == null) {
-        return false;
-      }
       return variable.hasDeprecated;
     }
     return element.hasDeprecated;
   }
 
   /// Return `true` if [element] is a [ParameterElement] declared in [node].
-  static bool _isLocalParameter(Element element, AstNode node) {
+  static bool _isLocalParameter(Element? element, AstNode? node) {
     if (element is ParameterElement) {
-      ExecutableElement definingFunction = element.enclosingElement;
+      var definingFunction = element.enclosingElement as ExecutableElement;
 
       for (; node != null; node = node.parent) {
         if (node is ConstructorDeclaration) {
@@ -304,7 +296,7 @@
     List<Expression> arguments,
     void Function(ParameterElement, Expression) f,
   ) {
-    Map<String, ParameterElement> namedParameters;
+    Map<String, ParameterElement>? namedParameters;
 
     var positionalIndex = 0;
     for (var argument in arguments) {
diff --git a/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart b/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
index 073ca29..eb3d6c6 100644
--- a/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
+++ b/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
@@ -26,8 +26,8 @@
 
   /// Check that the exception and stack trace parameters have different names.
   void checkCatchClause(CatchClause node) {
-    SimpleIdentifier exceptionParameter = node.exceptionParameter;
-    SimpleIdentifier stackTraceParameter = node.stackTraceParameter;
+    var exceptionParameter = node.exceptionParameter;
+    var stackTraceParameter = node.stackTraceParameter;
     if (exceptionParameter != null && stackTraceParameter != null) {
       String exceptionName = exceptionParameter.name;
       if (exceptionName == stackTraceParameter.name) {
@@ -40,15 +40,15 @@
   }
 
   void checkClass(ClassDeclaration node) {
-    _checkClassMembers(node.declaredElement, node.members);
+    _checkClassMembers(node.declaredElement!, node.members);
   }
 
   /// Check that there are no members with the same name.
   void checkEnum(EnumDeclaration node) {
-    ClassElement element = node.declaredElement;
+    ClassElement element = node.declaredElement!;
 
     Map<String, Element> staticGetters = {
-      'values': element.getGetter('values')
+      'values': element.getGetter('values')!
     };
 
     for (EnumConstantDeclaration constant in node.constants) {
@@ -112,7 +112,7 @@
               _errorReporter.reportErrorForNode(
                 CompileTimeErrorCode.EXTENSION_CONFLICTING_STATIC_AND_INSTANCE,
                 identifier,
-                [node.declaredElement.name, name],
+                [node.declaredElement!.name, name],
               );
             }
           }
@@ -126,7 +126,7 @@
             _errorReporter.reportErrorForNode(
               CompileTimeErrorCode.EXTENSION_CONFLICTING_STATIC_AND_INSTANCE,
               identifier,
-              [node.declaredElement.name, name],
+              [node.declaredElement!.name, name],
             );
           }
         }
@@ -144,14 +144,14 @@
   }
 
   void checkMixin(MixinDeclaration node) {
-    _checkClassMembers(node.declaredElement, node.members);
+    _checkClassMembers(node.declaredElement!, node.members);
   }
 
   /// Check that all of the parameters have unique names.
   void checkParameters(FormalParameterList node) {
     Map<String, Element> definedNames = HashMap<String, Element>();
     for (FormalParameter parameter in node.parameters) {
-      SimpleIdentifier identifier = parameter.identifier;
+      var identifier = parameter.identifier;
       if (identifier != null) {
         // The identifier can be null if this is a parameter list for a generic
         // function type.
@@ -217,12 +217,12 @@
     }
 
     for (ImportElement importElement in _currentLibrary.imports) {
-      PrefixElement prefix = importElement.prefix;
+      var prefix = importElement.prefix;
       if (prefix != null) {
         definedGetters[prefix.name] = prefix;
       }
     }
-    CompilationUnitElement element = node.declaredElement;
+    CompilationUnitElement element = node.declaredElement!;
     if (element != _currentLibrary.definingCompilationUnit) {
       addWithoutChecking(_currentLibrary.definingCompilationUnit);
       for (CompilationUnitElement part in _currentLibrary.parts) {
@@ -293,20 +293,21 @@
     // Check for local static members conflicting with local instance members.
     for (ClassMember member in members) {
       if (member is ConstructorDeclaration) {
-        if (member.name != null) {
-          String name = member.name.name;
+        var nameNode = member.name;
+        if (nameNode != null) {
+          String name = nameNode.name;
           var staticMember = staticGetters[name] ?? staticSetters[name];
           if (staticMember != null) {
             if (staticMember is PropertyAccessorElement) {
               _errorReporter.reportErrorForNode(
                 CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_AND_STATIC_FIELD,
-                member.name,
+                nameNode,
                 [name],
               );
             } else {
               _errorReporter.reportErrorForNode(
                 CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_AND_STATIC_METHOD,
-                member.name,
+                nameNode,
                 [name],
               );
             }
@@ -333,7 +334,7 @@
           String name = identifier.name;
           if (instanceGetters.containsKey(name) ||
               instanceSetters.containsKey(name)) {
-            String className = identifier.staticElement.enclosingElement.name;
+            String className = element.name;
             _errorReporter.reportErrorForNode(
                 CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE,
                 identifier,
@@ -349,11 +350,11 @@
   /// error if it is.
   void _checkDuplicateIdentifier(
       Map<String, Element> getterScope, SimpleIdentifier identifier,
-      {Element element, Map<String, Element> setterScope}) {
+      {Element? element, Map<String, Element>? setterScope}) {
     if (identifier.isSynthetic) {
       return;
     }
-    element ??= identifier.staticElement;
+    element ??= identifier.staticElement!;
 
     // Fields define getters and setters, so check them separately.
     if (element is PropertyInducingElement) {
@@ -381,14 +382,14 @@
       name = element.name;
     }
 
-    Element previous = getterScope[name];
+    var previous = getterScope[name];
     if (previous != null) {
       if (_isGetterSetterPair(element, previous)) {
         // OK
       } else if (element is FieldFormalParameterElement &&
           previous is FieldFormalParameterElement &&
           element.field != null &&
-          element.field.isFinal) {
+          element.field!.isFinal) {
         // Reported as CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES.
       } else {
         _errorReporter.reportErrorForNode(
@@ -401,16 +402,18 @@
       getterScope[name] = element;
     }
 
-    if (element is PropertyAccessorElement && element.isSetter) {
-      previous = setterScope[name];
-      if (previous != null) {
-        _errorReporter.reportErrorForNode(
-          getError(previous, element),
-          identifier,
-          [name],
-        );
-      } else {
-        setterScope[name] = element;
+    if (setterScope != null) {
+      if (element is PropertyAccessorElement && element.isSetter) {
+        previous = setterScope[name];
+        if (previous != null) {
+          _errorReporter.reportErrorForNode(
+            getError(previous, element),
+            identifier,
+            [name],
+          );
+        } else {
+          setterScope[name] = element;
+        }
       }
     }
   }
diff --git a/pkg/analyzer/lib/src/error/getter_setter_types_verifier.dart b/pkg/analyzer/lib/src/error/getter_setter_types_verifier.dart
index 97a02ce..5c5e045 100644
--- a/pkg/analyzer/lib/src/error/getter_setter_types_verifier.dart
+++ b/pkg/analyzer/lib/src/error/getter_setter_types_verifier.dart
@@ -10,7 +10,6 @@
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:meta/meta.dart';
 
 /// Verifies that the return type of the getter matches the parameter type
 /// of the corresponding setter. Where "match" means "subtype" in non-nullable,
@@ -20,9 +19,9 @@
   final ErrorReporter _errorReporter;
 
   GetterSetterTypesVerifier({
-    @required TypeSystemImpl typeSystem,
-    @required ErrorReporter errorReporter,
-  })  : _typeSystem = typeSystem,
+    required TypeSystemImpl typeSystem,
+    required ErrorReporter errorReporter,
+  })   : _typeSystem = typeSystem,
         _errorReporter = errorReporter;
 
   ErrorCode get _errorCode {
@@ -36,7 +35,8 @@
   void checkExtension(ExtensionDeclaration node) {
     for (var getterNode in node.members) {
       if (getterNode is MethodDeclaration && getterNode.isGetter) {
-        checkGetter(getterNode.name, getterNode.declaredElement);
+        checkGetter(getterNode.name,
+            getterNode.declaredElement as PropertyAccessorElement);
       }
     }
   }
@@ -74,7 +74,7 @@
     for (var name in interface.map.keys) {
       if (!name.isAccessibleFor(libraryUri)) continue;
 
-      var getter = interface.map[name];
+      var getter = interface.map[name]!;
       if (getter.kind == ElementKind.GETTER) {
         var setter = interface.map[Name(libraryUri, '${name.name}=')];
         if (setter != null && setter.parameters.length == 1) {
@@ -125,7 +125,7 @@
   }
 
   /// Return the type of the first parameter of the [setter].
-  static DartType _getSetterType(PropertyAccessorElement setter) {
+  static DartType? _getSetterType(PropertyAccessorElement setter) {
     var parameters = setter.parameters;
     if (parameters.isNotEmpty) {
       return parameters[0].type;
diff --git a/pkg/analyzer/lib/src/error/ignore_validator.dart b/pkg/analyzer/lib/src/error/ignore_validator.dart
index a8dd8d8..5014a7e 100644
--- a/pkg/analyzer/lib/src/error/ignore_validator.dart
+++ b/pkg/analyzer/lib/src/error/ignore_validator.dart
@@ -10,7 +10,6 @@
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/ignore_comments/ignore_info.dart';
-import 'package:meta/meta.dart';
 
 /// Used to validate the ignore comments in a single file.
 class IgnoreValidator {
@@ -30,7 +29,7 @@
   /// be ignored. Note that this list is incomplete. Plugins might well define
   /// diagnostics with a severity of `ERROR`, but we won't be able to flag their
   /// use because we have no visibility of them here.
-  Set<String> _unignorableNames;
+  late final Set<String> _unignorableNames;
 
   /// Initialize a newly created validator to report any issues with ignore
   /// comments in the file being analyzed. The diagnostics will be reported to
@@ -144,9 +143,9 @@
 
 /// Helper for caching unignorable names.
 class _UnignorableNames {
-  static Set<String> _forFlutter;
-  static Set<String> _forDart2jsTest;
-  static Set<String> _forOther;
+  static Set<String>? _forFlutter;
+  static Set<String>? _forDart2jsTest;
+  static Set<String>? _forOther;
 
   static Set<String> forFile(String filePath) {
     var isFlutter = filePath.contains('flutter');
@@ -155,15 +154,15 @@
 
     if (isFlutter) {
       if (_forFlutter != null) {
-        return _forFlutter;
+        return _forFlutter!;
       }
     } else if (isDart2jsTest) {
       if (_forDart2jsTest != null) {
-        return _forDart2jsTest;
+        return _forDart2jsTest!;
       }
     } else {
       if (_forOther != null) {
-        return _forOther;
+        return _forOther!;
       }
     }
 
@@ -189,8 +188,8 @@
 
   static bool isIgnorable(
     ErrorCode code, {
-    @required bool isFlutter,
-    @required bool isDart2jsTest,
+    required bool isFlutter,
+    required bool isDart2jsTest,
   }) {
     if (code.isIgnorable) {
       return true;
diff --git a/pkg/analyzer/lib/src/error/imports_verifier.dart b/pkg/analyzer/lib/src/error/imports_verifier.dart
index 198ee09..caeba58 100644
--- a/pkg/analyzer/lib/src/error/imports_verifier.dart
+++ b/pkg/analyzer/lib/src/error/imports_verifier.dart
@@ -91,26 +91,32 @@
     }
   }
 
-  void _recordIfExtensionMember(Element element) {
-    if (element != null && element.enclosingElement is ExtensionElement) {
-      _recordUsedExtension(element.enclosingElement);
+  void _recordIfExtensionMember(Element? element) {
+    if (element != null) {
+      var enclosingElement = element.enclosingElement;
+      if (enclosingElement is ExtensionElement) {
+        _recordUsedExtension(enclosingElement);
+      }
     }
   }
 
   /// If the given [identifier] is prefixed with a [PrefixElement], fill the
   /// corresponding `UsedImportedElements.prefixMap` entry and return `true`.
   bool _recordPrefixMap(SimpleIdentifier identifier, Element element) {
-    bool recordIfTargetIsPrefixElement(Expression target) {
-      if (target is SimpleIdentifier && target.staticElement is PrefixElement) {
-        List<Element> prefixedElements = usedElements.prefixMap
-            .putIfAbsent(target.staticElement, () => <Element>[]);
-        prefixedElements.add(element);
-        return true;
+    bool recordIfTargetIsPrefixElement(Expression? target) {
+      if (target is SimpleIdentifier) {
+        var targetElement = target.staticElement;
+        if (targetElement is PrefixElement) {
+          List<Element> prefixedElements = usedElements.prefixMap
+              .putIfAbsent(targetElement, () => <Element>[]);
+          prefixedElements.add(element);
+          return true;
+        }
       }
       return false;
     }
 
-    AstNode parent = identifier.parent;
+    var parent = identifier.parent;
     if (parent is MethodInvocation && parent.methodName == identifier) {
       return recordIfTargetIsPrefixElement(parent.target);
     }
@@ -122,7 +128,7 @@
 
   void _recordUsedElement(Element element) {
     // Ignore if an unknown library.
-    LibraryElement containingLibrary = element.library;
+    var containingLibrary = element.library;
     if (containingLibrary == null) {
       return;
     }
@@ -149,7 +155,7 @@
     directive.metadata.accept(this);
   }
 
-  void _visitIdentifier(SimpleIdentifier identifier, Element element) {
+  void _visitIdentifier(SimpleIdentifier identifier, Element? element) {
     if (element == null) {
       return;
     }
@@ -157,7 +163,7 @@
     if (_recordPrefixMap(identifier, element)) {
       return;
     }
-    Element enclosingElement = element.enclosingElement;
+    var enclosingElement = element.enclosingElement;
     if (enclosingElement is CompilationUnitElement) {
       _recordUsedElement(element);
     } else if (enclosingElement is ExtensionElement) {
@@ -249,7 +255,7 @@
   void addImports(CompilationUnit node) {
     for (Directive directive in node.directives) {
       if (directive is ImportDirective) {
-        LibraryElement libraryElement = directive.uriElement;
+        var libraryElement = directive.uriElement;
         if (libraryElement == null) {
           continue;
         }
@@ -259,11 +265,11 @@
         // Initialize prefixElementMap
         //
         if (directive.asKeyword != null) {
-          SimpleIdentifier prefixIdentifier = directive.prefix;
+          var prefixIdentifier = directive.prefix;
           if (prefixIdentifier != null) {
-            Element element = prefixIdentifier.staticElement;
+            var element = prefixIdentifier.staticElement;
             if (element is PrefixElement) {
-              List<ImportDirective> list = _prefixElementMap[element];
+              var list = _prefixElementMap[element];
               if (list == null) {
                 list = <ImportDirective>[];
                 _prefixElementMap[element] = list;
@@ -359,9 +365,9 @@
     for (int i = 0; i < length; i++) {
       ImportDirective unusedImport = _unusedImports[i];
       // Check that the imported URI exists and isn't dart:core
-      ImportElement importElement = unusedImport.element;
+      var importElement = unusedImport.element;
       if (importElement != null) {
-        LibraryElement libraryElement = importElement.importedLibrary;
+        var libraryElement = importElement.importedLibrary;
         if (libraryElement == null ||
             libraryElement.isDartCore ||
             libraryElement.isSynthetic) {
@@ -391,8 +397,7 @@
       int length = identifiers.length;
       for (int i = 0; i < length; i++) {
         Identifier identifier = identifiers[i];
-        List<SimpleIdentifier> duplicateNames =
-            _duplicateShownNamesMap[importDirective];
+        var duplicateNames = _duplicateShownNamesMap[importDirective];
         if (duplicateNames == null || !duplicateNames.contains(identifier)) {
           // Only generate a hint if we won't also generate a
           // "duplicate_shown_name" hint for the same identifier.
@@ -415,8 +420,9 @@
         return;
       }
       // Find import directives using namespaces.
-      for (var importDirective in _prefixElementMap[prefix] ?? []) {
-        Namespace namespace = _computeNamespace(importDirective);
+      for (var importDirective
+          in _prefixElementMap[prefix] ?? <ImportDirective>[]) {
+        var namespace = _computeNamespace(importDirective);
         if (elements.isEmpty) {
           // [prefix] and [elements] were added to [usedElements.prefixMap] but
           // [elements] is empty, so the prefix was referenced incorrectly.
@@ -425,7 +431,7 @@
           _unusedImports.remove(importDirective);
         }
         for (var element in elements) {
-          if (namespace?.getPrefixed(prefix.name, element.name) != null) {
+          if (namespace?.getPrefixed(prefix.name, element.name!) != null) {
             _unusedImports.remove(importDirective);
             _removeFromUnusedShownNamesMap(element, importDirective);
           }
@@ -439,8 +445,8 @@
       }
       // Find import directives using namespaces.
       for (ImportDirective importDirective in _allImports) {
-        Namespace namespace = _computeNamespace(importDirective);
-        if (namespace?.get(element.name) != null) {
+        var namespace = _computeNamespace(importDirective);
+        if (namespace?.get(element.name!) != null) {
           _unusedImports.remove(importDirective);
           _removeFromUnusedShownNamesMap(element, importDirective);
         }
@@ -453,9 +459,9 @@
       }
       // Find import directives using namespaces.
       for (ImportDirective importDirective in _allImports) {
-        Namespace namespace = _computeNamespace(importDirective);
+        var namespace = _computeNamespace(importDirective);
         var prefix = importDirective.prefix?.name;
-        var elementName = extensionElement.name;
+        var elementName = extensionElement.name!;
         if (prefix == null) {
           if (namespace?.get(elementName) == extensionElement) {
             _unusedImports.remove(importDirective);
@@ -477,16 +483,14 @@
   /// Add duplicate shown and hidden names from [directive] into
   /// [_duplicateHiddenNamesMap] and [_duplicateShownNamesMap].
   void _addDuplicateShownHiddenNames(NamespaceDirective directive) {
-    if (directive.combinators == null) {
-      return;
-    }
     for (Combinator combinator in directive.combinators) {
       // Use a Set to find duplicates in faster than O(n^2) time.
       Set<Element> identifiers = <Element>{};
       if (combinator is HideCombinator) {
         for (SimpleIdentifier name in combinator.hiddenNames) {
-          if (name.staticElement != null) {
-            if (!identifiers.add(name.staticElement)) {
+          var element = name.staticElement;
+          if (element != null) {
+            if (!identifiers.add(element)) {
               // [name] is a duplicate.
               List<SimpleIdentifier> duplicateNames = _duplicateHiddenNamesMap
                   .putIfAbsent(directive, () => <SimpleIdentifier>[]);
@@ -496,8 +500,9 @@
         }
       } else if (combinator is ShowCombinator) {
         for (SimpleIdentifier name in combinator.shownNames) {
-          if (name.staticElement != null) {
-            if (!identifiers.add(name.staticElement)) {
+          var element = name.staticElement;
+          if (element != null) {
+            if (!identifiers.add(element)) {
               // [name] is a duplicate.
               List<SimpleIdentifier> duplicateNames = _duplicateShownNamesMap
                   .putIfAbsent(directive, () => <SimpleIdentifier>[]);
@@ -511,9 +516,6 @@
 
   /// Add every shown name from [importDirective] into [_unusedShownNamesMap].
   void _addShownNames(ImportDirective importDirective) {
-    if (importDirective.combinators == null) {
-      return;
-    }
     List<SimpleIdentifier> identifiers = <SimpleIdentifier>[];
     _unusedShownNamesMap[importDirective] = identifiers;
     for (Combinator combinator in importDirective.combinators) {
@@ -536,12 +538,12 @@
   /// @param importDirective the import directive used to compute the returned
   ///        namespace
   /// @return the computed or looked up [Namespace]
-  Namespace _computeNamespace(ImportDirective importDirective) {
-    Namespace namespace = _namespaceMap[importDirective];
+  Namespace? _computeNamespace(ImportDirective importDirective) {
+    var namespace = _namespaceMap[importDirective];
     if (namespace == null) {
       // If the namespace isn't in the namespaceMap, then compute and put it in
       // the map.
-      ImportElement importElement = importDirective.element;
+      var importElement = importDirective.element;
       if (importElement != null) {
         namespace = importElement.namespace;
         _namespaceMap[importDirective] = namespace;
@@ -553,7 +555,7 @@
   /// Remove [element] from the list of names shown by [importDirective].
   void _removeFromUnusedShownNamesMap(
       Element element, ImportDirective importDirective) {
-    List<SimpleIdentifier> identifiers = _unusedShownNamesMap[importDirective];
+    var identifiers = _unusedShownNamesMap[importDirective];
     if (identifiers == null) {
       return;
     }
diff --git a/pkg/analyzer/lib/src/error/inheritance_override.dart b/pkg/analyzer/lib/src/error/inheritance_override.dart
index 72a8b0c..4b4e865 100644
--- a/pkg/analyzer/lib/src/error/inheritance_override.dart
+++ b/pkg/analyzer/lib/src/error/inheritance_override.dart
@@ -12,13 +12,11 @@
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
-import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/error/correct_override.dart';
 import 'package:analyzer/src/error/getter_setter_types_verifier.dart';
 import 'package:analyzer/src/task/inference_error.dart';
-import 'package:meta/meta.dart';
 
 class InheritanceOverrideVerifier {
   static const _missingOverridesKey = 'missingOverrides';
@@ -33,7 +31,7 @@
       : _typeProvider = _typeSystem.typeProvider;
 
   void verifyUnit(CompilationUnit unit) {
-    var library = unit.declaredElement.library;
+    var library = unit.declaredElement!.library as LibraryElementImpl;
     for (var declaration in unit.declarations) {
       if (declaration is ClassDeclaration) {
         _ClassVerifier(
@@ -93,34 +91,34 @@
   final ErrorReporter reporter;
 
   final FeatureSet featureSet;
-  final LibraryElement library;
+  final LibraryElementImpl library;
   final Uri libraryUri;
   final ClassElementImpl classElement;
 
   final SimpleIdentifier classNameNode;
   final List<ClassMember> members;
-  final ImplementsClause implementsClause;
-  final OnClause onClause;
-  final TypeName superclass;
-  final WithClause withClause;
+  final ImplementsClause? implementsClause;
+  final OnClause? onClause;
+  final TypeName? superclass;
+  final WithClause? withClause;
 
   final List<InterfaceType> directSuperInterfaces = [];
 
   _ClassVerifier({
-    this.typeSystem,
-    this.typeProvider,
-    this.inheritance,
-    this.reporter,
-    this.featureSet,
-    this.library,
-    this.classNameNode,
+    required this.typeSystem,
+    required this.typeProvider,
+    required this.inheritance,
+    required this.reporter,
+    required this.featureSet,
+    required this.library,
+    required this.classNameNode,
     this.implementsClause,
     this.members = const [],
     this.onClause,
     this.superclass,
     this.withClause,
   })  : libraryUri = library.source.uri,
-        classElement = classNameNode.staticElement;
+        classElement = classNameNode.staticElement as ClassElementImpl;
 
   bool get _isNonNullableByDefault => typeSystem.isNonNullableByDefault;
 
@@ -142,7 +140,7 @@
     }
 
     if (classElement.supertype != null) {
-      directSuperInterfaces.add(classElement.supertype);
+      directSuperInterfaces.add(classElement.supertype!);
     }
     directSuperInterfaces.addAll(classElement.superclassConstraints);
 
@@ -157,7 +155,7 @@
     var mixinTypes = classElement.mixins;
     for (var i = 0; i < mixinTypes.length; i++) {
       var mixinType = mixinTypes[i];
-      _checkDeclaredMembers(mixinNodes[i], mixinType, mixinIndex: i);
+      _checkDeclaredMembers(mixinNodes![i], mixinType, mixinIndex: i);
       directSuperInterfaces.add(mixinType);
     }
 
@@ -169,7 +167,7 @@
       if (member is FieldDeclaration) {
         var fieldList = member.fields;
         for (var field in fieldList.variables) {
-          FieldElement fieldElement = field.declaredElement;
+          var fieldElement = field.declaredElement as FieldElement;
           _checkDeclaredMember(field.name, libraryUri, fieldElement.getter);
           _checkDeclaredMember(field.name, libraryUri, fieldElement.setter);
         }
@@ -190,14 +188,14 @@
     ).checkInterface(classElement, interface);
 
     if (!classElement.isAbstract) {
-      List<ExecutableElement> inheritedAbstract;
+      List<ExecutableElement>? inheritedAbstract;
 
       for (var name in interface.map.keys) {
         if (!name.isAccessibleFor(libraryUri)) {
           continue;
         }
 
-        var interfaceElement = interface.map[name];
+        var interfaceElement = interface.map[name]!;
         var concreteElement = interface.implemented[name];
 
         // No concrete implementation of the name.
@@ -251,8 +249,8 @@
   void _checkDeclaredMember(
     AstNode node,
     Uri libraryUri,
-    ExecutableElement member, {
-    List<FormalParameter> methodParameterNodes,
+    ExecutableElement? member, {
+    List<FormalParameter>? methodParameterNodes,
     int mixinIndex = -1,
   }) {
     if (member == null) return;
@@ -308,8 +306,8 @@
 
   /// Check that instance members of [type] are valid overrides of the
   /// corresponding instance members in each of [directSuperInterfaces].
-  void _checkDeclaredMembers(AstNode node, InterfaceTypeImpl type,
-      {@required int mixinIndex}) {
+  void _checkDeclaredMembers(AstNode node, InterfaceType type,
+      {required int mixinIndex}) {
     var libraryUri = type.element.library.source.uri;
     for (var method in type.methods) {
       _checkDeclaredMember(node, libraryUri, method, mixinIndex: mixinIndex);
@@ -332,7 +330,7 @@
       return false;
     }
 
-    DartType type = typeName.type;
+    DartType type = typeName.type!;
     if (type is InterfaceType &&
         typeProvider.nonSubtypableClasses.contains(type.element)) {
       reporter.reportErrorForNode(errorCode, typeName, [type]);
@@ -348,7 +346,7 @@
   bool _checkDirectSuperTypes() {
     var hasError = false;
     if (implementsClause != null) {
-      for (var typeName in implementsClause.interfaces) {
+      for (var typeName in implementsClause!.interfaces) {
         if (_checkDirectSuperType(
           typeName,
           CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS,
@@ -358,7 +356,7 @@
       }
     }
     if (onClause != null) {
-      for (var typeName in onClause.superclassConstraints) {
+      for (var typeName in onClause!.superclassConstraints) {
         if (_checkDirectSuperType(
           typeName,
           CompileTimeErrorCode.MIXIN_SUPER_CLASS_CONSTRAINT_DISALLOWED_CLASS,
@@ -369,14 +367,14 @@
     }
     if (superclass != null) {
       if (_checkDirectSuperType(
-        superclass,
+        superclass!,
         CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
       )) {
         hasError = true;
       }
     }
     if (withClause != null) {
-      for (var typeName in withClause.mixinTypes) {
+      for (var typeName in withClause!.mixinTypes) {
         if (_checkDirectSuperType(
           typeName,
           CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS,
@@ -398,7 +396,8 @@
     var derivedOptionalElements = <ParameterElementImpl>[];
     var derivedParameterElements = derivedExecutable.parameters;
     for (var i = 0; i < derivedParameterElements.length; i++) {
-      var parameterElement = derivedParameterElements[i];
+      var parameterElement =
+          derivedParameterElements[i] as ParameterElementImpl;
       if (parameterElement.isOptional) {
         derivedOptionalNodes.add(derivedParameterNodes[i]);
         derivedOptionalElements.add(parameterElement);
@@ -410,7 +409,8 @@
     for (var i = 0; i < baseParameterElements.length; ++i) {
       var baseParameter = baseParameterElements[i];
       if (baseParameter.isOptional) {
-        baseOptionalElements.add(baseParameter.declaration);
+        baseOptionalElements
+            .add(baseParameter.declaration as ParameterElementImpl);
       }
     }
 
@@ -432,7 +432,7 @@
           var baseParameter = baseOptionalElements[j];
           if (name == baseParameter.name && baseParameter.hasDefaultValue) {
             var baseValue = baseParameter.computeConstantValue();
-            var derivedResult = derivedElement.evaluationResult;
+            var derivedResult = derivedElement.evaluationResult!;
             if (!_constantValuesEqual(derivedResult.value, baseValue)) {
               reporter.reportErrorForNode(
                 StaticWarningCode
@@ -461,7 +461,7 @@
         var baseElement = baseOptionalElements[i];
         if (baseElement.hasDefaultValue) {
           var baseValue = baseElement.computeConstantValue();
-          var derivedResult = derivedElement.evaluationResult;
+          var derivedResult = derivedElement.evaluationResult!;
           if (!_constantValuesEqual(derivedResult.value, baseValue)) {
             reporter.reportErrorForNode(
               StaticWarningCode
@@ -487,7 +487,7 @@
   /// [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_ON],
   /// [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_WITH].
   bool _checkForRecursiveInterfaceInheritance(ClassElement element,
-      [List<ClassElement> path]) {
+      [List<ClassElement>? path]) {
     path ??= <ClassElement>[];
 
     // Detect error condition.
@@ -528,7 +528,7 @@
     path.add(element);
 
     // n-case
-    InterfaceType supertype = element.supertype;
+    var supertype = element.supertype;
     if (supertype != null &&
         _checkForRecursiveInterfaceInheritance(supertype.element, path)) {
       return true;
@@ -648,7 +648,7 @@
     }
   }
 
-  void _reportInheritedAbstractMembers(List<ExecutableElement> elements) {
+  void _reportInheritedAbstractMembers(List<ExecutableElement>? elements) {
     if (elements == null) {
       return;
     }
@@ -669,15 +669,10 @@
         }
       }
 
-      String description;
       var elementName = element.displayName;
       var enclosingElement = element.enclosingElement;
-      if (enclosingElement != null) {
-        var enclosingName = enclosingElement.displayName;
-        description = "$prefix$enclosingName.$elementName";
-      } else {
-        description = "$prefix$elementName";
-      }
+      var enclosingName = enclosingElement.displayName;
+      var description = "$prefix$enclosingName.$elementName";
 
       descriptions.add(description);
     }
@@ -734,7 +729,7 @@
           node.name,
           [
             classElement.name,
-            inferenceError.arguments[0],
+            inferenceError!.arguments[0],
           ],
         );
         return true;
@@ -743,7 +738,7 @@
     return false;
   }
 
-  static bool _constantValuesEqual(DartObject x, DartObject y) {
+  static bool _constantValuesEqual(DartObject? x, DartObject? y) {
     // If either constant value couldn't be computed due to an error, the
     // corresponding DartObject will be `null`.  Since an error has already been
     // reported, there's no need to report another.
diff --git a/pkg/analyzer/lib/src/error/language_version_override_verifier.dart b/pkg/analyzer/lib/src/error/language_version_override_verifier.dart
index d5732f9..5853f8e 100644
--- a/pkg/analyzer/lib/src/error/language_version_override_verifier.dart
+++ b/pkg/analyzer/lib/src/error/language_version_override_verifier.dart
@@ -20,9 +20,9 @@
 
     Token beginToken = unit.beginToken;
     if (beginToken.type == TokenType.SCRIPT_TAG) {
-      beginToken = beginToken.next;
+      beginToken = beginToken.next!;
     }
-    Token commentToken = beginToken.precedingComments;
+    Token? commentToken = beginToken.precedingComments;
     while (commentToken != null) {
       if (_findLanguageVersionOverrideComment(commentToken)) {
         // A valid language version override was found. Do not search for any
@@ -278,7 +278,7 @@
     var token = firstMeaningfulToken.next;
     while (token != null) {
       if (token.offset > firstMeaningfulToken.offset) {
-        var commentToken = token.precedingComments;
+        Token? commentToken = token.precedingComments;
         for (; commentToken != null; commentToken = commentToken.next) {
           var lexeme = commentToken.lexeme;
 
diff --git a/pkg/analyzer/lib/src/error/literal_element_verifier.dart b/pkg/analyzer/lib/src/error/literal_element_verifier.dart
index 995b3e6..36b4318 100644
--- a/pkg/analyzer/lib/src/error/literal_element_verifier.dart
+++ b/pkg/analyzer/lib/src/error/literal_element_verifier.dart
@@ -21,11 +21,11 @@
 
   final bool forList;
   final bool forSet;
-  final DartType elementType;
+  final DartType? elementType;
 
   final bool forMap;
-  final DartType mapKeyType;
-  final DartType mapValueType;
+  final DartType? mapKeyType;
+  final DartType? mapValueType;
 
   LiteralElementVerifier(
     this.typeProvider,
@@ -38,7 +38,7 @@
     this.forMap = false,
     this.mapKeyType,
     this.mapValueType,
-    this.featureSet,
+    required this.featureSet,
   });
 
   void verify(CollectionElement element) {
@@ -48,7 +48,7 @@
   /// Check that the given [type] is assignable to the [elementType], otherwise
   /// report the list or set error on the [errorNode].
   void _checkAssignableToElementType(DartType type, AstNode errorNode) {
-    if (!typeSystem.isAssignableTo2(type, elementType)) {
+    if (!typeSystem.isAssignableTo2(type, elementType!)) {
       var errorCode = forList
           ? CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
           : CompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE;
@@ -62,13 +62,13 @@
 
   /// Verify that the given [element] can be assigned to the [elementType] of
   /// the enclosing list, set, of map literal.
-  void _verifyElement(CollectionElement element) {
+  void _verifyElement(CollectionElement? element) {
     if (element is Expression) {
       if (forList || forSet) {
-        if (!elementType.isVoid && checkForUseOfVoidResult(element)) {
+        if (!elementType!.isVoid && checkForUseOfVoidResult(element)) {
           return;
         }
-        _checkAssignableToElementType(element.staticType, element);
+        _checkAssignableToElementType(element.staticType!, element);
       } else {
         errorReporter.reportErrorForNode(
             CompileTimeErrorCode.EXPRESSION_IN_MAP, element);
@@ -99,16 +99,16 @@
   /// Verify that the [entry]'s key and value are assignable to [mapKeyType]
   /// and [mapValueType].
   void _verifyMapLiteralEntry(MapLiteralEntry entry) {
-    if (!mapKeyType.isVoid && checkForUseOfVoidResult(entry.key)) {
+    if (!mapKeyType!.isVoid && checkForUseOfVoidResult(entry.key)) {
       return;
     }
 
-    if (!mapValueType.isVoid && checkForUseOfVoidResult(entry.value)) {
+    if (!mapValueType!.isVoid && checkForUseOfVoidResult(entry.value)) {
       return;
     }
 
-    var keyType = entry.key.staticType;
-    if (!typeSystem.isAssignableTo2(keyType, mapKeyType)) {
+    var keyType = entry.key.staticType!;
+    if (!typeSystem.isAssignableTo2(keyType, mapKeyType!)) {
       errorReporter.reportErrorForNode(
         CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE,
         entry.key,
@@ -116,8 +116,8 @@
       );
     }
 
-    var valueType = entry.value.staticType;
-    if (!typeSystem.isAssignableTo2(valueType, mapValueType)) {
+    var valueType = entry.value.staticType!;
+    if (!typeSystem.isAssignableTo2(valueType, mapValueType!)) {
       errorReporter.reportErrorForNode(
         CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE,
         entry.value,
@@ -129,7 +129,7 @@
   /// Verify that the type of the elements of the given [expression] can be
   /// assigned to the [elementType] of the enclosing collection.
   void _verifySpreadForListOrSet(bool isNullAware, Expression expression) {
-    var expressionType = expression.staticType;
+    var expressionType = expression.staticType!;
     if (expressionType.isDynamic) return;
 
     if (typeSystem.isNonNullableByDefault) {
@@ -171,7 +171,7 @@
     }
 
     var iterableElementType = iterableType.typeArguments[0];
-    if (!typeSystem.isAssignableTo2(iterableElementType, elementType)) {
+    if (!typeSystem.isAssignableTo2(iterableElementType, elementType!)) {
       var errorCode = forList
           ? CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
           : CompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE;
@@ -186,7 +186,7 @@
   /// Verify that the [expression] is a subtype of `Map<Object, Object>`, and
   /// its key and values are assignable to [mapKeyType] and [mapValueType].
   void _verifySpreadForMap(bool isNullAware, Expression expression) {
-    var expressionType = expression.staticType;
+    var expressionType = expression.staticType!;
     if (expressionType.isDynamic) return;
 
     if (typeSystem.isNonNullableByDefault) {
@@ -228,7 +228,7 @@
     }
 
     var keyType = mapType.typeArguments[0];
-    if (!typeSystem.isAssignableTo2(keyType, mapKeyType)) {
+    if (!typeSystem.isAssignableTo2(keyType, mapKeyType!)) {
       errorReporter.reportErrorForNode(
         CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE,
         expression,
@@ -237,7 +237,7 @@
     }
 
     var valueType = mapType.typeArguments[1];
-    if (!typeSystem.isAssignableTo2(valueType, mapValueType)) {
+    if (!typeSystem.isAssignableTo2(valueType, mapValueType!)) {
       errorReporter.reportErrorForNode(
         CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE,
         expression,
diff --git a/pkg/analyzer/lib/src/error/must_call_super_verifier.dart b/pkg/analyzer/lib/src/error/must_call_super_verifier.dart
index f3a5942..ad1ca30 100644
--- a/pkg/analyzer/lib/src/error/must_call_super_verifier.dart
+++ b/pkg/analyzer/lib/src/error/must_call_super_verifier.dart
@@ -19,9 +19,10 @@
     if (node.isStatic || node.isAbstract) {
       return;
     }
-    ExecutableElement overridden =
-        _findOverriddenMemberWithMustCallSuper(node.declaredElement);
-    if (overridden != null && _hasConcreteSuperMethod(node.declaredElement)) {
+    var element = node.declaredElement!;
+    var overridden = _findOverriddenMemberWithMustCallSuper(element);
+    if (overridden != null &&
+        _hasConcreteSuperMethod(element as MethodElement)) {
       _SuperCallVerifier verifier = _SuperCallVerifier(overridden.name);
       node.accept(verifier);
       if (!verifier.superIsCalled) {
@@ -39,28 +40,28 @@
   /// `@mustCallSuper`.
   ///
   /// [1]: https://pub.dev/documentation/meta/latest/meta/mustCallSuper-constant.html
-  ExecutableElement _findOverriddenMemberWithMustCallSuper(
+  ExecutableElement? _findOverriddenMemberWithMustCallSuper(
       ExecutableElement element) {
     //Element member = node.declaredElement;
     if (element.enclosingElement is! ClassElement) {
       return null;
     }
-    ClassElement classElement = element.enclosingElement;
+    var classElement = element.enclosingElement as ClassElement;
     String name = element.name;
 
     // Walk up the type hierarchy from [classElement], ignoring direct
     // interfaces.
-    Queue<ClassElement> superclasses =
+    Queue<ClassElement?> superclasses =
         Queue.of(classElement.mixins.map((i) => i.element))
           ..addAll(classElement.superclassConstraints.map((i) => i.element))
           ..add(classElement.supertype?.element);
     var visitedClasses = <ClassElement>{};
     while (superclasses.isNotEmpty) {
-      ClassElement ancestor = superclasses.removeFirst();
+      var ancestor = superclasses.removeFirst();
       if (ancestor == null || !visitedClasses.add(ancestor)) {
         continue;
       }
-      ExecutableElement member = ancestor.getMethod(name) ??
+      var member = ancestor.getMethod(name) ??
           ancestor.getGetter(name) ??
           ancestor.getSetter(name);
       if (member is MethodElement && member.hasMustCallSuper) {
@@ -76,7 +77,7 @@
 
   /// Returns whether [node] overrides a concrete method.
   bool _hasConcreteSuperMethod(MethodElement element) {
-    ClassElement classElement = element.enclosingElement;
+    var classElement = element.enclosingElement as ClassElement;
     String name = element.name;
 
     bool isConcrete(ClassElement element) =>
@@ -91,7 +92,7 @@
       return true;
     }
     if (classElement.supertype != null &&
-        isConcrete(classElement.supertype.element)) {
+        isConcrete(classElement.supertype!.element)) {
       return true;
     }
 
diff --git a/pkg/analyzer/lib/src/error/nullable_dereference_verifier.dart b/pkg/analyzer/lib/src/error/nullable_dereference_verifier.dart
index 1ed2687..e1dd812 100644
--- a/pkg/analyzer/lib/src/error/nullable_dereference_verifier.dart
+++ b/pkg/analyzer/lib/src/error/nullable_dereference_verifier.dart
@@ -9,7 +9,6 @@
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:meta/meta.dart';
 
 /// Helper for checking potentially nullable dereferences.
 class NullableDereferenceVerifier {
@@ -17,22 +16,23 @@
   final ErrorReporter _errorReporter;
 
   NullableDereferenceVerifier({
-    @required TypeSystemImpl typeSystem,
-    @required ErrorReporter errorReporter,
-  })  : _typeSystem = typeSystem,
+    required TypeSystemImpl typeSystem,
+    required ErrorReporter errorReporter,
+  })   : _typeSystem = typeSystem,
         _errorReporter = errorReporter;
 
-  bool expression(Expression expression, {DartType type, ErrorCode errorCode}) {
+  bool expression(Expression expression,
+      {DartType? type, ErrorCode? errorCode}) {
     if (!_typeSystem.isNonNullableByDefault) {
       return false;
     }
 
-    type ??= expression.staticType;
+    type ??= expression.staticType!;
     return _check(expression, type, errorCode: errorCode);
   }
 
   void report(AstNode errorNode, DartType receiverType,
-      {ErrorCode errorCode, List<String> arguments = const <String>[]}) {
+      {ErrorCode? errorCode, List<String> arguments = const <String>[]}) {
     if (receiverType == _typeSystem.typeProvider.nullType) {
       errorCode = CompileTimeErrorCode.INVALID_USE_OF_NULL_VALUE;
     } else {
@@ -47,7 +47,8 @@
   /// receiver is the implicit `this`, the name of the invocation.
   ///
   /// Returns whether [receiverType] was reported.
-  bool _check(AstNode errorNode, DartType receiverType, {ErrorCode errorCode}) {
+  bool _check(AstNode errorNode, DartType receiverType,
+      {ErrorCode? errorCode}) {
     if (identical(receiverType, DynamicTypeImpl.instance) ||
         !_typeSystem.isPotentiallyNullable(receiverType)) {
       return false;
diff --git a/pkg/analyzer/lib/src/error/override_verifier.dart b/pkg/analyzer/lib/src/error/override_verifier.dart
index cf18a55..71a6d88 100644
--- a/pkg/analyzer/lib/src/error/override_verifier.dart
+++ b/pkg/analyzer/lib/src/error/override_verifier.dart
@@ -23,7 +23,7 @@
   final ErrorReporter _errorReporter;
 
   /// The current class or mixin.
-  ClassElement _currentClass;
+  ClassElement? _currentClass;
 
   OverrideVerifier(
       this._inheritance, LibraryElement library, this._errorReporter)
@@ -39,12 +39,12 @@
   @override
   void visitFieldDeclaration(FieldDeclaration node) {
     for (VariableDeclaration field in node.fields.variables) {
-      FieldElement fieldElement = field.declaredElement;
+      var fieldElement = field.declaredElement as FieldElement;
       if (fieldElement.hasOverride) {
-        PropertyAccessorElement getter = fieldElement.getter;
+        var getter = fieldElement.getter;
         if (getter != null && _isOverride(getter)) continue;
 
-        PropertyAccessorElement setter = fieldElement.setter;
+        var setter = fieldElement.setter;
         if (setter != null && _isOverride(setter)) continue;
 
         _errorReporter.reportErrorForNode(
@@ -57,7 +57,7 @@
 
   @override
   void visitMethodDeclaration(MethodDeclaration node) {
-    ExecutableElement element = node.declaredElement;
+    var element = node.declaredElement!;
     if (element.hasOverride && !_isOverride(element)) {
       if (element is MethodElement) {
         _errorReporter.reportErrorForNode(
@@ -90,6 +90,6 @@
   /// Return `true` if the [member] overrides a member from a superinterface.
   bool _isOverride(ExecutableElement member) {
     var name = Name(_libraryUri, member.name);
-    return _inheritance.getOverridden2(_currentClass, name) != null;
+    return _inheritance.getOverridden2(_currentClass!, name) != null;
   }
 }
diff --git a/pkg/analyzer/lib/src/error/required_parameters_verifier.dart b/pkg/analyzer/lib/src/error/required_parameters_verifier.dart
index b5f2080..19ca635 100644
--- a/pkg/analyzer/lib/src/error/required_parameters_verifier.dart
+++ b/pkg/analyzer/lib/src/error/required_parameters_verifier.dart
@@ -4,12 +4,12 @@
 
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/dart/constant/value.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/error/codes.dart';
+import 'package:collection/collection.dart';
 
 /// Checks for missing arguments for required named parameters.
 class RequiredParametersVerifier extends SimpleAstVisitor<void> {
@@ -75,7 +75,7 @@
   }
 
   void _check(
-    List<ParameterElement> parameters,
+    List<ParameterElement>? parameters,
     ArgumentList argumentList,
     AstNode node,
   ) {
@@ -99,7 +99,7 @@
         if (annotation != null) {
           String parameterName = parameter.name;
           if (!_containsNamedExpression(argumentList, parameterName)) {
-            String reason = annotation.reason;
+            var reason = annotation.reason;
             if (reason != null) {
               _errorReporter.reportErrorForNode(
                 HintCode.MISSING_REQUIRED_PARAM_WITH_DETAILS,
@@ -132,7 +132,7 @@
     return false;
   }
 
-  static ExecutableElement _executableElement(Element element) {
+  static ExecutableElement? _executableElement(Element? element) {
     if (element is ExecutableElement) {
       return element;
     } else {
@@ -140,11 +140,9 @@
     }
   }
 
-  static _RequiredAnnotation _requiredAnnotation(ParameterElement element) {
-    var annotation = element.metadata.firstWhere(
-      (e) => e.isRequired,
-      orElse: () => null,
-    );
+  static _RequiredAnnotation? _requiredAnnotation(ParameterElement element) {
+    var annotation = element.metadata.firstWhereOrNull((e) => e.isRequired)
+        as ElementAnnotationImpl?;
     if (annotation != null) {
       return _RequiredAnnotation(annotation);
     }
@@ -160,17 +158,17 @@
 class _RequiredAnnotation {
   /// The instance of `@required` annotation.
   /// If `null`, then the parameter is `required` in null safety.
-  final ElementAnnotationImpl annotation;
+  final ElementAnnotationImpl? annotation;
 
   _RequiredAnnotation(this.annotation);
 
-  String get reason {
+  String? get reason {
     if (annotation == null) {
       return null;
     }
 
-    DartObject constantValue = annotation.computeConstantValue();
-    String value = constantValue?.getField('reason')?.toStringValue();
+    var constantValue = annotation!.computeConstantValue();
+    var value = constantValue?.getField('reason')?.toStringValue();
     return (value == null || value.isEmpty) ? null : value;
   }
 }
diff --git a/pkg/analyzer/lib/src/error/return_type_verifier.dart b/pkg/analyzer/lib/src/error/return_type_verifier.dart
index ce9f2eb..c59865c 100644
--- a/pkg/analyzer/lib/src/error/return_type_verifier.dart
+++ b/pkg/analyzer/lib/src/error/return_type_verifier.dart
@@ -13,20 +13,19 @@
 import 'package:analyzer/src/error/analyzer_error_code.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/error_verifier.dart';
-import 'package:meta/meta.dart';
 
 class ReturnTypeVerifier {
   final TypeProviderImpl _typeProvider;
   final TypeSystemImpl _typeSystem;
   final ErrorReporter _errorReporter;
 
-  EnclosingExecutableContext enclosingExecutable;
+  late EnclosingExecutableContext enclosingExecutable;
 
   ReturnTypeVerifier({
-    @required TypeProviderImpl typeProvider,
-    @required TypeSystemImpl typeSystem,
-    @required ErrorReporter errorReporter,
-  })  : _typeProvider = typeProvider,
+    required TypeProviderImpl typeProvider,
+    required TypeSystemImpl typeSystem,
+    required ErrorReporter errorReporter,
+  })   : _typeProvider = typeProvider,
         _typeSystem = typeSystem,
         _errorReporter = errorReporter;
 
@@ -80,7 +79,7 @@
     _checkReturnExpression(expression);
   }
 
-  void verifyReturnType(TypeAnnotation returnType) {
+  void verifyReturnType(TypeAnnotation? returnType) {
     // If no declared type, then the type is `dynamic`, which is valid.
     if (returnType == null) {
       return;
@@ -152,7 +151,7 @@
     // `T` is the declared return type.
     // `S` is the static type of the expression.
     var T = enclosingExecutable.returnType;
-    var S = expression.staticType;
+    var S = expression.staticType!;
 
     void reportTypeError() {
       if (enclosingExecutable.catchErrorOnErrorReturnType != null) {
@@ -259,7 +258,7 @@
     // `T` is the declared return type.
     // `S` is the static type of the expression.
     var T = enclosingExecutable.returnType;
-    var S = expression.staticType;
+    var S = expression.staticType!;
 
     void reportTypeError() {
       if (enclosingExecutable.catchErrorOnErrorReturnType != null) {
diff --git a/pkg/analyzer/lib/src/error/todo_finder.dart b/pkg/analyzer/lib/src/error/todo_finder.dart
index 140a09e..f3e536c 100644
--- a/pkg/analyzer/lib/src/error/todo_finder.dart
+++ b/pkg/analyzer/lib/src/error/todo_finder.dart
@@ -34,16 +34,16 @@
   ///
   /// @param unit the compilation unit containing the to-do comments
   void findIn(CompilationUnit unit) {
-    _gatherTodoComments(unit.beginToken, unit.lineInfo);
+    _gatherTodoComments(unit.beginToken, unit.lineInfo!);
   }
 
   /// Search the comment tokens reachable from the given token and create errors
   /// for each to-do comment.
   ///
   /// @param token the head of the list of tokens being searched
-  void _gatherTodoComments(Token token, LineInfo lineInfo) {
+  void _gatherTodoComments(Token? token, LineInfo lineInfo) {
     while (token != null && token.type != TokenType.EOF) {
-      Token commentToken = token.precedingComments;
+      Token? commentToken = token.precedingComments;
       while (commentToken != null) {
         if (commentToken.type == TokenType.SINGLE_LINE_COMMENT ||
             commentToken.type == TokenType.MULTI_LINE_COMMENT) {
@@ -64,7 +64,7 @@
   ///
   /// Returns the next comment token to begin searching from (skipping over
   /// any continuations).
-  Token _scrapeTodoComment(Token commentToken, LineInfo lineInfo) {
+  Token? _scrapeTodoComment(Token commentToken, LineInfo lineInfo) {
     Iterable<Match> matches =
         TodoCode.TODO_REGEX.allMatches(commentToken.lexeme);
     // Track the comment that will be returned for looking for the next todo.
@@ -74,10 +74,10 @@
     final commentLocation = lineInfo.getLocation(commentToken.offset);
 
     for (Match match in matches) {
-      int offset = commentToken.offset + match.start + match.group(1).length;
+      int offset = commentToken.offset + match.start + match.group(1)!.length;
       int column =
-          commentLocation.columnNumber + match.start + match.group(1).length;
-      String todoText = match.group(2);
+          commentLocation.columnNumber + match.start + match.group(1)!.length;
+      String todoText = match.group(2)!;
       int end = offset + todoText.length;
 
       if (commentToken.type == TokenType.MULTI_LINE_COMMENT) {
diff --git a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
index cdcbe34..7af6125 100644
--- a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
+++ b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
@@ -27,7 +27,8 @@
     this._errorReporter,
   );
 
-  TypeSystemImpl get _typeSystem => _libraryElement.typeSystem;
+  TypeSystemImpl get _typeSystem =>
+      _libraryElement.typeSystem as TypeSystemImpl;
 
   void checkFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     _checkTypeArguments(node);
@@ -35,7 +36,7 @@
   }
 
   void checkListLiteral(ListLiteral node) {
-    TypeArgumentList typeArguments = node.typeArguments;
+    var typeArguments = node.typeArguments;
     if (typeArguments != null) {
       if (node.isConst) {
         _checkTypeArgumentConst(
@@ -50,7 +51,7 @@
   }
 
   void checkMapLiteral(SetOrMapLiteral node) {
-    TypeArgumentList typeArguments = node.typeArguments;
+    var typeArguments = node.typeArguments;
     if (typeArguments != null) {
       if (node.isConst) {
         _checkTypeArgumentConst(
@@ -70,7 +71,7 @@
   }
 
   void checkSetLiteral(SetOrMapLiteral node) {
-    TypeArgumentList typeArguments = node.typeArguments;
+    var typeArguments = node.typeArguments;
     if (typeArguments != null) {
       if (node.isConst) {
         _checkTypeArgumentConst(
@@ -86,29 +87,28 @@
 
   void checkTypeName(TypeName node) {
     _checkForTypeArgumentNotMatchingBounds(node);
-    if (node.parent is! ConstructorName ||
-        node.parent.parent is! InstanceCreationExpression) {
+    var parent = node.parent;
+    if (parent is! ConstructorName ||
+        parent.parent is! InstanceCreationExpression) {
       _checkForRawTypeName(node);
     }
   }
 
   void _checkForImplicitDynamicInvoke(InvocationExpression node) {
-    if (_options.implicitDynamic ||
-        node == null ||
-        node.typeArguments != null) {
+    if (_options.implicitDynamic || node.typeArguments != null) {
       return;
     }
-    DartType invokeType = node.staticInvokeType;
-    DartType declaredType = node.function.staticType;
+    var invokeType = node.staticInvokeType;
+    var declaredType = node.function.staticType;
     if (invokeType is FunctionType &&
         declaredType is FunctionType &&
         declaredType.typeFormals.isNotEmpty) {
-      List<DartType> typeArgs = node.typeArgumentTypes;
+      List<DartType> typeArgs = node.typeArgumentTypes!;
       if (typeArgs.any((t) => t.isDynamic)) {
         // Issue an error depending on what we're trying to call.
         Expression function = node.function;
         if (function is Identifier) {
-          Element element = function.staticElement;
+          var element = function.staticElement;
           if (element is MethodElement) {
             _errorReporter.reportErrorForNode(
                 LanguageCode.IMPLICIT_DYNAMIC_METHOD,
@@ -138,7 +138,7 @@
     if (_options.implicitDynamic || node.typeArguments != null) {
       return;
     }
-    DartType type = node.staticType;
+    DartType type = node.staticType!;
     // It's an error if either the key or value was inferred as dynamic.
     if (type is InterfaceType && type.typeArguments.any((t) => t.isDynamic)) {
       // TODO(brianwilkerson) Add StrongModeCode.IMPLICIT_DYNAMIC_SET_LITERAL
@@ -157,23 +157,23 @@
   /// [HintCode.STRICT_RAW_TYPE].
   void _checkForRawTypeName(TypeName node) {
     AstNode parentEscapingTypeArguments(TypeName node) {
-      AstNode parent = node.parent;
+      var parent = node.parent!;
       while (parent is TypeArgumentList || parent is TypeName) {
         if (parent.parent == null) {
           return parent;
         }
-        parent = parent.parent;
+        parent = parent.parent!;
       }
       return parent;
     }
 
-    if (!_options.strictRawTypes || node == null) return;
+    if (!_options.strictRawTypes) return;
     if (node.typeArguments != null) {
       // Type has explicit type arguments.
       return;
     }
     if (_isMissingTypeArguments(
-        node, node.type, node.name.staticElement, null)) {
+        node, node.type!, node.name.staticElement, null)) {
       AstNode unwrappedParent = parentEscapingTypeArguments(node);
       if (unwrappedParent is AsExpression || unwrappedParent is IsExpression) {
         // Do not report a "Strict raw type" error in this case; too noisy.
@@ -188,14 +188,14 @@
   /// Verify that the type arguments in the given [typeName] are all within
   /// their bounds.
   void _checkForTypeArgumentNotMatchingBounds(TypeName typeName) {
-    var type = typeName.type;
+    var type = typeName.type!;
 
     List<TypeParameterElement> typeParameters;
     List<DartType> typeArguments;
     var aliasElement = type.aliasElement;
     if (aliasElement != null) {
       typeParameters = aliasElement.typeParameters;
-      typeArguments = type.aliasArguments;
+      typeArguments = type.aliasArguments!;
     } else if (type is InterfaceType) {
       typeParameters = type.element.typeParameters;
       typeArguments = type.typeArguments;
@@ -208,7 +208,7 @@
     }
 
     // Check for regular-bounded.
-    List<_TypeArgumentIssue> issues;
+    List<_TypeArgumentIssue>? issues;
     var substitution = Substitution.fromPairs(typeParameters, typeArguments);
     for (var i = 0; i < typeArguments.length; i++) {
       var typeParameter = typeParameters[i];
@@ -258,7 +258,7 @@
     // Prepare type arguments for checking for super-bounded.
     type = _typeSystem.replaceTopAndBottom(type);
     if (type.aliasElement != null) {
-      typeArguments = type.aliasArguments;
+      typeArguments = type.aliasArguments!;
     } else if (type is InterfaceType) {
       typeArguments = type.typeArguments;
     } else {
@@ -323,7 +323,7 @@
   /// Verify that the given [typeArguments] are all within their bounds, as
   /// defined by the given [element].
   void _checkTypeArguments(InvocationExpression node) {
-    NodeList<TypeAnnotation> typeArgumentList = node.typeArguments?.arguments;
+    var typeArgumentList = node.typeArguments?.arguments;
     if (typeArgumentList == null) {
       return;
     }
@@ -332,7 +332,7 @@
     var instantiatedType = node.staticInvokeType;
     if (genericType is FunctionType && instantiatedType is FunctionType) {
       var fnTypeParams = genericType.typeFormals;
-      var typeArgs = typeArgumentList.map((t) => t.type).toList();
+      var typeArgs = typeArgumentList.map((t) => t.type!).toList();
 
       // If the amount mismatches, clean up the lists to be substitutable. The
       // mismatch in size is reported elsewhere, but we must successfully
@@ -393,12 +393,12 @@
   ///   contain `_`
   /// - [type] does not have any `dynamic` type arguments.
   /// - the element is marked with `@optionalTypeArgs` from "package:meta".
-  bool _isMissingTypeArguments(AstNode node, DartType type, Element element,
-      Expression inferenceContextNode) {
+  bool _isMissingTypeArguments(AstNode node, DartType type, Element? element,
+      Expression? inferenceContextNode) {
     List<DartType> typeArguments;
     var aliasElement = type.aliasElement;
     if (aliasElement != null) {
-      typeArguments = type.aliasArguments;
+      typeArguments = type.aliasArguments!;
     } else if (type is InterfaceType) {
       typeArguments = type.typeArguments;
     } else {
@@ -418,7 +418,7 @@
           return false;
         }
       }
-      if (element.hasOptionalTypeArgs) {
+      if (element != null && element.hasOptionalTypeArgs) {
         return false;
       }
       return true;
diff --git a/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart b/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
index 57c322d..c8b4452 100644
--- a/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
+++ b/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
@@ -14,14 +14,15 @@
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/dart/element/member.dart' show ExecutableMember;
 import 'package:analyzer/src/error/codes.dart';
+import 'package:collection/collection.dart';
 
 /// An [AstVisitor] that fills [UsedLocalElements].
 class GatherUsedLocalElementsVisitor extends RecursiveAstVisitor<void> {
   final UsedLocalElements usedElements = UsedLocalElements();
 
   final LibraryElement _enclosingLibrary;
-  ClassElement _enclosingClass;
-  ExecutableElement _enclosingExec;
+  ClassElement? _enclosingClass;
+  ExecutableElement? _enclosingExec;
 
   GatherUsedLocalElementsVisitor(this._enclosingLibrary);
 
@@ -37,23 +38,23 @@
   @override
   void visitBinaryExpression(BinaryExpression node) {
     var element = node.staticElement;
-    usedElements.members.add(element);
+    usedElements.addMember(element);
     super.visitBinaryExpression(node);
   }
 
   @override
   void visitCatchClause(CatchClause node) {
-    SimpleIdentifier exceptionParameter = node.exceptionParameter;
-    SimpleIdentifier stackTraceParameter = node.stackTraceParameter;
+    var exceptionParameter = node.exceptionParameter;
+    var stackTraceParameter = node.stackTraceParameter;
     if (exceptionParameter != null) {
-      Element element = exceptionParameter.staticElement;
+      var element = exceptionParameter.staticElement;
       usedElements.addCatchException(element);
       if (stackTraceParameter != null || node.onKeyword == null) {
         usedElements.addElement(element);
       }
     }
     if (stackTraceParameter != null) {
-      Element element = stackTraceParameter.staticElement;
+      var element = stackTraceParameter.staticElement;
       usedElements.addCatchStackTrace(element);
     }
     super.visitCatchClause(node);
@@ -61,7 +62,7 @@
 
   @override
   void visitClassDeclaration(ClassDeclaration node) {
-    ClassElement enclosingClassOld = _enclosingClass;
+    var enclosingClassOld = _enclosingClass;
     try {
       _enclosingClass = node.declaredElement;
       super.visitClassDeclaration(node);
@@ -72,7 +73,7 @@
 
   @override
   void visitFunctionDeclaration(FunctionDeclaration node) {
-    ExecutableElement enclosingExecOld = _enclosingExec;
+    var enclosingExecOld = _enclosingExec;
     try {
       _enclosingExec = node.declaredElement;
       super.visitFunctionDeclaration(node);
@@ -84,7 +85,7 @@
   @override
   void visitFunctionExpression(FunctionExpression node) {
     if (node.parent is! FunctionDeclaration) {
-      usedElements.addElement(node.declaredElement);
+      usedElements.addElement(node.declaredElement!);
     }
     super.visitFunctionExpression(node);
   }
@@ -92,7 +93,7 @@
   @override
   void visitIndexExpression(IndexExpression node) {
     var element = node.writeOrReadElement;
-    usedElements.members.add(element);
+    usedElements.addMember(element);
     super.visitIndexExpression(node);
   }
 
@@ -100,14 +101,14 @@
   void visitInstanceCreationExpression(InstanceCreationExpression node) {
     for (var argument in node.argumentList.arguments) {
       var parameter = argument.staticParameterElement;
-      usedElements.elements.add(parameter);
+      usedElements.addElement(parameter);
     }
     super.visitInstanceCreationExpression(node);
   }
 
   @override
   void visitMethodDeclaration(MethodDeclaration node) {
-    ExecutableElement enclosingExecOld = _enclosingExec;
+    var enclosingExecOld = _enclosingExec;
     try {
       _enclosingExec = node.declaredElement;
       super.visitMethodDeclaration(node);
@@ -122,7 +123,7 @@
     if (function is FunctionElement || function is MethodElement) {
       for (var argument in node.argumentList.arguments) {
         var parameter = argument.staticParameterElement;
-        usedElements.elements.add(parameter);
+        usedElements.addElement(parameter);
       }
     }
     super.visitMethodInvocation(node);
@@ -131,14 +132,14 @@
   @override
   void visitPostfixExpression(PostfixExpression node) {
     var element = node.staticElement;
-    usedElements.members.add(element);
+    usedElements.addMember(element);
     super.visitPostfixExpression(node);
   }
 
   @override
   void visitPrefixExpression(PrefixExpression node) {
     var element = node.staticElement;
-    usedElements.members.add(element);
+    usedElements.addMember(element);
     super.visitPrefixExpression(node);
   }
 
@@ -150,7 +151,7 @@
     if (_inCommentReference(node)) {
       return;
     }
-    Element element = node.writeOrReadElement;
+    var element = node.writeOrReadElement;
     // Store un-parameterized members.
     if (element is ExecutableMember) {
       element = element.declaration;
@@ -173,7 +174,7 @@
       _useIdentifierElement(node, node.readElement);
       _useIdentifierElement(node, node.writeElement);
       _useIdentifierElement(node, node.staticElement);
-      var parent = node.parent;
+      var parent = node.parent!;
       // If [node] is a method tear-off, assume all parameters are used.
       var functionReferenceIsCall =
           (element is ExecutableElement && parent is MethodInvocation) ||
@@ -184,7 +185,7 @@
               // unnamed constructor
               (element is ClassElement &&
                   parent.parent is ConstructorName &&
-                  parent.parent.parent is InstanceCreationExpression);
+                  parent.parent!.parent is InstanceCreationExpression);
       if (element is ExecutableElement &&
           isIdentifierRead &&
           !functionReferenceIsCall) {
@@ -203,7 +204,7 @@
         // If the 'values' static accessor of the enum is accessed, then all of
         // the enum values have been read.
         for (var value in enclosingElement.fields) {
-          usedElements.readMembers.add(value.getter);
+          usedElements.readMembers.add(value.getter!);
         }
       } else if ((enclosingElement is ClassElement ||
               enclosingElement is ExtensionElement) &&
@@ -220,15 +221,15 @@
   /// corresponding getter as a used member.
   void _addMemberAndCorrespondingGetter(Element element) {
     if (element is PropertyAccessorElement && element.isSetter) {
-      usedElements.members.add(element.correspondingGetter);
-      usedElements.readMembers.add(element.correspondingGetter);
+      usedElements.addMember(element.correspondingGetter);
+      usedElements.addReadMember(element.correspondingGetter);
     } else {
-      usedElements.readMembers.add(element);
+      usedElements.addReadMember(element);
     }
   }
 
   /// Marks the [element] of [node] as used in the library.
-  void _useIdentifierElement(Identifier node, Element element) {
+  void _useIdentifierElement(Identifier node, Element? element) {
     if (element == null) {
       return;
     }
@@ -246,7 +247,7 @@
     // Ignore places where the element is not actually used.
     if (node.parent is TypeName) {
       if (element is ClassElement) {
-        AstNode parent2 = node.parent.parent;
+        AstNode parent2 = node.parent!.parent!;
         if (parent2 is IsExpression) {
           return;
         }
@@ -278,7 +279,7 @@
       return false;
     }
     // Check if useless reading.
-    AstNode parent = node.parent;
+    AstNode parent = node.parent!;
 
     if (parent.parent is ExpressionStatement) {
       if (parent is PrefixExpression || parent is PostfixExpression) {
@@ -290,7 +291,7 @@
         // v ??= doSomething();
         //   vs.
         // v += 2;
-        TokenType operatorType = parent.operator?.type;
+        var operatorType = parent.operator.type;
         return operatorType == TokenType.QUESTION_QUESTION_EQ;
       }
     }
@@ -323,7 +324,7 @@
   @override
   void visitFormalParameterList(FormalParameterList node) {
     for (var element in node.parameterElements) {
-      if (!_isUsedElement(element)) {
+      if (!_isUsedElement(element!)) {
         _reportErrorForElement(
             HintCode.UNUSED_ELEMENT_PARAMETER, element, [element.displayName]);
       }
@@ -361,16 +362,13 @@
   /// characters.
   bool _isNamedUnderscore(LocalVariableElement element) {
     String name = element.name;
-    if (name != null) {
-      for (int index = name.length - 1; index >= 0; --index) {
-        if (name.codeUnitAt(index) != 0x5F) {
-          // 0x5F => '_'
-          return false;
-        }
+    for (int index = name.length - 1; index >= 0; --index) {
+      if (name.codeUnitAt(index) != 0x5F) {
+        // 0x5F => '_'
+        return false;
       }
-      return true;
     }
-    return false;
+    return true;
   }
 
   bool _isPrivateClassOrExtension(Element element) =>
@@ -401,7 +399,7 @@
     bool elementIsStaticVariable =
         element is VariableElement && element.isStatic;
     if (element.isPublic) {
-      if (_isPrivateClassOrExtension(element.enclosingElement) &&
+      if (_isPrivateClassOrExtension(element.enclosingElement!) &&
           elementIsStaticVariable) {
         // Public static fields of private classes, mixins, and extensions are
         // inaccessible from outside the library in which they are declared.
@@ -413,7 +411,11 @@
       return true;
     }
     if (element is FieldElement) {
-      element = (element as FieldElement).getter;
+      var getter = element.getter;
+      if (getter == null) {
+        return false;
+      }
+      element = getter;
     }
     if (_usedElements.readMembers.contains(element) ||
         _usedElements.unresolvedReadMembers.contains(element.name)) {
@@ -445,11 +447,13 @@
       if (!element.isOptional) {
         return true;
       }
-      if (_isPubliclyAccessible(enclosingElement)) {
-        return true;
-      }
-      if (_overridesUsedParameter(element, enclosingElement)) {
-        return true;
+      if (enclosingElement is ExecutableElement) {
+        if (_isPubliclyAccessible(enclosingElement)) {
+          return true;
+        }
+        if (_overridesUsedParameter(element, enclosingElement)) {
+          return true;
+        }
       }
     } else {
       if (element.isPublic) {
@@ -477,9 +481,9 @@
   }
 
   Iterable<ExecutableElement> _overriddenElements(Element element) {
-    Element enclosingElement = element.enclosingElement;
+    var enclosingElement = element.enclosingElement;
     if (enclosingElement is ClassElement) {
-      Name name = Name(_libraryUri, element.name);
+      Name name = Name(_libraryUri, element.name!);
       var overridden =
           _inheritanceManager.getOverridden2(enclosingElement, name);
       if (overridden == null) {
@@ -504,10 +508,10 @@
       ParameterElement element, ExecutableElement enclosingElement) {
     var overriddenElements = _overriddenElements(enclosingElement);
     for (var overridden in overriddenElements) {
-      ParameterElement correspondingParameter;
+      ParameterElement? correspondingParameter;
       if (element.isNamed) {
         correspondingParameter = overridden.parameters
-            .firstWhere((p) => p.name == element.name, orElse: () => null);
+            .firstWhereOrNull((p) => p.name == element.name);
       } else {
         var parameterIndex = 0;
         var parameterCount = enclosingElement.parameters.length;
@@ -540,9 +544,9 @@
   }
 
   void _reportErrorForElement(
-      ErrorCode errorCode, Element element, List<Object> arguments) {
+      ErrorCode errorCode, Element? element, List<Object> arguments) {
     if (element != null) {
-      _errorListener.onError(AnalysisError(element.source, element.nameOffset,
+      _errorListener.onError(AnalysisError(element.source!, element.nameOffset,
           element.nameLength, errorCode, arguments));
     }
   }
@@ -664,24 +668,36 @@
     return result;
   }
 
-  void addCatchException(LocalVariableElement element) {
-    if (element != null) {
+  void addCatchException(Element? element) {
+    if (element is LocalVariableElement) {
       catchExceptionElements.add(element);
     }
   }
 
-  void addCatchStackTrace(LocalVariableElement element) {
-    if (element != null) {
+  void addCatchStackTrace(Element? element) {
+    if (element is LocalVariableElement) {
       catchStackTraceElements.add(element);
     }
   }
 
-  void addElement(Element element) {
+  void addElement(Element? element) {
     if (element != null) {
       elements.add(element);
     }
   }
 
+  void addMember(Element? element) {
+    if (element != null) {
+      members.add(element);
+    }
+  }
+
+  void addReadMember(Element? element) {
+    if (element != null) {
+      readMembers.add(element);
+    }
+  }
+
   bool isCatchException(LocalVariableElement element) {
     return catchExceptionElements.contains(element);
   }
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 3c91d82..786cd50 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -49,7 +49,7 @@
     show translateErrorToken;
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' hide StringToken;
 import 'package:_fe_analyzer_shared/src/scanner/token.dart'
-    show SyntheticStringToken, SyntheticToken;
+    show StringToken, SyntheticStringToken, SyntheticToken;
 import 'package:_fe_analyzer_shared/src/scanner/token_constants.dart';
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -67,6 +67,8 @@
         TypeParameterImpl;
 import 'package:analyzer/src/fasta/error_converter.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
+import 'package:analyzer/src/summary2/ast_binary_tokens.dart';
+import 'package:collection/collection.dart';
 import 'package:pub_semver/pub_semver.dart';
 
 const _invalidCollectionElement = _InvalidCollectionElement._();
@@ -77,7 +79,7 @@
 
   final FastaErrorReporter errorReporter;
   final Uri fileUri;
-  ScriptTag scriptTag;
+  ScriptTag? scriptTag;
   final List<Directive> directives = <Directive>[];
   final List<CompilationUnitMember> declarations = <CompilationUnitMember>[];
 
@@ -86,16 +88,16 @@
 
   /// The parser that uses this listener, used to parse optional parts, e.g.
   /// `native` support.
-  Parser parser;
+  late Parser parser;
 
   /// The class currently being parsed, or `null` if no class is being parsed.
-  ClassDeclarationImpl classDeclaration;
+  ClassDeclarationImpl? classDeclaration;
 
   /// The mixin currently being parsed, or `null` if no mixin is being parsed.
-  MixinDeclarationImpl mixinDeclaration;
+  MixinDeclarationImpl? mixinDeclaration;
 
   /// The extension currently being parsed, or `null` if none.
-  ExtensionDeclarationImpl extensionDeclaration;
+  ExtensionDeclarationImpl? extensionDeclaration;
 
   /// If true, this is building a full AST. Otherwise, only create method
   /// bodies.
@@ -112,7 +114,7 @@
   // * The current library has an import that uses the scheme "dart-ext".
   bool allowNativeClause = false;
 
-  StringLiteral nativeName;
+  StringLiteral? nativeName;
 
   bool parseFunctionBodies = true;
 
@@ -138,7 +140,7 @@
 
   AstBuilder(ErrorReporter errorReporter, this.fileUri, this.isFullAst,
       this._featureSet,
-      [Uri uri])
+      [Uri? uri])
       : errorReporter = FastaErrorReporter(errorReporter),
         enableNonNullable = _featureSet.isEnabled(Feature.non_nullable),
         enableSpreadCollections =
@@ -153,27 +155,27 @@
 
   NodeList<ClassMember> get currentDeclarationMembers {
     if (classDeclaration != null) {
-      return classDeclaration.members;
+      return classDeclaration!.members;
     } else if (mixinDeclaration != null) {
-      return mixinDeclaration.members;
+      return mixinDeclaration!.members;
     } else {
-      return extensionDeclaration.members;
+      return extensionDeclaration!.members;
     }
   }
 
-  SimpleIdentifier get currentDeclarationName {
+  SimpleIdentifier? get currentDeclarationName {
     if (classDeclaration != null) {
-      return classDeclaration.name;
+      return classDeclaration!.name;
     } else if (mixinDeclaration != null) {
-      return mixinDeclaration.name;
+      return mixinDeclaration!.name;
     } else {
-      return extensionDeclaration.name;
+      return extensionDeclaration!.name;
     }
   }
 
   @override
   void addProblem(Message message, int charOffset, int length,
-      {bool wasHandled = false, List<LocatedMessage> context}) {
+      {bool wasHandled = false, List<LocatedMessage>? context}) {
     if (directives.isEmpty &&
         (message.code.analyzerCodes
                 ?.contains('NON_PART_OF_DIRECTIVE_IN_PART') ??
@@ -191,7 +193,7 @@
     assert(optional('..', token) || optional('?..', token));
     debugEvent("beginCascade");
 
-    Expression expression = pop();
+    var expression = pop() as Expression;
     push(token);
     if (expression is CascadeExpression) {
       push(expression);
@@ -202,7 +204,7 @@
   }
 
   @override
-  void beginClassDeclaration(Token begin, Token abstractToken, Token name) {
+  void beginClassDeclaration(Token begin, Token? abstractToken, Token name) {
     assert(classDeclaration == null &&
         mixinDeclaration == null &&
         extensionDeclaration == null);
@@ -215,18 +217,18 @@
   }
 
   @override
-  void beginExtensionDeclaration(Token extensionKeyword, Token nameToken) {
+  void beginExtensionDeclaration(Token extensionKeyword, Token? nameToken) {
     assert(optional('extension', extensionKeyword));
     assert(classDeclaration == null &&
         mixinDeclaration == null &&
         extensionDeclaration == null);
     debugEvent("ExtensionHeader");
 
-    TypeParameterList typeParameters = pop();
-    List<Annotation> metadata = pop();
-    Comment comment = _findComment(metadata, extensionKeyword);
+    var typeParameters = pop() as TypeParameterList?;
+    var metadata = pop() as List<Annotation>?;
+    var comment = _findComment(metadata, extensionKeyword);
 
-    SimpleIdentifier name;
+    SimpleIdentifier? name;
     if (nameToken != null) {
       name = ast.simpleIdentifier(nameToken, isDeclaration: true);
     }
@@ -237,23 +239,30 @@
       extensionKeyword: extensionKeyword,
       name: name,
       typeParameters: typeParameters,
-      extendedType: null, // extendedType is set in [endExtensionDeclaration]
+      onKeyword: Tokens.ON,
+      extendedType: ast.typeName(
+        _tmpSimpleIdentifier(),
+        null,
+      ), // extendedType is set in [endExtensionDeclaration]
+      leftBracket: Tokens.OPEN_CURLY_BRACKET,
+      rightBracket: Tokens.CLOSE_CURLY_BRACKET,
+      members: [],
     ) as ExtensionDeclarationImpl;
 
-    declarations.add(extensionDeclaration);
+    declarations.add(extensionDeclaration!);
   }
 
   @override
   void beginFactoryMethod(
-      Token lastConsumed, Token externalToken, Token constToken) {
+      Token lastConsumed, Token? externalToken, Token? constToken) {
     push(_Modifiers()
       ..externalKeyword = externalToken
       ..finalConstOrVarKeyword = constToken);
   }
 
   @override
-  void beginFormalParameter(Token token, MemberKind kind, Token requiredToken,
-      Token covariantToken, Token varFinalOrConst) {
+  void beginFormalParameter(Token token, MemberKind kind, Token? requiredToken,
+      Token? covariantToken, Token? varFinalOrConst) {
     push(_Modifiers()
       ..covariantKeyword = covariantToken
       ..finalConstOrVarKeyword = varFinalOrConst
@@ -285,8 +294,13 @@
   }
 
   @override
-  void beginMethod(Token externalToken, Token staticToken, Token covariantToken,
-      Token varFinalOrConst, Token getOrSet, Token name) {
+  void beginMethod(
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? varFinalOrConst,
+      Token? getOrSet,
+      Token name) {
     _Modifiers modifiers = _Modifiers();
     if (externalToken != null) {
       assert(externalToken.isModifier);
@@ -294,12 +308,12 @@
     }
     if (staticToken != null) {
       assert(staticToken.isModifier);
-      String className = classDeclaration != null
-          ? classDeclaration.name.name
+      String? className = classDeclaration != null
+          ? classDeclaration!.name.name
           : (mixinDeclaration != null
-              ? mixinDeclaration.name.name
-              : extensionDeclaration.name?.name);
-      if (name?.lexeme != className || getOrSet != null) {
+              ? mixinDeclaration!.name.name
+              : extensionDeclaration!.name?.name);
+      if (name.lexeme != className || getOrSet != null) {
         modifiers.staticKeyword = staticToken;
       }
     }
@@ -323,29 +337,29 @@
 
   @override
   void beginNamedMixinApplication(
-      Token begin, Token abstractToken, Token name) {
+      Token begin, Token? abstractToken, Token name) {
     push(_Modifiers()..abstractKeyword = abstractToken);
   }
 
   @override
-  void beginTopLevelMethod(Token lastConsumed, Token externalToken) {
+  void beginTopLevelMethod(Token lastConsumed, Token? externalToken) {
     push(_Modifiers()..externalKeyword = externalToken);
   }
 
   @override
   void beginTypeVariable(Token token) {
     debugEvent("beginTypeVariable");
-    SimpleIdentifier name = pop();
-    List<Annotation> metadata = pop();
+    var name = pop() as SimpleIdentifier;
+    var metadata = pop() as List<Annotation>?;
 
-    Comment comment = _findComment(metadata, name.beginToken);
+    var comment = _findComment(metadata, name.beginToken);
     var typeParameter = ast.typeParameter(comment, metadata, name, null, null);
     push(typeParameter);
   }
 
   @override
   void beginVariablesDeclaration(
-      Token token, Token lateToken, Token varFinalOrConst) {
+      Token token, Token? lateToken, Token? varFinalOrConst) {
     debugEvent("beginVariablesDeclaration");
     if (varFinalOrConst != null || lateToken != null) {
       push(_Modifiers()
@@ -356,7 +370,7 @@
     }
   }
 
-  ConstructorInitializer buildInitializer(Object initializerObject) {
+  ConstructorInitializer? buildInitializer(Object initializerObject) {
     if (initializerObject is FunctionExpressionInvocation) {
       Expression function = initializerObject.function;
       if (function is SuperExpression) {
@@ -371,7 +385,7 @@
     }
 
     if (initializerObject is MethodInvocation) {
-      Expression target = initializerObject.target;
+      var target = initializerObject.target;
       if (target is SuperExpression) {
         return ast.superConstructorInvocation(
             target.superKeyword,
@@ -396,12 +410,12 @@
     }
 
     if (initializerObject is AssignmentExpression) {
-      Token thisKeyword;
-      Token period;
+      Token? thisKeyword;
+      Token? period;
       SimpleIdentifier fieldName;
       Expression left = initializerObject.leftHandSide;
       if (left is PropertyAccess) {
-        Expression target = left.target;
+        var target = left.target;
         if (target is ThisExpression) {
           thisKeyword = target.thisKeyword;
           period = left.operator;
@@ -416,7 +430,7 @@
       } else {
         // Recovery:
         // Parser has reported invalid assignment.
-        SuperExpression superExpression = left;
+        var superExpression = left as SuperExpression;
         fieldName = ast.simpleIdentifier(superExpression.superKeyword);
       }
       return ast.constructorFieldInitializer(thisKeyword, period, fieldName,
@@ -440,19 +454,19 @@
     return null;
   }
 
-  AstNode buildInitializerTargetExpressionRecovery(
-      Expression target, Object initializerObject) {
-    ArgumentList argumentList;
+  ConstructorInitializer? buildInitializerTargetExpressionRecovery(
+      Expression? target, Object initializerObject) {
+    ArgumentList? argumentList;
     while (true) {
       if (target is FunctionExpressionInvocation) {
-        argumentList = (target as FunctionExpressionInvocation).argumentList;
-        target = (target as FunctionExpressionInvocation).function;
+        argumentList = target.argumentList;
+        target = target.function;
       } else if (target is MethodInvocation) {
-        argumentList = (target as MethodInvocation).argumentList;
-        target = (target as MethodInvocation).target;
+        argumentList = target.argumentList;
+        target = target.target!;
       } else if (target is PropertyAccess) {
         argumentList = null;
-        target = (target as PropertyAccess).target;
+        target = target.target!;
       } else {
         break;
       }
@@ -463,21 +477,22 @@
       handleRecoverableError(messageInvalidSuperInInitializer,
           target.superKeyword, target.superKeyword);
       return ast.superConstructorInvocation(
-          target.superKeyword, null, null, argumentList);
+          target.superKeyword, null, null, argumentList!);
     } else if (target is ThisExpression) {
       // TODO(danrubel): Consider generating this error in the parser
       // This error is also reported in the body builder
       handleRecoverableError(messageInvalidThisInInitializer,
           target.thisKeyword, target.thisKeyword);
       return ast.redirectingConstructorInvocation(
-          target.thisKeyword, null, null, argumentList);
+          target.thisKeyword, null, null, argumentList!);
     }
     return null;
   }
 
-  void checkFieldFormalParameters(FormalParameterList parameters) {
-    if (parameters?.parameters != null) {
-      parameters.parameters.forEach((FormalParameter param) {
+  void checkFieldFormalParameters(FormalParameterList? parameterList) {
+    var parameters = parameterList?.parameters;
+    if (parameters != null) {
+      parameters.forEach((FormalParameter param) {
         if (param is FieldFormalParameter) {
           // This error is reported in the BodyBuilder.endFormalParameter.
           handleRecoverableError(messageFieldInitializerOutsideConstructor,
@@ -493,8 +508,8 @@
   }
 
   void doDotExpression(Token dot) {
-    Expression identifierOrInvoke = pop();
-    Expression receiver = pop();
+    var identifierOrInvoke = pop() as Expression;
+    var receiver = pop() as Expression?;
     if (identifierOrInvoke is SimpleIdentifier) {
       if (receiver is SimpleIdentifier && identical('.', dot.stringValue)) {
         push(ast.prefixedIdentifier(receiver, dot, identifierOrInvoke));
@@ -521,8 +536,8 @@
   }
 
   void doInvocation(
-      TypeArgumentList typeArguments, MethodInvocation arguments) {
-    Expression receiver = pop();
+      TypeArgumentList? typeArguments, MethodInvocation arguments) {
+    var receiver = pop() as Expression;
     if (receiver is SimpleIdentifier) {
       arguments.methodName = receiver;
       if (typeArguments != null) {
@@ -543,10 +558,11 @@
     assert(optional(')', rightParenthesis));
     debugEvent("Arguments");
 
-    List<Expression> expressions = popTypedList(count);
+    var expressions = popTypedList2<Expression>(count);
     ArgumentList arguments =
         ast.argumentList(leftParenthesis, expressions, rightParenthesis);
-    push(ast.methodInvocation(null, null, null, null, arguments));
+    push(ast.methodInvocation(
+        null, null, _tmpSimpleIdentifier(), null, arguments));
   }
 
   @override
@@ -556,15 +572,15 @@
 
   @override
   void endAssert(Token assertKeyword, Assert kind, Token leftParenthesis,
-      Token comma, Token semicolon) {
+      Token? comma, Token semicolon) {
     assert(optional('assert', assertKeyword));
     assert(optional('(', leftParenthesis));
     assert(optionalOrNull(',', comma));
     assert(kind != Assert.Statement || optionalOrNull(';', semicolon));
     debugEvent("Assert");
 
-    Expression message = popIfNotNull(comma);
-    Expression condition = pop();
+    var message = popIfNotNull(comma) as Expression?;
+    var condition = pop() as Expression;
     switch (kind) {
       case Assert.Expression:
         // The parser has already reported an error indicating that assert
@@ -577,15 +593,15 @@
             ast.simpleIdentifier(assertKeyword),
             null,
             ast.argumentList(
-                leftParenthesis, arguments, leftParenthesis?.endGroup)));
+                leftParenthesis, arguments, leftParenthesis.endGroup!)));
         break;
       case Assert.Initializer:
         push(ast.assertInitializer(assertKeyword, leftParenthesis, condition,
-            comma, message, leftParenthesis?.endGroup));
+            comma, message, leftParenthesis.endGroup!));
         break;
       case Assert.Statement:
         push(ast.assertStatement(assertKeyword, leftParenthesis, condition,
-            comma, message, leftParenthesis?.endGroup, semicolon));
+            comma, message, leftParenthesis.endGroup!, semicolon));
         break;
     }
   }
@@ -595,7 +611,8 @@
     assert(optional('await', awaitKeyword));
     debugEvent("AwaitExpression");
 
-    push(ast.awaitExpression(awaitKeyword, pop()));
+    var expression = pop() as Expression;
+    push(ast.awaitExpression(awaitKeyword, expression));
   }
 
   @override
@@ -615,8 +632,8 @@
         identical("?..", operatorToken.stringValue)) {
       doDotExpression(operatorToken);
     } else {
-      Expression right = pop();
-      Expression left = pop();
+      var right = pop() as Expression;
+      var left = pop() as Expression;
       reportErrorIfSuper(right);
       push(ast.binaryExpression(left, operatorToken, right));
       if (!enableTripleShift && operatorToken.type == TokenType.GT_GT_GT) {
@@ -640,7 +657,7 @@
     assert(optional('}', rightBracket));
     debugEvent("Block");
 
-    List<Statement> statements = popTypedList(count) ?? <Statement>[];
+    var statements = popTypedList2<Statement>(count);
     push(ast.block(leftBracket, statements, rightBracket));
   }
 
@@ -650,10 +667,10 @@
     assert(optional('}', rightBracket));
     debugEvent("BlockFunctionBody");
 
-    List<Statement> statements = popTypedList(count);
+    var statements = popTypedList2<Statement>(count);
     Block block = ast.block(leftBracket, statements, rightBracket);
-    Token star = pop();
-    Token asyncKeyword = pop();
+    var star = pop() as Token?;
+    var asyncKeyword = pop() as Token?;
     if (parseFunctionBodies) {
       push(ast.blockFunctionBody(asyncKeyword, star, block));
     } else {
@@ -667,35 +684,33 @@
   void endCascade() {
     debugEvent("Cascade");
 
-    Expression expression = pop();
-    CascadeExpression receiver = pop();
+    var expression = pop() as Expression;
+    var receiver = pop() as CascadeExpression;
     pop(); // Token.
     receiver.cascadeSections.add(expression);
     push(receiver);
   }
 
   @override
-  void endClassConstructor(Token getOrSet, Token beginToken, Token beginParam,
-      Token beginInitializers, Token endToken) {
+  void endClassConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
     assert(getOrSet == null ||
         optional('get', getOrSet) ||
         optional('set', getOrSet));
     debugEvent("ClassConstructor");
 
     var bodyObject = pop();
-    List<ConstructorInitializer> initializers = pop() ?? const [];
-    Token separator = pop();
-    FormalParameterList parameters = pop();
-    TypeParameterList typeParameters = pop();
+    var initializers = (pop() as List<ConstructorInitializer>?) ?? const [];
+    var separator = pop() as Token?;
+    var parameters = pop() as FormalParameterList;
+    var typeParameters = pop() as TypeParameterList?;
     var name = pop();
     pop(); // return type
-    _Modifiers modifiers = pop();
-    List<Annotation> metadata = pop();
-    Comment comment = _findComment(metadata, beginToken);
+    var modifiers = pop() as _Modifiers?;
+    var metadata = pop() as List<Annotation>?;
+    var comment = _findComment(metadata, beginToken);
 
-    assert(parameters != null || optional('get', getOrSet));
-
-    ConstructorName redirectedConstructor;
+    ConstructorName? redirectedConstructor;
     FunctionBody body;
     if (bodyObject is FunctionBody) {
       body = bodyObject;
@@ -712,8 +727,8 @@
     }
 
     SimpleIdentifier prefixOrName;
-    Token period;
-    SimpleIdentifier nameOrNull;
+    Token? period;
+    SimpleIdentifier? nameOrNull;
     if (name is SimpleIdentifier) {
       prefixOrName = name;
     } else if (name is PrefixedIdentifier) {
@@ -733,10 +748,10 @@
           typeParameters.beginToken, typeParameters.endToken);
     }
     if (modifiers?.constKeyword != null &&
-        body != null &&
-        (body.length > 1 || body.beginToken?.lexeme != ';')) {
+        (body.length > 1 || body.beginToken.lexeme != ';')) {
       // This error is also reported in BodyBuilder.finishFunction
-      Token bodyToken = body.beginToken ?? modifiers.constKeyword;
+      Token bodyToken = body.beginToken;
+      // Token bodyToken = body.beginToken ?? modifiers.constKeyword;
       handleRecoverableError(
           messageConstConstructorWithBody, bodyToken, bodyToken);
     }
@@ -775,9 +790,9 @@
     debugEvent("ClassFactoryMethod");
 
     FunctionBody body;
-    Token separator;
-    ConstructorName redirectedConstructor;
-    Object bodyObject = pop();
+    Token? separator;
+    ConstructorName? redirectedConstructor;
+    var bodyObject = pop();
     if (bodyObject is FunctionBody) {
       body = bodyObject;
     } else if (bodyObject is _RedirectingFactoryBody) {
@@ -792,14 +807,12 @@
           uri);
     }
 
-    FormalParameterList parameters = pop();
-    TypeParameterList typeParameters = pop();
-    Object constructorName = pop();
-    _Modifiers modifiers = pop();
-    List<Annotation> metadata = pop();
-    Comment comment = _findComment(metadata, beginToken);
-
-    assert(parameters != null);
+    var parameters = pop() as FormalParameterList;
+    var typeParameters = pop() as TypeParameterList?;
+    var constructorName = pop() as Identifier;
+    var modifiers = pop() as _Modifiers?;
+    var metadata = pop() as List<Annotation>?;
+    var comment = _findComment(metadata, beginToken);
 
     if (typeParameters != null) {
       // TODO(danrubel): Update OutlineBuilder to report this error message.
@@ -810,8 +823,8 @@
     // Decompose the preliminary ConstructorName into the type name and
     // the actual constructor name.
     SimpleIdentifier returnType;
-    Token period;
-    SimpleIdentifier name;
+    Token? period;
+    SimpleIdentifier? name;
     Identifier typeName = constructorName;
     if (typeName is SimpleIdentifier) {
       returnType = typeName;
@@ -820,6 +833,8 @@
       period = typeName.period;
       name =
           ast.simpleIdentifier(typeName.identifier.token, isDeclaration: true);
+    } else {
+      throw UnimplementedError();
     }
 
     currentDeclarationMembers.add(ast.constructorDeclaration(
@@ -840,12 +855,12 @@
 
   @override
   void endClassFields(
-      Token abstractToken,
-      Token externalToken,
-      Token staticToken,
-      Token covariantToken,
-      Token lateToken,
-      Token varFinalOrConst,
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
       int count,
       Token beginToken,
       Token semicolon) {
@@ -877,17 +892,17 @@
       }
     }
 
-    List<VariableDeclaration> variables = popTypedList(count);
-    TypeAnnotation type = pop();
+    var variables = popTypedList2<VariableDeclaration>(count);
+    var type = pop() as TypeAnnotation?;
     var variableList = ast.variableDeclarationList2(
       lateKeyword: lateToken,
       keyword: varFinalOrConst,
       type: type,
       variables: variables,
     );
-    Token covariantKeyword = covariantToken;
-    List<Annotation> metadata = pop();
-    Comment comment = _findComment(metadata, beginToken);
+    var covariantKeyword = covariantToken;
+    var metadata = pop() as List<Annotation>?;
+    var comment = _findComment(metadata, beginToken);
     currentDeclarationMembers.add(ast.fieldDeclaration2(
         comment: comment,
         metadata: metadata,
@@ -900,8 +915,8 @@
   }
 
   @override
-  void endClassMethod(Token getOrSet, Token beginToken, Token beginParam,
-      Token beginInitializers, Token endToken) {
+  void endClassMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
     assert(getOrSet == null ||
         optional('get', getOrSet) ||
         optional('set', getOrSet));
@@ -910,15 +925,15 @@
     var bodyObject = pop();
     pop(); // initializers
     pop(); // separator
-    FormalParameterList parameters = pop();
-    TypeParameterList typeParameters = pop();
+    var parameters = pop() as FormalParameterList?;
+    var typeParameters = pop() as TypeParameterList?;
     var name = pop();
-    TypeAnnotation returnType = pop();
-    _Modifiers modifiers = pop();
-    List<Annotation> metadata = pop();
-    Comment comment = _findComment(metadata, beginToken);
+    var returnType = pop() as TypeAnnotation?;
+    var modifiers = pop() as _Modifiers?;
+    var metadata = pop() as List<Annotation>?;
+    var comment = _findComment(metadata, beginToken);
 
-    assert(parameters != null || optional('get', getOrSet));
+    assert(parameters != null || optional('get', getOrSet!));
 
     FunctionBody body;
     if (bodyObject is FunctionBody) {
@@ -933,7 +948,7 @@
           uri);
     }
 
-    Token operatorKeyword;
+    Token? operatorKeyword;
     SimpleIdentifier nameId;
     if (name is SimpleIdentifier) {
       nameId = name;
@@ -974,15 +989,15 @@
     debugEvent("ClassOrMixinBody");
 
     if (classDeclaration != null) {
-      classDeclaration
+      classDeclaration!
         ..leftBracket = leftBracket
         ..rightBracket = rightBracket;
     } else if (mixinDeclaration != null) {
-      mixinDeclaration
+      mixinDeclaration!
         ..leftBracket = leftBracket
         ..rightBracket = rightBracket;
     } else {
-      extensionDeclaration
+      extensionDeclaration!
         ..leftBracket = leftBracket
         ..rightBracket = rightBracket;
     }
@@ -998,7 +1013,7 @@
   void endCompilationUnit(int count, Token endToken) {
     debugEvent("CompilationUnit");
 
-    Token beginToken = pop();
+    var beginToken = pop() as Token;
     checkEmpty(endToken.charOffset);
 
     CompilationUnitImpl unit = ast.compilationUnit(
@@ -1017,9 +1032,9 @@
     assert(optional(':', colon));
     debugEvent("ConditionalExpression");
 
-    Expression elseExpression = pop();
-    Expression thenExpression = pop();
-    Expression condition = pop();
+    var elseExpression = pop() as Expression;
+    var thenExpression = pop() as Expression;
+    var condition = pop() as Expression;
     reportErrorIfSuper(elseExpression);
     reportErrorIfSuper(thenExpression);
     push(ast.conditionalExpression(
@@ -1027,14 +1042,14 @@
   }
 
   @override
-  void endConditionalUri(Token ifKeyword, Token leftParen, Token equalSign) {
+  void endConditionalUri(Token ifKeyword, Token leftParen, Token? equalSign) {
     assert(optional('if', ifKeyword));
     assert(optionalOrNull('(', leftParen));
     assert(optionalOrNull('==', equalSign));
     debugEvent("ConditionalUri");
 
-    StringLiteral libraryUri = pop();
-    StringLiteral value = popIfNotNull(equalSign);
+    var libraryUri = pop() as StringLiteral;
+    var value = popIfNotNull(equalSign) as StringLiteral?;
     if (value is StringInterpolation) {
       for (var child in value.childEntities) {
         if (child is InterpolationExpression) {
@@ -1045,9 +1060,9 @@
         }
       }
     }
-    DottedName name = pop();
+    var name = pop() as DottedName;
     push(ast.configuration(ifKeyword, leftParen, name, equalSign, value,
-        leftParen?.endGroup, libraryUri));
+        leftParen.endGroup!, libraryUri));
   }
 
   @override
@@ -1072,13 +1087,13 @@
 
   @override
   void endConstructorReference(
-      Token start, Token periodBeforeName, Token endToken) {
+      Token start, Token? periodBeforeName, Token endToken) {
     assert(optionalOrNull('.', periodBeforeName));
     debugEvent("ConstructorReference");
 
-    SimpleIdentifier constructorName = pop();
-    TypeArgumentList typeArguments = pop();
-    Identifier typeNameIdentifier = pop();
+    var constructorName = pop() as SimpleIdentifier?;
+    var typeArguments = pop() as TypeArgumentList?;
+    var typeNameIdentifier = pop() as Identifier;
     push(ast.constructorName(ast.typeName(typeNameIdentifier, typeArguments),
         periodBeforeName, constructorName));
   }
@@ -1091,8 +1106,8 @@
     assert(optional(';', semicolon));
     debugEvent("DoWhileStatement");
 
-    ParenthesizedExpression condition = pop();
-    Statement body = pop();
+    var condition = pop() as ParenthesizedExpression;
+    var body = pop() as Statement;
     push(ast.doStatement(
         doKeyword,
         body,
@@ -1119,12 +1134,12 @@
     assert(optional('{', leftBrace));
     debugEvent("Enum");
 
-    List<EnumConstantDeclaration> constants = popTypedList(count);
-    SimpleIdentifier name = pop();
-    List<Annotation> metadata = pop();
-    Comment comment = _findComment(metadata, enumKeyword);
+    var constants = popTypedList2<EnumConstantDeclaration>(count);
+    var name = pop() as SimpleIdentifier;
+    var metadata = pop() as List<Annotation>?;
+    var comment = _findComment(metadata, enumKeyword);
     declarations.add(ast.enumDeclaration(comment, metadata, enumKeyword, name,
-        leftBrace, constants, leftBrace?.endGroup));
+        leftBrace, constants, leftBrace.endGroup!));
   }
 
   @override
@@ -1133,18 +1148,18 @@
     assert(optional(';', semicolon));
     debugEvent("Export");
 
-    List<Combinator> combinators = pop();
-    List<Configuration> configurations = pop();
-    StringLiteral uri = pop();
-    List<Annotation> metadata = pop();
-    Comment comment = _findComment(metadata, exportKeyword);
+    var combinators = pop() as List<Combinator>?;
+    var configurations = pop() as List<Configuration>?;
+    var uri = pop() as StringLiteral;
+    var metadata = pop() as List<Annotation>?;
+    var comment = _findComment(metadata, exportKeyword);
     directives.add(ast.exportDirective(comment, metadata, exportKeyword, uri,
         configurations, combinators, semicolon));
   }
 
   @override
-  void endExtensionConstructor(Token getOrSet, Token beginToken,
-      Token beginParam, Token beginInitializers, Token endToken) {
+  void endExtensionConstructor(Token? getOrSet, Token beginToken,
+      Token beginParam, Token? beginInitializers, Token endToken) {
     debugEvent("ExtensionConstructor");
     // TODO(danrubel) Decide how to handle constructor declarations within
     // extensions. They are invalid and the parser has already reported an
@@ -1164,8 +1179,8 @@
   @override
   void endExtensionDeclaration(
       Token extensionKeyword, Token onKeyword, Token token) {
-    TypeAnnotation type = pop();
-    extensionDeclaration
+    var type = pop() as TypeAnnotation;
+    extensionDeclaration!
       ..extendedType = type
       ..onKeyword = onKeyword;
     extensionDeclaration = null;
@@ -1178,12 +1193,12 @@
     assert(optional(';', endToken) || optional('}', endToken));
     debugEvent("ExtensionFactoryMethod");
 
-    Object bodyObject = pop();
-    FormalParameterList parameters = pop();
-    TypeParameterList typeParameters = pop();
-    Object constructorName = pop();
-    _Modifiers modifiers = pop();
-    List<Annotation> metadata = pop();
+    var bodyObject = pop();
+    var parameters = pop() as FormalParameterList;
+    var typeParameters = pop() as TypeParameterList?;
+    var constructorName = pop();
+    var modifiers = pop() as _Modifiers?;
+    var metadata = pop() as List<Annotation>?;
 
     FunctionBody body;
     if (bodyObject is FunctionBody) {
@@ -1196,9 +1211,7 @@
       // don't bother adding this declaration to the AST.
       return;
     }
-    Comment comment = _findComment(metadata, beginToken);
-
-    assert(parameters != null);
+    var comment = _findComment(metadata, beginToken);
 
     // Constructor declarations within extensions are invalid and the parser
     // has already reported an error at this point, but we include them in as
@@ -1231,12 +1244,12 @@
 
   @override
   void endExtensionFields(
-      Token abstractToken,
-      Token externalToken,
-      Token staticToken,
-      Token covariantToken,
-      Token lateToken,
-      Token varFinalOrConst,
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
       int count,
       Token beginToken,
       Token endToken) {
@@ -1251,8 +1264,8 @@
   }
 
   @override
-  void endExtensionMethod(Token getOrSet, Token beginToken, Token beginParam,
-      Token beginInitializers, Token endToken) {
+  void endExtensionMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
     debugEvent("ExtensionMethod");
     endClassMethod(
         getOrSet, beginToken, beginParam, beginInitializers, endToken);
@@ -1263,18 +1276,18 @@
     assert(optional('=', assignment));
     debugEvent("FieldInitializer");
 
-    Expression initializer = pop();
-    SimpleIdentifier name = pop();
+    var initializer = pop() as Expression;
+    var name = pop() as SimpleIdentifier;
     push(_makeVariableDeclaration(name, assignment, initializer));
   }
 
   @override
   void endForControlFlow(Token token) {
     debugEvent("endForControlFlow");
-    var entry = pop();
-    ForParts forLoopParts = pop();
-    Token leftParen = pop();
-    Token forToken = pop();
+    var entry = pop() as Object;
+    var forLoopParts = pop() as ForParts;
+    var leftParen = pop() as Token;
+    var forToken = pop() as Token;
 
     pushForControlFlowInfo(null, forToken, leftParen, forLoopParts, entry);
   }
@@ -1283,18 +1296,18 @@
   void endForIn(Token endToken) {
     debugEvent("ForInExpression");
 
-    Statement body = pop();
-    ForEachParts forLoopParts = pop();
-    Token leftParenthesis = pop();
-    Token forToken = pop();
-    Token awaitToken = pop(NullValue.AwaitToken);
+    var body = pop() as Statement;
+    var forLoopParts = pop() as ForEachParts;
+    var leftParenthesis = pop() as Token;
+    var forToken = pop() as Token;
+    var awaitToken = pop(NullValue.AwaitToken) as Token?;
 
     push(ast.forStatement(
       awaitKeyword: awaitToken,
       forKeyword: forToken,
       leftParenthesis: leftParenthesis,
       forLoopParts: forLoopParts,
-      rightParenthesis: leftParenthesis.endGroup,
+      rightParenthesis: leftParenthesis.endGroup!,
       body: body,
     ));
   }
@@ -1308,11 +1321,11 @@
   void endForInControlFlow(Token token) {
     debugEvent("endForInControlFlow");
 
-    var entry = pop();
-    ForEachParts forLoopParts = pop();
-    Token leftParenthesis = pop();
-    Token forToken = pop();
-    Token awaitToken = pop(NullValue.AwaitToken);
+    var entry = pop() as Object;
+    var forLoopParts = pop() as ForEachParts;
+    var leftParenthesis = pop() as Token;
+    var forToken = pop() as Token;
+    var awaitToken = pop(NullValue.AwaitToken) as Token?;
 
     pushForControlFlowInfo(
         awaitToken, forToken, leftParenthesis, forLoopParts, entry);
@@ -1325,31 +1338,31 @@
 
   @override
   void endFormalParameter(
-      Token thisKeyword,
-      Token periodAfterThis,
+      Token? thisKeyword,
+      Token? periodAfterThis,
       Token nameToken,
-      Token initializerStart,
-      Token initializerEnd,
+      Token? initializerStart,
+      Token? initializerEnd,
       FormalParameterKind kind,
       MemberKind memberKind) {
     assert(optionalOrNull('this', thisKeyword));
     assert(thisKeyword == null
         ? periodAfterThis == null
-        : optional('.', periodAfterThis));
+        : optional('.', periodAfterThis!));
     debugEvent("FormalParameter");
 
-    _ParameterDefaultValue defaultValue = pop();
-    SimpleIdentifier name = pop();
-    AstNode typeOrFunctionTypedParameter = pop();
-    _Modifiers modifiers = pop();
-    Token keyword = modifiers?.finalConstOrVarKeyword;
-    Token covariantKeyword = modifiers?.covariantKeyword;
-    Token requiredKeyword = modifiers?.requiredToken;
+    var defaultValue = pop() as _ParameterDefaultValue?;
+    var name = pop() as SimpleIdentifier?;
+    var typeOrFunctionTypedParameter = pop() as AstNode?;
+    var modifiers = pop() as _Modifiers?;
+    var keyword = modifiers?.finalConstOrVarKeyword;
+    var covariantKeyword = modifiers?.covariantKeyword;
+    var requiredKeyword = modifiers?.requiredToken;
     if (!enableNonNullable) {
       reportNonNullableModifierError(requiredKeyword);
     }
-    List<Annotation> metadata = pop();
-    Comment comment = _findComment(metadata,
+    var metadata = pop() as List<Annotation>?;
+    var comment = _findComment(metadata,
         thisKeyword ?? typeOrFunctionTypedParameter?.beginToken ?? nameToken);
 
     NormalFormalParameter node;
@@ -1359,7 +1372,7 @@
       // the final AST node.
       if (thisKeyword == null) {
         node = ast.functionTypedFormalParameter2(
-            identifier: name,
+            identifier: name!,
             comment: comment,
             metadata: metadata,
             covariantKeyword: covariantKeyword,
@@ -1370,20 +1383,20 @@
             question: typeOrFunctionTypedParameter.question);
       } else {
         node = ast.fieldFormalParameter2(
-            identifier: name,
+            identifier: name!,
             comment: comment,
             metadata: metadata,
             covariantKeyword: covariantKeyword,
             requiredKeyword: requiredKeyword,
             type: typeOrFunctionTypedParameter.returnType,
             thisKeyword: thisKeyword,
-            period: periodAfterThis,
+            period: periodAfterThis!,
             typeParameters: typeOrFunctionTypedParameter.typeParameters,
             parameters: typeOrFunctionTypedParameter.parameters,
             question: typeOrFunctionTypedParameter.question);
       }
     } else {
-      TypeAnnotation type = typeOrFunctionTypedParameter;
+      var type = typeOrFunctionTypedParameter as TypeAnnotation?;
       if (thisKeyword == null) {
         node = ast.simpleFormalParameter2(
             comment: comment,
@@ -1402,8 +1415,8 @@
             keyword: keyword,
             type: type,
             thisKeyword: thisKeyword,
-            period: thisKeyword.next,
-            identifier: name);
+            period: thisKeyword.next!,
+            identifier: name!);
       }
     }
 
@@ -1434,10 +1447,10 @@
     assert(optional(')', rightParen));
     debugEvent("FormalParameters");
 
-    List<Object> rawParameters = popTypedList(count) ?? const <Object>[];
+    var rawParameters = popTypedList(count) ?? const <Object>[];
     List<FormalParameter> parameters = <FormalParameter>[];
-    Token leftDelimiter;
-    Token rightDelimiter;
+    Token? leftDelimiter;
+    Token? rightDelimiter;
     for (Object raw in rawParameters) {
       if (raw is _OptionalFormalParameters) {
         parameters.addAll(raw.parameters ?? const <FormalParameter>[]);
@@ -1454,16 +1467,16 @@
   @override
   void endForStatement(Token endToken) {
     debugEvent("ForStatement");
-    Statement body = pop();
-    ForParts forLoopParts = pop();
-    Token leftParen = pop();
-    Token forToken = pop();
+    var body = pop() as Statement;
+    var forLoopParts = pop() as ForParts;
+    var leftParen = pop() as Token;
+    var forToken = pop() as Token;
 
     push(ast.forStatement(
       forKeyword: forToken,
       leftParenthesis: leftParen,
       forLoopParts: forLoopParts,
-      rightParenthesis: leftParen.endGroup,
+      rightParenthesis: leftParen.endGroup!,
       body: body,
     ));
   }
@@ -1481,9 +1494,9 @@
     // as possible.
     debugEvent("FunctionExpression");
 
-    FunctionBody body = pop();
-    FormalParameterList parameters = pop();
-    TypeParameterList typeParameters = pop();
+    var body = pop() as FunctionBody;
+    var parameters = pop() as FormalParameterList?;
+    var typeParameters = pop() as TypeParameterList?;
     push(ast.functionExpression(typeParameters, parameters, body));
   }
 
@@ -1493,16 +1506,16 @@
   }
 
   @override
-  void endFunctionType(Token functionToken, Token questionMark) {
+  void endFunctionType(Token functionToken, Token? questionMark) {
     assert(optional('Function', functionToken));
     debugEvent("FunctionType");
     if (!enableNonNullable) {
       reportErrorIfNullableType(questionMark);
     }
 
-    FormalParameterList parameters = pop();
-    TypeAnnotation returnType = pop();
-    TypeParameterList typeParameters = pop();
+    var parameters = pop() as FormalParameterList;
+    var returnType = pop() as TypeAnnotation?;
+    var typeParameters = pop() as TypeParameterList?;
     push(ast.genericFunctionType(
         returnType, functionToken, typeParameters, parameters,
         question: questionMark));
@@ -1510,19 +1523,19 @@
 
   @override
   void endFunctionTypeAlias(
-      Token typedefKeyword, Token equals, Token semicolon) {
+      Token typedefKeyword, Token? equals, Token semicolon) {
     assert(optional('typedef', typedefKeyword));
     assert(optionalOrNull('=', equals));
     assert(optional(';', semicolon));
     debugEvent("FunctionTypeAlias");
 
     if (equals == null) {
-      FormalParameterList parameters = pop();
-      TypeParameterList typeParameters = pop();
-      SimpleIdentifier name = pop();
-      TypeAnnotation returnType = pop();
-      List<Annotation> metadata = pop();
-      Comment comment = _findComment(metadata, typedefKeyword);
+      var parameters = pop() as FormalParameterList?;
+      var typeParameters = pop() as TypeParameterList?;
+      var name = pop() as SimpleIdentifier;
+      var returnType = pop() as TypeAnnotation?;
+      var metadata = pop() as List<Annotation>?;
+      var comment = _findComment(metadata, typedefKeyword);
 
       // TODO(scheglov) https://github.com/dart-lang/sdk/issues/41023
       if (parameters == null) {
@@ -1532,11 +1545,11 @@
       declarations.add(ast.functionTypeAlias(comment, metadata, typedefKeyword,
           returnType, name, typeParameters, parameters, semicolon));
     } else {
-      TypeAnnotation type = pop();
-      TypeParameterList templateParameters = pop();
-      SimpleIdentifier name = pop();
-      List<Annotation> metadata = pop();
-      Comment comment = _findComment(metadata, typedefKeyword);
+      var type = pop() as TypeAnnotation;
+      var templateParameters = pop() as TypeParameterList?;
+      var name = pop() as SimpleIdentifier;
+      var metadata = pop() as List<Annotation>?;
+      var comment = _findComment(metadata, typedefKeyword);
       if (type is! GenericFunctionType && !enableNonFunctionTypeAliases) {
         handleRecoverableError(messageTypedefNotFunction, equals, equals);
       }
@@ -1546,20 +1559,22 @@
   }
 
   @override
-  void endFunctionTypedFormalParameter(Token nameToken, Token question) {
+  void endFunctionTypedFormalParameter(Token nameToken, Token? question) {
     debugEvent("FunctionTypedFormalParameter");
     if (!enableNonNullable) {
       reportErrorIfNullableType(question);
     }
 
-    FormalParameterList formalParameters = pop();
-    TypeAnnotation returnType = pop();
-    TypeParameterList typeParameters = pop();
+    var formalParameters = pop() as FormalParameterList;
+    var returnType = pop() as TypeAnnotation?;
+    var typeParameters = pop() as TypeParameterList?;
 
     // Create a temporary formal parameter that will be dissected later in
     // [endFormalParameter].
     push(ast.functionTypedFormalParameter2(
-        identifier: null,
+        identifier: ast.simpleIdentifier(
+          StringToken(TokenType.IDENTIFIER, '', 0),
+        ),
         returnType: returnType,
         typeParameters: typeParameters,
         parameters: formalParameters,
@@ -1571,37 +1586,37 @@
     assert(optional('hide', hideKeyword));
     debugEvent("Hide");
 
-    List<SimpleIdentifier> hiddenNames = pop();
+    var hiddenNames = pop() as List<SimpleIdentifier>;
     push(ast.hideCombinator(hideKeyword, hiddenNames));
   }
 
   @override
   void endIfControlFlow(Token token) {
-    CollectionElement thenElement = pop();
-    ParenthesizedExpression condition = pop();
-    Token ifToken = pop();
+    var thenElement = pop() as CollectionElement;
+    var condition = pop() as ParenthesizedExpression;
+    var ifToken = pop() as Token;
     pushIfControlFlowInfo(ifToken, condition, thenElement, null, null);
   }
 
   @override
   void endIfElseControlFlow(Token token) {
-    CollectionElement elseElement = pop();
-    Token elseToken = pop();
-    CollectionElement thenElement = pop();
-    ParenthesizedExpression condition = pop();
-    Token ifToken = pop();
+    var elseElement = pop() as CollectionElement;
+    var elseToken = pop() as Token;
+    var thenElement = pop() as CollectionElement;
+    var condition = pop() as ParenthesizedExpression;
+    var ifToken = pop() as Token;
     pushIfControlFlowInfo(
         ifToken, condition, thenElement, elseToken, elseElement);
   }
 
   @override
-  void endIfStatement(Token ifToken, Token elseToken) {
+  void endIfStatement(Token ifToken, Token? elseToken) {
     assert(optional('if', ifToken));
     assert(optionalOrNull('else', elseToken));
 
-    Statement elsePart = popIfNotNull(elseToken);
-    Statement thenPart = pop();
-    ParenthesizedExpression condition = pop();
+    var elsePart = popIfNotNull(elseToken) as Statement?;
+    var thenPart = pop() as Statement;
+    var condition = pop() as ParenthesizedExpression;
     push(ast.ifStatement(
         ifToken,
         condition.leftParenthesis,
@@ -1620,19 +1635,19 @@
   }
 
   @override
-  void endImport(Token importKeyword, Token semicolon) {
+  void endImport(Token importKeyword, Token? semicolon) {
     assert(optional('import', importKeyword));
     assert(optionalOrNull(';', semicolon));
     debugEvent("Import");
 
-    List<Combinator> combinators = pop();
-    Token deferredKeyword = pop(NullValue.Deferred);
-    Token asKeyword = pop(NullValue.As);
-    SimpleIdentifier prefix = pop(NullValue.Prefix);
-    List<Configuration> configurations = pop();
-    StringLiteral uri = pop();
-    List<Annotation> metadata = pop();
-    Comment comment = _findComment(metadata, importKeyword);
+    var combinators = pop() as List<Combinator>?;
+    var deferredKeyword = pop(NullValue.Deferred) as Token?;
+    var asKeyword = pop(NullValue.As) as Token?;
+    var prefix = pop(NullValue.Prefix) as SimpleIdentifier?;
+    var configurations = pop() as List<Configuration>?;
+    var uri = pop() as StringLiteral;
+    var metadata = pop() as List<Annotation>?;
+    var comment = _findComment(metadata, importKeyword);
 
     directives.add(ast.importDirective(
         comment,
@@ -1644,14 +1659,14 @@
         asKeyword,
         prefix,
         combinators,
-        semicolon));
+        semicolon ?? Tokens.SEMICOLON));
   }
 
   @override
   void endInitializedIdentifier(Token nameToken) {
     debugEvent("InitializedIdentifier");
 
-    AstNode node = pop();
+    var node = pop() as AstNode?;
     VariableDeclaration variable;
     // TODO(paulberry): This seems kludgy.  It would be preferable if we
     // could respond to a "handleNoVariableInitializer" event by converting a
@@ -1676,14 +1691,14 @@
     assert(optional(':', colon));
     debugEvent("Initializers");
 
-    List<Object> initializerObjects = popTypedList(count) ?? const [];
+    var initializerObjects = popTypedList(count) ?? const [];
     if (!isFullAst) return;
 
     push(colon);
 
     var initializers = <ConstructorInitializer>[];
     for (Object initializerObject in initializerObjects) {
-      ConstructorInitializer initializer = buildInitializer(initializerObject);
+      var initializer = buildInitializer(initializerObject);
       if (initializer != null) {
         initializers.add(initializer);
       } else {
@@ -1705,7 +1720,7 @@
   }
 
   @override
-  void endInvalidYieldStatement(Token yieldKeyword, Token starToken,
+  void endInvalidYieldStatement(Token yieldKeyword, Token? starToken,
       Token endToken, MessageCode errorCode) {
     debugEvent("InvalidYieldStatement");
     endYieldStatement(yieldKeyword, starToken, endToken);
@@ -1720,8 +1735,8 @@
   void endLabeledStatement(int labelCount) {
     debugEvent("LabeledStatement");
 
-    Statement statement = pop();
-    List<Label> labels = popTypedList(labelCount);
+    var statement = pop() as Statement;
+    var labels = popTypedList2<Label>(labelCount);
     push(ast.labeledStatement(labels, statement));
   }
 
@@ -1731,10 +1746,10 @@
     assert(optional(';', semicolon));
     debugEvent("LibraryName");
 
-    List<SimpleIdentifier> libraryName = pop();
+    var libraryName = pop() as List<SimpleIdentifier>;
     var name = ast.libraryIdentifier(libraryName);
-    List<Annotation> metadata = pop();
-    Comment comment = _findComment(metadata, libraryKeyword);
+    var metadata = pop() as List<Annotation>?;
+    var comment = _findComment(metadata, libraryKeyword);
     directives.add(ast.libraryDirective(
         comment, metadata, libraryKeyword, name, semicolon));
   }
@@ -1744,13 +1759,13 @@
     debugEvent("endLiteralString");
 
     if (interpolationCount == 0) {
-      Token token = pop();
+      var token = pop() as Token;
       String value = unescapeString(token.lexeme, token, this);
       push(ast.simpleStringLiteral(token, value));
     } else {
-      List<Object> parts = popTypedList(1 + interpolationCount * 2);
-      Token first = parts.first;
-      Token last = parts.last;
+      var parts = popTypedList(1 + interpolationCount * 2)!;
+      var first = parts.first as Token;
+      var last = parts.last as Token;
       Quote quote = analyzeQuote(first.lexeme);
       List<InterpolationElement> elements = <InterpolationElement>[];
       elements.add(ast.interpolationString(
@@ -1783,24 +1798,24 @@
     assert(optional('#', hashToken));
     debugEvent("LiteralSymbol");
 
-    List<Token> components = popTypedList(tokenCount);
+    var components = popTypedList2<Token>(tokenCount);
     push(ast.symbolLiteral(hashToken, components));
   }
 
   @override
   void endLocalFunctionDeclaration(Token token) {
     debugEvent("LocalFunctionDeclaration");
-    FunctionBody body = pop();
+    var body = pop() as FunctionBody;
     if (isFullAst) {
       pop(); // constructor initializers
       pop(); // separator before constructor initializers
     }
-    FormalParameterList parameters = pop();
+    var parameters = pop() as FormalParameterList;
     checkFieldFormalParameters(parameters);
-    SimpleIdentifier name = pop();
-    TypeAnnotation returnType = pop();
-    TypeParameterList typeParameters = pop();
-    List<Annotation> metadata = pop(NullValue.Metadata);
+    var name = pop() as SimpleIdentifier;
+    var returnType = pop() as TypeAnnotation?;
+    var typeParameters = pop() as TypeParameterList?;
+    var metadata = pop(NullValue.Metadata) as List<Annotation>?;
     FunctionExpression functionExpression =
         ast.functionExpression(typeParameters, parameters, body);
     var functionDeclaration = ast.functionDeclaration(
@@ -1814,15 +1829,16 @@
   }
 
   @override
-  void endMetadata(Token atSign, Token periodBeforeName, Token endToken) {
+  void endMetadata(Token atSign, Token? periodBeforeName, Token endToken) {
     assert(optional('@', atSign));
     assert(optionalOrNull('.', periodBeforeName));
     debugEvent("Metadata");
 
-    MethodInvocation invocation = pop();
-    SimpleIdentifier constructorName = periodBeforeName != null ? pop() : null;
+    var invocation = pop() as MethodInvocation?;
+    var constructorName =
+        periodBeforeName != null ? pop() as SimpleIdentifier : null;
     pop(); // Type arguments, not allowed.
-    Identifier name = pop();
+    var name = pop() as Identifier;
     push(ast.annotation(atSign, name, periodBeforeName, constructorName,
         invocation?.argumentList));
   }
@@ -1835,8 +1851,8 @@
   }
 
   @override
-  void endMixinConstructor(Token getOrSet, Token beginToken, Token beginParam,
-      Token beginInitializers, Token endToken) {
+  void endMixinConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
     debugEvent("MixinConstructor");
     // TODO(danrubel) Decide how to handle constructor declarations within
     // mixins. They are invalid, but we include them in order to get navigation,
@@ -1861,12 +1877,12 @@
 
   @override
   void endMixinFields(
-      Token abstractToken,
-      Token externalToken,
-      Token staticToken,
-      Token covariantToken,
-      Token lateToken,
-      Token varFinalOrConst,
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
       int count,
       Token beginToken,
       Token endToken) {
@@ -1875,8 +1891,8 @@
   }
 
   @override
-  void endMixinMethod(Token getOrSet, Token beginToken, Token beginParam,
-      Token beginInitializers, Token endToken) {
+  void endMixinMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
     debugEvent("MixinMethod");
     endClassMethod(
         getOrSet, beginToken, beginParam, beginInitializers, endToken);
@@ -1885,40 +1901,40 @@
   @override
   void endNamedFunctionExpression(Token endToken) {
     debugEvent("NamedFunctionExpression");
-    FunctionBody body = pop();
+    var body = pop() as FunctionBody;
     if (isFullAst) {
       pop(); // constructor initializers
       pop(); // separator before constructor initializers
     }
-    FormalParameterList parameters = pop();
+    var parameters = pop() as FormalParameterList;
     pop(); // name
     pop(); // returnType
-    TypeParameterList typeParameters = pop();
+    var typeParameters = pop() as TypeParameterList?;
     push(ast.functionExpression(typeParameters, parameters, body));
   }
 
   @override
   void endNamedMixinApplication(Token beginToken, Token classKeyword,
-      Token equalsToken, Token implementsKeyword, Token semicolon) {
+      Token equalsToken, Token? implementsKeyword, Token semicolon) {
     assert(optional('class', classKeyword));
     assert(optionalOrNull('=', equalsToken));
     assert(optionalOrNull('implements', implementsKeyword));
     assert(optional(';', semicolon));
     debugEvent("NamedMixinApplication");
 
-    ImplementsClause implementsClause;
+    ImplementsClause? implementsClause;
     if (implementsKeyword != null) {
-      List<TypeName> interfaces = pop();
+      var interfaces = pop() as List<TypeName>;
       implementsClause = ast.implementsClause(implementsKeyword, interfaces);
     }
-    WithClause withClause = pop(NullValue.WithClause);
-    TypeName superclass = pop();
-    _Modifiers modifiers = pop();
-    TypeParameterList typeParameters = pop();
-    SimpleIdentifier name = pop();
-    Token abstractKeyword = modifiers?.abstractKeyword;
-    List<Annotation> metadata = pop();
-    Comment comment = _findComment(metadata, beginToken);
+    var withClause = pop(NullValue.WithClause) as WithClause;
+    var superclass = pop() as TypeName;
+    var modifiers = pop() as _Modifiers?;
+    var typeParameters = pop() as TypeParameterList?;
+    var name = pop() as SimpleIdentifier;
+    var abstractKeyword = modifiers?.abstractKeyword;
+    var metadata = pop() as List<Annotation>?;
+    var comment = _findComment(metadata, beginToken);
     declarations.add(ast.classTypeAlias(
         comment,
         metadata,
@@ -1949,7 +1965,7 @@
     debugEvent("OptionalFormalParameters");
 
     push(_OptionalFormalParameters(
-        popTypedList(count), leftDelimeter, rightDelimeter));
+        popTypedList2<FormalParameter>(count), leftDelimeter, rightDelimeter));
   }
 
   @override
@@ -1958,9 +1974,9 @@
     assert(optional(';', semicolon));
     debugEvent("Part");
 
-    StringLiteral uri = pop();
-    List<Annotation> metadata = pop();
-    Comment comment = _findComment(metadata, partKeyword);
+    var uri = pop() as StringLiteral;
+    var metadata = pop() as List<Annotation>?;
+    var comment = _findComment(metadata, partKeyword);
     directives
         .add(ast.partDirective(comment, metadata, partKeyword, uri, semicolon));
   }
@@ -1973,15 +1989,15 @@
     assert(optional(';', semicolon));
     debugEvent("PartOf");
     var libraryNameOrUri = pop();
-    LibraryIdentifier name;
-    StringLiteral uri;
+    LibraryIdentifier? name;
+    StringLiteral? uri;
     if (libraryNameOrUri is StringLiteral) {
       uri = libraryNameOrUri;
     } else {
       name = ast.libraryIdentifier(libraryNameOrUri as List<SimpleIdentifier>);
     }
-    List<Annotation> metadata = pop();
-    Comment comment = _findComment(metadata, partKeyword);
+    var metadata = pop() as List<Annotation>?;
+    var comment = _findComment(metadata, partKeyword);
     directives.add(ast.partOfDirective(
         comment, metadata, partKeyword, ofKeyword, uri, name, semicolon));
   }
@@ -1991,9 +2007,9 @@
     assert(optional('=', equalToken));
     debugEvent("RedirectingFactoryBody");
 
-    ConstructorName constructorName = pop();
-    Token starToken = pop();
-    Token asyncToken = pop();
+    var constructorName = pop() as ConstructorName;
+    var starToken = pop() as Token?;
+    var asyncToken = pop() as Token?;
     push(_RedirectingFactoryBody(
         asyncToken, starToken, equalToken, constructorName));
   }
@@ -2016,7 +2032,7 @@
     assert(optional(';', semicolon));
     debugEvent("ReturnStatement");
 
-    Expression expression = hasExpression ? pop() : null;
+    var expression = hasExpression ? pop() as Expression : null;
     push(ast.returnStatement(returnKeyword, expression, semicolon));
   }
 
@@ -2025,7 +2041,7 @@
     assert(optional('show', showKeyword));
     debugEvent("Show");
 
-    List<SimpleIdentifier> shownNames = pop();
+    var shownNames = pop() as List<SimpleIdentifier>;
     push(ast.showCombinator(showKeyword, shownNames));
   }
 
@@ -2035,9 +2051,9 @@
     assert(optional('}', rightBracket));
     debugEvent("SwitchBlock");
 
-    List<List<SwitchMember>> membersList = popTypedList(caseCount);
+    var membersList = popTypedList2<List<SwitchMember>>(caseCount);
     List<SwitchMember> members =
-        membersList?.expand((members) => members)?.toList() ?? <SwitchMember>[];
+        membersList.expand((members) => members).toList();
 
     Set<String> labels = <String>{};
     for (SwitchMember member in members) {
@@ -2061,51 +2077,52 @@
   void endSwitchCase(
       int labelCount,
       int expressionCount,
-      Token defaultKeyword,
-      Token colonAfterDefault,
+      Token? defaultKeyword,
+      Token? colonAfterDefault,
       int statementCount,
       Token firstToken,
       Token endToken) {
     assert(optionalOrNull('default', defaultKeyword));
     assert(defaultKeyword == null
         ? colonAfterDefault == null
-        : optional(':', colonAfterDefault));
+        : optional(':', colonAfterDefault!));
     debugEvent("SwitchCase");
 
-    List<Statement> statements = popTypedList(statementCount);
-    List<SwitchMember> members;
+    var statements = popTypedList2<Statement>(statementCount);
+    List<SwitchMember?> members;
 
     if (labelCount == 0 && defaultKeyword == null) {
       // Common situation: case with no default and no labels.
-      members = popTypedList<SwitchMember>(expressionCount) ?? [];
+      members = popTypedList2<SwitchMember>(expressionCount);
     } else {
       // Labels and case statements may be intertwined
       if (defaultKeyword != null) {
         SwitchDefault member = ast.switchDefault(
-            <Label>[], defaultKeyword, colonAfterDefault, <Statement>[]);
+            <Label>[], defaultKeyword, colonAfterDefault!, <Statement>[]);
         while (peek() is Label) {
-          member.labels.insert(0, pop());
+          member.labels.insert(0, pop() as Label);
           --labelCount;
         }
-        members = List<SwitchMember>.filled(expressionCount + 1, null);
+        members = List<SwitchMember?>.filled(expressionCount + 1, null);
         members[expressionCount] = member;
       } else {
-        members = List<SwitchMember>.filled(expressionCount, null);
+        members = List<SwitchMember?>.filled(expressionCount, null);
       }
       for (int index = expressionCount - 1; index >= 0; --index) {
-        SwitchMember member = pop();
+        var member = pop() as SwitchMember;
         while (peek() is Label) {
-          member.labels.insert(0, pop());
+          member.labels.insert(0, pop() as Label);
           --labelCount;
         }
         members[index] = member;
       }
       assert(labelCount == 0);
     }
-    if (members.isNotEmpty) {
-      members.last.statements.addAll(statements);
+    var members2 = members.whereNotNull().toList();
+    if (members2.isNotEmpty) {
+      members2.last.statements.addAll(statements);
     }
-    push(members);
+    push(members2);
   }
 
   @override
@@ -2113,10 +2130,10 @@
     assert(optional('switch', switchKeyword));
     debugEvent("SwitchStatement");
 
-    Token rightBracket = pop();
-    List<SwitchMember> members = pop();
-    Token leftBracket = pop();
-    ParenthesizedExpression expression = pop();
+    var rightBracket = pop() as Token;
+    var members = pop() as List<SwitchMember>;
+    var leftBracket = pop() as Token;
+    var expression = pop() as ParenthesizedExpression;
     push(ast.switchStatement(
         switchKeyword,
         expression.leftParenthesis,
@@ -2139,11 +2156,11 @@
 
   @override
   void endTopLevelFields(
-      Token externalToken,
-      Token staticToken,
-      Token covariantToken,
-      Token lateToken,
-      Token varFinalOrConst,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
       int count,
       Token beginToken,
       Token semicolon) {
@@ -2160,23 +2177,23 @@
       }
     }
 
-    List<VariableDeclaration> variables = popTypedList(count);
-    TypeAnnotation type = pop();
+    var variables = popTypedList2<VariableDeclaration>(count);
+    var type = pop() as TypeAnnotation?;
     var variableList = ast.variableDeclarationList2(
       lateKeyword: lateToken,
       keyword: varFinalOrConst,
       type: type,
       variables: variables,
     );
-    List<Annotation> metadata = pop();
-    Comment comment = _findComment(metadata, beginToken);
+    var metadata = pop() as List<Annotation>?;
+    var comment = _findComment(metadata, beginToken);
     declarations.add(ast.topLevelVariableDeclaration(
         comment, metadata, variableList, semicolon,
         externalKeyword: externalToken));
   }
 
   @override
-  void endTopLevelMethod(Token beginToken, Token getOrSet, Token endToken) {
+  void endTopLevelMethod(Token beginToken, Token? getOrSet, Token endToken) {
     // TODO(paulberry): set up scopes properly to resolve parameters and type
     // variables.
     assert(getOrSet == null ||
@@ -2184,15 +2201,15 @@
         optional('set', getOrSet));
     debugEvent("TopLevelMethod");
 
-    FunctionBody body = pop();
-    FormalParameterList parameters = pop();
-    TypeParameterList typeParameters = pop();
-    SimpleIdentifier name = pop();
-    TypeAnnotation returnType = pop();
-    _Modifiers modifiers = pop();
-    Token externalKeyword = modifiers?.externalKeyword;
-    List<Annotation> metadata = pop();
-    Comment comment = _findComment(metadata, beginToken);
+    var body = pop() as FunctionBody;
+    var parameters = pop() as FormalParameterList?;
+    var typeParameters = pop() as TypeParameterList?;
+    var name = pop() as SimpleIdentifier;
+    var returnType = pop() as TypeAnnotation?;
+    var modifiers = pop() as _Modifiers?;
+    var externalKeyword = modifiers?.externalKeyword;
+    var metadata = pop() as List<Annotation>?;
+    var comment = _findComment(metadata, beginToken);
     declarations.add(ast.functionDeclaration(
         comment,
         metadata,
@@ -2204,14 +2221,15 @@
   }
 
   @override
-  void endTryStatement(int catchCount, Token tryKeyword, Token finallyKeyword) {
+  void endTryStatement(
+      int catchCount, Token tryKeyword, Token? finallyKeyword) {
     assert(optional('try', tryKeyword));
     assert(optionalOrNull('finally', finallyKeyword));
     debugEvent("TryStatement");
 
-    Block finallyBlock = popIfNotNull(finallyKeyword);
-    List<CatchClause> catchClauses = popTypedList(catchCount);
-    Block body = pop();
+    var finallyBlock = popIfNotNull(finallyKeyword) as Block?;
+    var catchClauses = popTypedList2<CatchClause>(catchCount);
+    var body = pop() as Block;
     push(ast.tryStatement(
         tryKeyword, body, catchClauses, finallyKeyword, finallyBlock));
   }
@@ -2222,7 +2240,7 @@
     assert(optional('>', rightBracket));
     debugEvent("TypeArguments");
 
-    List<TypeAnnotation> arguments = popTypedList(count);
+    var arguments = popTypedList2<TypeAnnotation>(count);
     push(ast.typeArgumentList(leftBracket, arguments, rightBracket));
   }
 
@@ -2234,7 +2252,7 @@
 
   @override
   void endTypeVariable(
-      Token token, int index, Token extendsOrSuper, Token variance) {
+      Token token, int index, Token? extendsOrSuper, Token? variance) {
     debugEvent("TypeVariable");
     assert(extendsOrSuper == null ||
         optional('extends', extendsOrSuper) ||
@@ -2249,10 +2267,10 @@
       reportVarianceModifierNotEnabled(variance);
     }
 
-    TypeAnnotation bound = pop();
+    var bound = pop() as TypeAnnotation?;
 
     // Peek to leave type parameters on top of stack.
-    List<TypeParameter> typeParameters = peek();
+    var typeParameters = peek() as List<TypeParameter>;
 
     // TODO (kallentu) : Clean up TypeParameterImpl casting once variance is
     // added to the interface.
@@ -2268,7 +2286,7 @@
     assert(optional('>', endToken));
     debugEvent("TypeVariables");
 
-    List<TypeParameter> typeParameters = pop();
+    var typeParameters = pop() as List<TypeParameter>;
     push(ast.typeParameterList(beginToken, typeParameters, endToken));
   }
 
@@ -2277,24 +2295,25 @@
     assert(optionalOrNull('=', assignmentOperator));
     debugEvent("VariableInitializer");
 
-    Expression initializer = pop();
-    SimpleIdentifier identifier = pop();
+    var initializer = pop() as Expression;
+    var identifier = pop() as SimpleIdentifier;
     // TODO(ahe): Don't push initializers, instead install them.
     push(_makeVariableDeclaration(identifier, assignmentOperator, initializer));
   }
 
   @override
-  void endVariablesDeclaration(int count, Token semicolon) {
+  void endVariablesDeclaration(int count, Token? semicolon) {
     assert(optionalOrNull(';', semicolon));
     debugEvent("VariablesDeclaration");
 
-    List<VariableDeclaration> variables = popTypedList(count);
-    _Modifiers modifiers = pop(NullValue.Modifiers);
-    TypeAnnotation type = pop();
-    Token keyword = modifiers?.finalConstOrVarKeyword;
-    List<Annotation> metadata = pop();
-    Comment comment = _findComment(metadata,
-        variables[0].beginToken ?? type?.beginToken ?? modifiers.beginToken);
+    var variables = popTypedList2<VariableDeclaration>(count);
+    var modifiers = pop(NullValue.Modifiers) as _Modifiers?;
+    var type = pop() as TypeAnnotation?;
+    var keyword = modifiers?.finalConstOrVarKeyword;
+    var metadata = pop() as List<Annotation>?;
+    var comment = _findComment(metadata, variables[0].beginToken);
+    // var comment = _findComment(metadata,
+    //     variables[0].beginToken ?? type?.beginToken ?? modifiers.beginToken);
     push(ast.variableDeclarationStatement(
         ast.variableDeclarationList2(
           comment: comment,
@@ -2304,7 +2323,7 @@
           type: type,
           variables: variables,
         ),
-        semicolon));
+        semicolon ?? Tokens.SEMICOLON));
   }
 
   @override
@@ -2312,8 +2331,8 @@
     assert(optional('while', whileKeyword));
     debugEvent("WhileStatement");
 
-    Statement body = pop();
-    ParenthesizedExpression condition = pop();
+    var body = pop() as Statement;
+    var condition = pop() as ParenthesizedExpression;
     push(ast.whileStatement(whileKeyword, condition.leftParenthesis,
         condition.expression, condition.rightParenthesis, body));
   }
@@ -2324,13 +2343,13 @@
   }
 
   @override
-  void endYieldStatement(Token yieldToken, Token starToken, Token semicolon) {
+  void endYieldStatement(Token yieldToken, Token? starToken, Token semicolon) {
     assert(optional('yield', yieldToken));
     assert(optionalOrNull('*', starToken));
     assert(optional(';', semicolon));
     debugEvent("YieldStatement");
 
-    Expression expression = pop();
+    var expression = pop() as Expression;
     push(ast.yieldStatement(yieldToken, starToken, expression, semicolon));
   }
 
@@ -2339,8 +2358,8 @@
     assert(optional('as', asOperator));
     debugEvent("AsOperator");
 
-    TypeAnnotation type = pop();
-    Expression expression = pop();
+    var type = pop() as TypeAnnotation;
+    var expression = pop() as Expression;
     push(ast.asExpression(expression, asOperator, type));
   }
 
@@ -2349,8 +2368,8 @@
     assert(token.type.isAssignmentOperator);
     debugEvent("AssignmentExpression");
 
-    Expression rhs = pop();
-    Expression lhs = pop();
+    var rhs = pop() as Expression;
+    var lhs = pop() as Expression;
     if (!lhs.isAssignable) {
       // TODO(danrubel): Update the BodyBuilder to report this error.
       handleRecoverableError(
@@ -2371,7 +2390,7 @@
   }
 
   @override
-  void handleAsyncModifier(Token asyncToken, Token starToken) {
+  void handleAsyncModifier(Token? asyncToken, Token? starToken) {
     assert(asyncToken == null ||
         optional('async', asyncToken) ||
         optional('sync', asyncToken));
@@ -2389,7 +2408,7 @@
     assert(optional(';', semicolon));
     debugEvent("BreakStatement");
 
-    SimpleIdentifier label = hasTarget ? pop() : null;
+    var label = hasTarget ? pop() as SimpleIdentifier : null;
     push(ast.breakStatement(breakKeyword, label, semicolon));
   }
 
@@ -2399,23 +2418,23 @@
     assert(optional(':', colon));
     debugEvent("CaseMatch");
 
-    Expression expression = pop();
+    var expression = pop() as Expression;
     push(ast.switchCase(
         <Label>[], caseKeyword, expression, colon, <Statement>[]));
   }
 
   @override
-  void handleCatchBlock(Token onKeyword, Token catchKeyword, Token comma) {
+  void handleCatchBlock(Token? onKeyword, Token? catchKeyword, Token? comma) {
     assert(optionalOrNull('on', onKeyword));
     assert(optionalOrNull('catch', catchKeyword));
     assert(optionalOrNull(',', comma));
     debugEvent("CatchBlock");
 
-    Block body = pop();
-    FormalParameterList catchParameterList = popIfNotNull(catchKeyword);
-    TypeAnnotation type = popIfNotNull(onKeyword);
-    SimpleIdentifier exception;
-    SimpleIdentifier stackTrace;
+    var body = pop() as Block;
+    var catchParameterList = popIfNotNull(catchKeyword) as FormalParameterList?;
+    var type = popIfNotNull(onKeyword) as TypeAnnotation?;
+    SimpleIdentifier? exception;
+    SimpleIdentifier? stackTrace;
     if (catchParameterList != null) {
       List<FormalParameter> catchParameters = catchParameterList.parameters;
       if (catchParameters.isNotEmpty) {
@@ -2438,7 +2457,7 @@
   }
 
   @override
-  void handleClassExtends(Token extendsKeyword, int typeCount) {
+  void handleClassExtends(Token? extendsKeyword, int typeCount) {
     assert(extendsKeyword == null || extendsKeyword.isKeywordOrIdentifier);
     debugEvent("ClassExtends");
 
@@ -2448,34 +2467,34 @@
       pop();
       typeCount--;
     }
-    TypeName supertype = pop();
+    var supertype = pop() as TypeName?;
     if (supertype != null) {
-      push(ast.extendsClause(extendsKeyword, supertype));
+      push(ast.extendsClause(extendsKeyword!, supertype));
     } else {
       push(NullValue.ExtendsClause);
     }
   }
 
   @override
-  void handleClassHeader(Token begin, Token classKeyword, Token nativeToken) {
+  void handleClassHeader(Token begin, Token classKeyword, Token? nativeToken) {
     assert(optional('class', classKeyword));
     assert(optionalOrNull('native', nativeToken));
     assert(classDeclaration == null && mixinDeclaration == null);
     debugEvent("ClassHeader");
 
-    NativeClause nativeClause;
+    NativeClause? nativeClause;
     if (nativeToken != null) {
       nativeClause = ast.nativeClause(nativeToken, nativeName);
     }
-    ImplementsClause implementsClause = pop(NullValue.IdentifierList);
-    WithClause withClause = pop(NullValue.WithClause);
-    ExtendsClause extendsClause = pop(NullValue.ExtendsClause);
-    _Modifiers modifiers = pop();
-    TypeParameterList typeParameters = pop();
-    SimpleIdentifier name = pop();
-    Token abstractKeyword = modifiers?.abstractKeyword;
-    List<Annotation> metadata = pop();
-    Comment comment = _findComment(metadata, begin);
+    var implementsClause = pop(NullValue.IdentifierList) as ImplementsClause?;
+    var withClause = pop(NullValue.WithClause) as WithClause?;
+    var extendsClause = pop(NullValue.ExtendsClause) as ExtendsClause?;
+    var modifiers = pop() as _Modifiers?;
+    var typeParameters = pop() as TypeParameterList?;
+    var name = pop() as SimpleIdentifier;
+    var abstractKeyword = modifiers?.abstractKeyword;
+    var metadata = pop() as List<Annotation>?;
+    var comment = _findComment(metadata, begin);
     // leftBracket, members, and rightBracket
     // are set in [endClassOrMixinBody].
     classDeclaration = ast.classDeclaration(
@@ -2488,14 +2507,13 @@
       extendsClause,
       withClause,
       implementsClause,
-      null,
-      // leftBracket
+      Tokens.OPEN_CURLY_BRACKET, // leftBracket
       <ClassMember>[],
-      null, // rightBracket
-    );
+      Tokens.CLOSE_CURLY_BRACKET, // rightBracket
+    ) as ClassDeclarationImpl;
 
-    classDeclaration.nativeClause = nativeClause;
-    declarations.add(classDeclaration);
+    classDeclaration!.nativeClause = nativeClause;
+    declarations.add(classDeclaration!);
   }
 
   @override
@@ -2505,12 +2523,12 @@
 
   @override
   void handleClassOrMixinImplements(
-      Token implementsKeyword, int interfacesCount) {
+      Token? implementsKeyword, int interfacesCount) {
     assert(optionalOrNull('implements', implementsKeyword));
     debugEvent("ClassImplements");
 
     if (implementsKeyword != null) {
-      List<TypeName> interfaces = popTypedList(interfacesCount);
+      var interfaces = popTypedList2<TypeName>(interfacesCount);
       push(ast.implementsClause(implementsKeyword, interfaces));
     } else {
       push(NullValue.IdentifierList);
@@ -2520,17 +2538,17 @@
   @override
   void handleClassWithClause(Token withKeyword) {
     assert(optional('with', withKeyword));
-    List<TypeName> mixinTypes = pop();
+    var mixinTypes = pop() as List<TypeName>;
     push(ast.withClause(withKeyword, mixinTypes));
   }
 
   @override
   void handleCommentReference(
-      Token newKeyword, Token prefix, Token period, Token token) {
+      Token? newKeyword, Token? prefix, Token? period, Token token) {
     Identifier identifier = ast.simpleIdentifier(token);
     if (prefix != null) {
-      identifier = ast.prefixedIdentifier(
-          ast.simpleIdentifier(prefix), period, identifier);
+      identifier = ast.prefixedIdentifier(ast.simpleIdentifier(prefix), period!,
+          identifier as SimpleIdentifier);
     }
     push(ast.commentReference(newKeyword, identifier));
   }
@@ -2548,7 +2566,7 @@
     assert(optional(';', semicolon));
     debugEvent("ContinueStatement");
 
-    SimpleIdentifier label = hasTarget ? pop() : null;
+    var label = hasTarget ? pop() as SimpleIdentifier : null;
     push(ast.continueStatement(continueKeyword, label, semicolon));
   }
 
@@ -2557,7 +2575,7 @@
     assert(firstIdentifier.isIdentifier);
     debugEvent("DottedName");
 
-    List<SimpleIdentifier> components = popTypedList(count);
+    var components = popTypedList2<SimpleIdentifier>(count);
     push(ast.dottedName(components));
   }
 
@@ -2591,19 +2609,19 @@
   }
 
   @override
-  void handleExpressionFunctionBody(Token arrowToken, Token semicolon) {
+  void handleExpressionFunctionBody(Token arrowToken, Token? semicolon) {
     assert(optional('=>', arrowToken) || optional('=', arrowToken));
     assert(optionalOrNull(';', semicolon));
     debugEvent("ExpressionFunctionBody");
 
-    Expression expression = pop();
+    var expression = pop() as Expression;
     pop(); // star (*)
-    Token asyncKeyword = pop();
+    var asyncKeyword = pop() as Token?;
     if (parseFunctionBodies) {
       push(ast.expressionFunctionBody(
           asyncKeyword, arrowToken, expression, semicolon));
     } else {
-      push(ast.emptyFunctionBody(semicolon));
+      push(ast.emptyFunctionBody(semicolon!));
     }
   }
 
@@ -2611,10 +2629,10 @@
   void handleExpressionStatement(Token semicolon) {
     assert(optional(';', semicolon));
     debugEvent("ExpressionStatement");
-    Expression expression = pop();
+    var expression = pop() as Expression;
     reportErrorIfSuper(expression);
     if (expression is SimpleIdentifier &&
-        expression.token?.keyword?.isBuiltInOrPseudo == false) {
+        expression.token.keyword?.isBuiltInOrPseudo == false) {
       // This error is also reported by the body builder.
       handleRecoverableError(
           messageExpectedStatement, expression.beginToken, expression.endToken);
@@ -2654,15 +2672,15 @@
   }
 
   @override
-  void handleForInLoopParts(Token awaitToken, Token forToken,
+  void handleForInLoopParts(Token? awaitToken, Token forToken,
       Token leftParenthesis, Token inKeyword) {
     assert(optionalOrNull('await', awaitToken));
     assert(optional('for', forToken));
     assert(optional('(', leftParenthesis));
     assert(optional('in', inKeyword) || optional(':', inKeyword));
 
-    Expression iterator = pop();
-    Object variableOrDeclaration = pop();
+    var iterator = pop() as Expression;
+    var variableOrDeclaration = pop()!;
 
     ForEachParts forLoopParts;
     if (variableOrDeclaration is VariableDeclarationStatement) {
@@ -2680,10 +2698,10 @@
     } else {
       if (variableOrDeclaration is! SimpleIdentifier) {
         // Parser has already reported the error.
-        if (!leftParenthesis.next.isIdentifier) {
+        if (!leftParenthesis.next!.isIdentifier) {
           parser.rewriter.insertSyntheticIdentifier(leftParenthesis);
         }
-        variableOrDeclaration = ast.simpleIdentifier(leftParenthesis.next);
+        variableOrDeclaration = ast.simpleIdentifier(leftParenthesis.next!);
       }
       forLoopParts = ast.forEachPartsWithIdentifier(
         identifier: variableOrDeclaration,
@@ -2706,15 +2724,15 @@
     assert(optional(';', leftSeparator));
     assert(updateExpressionCount >= 0);
 
-    List<Expression> updates = popTypedList(updateExpressionCount);
-    Statement conditionStatement = pop();
-    Object initializerPart = pop();
+    var updates = popTypedList2<Expression>(updateExpressionCount);
+    var conditionStatement = pop() as Statement;
+    var initializerPart = pop();
 
-    Expression condition;
+    Expression? condition;
     Token rightSeparator;
     if (conditionStatement is ExpressionStatement) {
       condition = conditionStatement.expression;
-      rightSeparator = conditionStatement.semicolon;
+      rightSeparator = conditionStatement.semicolon!;
     } else {
       rightSeparator = (conditionStatement as EmptyStatement).semicolon;
     }
@@ -2730,7 +2748,7 @@
       );
     } else {
       forLoopParts = ast.forPartsWithExpression(
-        initialization: initializerPart as Expression,
+        initialization: initializerPart as Expression?,
         leftSeparator: leftSeparator,
         condition: condition,
         rightSeparator: rightSeparator,
@@ -2769,8 +2787,8 @@
         push(identifier);
       }
     } else if (context == IdentifierContext.enumValueDeclaration) {
-      List<Annotation> metadata = pop();
-      Comment comment = _findComment(metadata, token);
+      var metadata = pop() as List<Annotation>?;
+      var comment = _findComment(metadata, token);
       push(ast.enumConstantDeclaration(comment, metadata, identifier));
     } else {
       push(identifier);
@@ -2785,7 +2803,7 @@
   }
 
   @override
-  void handleImportPrefix(Token deferredKeyword, Token asKeyword) {
+  void handleImportPrefix(Token? deferredKeyword, Token? asKeyword) {
     assert(optionalOrNull('deferred', deferredKeyword));
     assert(optionalOrNull('as', asKeyword));
     debugEvent("ImportPrefix");
@@ -2803,7 +2821,7 @@
 
   @override
   void handleIndexedExpression(
-      Token question, Token leftBracket, Token rightBracket) {
+      Token? question, Token leftBracket, Token rightBracket) {
     assert(optional('[', leftBracket) ||
         (enableNonNullable && optional('?.[', leftBracket)));
     assert(optional(']', rightBracket));
@@ -2813,11 +2831,11 @@
       reportErrorIfNullableType(question);
     }
 
-    Expression index = pop();
-    Expression target = pop();
+    var index = pop() as Expression;
+    var target = pop() as Expression?;
     if (target == null) {
-      CascadeExpression receiver = pop();
-      Token token = peek();
+      var receiver = pop() as CascadeExpression;
+      var token = peek() as Token;
       push(receiver);
       IndexExpression expression = ast.indexExpressionForCascade2(
           period: token,
@@ -2838,8 +2856,8 @@
   }
 
   @override
-  void handleInterpolationExpression(Token leftBracket, Token rightBracket) {
-    Expression expression = pop();
+  void handleInterpolationExpression(Token leftBracket, Token? rightBracket) {
+    var expression = pop() as Expression;
     push(ast.interpolationExpression(leftBracket, expression, rightBracket));
   }
 
@@ -2851,11 +2869,11 @@
   @override
   void handleInvalidFunctionBody(Token leftBracket) {
     assert(optional('{', leftBracket));
-    assert(optional('}', leftBracket.endGroup));
+    assert(optional('}', leftBracket.endGroup!));
     debugEvent("InvalidFunctionBody");
-    Block block = ast.block(leftBracket, [], leftBracket.endGroup);
-    Token star = pop();
-    Token asyncKeyword = pop();
+    Block block = ast.block(leftBracket, [], leftBracket.endGroup!);
+    var star = pop() as Token?;
+    var asyncKeyword = pop() as Token?;
     push(ast.blockFunctionBody(asyncKeyword, star, block));
   }
 
@@ -2893,7 +2911,7 @@
 
   @override
   void handleInvalidTypeArguments(Token token) {
-    TypeArgumentList invalidTypeArgs = pop();
+    var invalidTypeArgs = pop() as TypeArgumentList;
     var node = pop();
     if (node is ConstructorName) {
       push(_ConstructorNameWithInvalidTypeArgs(node, invalidTypeArgs));
@@ -2904,13 +2922,13 @@
   }
 
   @override
-  void handleIsOperator(Token isOperator, Token not) {
+  void handleIsOperator(Token isOperator, Token? not) {
     assert(optional('is', isOperator));
     assert(optionalOrNull('!', not));
     debugEvent("IsOperator");
 
-    TypeAnnotation type = pop();
-    Expression expression = pop();
+    var type = pop() as TypeAnnotation;
+    var expression = pop() as Expression;
     push(ast.isExpression(expression, isOperator, not, type));
   }
 
@@ -2919,7 +2937,7 @@
     assert(optionalOrNull(':', colon));
     debugEvent("Label");
 
-    SimpleIdentifier name = pop();
+    var name = pop() as SimpleIdentifier;
     push(ast.label(name, colon));
   }
 
@@ -2951,7 +2969,7 @@
 
   @override
   void handleLiteralList(
-      int count, Token leftBracket, Token constKeyword, Token rightBracket) {
+      int count, Token leftBracket, Token? constKeyword, Token rightBracket) {
     assert(optional('[', leftBracket));
     assert(optionalOrNull('const', constKeyword));
     assert(optional(']', rightBracket));
@@ -2959,7 +2977,7 @@
 
     if (enableControlFlowCollections || enableSpreadCollections) {
       List<CollectionElement> elements = popCollectionElements(count);
-      TypeArgumentList typeArguments = pop();
+      var typeArguments = pop() as TypeArgumentList?;
 
       // TODO(danrubel): Remove this and _InvalidCollectionElement
       // once control flow and spread collection support is enabled by default
@@ -2968,15 +2986,13 @@
       push(ast.listLiteral(
           constKeyword, typeArguments, leftBracket, elements, rightBracket));
     } else {
-      List<dynamic> elements = popTypedList(count);
-      TypeArgumentList typeArguments = pop();
+      var elements = popTypedList<Expression>(count) ?? const [];
+      var typeArguments = pop() as TypeArgumentList?;
 
       List<Expression> expressions = <Expression>[];
-      if (elements != null) {
-        for (var elem in elements) {
-          if (elem is Expression) {
-            expressions.add(elem);
-          }
+      for (var elem in elements) {
+        if (elem is Expression) {
+          expressions.add(elem);
         }
       }
 
@@ -2990,8 +3006,8 @@
     assert(optional(':', colon));
     debugEvent("LiteralMapEntry");
 
-    Expression value = pop();
-    Expression key = pop();
+    var value = pop() as Expression;
+    var key = pop() as Expression;
     push(ast.mapLiteralEntry(key, colon, value));
   }
 
@@ -3007,7 +3023,7 @@
   void handleLiteralSetOrMap(
     int count,
     Token leftBrace,
-    Token constKeyword,
+    Token? constKeyword,
     Token rightBrace,
     // TODO(danrubel): hasSetEntry parameter exists for replicating existing
     // behavior and will be removed once unified collection has been enabled
@@ -3020,7 +3036,7 @@
       // once control flow and spread collection support is enabled by default
       elements.removeWhere((e) => e == _invalidCollectionElement);
 
-      TypeArgumentList typeArguments = pop();
+      var typeArguments = pop() as TypeArgumentList?;
       push(ast.setOrMapLiteral(
         constKeyword: constKeyword,
         typeArguments: typeArguments,
@@ -3029,16 +3045,16 @@
         rightBracket: rightBrace,
       ));
     } else {
-      List<dynamic> elements = popTypedList(count);
-      TypeArgumentList typeArguments = pop();
+      var elements = popTypedList(count);
+      var typeArguments = pop() as TypeArgumentList?;
 
       // Replicate existing behavior that has been removed from the parser.
       // This will be removed once control flow collections
       // and spread collections are enabled by default.
 
       // Determine if this is a set or map based on type args and content
-      final typeArgCount = typeArguments?.arguments?.length;
-      bool isSet = typeArgCount == 1
+      final typeArgCount = typeArguments?.arguments.length;
+      bool? isSet = typeArgCount == 1
           ? true
           : typeArgCount != null
               ? false
@@ -3075,7 +3091,7 @@
             if (elem is MapLiteralEntry) {
               mapEntries.add(elem);
             } else if (elem is Expression) {
-              Token next = elem.endToken.next;
+              Token next = elem.endToken.next!;
               int offset = next.offset;
               handleRecoverableError(
                   templateExpectedButGot.withArguments(':'), next, next);
@@ -3107,12 +3123,12 @@
         extensionDeclaration == null);
     debugEvent("MixinHeader");
 
-    ImplementsClause implementsClause = pop(NullValue.IdentifierList);
-    OnClause onClause = pop(NullValue.IdentifierList);
-    TypeParameterList typeParameters = pop();
-    SimpleIdentifier name = pop();
-    List<Annotation> metadata = pop();
-    Comment comment = _findComment(metadata, mixinKeyword);
+    var implementsClause = pop(NullValue.IdentifierList) as ImplementsClause?;
+    var onClause = pop(NullValue.IdentifierList) as OnClause?;
+    var typeParameters = pop() as TypeParameterList?;
+    var name = pop() as SimpleIdentifier;
+    var metadata = pop() as List<Annotation>?;
+    var comment = _findComment(metadata, mixinKeyword);
 
     mixinDeclaration = ast.mixinDeclaration(
       comment,
@@ -3122,21 +3138,20 @@
       typeParameters,
       onClause,
       implementsClause,
-      null,
-      // leftBracket
+      Tokens.OPEN_CURLY_BRACKET, // leftBracket
       <ClassMember>[],
-      null, // rightBracket
-    );
-    declarations.add(mixinDeclaration);
+      Tokens.CLOSE_CURLY_BRACKET, // rightBracket
+    ) as MixinDeclarationImpl;
+    declarations.add(mixinDeclaration!);
   }
 
   @override
-  void handleMixinOn(Token onKeyword, int typeCount) {
+  void handleMixinOn(Token? onKeyword, int typeCount) {
     assert(onKeyword == null || onKeyword.isKeywordOrIdentifier);
     debugEvent("MixinOn");
 
     if (onKeyword != null) {
-      List<TypeName> types = popTypedList(typeCount);
+      var types = popTypedList2<TypeName>(typeCount);
       push(ast.onClause(onKeyword, types));
     } else {
       push(NullValue.IdentifierList);
@@ -3148,15 +3163,15 @@
     assert(optional(':', colon));
     debugEvent("NamedArgument");
 
-    Expression expression = pop();
-    SimpleIdentifier name = pop();
+    var expression = pop() as Expression;
+    var name = pop() as SimpleIdentifier;
     push(ast.namedExpression(ast.label(name, colon), expression));
   }
 
   @override
   void handleNamedMixinApplicationWithClause(Token withKeyword) {
     assert(optionalOrNull('with', withKeyword));
-    List<TypeName> mixinTypes = pop();
+    var mixinTypes = pop() as List<TypeName>;
     push(ast.withClause(withKeyword, mixinTypes));
   }
 
@@ -3165,7 +3180,7 @@
     debugEvent("NativeClause");
 
     if (hasName) {
-      nativeName = pop(); // StringLiteral
+      nativeName = pop() as StringLiteral; // StringLiteral
     } else {
       nativeName = null;
     }
@@ -3194,7 +3209,7 @@
   void handleNoFieldInitializer(Token token) {
     debugEvent("NoFieldInitializer");
 
-    SimpleIdentifier name = pop();
+    var name = pop() as SimpleIdentifier;
     push(_makeVariableDeclaration(name, null, null));
   }
 
@@ -3213,7 +3228,7 @@
     if (!enableNonNullable) {
       reportNonNullAssertExpressionNotEnabled(bang);
     } else {
-      push(ast.postfixExpression(pop(), bang));
+      push(ast.postfixExpression(pop() as Expression, bang));
     }
   }
 
@@ -3251,16 +3266,16 @@
     assert(optional('(', leftParenthesis));
     debugEvent("ParenthesizedExpression");
 
-    Expression expression = pop();
+    var expression = pop() as Expression;
     push(ast.parenthesizedExpression(
-        leftParenthesis, expression, leftParenthesis?.endGroup));
+        leftParenthesis, expression, leftParenthesis.endGroup!));
   }
 
   @override
   void handleQualified(Token period) {
     assert(optional('.', period));
 
-    SimpleIdentifier identifier = pop();
+    var identifier = pop() as SimpleIdentifier;
     var prefix = pop();
     if (prefix is List) {
       // We're just accumulating components into a list.
@@ -3297,10 +3312,10 @@
   void handleRecoverClassHeader() {
     debugEvent("RecoverClassHeader");
 
-    ImplementsClause implementsClause = pop(NullValue.IdentifierList);
-    WithClause withClause = pop(NullValue.WithClause);
-    ExtendsClause extendsClause = pop(NullValue.ExtendsClause);
-    ClassDeclaration declaration = declarations.last;
+    var implementsClause = pop(NullValue.IdentifierList) as ImplementsClause?;
+    var withClause = pop(NullValue.WithClause) as WithClause?;
+    var extendsClause = pop(NullValue.ExtendsClause) as ExtendsClause?;
+    var declaration = declarations.last as ClassDeclaration;
     if (extendsClause != null) {
       if (declaration.extendsClause?.superclass == null) {
         declaration.extendsClause = extendsClause;
@@ -3310,31 +3325,31 @@
       if (declaration.withClause == null) {
         declaration.withClause = withClause;
       } else {
-        declaration.withClause.mixinTypes.addAll(withClause.mixinTypes);
+        declaration.withClause!.mixinTypes.addAll(withClause.mixinTypes);
       }
     }
     if (implementsClause != null) {
       if (declaration.implementsClause == null) {
         declaration.implementsClause = implementsClause;
       } else {
-        declaration.implementsClause.interfaces
+        declaration.implementsClause!.interfaces
             .addAll(implementsClause.interfaces);
       }
     }
   }
 
   @override
-  void handleRecoverImport(Token semicolon) {
+  void handleRecoverImport(Token? semicolon) {
     assert(optionalOrNull(';', semicolon));
     debugEvent("RecoverImport");
 
-    List<Combinator> combinators = pop();
-    Token deferredKeyword = pop(NullValue.Deferred);
-    Token asKeyword = pop(NullValue.As);
-    SimpleIdentifier prefix = pop(NullValue.Prefix);
-    List<Configuration> configurations = pop();
+    var combinators = pop() as List<Combinator>?;
+    var deferredKeyword = pop(NullValue.Deferred) as Token?;
+    var asKeyword = pop(NullValue.As) as Token?;
+    var prefix = pop(NullValue.Prefix) as SimpleIdentifier?;
+    var configurations = pop() as List<Configuration>?;
 
-    ImportDirective directive = directives.last;
+    var directive = directives.last as ImportDirective;
     if (combinators != null) {
       directive.combinators.addAll(combinators);
     }
@@ -3346,27 +3361,29 @@
     if (configurations != null) {
       directive.configurations.addAll(configurations);
     }
-    directive.semicolon = semicolon;
+    if (semicolon != null) {
+      directive.semicolon = semicolon;
+    }
   }
 
   @override
   void handleRecoverMixinHeader() {
-    ImplementsClause implementsClause = pop(NullValue.IdentifierList);
-    OnClause onClause = pop(NullValue.IdentifierList);
+    var implementsClause = pop(NullValue.IdentifierList) as ImplementsClause?;
+    var onClause = pop(NullValue.IdentifierList) as OnClause?;
 
     if (onClause != null) {
-      if (mixinDeclaration.onClause == null) {
-        mixinDeclaration.onClause = onClause;
+      if (mixinDeclaration!.onClause == null) {
+        mixinDeclaration!.onClause = onClause;
       } else {
-        mixinDeclaration.onClause.superclassConstraints
+        mixinDeclaration!.onClause!.superclassConstraints
             .addAll(onClause.superclassConstraints);
       }
     }
     if (implementsClause != null) {
-      if (mixinDeclaration.implementsClause == null) {
-        mixinDeclaration.implementsClause = implementsClause;
+      if (mixinDeclaration!.implementsClause == null) {
+        mixinDeclaration!.implementsClause = implementsClause;
       } else {
-        mixinDeclaration.implementsClause.interfaces
+        mixinDeclaration!.implementsClause!.interfaces
             .addAll(implementsClause.interfaces);
       }
     }
@@ -3384,8 +3401,8 @@
   void handleSend(Token beginToken, Token endToken) {
     debugEvent("Send");
 
-    MethodInvocation arguments = pop();
-    TypeArgumentList typeArguments = pop();
+    var arguments = pop() as MethodInvocation?;
+    var typeArguments = pop() as TypeArgumentList?;
     if (arguments != null) {
       doInvocation(typeArguments, arguments);
     } else {
@@ -3395,7 +3412,7 @@
 
   @override
   void handleSpreadExpression(Token spreadToken) {
-    var expression = pop();
+    var expression = pop() as Expression;
     if (enableSpreadCollections) {
       push(ast.spreadElement(
           spreadOperator: spreadToken, expression: expression));
@@ -3404,7 +3421,7 @@
       handleRecoverableError(
         templateExperimentNotEnabled.withArguments(
           feature.enableString,
-          _versionAsString(feature.releaseVersion),
+          _versionAsString(feature.releaseVersion!),
         ),
         spreadToken,
         spreadToken,
@@ -3417,7 +3434,8 @@
   void handleStringJuxtaposition(Token startToken, int literalCount) {
     debugEvent("StringJuxtaposition");
 
-    push(ast.adjacentStrings(popTypedList(literalCount)));
+    var strings = popTypedList2<StringLiteral>(literalCount);
+    push(ast.adjacentStrings(strings));
   }
 
   @override
@@ -3457,18 +3475,18 @@
     assert(optional('throw', throwToken));
     debugEvent("ThrowExpression");
 
-    push(ast.throwExpression(throwToken, pop()));
+    push(ast.throwExpression(throwToken, pop() as Expression));
   }
 
   @override
-  void handleType(Token beginToken, Token questionMark) {
+  void handleType(Token beginToken, Token? questionMark) {
     debugEvent("Type");
     if (!enableNonNullable) {
       reportErrorIfNullableType(questionMark);
     }
 
-    TypeArgumentList arguments = pop();
-    Identifier name = pop();
+    var arguments = pop() as TypeArgumentList?;
+    var name = pop() as Identifier;
     push(ast.typeName(name, arguments, question: questionMark));
   }
 
@@ -3476,7 +3494,7 @@
   void handleTypeVariablesDefined(Token token, int count) {
     debugEvent("handleTypeVariablesDefined");
     assert(count > 0);
-    push(popTypedList(count, List<TypeParameter>.filled(count, null)));
+    push(popTypedList<TypeParameter>(count));
   }
 
   @override
@@ -3484,7 +3502,7 @@
     assert(operator.type.isUnaryPostfixOperator);
     debugEvent("UnaryPostfixAssignmentExpression");
 
-    Expression expression = pop();
+    var expression = pop() as Expression;
     if (!expression.isAssignable) {
       // This error is also reported by the body builder.
       handleRecoverableError(
@@ -3498,7 +3516,7 @@
     assert(operator.type.isUnaryPrefixOperator);
     debugEvent("UnaryPrefixAssignmentExpression");
 
-    Expression expression = pop();
+    var expression = pop() as Expression;
     if (!expression.isAssignable) {
       // This error is also reported by the body builder.
       handleRecoverableError(messageMissingAssignableSelector,
@@ -3512,7 +3530,7 @@
     assert(operator.type.isUnaryPrefixOperator);
     debugEvent("UnaryPrefixExpression");
 
-    push(ast.prefixExpression(operator, pop()));
+    push(ast.prefixExpression(operator, pop() as Expression));
   }
 
   @override
@@ -3520,7 +3538,7 @@
     assert(optional('=', equals) || optional(':', equals));
     debugEvent("ValuedFormalParameter");
 
-    Expression value = pop();
+    var value = pop() as Expression;
     push(_ParameterDefaultValue(equals, value));
   }
 
@@ -3540,7 +3558,7 @@
   void handleVoidKeywordWithTypeArguments(Token voidKeyword) {
     assert(optional('void', voidKeyword));
     debugEvent("VoidKeywordWithTypeArguments");
-    TypeArgumentList arguments = pop();
+    var arguments = pop() as TypeArgumentList;
 
     // TODO(paulberry): is this sufficient, or do we need to hook the "void"
     // keyword up to an element?
@@ -3550,13 +3568,13 @@
   }
 
   @override
-  internalProblem(Message message, int charOffset, Uri uri) {
+  Never internalProblem(Message message, int charOffset, Uri uri) {
     throw UnsupportedError(message.message);
   }
 
   /// Return `true` if [token] is either `null` or is the symbol or keyword
   /// [value].
-  bool optionalOrNull(String value, Token token) {
+  bool optionalOrNull(String value, Token? token) {
     return token == null || identical(value, token.stringValue);
   }
 
@@ -3581,35 +3599,53 @@
       }
     }
 
-    final references = List<CommentReference>.filled(count, null);
-    popTypedList(count, references);
-    return references;
+    return popTypedList<CommentReference>(count) ?? const [];
   }
 
   List<CollectionElement> popCollectionElements(int count) {
-    final elements = <CollectionElement>[]..length = count;
+    // TODO(scheglov) Not efficient.
+    final elements = <CollectionElement>[];
     for (int index = count - 1; index >= 0; --index) {
       var element = pop();
-      elements[index] = element as CollectionElement;
+      elements.add(element as CollectionElement);
     }
-    return elements;
+    return elements.reversed.toList();
   }
 
-  List popList(int n, List list) {
+  List? popList(int n, List list) {
     if (n == 0) return null;
     return stack.popList(n, list, null);
   }
 
-  List<T> popTypedList<T>(int count, [List<T> list]) {
+  List<T>? popTypedList<T extends Object>(int count) {
     if (count == 0) return null;
     assert(stack.length >= count);
 
-    final tailList = list ?? List<T>.filled(count, null, growable: true);
+    final tailList = List<T?>.filled(count, null, growable: true);
     stack.popList(count, tailList, null);
-    return tailList;
+    return tailList.whereNotNull().toList();
   }
 
-  void pushForControlFlowInfo(Token awaitToken, Token forToken,
+  // List<T?>? popTypedList<T>(int count, [List<T>? list]) {
+  //   if (count == 0) return null;
+  //   assert(stack.length >= count);
+  //
+  //   final tailList = list ?? List<T?>.filled(count, null, growable: true);
+  //   stack.popList(count, tailList, null);
+  //   return tailList;
+  // }
+
+  /// TODO(scheglov) This is probably not optimal.
+  List<T> popTypedList2<T>(int count) {
+    var result = <T>[];
+    for (var i = 0; i < count; i++) {
+      var element = stack.pop(null) as T;
+      result.add(element);
+    }
+    return result.reversed.toList();
+  }
+
+  void pushForControlFlowInfo(Token? awaitToken, Token forToken,
       Token leftParenthesis, ForLoopParts forLoopParts, Object entry) {
     if (entry == _invalidCollectionElement) {
       push(_invalidCollectionElement);
@@ -3619,7 +3655,7 @@
         forKeyword: forToken,
         leftParenthesis: leftParenthesis,
         forLoopParts: forLoopParts,
-        rightParenthesis: leftParenthesis.endGroup,
+        rightParenthesis: leftParenthesis.endGroup!,
         body: entry as CollectionElement,
       ));
     } else {
@@ -3627,7 +3663,7 @@
       handleRecoverableError(
         templateExperimentNotEnabled.withArguments(
           feature.enableString,
-          _versionAsString(feature.releaseVersion),
+          _versionAsString(feature.releaseVersion!),
         ),
         forToken,
         forToken,
@@ -3640,8 +3676,8 @@
       Token ifToken,
       ParenthesizedExpression condition,
       CollectionElement thenElement,
-      Token elseToken,
-      CollectionElement elseElement) {
+      Token? elseToken,
+      CollectionElement? elseElement) {
     if (thenElement == _invalidCollectionElement ||
         elseElement == _invalidCollectionElement) {
       push(_invalidCollectionElement);
@@ -3660,7 +3696,7 @@
       handleRecoverableError(
         templateExperimentNotEnabled.withArguments(
           feature.enableString,
-          _versionAsString(feature.releaseVersion),
+          _versionAsString(feature.releaseVersion!),
         ),
         ifToken,
         ifToken,
@@ -3669,14 +3705,14 @@
     }
   }
 
-  void reportErrorIfNullableType(Token questionMark) {
+  void reportErrorIfNullableType(Token? questionMark) {
     if (questionMark != null) {
       assert(optional('?', questionMark));
       var feature = ExperimentalFeatures.non_nullable;
       handleRecoverableError(
         templateExperimentNotEnabled.withArguments(
           feature.enableString,
-          _versionAsString(feature.releaseVersion),
+          _versionAsString(feature.releaseVersion!),
         ),
         questionMark,
         questionMark,
@@ -3692,13 +3728,13 @@
     }
   }
 
-  void reportNonNullableModifierError(Token modifierToken) {
+  void reportNonNullableModifierError(Token? modifierToken) {
     if (modifierToken != null) {
       var feature = ExperimentalFeatures.non_nullable;
       handleRecoverableError(
         templateExperimentNotEnabled.withArguments(
           feature.enableString,
-          _versionAsString(feature.releaseVersion),
+          _versionAsString(feature.releaseVersion!),
         ),
         modifierToken,
         modifierToken,
@@ -3711,16 +3747,16 @@
     handleRecoverableError(
       templateExperimentNotEnabled.withArguments(
         feature.enableString,
-        _versionAsString(feature.releaseVersion),
+        _versionAsString(feature.releaseVersion!),
       ),
       bang,
       bang,
     );
   }
 
-  Comment _findComment(List<Annotation> metadata, Token tokenAfterMetadata) {
+  Comment? _findComment(List<Annotation>? metadata, Token tokenAfterMetadata) {
     // Find the dartdoc tokens
-    Token dartdoc = parser.findDartDoc(tokenAfterMetadata);
+    var dartdoc = parser.findDartDoc(tokenAfterMetadata);
     if (dartdoc == null) {
       if (metadata == null) {
         return null;
@@ -3753,16 +3789,16 @@
     return ast.documentationComment(tokens, references);
   }
 
-  void _handleInstanceCreation(Token token) {
-    MethodInvocation arguments = pop();
+  void _handleInstanceCreation(Token? token) {
+    var arguments = pop() as MethodInvocation;
     ConstructorName constructorName;
-    TypeArgumentList typeArguments;
+    TypeArgumentList? typeArguments;
     var object = pop();
     if (object is _ConstructorNameWithInvalidTypeArgs) {
       constructorName = object.name;
       typeArguments = object.invalidTypeArgs;
     } else {
-      constructorName = object;
+      constructorName = object as ConstructorName;
     }
     push(ast.instanceCreationExpression(
         token, constructorName, arguments.argumentList,
@@ -3770,12 +3806,18 @@
   }
 
   VariableDeclaration _makeVariableDeclaration(
-      SimpleIdentifier name, Token equals, Expression initializer) {
+      SimpleIdentifier name, Token? equals, Expression? initializer) {
     return ast.variableDeclaration(name, equals, initializer);
   }
 
+  SimpleIdentifier _tmpSimpleIdentifier() {
+    return ast.simpleIdentifier(
+      StringToken(TokenType.STRING, '__tmp', -1),
+    );
+  }
+
   ParameterKind _toAnalyzerParameterKind(
-      FormalParameterKind type, Token requiredKeyword) {
+      FormalParameterKind type, Token? requiredKeyword) {
     if (type == FormalParameterKind.optionalPositional) {
       return ParameterKind.POSITIONAL;
     } else if (type == FormalParameterKind.optionalNamed) {
@@ -3816,18 +3858,18 @@
 /// Data structure placed on the stack to represent a non-empty sequence
 /// of modifiers.
 class _Modifiers {
-  Token abstractKeyword;
-  Token externalKeyword;
-  Token finalConstOrVarKeyword;
-  Token staticKeyword;
-  Token covariantKeyword;
-  Token requiredToken;
-  Token lateToken;
+  Token? abstractKeyword;
+  Token? externalKeyword;
+  Token? finalConstOrVarKeyword;
+  Token? staticKeyword;
+  Token? covariantKeyword;
+  Token? requiredToken;
+  Token? lateToken;
 
   /// Return the token that is lexically first.
-  Token get beginToken {
-    Token firstToken;
-    for (Token token in [
+  Token? get beginToken {
+    Token? firstToken;
+    for (Token? token in [
       abstractKeyword,
       externalKeyword,
       finalConstOrVarKeyword,
@@ -3848,7 +3890,7 @@
   }
 
   /// Return the `const` keyword or `null`.
-  Token get constKeyword {
+  Token? get constKeyword {
     return identical('const', finalConstOrVarKeyword?.lexeme)
         ? finalConstOrVarKeyword
         : null;
@@ -3866,7 +3908,7 @@
 
 /// Data structure placed on the stack as a container for optional parameters.
 class _OptionalFormalParameters {
-  final List<FormalParameter> parameters;
+  final List<FormalParameter>? parameters;
   final Token leftDelimiter;
   final Token rightDelimiter;
 
@@ -3885,8 +3927,8 @@
 
 /// Data structure placed on stack to represent the redirected constructor.
 class _RedirectingFactoryBody {
-  final Token asyncKeyword;
-  final Token starKeyword;
+  final Token? asyncKeyword;
+  final Token? starKeyword;
   final Token equalToken;
   final ConstructorName constructorName;
 
diff --git a/pkg/analyzer/lib/src/fasta/error_converter.dart b/pkg/analyzer/lib/src/fasta/error_converter.dart
index bfc91e0..145508c 100644
--- a/pkg/analyzer/lib/src/fasta/error_converter.dart
+++ b/pkg/analyzer/lib/src/fasta/error_converter.dart
@@ -13,14 +13,14 @@
 /// error.
 class FastaErrorReporter {
   /// The underlying error reporter to which errors are reported.
-  final ErrorReporter errorReporter;
+  final ErrorReporter? errorReporter;
 
   /// Initialize a newly created error reporter to report errors to the given
   /// [errorReporter].
   FastaErrorReporter(this.errorReporter);
 
   void reportByCode(
-      String analyzerCode, int offset, int length, Message message) {
+      String? analyzerCode, int offset, int length, Message message) {
     Map<String, dynamic> arguments = message.arguments;
 
     String lexeme() => (arguments['lexeme'] as Token).lexeme;
@@ -347,11 +347,11 @@
   void reportMessage(Message message, int offset, int length) {
     Code code = message.code;
     int index = code.index;
-    if (index != null && index > 0 && index < fastaAnalyzerErrorCodes.length) {
-      ErrorCode errorCode = fastaAnalyzerErrorCodes[index];
+    if (index > 0 && index < fastaAnalyzerErrorCodes.length) {
+      var errorCode = fastaAnalyzerErrorCodes[index];
       if (errorCode != null) {
-        errorReporter.reportError(AnalysisError.withNamedArguments(
-            errorReporter.source,
+        errorReporter!.reportError(AnalysisError.withNamedArguments(
+            errorReporter!.source,
             offset,
             length,
             errorCode,
@@ -363,7 +363,7 @@
   }
 
   void reportScannerError(
-      ScannerErrorCode errorCode, int offset, List<Object> arguments) {
+      ScannerErrorCode errorCode, int offset, List<Object?>? arguments) {
     // TODO(danrubel): update client to pass length in addition to offset.
     int length = 1;
     errorReporter?.reportErrorForOffset(errorCode, offset, length, arguments);
@@ -372,8 +372,8 @@
   void _reportByCode(
       ErrorCode errorCode, Message message, int offset, int length) {
     if (errorReporter != null) {
-      errorReporter.reportError(AnalysisError.withNamedArguments(
-          errorReporter.source, offset, length, errorCode, message.arguments));
+      errorReporter!.reportError(AnalysisError.withNamedArguments(
+          errorReporter!.source, offset, length, errorCode, message.arguments));
     }
   }
 }
diff --git a/pkg/analyzer/lib/src/fasta/token_utils.dart b/pkg/analyzer/lib/src/fasta/token_utils.dart
index f7a5b56..acd33f3 100644
--- a/pkg/analyzer/lib/src/fasta/token_utils.dart
+++ b/pkg/analyzer/lib/src/fasta/token_utils.dart
@@ -8,13 +8,13 @@
 /// Search for the token before [target] starting the search with [start].
 /// Return `null` if [target] is a comment token
 /// or the previous token cannot be found.
-Token findPrevious(Token start, Token target) {
+Token? findPrevious(Token start, Token? target) {
   if (start == target || target is CommentToken) {
     return null;
   }
-  Token token = start is CommentToken ? start.parent : start;
+  Token token = start is CommentToken ? start.parent! : start;
   do {
-    Token next = token.next;
+    Token next = token.next!;
     if (next == target) {
       return token;
     }
diff --git a/pkg/analyzer/lib/src/file_system/file_system.dart b/pkg/analyzer/lib/src/file_system/file_system.dart
index 4709f04..d3d9189 100644
--- a/pkg/analyzer/lib/src/file_system/file_system.dart
+++ b/pkg/analyzer/lib/src/file_system/file_system.dart
@@ -18,7 +18,7 @@
   ResourceProvider get provider => _provider;
 
   @override
-  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
+  Source? resolveAbsolute(Uri uri, [Uri? actualUri]) {
     if (!isFileUri(uri)) {
       return null;
     }
diff --git a/pkg/analyzer/lib/src/generated/constant.dart b/pkg/analyzer/lib/src/generated/constant.dart
index cb4d7fb..faa2ee3 100644
--- a/pkg/analyzer/lib/src/generated/constant.dart
+++ b/pkg/analyzer/lib/src/generated/constant.dart
@@ -4,11 +4,10 @@
 
 import 'package:analyzer/dart/analysis/declared_variables.dart';
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/constant/evaluation.dart';
-import 'package:analyzer/src/dart/constant/value.dart';
+import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/engine.dart' show RecordingErrorListener;
 import 'package:analyzer/src/generated/source.dart' show Source;
@@ -99,12 +98,12 @@
   final Source _source;
 
   /// The library containing the expression(s) that will be evaluated.
-  final LibraryElement _library;
+  final LibraryElementImpl _library;
 
   /// Initialize a newly created evaluator to evaluate expressions in the given
   /// [source]. The [typeProvider] is the type provider used to access known
   /// types.
-  ConstantEvaluator(this._source, LibraryElement library) : _library = library;
+  ConstantEvaluator(this._source, this._library);
 
   EvaluationResult evaluate(Expression expression) {
     RecordingErrorListener errorListener = RecordingErrorListener();
@@ -113,7 +112,7 @@
       _source,
       isNonNullableByDefault: _library.isNonNullableByDefault,
     );
-    DartObjectImpl result = expression.accept(ConstantVisitor(
+    var result = expression.accept(ConstantVisitor(
         ConstantEvaluationEngine(
           DeclaredVariables(),
         ),
diff --git a/pkg/analyzer/lib/src/generated/declaration_resolver.dart b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
index 5737b9d..acb699c 100644
--- a/pkg/analyzer/lib/src/generated/declaration_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
@@ -11,27 +11,27 @@
   /// The element whose child elements are being walked.
   final Element element;
 
-  List<PropertyAccessorElement> _accessors;
+  List<PropertyAccessorElement>? _accessors;
   int _accessorIndex = 0;
-  List<ClassElement> _classes;
+  List<ClassElement>? _classes;
   int _classIndex = 0;
-  List<ConstructorElement> _constructors;
+  List<ConstructorElement>? _constructors;
   int _constructorIndex = 0;
-  List<ClassElement> _enums;
+  List<ClassElement>? _enums;
   int _enumIndex = 0;
-  List<ExtensionElement> _extensions;
+  List<ExtensionElement>? _extensions;
   int _extensionIndex = 0;
-  List<ExecutableElement> _functions;
+  List<ExecutableElement>? _functions;
   int _functionIndex = 0;
-  List<ClassElement> _mixins;
+  List<ClassElement>? _mixins;
   int _mixinIndex = 0;
-  List<ParameterElement> _parameters;
+  List<ParameterElement>? _parameters;
   int _parameterIndex = 0;
-  List<TypeAliasElement> _typedefs;
+  List<TypeAliasElement>? _typedefs;
   int _typedefIndex = 0;
-  List<TypeParameterElement> _typeParameters;
+  List<TypeParameterElement>? _typeParameters;
   int _typeParameterIndex = 0;
-  List<VariableElement> _variables;
+  List<VariableElement>? _variables;
   int _variableIndex = 0;
 
   /// Creates an [ElementWalker] which walks the child elements of a class
@@ -104,63 +104,69 @@
         _typeParameters = element.typeParameters;
 
   void consumeLocalElements() {
-    _functionIndex = _functions.length;
+    _functionIndex = _functions!.length;
   }
 
   void consumeParameters() {
-    _parameterIndex = _parameters.length;
+    _parameterIndex = _parameters!.length;
   }
 
   /// Returns the next non-synthetic child of [element] which is an accessor;
   /// throws an [IndexError] if there are no more.
-  PropertyAccessorElement getAccessor() => _accessors[_accessorIndex++];
+  PropertyAccessorElementImpl getAccessor() =>
+      _accessors![_accessorIndex++] as PropertyAccessorElementImpl;
 
   /// Returns the next non-synthetic child of [element] which is a class; throws
   /// an [IndexError] if there are no more.
-  ClassElement getClass() => _classes[_classIndex++];
+  ClassElementImpl getClass() => _classes![_classIndex++] as ClassElementImpl;
 
   /// Returns the next non-synthetic child of [element] which is a constructor;
   /// throws an [IndexError] if there are no more.
-  ConstructorElement getConstructor() => _constructors[_constructorIndex++];
+  ConstructorElementImpl getConstructor() =>
+      _constructors![_constructorIndex++] as ConstructorElementImpl;
 
   /// Returns the next non-synthetic child of [element] which is an enum; throws
   /// an [IndexError] if there are no more.
-  ClassElement getEnum() => _enums[_enumIndex++];
+  EnumElementImpl getEnum() => _enums![_enumIndex++] as EnumElementImpl;
 
-  ExtensionElement getExtension() => _extensions[_extensionIndex++];
+  ExtensionElement getExtension() => _extensions![_extensionIndex++];
 
   /// Returns the next non-synthetic child of [element] which is a top level
   /// function, method, or local function; throws an [IndexError] if there are
   /// no more.
-  ExecutableElement getFunction() => _functions[_functionIndex++];
+  ExecutableElementImpl getFunction() =>
+      _functions![_functionIndex++] as ExecutableElementImpl;
 
   /// Returns the next non-synthetic child of [element] which is a mixin; throws
   /// an [IndexError] if there are no more.
-  ClassElement getMixin() => _mixins[_mixinIndex++];
+  ClassElement getMixin() => _mixins![_mixinIndex++];
 
   /// Returns the next non-synthetic child of [element] which is a parameter;
   /// throws an [IndexError] if there are no more.
-  ParameterElement getParameter() => _parameters[_parameterIndex++];
+  ParameterElementImpl getParameter() =>
+      _parameters![_parameterIndex++] as ParameterElementImpl;
 
   /// Returns the next non-synthetic child of [element] which is a typedef;
   /// throws an [IndexError] if there are no more.
-  TypeAliasElement getTypedef() => _typedefs[_typedefIndex++];
+  TypeAliasElementImpl getTypedef() =>
+      _typedefs![_typedefIndex++] as TypeAliasElementImpl;
 
   /// Returns the next non-synthetic child of [element] which is a type
   /// parameter; throws an [IndexError] if there are no more.
-  TypeParameterElement getTypeParameter() =>
-      _typeParameters[_typeParameterIndex++];
+  TypeParameterElementImpl getTypeParameter() =>
+      _typeParameters![_typeParameterIndex++] as TypeParameterElementImpl;
 
   /// Returns the next non-synthetic child of [element] which is a top level
   /// variable, field, or local variable; throws an [IndexError] if there are no
   /// more.
-  VariableElement getVariable() => _variables[_variableIndex++];
+  VariableElementImpl getVariable() =>
+      _variables![_variableIndex++] as VariableElementImpl;
 
   /// Verifies that all non-synthetic children of [element] have been obtained
   /// from their corresponding "get" method calls; if not, throws a
   /// [StateError].
   void validate() {
-    void check(List<Element> elements, int index) {
+    void check(List<Element>? elements, int index) {
       if (elements != null && elements.length != index) {
         throw StateError(
             'Unmatched ${elements[index].runtimeType} ${elements[index]}');
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index eba129d..48c3f46 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -7,6 +7,7 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/resolver/method_invocation_resolver.dart';
@@ -87,7 +88,7 @@
   /// Helper for resolving properties on types.
   final TypePropertyResolver _typePropertyResolver;
 
-  MethodInvocationResolver _methodInvocationResolver;
+  late final MethodInvocationResolver _methodInvocationResolver;
 
   /// Initialize a newly created visitor to work for the given [_resolver] to
   /// resolve the nodes in a compilation unit.
@@ -107,7 +108,7 @@
   /// Return `true` iff the current enclosing function is a constant constructor
   /// declaration.
   bool get isInConstConstructor {
-    ExecutableElement function = _resolver.enclosingFunction;
+    var function = _resolver.enclosingFunction;
     if (function is ConstructorElement) {
       return function.isConst;
     }
@@ -137,7 +138,7 @@
   void visitCommentReference(CommentReference node) {
     Identifier identifier = node.identifier;
     if (identifier is SimpleIdentifier) {
-      Element element = _resolveSimpleIdentifier(identifier);
+      var element = _resolveSimpleIdentifier(identifier);
       if (element == null) {
         // TODO(brianwilkerson) Report this error?
         //        resolver.reportError(
@@ -151,7 +152,7 @@
         identifier.staticElement = element;
         if (node.newKeyword != null) {
           if (element is ClassElement) {
-            ConstructorElement constructor = element.unnamedConstructor;
+            var constructor = element.unnamedConstructor;
             if (constructor == null) {
               // TODO(brianwilkerson) Report this error.
             } else {
@@ -164,7 +165,7 @@
       }
     } else if (identifier is PrefixedIdentifier) {
       SimpleIdentifier prefix = identifier.prefix;
-      Element prefixElement = _resolveSimpleIdentifier(prefix);
+      var prefixElement = _resolveSimpleIdentifier(prefix);
       prefix.staticElement = prefixElement;
 
       SimpleIdentifier name = identifier.identifier;
@@ -183,7 +184,7 @@
         return;
       }
 
-      LibraryElement library = prefixElement.library;
+      var library = prefixElement.library;
       if (library != _definingLibrary) {
         // TODO(brianwilkerson) Report this error.
       }
@@ -213,18 +214,18 @@
   @override
   void visitConstructorDeclaration(ConstructorDeclaration node) {
     super.visitConstructorDeclaration(node);
-    ConstructorElement element = node.declaredElement;
+    ConstructorElement element = node.declaredElement!;
     if (element is ConstructorElementImpl) {
-      ConstructorName redirectedNode = node.redirectedConstructor;
+      var redirectedNode = node.redirectedConstructor;
       if (redirectedNode != null) {
         // set redirected factory constructor
-        ConstructorElement redirectedElement = redirectedNode.staticElement;
+        var redirectedElement = redirectedNode.staticElement;
         element.redirectedConstructor = redirectedElement;
       } else {
         // set redirected generative constructor
         for (ConstructorInitializer initializer in node.initializers) {
           if (initializer is RedirectingConstructorInvocation) {
-            ConstructorElement redirectedElement = initializer.staticElement;
+            var redirectedElement = initializer.staticElement;
             element.redirectedConstructor = redirectedElement;
           }
         }
@@ -236,20 +237,20 @@
   @override
   void visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
     SimpleIdentifier fieldName = node.fieldName;
-    ClassElement enclosingClass = _resolver.enclosingClass;
-    FieldElement fieldElement = enclosingClass.getField(fieldName.name);
+    ClassElement enclosingClass = _resolver.enclosingClass!;
+    var fieldElement = enclosingClass.getField(fieldName.name);
     fieldName.staticElement = fieldElement;
   }
 
   @override
   void visitConstructorName(ConstructorName node) {
-    DartType type = node.type.type;
-    if (type != null && type.isDynamic) {
+    DartType type = node.type.type!;
+    if (type.isDynamic) {
       // Nothing to do.
     } else if (type is InterfaceType) {
       // look up ConstructorElement
-      ConstructorElement constructor;
-      SimpleIdentifier name = node.name;
+      ConstructorElement? constructor;
+      var name = node.name;
       if (name == null) {
         constructor = type.lookUpConstructor(null, _definingLibrary);
         constructor = _resolver.toLegacyElement(constructor);
@@ -296,7 +297,7 @@
 
   @override
   void visitExportDirective(ExportDirective node) {
-    ExportElement exportElement = node.element;
+    var exportElement = node.element;
     if (exportElement != null) {
       // The element is null when the URI is invalid
       // TODO(brianwilkerson) Figure out whether the element can ever be
@@ -344,7 +345,7 @@
 
   @override
   void visitImportDirective(ImportDirective node) {
-    SimpleIdentifier prefixNode = node.prefix;
+    var prefixNode = node.prefix;
     if (prefixNode != null) {
       String prefixName = prefixNode.name;
       List<PrefixElement> prefixes = _definingLibrary.prefixes;
@@ -357,10 +358,10 @@
         }
       }
     }
-    ImportElement importElement = node.element;
+    var importElement = node.element;
     if (importElement != null) {
       // The element is null when the URI is invalid
-      LibraryElement library = importElement.importedLibrary;
+      var library = importElement.importedLibrary;
       if (library != null) {
         _resolveCombinators(library, node.combinators);
       }
@@ -370,9 +371,9 @@
 
   @override
   void visitInstanceCreationExpression(InstanceCreationExpression node) {
-    ConstructorElement invokedConstructor = node.constructorName.staticElement;
+    var invokedConstructor = node.constructorName.staticElement;
     ArgumentList argumentList = node.argumentList;
-    List<ParameterElement> parameters =
+    var parameters =
         _resolveArgumentsToFunction(argumentList, invokedConstructor);
     if (parameters != null) {
       argumentList.correspondingStaticParameters = parameters;
@@ -391,7 +392,7 @@
 
   @override
   void visitMethodInvocation(MethodInvocation node) {
-    _methodInvocationResolver.resolve(node);
+    _methodInvocationResolver.resolve(node as MethodInvocationImpl);
   }
 
   @override
@@ -407,13 +408,13 @@
   @override
   void visitRedirectingConstructorInvocation(
       RedirectingConstructorInvocation node) {
-    ClassElement enclosingClass = _resolver.enclosingClass;
+    var enclosingClass = _resolver.enclosingClass;
     if (enclosingClass == null) {
       // TODO(brianwilkerson) Report this error.
       return;
     }
-    SimpleIdentifier name = node.constructorName;
-    ConstructorElement element;
+    ConstructorElement? element;
+    var name = node.constructorName;
     if (name == null) {
       element = enclosingClass.unnamedConstructor;
     } else {
@@ -429,8 +430,7 @@
     }
     node.staticElement = element;
     ArgumentList argumentList = node.argumentList;
-    List<ParameterElement> parameters =
-        _resolveArgumentsToFunction(argumentList, element);
+    var parameters = _resolveArgumentsToFunction(argumentList, element);
     if (parameters != null) {
       argumentList.correspondingStaticParameters = parameters;
     }
@@ -448,15 +448,14 @@
       // TODO(brianwilkerson) Report this error.
       return;
     }
-    InterfaceType superType = enclosingClass.supertype;
+    var superType = enclosingClass.supertype;
     if (superType == null) {
       // TODO(brianwilkerson) Report this error.
       return;
     }
-    SimpleIdentifier name = node.constructorName;
-    String superName = name?.name;
-    ConstructorElement element =
-        superType.lookUpConstructor(superName, _definingLibrary);
+    var name = node.constructorName;
+    var superName = name?.name;
+    var element = superType.lookUpConstructor(superName, _definingLibrary);
     element = _resolver.toLegacyElement(element);
     if (element == null || !element.isAccessibleIn(_definingLibrary)) {
       if (name != null) {
@@ -486,16 +485,14 @@
     node.staticElement = element;
     // TODO(brianwilkerson) Defer this check until we know there's an error (by
     // in-lining _resolveArgumentsToFunction below).
-    ClassDeclaration declaration =
-        node.thisOrAncestorOfType<ClassDeclaration>();
-    Identifier superclassName = declaration?.extendsClause?.superclass?.name;
+    var declaration = node.thisOrAncestorOfType<ClassDeclaration>();
+    var superclassName = declaration?.extendsClause?.superclass.name;
     if (superclassName != null &&
         _resolver.nameScope.shouldIgnoreUndefined(superclassName)) {
       return;
     }
     ArgumentList argumentList = node.argumentList;
-    List<ParameterElement> parameters =
-        _resolveArgumentsToFunction(argumentList, element);
+    var parameters = _resolveArgumentsToFunction(argumentList, element);
     if (parameters != null) {
       argumentList.correspondingStaticParameters = parameters;
     }
@@ -534,12 +531,12 @@
   /// break or continue statement. The [labelNode] is the label contained in
   /// that statement (if any). The flag [isContinue] is `true` if the node being
   /// visited is a continue statement.
-  AstNode _lookupBreakOrContinueTarget(
-      AstNode parentNode, SimpleIdentifier labelNode, bool isContinue) {
+  AstNode? _lookupBreakOrContinueTarget(
+      AstNode parentNode, SimpleIdentifier? labelNode, bool isContinue) {
     if (labelNode == null) {
       return _resolver.implicitLabelScope.getTarget(isContinue);
     } else {
-      LabelScope labelScope = _resolver.labelScope;
+      var labelScope = _resolver.labelScope;
       if (labelScope == null) {
         // There are no labels in scope, so by definition the label is
         // undefined.
@@ -547,7 +544,7 @@
             CompileTimeErrorCode.LABEL_UNDEFINED, labelNode, [labelNode.name]);
         return null;
       }
-      LabelScope definingScope = labelScope.lookup(labelNode.name);
+      var definingScope = labelScope.lookup(labelNode.name);
       if (definingScope == null) {
         // No definition of the given label name could be found in any
         // enclosing scope.
@@ -557,7 +554,7 @@
       }
       // The target has been found.
       labelNode.staticElement = definingScope.element;
-      ExecutableElement labelContainer =
+      ExecutableElement? labelContainer =
           definingScope.element.thisOrAncestorOfType();
       if (!identical(labelContainer, _resolver.enclosingFunction)) {
         _errorReporter.reportErrorForNode(
@@ -574,8 +571,8 @@
   /// the list of arguments. An error will be reported if any of the arguments
   /// cannot be matched to a parameter. Return the parameters that correspond to
   /// the arguments, or `null` if no correspondence could be computed.
-  List<ParameterElement> _resolveArgumentsToFunction(
-      ArgumentList argumentList, ExecutableElement executableElement) {
+  List<ParameterElement?>? _resolveArgumentsToFunction(
+      ArgumentList argumentList, ExecutableElement? executableElement) {
     if (executableElement == null) {
       return null;
     }
@@ -588,7 +585,7 @@
   /// correspond to the list of arguments. An error will be reported if any of
   /// the arguments cannot be matched to a parameter. Return the parameters that
   /// correspond to the arguments.
-  List<ParameterElement> _resolveArgumentsToParameters(
+  List<ParameterElement?> _resolveArgumentsToParameters(
       ArgumentList argumentList, List<ParameterElement> parameters) {
     return ResolverVisitor.resolveArgumentsToParameters(
         argumentList, parameters, _errorReporter.reportErrorForNode);
@@ -597,7 +594,7 @@
   /// Resolve the names in the given [combinators] in the scope of the given
   /// [library].
   void _resolveCombinators(
-      LibraryElement library, NodeList<Combinator> combinators) {
+      LibraryElement? library, NodeList<Combinator> combinators) {
     if (library == null) {
       //
       // The library will be null if the directive containing the combinators
@@ -616,7 +613,7 @@
       }
       for (SimpleIdentifier name in names) {
         String nameStr = name.name;
-        Element element = namespace.get(nameStr) ?? namespace.get("$nameStr=");
+        var element = namespace.get(nameStr) ?? namespace.get("$nameStr=");
         if (element != null) {
           // Ensure that the name always resolves to a top-level variable
           // rather than a getter or setter
@@ -639,10 +636,10 @@
   /// Resolve the given simple [identifier] if possible. Return the element to
   /// which it could be resolved, or `null` if it could not be resolved. This
   /// does not record the results of the resolution.
-  Element _resolveSimpleIdentifier(SimpleIdentifier identifier) {
+  Element? _resolveSimpleIdentifier(SimpleIdentifier identifier) {
     var lookupResult = _resolver.nameScope.lookup(identifier.name);
 
-    Element element = lookupResult.getter;
+    var element = lookupResult.getter;
     element = _resolver.toLegacyElement(element);
 
     if (element is PropertyAccessorElement && identifier.inSetterContext()) {
@@ -652,7 +649,7 @@
         // Check to see whether there might be a locally defined getter and
         // an inherited setter.
         //
-        ClassElement enclosingClass = _resolver.enclosingClass;
+        var enclosingClass = _resolver.enclosingClass;
         if (enclosingClass != null) {
           var result = _typePropertyResolver.resolve(
             receiver: null,
@@ -676,7 +673,7 @@
     }
     if (element == null) {
       InterfaceType enclosingType;
-      ClassElement enclosingClass = _resolver.enclosingClass;
+      var enclosingClass = _resolver.enclosingClass;
       if (enclosingClass == null) {
         var enclosingExtension = _resolver.enclosingExtension;
         if (enclosingExtension == null) {
@@ -694,7 +691,7 @@
       } else {
         enclosingType = enclosingClass.thisType;
       }
-      if (element == null && enclosingType != null) {
+      if (element == null) {
         var result = _typePropertyResolver.resolve(
           receiver: null,
           receiverType: enclosingType,
@@ -716,12 +713,12 @@
   /// should be used when looking up members. Otherwise, return the original
   /// type.
   DartType _resolveTypeParameter(DartType type) =>
-      type?.resolveToBound(_typeProvider.objectType);
+      type.resolveToBound(_typeProvider.objectType);
 
   /// Checks whether the given [expression] is a reference to a class. If it is
   /// then the element representing the class is returned, otherwise `null` is
   /// returned.
-  static ClassElement getTypeReference(Expression expression) {
+  static ClassElement? getTypeReference(Expression expression) {
     if (expression is Identifier) {
       var element = expression.staticElement;
       if (element is ClassElement) {
@@ -740,7 +737,7 @@
   static void _resolveAnnotations(NodeList<Annotation> annotations) {
     for (Annotation annotation in annotations) {
       var elementAnnotation =
-          annotation.elementAnnotation as ElementAnnotationImpl;
+          annotation.elementAnnotation as ElementAnnotationImpl?;
       if (elementAnnotation != null) {
         elementAnnotation.element = annotation.element;
       }
diff --git a/pkg/analyzer/lib/src/generated/element_type_provider.dart b/pkg/analyzer/lib/src/generated/element_type_provider.dart
index cd56719..ba2554c 100644
--- a/pkg/analyzer/lib/src/generated/element_type_provider.dart
+++ b/pkg/analyzer/lib/src/generated/element_type_provider.dart
@@ -62,7 +62,7 @@
       element.typeInternal;
 
   /// Queries the bound of a type parameter.
-  DartType getTypeParameterBound(TypeParameterElementImpl element) =>
+  DartType? getTypeParameterBound(TypeParameterElementImpl element) =>
       element.boundInternal;
 
   /// Queries the type of a variable element.
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 63e7b03..3974134 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -126,7 +126,7 @@
 
   /// Set the instrumentation service that is to be used by this analysis engine
   /// to the given [service].
-  set instrumentationService(InstrumentationService service) {
+  set instrumentationService(InstrumentationService? service) {
     if (service == null) {
       _instrumentationService = InstrumentationService.NULL_SERVICE;
     } else {
@@ -148,8 +148,8 @@
   void processRequiredPlugins() {}
 
   /// Return `true` if the given [fileName] is an analysis options file.
-  static bool isAnalysisOptionsFileName(String fileName,
-      [pathos.Context context]) {
+  static bool isAnalysisOptionsFileName(String? fileName,
+      [pathos.Context? context]) {
     if (fileName == null) {
       return false;
     }
@@ -159,7 +159,7 @@
 
   /// Return `true` if the given [fileName] is assumed to contain Dart source
   /// code.
-  static bool isDartFileName(String fileName) {
+  static bool isDartFileName(String? fileName) {
     if (fileName == null) {
       return false;
     }
@@ -168,7 +168,7 @@
   }
 
   /// Return `true` if the given [fileName] is AndroidManifest.xml
-  static bool isManifestFileName(String fileName) {
+  static bool isManifestFileName(String? fileName) {
     if (fileName == null) {
       return false;
     }
@@ -242,7 +242,7 @@
 
   /// The version range for the SDK specified in `pubspec.yaml`, or `null` if
   /// there is no `pubspec.yaml` or if it does not contain an SDK range.
-  VersionConstraint get sdkVersionConstraint;
+  VersionConstraint? get sdkVersionConstraint;
 
   /// Return the opaque signature of the options.
   ///
@@ -278,16 +278,16 @@
   static const int signatureLength = 4;
 
   /// The cached [unlinkedSignature].
-  Uint32List _unlinkedSignature;
+  Uint32List? _unlinkedSignature;
 
   /// The cached [signature].
-  Uint32List _signature;
+  Uint32List? _signature;
 
   /// The cached [signatureForElements].
-  Uint32List _signatureForElements;
+  Uint32List? _signatureForElements;
 
   @override
-  VersionConstraint sdkVersionConstraint;
+  VersionConstraint? sdkVersionConstraint;
 
   ExperimentStatus _contextFeatures = ExperimentStatus();
 
@@ -312,10 +312,10 @@
 
   /// A list of error processors that are to be used when reporting errors in
   /// some analysis context.
-  List<ErrorProcessor> _errorProcessors;
+  List<ErrorProcessor>? _errorProcessors;
 
   /// A list of exclude patterns used to exclude some sources from analysis.
-  List<String> _excludePatterns;
+  List<String>? _excludePatterns;
 
   @override
   bool hint = true;
@@ -325,7 +325,7 @@
 
   /// The lint rules that are to be run in an analysis context if [lint] returns
   /// `true`.
-  List<Linter> _lintRules;
+  List<Linter>? _lintRules;
 
   @override
   bool useFastaParser = true;
@@ -477,7 +477,7 @@
       List<int> bytes = buffer.toByteList();
       _signature = Uint8List.fromList(bytes).buffer.asUint32List();
     }
-    return _signature;
+    return _signature!;
   }
 
   Uint32List get signatureForElements {
@@ -494,7 +494,7 @@
       List<int> bytes = buffer.toByteList();
       _signatureForElements = Uint8List.fromList(bytes).buffer.asUint32List();
     }
-    return _signatureForElements;
+    return _signatureForElements!;
   }
 
   /// Return the opaque signature of the options that affect unlinked data.
@@ -521,7 +521,7 @@
       List<int> bytes = buffer.toByteList();
       _unlinkedSignature = Uint8List.fromList(bytes).buffer.asUint32List();
     }
-    return _unlinkedSignature;
+    return _unlinkedSignature!;
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index a14bdfb..912da39 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -40,12 +40,11 @@
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/parser.dart' show ParserErrorCode;
-import 'package:analyzer/src/generated/sdk.dart' show DartSdk, SdkLibrary;
 import 'package:analyzer/src/generated/this_access_tracker.dart';
-import 'package:meta/meta.dart';
+import 'package:collection/collection.dart';
 
 class EnclosingExecutableContext {
-  final ExecutableElement element;
+  final ExecutableElement? element;
   final bool isAsynchronous;
   final bool isConstConstructor;
   final bool isGenerativeConstructor;
@@ -57,7 +56,7 @@
   /// invocation of [Future.catchError], returns the return type expected for
   /// `Future<T>.catchError`'s `onError` parameter, which is `FutureOr<T>`,
   /// otherwise `null`.
-  final InterfaceType catchErrorOnErrorReturnType;
+  final InterfaceType? catchErrorOnErrorReturnType;
 
   /// The return statements that have a value.
   final List<ReturnStatement> _returnsWith = [];
@@ -70,7 +69,7 @@
   bool hasLegalReturnType = true;
 
   EnclosingExecutableContext(this.element,
-      {bool isAsynchronous, this.catchErrorOnErrorReturnType})
+      {bool? isAsynchronous, this.catchErrorOnErrorReturnType})
       : isAsynchronous =
             isAsynchronous ?? (element != null && element.isAsynchronous),
         isConstConstructor = element is ConstructorElement && element.isConst,
@@ -82,7 +81,7 @@
 
   EnclosingExecutableContext.empty() : this(null);
 
-  String get displayName {
+  String? get displayName {
     var element = this.element;
     if (element is ConstructorElement) {
       var className = element.enclosingElement.displayName;
@@ -96,14 +95,14 @@
   }
 
   bool get isClosure {
-    return element is FunctionElement && element.displayName.isEmpty;
+    return element is FunctionElement && element!.displayName.isEmpty;
   }
 
   bool get isConstructor => element is ConstructorElement;
 
   bool get isFunction {
     if (element is FunctionElement) {
-      return element.displayName.isNotEmpty;
+      return element!.displayName.isNotEmpty;
     }
     return element is PropertyAccessorElement;
   }
@@ -112,9 +111,11 @@
 
   bool get isSynchronous => !isAsynchronous;
 
-  DartType get returnType => catchErrorOnErrorReturnType ?? element.returnType;
+  DartType get returnType {
+    return catchErrorOnErrorReturnType ?? element!.returnType;
+  }
 
-  static bool _inFactoryConstructor(Element element) {
+  static bool _inFactoryConstructor(Element? element) {
     var enclosing = element?.enclosingElement;
     if (enclosing == null) {
       return false;
@@ -125,7 +126,7 @@
     return _inFactoryConstructor(enclosing);
   }
 
-  static bool _inStaticMethod(Element element) {
+  static bool _inStaticMethod(Element? element) {
     var enclosing = element?.enclosingElement;
     if (enclosing == null) {
       return false;
@@ -146,19 +147,19 @@
   final ErrorReporter _errorReporter;
 
   /// The current library that is being analyzed.
-  final LibraryElement _currentLibrary;
+  final LibraryElementImpl _currentLibrary;
 
   /// The type representing the type 'int'.
-  InterfaceType _intType;
+  late final InterfaceType _intType;
 
   /// The options for verification.
-  AnalysisOptionsImpl _options;
+  late final AnalysisOptionsImpl _options;
 
   /// The object providing access to the types defined by the language.
   final TypeProvider _typeProvider;
 
   /// The type system primitives
-  TypeSystemImpl _typeSystem;
+  late final TypeSystemImpl _typeSystem;
 
   /// The manager for the inheritance mappings.
   final InheritanceManager3 _inheritanceManager;
@@ -206,15 +207,15 @@
 
   /// The class containing the AST nodes being visited, or `null` if we are not
   /// in the scope of a class.
-  ClassElementImpl _enclosingClass;
+  ClassElementImpl? _enclosingClass;
 
   /// The enum containing the AST nodes being visited, or `null` if we are not
   /// in the scope of an enum.
-  ClassElement _enclosingEnum;
+  ClassElement? _enclosingEnum;
 
   /// The element of the extension being visited, or `null` if we are not
   /// in the scope of an extension.
-  ExtensionElement _enclosingExtension;
+  ExtensionElement? _enclosingExtension;
 
   /// The helper for tracking if the current location has access to `this`.
   final ThisAccessTracker _thisAccessTracker = ThisAccessTracker.unit();
@@ -233,18 +234,18 @@
 
   /// The elements that will be defined later in the current scope, but right
   /// now are not declared.
-  HiddenElements _hiddenElements;
+  HiddenElements? _hiddenElements;
 
   final _UninstantiatedBoundChecker _uninstantiatedBoundChecker;
 
   /// The features enabled in the unit currently being checked for errors.
-  FeatureSet _featureSet;
+  FeatureSet? _featureSet;
 
   final RequiredParametersVerifier _requiredParametersVerifier;
   final DuplicateDefinitionVerifier _duplicateDefinitionVerifier;
-  TypeArgumentsVerifier _typeArgumentsVerifier;
-  ConstructorFieldsVerifier _constructorFieldsVerifier;
-  ReturnTypeVerifier _returnTypeVerifier;
+  late final TypeArgumentsVerifier _typeArgumentsVerifier;
+  late final ConstructorFieldsVerifier _constructorFieldsVerifier;
+  late final ReturnTypeVerifier _returnTypeVerifier;
 
   /// Initialize a newly created error verifier.
   ErrorVerifier(ErrorReporter errorReporter, this._currentLibrary,
@@ -261,7 +262,7 @@
     _isInStaticVariableDeclaration = false;
     _isInConstructorInitializer = false;
     _intType = _typeProvider.intType;
-    _typeSystem = _currentLibrary.typeSystem as TypeSystemImpl;
+    _typeSystem = _currentLibrary.typeSystem;
     _options = _currentLibrary.context.analysisOptions as AnalysisOptionsImpl;
     _typeArgumentsVerifier =
         TypeArgumentsVerifier(_options, _currentLibrary, _errorReporter);
@@ -276,7 +277,7 @@
     );
   }
 
-  ClassElement get enclosingClass => _enclosingClass;
+  ClassElement? get enclosingClass => _enclosingClass;
 
   /// For consumers of error verification as a library, (currently just the
   /// angular plugin), expose a setter that can make the errors reported more
@@ -284,7 +285,7 @@
   /// context. Note that this setter is very defensive for potential misuse; it
   /// should not be modified in the middle of visiting a tree and requires an
   /// analyzer-provided Impl instance to work.
-  set enclosingClass(ClassElement classElement) {
+  set enclosingClass(ClassElement? classElement) {
     assert(classElement is ClassElementImpl);
     assert(_enclosingClass == null);
     assert(_enclosingEnum == null);
@@ -356,8 +357,8 @@
     if (lhs is IndexExpression) {
       _checkIndexExpressionIndex(
         lhs.index,
-        readElement: node.readElement as ExecutableElement,
-        writeElement: node.writeElement as ExecutableElement,
+        readElement: node.readElement as ExecutableElement?,
+        writeElement: node.writeElement as ExecutableElement?,
       );
     }
     super.visitAssignmentExpression(node);
@@ -421,9 +422,9 @@
 
   @override
   void visitBreakStatement(BreakStatement node) {
-    SimpleIdentifier labelNode = node.label;
+    var labelNode = node.label;
     if (labelNode != null) {
-      Element labelElement = labelNode.staticElement;
+      var labelElement = labelNode.staticElement;
       if (labelElement is LabelElementImpl && labelElement.isOnSwitchMember) {
         _errorReporter.reportErrorForNode(
             CompileTimeErrorCode.BREAK_LABEL_ON_SWITCH_MEMBER, labelNode);
@@ -446,7 +447,7 @@
 
   @override
   void visitClassDeclaration(ClassDeclaration node) {
-    ClassElementImpl outerClass = _enclosingClass;
+    var outerClass = _enclosingClass;
     try {
       _isInNativeClass = node.nativeClause != null;
       _enclosingClass = node.declaredElement as ClassElementImpl;
@@ -456,9 +457,9 @@
       _checkForBuiltInIdentifierAsName(
           node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME);
       _checkForConflictingClassTypeVariableErrorCodes();
-      TypeName superclass = node.extendsClause?.superclass;
-      ImplementsClause implementsClause = node.implementsClause;
-      WithClause withClause = node.withClause;
+      var superclass = node.extendsClause?.superclass;
+      var implementsClause = node.implementsClause;
+      var withClause = node.withClause;
 
       // Only do error checks on the clause nodes if there is a non-null clause
       if (implementsClause != null ||
@@ -485,7 +486,7 @@
   void visitClassTypeAlias(ClassTypeAlias node) {
     _checkForBuiltInIdentifierAsName(
         node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME);
-    ClassElementImpl outerClassElement = _enclosingClass;
+    var outerClassElement = _enclosingClass;
     try {
       _enclosingClass = node.declaredElement as ClassElementImpl;
       _checkClassInheritance(
@@ -519,10 +520,10 @@
 
   @override
   void visitConstructorDeclaration(ConstructorDeclaration node) {
-    ConstructorElement element = node.declaredElement;
+    var element = node.declaredElement!;
     _withEnclosingExecutable(element, () {
       _checkForInvalidModifierOnBody(
-          node.body, CompileTimeErrorCode.INVALID_MODIFIER_ON_CONSTRUCTOR);
+          node.body!, CompileTimeErrorCode.INVALID_MODIFIER_ON_CONSTRUCTOR);
       _checkForConstConstructorWithNonFinalField(node, element);
       _checkForConstConstructorWithNonConstSuper(node);
       _constructorFieldsVerifier.verify(node);
@@ -543,7 +544,7 @@
     _isInConstructorInitializer = true;
     try {
       SimpleIdentifier fieldName = node.fieldName;
-      Element staticElement = fieldName.staticElement;
+      var staticElement = fieldName.staticElement;
       _checkForInvalidField(node, fieldName, staticElement);
       if (staticElement is FieldElement) {
         _checkForFieldInitializerNotAssignable(node, staticElement);
@@ -558,9 +559,9 @@
 
   @override
   void visitContinueStatement(ContinueStatement node) {
-    SimpleIdentifier labelNode = node.label;
+    var labelNode = node.label;
     if (labelNode != null) {
-      Element labelElement = labelNode.staticElement;
+      var labelElement = labelNode.staticElement;
       if (labelElement is LabelElementImpl &&
           labelElement.isOnSwitchStatement) {
         _errorReporter.reportErrorForNode(
@@ -577,9 +578,9 @@
 
   @override
   void visitEnumDeclaration(EnumDeclaration node) {
-    ClassElement outerEnum = _enclosingEnum;
+    var outerEnum = _enclosingEnum;
     try {
-      _enclosingEnum = node.declaredElement;
+      _enclosingEnum = node.declaredElement!;
       _duplicateDefinitionVerifier.checkEnum(node);
       super.visitEnumDeclaration(node);
     } finally {
@@ -591,7 +592,7 @@
   void visitExportDirective(ExportDirective node) {
     var exportElement = node.element;
     if (exportElement != null) {
-      LibraryElement exportedLibrary = exportElement.exportedLibrary;
+      var exportedLibrary = exportElement.exportedLibrary;
       _checkForAmbiguousExport(node, exportElement, exportedLibrary);
       _checkForExportInternalLibrary(node, exportElement);
       _checkForExportLegacySymbol(node);
@@ -641,7 +642,7 @@
     if (!_isInStaticVariableDeclaration) {
       if (fields.isConst) {
         _errorReporter.reportErrorForToken(
-            CompileTimeErrorCode.CONST_INSTANCE_FIELD, fields.keyword);
+            CompileTimeErrorCode.CONST_INSTANCE_FIELD, fields.keyword!);
       }
     }
     try {
@@ -662,9 +663,9 @@
     _checkForPrivateOptionalParameter(node);
     _checkForFieldInitializingFormalRedirectingConstructor(node);
     _checkForTypeAnnotationDeferredClass(node.type);
-    ParameterElement element = node.declaredElement;
+    ParameterElement element = node.declaredElement!;
     if (element is FieldFormalParameterElement) {
-      FieldElement fieldElement = element.field;
+      var fieldElement = element.field;
       if (fieldElement != null) {
         _checkForAbstractOrExternalFieldConstructorInitializer(
             node.identifier, fieldElement);
@@ -676,15 +677,11 @@
   @override
   void visitForEachPartsWithDeclaration(ForEachPartsWithDeclaration node) {
     DeclaredIdentifier loopVariable = node.loopVariable;
-    if (loopVariable == null) {
-      // Ignore malformed for statements.
-      return;
-    }
     if (_checkForEachParts(node, loopVariable.identifier)) {
       if (loopVariable.isConst) {
         _errorReporter.reportErrorForToken(
             CompileTimeErrorCode.FOR_IN_WITH_CONST_VARIABLE,
-            loopVariable.keyword);
+            loopVariable.keyword!);
       }
     }
     super.visitForEachPartsWithDeclaration(node);
@@ -693,10 +690,6 @@
   @override
   void visitForEachPartsWithIdentifier(ForEachPartsWithIdentifier node) {
     SimpleIdentifier identifier = node.identifier;
-    if (identifier == null) {
-      // Ignore malformed for statements.
-      return;
-    }
     if (_checkForEachParts(node, identifier)) {
       _checkForAssignmentToFinal(identifier);
     }
@@ -713,23 +706,20 @@
 
   @override
   void visitForPartsWithDeclarations(ForPartsWithDeclarations node) {
-    if (node.variables != null) {
-      _duplicateDefinitionVerifier.checkForVariables(node.variables);
-    }
+    _duplicateDefinitionVerifier.checkForVariables(node.variables);
     super.visitForPartsWithDeclarations(node);
   }
 
   @override
   void visitFunctionDeclaration(FunctionDeclaration node) {
-    ExecutableElement functionElement = node.declaredElement;
-    if (functionElement != null &&
-        functionElement.enclosingElement is! CompilationUnitElement) {
-      _hiddenElements.declare(functionElement);
+    ExecutableElement functionElement = node.declaredElement!;
+    if (functionElement.enclosingElement is! CompilationUnitElement) {
+      _hiddenElements!.declare(functionElement);
     }
 
     _withEnclosingExecutable(functionElement, () {
       SimpleIdentifier identifier = node.name;
-      TypeAnnotation returnType = node.returnType;
+      TypeAnnotation? returnType = node.returnType;
       if (node.isGetter) {
         GetterSetterTypesVerifier(
           typeSystem: _typeSystem,
@@ -739,15 +729,13 @@
       }
       if (node.isSetter) {
         FunctionExpression functionExpression = node.functionExpression;
-        if (functionExpression != null) {
-          _checkForWrongNumberOfParametersForSetter(
-              identifier, functionExpression.parameters);
-        }
+        _checkForWrongNumberOfParametersForSetter(
+            identifier, functionExpression.parameters);
         _checkForNonVoidReturnTypeForSetter(returnType);
       }
       _checkForTypeAnnotationDeferredClass(returnType);
       _returnTypeVerifier.verifyReturnType(returnType);
-      _checkForImplicitDynamicReturn(node.name, node.declaredElement);
+      _checkForImplicitDynamicReturn(node.name, node.declaredElement!);
       _checkForMainFunction(node.name);
       super.visitFunctionDeclaration(node);
     });
@@ -760,7 +748,7 @@
     if (node.parent is FunctionDeclaration) {
       super.visitFunctionExpression(node);
     } else {
-      _withEnclosingExecutable(node.declaredElement, () {
+      _withEnclosingExecutable(node.declaredElement!, () {
         super.visitFunctionExpression(node);
       });
     }
@@ -776,7 +764,7 @@
       return super.visitFunctionExpressionInvocation(node);
     }
 
-    DartType expressionType = functionExpression.staticType;
+    DartType expressionType = functionExpression.staticType!;
     if (!_checkForUseOfVoidResult(functionExpression) &&
         !_checkForUseOfNever(functionExpression) &&
         node.staticElement == null &&
@@ -812,7 +800,7 @@
       // we can get the function element via `node?.element?.type?.element` but
       // it doesn't have hasImplicitReturnType set correctly.
       if (!_options.implicitDynamic && node.returnType == null) {
-        DartType parameterType = node.declaredElement.type;
+        DartType parameterType = node.declaredElement!.type;
         if (parameterType is FunctionType &&
             parameterType.returnType.isDynamic) {
           _errorReporter.reportErrorForNode(
@@ -848,8 +836,8 @@
   void visitImportDirective(ImportDirective node) {
     var importElement = node.element;
     if (node.prefix != null) {
-      _checkForBuiltInIdentifierAsName(
-          node.prefix, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_PREFIX_NAME);
+      _checkForBuiltInIdentifierAsName(node.prefix!,
+          CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_PREFIX_NAME);
     }
     if (importElement != null) {
       _checkForImportInternalLibrary(node, importElement);
@@ -882,7 +870,7 @@
   void visitInstanceCreationExpression(InstanceCreationExpression node) {
     ConstructorName constructorName = node.constructorName;
     TypeName typeName = constructorName.type;
-    DartType type = typeName.type;
+    DartType type = typeName.type!;
     if (type is InterfaceType) {
       _checkForConstOrNewWithAbstractClass(node, typeName, type);
       _checkForConstOrNewWithEnum(node, typeName, type);
@@ -930,8 +918,8 @@
 
   @override
   void visitMethodDeclaration(MethodDeclaration node) {
-    _withEnclosingExecutable(node.declaredElement, () {
-      TypeAnnotation returnType = node.returnType;
+    _withEnclosingExecutable(node.declaredElement!, () {
+      var returnType = node.returnType;
       if (node.isStatic && node.isGetter) {
         GetterSetterTypesVerifier(
           typeSystem: _typeSystem,
@@ -950,7 +938,7 @@
       _checkForExtensionDeclaresMemberOfObject(node);
       _checkForTypeAnnotationDeferredClass(returnType);
       _returnTypeVerifier.verifyReturnType(returnType);
-      _checkForImplicitDynamicReturn(node, node.declaredElement);
+      _checkForImplicitDynamicReturn(node, node.declaredElement!);
       _checkForWrongTypeParameterVarianceInMethod(node);
       super.visitMethodDeclaration(node);
     });
@@ -958,14 +946,14 @@
 
   @override
   void visitMethodInvocation(MethodInvocation node) {
-    Expression target = node.realTarget;
+    var target = node.realTarget;
     SimpleIdentifier methodName = node.methodName;
     if (target != null) {
-      ClassElement typeReference = ElementResolver.getTypeReference(target);
+      var typeReference = ElementResolver.getTypeReference(target);
       _checkForStaticAccessToInstanceMember(typeReference, methodName);
       _checkForInstanceAccessToStaticMember(
           typeReference, node.target, methodName);
-      _checkForUnnecessaryNullAware(target, node.operator);
+      _checkForUnnecessaryNullAware(target, node.operator!);
     } else {
       _checkForUnqualifiedReferenceToNonLocalStaticMember(methodName);
     }
@@ -977,7 +965,7 @@
   @override
   void visitMixinDeclaration(MixinDeclaration node) {
     // TODO(scheglov) Verify for all mixin errors.
-    ClassElementImpl outerClass = _enclosingClass;
+    var outerClass = _enclosingClass;
     try {
       _enclosingClass = node.declaredElement as ClassElementImpl;
 
@@ -987,8 +975,8 @@
           node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME);
       _checkForConflictingClassTypeVariableErrorCodes();
 
-      OnClause onClause = node.onClause;
-      ImplementsClause implementsClause = node.implementsClause;
+      var onClause = node.onClause;
+      var implementsClause = node.implementsClause;
 
       // Only do error checks only if there is a non-null clause.
       if (onClause != null || implementsClause != null) {
@@ -1036,8 +1024,8 @@
     if (operand is IndexExpression) {
       _checkIndexExpressionIndex(
         operand.index,
-        readElement: node.readElement as ExecutableElement,
-        writeElement: node.writeElement as ExecutableElement,
+        readElement: node.readElement as ExecutableElement?,
+        writeElement: node.writeElement as ExecutableElement?,
       );
     }
     super.visitPostfixExpression(node);
@@ -1046,8 +1034,7 @@
   @override
   void visitPrefixedIdentifier(PrefixedIdentifier node) {
     if (node.parent is! Annotation) {
-      ClassElement typeReference =
-          ElementResolver.getTypeReference(node.prefix);
+      var typeReference = ElementResolver.getTypeReference(node.prefix);
       SimpleIdentifier name = node.identifier;
       _checkForStaticAccessToInstanceMember(typeReference, name);
       _checkForInstanceAccessToStaticMember(typeReference, node.prefix, name);
@@ -1069,8 +1056,8 @@
     if (operand is IndexExpression) {
       _checkIndexExpressionIndex(
         operand.index,
-        readElement: node.readElement as ExecutableElement,
-        writeElement: node.writeElement as ExecutableElement,
+        readElement: node.readElement as ExecutableElement?,
+        writeElement: node.writeElement as ExecutableElement?,
       );
     }
     super.visitPrefixExpression(node);
@@ -1079,7 +1066,7 @@
   @override
   void visitPropertyAccess(PropertyAccess node) {
     var target = node.realTarget;
-    ClassElement typeReference = ElementResolver.getTypeReference(target);
+    var typeReference = ElementResolver.getTypeReference(target);
     SimpleIdentifier propertyName = node.propertyName;
     _checkForStaticAccessToInstanceMember(typeReference, propertyName);
     _checkForInstanceAccessToStaticMember(
@@ -1264,7 +1251,7 @@
   @override
   void visitVariableDeclaration(VariableDeclaration node) {
     SimpleIdentifier nameNode = node.name;
-    Expression initializerNode = node.initializer;
+    var initializerNode = node.initializer;
     // do checks
     _checkForInvalidAssignment(nameNode, initializerNode);
     _checkForImplicitDynamicIdentifier(node, nameNode);
@@ -1282,15 +1269,13 @@
       _namesForReferenceToDeclaredVariableInInitializer.remove(name);
     }
     // declare the variable
-    AstNode grandparent = node.parent.parent;
+    AstNode grandparent = node.parent!.parent!;
     if (grandparent is! TopLevelVariableDeclaration &&
         grandparent is! FieldDeclaration) {
-      VariableElement element = node.declaredElement;
-      if (element != null) {
-        // There is no hidden elements if we are outside of a function body,
-        // which will happen for variables declared in control flow elements.
-        _hiddenElements?.declare(element);
-      }
+      VariableElement element = node.declaredElement!;
+      // There is no hidden elements if we are outside of a function body,
+      // which will happen for variables declared in control flow elements.
+      _hiddenElements?.declare(element);
     }
   }
 
@@ -1320,9 +1305,9 @@
   /// interfaces.
   void _checkClassInheritance(
       NamedCompilationUnitMember node,
-      TypeName superclass,
-      WithClause withClause,
-      ImplementsClause implementsClause) {
+      TypeName? superclass,
+      WithClause? withClause,
+      ImplementsClause? implementsClause) {
     // Only check for all of the inheritance logic around clauses if there
     // isn't an error code such as "Cannot extend double" already on the
     // class.
@@ -1353,7 +1338,7 @@
     int count = directives.length;
     if (count > 1) {
       for (int i = 0; i < count; i++) {
-        Token deferredToken = directives[i].deferredKeyword;
+        var deferredToken = directives[i].deferredKeyword;
         if (deferredToken != null) {
           _errorReporter.reportErrorForToken(
               CompileTimeErrorCode.SHARED_DEFERRED_PREFIX, deferredToken);
@@ -1400,7 +1385,7 @@
   ///
   /// See [CompileTimeErrorCode.MIXIN_CLASS_DECLARES_CONSTRUCTOR],
   /// [CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT].
-  bool _checkForAllMixinErrorCodes(WithClause withClause) {
+  bool _checkForAllMixinErrorCodes(WithClause? withClause) {
     if (withClause == null) {
       return false;
     }
@@ -1410,7 +1395,7 @@
         mixinNameIndex < withClause.mixinTypes.length;
         mixinNameIndex++) {
       TypeName mixinName = withClause.mixinTypes[mixinNameIndex];
-      DartType mixinType = mixinName.type;
+      DartType mixinType = mixinName.type!;
       if (mixinType is InterfaceType) {
         mixinTypeIndex++;
         if (_checkForExtendsOrImplementsDisallowedClass(
@@ -1449,25 +1434,23 @@
   void _checkForAllRedirectConstructorErrorCodes(
       ConstructorDeclaration declaration) {
     // Prepare redirected constructor node
-    ConstructorName redirectedConstructor = declaration.redirectedConstructor;
+    var redirectedConstructor = declaration.redirectedConstructor;
     if (redirectedConstructor == null) {
       return;
     }
 
     // Prepare redirected constructor type
-    ConstructorElement redirectedElement = redirectedConstructor.staticElement;
+    var redirectedElement = redirectedConstructor.staticElement;
     if (redirectedElement == null) {
       // If the element is null, we check for the
       // REDIRECT_TO_MISSING_CONSTRUCTOR case
       TypeName constructorTypeName = redirectedConstructor.type;
-      DartType redirectedType = constructorTypeName.type;
-      if (redirectedType != null &&
-          redirectedType.element != null &&
-          !redirectedType.isDynamic) {
+      DartType redirectedType = constructorTypeName.type!;
+      if (redirectedType.element != null && !redirectedType.isDynamic) {
         // Prepare the constructor name
         String constructorStrName = constructorTypeName.name.name;
         if (redirectedConstructor.name != null) {
-          constructorStrName += ".${redirectedConstructor.name.name}";
+          constructorStrName += ".${redirectedConstructor.name!.name}";
         }
         _errorReporter.reportErrorForNode(
             CompileTimeErrorCode.REDIRECT_TO_MISSING_CONSTRUCTOR,
@@ -1480,7 +1463,7 @@
     DartType redirectedReturnType = redirectedType.returnType;
 
     // Report specific problem when return type is incompatible
-    FunctionType constructorType = declaration.declaredElement.type;
+    FunctionType constructorType = declaration.declaredElement!.type;
     DartType constructorReturnType = constructorType.returnType;
     if (!_typeSystem.isAssignableTo2(
         redirectedReturnType, constructorReturnType)) {
@@ -1506,7 +1489,7 @@
   ///
   /// See [CompileTimeErrorCode.AMBIGUOUS_EXPORT].
   void _checkForAmbiguousExport(ExportDirective directive,
-      ExportElement exportElement, LibraryElement exportedLibrary) {
+      ExportElement exportElement, LibraryElement? exportedLibrary) {
     if (exportedLibrary == null) {
       return;
     }
@@ -1515,14 +1498,14 @@
         NamespaceBuilder().createExportNamespaceForDirective(exportElement);
     Map<String, Element> definedNames = namespace.definedNames;
     for (String name in definedNames.keys) {
-      Element element = definedNames[name];
-      Element prevElement = _exportedElements[name];
-      if (element != null && prevElement != null && prevElement != element) {
+      var element = definedNames[name]!;
+      var prevElement = _exportedElements[name];
+      if (prevElement != null && prevElement != element) {
         _errorReporter.reportErrorForNode(
             CompileTimeErrorCode.AMBIGUOUS_EXPORT, directive.uri, [
           name,
-          prevElement.library.definingCompilationUnit.source.uri,
-          element.library.definingCompilationUnit.source.uri
+          prevElement.library!.definingCompilationUnit.source.uri,
+          element.library!.definingCompilationUnit.source.uri
         ]);
         return;
       } else {
@@ -1534,15 +1517,12 @@
   /// Check the given node to see whether it was ambiguous because the name was
   /// imported from two or more imports.
   void _checkForAmbiguousImport(SimpleIdentifier node) {
-    Element element = node.writeOrReadElement;
+    var element = node.writeOrReadElement;
     if (element is MultiplyDefinedElementImpl) {
       String name = element.displayName;
       List<Element> conflictingMembers = element.conflictingElements;
-      int count = conflictingMembers.length;
-      List<String> libraryNames = List<String>.filled(count, null);
-      for (int i = 0; i < count; i++) {
-        libraryNames[i] = _getLibraryName(conflictingMembers[i]);
-      }
+      var libraryNames =
+          conflictingMembers.map((e) => _getLibraryName(e)).toList();
       libraryNames.sort();
       _errorReporter.reportErrorForNode(CompileTimeErrorCode.AMBIGUOUS_IMPORT,
           node, [name, StringUtilities.printListOfQuotedNames(libraryNames)]);
@@ -1555,11 +1535,11 @@
   /// argument.
   void _checkForArgumentTypeNotAssignable(
       Expression expression,
-      DartType expectedStaticType,
+      DartType? expectedStaticType,
       DartType actualStaticType,
       ErrorCode errorCode) {
     // Warning case: test static type information
-    if (actualStaticType != null && expectedStaticType != null) {
+    if (expectedStaticType != null) {
       if (!expectedStaticType.isVoid && _checkForUseOfVoidResult(expression)) {
         return;
       }
@@ -1578,11 +1558,6 @@
   /// See [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE].
   void _checkForArgumentTypeNotAssignableForArgument(Expression argument,
       {bool promoteParameterToNullable = false}) {
-    // TODO(scheglov) probably cannot happen
-    if (argument == null) {
-      return;
-    }
-
     _checkForArgumentTypeNotAssignableForArgument2(
       argument: argument,
       parameter: argument.staticParameterElement,
@@ -1591,11 +1566,11 @@
   }
 
   void _checkForArgumentTypeNotAssignableForArgument2({
-    @required Expression argument,
-    @required ParameterElement parameter,
-    @required bool promoteParameterToNullable,
+    required Expression argument,
+    required ParameterElement? parameter,
+    required bool promoteParameterToNullable,
   }) {
-    DartType staticParameterType = parameter?.type;
+    var staticParameterType = parameter?.type;
     if (promoteParameterToNullable && staticParameterType != null) {
       staticParameterType =
           _typeSystem.makeNullable(staticParameterType as TypeImpl);
@@ -1615,9 +1590,11 @@
   /// [StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE], and
   /// [StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE].
   void _checkForArgumentTypeNotAssignableWithExpectedTypes(
-      Expression expression, DartType expectedStaticType, ErrorCode errorCode) {
+      Expression expression,
+      DartType? expectedStaticType,
+      ErrorCode errorCode) {
     _checkForArgumentTypeNotAssignable(
-        expression, expectedStaticType, expression.staticType, errorCode);
+        expression, expectedStaticType, expression.staticType!, errorCode);
   }
 
   /// Verify that the arguments in the given [argumentList] can be assigned to
@@ -1628,10 +1605,6 @@
   ///
   /// See [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE].
   void _checkForArgumentTypesNotAssignableInList(ArgumentList argumentList) {
-    if (argumentList == null) {
-      return;
-    }
-
     for (Expression argument in argumentList.arguments) {
       _checkForArgumentTypeNotAssignableForArgument(argument);
     }
@@ -1639,10 +1612,9 @@
 
   bool _checkForAssignableExpression(
       Expression expression, DartType expectedStaticType, ErrorCode errorCode) {
-    DartType actualStaticType = expression.staticType;
-    return actualStaticType != null &&
-        _checkForAssignableExpressionAtType(
-            expression, actualStaticType, expectedStaticType, errorCode);
+    DartType actualStaticType = expression.staticType!;
+    return _checkForAssignableExpressionAtType(
+        expression, actualStaticType, expectedStaticType, errorCode);
   }
 
   bool _checkForAssignableExpressionAtType(
@@ -1687,16 +1659,18 @@
     }
 
     // prepare element
-    Element element;
+    Element? element;
     AstNode highlightedNode = expression;
     if (expression is Identifier) {
       element = expression.staticElement;
       if (expression is PrefixedIdentifier) {
-        highlightedNode = expression.identifier;
+        var prefixedIdentifier = expression as PrefixedIdentifier;
+        highlightedNode = prefixedIdentifier.identifier;
       }
     } else if (expression is PropertyAccess) {
-      element = expression.propertyName.staticElement;
-      highlightedNode = expression.propertyName;
+      var propertyAccess = expression as PropertyAccess;
+      element = propertyAccess.propertyName.staticElement;
+      highlightedNode = propertyAccess.propertyName;
     }
     // check if element is assignable
     if (element is VariableElement) {
@@ -1763,8 +1737,8 @@
   /// Verifies that the class is not named `Function` and that it doesn't
   /// extends/implements/mixes in `Function`.
   void _checkForBadFunctionUse(ClassDeclaration node) {
-    ExtendsClause extendsClause = node.extendsClause;
-    WithClause withClause = node.withClause;
+    var extendsClause = node.extendsClause;
+    var withClause = node.withClause;
 
     if (node.name.name == "Function") {
       _errorReporter.reportErrorForNode(
@@ -1772,7 +1746,7 @@
     }
 
     if (extendsClause != null) {
-      Element superElement = extendsClause.superclass.name.staticElement;
+      var superElement = extendsClause.superclass.name.staticElement;
       if (superElement != null && superElement.name == "Function") {
         _errorReporter.reportErrorForNode(
             HintCode.DEPRECATED_EXTENDS_FUNCTION, extendsClause.superclass);
@@ -1781,7 +1755,7 @@
 
     if (withClause != null) {
       for (TypeName type in withClause.mixinTypes) {
-        Element mixinElement = type.name.staticElement;
+        var mixinElement = type.name.staticElement;
         if (mixinElement != null && mixinElement.name == "Function") {
           _errorReporter.reportErrorForNode(
               HintCode.DEPRECATED_MIXIN_FUNCTION, type);
@@ -1814,7 +1788,7 @@
     NodeList<Statement> statements = switchCase.statements;
     if (statements.isEmpty) {
       // fall-through without statements at all
-      AstNode parent = switchCase.parent;
+      var parent = switchCase.parent;
       if (parent is SwitchStatement) {
         NodeList<SwitchMember> members = parent.members;
         int index = members.indexOf(switchCase);
@@ -1878,26 +1852,26 @@
     Uri libraryUri = _currentLibrary.source.uri;
 
     // method declared in the enclosing class vs. inherited getter/setter
-    for (MethodElement method in _enclosingClass.methods) {
+    for (MethodElement method in _enclosingClass!.methods) {
       String name = method.name;
 
       // find inherited property accessor
-      ExecutableElement inherited = _inheritanceManager.getInherited2(
-          _enclosingClass, Name(libraryUri, name));
+      var inherited = _inheritanceManager.getInherited2(
+          _enclosingClass!, Name(libraryUri, name));
       inherited ??= _inheritanceManager.getInherited2(
-          _enclosingClass, Name(libraryUri, '$name='));
+          _enclosingClass!, Name(libraryUri, '$name='));
 
       if (method.isStatic && inherited != null) {
         _errorReporter.reportErrorForElement(
             CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE, method, [
-          _enclosingClass.displayName,
+          _enclosingClass!.displayName,
           name,
           inherited.enclosingElement.displayName,
         ]);
       } else if (inherited is PropertyAccessorElement) {
         _errorReporter.reportErrorForElement(
             CompileTimeErrorCode.CONFLICTING_METHOD_AND_FIELD, method, [
-          _enclosingClass.displayName,
+          _enclosingClass!.displayName,
           name,
           inherited.enclosingElement.displayName
         ]);
@@ -1905,26 +1879,26 @@
     }
 
     // getter declared in the enclosing class vs. inherited method
-    for (PropertyAccessorElement accessor in _enclosingClass.accessors) {
+    for (PropertyAccessorElement accessor in _enclosingClass!.accessors) {
       String name = accessor.displayName;
 
       // find inherited method or property accessor
-      ExecutableElement inherited = _inheritanceManager.getInherited2(
-          _enclosingClass, Name(libraryUri, name));
+      var inherited = _inheritanceManager.getInherited2(
+          _enclosingClass!, Name(libraryUri, name));
       inherited ??= _inheritanceManager.getInherited2(
-          _enclosingClass, Name(libraryUri, '$name='));
+          _enclosingClass!, Name(libraryUri, '$name='));
 
       if (accessor.isStatic && inherited != null) {
         _errorReporter.reportErrorForElement(
             CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE, accessor, [
-          _enclosingClass.displayName,
+          _enclosingClass!.displayName,
           name,
           inherited.enclosingElement.displayName,
         ]);
       } else if (inherited is MethodElement) {
         _errorReporter.reportErrorForElement(
             CompileTimeErrorCode.CONFLICTING_FIELD_AND_METHOD, accessor, [
-          _enclosingClass.displayName,
+          _enclosingClass!.displayName,
           name,
           inherited.enclosingElement.displayName
         ]);
@@ -1938,19 +1912,20 @@
   /// See [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_CLASS], and
   /// [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER].
   void _checkForConflictingClassTypeVariableErrorCodes() {
-    for (TypeParameterElement typeParameter in _enclosingClass.typeParameters) {
+    for (TypeParameterElement typeParameter
+        in _enclosingClass!.typeParameters) {
       String name = typeParameter.name;
       // name is same as the name of the enclosing class
-      if (_enclosingClass.name == name) {
+      if (_enclosingClass!.name == name) {
         _errorReporter.reportErrorForElement(
             CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_CLASS,
             typeParameter,
             [name]);
       }
       // check members
-      if (_enclosingClass.getMethod(name) != null ||
-          _enclosingClass.getGetter(name) != null ||
-          _enclosingClass.getSetter(name) != null) {
+      if (_enclosingClass!.getMethod(name) != null ||
+          _enclosingClass!.getGetter(name) != null ||
+          _enclosingClass!.getSetter(name) != null) {
         _errorReporter.reportErrorForElement(
             CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER_CLASS,
             typeParameter,
@@ -1965,19 +1940,19 @@
   /// [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_EXTENSION_MEMBER].
   void _checkForConflictingExtensionTypeVariableErrorCodes() {
     for (TypeParameterElement typeParameter
-        in _enclosingExtension.typeParameters) {
+        in _enclosingExtension!.typeParameters) {
       String name = typeParameter.name;
       // name is same as the name of the enclosing class
-      if (_enclosingExtension.name == name) {
+      if (_enclosingExtension!.name == name) {
         _errorReporter.reportErrorForElement(
             CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_EXTENSION,
             typeParameter,
             [name]);
       }
       // check members
-      if (_enclosingExtension.getMethod(name) != null ||
-          _enclosingExtension.getGetter(name) != null ||
-          _enclosingExtension.getSetter(name) != null) {
+      if (_enclosingExtension!.getMethod(name) != null ||
+          _enclosingExtension!.getGetter(name) != null ||
+          _enclosingExtension!.getSetter(name) != null) {
         _errorReporter.reportErrorForElement(
             CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER_EXTENSION,
             typeParameter,
@@ -1998,7 +1973,7 @@
           CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES,
           node,
           [
-            _enclosingClass.name,
+            _enclosingClass!.name,
             error.first.getDisplayString(withNullability: true),
             error.second.getDisplayString(withNullability: true),
           ],
@@ -2027,7 +2002,7 @@
 
     // check for mixins
     var instanceFields = <FieldElement>[];
-    for (var mixin in _enclosingClass.mixins) {
+    for (var mixin in _enclosingClass!.mixins) {
       instanceFields.addAll(mixin.element.fields
           .where((field) => !field.isStatic && !field.isSynthetic));
     }
@@ -2052,7 +2027,7 @@
     // try to find and check super constructor invocation
     for (ConstructorInitializer initializer in constructor.initializers) {
       if (initializer is SuperConstructorInvocation) {
-        ConstructorElement element = initializer.staticElement;
+        var element = initializer.staticElement;
         if (element == null || element.isConst) {
           return;
         }
@@ -2064,15 +2039,14 @@
       }
     }
     // no explicit super constructor invocation, check default constructor
-    InterfaceType supertype = _enclosingClass.supertype;
+    var supertype = _enclosingClass!.supertype;
     if (supertype == null) {
       return;
     }
     if (supertype.isDartCoreObject) {
       return;
     }
-    ConstructorElement unnamedConstructor =
-        supertype.element.unnamedConstructor;
+    var unnamedConstructor = supertype.element.unnamedConstructor;
     if (unnamedConstructor == null || unnamedConstructor.isConst) {
       return;
     }
@@ -2144,7 +2118,7 @@
       TypeName typeName,
       InterfaceType type) {
     if (type.element.isAbstract && !type.element.isMixin) {
-      ConstructorElement element = expression.constructorName.staticElement;
+      var element = expression.constructorName.staticElement;
       if (element != null && !element.isFactory) {
         bool isImplicit =
             (expression as InstanceCreationExpressionImpl).isImplicit;
@@ -2191,12 +2165,11 @@
   ///
   /// See [CompileTimeErrorCode.CONST_WITH_NON_CONST].
   void _checkForConstWithNonConst(InstanceCreationExpression expression) {
-    ConstructorElement constructorElement =
-        expression.constructorName.staticElement;
+    var constructorElement = expression.constructorName.staticElement;
     if (constructorElement != null && !constructorElement.isConst) {
       if (expression.keyword != null) {
         _errorReporter.reportErrorForToken(
-            CompileTimeErrorCode.CONST_WITH_NON_CONST, expression.keyword);
+            CompileTimeErrorCode.CONST_WITH_NON_CONST, expression.keyword!);
       } else {
         _errorReporter.reportErrorForNode(
             CompileTimeErrorCode.CONST_WITH_NON_CONST, expression);
@@ -2222,17 +2195,17 @@
     if (constructorName.staticElement != null) {
       return;
     }
-    DartType type = typeName.type;
+    DartType type = typeName.type!;
     if (type is InterfaceType) {
       ClassElement element = type.element;
-      if (element != null && element.isEnum) {
+      if (element.isEnum) {
         // We have already reported the error.
         return;
       }
     }
     Identifier className = typeName.name;
     // report as named or default constructor absence
-    SimpleIdentifier name = constructorName.name;
+    var name = constructorName.name;
     if (name != null) {
       _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR,
@@ -2285,11 +2258,11 @@
       for (int i = 0; i < count; i++) {
         Directive directive = directives[i];
         if (directive is ImportDirective) {
-          SimpleIdentifier prefix = directive.prefix;
+          var prefix = directive.prefix;
           if (prefix != null) {
-            Element element = prefix.staticElement;
+            var element = prefix.staticElement;
             if (element is PrefixElement) {
-              List<ImportDirective> elements = prefixToDirectivesMap[element];
+              var elements = prefixToDirectivesMap[element];
               if (elements == null) {
                 elements = <ImportDirective>[];
                 prefixToDirectivesMap[element] = elements;
@@ -2312,7 +2285,7 @@
       return false;
     }
 
-    DartType iterableType = node.iterable.staticType;
+    DartType iterableType = node.iterable.staticType!;
 
     // TODO(scheglov) use NullableDereferenceVerifier
     if (_isNonNullableByDefault) {
@@ -2330,8 +2303,8 @@
       return false;
     }
 
-    AstNode parent = node.parent;
-    Token awaitKeyword;
+    Token? awaitKeyword;
+    var parent = node.parent;
     if (parent is ForStatement) {
       awaitKeyword = parent.awaitKeyword;
     } else if (parent is ForElement) {
@@ -2363,7 +2336,7 @@
       return false;
     }
 
-    DartType sequenceElementType;
+    DartType? sequenceElementType;
     {
       var sequenceElement = awaitKeyword != null
           ? _typeProvider.streamElement
@@ -2401,15 +2374,15 @@
       return;
     }
 
-    LibraryElement exportedLibrary = exportElement.exportedLibrary;
+    var exportedLibrary = exportElement.exportedLibrary;
     if (exportedLibrary == null) {
       return;
     }
 
     // should be private
-    DartSdk sdk = _currentLibrary.context.sourceFactory.dartSdk;
-    String uri = exportedLibrary.source.uri.toString();
-    SdkLibrary sdkLibrary = sdk.getSdkLibrary(uri);
+    var sdk = _currentLibrary.context.sourceFactory.dartSdk!;
+    var uri = exportedLibrary.source.uri.toString();
+    var sdkLibrary = sdk.getSdkLibrary(uri);
     if (sdkLibrary == null) {
       return;
     }
@@ -2429,7 +2402,7 @@
       return;
     }
 
-    var element = node.element;
+    var element = node.element!;
     // TODO(scheglov) Expose from ExportElement.
     var namespace =
         NamespaceBuilder().createExportNamespaceForDirective(element);
@@ -2439,7 +2412,7 @@
           element == NeverElementImpl.instance) {
         continue;
       }
-      if (!element.library.isNonNullableByDefault) {
+      if (!element.library!.isNonNullableByDefault) {
         _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.EXPORT_LEGACY_SYMBOL,
           node.uri,
@@ -2455,7 +2428,7 @@
   /// Verify that the given extends [clause] does not extend a deferred class.
   ///
   /// See [CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS].
-  void _checkForExtendsDeferredClass(TypeName superclass) {
+  void _checkForExtendsDeferredClass(TypeName? superclass) {
     if (superclass == null) {
       return;
     }
@@ -2467,7 +2440,7 @@
   /// 'num' or 'String'.
   ///
   /// See [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS].
-  bool _checkForExtendsDisallowedClass(TypeName superclass) {
+  bool _checkForExtendsDisallowedClass(TypeName? superclass) {
     if (superclass == null) {
       return false;
     }
@@ -2515,7 +2488,7 @@
       return false;
     }
     return typeName.type is InterfaceType &&
-        _typeProvider.nonSubtypableClasses.contains(typeName.type.element);
+        _typeProvider.nonSubtypableClasses.contains(typeName.type!.element);
   }
 
   void _checkForExtensionDeclaresMemberOfObject(MethodDeclaration node) {
@@ -2546,14 +2519,8 @@
     DartType fieldType = fieldElement.type;
     // prepare expression type
     Expression expression = initializer.expression;
-    if (expression == null) {
-      return;
-    }
     // test the static type of the expression
-    DartType staticType = expression.staticType;
-    if (staticType == null) {
-      return;
-    }
+    DartType staticType = expression.staticType!;
     if (_typeSystem.isAssignableTo2(staticType, fieldType)) {
       return;
     }
@@ -2601,11 +2568,11 @@
   void _checkForFieldInitializingFormalRedirectingConstructor(
       FieldFormalParameter parameter) {
     // prepare the node that should be a ConstructorDeclaration
-    AstNode formalParameterList = parameter.parent;
+    var formalParameterList = parameter.parent;
     if (formalParameterList is! FormalParameterList) {
       formalParameterList = formalParameterList?.parent;
     }
-    AstNode constructor = formalParameterList?.parent;
+    var constructor = formalParameterList?.parent;
     // now check whether the node is actually a ConstructorDeclaration
     if (constructor is ConstructorDeclaration) {
       // constructor cannot be a factory
@@ -2706,11 +2673,11 @@
     }
   }
 
-  void _checkForGenericFunctionType(TypeAnnotation node) {
+  void _checkForGenericFunctionType(TypeAnnotation? node) {
     if (node == null) {
       return;
     }
-    DartType type = node.type;
+    DartType type = node.type!;
     if (type is FunctionType && type.typeFormals.isNotEmpty) {
       _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_BOUND,
@@ -2724,7 +2691,7 @@
   ///
   /// See [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS],
   /// [CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS].
-  bool _checkForImplementsClauseErrorCodes(ImplementsClause clause) {
+  bool _checkForImplementsClauseErrorCodes(ImplementsClause? clause) {
     if (clause == null) {
       return false;
     }
@@ -2741,11 +2708,11 @@
     return foundError;
   }
 
-  void _checkForImplicitDynamicIdentifier(AstNode node, Identifier id) {
+  void _checkForImplicitDynamicIdentifier(AstNode node, Identifier? id) {
     if (_options.implicitDynamic) {
       return;
     }
-    VariableElement variable = getVariableElement(id);
+    var variable = getVariableElement(id);
     if (variable != null &&
         variable.hasImplicitType &&
         variable.type.isDynamic) {
@@ -2769,21 +2736,19 @@
     if (element is PropertyAccessorElement && element.isSetter) {
       return;
     }
-    if (element != null &&
-        element.hasImplicitReturnType &&
-        element.returnType.isDynamic) {
+    if (element.hasImplicitReturnType && element.returnType.isDynamic) {
       _errorReporter.reportErrorForNode(LanguageCode.IMPLICIT_DYNAMIC_RETURN,
           functionName, [element.displayName]);
     }
   }
 
-  void _checkForImplicitDynamicType(TypeAnnotation node) {
+  void _checkForImplicitDynamicType(TypeAnnotation? node) {
     if (_options.implicitDynamic ||
         node == null ||
         (node is TypeName && node.typeArguments != null)) {
       return;
     }
-    DartType type = node.type;
+    DartType type = node.type!;
     if (type is ParameterizedType &&
         type.typeArguments.isNotEmpty &&
         type.typeArguments.any((t) => t.isDynamic)) {
@@ -2804,15 +2769,15 @@
       return;
     }
 
-    LibraryElement importedLibrary = importElement.importedLibrary;
+    var importedLibrary = importElement.importedLibrary;
     if (importedLibrary == null) {
       return;
     }
 
     // should be private
-    DartSdk sdk = _currentLibrary.context.sourceFactory.dartSdk;
-    String uri = importedLibrary.source.uri.toString();
-    SdkLibrary sdkLibrary = sdk.getSdkLibrary(uri);
+    var sdk = _currentLibrary.context.sourceFactory.dartSdk!;
+    var uri = importedLibrary.source.uri.toString();
+    var sdkLibrary = sdk.getSdkLibrary(uri);
     if (sdkLibrary == null || !sdkLibrary.isInternal) {
       return;
     }
@@ -2828,13 +2793,13 @@
   ///
   /// See [CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER].
   void _checkForInstanceAccessToStaticMember(
-      ClassElement typeReference, Expression target, SimpleIdentifier name) {
+      ClassElement? typeReference, Expression? target, SimpleIdentifier name) {
     if (_isInComment) {
       // OK, in comment
       return;
     }
     // prepare member Element
-    Element element = name.writeOrReadElement;
+    var element = name.writeOrReadElement;
     if (element is ExecutableElement) {
       if (!element.isStatic) {
         // OK, instance member
@@ -2875,11 +2840,8 @@
   ///
   /// See [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE].
   void _checkForIntNotAssignable(Expression argument) {
-    if (argument == null) {
-      return;
-    }
-    ParameterElement staticParameterElement = argument.staticParameterElement;
-    DartType staticParameterType = staticParameterElement?.type;
+    var staticParameterElement = argument.staticParameterElement;
+    var staticParameterType = staticParameterElement?.type;
     _checkForArgumentTypeNotAssignable(argument, staticParameterType, _intType,
         CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
   }
@@ -2900,7 +2862,7 @@
   /// represent a valid assignment.
   ///
   /// See [CompileTimeErrorCode.INVALID_ASSIGNMENT].
-  void _checkForInvalidAssignment(Expression lhs, Expression rhs) {
+  void _checkForInvalidAssignment(Expression? lhs, Expression? rhs) {
     if (lhs == null || rhs == null) {
       return;
     }
@@ -2917,11 +2879,11 @@
     DartType leftType;
     var parent = lhs.parent;
     if (parent is AssignmentExpression && parent.leftHandSide == lhs) {
-      leftType = parent.writeType;
+      leftType = parent.writeType!;
     } else {
-      VariableElement leftVariableElement = getVariableElement(lhs);
+      var leftVariableElement = getVariableElement(lhs);
       leftType = (leftVariableElement == null)
-          ? lhs.staticType
+          ? lhs.staticType!
           : leftVariableElement.type;
     }
 
@@ -2938,7 +2900,7 @@
   /// [ConstructorFieldInitializer]. The [staticElement] is the static element
   /// from the name in the [ConstructorFieldInitializer].
   void _checkForInvalidField(ConstructorFieldInitializer initializer,
-      SimpleIdentifier fieldName, Element staticElement) {
+      SimpleIdentifier fieldName, Element? staticElement) {
     if (staticElement is FieldElement) {
       if (staticElement.isSynthetic) {
         _errorReporter.reportErrorForNode(
@@ -2978,7 +2940,7 @@
       return;
     }
     // prepare element
-    Element element = identifier.writeOrReadElement;
+    var element = identifier.writeOrReadElement;
     if (!(element is MethodElement || element is PropertyAccessorElement)) {
       return;
     }
@@ -2994,7 +2956,7 @@
       return;
     }
     // qualified method invocation
-    AstNode parent = identifier.parent;
+    var parent = identifier.parent;
     if (parent is MethodInvocation) {
       if (identical(parent.methodName, identifier) &&
           parent.realTarget != null) {
@@ -3003,8 +2965,7 @@
     }
     // qualified property access
     if (parent is PropertyAccess) {
-      if (identical(parent.propertyName, identifier) &&
-          parent.realTarget != null) {
+      if (identical(parent.propertyName, identifier)) {
         return;
       }
     }
@@ -3032,7 +2993,7 @@
   /// with it, and report it as an error if it does.
   void _checkForInvalidModifierOnBody(
       FunctionBody body, CompileTimeErrorCode errorCode) {
-    Token keyword = body.keyword;
+    var keyword = body.keyword;
     if (keyword != null) {
       _errorReporter.reportErrorForToken(errorCode, keyword, [keyword.lexeme]);
     }
@@ -3058,7 +3019,7 @@
     if (lateKeyword == null) return;
 
     var hasConstConstructor =
-        _enclosingClass.constructors.any((c) => c.isConst);
+        _enclosingClass!.constructors.any((c) => c.isConst);
     if (!hasConstConstructor) return;
 
     _errorReporter.reportErrorForToken(
@@ -3088,7 +3049,7 @@
     // Determine the list's element type. We base this on the static type and
     // not the literal's type arguments because in strong mode, the type
     // arguments may be inferred.
-    DartType listType = literal.staticType;
+    DartType listType = literal.staticType!;
     assert(listType is InterfaceTypeImpl);
 
     List<DartType> typeArguments =
@@ -3105,7 +3066,7 @@
       _checkForUseOfVoidResult,
       forList: true,
       elementType: listElementType,
-      featureSet: _featureSet,
+      featureSet: _featureSet!,
     );
     for (CollectionElement element in literal.elements) {
       verifier.verify(element);
@@ -3117,7 +3078,7 @@
       return;
     }
 
-    var element = nameNode.staticElement;
+    var element = nameNode.staticElement!;
 
     // We should only check exported declarations, i.e. top-level.
     if (element.enclosingElement is! CompilationUnitElement) {
@@ -3138,7 +3099,7 @@
 
     var functionDeclaration = nameNode.parent as FunctionDeclaration;
     var functionExpression = functionDeclaration.functionExpression;
-    var parameters = functionExpression.parameters.parameters;
+    var parameters = functionExpression.parameters!.parameters;
     var positional = parameters.where((e) => e.isPositional).toList();
     var requiredPositional =
         parameters.where((e) => e.isRequiredPositional).toList();
@@ -3159,7 +3120,7 @@
 
     if (positional.isNotEmpty) {
       var first = positional.first;
-      var type = first.declaredElement.type;
+      var type = first.declaredElement!.type;
       var listOfString = _typeProvider.listType2(_typeProvider.stringType);
       if (!_typeSystem.isSubtypeOf2(listOfString, type)) {
         _errorReporter.reportErrorForNode(
@@ -3174,12 +3135,7 @@
     // Determine the map's key and value types. We base this on the static type
     // and not the literal's type arguments because in strong mode, the type
     // arguments may be inferred.
-    DartType mapType = literal.staticType;
-    if (mapType == null) {
-      // This is known to happen when the literal is the default value in an
-      // optional parameter in a generic function type alias.
-      return;
-    }
+    DartType mapType = literal.staticType!;
     assert(mapType is InterfaceTypeImpl);
 
     List<DartType> typeArguments = (mapType as InterfaceTypeImpl).typeArguments;
@@ -3199,7 +3155,7 @@
         forMap: true,
         mapKeyType: keyType,
         mapValueType: valueType,
-        featureSet: _featureSet,
+        featureSet: _featureSet!,
       );
       for (CollectionElement element in literal.elements) {
         verifier.verify(element);
@@ -3300,7 +3256,7 @@
   /// See [CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT].
   bool _checkForMixinInheritsNotFromObject(
       TypeName mixinName, ClassElement mixinElement) {
-    InterfaceType mixinSupertype = mixinElement.supertype;
+    var mixinSupertype = mixinElement.supertype;
     if (mixinSupertype != null) {
       if (!mixinSupertype.isDartCoreObject ||
           !mixinElement.isMixinApplication && mixinElement.mixins.isNotEmpty) {
@@ -3320,7 +3276,7 @@
   bool _checkForMixinSuperclassConstraints(int mixinIndex, TypeName mixinName) {
     InterfaceType mixinType = mixinName.type as InterfaceType;
     for (var constraint in mixinType.superclassConstraints) {
-      var superType = _enclosingClass.supertype as InterfaceTypeImpl;
+      var superType = _enclosingClass!.supertype as InterfaceTypeImpl;
       if (_currentLibrary.isNonNullableByDefault) {
         superType = superType.withNullability(NullabilitySuffix.none);
       }
@@ -3329,7 +3285,7 @@
       if (!isSatisfied) {
         for (int i = 0; i < mixinIndex && !isSatisfied; i++) {
           isSatisfied =
-              _typeSystem.isSubtypeOf2(_enclosingClass.mixins[i], constraint);
+              _typeSystem.isSubtypeOf2(_enclosingClass!.mixins[i], constraint);
         }
       }
       if (!isSatisfied) {
@@ -3363,7 +3319,7 @@
       var nameObject = Name(mixinLibraryUri, name);
 
       var superMember = _inheritanceManager.getMember2(
-          _enclosingClass, nameObject,
+          _enclosingClass!, nameObject,
           forMixinIndex: mixinIndex, concrete: true, forSuper: true);
 
       if (superMember == null) {
@@ -3375,7 +3331,7 @@
         return true;
       }
 
-      ExecutableElement mixinMember =
+      var mixinMember =
           _inheritanceManager.getMember(mixinType, nameObject, forSuper: true);
 
       if (mixinMember != null) {
@@ -3403,11 +3359,11 @@
   /// library that defines a private member that conflicts with a private name
   /// from the same library but from a superclass or a different mixin.
   void _checkForMixinWithConflictingPrivateMember(
-      WithClause withClause, TypeName superclassName) {
+      WithClause? withClause, TypeName? superclassName) {
     if (withClause == null) {
       return;
     }
-    DartType declaredSupertype = superclassName?.type;
+    var declaredSupertype = superclassName?.type;
     if (declaredSupertype is! InterfaceType) {
       return;
     }
@@ -3430,7 +3386,7 @@
           return true;
         }
         names[name] = typeName.name.name;
-        ExecutableElement inheritedMember = _inheritanceManager.getMember2(
+        var inheritedMember = _inheritanceManager.getMember2(
           declaredSupertype.element,
           Name(library.source.uri, name),
           concrete: true,
@@ -3450,7 +3406,7 @@
     }
 
     for (TypeName mixinType in withClause.mixinTypes) {
-      DartType type = mixinType.type;
+      DartType type = mixinType.type!;
       if (type is InterfaceType) {
         LibraryElement library = type.element.library;
         if (library != _currentLibrary) {
@@ -3517,7 +3473,7 @@
     if (constructorName.staticElement != null) {
       return;
     }
-    DartType type = typeName.type;
+    DartType type = typeName.type!;
     if (type is InterfaceType) {
       ClassElement element = type.element;
       if (element.isEnum || element.isMixin) {
@@ -3528,7 +3484,7 @@
     // prepare class name
     Identifier className = typeName.name;
     // report as named or default constructor absence
-    SimpleIdentifier name = constructorName.name;
+    var name = constructorName.name;
     if (name != null) {
       _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.NEW_WITH_UNDEFINED_CONSTRUCTOR,
@@ -3550,27 +3506,30 @@
   void _checkForNoDefaultSuperConstructorImplicit(
       ClassDeclaration declaration) {
     // do nothing if there is explicit constructor
-    List<ConstructorElement> constructors = _enclosingClass.constructors;
+    List<ConstructorElement> constructors = _enclosingClass!.constructors;
     if (!constructors[0].isSynthetic) {
       return;
     }
     // prepare super
-    InterfaceType superType = _enclosingClass.supertype;
+    var superType = _enclosingClass!.supertype;
     if (superType == null) {
       return;
     }
     ClassElement superElement = superType.element;
     // try to find default generative super constructor
-    ConstructorElement superUnnamedConstructor =
-        superElement.unnamedConstructor;
-    superUnnamedConstructor =
-        _currentLibrary.toLegacyElementIfOptOut(superUnnamedConstructor);
+    var superUnnamedConstructor = superElement.unnamedConstructor;
+    superUnnamedConstructor = superUnnamedConstructor != null
+        ? _currentLibrary.toLegacyElementIfOptOut(superUnnamedConstructor)
+        : superUnnamedConstructor;
     if (superUnnamedConstructor != null) {
       if (superUnnamedConstructor.isFactory) {
         _errorReporter.reportErrorForNode(
             CompileTimeErrorCode.NON_GENERATIVE_IMPLICIT_CONSTRUCTOR,
-            declaration.name,
-            [superElement.name, _enclosingClass.name, superUnnamedConstructor]);
+            declaration.name, [
+          superElement.name,
+          _enclosingClass!.name,
+          superUnnamedConstructor
+        ]);
         return;
       }
       if (superUnnamedConstructor.isDefaultConstructor) {
@@ -3584,16 +3543,16 @@
       _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT,
           declaration.name,
-          [superType, _enclosingClass.displayName]);
+          [superType, _enclosingClass!.displayName]);
     }
   }
 
-  bool _checkForNoGenerativeConstructorsInSuperclass(TypeName superclass) {
-    InterfaceType superType = _enclosingClass.supertype;
+  bool _checkForNoGenerativeConstructorsInSuperclass(TypeName? superclass) {
+    var superType = _enclosingClass!.supertype;
     if (superType == null) {
       return false;
     }
-    if (_enclosingClass.constructors
+    if (_enclosingClass!.constructors
         .every((constructor) => constructor.isFactory)) {
       // A class with no generative constructors *can* be extended if the
       // subclass has only factory constructors.
@@ -3610,8 +3569,8 @@
       // no generative constructors. State this clearly to users.
       _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.NO_GENERATIVE_CONSTRUCTORS_IN_SUPERCLASS,
-          superclass,
-          [_enclosingClass.name, superElement.name]);
+          superclass!,
+          [_enclosingClass!.name, superElement.name]);
       return true;
     }
     return false;
@@ -3633,7 +3592,7 @@
       return;
     }
     // prepare statement
-    Statement statement = literal.thisOrAncestorOfType<ExpressionStatement>();
+    var statement = literal.thisOrAncestorOfType<ExpressionStatement>();
     if (statement == null) {
       return;
     }
@@ -3658,10 +3617,10 @@
       return;
     }
     // check return type
-    TypeAnnotation annotation = declaration.returnType;
+    var annotation = declaration.returnType;
     if (annotation != null) {
-      DartType type = annotation.type;
-      if (type != null && !type.isVoid) {
+      DartType type = annotation.type!;
+      if (!type.isVoid) {
         _errorReporter.reportErrorForNode(
             CompileTimeErrorCode.NON_VOID_RETURN_FOR_OPERATOR, annotation);
       }
@@ -3672,10 +3631,10 @@
   /// (either `null` or the type 'void').
   ///
   /// See [StaticWarningCode.NON_VOID_RETURN_FOR_SETTER].
-  void _checkForNonVoidReturnTypeForSetter(TypeAnnotation typeName) {
+  void _checkForNonVoidReturnTypeForSetter(TypeAnnotation? typeName) {
     if (typeName != null) {
-      DartType type = typeName.type;
-      if (type != null && !type.isVoid) {
+      DartType type = typeName.type!;
+      if (!type.isVoid) {
         _errorReporter.reportErrorForNode(
             CompileTimeErrorCode.NON_VOID_RETURN_FOR_SETTER, typeName);
       }
@@ -3748,7 +3707,7 @@
     if (node.type == null) {
       return;
     }
-    var type = node.type.type;
+    var type = node.type!.type!;
 
     if (!_typeSystem.isPotentiallyNonNullable(type)) {
       return;
@@ -3769,13 +3728,13 @@
   ///
   /// See [CompileTimeErrorCode.MIXIN_SUPER_CLASS_CONSTRAINT_DISALLOWED_CLASS],
   /// [CompileTimeErrorCode.MIXIN_SUPER_CLASS_CONSTRAINT_DEFERRED_CLASS].
-  bool _checkForOnClauseErrorCodes(OnClause onClause) {
+  bool _checkForOnClauseErrorCodes(OnClause? onClause) {
     if (onClause == null) {
       return false;
     }
     bool problemReported = false;
     for (TypeName typeName in onClause.superclassConstraints) {
-      DartType type = typeName.type;
+      DartType type = typeName.type!;
       if (type is InterfaceType) {
         if (_checkForExtendsOrImplementsDisallowedClass(
             typeName,
@@ -3803,7 +3762,7 @@
   ///
   /// See [CompileTimeErrorCode.OPTIONAL_PARAMETER_IN_OPERATOR].
   void _checkForOptionalParameterInOperator(MethodDeclaration declaration) {
-    FormalParameterList parameterList = declaration.parameters;
+    var parameterList = declaration.parameters;
     if (parameterList == null) {
       return;
     }
@@ -3872,13 +3831,13 @@
       return;
     }
     // name should start with '_'
-    SimpleIdentifier name = parameter.identifier;
+    var name = parameter.identifier;
     if (name == null || name.isSynthetic || !name.name.startsWith('_')) {
       return;
     }
 
     _errorReporter.reportErrorForNode(
-        CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER, parameter.identifier);
+        CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER, name);
   }
 
   /// Check whether the given constructor [declaration] is the redirecting
@@ -3913,8 +3872,7 @@
   bool _checkForRecursiveFactoryRedirect(
       ConstructorDeclaration declaration, ConstructorElement element) {
     // prepare redirected constructor
-    ConstructorName redirectedConstructorNode =
-        declaration.redirectedConstructor;
+    var redirectedConstructorNode = declaration.redirectedConstructor;
     if (redirectedConstructorNode == null) {
       return false;
     }
@@ -3942,7 +3900,7 @@
   void _checkForRedirectingConstructorErrorCodes(
       ConstructorDeclaration declaration) {
     // Check for default values in the parameters
-    ConstructorName redirectedConstructor = declaration.redirectedConstructor;
+    var redirectedConstructor = declaration.redirectedConstructor;
     if (redirectedConstructor != null) {
       for (FormalParameter parameter in declaration.parameters.parameters) {
         if (parameter is DefaultFormalParameter &&
@@ -3950,23 +3908,24 @@
           _errorReporter.reportErrorForNode(
               CompileTimeErrorCode
                   .DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR,
-              parameter.identifier);
+              parameter.identifier!);
         }
       }
+      var redirectedElement = redirectedConstructor.staticElement;
       _checkForRedirectToNonConstConstructor(
-        declaration.declaredElement,
-        redirectedConstructor.staticElement,
+        declaration.declaredElement!,
+        redirectedElement,
         redirectedConstructor,
       );
-      var redirectedClass =
-          redirectedConstructor.staticElement?.enclosingElement;
+      var redirectedClass = redirectedElement?.enclosingElement;
       if (redirectedClass is ClassElement &&
           redirectedClass.isAbstract &&
-          !redirectedConstructor.staticElement.isFactory) {
-        String enclosingTypeName = _enclosingClass.displayName;
+          redirectedElement != null &&
+          !redirectedElement.isFactory) {
+        String enclosingTypeName = _enclosingClass!.displayName;
         String constructorStrName = enclosingTypeName;
         if (declaration.name != null) {
-          constructorStrName += ".${declaration.name.name}";
+          constructorStrName += ".${declaration.name!.name}";
         }
         _errorReporter.reportErrorForNode(
             CompileTimeErrorCode.REDIRECT_TO_ABSTRACT_CLASS_CONSTRUCTOR,
@@ -3985,12 +3944,12 @@
         }
         if (declaration.factoryKeyword == null) {
           RedirectingConstructorInvocation invocation = initializer;
-          ConstructorElement redirectingElement = invocation.staticElement;
+          var redirectingElement = invocation.staticElement;
           if (redirectingElement == null) {
-            String enclosingTypeName = _enclosingClass.displayName;
+            String enclosingTypeName = _enclosingClass!.displayName;
             String constructorStrName = enclosingTypeName;
             if (invocation.constructorName != null) {
-              constructorStrName += ".${invocation.constructorName.name}";
+              constructorStrName += ".${invocation.constructorName!.name}";
             }
             _errorReporter.reportErrorForNode(
                 CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR,
@@ -4008,7 +3967,7 @@
         // [declaration] is a redirecting constructor via a redirecting
         // initializer.
         _checkForRedirectToNonConstConstructor(
-          declaration.declaredElement,
+          declaration.declaredElement!,
           initializer.staticElement,
           initializer.constructorName ?? initializer.thisKeyword,
         );
@@ -4043,7 +4002,7 @@
   /// See [CompileTimeErrorCode.REDIRECT_TO_NON_CONST_CONSTRUCTOR].
   void _checkForRedirectToNonConstConstructor(
     ConstructorElement element,
-    ConstructorElement redirectedElement,
+    ConstructorElement? redirectedElement,
     SyntacticEntity errorEntity,
   ) {
     // This constructor is const, but it redirects to a non-const constructor.
@@ -4059,16 +4018,18 @@
   }
 
   void _checkForReferenceBeforeDeclaration(SimpleIdentifier node) {
+    var element = node.staticElement;
     if (!node.inDeclarationContext() &&
+        element != null &&
         _hiddenElements != null &&
-        _hiddenElements.contains(node.staticElement) &&
+        _hiddenElements!.contains(element) &&
         node.parent is! CommentReference) {
       _errorReporter.reportError(DiagnosticFactory()
           .referencedBeforeDeclaration(_errorReporter.source, node));
     }
   }
 
-  void _checkForRepeatedType(List<TypeName> typeNames, ErrorCode errorCode) {
+  void _checkForRepeatedType(List<TypeName>? typeNames, ErrorCode errorCode) {
     if (typeNames == null) {
       return;
     }
@@ -4080,7 +4041,7 @@
     }
     for (int i = 0; i < count; i++) {
       if (!detectedRepeatOnIndex[i]) {
-        Element element = typeNames[i].name.staticElement;
+        var element = typeNames[i].name.staticElement;
         for (int j = i + 1; j < count; j++) {
           TypeName typeName = typeNames[j];
           if (typeName.name.staticElement == element) {
@@ -4114,7 +4075,7 @@
       return;
     }
     // block body (with possible return statement) is checked elsewhere
-    FunctionBody body = declaration.body;
+    FunctionBody body = declaration.body!;
     if (body is! ExpressionFunctionBody) {
       return;
     }
@@ -4132,7 +4093,7 @@
     // Determine the set's element type. We base this on the static type and
     // not the literal's type arguments because in strong mode, the type
     // arguments may be inferred.
-    DartType setType = literal.staticType;
+    DartType setType = literal.staticType!;
     assert(setType is InterfaceTypeImpl);
 
     List<DartType> typeArguments = (setType as InterfaceTypeImpl).typeArguments;
@@ -4151,7 +4112,7 @@
         _checkForUseOfVoidResult,
         forSet: true,
         elementType: setElementType,
-        featureSet: _featureSet,
+        featureSet: _featureSet!,
       );
       for (CollectionElement element in literal.elements) {
         verifier.verify(element);
@@ -4164,7 +4125,7 @@
   ///
   /// See [StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER].
   void _checkForStaticAccessToInstanceMember(
-      ClassElement typeReference, SimpleIdentifier name) {
+      ClassElement? typeReference, SimpleIdentifier name) {
     // OK, in comment
     if (_isInComment) {
       return;
@@ -4174,7 +4135,7 @@
       return;
     }
     // prepare member Element
-    Element element = name.staticElement;
+    var element = name.staticElement;
     if (element is ExecutableElement) {
       // OK, static
       if (element.isStatic || element is ConstructorElement) {
@@ -4203,20 +4164,16 @@
     }
 
     // prepare 'switch' expression type
-    DartType expressionType = expression.staticType;
-    if (expressionType == null) {
-      return;
-    }
+    DartType expressionType = expression.staticType!;
 
     // compare with type of the first non-default 'case'
-    SwitchCase switchCase = statement.members
-        .firstWhere((member) => member is SwitchCase, orElse: () => null);
+    var switchCase = statement.members.whereType<SwitchCase>().firstOrNull;
     if (switchCase == null) {
       return;
     }
 
     Expression caseExpression = switchCase.expression;
-    DartType caseType = caseExpression.staticType;
+    DartType caseType = caseExpression.staticType!;
 
     // check types
     if (!_typeSystem.isAssignableTo2(expressionType, caseType)) {
@@ -4231,7 +4188,7 @@
     if (!_isNonNullableByDefault) return;
 
     var expression = node.expression;
-    var type = node.expression.staticType;
+    var type = node.expression.staticType!;
 
     if (!_typeSystem.isAssignableTo2(type, _typeSystem.objectNone)) {
       _errorReporter.reportErrorForNode(
@@ -4261,7 +4218,7 @@
   /// Verify that the [type] is not a deferred type.
   ///
   /// See [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS].
-  void _checkForTypeAnnotationDeferredClass(TypeAnnotation type) {
+  void _checkForTypeAnnotationDeferredClass(TypeAnnotation? type) {
     if (type is TypeName && type.isDeferred) {
       _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.TYPE_ANNOTATION_DEFERRED_CLASS,
@@ -4274,17 +4231,17 @@
   ///
   /// See [CompileTimeErrorCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND].
   void _checkForTypeParameterBoundRecursion(List<TypeParameter> parameters) {
-    Map<TypeParameterElement, TypeParameter> elementToNode;
+    Map<TypeParameterElement, TypeParameter>? elementToNode;
     for (var parameter in parameters) {
       if (parameter.bound != null) {
         if (elementToNode == null) {
           elementToNode = {};
           for (var parameter in parameters) {
-            elementToNode[parameter.declaredElement] = parameter;
+            elementToNode[parameter.declaredElement!] = parameter;
           }
         }
 
-        TypeParameter current = parameter;
+        TypeParameter? current = parameter;
         for (var step = 0; current != null; step++) {
           var bound = current.bound;
           if (bound is TypeName) {
@@ -4293,7 +4250,7 @@
             current = null;
           }
           if (step == parameters.length) {
-            var element = parameter.declaredElement;
+            var element = parameter.declaredElement!;
             _errorReporter.reportErrorForNode(
               CompileTimeErrorCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND,
               parameter,
@@ -4357,7 +4314,7 @@
 
     // Check to see whether the superclass has a non-factory unnamed
     // constructor.
-    InterfaceType superType = _enclosingClass.supertype;
+    var superType = _enclosingClass!.supertype;
     if (superType == null) {
       return;
     }
@@ -4367,10 +4324,10 @@
       // Already reported [NO_GENERATIVE_CONSTRUCTORS_IN_SUPERCLASS].
       return;
     }
-    ConstructorElement superUnnamedConstructor =
-        superElement.unnamedConstructor;
-    superUnnamedConstructor =
-        _currentLibrary.toLegacyElementIfOptOut(superUnnamedConstructor);
+    var superUnnamedConstructor = superElement.unnamedConstructor;
+    superUnnamedConstructor = superUnnamedConstructor != null
+        ? _currentLibrary.toLegacyElementIfOptOut(superUnnamedConstructor)
+        : superUnnamedConstructor;
     if (superUnnamedConstructor != null) {
       if (superUnnamedConstructor.isFactory) {
         _errorReporter.reportErrorForNode(
@@ -4379,7 +4336,7 @@
             [superUnnamedConstructor]);
       } else if (!superUnnamedConstructor.isDefaultConstructor) {
         Identifier returnType = constructor.returnType;
-        SimpleIdentifier name = constructor.name;
+        var name = constructor.name;
         int offset = returnType.offset;
         int length = (name != null ? name.end : returnType.end) - offset;
         _errorReporter.reportErrorForOffset(
@@ -4410,7 +4367,7 @@
     List<Object> arguments = const [];
     if (operator.type == TokenType.QUESTION) {
       errorCode = StaticWarningCode.INVALID_NULL_AWARE_OPERATOR;
-      endToken = operator.next;
+      endToken = operator.next!;
       arguments = ['?[', '['];
     } else if (operator.type == TokenType.QUESTION_PERIOD) {
       errorCode = StaticWarningCode.INVALID_NULL_AWARE_OPERATOR;
@@ -4429,7 +4386,7 @@
 
     /// If the operator is not valid because the target already makes use of a
     /// null aware operator, return the null aware operator from the target.
-    Token previousShortCircuitingOperator(Expression target) {
+    Token? previousShortCircuitingOperator(Expression? target) {
       if (target is PropertyAccess) {
         var operator = target.operator;
         var type = operator.type;
@@ -4457,7 +4414,7 @@
     if (target is ExtensionOverride) {
       var arguments = target.argumentList.arguments;
       if (arguments.length == 1) {
-        targetType = arguments[0].staticType;
+        targetType = arguments[0].staticType!;
       } else {
         return;
       }
@@ -4495,11 +4452,11 @@
   /// [CompileTimeErrorCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER].
   void _checkForUnqualifiedReferenceToNonLocalStaticMember(
       SimpleIdentifier name) {
-    Element element = name.writeOrReadElement;
+    var element = name.writeOrReadElement;
     if (element == null || element is TypeParameterElement) {
       return;
     }
-    Element enclosingElement = element.enclosingElement;
+    var enclosingElement = element.enclosingElement;
     if (identical(enclosingElement, _enclosingClass)) {
       return;
     }
@@ -4539,8 +4496,7 @@
   ///
   /// See [StaticWarningCode.RECEIVER_OF_TYPE_NEVER].
   bool _checkForUseOfNever(Expression expression) {
-    if (expression == null ||
-        !identical(expression.staticType, NeverTypeImpl.instance)) {
+    if (!identical(expression.staticType, NeverTypeImpl.instance)) {
       return false;
     }
 
@@ -4556,8 +4512,7 @@
   ///
   /// See [StaticWarningCode.USE_OF_VOID_RESULT].
   bool _checkForUseOfVoidResult(Expression expression) {
-    if (expression == null ||
-        !identical(expression.staticType, VoidTypeImpl.instance)) {
+    if (!identical(expression.staticType, VoidTypeImpl.instance)) {
       return false;
     }
 
@@ -4574,21 +4529,21 @@
   }
 
   void _checkForValidField(FieldFormalParameter parameter) {
-    AstNode parent2 = parameter.parent?.parent;
+    var parent2 = parameter.parent?.parent;
     if (parent2 is! ConstructorDeclaration &&
         parent2?.parent is! ConstructorDeclaration) {
       return;
     }
-    ParameterElement element = parameter.declaredElement;
+    ParameterElement element = parameter.declaredElement!;
     if (element is FieldFormalParameterElement) {
-      FieldElement fieldElement = element.field;
+      var fieldElement = element.field;
       if (fieldElement == null || fieldElement.isSynthetic) {
         _errorReporter.reportErrorForNode(
             CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD,
             parameter,
             [parameter.identifier.name]);
       } else {
-        ParameterElement parameterElement = parameter.declaredElement;
+        var parameterElement = parameter.declaredElement!;
         if (parameterElement is FieldFormalParameterElementImpl) {
           DartType declaredType = parameterElement.type;
           DartType fieldType = fieldElement.type;
@@ -4639,16 +4594,13 @@
   void _checkForWrongNumberOfParametersForOperator(
       MethodDeclaration declaration) {
     // prepare number of parameters
-    FormalParameterList parameterList = declaration.parameters;
+    var parameterList = declaration.parameters;
     if (parameterList == null) {
       return;
     }
     int numParameters = parameterList.parameters.length;
     // prepare operator name
     SimpleIdentifier nameNode = declaration.name;
-    if (nameNode == null) {
-      return;
-    }
     String name = nameNode.name;
     // check for exact number of parameters
     int expected = -1;
@@ -4696,8 +4648,8 @@
   ///
   /// See [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER].
   void _checkForWrongNumberOfParametersForSetter(
-      SimpleIdentifier setterName, FormalParameterList parameterList) {
-    if (setterName == null || parameterList == null) {
+      SimpleIdentifier setterName, FormalParameterList? parameterList) {
+    if (parameterList == null) {
       return;
     }
 
@@ -4711,12 +4663,12 @@
 
   void _checkForWrongTypeParameterVarianceInField(FieldDeclaration node) {
     if (_enclosingClass != null) {
-      for (var typeParameter in _enclosingClass.typeParameters) {
+      for (var typeParameter in _enclosingClass!.typeParameters) {
         // TODO (kallentu) : Clean up TypeParameterElementImpl casting once
         // variance is added to the interface.
         if (!(typeParameter as TypeParameterElementImpl).isLegacyCovariant) {
           var fields = node.fields;
-          var fieldElement = fields.variables.first.declaredElement;
+          var fieldElement = fields.variables.first.declaredElement!;
           var fieldName = fields.variables.first.name;
           Variance fieldVariance = Variance(typeParameter, fieldElement.type);
 
@@ -4740,7 +4692,7 @@
       return;
     }
 
-    for (var typeParameter in _enclosingClass.typeParameters) {
+    for (var typeParameter in _enclosingClass!.typeParameters) {
       // TODO (kallentu) : Clean up TypeParameterElementImpl casting once
       // variance is added to the interface.
       if ((typeParameter as TypeParameterElementImpl).isLegacyCovariant) {
@@ -4754,7 +4706,7 @@
             continue;
           }
           var methodTypeParameterVariance = Variance.invariant.combine(
-            Variance(typeParameter, methodTypeParameter.bound.type),
+            Variance(typeParameter, methodTypeParameter.bound!.type!),
           );
           _checkForWrongVariancePosition(
               methodTypeParameterVariance, typeParameter, methodTypeParameter);
@@ -4764,7 +4716,7 @@
       var methodParameters = method.parameters?.parameters;
       if (methodParameters != null) {
         for (var methodParameter in methodParameters) {
-          var methodParameterElement = methodParameter.declaredElement;
+          var methodParameterElement = methodParameter.declaredElement!;
           if (methodParameterElement.isCovariant) {
             continue;
           }
@@ -4778,7 +4730,8 @@
 
       var returnType = method.returnType;
       if (returnType != null) {
-        var methodReturnTypeVariance = Variance(typeParameter, returnType.type);
+        var methodReturnTypeVariance =
+            Variance(typeParameter, returnType.type!);
         _checkForWrongVariancePosition(
             methodReturnTypeVariance, typeParameter, returnType);
       }
@@ -4786,9 +4739,9 @@
   }
 
   void _checkForWrongTypeParameterVarianceInSuperinterfaces() {
-    void checkOne(DartType superInterface) {
+    void checkOne(DartType? superInterface) {
       if (superInterface != null) {
-        for (var typeParameter in _enclosingClass.typeParameters) {
+        for (var typeParameter in _enclosingClass!.typeParameters) {
           var superVariance = Variance(typeParameter, superInterface);
           // TODO (kallentu) : Clean up TypeParameterElementImpl casting once
           // variance is added to the interface.
@@ -4830,10 +4783,10 @@
       }
     }
 
-    checkOne(_enclosingClass.supertype);
-    _enclosingClass.interfaces.forEach(checkOne);
-    _enclosingClass.mixins.forEach(checkOne);
-    _enclosingClass.superclassConstraints.forEach(checkOne);
+    checkOne(_enclosingClass!.supertype);
+    _enclosingClass!.interfaces.forEach(checkOne);
+    _enclosingClass!.mixins.forEach(checkOne);
+    _enclosingClass!.superclassConstraints.forEach(checkOne);
   }
 
   /// Check for invalid variance positions in members of a class or mixin.
@@ -4870,18 +4823,18 @@
   /// 'extends' and 'implements' clauses.
   ///
   /// See [CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS].
-  void _checkImplementsSuperClass(ImplementsClause implementsClause) {
+  void _checkImplementsSuperClass(ImplementsClause? implementsClause) {
     if (implementsClause == null) {
       return;
     }
 
-    var superElement = _enclosingClass.supertype?.element;
+    var superElement = _enclosingClass!.supertype?.element;
     if (superElement == null) {
       return;
     }
 
     for (var interfaceNode in implementsClause.interfaces) {
-      if (interfaceNode.type.element == superElement) {
+      if (interfaceNode.type!.element == superElement) {
         _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS,
           interfaceNode,
@@ -4893,8 +4846,8 @@
 
   void _checkIndexExpressionIndex(
     Expression index, {
-    @required ExecutableElement readElement,
-    @required ExecutableElement writeElement,
+    required ExecutableElement? readElement,
+    required ExecutableElement? writeElement,
   }) {
     if (readElement is MethodElement) {
       var parameters = readElement.parameters;
@@ -4920,7 +4873,7 @@
   }
 
   void _checkMixinInference(
-      NamedCompilationUnitMember node, WithClause withClause) {
+      NamedCompilationUnitMember node, WithClause? withClause) {
     if (withClause == null) {
       return;
     }
@@ -4969,8 +4922,8 @@
 
   /// Checks the class for problems with the superclass, mixins, or implemented
   /// interfaces.
-  void _checkMixinInheritance(MixinDeclaration node, OnClause onClause,
-      ImplementsClause implementsClause) {
+  void _checkMixinInheritance(MixinDeclaration node, OnClause? onClause,
+      ImplementsClause? implementsClause) {
     // Only check for all of the inheritance logic around clauses if there
     // isn't an error code such as "Cannot implement double" already.
     if (!_checkForOnClauseErrorCodes(onClause) &&
@@ -4992,18 +4945,18 @@
   /// 'extends' and 'with' clauses.
   ///
   /// See [CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS].
-  void _checkMixinsSuperClass(WithClause withClause) {
+  void _checkMixinsSuperClass(WithClause? withClause) {
     if (withClause == null) {
       return;
     }
 
-    var superElement = _enclosingClass.supertype?.element;
+    var superElement = _enclosingClass!.supertype?.element;
     if (superElement == null) {
       return;
     }
 
     for (var mixinNode in withClause.mixinTypes) {
-      if (mixinNode.type.element == superElement) {
+      if (mixinNode.type!.element == superElement) {
         _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.MIXINS_SUPER_CLASS,
           mixinNode,
@@ -5014,7 +4967,7 @@
   }
 
   void _checkUseOfCovariantInParameters(FormalParameterList node) {
-    AstNode parent = node.parent;
+    var parent = node.parent;
     if (_enclosingClass != null &&
         parent is MethodDeclaration &&
         !parent.isStatic) {
@@ -5026,9 +4979,9 @@
     for (int i = 0; i < length; i++) {
       FormalParameter parameter = parameters[i];
       if (parameter is DefaultFormalParameter) {
-        parameter = (parameter as DefaultFormalParameter).parameter;
+        parameter = parameter.parameter;
       }
-      Token keyword = parameter.covariantKeyword;
+      var keyword = parameter.covariantKeyword;
       if (keyword != null) {
         if (_enclosingExtension != null) {
           // Reported by the parser.
@@ -5087,7 +5040,7 @@
             );
           }
         } else if (defaultValuesAreExpected && parameter.defaultValue == null) {
-          var type = parameter.declaredElement.type;
+          var type = parameter.declaredElement!.type;
           if (_typeSystem.isPotentiallyNonNullable(type)) {
             var parameterName = _parameterName(parameter);
             _errorReporter.reportErrorForNode(
@@ -5101,10 +5054,10 @@
     }
   }
 
-  InterfaceType _findInterfaceTypeForMixin(TypeName mixin,
+  InterfaceType? _findInterfaceTypeForMixin(TypeName mixin,
       InterfaceType supertypeConstraint, List<InterfaceType> interfaceTypes) {
     var element = supertypeConstraint.element;
-    InterfaceType foundInterfaceType;
+    InterfaceType? foundInterfaceType;
     for (var interfaceType in interfaceTypes) {
       if (interfaceType.element != element) continue;
       if (foundInterfaceType == null) {
@@ -5128,7 +5081,7 @@
     return foundInterfaceType;
   }
 
-  List<InterfaceType> _findInterfaceTypesForConstraints(
+  List<InterfaceType>? _findInterfaceTypesForConstraints(
       TypeName mixin,
       List<InterfaceType> supertypeConstraints,
       List<InterfaceType> interfaceTypes) {
@@ -5148,7 +5101,7 @@
 
   /// Given an [expression] in a switch case whose value is expected to be an
   /// enum constant, return the name of the constant.
-  String _getConstantName(Expression expression) {
+  String? _getConstantName(Expression expression) {
     // TODO(brianwilkerson) Convert this to return the element representing the
     // constant.
     if (expression is SimpleIdentifier) {
@@ -5186,11 +5139,11 @@
   }
 
   /// Return the name of the library that defines given [element].
-  String _getLibraryName(Element element) {
+  String _getLibraryName(Element? element) {
     if (element == null) {
       return StringUtilities.EMPTY;
     }
-    LibraryElement library = element.library;
+    var library = element.library;
     if (library == null) {
       return StringUtilities.EMPTY;
     }
@@ -5203,7 +5156,7 @@
     }
     List<String> indirectSources = <String>[];
     for (int i = 0; i < count; i++) {
-      LibraryElement importedLibrary = imports[i].importedLibrary;
+      var importedLibrary = imports[i].importedLibrary;
       if (importedLibrary != null) {
         for (LibraryElement exportedLibrary
             in importedLibrary.exportedLibraries) {
@@ -5234,7 +5187,7 @@
   /// indirectly.
   bool _hasRedirectingFactoryConstructorCycle(ConstructorElement constructor) {
     Set<ConstructorElement> constructors = HashSet<ConstructorElement>();
-    ConstructorElement current = constructor;
+    ConstructorElement? current = constructor;
     while (current != null) {
       if (constructors.contains(current)) {
         return identical(current, constructor);
@@ -5251,7 +5204,7 @@
     } else if (type is FunctionType || type.isDartCoreFunction) {
       return true;
     } else if (type is InterfaceType) {
-      MethodElement callMethod =
+      var callMethod =
           type.lookUpMethod2(FunctionElement.CALL_METHOD_NAME, _currentLibrary);
       return callMethod != null;
     }
@@ -5265,7 +5218,7 @@
     if (identifier.inDeclarationContext()) {
       return true;
     }
-    AstNode parent = identifier.parent;
+    var parent = identifier.parent;
     if (parent is Annotation) {
       return identical(parent.constructorName, identifier);
     }
@@ -5292,7 +5245,7 @@
 
   /// Return the name of the [parameter], or `null` if the parameter does not
   /// have a name.
-  SimpleIdentifier _parameterName(FormalParameter parameter) {
+  SimpleIdentifier? _parameterName(FormalParameter parameter) {
     if (parameter is NormalFormalParameter) {
       return parameter.identifier;
     } else if (parameter is DefaultFormalParameter) {
@@ -5321,7 +5274,7 @@
     try {
       f();
     } finally {
-      _hiddenElements = _hiddenElements.outerElements;
+      _hiddenElements = _hiddenElements!.outerElements;
     }
   }
 
@@ -5341,10 +5294,10 @@
       }
     }
 
-    List<FormalParameter> parameters = constructor.parameters?.parameters ?? [];
+    List<FormalParameter> parameters = constructor.parameters.parameters;
     for (FormalParameter parameter in parameters) {
       if (parameter is DefaultFormalParameter) {
-        parameter = (parameter as DefaultFormalParameter).parameter;
+        parameter = parameter.parameter;
       }
       if (parameter is FieldFormalParameter) {
         FieldFormalParameterElement element =
@@ -5364,9 +5317,9 @@
 
   /// Return the variable element represented by the given [expression], or
   /// `null` if there is no such element.
-  static VariableElement getVariableElement(Expression expression) {
+  static VariableElement? getVariableElement(Expression? expression) {
     if (expression is Identifier) {
-      Element element = expression.staticElement;
+      var element = expression.staticElement;
       if (element is VariableElement) {
         return element;
       }
@@ -5380,7 +5333,7 @@
 class HiddenElements {
   /// The elements hidden in outer scopes, or `null` if this is the outermost
   /// scope.
-  final HiddenElements outerElements;
+  final HiddenElements? outerElements;
 
   /// A set containing the elements that will be declared in this scope, but are
   /// not yet declared.
@@ -5398,7 +5351,7 @@
     if (_elements.contains(element)) {
       return true;
     } else if (outerElements != null) {
-      return outerElements.contains(element);
+      return outerElements!.contains(element);
     }
     return false;
   }
diff --git a/pkg/analyzer/lib/src/generated/ffi_verifier.dart b/pkg/analyzer/lib/src/generated/ffi_verifier.dart
index 7693984..299afe7 100644
--- a/pkg/analyzer/lib/src/generated/ffi_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/ffi_verifier.dart
@@ -56,14 +56,14 @@
   void visitClassDeclaration(ClassDeclaration node) {
     inStruct = false;
     // Only the Allocator, Opaque and Struct class may be extended.
-    ExtendsClause extendsClause = node.extendsClause;
+    var extendsClause = node.extendsClause;
     if (extendsClause != null) {
       final TypeName superclass = extendsClause.superclass;
       if (_isDartFfiClass(superclass)) {
-        final className = superclass.name.staticElement.name;
+        final className = superclass.name.staticElement!.name;
         if (className == _structClassName) {
           inStruct = true;
-          if (_isEmptyStruct(node.declaredElement)) {
+          if (_isEmptyStruct(node.declaredElement!)) {
             _errorReporter.reportErrorForNode(
                 FfiCode.EMPTY_STRUCT_WARNING, node, [node.name]);
           }
@@ -85,7 +85,7 @@
     // No classes from the FFI may be explicitly implemented.
     void checkSupertype(TypeName typename, FfiCode subtypeOfFfiCode,
         FfiCode subtypeOfStructCode) {
-      final superName = typename.name?.staticElement?.name;
+      final superName = typename.name.staticElement?.name;
       if (superName == _allocatorClassName) {
         return;
       }
@@ -98,14 +98,14 @@
       }
     }
 
-    ImplementsClause implementsClause = node.implementsClause;
+    var implementsClause = node.implementsClause;
     if (implementsClause != null) {
       for (TypeName type in implementsClause.interfaces) {
         checkSupertype(type, FfiCode.SUBTYPE_OF_FFI_CLASS_IN_IMPLEMENTS,
             FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_IMPLEMENTS);
       }
     }
-    WithClause withClause = node.withClause;
+    var withClause = node.withClause;
     if (withClause != null) {
       for (TypeName type in withClause.mixinTypes) {
         checkSupertype(type, FfiCode.SUBTYPE_OF_FFI_CLASS_IN_WITH,
@@ -113,7 +113,7 @@
       }
     }
 
-    if (inStruct && node.declaredElement.typeParameters.isNotEmpty) {
+    if (inStruct && node.declaredElement!.typeParameters.isNotEmpty) {
       _errorReporter.reportErrorForNode(
           FfiCode.GENERIC_STRUCT_SUBCLASS, node.name, [node.name]);
     }
@@ -139,9 +139,9 @@
 
   @override
   void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
-    Element element = node?.staticElement;
+    var element = node.staticElement;
     if (element is MethodElement) {
-      Element enclosingElement = element?.enclosingElement;
+      var enclosingElement = element.enclosingElement;
       if (enclosingElement is ExtensionElement) {
         if (_isAllocatorExtension(enclosingElement) &&
             element.name == _allocateExtensionMethodName) {
@@ -154,12 +154,14 @@
 
   @override
   void visitIndexExpression(IndexExpression node) {
-    Element element = node?.staticElement;
-    Element enclosingElement = element?.enclosingElement;
-    if (enclosingElement is ExtensionElement) {
-      if (_isNativeStructPointerExtension(enclosingElement)) {
-        if (element.name == '[]') {
-          _validateRefIndexed(node);
+    var element = node.staticElement;
+    if (element is MethodElement) {
+      var enclosingElement = element.enclosingElement;
+      if (enclosingElement is ExtensionElement) {
+        if (_isNativeStructPointerExtension(enclosingElement)) {
+          if (element.name == '[]') {
+            _validateRefIndexed(node);
+          }
         }
       }
     }
@@ -167,7 +169,7 @@
 
   @override
   void visitMethodInvocation(MethodInvocation node) {
-    Element element = node.methodName?.staticElement;
+    var element = node.methodName.staticElement;
     if (element is MethodElement) {
       Element enclosingElement = element.enclosingElement;
       if (enclosingElement is ClassElement) {
@@ -190,7 +192,7 @@
         }
       }
     } else if (element is FunctionElement) {
-      Element enclosingElement = element?.enclosingElement;
+      var enclosingElement = element.enclosingElement;
       if (enclosingElement is CompilationUnitElement) {
         if (element.library.name == 'dart.ffi') {
           if (element.name == 'sizeOf') {
@@ -204,12 +206,14 @@
 
   @override
   void visitPrefixedIdentifier(PrefixedIdentifier node) {
-    Element element = node.staticElement;
-    Element enclosingElement = element?.enclosingElement;
-    if (enclosingElement is ExtensionElement) {
-      if (_isNativeStructPointerExtension(enclosingElement)) {
-        if (element.name == 'ref') {
-          _validateRefPrefixedIdentifier(node);
+    var element = node.staticElement;
+    if (element != null) {
+      var enclosingElement = element.enclosingElement;
+      if (enclosingElement is ExtensionElement) {
+        if (_isNativeStructPointerExtension(enclosingElement)) {
+          if (element.name == 'ref') {
+            _validateRefPrefixedIdentifier(node);
+          }
         }
       }
     }
@@ -218,12 +222,14 @@
 
   @override
   void visitPropertyAccess(PropertyAccess node) {
-    Element element = node.propertyName.staticElement;
-    Element enclosingElement = element?.enclosingElement;
-    if (enclosingElement is ExtensionElement) {
-      if (_isNativeStructPointerExtension(enclosingElement)) {
-        if (element.name == 'ref') {
-          _validateRefPropertyAccess(node);
+    var element = node.propertyName.staticElement;
+    if (element != null) {
+      var enclosingElement = element.enclosingElement;
+      if (enclosingElement is ExtensionElement) {
+        if (_isNativeStructPointerExtension(enclosingElement)) {
+          if (element.name == 'ref') {
+            _validateRefPropertyAccess(node);
+          }
         }
       }
     }
@@ -234,14 +240,14 @@
   /// `AllocatorAlloc`.
   bool _isAllocatorExtension(Element element) =>
       element.name == _allocatorExtensionName &&
-      element.library.name == _dartFfiLibraryName;
+      element.library?.name == _dartFfiLibraryName;
 
   /// Return `true` if the [typeName] is the name of a type from `dart:ffi`.
   bool _isDartFfiClass(TypeName typeName) =>
       _isDartFfiElement(typeName.name.staticElement);
 
   /// Return `true` if the [element] is a class element from `dart:ffi`.
-  bool _isDartFfiElement(Element element) {
+  bool _isDartFfiElement(Element? element) {
     if (element is ConstructorElement) {
       element = element.enclosingElement;
     }
@@ -253,7 +259,7 @@
   /// `DynamicLibraryExtension`.
   bool _isDynamicLibraryExtension(Element element) =>
       element.name == 'DynamicLibraryExtension' &&
-      element.library.name == _dartFfiLibraryName;
+      element.library?.name == _dartFfiLibraryName;
 
   bool _isEmptyStruct(ClassElement classElement) {
     final fields = classElement.fields;
@@ -273,8 +279,10 @@
     return structFieldCount == 0;
   }
 
-  bool _isHandle(Element element) =>
-      element.name == 'Handle' && element.library.name == _dartFfiLibraryName;
+  bool _isHandle(Element? element) =>
+      element != null &&
+      element.name == 'Handle' &&
+      element.library?.name == _dartFfiLibraryName;
 
   /// Returns `true` iff [nativeType] is a `ffi.NativeFunction<???>` type.
   bool _isNativeFunctionInterfaceType(DartType nativeType) {
@@ -282,18 +290,19 @@
       final element = nativeType.element;
       if (element.library.name == _dartFfiLibraryName) {
         return element.name == 'NativeFunction' &&
-            nativeType.typeArguments?.length == 1;
+            nativeType.typeArguments.length == 1;
       }
     }
     return false;
   }
 
-  bool _isNativeFunctionPointerExtension(Element element) =>
+  bool _isNativeFunctionPointerExtension(Element? element) =>
+      element != null &&
       element.name == 'NativeFunctionPointer' &&
-      element.library.name == _dartFfiLibraryName;
+      element.library?.name == _dartFfiLibraryName;
 
   bool _isNativeStructPointerExtension(Element element) =>
-      element.name == 'StructPointer' && element.library.name == 'dart.ffi';
+      element.name == 'StructPointer' && element.library?.name == 'dart.ffi';
 
   /// Returns `true` iff [nativeType] is a `ffi.NativeType` type.
   bool _isNativeTypeInterfaceType(DartType nativeType) {
@@ -322,8 +331,10 @@
   }
 
   /// Return `true` if the given [element] represents the class `Pointer`.
-  bool _isPointer(Element element) =>
-      element.name == 'Pointer' && element.library.name == _dartFfiLibraryName;
+  bool _isPointer(Element? element) =>
+      element != null &&
+      element.name == 'Pointer' &&
+      element.library?.name == _dartFfiLibraryName;
 
   /// Returns `true` iff [nativeType] is a `ffi.Pointer<???>` type.
   bool _isPointerInterfaceType(DartType nativeType) {
@@ -331,7 +342,7 @@
       final element = nativeType.element;
       if (element.library.name == _dartFfiLibraryName) {
         return element.name == 'Pointer' &&
-            nativeType.typeArguments?.length == 1;
+            nativeType.typeArguments.length == 1;
       }
     }
     return false;
@@ -347,7 +358,7 @@
       final superClassElement = superType.element;
       if (superClassElement.library.name == _dartFfiLibraryName) {
         return superClassElement.name == _structClassName &&
-            nativeType.typeArguments?.isEmpty == true;
+            nativeType.typeArguments.isEmpty;
       }
     }
     return false;
@@ -355,9 +366,9 @@
 
   /// Return `true` if the [typeName] represents a subtype of `Struct`.
   bool _isSubtypeOfStruct(TypeName typeName) {
-    Element superType = typeName.name.staticElement;
+    var superType = typeName.name.staticElement;
     if (superType is ClassElement) {
-      bool isStruct(InterfaceType type) {
+      bool isStruct(InterfaceType? type) {
         return type != null &&
             type.element.name == _structClassName &&
             type.element.library.name == _dartFfiLibraryName;
@@ -395,7 +406,7 @@
   /// Validates that the given [nativeType] is a valid dart:ffi native type.
   // TODO(https://dartbug.com/44747): Change to named arguments.
   bool _isValidFfiNativeType(
-      DartType nativeType, bool allowVoid, bool allowEmptyStruct) {
+      DartType? nativeType, bool allowVoid, bool allowEmptyStruct) {
     if (nativeType is InterfaceType) {
       // Is it a primitive integer/double type (or ffi.Void if we allow it).
       final primitiveType = _primitiveNativeType(nativeType);
@@ -455,7 +466,7 @@
 
   /// Return an indication of the Dart type associated with the [annotation].
   _PrimitiveDartType _typeForAnnotation(Annotation annotation) {
-    Element element = annotation.element;
+    var element = annotation.element;
     if (element is ConstructorElement) {
       String name = element.enclosingElement.name;
       if (_primitiveIntegerNativeTypes.contains(name)) {
@@ -468,10 +479,11 @@
   }
 
   void _validateAllocate(FunctionExpressionInvocation node) {
-    if (node.typeArgumentTypes.length != 1) {
+    final typeArgumentTypes = node.typeArgumentTypes;
+    if (typeArgumentTypes == null || typeArgumentTypes.length != 1) {
       return;
     }
-    final DartType dartType = node.typeArgumentTypes[0];
+    final DartType dartType = typeArgumentTypes[0];
     if (!_isValidFfiNativeType(dartType, true, true)) {
       final AstNode errorNode = node;
       _errorReporter.reportErrorForNode(
@@ -521,14 +533,14 @@
   /// Validate the invocation of the instance method
   /// `Pointer<T>.asFunction<F>()`.
   void _validateAsFunction(MethodInvocation node, MethodElement element) {
-    NodeList<TypeAnnotation> typeArguments = node.typeArguments?.arguments;
+    var typeArguments = node.typeArguments?.arguments;
     if (typeArguments != null && typeArguments.length == 1) {
       if (_validateTypeArgument(typeArguments[0], 'asFunction')) {
         return;
       }
     }
-    Expression target = node.realTarget;
-    DartType targetType = target.staticType;
+    var target = node.realTarget!;
+    var targetType = target.staticType;
     if (targetType is InterfaceType &&
         _isPointer(targetType.element) &&
         targetType.typeArguments.length == 1) {
@@ -545,8 +557,8 @@
         return;
       }
 
-      final DartType TPrime = (T as InterfaceType).typeArguments[0];
-      final DartType F = node.typeArgumentTypes[0];
+      final DartType TPrime = T.typeArguments[0];
+      final DartType F = node.typeArgumentTypes![0];
       if (!_validateCompatibleFunctionTypes(F, TPrime)) {
         _errorReporter.reportErrorForNode(
             FfiCode.MUST_BE_A_SUBTYPE, node, [TPrime, F, 'asFunction']);
@@ -566,36 +578,32 @@
       return false;
     }
 
-    final dartFType = dartType as FunctionType;
-    final nativeFType = nativeType as FunctionType;
-
     // We disallow any optional parameters.
-    final int parameterCount = dartFType.normalParameterTypes.length;
-    if (parameterCount != nativeFType.normalParameterTypes.length) {
+    final int parameterCount = dartType.normalParameterTypes.length;
+    if (parameterCount != nativeType.normalParameterTypes.length) {
       return false;
     }
     // We disallow generic function types.
-    if (dartFType.typeFormals.isNotEmpty ||
-        nativeFType.typeFormals.isNotEmpty) {
+    if (dartType.typeFormals.isNotEmpty || nativeType.typeFormals.isNotEmpty) {
       return false;
     }
-    if (dartFType.namedParameterTypes.isNotEmpty ||
-        dartFType.optionalParameterTypes.isNotEmpty ||
-        nativeFType.namedParameterTypes.isNotEmpty ||
-        nativeFType.optionalParameterTypes.isNotEmpty) {
+    if (dartType.namedParameterTypes.isNotEmpty ||
+        dartType.optionalParameterTypes.isNotEmpty ||
+        nativeType.namedParameterTypes.isNotEmpty ||
+        nativeType.optionalParameterTypes.isNotEmpty) {
       return false;
     }
 
     // Validate that the return types are compatible.
     if (!_validateCompatibleNativeType(
-        dartFType.returnType, nativeFType.returnType, false)) {
+        dartType.returnType, nativeType.returnType, false)) {
       return false;
     }
 
     // Validate that the parameter types are compatible.
     for (int i = 0; i < parameterCount; ++i) {
-      if (!_validateCompatibleNativeType(dartFType.normalParameterTypes[i],
-          nativeFType.normalParameterTypes[i], true)) {
+      if (!_validateCompatibleNativeType(dartType.normalParameterTypes[i],
+          nativeType.normalParameterTypes[i], true)) {
         return false;
       }
     }
@@ -633,8 +641,7 @@
   }
 
   void _validateElementAt(MethodInvocation node) {
-    Expression target = node.realTarget;
-    DartType targetType = target?.staticType;
+    var targetType = node.realTarget?.staticType;
     if (targetType is InterfaceType &&
         _isPointer(targetType.element) &&
         targetType.typeArguments.length == 1) {
@@ -658,12 +665,12 @@
     }
     VariableDeclarationList fields = node.fields;
     NodeList<Annotation> annotations = node.metadata;
-    TypeAnnotation fieldType = fields.type;
+    var fieldType = fields.type;
     if (fieldType == null) {
       _errorReporter.reportErrorForNode(
           FfiCode.MISSING_FIELD_TYPE_IN_STRUCT, fields.variables[0].name);
     } else {
-      DartType declaredType = fieldType.type;
+      DartType declaredType = fieldType.type!;
       if (declaredType.isDartCoreInt) {
         _validateAnnotations(fieldType, annotations, _PrimitiveDartType.int);
       } else if (declaredType.isDartCoreDouble) {
@@ -699,7 +706,7 @@
       return;
     }
 
-    final DartType T = node.typeArgumentTypes[0];
+    final DartType T = node.typeArgumentTypes![0];
     if (!_isValidFfiNativeFunctionType(T)) {
       _errorReporter.reportErrorForNode(
           FfiCode.MUST_BE_A_NATIVE_FUNCTION_TYPE, node, [T, 'fromFunction']);
@@ -707,7 +714,7 @@
     }
 
     Expression f = node.argumentList.arguments[0];
-    DartType FT = f.staticType;
+    DartType FT = f.staticType!;
     if (!_validateCompatibleFunctionTypes(FT, T)) {
       _errorReporter.reportErrorForNode(
           FfiCode.MUST_BE_A_SUBTYPE, f, [f.staticType, T, 'fromFunction']);
@@ -730,7 +737,7 @@
     } else {
       Expression e = node.argumentList.arguments[1];
       // TODO(brianwilkerson) Validate that `e` is a constant expression.
-      if (!_validateCompatibleNativeType(e.staticType, R, true)) {
+      if (!_validateCompatibleNativeType(e.staticType!, R, true)) {
         _errorReporter.reportErrorForNode(
             FfiCode.MUST_BE_A_SUBTYPE, e, [e.staticType, R, 'fromFunction']);
       }
@@ -740,25 +747,24 @@
   /// Validate the invocation of the instance method
   /// `DynamicLibrary.lookupFunction<S, F>()`.
   void _validateLookupFunction(MethodInvocation node) {
-    final NodeList<TypeAnnotation> typeArguments =
-        node.typeArguments?.arguments;
+    final typeArguments = node.typeArguments?.arguments;
     if (typeArguments?.length != 2) {
       // There are other diagnostics reported against the invocation and the
       // diagnostics generated below might be inaccurate, so don't report them.
       return;
     }
 
-    final List<DartType> argTypes = node.typeArgumentTypes;
+    final List<DartType> argTypes = node.typeArgumentTypes!;
     final DartType S = argTypes[0];
     final DartType F = argTypes[1];
     if (!_isValidFfiNativeFunctionType(S)) {
-      final AstNode errorNode = typeArguments[0];
+      final AstNode errorNode = typeArguments![0];
       _errorReporter.reportErrorForNode(FfiCode.MUST_BE_A_NATIVE_FUNCTION_TYPE,
           errorNode, [S, 'lookupFunction']);
       return;
     }
     if (!_validateCompatibleFunctionTypes(F, S)) {
-      final AstNode errorNode = typeArguments[1];
+      final AstNode errorNode = typeArguments![1];
       _errorReporter.reportErrorForNode(
           FfiCode.MUST_BE_A_SUBTYPE, errorNode, [S, F, 'lookupFunction']);
     }
@@ -775,7 +781,7 @@
   }
 
   void _validateRefIndexed(IndexExpression node) {
-    DartType targetType = node.realTarget?.staticType;
+    var targetType = node.realTarget.staticType;
     if (!_isValidFfiNativeType(targetType, false, true)) {
       final AstNode errorNode = node;
       _errorReporter.reportErrorForNode(
@@ -786,7 +792,7 @@
   /// Validate the invocation of the extension method
   /// `Pointer<T extends Struct>.ref`.
   void _validateRefPrefixedIdentifier(PrefixedIdentifier node) {
-    DartType targetType = node.prefix.staticType;
+    var targetType = node.prefix.staticType!;
     if (!_isValidFfiNativeType(targetType, false, true)) {
       final AstNode errorNode = node;
       _errorReporter.reportErrorForNode(
@@ -795,7 +801,7 @@
   }
 
   void _validateRefPropertyAccess(PropertyAccess node) {
-    DartType targetType = node.realTarget?.staticType;
+    var targetType = node.realTarget.staticType;
     if (!_isValidFfiNativeType(targetType, false, true)) {
       final AstNode errorNode = node;
       _errorReporter.reportErrorForNode(
@@ -804,10 +810,11 @@
   }
 
   void _validateSizeOf(MethodInvocation node) {
-    if (node.typeArgumentTypes.length != 1) {
+    final typeArgumentTypes = node.typeArgumentTypes;
+    if (typeArgumentTypes == null || typeArgumentTypes.length != 1) {
       return;
     }
-    final DartType T = node.typeArgumentTypes[0];
+    final DartType T = typeArgumentTypes[0];
     if (!_isValidFfiNativeType(T, true, true)) {
       final AstNode errorNode = node;
       _errorReporter.reportErrorForNode(
diff --git a/pkg/analyzer/lib/src/generated/interner.dart b/pkg/analyzer/lib/src/generated/interner.dart
index bef468c..dbba6bc 100644
--- a/pkg/analyzer/lib/src/generated/interner.dart
+++ b/pkg/analyzer/lib/src/generated/interner.dart
@@ -17,7 +17,7 @@
 
   @override
   String intern(String string) {
-    String original = _table[string];
+    var original = _table[string];
     if (original == null) {
       _table[string] = string;
       return string;
diff --git a/pkg/analyzer/lib/src/generated/java_core.dart b/pkg/analyzer/lib/src/generated/java_core.dart
index d5457b2..75fa4d3 100644
--- a/pkg/analyzer/lib/src/generated/java_core.dart
+++ b/pkg/analyzer/lib/src/generated/java_core.dart
@@ -8,14 +8,14 @@
 ///     format('{0} are you {1}ing?', 'How', 'do') = 'How are you doing?'
 ///     format('{0} are you {1}ing?', 'What', 'read') = 'What are you reading?'
 String format(String pattern,
-    [Object arg0,
-    Object arg1,
-    Object arg2,
-    Object arg3,
-    Object arg4,
-    Object arg5,
-    Object arg6,
-    Object arg7]) {
+    [Object? arg0,
+    Object? arg1,
+    Object? arg2,
+    Object? arg3,
+    Object? arg4,
+    Object? arg5,
+    Object? arg6,
+    Object? arg7]) {
   // TODO(rnystrom): This is not used by analyzer, but is called by
   // analysis_server. Move this code there and remove it from here.
   return formatList(pattern, [arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7]);
@@ -27,18 +27,16 @@
 ///     format('{0} are you {1}ing?', ['How', 'do']) = 'How are you doing?'
 ///     format('{0} are you {1}ing?', ['What', 'read']) =
 ///         'What are you reading?'
-String formatList(String pattern, List<Object> arguments) {
+String formatList(String pattern, List<Object?>? arguments) {
   if (arguments == null || arguments.isEmpty) {
     assert(!pattern.contains(RegExp(r'\{(\d+)\}')),
         'Message requires arguments, but none were provided.');
     return pattern;
   }
   return pattern.replaceAllMapped(RegExp(r'\{(\d+)\}'), (match) {
-    String indexStr = match.group(1);
+    String indexStr = match.group(1)!;
     int index = int.parse(indexStr);
-    Object arg = arguments[index];
-    assert(arg != null);
-    return arg?.toString();
+    return arguments[index].toString();
   });
 }
 
diff --git a/pkg/analyzer/lib/src/generated/java_engine.dart b/pkg/analyzer/lib/src/generated/java_engine.dart
index c88230d..4457470 100644
--- a/pkg/analyzer/lib/src/generated/java_engine.dart
+++ b/pkg/analyzer/lib/src/generated/java_engine.dart
@@ -11,7 +11,7 @@
 typedef Predicate<E> = bool Function(E argument);
 
 class FileNameUtilities {
-  static String getExtension(String fileName) {
+  static String getExtension(String? fileName) {
     if (fileName == null) {
       return "";
     }
@@ -141,11 +141,11 @@
   }
 
   static String intern(String string) => INTERNER.intern(string);
-  static bool isEmpty(String s) {
+  static bool isEmpty(String? s) {
     return s == null || s.isEmpty;
   }
 
-  static bool isTagName(String s) {
+  static bool isTagName(String? s) {
     if (s == null || s.isEmpty) {
       return false;
     }
@@ -171,7 +171,7 @@
   ///
   /// @param names the names to be printed
   /// @return the result of printing the names
-  static String printListOfQuotedNames(List<String> names) {
+  static String printListOfQuotedNames(List<String>? names) {
     if (names == null) {
       throw ArgumentError("The list must not be null");
     }
@@ -237,7 +237,7 @@
         str.codeUnitAt(start + 5) == c6;
   }
 
-  static String substringBefore(String str, String separator) {
+  static String? substringBefore(String? str, String? separator) {
     if (str == null || str.isEmpty) {
       return str;
     }
diff --git a/pkg/analyzer/lib/src/generated/java_io.dart b/pkg/analyzer/lib/src/generated/java_io.dart
index efd679e7..3ab4863 100644
--- a/pkg/analyzer/lib/src/generated/java_io.dart
+++ b/pkg/analyzer/lib/src/generated/java_io.dart
@@ -11,7 +11,7 @@
   static path.Context pathContext = path.context;
   static final String separator = Platform.pathSeparator;
   static final int separatorChar = Platform.pathSeparator.codeUnitAt(0);
-  String _path;
+  late final String _path;
   JavaFile(String path) {
     _path = path;
   }
@@ -53,14 +53,14 @@
   }
 
   String getName() => path.context.basename(_path);
-  String getParent() {
+  String? getParent() {
     var result = path.context.dirname(_path);
     // "." or  "/" or  "C:\"
     if (result.length < 4) return null;
     return result;
   }
 
-  JavaFile getParentFile() {
+  JavaFile? getParentFile() {
     var parent = getParent();
     if (parent == null) return null;
     return JavaFile(parent);
diff --git a/pkg/analyzer/lib/src/generated/migration.dart b/pkg/analyzer/lib/src/generated/migration.dart
index 93d82cc..6bd94fa 100644
--- a/pkg/analyzer/lib/src/generated/migration.dart
+++ b/pkg/analyzer/lib/src/generated/migration.dart
@@ -18,7 +18,7 @@
   ///
   /// If the condition is known to evaluate to `true` or `false`, then the value
   /// it is known to evaluate to is returned.  Otherwise `null` is returned.
-  bool getConditionalKnownValue(AstNode node);
+  bool? getConditionalKnownValue(AstNode node);
 
   /// Called after the resolver has determined the type of an expression node.
   /// Should return the type that the expression has after migrations have been
@@ -38,6 +38,6 @@
   /// Called when the resolver starts or stops making use of a [FlowAnalysis]
   /// instance.
   void setFlowAnalysis(
-      FlowAnalysis<AstNode, Statement, Expression, PromotableElement, DartType>
+      FlowAnalysis<AstNode, Statement, Expression, PromotableElement, DartType>?
           flowAnalysis);
 }
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index 9b05a6f..ef73ade 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -18,7 +18,6 @@
 import 'package:analyzer/src/dart/scanner/scanner.dart';
 import 'package:analyzer/src/fasta/ast_builder.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:meta/meta.dart';
 
 export 'package:analyzer/src/dart/ast/utilities.dart' show ResolutionCopier;
 export 'package:analyzer/src/dart/error/syntactic_errors.dart';
@@ -26,16 +25,16 @@
 /// A simple data-holder for a method that needs to return multiple values.
 class CommentAndMetadata {
   /// The documentation comment that was parsed, or `null` if none was given.
-  final Comment comment;
+  final Comment? comment;
 
   /// The metadata that was parsed, or `null` if none was given.
-  final List<Annotation> metadata;
+  final List<Annotation>? metadata;
 
   /// Initialize a newly created holder with the given [comment] and [metadata].
   CommentAndMetadata(this.comment, this.metadata);
 
   /// Return `true` if some metadata was parsed.
-  bool get hasMetadata => metadata != null && metadata.isNotEmpty;
+  bool get hasMetadata => metadata != null && metadata!.isNotEmpty;
 }
 
 /// A simple data-holder for a method that needs to return multiple values.
@@ -54,35 +53,35 @@
 class Modifiers {
   /// The token representing the keyword 'abstract', or `null` if the keyword
   /// was not found.
-  Token abstractKeyword;
+  Token? abstractKeyword;
 
   /// The token representing the keyword 'const', or `null` if the keyword was
   /// not found.
-  Token constKeyword;
+  Token? constKeyword;
 
   /// The token representing the keyword 'covariant', or `null` if the keyword
   /// was not found.
-  Token covariantKeyword;
+  Token? covariantKeyword;
 
   /// The token representing the keyword 'external', or `null` if the keyword
   /// was not found.
-  Token externalKeyword;
+  Token? externalKeyword;
 
   /// The token representing the keyword 'factory', or `null` if the keyword was
   /// not found.
-  Token factoryKeyword;
+  Token? factoryKeyword;
 
   /// The token representing the keyword 'final', or `null` if the keyword was
   /// not found.
-  Token finalKeyword;
+  Token? finalKeyword;
 
   /// The token representing the keyword 'static', or `null` if the keyword was
   /// not found.
-  Token staticKeyword;
+  Token? staticKeyword;
 
   /// The token representing the keyword 'var', or `null` if the keyword was not
   /// found.
-  Token varKeyword;
+  Token? varKeyword;
 
   @override
   String toString() {
@@ -100,7 +99,7 @@
   /// If the given [keyword] is not `null`, append it to the given [builder],
   /// prefixing it with a space if [needsSpace] is `true`. Return `true` if
   /// subsequent keywords need to be prefixed with a space.
-  bool _appendKeyword(StringBuffer buffer, bool needsSpace, Token keyword) {
+  bool _appendKeyword(StringBuffer buffer, bool needsSpace, Token? keyword) {
     if (keyword != null) {
       if (needsSpace) {
         buffer.writeCharCode(0x20);
@@ -114,17 +113,17 @@
 
 /// A parser used to parse tokens into an AST structure.
 class Parser {
-  Token currentToken;
+  late Token currentToken;
 
   /// The fasta parser being wrapped.
-  /*late final*/ fasta.Parser fastaParser;
+  late final fasta.Parser fastaParser;
 
   /// The builder which creates the analyzer AST data structures
   /// based on the Fasta parser.
   final AstBuilder astBuilder;
 
   Parser(Source source, AnalysisErrorListener errorListener,
-      {@required FeatureSet featureSet, bool allowNativeClause = true})
+      {required FeatureSet featureSet, bool allowNativeClause = true})
       : astBuilder = AstBuilder(
             ErrorReporter(
               errorListener,
@@ -160,12 +159,12 @@
   /// Append the given token to the end of the token stream,
   /// and update the token's offset.
   void appendToken(Token token, Token newToken) {
-    while (!token.next.isEof) {
-      token = token.next;
+    while (!token.next!.isEof) {
+      token = token.next!;
     }
     newToken
       ..offset = token.end
-      ..setNext(token.next);
+      ..setNext(token.next!);
     token.setNext(newToken);
   }
 
@@ -176,7 +175,7 @@
     appendToken(currentToken, SimpleToken(TokenType.CLOSE_PAREN, 0));
     currentToken = fastaParser
         .parseArguments(fastaParser.syntheticPreviousToken(currentToken))
-        .next;
+        .next!;
     var invocation = astBuilder.pop() as MethodInvocation;
     return invocation.argumentList.arguments[0];
   }
@@ -205,7 +204,7 @@
   Configuration parseConfiguration() {
     currentToken = fastaParser
         .parseConditionalUri(fastaParser.syntheticPreviousToken(currentToken))
-        .next;
+        .next!;
     return astBuilder.pop() as Configuration;
   }
 
@@ -224,7 +223,7 @@
   DottedName parseDottedName() {
     currentToken = fastaParser
         .parseDottedName(fastaParser.syntheticPreviousToken(currentToken))
-        .next;
+        .next!;
     return astBuilder.pop() as DottedName;
   }
 
@@ -238,7 +237,7 @@
   Expression parseExpression2() {
     currentToken = fastaParser
         .parseExpression(fastaParser.syntheticPreviousToken(currentToken))
-        .next;
+        .next!;
     return astBuilder.pop() as Expression;
   }
 
@@ -251,7 +250,7 @@
             inFunctionType
                 ? fasta.MemberKind.GeneralizedFunctionType
                 : fasta.MemberKind.NonStaticMethod)
-        .next;
+        .next!;
     return astBuilder.pop() as FormalParameterList;
   }
 
@@ -284,7 +283,7 @@
     currentToken = fastaParser
         .parsePrimary(fastaParser.syntheticPreviousToken(currentToken),
             fasta.IdentifierContext.expression)
-        .next;
+        .next!;
     return astBuilder.pop() as Expression;
   }
 
@@ -306,7 +305,7 @@
   Statement parseStatement2() {
     currentToken = fastaParser
         .parseStatement(fastaParser.syntheticPreviousToken(currentToken))
-        .next;
+        .next!;
     return astBuilder.pop() as Statement;
   }
 
@@ -329,7 +328,7 @@
     currentToken = fasta
         .computeType(previous, true, !inExpression)
         .parseType(previous, fastaParser)
-        .next;
+        .next!;
     return astBuilder.pop() as TypeAnnotation;
   }
 
@@ -338,7 +337,7 @@
     currentToken = fasta
         .computeTypeParamOrArg(previous)
         .parseArguments(previous, fastaParser)
-        .next;
+        .next!;
     return astBuilder.pop() as TypeArgumentList;
   }
 
@@ -347,7 +346,7 @@
     currentToken = fasta
         .computeType(previous, true, !inExpression)
         .parseType(previous, fastaParser)
-        .next;
+        .next!;
     return astBuilder.pop() as TypeName;
   }
 
@@ -355,18 +354,18 @@
     currentToken = SyntheticBeginToken(TokenType.LT, 0)
       ..endGroup = SyntheticToken(TokenType.GT, 0)
       ..setNext(currentToken);
-    appendToken(currentToken, currentToken.endGroup);
-    TypeParameterList typeParams = parseTypeParameterList();
+    appendToken(currentToken, currentToken.endGroup!);
+    TypeParameterList typeParams = parseTypeParameterList()!;
     return typeParams.typeParameters[0];
   }
 
-  TypeParameterList parseTypeParameterList() {
+  TypeParameterList? parseTypeParameterList() {
     Token token = fastaParser.syntheticPreviousToken(currentToken);
     currentToken = fasta
         .computeTypeParamOrArg(token, true)
         .parseVariables(token, fastaParser)
-        .next;
-    return astBuilder.pop() as TypeParameterList;
+        .next!;
+    return astBuilder.pop() as TypeParameterList?;
   }
 
   Expression parseUnaryExpression() => parseExpression2();
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 949d7d3..14bea1b 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -82,7 +82,7 @@
       : _resolver = resolver,
         _typeSystem = resolver.typeSystem;
 
-  BodyInferenceContext get bodyContext {
+  BodyInferenceContext? get bodyContext {
     if (_bodyContexts.isNotEmpty) {
       return _bodyContexts.last;
     } else {
@@ -114,7 +114,7 @@
   }
 
   /// Clear the type information associated with [node].
-  static void clearType(AstNode node) {
+  static void clearType(AstNode? node) {
     node?.setProperty(_typeProperty, null);
   }
 
@@ -126,11 +126,12 @@
   /// You can use [TypeSystemImpl.upperBoundForType] or
   /// [TypeSystemImpl.lowerBoundForType] if you would prefer a known type
   /// that represents the bound of the context type.
-  static DartType getContext(AstNode node) => node?.getProperty(_typeProperty);
+  static DartType? getContext(AstNode? node) =>
+      node?.getProperty(_typeProperty);
 
   /// Attach contextual type information [type] to [node] for use during
   /// inference.
-  static void setType(AstNode node, DartType type) {
+  static void setType(AstNode? node, DartType? type) {
     if (type == null || type.isDynamic) {
       clearType(node);
     } else {
@@ -156,77 +157,78 @@
 
   final MigratableAstInfoProvider _migratableAstInfoProvider;
 
-  final MigrationResolutionHooks migrationResolutionHooks;
+  final MigrationResolutionHooks? migrationResolutionHooks;
 
   /// Helper for checking expression that should have the `bool` type.
-  BoolExpressionVerifier boolExpressionVerifier;
+  late final BoolExpressionVerifier boolExpressionVerifier;
 
   /// Helper for checking potentially nullable dereferences.
-  NullableDereferenceVerifier nullableDereferenceVerifier;
+  late final NullableDereferenceVerifier nullableDereferenceVerifier;
 
   /// Helper for extension method resolution.
-  ExtensionMemberResolver extensionResolver;
+  late final ExtensionMemberResolver extensionResolver;
 
   /// Helper for resolving properties on types.
-  TypePropertyResolver typePropertyResolver;
+  late final TypePropertyResolver typePropertyResolver;
 
   /// Helper for resolving [ListLiteral] and [SetOrMapLiteral].
-  TypedLiteralResolver _typedLiteralResolver;
+  late final TypedLiteralResolver _typedLiteralResolver;
 
-  AssignmentExpressionResolver _assignmentExpressionResolver;
-  BinaryExpressionResolver _binaryExpressionResolver;
-  FunctionExpressionInvocationResolver _functionExpressionInvocationResolver;
-  FunctionExpressionResolver _functionExpressionResolver;
-  ForResolver _forResolver;
-  PostfixExpressionResolver _postfixExpressionResolver;
-  PrefixedIdentifierResolver _prefixedIdentifierResolver;
-  PrefixExpressionResolver _prefixExpressionResolver;
-  VariableDeclarationResolver _variableDeclarationResolver;
-  YieldStatementResolver _yieldStatementResolver;
+  late final AssignmentExpressionResolver _assignmentExpressionResolver;
+  late final BinaryExpressionResolver _binaryExpressionResolver;
+  late final FunctionExpressionInvocationResolver
+      _functionExpressionInvocationResolver;
+  late final FunctionExpressionResolver _functionExpressionResolver;
+  late final ForResolver _forResolver;
+  late final PostfixExpressionResolver _postfixExpressionResolver;
+  late final PrefixedIdentifierResolver _prefixedIdentifierResolver;
+  late final PrefixExpressionResolver _prefixExpressionResolver;
+  late final VariableDeclarationResolver _variableDeclarationResolver;
+  late final YieldStatementResolver _yieldStatementResolver;
 
-  NullSafetyDeadCodeVerifier nullSafetyDeadCodeVerifier;
+  late final NullSafetyDeadCodeVerifier nullSafetyDeadCodeVerifier;
 
-  InvocationInferenceHelper inferenceHelper;
+  late final InvocationInferenceHelper inferenceHelper;
 
   /// The object used to resolve the element associated with the current node.
-  ElementResolver elementResolver;
+  late final ElementResolver elementResolver;
 
   /// The object used to compute the type associated with the current node.
-  StaticTypeAnalyzer typeAnalyzer;
+  late final StaticTypeAnalyzer typeAnalyzer;
 
   /// The type system in use during resolution.
   final TypeSystemImpl typeSystem;
 
   /// The class declaration representing the class containing the current node,
   /// or `null` if the current node is not contained in a class.
-  ClassDeclaration _enclosingClassDeclaration;
+  ClassDeclaration? _enclosingClassDeclaration;
 
   /// The function type alias representing the function type containing the
   /// current node, or `null` if the current node is not contained in a function
   /// type alias.
-  FunctionTypeAlias _enclosingFunctionTypeAlias;
+  FunctionTypeAlias? _enclosingFunctionTypeAlias;
 
   /// The element representing the function containing the current node, or
   /// `null` if the current node is not contained in a function.
-  ExecutableElement _enclosingFunction;
+  ExecutableElement? _enclosingFunction;
 
   /// The mixin declaration representing the class containing the current node,
   /// or `null` if the current node is not contained in a mixin.
-  MixinDeclaration _enclosingMixinDeclaration;
+  MixinDeclaration? _enclosingMixinDeclaration;
 
   /// The helper for tracking if the current location has access to `this`.
   final ThisAccessTracker _thisAccessTracker = ThisAccessTracker.unit();
 
-  InferenceContext inferenceContext;
+  late final InferenceContext inferenceContext;
 
   /// If a class, or mixin, is being resolved, the type of the class.
   /// Otherwise `null`.
-  DartType _thisType;
+  DartType? _thisType;
 
   /// The object keeping track of which elements have had their types promoted.
-  TypePromotionManager _promoteManager;
+  late final TypePromotionManager _promoteManager;
 
-  final FlowAnalysisHelper flowAnalysis;
+  final FlowAnalysisHelper? flowAnalysis;
 
   /// A comment before a function should be resolved in the context of the
   /// function. But when we incrementally resolve a comment, we don't want to
@@ -238,14 +240,14 @@
 
   /// The type of the expression of the immediately enclosing [SwitchStatement],
   /// or `null` if not in a [SwitchStatement].
-  DartType _enclosingSwitchStatementExpressionType;
+  DartType? _enclosingSwitchStatementExpressionType;
 
   /// Stack of expressions which we have not yet finished visiting, that should
   /// terminate a null-shorting expression.
   ///
   /// The stack contains a `null` sentinel as its first entry so that it is
   /// always safe to use `.last` to examine the top of the stack.
-  final List<Expression> _unfinishedNullShorts = [null];
+  final List<Expression?> _unfinishedNullShorts = [null];
 
   /// Initialize a newly created visitor to resolve the nodes in an AST node.
   ///
@@ -267,10 +269,10 @@
       Source source,
       TypeProvider typeProvider,
       AnalysisErrorListener errorListener,
-      {FeatureSet featureSet,
-      Scope nameScope,
+      {FeatureSet? featureSet,
+      Scope? nameScope,
       bool reportConstEvaluationErrors = true,
-      FlowAnalysisHelper flowAnalysisHelper})
+      FlowAnalysisHelper? flowAnalysisHelper})
       : this._(
             inheritanceManager,
             definingLibrary,
@@ -294,11 +296,11 @@
       TypeProvider typeProvider,
       AnalysisErrorListener errorListener,
       FeatureSet featureSet,
-      Scope nameScope,
+      Scope? nameScope,
       bool reportConstEvaluationErrors,
       this.flowAnalysis,
       this._migratableAstInfoProvider,
-      MigrationResolutionHooks migrationResolutionHooks)
+      MigrationResolutionHooks? migrationResolutionHooks)
       : _featureSet = featureSet,
         migrationResolutionHooks = migrationResolutionHooks,
         super(definingLibrary, source, typeProvider as TypeProviderImpl,
@@ -377,12 +379,12 @@
   /// or `null` if the current node is not contained in a function.
   ///
   /// @return the element representing the function containing the current node
-  ExecutableElement get enclosingFunction => _enclosingFunction;
+  ExecutableElement? get enclosingFunction => _enclosingFunction;
 
   /// Return the object providing promoted or declared types of variables.
   LocalVariableTypeProvider get localVariableTypeProvider {
     if (flowAnalysis != null) {
-      return flowAnalysis.localVariableTypeProvider;
+      return flowAnalysis!.localVariableTypeProvider;
     } else {
       return _promoteManager.localVariableTypeProvider;
     }
@@ -400,7 +402,7 @@
   /// extended type, or promoted.
   ///
   /// Otherwise `null`.
-  DartType get thisType {
+  DartType? get thisType {
     return _thisType;
   }
 
@@ -409,11 +411,11 @@
       _featureSet.isEnabled(Feature.non_nullable);
 
   void checkForBodyMayCompleteNormally({
-    @required DartType returnType,
-    @required FunctionBody body,
-    @required AstNode errorNode,
+    required DartType? returnType,
+    required FunctionBody body,
+    required AstNode errorNode,
   }) {
-    if (!flowAnalysis.flow.isReachable) {
+    if (!flowAnalysis!.flow!.isReachable) {
       return;
     }
 
@@ -449,7 +451,7 @@
 
   void checkReadOfNotAssignedLocalVariable(
     SimpleIdentifier node,
-    Element element,
+    Element? element,
   ) {
     if (flowAnalysis?.flow == null) {
       return;
@@ -460,9 +462,9 @@
     }
 
     if (element is VariableElement) {
-      var assigned =
-          flowAnalysis.isDefinitelyAssigned(node, element as PromotableElement);
-      var unassigned = flowAnalysis.isDefinitelyUnassigned(node, element);
+      var assigned = flowAnalysis!
+          .isDefinitelyAssigned(node, element as PromotableElement);
+      var unassigned = flowAnalysis!.isDefinitelyUnassigned(node, element);
 
       if (element.isLate) {
         if (unassigned) {
@@ -508,8 +510,8 @@
   ///
   /// @param expression the expression with which the element is associated
   /// @return the element associated with the given expression
-  VariableElement getOverridableStaticElement(Expression expression) {
-    Element element;
+  VariableElement? getOverridableStaticElement(Expression expression) {
+    Element? element;
     if (expression is SimpleIdentifier) {
       element = expression.staticElement;
     } else if (expression is PrefixedIdentifier) {
@@ -527,8 +529,8 @@
   ///
   /// Implements `16.35 Lexical Lookup` from the language specification.
   LexicalLookupResult lexicalLookup({
-    @required SimpleIdentifier node,
-    @required bool setter,
+    required SimpleIdentifier node,
+    required bool setter,
   }) {
     return LexicalLookup(this).perform(node: node, setter: setter);
   }
@@ -541,7 +543,7 @@
     if (identical(_unfinishedNullShorts.last, node)) {
       do {
         _unfinishedNullShorts.removeLast();
-        flowAnalysis.flow.nullAwareAccess_end();
+        flowAnalysis!.flow!.nullAwareAccess_end();
       } while (identical(_unfinishedNullShorts.last, node));
       if (node is! CascadeExpression && !discardType) {
         node.staticType = typeSystem.makeNullable(node.staticType as TypeImpl);
@@ -570,8 +572,8 @@
 
   /// Set information about enclosing declarations.
   void prepareEnclosingDeclarations({
-    ClassElement enclosingClassElement,
-    ExecutableElement enclosingExecutableElement,
+    ClassElement? enclosingClassElement,
+    ExecutableElement? enclosingExecutableElement,
   }) {
     _enclosingClassDeclaration = null;
     enclosingClass = enclosingClassElement;
@@ -607,12 +609,12 @@
     }
 
     if (parent is ClassDeclaration) {
-      forClassElement(parent.declaredElement);
+      forClassElement(parent.declaredElement!);
       return true;
     }
 
     if (parent is MixinDeclaration) {
-      forClassElement(parent.declaredElement);
+      forClassElement(parent.declaredElement!);
       return true;
     }
 
@@ -622,8 +624,8 @@
   /// Resolve LHS [node] of an assignment, an explicit [AssignmentExpression],
   /// or implicit [PrefixExpression] or [PostfixExpression].
   PropertyElementResolverResult resolveForWrite({
-    @required AstNode node,
-    @required bool hasRead,
+    required AstNode node,
+    required bool hasRead,
   }) {
     if (node is IndexExpression) {
       node.target?.accept(this);
@@ -641,7 +643,7 @@
 
       return result;
     } else if (node is PrefixedIdentifier) {
-      node.prefix?.accept(this);
+      node.prefix.accept(this);
 
       var resolver = PropertyElementResolver(this);
       return resolver.resolvePrefixedIdentifier(
@@ -683,13 +685,13 @@
   }
 
   /// Visit the given [comment] if it is not `null`.
-  void safelyVisitComment(Comment comment) {
+  void safelyVisitComment(Comment? comment) {
     if (comment != null) {
       super.visitComment(comment);
     }
   }
 
-  void setReadElement(Expression node, Element element) {
+  void setReadElement(Expression node, Element? element) {
     DartType readType = DynamicTypeImpl.instance;
     if (node is IndexExpression) {
       if (element is MethodElement) {
@@ -725,7 +727,7 @@
     _thisType = thisType;
   }
 
-  void setWriteElement(Expression node, Element element) {
+  void setWriteElement(Expression node, Element? element) {
     DartType writeType = DynamicTypeImpl.instance;
     if (node is IndexExpression) {
       if (element is MethodElement) {
@@ -796,8 +798,9 @@
 
   /// If in a legacy library, return the legacy view on the [element].
   /// Otherwise, return the original element.
-  T toLegacyElement<T extends Element>(T element) {
+  T toLegacyElement<T extends Element?>(T element) {
     if (_isNonNullableByDefault) return element;
+    if (element == null) return element;
     return Member.legacy(element) as T;
   }
 
@@ -821,7 +824,7 @@
 
   @override
   void visitArgumentList(ArgumentList node, {bool isIdentical = false}) {
-    DartType callerType = InferenceContext.getContext(node);
+    var callerType = InferenceContext.getContext(node);
     NodeList<Expression> arguments = node.arguments;
     if (callerType is FunctionType) {
       Map<String, DartType> namedParameterTypes =
@@ -839,9 +842,9 @@
       Iterable<Expression> named =
           arguments.skipWhile((l) => l is! NamedExpression);
       var parent = node.parent;
-      DartType targetType;
-      Element methodElement;
-      DartType invocationContext;
+      DartType? targetType;
+      Element? methodElement;
+      DartType? invocationContext;
       if (parent is MethodInvocation) {
         targetType = parent.realTarget?.staticType;
         methodElement = parent.methodName.staticElement;
@@ -853,10 +856,15 @@
       // setup correctly with inference.
       int index = 0;
       for (Expression argument in required) {
-        InferenceContext.setType(
-            argument,
-            typeSystem.refineNumericInvocationContext(targetType, methodElement,
-                invocationContext, normalParameterTypes[index++]));
+        var parameterType = normalParameterTypes[index++];
+        if (targetType != null) {
+          InferenceContext.setType(
+              argument,
+              typeSystem.refineNumericInvocationContext(
+                  targetType, methodElement, invocationContext, parameterType));
+        } else {
+          InferenceContext.setType(argument, parameterType);
+        }
       }
       index = 0;
       for (Expression argument in optional) {
@@ -865,7 +873,7 @@
 
       for (Expression argument in named) {
         if (argument is NamedExpression) {
-          DartType type = namedParameterTypes[argument.name.label.name];
+          var type = namedParameterTypes[argument.name.label.name];
           if (type != null) {
             InferenceContext.setType(argument, type);
           }
@@ -878,14 +886,14 @@
       if (isIdentical && length > 1 && i == 1) {
         var firstArg = arguments[0];
         flowAnalysis?.flow
-            ?.equalityOp_rightBegin(firstArg, firstArg.staticType);
+            ?.equalityOp_rightBegin(firstArg, firstArg.staticType!);
       }
       arguments[i].accept(this);
     }
     if (isIdentical && length > 1) {
       var secondArg = arguments[1];
-      flowAnalysis?.flow
-          ?.equalityOp_end(node.parent, secondArg, secondArg.staticType);
+      flowAnalysis?.flow?.equalityOp_end(
+          node.parent as Expression, secondArg, secondArg.staticType!);
     }
     node.accept(elementResolver);
     node.accept(typeAnalyzer);
@@ -901,7 +909,7 @@
   void visitAssertInitializer(AssertInitializer node) {
     InferenceContext.setType(node.condition, typeProvider.boolType);
     flowAnalysis?.flow?.assert_begin();
-    node.condition?.accept(this);
+    node.condition.accept(this);
     boolExpressionVerifier.checkForNonBoolExpression(
       node.condition,
       errorCode: CompileTimeErrorCode.NON_BOOL_EXPRESSION,
@@ -915,7 +923,7 @@
   void visitAssertStatement(AssertStatement node) {
     InferenceContext.setType(node.condition, typeProvider.boolType);
     flowAnalysis?.flow?.assert_begin();
-    node.condition?.accept(this);
+    node.condition.accept(this);
     boolExpressionVerifier.checkForNonBoolExpression(
       node.condition,
       errorCode: CompileTimeErrorCode.NON_BOOL_EXPRESSION,
@@ -932,7 +940,7 @@
 
   @override
   void visitAwaitExpression(AwaitExpression node) {
-    DartType contextType = InferenceContext.getContext(node);
+    var contextType = InferenceContext.getContext(node);
     if (contextType != null) {
       var futureUnion = _createFutureOr(contextType);
       InferenceContext.setType(node.expression, futureUnion);
@@ -981,7 +989,7 @@
     node.target.accept(this);
 
     if (node.isNullAware && flowAnalysis != null) {
-      flowAnalysis.flow.nullAwareAccess_rightBegin(
+      flowAnalysis!.flow!.nullAwareAccess_rightBegin(
           node.target, node.target.staticType ?? typeProvider.dynamicType);
       _unfinishedNullShorts.add(node.nullShortingTermination);
     }
@@ -999,12 +1007,12 @@
     //
     // Resolve the metadata in the library scope.
     //
-    node.metadata?.accept(this);
+    node.metadata.accept(this);
     _enclosingClassDeclaration = node;
     //
     // Continue the class resolution.
     //
-    ClassElement outerType = enclosingClass;
+    var outerType = enclosingClass;
     try {
       enclosingClass = node.declaredElement;
       _thisType = enclosingClass?.thisType;
@@ -1020,7 +1028,7 @@
 
   @override
   void visitComment(Comment node) {
-    AstNode parent = node.parent;
+    var parent = node.parent;
     if (parent is FunctionDeclaration ||
         parent is FunctionTypeAlias ||
         parent is ConstructorDeclaration) {
@@ -1051,7 +1059,7 @@
     } else if (parent is MethodDeclaration) {
       var outerScope = nameScope;
       try {
-        var element = parent.declaredElement;
+        var element = parent.declaredElement!;
         nameScope = FormalParameterScope(nameScope, element.parameters);
 
         super.visitComment(node);
@@ -1097,7 +1105,7 @@
     flow?.conditional_conditionBegin();
 
     // TODO(scheglov) Do we need these checks for null?
-    condition?.accept(this);
+    condition.accept(this);
     condition = node.condition;
     boolExpressionVerifier.checkForNonBoolCondition(condition);
 
@@ -1110,7 +1118,7 @@
         checkUnreachableNode(thenExpression);
       }
       thenExpression.accept(this);
-      nullSafetyDeadCodeVerifier?.flowEnd(thenExpression);
+      nullSafetyDeadCodeVerifier.flowEnd(thenExpression);
     } else {
       _promoteManager.visitConditionalExpression_then(
         condition,
@@ -1129,7 +1137,7 @@
       checkUnreachableNode(elseExpression);
       elseExpression.accept(this);
       flow.conditional_end(node, elseExpression);
-      nullSafetyDeadCodeVerifier?.flowEnd(elseExpression);
+      nullSafetyDeadCodeVerifier.flowEnd(elseExpression);
     } else {
       elseExpression.accept(this);
     }
@@ -1146,33 +1154,34 @@
 
   @override
   void visitConstructorDeclaration(ConstructorDeclaration node) {
-    ExecutableElement outerFunction = _enclosingFunction;
-    _enclosingFunction = node.declaredElement;
+    var outerFunction = _enclosingFunction;
+    _enclosingFunction = node.declaredElement!;
 
     if (flowAnalysis != null) {
-      flowAnalysis.topLevelDeclaration_enter(node, node.parameters, node.body);
-      flowAnalysis.executableDeclaration_enter(node, node.parameters, false);
+      flowAnalysis!
+          .topLevelDeclaration_enter(node, node.parameters, node.body);
+      flowAnalysis!.executableDeclaration_enter(node, node.parameters, false);
     } else {
-      _promoteManager.enterFunctionBody(node.body);
+      _promoteManager.enterFunctionBody(node.body!);
     }
 
-    var returnType = _enclosingFunction.type.returnType;
+    var returnType = _enclosingFunction!.type.returnType;
     InferenceContext.setType(node.body, returnType);
 
     super.visitConstructorDeclaration(node);
 
     if (flowAnalysis != null) {
       if (node.factoryKeyword != null) {
-        var bodyContext = BodyInferenceContext.of(node.body);
+        var bodyContext = BodyInferenceContext.of(node.body!);
         checkForBodyMayCompleteNormally(
           returnType: bodyContext?.contextType,
-          body: node.body,
+          body: node.body!,
           errorNode: node,
         );
       }
-      flowAnalysis.executableDeclaration_exit(node.body, false);
-      flowAnalysis.topLevelDeclaration_exit();
-      nullSafetyDeadCodeVerifier?.flowEnd(node);
+      flowAnalysis!.executableDeclaration_exit(node.body!, false);
+      flowAnalysis!.topLevelDeclaration_exit();
+      nullSafetyDeadCodeVerifier.flowEnd(node);
     } else {
       _promoteManager.exitFunctionBody();
     }
@@ -1202,9 +1211,9 @@
     // We visit the expression, but do not visit the field name because it needs
     // to be visited in the context of the constructor field initializer node.
     //
-    FieldElement fieldElement = enclosingClass.getField(node.fieldName.name);
+    var fieldElement = enclosingClass!.getField(node.fieldName.name);
     InferenceContext.setType(node.expression, fieldElement?.type);
-    node.expression?.accept(this);
+    node.expression.accept(this);
     node.accept(elementResolver);
     node.accept(typeAnalyzer);
   }
@@ -1236,14 +1245,14 @@
   void visitDefaultFormalParameter(DefaultFormalParameter node) {
     InferenceContext.setType(node.defaultValue, node.declaredElement?.type);
     super.visitDefaultFormalParameter(node);
-    ParameterElement element = node.declaredElement;
+    ParameterElement element = node.declaredElement!;
 
     // Clone the ASTs for default formal parameters, so that we can use them
     // during constant evaluation.
     if (element is ConstVariableElement &&
         !_hasSerializedConstantInitializer(element)) {
       (element as ConstVariableElement).constantInitializer =
-          _createCloner().cloneNode(node.defaultValue);
+          _createCloner().cloneNullableNode(node.defaultValue);
     }
   }
 
@@ -1276,7 +1285,7 @@
 
   @override
   void visitEnumConstantDeclaration(EnumConstantDeclaration node) {
-    node.metadata?.accept(this);
+    node.metadata.accept(this);
     super.visitEnumConstantDeclaration(node);
   }
 
@@ -1286,11 +1295,11 @@
     // Resolve the metadata in the library scope
     // and associate the annotations with the element.
     //
-    node.metadata?.accept(this);
+    node.metadata.accept(this);
     //
     // Continue the enum resolution.
     //
-    ClassElement outerType = enclosingClass;
+    var outerType = enclosingClass;
     try {
       enclosingClass = node.declaredElement;
       _thisType = enclosingClass?.thisType;
@@ -1314,7 +1323,7 @@
       inferenceContext.pushFunctionBodyContext(node);
       InferenceContext.setType(
         node.expression,
-        inferenceContext.bodyContext.contextType,
+        inferenceContext.bodyContext!.contextType,
       );
       _thisAccessTracker.enterFunctionBody(node);
 
@@ -1322,7 +1331,7 @@
 
       flowAnalysis?.flow?.handleExit();
 
-      inferenceContext.bodyContext.addReturnExpression(node.expression);
+      inferenceContext.bodyContext!.addReturnExpression(node.expression);
     } finally {
       _thisAccessTracker.exitFunctionBody(node);
       inferenceContext.popFunctionBodyContext(node);
@@ -1332,7 +1341,7 @@
   @override
   void visitExtensionDeclaration(ExtensionDeclaration node) {
     try {
-      _thisType = node.declaredElement.extendedType;
+      _thisType = node.declaredElement!.extendedType;
       super.visitExtensionDeclaration(node);
       node.accept(elementResolver);
       node.accept(typeAnalyzer);
@@ -1371,36 +1380,36 @@
   @override
   void visitForStatementInScope(ForStatement node) {
     _forResolver.resolveStatement(node as ForStatementImpl);
-    nullSafetyDeadCodeVerifier?.flowEnd(node.body);
+    nullSafetyDeadCodeVerifier.flowEnd(node.body);
   }
 
   @override
   void visitFunctionDeclaration(FunctionDeclaration node) {
-    ExecutableElement outerFunction = _enclosingFunction;
+    var outerFunction = _enclosingFunction;
     _enclosingFunction = node.declaredElement;
 
     bool isLocal = node.parent is FunctionDeclarationStatement;
 
     if (flowAnalysis != null) {
       if (isLocal) {
-        flowAnalysis.flow.functionExpression_begin(node);
+        flowAnalysis!.flow!.functionExpression_begin(node);
       } else {
-        flowAnalysis.topLevelDeclaration_enter(
+        flowAnalysis!.topLevelDeclaration_enter(
           node,
           node.functionExpression.parameters,
           node.functionExpression.body,
         );
       }
-      flowAnalysis.executableDeclaration_enter(
+      flowAnalysis!.executableDeclaration_enter(
         node,
         node.functionExpression.parameters,
         isLocal,
       );
     } else {
-      _promoteManager.enterFunctionBody(node.functionExpression.body);
+      _promoteManager.enterFunctionBody(node.functionExpression.body!);
     }
 
-    var functionType = _enclosingFunction.type;
+    var functionType = _enclosingFunction!.type;
     InferenceContext.setType(node.functionExpression, functionType);
 
     super.visitFunctionDeclaration(node);
@@ -1408,23 +1417,23 @@
     if (flowAnalysis != null) {
       // TODO(scheglov) encapsulate
       var bodyContext = BodyInferenceContext.of(
-        node.functionExpression.body,
+        node.functionExpression.body!,
       );
       checkForBodyMayCompleteNormally(
         returnType: bodyContext?.contextType,
-        body: node.functionExpression.body,
+        body: node.functionExpression.body!,
         errorNode: node.name,
       );
-      flowAnalysis.executableDeclaration_exit(
-        node.functionExpression.body,
+      flowAnalysis!.executableDeclaration_exit(
+        node.functionExpression.body!,
         isLocal,
       );
       if (isLocal) {
-        flowAnalysis.flow.functionExpression_end();
+        flowAnalysis!.flow!.functionExpression_end();
       } else {
-        flowAnalysis.topLevelDeclaration_exit();
+        flowAnalysis!.topLevelDeclaration_exit();
       }
-      nullSafetyDeadCodeVerifier?.flowEnd(node);
+      nullSafetyDeadCodeVerifier.flowEnd(node);
     } else {
       _promoteManager.exitFunctionBody();
     }
@@ -1440,15 +1449,15 @@
 
   @override
   void visitFunctionExpression(FunctionExpression node) {
-    ExecutableElement outerFunction = _enclosingFunction;
-    _enclosingFunction = node.declaredElement;
+    var outerFunction = _enclosingFunction;
+    _enclosingFunction = node.declaredElement!;
 
     if (node.parent is FunctionDeclaration) {
       _functionExpressionResolver.resolve(node);
     } else {
       Scope outerScope = nameScope;
       try {
-        ExecutableElement element = node.declaredElement;
+        ExecutableElement element = node.declaredElement!;
         nameScope = FormalParameterScope(
           TypeParameterScope(nameScope, element.typeParameters),
           element.parameters,
@@ -1464,7 +1473,7 @@
 
   @override
   void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
-    node.function?.accept(this);
+    node.function.accept(this);
     _functionExpressionInvocationResolver
         .resolve(node as FunctionExpressionInvocationImpl);
     nullShortingTermination(node);
@@ -1473,10 +1482,8 @@
   @override
   void visitFunctionTypeAlias(FunctionTypeAlias node) {
     // Resolve the metadata in the library scope.
-    if (node.metadata != null) {
-      node.metadata.accept(this);
-    }
-    FunctionTypeAlias outerAlias = _enclosingFunctionTypeAlias;
+    node.metadata.accept(this);
+    var outerAlias = _enclosingFunctionTypeAlias;
     _enclosingFunctionTypeAlias = node;
     try {
       super.visitFunctionTypeAlias(node);
@@ -1505,15 +1512,14 @@
     flowAnalysis?.flow?.ifStatement_conditionBegin();
     Expression condition = node.condition;
     InferenceContext.setType(condition, typeProvider.boolType);
-    // TODO(scheglov) Do we need these checks for null?
-    condition?.accept(this);
+    condition.accept(this);
     condition = node.condition;
 
     boolExpressionVerifier.checkForNonBoolCondition(condition);
 
     CollectionElement thenElement = node.thenElement;
     if (flowAnalysis != null) {
-      flowAnalysis.flow?.ifStatement_thenBegin(condition, node);
+      flowAnalysis!.flow?.ifStatement_thenBegin(condition, node);
       thenElement.accept(this);
     } else {
       _promoteManager.visitIfElement_thenElement(
@@ -1545,17 +1551,16 @@
     Expression condition = node.condition;
 
     InferenceContext.setType(condition, typeProvider.boolType);
-    // TODO(scheglov) Do we need these checks for null?
-    condition?.accept(this);
+    condition.accept(this);
     condition = node.condition;
 
     boolExpressionVerifier.checkForNonBoolCondition(condition);
 
     Statement thenStatement = node.thenStatement;
     if (flowAnalysis != null) {
-      flowAnalysis.flow?.ifStatement_thenBegin(condition, node);
+      flowAnalysis!.flow?.ifStatement_thenBegin(condition, node);
       visitStatementInScope(thenStatement);
-      nullSafetyDeadCodeVerifier?.flowEnd(thenStatement);
+      nullSafetyDeadCodeVerifier.flowEnd(thenStatement);
     } else {
       _promoteManager.visitIfStatement_thenStatement(
         condition,
@@ -1566,11 +1571,11 @@
       );
     }
 
-    Statement elseStatement = node.elseStatement;
+    var elseStatement = node.elseStatement;
     if (elseStatement != null) {
       flowAnalysis?.flow?.ifStatement_elseBegin();
       visitStatementInScope(elseStatement);
-      nullSafetyDeadCodeVerifier?.flowEnd(elseStatement);
+      nullSafetyDeadCodeVerifier.flowEnd(elseStatement);
     }
 
     flowAnalysis?.flow?.ifStatement_end(elseStatement != null);
@@ -1592,10 +1597,10 @@
     );
 
     var element = result.readElement;
-    node.staticElement = element as MethodElement;
+    node.staticElement = element as MethodElement?;
 
     InferenceContext.setType(node.index, result.indexContextType);
-    node.index?.accept(this);
+    node.index.accept(this);
 
     DartType type;
     if (identical(node.realTarget.staticType, NeverTypeImpl.instance)) {
@@ -1612,9 +1617,9 @@
 
   @override
   void visitInstanceCreationExpression(InstanceCreationExpression node) {
-    node.constructorName?.accept(this);
+    node.constructorName.accept(this);
     _inferArgumentTypesForInstanceCreate(node);
-    node.argumentList?.accept(this);
+    node.argumentList.accept(this);
     node.accept(elementResolver);
     node.accept(typeAnalyzer);
   }
@@ -1646,17 +1651,18 @@
 
   @override
   void visitMethodDeclaration(MethodDeclaration node) {
-    ExecutableElement outerFunction = _enclosingFunction;
-    _enclosingFunction = node.declaredElement;
+    var outerFunction = _enclosingFunction;
+    _enclosingFunction = node.declaredElement!;
 
     if (flowAnalysis != null) {
-      flowAnalysis.topLevelDeclaration_enter(node, node.parameters, node.body);
-      flowAnalysis.executableDeclaration_enter(node, node.parameters, false);
+      flowAnalysis!
+          .topLevelDeclaration_enter(node, node.parameters, node.body);
+      flowAnalysis!.executableDeclaration_enter(node, node.parameters, false);
     } else {
       _promoteManager.enterFunctionBody(node.body);
     }
 
-    DartType returnType = _enclosingFunction?.returnType;
+    DartType returnType = _enclosingFunction!.returnType;
     InferenceContext.setType(node.body, returnType);
 
     super.visitMethodDeclaration(node);
@@ -1669,9 +1675,9 @@
         body: node.body,
         errorNode: node.name,
       );
-      flowAnalysis.executableDeclaration_exit(node.body, false);
-      flowAnalysis.topLevelDeclaration_exit();
-      nullSafetyDeadCodeVerifier?.flowEnd(node);
+      flowAnalysis!.executableDeclaration_exit(node.body, false);
+      flowAnalysis!.topLevelDeclaration_exit();
+      nullSafetyDeadCodeVerifier.flowEnd(node);
     } else {
       _promoteManager.exitFunctionBody();
     }
@@ -1692,7 +1698,7 @@
           // `?.` to access static methods is equivalent to `.`, so do nothing.
         } else {
           flow.nullAwareAccess_rightBegin(
-              target, node.realTarget.staticType ?? typeProvider.dynamicType);
+              target, node.realTarget!.staticType ?? typeProvider.dynamicType);
           _unfinishedNullShorts.add(node.nullShortingTermination);
         }
       }
@@ -1715,12 +1721,12 @@
     //
     // Resolve the metadata in the library scope.
     //
-    node.metadata?.accept(this);
+    node.metadata.accept(this);
     _enclosingMixinDeclaration = node;
     //
     // Continue the class resolution.
     //
-    ClassElement outerType = enclosingClass;
+    var outerType = enclosingClass;
     try {
       enclosingClass = node.declaredElement;
       _thisType = enclosingClass?.thisType;
@@ -1799,7 +1805,7 @@
     } else if (element is PropertyAccessorElement && element.isGetter) {
       type = element.returnType;
     } else if (result.functionTypeCallType != null) {
-      type = result.functionTypeCallType;
+      type = result.functionTypeCallType!;
     } else {
       type = DynamicTypeImpl.instance;
     }
@@ -1822,7 +1828,7 @@
     //
     node.accept(elementResolver);
     InferenceContext.setType(node.argumentList, node.staticElement?.type);
-    node.argumentList?.accept(this);
+    node.argumentList.accept(this);
     node.accept(typeAnalyzer);
   }
 
@@ -1879,7 +1885,7 @@
     //
     node.accept(elementResolver);
     InferenceContext.setType(node.argumentList, node.staticElement?.type);
-    node.argumentList?.accept(this);
+    node.argumentList.accept(this);
     node.accept(typeAnalyzer);
   }
 
@@ -1902,13 +1908,13 @@
       }
     }
 
-    nullSafetyDeadCodeVerifier?.flowEnd(node);
+    nullSafetyDeadCodeVerifier.flowEnd(node);
   }
 
   @override
   void visitSwitchDefault(SwitchDefault node) {
     super.visitSwitchDefault(node);
-    nullSafetyDeadCodeVerifier?.flowEnd(node);
+    nullSafetyDeadCodeVerifier.flowEnd(node);
   }
 
   @override
@@ -1919,15 +1925,17 @@
     try {
       var expression = node.expression;
       expression.accept(this);
-      _enclosingSwitchStatementExpressionType = expression.staticType;
+      expression = node.expression;
+
+      _enclosingSwitchStatementExpressionType = expression.staticType!;
 
       if (flowAnalysis != null) {
-        var flow = flowAnalysis.flow;
+        var flow = flowAnalysis!.flow!;
 
         flow.switchStatement_expressionEnd(node);
 
         var exhaustiveness = _SwitchExhaustiveness(
-          _enclosingSwitchStatementExpressionType,
+          _enclosingSwitchStatementExpressionType!,
         );
 
         var members = node.members;
@@ -1960,7 +1968,7 @@
     }
 
     checkUnreachableNode(node);
-    var flow = flowAnalysis.flow;
+    var flow = flowAnalysis!.flow!;
 
     var body = node.body;
     var catchClauses = node.catchClauses;
@@ -1976,7 +1984,7 @@
     body.accept(this);
     if (catchClauses.isNotEmpty) {
       flow.tryCatchStatement_bodyEnd(body);
-      nullSafetyDeadCodeVerifier?.flowEnd(node.body);
+      nullSafetyDeadCodeVerifier.flowEnd(node.body);
       nullSafetyDeadCodeVerifier.tryStatementEnter(node);
 
       var catchLength = catchClauses.length;
@@ -1984,12 +1992,12 @@
         var catchClause = catchClauses[i];
         nullSafetyDeadCodeVerifier.verifyCatchClause(catchClause);
         flow.tryCatchStatement_catchBegin(
-          catchClause.exceptionParameter?.staticElement as PromotableElement,
-          catchClause.stackTraceParameter?.staticElement as PromotableElement,
+          catchClause.exceptionParameter?.staticElement as PromotableElement?,
+          catchClause.stackTraceParameter?.staticElement as PromotableElement?,
         );
         catchClause.accept(this);
         flow.tryCatchStatement_catchEnd();
-        nullSafetyDeadCodeVerifier?.flowEnd(catchClause.body);
+        nullSafetyDeadCodeVerifier.flowEnd(catchClause.body);
       }
 
       flow.tryCatchStatement_end();
@@ -2011,16 +2019,16 @@
   void visitVariableDeclaration(VariableDeclaration node) {
     _variableDeclarationResolver.resolve(node as VariableDeclarationImpl);
 
-    var declaredElement = node.declaredElement;
-    if (node.parent.parent is ForParts) {
+    var declaredElement = node.declaredElement!;
+    if (node.parent!.parent is ForParts) {
       _define(declaredElement);
     }
 
     var initializer = node.initializer;
     var parent = node.parent as VariableDeclarationList;
-    TypeAnnotation declaredType = parent.type;
+    var declaredType = parent.type;
     if (initializer != null) {
-      var initializerStaticType = initializer.staticType;
+      var initializerStaticType = initializer.staticType!;
       if (declaredType == null) {
         if (initializerStaticType is TypeParameterType) {
           flowAnalysis?.flow?.promote(
@@ -2038,8 +2046,8 @@
   void visitVariableDeclarationList(VariableDeclarationList node) {
     flowAnalysis?.variableDeclarationList(node);
     for (VariableDeclaration decl in node.variables) {
-      VariableElement variableElement = decl.declaredElement;
-      InferenceContext.setType(decl, variableElement?.type);
+      VariableElement variableElement = decl.declaredElement!;
+      InferenceContext.setType(decl, variableElement.type);
     }
     super.visitVariableDeclarationList(node);
   }
@@ -2058,17 +2066,15 @@
       InferenceContext.setType(condition, typeProvider.boolType);
 
       flowAnalysis?.flow?.whileStatement_conditionBegin(node);
-      condition?.accept(this);
+      condition.accept(this);
 
       boolExpressionVerifier.checkForNonBoolCondition(node.condition);
 
       Statement body = node.body;
-      if (body != null) {
-        flowAnalysis?.flow?.whileStatement_bodyBegin(node, condition);
-        visitStatementInScope(body);
-        flowAnalysis?.flow?.whileStatement_end();
-        nullSafetyDeadCodeVerifier?.flowEnd(node.body);
-      }
+      flowAnalysis?.flow?.whileStatement_bodyBegin(node, condition);
+      visitStatementInScope(body);
+      flowAnalysis?.flow?.whileStatement_end();
+      nullSafetyDeadCodeVerifier.flowEnd(node.body);
     } finally {
       _implicitLabelScope = outerImplicitScope;
     }
@@ -2102,7 +2108,7 @@
   /// is resynthesized and is an API-level, not local, so has its initializer
   /// serialized.
   bool _hasSerializedConstantInitializer(ParameterElement parameter) {
-    Element executable = parameter.enclosingElement;
+    var executable = parameter.enclosingElement;
     if (executable is MethodElement ||
         executable is FunctionElement &&
             executable.enclosingElement is CompilationUnitElement) {
@@ -2113,13 +2119,13 @@
 
   void _inferArgumentTypesForInstanceCreate(InstanceCreationExpression node) {
     ConstructorName constructor = node.constructorName;
-    TypeName classTypeName = constructor?.type;
-    if (classTypeName == null) {
-      return;
-    }
+    TypeName classTypeName = constructor.type;
+    // if (classTypeName == null) {
+    //   return;
+    // }
 
-    ConstructorElement originalElement = constructor.staticElement;
-    FunctionType inferred;
+    var originalElement = constructor.staticElement;
+    FunctionType? inferred;
     // If the constructor is generic, we'll have a ConstructorMember that
     // substitutes in type arguments (possibly `dynamic`) from earlier in
     // resolution.
@@ -2170,7 +2176,7 @@
 
     if (inferred == null) {
       var type = originalElement?.type;
-      type = toLegacyTypeIfOptOut(type) as FunctionType;
+      type = type != null ? toLegacyTypeIfOptOut(type) as FunctionType : null;
       InferenceContext.setType(node.argumentList, type);
     }
   }
@@ -2194,7 +2200,7 @@
       if (target is SimpleIdentifier && target.staticElement is ClassElement) {
         // `?.` to access static methods is equivalent to `.`, so do nothing.
       } else {
-        flowAnalysis.flow.nullAwareAccess_rightBegin(function,
+        flowAnalysis!.flow!.nullAwareAccess_rightBegin(function,
             function.realTarget.staticType ?? typeProvider.dynamicType);
         _unfinishedNullShorts.add(node.nullShortingTermination);
       }
@@ -2216,10 +2222,11 @@
   ///
   /// Returns the parameters that correspond to the arguments. If no parameter
   /// matched an argument, that position will be `null` in the list.
-  static List<ParameterElement> resolveArgumentsToParameters(
+  static List<ParameterElement?> resolveArgumentsToParameters(
       ArgumentList argumentList,
       List<ParameterElement> parameters,
-      void Function(ErrorCode errorCode, AstNode node, [List<Object> arguments])
+      void Function(ErrorCode errorCode, AstNode node,
+              [List<Object> arguments])?
           onError) {
     if (parameters.isEmpty && argumentList.arguments.isEmpty) {
       return const <ParameterElement>[];
@@ -2227,7 +2234,7 @@
     int requiredParameterCount = 0;
     int unnamedParameterCount = 0;
     List<ParameterElement> unnamedParameters = <ParameterElement>[];
-    Map<String, ParameterElement> namedParameters;
+    Map<String, ParameterElement>? namedParameters;
     int length = parameters.length;
     for (int i = 0; i < length; i++) {
       ParameterElement parameter = parameters[i];
@@ -2246,19 +2253,18 @@
     int unnamedIndex = 0;
     NodeList<Expression> arguments = argumentList.arguments;
     int argumentCount = arguments.length;
-    List<ParameterElement> resolvedParameters =
-        List<ParameterElement>.filled(argumentCount, null);
+    List<ParameterElement?> resolvedParameters =
+        List<ParameterElement?>.filled(argumentCount, null);
     int positionalArgumentCount = 0;
-    HashSet<String> usedNames;
+    HashSet<String>? usedNames;
     bool noBlankArguments = true;
-    Expression firstUnresolvedArgument;
+    Expression? firstUnresolvedArgument;
     for (int i = 0; i < argumentCount; i++) {
       Expression argument = arguments[i];
       if (argument is NamedExpression) {
         SimpleIdentifier nameNode = argument.name.label;
         String name = nameNode.name;
-        ParameterElement element =
-            namedParameters != null ? namedParameters[name] : null;
+        var element = namedParameters != null ? namedParameters[name] : null;
         if (element == null) {
           if (onError != null) {
             onError(CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER, nameNode,
@@ -2304,7 +2310,7 @@
         errorCode = CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS;
       }
       if (onError != null) {
-        onError(errorCode, firstUnresolvedArgument,
+        onError(errorCode, firstUnresolvedArgument!,
             [unnamedParameterCount, positionalArgumentCount]);
       }
     }
@@ -2353,7 +2359,7 @@
       var subexpressionToKeep =
           conditionalKnownValue ? node.thenExpression : node.elseExpression;
       subexpressionToKeep.accept(this);
-      typeAnalyzer.recordStaticType(node, subexpressionToKeep.staticType);
+      typeAnalyzer.recordStaticType(node, subexpressionToKeep.staticType!);
     }
   }
 
@@ -2403,22 +2409,22 @@
   final ErrorReporter errorReporter;
 
   /// The scope used to resolve identifiers.
-  Scope nameScope;
+  late Scope nameScope;
 
   /// The scope used to resolve unlabeled `break` and `continue` statements.
   ImplicitLabelScope _implicitLabelScope = ImplicitLabelScope.ROOT;
 
   /// The scope used to resolve labels for `break` and `continue` statements, or
   /// `null` if no labels have been defined in the current context.
-  LabelScope labelScope;
+  LabelScope? labelScope;
 
   /// The class containing the AST nodes being visited,
   /// or `null` if we are not in the scope of a class.
-  ClassElement enclosingClass;
+  ClassElement? enclosingClass;
 
   /// The element representing the extension containing the AST nodes being
   /// visited, or `null` if we are not in the scope of an extension.
-  ExtensionElement enclosingExtension;
+  ExtensionElement? enclosingExtension;
 
   /// Initialize a newly created visitor to resolve the nodes in a compilation
   /// unit.
@@ -2435,7 +2441,7 @@
   /// created based on [definingLibrary] and [typeProvider].
   ScopedVisitor(this.definingLibrary, Source source, this.typeProvider,
       AnalysisErrorListener errorListener,
-      {Scope nameScope})
+      {Scope? nameScope})
       : source = source,
         errorReporter = ErrorReporter(
           errorListener,
@@ -2490,15 +2496,15 @@
 
   @override
   void visitCatchClause(CatchClause node) {
-    SimpleIdentifier exception = node.exceptionParameter;
+    var exception = node.exceptionParameter;
     if (exception != null) {
       Scope outerScope = nameScope;
       try {
         nameScope = LocalScope(nameScope);
-        _define(exception.staticElement);
-        SimpleIdentifier stackTrace = node.stackTraceParameter;
+        _define(exception.staticElement!);
+        var stackTrace = node.stackTraceParameter;
         if (stackTrace != null) {
-          _define(stackTrace.staticElement);
+          _define(stackTrace.staticElement!);
         }
         super.visitCatchClause(node);
       } finally {
@@ -2512,9 +2518,9 @@
   @override
   void visitClassDeclaration(ClassDeclaration node) {
     Scope outerScope = nameScope;
-    ClassElement outerClass = enclosingClass;
+    var outerClass = enclosingClass;
     try {
-      ClassElement element = node.declaredElement;
+      ClassElement element = node.declaredElement!;
       enclosingClass = node.declaredElement;
 
       nameScope = TypeParameterScope(
@@ -2532,7 +2538,7 @@
   }
 
   void visitClassDeclarationInScope(ClassDeclaration node) {
-    node.name?.accept(this);
+    node.name.accept(this);
     node.typeParameters?.accept(this);
     node.extendsClause?.accept(this);
     node.withClause?.accept(this);
@@ -2550,7 +2556,7 @@
   void visitClassTypeAlias(ClassTypeAlias node) {
     Scope outerScope = nameScope;
     try {
-      ClassElement element = node.declaredElement;
+      ClassElement element = node.declaredElement!;
       nameScope = ClassScope(
         TypeParameterScope(nameScope, element.typeParameters),
         element,
@@ -2571,13 +2577,13 @@
   void visitConstructorDeclaration(ConstructorDeclaration node) {
     Scope outerScope = nameScope;
     try {
-      ConstructorElement element = node.declaredElement;
+      ConstructorElement element = node.declaredElement!;
 
       node.documentationComment?.accept(this);
       node.metadata.accept(this);
-      node.returnType?.accept(this);
+      node.returnType.accept(this);
       node.name?.accept(this);
-      node.parameters?.accept(this);
+      node.parameters.accept(this);
 
       try {
         nameScope = ConstructorInitializerScope(
@@ -2607,7 +2613,7 @@
 
   @override
   void visitDeclaredIdentifier(DeclaredIdentifier node) {
-    _define(node.declaredElement);
+    _define(node.declaredElement!);
     super.visitDeclaredIdentifier(node);
   }
 
@@ -2624,15 +2630,15 @@
 
   void visitDoStatementInScope(DoStatement node) {
     visitStatementInScope(node.body);
-    node.condition?.accept(this);
+    node.condition.accept(this);
   }
 
   @override
   void visitEnumDeclaration(EnumDeclaration node) {
     Scope outerScope = nameScope;
-    ClassElement outerClass = enclosingClass;
+    var outerClass = enclosingClass;
     try {
-      ClassElement element = node.declaredElement;
+      ClassElement element = node.declaredElement!;
       enclosingClass = node.declaredElement;
 
       nameScope = ClassScope(nameScope, element);
@@ -2658,9 +2664,9 @@
   @override
   void visitExtensionDeclaration(ExtensionDeclaration node) {
     Scope outerScope = nameScope;
-    ExtensionElement outerExtension = enclosingExtension;
+    var outerExtension = enclosingExtension;
     try {
-      ExtensionElement element = node.declaredElement;
+      ExtensionElement element = node.declaredElement!;
       enclosingExtension = element;
 
       nameScope = TypeParameterScope(
@@ -2680,7 +2686,7 @@
   void visitExtensionDeclarationInScope(ExtensionDeclaration node) {
     node.name?.accept(this);
     node.typeParameters?.accept(this);
-    node.extendedType?.accept(this);
+    node.extendedType.accept(this);
   }
 
   void visitExtensionMembersInScope(ExtensionDeclaration node) {
@@ -2695,8 +2701,8 @@
     // We visit the iterator before the loop variable because the loop variable
     // cannot be in scope while visiting the iterator.
     //
-    node.iterable?.accept(this);
-    node.loopVariable?.accept(this);
+    node.iterable.accept(this);
+    node.loopVariable.accept(this);
   }
 
   @override
@@ -2717,8 +2723,8 @@
   void visitForElementInScope(ForElement node) {
     // TODO(brianwilkerson) Investigate the possibility of removing the
     //  visit...InScope methods now that type propagation is no longer done.
-    node.forLoopParts?.accept(this);
-    node.body?.accept(this);
+    node.forLoopParts.accept(this);
+    node.body.accept(this);
   }
 
   @override
@@ -2732,10 +2738,10 @@
     if (parent is FunctionExpression) {
       nameScope = FormalParameterScope(
         nameScope,
-        parent.declaredElement.parameters,
+        parent.declaredElement!.parameters,
       );
     } else if (parent is FunctionTypeAlias) {
-      var aliasedElement = parent.declaredElement.aliasedElement;
+      var aliasedElement = parent.declaredElement!.aliasedElement;
       var functionElement = aliasedElement as GenericFunctionTypeElement;
       nameScope = FormalParameterScope(
         nameScope,
@@ -2744,7 +2750,7 @@
     } else if (parent is MethodDeclaration) {
       nameScope = FormalParameterScope(
         nameScope,
-        parent.declaredElement.parameters,
+        parent.declaredElement!.parameters,
       );
     }
   }
@@ -2770,7 +2776,7 @@
   void visitForStatementInScope(ForStatement node) {
     // TODO(brianwilkerson) Investigate the possibility of removing the
     //  visit...InScope methods now that type propagation is no longer done.
-    node.forLoopParts?.accept(this);
+    node.forLoopParts.accept(this);
     visitStatementInScope(node.body);
   }
 
@@ -2778,7 +2784,7 @@
   void visitFunctionDeclaration(FunctionDeclaration node) {
     Scope outerScope = nameScope;
     try {
-      var element = node.declaredElement;
+      var element = node.declaredElement!;
       nameScope = TypeParameterScope(
         nameScope,
         element.typeParameters,
@@ -2803,7 +2809,7 @@
 
     Scope outerScope = nameScope;
     try {
-      ExecutableElement element = node.declaredElement;
+      ExecutableElement element = node.declaredElement!;
       nameScope = FormalParameterScope(
         TypeParameterScope(nameScope, element.typeParameters),
         element.parameters,
@@ -2818,7 +2824,7 @@
   void visitFunctionTypeAlias(FunctionTypeAlias node) {
     Scope outerScope = nameScope;
     try {
-      var element = node.declaredElement;
+      var element = node.declaredElement!;
       nameScope = TypeParameterScope(nameScope, element.typeParameters);
       visitFunctionTypeAliasInScope(node);
     } finally {
@@ -2834,7 +2840,7 @@
   void visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     Scope outerScope = nameScope;
     try {
-      ParameterElement element = node.declaredElement;
+      ParameterElement element = node.declaredElement!;
       nameScope = TypeParameterScope(
         nameScope,
         element.typeParameters,
@@ -2847,7 +2853,7 @@
 
   @override
   void visitGenericFunctionType(GenericFunctionType node) {
-    DartType type = node.type;
+    var type = node.type;
     if (type == null) {
       // The function type hasn't been resolved yet, so we can't create a scope
       // for its parameters.
@@ -2858,7 +2864,7 @@
     Scope outerScope = nameScope;
     try {
       GenericFunctionTypeElement element =
-          (node as GenericFunctionTypeImpl).declaredElement;
+          (node as GenericFunctionTypeImpl).declaredElement!;
       nameScope = TypeParameterScope(nameScope, element.typeParameters);
       super.visitGenericFunctionType(node);
     } finally {
@@ -2888,14 +2894,14 @@
 
   @override
   void visitIfStatement(IfStatement node) {
-    node.condition?.accept(this);
+    node.condition.accept(this);
     visitStatementInScope(node.thenStatement);
     visitStatementInScope(node.elseStatement);
   }
 
   @override
   void visitLabeledStatement(LabeledStatement node) {
-    LabelScope outerScope = _addScopesFor(node.labels, node.unlabeled);
+    var outerScope = _addScopesFor(node.labels, node.unlabeled);
     try {
       super.visitLabeledStatement(node);
     } finally {
@@ -2907,7 +2913,7 @@
   void visitMethodDeclaration(MethodDeclaration node) {
     Scope outerScope = nameScope;
     try {
-      ExecutableElement element = node.declaredElement;
+      ExecutableElement element = node.declaredElement!;
       nameScope = TypeParameterScope(
         nameScope,
         element.typeParameters,
@@ -2925,9 +2931,9 @@
   @override
   void visitMixinDeclaration(MixinDeclaration node) {
     Scope outerScope = nameScope;
-    ClassElement outerClass = enclosingClass;
+    var outerClass = enclosingClass;
     try {
-      ClassElement element = node.declaredElement;
+      ClassElement element = node.declaredElement!;
       enclosingClass = element;
 
       nameScope = TypeParameterScope(nameScope, element.typeParameters);
@@ -2942,7 +2948,7 @@
   }
 
   void visitMixinDeclarationInScope(MixinDeclaration node) {
-    node.name?.accept(this);
+    node.name.accept(this);
     node.typeParameters?.accept(this);
     node.onClause?.accept(this);
     node.implementsClause?.accept(this);
@@ -2959,7 +2965,7 @@
   /// an 'if' statement.
   ///
   /// @param node the statement to be visited
-  void visitStatementInScope(Statement node) {
+  void visitStatementInScope(Statement? node) {
     if (node is Block) {
       // Don't create a scope around a block because the block will create it's
       // own scope.
@@ -2993,7 +2999,7 @@
 
   @override
   void visitSwitchStatement(SwitchStatement node) {
-    LabelScope outerScope = labelScope;
+    var outerScope = labelScope;
     ImplicitLabelScope outerImplicitScope = _implicitLabelScope;
     try {
       _implicitLabelScope = _implicitLabelScope.nest(node);
@@ -3020,14 +3026,14 @@
   void visitVariableDeclaration(VariableDeclaration node) {
     super.visitVariableDeclaration(node);
 
-    if (node.parent.parent is ForParts) {
-      _define(node.declaredElement);
+    if (node.parent!.parent is ForParts) {
+      _define(node.declaredElement!);
     }
   }
 
   @override
   void visitWhileStatement(WhileStatement node) {
-    node.condition?.accept(this);
+    node.condition.accept(this);
     ImplicitLabelScope outerImplicitScope = _implicitLabelScope;
     try {
       _implicitLabelScope = _implicitLabelScope.nest(node);
@@ -3041,8 +3047,8 @@
   ///
   /// @param labels the labels for which new scopes are to be added
   /// @return the scope that was in effect before the new scopes were added
-  LabelScope _addScopesFor(NodeList<Label> labels, AstNode node) {
-    LabelScope outerScope = labelScope;
+  LabelScope? _addScopesFor(NodeList<Label> labels, AstNode node) {
+    var outerScope = labelScope;
     for (Label label in labels) {
       SimpleIdentifier labelNameNode = label.label;
       String labelName = labelNameNode.name;
@@ -3080,7 +3086,7 @@
   /// Not every node has the scope set, for example we set the scopes for
   /// blocks, but statements don't have separate scopes. The compilation unit
   /// has the library scope.
-  static Scope getNodeNameScope(AstNode node) {
+  static Scope? getNodeNameScope(AstNode node) {
     return node.getProperty(_nameScopeProperty);
   }
 
@@ -3095,7 +3101,7 @@
 class VariableResolverVisitor extends ScopedVisitor {
   /// The method or function that we are currently visiting, or `null` if we are
   /// not inside a method or function.
-  ExecutableElement _enclosingFunction;
+  ExecutableElement? _enclosingFunction;
 
   /// The container with information about local variables.
   final LocalVariableInfo _localVariableInfo = LocalVariableInfo();
@@ -3115,20 +3121,14 @@
   /// created based on [definingLibrary] and [typeProvider].
   VariableResolverVisitor(LibraryElement definingLibrary, Source source,
       TypeProvider typeProvider, AnalysisErrorListener errorListener,
-      {Scope nameScope})
+      {Scope? nameScope})
       : super(definingLibrary, source, typeProvider as TypeProviderImpl,
             errorListener,
             nameScope: nameScope);
 
   @override
-  void visitBlockFunctionBody(BlockFunctionBody node) {
-    assert(_localVariableInfo != null);
-    super.visitBlockFunctionBody(node);
-  }
-
-  @override
   void visitConstructorDeclaration(ConstructorDeclaration node) {
-    ExecutableElement outerFunction = _enclosingFunction;
+    var outerFunction = _enclosingFunction;
     try {
       (node.body as FunctionBodyImpl).localVariableInfo = _localVariableInfo;
       _enclosingFunction = node.declaredElement;
@@ -3142,14 +3142,8 @@
   void visitExportDirective(ExportDirective node) {}
 
   @override
-  void visitExpressionFunctionBody(ExpressionFunctionBody node) {
-    assert(_localVariableInfo != null);
-    super.visitExpressionFunctionBody(node);
-  }
-
-  @override
   void visitFunctionDeclaration(FunctionDeclaration node) {
-    ExecutableElement outerFunction = _enclosingFunction;
+    var outerFunction = _enclosingFunction;
     try {
       (node.functionExpression.body as FunctionBodyImpl).localVariableInfo =
           _localVariableInfo;
@@ -3163,7 +3157,7 @@
   @override
   void visitFunctionExpression(FunctionExpression node) {
     if (node.parent is! FunctionDeclaration) {
-      ExecutableElement outerFunction = _enclosingFunction;
+      var outerFunction = _enclosingFunction;
       try {
         (node.body as FunctionBodyImpl).localVariableInfo = _localVariableInfo;
         _enclosingFunction = node.declaredElement;
@@ -3181,7 +3175,7 @@
 
   @override
   void visitMethodDeclaration(MethodDeclaration node) {
-    ExecutableElement outerFunction = _enclosingFunction;
+    var outerFunction = _enclosingFunction;
     try {
       (node.body as FunctionBodyImpl).localVariableInfo = _localVariableInfo;
       _enclosingFunction = node.declaredElement;
@@ -3198,7 +3192,7 @@
       return;
     }
     // Ignore if it cannot be a reference to a local variable.
-    AstNode parent = node.parent;
+    var parent = node.parent;
     if (parent is FieldFormalParameter) {
       return;
     } else if (parent is ConstructorDeclaration && parent.returnType == node) {
@@ -3226,7 +3220,7 @@
       return;
     }
     // Prepare VariableElement.
-    Element element = nameScope.lookup(node.name).getter;
+    var element = nameScope.lookup(node.name).getter;
     if (element is! VariableElement) {
       return;
     }
@@ -3252,7 +3246,7 @@
 class _SwitchExhaustiveness {
   /// If the switch is on an enumeration, the set of enum constants to cover.
   /// Otherwise `null`.
-  final Set<FieldElement> _enumConstants;
+  final Set<FieldElement>? _enumConstants;
 
   /// If the switch is on an enumeration, is `true` if the null value is
   /// covered, because the switch expression type is non-nullable, or `null`
@@ -3280,14 +3274,14 @@
     if (_enumConstants != null && node is SwitchCase) {
       var element = _referencedElement(node.expression);
       if (element is PropertyAccessorElement) {
-        _enumConstants.remove(element.variable);
+        _enumConstants!.remove(element.variable);
       }
 
       if (node.expression is NullLiteral) {
         _isNullEnumValueCovered = true;
       }
 
-      if (_enumConstants.isEmpty && _isNullEnumValueCovered) {
+      if (_enumConstants!.isEmpty && _isNullEnumValueCovered) {
         isExhaustive = true;
       }
     } else if (node is SwitchDefault) {
@@ -3295,7 +3289,7 @@
     }
   }
 
-  static Element _referencedElement(Expression expression) {
+  static Element? _referencedElement(Expression expression) {
     if (expression is PrefixedIdentifier) {
       return expression.staticElement;
     } else if (expression is PropertyAccess) {
diff --git a/pkg/analyzer/lib/src/generated/sdk.dart b/pkg/analyzer/lib/src/generated/sdk.dart
index 2ac5298..1fd1ec8 100644
--- a/pkg/analyzer/lib/src/generated/sdk.dart
+++ b/pkg/analyzer/lib/src/generated/sdk.dart
@@ -29,7 +29,7 @@
 
   /// Return the content of the `allowed_experiments.json` file, or `null`
   /// if the file cannot be read, e.g. does not exist.
-  String get allowedExperimentsJson;
+  String? get allowedExperimentsJson;
 
   /// Return the language version of this SDK, or throws an exception.
   ///
@@ -50,15 +50,15 @@
 
   /// Return a source representing the given 'file:' [uri] if the file is in
   /// this SDK, or `null` if the file is not in this SDK.
-  Source fromFileUri(Uri uri);
+  Source? fromFileUri(Uri uri);
 
   /// Return the library representing the library with the given 'dart:' [uri],
   /// or `null` if the given URI does not denote a library in this SDK.
-  SdkLibrary getSdkLibrary(String uri);
+  SdkLibrary? getSdkLibrary(String uri);
 
   /// Return the source representing the library with the given 'dart:' [uri],
   /// or `null` if the given URI does not denote a library in this SDK.
-  Source mapDartUri(String uri);
+  Source? mapDartUri(String uri);
 }
 
 /// Manages the DartSdk's that have been created. Clients need to create
@@ -73,11 +73,11 @@
   Map<SdkDescription, DartSdk> sdkMap = HashMap<SdkDescription, DartSdk>();
 
   /// Initialize a newly created manager.
-  DartSdkManager(this.defaultSdkDirectory, [@deprecated bool canUseSummaries]);
+  DartSdkManager(this.defaultSdkDirectory, [@deprecated bool? canUseSummaries]);
 
   /// Return any SDK that has been created, or `null` if no SDKs have been
   /// created.
-  DartSdk get anySdk {
+  DartSdk? get anySdk {
     if (sdkMap.isEmpty) {
       return null;
     }
@@ -103,7 +103,7 @@
   final Map<String, SdkLibraryImpl> _libraryMap = <String, SdkLibraryImpl>{};
 
   /// Return a list containing all of the sdk libraries in this mapping.
-  List<SdkLibrary> get sdkLibraries => List.from(_libraryMap.values);
+  List<SdkLibraryImpl> get sdkLibraries => List.from(_libraryMap.values);
 
   /// Return a list containing the library URI's for which a mapping is
   /// available.
@@ -112,8 +112,9 @@
   /// Return info for debugging https://github.com/dart-lang/sdk/issues/35226.
   Map<String, Object> debugInfo() {
     var map = <String, Object>{};
-    for (var uri in _libraryMap.keys) {
-      var lib = _libraryMap[uri];
+    for (var entry in _libraryMap.entries) {
+      var uri = entry.key;
+      var lib = entry.value;
       map[uri] = <String, Object>{
         'path': lib.path,
         'shortName': lib.shortName,
@@ -124,7 +125,7 @@
 
   /// Return the library with the given 'dart:' [uri], or `null` if the URI does
   /// not map to a library.
-  SdkLibrary getLibrary(String uri) => _libraryMap[uri];
+  SdkLibrary? getLibrary(String uri) => _libraryMap[uri];
 
   /// Set the library with the given 'dart:' [uri] to the given [library].
   void setLibrary(String dartUri, SdkLibraryImpl library) {
@@ -218,11 +219,9 @@
 
   @override
   void visitMapLiteralEntry(MapLiteralEntry node) {
-    String libraryName;
-    Expression key = node.key;
-    if (key is SimpleStringLiteral) {
-      libraryName = "$_LIBRARY_PREFIX${key.value}";
-    }
+    var key = node.key as SimpleStringLiteral;
+    var libraryName = "$_LIBRARY_PREFIX${key.value}";
+
     Expression value = node.value;
     if (value is InstanceCreationExpression) {
       SdkLibraryImpl library = SdkLibraryImpl(libraryName);
@@ -234,8 +233,8 @@
           String name = argument.name.label.name;
           Expression expression = argument.expression;
           if (name == _CATEGORIES) {
-            library.category =
-                convertCategories((expression as StringLiteral).stringValue);
+            var value = (expression as StringLiteral).stringValue!;
+            library.category = convertCategories(value);
           } else if (name == _IMPLEMENTATION) {
             library._implementation = (expression as BooleanLiteral).value;
           } else if (name == _DOCUMENTED) {
@@ -310,7 +309,7 @@
   /// The path to the file defining the library. The path is relative to the
   /// 'lib' directory within the SDK.
   @override
-  String path;
+  late String path;
 
   /// The name of the category containing the library. Unless otherwise
   /// specified in the libraries file all libraries are assumed to be shared
diff --git a/pkg/analyzer/lib/src/generated/source.dart b/pkg/analyzer/lib/src/generated/source.dart
index 96a1e96..c90e2cf 100644
--- a/pkg/analyzer/lib/src/generated/source.dart
+++ b/pkg/analyzer/lib/src/generated/source.dart
@@ -61,7 +61,7 @@
   /// Visit all entries of this cache.
   void accept(ContentCacheVisitor visitor) {
     _contentMap.forEach((String fullPath, String contents) {
-      int stamp = _stampMap[fullPath];
+      int stamp = _stampMap[fullPath]!;
       visitor(fullPath, stamp, contents);
     });
   }
@@ -71,14 +71,14 @@
   ///
   /// <b>Note:</b> This method is not intended to be used except by
   /// [AnalysisContext.getContents].
-  String getContents(Source source) => _contentMap[source.fullName];
+  String? getContents(Source source) => _contentMap[source.fullName];
 
   /// Return `true` if the given [source] exists, `false` if it does not exist,
   /// or `null` if this cache does not override existence of the source.
   ///
   /// <b>Note:</b> This method is not intended to be used except by
   /// [AnalysisContext.exists].
-  bool getExists(Source source) {
+  bool? getExists(Source source) {
     return _contentMap.containsKey(source.fullName) ? true : null;
   }
 
@@ -87,20 +87,20 @@
   ///
   /// <b>Note:</b> This method is not intended to be used except by
   /// [AnalysisContext.getModificationStamp].
-  int getModificationStamp(Source source) => _stampMap[source.fullName];
+  int? getModificationStamp(Source source) => _stampMap[source.fullName];
 
   /// Set the contents of the given [source] to the given [contents]. This has
   /// the effect of overriding the default contents of the source. If the
   /// contents are `null` the override is removed so that the default contents
   /// will be returned.
-  String setContents(Source source, String contents) {
+  String? setContents(Source source, String? contents) {
     String fullName = source.fullName;
     if (contents == null) {
       _stampMap.remove(fullName);
       return _contentMap.remove(fullName);
     } else {
       int newStamp = _nextStamp++;
-      int oldStamp = _stampMap[fullName];
+      var oldStamp = _stampMap[fullName];
       _stampMap[fullName] = newStamp;
       // Occasionally, if this method is called in rapid succession, the
       // timestamps are equal. Guard against this by artificially incrementing
@@ -108,7 +108,7 @@
       if (newStamp == oldStamp) {
         _stampMap[fullName] = newStamp + 1;
       }
-      String oldContent = _contentMap[fullName];
+      var oldContent = _contentMap[fullName];
       _contentMap[fullName] = contents;
       return oldContent;
     }
@@ -137,7 +137,7 @@
   DartSdk get dartSdk => _sdk;
 
   @override
-  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
+  Source? resolveAbsolute(Uri uri, [Uri? actualUri]) {
     if (!isDartUri(uri)) {
       return null;
     }
@@ -145,8 +145,8 @@
   }
 
   @override
-  Uri restoreAbsolute(Source source) {
-    Source dartSource = _sdk.fromFileUri(source.uri);
+  Uri? restoreAbsolute(Source source) {
+    var dartSource = _sdk.fromFileUri(source.uri);
     return dartSource?.uri;
   }
 
@@ -154,7 +154,7 @@
   ///
   /// @param uriContent the textual representation of the URI being tested
   /// @return `true` if the given URI is a `dart-ext:` URI
-  static bool isDartExtUri(String uriContent) =>
+  static bool isDartExtUri(String? uriContent) =>
       uriContent != null && uriContent.startsWith(_DART_EXT_SCHEME);
 
   /// Return `true` if the given URI is a `dart:` URI.
@@ -294,7 +294,7 @@
   bool get isInSystemLibrary;
 
   @override
-  Source get librarySource => null;
+  Source get librarySource => throw UnimplementedError();
 
   /// Return the modification stamp for this source, or a negative value if the
   /// source does not exist. A modification stamp is a non-negative integer with
@@ -366,11 +366,11 @@
   ///
   /// @return the [DartSdk] associated with this [SourceFactory], or `null` if
   ///         there is no such SDK
-  DartSdk get dartSdk;
+  DartSdk? get dartSdk;
 
   /// A table mapping package names to paths of directories containing
   /// the package (or [null] if there is no registered package URI resolver).
-  Map<String, List<Folder>> get packageMap;
+  Map<String, List<Folder>>? get packageMap;
 
   /// Clear any cached URI resolution information in the [SourceFactory] itself,
   /// and also ask each [UriResolver]s to clear its caches.
@@ -381,28 +381,28 @@
   ///
   /// @param absoluteUri the absolute URI to be resolved
   /// @return a source object representing the absolute URI
-  Source forUri(String absoluteUri);
+  Source? forUri(String absoluteUri);
 
   /// Return a source object representing the given absolute URI, or `null` if
   /// the URI is not an absolute URI.
   ///
   /// @param absoluteUri the absolute URI to be resolved
   /// @return a source object representing the absolute URI
-  Source forUri2(Uri absoluteUri);
+  Source? forUri2(Uri absoluteUri);
 
   /// Return a source representing the URI that results from resolving the given
   /// (possibly relative) [containedUri] against the URI associated with the
   /// [containingSource], whether or not the resulting source exists, or `null`
   /// if either the [containedUri] is invalid or if it cannot be resolved
   /// against the [containingSource]'s URI.
-  Source resolveUri(Source containingSource, String containedUri);
+  Source? resolveUri(Source? containingSource, String? containedUri);
 
   /// Return an absolute URI that represents the given source, or `null` if a
   /// valid URI cannot be computed.
   ///
   /// @param source the source to get URI for
   /// @return the absolute URI representing the given source
-  Uri restoreUri(Source source);
+  Uri? restoreUri(Source source);
 }
 
 /// The enumeration `SourceKind` defines the different kinds of sources that are
@@ -484,7 +484,7 @@
 
   /// Return the URI kind represented by the given [encoding], or `null` if
   /// there is no kind with the given encoding.
-  static UriKind fromEncoding(int encoding) {
+  static UriKind? fromEncoding(int encoding) {
     while (true) {
       if (encoding == 0x64) {
         return DART_URI;
@@ -532,11 +532,11 @@
   /// @param actualUri the actual uri for this source -- if `null`, the value of
   /// [uri] will be used
   /// @return a [Source] representing the file to which given URI was resolved
-  Source resolveAbsolute(Uri uri, [Uri actualUri]);
+  Source? resolveAbsolute(Uri uri, [Uri actualUri]);
 
   /// Return an absolute URI that represents the given [source], or `null` if a
   /// valid URI cannot be computed.
   ///
   /// The computation should be based solely on [source.fullName].
-  Uri restoreAbsolute(Source source) => null;
+  Uri? restoreAbsolute(Source source) => null;
 }
diff --git a/pkg/analyzer/lib/src/generated/source_io.dart b/pkg/analyzer/lib/src/generated/source_io.dart
index fb337a8..906a677 100644
--- a/pkg/analyzer/lib/src/generated/source_io.dart
+++ b/pkg/analyzer/lib/src/generated/source_io.dart
@@ -31,15 +31,15 @@
   final JavaFile file;
 
   /// The cached absolute path of this source.
-  String _absolutePath;
+  String? _absolutePath;
 
   /// The cached encoding for this source.
-  String _encoding;
+  String? _encoding;
 
   /// Initialize a newly created source object to represent the given [file]. If
   /// a [uri] is given, then it will be used as the URI from which the source
   /// was derived, otherwise a `file:` URI will be created based on the [file].
-  FileBasedSource(JavaFile file, [Uri uri])
+  FileBasedSource(JavaFile file, [Uri? uri])
       : uri = uri ?? file.toURI(),
         file = file,
         id = _idTable.putIfAbsent(
@@ -108,9 +108,6 @@
 
   @override
   String toString() {
-    if (file == null) {
-      return "<unknown source>";
-    }
     return file.getAbsolutePath();
   }
 }
diff --git a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
index 036e46d..e7d2de5 100644
--- a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
+++ b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
@@ -26,16 +26,16 @@
   /// The resolver driving the resolution and type analysis.
   final ResolverVisitor _resolver;
 
-  final MigrationResolutionHooks _migrationResolutionHooks;
+  final MigrationResolutionHooks? _migrationResolutionHooks;
 
   /// The object providing access to the types defined by the language.
-  TypeProviderImpl _typeProvider;
+  late TypeProviderImpl _typeProvider;
 
   /// The type system in use for static type analysis.
-  TypeSystemImpl _typeSystem;
+  late TypeSystemImpl _typeSystem;
 
   /// The type representing the type 'dynamic'.
-  DartType _dynamicType;
+  late DartType _dynamicType;
 
   /// Initialize a newly created static type analyzer to analyze types for the
   /// [_resolver] based on the
@@ -76,22 +76,14 @@
   ///
   /// TODO(scheglov) this is duplication
   void recordStaticType(Expression expression, DartType type) {
-    if (_migrationResolutionHooks != null) {
-      // TODO(scheglov) type cannot be null
-      type = _migrationResolutionHooks.modifyExpressionType(
-        expression,
-        type ?? DynamicTypeImpl.instance,
-      );
+    var hooks = _migrationResolutionHooks;
+    if (hooks != null) {
+      type = hooks.modifyExpressionType(expression, type);
     }
 
-    // TODO(scheglov) type cannot be null
-    if (type == null) {
-      expression.staticType = DynamicTypeImpl.instance;
-    } else {
-      expression.staticType = type;
-      if (_typeSystem.isBottom(type)) {
-        _resolver.flowAnalysis?.flow?.handleExit();
-      }
+    expression.staticType = type;
+    if (_typeSystem.isBottom(type)) {
+      _resolver.flowAnalysis?.flow?.handleExit();
     }
   }
 
@@ -119,8 +111,8 @@
   ///   the static type of e.
   @override
   void visitAwaitExpression(AwaitExpression node) {
-    DartType resultType = node.expression.staticType;
-    if (resultType != null) resultType = _typeSystem.flatten(resultType);
+    var resultType = node.expression.staticType!;
+    resultType = _typeSystem.flatten(resultType);
     recordStaticType(node, resultType);
   }
 
@@ -136,7 +128,7 @@
   /// t;}(e)</i>.</blockquote>
   @override
   void visitCascadeExpression(CascadeExpression node) {
-    recordStaticType(node, node.target.staticType);
+    recordStaticType(node, node.target.staticType!);
   }
 
   /// The Dart Language Specification, 12.19: <blockquote> ... a conditional expression <i>c</i> of
@@ -204,7 +196,7 @@
   @override
   void visitInstanceCreationExpression(InstanceCreationExpression node) {
     _inferInstanceCreationExpression(node);
-    recordStaticType(node, node.constructorName.type.type);
+    recordStaticType(node, node.constructorName.type.type!);
   }
 
   /// <blockquote>
@@ -253,7 +245,7 @@
   @override
   void visitNamedExpression(NamedExpression node) {
     Expression expression = node.expression;
-    recordStaticType(node, expression.staticType);
+    recordStaticType(node, expression.staticType!);
   }
 
   /// The Dart Language Specification, 12.2: <blockquote>The static type of `null` is bottom.
@@ -266,7 +258,7 @@
   @override
   void visitParenthesizedExpression(ParenthesizedExpression node) {
     Expression expression = node.expression;
-    recordStaticType(node, expression.staticType);
+    recordStaticType(node, expression.staticType!);
   }
 
   /// The Dart Language Specification, 12.9: <blockquote>The static type of a rethrow expression is
@@ -292,13 +284,14 @@
 
   @override
   void visitSuperExpression(SuperExpression node) {
-    if (_resolver.thisType == null ||
+    var thisType = _resolver.thisType;
+    if (thisType == null ||
         node.thisOrAncestorOfType<ExtensionDeclaration>() != null) {
       // TODO(brianwilkerson) Report this error if it hasn't already been
       // reported.
       recordStaticType(node, _dynamicType);
     } else {
-      recordStaticType(node, _resolver.thisType);
+      recordStaticType(node, thisType);
     }
   }
 
@@ -311,12 +304,13 @@
   /// interface of the immediately enclosing class.</blockquote>
   @override
   void visitThisExpression(ThisExpression node) {
-    if (_resolver.thisType == null) {
+    var thisType = _resolver.thisType;
+    if (thisType == null) {
       // TODO(brianwilkerson) Report this error if it hasn't already been
       // reported.
       recordStaticType(node, _dynamicType);
     } else {
-      recordStaticType(node, _resolver.thisType);
+      recordStaticType(node, thisType);
     }
   }
 
@@ -331,8 +325,8 @@
   /// types of subexpressions [expr1] and [expr2].
   void _analyzeLeastUpperBound(
       Expression node, Expression expr1, Expression expr2) {
-    DartType staticType1 = expr1.staticType;
-    DartType staticType2 = expr2.staticType;
+    var staticType1 = expr1.staticType!;
+    var staticType2 = expr2.staticType!;
 
     _analyzeLeastUpperBoundTypes(node, staticType1, staticType2);
   }
@@ -341,15 +335,8 @@
   /// types [staticType1] and [staticType2].
   void _analyzeLeastUpperBoundTypes(
       Expression node, DartType staticType1, DartType staticType2) {
-    // TODO(brianwilkerson) Determine whether this can still happen.
-    staticType1 ??= _dynamicType;
-
-    // TODO(brianwilkerson) Determine whether this can still happen.
-    staticType2 ??= _dynamicType;
-
     DartType staticType =
-        _typeSystem.getLeastUpperBound(staticType1, staticType2) ??
-            _dynamicType;
+        _typeSystem.getLeastUpperBound(staticType1, staticType2);
 
     staticType = _resolver.toLegacyTypeIfOptOut(staticType);
 
@@ -358,7 +345,7 @@
 
   /// Return the type represented by the given type [annotation].
   DartType _getType(TypeAnnotation annotation) {
-    DartType type = annotation.type;
+    var type = annotation.type;
     if (type == null) {
       //TODO(brianwilkerson) Determine the conditions for which the type is
       // null.
@@ -371,7 +358,7 @@
   /// arguments using the current context type as well as the argument types.
   void _inferInstanceCreationExpression(InstanceCreationExpression node) {
     ConstructorName constructor = node.constructorName;
-    ConstructorElement originalElement = constructor.staticElement;
+    var originalElement = constructor.staticElement;
     // If the constructor is generic, we'll have a ConstructorMember that
     // substitutes in type arguments (possibly `dynamic`) from earlier in
     // resolution.
@@ -398,7 +385,7 @@
     FunctionType constructorType = constructorToGenericFunctionType(rawElement);
 
     ArgumentList arguments = node.argumentList;
-    FunctionType inferred = _resolver.inferenceHelper.inferGenericInvoke(
+    var inferred = _resolver.inferenceHelper.inferGenericInvoke(
         node,
         constructorType,
         constructor.type.typeArguments,
diff --git a/pkg/analyzer/lib/src/generated/super_context.dart b/pkg/analyzer/lib/src/generated/super_context.dart
index bee205b..461d250 100644
--- a/pkg/analyzer/lib/src/generated/super_context.dart
+++ b/pkg/analyzer/lib/src/generated/super_context.dart
@@ -28,7 +28,7 @@
   /// Return an indication of the context in which the super [expression] is
   /// being used.
   factory SuperContext.of(SuperExpression expression) {
-    for (AstNode node = expression; node != null; node = node.parent) {
+    for (AstNode? node = expression; node != null; node = node.parent) {
       if (node is Annotation) {
         return SuperContext.annotation;
       } else if (node is CompilationUnit) {
diff --git a/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart b/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
index a76d625..d2f99c2 100644
--- a/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
@@ -12,7 +12,6 @@
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/generated/testing/token_factory.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
-import 'package:meta/meta.dart';
 
 /// The class `AstTestFactory` defines utility methods that can be used to
 /// create AST nodes. The nodes that are created are complete in the sense that
@@ -35,7 +34,7 @@
       TokenFactory.tokenFromType(TokenType.AT), name, null, null, null);
 
   static Annotation annotation2(Identifier name,
-          SimpleIdentifier constructorName, ArgumentList arguments) =>
+          SimpleIdentifier? constructorName, ArgumentList arguments) =>
       astFactory.annotation(
           TokenFactory.tokenFromType(TokenType.AT),
           name,
@@ -45,7 +44,7 @@
           constructorName,
           arguments);
 
-  static ArgumentList argumentList([List<Expression> arguments]) =>
+  static ArgumentList argumentList([List<Expression> arguments = const []]) =>
       astFactory.argumentList(TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
           arguments, TokenFactory.tokenFromType(TokenType.CLOSE_PAREN));
 
@@ -65,7 +64,7 @@
           TokenFactory.tokenFromType(TokenType.CLOSE_PAREN));
 
   static AssertStatement assertStatement(Expression condition,
-          [Expression message]) =>
+          [Expression? message]) =>
       astFactory.assertStatement(
           TokenFactory.tokenFromKeyword(Keyword.ASSERT),
           TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
@@ -81,7 +80,7 @@
           leftHandSide, TokenFactory.tokenFromType(operator), rightHandSide);
 
   static BlockFunctionBody asyncBlockFunctionBody(
-          [List<Statement> statements]) =>
+          [List<Statement> statements = const []]) =>
       astFactory.blockFunctionBody(
           TokenFactory.tokenFromTypeAndString(TokenType.IDENTIFIER, "async"),
           null,
@@ -96,7 +95,7 @@
           TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
   static BlockFunctionBody asyncGeneratorBlockFunctionBody(
-          [List<Statement> statements]) =>
+          [List<Statement> statements = const []]) =>
       astFactory.blockFunctionBody(
           TokenFactory.tokenFromTypeAndString(TokenType.IDENTIFIER, "async"),
           TokenFactory.tokenFromType(TokenType.STAR),
@@ -112,15 +111,17 @@
       astFactory.binaryExpression(
           leftOperand, TokenFactory.tokenFromType(operator), rightOperand);
 
-  static Block block([List<Statement> statements]) => astFactory.block(
-      TokenFactory.tokenFromType(TokenType.OPEN_CURLY_BRACKET),
-      statements,
-      TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET));
+  static Block block([List<Statement> statements = const []]) =>
+      astFactory.block(
+          TokenFactory.tokenFromType(TokenType.OPEN_CURLY_BRACKET),
+          statements,
+          TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET));
 
   static BlockFunctionBody blockFunctionBody(Block block) =>
       astFactory.blockFunctionBody(null, null, block);
 
-  static BlockFunctionBody blockFunctionBody2([List<Statement> statements]) =>
+  static BlockFunctionBody blockFunctionBody2(
+          [List<Statement> statements = const []]) =>
       astFactory.blockFunctionBody(null, null, block(statements));
 
   static BooleanLiteral booleanLiteral(bool value) => astFactory.booleanLiteral(
@@ -148,7 +149,7 @@
               TokenFactory.tokenFromType(TokenType.CLOSE_SQUARE_BRACKET));
 
   static MethodInvocation cascadedMethodInvocation(String methodName,
-          [List<Expression> arguments]) =>
+          [List<Expression> arguments = const []]) =>
       astFactory.methodInvocation(
           null,
           TokenFactory.tokenFromType(TokenType.PERIOD_PERIOD),
@@ -163,33 +164,33 @@
           identifier3(propertyName));
 
   static CascadeExpression cascadeExpression(Expression target,
-      [List<Expression> cascadeSections]) {
+      [List<Expression> cascadeSections = const []]) {
     var cascade = astFactory.cascadeExpression(target, cascadeSections);
     cascade.target.endToken.next = cascadeSections.first.beginToken;
     return cascade;
   }
 
   static CatchClause catchClause(String exceptionParameter,
-          [List<Statement> statements]) =>
+          [List<Statement> statements = const []]) =>
       catchClause5(null, exceptionParameter, null, statements);
 
   static CatchClause catchClause2(
           String exceptionParameter, String stackTraceParameter,
-          [List<Statement> statements]) =>
+          [List<Statement> statements = const []]) =>
       catchClause5(null, exceptionParameter, stackTraceParameter, statements);
 
   static CatchClause catchClause3(TypeAnnotation exceptionType,
-          [List<Statement> statements]) =>
+          [List<Statement> statements = const []]) =>
       catchClause5(exceptionType, null, null, statements);
 
   static CatchClause catchClause4(
           TypeAnnotation exceptionType, String exceptionParameter,
-          [List<Statement> statements]) =>
+          [List<Statement> statements = const []]) =>
       catchClause5(exceptionType, exceptionParameter, null, statements);
 
-  static CatchClause catchClause5(TypeAnnotation exceptionType,
-          String exceptionParameter, String stackTraceParameter,
-          [List<Statement> statements]) =>
+  static CatchClause catchClause5(TypeAnnotation? exceptionType,
+          String? exceptionParameter, String? stackTraceParameter,
+          [List<Statement> statements = const []]) =>
       astFactory.catchClause(
           exceptionType == null
               ? null
@@ -212,13 +213,13 @@
           block(statements));
 
   static ClassDeclaration classDeclaration(
-          Keyword abstractKeyword,
+          Keyword? abstractKeyword,
           String name,
-          TypeParameterList typeParameters,
-          ExtendsClause extendsClause,
-          WithClause withClause,
-          ImplementsClause implementsClause,
-          [List<ClassMember> members]) =>
+          TypeParameterList? typeParameters,
+          ExtendsClause? extendsClause,
+          WithClause? withClause,
+          ImplementsClause? implementsClause,
+          [List<ClassMember> members = const []]) =>
       astFactory.classDeclaration(
           null,
           null,
@@ -237,11 +238,11 @@
 
   static ClassTypeAlias classTypeAlias(
           String name,
-          TypeParameterList typeParameters,
-          Keyword abstractKeyword,
+          TypeParameterList? typeParameters,
+          Keyword? abstractKeyword,
           TypeName superclass,
           WithClause withClause,
-          ImplementsClause implementsClause) =>
+          ImplementsClause? implementsClause) =>
       astFactory.classTypeAlias(
           null,
           null,
@@ -257,55 +258,54 @@
           implementsClause,
           TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
-  static CompilationUnit compilationUnit() =>
-      compilationUnit8(null, null, null);
+  static CompilationUnit compilationUnit() => compilationUnit8(null, [], []);
 
   static CompilationUnit compilationUnit2(
           List<CompilationUnitMember> declarations) =>
-      compilationUnit8(null, null, declarations);
+      compilationUnit8(null, [], declarations);
 
   static CompilationUnit compilationUnit3(List<Directive> directives) =>
-      compilationUnit8(null, directives, null);
+      compilationUnit8(null, directives, []);
 
   static CompilationUnit compilationUnit4(List<Directive> directives,
           List<CompilationUnitMember> declarations) =>
       compilationUnit8(null, directives, declarations);
 
   static CompilationUnit compilationUnit5(String scriptTag) =>
-      compilationUnit8(scriptTag, null, null);
+      compilationUnit8(scriptTag, [], []);
 
   static CompilationUnit compilationUnit6(
           String scriptTag, List<CompilationUnitMember> declarations) =>
-      compilationUnit8(scriptTag, null, declarations);
+      compilationUnit8(scriptTag, [], declarations);
 
   static CompilationUnit compilationUnit7(
           String scriptTag, List<Directive> directives) =>
-      compilationUnit8(scriptTag, directives, null);
+      compilationUnit8(scriptTag, directives, []);
 
   static CompilationUnit compilationUnit8(
-          String scriptTag,
+          String? scriptTag,
           List<Directive> directives,
           List<CompilationUnitMember> declarations) =>
       astFactory.compilationUnit(
           beginToken: TokenFactory.tokenFromType(TokenType.EOF),
           scriptTag:
               scriptTag == null ? null : AstTestFactory.scriptTag(scriptTag),
-          directives: directives ?? <Directive>[],
-          declarations: declarations ?? <CompilationUnitMember>[],
+          directives: directives,
+          declarations: declarations,
           endToken: TokenFactory.tokenFromType(TokenType.EOF),
-          featureSet: null);
+          featureSet: FeatureSet.latestLanguageVersion());
 
   static CompilationUnit compilationUnit9(
-          {String scriptTag,
-          List<Directive> directives,
-          List<CompilationUnitMember> declarations,
-          FeatureSet featureSet}) =>
+          {String? scriptTag,
+          List<Directive> directives = const [],
+          List<CompilationUnitMember> declarations = const [],
+          required FeatureSet featureSet}) =>
       astFactory.compilationUnit(
           beginToken: TokenFactory.tokenFromType(TokenType.EOF),
           scriptTag:
               scriptTag == null ? null : AstTestFactory.scriptTag(scriptTag),
-          directives: directives ?? <Directive>[],
-          declarations: declarations ?? <CompilationUnitMember>[],
+          directives: directives,
+          declarations: declarations,
           endToken: TokenFactory.tokenFromType(TokenType.EOF),
           featureSet: featureSet);
 
@@ -320,7 +320,7 @@
 
   static ConstructorDeclaration constructorDeclaration(
           Identifier returnType,
-          String name,
+          String? name,
           FormalParameterList parameters,
           List<ConstructorInitializer> initializers) =>
       astFactory.constructorDeclaration(
@@ -333,18 +333,18 @@
           name == null ? null : TokenFactory.tokenFromType(TokenType.PERIOD),
           name == null ? null : identifier3(name),
           parameters,
-          initializers == null || initializers.isEmpty
+          initializers.isEmpty
               ? null
               : TokenFactory.tokenFromType(TokenType.PERIOD),
-          initializers ?? <ConstructorInitializer>[],
+          initializers,
           null,
           emptyFunctionBody());
 
   static ConstructorDeclaration constructorDeclaration2(
-          Keyword constKeyword,
-          Keyword factoryKeyword,
+          Keyword? constKeyword,
+          Keyword? factoryKeyword,
           Identifier returnType,
-          String name,
+          String? name,
           FormalParameterList parameters,
           List<ConstructorInitializer> initializers,
           FunctionBody body) =>
@@ -362,10 +362,10 @@
           name == null ? null : TokenFactory.tokenFromType(TokenType.PERIOD),
           name == null ? null : identifier3(name),
           parameters,
-          initializers == null || initializers.isEmpty
+          initializers.isEmpty
               ? null
               : TokenFactory.tokenFromType(TokenType.PERIOD),
-          initializers ?? <ConstructorInitializer>[],
+          initializers,
           null,
           body);
 
@@ -380,13 +380,13 @@
           TokenFactory.tokenFromType(TokenType.EQ),
           expression);
 
-  static ConstructorName constructorName(TypeName type, String name) =>
+  static ConstructorName constructorName(TypeName type, String? name) =>
       astFactory.constructorName(
           type,
           name == null ? null : TokenFactory.tokenFromType(TokenType.PERIOD),
           name == null ? null : identifier3(name));
 
-  static ContinueStatement continueStatement([String label]) =>
+  static ContinueStatement continueStatement([String? label]) =>
       astFactory.continueStatement(
           TokenFactory.tokenFromKeyword(Keyword.CONTINUE),
           label == null ? null : identifier3(label),
@@ -397,7 +397,7 @@
       declaredIdentifier2(keyword, null, identifier);
 
   static DeclaredIdentifier declaredIdentifier2(
-          Keyword keyword, TypeAnnotation type, String identifier) =>
+          Keyword? keyword, TypeAnnotation? type, String identifier) =>
       astFactory.declaredIdentifier(
           null,
           null,
@@ -449,18 +449,18 @@
 
   static EnumDeclaration enumDeclaration2(
       String name, List<String> constantNames) {
-    int count = constantNames.length;
-    List<EnumConstantDeclaration> constants =
-        List<EnumConstantDeclaration>.filled(count, null);
-    for (int i = 0; i < count; i++) {
-      constants[i] = astFactory.enumConstantDeclaration(
-          null, null, identifier3(constantNames[i]));
-    }
+    var constants = constantNames.map((name) {
+      return astFactory.enumConstantDeclaration(
+        null,
+        null,
+        identifier3(name),
+      );
+    }).toList();
     return enumDeclaration(identifier3(name), constants);
   }
 
   static ExportDirective exportDirective(List<Annotation> metadata, String uri,
-          [List<Combinator> combinators]) =>
+          [List<Combinator> combinators = const []]) =>
       astFactory.exportDirective(
           null,
           metadata,
@@ -471,8 +471,8 @@
           TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
   static ExportDirective exportDirective2(String uri,
-          [List<Combinator> combinators]) =>
-      exportDirective(null, uri, combinators);
+          [List<Combinator> combinators = const []]) =>
+      exportDirective([], uri, combinators);
 
   static ExpressionFunctionBody expressionFunctionBody(Expression expression) =>
       astFactory.expressionFunctionBody(
@@ -489,10 +489,10 @@
       TokenFactory.tokenFromKeyword(Keyword.EXTENDS), type);
 
   static ExtensionDeclaration extensionDeclaration(
-          {@required String name,
-          TypeParameterList typeParameters,
-          @required TypeAnnotation extendedType,
-          List<ClassMember> members}) =>
+          {required String name,
+          TypeParameterList? typeParameters,
+          required TypeAnnotation extendedType,
+          List<ClassMember> members = const []}) =>
       astFactory.extensionDeclaration(
           comment: null,
           metadata: null,
@@ -507,16 +507,16 @@
               TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET));
 
   static ExtensionOverride extensionOverride(
-          {@required Identifier extensionName,
-          TypeArgumentList typeArguments,
-          @required ArgumentList argumentList}) =>
+          {required Identifier extensionName,
+          TypeArgumentList? typeArguments,
+          required ArgumentList argumentList}) =>
       astFactory.extensionOverride(
           extensionName: extensionName,
           typeArguments: typeArguments,
           argumentList: argumentList);
 
-  static FieldDeclaration fieldDeclaration(bool isStatic, Keyword keyword,
-          TypeAnnotation type, List<VariableDeclaration> variables,
+  static FieldDeclaration fieldDeclaration(bool isStatic, Keyword? keyword,
+          TypeAnnotation? type, List<VariableDeclaration> variables,
           {bool isAbstract = false, bool isExternal = false}) =>
       astFactory.fieldDeclaration2(
           abstractKeyword: isAbstract
@@ -530,13 +530,13 @@
           fieldList: variableDeclarationList(keyword, type, variables),
           semicolon: TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
-  static FieldDeclaration fieldDeclaration2(bool isStatic, Keyword keyword,
+  static FieldDeclaration fieldDeclaration2(bool isStatic, Keyword? keyword,
           List<VariableDeclaration> variables) =>
       fieldDeclaration(isStatic, keyword, null, variables);
 
   static FieldFormalParameter fieldFormalParameter(
-          Keyword keyword, TypeAnnotation type, String identifier,
-          [FormalParameterList parameterList]) =>
+          Keyword? keyword, TypeAnnotation? type, String identifier,
+          [FormalParameterList? parameterList]) =>
       astFactory.fieldFormalParameter2(
           keyword:
               keyword == null ? null : TokenFactory.tokenFromKeyword(keyword),
@@ -576,7 +576,7 @@
           body: body);
 
   static FormalParameterList formalParameterList(
-          [List<FormalParameter> parameters]) =>
+          [List<FormalParameter> parameters = const []]) =>
       astFactory.formalParameterList(
           TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
           parameters,
@@ -586,8 +586,8 @@
 
   static ForPartsWithDeclarations forPartsWithDeclarations(
           VariableDeclarationList variables,
-          Expression condition,
-          List<Expression> updaters) =>
+          Expression? condition,
+          List<Expression>? updaters) =>
       astFactory.forPartsWithDeclarations(
           variables: variables,
           leftSeparator: TokenFactory.tokenFromType(TokenType.SEMICOLON),
@@ -596,9 +596,9 @@
           updaters: updaters);
 
   static ForPartsWithExpression forPartsWithExpression(
-          Expression initialization,
-          Expression condition,
-          List<Expression> updaters) =>
+          Expression? initialization,
+          Expression? condition,
+          List<Expression>? updaters) =>
       astFactory.forPartsWithExpression(
           initialization: initialization,
           leftSeparator: TokenFactory.tokenFromType(TokenType.SEMICOLON),
@@ -615,8 +615,8 @@
           body: body);
 
   static FunctionDeclaration functionDeclaration(
-          TypeAnnotation type,
-          Keyword keyword,
+          TypeAnnotation? type,
+          Keyword? keyword,
           String name,
           FunctionExpression functionExpression) =>
       astFactory.functionDeclaration(
@@ -629,8 +629,8 @@
           functionExpression);
 
   static FunctionDeclarationStatement functionDeclarationStatement(
-          TypeAnnotation type,
-          Keyword keyword,
+          TypeAnnotation? type,
+          Keyword? keyword,
           String name,
           FunctionExpression functionExpression) =>
       astFactory.functionDeclarationStatement(
@@ -651,19 +651,19 @@
 
   static FunctionExpressionInvocation functionExpressionInvocation(
           Expression function,
-          [List<Expression> arguments]) =>
+          [List<Expression> arguments = const []]) =>
       functionExpressionInvocation2(function, null, arguments);
 
   static FunctionExpressionInvocation functionExpressionInvocation2(
           Expression function,
-          [TypeArgumentList typeArguments,
-          List<Expression> arguments]) =>
+          [TypeArgumentList? typeArguments,
+          List<Expression> arguments = const []]) =>
       astFactory.functionExpressionInvocation(
           function, typeArguments, argumentList(arguments));
 
   static FunctionTypedFormalParameter functionTypedFormalParameter(
-          TypeAnnotation returnType, String identifier,
-          [List<FormalParameter> parameters]) =>
+          TypeAnnotation? returnType, String identifier,
+          [List<FormalParameter> parameters = const []]) =>
       astFactory.functionTypedFormalParameter2(
           returnType: returnType,
           identifier: identifier3(identifier),
@@ -718,9 +718,6 @@
           identifier3(identifier));
 
   static List<SimpleIdentifier> identifierList(List<String> identifiers) {
-    if (identifiers == null) {
-      return null;
-    }
     return identifiers
         .map((String identifier) => identifier3(identifier))
         .toList();
@@ -728,7 +725,7 @@
 
   static IfElement ifElement(
           Expression condition, CollectionElement thenElement,
-          [CollectionElement elseElement]) =>
+          [CollectionElement? elseElement]) =>
       astFactory.ifElement(
           ifKeyword: TokenFactory.tokenFromKeyword(Keyword.IF),
           leftParenthesis: TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
@@ -745,7 +742,7 @@
       ifStatement2(condition, thenStatement, null);
 
   static IfStatement ifStatement2(Expression condition, Statement thenStatement,
-          Statement elseStatement) =>
+          Statement? elseStatement) =>
       astFactory.ifStatement(
           TokenFactory.tokenFromKeyword(Keyword.IF),
           TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
@@ -761,9 +758,9 @@
       astFactory.implementsClause(
           TokenFactory.tokenFromKeyword(Keyword.IMPLEMENTS), types);
 
-  static ImportDirective importDirective(
-          List<Annotation> metadata, String uri, bool isDeferred, String prefix,
-          [List<Combinator> combinators]) =>
+  static ImportDirective importDirective(List<Annotation> metadata, String uri,
+          bool isDeferred, String? prefix,
+          [List<Combinator> combinators = const []]) =>
       astFactory.importDirective(
           null,
           metadata,
@@ -778,17 +775,17 @@
 
   static ImportDirective importDirective2(
           String uri, bool isDeferred, String prefix,
-          [List<Combinator> combinators]) =>
-      importDirective(null, uri, isDeferred, prefix, combinators);
+          [List<Combinator> combinators = const []]) =>
+      importDirective([], uri, isDeferred, prefix, combinators);
 
-  static ImportDirective importDirective3(String uri, String prefix,
-          [List<Combinator> combinators]) =>
-      importDirective(null, uri, false, prefix, combinators);
+  static ImportDirective importDirective3(String uri, String? prefix,
+          [List<Combinator> combinators = const []]) =>
+      importDirective([], uri, false, prefix, combinators);
 
   static IndexExpression indexExpression({
-    @required Expression target,
+    required Expression target,
     bool hasQuestion = false,
-    @required Expression index,
+    required Expression index,
   }) {
     return astFactory.indexExpressionForTarget2(
       target: target,
@@ -817,21 +814,21 @@
               TokenFactory.tokenFromType(TokenType.CLOSE_SQUARE_BRACKET));
 
   static InstanceCreationExpression instanceCreationExpression(
-          Keyword keyword, ConstructorName name,
-          [List<Expression> arguments]) =>
+          Keyword? keyword, ConstructorName name,
+          [List<Expression> arguments = const []]) =>
       astFactory.instanceCreationExpression(
           keyword == null ? null : TokenFactory.tokenFromKeyword(keyword),
           name,
           argumentList(arguments));
 
   static InstanceCreationExpression instanceCreationExpression2(
-          Keyword keyword, TypeName type,
-          [List<Expression> arguments]) =>
+          Keyword? keyword, TypeName type,
+          [List<Expression> arguments = const []]) =>
       instanceCreationExpression3(keyword, type, null, arguments);
 
   static InstanceCreationExpression instanceCreationExpression3(
-          Keyword keyword, TypeName type, String identifier,
-          [List<Expression> arguments]) =>
+          Keyword? keyword, TypeName type, String? identifier,
+          [List<Expression> arguments = const []]) =>
       instanceCreationExpression(
           keyword,
           astFactory.constructorName(
@@ -905,12 +902,12 @@
     return elements;
   }
 
-  static ListLiteral listLiteral([List<Expression> elements]) =>
+  static ListLiteral listLiteral([List<Expression> elements = const []]) =>
       listLiteral2(null, null, elements);
 
   static ListLiteral listLiteral2(
-          Keyword keyword, TypeArgumentList typeArguments,
-          [List<CollectionElement> elements]) =>
+          Keyword? keyword, TypeArgumentList? typeArguments,
+          [List<CollectionElement> elements = const []]) =>
       astFactory.listLiteral(
           keyword == null ? null : TokenFactory.tokenFromKeyword(keyword),
           typeArguments,
@@ -931,12 +928,12 @@
           TokenFactory.tokenFromType(TokenType.COLON), string2(value));
 
   static MethodDeclaration methodDeclaration(
-          Keyword modifier,
-          TypeAnnotation returnType,
-          Keyword property,
-          Keyword operator,
+          Keyword? modifier,
+          TypeAnnotation? returnType,
+          Keyword? property,
+          Keyword? operator,
           SimpleIdentifier name,
-          FormalParameterList parameters) =>
+          FormalParameterList? parameters) =>
       astFactory.methodDeclaration(
           null,
           null,
@@ -951,12 +948,12 @@
           emptyFunctionBody());
 
   static MethodDeclaration methodDeclaration2(
-          Keyword modifier,
-          TypeAnnotation returnType,
-          Keyword property,
-          Keyword operator,
+          Keyword? modifier,
+          TypeAnnotation? returnType,
+          Keyword? property,
+          Keyword? operator,
           SimpleIdentifier name,
-          FormalParameterList parameters,
+          FormalParameterList? parameters,
           FunctionBody body) =>
       astFactory.methodDeclaration(
           null,
@@ -972,13 +969,13 @@
           body);
 
   static MethodDeclaration methodDeclaration3(
-          Keyword modifier,
-          TypeAnnotation returnType,
-          Keyword property,
-          Keyword operator,
+          Keyword? modifier,
+          TypeAnnotation? returnType,
+          Keyword? property,
+          Keyword? operator,
           SimpleIdentifier name,
-          TypeParameterList typeParameters,
-          FormalParameterList parameters,
+          TypeParameterList? typeParameters,
+          FormalParameterList? parameters,
           FunctionBody body) =>
       astFactory.methodDeclaration(
           null,
@@ -995,13 +992,13 @@
 
   static MethodDeclaration methodDeclaration4(
           {bool external = false,
-          Keyword modifier,
-          TypeAnnotation returnType,
-          Keyword property,
+          Keyword? modifier,
+          TypeAnnotation? returnType,
+          Keyword? property,
           bool operator = false,
-          String name,
-          FormalParameterList parameters,
-          FunctionBody body}) =>
+          required String name,
+          FormalParameterList? parameters,
+          required FunctionBody body}) =>
       astFactory.methodDeclaration(
           null,
           null,
@@ -1015,8 +1012,9 @@
           parameters,
           body);
 
-  static MethodInvocation methodInvocation(Expression target, String methodName,
-          [List<Expression> arguments,
+  static MethodInvocation methodInvocation(
+          Expression? target, String methodName,
+          [List<Expression> arguments = const [],
           TokenType operator = TokenType.PERIOD]) =>
       astFactory.methodInvocation(
           target,
@@ -1026,12 +1024,12 @@
           argumentList(arguments));
 
   static MethodInvocation methodInvocation2(String methodName,
-          [List<Expression> arguments]) =>
+          [List<Expression> arguments = const []]) =>
       methodInvocation(null, methodName, arguments);
 
-  static MethodInvocation methodInvocation3(
-          Expression target, String methodName, TypeArgumentList typeArguments,
-          [List<Expression> arguments,
+  static MethodInvocation methodInvocation3(Expression? target,
+          String methodName, TypeArgumentList? typeArguments,
+          [List<Expression> arguments = const [],
           TokenType operator = TokenType.PERIOD]) =>
       astFactory.methodInvocation(
           target,
@@ -1048,7 +1046,7 @@
       namedExpression(label2(label), expression);
 
   static DefaultFormalParameter namedFormalParameter(
-          NormalFormalParameter parameter, Expression expression) =>
+          NormalFormalParameter parameter, Expression? expression) =>
       astFactory.defaultFormalParameter(
           parameter,
           ParameterKind.NAMED,
@@ -1103,7 +1101,7 @@
           TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
   static DefaultFormalParameter positionalFormalParameter(
-          NormalFormalParameter parameter, Expression expression) =>
+          NormalFormalParameter parameter, Expression? expression) =>
       astFactory.defaultFormalParameter(
           parameter,
           ParameterKind.POSITIONAL,
@@ -1121,22 +1119,22 @@
           TokenFactory.tokenFromType(operator), expression);
 
   static PropertyAccess propertyAccess(
-          Expression target, SimpleIdentifier propertyName) =>
+          Expression? target, SimpleIdentifier propertyName) =>
       astFactory.propertyAccess(
           target, TokenFactory.tokenFromType(TokenType.PERIOD), propertyName);
 
-  static PropertyAccess propertyAccess2(Expression target, String propertyName,
+  static PropertyAccess propertyAccess2(Expression? target, String propertyName,
           [TokenType operator = TokenType.PERIOD]) =>
       astFactory.propertyAccess(target, TokenFactory.tokenFromType(operator),
           identifier3(propertyName));
 
   static RedirectingConstructorInvocation redirectingConstructorInvocation(
-          [List<Expression> arguments]) =>
+          [List<Expression> arguments = const []]) =>
       redirectingConstructorInvocation2(null, arguments);
 
   static RedirectingConstructorInvocation redirectingConstructorInvocation2(
-          String constructorName,
-          [List<Expression> arguments]) =>
+          String? constructorName,
+          [List<Expression> arguments = const []]) =>
       astFactory.redirectingConstructorInvocation(
           TokenFactory.tokenFromKeyword(Keyword.THIS),
           constructorName == null
@@ -1150,7 +1148,7 @@
 
   static ReturnStatement returnStatement() => returnStatement2(null);
 
-  static ReturnStatement returnStatement2(Expression expression) =>
+  static ReturnStatement returnStatement2(Expression? expression) =>
       astFactory.returnStatement(TokenFactory.tokenFromKeyword(Keyword.RETURN),
           expression, TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
@@ -1158,13 +1156,16 @@
       astFactory.scriptTag(TokenFactory.tokenFromString(scriptTag));
 
   static SetOrMapLiteral setOrMapLiteral(
-          Keyword keyword, TypeArgumentList typeArguments,
-          [List<CollectionElement> elements]) =>
+          Keyword? keyword, TypeArgumentList? typeArguments,
+          [List<CollectionElement> elements = const []]) =>
       astFactory.setOrMapLiteral(
-          constKeyword:
-              keyword == null ? null : TokenFactory.tokenFromKeyword(keyword),
-          typeArguments: typeArguments,
-          elements: elements);
+        constKeyword:
+            keyword == null ? null : TokenFactory.tokenFromKeyword(keyword),
+        typeArguments: typeArguments,
+        leftBracket: TokenFactory.tokenFromType(TokenType.OPEN_CURLY_BRACKET),
+        elements: elements,
+        rightBracket: TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET),
+      );
 
   static ShowCombinator showCombinator(List<SimpleIdentifier> identifiers) =>
       astFactory.showCombinator(
@@ -1179,7 +1180,7 @@
       simpleFormalParameter2(keyword, null, parameterName);
 
   static SimpleFormalParameter simpleFormalParameter2(
-          Keyword keyword, TypeAnnotation type, String parameterName) =>
+          Keyword? keyword, TypeAnnotation? type, String? parameterName) =>
       astFactory.simpleFormalParameter2(
           keyword:
               keyword == null ? null : TokenFactory.tokenFromKeyword(keyword),
@@ -1191,7 +1192,7 @@
       simpleFormalParameter2(null, null, parameterName);
 
   static SimpleFormalParameter simpleFormalParameter4(
-          TypeAnnotation type, String parameterName) =>
+          TypeAnnotation type, String? parameterName) =>
       simpleFormalParameter2(null, type, parameterName);
 
   static SpreadElement spreadElement(
@@ -1200,18 +1201,19 @@
           spreadOperator: TokenFactory.tokenFromType(operator),
           expression: expression);
 
-  static StringInterpolation string([List<InterpolationElement> elements]) =>
+  static StringInterpolation string(
+          [List<InterpolationElement> elements = const []]) =>
       astFactory.stringInterpolation(elements);
 
   static SimpleStringLiteral string2(String content) => astFactory
       .simpleStringLiteral(TokenFactory.tokenFromString("'$content'"), content);
 
   static SuperConstructorInvocation superConstructorInvocation(
-          [List<Expression> arguments]) =>
+          [List<Expression> arguments = const []]) =>
       superConstructorInvocation2(null, arguments);
 
-  static SuperConstructorInvocation superConstructorInvocation2(String name,
-          [List<Expression> arguments]) =>
+  static SuperConstructorInvocation superConstructorInvocation2(String? name,
+          [List<Expression> arguments = const []]) =>
       astFactory.superConstructorInvocation(
           TokenFactory.tokenFromKeyword(Keyword.SUPER),
           name == null ? null : TokenFactory.tokenFromType(TokenType.PERIOD),
@@ -1263,14 +1265,14 @@
   }
 
   static BlockFunctionBody syncBlockFunctionBody(
-          [List<Statement> statements]) =>
+          [List<Statement> statements = const []]) =>
       astFactory.blockFunctionBody(
           TokenFactory.tokenFromTypeAndString(TokenType.IDENTIFIER, "sync"),
           null,
           block(statements));
 
   static BlockFunctionBody syncGeneratorBlockFunctionBody(
-          [List<Statement> statements]) =>
+          [List<Statement> statements = const []]) =>
       astFactory.blockFunctionBody(
           TokenFactory.tokenFromTypeAndString(TokenType.IDENTIFIER, "sync"),
           TokenFactory.tokenFromType(TokenType.STAR),
@@ -1279,15 +1281,13 @@
   static ThisExpression thisExpression() =>
       astFactory.thisExpression(TokenFactory.tokenFromKeyword(Keyword.THIS));
 
-  static ThrowExpression throwExpression() => throwExpression2(null);
-
   static ThrowExpression throwExpression2(Expression expression) =>
       astFactory.throwExpression(
           TokenFactory.tokenFromKeyword(Keyword.THROW), expression);
 
   static TopLevelVariableDeclaration topLevelVariableDeclaration(
-          Keyword keyword,
-          TypeAnnotation type,
+          Keyword? keyword,
+          TypeAnnotation? type,
           List<VariableDeclaration> variables) =>
       astFactory.topLevelVariableDeclaration(
           null,
@@ -1296,7 +1296,7 @@
           TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
   static TopLevelVariableDeclaration topLevelVariableDeclaration2(
-          Keyword keyword, List<VariableDeclaration> variables,
+          Keyword? keyword, List<VariableDeclaration> variables,
           {bool isExternal = false}) =>
       astFactory.topLevelVariableDeclaration(
           null,
@@ -1315,7 +1315,7 @@
       tryStatement3(body, catchClauses, null);
 
   static TryStatement tryStatement3(
-          Block body, List<CatchClause> catchClauses, Block finallyClause) =>
+          Block body, List<CatchClause> catchClauses, Block? finallyClause) =>
       astFactory.tryStatement(
           TokenFactory.tokenFromKeyword(Keyword.TRY),
           body,
@@ -1326,7 +1326,7 @@
           finallyClause);
 
   static FunctionTypeAlias typeAlias(TypeAnnotation returnType, String name,
-          TypeParameterList typeParameters, FormalParameterList parameters) =>
+          TypeParameterList? typeParameters, FormalParameterList parameters) =>
       astFactory.functionTypeAlias(
           null,
           null,
@@ -1337,10 +1337,14 @@
           parameters,
           TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
-  static TypeArgumentList typeArgumentList(List<TypeAnnotation> types) {
+  static TypeArgumentList? typeArgumentList(List<TypeAnnotation>? types) {
     if (types == null || types.isEmpty) {
       return null;
     }
+    return typeArgumentList2(types);
+  }
+
+  static TypeArgumentList typeArgumentList2(List<TypeAnnotation> types) {
     return astFactory.typeArgumentList(TokenFactory.tokenFromType(TokenType.LT),
         types, TokenFactory.tokenFromType(TokenType.GT));
   }
@@ -1351,7 +1355,7 @@
   /// <b>Note:</b> This method does not correctly handle class elements that
   /// have type parameters.
   static TypeName typeName(ClassElement element,
-      [List<TypeAnnotation> arguments]) {
+      [List<TypeAnnotation>? arguments]) {
     SimpleIdentifier name = identifier3(element.name);
     name.staticElement = element;
     TypeName typeName = typeName3(name, arguments);
@@ -1366,11 +1370,11 @@
   }
 
   static TypeName typeName3(Identifier name,
-          [List<TypeAnnotation> arguments]) =>
+          [List<TypeAnnotation>? arguments]) =>
       astFactory.typeName(name, typeArgumentList(arguments));
 
   static TypeName typeName4(String name,
-          [List<TypeAnnotation> arguments, bool question = false]) =>
+          [List<TypeAnnotation>? arguments, bool question = false]) =>
       astFactory.typeName(identifier3(name), typeArgumentList(arguments),
           question:
               question ? TokenFactory.tokenFromType(TokenType.QUESTION) : null);
@@ -1393,14 +1397,19 @@
           bound: null,
           varianceKeyword: TokenFactory.tokenFromString(varianceLexeme));
 
-  static TypeParameterList typeParameterList([List<String> typeNames]) {
-    List<TypeParameter> typeParameters;
-    if (typeNames != null && typeNames.isNotEmpty) {
-      typeParameters = <TypeParameter>[];
-      for (String typeName in typeNames) {
-        typeParameters.add(typeParameter(typeName));
-      }
+  static TypeParameterList? typeParameterList([List<String>? typeNames]) {
+    if (typeNames == null || typeNames.isEmpty) {
+      return null;
     }
+    return typeParameterList2(typeNames);
+  }
+
+  static TypeParameterList typeParameterList2(List<String> typeNames) {
+    var typeParameters = <TypeParameter>[];
+    for (String typeName in typeNames) {
+      typeParameters.add(typeParameter(typeName));
+    }
+
     return astFactory.typeParameterList(
         TokenFactory.tokenFromType(TokenType.LT),
         typeParameters,
@@ -1415,8 +1424,8 @@
       astFactory.variableDeclaration(identifier3(name),
           TokenFactory.tokenFromType(TokenType.EQ), initializer);
 
-  static VariableDeclarationList variableDeclarationList(Keyword keyword,
-          TypeAnnotation type, List<VariableDeclaration> variables) =>
+  static VariableDeclarationList variableDeclarationList(Keyword? keyword,
+          TypeAnnotation? type, List<VariableDeclaration> variables) =>
       astFactory.variableDeclarationList(
           null,
           null,
@@ -1425,12 +1434,12 @@
           variables);
 
   static VariableDeclarationList variableDeclarationList2(
-          Keyword keyword, List<VariableDeclaration> variables) =>
+          Keyword? keyword, List<VariableDeclaration> variables) =>
       variableDeclarationList(keyword, null, variables);
 
   static VariableDeclarationStatement variableDeclarationStatement(
-          Keyword keyword,
-          TypeAnnotation type,
+          Keyword? keyword,
+          TypeAnnotation? type,
           List<VariableDeclaration> variables) =>
       astFactory.variableDeclarationStatement(
           variableDeclarationList(keyword, type, variables),
diff --git a/pkg/analyzer/lib/src/generated/testing/element_factory.dart b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
index 88250f8..30a9ab0 100644
--- a/pkg/analyzer/lib/src/generated/testing/element_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
@@ -22,7 +22,7 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/testing/ast_test_factory.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
-import 'package:meta/meta.dart';
+import 'package:collection/collection.dart';
 import 'package:path/path.dart';
 
 /// The class `ElementFactory` defines utility methods used to create elements
@@ -31,8 +31,8 @@
 /// provided information, has been created.
 class ElementFactory {
   /// The element representing the class 'Object'.
-  static ClassElementImpl _objectElement;
-  static InterfaceType _objectType;
+  static ClassElementImpl? _objectElement;
+  static InterfaceType? _objectType;
 
   static ClassElementImpl get object {
     return _objectElement ??= classElement("Object", null);
@@ -46,8 +46,8 @@
   }
 
   static ClassElementImpl classElement(
-      String typeName, InterfaceType superclassType,
-      [List<String> parameterNames]) {
+      String typeName, InterfaceType? superclassType,
+      [List<String>? parameterNames]) {
     ClassElementImpl element = ClassElementImpl(typeName, 0);
     element.constructors = const <ConstructorElement>[];
     element.supertype = superclassType;
@@ -58,14 +58,14 @@
   }
 
   static ClassElementImpl classElement2(String typeName,
-          [List<String> parameterNames]) =>
+          [List<String>? parameterNames]) =>
       classElement(typeName, objectType, parameterNames);
 
   static ClassElementImpl classElement3({
-    @required String name,
-    List<TypeParameterElement> typeParameters,
+    required String name,
+    List<TypeParameterElement>? typeParameters,
     List<String> typeParameterNames = const [],
-    InterfaceType supertype,
+    InterfaceType? supertype,
     List<InterfaceType> mixins = const [],
     List<InterfaceType> interfaces = const [],
   }) {
@@ -83,7 +83,7 @@
 
   static ClassElementImpl classTypeAlias(
       String typeName, InterfaceType superclassType,
-      [List<String> parameterNames]) {
+      [List<String>? parameterNames]) {
     ClassElementImpl element =
         classElement(typeName, superclassType, parameterNames);
     element.isMixinApplication = true;
@@ -91,11 +91,11 @@
   }
 
   static ClassElementImpl classTypeAlias2(String typeName,
-          [List<String> parameterNames]) =>
+          [List<String>? parameterNames]) =>
       classTypeAlias(typeName, objectType, parameterNames);
 
   static CompilationUnitElementImpl compilationUnit(String fileName,
-      [Source librarySource]) {
+      [Source? librarySource]) {
     Source source =
         NonExistingSource(fileName, toUri(fileName), UriKind.FILE_URI);
     CompilationUnitElementImpl unit = CompilationUnitElementImpl();
@@ -109,8 +109,8 @@
       ConstLocalVariableElementImpl(name, 0);
 
   static ConstructorElementImpl constructorElement(
-      ClassElement definingClass, String name, bool isConst,
-      [List<DartType> argumentTypes]) {
+      ClassElement definingClass, String? name, bool isConst,
+      [List<DartType> argumentTypes = const []]) {
     ConstructorElementImpl constructor = name == null
         ? ConstructorElementImpl("", -1)
         : ConstructorElementImpl(name, 0);
@@ -124,20 +124,7 @@
     }
     constructor.isSynthetic = name == null;
     constructor.isConst = isConst;
-    if (argumentTypes != null) {
-      int count = argumentTypes.length;
-      List<ParameterElement> parameters =
-          List<ParameterElement>.filled(count, null);
-      for (int i = 0; i < count; i++) {
-        ParameterElementImpl parameter = ParameterElementImpl("a$i", i);
-        parameter.type = argumentTypes[i];
-        parameter.parameterKind = ParameterKind.REQUIRED;
-        parameters[i] = parameter;
-      }
-      constructor.parameters = parameters;
-    } else {
-      constructor.parameters = <ParameterElement>[];
-    }
+    constructor.parameters = _requiredParameters(argumentTypes);
     constructor.enclosingElement = definingClass;
     if (!constructor.isSynthetic) {
       constructor.constantInitializers = <ConstructorInitializer>[];
@@ -146,13 +133,13 @@
   }
 
   static ConstructorElementImpl constructorElement2(
-          ClassElement definingClass, String name,
-          [List<DartType> argumentTypes]) =>
+          ClassElement definingClass, String? name,
+          [List<DartType> argumentTypes = const []]) =>
       constructorElement(definingClass, name, false, argumentTypes);
 
   @deprecated
   static EnumElementImpl enumElement(TypeProvider typeProvider, String enumName,
-      [List<String> constantNames]) {
+      [List<String> constantNames = const []]) {
     var typeSystem = TypeSystemImpl(
       implicitCasts: false,
       isNonNullableByDefault: false,
@@ -191,7 +178,7 @@
     //
     // Build the enum constants.
     //
-    if (constantNames != null) {
+    {
       int constantCount = constantNames.length;
       for (int i = 0; i < constantCount; i++) {
         String constantName = constantNames[i];
@@ -228,13 +215,9 @@
     return spec;
   }
 
-  static ExtensionElementImpl extensionElement(
-          [String name, DartType extendedType]) =>
-      ExtensionElementImpl(name, -1)..extendedType = extendedType;
-
   static FieldElementImpl fieldElement(
       String name, bool isStatic, bool isFinal, bool isConst, DartType type,
-      {Expression initializer}) {
+      {Expression? initializer}) {
     FieldElementImpl field =
         isConst ? ConstFieldElementImpl(name, 0) : FieldElementImpl(name, 0);
     field.isConst = isConst;
@@ -280,7 +263,7 @@
   }
 
   static ImportElementImpl importFor(
-      LibraryElement importedLibrary, PrefixElement prefix,
+      LibraryElement importedLibrary, PrefixElement? prefix,
       [List<NamespaceCombinator> combinators = const <NamespaceCombinator>[]]) {
     ImportElementImpl spec = ImportElementImpl(0);
     spec.importedLibrary = importedLibrary;
@@ -295,7 +278,7 @@
     CompilationUnitElementImpl unit = compilationUnit(fileName);
     LibraryElementImpl library = LibraryElementImpl(
       context,
-      AnalysisSessionImpl(null),
+      _MockAnalysisSession(),
       libraryName,
       0,
       libraryName.length,
@@ -315,22 +298,9 @@
       LocalVariableElementImpl(name, 0);
 
   static MethodElementImpl methodElement(String methodName, DartType returnType,
-      [List<DartType> argumentTypes]) {
+      [List<DartType> argumentTypes = const []]) {
     MethodElementImpl method = MethodElementImpl(methodName, 0);
-    if (argumentTypes == null) {
-      method.parameters = const <ParameterElement>[];
-    } else {
-      int count = argumentTypes.length;
-      List<ParameterElement> parameters =
-          List<ParameterElement>.filled(count, null);
-      for (int i = 0; i < count; i++) {
-        ParameterElementImpl parameter = ParameterElementImpl("a$i", i);
-        parameter.type = argumentTypes[i];
-        parameter.parameterKind = ParameterKind.REQUIRED;
-        parameters[i] = parameter;
-      }
-      method.parameters = parameters;
-    }
+    method.parameters = _requiredParameters(argumentTypes);
     method.returnType = returnType;
     return method;
   }
@@ -348,8 +318,8 @@
   }
 
   static MixinElementImpl mixinElement({
-    @required String name,
-    List<TypeParameterElement> typeParameters,
+    required String name,
+    List<TypeParameterElement>? typeParameters,
     List<String> typeParameterNames = const [],
     List<InterfaceType> constraints = const [],
     List<InterfaceType> interfaces = const [],
@@ -381,17 +351,6 @@
     return parameter;
   }
 
-  static ParameterElementImpl namedParameter3(String name,
-      {DartType type, Expression initializer, String initializerCode}) {
-    DefaultParameterElementImpl parameter =
-        DefaultParameterElementImpl(name, 0);
-    parameter.parameterKind = ParameterKind.NAMED;
-    parameter.type = type;
-    parameter.constantInitializer = initializer;
-    parameter.defaultValueCode = initializerCode;
-    return parameter;
-  }
-
   static ParameterElementImpl positionalParameter(String name) {
     ParameterElementImpl parameter = ParameterElementImpl(name, 0);
     parameter.parameterKind = ParameterKind.POSITIONAL;
@@ -447,7 +406,7 @@
       TopLevelVariableElementImpl(name.name, name.offset);
 
   static TopLevelVariableElementImpl topLevelVariableElement2(String name) =>
-      topLevelVariableElement3(name, false, false, null);
+      topLevelVariableElement3(name, false, false, DynamicTypeImpl.instance);
 
   static TopLevelVariableElementImpl topLevelVariableElement3(
       String name, bool isConst, bool isFinal, DartType type) {
@@ -460,7 +419,7 @@
           AstTestFactory.instanceCreationExpression2(
               Keyword.CONST, AstTestFactory.typeName(typeElement));
       if (type is InterfaceType) {
-        ConstructorElement element = typeElement.unnamedConstructor;
+        var element = typeElement.unnamedConstructor;
         initializer.constructorName.staticElement = element;
       }
       constant.constantInitializer = initializer;
@@ -484,23 +443,30 @@
   }
 
   static List<TypeParameterElement> typeParameters(List<String> names) {
-    int count = names.length;
-    if (count == 0) {
-      return const <TypeParameterElement>[];
-    }
-    List<TypeParameterElementImpl> typeParameters =
-        List<TypeParameterElementImpl>.filled(count, null);
-    for (int i = 0; i < count; i++) {
-      typeParameters[i] = typeParameterWithType(names[i]);
-    }
-    return typeParameters;
+    return names.map((name) => typeParameterWithType(name)).toList();
   }
 
   static TypeParameterElementImpl typeParameterWithType(String name,
-      [DartType bound, Variance variance]) {
+      [DartType? bound, Variance? variance]) {
     TypeParameterElementImpl typeParameter = typeParameterElement(name);
     typeParameter.bound = bound;
     typeParameter.variance = variance;
     return typeParameter;
   }
+
+  static List<ParameterElementImpl> _requiredParameters(
+      List<DartType> argumentTypes) {
+    var parameters = argumentTypes.mapIndexed((index, type) {
+      var parameter = ParameterElementImpl("a$index", index);
+      parameter.type = type;
+      parameter.parameterKind = ParameterKind.REQUIRED;
+      return parameter;
+    }).toList();
+    return parameters;
+  }
+}
+
+class _MockAnalysisSession implements AnalysisSessionImpl {
+  @override
+  dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 }
diff --git a/pkg/analyzer/lib/src/generated/type_promotion_manager.dart b/pkg/analyzer/lib/src/generated/type_promotion_manager.dart
index 3ac9ea4..bf956ef 100644
--- a/pkg/analyzer/lib/src/generated/type_promotion_manager.dart
+++ b/pkg/analyzer/lib/src/generated/type_promotion_manager.dart
@@ -7,7 +7,6 @@
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/generated/variable_type_provider.dart';
 
@@ -17,13 +16,13 @@
 class TypePromotionManager {
   final TypeSystemImpl _typeSystem;
 
-  /// The current promotion scope, or `null` if no scope has been entered.
-  _TypePromoteScope _currentScope;
+  /// The current promotion scope.
+  _TypePromoteScope _currentScope = _TypePromoteScope(null);
 
-  final List<FunctionBody> _functionBodyStack = [];
+  final List<FunctionBody?> _functionBodyStack = [];
 
   /// Body of the function currently being analyzed, if any.
-  FunctionBody _currentFunctionBody;
+  FunctionBody? _currentFunctionBody;
 
   TypePromotionManager(this._typeSystem);
 
@@ -51,75 +50,66 @@
 
   void visitBinaryExpression_and_rhs(
       Expression leftOperand, Expression rightOperand, void Function() f) {
-    if (rightOperand != null) {
-      _enterScope();
-      try {
-        // Type promotion.
-        _promoteTypes(leftOperand);
-        _clearTypePromotionsIfPotentiallyMutatedIn(leftOperand);
-        _clearTypePromotionsIfPotentiallyMutatedIn(rightOperand);
-        _clearTypePromotionsIfAccessedInClosureAndPotentiallyMutated(
-            rightOperand);
-        // Visit right operand.
-        f();
-      } finally {
-        _exitScope();
-      }
+    _enterScope();
+    try {
+      // Type promotion.
+      _promoteTypes(leftOperand);
+      _clearTypePromotionsIfPotentiallyMutatedIn(leftOperand);
+      _clearTypePromotionsIfPotentiallyMutatedIn(rightOperand);
+      _clearTypePromotionsIfAccessedInClosureAndPotentiallyMutated(
+          rightOperand);
+      // Visit right operand.
+      f();
+    } finally {
+      _exitScope();
     }
   }
 
   void visitConditionalExpression_then(
       Expression condition, Expression thenExpression, void Function() f) {
-    if (thenExpression != null) {
-      _enterScope();
-      try {
-        // Type promotion.
-        _promoteTypes(condition);
-        _clearTypePromotionsIfPotentiallyMutatedIn(thenExpression);
-        _clearTypePromotionsIfAccessedInClosureAndPotentiallyMutated(
-          thenExpression,
-        );
-        // Visit "then" expression.
-        f();
-      } finally {
-        _exitScope();
-      }
+    _enterScope();
+    try {
+      // Type promotion.
+      _promoteTypes(condition);
+      _clearTypePromotionsIfPotentiallyMutatedIn(thenExpression);
+      _clearTypePromotionsIfAccessedInClosureAndPotentiallyMutated(
+        thenExpression,
+      );
+      // Visit "then" expression.
+      f();
+    } finally {
+      _exitScope();
     }
   }
 
   void visitIfElement_thenElement(
       Expression condition, CollectionElement thenElement, void Function() f) {
-    if (thenElement != null) {
-      _enterScope();
-      try {
-        // Type promotion.
-        _promoteTypes(condition);
-        _clearTypePromotionsIfPotentiallyMutatedIn(thenElement);
-        _clearTypePromotionsIfAccessedInClosureAndPotentiallyMutated(
-            thenElement);
-        // Visit "then".
-        f();
-      } finally {
-        _exitScope();
-      }
+    _enterScope();
+    try {
+      // Type promotion.
+      _promoteTypes(condition);
+      _clearTypePromotionsIfPotentiallyMutatedIn(thenElement);
+      _clearTypePromotionsIfAccessedInClosureAndPotentiallyMutated(thenElement);
+      // Visit "then".
+      f();
+    } finally {
+      _exitScope();
     }
   }
 
   void visitIfStatement_thenStatement(
       Expression condition, Statement thenStatement, void Function() f) {
-    if (thenStatement != null) {
-      _enterScope();
-      try {
-        // Type promotion.
-        _promoteTypes(condition);
-        _clearTypePromotionsIfPotentiallyMutatedIn(thenStatement);
-        _clearTypePromotionsIfAccessedInClosureAndPotentiallyMutated(
-            thenStatement);
-        // Visit "then".
-        f();
-      } finally {
-        _exitScope();
-      }
+    _enterScope();
+    try {
+      // Type promotion.
+      _promoteTypes(condition);
+      _clearTypePromotionsIfPotentiallyMutatedIn(thenStatement);
+      _clearTypePromotionsIfAccessedInClosureAndPotentiallyMutated(
+          thenStatement);
+      // Visit "then".
+      f();
+    } finally {
+      _exitScope();
     }
   }
 
@@ -132,7 +122,7 @@
   void _clearTypePromotionsIfAccessedInClosureAndPotentiallyMutated(
       AstNode target) {
     for (Element element in _promotedElements) {
-      if (_currentFunctionBody
+      if (_currentFunctionBody!
           .isPotentiallyMutatedInScope(element as VariableElement)) {
         if (_isVariableAccessedInClosure(element, target)) {
           _setType(element, null);
@@ -161,25 +151,26 @@
 
   /// Exit the current promotion scope.
   void _exitScope() {
-    if (_currentScope == null) {
+    var outerScope = _currentScope._outerScope;
+    if (outerScope == null) {
       throw StateError("No scope to exit");
     }
-    _currentScope = _currentScope._outerScope;
+    _currentScope = outerScope;
   }
 
   /// Return the promoted type of the given [element], or `null` if the type of
   /// the element has not been promoted.
-  DartType _getPromotedType(Element element) {
-    return _currentScope?.getType(element);
+  DartType? _getPromotedType(Element element) {
+    return _currentScope.getType(element);
   }
 
   /// Return the static element associated with the given expression whose type
   /// can be promoted, or `null` if there is no element whose type can be
   /// promoted.
-  VariableElement _getPromotionStaticElement(Expression expression) {
-    expression = expression?.unParenthesized;
+  VariableElement? _getPromotionStaticElement(Expression expression) {
+    expression = expression.unParenthesized;
     if (expression is SimpleIdentifier) {
-      Element element = expression.staticElement;
+      var element = expression.staticElement;
       if (element is VariableElement) {
         ElementKind kind = element.kind;
         if (kind == ElementKind.LOCAL_VARIABLE ||
@@ -237,21 +228,17 @@
   ///        types might be promoted
   /// @param potentialType the potential type of the elements
   void _promote(Expression expression, DartType potentialType) {
-    VariableElement element = _getPromotionStaticElement(expression);
+    var element = _getPromotionStaticElement(expression);
     if (element != null) {
       // may be mutated somewhere in closure
-      if (_currentFunctionBody.isPotentiallyMutatedInClosure(element)) {
+      if (_currentFunctionBody!.isPotentiallyMutatedInClosure(element)) {
         return;
       }
       // prepare current variable type
-      DartType type = _getPromotedType(element) ??
-          expression.staticType ??
-          DynamicTypeImpl.instance;
-
-      potentialType ??= DynamicTypeImpl.instance;
+      DartType type = _getPromotedType(element) ?? expression.staticType!;
 
       // Check if we can promote to potentialType from type.
-      DartType promoteType = _typeSystem.tryPromoteToType(potentialType, type);
+      var promoteType = _typeSystem.tryPromoteToType(potentialType, type);
       if (promoteType != null) {
         // Do promote type of variable.
         _setType(element, promoteType);
@@ -271,7 +258,7 @@
       }
     } else if (condition is IsExpression) {
       if (condition.notOperator == null) {
-        _promote(condition.expression, condition.type.type);
+        _promote(condition.expression, condition.type.type!);
       }
     } else if (condition is ParenthesizedExpression) {
       _promoteTypes(condition.expression);
@@ -282,8 +269,8 @@
   ///
   /// @param element the element whose type might have been promoted
   /// @param type the promoted type of the given element
-  void _setType(Element element, DartType type) {
-    if (_currentScope == null) {
+  void _setType(Element element, DartType? type) {
+    if (_currentScope._outerScope == null) {
       throw StateError("Cannot promote without a scope");
     }
     _currentScope.setType(element, type);
@@ -358,11 +345,11 @@
 /// Instances of the class `TypePromoteScope` represent a scope in which the
 /// types of elements can be promoted.
 class _TypePromoteScope {
-  /// The outer scope in which types might be promoter.
-  final _TypePromoteScope _outerScope;
+  /// The outer scope in which types might be promoted.
+  final _TypePromoteScope? _outerScope;
 
   /// A table mapping elements to the promoted type of that element.
-  final Map<Element, DartType> _promotedTypes = {};
+  final Map<Element, DartType?> _promotedTypes = {};
 
   /// Initialize a newly created scope to be an empty child of the given scope.
   ///
@@ -377,15 +364,15 @@
   ///
   /// @param element the element whose type might have been promoted
   /// @return the promoted type of the given element
-  DartType getType(Element element) {
-    DartType type = _promotedTypes[element];
+  DartType? getType(Element element) {
+    var type = _promotedTypes[element];
     if (type == null && element is PropertyAccessorElement) {
       type = _promotedTypes[element.variable];
     }
     if (type != null) {
       return type;
     } else if (_outerScope != null) {
-      return _outerScope.getType(element);
+      return _outerScope!.getType(element);
     }
     return null;
   }
@@ -394,7 +381,7 @@
   ///
   /// @param element the element whose type might have been promoted
   /// @param type the promoted type of the given element
-  void setType(Element element, DartType type) {
+  void setType(Element element, DartType? type) {
     _promotedTypes[element] = type;
   }
 }
diff --git a/pkg/analyzer/lib/src/generated/utilities_dart.dart b/pkg/analyzer/lib/src/generated/utilities_dart.dart
index 118a2ad..43f1e7c 100644
--- a/pkg/analyzer/lib/src/generated/utilities_dart.dart
+++ b/pkg/analyzer/lib/src/generated/utilities_dart.dart
@@ -2,10 +2,9 @@
 // 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.
 
-import 'package:analyzer/dart/ast/ast.dart' show AnnotatedNode, Comment;
+import 'package:analyzer/dart/ast/ast.dart' show AnnotatedNode;
 import 'package:analyzer/dart/ast/token.dart' show Token;
 import 'package:analyzer/src/dart/element/element.dart' show ElementImpl;
-import 'package:meta/meta.dart';
 
 export 'package:_fe_analyzer_shared/src/util/resolve_relative_uri.dart'
     show resolveRelativeUri;
@@ -13,7 +12,7 @@
 /// If the given [node] has a documentation comment, remember its content
 /// and range into the given [element].
 void setElementDocumentationComment(ElementImpl element, AnnotatedNode node) {
-  Comment comment = node.documentationComment;
+  var comment = node.documentationComment;
   if (comment != null && comment.isDocumentation) {
     element.documentationComment =
         comment.tokens.map((Token t) => t.lexeme).join('\n');
@@ -158,16 +157,16 @@
 
   /// Initialize a newly created kind with the given state.
   const ParameterKind({
-    @required this.name,
-    @required this.ordinal,
-    @required this.isPositional,
-    @required this.isRequiredPositional,
-    @required this.isOptionalPositional,
-    @required this.isNamed,
-    @required this.isRequiredNamed,
-    @required this.isOptionalNamed,
-    @required this.isRequired,
-    @required this.isOptional,
+    required this.name,
+    required this.ordinal,
+    required this.isPositional,
+    required this.isRequiredPositional,
+    required this.isOptionalPositional,
+    required this.isNamed,
+    required this.isRequiredNamed,
+    required this.isOptionalNamed,
+    required this.isRequired,
+    required this.isOptional,
   });
 
   @override
diff --git a/pkg/analyzer/lib/src/generated/utilities_general.dart b/pkg/analyzer/lib/src/generated/utilities_general.dart
index 025dc92..bfd1e08 100644
--- a/pkg/analyzer/lib/src/generated/utilities_general.dart
+++ b/pkg/analyzer/lib/src/generated/utilities_general.dart
@@ -17,14 +17,14 @@
 
 /// Safely convert the given [value] to a bool value, or return `null` if the
 /// value could not be converted.
-bool toBool(Object value) {
+bool? toBool(Object value) {
   if (value is YamlScalar) {
-    value = (value as YamlScalar).value;
+    value = value.value;
   }
   if (value is bool) {
     return value;
   }
-  String string = toLowerCase(value);
+  var string = toLowerCase(value);
   if (string == 'true') {
     return true;
   }
@@ -36,11 +36,11 @@
 
 /// Safely convert this [value] to lower case, returning `null` if [value] is
 /// null.
-String toLowerCase(Object value) => value?.toString()?.toLowerCase();
+String? toLowerCase(Object? value) => value?.toString().toLowerCase();
 
 /// Safely convert this [value] to upper case, returning `null` if [value] is
 /// null.
-String toUpperCase(Object value) => value?.toString()?.toUpperCase();
+String? toUpperCase(Object? value) => value?.toString().toUpperCase();
 
 /// Jenkins hash function, optimized for small integers.
 ///
diff --git a/pkg/analyzer/lib/src/hint/sdk_constraint_extractor.dart b/pkg/analyzer/lib/src/hint/sdk_constraint_extractor.dart
index c4942e4..e43c03b 100644
--- a/pkg/analyzer/lib/src/hint/sdk_constraint_extractor.dart
+++ b/pkg/analyzer/lib/src/hint/sdk_constraint_extractor.dart
@@ -18,7 +18,7 @@
 
   /// The text of the constraint, or `null` if the range has not yet been
   /// computed or if there was an error when attempting to compute the range.
-  String _constraintText;
+  String? _constraintText;
 
   /// The offset of the constraint text, or `-1` if the offset is not known.
   int _constraintOffset = -1;
@@ -26,7 +26,7 @@
   /// The cached range of supported versions, or `null` if the range has not yet
   /// been computed or if there was an error when attempting to compute the
   /// range.
-  VersionConstraint _constraint;
+  VersionConstraint? _constraint;
 
   /// Initialize a newly created extractor to extract the SDK version constraint
   /// from the given `pubspec.yaml` file.
@@ -34,9 +34,9 @@
 
   /// Return the range of supported versions, or `null` if the range could not
   /// be computed.
-  VersionConstraint constraint() {
+  VersionConstraint? constraint() {
     if (_constraint == null) {
-      String text = constraintText();
+      var text = constraintText();
       if (text != null) {
         try {
           _constraint = VersionConstraint.parse(text);
@@ -48,7 +48,8 @@
     return _constraint;
   }
 
-  /// Return the offset of the constraint text.
+  /// Return the offset of the constraint text, or `-1` if there is an
+  /// error or if the pubspec does not contain an sdk constraint.
   int constraintOffset() {
     if (_constraintText == null) {
       _initializeTextAndOffset();
@@ -56,8 +57,9 @@
     return _constraintOffset;
   }
 
-  /// Return the constraint text following "sdk:".
-  String constraintText() {
+  /// Return the constraint text following "sdk:", or `null` if there is an
+  /// error or if the pubspec does not contain an sdk constraint.
+  String? constraintText() {
     if (_constraintText == null) {
       _initializeTextAndOffset();
     }
@@ -74,9 +76,9 @@
         YamlDocument document = loadYamlDocument(fileContent);
         YamlNode contents = document.contents;
         if (contents is YamlMap) {
-          YamlNode environment = contents.nodes['environment'];
+          YamlNode? environment = contents.nodes['environment'];
           if (environment is YamlMap) {
-            YamlNode sdk = environment.nodes['sdk'];
+            YamlNode? sdk = environment.nodes['sdk'];
             if (sdk is YamlScalar) {
               _constraintText = sdk.value;
               _constraintOffset = sdk.span.start.offset;
diff --git a/pkg/analyzer/lib/src/hint/sdk_constraint_verifier.dart b/pkg/analyzer/lib/src/hint/sdk_constraint_verifier.dart
index e7098b5..b69c770 100644
--- a/pkg/analyzer/lib/src/hint/sdk_constraint_verifier.dart
+++ b/pkg/analyzer/lib/src/hint/sdk_constraint_verifier.dart
@@ -10,7 +10,6 @@
 import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
-import 'package:analyzer/src/dart/resolver/scope.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:pub_semver/pub_semver.dart';
 
@@ -32,19 +31,19 @@
   /// A cached flag indicating whether references to the constant-update-2018
   /// features need to be checked. Use [checkConstantUpdate2018] to access this
   /// field.
-  bool _checkConstantUpdate2018;
+  bool? _checkConstantUpdate2018;
 
   /// A cached flag indicating whether uses of extension method features need to
   /// be checked. Use [checkExtensionMethods] to access this field.
-  bool _checkExtensionMethods;
+  bool? _checkExtensionMethods;
 
   /// A cached flag indicating whether references to Future and Stream need to
   /// be checked. Use [checkFutureAndStream] to access this field.
-  bool _checkFutureAndStream;
+  bool? _checkFutureAndStream;
 
   /// A cached flag indicating whether references to set literals need to
   /// be checked. Use [checkSetLiterals] to access this field.
-  bool _checkSetLiterals;
+  bool? _checkSetLiterals;
 
   /// A flag indicating whether we are visiting code inside a set literal. Used
   /// to prevent over-reporting uses of set literals.
@@ -52,7 +51,7 @@
 
   /// A cached flag indicating whether references to the ui-as-code features
   /// need to be checked. Use [checkUiAsCode] to access this field.
-  bool _checkUiAsCode;
+  bool? _checkUiAsCode;
 
   /// A flag indicating whether we are visiting code inside one of the
   /// ui-as-code features. Used to prevent over-reporting uses of these
@@ -132,7 +131,7 @@
               operatorType == TokenType.BAR ||
               operatorType == TokenType.CARET) &&
           (node as BinaryExpressionImpl).inConstantContext) {
-        if (node.leftOperand.staticType.isDartCoreBool) {
+        if (node.leftOperand.staticType!.isDartCoreBool) {
           _errorReporter.reportErrorForToken(
               HintCode.SDK_VERSION_BOOL_OPERATOR_IN_CONST_CONTEXT,
               node.operator,
@@ -141,7 +140,7 @@
       } else if (operatorType == TokenType.EQ_EQ &&
           (node as BinaryExpressionImpl).inConstantContext) {
         bool primitive(Expression node) {
-          DartType type = node.staticType;
+          DartType type = node.staticType!;
           return type.isDartCoreBool ||
               type.isDartCoreDouble ||
               type.isDartCoreInt ||
@@ -242,15 +241,16 @@
     if (node.inDeclarationContext()) {
       return;
     }
-    Element element = node.staticElement;
+    var element = node.staticElement;
     if (checkFutureAndStream &&
+        element is ClassElement &&
         (element == _typeProvider.futureElement ||
             element == _typeProvider.streamElement)) {
       for (LibraryElement importedLibrary
           in _containingLibrary.importedLibraries) {
         if (!importedLibrary.isDartCore) {
-          Namespace namespace = importedLibrary.exportNamespace;
-          if (namespace != null && namespace.get(element.name) != null) {
+          var namespace = importedLibrary.exportNamespace;
+          if (namespace.get(element.name) != null) {
             return;
           }
         }
@@ -287,7 +287,7 @@
   void _validateUiAsCodeInConstContext(AstNode node) {
     if (checkConstantUpdate2018 &&
         !_inUiAsCode &&
-        node.thisOrAncestorOfType<TypedLiteral>().isConst) {
+        node.thisOrAncestorOfType<TypedLiteral>()!.isConst) {
       _errorReporter.reportErrorForNode(
           HintCode.SDK_VERSION_UI_AS_CODE_IN_CONST_CONTEXT, node);
     }
diff --git a/pkg/analyzer/lib/src/ignore_comments/ignore_info.dart b/pkg/analyzer/lib/src/ignore_comments/ignore_info.dart
index 6d37999..5a1d3c3 100644
--- a/pkg/analyzer/lib/src/ignore_comments/ignore_info.dart
+++ b/pkg/analyzer/lib/src/ignore_comments/ignore_info.dart
@@ -63,7 +63,7 @@
   /// Initialize a newly created instance of this class to represent the ignore
   /// comments in the given compilation [unit].
   IgnoreInfo.forDart(CompilationUnit unit, String content) {
-    var lineInfo = unit.lineInfo;
+    var lineInfo = unit.lineInfo!;
     for (var comment in unit.ignoreComments) {
       var lexeme = comment.lexeme;
       if (lexeme.contains('ignore:')) {
@@ -149,10 +149,10 @@
       // affect older clients of this class because none of the previous APIs
       // depended on having offsets.
       Iterable<DiagnosticName> codes = match
-          .group(1)
+          .group(1)!
           .split(',')
           .map((String code) => DiagnosticName(code.trim().toLowerCase(), -1));
-      CharacterLocation location = info.getLocation(match.start);
+      var location = info.getLocation(match.start);
       int lineNumber = location.lineNumber;
       String beforeMatch = content.substring(
           info.getOffsetOfLine(lineNumber - 1),
@@ -171,7 +171,7 @@
     // having offsets.
     for (Match match in fileMatches) {
       Iterable<DiagnosticName> codes = match
-          .group(1)
+          .group(1)!
           .split(',')
           .map((String code) => DiagnosticName(code.trim().toLowerCase(), -1));
       ignoreInfo._addAllForFile(codes);
@@ -196,14 +196,14 @@
             yield comment;
           }
         }
-        comment = comment.next;
+        comment = comment.next as CommentToken?;
       }
     }
 
     var currentToken = beginToken;
     while (currentToken != currentToken.next) {
       yield* processPrecedingComments(currentToken);
-      currentToken = currentToken.next;
+      currentToken = currentToken.next!;
     }
     yield* processPrecedingComments(currentToken);
   }
diff --git a/pkg/analyzer/lib/src/lint/analysis.dart b/pkg/analyzer/lib/src/lint/analysis.dart
index 5777705..89c4c7c 100644
--- a/pkg/analyzer/lib/src/lint/analysis.dart
+++ b/pkg/analyzer/lib/src/lint/analysis.dart
@@ -6,7 +6,6 @@
 import 'dart:io' as io;
 
 import 'package:analyzer/dart/analysis/context_locator.dart' as api;
-import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/file_system/file_system.dart'
     show File, Folder, ResourceProvider, ResourceUriResolver;
 import 'package:analyzer/file_system/physical_file_system.dart';
@@ -50,7 +49,7 @@
   io.exit(exitCode);
 }
 
-AnalysisOptions _buildAnalyzerOptions(LinterOptions options) {
+AnalysisOptionsImpl _buildAnalyzerOptions(LinterOptions options) {
   AnalysisOptionsImpl analysisOptions = AnalysisOptionsImpl();
   if (options.analysisOptions != null) {
     YamlMap map =
@@ -61,7 +60,7 @@
   analysisOptions.hint = false;
   analysisOptions.lint = options.enableLints;
   analysisOptions.enableTiming = options.enableTiming;
-  analysisOptions.lintRules = options.enabledLints?.toList(growable: false);
+  analysisOptions.lintRules = options.enabledLints.toList(growable: false);
   return analysisOptions;
 }
 
@@ -71,7 +70,7 @@
   int cacheSize = 512;
 
   /// The path to the dart SDK.
-  String dartSdkPath;
+  String? dartSdkPath;
 
   /// Whether to show lint warnings.
   bool enableLints = true;
@@ -80,17 +79,17 @@
   bool enableTiming = false;
 
   /// The path to a `.packages` configuration file
-  String packageConfigPath;
+  String? packageConfigPath;
 
   /// The path to the package root.
   @Deprecated('https://github.com/dart-lang/sdk/issues/41197')
-  String packageRootPath;
+  String? packageRootPath;
 
   /// Whether to use Dart's Strong Mode analyzer.
   bool strongMode = true;
 
   /// The mock SDK (to speed up testing) or `null` to use the actual SDK.
-  DartSdk mockSdk;
+  DartSdk? mockSdk;
 
   /// Return `true` is the parser is able to parse asserts in the initializer
   /// list of a constructor.
@@ -183,7 +182,7 @@
       File sourceFile =
           resourceProvider.getFile(p.normalize(file.absolute.path));
       Source source = sourceFile.createSource();
-      Uri uri = sourceFactory.restoreUri(source);
+      var uri = sourceFactory.restoreUri(source);
       if (uri != null) {
         // Ensure that we analyze the file using its canonical URI (e.g. if
         // it's in "/lib", analyze it using a "package:" URI).
@@ -203,8 +202,7 @@
 
     List<AnalysisErrorInfo> errors = [];
     for (Source source in sources) {
-      ErrorsResult errorsResult =
-          await analysisDriver.getErrors(source.fullName);
+      var errorsResult = (await analysisDriver.getErrors(source.fullName))!;
       errors.add(
           AnalysisErrorInfoImpl(errorsResult.errors, errorsResult.lineInfo));
       _sourcesAnalyzed.add(source);
@@ -215,11 +213,11 @@
 
   void registerLinters(AnalysisContext context) {
     if (options.enableLints) {
-      setLints(context, options.enabledLints?.toList(growable: false));
+      setLints(context, options.enabledLints.toList(growable: false));
     }
   }
 
-  PackageMapUriResolver _getPackageUriResolver() {
+  PackageMapUriResolver? _getPackageUriResolver() {
     var packageConfigPath = options.packageConfigPath;
     if (packageConfigPath != null) {
       var resourceProvider = PhysicalResourceProvider.INSTANCE;
@@ -257,9 +255,6 @@
     }
 
     var rootPath = p.normalize(files.first.absolute.path);
-    if (rootPath == null) {
-      return;
-    }
 
     var apiContextRoots = api.ContextLocator(
       resourceProvider: resourceProvider,
@@ -286,7 +281,7 @@
 /// [errorSink].
 class StdInstrumentation extends NoopInstrumentationService {
   @override
-  void logError(String message, [Object exception]) {
+  void logError(String message, [Object? exception]) {
     errorSink.writeln(message);
     if (exception != null) {
       errorSink.writeln(exception);
@@ -295,14 +290,14 @@
 
   @override
   void logException(dynamic exception,
-      [StackTrace stackTrace,
-      List<InstrumentationServiceAttachment> attachments]) {
+      [StackTrace? stackTrace,
+      List<InstrumentationServiceAttachment>? attachments]) {
     errorSink.writeln(exception);
     errorSink.writeln(stackTrace);
   }
 
   @override
-  void logInfo(String message, [Object exception]) {
+  void logInfo(String message, [Object? exception]) {
     outSink.writeln(message);
     if (exception != null) {
       outSink.writeln(exception);
diff --git a/pkg/analyzer/lib/src/lint/config.dart b/pkg/analyzer/lib/src/lint/config.dart
index 4286bd5..4bbb637 100644
--- a/pkg/analyzer/lib/src/lint/config.dart
+++ b/pkg/analyzer/lib/src/lint/config.dart
@@ -6,7 +6,8 @@
 import 'package:yaml/yaml.dart';
 
 /// Parse the given map into a lint config.
-LintConfig parseConfig(YamlMap optionsMap) {
+/// Return `null` if [optionsMap] is `null` or does not have `linter` map.
+LintConfig? parseConfig(YamlMap? optionsMap) {
   if (optionsMap != null) {
     var options = getValue(optionsMap, 'linter');
     // Quick check of basic contract.
@@ -18,8 +19,9 @@
 }
 
 /// Process the given option [fileContents] and produce a corresponding
-/// [LintConfig].
-LintConfig processAnalysisOptionsFile(String fileContents, {String fileUrl}) {
+/// [LintConfig]. Return `null` if [fileContents] is not a YAML map, or
+/// does not have the `linter` child map.
+LintConfig? processAnalysisOptionsFile(String fileContents, {String? fileUrl}) {
   var yaml = loadYamlNode(fileContents,
       sourceUrl: fileUrl != null ? Uri.parse(fileUrl) : null);
   if (yaml is YamlMap) {
@@ -30,7 +32,7 @@
 
 /// The configuration of lint rules within an analysis options file.
 abstract class LintConfig {
-  factory LintConfig.parse(String source, {String sourceUrl}) =>
+  factory LintConfig.parse(String source, {String? sourceUrl}) =>
       _LintConfig().._parse(source, sourceUrl: sourceUrl);
 
   factory LintConfig.parseMap(YamlMap map) => _LintConfig().._parseYaml(map);
@@ -43,8 +45,8 @@
 /// The configuration of a single lint rule within an analysis options file.
 abstract class RuleConfig {
   Map<String, dynamic> args = <String, dynamic>{};
-  String get group;
-  String get name;
+  String? get group;
+  String? get name;
 
   // Provisional
   bool disables(String ruleName) =>
@@ -69,7 +71,7 @@
     }
   }
 
-  bool asBool(Object scalar) {
+  bool? asBool(Object scalar) {
     Object value = scalar is YamlScalar ? scalar.value : scalar;
     if (value is bool) {
       return value;
@@ -85,7 +87,7 @@
     return null;
   }
 
-  String asString(Object scalar) {
+  String? asString(Object scalar) {
     Object value = scalar is YamlScalar ? scalar.value : scalar;
     if (value is String) {
       return value;
@@ -93,15 +95,15 @@
     return null;
   }
 
-  Map<String, dynamic> parseArgs(Object args) {
-    bool enabled = asBool(args);
+  Map<String, dynamic>? parseArgs(Object args) {
+    var enabled = asBool(args);
     if (enabled != null) {
       return {'enabled': enabled};
     }
     return null;
   }
 
-  void _parse(String src, {String sourceUrl}) {
+  void _parse(String src, {String? sourceUrl}) {
     var yaml = loadYamlNode(src,
         sourceUrl: sourceUrl != null ? Uri.parse(sourceUrl) : null);
     if (yaml is YamlMap) {
@@ -155,7 +157,7 @@
                   var config = _RuleConfig();
                   config.group = asString(key);
                   config.name = asString(rule);
-                  config.args = parseArgs(args);
+                  config.args = parseArgs(args)!;
                   ruleConfigs.add(config);
                 });
               }
@@ -169,7 +171,7 @@
 
 class _RuleConfig extends RuleConfig {
   @override
-  String group;
+  String? group;
   @override
-  String name;
+  String? name;
 }
diff --git a/pkg/analyzer/lib/src/lint/io.dart b/pkg/analyzer/lib/src/lint/io.dart
index 0abd586..30bd983 100644
--- a/pkg/analyzer/lib/src/lint/io.dart
+++ b/pkg/analyzer/lib/src/lint/io.dart
@@ -34,7 +34,7 @@
         var relative = p.relative(entry.path, from: directory.path);
 
         if (isLintable(entry) && !isInHiddenDir(relative)) {
-          files.add(entry);
+          files.add(entry as File);
         }
       }
     }
diff --git a/pkg/analyzer/lib/src/lint/linter.dart b/pkg/analyzer/lib/src/lint/linter.dart
index bf67b7b..8bd1850 100644
--- a/pkg/analyzer/lib/src/lint/linter.dart
+++ b/pkg/analyzer/lib/src/lint/linter.dart
@@ -24,6 +24,7 @@
 import 'package:analyzer/src/dart/constant/utilities.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
+import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/dart/error/lint_codes.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart'
@@ -85,7 +86,7 @@
 
   /// The total number of sources that were analyzed.  Only valid after
   /// [lintFiles] has been called.
-  int numSourcesAnalyzed;
+  late int numSourcesAnalyzed;
 
   /// Creates a new linter.
   DartLinter(this.options, {this.reporter = const PrintingReporter()});
@@ -103,10 +104,10 @@
   }
 
   Iterable<AnalysisErrorInfo> lintPubspecSource(
-      {String contents, String sourcePath}) {
+      {required String contents, String? sourcePath}) {
     var results = <AnalysisErrorInfo>[];
 
-    Uri sourceUrl = sourcePath == null ? null : p.toUri(sourcePath);
+    var sourceUrl = sourcePath == null ? null : p.toUri(sourcePath);
 
     var spec = Pubspec.parse(contents, sourceUrl: sourceUrl);
 
@@ -118,7 +119,7 @@
           // Analyzer sets reporters; if this file is not being analyzed,
           // we need to set one ourselves.  (Needless to say, when pubspec
           // processing gets pushed down, this hack can go away.)
-          if (rule.reporter == null && sourceUrl != null) {
+          if (sourceUrl != null) {
             var source = createSource(sourceUrl);
             rule.reporter = ErrorReporter(
               this,
@@ -131,7 +132,7 @@
           } on Exception catch (e) {
             reporter.exception(LinterException(e.toString()));
           }
-          if (rule._locationInfo != null && rule._locationInfo.isNotEmpty) {
+          if (rule._locationInfo.isNotEmpty) {
             results.addAll(rule._locationInfo);
             rule._locationInfo.clear();
           }
@@ -156,7 +157,7 @@
   Iterable<Glob> includes;
   Iterable<Glob> excludes;
 
-  FileGlobFilter([Iterable<String> includeGlobs, Iterable<String> excludeGlobs])
+  FileGlobFilter(Iterable<String> includeGlobs, Iterable<String> excludeGlobs)
       : includes = includeGlobs.map((glob) => Glob(glob)),
         excludes = excludeGlobs.map((glob) => Glob(glob));
 
@@ -188,16 +189,17 @@
   final String name;
   final bool custom;
   final String description;
-  final Hyperlink link;
+  final Hyperlink? link;
 
-  factory Group(String name, {String description = '', Hyperlink link}) {
+  factory Group(String name, {String description = '', Hyperlink? link}) {
     var n = name.toLowerCase();
     return builtin.firstWhere((g) => g.name == n,
         orElse: () =>
             Group._(name, custom: true, description: description, link: link));
   }
 
-  const Group._(this.name, {this.custom = false, this.description, this.link});
+  const Group._(this.name,
+      {this.custom = false, required this.description, this.link});
 
   @override
   int compareTo(Group other) => name.compareTo(other.name);
@@ -218,7 +220,7 @@
 /// The result of attempting to evaluate an expression.
 class LinterConstantEvaluationResult {
   /// The value of the expression, or `null` if has [errors].
-  final DartObject value;
+  final DartObject? value;
 
   /// The errors reported during the evaluation.
   final List<AnalysisError> errors;
@@ -239,7 +241,7 @@
 
   InheritanceManager3 get inheritanceManager;
 
-  WorkspacePackage get package;
+  WorkspacePackage? get package;
 
   TypeProvider get typeProvider;
 
@@ -293,13 +295,13 @@
   final DeclaredVariables declaredVariables;
 
   @override
-  final WorkspacePackage package;
+  final WorkspacePackage? package;
 
   @override
   final TypeProvider typeProvider;
 
   @override
-  final TypeSystem typeSystem;
+  final TypeSystemImpl typeSystem;
 
   @override
   final InheritanceManager3 inheritanceManager;
@@ -328,7 +330,7 @@
 
   @override
   bool canBeConstConstructor(ConstructorDeclaration node) {
-    ConstructorElement element = node.declaredElement;
+    var element = node.declaredElement!;
 
     ClassElement classElement = element.enclosingElement;
     if (classElement.hasNonFinalField) return false;
@@ -346,9 +348,9 @@
 
   @override
   LinterConstantEvaluationResult evaluateConstant(Expression node) {
-    var unitElement = currentUnit.unit.declaredElement;
+    var unitElement = currentUnit.unit.declaredElement!;
     var source = unitElement.source;
-    var libraryElement = unitElement.library;
+    var libraryElement = unitElement.library as LibraryElementImpl;
 
     var errorListener = RecordingErrorListener();
     var errorReporter = ErrorReporter(
@@ -368,14 +370,16 @@
   }
 
   @override
-  bool isEnabled(Feature feature) =>
-      currentUnit.unit.declaredElement.library.featureSet.isEnabled(feature);
+  bool isEnabled(Feature feature) {
+    var unitElement = currentUnit.unit.declaredElement!;
+    return unitElement.library.featureSet.isEnabled(feature);
+  }
 
   @override
   LinterNameInScopeResolutionResult resolveNameInScope(
       String id, bool setter, AstNode node) {
-    Scope scope;
-    for (var context = node; context != null; context = context.parent) {
+    Scope? scope;
+    for (AstNode? context = node; context != null; context = context.parent) {
       scope = ScopedVisitor.getNodeNameScope(context);
       if (scope != null) {
         break;
@@ -410,20 +414,20 @@
     //
     // Verify that the invoked constructor is a const constructor.
     //
-    ConstructorElement element = node.constructorName.staticElement;
+    var element = node.constructorName.staticElement;
     if (element == null || !element.isConst) {
       return false;
     }
 
     // Ensure that dependencies (e.g. default parameter values) are computed.
-    ConstructorElementImpl implElement = element.declaration;
+    var implElement = element.declaration as ConstructorElementImpl;
     implElement.computeConstantDependencies();
 
     //
     // Verify that the evaluation of the constructor would not produce an
     // exception.
     //
-    Token oldKeyword = node.keyword;
+    var oldKeyword = node.keyword;
     try {
       node.keyword = KeywordToken(Keyword.CONST, node.offset);
       return !_hasConstantVerifierError(node);
@@ -433,7 +437,7 @@
   }
 
   bool _canBeConstTypedLiteral(TypedLiteral node) {
-    Token oldKeyword = node.constKeyword;
+    var oldKeyword = node.constKeyword;
     try {
       node.constKeyword = KeywordToken(Keyword.CONST, node.offset);
       return !_hasConstantVerifierError(node);
@@ -444,8 +448,8 @@
 
   /// Return `true` if [ConstantVerifier] reports an error for the [node].
   bool _hasConstantVerifierError(AstNode node) {
-    var unitElement = currentUnit.unit.declaredElement;
-    var libraryElement = unitElement.library;
+    var unitElement = currentUnit.unit.declaredElement!;
+    var libraryElement = unitElement.library as LibraryElementImpl;
 
     var dependenciesFinder = ConstantExpressionsDependenciesFinder();
     node.accept(dependenciesFinder);
@@ -486,7 +490,7 @@
 /// Thrown when an error occurs in linting.
 class LinterException implements Exception {
   /// A message describing the error.
-  final String message;
+  final String? message;
 
   /// Creates a new LinterException with an optional error [message].
   const LinterException([this.message]);
@@ -499,7 +503,7 @@
 /// The result of resolving of a basename `id` in a scope.
 class LinterNameInScopeResolutionResult {
   /// The element with the requested basename, `null` is [isNone].
-  final Element element;
+  final Element? element;
 
   /// The state of the result.
   final _LinterNameInScopeResolutionResultState _state;
@@ -531,14 +535,13 @@
 /// Linter options.
 class LinterOptions extends DriverOptions {
   Iterable<LintRule> enabledLints;
-  String analysisOptions;
-  LintFilter filter;
-  file_system.ResourceProvider resourceProvider;
+  String? analysisOptions;
+  LintFilter? filter;
+  late file_system.ResourceProvider resourceProvider;
 
   // todo (pq): consider migrating to named params (but note Linter dep).
-  LinterOptions([this.enabledLints, this.analysisOptions]) {
-    enabledLints ??= Registry.ruleRegistry;
-  }
+  LinterOptions([Iterable<LintRule>? enabledLints, this.analysisOptions])
+      : enabledLints = enabledLints ?? Registry.ruleRegistry;
 
   void configure(LintConfig config) {
     enabledLints = Registry.ruleRegistry.where((LintRule rule) =>
@@ -577,10 +580,10 @@
   final List<AnalysisErrorInfo> _locationInfo = <AnalysisErrorInfo>[];
 
   LintRule({
-    this.name,
-    this.group,
-    this.description,
-    this.details,
+    required this.name,
+    required this.group,
+    required this.description,
+    required this.details,
     this.maturity = Maturity.stable,
   });
 
@@ -601,19 +604,19 @@
 
   /// Return a visitor to be passed to provide access to Dart project context
   /// and to perform project-level analyses.
-  ProjectVisitor getProjectVisitor() => null;
+  ProjectVisitor? getProjectVisitor() => null;
 
   /// Return a visitor to be passed to pubspecs to perform lint
   /// analysis.
   /// Lint errors are reported via this [Linter]'s error [reporter].
-  PubspecVisitor getPubspecVisitor() => null;
+  PubspecVisitor? getPubspecVisitor() => null;
 
   @override
-  AstVisitor getVisitor() => null;
+  AstVisitor? getVisitor() => null;
 
-  void reportLint(AstNode node,
+  void reportLint(AstNode? node,
       {List<Object> arguments = const [],
-      ErrorCode errorCode,
+      ErrorCode? errorCode,
       bool ignoreSyntheticNodes = true}) {
     if (node != null && (!node.isSynthetic || !ignoreSyntheticNodes)) {
       reporter.reportErrorForNode(errorCode ?? lintCode, node, arguments);
@@ -621,14 +624,14 @@
   }
 
   void reportLintForOffset(int offset, int length,
-      {List<Object> arguments = const [], ErrorCode errorCode}) {
+      {List<Object> arguments = const [], ErrorCode? errorCode}) {
     reporter.reportErrorForOffset(
         errorCode ?? lintCode, offset, length, arguments);
   }
 
-  void reportLintForToken(Token token,
+  void reportLintForToken(Token? token,
       {List<Object> arguments = const [],
-      ErrorCode errorCode,
+      ErrorCode? errorCode,
       bool ignoreSyntheticTokens = true}) {
     if (token != null && (!token.isSynthetic || !ignoreSyntheticTokens)) {
       reporter.reportErrorForToken(errorCode ?? lintCode, token, arguments);
@@ -645,7 +648,7 @@
     _locationInfo.add(AnalysisErrorInfoImpl([error], lineInfo));
 
     // Then do the reporting
-    reporter?.reportError(error);
+    reporter.reportError(error);
   }
 }
 
@@ -657,7 +660,7 @@
   final String name;
   final int ordinal;
 
-  factory Maturity(String name, {int ordinal}) {
+  factory Maturity(String name, {required int ordinal}) {
     switch (name.toLowerCase()) {
       case 'stable':
         return stable;
@@ -670,7 +673,7 @@
     }
   }
 
-  const Maturity._(this.name, {this.ordinal});
+  const Maturity._(this.name, {required this.ordinal});
 
   @override
   int compareTo(Maturity other) => ordinal - other.ordinal;
@@ -728,7 +731,7 @@
   final Reporter reporter;
 
   @override
-  int numSourcesAnalyzed;
+  late int numSourcesAnalyzed;
 
   SourceLinter(this.options, {this.reporter = const PrintingReporter()});
 
@@ -747,10 +750,10 @@
 
   @override
   Iterable<AnalysisErrorInfo> lintPubspecSource(
-      {String contents, String sourcePath}) {
+      {required String contents, String? sourcePath}) {
     var results = <AnalysisErrorInfo>[];
 
-    Uri sourceUrl = sourcePath == null ? null : p.toUri(sourcePath);
+    var sourceUrl = sourcePath == null ? null : p.toUri(sourcePath);
 
     var spec = Pubspec.parse(contents, sourceUrl: sourceUrl);
 
@@ -762,7 +765,7 @@
           // Analyzer sets reporters; if this file is not being analyzed,
           // we need to set one ourselves.  (Needless to say, when pubspec
           // processing gets pushed down, this hack can go away.)
-          if (rule.reporter == null && sourceUrl != null) {
+          if (sourceUrl != null) {
             var source = createSource(sourceUrl);
             rule.reporter = ErrorReporter(
               this,
@@ -775,7 +778,9 @@
           } on Exception catch (e) {
             reporter.exception(LinterException(e.toString()));
           }
-          if (rule._locationInfo != null && rule._locationInfo.isNotEmpty) {
+
+          var locationInfo = rule._locationInfo;
+          if (!identical(null, locationInfo) && locationInfo.isNotEmpty) {
             results.addAll(rule._locationInfo);
             rule._locationInfo.clear();
           }
@@ -837,10 +842,11 @@
 }
 
 class _LintCode extends LintCode {
-  static final registry = <String, LintCode>{};
+  static final registry = <String, _LintCode>{};
 
-  factory _LintCode(String name, String message) =>
-      registry.putIfAbsent(name + message, () => _LintCode._(name, message));
+  factory _LintCode(String name, String message) {
+    return registry[name + message] ??= _LintCode._(name, message);
+  }
 
   _LintCode._(String name, String message) : super(name, message);
 }
diff --git a/pkg/analyzer/lib/src/lint/linter_visitor.dart b/pkg/analyzer/lib/src/lint/linter_visitor.dart
index bc3f868..df3f994 100644
--- a/pkg/analyzer/lib/src/lint/linter_visitor.dart
+++ b/pkg/analyzer/lib/src/lint/linter_visitor.dart
@@ -1445,7 +1445,7 @@
   }
 
   /// Get the timer associated with the given [linter].
-  Stopwatch _getTimer(LintRule linter) {
+  Stopwatch? _getTimer(LintRule linter) {
     if (enableTiming) {
       return lintRegistry.getTimer(linter);
     } else {
@@ -1458,7 +1458,7 @@
 class _Subscription<T> {
   final LintRule linter;
   final AstVisitor visitor;
-  final Stopwatch timer;
+  final Stopwatch? timer;
 
   _Subscription(this.linter, this.visitor, this.timer);
 }
diff --git a/pkg/analyzer/lib/src/lint/options_rule_validator.dart b/pkg/analyzer/lib/src/lint/options_rule_validator.dart
index bf67245..71e8620 100644
--- a/pkg/analyzer/lib/src/lint/options_rule_validator.dart
+++ b/pkg/analyzer/lib/src/lint/options_rule_validator.dart
@@ -9,6 +9,7 @@
 import 'package:analyzer/src/lint/registry.dart';
 import 'package:analyzer/src/plugin/options.dart';
 import 'package:analyzer/src/util/yaml.dart';
+import 'package:collection/collection.dart';
 import 'package:yaml/yaml.dart';
 
 /// TODO(pq): migrate these codes to `option_codes.dart`?
@@ -58,11 +59,11 @@
 
   final LintRuleProvider ruleProvider;
 
-  LinterRuleOptionsValidator({LintRuleProvider provider})
+  LinterRuleOptionsValidator({LintRuleProvider? provider})
       : ruleProvider = provider ?? (() => Registry.ruleRegistry.rules);
 
-  LintRule getRegisteredLint(Object value) => ruleProvider()
-      .firstWhere((rule) => rule.name == value, orElse: () => null);
+  LintRule? getRegisteredLint(Object value) =>
+      ruleProvider().firstWhereOrNull((rule) => rule.name == value);
 
   @override
   List<AnalysisError> validate(ErrorReporter reporter, YamlMap options) {
@@ -75,11 +76,11 @@
     return errors;
   }
 
-  void validateRules(YamlNode rules, ErrorReporter reporter) {
+  void validateRules(YamlNode? rules, ErrorReporter reporter) {
     if (rules is YamlList) {
       final seenRules = <String>{};
 
-      String findIncompatibleRule(LintRule rule) {
+      String? findIncompatibleRule(LintRule rule) {
         for (var incompatibleRule in rule.incompatibleRules) {
           if (seenRules.contains(incompatibleRule)) {
             return incompatibleRule;
diff --git a/pkg/analyzer/lib/src/lint/project.dart b/pkg/analyzer/lib/src/lint/project.dart
index b3cc575..110bc63 100644
--- a/pkg/analyzer/lib/src/lint/project.dart
+++ b/pkg/analyzer/lib/src/lint/project.dart
@@ -11,13 +11,15 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/lint/io.dart';
 import 'package:analyzer/src/lint/pub.dart';
+import 'package:collection/collection.dart';
 import 'package:path/path.dart' as p;
 
-Pubspec _findAndParsePubspec(Directory root) {
+Pubspec? _findAndParsePubspec(Directory root) {
   if (root.existsSync()) {
-    File pubspec = root
+    var pubspec = root
         .listSync(followLinks: false)
-        .firstWhere((f) => isPubspecFile(f), orElse: () => null);
+        .whereType<File>()
+        .firstWhereOrNull((f) => isPubspecFile(f));
     if (pubspec != null) {
       return Pubspec.parse(pubspec.readAsStringSync(),
           sourceUrl: p.toUri(pubspec.path));
@@ -35,9 +37,9 @@
 /// in the "public API") and resources that have special meanings in the
 /// context of pub package layout conventions.
 class DartProject {
-  _ApiModel _apiModel;
-  String _name;
-  Pubspec _pubspec;
+  late final _ApiModel _apiModel;
+  String? _name;
+  Pubspec? _pubspec;
 
   /// Project root.
   final Directory root;
@@ -47,7 +49,7 @@
   /// used.
   ///
   /// Note: clients should call [create] which performs API model initialization.
-  DartProject._(AnalysisDriver driver, List<Source> sources, {Directory dir})
+  DartProject._(AnalysisDriver driver, List<Source> sources, {Directory? dir})
       : root = dir ?? Directory.current {
     _pubspec = _findAndParsePubspec(root);
     _apiModel = _ApiModel(driver, sources, root);
@@ -61,7 +63,7 @@
   String get name => _name ??= _calculateName();
 
   /// The project's pubspec.
-  Pubspec get pubspec => _pubspec;
+  Pubspec? get pubspec => _pubspec;
 
   /// Returns `true` if the given element is part of this project's public API.
   ///
@@ -73,9 +75,9 @@
 
   String _calculateName() {
     if (pubspec != null) {
-      var nameEntry = pubspec.name;
+      var nameEntry = pubspec!.name;
       if (nameEntry != null) {
-        return nameEntry.value.text;
+        return nameEntry.value.text!;
       }
     }
     return p.basename(root.path);
@@ -86,7 +88,7 @@
   /// If a [dir] is unspecified the current working directory will be
   /// used.
   static Future<DartProject> create(AnalysisDriver driver, List<Source> sources,
-      {Directory dir}) async {
+      {Directory? dir}) async {
     DartProject project = DartProject._(driver, sources, dir: dir);
     await project._apiModel._calculate();
     return project;
@@ -95,13 +97,13 @@
 
 /// An object that can be used to visit Dart project structure.
 abstract class ProjectVisitor<T> {
-  T visit(DartProject project) => null;
+  T? visit(DartProject project) => null;
 }
 
 /// Captures the project's API as defined by pub package layout standards.
 class _ApiModel {
   final AnalysisDriver driver;
-  final List<Source> sources;
+  final List<Source>? sources;
   final Directory root;
   final Set<Element> elements = {};
 
@@ -110,7 +112,7 @@
   }
 
   /// Return `true` if this element is part of the public API for this package.
-  bool contains(Element element) {
+  bool contains(Element? element) {
     while (element != null) {
       if (!element.isPrivate && elements.contains(element)) {
         return true;
@@ -121,17 +123,17 @@
   }
 
   Future<void> _calculate() async {
-    if (sources == null || sources.isEmpty) {
+    if (sources == null || sources!.isEmpty) {
       return;
     }
 
     String libDir = root.path + '/lib';
     String libSrcDir = libDir + '/src';
 
-    for (Source source in sources) {
+    for (Source source in sources!) {
       String path = source.uri.path;
       if (path.startsWith(libDir) && !path.startsWith(libSrcDir)) {
-        ResolvedUnitResult result = await driver.getResult(source.fullName);
+        ResolvedUnitResult result = (await driver.getResult(source.fullName))!;
         LibraryElement library = result.libraryElement;
 
         NamespaceBuilder namespaceBuilder = NamespaceBuilder();
diff --git a/pkg/analyzer/lib/src/lint/pub.dart b/pkg/analyzer/lib/src/lint/pub.dart
index 9d5f459..db19bb6 100644
--- a/pkg/analyzer/lib/src/lint/pub.dart
+++ b/pkg/analyzer/lib/src/lint/pub.dart
@@ -10,8 +10,9 @@
 import 'package:source_span/source_span.dart';
 import 'package:yaml/yaml.dart';
 
-PSEntry _findEntry(YamlMap map, String key, ResourceProvider resourceProvider) {
-  PSEntry entry;
+PSEntry? _findEntry(
+    YamlMap map, String key, ResourceProvider? resourceProvider) {
+  PSEntry? entry;
   map.nodes.forEach((k, v) {
     if (k is YamlScalar && key == k.toString()) {
       entry = _processScalar(k, v, resourceProvider);
@@ -20,8 +21,8 @@
   return entry;
 }
 
-PSDependencyList _processDependencies(
-    YamlScalar key, YamlNode v, ResourceProvider resourceProvider) {
+PSDependencyList? _processDependencies(
+    YamlScalar key, YamlNode v, ResourceProvider? resourceProvider) {
   if (v is! YamlMap) {
     return null;
   }
@@ -34,8 +35,8 @@
   return deps;
 }
 
-PSGitRepo _processGitRepo(
-    YamlScalar key, YamlNode v, ResourceProvider resourceProvider) {
+PSGitRepo? _processGitRepo(
+    YamlScalar key, YamlNode v, ResourceProvider? resourceProvider) {
   if (v is! YamlMap) {
     return null;
   }
@@ -49,8 +50,8 @@
   return repo;
 }
 
-PSHost _processHost(
-    YamlScalar key, YamlNode v, ResourceProvider resourceProvider) {
+PSHost? _processHost(
+    YamlScalar key, YamlNode v, ResourceProvider? resourceProvider) {
   if (v is! YamlMap) {
     return null;
   }
@@ -64,8 +65,8 @@
   return host;
 }
 
-PSNodeList _processList(
-    YamlScalar key, YamlNode v, ResourceProvider resourceProvider) {
+PSNodeList? _processList(
+    YamlScalar key, YamlNode v, ResourceProvider? resourceProvider) {
   if (v is! YamlList) {
     return null;
   }
@@ -75,8 +76,8 @@
       nodeList.nodes.map((n) => _PSNode(n, resourceProvider)));
 }
 
-PSEntry _processScalar(
-    YamlScalar key, YamlNode value, ResourceProvider resourceProvider) {
+PSEntry? _processScalar(
+    YamlScalar key, YamlNode value, ResourceProvider? resourceProvider) {
   if (value is! YamlScalar) {
     return null;
     //WARN?
@@ -86,17 +87,17 @@
 }
 
 abstract class PSDependency {
-  PSGitRepo get git;
-  PSHost get host;
-  PSNode get name;
-  PSEntry get path;
-  PSEntry get version;
+  PSGitRepo? get git;
+  PSHost? get host;
+  PSNode? get name;
+  PSEntry? get path;
+  PSEntry? get version;
 }
 
 abstract class PSDependencyList with IterableMixin<PSDependency> {}
 
 class PSEntry {
-  final PSNode key;
+  final PSNode? key;
   final PSNode value;
   PSEntry(this.key, this.value);
 
@@ -105,21 +106,21 @@
 }
 
 abstract class PSGitRepo {
-  PSEntry get ref;
-  PSNode get token;
-  PSEntry get url;
+  PSEntry? get ref;
+  PSNode? get token;
+  PSEntry? get url;
 }
 
 abstract class PSHost {
-  PSEntry get name;
-  PSNode get token;
-  PSEntry get url;
+  PSEntry? get name;
+  PSNode? get token;
+  PSEntry? get url;
 }
 
 abstract class PSNode {
   Source get source;
   SourceSpan get span;
-  String get text;
+  String? get text;
 }
 
 abstract class PSNodeList with IterableMixin<PSNode> {
@@ -130,52 +131,52 @@
 
 abstract class Pubspec {
   factory Pubspec.parse(String source,
-          {Uri sourceUrl, ResourceProvider resourceProvider}) =>
+          {Uri? sourceUrl, ResourceProvider? resourceProvider}) =>
       _Pubspec(source,
           sourceUrl: sourceUrl, resourceProvider: resourceProvider);
-  PSEntry get author;
-  PSNodeList get authors;
-  PSDependencyList get dependencies;
-  PSDependencyList get dependencyOverrides;
-  PSEntry get description;
-  PSDependencyList get devDependencies;
-  PSEntry get documentation;
-  PSEntry get homepage;
-  PSEntry get name;
-  PSEntry get version;
+  PSEntry? get author;
+  PSNodeList? get authors;
+  PSDependencyList? get dependencies;
+  PSDependencyList? get dependencyOverrides;
+  PSEntry? get description;
+  PSDependencyList? get devDependencies;
+  PSEntry? get documentation;
+  PSEntry? get homepage;
+  PSEntry? get name;
+  PSEntry? get version;
   void accept(PubspecVisitor visitor);
 }
 
 abstract class PubspecVisitor<T> {
-  T visitPackageAuthor(PSEntry author) => null;
-  T visitPackageAuthors(PSNodeList authors) => null;
-  T visitPackageDependencies(PSDependencyList dependencies) => null;
-  T visitPackageDependency(PSDependency dependency) => null;
-  T visitPackageDependencyOverride(PSDependency dependency) => null;
-  T visitPackageDependencyOverrides(PSDependencyList dependencies) => null;
-  T visitPackageDescription(PSEntry description) => null;
-  T visitPackageDevDependencies(PSDependencyList dependencies) => null;
-  T visitPackageDevDependency(PSDependency dependency) => null;
-  T visitPackageDocumentation(PSEntry documentation) => null;
-  T visitPackageHomepage(PSEntry homepage) => null;
-  T visitPackageName(PSEntry name) => null;
-  T visitPackageVersion(PSEntry version) => null;
+  T? visitPackageAuthor(PSEntry author) => null;
+  T? visitPackageAuthors(PSNodeList authors) => null;
+  T? visitPackageDependencies(PSDependencyList dependencies) => null;
+  T? visitPackageDependency(PSDependency dependency) => null;
+  T? visitPackageDependencyOverride(PSDependency dependency) => null;
+  T? visitPackageDependencyOverrides(PSDependencyList dependencies) => null;
+  T? visitPackageDescription(PSEntry description) => null;
+  T? visitPackageDevDependencies(PSDependencyList dependencies) => null;
+  T? visitPackageDevDependency(PSDependency dependency) => null;
+  T? visitPackageDocumentation(PSEntry documentation) => null;
+  T? visitPackageHomepage(PSEntry homepage) => null;
+  T? visitPackageName(PSEntry name) => null;
+  T? visitPackageVersion(PSEntry version) => null;
 }
 
 class _PSDependency extends PSDependency {
   @override
-  PSNode name;
+  PSNode? name;
   @override
-  PSEntry path;
+  PSEntry? path;
   @override
-  PSEntry version;
+  PSEntry? version;
   @override
-  PSHost host;
+  PSHost? host;
   @override
-  PSGitRepo git;
+  PSGitRepo? git;
 
   factory _PSDependency(
-      YamlScalar key, YamlNode value, ResourceProvider resourceProvider) {
+      YamlScalar key, YamlNode value, ResourceProvider? resourceProvider) {
     _PSDependency dep = _PSDependency._();
 
     dep.name = _PSNode(key, resourceProvider);
@@ -223,7 +224,7 @@
     }
     var versionInfo = '';
     if (version != null) {
-      if (version.key == null) {
+      if (version!.key == null) {
         versionInfo = ' $version';
       } else {
         versionInfo = '\n    $version';
@@ -249,7 +250,7 @@
   @override
   Iterator<PSDependency> get iterator => dependencies.iterator;
 
-  void add(PSDependency dependency) {
+  void add(PSDependency? dependency) {
     if (dependency != null) {
       dependencies.add(dependency);
     }
@@ -261,11 +262,11 @@
 
 class _PSGitRepo implements PSGitRepo {
   @override
-  PSNode token;
+  PSNode? token;
   @override
-  PSEntry ref;
+  PSEntry? ref;
   @override
-  PSEntry url;
+  PSEntry? url;
   @override
   String toString() => '''
     $token:
@@ -275,11 +276,11 @@
 
 class _PSHost implements PSHost {
   @override
-  PSNode token;
+  PSNode? token;
   @override
-  PSEntry name;
+  PSEntry? name;
   @override
-  PSEntry url;
+  PSEntry? url;
   @override
   String toString() => '''
     $token:
@@ -289,11 +290,11 @@
 
 class _PSNode implements PSNode {
   @override
-  final String text;
+  final String? text;
   @override
   final SourceSpan span;
 
-  final ResourceProvider resourceProvider;
+  final ResourceProvider? resourceProvider;
 
   _PSNode(YamlNode node, this.resourceProvider)
       : text = node.value?.toString(),
@@ -301,8 +302,8 @@
 
   @override
   Source get source => (resourceProvider ?? PhysicalResourceProvider.INSTANCE)
-      .getFile(span.sourceUrl.toFilePath())
-      .createSource(span.sourceUrl);
+      .getFile(span.sourceUrl!.toFilePath())
+      .createSource(span.sourceUrl!);
 
   @override
   String toString() => '$text';
@@ -326,27 +327,27 @@
 
 class _Pubspec implements Pubspec {
   @override
-  PSEntry author;
+  PSEntry? author;
   @override
-  PSNodeList authors;
+  PSNodeList? authors;
   @override
-  PSEntry description;
+  PSEntry? description;
   @override
-  PSEntry documentation;
+  PSEntry? documentation;
   @override
-  PSEntry homepage;
+  PSEntry? homepage;
   @override
-  PSEntry name;
+  PSEntry? name;
   @override
-  PSEntry version;
+  PSEntry? version;
   @override
-  PSDependencyList dependencies;
+  PSDependencyList? dependencies;
   @override
-  PSDependencyList devDependencies;
+  PSDependencyList? devDependencies;
   @override
-  PSDependencyList dependencyOverrides;
+  PSDependencyList? dependencyOverrides;
 
-  _Pubspec(String src, {Uri sourceUrl, ResourceProvider resourceProvider}) {
+  _Pubspec(String src, {Uri? sourceUrl, ResourceProvider? resourceProvider}) {
     try {
       _parse(src, sourceUrl: sourceUrl, resourceProvider: resourceProvider);
     } on Exception {
@@ -357,37 +358,37 @@
   @override
   void accept(PubspecVisitor visitor) {
     if (author != null) {
-      visitor.visitPackageAuthor(author);
+      visitor.visitPackageAuthor(author!);
     }
     if (authors != null) {
-      visitor.visitPackageAuthors(authors);
+      visitor.visitPackageAuthors(authors!);
     }
     if (description != null) {
-      visitor.visitPackageDescription(description);
+      visitor.visitPackageDescription(description!);
     }
     if (documentation != null) {
-      visitor.visitPackageDocumentation(documentation);
+      visitor.visitPackageDocumentation(documentation!);
     }
     if (homepage != null) {
-      visitor.visitPackageHomepage(homepage);
+      visitor.visitPackageHomepage(homepage!);
     }
     if (name != null) {
-      visitor.visitPackageName(name);
+      visitor.visitPackageName(name!);
     }
     if (version != null) {
-      visitor.visitPackageVersion(version);
+      visitor.visitPackageVersion(version!);
     }
     if (dependencies != null) {
-      visitor.visitPackageDependencies(dependencies);
-      dependencies.forEach(visitor.visitPackageDependency);
+      visitor.visitPackageDependencies(dependencies!);
+      dependencies!.forEach(visitor.visitPackageDependency);
     }
     if (devDependencies != null) {
-      visitor.visitPackageDevDependencies(devDependencies);
-      devDependencies.forEach(visitor.visitPackageDevDependency);
+      visitor.visitPackageDevDependencies(devDependencies!);
+      devDependencies!.forEach(visitor.visitPackageDevDependency);
     }
     if (dependencyOverrides != null) {
-      visitor.visitPackageDependencyOverrides(dependencyOverrides);
-      dependencyOverrides.forEach(visitor.visitPackageDependencyOverride);
+      visitor.visitPackageDependencyOverrides(dependencyOverrides!);
+      dependencyOverrides!.forEach(visitor.visitPackageDependencyOverride);
     }
   }
 
@@ -406,7 +407,8 @@
     return sb.toString();
   }
 
-  void _parse(String src, {Uri sourceUrl, ResourceProvider resourceProvider}) {
+  void _parse(String src,
+      {Uri? sourceUrl, ResourceProvider? resourceProvider}) {
     var yaml = loadYamlNode(src, sourceUrl: sourceUrl);
     if (yaml is! YamlMap) {
       return;
@@ -457,7 +459,7 @@
   StringBuffer buffer = StringBuffer();
   @override
   String toString() => buffer.toString();
-  void writelin(Object value) {
+  void writelin(Object? value) {
     if (value != null) {
       buffer.writeln(value);
     }
diff --git a/pkg/analyzer/lib/src/lint/registry.dart b/pkg/analyzer/lib/src/lint/registry.dart
index b1c2ccd..25f5c78 100644
--- a/pkg/analyzer/lib/src/lint/registry.dart
+++ b/pkg/analyzer/lib/src/lint/registry.dart
@@ -26,10 +26,10 @@
   Iterable<LintRule> get rules => _ruleMap.values;
 
   /// Return the lint rule with the given [name].
-  LintRule operator [](String name) => _ruleMap[name];
+  LintRule? operator [](String name) => _ruleMap[name];
 
   /// Return the lint code that has the given [uniqueName].
-  LintCode codeForUniqueName(String uniqueName) => _codeMap[uniqueName];
+  LintCode? codeForUniqueName(String uniqueName) => _codeMap[uniqueName];
 
   /// Return a list of the lint rules explicitly enabled by the given [config].
   ///
@@ -43,7 +43,7 @@
       .where((rule) => config.ruleConfigs.any((rc) => rc.enables(rule.name)));
 
   /// Return the lint rule with the given [name].
-  LintRule getRule(String name) => _ruleMap[name];
+  LintRule? getRule(String name) => _ruleMap[name];
 
   /// Add the given lint [rule] to this registry.
   void register(LintRule rule) {
diff --git a/pkg/analyzer/lib/src/lint/util.dart b/pkg/analyzer/lib/src/lint/util.dart
index c8af831..a0c25dc 100644
--- a/pkg/analyzer/lib/src/lint/util.dart
+++ b/pkg/analyzer/lib/src/lint/util.dart
@@ -28,7 +28,7 @@
 /// Create a library name prefix based on [libraryPath], [projectRoot] and
 /// current [packageName].
 String createLibraryNamePrefix(
-    {String libraryPath, String projectRoot, String packageName}) {
+    {required String libraryPath, String? projectRoot, String? packageName}) {
   // Use the posix context to canonicalize separators (`\`).
   var libraryDirectory = path.posix.dirname(libraryPath);
   var relativePath = path.posix.relative(libraryDirectory, from: projectRoot);
@@ -86,7 +86,7 @@
   final IOSink sink;
   FeatureSet featureSet;
 
-  Spelunker(this.path, {IOSink sink, FeatureSet featureSet})
+  Spelunker(this.path, {IOSink? sink, FeatureSet? featureSet})
       : sink = sink ?? stdout,
         featureSet = featureSet ?? FeatureSet.latestLanguageVersion();
 
@@ -118,7 +118,7 @@
     var comment = token.precedingComments;
     while (comment is CommentToken) {
       comments.add(comment);
-      comment = comment.next;
+      comment = comment.next as CommentToken?;
     }
     return comments;
   }
diff --git a/pkg/analyzer/lib/src/manifest/manifest_validator.dart b/pkg/analyzer/lib/src/manifest/manifest_validator.dart
index 65ac833..3b9650a 100644
--- a/pkg/analyzer/lib/src/manifest/manifest_validator.dart
+++ b/pkg/analyzer/lib/src/manifest/manifest_validator.dart
@@ -5,6 +5,7 @@
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:collection/collection.dart';
 import 'package:meta/meta.dart';
 import 'package:source_span/source_span.dart';
 
@@ -118,7 +119,7 @@
   bool _isRelevantElement(String name) => _relevantElements.contains(name);
 
   /// Parses any whitespace, returning `null` when non-whitespace is parsed.
-  ParseResult _parseAnyWhitespace() {
+  ParseResult? _parseAnyWhitespace() {
     if (_pos >= content.length) {
       return ParseResult.error;
     }
@@ -172,7 +173,7 @@
 
       // Parse attribute name.
       var attributeNamePos = _pos;
-      String attributeName;
+      late String attributeName;
       _pos++;
       if (_pos >= content.length) {
         return ParseAttributeResult.error;
@@ -292,7 +293,7 @@
 
     // Parse name.
     var namePos = _pos;
-    String name;
+    late String name;
 
     while (!_isClosing && !_isTwoCharClosing && !_isWhitespace) {
       _pos++;
@@ -340,7 +341,7 @@
       if (parseResult == ParseResult.error) {
         return ParseTagResult.error;
       }
-      attributes = attributeResult.attributes;
+      attributes = attributeResult.attributes!;
       isEmptyElement =
           parseResult == ParseResult.attributesWithEmptyElementClose;
     } else {
@@ -365,7 +366,7 @@
           // Don't store an irrelevant element.
           continue;
         }
-        children.add(child.element);
+        children.add(child.element!);
         _pos++;
       }
     }
@@ -420,7 +421,7 @@
       }
     }
 
-    var manifestElement = parseTagResult.element;
+    var manifestElement = parseTagResult.element!;
     var features =
         manifestElement.children.where((e) => e.name == USES_FEATURE_TAG);
     var permissions =
@@ -430,7 +431,7 @@
     _validatePermissions(permissions, features, reporter);
 
     var application = manifestElement.children
-        .firstWhere((e) => e.name == APPLICATION_TAG, orElse: () => null);
+        .firstWhereOrNull((e) => e.name == APPLICATION_TAG);
     if (application != null) {
       for (var activity
           in application.children.where((e) => e.name == ACTIVITY_TAG)) {
@@ -448,11 +449,11 @@
           HARDWARE_FEATURE_CAMERA_AUTOFOCUS);
 
   /// Report an error for the given node.
-  void _reportErrorForNode(
-      ErrorReporter reporter, _XmlElement node, String key, ErrorCode errorCode,
-      [List<Object> arguments]) {
-    FileSpan span =
-        key == null ? node.sourceSpan : node.attributes[key].sourceSpan;
+  void _reportErrorForNode(ErrorReporter reporter, _XmlElement node,
+      String? key, ErrorCode errorCode,
+      [List<Object?>? arguments]) {
+    var span =
+        key == null ? node.sourceSpan! : node.attributes[key]!.sourceSpan;
     reporter.reportErrorForOffset(
         errorCode, span.start.offset, span.length, arguments);
   }
@@ -528,11 +529,9 @@
   /// Validate the presence/absence of the touchscreen feature tag.
   void _validateTouchScreenFeature(Iterable<_XmlElement> features,
       _XmlElement manifest, ErrorReporter reporter) {
-    var feature = features.firstWhere(
-        (element) =>
-            element.attributes[ANDROID_NAME]?.value ==
-            HARDWARE_FEATURE_TOUCHSCREEN,
-        orElse: () => null);
+    var feature = features.firstWhereOrNull((element) =>
+        element.attributes[ANDROID_NAME]?.value ==
+        HARDWARE_FEATURE_TOUCHSCREEN);
     if (feature != null) {
       if (!feature.attributes.containsKey(ANDROID_REQUIRED)) {
         _reportErrorForNode(
@@ -563,7 +562,7 @@
 
   final ParseResult parseResult;
 
-  final Map<String, _XmlAttribute> attributes;
+  final Map<String, _XmlAttribute>? attributes;
 
   ParseAttributeResult(this.parseResult, this.attributes);
 }
@@ -595,7 +594,7 @@
 
   final ParseResult parseResult;
 
-  final _XmlElement element;
+  final _XmlElement? element;
 
   ParseTagResult(this.parseResult, this.element);
 }
@@ -622,7 +621,7 @@
   final String name;
   final Map<String, _XmlAttribute> attributes;
   final List<_XmlElement> children;
-  final SourceSpan sourceSpan;
+  final SourceSpan? sourceSpan;
 
   _XmlElement(this.name, this.attributes, this.children, this.sourceSpan);
 }
diff --git a/pkg/analyzer/lib/src/manifest/manifest_values.dart b/pkg/analyzer/lib/src/manifest/manifest_values.dart
index f3f8b7a..141ceaf 100644
--- a/pkg/analyzer/lib/src/manifest/manifest_values.dart
+++ b/pkg/analyzer/lib/src/manifest/manifest_values.dart
@@ -95,7 +95,7 @@
 
 const String USES_PERMISSION_TAG = 'uses-permission';
 
-String getImpliedUnsupportedHardware(String permission) {
+String? getImpliedUnsupportedHardware(String? permission) {
   switch (permission) {
     case ANDROID_PERMISSION_CAMERA:
       return HARDWARE_FEATURE_CAMERA;
diff --git a/pkg/analyzer/lib/src/manifest/manifest_warning_code.dart b/pkg/analyzer/lib/src/manifest/manifest_warning_code.dart
index 1d2955b..cd3116d 100644
--- a/pkg/analyzer/lib/src/manifest/manifest_warning_code.dart
+++ b/pkg/analyzer/lib/src/manifest/manifest_warning_code.dart
@@ -80,7 +80,7 @@
 
   /// Initialize a newly created warning code to have the given [name],
   /// [message] and [correction].
-  const ManifestWarningCode(String name, String message, {String correction})
+  const ManifestWarningCode(String name, String message, {String? correction})
       : super(
           correction: correction,
           message: message,
diff --git a/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart b/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart
index b47fb44..0fbbd70 100644
--- a/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart
+++ b/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart
@@ -84,7 +84,7 @@
       return true;
     }
     String fileName = assetFile.shortName;
-    Folder assetFolder = assetFile.parent;
+    Folder assetFolder = assetFile.parent!;
     if (!assetFolder.exists) {
       return false;
     }
@@ -99,7 +99,7 @@
     return false;
   }
 
-  String _asString(dynamic node) {
+  String? _asString(dynamic node) {
     if (node is String) {
       return node;
     }
@@ -114,7 +114,7 @@
   /// from the given [contents] using the given [key].
   Map<dynamic, YamlNode> _getDeclaredDependencies(
       ErrorReporter reporter, Map<dynamic, YamlNode> contents, String key) {
-    YamlNode field = contents[key];
+    var field = contents[key];
     if (field == null || (field is YamlScalar && field.value == null)) {
       return <String, YamlNode>{};
     } else if (field is YamlMap) {
@@ -128,7 +128,7 @@
   /// Report an error for the given node.
   void _reportErrorForNode(
       ErrorReporter reporter, YamlNode node, ErrorCode errorCode,
-      [List<Object> arguments]) {
+      [List<Object>? arguments]) {
     SourceSpan span = node.span;
     reporter.reportErrorForOffset(
         errorCode, span.start.offset, span.length, arguments);
@@ -168,9 +168,9 @@
   /// Validate the value of the optional `flutter` field.
   void _validateFlutter(
       ErrorReporter reporter, Map<dynamic, YamlNode> contents) {
-    YamlNode flutterField = contents[FLUTTER_FIELD];
+    var flutterField = contents[FLUTTER_FIELD];
     if (flutterField is YamlMap) {
-      YamlNode assetsField = flutterField.nodes[ASSETS_FIELD];
+      var assetsField = flutterField.nodes[ASSETS_FIELD];
       if (assetsField is YamlList) {
         path.Context context = provider.pathContext;
         String packageRoot = context.dirname(source.fullName);
@@ -224,7 +224,7 @@
 
   /// Validate the value of the required `name` field.
   void _validateName(ErrorReporter reporter, Map<dynamic, YamlNode> contents) {
-    YamlNode nameField = contents[NAME_FIELD];
+    var nameField = contents[NAME_FIELD];
     if (nameField == null) {
       reporter.reportErrorForOffset(PubspecWarningCode.MISSING_NAME, 0, 0);
     } else if (nameField is! YamlScalar || nameField.value is! String) {
@@ -247,8 +247,8 @@
     if (dependency is YamlMap) {
       var pathEntry = _asString(dependency[PATH_FIELD]);
       if (pathEntry != null) {
-        YamlNode pathKey() => getKey(dependency, PATH_FIELD);
-        YamlNode pathValue() => getValue(dependency, PATH_FIELD);
+        YamlNode pathKey() => getKey(dependency, PATH_FIELD)!;
+        YamlNode pathValue() => getValue(dependency, PATH_FIELD)!;
 
         if (pathEntry.contains(r'\')) {
           _reportErrorForNode(reporter, pathValue(),
@@ -281,7 +281,7 @@
 
       var gitEntry = dependency[GIT_FIELD];
       if (gitEntry != null && checkForPathAndGitDeps) {
-        _reportErrorForNode(reporter, getKey(dependency, GIT_FIELD),
+        _reportErrorForNode(reporter, getKey(dependency, GIT_FIELD)!,
             PubspecWarningCode.INVALID_DEPENDENCY, [GIT_FIELD]);
       }
     }
diff --git a/pkg/analyzer/lib/src/pubspec/pubspec_warning_code.dart b/pkg/analyzer/lib/src/pubspec/pubspec_warning_code.dart
index 9fb2b1c..0c03a1f 100644
--- a/pkg/analyzer/lib/src/pubspec/pubspec_warning_code.dart
+++ b/pkg/analyzer/lib/src/pubspec/pubspec_warning_code.dart
@@ -116,7 +116,7 @@
 
   /// Initialize a newly created warning code to have the given [name],
   /// [message] and [correction].
-  const PubspecWarningCode(String name, String message, {String correction})
+  const PubspecWarningCode(String name, String message, {String? correction})
       : super(
           correction: correction,
           message: message,
diff --git a/pkg/analyzer/lib/src/services/available_declarations.dart b/pkg/analyzer/lib/src/services/available_declarations.dart
index 5e82627..b2e9a99 100644
--- a/pkg/analyzer/lib/src/services/available_declarations.dart
+++ b/pkg/analyzer/lib/src/services/available_declarations.dart
@@ -25,6 +25,7 @@
 import 'package:analyzer/src/summary/link.dart' as graph
     show DependencyWalker, Node;
 import 'package:analyzer/src/util/comment.dart';
+import 'package:collection/collection.dart';
 import 'package:convert/convert.dart';
 import 'package:meta/meta.dart';
 import 'package:yaml/yaml.dart';
@@ -34,10 +35,10 @@
   final List<Declaration> children;
   final int codeLength;
   final int codeOffset;
-  final String defaultArgumentListString;
-  final List<int> defaultArgumentListTextRanges;
-  final String docComplete;
-  final String docSummary;
+  final String? defaultArgumentListString;
+  final List<int>? defaultArgumentListTextRanges;
+  final String? docComplete;
+  final String? docSummary;
   final bool isAbstract;
   final bool isConst;
   final bool isDeprecated;
@@ -50,49 +51,49 @@
   final int locationStartColumn;
   final int locationStartLine;
   final String name;
-  final String parameters;
-  final List<String> parameterNames;
-  final List<String> parameterTypes;
-  final Declaration parent;
-  final int requiredParameterCount;
-  final String returnType;
-  final String typeParameters;
+  final String? parameters;
+  final List<String>? parameterNames;
+  final List<String>? parameterTypes;
+  final Declaration? parent;
+  final int? requiredParameterCount;
+  final String? returnType;
+  final String? typeParameters;
 
   final List<String> _relevanceTagsInFile;
   List<String> _relevanceTagsInLibrary = const [];
-  Uri _locationLibraryUri;
+  Uri? _locationLibraryUri;
 
   Declaration({
-    @required this.children,
-    @required this.codeLength,
-    @required this.codeOffset,
-    @required this.defaultArgumentListString,
-    @required this.defaultArgumentListTextRanges,
-    @required this.docComplete,
-    @required this.docSummary,
-    @required this.isAbstract,
-    @required this.isConst,
-    @required this.isDeprecated,
-    @required this.isFinal,
-    @required this.isStatic,
-    @required this.kind,
-    @required this.lineInfo,
-    @required this.locationOffset,
-    @required this.locationPath,
-    @required this.locationStartColumn,
-    @required this.locationStartLine,
-    @required this.name,
-    @required this.parameters,
-    @required this.parameterNames,
-    @required this.parameterTypes,
-    @required this.parent,
-    @required List<String> relevanceTagsInFile,
-    @required this.requiredParameterCount,
-    @required this.returnType,
-    @required this.typeParameters,
+    required this.children,
+    required this.codeLength,
+    required this.codeOffset,
+    required this.defaultArgumentListString,
+    required this.defaultArgumentListTextRanges,
+    required this.docComplete,
+    required this.docSummary,
+    required this.isAbstract,
+    required this.isConst,
+    required this.isDeprecated,
+    required this.isFinal,
+    required this.isStatic,
+    required this.kind,
+    required this.lineInfo,
+    required this.locationOffset,
+    required this.locationPath,
+    required this.locationStartColumn,
+    required this.locationStartLine,
+    required this.name,
+    required this.parameters,
+    required this.parameterNames,
+    required this.parameterTypes,
+    required this.parent,
+    required List<String> relevanceTagsInFile,
+    required this.requiredParameterCount,
+    required this.returnType,
+    required this.typeParameters,
   }) : _relevanceTagsInFile = relevanceTagsInFile;
 
-  Uri get locationLibraryUri => _locationLibraryUri;
+  Uri? get locationLibraryUri => _locationLibraryUri;
 
   List<String> get relevanceTags => [
         ..._relevanceTagsInFile,
@@ -197,7 +198,7 @@
     var dependencyLibraries = <Library>[];
     for (var pathPrefix in _pathPrefixToDependencyPathList.keys) {
       if (path.startsWith(pathPrefix)) {
-        var pathList = _pathPrefixToDependencyPathList[pathPrefix];
+        var pathList = _pathPrefixToDependencyPathList[pathPrefix]!;
         _addLibrariesWithPaths(dependencyLibraries, pathList);
         break;
       }
@@ -209,7 +210,7 @@
 
     var contextPathList = <String>[];
     if (!_analysisContext.workspace.isBazel) {
-      _Package package;
+      _Package? package;
       for (var candidatePackage in _packages) {
         if (candidatePackage.contains(path)) {
           package = candidatePackage;
@@ -279,7 +280,7 @@
     for (var pathPrefix in sortedPrefixes) {
       var pathList = pathPrefixToPathList[pathPrefix];
       var files = <String>[];
-      for (var path in pathList) {
+      for (var path in pathList!) {
         var resource = _tracker._resourceProvider.getResource(path);
         _scheduleDependencyResource(files, resource);
       }
@@ -314,7 +315,7 @@
   }
 
   void _addLibrariesWithPaths(List<Library> libraries, List<String> pathList,
-      {String excludingLibraryOfPath}) {
+      {String? excludingLibraryOfPath}) {
     var excludedFile = _tracker._pathToFile[excludingLibraryOfPath];
     var excludedLibraryPath = (excludedFile?.library ?? excludedFile)?.path;
 
@@ -391,11 +392,11 @@
   List<String> _resolvePackageNamesToLibPaths(List<String> packageNames) {
     return packageNames
         .map(_resolvePackageNameToLibPath)
-        .where((path) => path != null)
+        .whereNotNull()
         .toList();
   }
 
-  String _resolvePackageNameToLibPath(String packageName) {
+  String? _resolvePackageNameToLibPath(String packageName) {
     try {
       var uri = Uri.parse('package:$packageName/ref.dart');
 
@@ -408,12 +409,12 @@
     }
   }
 
-  String _resolveUri(Uri uri) {
+  String? _resolveUri(Uri uri) {
     var uriConverter = _analysisContext.currentSession.uriConverter;
     return uriConverter.uriToPath(uri);
   }
 
-  Uri _restoreUri(String path) {
+  Uri? _restoreUri(String path) {
     var uriConverter = _analysisContext.currentSession.uriConverter;
     return uriConverter.pathToUri(path);
   }
@@ -456,7 +457,7 @@
   }
 
   void _scheduleSdkLibraries() {
-    var sdk = _analysisDriver.sourceFactory.dartSdk;
+    var sdk = _analysisDriver.sourceFactory.dartSdk!;
     for (var uriStr in sdk.uris) {
       if (!uriStr.startsWith('dart:_')) {
         var uri = Uri.parse(uriStr);
@@ -602,7 +603,7 @@
 
     if (_scheduledFiles.isNotEmpty) {
       var scheduledFile = _scheduledFiles.removeLast();
-      var file = _getFileByPath(scheduledFile.context, scheduledFile.path);
+      var file = _getFileByPath(scheduledFile.context, scheduledFile.path)!;
 
       if (!file.isLibrary) return;
 
@@ -633,12 +634,12 @@
 
   /// Return the context associated with the given [analysisContext], or `null`
   /// if there is none.
-  DeclarationsContext getContext(AnalysisContext analysisContext) {
+  DeclarationsContext? getContext(AnalysisContext analysisContext) {
     return _contexts[analysisContext];
   }
 
   /// Return the library with the given [id], or `null` if there is none.
-  Library getLibrary(int id) {
+  Library? getLibrary(int id) {
     return _idToLibrary[id];
   }
 
@@ -670,7 +671,7 @@
     }
   }
 
-  DeclarationsContext _findContextOfPath(String path) {
+  DeclarationsContext? _findContextOfPath(String path) {
     // Prefer the context in which the path is analyzed.
     for (var context in _contexts.values) {
       if (context._analysisContext.contextRoot.isAnalyzed(path)) {
@@ -692,7 +693,7 @@
     return null;
   }
 
-  _File _getFileByPath(DeclarationsContext context, String path) {
+  _File? _getFileByPath(DeclarationsContext context, String path) {
     var file = _pathToFile[path];
     if (file == null) {
       var uri = context._restoreUri(path);
@@ -706,7 +707,7 @@
     return file;
   }
 
-  _File _getFileByUri(DeclarationsContext context, Uri uri) {
+  _File? _getFileByUri(DeclarationsContext context, Uri uri) {
     var file = _uriToFile[uri];
     if (file != null) {
       return file;
@@ -728,7 +729,7 @@
       return file;
     }
 
-    file = _File(this, path, uri);
+    file = _File(this, path!, uri);
     _pathToFile[path] = file;
     _uriToFile[uri] = file;
 
@@ -815,7 +816,7 @@
   /// Return the [path] with resolved file system links.
   String _resolveLinks(String path) {
     var resource = _resourceProvider.getFile(path);
-    resource = resource.resolveSymbolicLinksSync();
+    resource = resource.resolveSymbolicLinksSync() as File;
     return resource.path;
   }
 }
@@ -871,7 +872,7 @@
 }
 
 class RelevanceTags {
-  static List<String> _forDeclaration(String uriStr, Declaration declaration) {
+  static List<String>? _forDeclaration(String uriStr, Declaration declaration) {
     switch (declaration.kind) {
       case DeclarationKind.CLASS:
       case DeclarationKind.CLASS_TYPE_ALIAS:
@@ -881,17 +882,17 @@
         var name = declaration.name;
         return <String>['$uriStr::$name'];
       case DeclarationKind.CONSTRUCTOR:
-        var className = declaration.parent.name;
+        var className = declaration.parent!.name;
         return <String>['$uriStr::$className'];
       case DeclarationKind.ENUM_CONSTANT:
-        var enumName = declaration.parent.name;
+        var enumName = declaration.parent!.name;
         return <String>['$uriStr::$enumName'];
       default:
         return null;
     }
   }
 
-  static List<String> _forExpression(Expression expression) {
+  static List<String>? _forExpression(Expression? expression) {
     if (expression is BooleanLiteral) {
       return const ['dart:core::bool'];
     } else if (expression is DoubleLiteral) {
@@ -920,8 +921,8 @@
   static const fieldReturnTypeMask = 1 << 2;
   static const fieldTypeParametersMask = 1 << 3;
 
-  static Declaration fromIdl(String path, LineInfo lineInfo, Declaration parent,
-      idl.AvailableDeclaration d) {
+  static Declaration fromIdl(String path, LineInfo lineInfo,
+      Declaration? parent, idl.AvailableDeclaration d) {
     var fieldMask = d.fieldMask;
     var hasDoc = fieldMask & fieldDocMask != 0;
     var hasParameters = fieldMask & fieldParametersMask != 0;
@@ -1102,7 +1103,7 @@
   final Uri uri;
   final List<_ExportCombinator> combinators;
 
-  _File file;
+  _File? file;
 
   _Export(this.uri, this.combinators);
 
@@ -1143,22 +1144,22 @@
   final Uri uri;
 
   bool exists = false;
-  List<int> lineStarts;
-  LineInfo lineInfo;
+  late List<int> lineStarts;
+  late LineInfo lineInfo;
   bool isLibrary = false;
   bool isLibraryDeprecated = false;
   List<_Export> exports = [];
   List<_Part> parts = [];
 
   /// If this file is a part, the containing library.
-  _File library;
+  _File? library;
 
   /// If this file is a library, libraries that export it.
   List<_File> directExporters = [];
 
   List<Declaration> fileDeclarations = [];
-  List<Declaration> libraryDeclarations = [];
-  List<Declaration> exportedDeclarations;
+  List<Declaration>? libraryDeclarations = [];
+  List<Declaration>? exportedDeclarations;
 
   List<String> templateNames = [];
   List<String> templateValues = [];
@@ -1195,8 +1196,8 @@
     // With Bazel multiple workspaces might be copies of the same workspace,
     // and have files with the same content, but with different paths.
     // So, we use the content hash to reuse their declarations without parsing.
-    String content;
-    String contentKey;
+    String? content;
+    String? contentKey;
     {
       var contentHashBytes = tracker._byteStore.get(pathKey);
       if (contentHashBytes == null) {
@@ -1241,30 +1242,39 @@
 
     // Set back pointers.
     for (var export in exports) {
-      var directExporters = export.file.directExporters;
-      if (!directExporters.contains(this)) {
-        directExporters.add(this);
+      var file = export.file;
+      if (file != null) {
+        var directExporters = file.directExporters;
+        if (!directExporters.contains(this)) {
+          directExporters.add(this);
+        }
       }
     }
     for (var part in parts) {
-      part.file.library = this;
-      part.file.isLibrary = false;
+      var file = part.file;
+      if (file != null) {
+        file.library = this;
+        file.isLibrary = false;
+      }
     }
 
     // Compute library declarations.
     if (isLibrary) {
       libraryDeclarations = <Declaration>[];
-      libraryDeclarations.addAll(fileDeclarations);
+      libraryDeclarations!.addAll(fileDeclarations);
       for (var part in parts) {
-        libraryDeclarations.addAll(part.file.fileDeclarations);
+        var file = part.file;
+        if (file != null) {
+          libraryDeclarations!.addAll(file.fileDeclarations);
+        }
       }
-      _computeRelevanceTags(libraryDeclarations);
+      _computeRelevanceTags(libraryDeclarations!);
       _setLocationLibraryUri();
     }
   }
 
   void _buildFileDeclarations(CompilationUnit unit) {
-    lineInfo = unit.lineInfo;
+    lineInfo = unit.lineInfo!;
     lineStarts = lineInfo.lineStarts;
 
     isLibrary = true;
@@ -1315,7 +1325,7 @@
       if (node is VariableDeclaration) {
         var variables = node.parent as VariableDeclarationList;
         var i = variables.variables.indexOf(node);
-        codeOffset = (i == 0 ? variables.parent : node).offset;
+        codeOffset = (i == 0 ? variables.parent! : node).offset;
         codeLength = node.end - codeOffset;
       } else {
         codeOffset = node.offset;
@@ -1323,8 +1333,8 @@
       }
     }
 
-    String docComplete;
-    String docSummary;
+    String? docComplete;
+    String? docSummary;
 
     void setDartDoc(AnnotatedNode node) {
       if (node.documentationComment != null) {
@@ -1337,24 +1347,24 @@
       }
     }
 
-    Declaration addDeclaration({
-      String defaultArgumentListString,
-      List<int> defaultArgumentListTextRanges,
+    Declaration? addDeclaration({
+      String? defaultArgumentListString,
+      List<int>? defaultArgumentListTextRanges,
       bool isAbstract = false,
       bool isConst = false,
       bool isDeprecated = false,
       bool isFinal = false,
       bool isStatic = false,
-      @required DeclarationKind kind,
-      @required Identifier name,
-      String parameters,
-      List<String> parameterNames,
-      List<String> parameterTypes,
-      Declaration parent,
-      @required List<String> relevanceTags,
-      int requiredParameterCount,
-      String returnType,
-      String typeParameters,
+      required DeclarationKind kind,
+      required Identifier name,
+      String? parameters,
+      List<String>? parameterNames,
+      List<String>? parameterTypes,
+      Declaration? parent,
+      required List<String> relevanceTags,
+      int? requiredParameterCount,
+      String? returnType,
+      String? typeParameters,
     }) {
       if (Identifier.isPrivateName(name.name)) {
         return null;
@@ -1489,7 +1499,7 @@
                 isStatic: isStatic,
                 kind: DeclarationKind.SETTER,
                 name: classMember.name,
-                parameters: parameters.toSource(),
+                parameters: parameters!.toSource(),
                 parameterNames: _getFormalParameterNames(parameters),
                 parameterTypes: _getFormalParameterTypes(parameters),
                 parent: parent,
@@ -1498,7 +1508,7 @@
                     _getFormalParameterRequiredCount(parameters),
               );
             } else {
-              var defaultArguments = _computeDefaultArguments(parameters);
+              var defaultArguments = _computeDefaultArguments(parameters!);
               addDeclaration(
                 defaultArgumentListString: defaultArguments?.text,
                 defaultArgumentListTextRanges: defaultArguments?.ranges,
@@ -1599,7 +1609,7 @@
           addDeclaration(
             isDeprecated: isDeprecated,
             kind: DeclarationKind.EXTENSION,
-            name: node.name,
+            name: node.name!,
             relevanceTags: ['ElementKind.EXTENSION'],
           );
         }
@@ -1621,7 +1631,7 @@
             isDeprecated: isDeprecated,
             kind: DeclarationKind.SETTER,
             name: node.name,
-            parameters: parameters.toSource(),
+            parameters: parameters!.toSource(),
             parameterNames: _getFormalParameterNames(parameters),
             parameterTypes: _getFormalParameterTypes(parameters),
             relevanceTags: ['ElementKind.FUNCTION'],
@@ -1629,7 +1639,7 @@
                 _getFormalParameterRequiredCount(parameters),
           );
         } else {
-          var defaultArguments = _computeDefaultArguments(parameters);
+          var defaultArguments = _computeDefaultArguments(parameters!);
           addDeclaration(
             defaultArgumentListString: defaultArguments?.text,
             defaultArgumentListTextRanges: defaultArguments?.ranges,
@@ -1720,28 +1730,28 @@
   void _extractDartdocInfoFromUnit(CompilationUnit unit) {
     DartdocDirectiveInfo info = DartdocDirectiveInfo();
     for (Directive directive in unit.directives) {
-      Comment comment = directive.documentationComment;
+      var comment = directive.documentationComment;
       if (comment != null) {
-        info.extractTemplate(getCommentNodeRawText(comment));
+        info.extractTemplate(getCommentNodeRawText(comment)!);
       }
     }
     for (CompilationUnitMember declaration in unit.declarations) {
-      Comment comment = declaration.documentationComment;
+      var comment = declaration.documentationComment;
       if (comment != null) {
-        info.extractTemplate(getCommentNodeRawText(comment));
+        info.extractTemplate(getCommentNodeRawText(comment)!);
       }
       if (declaration is ClassOrMixinDeclaration) {
         for (ClassMember member in declaration.members) {
-          Comment comment = member.documentationComment;
+          var comment = member.documentationComment;
           if (comment != null) {
-            info.extractTemplate(getCommentNodeRawText(comment));
+            info.extractTemplate(getCommentNodeRawText(comment)!);
           }
         }
       } else if (declaration is EnumDeclaration) {
         for (EnumConstantDeclaration constant in declaration.constants) {
-          Comment comment = constant.documentationComment;
+          var comment = constant.documentationComment;
           if (comment != null) {
-            info.extractTemplate(getCommentNodeRawText(comment));
+            info.extractTemplate(getCommentNodeRawText(comment)!);
           }
         }
       }
@@ -1749,12 +1759,12 @@
     Map<String, String> templateMap = info.templateMap;
     for (String name in templateMap.keys) {
       templateNames.add(name);
-      templateValues.add(templateMap[name]);
+      templateValues.add(templateMap[name]!);
     }
   }
 
   /// Return the [_File] for the given [relative] URI, maybe `null`.
-  _File _fileForRelativeUri(DeclarationsContext context, Uri relative) {
+  _File? _fileForRelativeUri(DeclarationsContext context, Uri relative) {
     var absoluteUri = resolveRelativeUri(uri, relative);
     return tracker._getFileByUri(context, absoluteUri);
   }
@@ -1811,17 +1821,17 @@
       return _DeclarationStorage.fromIdl(path, lineInfo, null, e);
     }).toList();
 
-    templateNames = idlFile.directiveInfo.templateNames.toList();
-    templateValues = idlFile.directiveInfo.templateValues.toList();
+    templateNames = idlFile.directiveInfo!.templateNames.toList();
+    templateValues = idlFile.directiveInfo!.templateValues.toList();
   }
 
   void _setLocationLibraryUri() {
-    for (var declaration in libraryDeclarations) {
+    for (var declaration in libraryDeclarations!) {
       declaration._locationLibraryUri = uri;
     }
   }
 
-  static _DefaultArguments _computeDefaultArguments(
+  static _DefaultArguments? _computeDefaultArguments(
       FormalParameterList parameters) {
     var buffer = StringBuffer();
     var ranges = <int>[];
@@ -1833,12 +1843,12 @@
         }
 
         if (parameter.isNamed) {
-          buffer.write(parameter.identifier.name);
+          buffer.write(parameter.identifier!.name);
           buffer.write(': ');
         }
 
         var valueOffset = buffer.length;
-        buffer.write(parameter.identifier.name);
+        buffer.write(parameter.identifier!.name);
         var valueLength = buffer.length - valueOffset;
         ranges.add(valueOffset);
         ranges.add(valueLength);
@@ -1848,7 +1858,8 @@
     return _DefaultArguments(buffer.toString(), ranges);
   }
 
-  static List<String> _getFormalParameterNames(FormalParameterList parameters) {
+  static List<String> _getFormalParameterNames(
+      FormalParameterList? parameters) {
     if (parameters == null) return const <String>[];
 
     var names = <String>[];
@@ -1859,7 +1870,8 @@
     return names;
   }
 
-  static int _getFormalParameterRequiredCount(FormalParameterList parameters) {
+  static int? _getFormalParameterRequiredCount(
+      FormalParameterList? parameters) {
     if (parameters == null) return null;
 
     return parameters.parameters
@@ -1878,7 +1890,8 @@
     return '';
   }
 
-  static List<String> _getFormalParameterTypes(FormalParameterList parameters) {
+  static List<String>? _getFormalParameterTypes(
+      FormalParameterList? parameters) {
     if (parameters == null) return null;
 
     var types = <String>[];
@@ -1889,7 +1902,7 @@
     return types;
   }
 
-  static String _getTypeAnnotationString(TypeAnnotation typeAnnotation) {
+  static String _getTypeAnnotationString(TypeAnnotation? typeAnnotation) {
     return typeAnnotation?.toSource() ?? '';
   }
 
@@ -1943,7 +1956,7 @@
     }
   }
 
-  static Uri _uriFromAst(StringLiteral astUri) {
+  static Uri? _uriFromAst(StringLiteral astUri) {
     if (astUri is SimpleStringLiteral) {
       var uriStr = astUri.value.trim();
       if (uriStr.isEmpty) return null;
@@ -1968,6 +1981,7 @@
   List<_LibraryNode> computeDependencies() {
     return file.exports
         .map((export) => export.file)
+        .whereNotNull()
         .where((file) => file.isLibrary)
         .map(walker.getNode)
         .toList();
@@ -1981,12 +1995,12 @@
   void evaluate(_LibraryNode node) {
     var file = node.file;
     var resultSet = _newDeclarationSet();
-    resultSet.addAll(file.libraryDeclarations);
+    resultSet.addAll(file.libraryDeclarations!);
 
     for (var export in file.exports) {
       var file = export.file;
-      if (file.isLibrary) {
-        var exportedDeclarations = file.exportedDeclarations;
+      if (file != null && file.isLibrary) {
+        var exportedDeclarations = file.exportedDeclarations!;
         resultSet.addAll(export.filter(exportedDeclarations));
       }
     }
@@ -2001,7 +2015,7 @@
 
       List<Declaration> computeExported(_File file) {
         if (file.exportedDeclarations != null) {
-          return file.exportedDeclarations;
+          return file.exportedDeclarations!;
         }
 
         if (!visitedFiles.add(file)) {
@@ -2009,11 +2023,14 @@
         }
 
         var resultSet = _newDeclarationSet();
-        resultSet.addAll(file.libraryDeclarations);
+        resultSet.addAll(file.libraryDeclarations!);
 
         for (var export in file.exports) {
-          var exportedDeclarations = computeExported(export.file);
-          resultSet.addAll(export.filter(exportedDeclarations));
+          var file = export.file;
+          if (file != null) {
+            var exportedDeclarations = computeExported(file);
+            resultSet.addAll(export.filter(exportedDeclarations));
+          }
         }
 
         return resultSet.toList();
@@ -2064,7 +2081,7 @@
   /// Return the direct child folder of the root, that contains the [path].
   ///
   /// So, we can know if the [path] is in `lib/`, or `test/`, or `bin/`.
-  Folder folderInRootContaining(String path) {
+  Folder? folderInRootContaining(String path) {
     try {
       var children = root.getChildren();
       for (var folder in children) {
@@ -2082,7 +2099,7 @@
 class _Part {
   final Uri uri;
 
-  _File file;
+  _File? file;
 
   _Part(this.uri);
 }
@@ -2105,7 +2122,7 @@
 /// Wrapper for a [StreamController] and its unique [Stream] instance.
 class _StreamController<T> {
   final StreamController<T> controller = StreamController<T>();
-  Stream<T> stream;
+  late final Stream<T> stream;
 
   _StreamController() {
     stream = controller.stream;
diff --git a/pkg/analyzer/lib/src/services/lint.dart b/pkg/analyzer/lib/src/services/lint.dart
index 495e345..49603d43 100644
--- a/pkg/analyzer/lib/src/services/lint.dart
+++ b/pkg/analyzer/lib/src/services/lint.dart
@@ -11,7 +11,7 @@
 import 'package:analyzer/src/lint/linter.dart';
 
 /// Current linter version.
-String linterVersion;
+String? linterVersion;
 
 /// Shared lint registry.
 LintRegistry lintRegistry = LintRegistry();
@@ -33,10 +33,10 @@
 abstract class Linter implements NodeLintRule {
   /// Used to report lint warnings.
   /// NOTE: this is set by the framework before visit begins.
-  ErrorReporter reporter;
+  late ErrorReporter reporter;
 
   /// Return the lint code associated with this linter.
-  LintCode get lintCode => null;
+  LintCode? get lintCode => null;
 
   /// Return the lint codes associated with this lint rule.
   List<LintCode> get lintCodes {
@@ -54,7 +54,7 @@
   /// analysis.
   /// Lint errors are reported via this [Linter]'s error [reporter].
   @Deprecated('Use registerNodeProcessors() instead.')
-  AstVisitor getVisitor();
+  AstVisitor? getVisitor();
 
   @override
   void registerNodeProcessors(
diff --git a/pkg/analyzer/lib/src/source/custom_resolver.dart b/pkg/analyzer/lib/src/source/custom_resolver.dart
index c16ba84..f96fdc3 100644
--- a/pkg/analyzer/lib/src/source/custom_resolver.dart
+++ b/pkg/analyzer/lib/src/source/custom_resolver.dart
@@ -13,8 +13,8 @@
   CustomUriResolver(this.resourceProvider, this._urlMappings);
 
   @override
-  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
-    String mapping = _urlMappings[uri.toString()];
+  Source? resolveAbsolute(Uri uri, [Uri? actualUri]) {
+    var mapping = _urlMappings[uri.toString()];
     if (mapping == null) {
       return null;
     }
diff --git a/pkg/analyzer/lib/src/source/package_map_resolver.dart b/pkg/analyzer/lib/src/source/package_map_resolver.dart
index 43d8ba4..6ac9fa4 100644
--- a/pkg/analyzer/lib/src/source/package_map_resolver.dart
+++ b/pkg/analyzer/lib/src/source/package_map_resolver.dart
@@ -39,7 +39,7 @@
   }
 
   @override
-  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
+  Source? resolveAbsolute(Uri uri, [Uri? actualUri]) {
     if (!isPackageUri(uri)) {
       return null;
     }
@@ -53,7 +53,7 @@
     String pkgName = pathSegments[0];
 
     // If the package is known, return the corresponding file.
-    List<Folder> packageDirs = packageMap[pkgName];
+    var packageDirs = packageMap[pkgName];
     if (packageDirs != null) {
       Folder packageDir = packageDirs.single;
       String relPath = pathSegments.skip(1).join('/');
@@ -64,11 +64,11 @@
   }
 
   @override
-  Uri restoreAbsolute(Source source) {
+  Uri? restoreAbsolute(Source source) {
     String sourcePath = source.fullName;
     pathos.Context pathContext = resourceProvider.pathContext;
     for (String pkgName in packageMap.keys) {
-      Folder pkgFolder = packageMap[pkgName][0];
+      Folder pkgFolder = packageMap[pkgName]![0];
       String pkgFolderPath = pkgFolder.path;
       if (sourcePath.startsWith(pkgFolderPath + pathContext.separator)) {
         String relPath = sourcePath.substring(pkgFolderPath.length + 1);
diff --git a/pkg/analyzer/lib/src/source/path_filter.dart b/pkg/analyzer/lib/src/source/path_filter.dart
index 62a490a..2851509 100644
--- a/pkg/analyzer/lib/src/source/path_filter.dart
+++ b/pkg/analyzer/lib/src/source/path_filter.dart
@@ -19,7 +19,8 @@
 
   /// Construct a new path filter rooted at [root] with [ignorePatterns].
   /// If [pathContext] is not specified, then the system path context is used.
-  PathFilter(this.root, List<String> ignorePatterns, [path.Context pathContext])
+  PathFilter(this.root, List<String> ignorePatterns,
+      [path.Context? pathContext])
       : pathContext = pathContext ?? path.context {
     setIgnorePatterns(ignorePatterns);
   }
@@ -33,7 +34,7 @@
   }
 
   /// Set the ignore patterns.
-  void setIgnorePatterns(List<String> ignorePatterns) {
+  void setIgnorePatterns(List<String>? ignorePatterns) {
     _ignorePatterns.clear();
     if (ignorePatterns != null) {
       for (var ignorePattern in ignorePatterns) {
diff --git a/pkg/analyzer/lib/src/source/source_resource.dart b/pkg/analyzer/lib/src/source/source_resource.dart
index d835a11..e9d258a 100644
--- a/pkg/analyzer/lib/src/source/source_resource.dart
+++ b/pkg/analyzer/lib/src/source/source_resource.dart
@@ -36,15 +36,15 @@
   final File file;
 
   /// The cached absolute path of this source.
-  String _absolutePath;
+  String? _absolutePath;
 
   /// The cached encoding for this source.
-  String _encoding;
+  String? _encoding;
 
   /// Initialize a newly created source object to represent the given [file]. If
   /// a [uri] is given, then it will be used as the URI from which the source
   /// was derived, otherwise a `file:` URI will be created based on the [file].
-  FileSource(File file, [Uri uri])
+  FileSource(File file, [Uri? uri])
       : uri = uri ?? file.toUri(),
         file = file,
         id = _idTable.putIfAbsent(
@@ -110,9 +110,6 @@
 
   @override
   String toString() {
-    if (file == null) {
-      return "<unknown source>";
-    }
     return file.path;
   }
 }
diff --git a/pkg/analyzer/lib/src/string_source.dart b/pkg/analyzer/lib/src/string_source.dart
index f82279c..de87280 100644
--- a/pkg/analyzer/lib/src/string_source.dart
+++ b/pkg/analyzer/lib/src/string_source.dart
@@ -4,6 +4,7 @@
 
 import 'package:analyzer/src/generated/engine.dart' show TimestampedData;
 import 'package:analyzer/src/generated/source.dart';
+import 'package:path/path.dart' as pkg_path;
 
 /// An implementation of [Source] that's based on an in-memory Dart string.
 class StringSource extends Source {
@@ -19,9 +20,9 @@
   @override
   final int modificationStamp;
 
-  StringSource(this._contents, String fullName, {Uri uri})
-      : fullName = fullName,
-        uri = uri ?? (fullName == null ? null : Uri.file(fullName)),
+  StringSource(this._contents, String? fullName, {Uri? uri})
+      : fullName = fullName ?? '/test.dart',
+        uri = _computeUri(uri, fullName),
         modificationStamp = DateTime.now().millisecondsSinceEpoch;
 
   @override
@@ -57,4 +58,17 @@
 
   @override
   String toString() => 'StringSource ($fullName)';
+
+  static Uri _computeUri(Uri? uri, String? fullName) {
+    if (uri != null) {
+      return uri;
+    }
+
+    var isWindows = pkg_path.Style.platform == pkg_path.Style.windows;
+    if (isWindows) {
+      return pkg_path.toUri(r'C:\test.dart');
+    } else {
+      return pkg_path.toUri(r'/test.dart');
+    }
+  }
 }
diff --git a/pkg/analyzer/lib/src/summary/base.dart b/pkg/analyzer/lib/src/summary/base.dart
index 0174fed..a3106ed 100644
--- a/pkg/analyzer/lib/src/summary/base.dart
+++ b/pkg/analyzer/lib/src/summary/base.dart
@@ -33,7 +33,7 @@
   /// fields and whose values are the data stored in those fields.
   ///
   /// Intended for testing and debugging only.
-  Map<String, Object> toMap();
+  Map<String, Object?> toMap();
 }
 
 /// Annotation used in the summary IDL to indicate that a summary class can be
@@ -41,7 +41,7 @@
 class TopLevel {
   /// If non-null, identifier that will be stored in bytes 4-7 of the file,
   /// prior all other file data.  Must be exactly 4 Latin1 characters.
-  final String fileIdentifier;
+  final String? fileIdentifier;
 
   const TopLevel([this.fileIdentifier]);
 }
@@ -69,10 +69,10 @@
   final int value;
 
   /// The value of the variant field in [Variant].
-  final Object variant;
+  final Object? variant;
 
   /// The list of variant values for which this field exists.
-  final List<Object> variantList;
+  final List<Object>? variantList;
 
   const VariantId(this.value, {this.variant, this.variantList});
 }
diff --git a/pkg/analyzer/lib/src/summary/flat_buffers.dart b/pkg/analyzer/lib/src/summary/flat_buffers.dart
index 764ea95..49a7400 100644
--- a/pkg/analyzer/lib/src/summary/flat_buffers.dart
+++ b/pkg/analyzer/lib/src/summary/flat_buffers.dart
@@ -87,22 +87,22 @@
   /// The list of existing VTable(s).
   final List<_VTable> _vTables = <_VTable>[];
 
-  ByteData _buf;
+  late ByteData _buf;
 
   /// The maximum alignment that has been seen so far.  If [_buf] has to be
   /// reallocated in the future (to insert room at its start for more bytes) the
   /// reallocation will need to be a multiple of this many bytes.
-  int _maxAlign;
+  late int _maxAlign;
 
   /// The number of bytes that have been written to the buffer so far.  The
   /// most recently written byte is this many bytes from the end of [_buf].
-  int _tail;
+  late int _tail;
 
   /// The location of the end of the current table, measured in bytes from the
   /// end of [_buf], or `null` if a table is not currently being built.
-  int _currentTableEndTail;
+  late int _currentTableEndTail;
 
-  _VTable _currentVTable;
+  _VTable? _currentVTable;
 
   /// Map containing all strings that have been written so far.  This allows us
   /// to avoid duplicating strings.
@@ -115,7 +115,7 @@
   /// Add the [field] with the given boolean [value].  The field is not added if
   /// the [value] is equal to [def].  Booleans are stored as 8-bit fields with
   /// `0` for `false` and `1` for `true`.
-  void addBool(int field, bool value, [bool def]) {
+  void addBool(int field, bool? value, [bool? def]) {
     _ensureCurrentVTable();
     if (value != null && value != def) {
       int size = 1;
@@ -126,7 +126,7 @@
   }
 
   /// Add the [field] with the given 64-bit float [value].
-  void addFloat64(int field, double value, [double def]) {
+  void addFloat64(int field, double? value, [double? def]) {
     _ensureCurrentVTable();
     if (value != null && value != def) {
       int size = 8;
@@ -138,7 +138,7 @@
 
   /// Add the [field] with the given 32-bit signed integer [value].  The field
   /// is not added if the [value] is equal to [def].
-  void addInt32(int field, int value, [int def]) {
+  void addInt32(int field, int? value, [int? def]) {
     _ensureCurrentVTable();
     if (value != null && value != def) {
       int size = 4;
@@ -150,7 +150,7 @@
 
   /// Add the [field] with the given 8-bit signed integer [value].  The field is
   /// not added if the [value] is equal to [def].
-  void addInt8(int field, int value, [int def]) {
+  void addInt8(int field, int? value, [int? def]) {
     _ensureCurrentVTable();
     if (value != null && value != def) {
       int size = 1;
@@ -161,7 +161,7 @@
   }
 
   /// Add the [field] referencing an object with the given [offset].
-  void addOffset(int field, Offset offset) {
+  void addOffset(int field, Offset? offset) {
     _ensureCurrentVTable();
     if (offset != null) {
       _prepare(4, 1);
@@ -172,7 +172,7 @@
 
   /// Add the [field] with the given 32-bit unsigned integer [value].  The field
   /// is not added if the [value] is equal to [def].
-  void addUint32(int field, int value, [int def]) {
+  void addUint32(int field, int? value, [int? def]) {
     _ensureCurrentVTable();
     if (value != null && value != def) {
       int size = 4;
@@ -184,7 +184,7 @@
 
   /// Add the [field] with the given 8-bit unsigned integer [value].  The field
   /// is not added if the [value] is equal to [def].
-  void addUint8(int field, int value, [int def]) {
+  void addUint8(int field, int? value, [int? def]) {
     _ensureCurrentVTable();
     if (value != null && value != def) {
       int size = 1;
@@ -203,27 +203,27 @@
     _prepare(4, 1);
     int tableTail = _tail;
     // Prepare the size of the current table.
-    _currentVTable.tableSize = tableTail - _currentTableEndTail;
+    _currentVTable!.tableSize = tableTail - _currentTableEndTail;
     // Prepare the VTable to use for the current table.
-    int vTableTail;
+    int? vTableTail;
     {
-      _currentVTable.computeFieldOffsets(tableTail);
+      _currentVTable!.computeFieldOffsets(tableTail);
       // Try to find an existing compatible VTable.
       for (int i = 0; i < _vTables.length; i++) {
         _VTable vTable = _vTables[i];
-        if (_currentVTable.canUseExistingVTable(vTable)) {
+        if (_currentVTable!.canUseExistingVTable(vTable)) {
           vTableTail = vTable.tail;
           break;
         }
       }
       // Write a new VTable.
       if (vTableTail == null) {
-        _currentVTable.takeFieldOffsets();
-        _prepare(2, _currentVTable.numOfUint16);
+        _currentVTable!.takeFieldOffsets();
+        _prepare(2, _currentVTable!.numOfUint16);
         vTableTail = _tail;
-        _currentVTable.tail = vTableTail;
-        _currentVTable.output(_buf, _buf.lengthInBytes - _tail);
-        _vTables.add(_currentVTable);
+        _currentVTable!.tail = vTableTail;
+        _currentVTable!.output(_buf, _buf.lengthInBytes - _tail);
+        _vTables.add(_currentVTable!);
       }
     }
     // Set the VTable offset.
@@ -238,7 +238,7 @@
   /// written object.  If [fileIdentifier] is specified (and not `null`), it is
   /// interpreted as a 4-byte Latin-1 encoded string that should be placed at
   /// bytes 4-7 of the file.
-  Uint8List finish(Offset offset, [String fileIdentifier]) {
+  Uint8List finish(Offset offset, [String? fileIdentifier]) {
     _prepare(max(4, _maxAlign), fileIdentifier == null ? 1 : 2);
     int alignedTail = _tail + ((-_tail) % _maxAlign);
     _setUint32AtTail(_buf, alignedTail, alignedTail - offset._tail);
@@ -398,26 +398,22 @@
     return result;
   }
 
-  /// Write the given string [value] and return its [Offset], or `null` if
-  /// the [value] is equal to [def].
-  Offset<String> writeString(String value, [String def]) {
+  /// Write the given string [value] and return its [Offset].
+  Offset<String> writeString(String value) {
     _ensureNoVTable();
-    if (value != def) {
-      return _strings.putIfAbsent(value, () {
-        // TODO(scheglov) optimize for ASCII strings
-        List<int> bytes = utf8.encode(value);
-        int length = bytes.length;
-        _prepare(4, 1, additionalBytes: length);
-        Offset<String> result = Offset(_tail);
-        _setUint32AtTail(_buf, _tail, length);
-        int offset = _buf.lengthInBytes - _tail + 4;
-        for (int i = 0; i < length; i++) {
-          _buf.setUint8(offset++, bytes[i]);
-        }
-        return result;
-      });
-    }
-    return null;
+    return _strings.putIfAbsent(value, () {
+      // TODO(scheglov) optimize for ASCII strings
+      List<int> bytes = utf8.encode(value);
+      int length = bytes.length;
+      _prepare(4, 1, additionalBytes: length);
+      Offset<String> result = Offset(_tail);
+      _setUint32AtTail(_buf, _tail, length);
+      int offset = _buf.lengthInBytes - _tail + 4;
+      for (int i = 0; i < length; i++) {
+        _buf.setUint8(offset++, bytes[i]);
+      }
+      return result;
+    });
   }
 
   /// Throw an exception if there is not currently a vtable.
@@ -468,7 +464,7 @@
 
   /// Record the offset of the given [field].
   void _trackField(int field) {
-    _currentVTable.addField(field, _tail);
+    _currentVTable!.addField(field, _tail);
   }
 
   static void _setFloat64AtTail(ByteData _buf, int tail, double x) {
@@ -570,7 +566,12 @@
   T read(BufferContext bc, int offset);
 
   /// Read the value of the given [field] in the given [object].
-  T vTableGet(BufferContext object, int offset, int field, [T defaultValue]) {
+  T vTableGet(BufferContext object, int offset, int field, T defaultValue) {
+    return vTableGetOrNull(object, offset, field) ?? defaultValue;
+  }
+
+  /// Read the value of the given [field] in the given [object].
+  T? vTableGetOrNull(BufferContext object, int offset, int field) {
     int vTableSOffset = object._getInt32(offset);
     int vTableOffset = offset - vTableSOffset;
     int vTableSize = object._getUint16(vTableOffset);
@@ -582,7 +583,7 @@
         return read(object, offset + fieldOffsetInObject);
       }
     }
-    return defaultValue;
+    return null;
   }
 }
 
@@ -686,7 +687,7 @@
 class _FbBoolList with ListMixin<bool> implements List<bool> {
   final BufferContext bc;
   final int offset;
-  int _length;
+  int? _length;
 
   _FbBoolList(this.bc, this.offset);
 
@@ -696,7 +697,7 @@
       int byteLength = bc._getUint32(offset);
       _length = (byteLength - 1) * 8 - _getByte(byteLength - 1);
     }
-    return _length;
+    return _length!;
   }
 
   @override
@@ -730,20 +731,20 @@
 class _FbGenericList<E> extends _FbList<E> {
   final Reader<E> elementReader;
 
-  List<E> _items;
+  List<E?>? _items;
 
   _FbGenericList(this.elementReader, BufferContext bp, int offset)
       : super(bp, offset);
 
   @override
   E operator [](int i) {
-    _items ??= List<E>.filled(length, null);
-    E item = _items[i];
+    _items ??= List<E?>.filled(length, null);
+    E? item = _items![i];
     if (item == null) {
       item = elementReader.read(bc, offset + 4 + elementReader.size * i);
-      _items[i] = item;
+      _items![i] = item;
     }
-    return item;
+    return item!;
   }
 }
 
@@ -751,14 +752,13 @@
 abstract class _FbList<E> with ListMixin<E> implements List<E> {
   final BufferContext bc;
   final int offset;
-  int _length;
+  int? _length;
 
   _FbList(this.bc, this.offset);
 
   @override
   int get length {
-    _length ??= bc._getUint32(offset);
-    return _length;
+    return _length ??= bc._getUint32(offset);
   }
 
   @override
@@ -799,14 +799,14 @@
 
   /// The private copy of [_reusedFieldOffsets], which is made only when we
   /// find that this table is unique.
-  Int32List _fieldOffsets;
+  Int32List? _fieldOffsets;
 
   /// The size of the table that uses this VTable.
-  int tableSize;
+  int? tableSize;
 
   /// The tail of this VTable.  It is used to share the same VTable between
   /// multiple tables of identical structure.
-  int tail;
+  int? tail;
 
   _VTable(this._reusedFieldTails, this._reusedFieldOffsets);
 
@@ -826,7 +826,7 @@
     if (tableSize == existing.tableSize &&
         _fieldCount == existing._fieldCount) {
       for (int i = 0; i < _fieldCount; i++) {
-        if (_reusedFieldOffsets[i] != existing._fieldOffsets[i]) {
+        if (_reusedFieldOffsets[i] != existing._fieldOffsets![i]) {
           return false;
         }
       }
@@ -850,10 +850,10 @@
     buf.setUint16(bufOffset, numOfUint16 * 2, Endian.little);
     bufOffset += 2;
     // Table size.
-    buf.setUint16(bufOffset, tableSize, Endian.little);
+    buf.setUint16(bufOffset, tableSize!, Endian.little);
     bufOffset += 2;
     // Field offsets.
-    for (int fieldOffset in _fieldOffsets) {
+    for (int fieldOffset in _fieldOffsets!) {
       buf.setUint16(bufOffset, fieldOffset, Endian.little);
       bufOffset += 2;
     }
@@ -864,7 +864,7 @@
     assert(_fieldOffsets == null);
     _fieldOffsets = Int32List(_fieldCount);
     for (int i = 0; i < _fieldCount; ++i) {
-      _fieldOffsets[i] = _reusedFieldOffsets[i];
+      _fieldOffsets![i] = _reusedFieldOffsets[i];
     }
   }
 }
diff --git a/pkg/analyzer/lib/src/summary/format.dart b/pkg/analyzer/lib/src/summary/format.dart
index aa37cf6..3b666ff 100644
--- a/pkg/analyzer/lib/src/summary/format.dart
+++ b/pkg/analyzer/lib/src/summary/format.dart
@@ -69,10 +69,10 @@
 class AnalysisDriverExceptionContextBuilder extends Object
     with _AnalysisDriverExceptionContextMixin
     implements idl.AnalysisDriverExceptionContext {
-  String _exception;
-  List<AnalysisDriverExceptionFileBuilder> _files;
-  String _path;
-  String _stackTrace;
+  String? _exception;
+  List<AnalysisDriverExceptionFileBuilder>? _files;
+  String? _path;
+  String? _stackTrace;
 
   @override
   String get exception => _exception ??= '';
@@ -108,10 +108,10 @@
   }
 
   AnalysisDriverExceptionContextBuilder(
-      {String exception,
-      List<AnalysisDriverExceptionFileBuilder> files,
-      String path,
-      String stackTrace})
+      {String? exception,
+      List<AnalysisDriverExceptionFileBuilder>? files,
+      String? path,
+      String? stackTrace})
       : _exception = exception,
         _files = files,
         _path = path,
@@ -130,9 +130,9 @@
     if (this._files == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._files.length);
-      for (var x in this._files) {
-        x?.collectApiSignature(signature);
+      signature.addInt(this._files!.length);
+      for (var x in this._files!) {
+        x.collectApiSignature(signature);
       }
     }
   }
@@ -143,22 +143,22 @@
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
-    fb.Offset offset_exception;
-    fb.Offset offset_files;
-    fb.Offset offset_path;
-    fb.Offset offset_stackTrace;
+    fb.Offset? offset_exception;
+    fb.Offset? offset_files;
+    fb.Offset? offset_path;
+    fb.Offset? offset_stackTrace;
     if (_exception != null) {
-      offset_exception = fbBuilder.writeString(_exception);
+      offset_exception = fbBuilder.writeString(_exception!);
     }
-    if (!(_files == null || _files.isEmpty)) {
+    if (!(_files == null || _files!.isEmpty)) {
       offset_files =
-          fbBuilder.writeList(_files.map((b) => b.finish(fbBuilder)).toList());
+          fbBuilder.writeList(_files!.map((b) => b.finish(fbBuilder)).toList());
     }
     if (_path != null) {
-      offset_path = fbBuilder.writeString(_path);
+      offset_path = fbBuilder.writeString(_path!);
     }
     if (_stackTrace != null) {
-      offset_stackTrace = fbBuilder.writeString(_stackTrace);
+      offset_stackTrace = fbBuilder.writeString(_stackTrace!);
     }
     fbBuilder.startTable();
     if (offset_exception != null) {
@@ -201,36 +201,34 @@
 
   _AnalysisDriverExceptionContextImpl(this._bc, this._bcOffset);
 
-  String _exception;
-  List<idl.AnalysisDriverExceptionFile> _files;
-  String _path;
-  String _stackTrace;
+  String? _exception;
+  List<idl.AnalysisDriverExceptionFile>? _files;
+  String? _path;
+  String? _stackTrace;
 
   @override
   String get exception {
-    _exception ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 1, '');
-    return _exception;
+    return _exception ??=
+        const fb.StringReader().vTableGet(_bc, _bcOffset, 1, '');
   }
 
   @override
   List<idl.AnalysisDriverExceptionFile> get files {
-    _files ??= const fb.ListReader<idl.AnalysisDriverExceptionFile>(
+    return _files ??= const fb.ListReader<idl.AnalysisDriverExceptionFile>(
             _AnalysisDriverExceptionFileReader())
         .vTableGet(
             _bc, _bcOffset, 3, const <idl.AnalysisDriverExceptionFile>[]);
-    return _files;
   }
 
   @override
   String get path {
-    _path ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 0, '');
-    return _path;
+    return _path ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 0, '');
   }
 
   @override
   String get stackTrace {
-    _stackTrace ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 2, '');
-    return _stackTrace;
+    return _stackTrace ??=
+        const fb.StringReader().vTableGet(_bc, _bcOffset, 2, '');
   }
 }
 
@@ -239,23 +237,27 @@
   @override
   Map<String, Object> toJson() {
     Map<String, Object> _result = <String, Object>{};
-    if (exception != '') {
-      _result["exception"] = exception;
+    var local_exception = exception;
+    if (local_exception != '') {
+      _result["exception"] = local_exception;
     }
-    if (files.isNotEmpty) {
-      _result["files"] = files.map((_value) => _value.toJson()).toList();
+    var local_files = files;
+    if (local_files.isNotEmpty) {
+      _result["files"] = local_files.map((_value) => _value.toJson()).toList();
     }
-    if (path != '') {
-      _result["path"] = path;
+    var local_path = path;
+    if (local_path != '') {
+      _result["path"] = local_path;
     }
-    if (stackTrace != '') {
-      _result["stackTrace"] = stackTrace;
+    var local_stackTrace = stackTrace;
+    if (local_stackTrace != '') {
+      _result["stackTrace"] = local_stackTrace;
     }
     return _result;
   }
 
   @override
-  Map<String, Object> toMap() => {
+  Map<String, Object?> toMap() => {
         "exception": exception,
         "files": files,
         "path": path,
@@ -269,8 +271,8 @@
 class AnalysisDriverExceptionFileBuilder extends Object
     with _AnalysisDriverExceptionFileMixin
     implements idl.AnalysisDriverExceptionFile {
-  String _content;
-  String _path;
+  String? _content;
+  String? _path;
 
   @override
   String get content => _content ??= '';
@@ -288,7 +290,7 @@
     this._path = value;
   }
 
-  AnalysisDriverExceptionFileBuilder({String content, String path})
+  AnalysisDriverExceptionFileBuilder({String? content, String? path})
       : _content = content,
         _path = path;
 
@@ -302,13 +304,13 @@
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
-    fb.Offset offset_content;
-    fb.Offset offset_path;
+    fb.Offset? offset_content;
+    fb.Offset? offset_path;
     if (_content != null) {
-      offset_content = fbBuilder.writeString(_content);
+      offset_content = fbBuilder.writeString(_content!);
     }
     if (_path != null) {
-      offset_path = fbBuilder.writeString(_path);
+      offset_path = fbBuilder.writeString(_path!);
     }
     fbBuilder.startTable();
     if (offset_content != null) {
@@ -339,19 +341,18 @@
 
   _AnalysisDriverExceptionFileImpl(this._bc, this._bcOffset);
 
-  String _content;
-  String _path;
+  String? _content;
+  String? _path;
 
   @override
   String get content {
-    _content ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 1, '');
-    return _content;
+    return _content ??=
+        const fb.StringReader().vTableGet(_bc, _bcOffset, 1, '');
   }
 
   @override
   String get path {
-    _path ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 0, '');
-    return _path;
+    return _path ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 0, '');
   }
 }
 
@@ -360,17 +361,19 @@
   @override
   Map<String, Object> toJson() {
     Map<String, Object> _result = <String, Object>{};
-    if (content != '') {
-      _result["content"] = content;
+    var local_content = content;
+    if (local_content != '') {
+      _result["content"] = local_content;
     }
-    if (path != '') {
-      _result["path"] = path;
+    var local_path = path;
+    if (local_path != '') {
+      _result["path"] = local_path;
     }
     return _result;
   }
 
   @override
-  Map<String, Object> toMap() => {
+  Map<String, Object?> toMap() => {
         "content": content,
         "path": path,
       };
@@ -382,8 +385,8 @@
 class AnalysisDriverResolvedUnitBuilder extends Object
     with _AnalysisDriverResolvedUnitMixin
     implements idl.AnalysisDriverResolvedUnit {
-  List<AnalysisDriverUnitErrorBuilder> _errors;
-  AnalysisDriverUnitIndexBuilder _index;
+  List<AnalysisDriverUnitErrorBuilder>? _errors;
+  AnalysisDriverUnitIndexBuilder? _index;
 
   @override
   List<AnalysisDriverUnitErrorBuilder> get errors =>
@@ -395,16 +398,16 @@
   }
 
   @override
-  AnalysisDriverUnitIndexBuilder get index => _index;
+  AnalysisDriverUnitIndexBuilder? get index => _index;
 
   /// The index of the unit.
-  set index(AnalysisDriverUnitIndexBuilder value) {
+  set index(AnalysisDriverUnitIndexBuilder? value) {
     this._index = value;
   }
 
   AnalysisDriverResolvedUnitBuilder(
-      {List<AnalysisDriverUnitErrorBuilder> errors,
-      AnalysisDriverUnitIndexBuilder index})
+      {List<AnalysisDriverUnitErrorBuilder>? errors,
+      AnalysisDriverUnitIndexBuilder? index})
       : _errors = errors,
         _index = index;
 
@@ -419,9 +422,9 @@
     if (this._errors == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._errors.length);
-      for (var x in this._errors) {
-        x?.collectApiSignature(signature);
+      signature.addInt(this._errors!.length);
+      for (var x in this._errors!) {
+        x.collectApiSignature(signature);
       }
     }
     signature.addBool(this._index != null);
@@ -434,14 +437,14 @@
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
-    fb.Offset offset_errors;
-    fb.Offset offset_index;
-    if (!(_errors == null || _errors.isEmpty)) {
-      offset_errors =
-          fbBuilder.writeList(_errors.map((b) => b.finish(fbBuilder)).toList());
+    fb.Offset? offset_errors;
+    fb.Offset? offset_index;
+    if (!(_errors == null || _errors!.isEmpty)) {
+      offset_errors = fbBuilder
+          .writeList(_errors!.map((b) => b.finish(fbBuilder)).toList());
     }
     if (_index != null) {
-      offset_index = _index.finish(fbBuilder);
+      offset_index = _index!.finish(fbBuilder);
     }
     fbBuilder.startTable();
     if (offset_errors != null) {
@@ -478,22 +481,20 @@
 
   _AnalysisDriverResolvedUnitImpl(this._bc, this._bcOffset);
 
-  List<idl.AnalysisDriverUnitError> _errors;
-  idl.AnalysisDriverUnitIndex _index;
+  List<idl.AnalysisDriverUnitError>? _errors;
+  idl.AnalysisDriverUnitIndex? _index;
 
   @override
   List<idl.AnalysisDriverUnitError> get errors {
-    _errors ??= const fb.ListReader<idl.AnalysisDriverUnitError>(
+    return _errors ??= const fb.ListReader<idl.AnalysisDriverUnitError>(
             _AnalysisDriverUnitErrorReader())
         .vTableGet(_bc, _bcOffset, 0, const <idl.AnalysisDriverUnitError>[]);
-    return _errors;
   }
 
   @override
-  idl.AnalysisDriverUnitIndex get index {
-    _index ??= const _AnalysisDriverUnitIndexReader()
-        .vTableGet(_bc, _bcOffset, 1, null);
-    return _index;
+  idl.AnalysisDriverUnitIndex? get index {
+    return _index ??= const _AnalysisDriverUnitIndexReader()
+        .vTableGetOrNull(_bc, _bcOffset, 1);
   }
 }
 
@@ -502,17 +503,20 @@
   @override
   Map<String, Object> toJson() {
     Map<String, Object> _result = <String, Object>{};
-    if (errors.isNotEmpty) {
-      _result["errors"] = errors.map((_value) => _value.toJson()).toList();
+    var local_errors = errors;
+    if (local_errors.isNotEmpty) {
+      _result["errors"] =
+          local_errors.map((_value) => _value.toJson()).toList();
     }
-    if (index != null) {
-      _result["index"] = index.toJson();
+    var local_index = index;
+    if (local_index != null) {
+      _result["index"] = local_index.toJson();
     }
     return _result;
   }
 
   @override
-  Map<String, Object> toMap() => {
+  Map<String, Object?> toMap() => {
         "errors": errors,
         "index": index,
       };
@@ -524,8 +528,8 @@
 class AnalysisDriverSubtypeBuilder extends Object
     with _AnalysisDriverSubtypeMixin
     implements idl.AnalysisDriverSubtype {
-  List<int> _members;
-  int _name;
+  List<int>? _members;
+  int? _name;
 
   @override
   List<int> get members => _members ??= <int>[];
@@ -534,7 +538,7 @@
   /// They are indexes into [AnalysisDriverUnitError.strings] list.
   /// The list is sorted in ascending order.
   set members(List<int> value) {
-    assert(value == null || value.every((e) => e >= 0));
+    assert(value.every((e) => e >= 0));
     this._members = value;
   }
 
@@ -544,11 +548,11 @@
   /// The name of the class.
   /// It is an index into [AnalysisDriverUnitError.strings] list.
   set name(int value) {
-    assert(value == null || value >= 0);
+    assert(value >= 0);
     this._name = value;
   }
 
-  AnalysisDriverSubtypeBuilder({List<int> members, int name})
+  AnalysisDriverSubtypeBuilder({List<int>? members, int? name})
       : _members = members,
         _name = name;
 
@@ -561,17 +565,17 @@
     if (this._members == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._members.length);
-      for (var x in this._members) {
+      signature.addInt(this._members!.length);
+      for (var x in this._members!) {
         signature.addInt(x);
       }
     }
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
-    fb.Offset offset_members;
-    if (!(_members == null || _members.isEmpty)) {
-      offset_members = fbBuilder.writeListUint32(_members);
+    fb.Offset? offset_members;
+    if (!(_members == null || _members!.isEmpty)) {
+      offset_members = fbBuilder.writeListUint32(_members!);
     }
     fbBuilder.startTable();
     if (offset_members != null) {
@@ -601,20 +605,18 @@
 
   _AnalysisDriverSubtypeImpl(this._bc, this._bcOffset);
 
-  List<int> _members;
-  int _name;
+  List<int>? _members;
+  int? _name;
 
   @override
   List<int> get members {
-    _members ??=
+    return _members ??=
         const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 1, const <int>[]);
-    return _members;
   }
 
   @override
   int get name {
-    _name ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 0, 0);
-    return _name;
+    return _name ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 0, 0);
   }
 }
 
@@ -623,17 +625,19 @@
   @override
   Map<String, Object> toJson() {
     Map<String, Object> _result = <String, Object>{};
-    if (members.isNotEmpty) {
-      _result["members"] = members;
+    var local_members = members;
+    if (local_members.isNotEmpty) {
+      _result["members"] = local_members;
     }
-    if (name != 0) {
-      _result["name"] = name;
+    var local_name = name;
+    if (local_name != 0) {
+      _result["name"] = local_name;
     }
     return _result;
   }
 
   @override
-  Map<String, Object> toMap() => {
+  Map<String, Object?> toMap() => {
         "members": members,
         "name": name,
       };
@@ -645,12 +649,12 @@
 class AnalysisDriverUnitErrorBuilder extends Object
     with _AnalysisDriverUnitErrorMixin
     implements idl.AnalysisDriverUnitError {
-  List<DiagnosticMessageBuilder> _contextMessages;
-  String _correction;
-  int _length;
-  String _message;
-  int _offset;
-  String _uniqueName;
+  List<DiagnosticMessageBuilder>? _contextMessages;
+  String? _correction;
+  int? _length;
+  String? _message;
+  int? _offset;
+  String? _uniqueName;
 
   @override
   List<DiagnosticMessageBuilder> get contextMessages =>
@@ -674,7 +678,7 @@
 
   /// The length of the error in the file.
   set length(int value) {
-    assert(value == null || value >= 0);
+    assert(value >= 0);
     this._length = value;
   }
 
@@ -691,7 +695,7 @@
 
   /// The offset from the beginning of the file.
   set offset(int value) {
-    assert(value == null || value >= 0);
+    assert(value >= 0);
     this._offset = value;
   }
 
@@ -704,12 +708,12 @@
   }
 
   AnalysisDriverUnitErrorBuilder(
-      {List<DiagnosticMessageBuilder> contextMessages,
-      String correction,
-      int length,
-      String message,
-      int offset,
-      String uniqueName})
+      {List<DiagnosticMessageBuilder>? contextMessages,
+      String? correction,
+      int? length,
+      String? message,
+      int? offset,
+      String? uniqueName})
       : _contextMessages = contextMessages,
         _correction = correction,
         _length = length,
@@ -732,30 +736,30 @@
     if (this._contextMessages == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._contextMessages.length);
-      for (var x in this._contextMessages) {
-        x?.collectApiSignature(signature);
+      signature.addInt(this._contextMessages!.length);
+      for (var x in this._contextMessages!) {
+        x.collectApiSignature(signature);
       }
     }
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
-    fb.Offset offset_contextMessages;
-    fb.Offset offset_correction;
-    fb.Offset offset_message;
-    fb.Offset offset_uniqueName;
-    if (!(_contextMessages == null || _contextMessages.isEmpty)) {
-      offset_contextMessages = fbBuilder
-          .writeList(_contextMessages.map((b) => b.finish(fbBuilder)).toList());
+    fb.Offset? offset_contextMessages;
+    fb.Offset? offset_correction;
+    fb.Offset? offset_message;
+    fb.Offset? offset_uniqueName;
+    if (!(_contextMessages == null || _contextMessages!.isEmpty)) {
+      offset_contextMessages = fbBuilder.writeList(
+          _contextMessages!.map((b) => b.finish(fbBuilder)).toList());
     }
     if (_correction != null) {
-      offset_correction = fbBuilder.writeString(_correction);
+      offset_correction = fbBuilder.writeString(_correction!);
     }
     if (_message != null) {
-      offset_message = fbBuilder.writeString(_message);
+      offset_message = fbBuilder.writeString(_message!);
     }
     if (_uniqueName != null) {
-      offset_uniqueName = fbBuilder.writeString(_uniqueName);
+      offset_uniqueName = fbBuilder.writeString(_uniqueName!);
     }
     fbBuilder.startTable();
     if (offset_contextMessages != null) {
@@ -797,49 +801,46 @@
 
   _AnalysisDriverUnitErrorImpl(this._bc, this._bcOffset);
 
-  List<idl.DiagnosticMessage> _contextMessages;
-  String _correction;
-  int _length;
-  String _message;
-  int _offset;
-  String _uniqueName;
+  List<idl.DiagnosticMessage>? _contextMessages;
+  String? _correction;
+  int? _length;
+  String? _message;
+  int? _offset;
+  String? _uniqueName;
 
   @override
   List<idl.DiagnosticMessage> get contextMessages {
-    _contextMessages ??=
+    return _contextMessages ??=
         const fb.ListReader<idl.DiagnosticMessage>(_DiagnosticMessageReader())
             .vTableGet(_bc, _bcOffset, 5, const <idl.DiagnosticMessage>[]);
-    return _contextMessages;
   }
 
   @override
   String get correction {
-    _correction ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 4, '');
-    return _correction;
+    return _correction ??=
+        const fb.StringReader().vTableGet(_bc, _bcOffset, 4, '');
   }
 
   @override
   int get length {
-    _length ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 1, 0);
-    return _length;
+    return _length ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 1, 0);
   }
 
   @override
   String get message {
-    _message ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 3, '');
-    return _message;
+    return _message ??=
+        const fb.StringReader().vTableGet(_bc, _bcOffset, 3, '');
   }
 
   @override
   int get offset {
-    _offset ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 0, 0);
-    return _offset;
+    return _offset ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 0, 0);
   }
 
   @override
   String get uniqueName {
-    _uniqueName ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 2, '');
-    return _uniqueName;
+    return _uniqueName ??=
+        const fb.StringReader().vTableGet(_bc, _bcOffset, 2, '');
   }
 }
 
@@ -848,30 +849,36 @@
   @override
   Map<String, Object> toJson() {
     Map<String, Object> _result = <String, Object>{};
-    if (contextMessages.isNotEmpty) {
+    var local_contextMessages = contextMessages;
+    if (local_contextMessages.isNotEmpty) {
       _result["contextMessages"] =
-          contextMessages.map((_value) => _value.toJson()).toList();
+          local_contextMessages.map((_value) => _value.toJson()).toList();
     }
-    if (correction != '') {
-      _result["correction"] = correction;
+    var local_correction = correction;
+    if (local_correction != '') {
+      _result["correction"] = local_correction;
     }
-    if (length != 0) {
-      _result["length"] = length;
+    var local_length = length;
+    if (local_length != 0) {
+      _result["length"] = local_length;
     }
-    if (message != '') {
-      _result["message"] = message;
+    var local_message = message;
+    if (local_message != '') {
+      _result["message"] = local_message;
     }
-    if (offset != 0) {
-      _result["offset"] = offset;
+    var local_offset = offset;
+    if (local_offset != 0) {
+      _result["offset"] = local_offset;
     }
-    if (uniqueName != '') {
-      _result["uniqueName"] = uniqueName;
+    var local_uniqueName = uniqueName;
+    if (local_uniqueName != '') {
+      _result["uniqueName"] = local_uniqueName;
     }
     return _result;
   }
 
   @override
-  Map<String, Object> toMap() => {
+  Map<String, Object?> toMap() => {
         "contextMessages": contextMessages,
         "correction": correction,
         "length": length,
@@ -887,26 +894,26 @@
 class AnalysisDriverUnitIndexBuilder extends Object
     with _AnalysisDriverUnitIndexMixin
     implements idl.AnalysisDriverUnitIndex {
-  List<idl.IndexSyntheticElementKind> _elementKinds;
-  List<int> _elementNameClassMemberIds;
-  List<int> _elementNameParameterIds;
-  List<int> _elementNameUnitMemberIds;
-  List<int> _elementUnits;
-  int _nullStringId;
-  List<String> _strings;
-  List<AnalysisDriverSubtypeBuilder> _subtypes;
-  List<int> _supertypes;
-  List<int> _unitLibraryUris;
-  List<int> _unitUnitUris;
-  List<bool> _usedElementIsQualifiedFlags;
-  List<idl.IndexRelationKind> _usedElementKinds;
-  List<int> _usedElementLengths;
-  List<int> _usedElementOffsets;
-  List<int> _usedElements;
-  List<bool> _usedNameIsQualifiedFlags;
-  List<idl.IndexRelationKind> _usedNameKinds;
-  List<int> _usedNameOffsets;
-  List<int> _usedNames;
+  List<idl.IndexSyntheticElementKind>? _elementKinds;
+  List<int>? _elementNameClassMemberIds;
+  List<int>? _elementNameParameterIds;
+  List<int>? _elementNameUnitMemberIds;
+  List<int>? _elementUnits;
+  int? _nullStringId;
+  List<String>? _strings;
+  List<AnalysisDriverSubtypeBuilder>? _subtypes;
+  List<int>? _supertypes;
+  List<int>? _unitLibraryUris;
+  List<int>? _unitUnitUris;
+  List<bool>? _usedElementIsQualifiedFlags;
+  List<idl.IndexRelationKind>? _usedElementKinds;
+  List<int>? _usedElementLengths;
+  List<int>? _usedElementOffsets;
+  List<int>? _usedElements;
+  List<bool>? _usedNameIsQualifiedFlags;
+  List<idl.IndexRelationKind>? _usedNameKinds;
+  List<int>? _usedNameOffsets;
+  List<int>? _usedNames;
 
   @override
   List<idl.IndexSyntheticElementKind> get elementKinds =>
@@ -928,7 +935,7 @@
   /// the client can quickly check whether an element is referenced in this
   /// index.
   set elementNameClassMemberIds(List<int> value) {
-    assert(value == null || value.every((e) => e >= 0));
+    assert(value.every((e) => e >= 0));
     this._elementNameClassMemberIds = value;
   }
 
@@ -940,7 +947,7 @@
   /// not a named parameter.  The list is sorted in ascending order, so that the
   /// client can quickly check whether an element is referenced in this index.
   set elementNameParameterIds(List<int> value) {
-    assert(value == null || value.every((e) => e >= 0));
+    assert(value.every((e) => e >= 0));
     this._elementNameParameterIds = value;
   }
 
@@ -953,7 +960,7 @@
   /// the unit.  The list is sorted in ascending order, so that the client can
   /// quickly check whether an element is referenced in this index.
   set elementNameUnitMemberIds(List<int> value) {
-    assert(value == null || value.every((e) => e >= 0));
+    assert(value.every((e) => e >= 0));
     this._elementNameUnitMemberIds = value;
   }
 
@@ -964,7 +971,7 @@
   /// the index into [unitLibraryUris] and [unitUnitUris] for the library
   /// specific unit where the element is declared.
   set elementUnits(List<int> value) {
-    assert(value == null || value.every((e) => e >= 0));
+    assert(value.every((e) => e >= 0));
     this._elementUnits = value;
   }
 
@@ -973,7 +980,7 @@
 
   /// Identifier of the null string in [strings].
   set nullStringId(int value) {
-    assert(value == null || value >= 0);
+    assert(value >= 0);
     this._nullStringId = value;
   }
 
@@ -1004,7 +1011,7 @@
   /// in ascending order.  There might be more than one element with the same
   /// value if there is more than one subtype of this supertype.
   set supertypes(List<int> value) {
-    assert(value == null || value.every((e) => e >= 0));
+    assert(value.every((e) => e >= 0));
     this._supertypes = value;
   }
 
@@ -1015,7 +1022,7 @@
   /// specific unit referenced in the index.  It is an index into [strings]
   /// list.
   set unitLibraryUris(List<int> value) {
-    assert(value == null || value.every((e) => e >= 0));
+    assert(value.every((e) => e >= 0));
     this._unitLibraryUris = value;
   }
 
@@ -1026,7 +1033,7 @@
   /// specific unit referenced in the index.  It is an index into [strings]
   /// list.
   set unitUnitUris(List<int> value) {
-    assert(value == null || value.every((e) => e >= 0));
+    assert(value.every((e) => e >= 0));
     this._unitUnitUris = value;
   }
 
@@ -1054,7 +1061,7 @@
 
   /// Each item of this list is the length of the element usage.
   set usedElementLengths(List<int> value) {
-    assert(value == null || value.every((e) => e >= 0));
+    assert(value.every((e) => e >= 0));
     this._usedElementLengths = value;
   }
 
@@ -1064,7 +1071,7 @@
   /// Each item of this list is the offset of the element usage relative to the
   /// beginning of the file.
   set usedElementOffsets(List<int> value) {
-    assert(value == null || value.every((e) => e >= 0));
+    assert(value.every((e) => e >= 0));
     this._usedElementOffsets = value;
   }
 
@@ -1076,7 +1083,7 @@
   /// [elementNameParameterIds].  The list is sorted in ascending order, so
   /// that the client can quickly find element references in this index.
   set usedElements(List<int> value) {
-    assert(value == null || value.every((e) => e >= 0));
+    assert(value.every((e) => e >= 0));
     this._usedElements = value;
   }
 
@@ -1105,7 +1112,7 @@
   /// Each item of this list is the offset of the name usage relative to the
   /// beginning of the file.
   set usedNameOffsets(List<int> value) {
-    assert(value == null || value.every((e) => e >= 0));
+    assert(value.every((e) => e >= 0));
     this._usedNameOffsets = value;
   }
 
@@ -1116,31 +1123,31 @@
   /// list is sorted in ascending order, so that the client can quickly find
   /// whether a name is used in this index.
   set usedNames(List<int> value) {
-    assert(value == null || value.every((e) => e >= 0));
+    assert(value.every((e) => e >= 0));
     this._usedNames = value;
   }
 
   AnalysisDriverUnitIndexBuilder(
-      {List<idl.IndexSyntheticElementKind> elementKinds,
-      List<int> elementNameClassMemberIds,
-      List<int> elementNameParameterIds,
-      List<int> elementNameUnitMemberIds,
-      List<int> elementUnits,
-      int nullStringId,
-      List<String> strings,
-      List<AnalysisDriverSubtypeBuilder> subtypes,
-      List<int> supertypes,
-      List<int> unitLibraryUris,
-      List<int> unitUnitUris,
-      List<bool> usedElementIsQualifiedFlags,
-      List<idl.IndexRelationKind> usedElementKinds,
-      List<int> usedElementLengths,
-      List<int> usedElementOffsets,
-      List<int> usedElements,
-      List<bool> usedNameIsQualifiedFlags,
-      List<idl.IndexRelationKind> usedNameKinds,
-      List<int> usedNameOffsets,
-      List<int> usedNames})
+      {List<idl.IndexSyntheticElementKind>? elementKinds,
+      List<int>? elementNameClassMemberIds,
+      List<int>? elementNameParameterIds,
+      List<int>? elementNameUnitMemberIds,
+      List<int>? elementUnits,
+      int? nullStringId,
+      List<String>? strings,
+      List<AnalysisDriverSubtypeBuilder>? subtypes,
+      List<int>? supertypes,
+      List<int>? unitLibraryUris,
+      List<int>? unitUnitUris,
+      List<bool>? usedElementIsQualifiedFlags,
+      List<idl.IndexRelationKind>? usedElementKinds,
+      List<int>? usedElementLengths,
+      List<int>? usedElementOffsets,
+      List<int>? usedElements,
+      List<bool>? usedNameIsQualifiedFlags,
+      List<idl.IndexRelationKind>? usedNameKinds,
+      List<int>? usedNameOffsets,
+      List<int>? usedNames})
       : _elementKinds = elementKinds,
         _elementNameClassMemberIds = elementNameClassMemberIds,
         _elementNameParameterIds = elementNameParameterIds,
@@ -1172,8 +1179,8 @@
     if (this._strings == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._strings.length);
-      for (var x in this._strings) {
+      signature.addInt(this._strings!.length);
+      for (var x in this._strings!) {
         signature.addString(x);
       }
     }
@@ -1181,145 +1188,145 @@
     if (this._unitLibraryUris == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._unitLibraryUris.length);
-      for (var x in this._unitLibraryUris) {
+      signature.addInt(this._unitLibraryUris!.length);
+      for (var x in this._unitLibraryUris!) {
         signature.addInt(x);
       }
     }
     if (this._unitUnitUris == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._unitUnitUris.length);
-      for (var x in this._unitUnitUris) {
+      signature.addInt(this._unitUnitUris!.length);
+      for (var x in this._unitUnitUris!) {
         signature.addInt(x);
       }
     }
     if (this._elementKinds == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._elementKinds.length);
-      for (var x in this._elementKinds) {
+      signature.addInt(this._elementKinds!.length);
+      for (var x in this._elementKinds!) {
         signature.addInt(x.index);
       }
     }
     if (this._elementUnits == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._elementUnits.length);
-      for (var x in this._elementUnits) {
+      signature.addInt(this._elementUnits!.length);
+      for (var x in this._elementUnits!) {
         signature.addInt(x);
       }
     }
     if (this._elementNameUnitMemberIds == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._elementNameUnitMemberIds.length);
-      for (var x in this._elementNameUnitMemberIds) {
+      signature.addInt(this._elementNameUnitMemberIds!.length);
+      for (var x in this._elementNameUnitMemberIds!) {
         signature.addInt(x);
       }
     }
     if (this._elementNameClassMemberIds == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._elementNameClassMemberIds.length);
-      for (var x in this._elementNameClassMemberIds) {
+      signature.addInt(this._elementNameClassMemberIds!.length);
+      for (var x in this._elementNameClassMemberIds!) {
         signature.addInt(x);
       }
     }
     if (this._elementNameParameterIds == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._elementNameParameterIds.length);
-      for (var x in this._elementNameParameterIds) {
+      signature.addInt(this._elementNameParameterIds!.length);
+      for (var x in this._elementNameParameterIds!) {
         signature.addInt(x);
       }
     }
     if (this._usedElements == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._usedElements.length);
-      for (var x in this._usedElements) {
+      signature.addInt(this._usedElements!.length);
+      for (var x in this._usedElements!) {
         signature.addInt(x);
       }
     }
     if (this._usedElementKinds == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._usedElementKinds.length);
-      for (var x in this._usedElementKinds) {
+      signature.addInt(this._usedElementKinds!.length);
+      for (var x in this._usedElementKinds!) {
         signature.addInt(x.index);
       }
     }
     if (this._usedElementOffsets == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._usedElementOffsets.length);
-      for (var x in this._usedElementOffsets) {
+      signature.addInt(this._usedElementOffsets!.length);
+      for (var x in this._usedElementOffsets!) {
         signature.addInt(x);
       }
     }
     if (this._usedElementLengths == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._usedElementLengths.length);
-      for (var x in this._usedElementLengths) {
+      signature.addInt(this._usedElementLengths!.length);
+      for (var x in this._usedElementLengths!) {
         signature.addInt(x);
       }
     }
     if (this._usedElementIsQualifiedFlags == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._usedElementIsQualifiedFlags.length);
-      for (var x in this._usedElementIsQualifiedFlags) {
+      signature.addInt(this._usedElementIsQualifiedFlags!.length);
+      for (var x in this._usedElementIsQualifiedFlags!) {
         signature.addBool(x);
       }
     }
     if (this._usedNames == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._usedNames.length);
-      for (var x in this._usedNames) {
+      signature.addInt(this._usedNames!.length);
+      for (var x in this._usedNames!) {
         signature.addInt(x);
       }
     }
     if (this._usedNameKinds == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._usedNameKinds.length);
-      for (var x in this._usedNameKinds) {
+      signature.addInt(this._usedNameKinds!.length);
+      for (var x in this._usedNameKinds!) {
         signature.addInt(x.index);
       }
     }
     if (this._usedNameOffsets == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._usedNameOffsets.length);
-      for (var x in this._usedNameOffsets) {
+      signature.addInt(this._usedNameOffsets!.length);
+      for (var x in this._usedNameOffsets!) {
         signature.addInt(x);
       }
     }
     if (this._usedNameIsQualifiedFlags == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._usedNameIsQualifiedFlags.length);
-      for (var x in this._usedNameIsQualifiedFlags) {
+      signature.addInt(this._usedNameIsQualifiedFlags!.length);
+      for (var x in this._usedNameIsQualifiedFlags!) {
         signature.addBool(x);
       }
     }
     if (this._supertypes == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._supertypes.length);
-      for (var x in this._supertypes) {
+      signature.addInt(this._supertypes!.length);
+      for (var x in this._supertypes!) {
         signature.addInt(x);
       }
     }
     if (this._subtypes == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._subtypes.length);
-      for (var x in this._subtypes) {
-        x?.collectApiSignature(signature);
+      signature.addInt(this._subtypes!.length);
+      for (var x in this._subtypes!) {
+        x.collectApiSignature(signature);
       }
     }
   }
@@ -1330,98 +1337,98 @@
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
-    fb.Offset offset_elementKinds;
-    fb.Offset offset_elementNameClassMemberIds;
-    fb.Offset offset_elementNameParameterIds;
-    fb.Offset offset_elementNameUnitMemberIds;
-    fb.Offset offset_elementUnits;
-    fb.Offset offset_strings;
-    fb.Offset offset_subtypes;
-    fb.Offset offset_supertypes;
-    fb.Offset offset_unitLibraryUris;
-    fb.Offset offset_unitUnitUris;
-    fb.Offset offset_usedElementIsQualifiedFlags;
-    fb.Offset offset_usedElementKinds;
-    fb.Offset offset_usedElementLengths;
-    fb.Offset offset_usedElementOffsets;
-    fb.Offset offset_usedElements;
-    fb.Offset offset_usedNameIsQualifiedFlags;
-    fb.Offset offset_usedNameKinds;
-    fb.Offset offset_usedNameOffsets;
-    fb.Offset offset_usedNames;
-    if (!(_elementKinds == null || _elementKinds.isEmpty)) {
+    fb.Offset? offset_elementKinds;
+    fb.Offset? offset_elementNameClassMemberIds;
+    fb.Offset? offset_elementNameParameterIds;
+    fb.Offset? offset_elementNameUnitMemberIds;
+    fb.Offset? offset_elementUnits;
+    fb.Offset? offset_strings;
+    fb.Offset? offset_subtypes;
+    fb.Offset? offset_supertypes;
+    fb.Offset? offset_unitLibraryUris;
+    fb.Offset? offset_unitUnitUris;
+    fb.Offset? offset_usedElementIsQualifiedFlags;
+    fb.Offset? offset_usedElementKinds;
+    fb.Offset? offset_usedElementLengths;
+    fb.Offset? offset_usedElementOffsets;
+    fb.Offset? offset_usedElements;
+    fb.Offset? offset_usedNameIsQualifiedFlags;
+    fb.Offset? offset_usedNameKinds;
+    fb.Offset? offset_usedNameOffsets;
+    fb.Offset? offset_usedNames;
+    if (!(_elementKinds == null || _elementKinds!.isEmpty)) {
       offset_elementKinds =
-          fbBuilder.writeListUint8(_elementKinds.map((b) => b.index).toList());
+          fbBuilder.writeListUint8(_elementKinds!.map((b) => b.index).toList());
     }
     if (!(_elementNameClassMemberIds == null ||
-        _elementNameClassMemberIds.isEmpty)) {
+        _elementNameClassMemberIds!.isEmpty)) {
       offset_elementNameClassMemberIds =
-          fbBuilder.writeListUint32(_elementNameClassMemberIds);
+          fbBuilder.writeListUint32(_elementNameClassMemberIds!);
     }
     if (!(_elementNameParameterIds == null ||
-        _elementNameParameterIds.isEmpty)) {
+        _elementNameParameterIds!.isEmpty)) {
       offset_elementNameParameterIds =
-          fbBuilder.writeListUint32(_elementNameParameterIds);
+          fbBuilder.writeListUint32(_elementNameParameterIds!);
     }
     if (!(_elementNameUnitMemberIds == null ||
-        _elementNameUnitMemberIds.isEmpty)) {
+        _elementNameUnitMemberIds!.isEmpty)) {
       offset_elementNameUnitMemberIds =
-          fbBuilder.writeListUint32(_elementNameUnitMemberIds);
+          fbBuilder.writeListUint32(_elementNameUnitMemberIds!);
     }
-    if (!(_elementUnits == null || _elementUnits.isEmpty)) {
-      offset_elementUnits = fbBuilder.writeListUint32(_elementUnits);
+    if (!(_elementUnits == null || _elementUnits!.isEmpty)) {
+      offset_elementUnits = fbBuilder.writeListUint32(_elementUnits!);
     }
-    if (!(_strings == null || _strings.isEmpty)) {
+    if (!(_strings == null || _strings!.isEmpty)) {
       offset_strings = fbBuilder
-          .writeList(_strings.map((b) => fbBuilder.writeString(b)).toList());
+          .writeList(_strings!.map((b) => fbBuilder.writeString(b)).toList());
     }
-    if (!(_subtypes == null || _subtypes.isEmpty)) {
+    if (!(_subtypes == null || _subtypes!.isEmpty)) {
       offset_subtypes = fbBuilder
-          .writeList(_subtypes.map((b) => b.finish(fbBuilder)).toList());
+          .writeList(_subtypes!.map((b) => b.finish(fbBuilder)).toList());
     }
-    if (!(_supertypes == null || _supertypes.isEmpty)) {
-      offset_supertypes = fbBuilder.writeListUint32(_supertypes);
+    if (!(_supertypes == null || _supertypes!.isEmpty)) {
+      offset_supertypes = fbBuilder.writeListUint32(_supertypes!);
     }
-    if (!(_unitLibraryUris == null || _unitLibraryUris.isEmpty)) {
-      offset_unitLibraryUris = fbBuilder.writeListUint32(_unitLibraryUris);
+    if (!(_unitLibraryUris == null || _unitLibraryUris!.isEmpty)) {
+      offset_unitLibraryUris = fbBuilder.writeListUint32(_unitLibraryUris!);
     }
-    if (!(_unitUnitUris == null || _unitUnitUris.isEmpty)) {
-      offset_unitUnitUris = fbBuilder.writeListUint32(_unitUnitUris);
+    if (!(_unitUnitUris == null || _unitUnitUris!.isEmpty)) {
+      offset_unitUnitUris = fbBuilder.writeListUint32(_unitUnitUris!);
     }
     if (!(_usedElementIsQualifiedFlags == null ||
-        _usedElementIsQualifiedFlags.isEmpty)) {
+        _usedElementIsQualifiedFlags!.isEmpty)) {
       offset_usedElementIsQualifiedFlags =
-          fbBuilder.writeListBool(_usedElementIsQualifiedFlags);
+          fbBuilder.writeListBool(_usedElementIsQualifiedFlags!);
     }
-    if (!(_usedElementKinds == null || _usedElementKinds.isEmpty)) {
+    if (!(_usedElementKinds == null || _usedElementKinds!.isEmpty)) {
       offset_usedElementKinds = fbBuilder
-          .writeListUint8(_usedElementKinds.map((b) => b.index).toList());
+          .writeListUint8(_usedElementKinds!.map((b) => b.index).toList());
     }
-    if (!(_usedElementLengths == null || _usedElementLengths.isEmpty)) {
+    if (!(_usedElementLengths == null || _usedElementLengths!.isEmpty)) {
       offset_usedElementLengths =
-          fbBuilder.writeListUint32(_usedElementLengths);
+          fbBuilder.writeListUint32(_usedElementLengths!);
     }
-    if (!(_usedElementOffsets == null || _usedElementOffsets.isEmpty)) {
+    if (!(_usedElementOffsets == null || _usedElementOffsets!.isEmpty)) {
       offset_usedElementOffsets =
-          fbBuilder.writeListUint32(_usedElementOffsets);
+          fbBuilder.writeListUint32(_usedElementOffsets!);
     }
-    if (!(_usedElements == null || _usedElements.isEmpty)) {
-      offset_usedElements = fbBuilder.writeListUint32(_usedElements);
+    if (!(_usedElements == null || _usedElements!.isEmpty)) {
+      offset_usedElements = fbBuilder.writeListUint32(_usedElements!);
     }
     if (!(_usedNameIsQualifiedFlags == null ||
-        _usedNameIsQualifiedFlags.isEmpty)) {
+        _usedNameIsQualifiedFlags!.isEmpty)) {
       offset_usedNameIsQualifiedFlags =
-          fbBuilder.writeListBool(_usedNameIsQualifiedFlags);
+          fbBuilder.writeListBool(_usedNameIsQualifiedFlags!);
     }
-    if (!(_usedNameKinds == null || _usedNameKinds.isEmpty)) {
-      offset_usedNameKinds =
-          fbBuilder.writeListUint8(_usedNameKinds.map((b) => b.index).toList());
+    if (!(_usedNameKinds == null || _usedNameKinds!.isEmpty)) {
+      offset_usedNameKinds = fbBuilder
+          .writeListUint8(_usedNameKinds!.map((b) => b.index).toList());
     }
-    if (!(_usedNameOffsets == null || _usedNameOffsets.isEmpty)) {
-      offset_usedNameOffsets = fbBuilder.writeListUint32(_usedNameOffsets);
+    if (!(_usedNameOffsets == null || _usedNameOffsets!.isEmpty)) {
+      offset_usedNameOffsets = fbBuilder.writeListUint32(_usedNameOffsets!);
     }
-    if (!(_usedNames == null || _usedNames.isEmpty)) {
-      offset_usedNames = fbBuilder.writeListUint32(_usedNames);
+    if (!(_usedNames == null || _usedNames!.isEmpty)) {
+      offset_usedNames = fbBuilder.writeListUint32(_usedNames!);
     }
     fbBuilder.startTable();
     if (offset_elementKinds != null) {
@@ -1510,168 +1517,149 @@
 
   _AnalysisDriverUnitIndexImpl(this._bc, this._bcOffset);
 
-  List<idl.IndexSyntheticElementKind> _elementKinds;
-  List<int> _elementNameClassMemberIds;
-  List<int> _elementNameParameterIds;
-  List<int> _elementNameUnitMemberIds;
-  List<int> _elementUnits;
-  int _nullStringId;
-  List<String> _strings;
-  List<idl.AnalysisDriverSubtype> _subtypes;
-  List<int> _supertypes;
-  List<int> _unitLibraryUris;
-  List<int> _unitUnitUris;
-  List<bool> _usedElementIsQualifiedFlags;
-  List<idl.IndexRelationKind> _usedElementKinds;
-  List<int> _usedElementLengths;
-  List<int> _usedElementOffsets;
-  List<int> _usedElements;
-  List<bool> _usedNameIsQualifiedFlags;
-  List<idl.IndexRelationKind> _usedNameKinds;
-  List<int> _usedNameOffsets;
-  List<int> _usedNames;
+  List<idl.IndexSyntheticElementKind>? _elementKinds;
+  List<int>? _elementNameClassMemberIds;
+  List<int>? _elementNameParameterIds;
+  List<int>? _elementNameUnitMemberIds;
+  List<int>? _elementUnits;
+  int? _nullStringId;
+  List<String>? _strings;
+  List<idl.AnalysisDriverSubtype>? _subtypes;
+  List<int>? _supertypes;
+  List<int>? _unitLibraryUris;
+  List<int>? _unitUnitUris;
+  List<bool>? _usedElementIsQualifiedFlags;
+  List<idl.IndexRelationKind>? _usedElementKinds;
+  List<int>? _usedElementLengths;
+  List<int>? _usedElementOffsets;
+  List<int>? _usedElements;
+  List<bool>? _usedNameIsQualifiedFlags;
+  List<idl.IndexRelationKind>? _usedNameKinds;
+  List<int>? _usedNameOffsets;
+  List<int>? _usedNames;
 
   @override
   List<idl.IndexSyntheticElementKind> get elementKinds {
-    _elementKinds ??= const fb.ListReader<idl.IndexSyntheticElementKind>(
+    return _elementKinds ??= const fb.ListReader<idl.IndexSyntheticElementKind>(
             _IndexSyntheticElementKindReader())
         .vTableGet(_bc, _bcOffset, 4, const <idl.IndexSyntheticElementKind>[]);
-    return _elementKinds;
   }
 
   @override
   List<int> get elementNameClassMemberIds {
-    _elementNameClassMemberIds ??=
+    return _elementNameClassMemberIds ??=
         const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 7, const <int>[]);
-    return _elementNameClassMemberIds;
   }
 
   @override
   List<int> get elementNameParameterIds {
-    _elementNameParameterIds ??=
+    return _elementNameParameterIds ??=
         const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 8, const <int>[]);
-    return _elementNameParameterIds;
   }
 
   @override
   List<int> get elementNameUnitMemberIds {
-    _elementNameUnitMemberIds ??=
+    return _elementNameUnitMemberIds ??=
         const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 6, const <int>[]);
-    return _elementNameUnitMemberIds;
   }
 
   @override
   List<int> get elementUnits {
-    _elementUnits ??=
+    return _elementUnits ??=
         const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 5, const <int>[]);
-    return _elementUnits;
   }
 
   @override
   int get nullStringId {
-    _nullStringId ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 1, 0);
-    return _nullStringId;
+    return _nullStringId ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 1, 0);
   }
 
   @override
   List<String> get strings {
-    _strings ??= const fb.ListReader<String>(fb.StringReader())
+    return _strings ??= const fb.ListReader<String>(fb.StringReader())
         .vTableGet(_bc, _bcOffset, 0, const <String>[]);
-    return _strings;
   }
 
   @override
   List<idl.AnalysisDriverSubtype> get subtypes {
-    _subtypes ??= const fb.ListReader<idl.AnalysisDriverSubtype>(
+    return _subtypes ??= const fb.ListReader<idl.AnalysisDriverSubtype>(
             _AnalysisDriverSubtypeReader())
         .vTableGet(_bc, _bcOffset, 19, const <idl.AnalysisDriverSubtype>[]);
-    return _subtypes;
   }
 
   @override
   List<int> get supertypes {
-    _supertypes ??= const fb.Uint32ListReader()
+    return _supertypes ??= const fb.Uint32ListReader()
         .vTableGet(_bc, _bcOffset, 18, const <int>[]);
-    return _supertypes;
   }
 
   @override
   List<int> get unitLibraryUris {
-    _unitLibraryUris ??=
+    return _unitLibraryUris ??=
         const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 2, const <int>[]);
-    return _unitLibraryUris;
   }
 
   @override
   List<int> get unitUnitUris {
-    _unitUnitUris ??=
+    return _unitUnitUris ??=
         const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 3, const <int>[]);
-    return _unitUnitUris;
   }
 
   @override
   List<bool> get usedElementIsQualifiedFlags {
-    _usedElementIsQualifiedFlags ??=
+    return _usedElementIsQualifiedFlags ??=
         const fb.BoolListReader().vTableGet(_bc, _bcOffset, 13, const <bool>[]);
-    return _usedElementIsQualifiedFlags;
   }
 
   @override
   List<idl.IndexRelationKind> get usedElementKinds {
-    _usedElementKinds ??=
+    return _usedElementKinds ??=
         const fb.ListReader<idl.IndexRelationKind>(_IndexRelationKindReader())
             .vTableGet(_bc, _bcOffset, 10, const <idl.IndexRelationKind>[]);
-    return _usedElementKinds;
   }
 
   @override
   List<int> get usedElementLengths {
-    _usedElementLengths ??= const fb.Uint32ListReader()
+    return _usedElementLengths ??= const fb.Uint32ListReader()
         .vTableGet(_bc, _bcOffset, 12, const <int>[]);
-    return _usedElementLengths;
   }
 
   @override
   List<int> get usedElementOffsets {
-    _usedElementOffsets ??= const fb.Uint32ListReader()
+    return _usedElementOffsets ??= const fb.Uint32ListReader()
         .vTableGet(_bc, _bcOffset, 11, const <int>[]);
-    return _usedElementOffsets;
   }
 
   @override
   List<int> get usedElements {
-    _usedElements ??=
+    return _usedElements ??=
         const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 9, const <int>[]);
-    return _usedElements;
   }
 
   @override
   List<bool> get usedNameIsQualifiedFlags {
-    _usedNameIsQualifiedFlags ??=
+    return _usedNameIsQualifiedFlags ??=
         const fb.BoolListReader().vTableGet(_bc, _bcOffset, 17, const <bool>[]);
-    return _usedNameIsQualifiedFlags;
   }
 
   @override
   List<idl.IndexRelationKind> get usedNameKinds {
-    _usedNameKinds ??=
+    return _usedNameKinds ??=
         const fb.ListReader<idl.IndexRelationKind>(_IndexRelationKindReader())
             .vTableGet(_bc, _bcOffset, 15, const <idl.IndexRelationKind>[]);
-    return _usedNameKinds;
   }
 
   @override
   List<int> get usedNameOffsets {
-    _usedNameOffsets ??= const fb.Uint32ListReader()
+    return _usedNameOffsets ??= const fb.Uint32ListReader()
         .vTableGet(_bc, _bcOffset, 16, const <int>[]);
-    return _usedNameOffsets;
   }
 
   @override
   List<int> get usedNames {
-    _usedNames ??= const fb.Uint32ListReader()
+    return _usedNames ??= const fb.Uint32ListReader()
         .vTableGet(_bc, _bcOffset, 14, const <int>[]);
-    return _usedNames;
   }
 }
 
@@ -1680,77 +1668,99 @@
   @override
   Map<String, Object> toJson() {
     Map<String, Object> _result = <String, Object>{};
-    if (elementKinds.isNotEmpty) {
-      _result["elementKinds"] = elementKinds
+    var local_elementKinds = elementKinds;
+    if (local_elementKinds.isNotEmpty) {
+      _result["elementKinds"] = local_elementKinds
           .map((_value) => _value.toString().split('.')[1])
           .toList();
     }
-    if (elementNameClassMemberIds.isNotEmpty) {
-      _result["elementNameClassMemberIds"] = elementNameClassMemberIds;
+    var local_elementNameClassMemberIds = elementNameClassMemberIds;
+    if (local_elementNameClassMemberIds.isNotEmpty) {
+      _result["elementNameClassMemberIds"] = local_elementNameClassMemberIds;
     }
-    if (elementNameParameterIds.isNotEmpty) {
-      _result["elementNameParameterIds"] = elementNameParameterIds;
+    var local_elementNameParameterIds = elementNameParameterIds;
+    if (local_elementNameParameterIds.isNotEmpty) {
+      _result["elementNameParameterIds"] = local_elementNameParameterIds;
     }
-    if (elementNameUnitMemberIds.isNotEmpty) {
-      _result["elementNameUnitMemberIds"] = elementNameUnitMemberIds;
+    var local_elementNameUnitMemberIds = elementNameUnitMemberIds;
+    if (local_elementNameUnitMemberIds.isNotEmpty) {
+      _result["elementNameUnitMemberIds"] = local_elementNameUnitMemberIds;
     }
-    if (elementUnits.isNotEmpty) {
-      _result["elementUnits"] = elementUnits;
+    var local_elementUnits = elementUnits;
+    if (local_elementUnits.isNotEmpty) {
+      _result["elementUnits"] = local_elementUnits;
     }
-    if (nullStringId != 0) {
-      _result["nullStringId"] = nullStringId;
+    var local_nullStringId = nullStringId;
+    if (local_nullStringId != 0) {
+      _result["nullStringId"] = local_nullStringId;
     }
-    if (strings.isNotEmpty) {
-      _result["strings"] = strings;
+    var local_strings = strings;
+    if (local_strings.isNotEmpty) {
+      _result["strings"] = local_strings;
     }
-    if (subtypes.isNotEmpty) {
-      _result["subtypes"] = subtypes.map((_value) => _value.toJson()).toList();
+    var local_subtypes = subtypes;
+    if (local_subtypes.isNotEmpty) {
+      _result["subtypes"] =
+          local_subtypes.map((_value) => _value.toJson()).toList();
     }
-    if (supertypes.isNotEmpty) {
-      _result["supertypes"] = supertypes;
+    var local_supertypes = supertypes;
+    if (local_supertypes.isNotEmpty) {
+      _result["supertypes"] = local_supertypes;
     }
-    if (unitLibraryUris.isNotEmpty) {
-      _result["unitLibraryUris"] = unitLibraryUris;
+    var local_unitLibraryUris = unitLibraryUris;
+    if (local_unitLibraryUris.isNotEmpty) {
+      _result["unitLibraryUris"] = local_unitLibraryUris;
     }
-    if (unitUnitUris.isNotEmpty) {
-      _result["unitUnitUris"] = unitUnitUris;
+    var local_unitUnitUris = unitUnitUris;
+    if (local_unitUnitUris.isNotEmpty) {
+      _result["unitUnitUris"] = local_unitUnitUris;
     }
-    if (usedElementIsQualifiedFlags.isNotEmpty) {
-      _result["usedElementIsQualifiedFlags"] = usedElementIsQualifiedFlags;
+    var local_usedElementIsQualifiedFlags = usedElementIsQualifiedFlags;
+    if (local_usedElementIsQualifiedFlags.isNotEmpty) {
+      _result["usedElementIsQualifiedFlags"] =
+          local_usedElementIsQualifiedFlags;
     }
-    if (usedElementKinds.isNotEmpty) {
-      _result["usedElementKinds"] = usedElementKinds
+    var local_usedElementKinds = usedElementKinds;
+    if (local_usedElementKinds.isNotEmpty) {
+      _result["usedElementKinds"] = local_usedElementKinds
           .map((_value) => _value.toString().split('.')[1])
           .toList();
     }
-    if (usedElementLengths.isNotEmpty) {
-      _result["usedElementLengths"] = usedElementLengths;
+    var local_usedElementLengths = usedElementLengths;
+    if (local_usedElementLengths.isNotEmpty) {
+      _result["usedElementLengths"] = local_usedElementLengths;
     }
-    if (usedElementOffsets.isNotEmpty) {
-      _result["usedElementOffsets"] = usedElementOffsets;
+    var local_usedElementOffsets = usedElementOffsets;
+    if (local_usedElementOffsets.isNotEmpty) {
+      _result["usedElementOffsets"] = local_usedElementOffsets;
     }
-    if (usedElements.isNotEmpty) {
-      _result["usedElements"] = usedElements;
+    var local_usedElements = usedElements;
+    if (local_usedElements.isNotEmpty) {
+      _result["usedElements"] = local_usedElements;
     }
-    if (usedNameIsQualifiedFlags.isNotEmpty) {
-      _result["usedNameIsQualifiedFlags"] = usedNameIsQualifiedFlags;
+    var local_usedNameIsQualifiedFlags = usedNameIsQualifiedFlags;
+    if (local_usedNameIsQualifiedFlags.isNotEmpty) {
+      _result["usedNameIsQualifiedFlags"] = local_usedNameIsQualifiedFlags;
     }
-    if (usedNameKinds.isNotEmpty) {
-      _result["usedNameKinds"] = usedNameKinds
+    var local_usedNameKinds = usedNameKinds;
+    if (local_usedNameKinds.isNotEmpty) {
+      _result["usedNameKinds"] = local_usedNameKinds
           .map((_value) => _value.toString().split('.')[1])
           .toList();
     }
-    if (usedNameOffsets.isNotEmpty) {
-      _result["usedNameOffsets"] = usedNameOffsets;
+    var local_usedNameOffsets = usedNameOffsets;
+    if (local_usedNameOffsets.isNotEmpty) {
+      _result["usedNameOffsets"] = local_usedNameOffsets;
     }
-    if (usedNames.isNotEmpty) {
-      _result["usedNames"] = usedNames;
+    var local_usedNames = usedNames;
+    if (local_usedNames.isNotEmpty) {
+      _result["usedNames"] = local_usedNames;
     }
     return _result;
   }
 
   @override
-  Map<String, Object> toMap() => {
+  Map<String, Object?> toMap() => {
         "elementKinds": elementKinds,
         "elementNameClassMemberIds": elementNameClassMemberIds,
         "elementNameParameterIds": elementNameParameterIds,
@@ -1780,11 +1790,11 @@
 class AnalysisDriverUnlinkedUnitBuilder extends Object
     with _AnalysisDriverUnlinkedUnitMixin
     implements idl.AnalysisDriverUnlinkedUnit {
-  List<String> _definedClassMemberNames;
-  List<String> _definedTopLevelNames;
-  List<String> _referencedNames;
-  List<String> _subtypedNames;
-  UnlinkedUnit2Builder _unit2;
+  List<String>? _definedClassMemberNames;
+  List<String>? _definedTopLevelNames;
+  List<String>? _referencedNames;
+  List<String>? _subtypedNames;
+  UnlinkedUnit2Builder? _unit2;
 
   @override
   List<String> get definedClassMemberNames =>
@@ -1821,19 +1831,19 @@
   }
 
   @override
-  UnlinkedUnit2Builder get unit2 => _unit2;
+  UnlinkedUnit2Builder? get unit2 => _unit2;
 
   /// Unlinked information for the unit.
-  set unit2(UnlinkedUnit2Builder value) {
+  set unit2(UnlinkedUnit2Builder? value) {
     this._unit2 = value;
   }
 
   AnalysisDriverUnlinkedUnitBuilder(
-      {List<String> definedClassMemberNames,
-      List<String> definedTopLevelNames,
-      List<String> referencedNames,
-      List<String> subtypedNames,
-      UnlinkedUnit2Builder unit2})
+      {List<String>? definedClassMemberNames,
+      List<String>? definedTopLevelNames,
+      List<String>? referencedNames,
+      List<String>? subtypedNames,
+      UnlinkedUnit2Builder? unit2})
       : _definedClassMemberNames = definedClassMemberNames,
         _definedTopLevelNames = definedTopLevelNames,
         _referencedNames = referencedNames,
@@ -1850,32 +1860,32 @@
     if (this._referencedNames == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._referencedNames.length);
-      for (var x in this._referencedNames) {
+      signature.addInt(this._referencedNames!.length);
+      for (var x in this._referencedNames!) {
         signature.addString(x);
       }
     }
     if (this._definedTopLevelNames == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._definedTopLevelNames.length);
-      for (var x in this._definedTopLevelNames) {
+      signature.addInt(this._definedTopLevelNames!.length);
+      for (var x in this._definedTopLevelNames!) {
         signature.addString(x);
       }
     }
     if (this._definedClassMemberNames == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._definedClassMemberNames.length);
-      for (var x in this._definedClassMemberNames) {
+      signature.addInt(this._definedClassMemberNames!.length);
+      for (var x in this._definedClassMemberNames!) {
         signature.addString(x);
       }
     }
     if (this._subtypedNames == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._subtypedNames.length);
-      for (var x in this._subtypedNames) {
+      signature.addInt(this._subtypedNames!.length);
+      for (var x in this._subtypedNames!) {
         signature.addString(x);
       }
     }
@@ -1889,32 +1899,32 @@
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
-    fb.Offset offset_definedClassMemberNames;
-    fb.Offset offset_definedTopLevelNames;
-    fb.Offset offset_referencedNames;
-    fb.Offset offset_subtypedNames;
-    fb.Offset offset_unit2;
+    fb.Offset? offset_definedClassMemberNames;
+    fb.Offset? offset_definedTopLevelNames;
+    fb.Offset? offset_referencedNames;
+    fb.Offset? offset_subtypedNames;
+    fb.Offset? offset_unit2;
     if (!(_definedClassMemberNames == null ||
-        _definedClassMemberNames.isEmpty)) {
+        _definedClassMemberNames!.isEmpty)) {
       offset_definedClassMemberNames = fbBuilder.writeList(
-          _definedClassMemberNames
+          _definedClassMemberNames!
               .map((b) => fbBuilder.writeString(b))
               .toList());
     }
-    if (!(_definedTopLevelNames == null || _definedTopLevelNames.isEmpty)) {
+    if (!(_definedTopLevelNames == null || _definedTopLevelNames!.isEmpty)) {
       offset_definedTopLevelNames = fbBuilder.writeList(
-          _definedTopLevelNames.map((b) => fbBuilder.writeString(b)).toList());
+          _definedTopLevelNames!.map((b) => fbBuilder.writeString(b)).toList());
     }
-    if (!(_referencedNames == null || _referencedNames.isEmpty)) {
+    if (!(_referencedNames == null || _referencedNames!.isEmpty)) {
       offset_referencedNames = fbBuilder.writeList(
-          _referencedNames.map((b) => fbBuilder.writeString(b)).toList());
+          _referencedNames!.map((b) => fbBuilder.writeString(b)).toList());
     }
-    if (!(_subtypedNames == null || _subtypedNames.isEmpty)) {
+    if (!(_subtypedNames == null || _subtypedNames!.isEmpty)) {
       offset_subtypedNames = fbBuilder.writeList(
-          _subtypedNames.map((b) => fbBuilder.writeString(b)).toList());
+          _subtypedNames!.map((b) => fbBuilder.writeString(b)).toList());
     }
     if (_unit2 != null) {
-      offset_unit2 = _unit2.finish(fbBuilder);
+      offset_unit2 = _unit2!.finish(fbBuilder);
     }
     fbBuilder.startTable();
     if (offset_definedClassMemberNames != null) {
@@ -1960,44 +1970,42 @@
 
   _AnalysisDriverUnlinkedUnitImpl(this._bc, this._bcOffset);
 
-  List<String> _definedClassMemberNames;
-  List<String> _definedTopLevelNames;
-  List<String> _referencedNames;
-  List<String> _subtypedNames;
-  idl.UnlinkedUnit2 _unit2;
+  List<String>? _definedClassMemberNames;
+  List<String>? _definedTopLevelNames;
+  List<String>? _referencedNames;
+  List<String>? _subtypedNames;
+  idl.UnlinkedUnit2? _unit2;
 
   @override
   List<String> get definedClassMemberNames {
-    _definedClassMemberNames ??= const fb.ListReader<String>(fb.StringReader())
-        .vTableGet(_bc, _bcOffset, 2, const <String>[]);
-    return _definedClassMemberNames;
+    return _definedClassMemberNames ??=
+        const fb.ListReader<String>(fb.StringReader())
+            .vTableGet(_bc, _bcOffset, 2, const <String>[]);
   }
 
   @override
   List<String> get definedTopLevelNames {
-    _definedTopLevelNames ??= const fb.ListReader<String>(fb.StringReader())
-        .vTableGet(_bc, _bcOffset, 1, const <String>[]);
-    return _definedTopLevelNames;
+    return _definedTopLevelNames ??=
+        const fb.ListReader<String>(fb.StringReader())
+            .vTableGet(_bc, _bcOffset, 1, const <String>[]);
   }
 
   @override
   List<String> get referencedNames {
-    _referencedNames ??= const fb.ListReader<String>(fb.StringReader())
+    return _referencedNames ??= const fb.ListReader<String>(fb.StringReader())
         .vTableGet(_bc, _bcOffset, 0, const <String>[]);
-    return _referencedNames;
   }
 
   @override
   List<String> get subtypedNames {
-    _subtypedNames ??= const fb.ListReader<String>(fb.StringReader())
+    return _subtypedNames ??= const fb.ListReader<String>(fb.StringReader())
         .vTableGet(_bc, _bcOffset, 3, const <String>[]);
-    return _subtypedNames;
   }
 
   @override
-  idl.UnlinkedUnit2 get unit2 {
-    _unit2 ??= const _UnlinkedUnit2Reader().vTableGet(_bc, _bcOffset, 4, null);
-    return _unit2;
+  idl.UnlinkedUnit2? get unit2 {
+    return _unit2 ??=
+        const _UnlinkedUnit2Reader().vTableGetOrNull(_bc, _bcOffset, 4);
   }
 }
 
@@ -2006,26 +2014,31 @@
   @override
   Map<String, Object> toJson() {
     Map<String, Object> _result = <String, Object>{};
-    if (definedClassMemberNames.isNotEmpty) {
-      _result["definedClassMemberNames"] = definedClassMemberNames;
+    var local_definedClassMemberNames = definedClassMemberNames;
+    if (local_definedClassMemberNames.isNotEmpty) {
+      _result["definedClassMemberNames"] = local_definedClassMemberNames;
     }
-    if (definedTopLevelNames.isNotEmpty) {
-      _result["definedTopLevelNames"] = definedTopLevelNames;
+    var local_definedTopLevelNames = definedTopLevelNames;
+    if (local_definedTopLevelNames.isNotEmpty) {
+      _result["definedTopLevelNames"] = local_definedTopLevelNames;
     }
-    if (referencedNames.isNotEmpty) {
-      _result["referencedNames"] = referencedNames;
+    var local_referencedNames = referencedNames;
+    if (local_referencedNames.isNotEmpty) {
+      _result["referencedNames"] = local_referencedNames;
     }
-    if (subtypedNames.isNotEmpty) {
-      _result["subtypedNames"] = subtypedNames;
+    var local_subtypedNames = subtypedNames;
+    if (local_subtypedNames.isNotEmpty) {
+      _result["subtypedNames"] = local_subtypedNames;
     }
-    if (unit2 != null) {
-      _result["unit2"] = unit2.toJson();
+    var local_unit2 = unit2;
+    if (local_unit2 != null) {
+      _result["unit2"] = local_unit2.toJson();
     }
     return _result;
   }
 
   @override
-  Map<String, Object> toMap() => {
+  Map<String, Object?> toMap() => {
         "definedClassMemberNames": definedClassMemberNames,
         "definedTopLevelNames": definedTopLevelNames,
         "referencedNames": referencedNames,
@@ -2040,31 +2053,31 @@
 class AvailableDeclarationBuilder extends Object
     with _AvailableDeclarationMixin
     implements idl.AvailableDeclaration {
-  List<AvailableDeclarationBuilder> _children;
-  int _codeLength;
-  int _codeOffset;
-  String _defaultArgumentListString;
-  List<int> _defaultArgumentListTextRanges;
-  String _docComplete;
-  String _docSummary;
-  int _fieldMask;
-  bool _isAbstract;
-  bool _isConst;
-  bool _isDeprecated;
-  bool _isFinal;
-  bool _isStatic;
-  idl.AvailableDeclarationKind _kind;
-  int _locationOffset;
-  int _locationStartColumn;
-  int _locationStartLine;
-  String _name;
-  List<String> _parameterNames;
-  String _parameters;
-  List<String> _parameterTypes;
-  List<String> _relevanceTags;
-  int _requiredParameterCount;
-  String _returnType;
-  String _typeParameters;
+  List<AvailableDeclarationBuilder>? _children;
+  int? _codeLength;
+  int? _codeOffset;
+  String? _defaultArgumentListString;
+  List<int>? _defaultArgumentListTextRanges;
+  String? _docComplete;
+  String? _docSummary;
+  int? _fieldMask;
+  bool? _isAbstract;
+  bool? _isConst;
+  bool? _isDeprecated;
+  bool? _isFinal;
+  bool? _isStatic;
+  idl.AvailableDeclarationKind? _kind;
+  int? _locationOffset;
+  int? _locationStartColumn;
+  int? _locationStartLine;
+  String? _name;
+  List<String>? _parameterNames;
+  String? _parameters;
+  List<String>? _parameterTypes;
+  List<String>? _relevanceTags;
+  int? _requiredParameterCount;
+  String? _returnType;
+  String? _typeParameters;
 
   @override
   List<AvailableDeclarationBuilder> get children =>
@@ -2078,7 +2091,7 @@
   int get codeLength => _codeLength ??= 0;
 
   set codeLength(int value) {
-    assert(value == null || value >= 0);
+    assert(value >= 0);
     this._codeLength = value;
   }
 
@@ -2086,7 +2099,7 @@
   int get codeOffset => _codeOffset ??= 0;
 
   set codeOffset(int value) {
-    assert(value == null || value >= 0);
+    assert(value >= 0);
     this._codeOffset = value;
   }
 
@@ -2102,7 +2115,7 @@
       _defaultArgumentListTextRanges ??= <int>[];
 
   set defaultArgumentListTextRanges(List<int> value) {
-    assert(value == null || value.every((e) => e >= 0));
+    assert(value.every((e) => e >= 0));
     this._defaultArgumentListTextRanges = value;
   }
 
@@ -2124,7 +2137,7 @@
   int get fieldMask => _fieldMask ??= 0;
 
   set fieldMask(int value) {
-    assert(value == null || value >= 0);
+    assert(value >= 0);
     this._fieldMask = value;
   }
 
@@ -2176,7 +2189,7 @@
   int get locationOffset => _locationOffset ??= 0;
 
   set locationOffset(int value) {
-    assert(value == null || value >= 0);
+    assert(value >= 0);
     this._locationOffset = value;
   }
 
@@ -2184,7 +2197,7 @@
   int get locationStartColumn => _locationStartColumn ??= 0;
 
   set locationStartColumn(int value) {
-    assert(value == null || value >= 0);
+    assert(value >= 0);
     this._locationStartColumn = value;
   }
 
@@ -2192,7 +2205,7 @@
   int get locationStartLine => _locationStartLine ??= 0;
 
   set locationStartLine(int value) {
-    assert(value == null || value >= 0);
+    assert(value >= 0);
     this._locationStartLine = value;
   }
 
@@ -2241,7 +2254,7 @@
   int get requiredParameterCount => _requiredParameterCount ??= 0;
 
   set requiredParameterCount(int value) {
-    assert(value == null || value >= 0);
+    assert(value >= 0);
     this._requiredParameterCount = value;
   }
 
@@ -2260,31 +2273,31 @@
   }
 
   AvailableDeclarationBuilder(
-      {List<AvailableDeclarationBuilder> children,
-      int codeLength,
-      int codeOffset,
-      String defaultArgumentListString,
-      List<int> defaultArgumentListTextRanges,
-      String docComplete,
-      String docSummary,
-      int fieldMask,
-      bool isAbstract,
-      bool isConst,
-      bool isDeprecated,
-      bool isFinal,
-      bool isStatic,
-      idl.AvailableDeclarationKind kind,
-      int locationOffset,
-      int locationStartColumn,
-      int locationStartLine,
-      String name,
-      List<String> parameterNames,
-      String parameters,
-      List<String> parameterTypes,
-      List<String> relevanceTags,
-      int requiredParameterCount,
-      String returnType,
-      String typeParameters})
+      {List<AvailableDeclarationBuilder>? children,
+      int? codeLength,
+      int? codeOffset,
+      String? defaultArgumentListString,
+      List<int>? defaultArgumentListTextRanges,
+      String? docComplete,
+      String? docSummary,
+      int? fieldMask,
+      bool? isAbstract,
+      bool? isConst,
+      bool? isDeprecated,
+      bool? isFinal,
+      bool? isStatic,
+      idl.AvailableDeclarationKind? kind,
+      int? locationOffset,
+      int? locationStartColumn,
+      int? locationStartLine,
+      String? name,
+      List<String>? parameterNames,
+      String? parameters,
+      List<String>? parameterTypes,
+      List<String>? relevanceTags,
+      int? requiredParameterCount,
+      String? returnType,
+      String? typeParameters})
       : _children = children,
         _codeLength = codeLength,
         _codeOffset = codeOffset,
@@ -2321,9 +2334,9 @@
     if (this._children == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._children.length);
-      for (var x in this._children) {
-        x?.collectApiSignature(signature);
+      signature.addInt(this._children!.length);
+      for (var x in this._children!) {
+        x.collectApiSignature(signature);
       }
     }
     signature.addInt(this._codeLength ?? 0);
@@ -2332,8 +2345,8 @@
     if (this._defaultArgumentListTextRanges == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._defaultArgumentListTextRanges.length);
-      for (var x in this._defaultArgumentListTextRanges) {
+      signature.addInt(this._defaultArgumentListTextRanges!.length);
+      for (var x in this._defaultArgumentListTextRanges!) {
         signature.addInt(x);
       }
     }
@@ -2345,7 +2358,7 @@
     signature.addBool(this._isDeprecated == true);
     signature.addBool(this._isFinal == true);
     signature.addBool(this._isStatic == true);
-    signature.addInt(this._kind == null ? 0 : this._kind.index);
+    signature.addInt(this._kind == null ? 0 : this._kind!.index);
     signature.addInt(this._locationOffset ?? 0);
     signature.addInt(this._locationStartColumn ?? 0);
     signature.addInt(this._locationStartLine ?? 0);
@@ -2353,8 +2366,8 @@
     if (this._parameterNames == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._parameterNames.length);
-      for (var x in this._parameterNames) {
+      signature.addInt(this._parameterNames!.length);
+      for (var x in this._parameterNames!) {
         signature.addString(x);
       }
     }
@@ -2362,16 +2375,16 @@
     if (this._parameterTypes == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._parameterTypes.length);
-      for (var x in this._parameterTypes) {
+      signature.addInt(this._parameterTypes!.length);
+      for (var x in this._parameterTypes!) {
         signature.addString(x);
       }
     }
     if (this._relevanceTags == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._relevanceTags.length);
-      for (var x in this._relevanceTags) {
+      signature.addInt(this._relevanceTags!.length);
+      for (var x in this._relevanceTags!) {
         signature.addString(x);
       }
     }
@@ -2381,60 +2394,60 @@
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
-    fb.Offset offset_children;
-    fb.Offset offset_defaultArgumentListString;
-    fb.Offset offset_defaultArgumentListTextRanges;
-    fb.Offset offset_docComplete;
-    fb.Offset offset_docSummary;
-    fb.Offset offset_name;
-    fb.Offset offset_parameterNames;
-    fb.Offset offset_parameters;
-    fb.Offset offset_parameterTypes;
-    fb.Offset offset_relevanceTags;
-    fb.Offset offset_returnType;
-    fb.Offset offset_typeParameters;
-    if (!(_children == null || _children.isEmpty)) {
+    fb.Offset? offset_children;
+    fb.Offset? offset_defaultArgumentListString;
+    fb.Offset? offset_defaultArgumentListTextRanges;
+    fb.Offset? offset_docComplete;
+    fb.Offset? offset_docSummary;
+    fb.Offset? offset_name;
+    fb.Offset? offset_parameterNames;
+    fb.Offset? offset_parameters;
+    fb.Offset? offset_parameterTypes;
+    fb.Offset? offset_relevanceTags;
+    fb.Offset? offset_returnType;
+    fb.Offset? offset_typeParameters;
+    if (!(_children == null || _children!.isEmpty)) {
       offset_children = fbBuilder
-          .writeList(_children.map((b) => b.finish(fbBuilder)).toList());
+          .writeList(_children!.map((b) => b.finish(fbBuilder)).toList());
     }
     if (_defaultArgumentListString != null) {
       offset_defaultArgumentListString =
-          fbBuilder.writeString(_defaultArgumentListString);
+          fbBuilder.writeString(_defaultArgumentListString!);
     }
     if (!(_defaultArgumentListTextRanges == null ||
-        _defaultArgumentListTextRanges.isEmpty)) {
+        _defaultArgumentListTextRanges!.isEmpty)) {
       offset_defaultArgumentListTextRanges =
-          fbBuilder.writeListUint32(_defaultArgumentListTextRanges);
+          fbBuilder.writeListUint32(_defaultArgumentListTextRanges!);
     }
     if (_docComplete != null) {
-      offset_docComplete = fbBuilder.writeString(_docComplete);
+      offset_docComplete = fbBuilder.writeString(_docComplete!);
     }
     if (_docSummary != null) {
-      offset_docSummary = fbBuilder.writeString(_docSummary);
+      offset_docSummary = fbBuilder.writeString(_docSummary!);
     }
     if (_name != null) {
-      offset_name = fbBuilder.writeString(_name);
+      offset_name = fbBuilder.writeString(_name!);
     }
-    if (!(_parameterNames == null || _parameterNames.isEmpty)) {
+    if (!(_parameterNames == null || _parameterNames!.isEmpty)) {
       offset_parameterNames = fbBuilder.writeList(
-          _parameterNames.map((b) => fbBuilder.writeString(b)).toList());
+          _parameterNames!.map((b) => fbBuilder.writeString(b)).toList());
     }
     if (_parameters != null) {
-      offset_parameters = fbBuilder.writeString(_parameters);
+      offset_parameters = fbBuilder.writeString(_parameters!);
     }
-    if (!(_parameterTypes == null || _parameterTypes.isEmpty)) {
+    if (!(_parameterTypes == null || _parameterTypes!.isEmpty)) {
       offset_parameterTypes = fbBuilder.writeList(
-          _parameterTypes.map((b) => fbBuilder.writeString(b)).toList());
+          _parameterTypes!.map((b) => fbBuilder.writeString(b)).toList());
     }
-    if (!(_relevanceTags == null || _relevanceTags.isEmpty)) {
+    if (!(_relevanceTags == null || _relevanceTags!.isEmpty)) {
       offset_relevanceTags = fbBuilder.writeList(
-          _relevanceTags.map((b) => fbBuilder.writeString(b)).toList());
+          _relevanceTags!.map((b) => fbBuilder.writeString(b)).toList());
     }
     if (_returnType != null) {
-      offset_returnType = fbBuilder.writeString(_returnType);
+      offset_returnType = fbBuilder.writeString(_returnType!);
     }
     if (_typeParameters != null) {
-      offset_typeParameters = fbBuilder.writeString(_typeParameters);
+      offset_typeParameters = fbBuilder.writeString(_typeParameters!);
     }
     fbBuilder.startTable();
     if (offset_children != null) {
@@ -2477,7 +2490,7 @@
       fbBuilder.addBool(12, true);
     }
     if (_kind != null && _kind != idl.AvailableDeclarationKind.CLASS) {
-      fbBuilder.addUint8(13, _kind.index);
+      fbBuilder.addUint8(13, _kind!.index);
     }
     if (_locationOffset != null && _locationOffset != 0) {
       fbBuilder.addUint32(14, _locationOffset);
@@ -2533,194 +2546,180 @@
 
   _AvailableDeclarationImpl(this._bc, this._bcOffset);
 
-  List<idl.AvailableDeclaration> _children;
-  int _codeLength;
-  int _codeOffset;
-  String _defaultArgumentListString;
-  List<int> _defaultArgumentListTextRanges;
-  String _docComplete;
-  String _docSummary;
-  int _fieldMask;
-  bool _isAbstract;
-  bool _isConst;
-  bool _isDeprecated;
-  bool _isFinal;
-  bool _isStatic;
-  idl.AvailableDeclarationKind _kind;
-  int _locationOffset;
-  int _locationStartColumn;
-  int _locationStartLine;
-  String _name;
-  List<String> _parameterNames;
-  String _parameters;
-  List<String> _parameterTypes;
-  List<String> _relevanceTags;
-  int _requiredParameterCount;
-  String _returnType;
-  String _typeParameters;
+  List<idl.AvailableDeclaration>? _children;
+  int? _codeLength;
+  int? _codeOffset;
+  String? _defaultArgumentListString;
+  List<int>? _defaultArgumentListTextRanges;
+  String? _docComplete;
+  String? _docSummary;
+  int? _fieldMask;
+  bool? _isAbstract;
+  bool? _isConst;
+  bool? _isDeprecated;
+  bool? _isFinal;
+  bool? _isStatic;
+  idl.AvailableDeclarationKind? _kind;
+  int? _locationOffset;
+  int? _locationStartColumn;
+  int? _locationStartLine;
+  String? _name;
+  List<String>? _parameterNames;
+  String? _parameters;
+  List<String>? _parameterTypes;
+  List<String>? _relevanceTags;
+  int? _requiredParameterCount;
+  String? _returnType;
+  String? _typeParameters;
 
   @override
   List<idl.AvailableDeclaration> get children {
-    _children ??= const fb.ListReader<idl.AvailableDeclaration>(
+    return _children ??= const fb.ListReader<idl.AvailableDeclaration>(
             _AvailableDeclarationReader())
         .vTableGet(_bc, _bcOffset, 0, const <idl.AvailableDeclaration>[]);
-    return _children;
   }
 
   @override
   int get codeLength {
-    _codeLength ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 1, 0);
-    return _codeLength;
+    return _codeLength ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 1, 0);
   }
 
   @override
   int get codeOffset {
-    _codeOffset ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 2, 0);
-    return _codeOffset;
+    return _codeOffset ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 2, 0);
   }
 
   @override
   String get defaultArgumentListString {
-    _defaultArgumentListString ??=
+    return _defaultArgumentListString ??=
         const fb.StringReader().vTableGet(_bc, _bcOffset, 3, '');
-    return _defaultArgumentListString;
   }
 
   @override
   List<int> get defaultArgumentListTextRanges {
-    _defaultArgumentListTextRanges ??=
+    return _defaultArgumentListTextRanges ??=
         const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 4, const <int>[]);
-    return _defaultArgumentListTextRanges;
   }
 
   @override
   String get docComplete {
-    _docComplete ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 5, '');
-    return _docComplete;
+    return _docComplete ??=
+        const fb.StringReader().vTableGet(_bc, _bcOffset, 5, '');
   }
 
   @override
   String get docSummary {
-    _docSummary ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 6, '');
-    return _docSummary;
+    return _docSummary ??=
+        const fb.StringReader().vTableGet(_bc, _bcOffset, 6, '');
   }
 
   @override
   int get fieldMask {
-    _fieldMask ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 7, 0);
-    return _fieldMask;
+    return _fieldMask ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 7, 0);
   }
 
   @override
   bool get isAbstract {
-    _isAbstract ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 8, false);
-    return _isAbstract;
+    return _isAbstract ??=
+        const fb.BoolReader().vTableGet(_bc, _bcOffset, 8, false);
   }
 
   @override
   bool get isConst {
-    _isConst ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 9, false);
-    return _isConst;
+    return _isConst ??=
+        const fb.BoolReader().vTableGet(_bc, _bcOffset, 9, false);
   }
 
   @override
   bool get isDeprecated {
-    _isDeprecated ??=
+    return _isDeprecated ??=
         const fb.BoolReader().vTableGet(_bc, _bcOffset, 10, false);
-    return _isDeprecated;
   }
 
   @override
   bool get isFinal {
-    _isFinal ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 11, false);
-    return _isFinal;
+    return _isFinal ??=
+        const fb.BoolReader().vTableGet(_bc, _bcOffset, 11, false);
   }
 
   @override
   bool get isStatic {
-    _isStatic ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 12, false);
-    return _isStatic;
+    return _isStatic ??=
+        const fb.BoolReader().vTableGet(_bc, _bcOffset, 12, false);
   }
 
   @override
   idl.AvailableDeclarationKind get kind {
-    _kind ??= const _AvailableDeclarationKindReader()
+    return _kind ??= const _AvailableDeclarationKindReader()
         .vTableGet(_bc, _bcOffset, 13, idl.AvailableDeclarationKind.CLASS);
-    return _kind;
   }
 
   @override
   int get locationOffset {
-    _locationOffset ??=
+    return _locationOffset ??=
         const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 14, 0);
-    return _locationOffset;
   }
 
   @override
   int get locationStartColumn {
-    _locationStartColumn ??=
+    return _locationStartColumn ??=
         const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
-    return _locationStartColumn;
   }
 
   @override
   int get locationStartLine {
-    _locationStartLine ??=
+    return _locationStartLine ??=
         const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
-    return _locationStartLine;
   }
 
   @override
   String get name {
-    _name ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 17, '');
-    return _name;
+    return _name ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 17, '');
   }
 
   @override
   List<String> get parameterNames {
-    _parameterNames ??= const fb.ListReader<String>(fb.StringReader())
+    return _parameterNames ??= const fb.ListReader<String>(fb.StringReader())
         .vTableGet(_bc, _bcOffset, 18, const <String>[]);
-    return _parameterNames;
   }
 
   @override
   String get parameters {
-    _parameters ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 19, '');
-    return _parameters;
+    return _parameters ??=
+        const fb.StringReader().vTableGet(_bc, _bcOffset, 19, '');
   }
 
   @override
   List<String> get parameterTypes {
-    _parameterTypes ??= const fb.ListReader<String>(fb.StringReader())
+    return _parameterTypes ??= const fb.ListReader<String>(fb.StringReader())
         .vTableGet(_bc, _bcOffset, 20, const <String>[]);
-    return _parameterTypes;
   }
 
   @override
   List<String> get relevanceTags {
-    _relevanceTags ??= const fb.ListReader<String>(fb.StringReader())
+    return _relevanceTags ??= const fb.ListReader<String>(fb.StringReader())
         .vTableGet(_bc, _bcOffset, 21, const <String>[]);
-    return _relevanceTags;
   }
 
   @override
   int get requiredParameterCount {
-    _requiredParameterCount ??=
+    return _requiredParameterCount ??=
         const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 22, 0);
-    return _requiredParameterCount;
   }
 
   @override
   String get returnType {
-    _returnType ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 23, '');
-    return _returnType;
+    return _returnType ??=
+        const fb.StringReader().vTableGet(_bc, _bcOffset, 23, '');
   }
 
   @override
   String get typeParameters {
-    _typeParameters ??=
+    return _typeParameters ??=
         const fb.StringReader().vTableGet(_bc, _bcOffset, 24, '');
-    return _typeParameters;
   }
 }
 
@@ -2728,86 +2727,113 @@
   @override
   Map<String, Object> toJson() {
     Map<String, Object> _result = <String, Object>{};
-    if (children.isNotEmpty) {
-      _result["children"] = children.map((_value) => _value.toJson()).toList();
+    var local_children = children;
+    if (local_children.isNotEmpty) {
+      _result["children"] =
+          local_children.map((_value) => _value.toJson()).toList();
     }
-    if (codeLength != 0) {
-      _result["codeLength"] = codeLength;
+    var local_codeLength = codeLength;
+    if (local_codeLength != 0) {
+      _result["codeLength"] = local_codeLength;
     }
-    if (codeOffset != 0) {
-      _result["codeOffset"] = codeOffset;
+    var local_codeOffset = codeOffset;
+    if (local_codeOffset != 0) {
+      _result["codeOffset"] = local_codeOffset;
     }
-    if (defaultArgumentListString != '') {
-      _result["defaultArgumentListString"] = defaultArgumentListString;
+    var local_defaultArgumentListString = defaultArgumentListString;
+    if (local_defaultArgumentListString != '') {
+      _result["defaultArgumentListString"] = local_defaultArgumentListString;
     }
-    if (defaultArgumentListTextRanges.isNotEmpty) {
-      _result["defaultArgumentListTextRanges"] = defaultArgumentListTextRanges;
+    var local_defaultArgumentListTextRanges = defaultArgumentListTextRanges;
+    if (local_defaultArgumentListTextRanges.isNotEmpty) {
+      _result["defaultArgumentListTextRanges"] =
+          local_defaultArgumentListTextRanges;
     }
-    if (docComplete != '') {
-      _result["docComplete"] = docComplete;
+    var local_docComplete = docComplete;
+    if (local_docComplete != '') {
+      _result["docComplete"] = local_docComplete;
     }
-    if (docSummary != '') {
-      _result["docSummary"] = docSummary;
+    var local_docSummary = docSummary;
+    if (local_docSummary != '') {
+      _result["docSummary"] = local_docSummary;
     }
-    if (fieldMask != 0) {
-      _result["fieldMask"] = fieldMask;
+    var local_fieldMask = fieldMask;
+    if (local_fieldMask != 0) {
+      _result["fieldMask"] = local_fieldMask;
     }
-    if (isAbstract != false) {
-      _result["isAbstract"] = isAbstract;
+    var local_isAbstract = isAbstract;
+    if (local_isAbstract != false) {
+      _result["isAbstract"] = local_isAbstract;
     }
-    if (isConst != false) {
-      _result["isConst"] = isConst;
+    var local_isConst = isConst;
+    if (local_isConst != false) {
+      _result["isConst"] = local_isConst;
     }
-    if (isDeprecated != false) {
-      _result["isDeprecated"] = isDeprecated;
+    var local_isDeprecated = isDeprecated;
+    if (local_isDeprecated != false) {
+      _result["isDeprecated"] = local_isDeprecated;
     }
-    if (isFinal != false) {
-      _result["isFinal"] = isFinal;
+    var local_isFinal = isFinal;
+    if (local_isFinal != false) {
+      _result["isFinal"] = local_isFinal;
     }
-    if (isStatic != false) {
-      _result["isStatic"] = isStatic;
+    var local_isStatic = isStatic;
+    if (local_isStatic != false) {
+      _result["isStatic"] = local_isStatic;
     }
-    if (kind != idl.AvailableDeclarationKind.CLASS) {
-      _result["kind"] = kind.toString().split('.')[1];
+    var local_kind = kind;
+    if (local_kind != idl.AvailableDeclarationKind.CLASS) {
+      _result["kind"] = local_kind.toString().split('.')[1];
     }
-    if (locationOffset != 0) {
-      _result["locationOffset"] = locationOffset;
+    var local_locationOffset = locationOffset;
+    if (local_locationOffset != 0) {
+      _result["locationOffset"] = local_locationOffset;
     }
-    if (locationStartColumn != 0) {
-      _result["locationStartColumn"] = locationStartColumn;
+    var local_locationStartColumn = locationStartColumn;
+    if (local_locationStartColumn != 0) {
+      _result["locationStartColumn"] = local_locationStartColumn;
     }
-    if (locationStartLine != 0) {
-      _result["locationStartLine"] = locationStartLine;
+    var local_locationStartLine = locationStartLine;
+    if (local_locationStartLine != 0) {
+      _result["locationStartLine"] = local_locationStartLine;
     }
-    if (name != '') {
-      _result["name"] = name;
+    var local_name = name;
+    if (local_name != '') {
+      _result["name"] = local_name;
     }
-    if (parameterNames.isNotEmpty) {
-      _result["parameterNames"] = parameterNames;
+    var local_parameterNames = parameterNames;
+    if (local_parameterNames.isNotEmpty) {
+      _result["parameterNames"] = local_parameterNames;
     }
-    if (parameters != '') {
-      _result["parameters"] = parameters;
+    var local_parameters = parameters;
+    if (local_parameters != '') {
+      _result["parameters"] = local_parameters;
     }
-    if (parameterTypes.isNotEmpty) {
-      _result["parameterTypes"] = parameterTypes;
+    var local_parameterTypes = parameterTypes;
+    if (local_parameterTypes.isNotEmpty) {
+      _result["parameterTypes"] = local_parameterTypes;
     }
-    if (relevanceTags.isNotEmpty) {
-      _result["relevanceTags"] = relevanceTags;
+    var local_relevanceTags = relevanceTags;
+    if (local_relevanceTags.isNotEmpty) {
+      _result["relevanceTags"] = local_relevanceTags;
     }
-    if (requiredParameterCount != 0) {
-      _result["requiredParameterCount"] = requiredParameterCount;
+    var local_requiredParameterCount = requiredParameterCount;
+    if (local_requiredParameterCount != 0) {
+      _result["requiredParameterCount"] = local_requiredParameterCount;
     }
-    if (returnType != '') {
-      _result["returnType"] = returnType;
+    var local_returnType = returnType;
+    if (local_returnType != '') {
+      _result["returnType"] = local_returnType;
     }
-    if (typeParameters != '') {
-      _result["typeParameters"] = typeParameters;
+    var local_typeParameters = typeParameters;
+    if (local_typeParameters != '') {
+      _result["typeParameters"] = local_typeParameters;
     }
     return _result;
   }
 
   @override
-  Map<String, Object> toMap() => {
+  Map<String, Object?> toMap() => {
         "children": children,
         "codeLength": codeLength,
         "codeOffset": codeOffset,
@@ -2842,13 +2868,13 @@
 class AvailableFileBuilder extends Object
     with _AvailableFileMixin
     implements idl.AvailableFile {
-  List<AvailableDeclarationBuilder> _declarations;
-  DirectiveInfoBuilder _directiveInfo;
-  List<AvailableFileExportBuilder> _exports;
-  bool _isLibrary;
-  bool _isLibraryDeprecated;
-  List<int> _lineStarts;
-  List<String> _parts;
+  List<AvailableDeclarationBuilder>? _declarations;
+  DirectiveInfoBuilder? _directiveInfo;
+  List<AvailableFileExportBuilder>? _exports;
+  bool? _isLibrary;
+  bool? _isLibraryDeprecated;
+  List<int>? _lineStarts;
+  List<String>? _parts;
 
   @override
   List<AvailableDeclarationBuilder> get declarations =>
@@ -2860,10 +2886,10 @@
   }
 
   @override
-  DirectiveInfoBuilder get directiveInfo => _directiveInfo;
+  DirectiveInfoBuilder? get directiveInfo => _directiveInfo;
 
   /// The Dartdoc directives in the file.
-  set directiveInfo(DirectiveInfoBuilder value) {
+  set directiveInfo(DirectiveInfoBuilder? value) {
     this._directiveInfo = value;
   }
 
@@ -2897,7 +2923,7 @@
 
   /// Offsets of the first character of each line in the source code.
   set lineStarts(List<int> value) {
-    assert(value == null || value.every((e) => e >= 0));
+    assert(value.every((e) => e >= 0));
     this._lineStarts = value;
   }
 
@@ -2910,13 +2936,13 @@
   }
 
   AvailableFileBuilder(
-      {List<AvailableDeclarationBuilder> declarations,
-      DirectiveInfoBuilder directiveInfo,
-      List<AvailableFileExportBuilder> exports,
-      bool isLibrary,
-      bool isLibraryDeprecated,
-      List<int> lineStarts,
-      List<String> parts})
+      {List<AvailableDeclarationBuilder>? declarations,
+      DirectiveInfoBuilder? directiveInfo,
+      List<AvailableFileExportBuilder>? exports,
+      bool? isLibrary,
+      bool? isLibraryDeprecated,
+      List<int>? lineStarts,
+      List<String>? parts})
       : _declarations = declarations,
         _directiveInfo = directiveInfo,
         _exports = exports,
@@ -2938,9 +2964,9 @@
     if (this._declarations == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._declarations.length);
-      for (var x in this._declarations) {
-        x?.collectApiSignature(signature);
+      signature.addInt(this._declarations!.length);
+      for (var x in this._declarations!) {
+        x.collectApiSignature(signature);
       }
     }
     signature.addBool(this._directiveInfo != null);
@@ -2948,9 +2974,9 @@
     if (this._exports == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._exports.length);
-      for (var x in this._exports) {
-        x?.collectApiSignature(signature);
+      signature.addInt(this._exports!.length);
+      for (var x in this._exports!) {
+        x.collectApiSignature(signature);
       }
     }
     signature.addBool(this._isLibrary == true);
@@ -2958,8 +2984,8 @@
     if (this._parts == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._parts.length);
-      for (var x in this._parts) {
+      signature.addInt(this._parts!.length);
+      for (var x in this._parts!) {
         signature.addString(x);
       }
     }
@@ -2971,28 +2997,28 @@
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
-    fb.Offset offset_declarations;
-    fb.Offset offset_directiveInfo;
-    fb.Offset offset_exports;
-    fb.Offset offset_lineStarts;
-    fb.Offset offset_parts;
-    if (!(_declarations == null || _declarations.isEmpty)) {
+    fb.Offset? offset_declarations;
+    fb.Offset? offset_directiveInfo;
+    fb.Offset? offset_exports;
+    fb.Offset? offset_lineStarts;
+    fb.Offset? offset_parts;
+    if (!(_declarations == null || _declarations!.isEmpty)) {
       offset_declarations = fbBuilder
-          .writeList(_declarations.map((b) => b.finish(fbBuilder)).toList());
+          .writeList(_declarations!.map((b) => b.finish(fbBuilder)).toList());
     }
     if (_directiveInfo != null) {
-      offset_directiveInfo = _directiveInfo.finish(fbBuilder);
+      offset_directiveInfo = _directiveInfo!.finish(fbBuilder);
     }
-    if (!(_exports == null || _exports.isEmpty)) {
+    if (!(_exports == null || _exports!.isEmpty)) {
       offset_exports = fbBuilder
-          .writeList(_exports.map((b) => b.finish(fbBuilder)).toList());
+          .writeList(_exports!.map((b) => b.finish(fbBuilder)).toList());
     }
-    if (!(_lineStarts == null || _lineStarts.isEmpty)) {
-      offset_lineStarts = fbBuilder.writeListUint32(_lineStarts);
+    if (!(_lineStarts == null || _lineStarts!.isEmpty)) {
+      offset_lineStarts = fbBuilder.writeListUint32(_lineStarts!);
     }
-    if (!(_parts == null || _parts.isEmpty)) {
+    if (!(_parts == null || _parts!.isEmpty)) {
       offset_parts = fbBuilder
-          .writeList(_parts.map((b) => fbBuilder.writeString(b)).toList());
+          .writeList(_parts!.map((b) => fbBuilder.writeString(b)).toList());
     }
     fbBuilder.startTable();
     if (offset_declarations != null) {
@@ -3041,62 +3067,56 @@
 
   _AvailableFileImpl(this._bc, this._bcOffset);
 
-  List<idl.AvailableDeclaration> _declarations;
-  idl.DirectiveInfo _directiveInfo;
-  List<idl.AvailableFileExport> _exports;
-  bool _isLibrary;
-  bool _isLibraryDeprecated;
-  List<int> _lineStarts;
-  List<String> _parts;
+  List<idl.AvailableDeclaration>? _declarations;
+  idl.DirectiveInfo? _directiveInfo;
+  List<idl.AvailableFileExport>? _exports;
+  bool? _isLibrary;
+  bool? _isLibraryDeprecated;
+  List<int>? _lineStarts;
+  List<String>? _parts;
 
   @override
   List<idl.AvailableDeclaration> get declarations {
-    _declarations ??= const fb.ListReader<idl.AvailableDeclaration>(
+    return _declarations ??= const fb.ListReader<idl.AvailableDeclaration>(
             _AvailableDeclarationReader())
         .vTableGet(_bc, _bcOffset, 0, const <idl.AvailableDeclaration>[]);
-    return _declarations;
   }
 
   @override
-  idl.DirectiveInfo get directiveInfo {
-    _directiveInfo ??=
-        const _DirectiveInfoReader().vTableGet(_bc, _bcOffset, 1, null);
-    return _directiveInfo;
+  idl.DirectiveInfo? get directiveInfo {
+    return _directiveInfo ??=
+        const _DirectiveInfoReader().vTableGetOrNull(_bc, _bcOffset, 1);
   }
 
   @override
   List<idl.AvailableFileExport> get exports {
-    _exports ??= const fb.ListReader<idl.AvailableFileExport>(
+    return _exports ??= const fb.ListReader<idl.AvailableFileExport>(
             _AvailableFileExportReader())
         .vTableGet(_bc, _bcOffset, 2, const <idl.AvailableFileExport>[]);
-    return _exports;
   }
 
   @override
   bool get isLibrary {
-    _isLibrary ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 3, false);
-    return _isLibrary;
+    return _isLibrary ??=
+        const fb.BoolReader().vTableGet(_bc, _bcOffset, 3, false);
   }
 
   @override
   bool get isLibraryDeprecated {
-    _isLibraryDeprecated ??=
+    return _isLibraryDeprecated ??=
         const fb.BoolReader().vTableGet(_bc, _bcOffset, 4, false);
-    return _isLibraryDeprecated;
   }
 
   @override
   List<int> get lineStarts {
-    _lineStarts ??=
+    return _lineStarts ??=
         const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 5, const <int>[]);
-    return _lineStarts;
   }
 
   @override
   List<String> get parts {
-    _parts ??= const fb.ListReader<String>(fb.StringReader())
+    return _parts ??= const fb.ListReader<String>(fb.StringReader())
         .vTableGet(_bc, _bcOffset, 6, const <String>[]);
-    return _parts;
   }
 }
 
@@ -3104,33 +3124,41 @@
   @override
   Map<String, Object> toJson() {
     Map<String, Object> _result = <String, Object>{};
-    if (declarations.isNotEmpty) {
+    var local_declarations = declarations;
+    if (local_declarations.isNotEmpty) {
       _result["declarations"] =
-          declarations.map((_value) => _value.toJson()).toList();
+          local_declarations.map((_value) => _value.toJson()).toList();
     }
-    if (directiveInfo != null) {
-      _result["directiveInfo"] = directiveInfo.toJson();
+    var local_directiveInfo = directiveInfo;
+    if (local_directiveInfo != null) {
+      _result["directiveInfo"] = local_directiveInfo.toJson();
     }
-    if (exports.isNotEmpty) {
-      _result["exports"] = exports.map((_value) => _value.toJson()).toList();
+    var local_exports = exports;
+    if (local_exports.isNotEmpty) {
+      _result["exports"] =
+          local_exports.map((_value) => _value.toJson()).toList();
     }
-    if (isLibrary != false) {
-      _result["isLibrary"] = isLibrary;
+    var local_isLibrary = isLibrary;
+    if (local_isLibrary != false) {
+      _result["isLibrary"] = local_isLibrary;
     }
-    if (isLibraryDeprecated != false) {
-      _result["isLibraryDeprecated"] = isLibraryDeprecated;
+    var local_isLibraryDeprecated = isLibraryDeprecated;
+    if (local_isLibraryDeprecated != false) {
+      _result["isLibraryDeprecated"] = local_isLibraryDeprecated;
     }
-    if (lineStarts.isNotEmpty) {
-      _result["lineStarts"] = lineStarts;
+    var local_lineStarts = lineStarts;
+    if (local_lineStarts.isNotEmpty) {
+      _result["lineStarts"] = local_lineStarts;
     }
-    if (parts.isNotEmpty) {
-      _result["parts"] = parts;
+    var local_parts = parts;
+    if (local_parts.isNotEmpty) {
+      _result["parts"] = local_parts;
     }
     return _result;
   }
 
   @override
-  Map<String, Object> toMap() => {
+  Map<String, Object?> toMap() => {
         "declarations": declarations,
         "directiveInfo": directiveInfo,
         "exports": exports,
@@ -3147,8 +3175,8 @@
 class AvailableFileExportBuilder extends Object
     with _AvailableFileExportMixin
     implements idl.AvailableFileExport {
-  List<AvailableFileExportCombinatorBuilder> _combinators;
-  String _uri;
+  List<AvailableFileExportCombinatorBuilder>? _combinators;
+  String? _uri;
 
   @override
   List<AvailableFileExportCombinatorBuilder> get combinators =>
@@ -3168,7 +3196,7 @@
   }
 
   AvailableFileExportBuilder(
-      {List<AvailableFileExportCombinatorBuilder> combinators, String uri})
+      {List<AvailableFileExportCombinatorBuilder>? combinators, String? uri})
       : _combinators = combinators,
         _uri = uri;
 
@@ -3183,22 +3211,22 @@
     if (this._combinators == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._combinators.length);
-      for (var x in this._combinators) {
-        x?.collectApiSignature(signature);
+      signature.addInt(this._combinators!.length);
+      for (var x in this._combinators!) {
+        x.collectApiSignature(signature);
       }
     }
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
-    fb.Offset offset_combinators;
-    fb.Offset offset_uri;
-    if (!(_combinators == null || _combinators.isEmpty)) {
+    fb.Offset? offset_combinators;
+    fb.Offset? offset_uri;
+    if (!(_combinators == null || _combinators!.isEmpty)) {
       offset_combinators = fbBuilder
-          .writeList(_combinators.map((b) => b.finish(fbBuilder)).toList());
+          .writeList(_combinators!.map((b) => b.finish(fbBuilder)).toList());
     }
     if (_uri != null) {
-      offset_uri = fbBuilder.writeString(_uri);
+      offset_uri = fbBuilder.writeString(_uri!);
     }
     fbBuilder.startTable();
     if (offset_combinators != null) {
@@ -3228,22 +3256,21 @@
 
   _AvailableFileExportImpl(this._bc, this._bcOffset);
 
-  List<idl.AvailableFileExportCombinator> _combinators;
-  String _uri;
+  List<idl.AvailableFileExportCombinator>? _combinators;
+  String? _uri;
 
   @override
   List<idl.AvailableFileExportCombinator> get combinators {
-    _combinators ??= const fb.ListReader<idl.AvailableFileExportCombinator>(
-            _AvailableFileExportCombinatorReader())
-        .vTableGet(
-            _bc, _bcOffset, 1, const <idl.AvailableFileExportCombinator>[]);
-    return _combinators;
+    return _combinators ??=
+        const fb.ListReader<idl.AvailableFileExportCombinator>(
+                _AvailableFileExportCombinatorReader())
+            .vTableGet(
+                _bc, _bcOffset, 1, const <idl.AvailableFileExportCombinator>[]);
   }
 
   @override
   String get uri {
-    _uri ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 0, '');
-    return _uri;
+    return _uri ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 0, '');
   }
 }
 
@@ -3251,18 +3278,20 @@
   @override
   Map<String, Object> toJson() {
     Map<String, Object> _result = <String, Object>{};
-    if (combinators.isNotEmpty) {
+    var local_combinators = combinators;
+    if (local_combinators.isNotEmpty) {
       _result["combinators"] =
-          combinators.map((_value) => _value.toJson()).toList();
+          local_combinators.map((_value) => _value.toJson()).toList();
     }
-    if (uri != '') {
-      _result["uri"] = uri;
+    var local_uri = uri;
+    if (local_uri != '') {
+      _result["uri"] = local_uri;
     }
     return _result;
   }
 
   @override
-  Map<String, Object> toMap() => {
+  Map<String, Object?> toMap() => {
         "combinators": combinators,
         "uri": uri,
       };
@@ -3274,8 +3303,8 @@
 class AvailableFileExportCombinatorBuilder extends Object
     with _AvailableFileExportCombinatorMixin
     implements idl.AvailableFileExportCombinator {
-  List<String> _hides;
-  List<String> _shows;
+  List<String>? _hides;
+  List<String>? _shows;
 
   @override
   List<String> get hides => _hides ??= <String>[];
@@ -3293,7 +3322,8 @@
     this._shows = value;
   }
 
-  AvailableFileExportCombinatorBuilder({List<String> hides, List<String> shows})
+  AvailableFileExportCombinatorBuilder(
+      {List<String>? hides, List<String>? shows})
       : _hides = hides,
         _shows = shows;
 
@@ -3305,31 +3335,31 @@
     if (this._shows == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._shows.length);
-      for (var x in this._shows) {
+      signature.addInt(this._shows!.length);
+      for (var x in this._shows!) {
         signature.addString(x);
       }
     }
     if (this._hides == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._hides.length);
-      for (var x in this._hides) {
+      signature.addInt(this._hides!.length);
+      for (var x in this._hides!) {
         signature.addString(x);
       }
     }
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
-    fb.Offset offset_hides;
-    fb.Offset offset_shows;
-    if (!(_hides == null || _hides.isEmpty)) {
+    fb.Offset? offset_hides;
+    fb.Offset? offset_shows;
+    if (!(_hides == null || _hides!.isEmpty)) {
       offset_hides = fbBuilder
-          .writeList(_hides.map((b) => fbBuilder.writeString(b)).toList());
+          .writeList(_hides!.map((b) => fbBuilder.writeString(b)).toList());
     }
-    if (!(_shows == null || _shows.isEmpty)) {
+    if (!(_shows == null || _shows!.isEmpty)) {
       offset_shows = fbBuilder
-          .writeList(_shows.map((b) => fbBuilder.writeString(b)).toList());
+          .writeList(_shows!.map((b) => fbBuilder.writeString(b)).toList());
     }
     fbBuilder.startTable();
     if (offset_hides != null) {
@@ -3360,21 +3390,19 @@
 
   _AvailableFileExportCombinatorImpl(this._bc, this._bcOffset);
 
-  List<String> _hides;
-  List<String> _shows;
+  List<String>? _hides;
+  List<String>? _shows;
 
   @override
   List<String> get hides {
-    _hides ??= const fb.ListReader<String>(fb.StringReader())
+    return _hides ??= const fb.ListReader<String>(fb.StringReader())
         .vTableGet(_bc, _bcOffset, 1, const <String>[]);
-    return _hides;
   }
 
   @override
   List<String> get shows {
-    _shows ??= const fb.ListReader<String>(fb.StringReader())
+    return _shows ??= const fb.ListReader<String>(fb.StringReader())
         .vTableGet(_bc, _bcOffset, 0, const <String>[]);
-    return _shows;
   }
 }
 
@@ -3383,17 +3411,19 @@
   @override
   Map<String, Object> toJson() {
     Map<String, Object> _result = <String, Object>{};
-    if (hides.isNotEmpty) {
-      _result["hides"] = hides;
+    var local_hides = hides;
+    if (local_hides.isNotEmpty) {
+      _result["hides"] = local_hides;
     }
-    if (shows.isNotEmpty) {
-      _result["shows"] = shows;
+    var local_shows = shows;
+    if (local_shows.isNotEmpty) {
+      _result["shows"] = local_shows;
     }
     return _result;
   }
 
   @override
-  Map<String, Object> toMap() => {
+  Map<String, Object?> toMap() => {
         "hides": hides,
         "shows": shows,
       };
@@ -3405,8 +3435,8 @@
 class CiderUnitErrorsBuilder extends Object
     with _CiderUnitErrorsMixin
     implements idl.CiderUnitErrors {
-  List<AnalysisDriverUnitErrorBuilder> _errors;
-  List<int> _signature;
+  List<AnalysisDriverUnitErrorBuilder>? _errors;
+  List<int>? _signature;
 
   @override
   List<AnalysisDriverUnitErrorBuilder> get errors =>
@@ -3421,12 +3451,12 @@
 
   /// The hash signature of this data.
   set signature(List<int> value) {
-    assert(value == null || value.every((e) => e >= 0));
+    assert(value.every((e) => e >= 0));
     this._signature = value;
   }
 
   CiderUnitErrorsBuilder(
-      {List<AnalysisDriverUnitErrorBuilder> errors, List<int> signature})
+      {List<AnalysisDriverUnitErrorBuilder>? errors, List<int>? signature})
       : _errors = errors,
         _signature = signature;
 
@@ -3440,17 +3470,17 @@
     if (this._signature == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._signature.length);
-      for (var x in this._signature) {
+      signature.addInt(this._signature!.length);
+      for (var x in this._signature!) {
         signature.addInt(x);
       }
     }
     if (this._errors == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._errors.length);
-      for (var x in this._errors) {
-        x?.collectApiSignature(signature);
+      signature.addInt(this._errors!.length);
+      for (var x in this._errors!) {
+        x.collectApiSignature(signature);
       }
     }
   }
@@ -3461,14 +3491,14 @@
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
-    fb.Offset offset_errors;
-    fb.Offset offset_signature;
-    if (!(_errors == null || _errors.isEmpty)) {
-      offset_errors =
-          fbBuilder.writeList(_errors.map((b) => b.finish(fbBuilder)).toList());
+    fb.Offset? offset_errors;
+    fb.Offset? offset_signature;
+    if (!(_errors == null || _errors!.isEmpty)) {
+      offset_errors = fbBuilder
+          .writeList(_errors!.map((b) => b.finish(fbBuilder)).toList());
     }
-    if (!(_signature == null || _signature.isEmpty)) {
-      offset_signature = fbBuilder.writeListUint32(_signature);
+    if (!(_signature == null || _signature!.isEmpty)) {
+      offset_signature = fbBuilder.writeListUint32(_signature!);
     }
     fbBuilder.startTable();
     if (offset_errors != null) {
@@ -3502,22 +3532,20 @@
 
   _CiderUnitErrorsImpl(this._bc, this._bcOffset);
 
-  List<idl.AnalysisDriverUnitError> _errors;
-  List<int> _signature;
+  List<idl.AnalysisDriverUnitError>? _errors;
+  List<int>? _signature;
 
   @override
   List<idl.AnalysisDriverUnitError> get errors {
-    _errors ??= const fb.ListReader<idl.AnalysisDriverUnitError>(
+    return _errors ??= const fb.ListReader<idl.AnalysisDriverUnitError>(
             _AnalysisDriverUnitErrorReader())
         .vTableGet(_bc, _bcOffset, 1, const <idl.AnalysisDriverUnitError>[]);
-    return _errors;
   }
 
   @override
   List<int> get signature {
-    _signature ??=
+    return _signature ??=
         const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 0, const <int>[]);
-    return _signature;
   }
 }
 
@@ -3525,17 +3553,20 @@
   @override
   Map<String, Object> toJson() {
     Map<String, Object> _result = <String, Object>{};
-    if (errors.isNotEmpty) {
-      _result["errors"] = errors.map((_value) => _value.toJson()).toList();
+    var local_errors = errors;
+    if (local_errors.isNotEmpty) {
+      _result["errors"] =
+          local_errors.map((_value) => _value.toJson()).toList();
     }
-    if (signature.isNotEmpty) {
-      _result["signature"] = signature;
+    var local_signature = signature;
+    if (local_signature.isNotEmpty) {
+      _result["signature"] = local_signature;
     }
     return _result;
   }
 
   @override
-  Map<String, Object> toMap() => {
+  Map<String, Object?> toMap() => {
         "errors": errors,
         "signature": signature,
       };
@@ -3547,28 +3578,28 @@
 class CiderUnlinkedUnitBuilder extends Object
     with _CiderUnlinkedUnitMixin
     implements idl.CiderUnlinkedUnit {
-  List<int> _contentDigest;
-  UnlinkedUnit2Builder _unlinkedUnit;
+  List<int>? _contentDigest;
+  UnlinkedUnit2Builder? _unlinkedUnit;
 
   @override
   List<int> get contentDigest => _contentDigest ??= <int>[];
 
   /// The hash signature of the contents of the file.
   set contentDigest(List<int> value) {
-    assert(value == null || value.every((e) => e >= 0));
+    assert(value.every((e) => e >= 0));
     this._contentDigest = value;
   }
 
   @override
-  UnlinkedUnit2Builder get unlinkedUnit => _unlinkedUnit;
+  UnlinkedUnit2Builder? get unlinkedUnit => _unlinkedUnit;
 
   /// Unlinked summary of the compilation unit.
-  set unlinkedUnit(UnlinkedUnit2Builder value) {
+  set unlinkedUnit(UnlinkedUnit2Builder? value) {
     this._unlinkedUnit = value;
   }
 
   CiderUnlinkedUnitBuilder(
-      {List<int> contentDigest, UnlinkedUnit2Builder unlinkedUnit})
+      {List<int>? contentDigest, UnlinkedUnit2Builder? unlinkedUnit})
       : _contentDigest = contentDigest,
         _unlinkedUnit = unlinkedUnit;
 
@@ -3582,8 +3613,8 @@
     if (this._contentDigest == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._contentDigest.length);
-      for (var x in this._contentDigest) {
+      signature.addInt(this._contentDigest!.length);
+      for (var x in this._contentDigest!) {
         signature.addInt(x);
       }
     }
@@ -3597,13 +3628,13 @@
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
-    fb.Offset offset_contentDigest;
-    fb.Offset offset_unlinkedUnit;
-    if (!(_contentDigest == null || _contentDigest.isEmpty)) {
-      offset_contentDigest = fbBuilder.writeListUint32(_contentDigest);
+    fb.Offset? offset_contentDigest;
+    fb.Offset? offset_unlinkedUnit;
+    if (!(_contentDigest == null || _contentDigest!.isEmpty)) {
+      offset_contentDigest = fbBuilder.writeListUint32(_contentDigest!);
     }
     if (_unlinkedUnit != null) {
-      offset_unlinkedUnit = _unlinkedUnit.finish(fbBuilder);
+      offset_unlinkedUnit = _unlinkedUnit!.finish(fbBuilder);
     }
     fbBuilder.startTable();
     if (offset_contentDigest != null) {
@@ -3637,21 +3668,19 @@
 
   _CiderUnlinkedUnitImpl(this._bc, this._bcOffset);
 
-  List<int> _contentDigest;
-  idl.UnlinkedUnit2 _unlinkedUnit;
+  List<int>? _contentDigest;
+  idl.UnlinkedUnit2? _unlinkedUnit;
 
   @override
   List<int> get contentDigest {
-    _contentDigest ??=
+    return _contentDigest ??=
         const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 0, const <int>[]);
-    return _contentDigest;
   }
 
   @override
-  idl.UnlinkedUnit2 get unlinkedUnit {
-    _unlinkedUnit ??=
-        const _UnlinkedUnit2Reader().vTableGet(_bc, _bcOffset, 1, null);
-    return _unlinkedUnit;
+  idl.UnlinkedUnit2? get unlinkedUnit {
+    return _unlinkedUnit ??=
+        const _UnlinkedUnit2Reader().vTableGetOrNull(_bc, _bcOffset, 1);
   }
 }
 
@@ -3659,17 +3688,19 @@
   @override
   Map<String, Object> toJson() {
     Map<String, Object> _result = <String, Object>{};
-    if (contentDigest.isNotEmpty) {
-      _result["contentDigest"] = contentDigest;
+    var local_contentDigest = contentDigest;
+    if (local_contentDigest.isNotEmpty) {
+      _result["contentDigest"] = local_contentDigest;
     }
-    if (unlinkedUnit != null) {
-      _result["unlinkedUnit"] = unlinkedUnit.toJson();
+    var local_unlinkedUnit = unlinkedUnit;
+    if (local_unlinkedUnit != null) {
+      _result["unlinkedUnit"] = local_unlinkedUnit.toJson();
     }
     return _result;
   }
 
   @override
-  Map<String, Object> toMap() => {
+  Map<String, Object?> toMap() => {
         "contentDigest": contentDigest,
         "unlinkedUnit": unlinkedUnit,
       };
@@ -3681,10 +3712,10 @@
 class DiagnosticMessageBuilder extends Object
     with _DiagnosticMessageMixin
     implements idl.DiagnosticMessage {
-  String _filePath;
-  int _length;
-  String _message;
-  int _offset;
+  String? _filePath;
+  int? _length;
+  String? _message;
+  int? _offset;
 
   @override
   String get filePath => _filePath ??= '';
@@ -3699,7 +3730,7 @@
 
   /// The length of the source range associated with this message.
   set length(int value) {
-    assert(value == null || value >= 0);
+    assert(value >= 0);
     this._length = value;
   }
 
@@ -3717,12 +3748,12 @@
   /// The zero-based offset from the start of the file to the beginning of the
   /// source range associated with this message.
   set offset(int value) {
-    assert(value == null || value >= 0);
+    assert(value >= 0);
     this._offset = value;
   }
 
   DiagnosticMessageBuilder(
-      {String filePath, int length, String message, int offset})
+      {String? filePath, int? length, String? message, int? offset})
       : _filePath = filePath,
         _length = length,
         _message = message,
@@ -3740,13 +3771,13 @@
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
-    fb.Offset offset_filePath;
-    fb.Offset offset_message;
+    fb.Offset? offset_filePath;
+    fb.Offset? offset_message;
     if (_filePath != null) {
-      offset_filePath = fbBuilder.writeString(_filePath);
+      offset_filePath = fbBuilder.writeString(_filePath!);
     }
     if (_message != null) {
-      offset_message = fbBuilder.writeString(_message);
+      offset_message = fbBuilder.writeString(_message!);
     }
     fbBuilder.startTable();
     if (offset_filePath != null) {
@@ -3781,33 +3812,31 @@
 
   _DiagnosticMessageImpl(this._bc, this._bcOffset);
 
-  String _filePath;
-  int _length;
-  String _message;
-  int _offset;
+  String? _filePath;
+  int? _length;
+  String? _message;
+  int? _offset;
 
   @override
   String get filePath {
-    _filePath ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 0, '');
-    return _filePath;
+    return _filePath ??=
+        const fb.StringReader().vTableGet(_bc, _bcOffset, 0, '');
   }
 
   @override
   int get length {
-    _length ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 1, 0);
-    return _length;
+    return _length ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 1, 0);
   }
 
   @override
   String get message {
-    _message ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 2, '');
-    return _message;
+    return _message ??=
+        const fb.StringReader().vTableGet(_bc, _bcOffset, 2, '');
   }
 
   @override
   int get offset {
-    _offset ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 3, 0);
-    return _offset;
+    return _offset ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 3, 0);
   }
 }
 
@@ -3815,23 +3844,27 @@
   @override
   Map<String, Object> toJson() {
     Map<String, Object> _result = <String, Object>{};
-    if (filePath != '') {
-      _result["filePath"] = filePath;
+    var local_filePath = filePath;
+    if (local_filePath != '') {
+      _result["filePath"] = local_filePath;
     }
-    if (length != 0) {
-      _result["length"] = length;
+    var local_length = length;
+    if (local_length != 0) {
+      _result["length"] = local_length;
     }
-    if (message != '') {
-      _result["message"] = message;
+    var local_message = message;
+    if (local_message != '') {
+      _result["message"] = local_message;
     }
-    if (offset != 0) {
-      _result["offset"] = offset;
+    var local_offset = offset;
+    if (local_offset != 0) {
+      _result["offset"] = local_offset;
     }
     return _result;
   }
 
   @override
-  Map<String, Object> toMap() => {
+  Map<String, Object?> toMap() => {
         "filePath": filePath,
         "length": length,
         "message": message,
@@ -3845,8 +3878,8 @@
 class DirectiveInfoBuilder extends Object
     with _DirectiveInfoMixin
     implements idl.DirectiveInfo {
-  List<String> _templateNames;
-  List<String> _templateValues;
+  List<String>? _templateNames;
+  List<String>? _templateValues;
 
   @override
   List<String> get templateNames => _templateNames ??= <String>[];
@@ -3865,7 +3898,7 @@
   }
 
   DirectiveInfoBuilder(
-      {List<String> templateNames, List<String> templateValues})
+      {List<String>? templateNames, List<String>? templateValues})
       : _templateNames = templateNames,
         _templateValues = templateValues;
 
@@ -3877,31 +3910,31 @@
     if (this._templateNames == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._templateNames.length);
-      for (var x in this._templateNames) {
+      signature.addInt(this._templateNames!.length);
+      for (var x in this._templateNames!) {
         signature.addString(x);
       }
     }
     if (this._templateValues == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._templateValues.length);
-      for (var x in this._templateValues) {
+      signature.addInt(this._templateValues!.length);
+      for (var x in this._templateValues!) {
         signature.addString(x);
       }
     }
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
-    fb.Offset offset_templateNames;
-    fb.Offset offset_templateValues;
-    if (!(_templateNames == null || _templateNames.isEmpty)) {
+    fb.Offset? offset_templateNames;
+    fb.Offset? offset_templateValues;
+    if (!(_templateNames == null || _templateNames!.isEmpty)) {
       offset_templateNames = fbBuilder.writeList(
-          _templateNames.map((b) => fbBuilder.writeString(b)).toList());
+          _templateNames!.map((b) => fbBuilder.writeString(b)).toList());
     }
-    if (!(_templateValues == null || _templateValues.isEmpty)) {
+    if (!(_templateValues == null || _templateValues!.isEmpty)) {
       offset_templateValues = fbBuilder.writeList(
-          _templateValues.map((b) => fbBuilder.writeString(b)).toList());
+          _templateValues!.map((b) => fbBuilder.writeString(b)).toList());
     }
     fbBuilder.startTable();
     if (offset_templateNames != null) {
@@ -3930,21 +3963,19 @@
 
   _DirectiveInfoImpl(this._bc, this._bcOffset);
 
-  List<String> _templateNames;
-  List<String> _templateValues;
+  List<String>? _templateNames;
+  List<String>? _templateValues;
 
   @override
   List<String> get templateNames {
-    _templateNames ??= const fb.ListReader<String>(fb.StringReader())
+    return _templateNames ??= const fb.ListReader<String>(fb.StringReader())
         .vTableGet(_bc, _bcOffset, 0, const <String>[]);
-    return _templateNames;
   }
 
   @override
   List<String> get templateValues {
-    _templateValues ??= const fb.ListReader<String>(fb.StringReader())
+    return _templateValues ??= const fb.ListReader<String>(fb.StringReader())
         .vTableGet(_bc, _bcOffset, 1, const <String>[]);
-    return _templateValues;
   }
 }
 
@@ -3952,17 +3983,19 @@
   @override
   Map<String, Object> toJson() {
     Map<String, Object> _result = <String, Object>{};
-    if (templateNames.isNotEmpty) {
-      _result["templateNames"] = templateNames;
+    var local_templateNames = templateNames;
+    if (local_templateNames.isNotEmpty) {
+      _result["templateNames"] = local_templateNames;
     }
-    if (templateValues.isNotEmpty) {
-      _result["templateValues"] = templateValues;
+    var local_templateValues = templateValues;
+    if (local_templateValues.isNotEmpty) {
+      _result["templateValues"] = local_templateValues;
     }
     return _result;
   }
 
   @override
-  Map<String, Object> toMap() => {
+  Map<String, Object?> toMap() => {
         "templateNames": templateNames,
         "templateValues": templateValues,
       };
@@ -3974,18 +4007,18 @@
 class PackageBundleBuilder extends Object
     with _PackageBundleMixin
     implements idl.PackageBundle {
-  int _fake;
+  int? _fake;
 
   @override
   int get fake => _fake ??= 0;
 
   /// The version 2 of the summary.
   set fake(int value) {
-    assert(value == null || value >= 0);
+    assert(value >= 0);
     this._fake = value;
   }
 
-  PackageBundleBuilder({int fake}) : _fake = fake;
+  PackageBundleBuilder({int? fake}) : _fake = fake;
 
   /// Flush [informative] data recursively.
   void flushInformative() {}
@@ -4030,12 +4063,11 @@
 
   _PackageBundleImpl(this._bc, this._bcOffset);
 
-  int _fake;
+  int? _fake;
 
   @override
   int get fake {
-    _fake ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 0, 0);
-    return _fake;
+    return _fake ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 0, 0);
   }
 }
 
@@ -4043,14 +4075,15 @@
   @override
   Map<String, Object> toJson() {
     Map<String, Object> _result = <String, Object>{};
-    if (fake != 0) {
-      _result["fake"] = fake;
+    var local_fake = fake;
+    if (local_fake != 0) {
+      _result["fake"] = local_fake;
     }
     return _result;
   }
 
   @override
-  Map<String, Object> toMap() => {
+  Map<String, Object?> toMap() => {
         "fake": fake,
       };
 
@@ -4061,8 +4094,8 @@
 class UnlinkedNamespaceDirectiveBuilder extends Object
     with _UnlinkedNamespaceDirectiveMixin
     implements idl.UnlinkedNamespaceDirective {
-  List<UnlinkedNamespaceDirectiveConfigurationBuilder> _configurations;
-  String _uri;
+  List<UnlinkedNamespaceDirectiveConfigurationBuilder>? _configurations;
+  String? _uri;
 
   @override
   List<UnlinkedNamespaceDirectiveConfigurationBuilder> get configurations =>
@@ -4084,8 +4117,8 @@
   }
 
   UnlinkedNamespaceDirectiveBuilder(
-      {List<UnlinkedNamespaceDirectiveConfigurationBuilder> configurations,
-      String uri})
+      {List<UnlinkedNamespaceDirectiveConfigurationBuilder>? configurations,
+      String? uri})
       : _configurations = configurations,
         _uri = uri;
 
@@ -4099,23 +4132,23 @@
     if (this._configurations == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._configurations.length);
-      for (var x in this._configurations) {
-        x?.collectApiSignature(signature);
+      signature.addInt(this._configurations!.length);
+      for (var x in this._configurations!) {
+        x.collectApiSignature(signature);
       }
     }
     signature.addString(this._uri ?? '');
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
-    fb.Offset offset_configurations;
-    fb.Offset offset_uri;
-    if (!(_configurations == null || _configurations.isEmpty)) {
+    fb.Offset? offset_configurations;
+    fb.Offset? offset_uri;
+    if (!(_configurations == null || _configurations!.isEmpty)) {
       offset_configurations = fbBuilder
-          .writeList(_configurations.map((b) => b.finish(fbBuilder)).toList());
+          .writeList(_configurations!.map((b) => b.finish(fbBuilder)).toList());
     }
     if (_uri != null) {
-      offset_uri = fbBuilder.writeString(_uri);
+      offset_uri = fbBuilder.writeString(_uri!);
     }
     fbBuilder.startTable();
     if (offset_configurations != null) {
@@ -4146,23 +4179,21 @@
 
   _UnlinkedNamespaceDirectiveImpl(this._bc, this._bcOffset);
 
-  List<idl.UnlinkedNamespaceDirectiveConfiguration> _configurations;
-  String _uri;
+  List<idl.UnlinkedNamespaceDirectiveConfiguration>? _configurations;
+  String? _uri;
 
   @override
   List<idl.UnlinkedNamespaceDirectiveConfiguration> get configurations {
-    _configurations ??=
+    return _configurations ??=
         const fb.ListReader<idl.UnlinkedNamespaceDirectiveConfiguration>(
                 _UnlinkedNamespaceDirectiveConfigurationReader())
             .vTableGet(_bc, _bcOffset, 0,
                 const <idl.UnlinkedNamespaceDirectiveConfiguration>[]);
-    return _configurations;
   }
 
   @override
   String get uri {
-    _uri ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 1, '');
-    return _uri;
+    return _uri ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 1, '');
   }
 }
 
@@ -4171,18 +4202,20 @@
   @override
   Map<String, Object> toJson() {
     Map<String, Object> _result = <String, Object>{};
-    if (configurations.isNotEmpty) {
+    var local_configurations = configurations;
+    if (local_configurations.isNotEmpty) {
       _result["configurations"] =
-          configurations.map((_value) => _value.toJson()).toList();
+          local_configurations.map((_value) => _value.toJson()).toList();
     }
-    if (uri != '') {
-      _result["uri"] = uri;
+    var local_uri = uri;
+    if (local_uri != '') {
+      _result["uri"] = local_uri;
     }
     return _result;
   }
 
   @override
-  Map<String, Object> toMap() => {
+  Map<String, Object?> toMap() => {
         "configurations": configurations,
         "uri": uri,
       };
@@ -4194,9 +4227,9 @@
 class UnlinkedNamespaceDirectiveConfigurationBuilder extends Object
     with _UnlinkedNamespaceDirectiveConfigurationMixin
     implements idl.UnlinkedNamespaceDirectiveConfiguration {
-  String _name;
-  String _uri;
-  String _value;
+  String? _name;
+  String? _uri;
+  String? _value;
 
   @override
   String get name => _name ??= '';
@@ -4224,7 +4257,7 @@
   }
 
   UnlinkedNamespaceDirectiveConfigurationBuilder(
-      {String name, String uri, String value})
+      {String? name, String? uri, String? value})
       : _name = name,
         _uri = uri,
         _value = value;
@@ -4240,17 +4273,17 @@
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
-    fb.Offset offset_name;
-    fb.Offset offset_uri;
-    fb.Offset offset_value;
+    fb.Offset? offset_name;
+    fb.Offset? offset_uri;
+    fb.Offset? offset_value;
     if (_name != null) {
-      offset_name = fbBuilder.writeString(_name);
+      offset_name = fbBuilder.writeString(_name!);
     }
     if (_uri != null) {
-      offset_uri = fbBuilder.writeString(_uri);
+      offset_uri = fbBuilder.writeString(_uri!);
     }
     if (_value != null) {
-      offset_value = fbBuilder.writeString(_value);
+      offset_value = fbBuilder.writeString(_value!);
     }
     fbBuilder.startTable();
     if (offset_name != null) {
@@ -4284,26 +4317,23 @@
 
   _UnlinkedNamespaceDirectiveConfigurationImpl(this._bc, this._bcOffset);
 
-  String _name;
-  String _uri;
-  String _value;
+  String? _name;
+  String? _uri;
+  String? _value;
 
   @override
   String get name {
-    _name ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 0, '');
-    return _name;
+    return _name ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 0, '');
   }
 
   @override
   String get uri {
-    _uri ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 2, '');
-    return _uri;
+    return _uri ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 2, '');
   }
 
   @override
   String get value {
-    _value ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 1, '');
-    return _value;
+    return _value ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 1, '');
   }
 }
 
@@ -4312,20 +4342,23 @@
   @override
   Map<String, Object> toJson() {
     Map<String, Object> _result = <String, Object>{};
-    if (name != '') {
-      _result["name"] = name;
+    var local_name = name;
+    if (local_name != '') {
+      _result["name"] = local_name;
     }
-    if (uri != '') {
-      _result["uri"] = uri;
+    var local_uri = uri;
+    if (local_uri != '') {
+      _result["uri"] = local_uri;
     }
-    if (value != '') {
-      _result["value"] = value;
+    var local_value = value;
+    if (local_value != '') {
+      _result["value"] = local_value;
     }
     return _result;
   }
 
   @override
-  Map<String, Object> toMap() => {
+  Map<String, Object?> toMap() => {
         "name": name,
         "uri": uri,
         "value": value,
@@ -4338,14 +4371,14 @@
 class UnlinkedUnit2Builder extends Object
     with _UnlinkedUnit2Mixin
     implements idl.UnlinkedUnit2 {
-  List<int> _apiSignature;
-  List<UnlinkedNamespaceDirectiveBuilder> _exports;
-  bool _hasLibraryDirective;
-  bool _hasPartOfDirective;
-  List<UnlinkedNamespaceDirectiveBuilder> _imports;
-  List<int> _lineStarts;
-  String _partOfUri;
-  List<String> _parts;
+  List<int>? _apiSignature;
+  List<UnlinkedNamespaceDirectiveBuilder>? _exports;
+  bool? _hasLibraryDirective;
+  bool? _hasPartOfDirective;
+  List<UnlinkedNamespaceDirectiveBuilder>? _imports;
+  List<int>? _lineStarts;
+  String? _partOfUri;
+  List<String>? _parts;
 
   @override
   List<int> get apiSignature => _apiSignature ??= <int>[];
@@ -4353,7 +4386,7 @@
   /// The MD5 hash signature of the API portion of this unit. It depends on all
   /// tokens that might affect APIs of declarations in the unit.
   set apiSignature(List<int> value) {
-    assert(value == null || value.every((e) => e >= 0));
+    assert(value.every((e) => e >= 0));
     this._apiSignature = value;
   }
 
@@ -4396,7 +4429,7 @@
 
   /// Offsets of the first character of each line in the source code.
   set lineStarts(List<int> value) {
-    assert(value == null || value.every((e) => e >= 0));
+    assert(value.every((e) => e >= 0));
     this._lineStarts = value;
   }
 
@@ -4417,14 +4450,14 @@
   }
 
   UnlinkedUnit2Builder(
-      {List<int> apiSignature,
-      List<UnlinkedNamespaceDirectiveBuilder> exports,
-      bool hasLibraryDirective,
-      bool hasPartOfDirective,
-      List<UnlinkedNamespaceDirectiveBuilder> imports,
-      List<int> lineStarts,
-      String partOfUri,
-      List<String> parts})
+      {List<int>? apiSignature,
+      List<UnlinkedNamespaceDirectiveBuilder>? exports,
+      bool? hasLibraryDirective,
+      bool? hasPartOfDirective,
+      List<UnlinkedNamespaceDirectiveBuilder>? imports,
+      List<int>? lineStarts,
+      String? partOfUri,
+      List<String>? parts})
       : _apiSignature = apiSignature,
         _exports = exports,
         _hasLibraryDirective = hasLibraryDirective,
@@ -4446,33 +4479,33 @@
     if (this._apiSignature == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._apiSignature.length);
-      for (var x in this._apiSignature) {
+      signature.addInt(this._apiSignature!.length);
+      for (var x in this._apiSignature!) {
         signature.addInt(x);
       }
     }
     if (this._exports == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._exports.length);
-      for (var x in this._exports) {
-        x?.collectApiSignature(signature);
+      signature.addInt(this._exports!.length);
+      for (var x in this._exports!) {
+        x.collectApiSignature(signature);
       }
     }
     if (this._imports == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._imports.length);
-      for (var x in this._imports) {
-        x?.collectApiSignature(signature);
+      signature.addInt(this._imports!.length);
+      for (var x in this._imports!) {
+        x.collectApiSignature(signature);
       }
     }
     signature.addBool(this._hasPartOfDirective == true);
     if (this._parts == null) {
       signature.addInt(0);
     } else {
-      signature.addInt(this._parts.length);
-      for (var x in this._parts) {
+      signature.addInt(this._parts!.length);
+      for (var x in this._parts!) {
         signature.addString(x);
       }
     }
@@ -4486,32 +4519,32 @@
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
-    fb.Offset offset_apiSignature;
-    fb.Offset offset_exports;
-    fb.Offset offset_imports;
-    fb.Offset offset_lineStarts;
-    fb.Offset offset_partOfUri;
-    fb.Offset offset_parts;
-    if (!(_apiSignature == null || _apiSignature.isEmpty)) {
-      offset_apiSignature = fbBuilder.writeListUint32(_apiSignature);
+    fb.Offset? offset_apiSignature;
+    fb.Offset? offset_exports;
+    fb.Offset? offset_imports;
+    fb.Offset? offset_lineStarts;
+    fb.Offset? offset_partOfUri;
+    fb.Offset? offset_parts;
+    if (!(_apiSignature == null || _apiSignature!.isEmpty)) {
+      offset_apiSignature = fbBuilder.writeListUint32(_apiSignature!);
     }
-    if (!(_exports == null || _exports.isEmpty)) {
+    if (!(_exports == null || _exports!.isEmpty)) {
       offset_exports = fbBuilder
-          .writeList(_exports.map((b) => b.finish(fbBuilder)).toList());
+          .writeList(_exports!.map((b) => b.finish(fbBuilder)).toList());
     }
-    if (!(_imports == null || _imports.isEmpty)) {
+    if (!(_imports == null || _imports!.isEmpty)) {
       offset_imports = fbBuilder
-          .writeList(_imports.map((b) => b.finish(fbBuilder)).toList());
+          .writeList(_imports!.map((b) => b.finish(fbBuilder)).toList());
     }
-    if (!(_lineStarts == null || _lineStarts.isEmpty)) {
-      offset_lineStarts = fbBuilder.writeListUint32(_lineStarts);
+    if (!(_lineStarts == null || _lineStarts!.isEmpty)) {
+      offset_lineStarts = fbBuilder.writeListUint32(_lineStarts!);
     }
     if (_partOfUri != null) {
-      offset_partOfUri = fbBuilder.writeString(_partOfUri);
+      offset_partOfUri = fbBuilder.writeString(_partOfUri!);
     }
-    if (!(_parts == null || _parts.isEmpty)) {
+    if (!(_parts == null || _parts!.isEmpty)) {
       offset_parts = fbBuilder
-          .writeList(_parts.map((b) => fbBuilder.writeString(b)).toList());
+          .writeList(_parts!.map((b) => fbBuilder.writeString(b)).toList());
     }
     fbBuilder.startTable();
     if (offset_apiSignature != null) {
@@ -4563,70 +4596,63 @@
 
   _UnlinkedUnit2Impl(this._bc, this._bcOffset);
 
-  List<int> _apiSignature;
-  List<idl.UnlinkedNamespaceDirective> _exports;
-  bool _hasLibraryDirective;
-  bool _hasPartOfDirective;
-  List<idl.UnlinkedNamespaceDirective> _imports;
-  List<int> _lineStarts;
-  String _partOfUri;
-  List<String> _parts;
+  List<int>? _apiSignature;
+  List<idl.UnlinkedNamespaceDirective>? _exports;
+  bool? _hasLibraryDirective;
+  bool? _hasPartOfDirective;
+  List<idl.UnlinkedNamespaceDirective>? _imports;
+  List<int>? _lineStarts;
+  String? _partOfUri;
+  List<String>? _parts;
 
   @override
   List<int> get apiSignature {
-    _apiSignature ??=
+    return _apiSignature ??=
         const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 0, const <int>[]);
-    return _apiSignature;
   }
 
   @override
   List<idl.UnlinkedNamespaceDirective> get exports {
-    _exports ??= const fb.ListReader<idl.UnlinkedNamespaceDirective>(
+    return _exports ??= const fb.ListReader<idl.UnlinkedNamespaceDirective>(
             _UnlinkedNamespaceDirectiveReader())
         .vTableGet(_bc, _bcOffset, 1, const <idl.UnlinkedNamespaceDirective>[]);
-    return _exports;
   }
 
   @override
   bool get hasLibraryDirective {
-    _hasLibraryDirective ??=
+    return _hasLibraryDirective ??=
         const fb.BoolReader().vTableGet(_bc, _bcOffset, 6, false);
-    return _hasLibraryDirective;
   }
 
   @override
   bool get hasPartOfDirective {
-    _hasPartOfDirective ??=
+    return _hasPartOfDirective ??=
         const fb.BoolReader().vTableGet(_bc, _bcOffset, 3, false);
-    return _hasPartOfDirective;
   }
 
   @override
   List<idl.UnlinkedNamespaceDirective> get imports {
-    _imports ??= const fb.ListReader<idl.UnlinkedNamespaceDirective>(
+    return _imports ??= const fb.ListReader<idl.UnlinkedNamespaceDirective>(
             _UnlinkedNamespaceDirectiveReader())
         .vTableGet(_bc, _bcOffset, 2, const <idl.UnlinkedNamespaceDirective>[]);
-    return _imports;
   }
 
   @override
   List<int> get lineStarts {
-    _lineStarts ??=
+    return _lineStarts ??=
         const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 5, const <int>[]);
-    return _lineStarts;
   }
 
   @override
   String get partOfUri {
-    _partOfUri ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 7, '');
-    return _partOfUri;
+    return _partOfUri ??=
+        const fb.StringReader().vTableGet(_bc, _bcOffset, 7, '');
   }
 
   @override
   List<String> get parts {
-    _parts ??= const fb.ListReader<String>(fb.StringReader())
+    return _parts ??= const fb.ListReader<String>(fb.StringReader())
         .vTableGet(_bc, _bcOffset, 4, const <String>[]);
-    return _parts;
   }
 }
 
@@ -4634,35 +4660,45 @@
   @override
   Map<String, Object> toJson() {
     Map<String, Object> _result = <String, Object>{};
-    if (apiSignature.isNotEmpty) {
-      _result["apiSignature"] = apiSignature;
+    var local_apiSignature = apiSignature;
+    if (local_apiSignature.isNotEmpty) {
+      _result["apiSignature"] = local_apiSignature;
     }
-    if (exports.isNotEmpty) {
-      _result["exports"] = exports.map((_value) => _value.toJson()).toList();
+    var local_exports = exports;
+    if (local_exports.isNotEmpty) {
+      _result["exports"] =
+          local_exports.map((_value) => _value.toJson()).toList();
     }
-    if (hasLibraryDirective != false) {
-      _result["hasLibraryDirective"] = hasLibraryDirective;
+    var local_hasLibraryDirective = hasLibraryDirective;
+    if (local_hasLibraryDirective != false) {
+      _result["hasLibraryDirective"] = local_hasLibraryDirective;
     }
-    if (hasPartOfDirective != false) {
-      _result["hasPartOfDirective"] = hasPartOfDirective;
+    var local_hasPartOfDirective = hasPartOfDirective;
+    if (local_hasPartOfDirective != false) {
+      _result["hasPartOfDirective"] = local_hasPartOfDirective;
     }
-    if (imports.isNotEmpty) {
-      _result["imports"] = imports.map((_value) => _value.toJson()).toList();
+    var local_imports = imports;
+    if (local_imports.isNotEmpty) {
+      _result["imports"] =
+          local_imports.map((_value) => _value.toJson()).toList();
     }
-    if (lineStarts.isNotEmpty) {
-      _result["lineStarts"] = lineStarts;
+    var local_lineStarts = lineStarts;
+    if (local_lineStarts.isNotEmpty) {
+      _result["lineStarts"] = local_lineStarts;
     }
-    if (partOfUri != '') {
-      _result["partOfUri"] = partOfUri;
+    var local_partOfUri = partOfUri;
+    if (local_partOfUri != '') {
+      _result["partOfUri"] = local_partOfUri;
     }
-    if (parts.isNotEmpty) {
-      _result["parts"] = parts;
+    var local_parts = parts;
+    if (local_parts.isNotEmpty) {
+      _result["parts"] = local_parts;
     }
     return _result;
   }
 
   @override
-  Map<String, Object> toMap() => {
+  Map<String, Object?> toMap() => {
         "apiSignature": apiSignature,
         "exports": exports,
         "hasLibraryDirective": hasLibraryDirective,
diff --git a/pkg/analyzer/lib/src/summary/idl.dart b/pkg/analyzer/lib/src/summary/idl.dart
index bd9d540..25bd28f 100644
--- a/pkg/analyzer/lib/src/summary/idl.dart
+++ b/pkg/analyzer/lib/src/summary/idl.dart
@@ -97,7 +97,7 @@
 
   /// The index of the unit.
   @Id(1)
-  AnalysisDriverUnitIndex get index;
+  AnalysisDriverUnitIndex? get index;
 }
 
 /// Information about a subtype of one or more classes.
@@ -284,7 +284,7 @@
 
   /// Unlinked information for the unit.
   @Id(4)
-  UnlinkedUnit2 get unit2;
+  UnlinkedUnit2? get unit2;
 }
 
 /// Information about a single declaration.
@@ -402,7 +402,7 @@
 
   /// The Dartdoc directives in the file.
   @Id(1)
-  DirectiveInfo get directiveInfo;
+  DirectiveInfo? get directiveInfo;
 
   /// Exports directives of the file.
   @Id(2)
@@ -475,7 +475,7 @@
 
   /// Unlinked summary of the compilation unit.
   @Id(1)
-  UnlinkedUnit2 get unlinkedUnit;
+  UnlinkedUnit2? get unlinkedUnit;
 }
 
 abstract class DiagnosticMessage extends base.SummaryClass {
diff --git a/pkg/analyzer/lib/src/summary/link.dart b/pkg/analyzer/lib/src/summary/link.dart
index 0d492d2..c2dbee3 100644
--- a/pkg/analyzer/lib/src/summary/link.dart
+++ b/pkg/analyzer/lib/src/summary/link.dart
@@ -135,7 +135,7 @@
   /// in the strongly connected component to which this node belongs.
   int _lowLink = 0;
 
-  List<NodeType> _dependencies;
+  List<NodeType>? _dependencies;
 
   /// Indicates whether this node has been evaluated yet.
   bool get isEvaluated;
diff --git a/pkg/analyzer/lib/src/summary/package_bundle_reader.dart b/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
index b206f48..786fbc5 100644
--- a/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
@@ -4,6 +4,7 @@
 
 import 'dart:io' as io;
 import 'dart:math' show min;
+import 'dart:typed_data';
 
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/generated/engine.dart';
@@ -17,7 +18,7 @@
   final String duplicatedUri;
   final String summary1Uri;
   final String summary2Uri;
-  String _message;
+  late final String _message;
 
   ConflictingSummaryException(Iterable<String> summaryPaths, this.duplicatedUri,
       this.summary1Uri, this.summary2Uri) {
@@ -88,16 +89,16 @@
 /// The [UriResolver] that knows about sources that are served from their
 /// summaries.
 class InSummaryUriResolver extends UriResolver {
-  ResourceProvider resourceProvider;
+  ResourceProvider? resourceProvider;
   final SummaryDataStore _dataStore;
 
   InSummaryUriResolver(this.resourceProvider, this._dataStore);
 
   @override
-  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
+  Source? resolveAbsolute(Uri uri, [Uri? actualUri]) {
     actualUri ??= uri;
     String uriString = uri.toString();
-    String summaryPath = _dataStore.uriToSummaryPath[uriString];
+    String? summaryPath = _dataStore.uriToSummaryPath[uriString];
     if (summaryPath != null) {
       return InSummarySource(actualUri, summaryPath);
     }
@@ -113,7 +114,7 @@
   final List<PackageBundleReader> bundles = [];
 
   /// Map from the URI of a unit to the summary path that contained it.
-  final Map<String, String> uriToSummaryPath = <String, String>{};
+  final Map<String, String?> uriToSummaryPath = <String, String?>{};
 
   final Set<String> _libraryUris = <String>{};
   final Set<String> _partUris = <String>{};
@@ -121,12 +122,12 @@
   /// Create a [SummaryDataStore] and populate it with the summaries in
   /// [summaryPaths].
   SummaryDataStore(Iterable<String> summaryPaths,
-      {ResourceProvider resourceProvider}) {
+      {ResourceProvider? resourceProvider}) {
     summaryPaths.forEach((String path) => _fillMaps(path, resourceProvider));
   }
 
   /// Add the given [bundle] loaded from the file with the given [path].
-  void addBundle(String path, PackageBundleReader bundle) {
+  void addBundle(String? path, PackageBundleReader bundle) {
     bundles.add(bundle);
 
     for (var library in bundle.libraries) {
@@ -159,11 +160,11 @@
     return _partUris.contains(uri);
   }
 
-  void _fillMaps(String path, ResourceProvider resourceProvider) {
-    List<int> bytes;
+  void _fillMaps(String path, ResourceProvider? resourceProvider) {
+    Uint8List bytes;
     if (resourceProvider != null) {
       var file = resourceProvider.getFile(path);
-      bytes = file.readAsBytesSync();
+      bytes = file.readAsBytesSync() as Uint8List;
     } else {
       io.File file = io.File(path);
       bytes = file.readAsBytesSync();
diff --git a/pkg/analyzer/lib/src/summary/summary_file_builder.dart b/pkg/analyzer/lib/src/summary/summary_file_builder.dart
index 92b577f..6f9c3ed 100644
--- a/pkg/analyzer/lib/src/summary/summary_file_builder.dart
+++ b/pkg/analyzer/lib/src/summary/summary_file_builder.dart
@@ -7,16 +7,15 @@
 
 import 'package:analyzer/dart/sdk/build_sdk_summary.dart' as api;
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:meta/meta.dart';
 
 /// Build summary for SDK the at the given [sdkPath].
 ///
 /// If [embedderYamlPath] is provided, then libraries from this file are
 /// appended to the libraries of the specified SDK.
 List<int> buildSdkSummary({
-  @required ResourceProvider resourceProvider,
-  @required String sdkPath,
-  String embedderYamlPath,
+  required ResourceProvider resourceProvider,
+  required String sdkPath,
+  String? embedderYamlPath,
 }) {
   return api.buildSdkSummary(
     resourceProvider: resourceProvider,
diff --git a/pkg/analyzer/lib/src/summary/summary_sdk.dart b/pkg/analyzer/lib/src/summary/summary_sdk.dart
index 2d0bd29..5ad073a 100644
--- a/pkg/analyzer/lib/src/summary/summary_sdk.dart
+++ b/pkg/analyzer/lib/src/summary/summary_sdk.dart
@@ -14,10 +14,10 @@
 /// suitable only for command-line tools, but not for IDEs - it does not
 /// implement [sdkLibraries], [uris] and [fromFileUri].
 class SummaryBasedDartSdk implements DartSdk {
-  SummaryDataStore _dataStore;
-  InSummaryUriResolver _uriResolver;
-  PackageBundleReader _bundle;
-  ResourceProvider resourceProvider;
+  late final SummaryDataStore _dataStore;
+  late final InSummaryUriResolver _uriResolver;
+  late final PackageBundleReader _bundle;
+  ResourceProvider? resourceProvider;
 
   SummaryBasedDartSdk(String summaryPath, bool _, {this.resourceProvider}) {
     _dataStore = SummaryDataStore(<String>[summaryPath],
@@ -28,7 +28,7 @@
 
   @override
   String get allowedExperimentsJson {
-    return _bundle.sdk.allowedExperimentsJson;
+    return _bundle.sdk!.allowedExperimentsJson;
   }
 
   /// Return the [PackageBundleReader] for this SDK, not `null`.
@@ -37,8 +37,8 @@
   @override
   Version get languageVersion {
     return Version(
-      _bundle.sdk.languageVersionMajor,
-      _bundle.sdk.languageVersionMinor,
+      _bundle.sdk!.languageVersionMajor,
+      _bundle.sdk!.languageVersionMinor,
       0,
     );
   }
@@ -61,19 +61,19 @@
   }
 
   @override
-  Source fromFileUri(Uri uri) {
+  Source? fromFileUri(Uri uri) {
     return null;
   }
 
   @override
-  SdkLibrary getSdkLibrary(String uri) {
+  SdkLibrary? getSdkLibrary(String uri) {
     // This is not quite correct, but currently it's used only in
     // to report errors on importing or exporting of internal libraries.
     return null;
   }
 
   @override
-  Source mapDartUri(String uriStr) {
+  Source? mapDartUri(String uriStr) {
     Uri uri = Uri.parse(uriStr);
     return _uriResolver.resolveAbsolute(uri);
   }
diff --git a/pkg/analyzer/lib/src/summary2/apply_resolution.dart b/pkg/analyzer/lib/src/summary2/apply_resolution.dart
index ec7202d..027dba1 100644
--- a/pkg/analyzer/lib/src/summary2/apply_resolution.dart
+++ b/pkg/analyzer/lib/src/summary2/apply_resolution.dart
@@ -19,6 +19,7 @@
 import 'package:analyzer/src/summary2/bundle_reader.dart';
 import 'package:analyzer/src/summary2/linked_unit_context.dart';
 import 'package:analyzer/src/task/inference_error.dart';
+import 'package:collection/collection.dart';
 
 class ApplyResolutionVisitor extends ThrowingAstVisitor<void> {
   final LinkedUnitContext _unitContext;
@@ -48,7 +49,7 @@
       if (typeParameterList == null) return;
 
       for (var typeParameter in typeParameterList.typeParameters) {
-        var element = typeParameter.declaredElement;
+        var element = typeParameter.declaredElement!;
         _localElements.add(element);
       }
     } else if (enclosing is ExtensionDeclaration) {
@@ -56,7 +57,7 @@
       if (typeParameterList == null) return;
 
       for (var typeParameter in typeParameterList.typeParameters) {
-        var element = typeParameter.declaredElement;
+        var element = typeParameter.declaredElement!;
         _localElements.add(element);
       }
     } else if (enclosing is VariableDeclarationList) {
@@ -126,7 +127,7 @@
     _expectMarker(MarkerTag.AssignmentExpression_rightHandSide);
     node.rightHandSide.accept(this);
     _expectMarker(MarkerTag.AssignmentExpression_staticElement);
-    node.staticElement = _nextElement();
+    node.staticElement = _nextElement() as MethodElement?;
     _expectMarker(MarkerTag.AssignmentExpression_readElement);
     nodeImpl.readElement = _nextElement();
     _expectMarker(MarkerTag.AssignmentExpression_readType);
@@ -157,7 +158,7 @@
     node.rightOperand.accept(this);
 
     _expectMarker(MarkerTag.BinaryExpression_staticElement);
-    node.staticElement = _nextElement();
+    node.staticElement = _nextElement() as MethodElement?;
 
     _expectMarker(MarkerTag.BinaryExpression_expression);
     _expression(node);
@@ -227,9 +228,9 @@
     _expectMarker(MarkerTag.ClassTypeAlias_typeParameters);
     node.typeParameters?.accept(this);
     _expectMarker(MarkerTag.ClassTypeAlias_superclass);
-    node.superclass?.accept(this);
+    node.superclass.accept(this);
     _expectMarker(MarkerTag.ClassTypeAlias_withClause);
-    node.withClause?.accept(this);
+    node.withClause.accept(this);
     _expectMarker(MarkerTag.ClassTypeAlias_implementsClause);
     node.implementsClause?.accept(this);
     _expectMarker(MarkerTag.ClassTypeAlias_typeAlias);
@@ -253,11 +254,11 @@
   @override
   void visitConfiguration(Configuration node) {
     _expectMarker(MarkerTag.Configuration_name);
-    node.name?.accept(this);
+    node.name.accept(this);
     _expectMarker(MarkerTag.Configuration_value);
     node.value?.accept(this);
     _expectMarker(MarkerTag.Configuration_uri);
-    node.uri?.accept(this);
+    node.uri.accept(this);
     _expectMarker(MarkerTag.Configuration_end);
   }
 
@@ -271,16 +272,16 @@
     _enclosingElements.add(element);
 
     _expectMarker(MarkerTag.ConstructorDeclaration_returnType);
-    node.returnType?.accept(this);
+    node.returnType.accept(this);
     _expectMarker(MarkerTag.ConstructorDeclaration_parameters);
-    node.parameters?.accept(this);
+    node.parameters.accept(this);
 
     for (var parameter in node.parameters.parameters) {
-      _localElements.add(parameter.declaredElement);
+      _localElements.add(parameter.declaredElement!);
     }
 
     _expectMarker(MarkerTag.ConstructorDeclaration_initializers);
-    node.initializers?.accept(this);
+    node.initializers.accept(this);
     _expectMarker(MarkerTag.ConstructorDeclaration_redirectedConstructor);
     node.redirectedConstructor?.accept(this);
     _expectMarker(MarkerTag.ConstructorDeclaration_classMember);
@@ -327,7 +328,7 @@
     _expectMarker(MarkerTag.ConstructorName_name);
     node.name?.accept(this);
     _expectMarker(MarkerTag.ConstructorName_staticElement);
-    node.staticElement = _nextElement();
+    node.staticElement = _nextElement() as ConstructorElement?;
     _expectMarker(MarkerTag.ConstructorName_end);
   }
 
@@ -349,7 +350,7 @@
     var enclosing = _enclosingElements.last;
     var name = node.identifier?.name ?? '';
     var reference = node.isNamed && enclosing.reference != null
-        ? enclosing.reference.getChild('@parameter').getChild(name)
+        ? enclosing.reference!.getChild('@parameter').getChild(name)
         : null;
     ParameterElementImpl element;
     if (node.parameter is FieldFormalParameter) {
@@ -399,10 +400,11 @@
 
   @override
   void visitExportDirective(ExportDirective node) {
+    var elementImpl = node.element as ExportElementImpl;
     _expectMarker(MarkerTag.ExportDirective_namespaceDirective);
     _namespaceDirective(node);
     _expectMarker(MarkerTag.ExportDirective_exportedLibrary);
-    (node.element as ExportElementImpl).exportedLibrary = _nextElement();
+    elementImpl.exportedLibrary = _nextElement() as LibraryElement?;
     _expectMarker(MarkerTag.ExportDirective_end);
   }
 
@@ -428,7 +430,7 @@
     _expectMarker(MarkerTag.ExtensionDeclaration_typeParameters);
     node.typeParameters?.accept(this);
     _expectMarker(MarkerTag.ExtensionDeclaration_extendedType);
-    node.extendedType?.accept(this);
+    node.extendedType.accept(this);
     _expectMarker(MarkerTag.ExtensionDeclaration_compilationUnitMember);
     _compilationUnitMember(node);
     _expectMarker(MarkerTag.ExtensionDeclaration_end);
@@ -473,7 +475,7 @@
 
   @override
   void visitFieldFormalParameter(FieldFormalParameter node) {
-    ParameterElement element;
+    ParameterElementImpl? element;
     if (node.parent is! DefaultFormalParameter) {
       var enclosing = _enclosingElements.last;
       element =
@@ -550,8 +552,6 @@
     _assertNoLocalElements();
 
     var element = node.declaredElement as ExecutableElementImpl;
-    assert(element != null);
-
     _enclosingElements.add(element);
 
     _expectMarker(MarkerTag.FunctionDeclaration_functionExpression);
@@ -562,7 +562,7 @@
     _expectMarker(MarkerTag.FunctionDeclaration_namedCompilationUnitMember);
     _namedCompilationUnitMember(node);
     _expectMarker(MarkerTag.FunctionDeclaration_returnTypeType);
-    element.returnType = _nextType();
+    element.returnType = _nextType()!;
     _expectMarker(MarkerTag.FunctionDeclaration_end);
   }
 
@@ -607,14 +607,14 @@
     _expectMarker(MarkerTag.FunctionTypeAlias_returnType);
     node.returnType?.accept(this);
     _expectMarker(MarkerTag.FunctionTypeAlias_parameters);
-    node.parameters?.accept(this);
+    node.parameters.accept(this);
     _enclosingElements.removeLast();
 
     _expectMarker(MarkerTag.FunctionTypeAlias_typeAlias);
     _typeAlias(node);
 
     _expectMarker(MarkerTag.FunctionTypeAlias_returnTypeType);
-    element.function.returnType = _nextType();
+    element.function.returnType = _nextType()!;
     _expectMarker(MarkerTag.FunctionTypeAlias_flags);
     element.isSimplyBounded = _resolution.readByte() != 0;
     element.hasSelfReference = _resolution.readByte() != 0;
@@ -625,7 +625,7 @@
 
   @override
   void visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
-    var element = node.declaredElement;
+    var element = node.declaredElement as ParameterElementImpl?;
     if (node.parent is! DefaultFormalParameter) {
       var enclosing = _enclosingElements.last;
       element =
@@ -639,7 +639,7 @@
     _expectMarker(MarkerTag.FunctionTypedFormalParameter_returnType);
     node.returnType?.accept(this);
     _expectMarker(MarkerTag.FunctionTypedFormalParameter_parameters);
-    node.parameters?.accept(this);
+    node.parameters.accept(this);
     _expectMarker(MarkerTag.FunctionTypedFormalParameter_normalFormalParameter);
     _normalFormalParameter(node, element);
     _expectMarker(MarkerTag.FunctionTypedFormalParameter_end);
@@ -652,7 +652,7 @@
     var nodeImpl = node as GenericFunctionTypeImpl;
     var localElementsLength = _localElements.length;
 
-    var element = nodeImpl.declaredElement as GenericFunctionTypeElementImpl;
+    var element = nodeImpl.declaredElement as GenericFunctionTypeElementImpl?;
     element ??= GenericFunctionTypeElementImpl.forLinkedNode(
         _enclosingElements.last, null, node);
     _enclosingElements.add(element);
@@ -662,7 +662,7 @@
     _expectMarker(MarkerTag.GenericFunctionType_returnType);
     node.returnType?.accept(this);
     _expectMarker(MarkerTag.GenericFunctionType_parameters);
-    node.parameters?.accept(this);
+    node.parameters.accept(this);
     _expectMarker(MarkerTag.GenericFunctionType_type);
     nodeImpl.type = _nextType();
     _expectMarker(MarkerTag.GenericFunctionType_end);
@@ -676,14 +676,12 @@
     _assertNoLocalElements();
 
     var element = node.declaredElement as TypeAliasElementImpl;
-    assert(element != null);
-
     _enclosingElements.add(element);
 
     _expectMarker(MarkerTag.GenericTypeAlias_typeParameters);
     node.typeParameters?.accept(this);
     _expectMarker(MarkerTag.GenericTypeAlias_type);
-    node.type?.accept(this);
+    node.type.accept(this);
     _expectMarker(MarkerTag.GenericTypeAlias_typeAlias);
     _typeAlias(node);
     _expectMarker(MarkerTag.GenericTypeAlias_flags);
@@ -724,7 +722,7 @@
 
     var element = node.element as ImportElementImpl;
     _expectMarker(MarkerTag.ImportDirective_importedLibrary);
-    element.importedLibrary = _nextElement();
+    element.importedLibrary = _nextElement() as LibraryElement?;
 
     _expectMarker(MarkerTag.ImportDirective_end);
   }
@@ -736,7 +734,7 @@
     _expectMarker(MarkerTag.IndexExpression_index);
     node.index.accept(this);
     _expectMarker(MarkerTag.IndexExpression_staticElement);
-    node.staticElement = _nextElement();
+    node.staticElement = _nextElement() as MethodElement?;
     _expectMarker(MarkerTag.IndexExpression_expression);
     _expression(node);
     _expectMarker(MarkerTag.IndexExpression_end);
@@ -828,7 +826,7 @@
     _pushEnclosingClassTypeParameters(node);
 
     var element = node.declaredElement as ExecutableElementImpl;
-    _enclosingElements.add(element.enclosingElement);
+    _enclosingElements.add(element.enclosingElement as ElementImpl);
     _enclosingElements.add(element);
 
     try {
@@ -842,7 +840,7 @@
       _classMember(node);
 
       _expectMarker(MarkerTag.MethodDeclaration_returnTypeType);
-      element.returnType = _nextType();
+      element.returnType = _nextType()!;
       _expectMarker(MarkerTag.MethodDeclaration_inferenceError);
       _setTopLevelInferenceError(element);
       if (element is MethodElementImpl) {
@@ -880,7 +878,7 @@
       } else {
         identifier = astFactory.prefixedIdentifier(
           node.target as SimpleIdentifier,
-          node.operator,
+          node.operator!,
           node.methodName,
         );
       }
@@ -901,7 +899,7 @@
       } else {
         expression = astFactory.propertyAccess(
           target,
-          node.operator,
+          node.operator!,
           node.methodName,
         );
       }
@@ -933,7 +931,7 @@
           ? node.methodName
           : astFactory.prefixedIdentifier(
               node.target as SimpleIdentifier,
-              node.operator,
+              node.operator!,
               node.methodName,
             );
       var replacement = astFactory.instanceCreationExpression(
@@ -992,7 +990,7 @@
   @override
   void visitNativeClause(NativeClause node) {
     _expectMarker(MarkerTag.NativeClause_name);
-    node.name.accept(this);
+    node.name?.accept(this);
     _expectMarker(MarkerTag.NativeClause_end);
   }
 
@@ -1039,7 +1037,7 @@
     _expectMarker(MarkerTag.PostfixExpression_operand);
     node.operand.accept(this);
     _expectMarker(MarkerTag.PostfixExpression_staticElement);
-    node.staticElement = _nextElement();
+    node.staticElement = _nextElement() as MethodElement?;
     if (node.operator.type.isIncrementOperator) {
       _expectMarker(MarkerTag.PostfixExpression_readElement);
       nodeImpl.readElement = _nextElement();
@@ -1072,7 +1070,7 @@
     _expectMarker(MarkerTag.PrefixExpression_operand);
     node.operand.accept(this);
     _expectMarker(MarkerTag.PrefixExpression_staticElement);
-    node.staticElement = _nextElement();
+    node.staticElement = _nextElement() as MethodElement?;
     if (node.operator.type.isIncrementOperator) {
       _expectMarker(MarkerTag.PrefixExpression_readElement);
       nodeImpl.readElement = _nextElement();
@@ -1108,7 +1106,7 @@
     _expectMarker(MarkerTag.RedirectingConstructorInvocation_argumentList);
     node.argumentList.accept(this);
     _expectMarker(MarkerTag.RedirectingConstructorInvocation_staticElement);
-    node.staticElement = _nextElement();
+    node.staticElement = _nextElement() as ConstructorElement?;
     _resolveNamedExpressions(node.staticElement, node.argumentList);
     _expectMarker(MarkerTag.RedirectingConstructorInvocation_end);
   }
@@ -1139,8 +1137,8 @@
 
   @override
   visitSimpleFormalParameter(SimpleFormalParameter node) {
-    var element = node.declaredElement as ParameterElementImpl;
-    if (node.parent is! DefaultFormalParameter) {
+    var element = node.declaredElement as ParameterElementImpl?;
+    if (element == null) {
       var enclosing = _enclosingElements.last;
       element =
           ParameterElementImpl.forLinkedNodeFactory(enclosing, null, node);
@@ -1192,7 +1190,7 @@
     _expectMarker(MarkerTag.SuperConstructorInvocation_argumentList);
     node.argumentList.accept(this);
     _expectMarker(MarkerTag.SuperConstructorInvocation_staticElement);
-    node.staticElement = _nextElement();
+    node.staticElement = _nextElement() as ConstructorElement?;
     _resolveNamedExpressions(node.staticElement, node.argumentList);
     _expectMarker(MarkerTag.SuperConstructorInvocation_end);
   }
@@ -1237,7 +1235,7 @@
   @override
   visitTypeArgumentList(TypeArgumentList node) {
     _expectMarker(MarkerTag.TypeArgumentList_arguments);
-    node.arguments?.accept(this);
+    node.arguments.accept(this);
     _expectMarker(MarkerTag.TypeArgumentList_end);
   }
 
@@ -1324,7 +1322,7 @@
   void visitVariableDeclaration(VariableDeclaration node) {
     var element = node.declaredElement as VariableElementImpl;
     _expectMarker(MarkerTag.VariableDeclaration_type);
-    element.type = _nextType();
+    element.type = _nextType()!;
     _expectMarker(MarkerTag.VariableDeclaration_inferenceError);
     _setTopLevelInferenceError(element);
     if (element is FieldElementImpl) {
@@ -1357,7 +1355,7 @@
 
   void _annotatedNode(AnnotatedNode node) {
     _expectMarker(MarkerTag.AnnotatedNode_metadata);
-    node.metadata?.accept(this);
+    node.metadata.accept(this);
     _expectMarker(MarkerTag.AnnotatedNode_end);
   }
 
@@ -1375,14 +1373,12 @@
       return const <ElementAnnotation>[];
     }
 
-    var annotations = List<ElementAnnotation>.filled(length, null);
-    for (int i = 0; i < length; i++) {
-      var ast = nodeList[i];
-      annotations[i] = ElementAnnotationImpl(unit)
+    return List.generate(length, (index) {
+      var ast = nodeList[index];
+      return ElementAnnotationImpl(unit)
         ..annotationAst = ast
         ..element = ast.element;
-    }
-    return annotations;
+    });
   }
 
   void _classMember(ClassMember node) {
@@ -1433,7 +1429,7 @@
 
   void _formalParameter(FormalParameter node) {
     _expectMarker(MarkerTag.FormalParameter_type);
-    (node.declaredElement as ParameterElementImpl).type = _nextType();
+    (node.declaredElement as ParameterElementImpl).type = _nextType()!;
   }
 
   void _forMixin(ForMixin node) {
@@ -1470,34 +1466,34 @@
 
   void _namespaceDirective(NamespaceDirective node) {
     _expectMarker(MarkerTag.NamespaceDirective_combinators);
-    node.combinators?.accept(this);
+    node.combinators.accept(this);
     _expectMarker(MarkerTag.NamespaceDirective_configurations);
-    node.configurations?.accept(this);
+    node.configurations.accept(this);
     _expectMarker(MarkerTag.NamespaceDirective_uriBasedDirective);
     _uriBasedDirective(node);
     _expectMarker(MarkerTag.NamespaceDirective_end);
   }
 
-  Element _nextElement() {
+  Element? _nextElement() {
     return _resolution.nextElement();
   }
 
-  DartType _nextType() {
+  DartType? _nextType() {
     return _resolution.nextType();
   }
 
   void _normalFormalParameter(
     NormalFormalParameter node,
-    ParameterElementImpl element,
+    ParameterElementImpl? element,
   ) {
     if (node.parent is! DefaultFormalParameter) {
       var nodeImpl = node as NormalFormalParameterImpl;
       var summaryData = nodeImpl.summaryData as SummaryDataForFormalParameter;
-      element.setCodeRange(summaryData.codeOffset, summaryData.codeLength);
+      element!.setCodeRange(summaryData.codeOffset, summaryData.codeLength);
     }
 
     _expectMarker(MarkerTag.NormalFormalParameter_metadata);
-    node.metadata?.accept(this);
+    node.metadata.accept(this);
     _expectMarker(MarkerTag.NormalFormalParameter_formalParameter);
     _formalParameter(node);
     _expectMarker(MarkerTag.NormalFormalParameter_end);
@@ -1507,16 +1503,16 @@
   void _pushEnclosingClassTypeParameters(ClassMember node) {
     var parent = node.parent;
     if (parent is ClassOrMixinDeclaration) {
-      var classElement = parent.declaredElement;
+      var classElement = parent.declaredElement!;
       _localElements.addAll(classElement.typeParameters);
     } else {
       var extension = parent as ExtensionDeclaration;
-      var classElement = extension.declaredElement;
+      var classElement = extension.declaredElement!;
       _localElements.addAll(classElement.typeParameters);
     }
   }
 
-  TopLevelInferenceError _readTopLevelInferenceError() {
+  TopLevelInferenceError? _readTopLevelInferenceError() {
     var kindIndex = _resolution.readByte();
     var kind = TopLevelInferenceErrorKind.values[kindIndex];
     if (kind == TopLevelInferenceErrorKind.none) {
@@ -1529,7 +1525,7 @@
   }
 
   void _resolveNamedExpressions(
-    Element executable,
+    Element? executable,
     ArgumentList argumentList,
   ) {
     for (var argument in argumentList.arguments) {
@@ -1538,9 +1534,9 @@
         if (executable is ExecutableElement) {
           var parameters = executable.parameters;
           var name = nameNode.name;
-          nameNode.staticElement = parameters.firstWhere((e) {
+          nameNode.staticElement = parameters.firstWhereOrNull((e) {
             return e.name == name;
-          }, orElse: () => null);
+          });
         }
       }
     }
@@ -1577,7 +1573,7 @@
     return nodeStr.substring(0, indexOfBody);
   }
 
-  static Variance _decodeVariance(int encoding) {
+  static Variance? _decodeVariance(int encoding) {
     if (encoding == 0) {
       return null;
     } else if (encoding == 1) {
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_flags.dart b/pkg/analyzer/lib/src/summary2/ast_binary_flags.dart
index 4c23e9f..8feb2f2 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_flags.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_flags.dart
@@ -62,18 +62,21 @@
     0,
     IndexExpression,
     MethodInvocation,
+    PropertyAccess,
   );
 
   static final _hasPeriod2 = _checkBit(
     1,
     MethodInvocation,
+    PropertyAccess,
   );
 
   static final _hasQuestion = _checkBit(
-    1,
+    2,
     FieldFormalParameter,
     GenericFunctionType,
     IndexExpression,
+    PropertyAccess,
     TypeName,
   );
 
@@ -570,7 +573,7 @@
 
   /// Check the bit for its uniqueness for the given types.
   static int _checkBit(int shift, Type type1,
-      [Type type2, Type type3, Type type4, Type type5, Type type6]) {
+      [Type? type2, Type? type3, Type? type4, Type? type5, Type? type6]) {
     _checkBit0(shift, type1);
     _checkBit0(shift, type2);
     _checkBit0(shift, type3);
@@ -581,7 +584,7 @@
   }
 
   /// Check the bit for its uniqueness for the [type].
-  static void _checkBit0(int shift, Type type) {
+  static void _checkBit0(int shift, Type? type) {
     if (type != null) {
       var currentBits = _typeBits[type] ?? 0;
       var bit = 1 << shift;
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
index 8be47e2..af79a1f 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
@@ -17,7 +17,6 @@
 import 'package:analyzer/src/summary2/ast_binary_tokens.dart';
 import 'package:analyzer/src/summary2/bundle_reader.dart';
 import 'package:analyzer/src/summary2/unlinked_token_type.dart';
-import 'package:meta/meta.dart';
 
 /// Deserializer of ASTs.
 class AstBinaryReader {
@@ -27,8 +26,8 @@
   final bool _withInformative;
 
   AstBinaryReader({
-    @required UnitReader reader,
-  })  : _unitReader = reader,
+    required UnitReader reader,
+  })   : _unitReader = reader,
         _withInformative = reader.withInformative;
 
   AstNode readNode() {
@@ -259,9 +258,9 @@
   }
 
   Annotation _readAnnotation() {
-    var name = _readOptionalNode() as Identifier;
-    var constructorName = _readOptionalNode() as SimpleIdentifier;
-    var arguments = _readOptionalNode() as ArgumentList;
+    var name = readNode() as Identifier;
+    var constructorName = _readOptionalNode() as SimpleIdentifier?;
+    var arguments = _readOptionalNode() as ArgumentList?;
     return astFactory.annotation(
       Tokens.AT,
       name,
@@ -289,7 +288,7 @@
 
   AssertInitializer _readAssertInitializer() {
     var condition = readNode() as Expression;
-    var message = _readOptionalNode() as Expression;
+    var message = _readOptionalNode() as Expression?;
     return astFactory.assertInitializer(
       Tokens.ASSERT,
       Tokens.OPEN_PAREN,
@@ -350,11 +349,11 @@
     var codeLength = _readInformativeUint30();
     var documentationTokenIndexList = _readUint30List();
 
-    var typeParameters = _readOptionalNode() as TypeParameterList;
-    var extendsClause = _readOptionalNode() as ExtendsClause;
-    var withClause = _readOptionalNode() as WithClause;
-    var implementsClause = _readOptionalNode() as ImplementsClause;
-    var nativeClause = _readOptionalNode() as NativeClause;
+    var typeParameters = _readOptionalNode() as TypeParameterList?;
+    var extendsClause = _readOptionalNode() as ExtendsClause?;
+    var withClause = _readOptionalNode() as WithClause?;
+    var implementsClause = _readOptionalNode() as ImplementsClause?;
+    var nativeClause = _readOptionalNode() as NativeClause?;
     var name = readNode() as SimpleIdentifier;
     var metadata = _readNodeList<Annotation>();
 
@@ -393,10 +392,10 @@
     var codeOffset = _readInformativeUint30();
     var codeLength = _readInformativeUint30();
 
-    var typeParameters = _readOptionalNode() as TypeParameterList;
+    var typeParameters = _readOptionalNode() as TypeParameterList?;
     var superClass = readNode() as TypeName;
     var withClause = readNode() as WithClause;
-    var implementsClause = _readOptionalNode() as ImplementsClause;
+    var implementsClause = _readOptionalNode() as ImplementsClause?;
     var name = readNode() as SimpleIdentifier;
     var metadata = _readNodeList<Annotation>();
     var documentationTokenIndexList = _readUint30List();
@@ -443,7 +442,7 @@
   Configuration _readConfiguration() {
     var flags = _readByte();
     var name = readNode() as DottedName;
-    var value = _readOptionalNode() as StringLiteral;
+    var value = _readOptionalNode() as StringLiteral?;
     var uri = readNode() as StringLiteral;
     return astFactory.configuration(
       Tokens.IF,
@@ -465,8 +464,8 @@
 
     var returnType = readNode() as SimpleIdentifier;
 
-    Token period;
-    SimpleIdentifier name;
+    Token? period;
+    SimpleIdentifier? name;
     if (AstBinaryFlags.hasName(flags)) {
       var periodOffset = _readInformativeUint30();
       period = Token(TokenType.PERIOD, periodOffset);
@@ -475,7 +474,7 @@
 
     var parameters = readNode() as FormalParameterList;
     var initializers = _readNodeList<ConstructorInitializer>();
-    var redirectedConstructor = _readOptionalNode() as ConstructorName;
+    var redirectedConstructor = _readOptionalNode() as ConstructorName?;
     var metadata = _readNodeList<Annotation>();
 
     var node = astFactory.constructorDeclaration(
@@ -527,7 +526,7 @@
 
   ConstructorName _readConstructorName() {
     var type = readNode() as TypeName;
-    var name = _readOptionalNode() as SimpleIdentifier;
+    var name = _readOptionalNode() as SimpleIdentifier?;
 
     return astFactory.constructorName(
       type,
@@ -538,7 +537,7 @@
 
   DeclaredIdentifier _readDeclaredIdentifier() {
     var flags = _readByte();
-    var type = _readOptionalNode() as TypeAnnotation;
+    var type = _readOptionalNode() as TypeAnnotation?;
     var identifier = readNode() as SimpleIdentifier;
     var metadata = _readNodeList<Annotation>();
     return astFactory.declaredIdentifier(
@@ -562,7 +561,7 @@
     var codeOffset = _readInformativeUint30();
     var codeLength = _readInformativeUint30();
     var parameter = readNode() as NormalFormalParameter;
-    var defaultValue = _readOptionalNode() as Expression;
+    var defaultValue = _readOptionalNode() as Expression?;
 
     ParameterKind kind;
     if (AstBinaryFlags.isPositional(flags)) {
@@ -656,7 +655,7 @@
   ExportDirective _readExportDirective() {
     var combinators = _readNodeList<Combinator>();
     var configurations = _readNodeList<Configuration>();
-    var uri = readNode();
+    var uri = readNode() as StringLiteral;
     var keywordOffset = _readInformativeUint30();
     var metadata = _readNodeList<Annotation>();
 
@@ -692,9 +691,9 @@
     var codeLength = _readInformativeUint30();
     var documentationTokenIndexList = _readUint30List();
 
-    var typeParameters = _readOptionalNode() as TypeParameterList;
+    var typeParameters = _readOptionalNode() as TypeParameterList?;
     var extendedType = readNode() as TypeAnnotation;
-    var name = _readOptionalNode() as SimpleIdentifier;
+    var name = _readOptionalNode() as SimpleIdentifier?;
     var metadata = _readNodeList<Annotation>();
 
     var node = astFactory.extensionDeclaration(
@@ -724,7 +723,7 @@
 
   ExtensionOverride _readExtensionOverride() {
     var extensionName = readNode() as Identifier;
-    var typeArguments = _readOptionalNode() as TypeArgumentList;
+    var typeArguments = _readOptionalNode() as TypeArgumentList?;
     var argumentList = readNode() as ArgumentList;
     return astFactory.extensionOverride(
       extensionName: extensionName,
@@ -768,9 +767,9 @@
   }
 
   FieldFormalParameter _readFieldFormalParameter() {
-    var typeParameters = _readOptionalNode() as TypeParameterList;
-    var type = _readOptionalNode() as TypeAnnotation;
-    var formalParameters = _readOptionalNode() as FormalParameterList;
+    var typeParameters = _readOptionalNode() as TypeParameterList?;
+    var type = _readOptionalNode() as TypeAnnotation?;
+    var formalParameters = _readOptionalNode() as FormalParameterList?;
     var flags = _readByte();
     var codeOffset = _readInformativeUint30();
     var codeLength = _readInformativeUint30();
@@ -855,7 +854,7 @@
 
   ForPartsWithDeclarations _readForPartsWithDeclarations() {
     var variables = readNode() as VariableDeclarationList;
-    var condition = _readOptionalNode() as Expression;
+    var condition = _readOptionalNode() as Expression?;
     var updaters = _readNodeList<Expression>();
     return astFactory.forPartsWithDeclarations(
       condition: condition,
@@ -867,8 +866,8 @@
   }
 
   ForPartsWithExpression _readForPartsWithExpression() {
-    var initialization = _readOptionalNode() as Expression;
-    var condition = _readOptionalNode() as Expression;
+    var initialization = _readOptionalNode() as Expression?;
+    var condition = _readOptionalNode() as Expression?;
     var updaters = _readNodeList<Expression>();
     return astFactory.forPartsWithExpression(
       condition: condition,
@@ -885,7 +884,7 @@
     var codeLength = _readInformativeUint30();
     var documentationTokenIndexList = _readUint30List();
     var functionExpression = readNode() as FunctionExpression;
-    var returnType = _readOptionalNode() as TypeAnnotation;
+    var returnType = _readOptionalNode() as TypeAnnotation?;
     var name = readNode() as SimpleIdentifier;
     var metadata = _readNodeList<Annotation>();
 
@@ -918,8 +917,8 @@
 
   FunctionExpression _readFunctionExpression() {
     var flags = _readByte();
-    var typeParameters = _readOptionalNode() as TypeParameterList;
-    var formalParameters = _readOptionalNode() as FormalParameterList;
+    var typeParameters = _readOptionalNode() as TypeParameterList?;
+    var formalParameters = _readOptionalNode() as FormalParameterList?;
     var body = _functionBodyForFlags(flags);
 
     return astFactory.functionExpression(
@@ -931,7 +930,7 @@
 
   FunctionExpressionInvocation _readFunctionExpressionInvocation() {
     var function = readNode() as Expression;
-    var typeArguments = _readOptionalNode() as TypeArgumentList;
+    var typeArguments = _readOptionalNode() as TypeArgumentList?;
     var arguments = readNode() as ArgumentList;
     return astFactory.functionExpressionInvocation(
       function,
@@ -945,8 +944,8 @@
     var codeLength = _readInformativeUint30();
     var documentationTokenIndexList = _readUint30List();
 
-    var typeParameters = _readOptionalNode() as TypeParameterList;
-    var returnType = _readOptionalNode() as TypeAnnotation;
+    var typeParameters = _readOptionalNode() as TypeParameterList?;
+    var returnType = _readOptionalNode() as TypeAnnotation?;
     var formalParameters = readNode() as FormalParameterList;
     var name = readNode() as SimpleIdentifier;
     var metadata = _readNodeList<Annotation>();
@@ -975,8 +974,8 @@
   }
 
   FunctionTypedFormalParameter _readFunctionTypedFormalParameter() {
-    var typeParameters = _readOptionalNode() as TypeParameterList;
-    var returnType = _readOptionalNode() as TypeAnnotation;
+    var typeParameters = _readOptionalNode() as TypeParameterList?;
+    var returnType = _readOptionalNode() as TypeAnnotation?;
     var formalParameters = readNode() as FormalParameterList;
     var flags = _readByte();
     var codeOffset = _readInformativeUint30();
@@ -1004,8 +1003,8 @@
 
   GenericFunctionType _readGenericFunctionType() {
     var flags = _readByte();
-    var typeParameters = _readOptionalNode() as TypeParameterList;
-    var returnType = _readOptionalNode() as TypeAnnotation;
+    var typeParameters = _readOptionalNode() as TypeParameterList?;
+    var returnType = _readOptionalNode() as TypeAnnotation?;
     var formalParameters = readNode() as FormalParameterList;
 
     return astFactory.genericFunctionType(
@@ -1022,8 +1021,8 @@
     var codeLength = _readInformativeUint30();
     var documentationTokenIndexList = _readUint30List();
 
-    var typeParameters = _readOptionalNode() as TypeParameterList;
-    var type = _readOptionalNode();
+    var typeParameters = _readOptionalNode() as TypeParameterList?;
+    var type = readNode() as TypeAnnotation;
     var name = readNode() as SimpleIdentifier;
     var metadata = _readNodeList<Annotation>();
 
@@ -1061,7 +1060,7 @@
   IfElement _readIfElement() {
     var condition = readNode() as Expression;
     var thenElement = readNode() as CollectionElement;
-    var elseElement = _readOptionalNode() as CollectionElement;
+    var elseElement = _readOptionalNode() as CollectionElement?;
     return astFactory.ifElement(
       condition: condition,
       elseElement: elseElement,
@@ -1081,7 +1080,7 @@
   ImportDirective _readImportDirective() {
     var flags = _readByte();
 
-    SimpleIdentifier prefixIdentifier;
+    SimpleIdentifier? prefixIdentifier;
     if (AstBinaryFlags.hasPrefix(flags)) {
       var prefixName = _readStringReference();
       var prefixOffset = _readInformativeUint30();
@@ -1092,7 +1091,7 @@
 
     var combinators = _readNodeList<Combinator>();
     var configurations = _readNodeList<Configuration>();
-    var uri = readNode();
+    var uri = readNode() as StringLiteral;
     var keywordOffset = _readInformativeUint30();
     var metadata = _readNodeList<Annotation>();
 
@@ -1123,15 +1122,26 @@
 
   IndexExpression _readIndexExpression() {
     var flags = _readByte();
-    var target = _readOptionalNode() as Expression;
+    var target = _readOptionalNode() as Expression?;
     var index = readNode() as Expression;
-    return astFactory.indexExpressionForTarget2(
-      target: target,
-      question: AstBinaryFlags.hasQuestion(flags) ? Tokens.QUESTION : null,
-      leftBracket: Tokens.OPEN_SQUARE_BRACKET,
-      index: index,
-      rightBracket: Tokens.CLOSE_SQUARE_BRACKET,
-    )..period = AstBinaryFlags.hasPeriod(flags) ? Tokens.PERIOD_PERIOD : null;
+    // TODO(scheglov) Is this clumsy?
+    if (target != null) {
+      return astFactory.indexExpressionForTarget2(
+        target: target,
+        question: AstBinaryFlags.hasQuestion(flags) ? Tokens.QUESTION : null,
+        leftBracket: Tokens.OPEN_SQUARE_BRACKET,
+        index: index,
+        rightBracket: Tokens.CLOSE_SQUARE_BRACKET,
+      )..period = AstBinaryFlags.hasPeriod(flags) ? Tokens.PERIOD_PERIOD : null;
+    } else {
+      return astFactory.indexExpressionForCascade2(
+        period: Tokens.PERIOD_PERIOD,
+        question: AstBinaryFlags.hasQuestion(flags) ? Tokens.QUESTION : null,
+        leftBracket: Tokens.OPEN_SQUARE_BRACKET,
+        index: index,
+        rightBracket: Tokens.CLOSE_SQUARE_BRACKET,
+      );
+    }
   }
 
   int _readInformativeUint30() {
@@ -1141,7 +1151,7 @@
     return 0;
   }
 
-  Uint32List _readInformativeUint30List() {
+  Uint32List? _readInformativeUint30List() {
     if (_withInformative) {
       return _readUint30List();
     }
@@ -1228,7 +1238,7 @@
 
   LibraryDirective _readLibraryDirective() {
     var documentationTokenIndexList = _readUint30List();
-    var name = readNode();
+    var name = readNode() as LibraryIdentifier;
     var keywordOffset = _readInformativeUint30();
     var metadata = _readNodeList<Annotation>();
 
@@ -1238,7 +1248,7 @@
       KeywordToken(Keyword.LIBRARY, keywordOffset),
       name,
       Tokens.SEMICOLON,
-    );
+    ) as LibraryDirectiveImpl;
     SummaryDataForLibraryDirective(
       _unitReader,
       node,
@@ -1256,7 +1266,7 @@
 
   ListLiteral _readListLiteral() {
     var flags = _readByte();
-    var typeArguments = _readOptionalNode();
+    var typeArguments = _readOptionalNode() as TypeArgumentList?;
     var elements = _readNodeList<CollectionElement>();
 
     return astFactory.listLiteral(
@@ -1282,9 +1292,9 @@
     var documentationTokenIndexList = _readUint30List();
 
     var name = readNode() as SimpleIdentifier;
-    var typeParameters = _readOptionalNode() as TypeParameterList;
-    var returnType = _readOptionalNode() as TypeAnnotation;
-    var formalParameters = _readOptionalNode() as FormalParameterList;
+    var typeParameters = _readOptionalNode() as TypeParameterList?;
+    var returnType = _readOptionalNode() as TypeAnnotation?;
+    var formalParameters = _readOptionalNode() as FormalParameterList?;
     var metadata = _readNodeList<Annotation>();
     var body = _functionBodyForFlags(flags);
 
@@ -1321,9 +1331,9 @@
 
   MethodInvocation _readMethodInvocation() {
     var flags = _readByte();
-    var target = _readOptionalNode() as Expression;
+    var target = _readOptionalNode() as Expression?;
     var methodName = readNode() as SimpleIdentifier;
-    var typeArguments = _readOptionalNode() as TypeArgumentList;
+    var typeArguments = _readOptionalNode() as TypeArgumentList?;
     var arguments = readNode() as ArgumentList;
 
     return astFactory.methodInvocation(
@@ -1345,9 +1355,9 @@
     var codeLength = _readInformativeUint30();
     var documentationTokenIndexList = _readUint30List();
 
-    var typeParameters = _readOptionalNode() as TypeParameterList;
-    var onClause = _readOptionalNode() as OnClause;
-    var implementsClause = _readOptionalNode() as ImplementsClause;
+    var typeParameters = _readOptionalNode() as TypeParameterList?;
+    var onClause = _readOptionalNode() as OnClause?;
+    var implementsClause = _readOptionalNode() as ImplementsClause?;
     var name = readNode() as SimpleIdentifier;
     var metadata = _readNodeList<Annotation>();
 
@@ -1391,18 +1401,13 @@
   }
 
   NativeClause _readNativeClause() {
-    var name = readNode();
+    var name = _readOptionalNode() as StringLiteral?;
     return astFactory.nativeClause(Tokens.NATIVE, name);
   }
 
   List<T> _readNodeList<T>() {
     var length = _readUInt30();
-    // TODO(scheglov) This will not work for null safety, rewrite.
-    var result = List<T>.filled(length, null);
-    for (var i = 0; i < length; ++i) {
-      result[i] = readNode() as T;
-    }
-    return result;
+    return List.generate(length, (_) => readNode() as T);
   }
 
   NullLiteral _readNullLiteral() {
@@ -1416,7 +1421,7 @@
     return astFactory.onClause(Tokens.ON, superclassConstraints);
   }
 
-  AstNode _readOptionalNode() {
+  AstNode? _readOptionalNode() {
     if (_readOptionTag()) {
       return readNode();
     } else {
@@ -1445,7 +1450,7 @@
   }
 
   PartDirective _readPartDirective() {
-    var uri = readNode();
+    var uri = readNode() as StringLiteral;
     var keywordOffset = _readInformativeUint30();
     var metadata = _readNodeList<Annotation>();
 
@@ -1459,8 +1464,8 @@
   }
 
   PartOfDirective _readPartOfDirective() {
-    var libraryName = _readOptionalNode() as LibraryIdentifier;
-    var uri = _readOptionalNode() as StringLiteral;
+    var libraryName = _readOptionalNode() as LibraryIdentifier?;
+    var uri = _readOptionalNode() as StringLiteral?;
     var keywordOffset = _readInformativeUint30();
     var metadata = _readNodeList<Annotation>();
 
@@ -1505,28 +1510,29 @@
 
   PropertyAccess _readPropertyAccess() {
     var flags = _readByte();
-    var target = _readOptionalNode() as Expression;
+    var target = _readOptionalNode() as Expression?;
     var propertyName = readNode() as SimpleIdentifier;
-    return astFactory.propertyAccess(
-      target,
-      Tokens.choose(
-        AstBinaryFlags.hasPeriod(flags),
-        Tokens.PERIOD,
-        AstBinaryFlags.hasPeriod2(flags),
-        Tokens.PERIOD_PERIOD,
-      ),
-      propertyName,
-    );
+
+    Token operator;
+    if (AstBinaryFlags.hasQuestion(flags)) {
+      operator = AstBinaryFlags.hasPeriod(flags)
+          ? Tokens.QUESTION_PERIOD
+          : Tokens.QUESTION_PERIOD_PERIOD;
+    } else {
+      operator = AstBinaryFlags.hasPeriod(flags)
+          ? Tokens.PERIOD
+          : Tokens.PERIOD_PERIOD;
+    }
+
+    return astFactory.propertyAccess(target, operator, propertyName);
   }
 
   RedirectingConstructorInvocation _readRedirectingConstructorInvocation() {
-    var flags = _readByte();
-    var constructorName = _readOptionalNode() as SimpleIdentifier;
+    var constructorName = _readOptionalNode() as SimpleIdentifier?;
     var argumentList = readNode() as ArgumentList;
-    var hasThis = AstBinaryFlags.hasThis(flags);
     return astFactory.redirectingConstructorInvocation(
-      hasThis ? Tokens.THIS : null,
-      hasThis ? Tokens.PERIOD : null,
+      Tokens.THIS,
+      constructorName != null ? Tokens.PERIOD : null,
       constructorName,
       argumentList,
     );
@@ -1534,7 +1540,7 @@
 
   SetOrMapLiteral _readSetOrMapLiteral() {
     var flags = _readByte();
-    var typeArguments = _readOptionalNode() as TypeArgumentList;
+    var typeArguments = _readOptionalNode() as TypeArgumentList?;
     var elements = _readNodeList<CollectionElement>();
     var node = astFactory.setOrMapLiteral(
       constKeyword: AstBinaryFlags.isConst(flags) ? Tokens.CONST : null,
@@ -1555,7 +1561,7 @@
   }
 
   SimpleFormalParameter _readSimpleFormalParameter() {
-    var type = _readOptionalNode() as TypeAnnotation;
+    var type = _readOptionalNode() as TypeAnnotation?;
     var flags = _readByte();
     var codeOffset = _readInformativeUint30();
     var codeLength = _readInformativeUint30();
@@ -1627,7 +1633,7 @@
   }
 
   SuperConstructorInvocation _readSuperConstructorInvocation() {
-    var constructorName = _readOptionalNode() as SimpleIdentifier;
+    var constructorName = _readOptionalNode() as SimpleIdentifier?;
     var argumentList = readNode() as ArgumentList;
     return astFactory.superConstructorInvocation(
       Tokens.SUPER,
@@ -1698,7 +1704,7 @@
   TypeName _readTypeName() {
     var flags = _readByte();
     var name = readNode() as Identifier;
-    var typeArguments = _readOptionalNode() as TypeArgumentList;
+    var typeArguments = _readOptionalNode() as TypeArgumentList?;
 
     return astFactory.typeName(
       name,
@@ -1710,8 +1716,8 @@
   TypeParameter _readTypeParameter() {
     var codeOffset = _readInformativeUint30();
     var codeLength = _readInformativeUint30();
-    var name = readNode() as Identifier;
-    var bound = _readOptionalNode() as TypeAnnotation;
+    var name = readNode() as SimpleIdentifier;
+    var bound = _readOptionalNode() as TypeAnnotation?;
     var metadata = _readNodeList<Annotation>();
 
     var node = astFactory.typeParameter(
@@ -1774,7 +1780,7 @@
   VariableDeclaration _readVariableDeclaration() {
     var flags = _readByte();
     var name = readNode() as SimpleIdentifier;
-    var initializer = _readOptionalNode() as Expression;
+    var initializer = _readOptionalNode() as Expression?;
 
     var node = astFactory.variableDeclaration(
       name,
@@ -1789,7 +1795,7 @@
 
   VariableDeclarationList _readVariableDeclarationList() {
     var flags = _readByte();
-    var type = _readOptionalNode() as TypeAnnotation;
+    var type = _readOptionalNode() as TypeAnnotation?;
     var variables = _readNodeList<VariableDeclaration>();
     var metadata = _readNodeList<Annotation>();
 
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_tokens.dart b/pkg/analyzer/lib/src/summary2/ast_binary_tokens.dart
index a9a8a69..8ac8435 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_tokens.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_tokens.dart
@@ -78,6 +78,10 @@
   static final PERIOD_PERIOD_PERIOD_QUESTION =
       TokenFactory.tokenFromType(TokenType.PERIOD_PERIOD_PERIOD_QUESTION);
   static final QUESTION = TokenFactory.tokenFromType(TokenType.QUESTION);
+  static final QUESTION_PERIOD =
+      TokenFactory.tokenFromType(TokenType.QUESTION_PERIOD);
+  static final QUESTION_PERIOD_PERIOD =
+      TokenFactory.tokenFromType(TokenType.QUESTION_PERIOD_PERIOD);
   static final REQUIRED = TokenFactory.tokenFromKeyword(Keyword.REQUIRED);
   static final RETHROW = TokenFactory.tokenFromKeyword(Keyword.RETHROW);
   static final RETURN = TokenFactory.tokenFromKeyword(Keyword.RETURN);
@@ -100,11 +104,11 @@
   static final WHILE = TokenFactory.tokenFromKeyword(Keyword.WHILE);
   static final YIELD = TokenFactory.tokenFromKeyword(Keyword.YIELD);
 
-  static Token choose(bool if1, Token then1, bool if2, Token then2,
-      [bool if3, Token then3]) {
+  static Token? choose(bool if1, Token then1, bool if2, Token then2,
+      [bool? if3, Token? then3]) {
     if (if1) return then1;
     if (if2) return then2;
-    if (if2 == true) return then3;
+    if (if3 == true) return then3!;
     return null;
   }
 
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
index 16e1177..ff0a516 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
@@ -19,7 +19,6 @@
 import 'package:analyzer/src/summary2/data_writer.dart';
 import 'package:analyzer/src/summary2/tokens_writer.dart';
 import 'package:analyzer/src/task/inference_error.dart';
-import 'package:meta/meta.dart';
 
 /// Serializer of fully resolved ASTs.
 class AstBinaryWriter extends ThrowingAstVisitor<void> {
@@ -27,7 +26,7 @@
   final BufferedSink _sink;
   final StringIndexer _stringIndexer;
   final int Function() _getNextResolutionIndex;
-  final ResolutionSink _resolutionSink;
+  final ResolutionSink? _resolutionSink;
   final bool _shouldWriteResolution;
 
   /// TODO(scheglov) Keep it private, and write here, similarly as we do
@@ -39,12 +38,12 @@
   int _nextUnnamedExtensionId = 0;
 
   AstBinaryWriter({
-    @required bool withInformative,
-    @required BufferedSink sink,
-    @required StringIndexer stringIndexer,
-    @required int Function() getNextResolutionIndex,
-    @required ResolutionSink resolutionSink,
-  })  : _withInformative = withInformative,
+    required bool withInformative,
+    required BufferedSink sink,
+    required StringIndexer stringIndexer,
+    required int Function() getNextResolutionIndex,
+    required ResolutionSink? resolutionSink,
+  })   : _withInformative = withInformative,
         _sink = sink,
         _stringIndexer = stringIndexer,
         _getNextResolutionIndex = getNextResolutionIndex,
@@ -62,7 +61,7 @@
     _writeByte(Tag.Annotation);
 
     _writeMarker(MarkerTag.Annotation_name);
-    _writeOptionalNode(node.name);
+    _writeNode(node.name);
     _writeMarker(MarkerTag.Annotation_constructorName);
     _writeOptionalNode(node.constructorName);
 
@@ -77,7 +76,7 @@
 
     if (_shouldWriteResolution) {
       _writeMarker(MarkerTag.Annotation_element);
-      _resolutionSink.writeElement(node.element);
+      _resolutionSink!.writeElement(node.element);
     }
   }
 
@@ -130,15 +129,15 @@
 
     if (_shouldWriteResolution) {
       _writeMarker(MarkerTag.AssignmentExpression_staticElement);
-      _resolutionSink.writeElement(node.staticElement);
+      _resolutionSink!.writeElement(node.staticElement);
       _writeMarker(MarkerTag.AssignmentExpression_readElement);
-      _resolutionSink.writeElement(node.readElement);
+      _resolutionSink!.writeElement(node.readElement);
       _writeMarker(MarkerTag.AssignmentExpression_readType);
-      _resolutionSink.writeType(node.readType);
+      _resolutionSink!.writeType(node.readType);
       _writeMarker(MarkerTag.AssignmentExpression_writeElement);
-      _resolutionSink.writeElement(node.writeElement);
+      _resolutionSink!.writeElement(node.writeElement);
       _writeMarker(MarkerTag.AssignmentExpression_writeType);
-      _resolutionSink.writeType(node.writeType);
+      _resolutionSink!.writeType(node.writeType);
     }
     _writeMarker(MarkerTag.AssignmentExpression_expression);
     _storeExpression(node);
@@ -173,7 +172,7 @@
 
     if (_shouldWriteResolution) {
       _writeMarker(MarkerTag.BinaryExpression_staticElement);
-      _resolutionSink.writeElement(node.staticElement);
+      _resolutionSink!.writeElement(node.staticElement);
     }
     _writeMarker(MarkerTag.BinaryExpression_expression);
     _storeExpression(node);
@@ -220,7 +219,7 @@
       ),
     );
     if (_shouldWriteResolution) {
-      _resolutionSink.writeByte(node.declaredElement.isSimplyBounded ? 1 : 0);
+      _resolutionSink!.writeByte(node.declaredElement!.isSimplyBounded ? 1 : 0);
     }
 
     _writeInformativeUint30(node.offset);
@@ -249,7 +248,7 @@
     _hasConstConstructor = false;
 
     if (_shouldWriteResolution) {
-      _resolutionSink.localElements.popScope();
+      _resolutionSink!.localElements.popScope();
     }
 
     // TODO(scheglov) write member index
@@ -285,7 +284,7 @@
       ),
     );
     if (_shouldWriteResolution) {
-      _resolutionSink.writeByte(node.declaredElement.isSimplyBounded ? 1 : 0);
+      _resolutionSink!.writeByte(node.declaredElement!.isSimplyBounded ? 1 : 0);
     }
     _writeInformativeUint30(node.offset);
     _writeInformativeUint30(node.length);
@@ -304,16 +303,16 @@
     _writeDocumentationCommentString(node.documentationComment);
     _writeUInt30(resolutionIndex);
     if (_shouldWriteResolution) {
-      _resolutionSink.localElements.popScope();
+      _resolutionSink!.localElements.popScope();
     }
   }
 
   @override
   void visitCompilationUnit(CompilationUnit node) {
     var nodeImpl = node as CompilationUnitImpl;
-    _writeLanguageVersion(nodeImpl.languageVersion);
+    _writeLanguageVersion(nodeImpl.languageVersion!);
     _writeFeatureSet(node.featureSet);
-    _writeLineInfo(node.lineInfo);
+    _writeLineInfo(node.lineInfo!);
     _writeUInt30(_withInformative ? node.length : 0);
     _writeNodeList(node.directives);
     for (var declaration in node.declarations) {
@@ -384,16 +383,16 @@
     _writeMarker(MarkerTag.ConstructorDeclaration_returnType);
     _writeNode(node.returnType);
     if (node.period != null) {
-      _writeInformativeUint30(node.period.offset);
-      _writeDeclarationName(node.name);
+      _writeInformativeUint30(node.period!.offset);
+      _writeDeclarationName(node.name!);
     }
     _writeMarker(MarkerTag.ConstructorDeclaration_parameters);
     _writeNode(node.parameters);
 
     if (_shouldWriteResolution) {
-      _resolutionSink.localElements.pushScope();
+      _resolutionSink!.localElements.pushScope();
       for (var parameter in node.parameters.parameters) {
-        _resolutionSink.localElements.declare(parameter.declaredElement);
+        _resolutionSink!.localElements.declare(parameter.declaredElement!);
       }
     }
 
@@ -407,7 +406,7 @@
     }
 
     if (_shouldWriteResolution) {
-      _resolutionSink.localElements.popScope();
+      _resolutionSink!.localElements.popScope();
     }
 
     _writeMarker(MarkerTag.ConstructorDeclaration_redirectedConstructor);
@@ -444,7 +443,7 @@
       // We parse it as a `TypeName(PrefixedIdentifier)`.
       // But when we resolve, we rewrite it.
       // We need to inform the applier about the right shape of the AST.
-      _resolutionSink.writeByte(node.name != null ? 1 : 0);
+      _resolutionSink!.writeByte(node.name != null ? 1 : 0);
     }
 
     _writeMarker(MarkerTag.ConstructorName_type);
@@ -454,7 +453,7 @@
 
     if (_shouldWriteResolution) {
       _writeMarker(MarkerTag.ConstructorName_staticElement);
-      _resolutionSink.writeElement(node.staticElement);
+      _resolutionSink!.writeElement(node.staticElement);
     }
 
     _writeMarker(MarkerTag.ConstructorName_end);
@@ -569,7 +568,7 @@
 
     if (_shouldWriteResolution) {
       _writeMarker(MarkerTag.ExportDirective_exportedLibrary);
-      _resolutionSink.writeElement(
+      _resolutionSink!.writeElement(
         (node.element as ExportElementImpl).exportedLibrary,
       );
     }
@@ -611,7 +610,7 @@
     _writeNodeList(node.members);
 
     if (_shouldWriteResolution) {
-      _resolutionSink.localElements.popScope();
+      _resolutionSink!.localElements.popScope();
     }
 
     // TODO(scheglov) write member index
@@ -637,7 +636,7 @@
     _writeByte(Tag.ExtensionOverride);
 
     if (_shouldWriteResolution) {
-      _resolutionSink.writeByte(MethodInvocationRewriteTag.extensionOverride);
+      _resolutionSink!.writeByte(MethodInvocationRewriteTag.extensionOverride);
     }
 
     _writeMarker(MarkerTag.ExtensionOverride_extensionName);
@@ -647,7 +646,7 @@
     _writeMarker(MarkerTag.ExtensionOverride_argumentList);
     _writeNode(node.argumentList);
     _writeMarker(MarkerTag.ExtensionOverride_extendedType);
-    _resolutionSink.writeType(node.extendedType);
+    _resolutionSink!.writeType(node.extendedType);
     _writeMarker(MarkerTag.ExtensionOverride_end);
     // TODO(scheglov) typeArgumentTypes?
   }
@@ -713,7 +712,7 @@
     _writeMarker(MarkerTag.FieldFormalParameter_end);
 
     if (_shouldWriteResolution) {
-      _resolutionSink.localElements.popScope();
+      _resolutionSink!.localElements.popScope();
     }
   }
 
@@ -818,8 +817,8 @@
 
     if (_shouldWriteResolution) {
       _writeMarker(MarkerTag.FunctionDeclaration_returnTypeType);
-      _writeActualReturnType(node.declaredElement.returnType);
-      _resolutionSink.localElements.popScope();
+      _writeActualReturnType(node.declaredElement!.returnType);
+      _resolutionSink!.localElements.popScope();
     }
 
     _writeMarker(MarkerTag.FunctionDeclaration_end);
@@ -851,7 +850,7 @@
     _writeByte(Tag.FunctionExpressionInvocation);
 
     if (_shouldWriteResolution) {
-      _resolutionSink
+      _resolutionSink!
           .writeByte(MethodInvocationRewriteTag.functionExpressionInvocation);
     }
 
@@ -899,10 +898,10 @@
       _writeActualReturnType(element.function.returnType);
       // TODO(scheglov) pack into one byte
       _writeMarker(MarkerTag.FunctionTypeAlias_flags);
-      _resolutionSink.writeByte(element.isSimplyBounded ? 1 : 0);
-      _resolutionSink.writeByte(element.hasSelfReference ? 1 : 0);
+      _resolutionSink!.writeByte(element.isSimplyBounded ? 1 : 0);
+      _resolutionSink!.writeByte(element.hasSelfReference ? 1 : 0);
 
-      _resolutionSink.localElements.popScope();
+      _resolutionSink!.localElements.popScope();
     }
 
     _writeMarker(MarkerTag.FunctionTypeAlias_end);
@@ -926,7 +925,7 @@
     _writeMarker(MarkerTag.FunctionTypedFormalParameter_end);
 
     if (_shouldWriteResolution) {
-      _resolutionSink.localElements.popScope();
+      _resolutionSink!.localElements.popScope();
     }
   }
 
@@ -951,8 +950,8 @@
 
     if (_shouldWriteResolution) {
       _writeMarker(MarkerTag.GenericFunctionType_type);
-      _resolutionSink.writeType(node.type);
-      _resolutionSink.localElements.popScope();
+      _resolutionSink!.writeType(node.type);
+      _resolutionSink!.localElements.popScope();
     }
 
     _writeMarker(MarkerTag.GenericFunctionType_end);
@@ -981,7 +980,7 @@
     _writeMarker(MarkerTag.GenericTypeAlias_typeParameters);
     _writeOptionalNode(node.typeParameters);
     _writeMarker(MarkerTag.GenericTypeAlias_type);
-    _writeOptionalNode(node.type);
+    _writeNode(node.type);
     _writeMarker(MarkerTag.GenericTypeAlias_typeAlias);
     _storeTypeAlias(node);
 
@@ -989,9 +988,9 @@
       var element = node.declaredElement as TypeAliasElementImpl;
       // TODO(scheglov) pack into one byte
       _writeMarker(MarkerTag.GenericTypeAlias_flags);
-      _resolutionSink.writeByte(element.isSimplyBounded ? 1 : 0);
-      _resolutionSink.writeByte(element.hasSelfReference ? 1 : 0);
-      _resolutionSink.localElements.popScope();
+      _resolutionSink!.writeByte(element.isSimplyBounded ? 1 : 0);
+      _resolutionSink!.writeByte(element.hasSelfReference ? 1 : 0);
+      _resolutionSink!.localElements.popScope();
     }
 
     _writeMarker(MarkerTag.GenericTypeAlias_end);
@@ -1052,7 +1051,7 @@
     if (_shouldWriteResolution) {
       var element = node.element as ImportElementImpl;
       _writeMarker(MarkerTag.ImportDirective_importedLibrary);
-      _resolutionSink.writeElement(element.importedLibrary);
+      _resolutionSink!.writeElement(element.importedLibrary);
     }
 
     _writeMarker(MarkerTag.ImportDirective_end);
@@ -1073,7 +1072,7 @@
     _writeNode(node.index);
     if (_shouldWriteResolution) {
       _writeMarker(MarkerTag.IndexExpression_staticElement);
-      _resolutionSink.writeElement(node.staticElement);
+      _resolutionSink!.writeElement(node.staticElement);
     }
     _writeMarker(MarkerTag.IndexExpression_expression);
     _storeExpression(node);
@@ -1086,11 +1085,11 @@
 
     if (_shouldWriteResolution) {
       if (node.constructorName.name != null) {
-        _resolutionSink.writeByte(
+        _resolutionSink!.writeByte(
           MethodInvocationRewriteTag.instanceCreationExpression_withName,
         );
       } else {
-        _resolutionSink.writeByte(
+        _resolutionSink!.writeByte(
           MethodInvocationRewriteTag.instanceCreationExpression_withoutName,
         );
       }
@@ -1244,9 +1243,9 @@
     _writeUInt30(
       AstBinaryFlags.encode(
         isAbstract: node.body is EmptyFunctionBody,
-        isAsync: node.body?.isAsynchronous ?? false,
+        isAsync: node.body.isAsynchronous,
         isExternal: node.externalKeyword != null,
-        isGenerator: node.body?.isGenerator ?? false,
+        isGenerator: node.body.isGenerator,
         isGet: node.isGetter,
         isNative: node.body is NativeFunctionBody,
         isOperator: node.operatorKeyword != null,
@@ -1285,11 +1284,11 @@
       // TODO(scheglov) move this flag into ClassElementImpl?
       if (element is MethodElementImpl) {
         _writeMarker(MarkerTag.MethodDeclaration_flags);
-        _resolutionSink.writeByte(
+        _resolutionSink!.writeByte(
           element.isOperatorEqualWithParameterTypeFromObject ? 1 : 0,
         );
       }
-      _resolutionSink.localElements.popScope();
+      _resolutionSink!.localElements.popScope();
     }
 
     _writeMarker(MarkerTag.MethodDeclaration_end);
@@ -1300,7 +1299,7 @@
     _writeByte(Tag.MethodInvocation);
 
     if (_shouldWriteResolution) {
-      _resolutionSink.writeByte(MethodInvocationRewriteTag.none);
+      _resolutionSink!.writeByte(MethodInvocationRewriteTag.none);
     }
 
     _writeByte(
@@ -1327,8 +1326,8 @@
 
     if (_shouldWriteResolution) {
       var element = node.declaredElement as MixinElementImpl;
-      _resolutionSink.writeByte(element.isSimplyBounded ? 1 : 0);
-      _resolutionSink.writeStringList(element.superInvokedNames);
+      _resolutionSink!.writeByte(element.isSimplyBounded ? 1 : 0);
+      _resolutionSink!.writeStringList(element.superInvokedNames);
     }
 
     _writeInformativeUint30(node.offset);
@@ -1353,7 +1352,7 @@
     _hasConstConstructor = false;
 
     if (_shouldWriteResolution) {
-      _resolutionSink.localElements.popScope();
+      _resolutionSink!.localElements.popScope();
     }
 
     // TODO(scheglov) write member index
@@ -1387,7 +1386,7 @@
   void visitNativeClause(NativeClause node) {
     _writeByte(Tag.NativeClause);
     _writeMarker(MarkerTag.NativeClause_name);
-    _writeNode(node.name);
+    _writeOptionalNode(node.name);
     _writeMarker(MarkerTag.NativeClause_end);
   }
 
@@ -1445,16 +1444,16 @@
 
     if (_shouldWriteResolution) {
       _writeMarker(MarkerTag.PostfixExpression_staticElement);
-      _resolutionSink.writeElement(node.staticElement);
+      _resolutionSink!.writeElement(node.staticElement);
       if (operatorToken.isIncrementOperator) {
         _writeMarker(MarkerTag.PostfixExpression_readElement);
-        _resolutionSink.writeElement(node.readElement);
+        _resolutionSink!.writeElement(node.readElement);
         _writeMarker(MarkerTag.PostfixExpression_readType);
-        _resolutionSink.writeType(node.readType);
+        _resolutionSink!.writeType(node.readType);
         _writeMarker(MarkerTag.PostfixExpression_writeElement);
-        _resolutionSink.writeElement(node.writeElement);
+        _resolutionSink!.writeElement(node.writeElement);
         _writeMarker(MarkerTag.PostfixExpression_writeType);
-        _resolutionSink.writeType(node.writeType);
+        _resolutionSink!.writeType(node.writeType);
       }
     }
     _writeMarker(MarkerTag.PostfixExpression_expression);
@@ -1489,16 +1488,16 @@
 
     if (_shouldWriteResolution) {
       _writeMarker(MarkerTag.PrefixExpression_staticElement);
-      _resolutionSink.writeElement(node.staticElement);
+      _resolutionSink!.writeElement(node.staticElement);
       if (operatorToken.isIncrementOperator) {
         _writeMarker(MarkerTag.PrefixExpression_readElement);
-        _resolutionSink.writeElement(node.readElement);
+        _resolutionSink!.writeElement(node.readElement);
         _writeMarker(MarkerTag.PrefixExpression_readType);
-        _resolutionSink.writeType(node.readType);
+        _resolutionSink!.writeType(node.readType);
         _writeMarker(MarkerTag.PrefixExpression_writeElement);
-        _resolutionSink.writeElement(node.writeElement);
+        _resolutionSink!.writeElement(node.writeElement);
         _writeMarker(MarkerTag.PrefixExpression_writeType);
-        _resolutionSink.writeType(node.writeType);
+        _resolutionSink!.writeType(node.writeType);
       }
     }
 
@@ -1510,12 +1509,19 @@
   @override
   void visitPropertyAccess(PropertyAccess node) {
     _writeByte(Tag.PropertyAccess);
+
+    var operatorType = node.operator.type;
     _writeByte(
       AstBinaryFlags.encode(
-        hasPeriod: node.operator?.type == TokenType.PERIOD,
-        hasPeriod2: node.operator?.type == TokenType.PERIOD_PERIOD,
+        hasPeriod: operatorType == TokenType.PERIOD ||
+            operatorType == TokenType.QUESTION_PERIOD,
+        hasPeriod2: operatorType == TokenType.PERIOD_PERIOD ||
+            operatorType == TokenType.QUESTION_PERIOD_PERIOD,
+        hasQuestion: operatorType == TokenType.QUESTION_PERIOD ||
+            operatorType == TokenType.QUESTION_PERIOD_PERIOD,
       ),
     );
+
     _writeMarker(MarkerTag.PropertyAccess_target);
     _writeOptionalNode(node.target);
     _writeMarker(MarkerTag.PropertyAccess_propertyName);
@@ -1531,19 +1537,13 @@
       RedirectingConstructorInvocation node) {
     _writeByte(Tag.RedirectingConstructorInvocation);
 
-    _writeByte(
-      AstBinaryFlags.encode(
-        hasThis: node.thisKeyword != null,
-      ),
-    );
-
     _writeMarker(MarkerTag.RedirectingConstructorInvocation_constructorName);
     _writeOptionalNode(node.constructorName);
     _writeMarker(MarkerTag.RedirectingConstructorInvocation_argumentList);
     _writeNode(node.argumentList);
     if (_shouldWriteResolution) {
       _writeMarker(MarkerTag.RedirectingConstructorInvocation_staticElement);
-      _resolutionSink.writeElement(node.staticElement);
+      _resolutionSink!.writeElement(node.staticElement);
     }
     _writeMarker(MarkerTag.RedirectingConstructorInvocation_end);
   }
@@ -1562,7 +1562,7 @@
       var isMapBit = node.isMap ? (1 << 0) : 0;
       var isSetBit = node.isSet ? (1 << 1) : 0;
       _writeMarker(MarkerTag.SetOrMapLiteral_flags);
-      _resolutionSink.writeByte(isMapBit | isSetBit);
+      _resolutionSink!.writeByte(isMapBit | isSetBit);
     }
 
     _writeMarker(MarkerTag.SetOrMapLiteral_typeArguments);
@@ -1594,7 +1594,7 @@
     if (_shouldWriteResolution) {
       var element = node.declaredElement as ParameterElementImpl;
       _writeMarker(MarkerTag.SimpleFormalParameter_flags);
-      _resolutionSink.writeByte(element.inheritsCovariant ? 1 : 0);
+      _resolutionSink!.writeByte(element.inheritsCovariant ? 1 : 0);
     }
     _writeMarker(MarkerTag.SimpleFormalParameter_end);
   }
@@ -1606,7 +1606,7 @@
     _writeInformativeUint30(node.offset);
     if (_shouldWriteResolution) {
       _writeMarker(MarkerTag.SimpleIdentifier_staticElement);
-      _resolutionSink.writeElement(node.staticElement);
+      _resolutionSink!.writeElement(node.staticElement);
       // TODO(scheglov) It is inefficient to write many null types.
     }
     _writeMarker(MarkerTag.SimpleIdentifier_expression);
@@ -1653,7 +1653,7 @@
     _writeNode(node.argumentList);
     if (_shouldWriteResolution) {
       _writeMarker(MarkerTag.SuperConstructorInvocation_staticElement);
-      _resolutionSink.writeElement(node.staticElement);
+      _resolutionSink!.writeElement(node.staticElement);
     }
     _writeMarker(MarkerTag.SuperConstructorInvocation_end);
   }
@@ -1761,7 +1761,7 @@
 
     if (_shouldWriteResolution) {
       _writeMarker(MarkerTag.TypeName_type);
-      _resolutionSink.writeType(node.type);
+      _resolutionSink!.writeType(node.type);
     }
     _writeMarker(MarkerTag.TypeName_end);
   }
@@ -1780,11 +1780,11 @@
     if (_shouldWriteResolution) {
       var element = node.declaredElement as TypeParameterElementImpl;
       _writeMarker(MarkerTag.TypeParameter_variance);
-      _resolutionSink.writeByte(
+      _resolutionSink!.writeByte(
         _encodeVariance(element),
       );
       _writeMarker(MarkerTag.TypeParameter_defaultType);
-      _resolutionSink.writeType(element.defaultType);
+      _resolutionSink!.writeType(element.defaultType);
     }
     _writeMarker(MarkerTag.TypeParameter_end);
   }
@@ -1811,16 +1811,16 @@
       // TODO(scheglov) Enforce not null, remove `?` in `?.type` below.
       var element = node.declaredElement as VariableElementImpl;
       _writeMarker(MarkerTag.VariableDeclaration_type);
-      _writeActualType(element?.type);
+      _writeActualType(element.type);
       _writeMarker(MarkerTag.VariableDeclaration_inferenceError);
       _writeTopLevelInferenceError(element);
       if (element is FieldElementImpl) {
         _writeMarker(MarkerTag.VariableDeclaration_inheritsCovariant);
-        _resolutionSink.writeByte(element.inheritsCovariant ? 1 : 0);
+        _resolutionSink!.writeByte(element.inheritsCovariant ? 1 : 0);
       }
     }
 
-    Expression initializerToWrite;
+    Expression? initializerToWrite;
     if (_shouldStoreVariableInitializers) {
       var initializer = node.initializer;
       if (_isSerializableExpression(initializer)) {
@@ -1860,19 +1860,19 @@
     _writeMarker(MarkerTag.WithClause_end);
   }
 
-  void _pushScopeTypeParameters(TypeParameterList node) {
+  void _pushScopeTypeParameters(TypeParameterList? node) {
     if (!_shouldWriteResolution) {
       return;
     }
 
-    _resolutionSink.localElements.pushScope();
+    _resolutionSink!.localElements.pushScope();
 
     if (node == null) {
       return;
     }
 
     for (var typeParameter in node.typeParameters) {
-      _resolutionSink.localElements.declare(typeParameter.declaredElement);
+      _resolutionSink!.localElements.declare(typeParameter.declaredElement!);
     }
   }
 
@@ -1903,7 +1903,7 @@
   void _storeExpression(Expression node) {
     if (_shouldWriteResolution) {
       _writeMarker(MarkerTag.Expression_staticType);
-      _resolutionSink.writeType(node.staticType);
+      _resolutionSink!.writeType(node.staticType);
     }
   }
 
@@ -1920,7 +1920,7 @@
   void _storeFormalParameter(FormalParameter node) {
     if (_shouldWriteResolution) {
       _writeMarker(MarkerTag.FormalParameter_type);
-      _writeActualType(node.declaredElement.type);
+      _writeActualType(node.declaredElement!.type);
     }
   }
 
@@ -1972,7 +1972,7 @@
 
   void _storeNormalFormalParameter(
     NormalFormalParameter node,
-    Token keyword, {
+    Token? keyword, {
     bool hasQuestion = false,
   }) {
     _writeByte(
@@ -1994,7 +1994,7 @@
     _writeMarker(MarkerTag.NormalFormalParameter_metadata);
     _writeNodeList(node.metadata);
     if (node.identifier != null) {
-      _writeDeclarationName(node.identifier);
+      _writeDeclarationName(node.identifier!);
     }
     _writeMarker(MarkerTag.NormalFormalParameter_formalParameter);
     _storeFormalParameter(node);
@@ -2015,12 +2015,12 @@
 
   void _writeActualReturnType(DartType type) {
     // TODO(scheglov) Check for `null` when writing resolved AST.
-    _resolutionSink.writeType(type);
+    _resolutionSink!.writeType(type);
   }
 
-  void _writeActualType(DartType type) {
+  void _writeActualType(DartType? type) {
     // TODO(scheglov) Check for `null` when writing resolved AST.
-    _resolutionSink.writeType(type);
+    _resolutionSink!.writeType(type);
   }
 
   void _writeByte(int byte) {
@@ -2034,10 +2034,10 @@
       _writeUInt30(declaration.offset);
       _writeByte(declaration.tag);
       if (declaration.name != null) {
-        _writeStringReference(declaration.name);
+        _writeStringReference(declaration.name!);
       } else {
-        _writeUInt30(declaration.fieldNames.length);
-        for (var name in declaration.fieldNames) {
+        _writeUInt30(declaration.fieldNames!.length);
+        for (var name in declaration.fieldNames!) {
           _writeStringReference(name);
         }
       }
@@ -2051,7 +2051,7 @@
   }
 
   /// We write tokens as a list, so this must be the last entity written.
-  void _writeDocumentationCommentString(Comment node) {
+  void _writeDocumentationCommentString(Comment? node) {
     if (node != null && _withInformative) {
       var tokens = node.tokens;
       _writeUInt30(tokens.length);
@@ -2122,7 +2122,7 @@
   void _writeMarker(MarkerTag tag) {
     if (enableDebugResolutionMarkers) {
       if (_shouldWriteResolution) {
-        _resolutionSink.writeUInt30(tag.index);
+        _resolutionSink!.writeUInt30(tag.index);
       }
     }
   }
@@ -2138,7 +2138,7 @@
     }
   }
 
-  void _writeOptionalDeclarationName(SimpleIdentifier node) {
+  void _writeOptionalDeclarationName(SimpleIdentifier? node) {
     if (node == null) {
       _writeByte(Tag.Nothing);
     } else {
@@ -2147,7 +2147,7 @@
     }
   }
 
-  void _writeOptionalNode(AstNode node) {
+  void _writeOptionalNode(AstNode? node) {
     if (node == null) {
       _writeByte(Tag.Nothing);
     } else {
@@ -2157,13 +2157,12 @@
   }
 
   void _writeStringReference(String string) {
-    assert(string != null);
     var index = _stringIndexer[string];
     _writeUInt30(index);
   }
 
   void _writeTopLevelInferenceError(ElementImpl element) {
-    TopLevelInferenceError error;
+    TopLevelInferenceError? error;
     if (element is MethodElementImpl) {
       error = element.typeInferenceError;
     } else if (element is PropertyInducingElementImpl) {
@@ -2173,10 +2172,10 @@
     }
 
     if (error != null) {
-      _resolutionSink.writeByte(error.kind.index);
-      _resolutionSink.writeStringList(error.arguments);
+      _resolutionSink!.writeByte(error.kind.index);
+      _resolutionSink!.writeStringList(error.arguments);
     } else {
-      _resolutionSink.writeByte(TopLevelInferenceErrorKind.none.index);
+      _resolutionSink!.writeByte(TopLevelInferenceErrorKind.none.index);
     }
   }
 
@@ -2231,7 +2230,7 @@
   /// we know that it might be serialized and deserialized. For example
   /// function expressions are problematic, and are not necessary to
   /// deserialize, so we choose not to do this.
-  static bool _isSerializableExpression(Expression node) {
+  static bool _isSerializableExpression(Expression? node) {
     if (node == null) return false;
 
     var visitor = _IsSerializableExpressionVisitor();
@@ -2244,12 +2243,12 @@
 class _ClassMemberIndexItem {
   final int offset;
   final int tag;
-  final String name;
-  final List<String> fieldNames;
+  final String? name;
+  final List<String>? fieldNames;
 
   _ClassMemberIndexItem({
-    @required this.offset,
-    @required this.tag,
+    required this.offset,
+    required this.tag,
     this.name,
     this.fieldNames,
   });
@@ -2268,15 +2267,15 @@
 class _UnitMemberIndexItem {
   final int offset;
   final int tag;
-  final String name;
-  final List<String> variableNames;
+  final String? name;
+  final List<String>? variableNames;
 
   /// The absolute offset of the index of class members, `0` if not a class.
   final int classIndexOffset;
 
   _UnitMemberIndexItem({
-    @required this.offset,
-    @required this.tag,
+    required this.offset,
+    required this.tag,
     this.name,
     this.variableNames,
     this.classIndexOffset = 0,
diff --git a/pkg/analyzer/lib/src/summary2/ast_resolver.dart b/pkg/analyzer/lib/src/summary2/ast_resolver.dart
index 2b88556..85a2151 100644
--- a/pkg/analyzer/lib/src/summary2/ast_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_resolver.dart
@@ -6,6 +6,7 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/scope.dart';
 import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/resolver/flow_analysis_visitor.dart';
 import 'package:analyzer/src/dart/resolver/resolution_visitor.dart';
 import 'package:analyzer/src/generated/resolver.dart';
@@ -14,7 +15,7 @@
 /// Used to resolve some AST nodes - variable initializers, and annotations.
 class AstResolver {
   final Linker _linker;
-  final CompilationUnitElement _unitElement;
+  final CompilationUnitElementImpl _unitElement;
   final Scope _nameScope;
 
   AstResolver(this._linker, this._unitElement, this._nameScope);
@@ -24,11 +25,11 @@
     AstNode Function() getNode, {
     bool buildElements = true,
     bool isTopLevelVariableInitializer = false,
-    ClassElement enclosingClassElement,
-    ExecutableElement enclosingExecutableElement,
-    FunctionBody enclosingFunctionBody,
+    ClassElement? enclosingClassElement,
+    ExecutableElement? enclosingExecutableElement,
+    FunctionBody? enclosingFunctionBody,
   }) {
-    var featureSet = node.thisOrAncestorOfType<CompilationUnit>().featureSet;
+    var featureSet = node.thisOrAncestorOfType<CompilationUnit>()!.featureSet;
     var errorListener = AnalysisErrorListener.NULL_LISTENER;
 
     if (buildElements) {
@@ -52,14 +53,15 @@
       node.accept(variableResolverVisitor);
     }
 
-    FlowAnalysisHelper flowAnalysis;
+    FlowAnalysisHelper? flowAnalysis;
     if (isTopLevelVariableInitializer) {
       if (_unitElement.library.isNonNullableByDefault) {
         flowAnalysis = FlowAnalysisHelper(
           _unitElement.library.typeSystem,
           false,
         );
-        flowAnalysis.topLevelDeclaration_enter(node.parent, null, null);
+        flowAnalysis.topLevelDeclaration_enter(
+            node.parent as Declaration, null, null);
       }
     }
 
diff --git a/pkg/analyzer/lib/src/summary2/ast_text_printer.dart b/pkg/analyzer/lib/src/summary2/ast_text_printer.dart
index 4e733f9..a5c3518 100644
--- a/pkg/analyzer/lib/src/summary2/ast_text_printer.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_text_printer.dart
@@ -13,7 +13,7 @@
   final StringBuffer _buffer;
   final LineInfo _lineInfo;
 
-  Token _last;
+  Token? _last;
   int _lastEnd = 0;
   int _lastEndLine = 0;
 
@@ -56,7 +56,7 @@
     _tokenIfNot(node.condition.endToken.next, node.rightParenthesis);
 
     node.message?.accept(this);
-    _tokenIfNot(node.message?.endToken?.next, node.rightParenthesis);
+    _tokenIfNot(node.message?.endToken.next, node.rightParenthesis);
 
     _token(node.rightParenthesis);
   }
@@ -70,7 +70,7 @@
     _tokenIfNot(node.condition.endToken.next, node.rightParenthesis);
 
     node.message?.accept(this);
-    _tokenIfNot(node.message?.endToken?.next, node.rightParenthesis);
+    _tokenIfNot(node.message?.endToken.next, node.rightParenthesis);
 
     _token(node.rightParenthesis);
     _token(node.semicolon);
@@ -164,7 +164,7 @@
     node.name.accept(this);
     node.typeParameters?.accept(this);
     _token(node.equals);
-    node.superclass?.accept(this);
+    node.superclass.accept(this);
     node.withClause.accept(this);
     node.implementsClause?.accept(this);
     _token(node.semicolon);
@@ -207,14 +207,14 @@
     _token(node.externalKeyword);
     _token(node.constKeyword);
     _token(node.factoryKeyword);
-    node.returnType?.accept(this);
+    node.returnType.accept(this);
     _token(node.period);
     node.name?.accept(this);
     node.parameters.accept(this);
     _token(node.separator);
-    _nodeList(node.initializers, node.body.beginToken);
+    _nodeList(node.initializers, node.body!.beginToken);
     node.redirectedConstructor?.accept(this);
-    node.body.accept(this);
+    node.body!.accept(this);
   }
 
   @override
@@ -308,7 +308,7 @@
     _directive(node);
     _token(node.keyword);
     node.uri.accept(this);
-    node.configurations?.accept(this);
+    node.configurations.accept(this);
     _nodeList(node.combinators);
     _token(node.semicolon);
   }
@@ -349,7 +349,7 @@
   @override
   void visitExtensionOverride(ExtensionOverride node) {
     node.extensionName.accept(this);
-    node.typeArguments.accept(this);
+    node.typeArguments?.accept(this);
     node.argumentList.accept(this);
   }
 
@@ -412,10 +412,10 @@
 
       parameter.accept(this);
 
-      var itemSeparator = parameter.endToken.next;
+      var itemSeparator = parameter.endToken.next!;
       if (itemSeparator != node.rightParenthesis) {
         _token(itemSeparator);
-        itemSeparator = itemSeparator.next;
+        itemSeparator = itemSeparator.next!;
       }
 
       if (itemSeparator == node.rightDelimiter) {
@@ -473,7 +473,7 @@
   void visitFunctionExpression(FunctionExpression node) {
     node.typeParameters?.accept(this);
     node.parameters?.accept(this);
-    node.body.accept(this);
+    node.body!.accept(this);
   }
 
   @override
@@ -563,7 +563,7 @@
     _directive(node);
     _token(node.keyword);
     node.uri.accept(this);
-    node.configurations?.accept(this);
+    node.configurations.accept(this);
     _token(node.deferredKeyword);
     _token(node.asKeyword);
     node.prefix?.accept(this);
@@ -664,7 +664,7 @@
     node.name.accept(this);
     node.typeParameters?.accept(this);
     node.parameters?.accept(this);
-    node.body?.accept(this);
+    node.body.accept(this);
   }
 
   @override
@@ -698,7 +698,7 @@
   @override
   void visitNativeClause(NativeClause node) {
     _token(node.nativeKeyword);
-    node.name.accept(this);
+    node.name?.accept(this);
   }
 
   @override
@@ -941,7 +941,7 @@
     // TODO (kallentu) : Clean up TypeParameterImpl casting once variance is
     // added to the interface.
     _token((node as TypeParameterImpl).varianceKeyword);
-    node.name?.accept(this);
+    node.name.accept(this);
     _token(node.extendsKeyword);
     node.bound?.accept(this);
   }
@@ -1029,7 +1029,7 @@
   ///
   /// If the [endToken] is not `null`, print one token after every node,
   /// unless it is the [endToken].
-  void _nodeList(List<AstNode> nodeList, [Token endToken]) {
+  void _nodeList(List<AstNode> nodeList, [Token? endToken]) {
     var length = nodeList.length;
     for (var i = 0; i < length; ++i) {
       var node = nodeList[i];
@@ -1047,13 +1047,13 @@
     _token(node.covariantKeyword);
   }
 
-  void _token(Token token) {
+  void _token(Token? token) {
     if (token == null) return;
 
     if (_last != null) {
-      if (_last.next != token) {
+      if (_last!.next != token) {
         throw StateError(
-          '|$_last| must be followed by |${_last.next}|, got |$token|',
+          '|$_last| must be followed by |${_last!.next}|, got |$token|',
         );
       }
     }
@@ -1062,7 +1062,7 @@
     if (token.precedingComments != null) {
       var lastToken = _last;
       _last = null;
-      for (var c = token.precedingComments; c != null; c = c.next) {
+      for (Token? c = token.precedingComments; c != null; c = c.next) {
         _token(c);
       }
       _last = lastToken;
@@ -1088,7 +1088,7 @@
     _lastEndLine = endLocation.lineNumber - 1;
   }
 
-  void _tokenIfNot(Token maybe, Token ifNot) {
+  void _tokenIfNot(Token? maybe, Token ifNot) {
     if (maybe == null) return;
     if (maybe == ifNot) return;
     _token(maybe);
diff --git a/pkg/analyzer/lib/src/summary2/binary_format_doc.dart b/pkg/analyzer/lib/src/summary2/binary_format_doc.dart
index 646328e..069e06e 100644
--- a/pkg/analyzer/lib/src/summary2/binary_format_doc.dart
+++ b/pkg/analyzer/lib/src/summary2/binary_format_doc.dart
@@ -8,7 +8,7 @@
   /// The blob with libraries.
   ///
   /// Items of [libraryOffsets] point here.
-  List<AstLibrary> libraries;
+  List<AstLibrary>? libraries;
 
   /// Pointers to libraries in the [libraries] blob.
   ///
@@ -17,73 +17,73 @@
   /// we don't know where one library ends, and another starts.
   ///
   /// TODO(scheglov) too complicated? Read all?
-  List<Uint30> libraryOffsets;
+  List<Uint30>? libraryOffsets;
 
   /// [stringTableOffset] points here.
-  StringTableFormat stringTable;
+  StringTableFormat? stringTable;
 
   /// We record `uint32` to know exactly the location of this field.
   /// It is always at the end of the byte buffer `-4`.
-  Uint32 librariesOffset;
+  Uint32? librariesOffset;
 
   /// We record `uint32` to know exactly the location of this field.
   /// It is always at the end of the byte buffer `-0`.
-  Uint32 stringTableOffset;
+  Uint32? stringTableOffset;
 }
 
 class AstLibrary {
   /// The name from the `library` directive, might be the empty string.
-  StringRef name;
+  StringRef? name;
 
   /// The offset `+1` of the name in the `library` directive.
   /// So, `0` if absent, decoded then into `-1`.
-  Uint30 nameOffset;
+  Uint30? nameOffset;
 
   /// The length of the name in the `library` directive, `0` if absent.
-  Uint30 nameLength;
+  Uint30? nameLength;
 
   /// Offsets pointing at [AstUnitFormat.headerOffset].
-  List<Uint30> unitOffsets;
+  List<Uint30>? unitOffsets;
 }
 
 class AstUnitFormat {
   /// The header of the unit, read when create the reader.
   /// [headerOffset] points here.
-  AstUnitHeader header;
+  AstUnitHeader? header;
 
   /// [AstUnitIndexItem.offset] from [indexOfMembers] points into here.
-  Object declarations;
+  Object? declarations;
 
   /// The offset of [header].
-  Uint30 headerOffset;
+  Uint30? headerOffset;
 
   /// The index of declarations in the unit.
-  List<AstUnitIndexItem> indexOfMembers;
+  List<AstUnitIndexItem>? indexOfMembers;
 }
 
 class AstUnitHeader {
   /// Four elements: package major/minor, override major/minor.
   /// The override is `+1`, if `0` then no override.
-  FormatUint32List languageVersion;
+  FormatUint32List? languageVersion;
 
   /// Encoded feature set.
-  FormatUint32List featureSet;
+  FormatUint32List? featureSet;
 }
 
 class AstUnitIndexItem {
   /// The offset in [AstUnitFormat.declarations].
-  Uint30 offset;
+  Uint30? offset;
 
   /// The tag of the declaration from [Tag].
-  Byte tag;
+  Byte? tag;
 
   /// If not [Tag.TopLevelVariableDeclaration], the name of the declaration.
   /// Otherwise absent, [topLevelVariableNames] instead.
-  StringRef name;
+  StringRef? name;
 
   /// If [Tag.TopLevelVariableDeclaration], the names of the variables.
   /// Otherwise absent, [name] instead.
-  List<StringRef> topLevelVariableNames;
+  List<StringRef>? topLevelVariableNames;
 }
 
 class Byte {}
@@ -94,7 +94,7 @@
   /// The blob with libraries.
   ///
   /// [libraryOffsets] points here.
-  List<ResolutionLibrary> libraries;
+  List<ResolutionLibrary>? libraries;
 
   /// Pointers to libraries in the [libraries] blob.
   ///
@@ -103,65 +103,65 @@
   /// we don't know where one library ends, and another starts.
   ///
   /// TODO(scheglov) too complicated? Read all?
-  List<Uint30> libraryOffsets;
+  List<Uint30>? libraryOffsets;
 
   /// The index of the parent reference, so we can add its name from
   /// the [referenceNames]. Is `0` for the root.
   ///
   /// [referencesOffset] points here.
-  List<Uint30> referenceParents;
+  List<Uint30>? referenceParents;
 
   /// The name of this component of a reference, e.g. `String` or `@class`.
   /// Is the empty string for the root.
-  List<StringRef> referenceNames;
+  List<StringRef>? referenceNames;
 
   /// We record `uint32` to know exactly the location of this field.
   /// It is always at the end of the byte buffer `-8`.
-  Uint32 librariesOffset;
+  Uint32? librariesOffset;
 
   /// We record `uint32` to know exactly the location of this field.
   /// It is always at the end of the byte buffer `-4`.
   ///
   /// Points at [referenceParents].
-  Uint32 referencesOffset;
+  Uint32? referencesOffset;
 
   /// We record `uint32` to know exactly the location of this field.
   /// It is always at the end of the byte buffer `-0`.
-  Uint32 stringTableOffset;
+  Uint32? stringTableOffset;
 }
 
 class ResolutionLibrary {
   /// The blob with units.
-  List<ResolutionUnitFormat> units;
+  List<ResolutionUnitFormat>? units;
 
   /// [ResolutionBundle.libraryOffsets] points here.
-  StringRef uriStr;
+  StringRef? uriStr;
 
   /// Indexes of exported elements in [ResolutionBundle.referenceNames].
-  List<Uint30> exportedReferences;
+  List<Uint30>? exportedReferences;
 
   /// Absolute offsets pointing at [ResolutionUnitFormat.uriStr].
-  List<Uint30> unitOffsets;
+  List<Uint30>? unitOffsets;
 }
 
 class ResolutionUnitFormat {
   /// [ResolutionLibrary.unitOffsets] points here.
-  StringRef uriStr;
+  StringRef? uriStr;
 
-  Byte isSynthetic;
+  Byte? isSynthetic;
 
-  Byte isPart;
+  Byte? isPart;
 
   /// If [isPart], the URI that is used in the `part` directive.
   /// The empty string for the defining unit.
-  StringRef partUriStr;
+  StringRef? partUriStr;
 
   /// The offset of the resolution information for directives.
   /// For example resolution of metadata.
-  Uint30 directivesResolutionOffset;
+  Uint30? directivesResolutionOffset;
 
   /// Offsets of the resolution information for each declaration.
-  List<Uint30> declarationOffsets;
+  List<Uint30>? declarationOffsets;
 }
 
 /// The reference to a [String], in form of [Uint30].
@@ -171,16 +171,16 @@
 /// So, we can write each unique string only once.
 class StringTableFormat {
   /// The blob with WTF8 encoded strings.
-  Object strings;
+  Object? strings;
 
   /// The length of [strings] in bytes. So, we know how much to go back in
   /// the byte buffer from here to start reading strings.
-  Uint30 lengthInBytes;
+  Uint30? lengthInBytes;
 
   /// The length of each string in bytes inside [strings].
   ///
   /// This allows us to read strings lazily as they are requested.
-  List<Uint30> lengths;
+  List<Uint30>? lengths;
 }
 
 class Uint30 {}
diff --git a/pkg/analyzer/lib/src/summary2/bundle_reader.dart b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
index ea791b0..e178788 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
@@ -22,17 +22,17 @@
 import 'package:analyzer/src/summary2/apply_resolution.dart';
 import 'package:analyzer/src/summary2/ast_binary_reader.dart';
 import 'package:analyzer/src/summary2/ast_binary_tag.dart';
+import 'package:analyzer/src/summary2/ast_binary_tokens.dart';
 import 'package:analyzer/src/summary2/data_reader.dart';
 import 'package:analyzer/src/summary2/linked_element_factory.dart';
 import 'package:analyzer/src/summary2/linked_unit_context.dart';
 import 'package:analyzer/src/summary2/reference.dart';
-import 'package:meta/meta.dart';
 import 'package:pub_semver/pub_semver.dart';
 
 Map<String, LibraryReader> createLibraryReadersWithAstBytes({
-  @required LinkedElementFactory elementFactory,
-  @required Uint8List resolutionBytes,
-  @required Map<String, Map<String, Uint8List>> uriToLibrary_uriToUnitAstBytes,
+  required LinkedElementFactory elementFactory,
+  required Uint8List resolutionBytes,
+  required Map<String, Map<String, Uint8List>> uriToLibrary_uriToUnitAstBytes,
 }) {
   var _resolutionReader = SummaryDataReader(resolutionBytes);
 
@@ -63,8 +63,7 @@
     var resolutionUnitOffsets = _resolutionReader.readUint30List();
     var exportsIndexList = _resolutionReader.readUint30List();
 
-    var uriToUnitAstBytes = uriToLibrary_uriToUnitAstBytes[libraryUriStr];
-    assert(uriToUnitAstBytes != null, libraryUriStr);
+    var uriToUnitAstBytes = uriToLibrary_uriToUnitAstBytes[libraryUriStr]!;
 
     var reference = elementFactory.rootReference.getChild(libraryUriStr);
     var libraryReader = LibraryReaderForAstBytes._(
@@ -91,10 +90,10 @@
   final Map<String, LibraryReader> libraryMap = {};
 
   BundleReader({
-    @required LinkedElementFactory elementFactory,
-    @required Uint8List astBytes,
-    @required Uint8List resolutionBytes,
-  })  : _astReader = SummaryDataReader(astBytes),
+    required LinkedElementFactory elementFactory,
+    required Uint8List astBytes,
+    required Uint8List resolutionBytes,
+  })   : _astReader = SummaryDataReader(astBytes),
         _resolutionReader = SummaryDataReader(resolutionBytes) {
     _astReader.offset = 0;
     _withInformative = _astReader.readByte() == 1;
@@ -159,7 +158,7 @@
   }
 
   LibraryReader getLibrary(String uriStr) {
-    return libraryMap[uriStr];
+    return libraryMap[uriStr]!;
   }
 }
 
@@ -177,9 +176,9 @@
 
   final Uint32List _resolutionUnitOffsets;
   final Uint32List _exportsIndexList;
-  List<Reference> _exports;
+  List<Reference>? _exports;
 
-  List<UnitReader> _units;
+  List<UnitReader>? _units;
 
   LibraryReader._(
     this._elementFactory,
@@ -191,16 +190,9 @@
   );
 
   List<Reference> get exports {
-    if (_exports == null) {
-      var length = _exportsIndexList.length;
-      _exports = List.filled(length, null, growable: false);
-      for (var i = 0; i < length; i++) {
-        var index = _exportsIndexList[i];
-        var reference = _referenceReader.referenceOfIndex(index);
-        _exports[i] = reference;
-      }
-    }
-    return _exports;
+    return _exports ??= _exportsIndexList
+        .map((index) => _referenceReader.referenceOfIndex(index))
+        .toList();
   }
 
   /// Is `true` if the defining unit has [PartOfDirective].
@@ -223,11 +215,11 @@
   final Map<String, Uint8List> _uriToUnitAstBytes;
 
   bool _hasNameRead = false;
-  bool _withInformative;
-  String _name;
-  int _nameOffset;
-  int _nameLength;
-  bool _hasPartOfDirective;
+  late final bool _withInformative;
+  late final String _name;
+  late final int _nameOffset;
+  late final int _nameLength;
+  late final bool _hasPartOfDirective;
 
   LibraryReaderForAstBytes._(
     LinkedElementFactory elementFactory,
@@ -276,7 +268,7 @@
 
   @override
   List<UnitReader> get units {
-    if (_units != null) return _units;
+    if (_units != null) return _units!;
     _units = [];
 
     for (var i = 0; i < _resolutionUnitOffsets.length; i++) {
@@ -284,7 +276,7 @@
       var unitUriStr = _resolutionReader.readStringReference();
       var isSynthetic = _resolutionReader.readByte() != 0;
       var isPart = _resolutionReader.readByte() != 0;
-      var partUriStr = _resolutionReader.readStringReference();
+      String? partUriStr = _resolutionReader.readStringReference();
       if (!isPart) {
         partUriStr = null;
       }
@@ -296,7 +288,7 @@
         unitUriStr = 'null';
       }
 
-      var astBytes = _uriToUnitAstBytes[unitUriStr];
+      var astBytes = _uriToUnitAstBytes[unitUriStr]!;
       var astReader = SummaryDataReader(astBytes);
       astReader.offset = astBytes.length - 4 * 4;
       var headerOffset = astReader.readUint32();
@@ -305,7 +297,7 @@
       var astStringsOffset = astReader.readUint32();
       astReader.createStringTable(astStringsOffset);
 
-      _units.add(
+      _units!.add(
         UnitReader._(
           this,
           resolutionDirectivesOffset,
@@ -320,7 +312,7 @@
       );
     }
 
-    return _units;
+    return _units!;
   }
 
   @override
@@ -334,7 +326,7 @@
     _hasNameRead = true;
 
     var uriStr = reference.name;
-    var definingUnitBytes = _uriToUnitAstBytes[uriStr];
+    var definingUnitBytes = _uriToUnitAstBytes[uriStr]!;
     var reader = SummaryDataReader(definingUnitBytes);
     reader.offset = definingUnitBytes.length - 4 * 2;
     var libraryDataOffset = reader.readUint32();
@@ -398,7 +390,7 @@
 
   @override
   List<UnitReader> get units {
-    if (_units != null) return _units;
+    if (_units != null) return _units!;
     _units = [];
 
     for (var i = 0; i < _astUnitOffsets.length; i++) {
@@ -413,14 +405,14 @@
       var unitUriStr = _resolutionReader.readStringReference();
       var isSynthetic = _resolutionReader.readByte() != 0;
       var isPart = _resolutionReader.readByte() != 0;
-      var partUriStr = _resolutionReader.readStringReference();
+      String? partUriStr = _resolutionReader.readStringReference();
       if (!isPart) {
         partUriStr = null;
       }
       var resolutionDirectivesOffset = _resolutionReader.readUInt30();
       var resolutionDeclarationOffsets = _resolutionReader.readUint30List();
 
-      _units.add(
+      _units!.add(
         UnitReader._(
           this,
           resolutionDirectivesOffset,
@@ -435,7 +427,7 @@
       );
     }
 
-    return _units;
+    return _units!;
   }
 }
 
@@ -443,7 +435,7 @@
   final UnitReader _unitReader;
   final AstNode _node;
   final int _resolutionIndex;
-  final Uint32List _codeOffsetLengthList;
+  final Uint32List? _codeOffsetLengthList;
   final Uint32List _documentationTokenIndexList;
 
   @override
@@ -459,18 +451,18 @@
 
   bool _hasDocumentationComment = false;
 
-  _UnitMemberReader _reader;
+  late final _UnitMemberReader _reader;
 
   LinkedContext(
     this._unitReader,
     this._node, {
-    @required this.codeOffset,
-    @required this.codeLength,
+    required this.codeOffset,
+    required this.codeLength,
     this.isClassWithConstConstructor = false,
-    Uint32List codeOffsetLengthList,
-    @required int resolutionIndex,
-    @required Uint32List documentationTokenIndexList,
-  })  : _resolutionIndex = resolutionIndex,
+    Uint32List? codeOffsetLengthList,
+    required int resolutionIndex,
+    required Uint32List documentationTokenIndexList,
+  })   : _resolutionIndex = resolutionIndex,
         _codeOffsetLengthList = codeOffsetLengthList,
         _documentationTokenIndexList = documentationTokenIndexList;
 
@@ -524,7 +516,7 @@
     var variables = variableList.variables;
     for (var i = 0; i < variables.length; i++) {
       if (identical(variables[i], node)) {
-        return _codeOffsetLengthList[2 * i + 1];
+        return _codeOffsetLengthList![2 * i + 1];
       }
     }
     throw StateError('No |$node| in: $variableList');
@@ -536,7 +528,7 @@
     var variables = variableList.variables;
     for (var i = 0; i < variables.length; i++) {
       if (identical(variables[i], node)) {
-        return _codeOffsetLengthList[2 * i + 0];
+        return _codeOffsetLengthList![2 * i + 0];
       }
     }
     throw StateError('No |$node| in: $variableList');
@@ -591,10 +583,14 @@
   /// TODO(scheglov) Remove after fixing http://dartbug.com/44449
   Uint8List get bytes => _unitReader._resolutionReader.bytes;
 
-  Element nextElement() {
+  Element? nextElement() {
     var memberFlags = readByte();
     var element = _readRawElement();
 
+    if (element == null) {
+      return null;
+    }
+
     if (memberFlags == Tag.RawElement) {
       return element;
     }
@@ -608,7 +604,8 @@
             (element.enclosingElement as TypeParameterizedElement)
                 .typeParameters;
         var substitution = Substitution.fromPairs(typeParameters, arguments);
-        element = ExecutableMember.from2(element, substitution);
+        element =
+            ExecutableMember.from2(element as ExecutableElement, substitution);
       }
     }
 
@@ -628,7 +625,7 @@
     return _unitReader._resolutionReader.stringOfIndex(index);
   }
 
-  DartType nextType() {
+  DartType? nextType() {
     var tag = readByte();
     if (tag == Tag.NullType) {
       return null;
@@ -637,12 +634,8 @@
     } else if (tag == Tag.FunctionType) {
       return _readFunctionType();
     } else if (tag == Tag.InterfaceType) {
-      var element = nextElement();
-      var length = _readUInt30();
-      var typeArguments = List<DartType>.filled(length, null);
-      for (var i = 0; i < length; i++) {
-        typeArguments[i] = nextType();
-      }
+      var element = nextElement() as ClassElement;
+      var typeArguments = _readTypeList();
       var nullability = _readNullability();
       return InterfaceTypeImpl(
         element: element,
@@ -650,21 +643,21 @@
         nullabilitySuffix: nullability,
       );
     } else if (tag == Tag.InterfaceType_noTypeArguments_none) {
-      var element = nextElement();
+      var element = nextElement() as ClassElement;
       return InterfaceTypeImpl(
         element: element,
         typeArguments: const <DartType>[],
         nullabilitySuffix: NullabilitySuffix.none,
       );
     } else if (tag == Tag.InterfaceType_noTypeArguments_question) {
-      var element = nextElement();
+      var element = nextElement() as ClassElement;
       return InterfaceTypeImpl(
         element: element,
         typeArguments: const <DartType>[],
         nullabilitySuffix: NullabilitySuffix.question,
       );
     } else if (tag == Tag.InterfaceType_noTypeArguments_star) {
-      var element = nextElement();
+      var element = nextElement() as ClassElement;
       return InterfaceTypeImpl(
         element: element,
         typeArguments: const <DartType>[],
@@ -674,7 +667,7 @@
       var nullability = _readNullability();
       return NeverTypeImpl.instance.withNullability(nullability);
     } else if (tag == Tag.TypeParameterType) {
-      var element = nextElement();
+      var element = nextElement() as TypeParameterElement;
       var nullability = _readNullability();
       return TypeParameterTypeImpl(
         element: element,
@@ -734,16 +727,16 @@
       element.bound = bound;
     }
 
-    var aliasElement = nextElement();
+    var aliasElement = nextElement() as TypeAliasElement?;
     var aliasArguments = aliasElement != null ? _readTypeList() : null;
 
-    var returnType = nextType();
+    var returnType = nextType()!;
 
     var formalParameters = <ParameterElement>[];
     var formalParametersLength = _readUInt30();
     for (var i = 0; i < formalParametersLength; i++) {
       var kindIndex = readByte();
-      var type = nextType();
+      var type = nextType()!;
       var name = nextString();
       formalParameters.add(
         ParameterElementImpl.synthetic(
@@ -773,7 +766,7 @@
     return NullabilitySuffix.values[index];
   }
 
-  Element _readRawElement() {
+  Element? _readRawElement() {
     var index = _readUInt30();
 
     if ((index & 0x1) == 0x1) {
@@ -797,7 +790,7 @@
     var types = <DartType>[];
     var length = _readUInt30();
     for (var i = 0; i < length; i++) {
-      var argument = nextType();
+      var argument = nextType()!;
       types.add(argument);
     }
     return types;
@@ -846,8 +839,8 @@
   final int codeLength;
 
   SummaryDataForFormalParameter({
-    @required this.codeOffset,
-    @required this.codeLength,
+    required this.codeOffset,
+    required this.codeLength,
   });
 }
 
@@ -860,7 +853,7 @@
   SummaryDataForLibraryDirective(
     this._unitReader,
     this._node, {
-    @required Uint32List documentationTokenIndexList,
+    required Uint32List documentationTokenIndexList,
   }) : _documentationTokenIndexList = documentationTokenIndexList {
     _node.summaryData = this;
   }
@@ -892,8 +885,8 @@
   final int codeLength;
 
   SummaryDataForTypeParameter({
-    @required this.codeOffset,
-    @required this.codeLength,
+    required this.codeOffset,
+    required this.codeLength,
   });
 }
 
@@ -906,7 +899,7 @@
 
   /// If a part, the URI that is used in the [PartDirective].
   /// Or `null` for the defining unit.
-  final String partUriStr;
+  final String? partUriStr;
 
   final int _directivesResolutionOffset;
   bool _isDirectivesResolutionApplied = false;
@@ -915,10 +908,10 @@
 
   final SummaryDataReader astReader;
 
-  int _directivesOffset;
+  late final int _directivesOffset;
   final List<_UnitMemberReader> _memberReaders = [];
 
-  CompilationUnitImpl _unit;
+  late final CompilationUnitImpl _unit;
   bool _hasDirectives = false;
   bool _hasDeclarations = false;
 
@@ -944,14 +937,14 @@
     _directivesOffset = astReader.offset;
 
     _unit = astFactory.compilationUnit(
-      beginToken: null,
+      beginToken: Tokens.BANG,
       // TODO(scheglov)
       // scriptTag: _readNode(data.compilationUnit_scriptTag),
       directives: [],
       declarations: [],
-      endToken: null,
+      endToken: Tokens.BANG,
       featureSet: featureSet,
-    );
+    ) as CompilationUnitImpl;
     _unit.languageVersion = languageVersion;
     _unit.lineInfo = lineInfo;
     _unit.summaryData = SummaryDataForCompilationUnit(codeLength);
@@ -1167,16 +1160,26 @@
   }
 }
 
+class _ClassMemberMock extends AstNodeImpl implements ClassMemberImpl {
+  static final instance = _ClassMemberMock();
+
+  @override
+  AstNode? parent;
+
+  @override
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
 class _ClassMemberReader implements ReferenceNodeAccessor {
   final UnitReader unitReader;
   final int offset;
-  final NodeListImpl<ClassMember> _members;
+  final List<ClassMember> _members;
   final int _membersIndex;
-  ClassMemberImpl _node;
+  ClassMemberImpl? _node;
 
   _ClassMemberReader(this.unitReader, this.offset, this._members)
       : _membersIndex = _members.length {
-    _members.add(null);
+    _members.add(_ClassMemberMock.instance);
   }
 
   @override
@@ -1187,9 +1190,9 @@
       );
       unitReader.astReader.offset = offset;
       _node = astReader.readNode() as ClassMemberImpl;
-      _members[_membersIndex] = _node;
+      _members[_membersIndex] = _node!;
     }
-    return _node;
+    return _node!;
   }
 
   @override
@@ -1202,14 +1205,14 @@
 
   bool _hasIndex = false;
   final List<_ClassMemberReader> _classMemberReaders = [];
-  List<ClassMember> _classMembers;
+  late final List<ClassMember> _classMembers;
 
   _ClassReader({
-    @required this.reference,
-    @required UnitReader unitReader,
-    @required int offset,
-    @required CompilationUnit unit,
-    @required this.indexOffset,
+    required this.reference,
+    required UnitReader unitReader,
+    required int offset,
+    required CompilationUnit unit,
+    required this.indexOffset,
   }) : super(unitReader, offset, unit) {
     reference.nodeAccessor ??= this;
   }
@@ -1293,12 +1296,20 @@
   }
 }
 
+class _CompilationUnitMemberMock extends AstNodeImpl
+    implements CompilationUnitMemberImpl {
+  static final instance = _CompilationUnitMemberMock();
+
+  @override
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
 class _ReferenceReader {
   final LinkedElementFactory elementFactory;
   final SummaryDataReader _reader;
-  Uint32List _parents;
-  Uint32List _names;
-  List<Reference> _references;
+  late final Uint32List _parents;
+  late final Uint32List _names;
+  late final List<Reference?> _references;
 
   _ReferenceReader(this.elementFactory, this._reader, int offset) {
     _reader.offset = offset;
@@ -1339,11 +1350,11 @@
   final int offset;
   final CompilationUnit _unit;
   final int _index;
-  CompilationUnitMemberImpl _node;
+  CompilationUnitMemberImpl? _node;
 
   _UnitMemberReader(this.unitReader, this.offset, this._unit)
       : _index = _unit.declarations.length {
-    _unit.declarations.add(null);
+    _unit.declarations.add(_CompilationUnitMemberMock.instance);
   }
 
   @override
@@ -1353,14 +1364,14 @@
         reader: unitReader,
       );
       unitReader.astReader.offset = offset;
-      _node = astReader.readNode() as CompilationUnitMember;
-      _unit.declarations[_index] = _node;
+      _node = astReader.readNode() as CompilationUnitMemberImpl;
+      _unit.declarations[_index] = _node!;
 
       var hasLinkedContext = _node as HasAstLinkedContext;
       var linkedContext = hasLinkedContext.linkedContext as LinkedContext;
       linkedContext._reader = this;
     }
-    return _node;
+    return _node!;
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/summary2/bundle_writer.dart b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
index 1aa10ca..c7337c8 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
@@ -16,9 +16,8 @@
 import 'package:analyzer/src/summary2/binary_format_doc.dart';
 import 'package:analyzer/src/summary2/data_writer.dart';
 import 'package:analyzer/src/summary2/reference.dart';
-import 'package:meta/meta.dart';
 
-Uint8List writeUnitToBytes({@required CompilationUnit unit}) {
+Uint8List writeUnitToBytes({required CompilationUnit unit}) {
   var byteSink = ByteSink();
   var sink = BufferedSink(byteSink);
   var stringIndexer = StringIndexer();
@@ -45,9 +44,9 @@
     sink.writeUInt30(declaration.offset);
     sink.writeByte(declaration.tag);
     if (declaration.name != null) {
-      _writeStringReference(declaration.name);
+      _writeStringReference(declaration.name!);
     } else {
-      sink.writeList(declaration.variableNames, _writeStringReference);
+      sink.writeList(declaration.variableNames!, _writeStringReference);
     }
     if (declaration.classIndexOffset != 0) {
       sink.writeUInt30(declaration.classIndexOffset);
@@ -95,8 +94,8 @@
 
 class BundleWriter {
   final bool withInformative;
-  BundleWriterAst _astWriter;
-  BundleWriterResolution _resolutionWriter;
+  late final BundleWriterAst _astWriter;
+  late final BundleWriterResolution _resolutionWriter;
 
   BundleWriter(this.withInformative, Reference dynamicReference) {
     _astWriter = BundleWriterAst(withInformative);
@@ -143,7 +142,7 @@
 class BundleWriterAst {
   final bool withInformative;
   final ByteSink _byteSink = ByteSink();
-  BufferedSink sink;
+  late final BufferedSink sink;
   final StringIndexer stringIndexer = StringIndexer();
 
   final List<int> _libraryOffsets = [];
@@ -221,9 +220,9 @@
       sink.writeUInt30(declaration.offset);
       sink.writeByte(declaration.tag);
       if (declaration.name != null) {
-        _writeStringReference(declaration.name);
+        _writeStringReference(declaration.name!);
       } else {
-        sink.writeList(declaration.variableNames, _writeStringReference);
+        sink.writeList(declaration.variableNames!, _writeStringReference);
       }
       if (declaration.classIndexOffset != 0) {
         sink.writeUInt30(declaration.classIndexOffset);
@@ -240,10 +239,10 @@
 }
 
 class BundleWriterResolution {
-  _BundleWriterReferences _references;
+  late final _BundleWriterReferences _references;
   final ByteSink _byteSink = ByteSink();
-  BufferedSink _sink;
-  ResolutionSink _resolutionSink;
+  late final BufferedSink _sink;
+  late final ResolutionSink _resolutionSink;
 
   final StringIndexer _stringIndexer = StringIndexer();
 
@@ -336,8 +335,8 @@
   final Uint8List resolutionBytes;
 
   BundleWriterResult({
-    @required this.astBytes,
-    @required this.resolutionBytes,
+    required this.astBytes,
+    required this.resolutionBytes,
   });
 }
 
@@ -345,7 +344,7 @@
   final List<UnitToWriteAst> units;
 
   LibraryToWriteAst({
-    @required this.units,
+    required this.units,
   });
 }
 
@@ -355,9 +354,9 @@
   final List<UnitToWriteResolution> units;
 
   LibraryToWriteResolution({
-    @required this.uriStr,
-    @required this.exports,
-    @required this.units,
+    required this.uriStr,
+    required this.exports,
+    required this.units,
   });
 }
 
@@ -368,10 +367,10 @@
   final _LocalElementIndexer localElements = _LocalElementIndexer();
 
   ResolutionSink({
-    @required StringIndexer stringIndexer,
-    @required BufferedSink sink,
-    @required _BundleWriterReferences references,
-  })  : _stringIndexer = stringIndexer,
+    required StringIndexer stringIndexer,
+    required BufferedSink sink,
+    required _BundleWriterReferences references,
+  })   : _stringIndexer = stringIndexer,
         _sink = sink,
         _references2 = references;
 
@@ -384,7 +383,7 @@
 
   /// TODO(scheglov) Triage places where we write elements.
   /// Some of then cannot be members, e.g. type names.
-  void writeElement(Element element) {
+  void writeElement(Element? element) {
     if (element is Member) {
       var declaration = element.declaration;
       var isLegacy = element.isLegacy;
@@ -408,7 +407,7 @@
     }
   }
 
-  void writeElement0(Element element) {
+  void writeElement0(Element? element) {
     assert(element is! Member, 'Use writeMemberOrElement()');
     var elementIndex = _indexOfElement(element);
     _sink.writeUInt30(elementIndex);
@@ -421,7 +420,7 @@
     }
   }
 
-  void writeType(DartType type) {
+  void writeType(DartType? type) {
     if (type == null) {
       writeByte(Tag.NullType);
     } else if (type is DynamicType) {
@@ -470,7 +469,7 @@
     _sink.writeUInt30(value);
   }
 
-  int _indexOfElement(Element element) {
+  int _indexOfElement(Element? element) {
     if (element == null) return 0;
     if (element is MultiplyDefinedElement) return 0;
     assert(element is! Member);
@@ -532,7 +531,7 @@
     var aliasElement = type.aliasElement;
     writeElement(aliasElement);
     if (aliasElement != null) {
-      _writeTypeList(type.aliasArguments);
+      _writeTypeList(type.aliasArguments!);
     }
 
     writeType(type.returnType);
@@ -541,7 +540,6 @@
     _sink.writeUInt30(parameters.length);
     for (var parameter in parameters) {
       _writeFormalParameterKind(parameter);
-      assert(parameter.type != null);
       writeType(parameter.type);
       // TODO(scheglov) Don't write names of positional parameters
       _writeStringReference(parameter.name);
@@ -572,6 +570,11 @@
     Element declaration,
     Map<TypeParameterElement, DartType> substitution,
   ) {
+    // TODO(scheglov) Just keep it null in class Member?
+    if (substitution.isEmpty) {
+      return const [];
+    }
+
     var enclosing = declaration.enclosingElement;
     if (enclosing is TypeParameterizedElement) {
       if (enclosing is! ClassElement && enclosing is! ExtensionElement) {
@@ -584,7 +587,7 @@
       }
 
       return typeParameters
-          .map((typeParameter) => substitution[typeParameter])
+          .map((typeParameter) => substitution[typeParameter]!)
           .toList(growable: false);
     }
 
@@ -617,9 +620,9 @@
   final List<int> offsets = [];
 
   ResolutionUnit({
-    @required this.library,
-    @required this.unit,
-    @required this.directivesOffset,
+    required this.library,
+    required this.unit,
+    required this.directivesOffset,
   });
 
   /// Should be called on enter into a new declaration on which level
@@ -710,21 +713,21 @@
   final CompilationUnit node;
 
   UnitToWriteAst({
-    @required this.node,
+    required this.node,
   });
 }
 
 class UnitToWriteResolution {
   final String uriStr;
-  final String partUriStr;
+  final String? partUriStr;
   final CompilationUnit node;
   final bool isSynthetic;
 
   UnitToWriteResolution({
-    @required this.uriStr,
-    @required this.partUriStr,
-    @required this.node,
-    @required this.isSynthetic,
+    required this.uriStr,
+    required this.partUriStr,
+    required this.node,
+    required this.isSynthetic,
   });
 }
 
@@ -736,7 +739,8 @@
 
   /// References used in all libraries being linked.
   /// Element references in nodes are indexes in this list.
-  final List<Reference> references = [null];
+  /// TODO(scheglov) Do we really use this list?
+  final List<Reference?> references = [null];
 
   final List<int> _referenceParents = [0];
   final List<String> _referenceNames = [''];
@@ -753,10 +757,10 @@
     }
   }
 
-  int _indexOfReference(Reference reference) {
+  int _indexOfReference(Reference? reference) {
     if (reference == null) return 0;
     if (reference.parent == null) return 0;
-    if (reference.index != null) return reference.index;
+    if (reference.index != null) return reference.index!;
 
     var parentIndex = _indexOfReference(reference.parent);
     _referenceParents.add(parentIndex);
@@ -764,7 +768,7 @@
 
     reference.index = references.length;
     references.add(reference);
-    return reference.index;
+    return reference.index!;
   }
 }
 
@@ -797,8 +801,8 @@
   final List<ResolutionUnit> units = [];
 
   _ResolutionLibrary({
-    @required this.sink,
-    @required this.library,
+    required this.sink,
+    required this.library,
   });
 
   ResolutionUnit enterUnit(UnitToWriteResolution unitToWrite) {
diff --git a/pkg/analyzer/lib/src/summary2/constructor_initializer_resolver.dart b/pkg/analyzer/lib/src/summary2/constructor_initializer_resolver.dart
index 0c4cea8..aca12f3 100644
--- a/pkg/analyzer/lib/src/summary2/constructor_initializer_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/constructor_initializer_resolver.dart
@@ -14,21 +14,21 @@
   final Linker _linker;
   final LibraryElementImpl _libraryElement;
 
-  CompilationUnitElement _unitElement;
-  ClassElement _classElement;
-  ConstructorElement _constructorElement;
-  ConstructorDeclarationImpl _constructorNode;
-  AstResolver _astResolver;
+  late CompilationUnitElementImpl _unitElement;
+  late ClassElement _classElement;
+  late ConstructorElement _constructorElement;
+  late ConstructorDeclarationImpl _constructorNode;
+  late AstResolver _astResolver;
 
   ConstructorInitializerResolver(this._linker, this._libraryElement);
 
   void resolve() {
     for (var unit in _libraryElement.units) {
-      _unitElement = unit;
+      _unitElement = unit as CompilationUnitElementImpl;
       for (var classElement in unit.types) {
         _classElement = classElement;
         for (var constructorElement in classElement.constructors) {
-          _constructor(constructorElement);
+          _constructor(constructorElement as ConstructorElementImpl);
         }
       }
     }
@@ -38,7 +38,8 @@
     if (constructorElement.isSynthetic) return;
 
     _constructorElement = constructorElement;
-    _constructorNode = constructorElement.linkedNode;
+    _constructorNode =
+        constructorElement.linkedNode as ConstructorDeclarationImpl;
 
     var functionScope = LinkingNodeContext.get(_constructorNode).scope;
     var initializerScope = ConstructorInitializerScope(
@@ -48,7 +49,7 @@
 
     _astResolver = AstResolver(_linker, _unitElement, initializerScope);
 
-    FunctionBodyImpl body = _constructorNode.body;
+    var body = _constructorNode.body as FunctionBodyImpl;
     body.localVariableInfo = LocalVariableInfo();
 
     _initializers();
diff --git a/pkg/analyzer/lib/src/summary2/data_reader.dart b/pkg/analyzer/lib/src/summary2/data_reader.dart
index 143685b..be1e522 100644
--- a/pkg/analyzer/lib/src/summary2/data_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/data_reader.dart
@@ -5,17 +5,15 @@
 import 'dart:convert';
 import 'dart:typed_data';
 
-import 'package:meta/meta.dart';
-
 /// Helper for reading primitive types from bytes.
 class SummaryDataReader {
   final Uint8List bytes;
   int offset = 0;
 
-  _StringTable _stringTable;
+  late final _StringTable _stringTable;
 
   final Float64List _doubleBuffer = Float64List(1);
-  Uint8List _doubleBufferUint8;
+  Uint8List? _doubleBufferUint8;
 
   SummaryDataReader(this.bytes);
 
@@ -29,15 +27,16 @@
   }
 
   double readDouble() {
-    _doubleBufferUint8 ??= _doubleBuffer.buffer.asUint8List();
-    _doubleBufferUint8[0] = readByte();
-    _doubleBufferUint8[1] = readByte();
-    _doubleBufferUint8[2] = readByte();
-    _doubleBufferUint8[3] = readByte();
-    _doubleBufferUint8[4] = readByte();
-    _doubleBufferUint8[5] = readByte();
-    _doubleBufferUint8[6] = readByte();
-    _doubleBufferUint8[7] = readByte();
+    var doubleBufferUint8 =
+        _doubleBufferUint8 ??= _doubleBuffer.buffer.asUint8List();
+    doubleBufferUint8[0] = readByte();
+    doubleBufferUint8[1] = readByte();
+    doubleBufferUint8[2] = readByte();
+    doubleBufferUint8[3] = readByte();
+    doubleBufferUint8[4] = readByte();
+    doubleBufferUint8[5] = readByte();
+    doubleBufferUint8[6] = readByte();
+    doubleBufferUint8[7] = readByte();
     return _doubleBuffer[0];
   }
 
@@ -108,9 +107,9 @@
   final Uint8List _bytes;
   int _byteOffset;
 
-  Uint32List _offsets;
-  Uint32List _lengths;
-  List<String> _strings;
+  late final Uint32List _offsets;
+  late final Uint32List _lengths;
+  late final List<String?> _strings;
 
   /// The structure of the table:
   ///   <bytes with encoded strings>
@@ -118,11 +117,10 @@
   ///   <the number strings>
   ///   <the array of lengths of individual strings>
   _StringTable({
-    @required Uint8List bytes,
-    @required int startOffset,
-  }) : _bytes = bytes {
-    _byteOffset = startOffset;
-
+    required Uint8List bytes,
+    required int startOffset,
+  })   : _bytes = bytes,
+        _byteOffset = startOffset {
     var offset = startOffset - _readUInt();
     var length = _readUInt();
 
diff --git a/pkg/analyzer/lib/src/summary2/data_writer.dart b/pkg/analyzer/lib/src/summary2/data_writer.dart
index 5428e5b..2f4fd40 100644
--- a/pkg/analyzer/lib/src/summary2/data_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/data_writer.dart
@@ -19,7 +19,7 @@
   int length = 0;
 
   final Float64List _doubleBuffer = Float64List(1);
-  Uint8List _doubleBufferUint8;
+  Uint8List? _doubleBufferUint8;
 
   BufferedSink(this._sink);
 
@@ -89,12 +89,13 @@
   }
 
   void addDouble(double value) {
-    _doubleBufferUint8 ??= _doubleBuffer.buffer.asUint8List();
+    var doubleBufferUint8 =
+        _doubleBufferUint8 ??= _doubleBuffer.buffer.asUint8List();
     _doubleBuffer[0] = value;
-    addByte4(_doubleBufferUint8[0], _doubleBufferUint8[1],
-        _doubleBufferUint8[2], _doubleBufferUint8[3]);
-    addByte4(_doubleBufferUint8[4], _doubleBufferUint8[5],
-        _doubleBufferUint8[6], _doubleBufferUint8[7]);
+    addByte4(doubleBufferUint8[0], doubleBufferUint8[1], doubleBufferUint8[2],
+        doubleBufferUint8[3]);
+    addByte4(doubleBufferUint8[4], doubleBufferUint8[5], doubleBufferUint8[6],
+        doubleBufferUint8[7]);
   }
 
   void flush() {
@@ -124,7 +125,7 @@
   /// Write the [value] as UTF8 encoded byte array.
   void writeStringUtf8(String value) {
     var bytes = utf8.encode(value);
-    writeUint8List(bytes);
+    writeUint8List(bytes as Uint8List);
   }
 
   @pragma("vm:prefer-inline")
diff --git a/pkg/analyzer/lib/src/summary2/default_types_builder.dart b/pkg/analyzer/lib/src/summary2/default_types_builder.dart
index 2dcb918..103f87e 100644
--- a/pkg/analyzer/lib/src/summary2/default_types_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/default_types_builder.dart
@@ -13,33 +13,32 @@
 import 'package:analyzer/src/summary2/named_type_builder.dart';
 import 'package:analyzer/src/summary2/type_builder.dart';
 import 'package:analyzer/src/util/graph.dart';
-import 'package:meta/meta.dart';
 
 class DefaultTypesBuilder {
   void build(List<AstNode> nodes) {
     for (var node in nodes) {
       if (node is ClassDeclaration) {
-        var element = node.declaredElement;
+        var element = node.declaredElement!;
         _breakSelfCycles(node.typeParameters);
         _breakRawTypeCycles(element, node.typeParameters);
         _computeBounds(element, node.typeParameters);
       } else if (node is ClassTypeAlias) {
-        var element = node.declaredElement;
+        var element = node.declaredElement!;
         _breakSelfCycles(node.typeParameters);
         _breakRawTypeCycles(element, node.typeParameters);
         _computeBounds(element, node.typeParameters);
       } else if (node is FunctionTypeAlias) {
-        var element = node.declaredElement;
+        var element = node.declaredElement!;
         _breakSelfCycles(node.typeParameters);
         _breakRawTypeCycles(element, node.typeParameters);
         _computeBounds(element, node.typeParameters);
       } else if (node is GenericTypeAlias) {
-        var element = node.declaredElement;
+        var element = node.declaredElement!;
         _breakSelfCycles(node.typeParameters);
         _breakRawTypeCycles(element, node.typeParameters);
         _computeBounds(element, node.typeParameters);
       } else if (node is MixinDeclaration) {
-        var element = node.declaredElement;
+        var element = node.declaredElement!;
         _breakSelfCycles(node.typeParameters);
         _breakRawTypeCycles(element, node.typeParameters);
         _computeBounds(element, node.typeParameters);
@@ -62,7 +61,7 @@
 
   void _breakRawTypeCycles(
     Element declarationElement,
-    TypeParameterList parameterList,
+    TypeParameterList? parameterList,
   ) {
     if (parameterList == null) return;
 
@@ -73,7 +72,7 @@
 
       var cycles = _findRawTypePathsToDeclaration(
         parameter,
-        boundNode.type,
+        boundNode.type!,
         declarationElement,
         Set<Element>.identity(),
       );
@@ -92,11 +91,11 @@
     }
   }
 
-  void _breakSelfCycles(TypeParameterList parameterList) {
+  void _breakSelfCycles(TypeParameterList? parameterList) {
     if (parameterList == null) return;
     var typeParameters = parameterList.typeParameters;
 
-    Map<String, TypeParameter> typeParametersByName;
+    Map<String, TypeParameter>? typeParametersByName;
     for (var parameter in typeParameters) {
       var boundNode = parameter.bound;
       if (boundNode is TypeName) {
@@ -108,7 +107,7 @@
           }
         }
 
-        var current = parameter;
+        TypeParameter? current = parameter;
         for (var step = 0;
             current != null && step < typeParameters.length;
             ++step) {
@@ -132,7 +131,7 @@
   }
 
   /// Build actual default type [DartType]s from computed [TypeBuilder]s.
-  void _build(TypeParameterList parameterList) {
+  void _build(TypeParameterList? parameterList) {
     if (parameterList == null) return;
 
     for (var parameter in parameterList.typeParameters) {
@@ -149,24 +148,25 @@
   /// arguments on raw types with the given type parameters.
   void _computeBounds(
     Element declarationElement,
-    TypeParameterList parameterList,
+    TypeParameterList? parameterList,
   ) {
     if (parameterList == null) return;
 
-    var typeProvider = declarationElement.library.typeProvider;
+    var library = declarationElement.library!;
+    var typeProvider = library.typeProvider;
     var dynamicType = DynamicTypeImpl.instance;
-    var bottomType = declarationElement.library.isNonNullableByDefault
+    var bottomType = library.isNonNullableByDefault
         ? NeverTypeImpl.instance
         : typeProvider.nullType;
 
     var nodes = parameterList.typeParameters;
     var length = nodes.length;
-    var elements = List<TypeParameterElementImpl>.filled(length, null);
-    var bounds = List<DartType>.filled(length, null);
+    var elements = <TypeParameterElementImpl>[];
+    var bounds = <DartType>[];
     for (int i = 0; i < length; i++) {
       var node = nodes[i];
-      elements[i] = node.declaredElement;
-      bounds[i] = node.bound?.type ?? dynamicType;
+      elements.add(node.declaredElement as TypeParameterElementImpl);
+      bounds.add(node.bound?.type ?? dynamicType);
     }
 
     var graph = _TypeParametersGraph(elements, bounds);
@@ -234,14 +234,15 @@
           ]);
         } else if (visited.add(startType.element)) {
           void recurseParameters(List<TypeParameterElement> parameters) {
-            for (TypeParameterElementImpl parameter in parameters) {
-              TypeParameter parameterNode = parameter.linkedNode;
+            for (var parameter in parameters) {
+              var parameterImpl = parameter as TypeParameterElementImpl;
+              var parameterNode = parameterImpl.linkedNode as TypeParameter;
               // TODO(scheglov) How to we skip already linked?
               var bound = parameterNode.bound;
               if (bound != null) {
                 var tails = _findRawTypePathsToDeclaration(
                   parameterNode,
-                  bound.type,
+                  bound.type!,
                   end,
                   visited,
                 );
@@ -310,11 +311,11 @@
 /// declaration.
 class _TypeParametersGraph implements Graph<int> {
   @override
-  List<int> vertices;
+  final List<int> vertices = [];
 
   // Each `edges[i]` is the list of indices of type parameters that reference
   // the type parameter with the index `i` in their bounds.
-  List<List<int>> _edges;
+  final List<List<int>> _edges = [];
 
   final Map<TypeParameterElement, int> _parameterToIndex = Map.identity();
 
@@ -324,11 +325,9 @@
   ) {
     assert(parameters.length == bounds.length);
 
-    vertices = List<int>.filled(parameters.length, null);
-    _edges = List<List<int>>.filled(parameters.length, null);
-    for (int i = 0; i < vertices.length; i++) {
-      vertices[i] = i;
-      _edges[i] = <int>[];
+    for (int i = 0; i < parameters.length; i++) {
+      vertices.add(i);
+      _edges.add(<int>[]);
       _parameterToIndex[parameters[i]] = i;
     }
 
@@ -344,7 +343,7 @@
   }
 
   /// Collect references to the [index]th type parameter from the [type].
-  void _collectReferencesFrom(int index, DartType type) {
+  void _collectReferencesFrom(int index, DartType? type) {
     if (type is FunctionTypeBuilder) {
       for (var parameter in type.typeFormals) {
         _collectReferencesFrom(index, parameter.bound);
@@ -372,10 +371,10 @@
   Variance _variance;
 
   _UpperLowerReplacementVisitor({
-    @required Map<TypeParameterElement, DartType> upper,
-    @required Map<TypeParameterElement, DartType> lower,
-    @required Variance variance,
-  })  : _upper = upper,
+    required Map<TypeParameterElement, DartType> upper,
+    required Map<TypeParameterElement, DartType> lower,
+    required Variance variance,
+  })   : _upper = upper,
         _lower = lower,
         _variance = variance;
 
@@ -393,7 +392,7 @@
   }
 
   @override
-  DartType visitTypeArgument(
+  DartType? visitTypeArgument(
     TypeParameterElement parameter,
     DartType argument,
   ) {
@@ -409,7 +408,7 @@
   }
 
   @override
-  DartType visitTypeParameterType(TypeParameterType type) {
+  DartType? visitTypeParameterType(TypeParameterType type) {
     if (_variance == Variance.contravariant) {
       return _lower[type.element];
     } else {
diff --git a/pkg/analyzer/lib/src/summary2/default_value_resolver.dart b/pkg/analyzer/lib/src/summary2/default_value_resolver.dart
index 1e49400..9566af2 100644
--- a/pkg/analyzer/lib/src/summary2/default_value_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/default_value_resolver.dart
@@ -17,19 +17,19 @@
   final LibraryElementImpl _libraryElement;
   final TypeSystemImpl _typeSystem;
 
-  ClassElement _classElement;
-  CompilationUnitElement _unitElement;
-  ExecutableElement _executableElement;
-  Scope _scope;
+  late CompilationUnitElementImpl _unitElement;
+  ClassElement? _classElement;
+  late ExecutableElement _executableElement;
+  late Scope _scope;
 
-  AstResolver _astResolver;
+  AstResolver? _astResolver;
 
   DefaultValueResolver(this._linker, this._libraryElement)
       : _typeSystem = _libraryElement.typeSystem;
 
   void resolve() {
-    for (CompilationUnitElementImpl unit in _libraryElement.units) {
-      _unitElement = unit;
+    for (var unit in _libraryElement.units) {
+      _unitElement = unit as CompilationUnitElementImpl;
 
       for (var extensionElement in unit.extensions) {
         _extension(extensionElement);
@@ -53,12 +53,12 @@
     _classElement = classElement;
 
     for (var element in classElement.constructors) {
-      _constructor(element);
+      _constructor(element as ConstructorElementImpl);
     }
 
     for (var element in classElement.methods) {
       _setScopeFromElement(element);
-      _method(element);
+      _method(element as MethodElementImpl);
     }
 
     _classElement = null;
@@ -77,11 +77,11 @@
   void _extension(ExtensionElement extensionElement) {
     for (var element in extensionElement.methods) {
       _setScopeFromElement(element);
-      _method(element);
+      _method(element as MethodElementImpl);
     }
   }
 
-  void _function(FunctionElementImpl element) {
+  void _function(FunctionElement element) {
     _astResolver = null;
     _executableElement = element;
     _setScopeFromElement(element);
@@ -100,7 +100,7 @@
   void _parameter(ParameterElementImpl parameter) {
     // If a function typed parameter, process nested parameters.
     for (var localParameter in parameter.parameters) {
-      _parameter(localParameter);
+      _parameter(localParameter as ParameterElementImpl);
     }
 
     var node = _defaultParameter(parameter);
@@ -108,11 +108,12 @@
 
     var contextType = _typeSystem.eliminateTypeVariables(parameter.type);
 
-    _astResolver ??= AstResolver(_linker, _unitElement, _scope);
-    _astResolver.resolve(
-      node.defaultValue,
+    var astResolver =
+        _astResolver ??= AstResolver(_linker, _unitElement, _scope);
+    astResolver.resolve(
+      node.defaultValue!,
       () {
-        var defaultValue = node.defaultValue;
+        var defaultValue = node.defaultValue!;
         InferenceContext.setType(defaultValue, contextType);
         return defaultValue;
       },
@@ -123,15 +124,15 @@
 
   void _parameters(List<ParameterElement> parameters) {
     for (var parameter in parameters) {
-      _parameter(parameter);
+      _parameter(parameter as ParameterElementImpl);
     }
   }
 
   void _setScopeFromElement(Element element) {
-    _scope = LinkingNodeContext.get((element as ElementImpl).linkedNode).scope;
+    _scope = LinkingNodeContext.get((element as ElementImpl).linkedNode!).scope;
   }
 
-  static DefaultFormalParameter _defaultParameter(
+  static DefaultFormalParameter? _defaultParameter(
       ParameterElementImpl element) {
     var node = element.linkedNode;
     if (node is DefaultFormalParameter && node.defaultValue != null) {
diff --git a/pkg/analyzer/lib/src/summary2/export.dart b/pkg/analyzer/lib/src/summary2/export.dart
index a84d39e..2f5e590 100644
--- a/pkg/analyzer/lib/src/summary2/export.dart
+++ b/pkg/analyzer/lib/src/summary2/export.dart
@@ -8,17 +8,15 @@
 
 class Export {
   final LibraryBuilder exporter;
-  final LibraryBuilder exported;
+  final LibraryBuilder? exported;
   final List<Combinator> combinators;
 
   Export(this.exporter, this.exported, this.combinators);
 
   bool addToExportScope(String name, Reference reference) {
-    if (combinators != null) {
-      for (Combinator combinator in combinators) {
-        if (combinator.isShow && !combinator.matches(name)) return false;
-        if (combinator.isHide && combinator.matches(name)) return false;
-      }
+    for (Combinator combinator in combinators) {
+      if (combinator.isShow && !combinator.matches(name)) return false;
+      if (combinator.isHide && combinator.matches(name)) return false;
     }
     return exporter.addToExportScope(name, reference);
   }
diff --git a/pkg/analyzer/lib/src/summary2/function_type_builder.dart b/pkg/analyzer/lib/src/summary2/function_type_builder.dart
index 4fd730d..bdbc0ba 100644
--- a/pkg/analyzer/lib/src/summary2/function_type_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/function_type_builder.dart
@@ -28,13 +28,13 @@
   /// The node for which this builder is created, or `null` if the builder
   /// was detached from its node, e.g. during computing default types for
   /// type parameters.
-  final GenericFunctionTypeImpl node;
+  final GenericFunctionTypeImpl? node;
 
   /// The actual built type, not a [TypeBuilder] anymore.
   ///
   /// When [build] is called, the type is built, stored into this field,
   /// and set for the [node].
-  DartType _type;
+  DartType? _type;
 
   FunctionTypeBuilder(
     this.typeFormals,
@@ -47,7 +47,7 @@
   /// [isNNBD] indicates whether the containing library is opted into NNBD.
   factory FunctionTypeBuilder.of(
     bool isNNBD,
-    GenericFunctionType node,
+    GenericFunctionTypeImpl node,
     NullabilitySuffix nullabilitySuffix,
   ) {
     return FunctionTypeBuilder(
@@ -60,7 +60,7 @@
   }
 
   @override
-  Element get element => null;
+  Element? get element => null;
 
   @override
   R accept<R>(TypeVisitor<R> visitor) {
@@ -75,15 +75,19 @@
   @override
   DartType build() {
     if (_type != null) {
-      return _type;
+      return _type!;
     }
 
-    for (TypeParameterElementImpl typeParameter in typeFormals) {
-      typeParameter.bound = _buildType(typeParameter.bound);
+    for (var typeParameter in typeFormals) {
+      var typeParameterImpl = typeParameter as TypeParameterElementImpl;
+      var bound = typeParameterImpl.bound;
+      if (bound != null) {
+        typeParameterImpl.bound = _buildType(bound);
+      }
     }
 
-    for (ParameterElementImpl parameter in parameters) {
-      parameter.type = _buildType(parameter.type);
+    for (var parameter in parameters) {
+      (parameter as ParameterElementImpl).type = _buildType(parameter.type);
     }
 
     var builtReturnType = _buildType(returnType);
@@ -95,10 +99,10 @@
     );
 
     if (node != null) {
-      node.type = _type;
+      node?.type = _type;
     }
 
-    return _type;
+    return _type!;
   }
 
   @override
@@ -160,11 +164,11 @@
   }
 
   /// Return the type of the [node] as is, possibly a [TypeBuilder].
-  static DartType _getNodeType(TypeAnnotation node) {
+  static DartType _getNodeType(TypeAnnotation? node) {
     if (node == null) {
       return _dynamicType;
     } else {
-      return node.type;
+      return node.type!;
     }
   }
 
@@ -197,8 +201,10 @@
     }
   }
 
-  static List<TypeParameterElement> _getTypeParameters(TypeParameterList node) {
+  static List<TypeParameterElement> _getTypeParameters(
+    TypeParameterList? node,
+  ) {
     if (node == null) return const [];
-    return node.typeParameters.map((n) => n.declaredElement).toList();
+    return node.typeParameters.map((n) => n.declaredElement!).toList();
   }
 }
diff --git a/pkg/analyzer/lib/src/summary2/library_builder.dart b/pkg/analyzer/lib/src/summary2/library_builder.dart
index cb2155b0b..e6532f5 100644
--- a/pkg/analyzer/lib/src/summary2/library_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/library_builder.dart
@@ -5,6 +5,7 @@
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart' as ast;
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/ast/ast.dart' as ast;
 import 'package:analyzer/src/dart/ast/mixin_super_invoked_names.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/scope.dart';
@@ -26,12 +27,12 @@
   final Linker linker;
   final Uri uri;
   final Reference reference;
-  List<Reference> exports;
+  late final List<Reference> exports;
 
-  LinkedLibraryContext context;
+  late final LinkedLibraryContext context;
 
-  LibraryElementImpl element;
-  LibraryScope scope;
+  late final LibraryElementImpl element;
+  late final LibraryScope scope;
 
   /// Local declarations.
   final Scope localScope = Scope.top();
@@ -45,9 +46,9 @@
 
   void addExporters() {
     var unitContext = context.definingUnit;
-    for (var directive in unitContext.unit.directives) {
+    for (var directive in unitContext.unit!.directives) {
       if (directive is ast.ExportDirective) {
-        Uri uri;
+        Uri? uri;
         try {
           uri = _selectAbsoluteUri(directive);
           if (uri == null) continue;
@@ -62,8 +63,9 @@
           } else if (node is ast.HideCombinator) {
             var nameList = node.hiddenNames.map((i) => i.name).toList();
             return Combinator.hide(nameList);
+          } else {
+            throw UnimplementedError();
           }
-          return null;
         }).toList();
 
         var exported = linker.builders[uri];
@@ -99,7 +101,7 @@
       var setterRef = unitRef.getChild('@setter');
       var variableRef = unitRef.getChild('@variable');
       var nextUnnamedExtensionId = 0;
-      for (var node in linkingUnit.unit.declarations) {
+      for (var node in linkingUnit.unit!.declarations) {
         if (node is ast.ClassDeclaration) {
           var name = node.name.name;
           var reference = classRef.getChild(name);
@@ -107,7 +109,9 @@
           localScope.declare(name, reference);
 
           ClassElementImpl.forLinkedNode(
-              linkingUnit.reference.element, reference, node);
+              linkingUnit.reference.element as CompilationUnitElementImpl,
+              reference,
+              node);
         } else if (node is ast.ClassTypeAlias) {
           var name = node.name.name;
           var reference = classRef.getChild(name);
@@ -115,7 +119,9 @@
           localScope.declare(name, reference);
 
           ClassElementImpl.forLinkedNode(
-              linkingUnit.reference.element, reference, node);
+              linkingUnit.reference.element as CompilationUnitElementImpl,
+              reference,
+              node);
         } else if (node is ast.EnumDeclaration) {
           var name = node.name.name;
           var reference = enumRef.getChild(name);
@@ -123,8 +129,10 @@
           localScope.declare(name, reference);
 
           EnumElementImpl.forLinkedNode(
-              linkingUnit.reference.element, reference, node);
-        } else if (node is ast.ExtensionDeclaration) {
+              linkingUnit.reference.element as CompilationUnitElementImpl,
+              reference,
+              node);
+        } else if (node is ast.ExtensionDeclarationImpl) {
           var name = node.name?.name;
           var refName = name ?? 'extension-${nextUnnamedExtensionId++}';
 
@@ -136,7 +144,9 @@
           }
 
           ExtensionElementImpl.forLinkedNode(
-              linkingUnit.reference.element, reference, node);
+              linkingUnit.reference.element as CompilationUnitElementImpl,
+              reference,
+              node);
         } else if (node is ast.FunctionDeclaration) {
           var name = node.name.name;
 
@@ -144,15 +154,15 @@
           if (node.isGetter) {
             reference = getterRef.getChild(name);
             PropertyAccessorElementImpl.forLinkedNode(
-                linkingUnit.reference.element, reference, node);
+                linkingUnit.reference.element as ElementImpl, reference, node);
           } else if (node.isSetter) {
             reference = setterRef.getChild(name);
             PropertyAccessorElementImpl.forLinkedNode(
-                linkingUnit.reference.element, reference, node);
+                linkingUnit.reference.element as ElementImpl, reference, node);
           } else {
             reference = functionRef.getChild(name);
             FunctionElementImpl.forLinkedNode(
-                linkingUnit.reference.element, reference, node);
+                linkingUnit.reference.element as ElementImpl, reference, node);
           }
 
           reference.node ??= node;
@@ -169,7 +179,9 @@
           localScope.declare(name, reference);
 
           TypeAliasElementImpl.forLinkedNodeFactory(
-              linkingUnit.reference.element, reference, node);
+              linkingUnit.reference.element as CompilationUnitElementImpl,
+              reference,
+              node);
         } else if (node is ast.GenericTypeAlias) {
           var name = node.name.name;
           var reference = typeAliasRef.getChild(name);
@@ -178,7 +190,9 @@
           localScope.declare(name, reference);
 
           TypeAliasElementImpl.forLinkedNodeFactory(
-              linkingUnit.reference.element, reference, node);
+              linkingUnit.reference.element as CompilationUnitElementImpl,
+              reference,
+              node);
         } else if (node is ast.MixinDeclaration) {
           var name = node.name.name;
           var reference = mixinRef.getChild(name);
@@ -186,7 +200,9 @@
           localScope.declare(name, reference);
 
           MixinElementImpl.forLinkedNode(
-              linkingUnit.reference.element, reference, node);
+              linkingUnit.reference.element as CompilationUnitElementImpl,
+              reference,
+              node);
         } else if (node is ast.TopLevelVariableDeclaration) {
           for (var variable in node.variables.variables) {
             var name = variable.name.name;
@@ -195,7 +211,9 @@
             reference.node ??= node;
 
             TopLevelVariableElementImpl.forLinkedNode(
-                linkingUnit.reference.element, reference, variable);
+                linkingUnit.reference.element as CompilationUnitElementImpl,
+                reference,
+                variable);
 
             var getter = getterRef.getChild(name);
             localScope.declare(name, getter);
@@ -240,7 +258,7 @@
     // Store elements only for the defining unit of the library.
     var isDefiningUnit = true;
     for (var unitContext in context.units) {
-      for (var node in unitContext.unit.directives) {
+      for (var node in unitContext.unit!.directives) {
         if (node is ast.ExportDirective) {
           var exportElement = ExportElementImpl.forLinkedNode(element, node);
           if (isDefiningUnit) {
@@ -260,7 +278,7 @@
     element.exports = exports;
 
     if (!hasCoreImport) {
-      var dartCore = linker.elementFactory.libraryOfUri('dart:core');
+      var dartCore = linker.elementFactory.libraryOfUri2('dart:core');
       imports.add(
         ImportElementImpl(-1)
           ..importedLibrary = dartCore
@@ -272,9 +290,8 @@
   }
 
   void buildElement() {
-    linker.elementFactory.createLibraryElementForLinking(context);
-    element = reference.element;
-    assert(element != null);
+    element = linker.elementFactory.createLibraryElementForLinking(context)
+        as LibraryElementImpl;
   }
 
   void buildInitialExportScope() {
@@ -284,12 +301,12 @@
   }
 
   void buildScope() {
-    scope = element.scope;
+    scope = element.scope as LibraryScope;
   }
 
   void collectMixinSuperInvokedNames() {
     for (var unitContext in context.units) {
-      for (var declaration in unitContext.unit.declarations) {
+      for (var declaration in unitContext.unit!.declarations) {
         if (declaration is ast.MixinDeclaration) {
           var names = <String>{};
           var collector = MixinSuperInvokedNamesCollector(names);
@@ -314,9 +331,10 @@
   }
 
   void resolveMetadata() {
-    for (CompilationUnitElementImpl unit in element.units) {
+    for (var unit in element.units) {
+      var unitImpl = unit as CompilationUnitElementImpl;
       var resolver = MetadataResolver(linker, scope, unit);
-      unit.linkedNode.accept(resolver);
+      unitImpl.linkedNode!.accept(resolver);
     }
   }
 
@@ -329,16 +347,16 @@
         linker.elementFactory,
         element,
         unitReference,
-        unitContext.unit.featureSet.isEnabled(Feature.non_nullable),
+        unitContext.unit!.featureSet.isEnabled(Feature.non_nullable),
         scope,
       );
-      unitContext.unit.accept(resolver);
+      unitContext.unit!.accept(resolver);
     }
   }
 
   void resolveUriDirectives() {
     var unitContext = context.units[0];
-    for (var directive in unitContext.unit.directives) {
+    for (var directive in unitContext.unit!.directives) {
       if (directive is ast.NamespaceDirective) {
         try {
           var uri = _selectAbsoluteUri(directive);
@@ -370,7 +388,7 @@
     // }
   }
 
-  Uri _selectAbsoluteUri(ast.NamespaceDirective directive) {
+  Uri? _selectAbsoluteUri(ast.NamespaceDirective directive) {
     var relativeUriStr = _selectRelativeUri(
       directive.configurations,
       directive.uri.stringValue,
@@ -382,9 +400,9 @@
     return resolveRelativeUri(uri, relativeUri);
   }
 
-  String _selectRelativeUri(
+  String? _selectRelativeUri(
     List<ast.Configuration> configurations,
-    String defaultUri,
+    String? defaultUri,
   ) {
     for (var configuration in configurations) {
       var name = configuration.name.components.join('.');
@@ -406,8 +424,7 @@
     var unitRef = reference.getChild('@unit');
     var unitIndex = 0;
     for (var inputUnit in inputLibrary.units) {
-      var source = inputUnit.source;
-      var uriStr = source != null ? '${source.uri}' : '';
+      var uriStr = inputUnit.uriStr;
       var reference = unitRef.getChild(uriStr);
       context.units.add(
         LinkedUnitContext(
diff --git a/pkg/analyzer/lib/src/summary2/link.dart b/pkg/analyzer/lib/src/summary2/link.dart
index 96e45c6..67797c4 100644
--- a/pkg/analyzer/lib/src/summary2/link.dart
+++ b/pkg/analyzer/lib/src/summary2/link.dart
@@ -19,7 +19,6 @@
 import 'package:analyzer/src/summary2/type_alias.dart';
 import 'package:analyzer/src/summary2/types_builder.dart';
 import 'package:analyzer/src/summary2/variance_builder.dart';
-import 'package:meta/meta.dart';
 
 var timerLinkingLinkingBundle = Stopwatch();
 var timerLinkingRemoveBundle = Stopwatch();
@@ -44,11 +43,11 @@
   /// Libraries that are being linked.
   final Map<Uri, LibraryBuilder> builders = {};
 
-  InheritanceManager3 inheritance; // TODO(scheglov) cache it
+  late InheritanceManager3 inheritance; // TODO(scheglov) cache it
 
-  BundleWriter bundleWriter;
-  Uint8List astBytes;
-  Uint8List resolutionBytes;
+  late BundleWriter bundleWriter;
+  late Uint8List astBytes;
+  late Uint8List resolutionBytes;
 
   Linker(this.elementFactory, this.withInformative);
 
@@ -172,8 +171,8 @@
   }
 
   void _createTypeSystem() {
-    var coreLib = elementFactory.libraryOfUri('dart:core');
-    var asyncLib = elementFactory.libraryOfUri('dart:async');
+    var coreLib = elementFactory.libraryOfUri2('dart:core');
+    var asyncLib = elementFactory.libraryOfUri2('dart:async');
     elementFactory.createTypeProviders(coreLib, asyncLib);
 
     inheritance = InheritanceManager3();
@@ -240,7 +239,7 @@
             return UnitToWriteResolution(
               uriStr: e.uriStr,
               partUriStr: e.partUriStr,
-              node: e.unit,
+              node: e.unit!,
               isSynthetic: e.isSynthetic,
             );
           }).toList(),
@@ -266,7 +265,7 @@
 }
 
 class LinkInputUnit {
-  final String partUriStr;
+  final String? partUriStr;
   final Source source;
   final bool isSynthetic;
   final CompilationUnit unit;
@@ -279,9 +278,6 @@
   );
 
   String get uriStr {
-    if (source == null) {
-      return '';
-    }
     return '${source.uri}';
   }
 }
@@ -291,7 +287,7 @@
   final Uint8List resolutionBytes;
 
   LinkResult({
-    @required this.astBytes,
-    @required this.resolutionBytes,
+    required this.astBytes,
+    required this.resolutionBytes,
   });
 }
diff --git a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
index b92ebe9..44aa3ee 100644
--- a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
+++ b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
@@ -6,6 +6,7 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/context/context.dart';
 import 'package:analyzer/src/dart/analysis/session.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/resolver/scope.dart';
@@ -62,13 +63,13 @@
           '[exportedReference: $exportedReference]',
         );
       }
-      exportedNames[element.name] = element;
+      exportedNames[element.name!] = element;
     }
 
     return Namespace(exportedNames);
   }
 
-  LibraryElementImpl createLibraryElementForLinking(
+  LibraryElementImpl? createLibraryElementForLinking(
     LinkedLibraryContext libraryContext,
   ) {
     var sourceFactory = analysisContext.sourceFactory;
@@ -79,7 +80,7 @@
     if (librarySource == null) return null;
 
     var definingUnitContext = libraryContext.units[0];
-    var definingUnitNode = definingUnitContext.unit;
+    var definingUnitNode = definingUnitContext.unit!;
 
     // TODO(scheglov) Do we need this?
     var name = '';
@@ -109,9 +110,11 @@
     var units = <CompilationUnitElementImpl>[];
     var unitContainerRef = libraryContext.reference.getChild('@unit');
     for (var unitContext in libraryContext.units) {
-      var unitNode = unitContext.unit;
+      var unitNode = unitContext.unit as CompilationUnitImpl;
 
       var unitSource = sourceFactory.forUri(unitContext.uriStr);
+      if (unitSource == null) continue;
+
       var unitElement = CompilationUnitElementImpl.forLinkedNode(
         libraryElement,
         unitContext,
@@ -133,7 +136,7 @@
     return libraryElement;
   }
 
-  LibraryElementImpl createLibraryElementForReading(String uriStr) {
+  LibraryElementImpl? createLibraryElementForReading(String uriStr) {
     var sourceFactory = analysisContext.sourceFactory;
     var librarySource = sourceFactory.forUri(uriStr);
 
@@ -185,9 +188,11 @@
 
     var units = <CompilationUnitElementImpl>[];
     for (var unitContext in unitContexts) {
-      var unitNode = unitContext.unit;
+      var unitNode = unitContext.unit as CompilationUnitImpl;
 
       var unitSource = sourceFactory.forUri(unitContext.uriStr);
+      if (unitSource == null) continue;
+
       var unitElement = CompilationUnitElementImpl.forLinkedNode(
         libraryElement,
         unitContext,
@@ -213,7 +218,7 @@
     LibraryElementImpl /*!*/ dartCore,
     LibraryElementImpl /*!*/ dartAsync,
   ) {
-    if (analysisContext.typeProviderNonNullableByDefault != null) {
+    if (analysisContext.hasTypeProvider) {
       return;
     }
 
@@ -233,14 +238,14 @@
     // During linking we create libraries when typeProvider is not ready.
     // Update these libraries now, when typeProvider is ready.
     for (var reference in rootReference.children) {
-      var libraryElement = reference.element as LibraryElementImpl;
-      if (libraryElement != null && libraryElement.typeProvider == null) {
+      var libraryElement = reference.element as LibraryElementImpl?;
+      if (libraryElement != null && !libraryElement.hasTypeProviderSystemSet) {
         _setLibraryTypeSystem(libraryElement);
       }
     }
   }
 
-  Element elementOfReference(Reference reference) {
+  Element? elementOfReference(Reference reference) {
     if (reference.element != null) {
       return reference.element;
     }
@@ -253,7 +258,7 @@
       return createLibraryElementForReading(uriStr);
     }
 
-    var parent = reference.parent.parent;
+    var parent = reference.parent!.parent!;
     var parentElement = elementOfReference(parent);
 
     // Named formal parameters are created when we apply resolution to the
@@ -292,75 +297,87 @@
     }
 
     // For class, mixin, extension - index members.
-    parent.nodeAccessor.readIndex();
+    parent.nodeAccessor!.readIndex();
 
     // For any element - class, method, etc - read the node.
-    var node = reference.nodeAccessor.node;
+    var node = reference.nodeAccessor!.node;
 
     if (node is ClassDeclaration) {
-      ClassElementImpl.forLinkedNode(parentElement, reference, node);
+      ClassElementImpl.forLinkedNode(
+          parentElement as CompilationUnitElementImpl, reference, node);
       assert(reference.element != null);
       return reference.element;
     } else if (node is ClassTypeAlias) {
-      ClassElementImpl.forLinkedNode(parentElement, reference, node);
+      ClassElementImpl.forLinkedNode(
+          parentElement as CompilationUnitElementImpl, reference, node);
       assert(reference.element != null);
       return reference.element;
-    } else if (node is ConstructorDeclaration) {
-      ConstructorElementImpl.forLinkedNode(parentElement, reference, node);
+    } else if (node is ConstructorDeclarationImpl) {
+      ConstructorElementImpl.forLinkedNode(
+          parentElement as ClassElementImpl, reference, node);
       var element = reference.element as ConstructorElementImpl;
-      assert(element != null);
       return element;
     } else if (node is EnumDeclaration) {
-      EnumElementImpl.forLinkedNode(parentElement, reference, node);
+      EnumElementImpl.forLinkedNode(
+          parentElement as CompilationUnitElementImpl, reference, node);
       assert(reference.element != null);
       return reference.element;
-    } else if (node is ExtensionDeclaration) {
-      ExtensionElementImpl.forLinkedNode(parentElement, reference, node);
+    } else if (node is ExtensionDeclarationImpl) {
+      ExtensionElementImpl.forLinkedNode(
+          parentElement as CompilationUnitElementImpl, reference, node);
       assert(reference.element != null);
       return reference.element;
     } else if (node is FieldDeclaration) {
       var variable = _variableDeclaration(node.fields, reference.name);
       if (variable.isConst) {
-        ConstFieldElementImpl.forLinkedNode(parentElement, reference, variable);
+        ConstFieldElementImpl.forLinkedNode(
+            parentElement as ElementImpl, reference, variable);
       } else {
         FieldElementImpl.forLinkedNodeFactory(
-            parentElement, reference, variable);
+            parentElement as ElementImpl, reference, variable);
       }
       assert(reference.element != null);
       return reference.element;
     } else if (node is FunctionDeclaration) {
       if (node.propertyKeyword != null) {
-        _topLevelPropertyAccessor(parent, parentElement, reference, node);
+        _topLevelPropertyAccessor(parent,
+            parentElement as CompilationUnitElementImpl, reference, node);
       } else {
-        FunctionElementImpl.forLinkedNode(parentElement, reference, node);
+        FunctionElementImpl.forLinkedNode(
+            parentElement as CompilationUnitElementImpl, reference, node);
       }
       assert(reference.element != null);
       return reference.element;
     } else if (node is FunctionTypeAlias || node is GenericTypeAlias) {
-      TypeAliasElementImpl.forLinkedNodeFactory(parentElement, reference, node);
+      TypeAliasElementImpl.forLinkedNodeFactory(
+          parentElement as CompilationUnitElementImpl,
+          reference,
+          node as TypeAlias);
       assert(reference.element != null);
       return reference.element;
     } else if (node is MethodDeclaration) {
       if (node.propertyKeyword != null) {
-        PropertyAccessorElementImpl.forLinkedNode(
-            parentElement, reference, node);
+        _classPropertyAccessor(
+            parent, parentElement as ElementImpl, reference, node);
       } else {
-        MethodElementImpl.forLinkedNode(parentElement, reference, node);
+        MethodElementImpl.forLinkedNode(
+            parentElement as TypeParameterizedElementMixin, reference, node);
       }
       assert(reference.element != null);
       return reference.element;
     } else if (node is MixinDeclaration) {
-      MixinElementImpl.forLinkedNode(parentElement, reference, node);
+      MixinElementImpl.forLinkedNode(
+          parentElement as CompilationUnitElementImpl, reference, node);
       assert(reference.element != null);
       return reference.element;
     } else if (node is TopLevelVariableDeclaration) {
       var variable = _variableDeclaration(node.variables, reference.name);
       if (variable.isConst) {
         ConstTopLevelVariableElementImpl.forLinkedNode(
-            parentElement, reference, variable);
+            parentElement as ElementImpl, reference, variable);
       } else {
         TopLevelVariableElementImpl.forLinkedNode(
-            parentElement, reference, variable);
+            parentElement as CompilationUnitElementImpl, reference, variable);
       }
       assert(reference.element != null);
       return reference.element;
@@ -386,13 +403,21 @@
   }
 
   bool isLibraryUri(String uriStr) {
-    var libraryContext = libraryReaders[uriStr];
+    var libraryContext = libraryReaders[uriStr]!;
     return !libraryContext.hasPartOfDirective;
   }
 
-  LibraryElementImpl libraryOfUri(String uriStr) {
+  LibraryElementImpl? libraryOfUri(String uriStr) {
     var reference = rootReference.getChild(uriStr);
-    return elementOfReference(reference);
+    return elementOfReference(reference) as LibraryElementImpl?;
+  }
+
+  LibraryElementImpl libraryOfUri2(String uriStr) {
+    var element = libraryOfUri(uriStr);
+    if (element == null) {
+      throw StateError('No library: $uriStr');
+    }
+    return element;
   }
 
   /// We have linked the bundle, and need to disconnect its libraries, so
@@ -434,6 +459,42 @@
     analysisSession.inheritanceManager.removeOfLibraries(uriStrSet);
   }
 
+  void _classPropertyAccessor(
+    Reference parentReference,
+    ElementImpl parentElement,
+    Reference reference,
+    MethodDeclaration node,
+  ) {
+    var accessor = PropertyAccessorElementImpl.forLinkedNode(
+        parentElement, reference, node);
+
+    var name = reference.name;
+    var fieldRef = parentReference.getChild('@field').getChild(name);
+    var field = fieldRef.element as FieldElementImpl?;
+    if (field == null) {
+      field = FieldElementImpl(name, -1);
+      fieldRef.element = field;
+      field.enclosingElement = parentElement;
+      field.isSynthetic = true;
+      field.isFinal = node.isGetter;
+      field.isStatic = accessor.isStatic;
+    } else {
+      field.isFinal = false;
+    }
+
+    var isSetter = node.isSetter;
+    if (isSetter) {
+      field.isFinal = false;
+    }
+
+    accessor.variable = field;
+    if (isSetter) {
+      field.setter = accessor;
+    } else {
+      field.getter = accessor;
+    }
+  }
+
   void _declareDartCoreDynamicNever() {
     var dartCoreRef = rootReference.getChild('dart:core');
     dartCoreRef.getChild('dynamic').element = DynamicElementImpl.instance;
@@ -444,7 +505,7 @@
     // During linking we create libraries when typeProvider is not ready.
     // And if we link dart:core and dart:async, we cannot create it.
     // We will set typeProvider later, during [createTypeProviders].
-    if (analysisContext.typeProviderNonNullableByDefault == null) {
+    if (!analysisContext.hasTypeProvider) {
       return;
     }
 
@@ -455,6 +516,7 @@
     libraryElement.typeSystem = isNonNullable
         ? analysisContext.typeSystemNonNullableByDefault
         : analysisContext.typeSystemLegacy;
+    libraryElement.hasTypeProviderSystemSet = true;
 
     libraryElement.createLoadLibraryFunction();
   }
@@ -470,7 +532,7 @@
 
     var name = reference.name;
     var fieldRef = parentReference.getChild('@field').getChild(name);
-    var field = fieldRef.element as TopLevelVariableElementImpl;
+    var field = fieldRef.element as TopLevelVariableElementImpl?;
     if (field == null) {
       field = TopLevelVariableElementImpl(name, -1);
       fieldRef.element = field;
diff --git a/pkg/analyzer/lib/src/summary2/linked_unit_context.dart b/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
index cf7722d..12d1a56 100644
--- a/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
+++ b/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
@@ -13,27 +13,26 @@
 import 'package:analyzer/src/summary2/linked_element_factory.dart';
 import 'package:analyzer/src/summary2/linked_library_context.dart';
 import 'package:analyzer/src/summary2/reference.dart';
-import 'package:meta/meta.dart';
 
 /// The context of a unit - the context of the bundle, and the unit tokens.
 class LinkedUnitContext {
   final LinkedLibraryContext libraryContext;
   final int indexInLibrary;
-  final String partUriStr;
+  final String? partUriStr;
   final String uriStr;
   final Reference reference;
   final bool isSynthetic;
-  final CompilationUnit unit;
-  final UnitReader unitReader;
+  final CompilationUnit? unit;
+  final UnitReader? unitReader;
 
   bool _hasDirectivesRead = false;
 
   LinkedUnitContext(this.libraryContext, this.indexInLibrary, this.partUriStr,
       this.uriStr, this.reference, this.isSynthetic,
-      {@required this.unit, @required this.unitReader});
+      {required this.unit, required this.unitReader});
 
   CompilationUnitElementImpl get element {
-    return reference.element;
+    return reference.element as CompilationUnitElementImpl;
   }
 
   LinkedElementFactory get elementFactory => libraryContext.elementFactory;
@@ -58,7 +57,7 @@
 
   CompilationUnit get unit_withDeclarations {
     unitReader?.readDeclarations();
-    return unit;
+    return unit!;
   }
 
   /// Ensure that [unit] has directives ready (because we are linking,
@@ -67,9 +66,10 @@
   CompilationUnit get unit_withDirectives {
     if (unitReader != null && !_hasDirectivesRead) {
       _hasDirectivesRead = true;
-      unitReader.readDirectives();
-      var libraryElement = libraryContext.reference.element;
-      for (var directive in unit.directives) {
+      unitReader!.readDirectives();
+      var libraryElement =
+          libraryContext.reference.element as LibraryElementImpl;
+      for (var directive in unit!.directives) {
         if (directive is ExportDirective) {
           if (directive.element == null) {
             ExportElementImpl.forLinkedNode(libraryElement, directive);
@@ -81,12 +81,12 @@
         }
       }
     }
-    return unit;
+    return unit!;
   }
 
   void applyResolution(AstNode node) {
     if (node is VariableDeclaration) {
-      node = node.parent.parent;
+      node = node.parent!.parent!;
     }
     if (node is HasAstLinkedContext) {
       var astLinkedContext = (node as HasAstLinkedContext).linkedContext;
@@ -98,7 +98,7 @@
     var containerRef = this.reference.getChild('@genericFunctionType');
     var reference = containerRef.getChild('$id');
     var element = GenericFunctionTypeElementImpl.forLinkedNode(
-      this.reference.element,
+      this.reference.element as ElementImpl,
       reference,
       node,
     );
@@ -112,7 +112,7 @@
     }
 
     if (node is CompilationUnitImpl) {
-      var data = node.summaryData as SummaryDataForCompilationUnit;
+      var data = node.summaryData as SummaryDataForCompilationUnit?;
       if (data != null) {
         return data.codeLength;
       } else {
@@ -125,8 +125,8 @@
     } else if (node is TypeParameter) {
       return node.length;
     } else if (node is VariableDeclaration) {
-      var parent2 = node.parent.parent;
-      var linked = (parent2 as HasAstLinkedContext).linkedContext;
+      var parent2 = node.parent!.parent!;
+      var linked = (parent2 as HasAstLinkedContext).linkedContext!;
       return linked.getVariableDeclarationCodeLength(node);
     }
     throw UnimplementedError('${node.runtimeType}');
@@ -147,8 +147,8 @@
     } else if (node is TypeParameter) {
       return node.offset;
     } else if (node is VariableDeclaration) {
-      var parent2 = node.parent.parent;
-      var linked = (parent2 as HasAstLinkedContext).linkedContext;
+      var parent2 = node.parent!.parent!;
+      var linked = (parent2 as HasAstLinkedContext).linkedContext!;
       return linked.getVariableDeclarationCodeOffset(node);
     }
     throw UnimplementedError('${node.runtimeType}');
@@ -160,30 +160,30 @@
     return node.initializers;
   }
 
-  ConstructorName getConstructorRedirected(ConstructorDeclaration node) {
+  ConstructorName? getConstructorRedirected(ConstructorDeclaration node) {
     return node.redirectedConstructor;
   }
 
-  List<ConstructorDeclaration> getConstructors(AstNode node) {
+  List<ConstructorDeclarationImpl> getConstructors(AstNode node) {
     if (node is ClassOrMixinDeclaration) {
       return _getClassOrExtensionOrMixinMembers(node)
-          .whereType<ConstructorDeclaration>()
+          .whereType<ConstructorDeclarationImpl>()
           .toList();
     }
-    return const <ConstructorDeclaration>[];
+    return const <ConstructorDeclarationImpl>[];
   }
 
   int getDirectiveOffset(Directive node) {
     return node.keyword.offset;
   }
 
-  Comment getDocumentationComment(AstNode node) {
+  Comment? getDocumentationComment(AstNode node) {
     if (node is HasAstLinkedContext) {
       var linkedContext = (node as HasAstLinkedContext).linkedContext;
       linkedContext?.readDocumentationComment();
       return (node as AnnotatedNode).documentationComment;
     } else if (node is VariableDeclaration) {
-      return getDocumentationComment(node.parent.parent);
+      return getDocumentationComment(node.parent!.parent!);
     } else {
       throw UnimplementedError('${node.runtimeType}');
     }
@@ -215,11 +215,12 @@
       return getFormalParameterName(node.parameter);
     } else if (node is NormalFormalParameter) {
       return node.identifier?.name ?? '';
+    } else {
+      throw UnimplementedError('${node.runtimeType}');
     }
-    return null;
   }
 
-  List<FormalParameter> getFormalParameters(AstNode node) {
+  List<FormalParameter>? getFormalParameters(AstNode node) {
     if (node is ConstructorDeclaration) {
       return node.parameters.parameters;
     } else if (node is FunctionDeclaration) {
@@ -247,7 +248,7 @@
     }
   }
 
-  ImplementsClause getImplementsClause(AstNode node) {
+  ImplementsClause? getImplementsClause(AstNode node) {
     if (node is ClassDeclaration) {
       return node.implementsClause;
     } else if (node is ClassTypeAlias) {
@@ -259,7 +260,7 @@
     }
   }
 
-  Expression getInitializer(AstNode node) {
+  Expression? getInitializer(AstNode node) {
     if (node is DefaultFormalParameter) {
       return node.defaultValue;
     } else if (node is VariableDeclaration) {
@@ -270,10 +271,10 @@
   }
 
   LibraryLanguageVersion getLanguageVersion(CompilationUnit node) {
-    return (node as CompilationUnitImpl).languageVersion;
+    return (node as CompilationUnitImpl).languageVersion!;
   }
 
-  Comment getLibraryDocumentationComment() {
+  Comment? getLibraryDocumentationComment() {
     for (var directive in unit_withDirectives.directives) {
       if (directive is LibraryDirectiveImpl) {
         var data = directive.summaryData as SummaryDataForLibraryDirective;
@@ -286,8 +287,8 @@
 
   List<Annotation> getLibraryMetadata() {
     unit_withDirectives;
-    unitReader.applyDirectivesResolution(this);
-    for (var directive in unit.directives) {
+    unitReader!.applyDirectivesResolution(this);
+    for (var directive in unit!.directives) {
       if (directive is LibraryDirective) {
         return directive.metadata;
       }
@@ -334,7 +335,7 @@
     } else if (node is TypeParameter) {
       return node.metadata;
     } else if (node is VariableDeclaration) {
-      var parent2 = node.parent.parent;
+      var parent2 = node.parent!.parent!;
       if (parent2 is FieldDeclaration) {
         return parent2.metadata;
       } else if (parent2 is TopLevelVariableDeclaration) {
@@ -353,7 +354,7 @@
   int getNameOffset(AstNode node) {
     if (node is ConstructorDeclaration) {
       if (node.name != null) {
-        return node.name.offset;
+        return node.name!.offset;
       } else {
         return node.returnType.offset;
       }
@@ -383,7 +384,7 @@
     throw UnimplementedError('${node.runtimeType}');
   }
 
-  TypeName getSuperclass(AstNode node) {
+  TypeName? getSuperclass(AstNode node) {
     if (node is ClassDeclaration) {
       return node.extendsClause?.superclass;
     } else if (node is ClassTypeAlias) {
@@ -393,7 +394,7 @@
     }
   }
 
-  TypeParameterList getTypeParameters2(AstNode node) {
+  TypeParameterList? getTypeParameters2(AstNode node) {
     if (node is ClassDeclaration) {
       return node.typeParameters;
     } else if (node is ClassTypeAlias) {
@@ -429,7 +430,7 @@
     }
   }
 
-  WithClause getWithClause(AstNode node) {
+  WithClause? getWithClause(AstNode node) {
     if (node is ClassDeclaration) {
       return node.withClause;
     } else if (node is ClassTypeAlias) {
@@ -455,7 +456,7 @@
     } else if (node is SimpleFormalParameter) {
       return node.type == null;
     } else if (node is VariableDeclaration) {
-      VariableDeclarationList parent = node.parent;
+      var parent = node.parent as VariableDeclarationList;
       return parent.type == null;
     }
     return false;
@@ -500,7 +501,7 @@
     } else if (node is FunctionDeclaration) {
       return isAsynchronous(node.functionExpression);
     } else if (node is FunctionExpression) {
-      return node.body.isAsynchronous;
+      return node.body!.isAsynchronous;
     } else if (node is MethodDeclaration) {
       return node.body.isAsynchronous;
     } else {
@@ -513,7 +514,7 @@
       return node.isConst;
     }
     if (node is VariableDeclaration) {
-      VariableDeclarationList parent = node.parent;
+      var parent = node.parent as VariableDeclarationList;
       return parent.isConst;
     }
     throw UnimplementedError('${node.runtimeType}');
@@ -527,7 +528,7 @@
     } else if (node is FormalParameter) {
       return node.covariantKeyword != null;
     } else if (node is VariableDeclaration) {
-      var parent2 = node.parent.parent;
+      var parent2 = node.parent!.parent!;
       return parent2 is FieldDeclaration && parent2.covariantKeyword != null;
     } else {
       throw StateError('${node.runtimeType}');
@@ -567,7 +568,7 @@
       return false;
     }
     if (node is VariableDeclaration) {
-      VariableDeclarationList parent = node.parent;
+      var parent = node.parent as VariableDeclarationList;
       return parent.isFinal;
     }
     throw UnimplementedError('${node.runtimeType}');
@@ -579,7 +580,7 @@
     } else if (node is FunctionDeclaration) {
       return isGenerator(node.functionExpression);
     } else if (node is FunctionExpression) {
-      return node.body.isGenerator;
+      return node.body!.isGenerator;
     } else if (node is MethodDeclaration) {
       return node.body.isGenerator;
     } else {
@@ -631,7 +632,7 @@
     } else if (node is MethodDeclaration) {
       return node.modifierKeyword != null;
     } else if (node is VariableDeclaration) {
-      var parent2 = node.parent.parent;
+      var parent2 = node.parent!.parent!;
       return parent2 is FieldDeclaration && parent2.isStatic;
     }
     throw UnimplementedError('${node.runtimeType}');
@@ -639,10 +640,10 @@
 
   bool shouldBeConstFieldElement(AstNode node) {
     if (node is VariableDeclaration) {
-      VariableDeclarationList variableList = node.parent;
+      var variableList = node.parent as VariableDeclarationList;
       if (variableList.isConst) return true;
 
-      FieldDeclaration fieldDeclaration = variableList.parent;
+      var fieldDeclaration = variableList.parent as FieldDeclaration;
       if (fieldDeclaration.staticKeyword != null) return false;
 
       if (variableList.isFinal) {
diff --git a/pkg/analyzer/lib/src/summary2/linking_node_scope.dart b/pkg/analyzer/lib/src/summary2/linking_node_scope.dart
index a97dccc..051db73 100644
--- a/pkg/analyzer/lib/src/summary2/linking_node_scope.dart
+++ b/pkg/analyzer/lib/src/summary2/linking_node_scope.dart
@@ -16,7 +16,7 @@
   }
 
   static LinkingNodeContext get(AstNode node) {
-    LinkingNodeContext context = node.getProperty(_key);
+    var context = node.getProperty(_key) as LinkingNodeContext?;
     if (context == null) {
       throw StateError('No context for: $node');
     }
diff --git a/pkg/analyzer/lib/src/summary2/metadata_resolver.dart b/pkg/analyzer/lib/src/summary2/metadata_resolver.dart
index 61fd6d1..bcd9298 100644
--- a/pkg/analyzer/lib/src/summary2/metadata_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/metadata_resolver.dart
@@ -4,7 +4,6 @@
 
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/scope.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/summary2/ast_resolver.dart';
@@ -14,7 +13,7 @@
 class MetadataResolver extends ThrowingAstVisitor<void> {
   final Linker _linker;
   final Scope _libraryScope;
-  final CompilationUnitElement _unitElement;
+  final CompilationUnitElementImpl _unitElement;
   Scope _scope;
 
   MetadataResolver(this._linker, this._libraryScope, this._unitElement)
diff --git a/pkg/analyzer/lib/src/summary2/named_type_builder.dart b/pkg/analyzer/lib/src/summary2/named_type_builder.dart
index d67f186..5fff83c 100644
--- a/pkg/analyzer/lib/src/summary2/named_type_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/named_type_builder.dart
@@ -14,7 +14,6 @@
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/dart/element/type_visitor.dart';
 import 'package:analyzer/src/summary2/type_builder.dart';
-import 'package:meta/meta.dart';
 
 /// The type builder for a [TypeName].
 class NamedTypeBuilder extends TypeBuilder {
@@ -36,13 +35,13 @@
   /// The node for which this builder is created, or `null` if the builder
   /// was detached from its node, e.g. during computing default types for
   /// type parameters.
-  final TypeName node;
+  final TypeName? node;
 
   /// The actual built type, not a [TypeBuilder] anymore.
   ///
   /// When [build] is called, the type is built, stored into this field,
   /// and set for the [node].
-  DartType _type;
+  DartType? _type;
 
   NamedTypeBuilder(
       this.typeSystem, this.element, this.arguments, this.nullabilitySuffix,
@@ -57,7 +56,7 @@
     List<DartType> arguments;
     var argumentList = node.typeArguments;
     if (argumentList != null) {
-      arguments = argumentList.arguments.map((n) => n.type).toList();
+      arguments = argumentList.arguments.map((n) => n.type!).toList();
     } else {
       arguments = <DartType>[];
     }
@@ -68,7 +67,7 @@
 
   /// TODO(scheglov) Only when enabled both in the element, and target?
   bool get _isNonFunctionTypeAliasesEnabled {
-    return element.library.featureSet.isEnabled(
+    return element.library!.featureSet.isEnabled(
       Feature.nonfunction_type_aliases,
     );
   }
@@ -86,7 +85,7 @@
   @override
   DartType build() {
     if (_type != null) {
-      return _type;
+      return _type!;
     }
 
     var element = this.element;
@@ -97,23 +96,19 @@
         typeArguments: arguments,
         nullabilitySuffix: nullabilitySuffix,
       );
-      type = typeSystem.toLegacyType(type);
+      type = typeSystem.toLegacyType(type) as InterfaceType;
       _type = type;
     } else if (element is TypeAliasElementImpl) {
       var aliasedType = _getAliasedType(element);
-      if (aliasedType != null) {
-        var parameters = element.typeParameters;
-        var arguments = _buildArguments(parameters);
-        element.aliasedType = aliasedType;
-        var type = element.instantiate(
-          typeArguments: arguments,
-          nullabilitySuffix: nullabilitySuffix,
-        );
-        type = typeSystem.toLegacyType(type);
-        _type = type;
-      } else {
-        _type = _dynamicType;
-      }
+      var parameters = element.typeParameters;
+      var arguments = _buildArguments(parameters);
+      element.aliasedType = aliasedType;
+      var type = element.instantiate(
+        typeArguments: arguments,
+        nullabilitySuffix: nullabilitySuffix,
+      );
+      type = typeSystem.toLegacyType(type);
+      _type = type;
     } else if (element is NeverElementImpl) {
       if (typeSystem.isNonNullableByDefault) {
         _type = NeverTypeImpl.instance.withNullability(nullabilitySuffix);
@@ -130,7 +125,7 @@
     }
 
     node?.type = _type;
-    return _type;
+    return _type!;
   }
 
   @override
@@ -155,16 +150,16 @@
         node: node);
   }
 
-  DartType _buildAliasedType(TypeAnnotation node) {
+  DartType _buildAliasedType(TypeAnnotation? node) {
     if (_isNonFunctionTypeAliasesEnabled) {
       if (node != null) {
-        return _buildType(node?.type);
+        return _buildType(node.type!);
       } else {
         return _dynamicType;
       }
     } else {
       if (node is GenericFunctionType) {
-        return _buildType(node?.type);
+        return _buildType(node.type!);
       } else {
         return FunctionTypeImpl(
           typeFormals: const <TypeParameterElement>[],
@@ -182,24 +177,19 @@
       return const <DartType>[];
     } else if (arguments.isNotEmpty) {
       if (arguments.length == parameters.length) {
-        var result = List<DartType>.filled(parameters.length, null);
-        for (int i = 0; i < result.length; ++i) {
-          var type = arguments[i];
-          result[i] = _buildType(type);
-        }
-        return result;
+        return List.generate(arguments.length, (index) {
+          var type = arguments[index];
+          return _buildType(type);
+        });
       } else {
         return _listOfDynamic(parameters.length);
       }
     } else {
-      var result = List<DartType>.filled(parameters.length, null);
-      for (int i = 0; i < result.length; ++i) {
-        TypeParameterElementImpl parameter = parameters[i];
-        var defaultType = parameter.defaultType;
-        defaultType = _buildType(defaultType);
-        result[i] = defaultType;
-      }
-      return result;
+      return List.generate(parameters.length, (index) {
+        var parameter = parameters[index] as TypeParameterElementImpl;
+        var defaultType = parameter.defaultType!;
+        return _buildType(defaultType);
+      });
     }
   }
 
@@ -221,10 +211,10 @@
   }
 
   FunctionType _buildFunctionType({
-    @required TypeParameterList typeParameterList,
-    @required TypeAnnotation returnTypeNode,
-    @required FormalParameterList parameterList,
-    @required bool hasQuestion,
+    required TypeParameterList? typeParameterList,
+    required TypeAnnotation? returnTypeNode,
+    required FormalParameterList parameterList,
+    required bool hasQuestion,
   }) {
     var returnType = _buildNodeType(returnTypeNode);
     var typeParameters = _typeParameters(typeParameterList);
@@ -238,11 +228,11 @@
     );
   }
 
-  DartType _buildNodeType(TypeAnnotation node) {
+  DartType _buildNodeType(TypeAnnotation? node) {
     if (node == null) {
       return _dynamicType;
     } else {
-      return _buildType(node.type);
+      return _buildType(node.type!);
     }
   }
 
@@ -260,14 +250,14 @@
     // If the element is not being linked, there is no reason (or a way,
     // because the linked node might be read only partially) to go through
     // its node - all its types have already been built.
-    if (!element.linkedContext.isLinking) {
+    if (!element.linkedContext!.isLinking) {
       return element.aliasedType;
     }
 
-    var typedefNode = element.linkedNode;
+    var typedefNode = element.linkedNode!;
 
     // Break a possible recursion.
-    var existing = typedefNode.getProperty(_aliasedTypeKey) as DartType;
+    var existing = typedefNode.getProperty(_aliasedTypeKey) as DartType?;
     if (existing != null) {
       return existing;
     } else {
@@ -320,10 +310,10 @@
     node.setProperty(_aliasedTypeKey, type);
   }
 
-  static List<TypeParameterElement> _typeParameters(TypeParameterList node) {
+  static List<TypeParameterElement> _typeParameters(TypeParameterList? node) {
     if (node != null) {
       return node.typeParameters
-          .map<TypeParameterElement>((p) => p.declaredElement)
+          .map<TypeParameterElement>((p) => p.declaredElement!)
           .toList();
     } else {
       return const <TypeParameterElement>[];
diff --git a/pkg/analyzer/lib/src/summary2/package_bundle_format.dart b/pkg/analyzer/lib/src/summary2/package_bundle_format.dart
index cb47263..c876e47 100644
--- a/pkg/analyzer/lib/src/summary2/package_bundle_format.dart
+++ b/pkg/analyzer/lib/src/summary2/package_bundle_format.dart
@@ -21,9 +21,9 @@
   }
 
   Uint8List finish({
-    @required Uint8List astBytes,
-    @required Uint8List resolutionBytes,
-    PackageBundleSdk sdk,
+    required Uint8List astBytes,
+    required Uint8List resolutionBytes,
+    PackageBundleSdk? sdk,
   }) {
     var byteSink = ByteSink();
     var sink = BufferedSink(byteSink);
@@ -61,9 +61,9 @@
 
 class PackageBundleReader {
   final List<PackageBundleLibrary> libraries = [];
-  PackageBundleSdk _sdk;
-  Uint8List _astBytes;
-  Uint8List _resolutionBytes;
+  late final PackageBundleSdk? _sdk;
+  late final Uint8List _astBytes;
+  late final Uint8List _resolutionBytes;
 
   PackageBundleReader(Uint8List bytes) {
     var reader = SummaryDataReader(bytes);
@@ -94,7 +94,7 @@
 
   Uint8List get resolutionBytes => _resolutionBytes;
 
-  PackageBundleSdk get sdk => _sdk;
+  PackageBundleSdk? get sdk => _sdk;
 }
 
 class PackageBundleSdk {
@@ -105,9 +105,9 @@
   final String allowedExperimentsJson;
 
   PackageBundleSdk({
-    @required this.languageVersionMajor,
-    @required this.languageVersionMinor,
-    @required this.allowedExperimentsJson,
+    required this.languageVersionMajor,
+    required this.languageVersionMinor,
+    required this.allowedExperimentsJson,
   });
 
   factory PackageBundleSdk._fromReader(SummaryDataReader reader) {
diff --git a/pkg/analyzer/lib/src/summary2/reference.dart b/pkg/analyzer/lib/src/summary2/reference.dart
index 6cd096b..871b65c 100644
--- a/pkg/analyzer/lib/src/summary2/reference.dart
+++ b/pkg/analyzer/lib/src/summary2/reference.dart
@@ -27,28 +27,28 @@
 /// There is only one reference object per [Element].
 class Reference {
   /// The parent of this reference, or `null` if the root.
-  final Reference parent;
+  final Reference? parent;
 
   /// The simple name of the reference in its [parent].
   final String name;
 
   /// The node accessor, used to read nodes lazily.
   /// Or `null` if a named container.
-  ReferenceNodeAccessor nodeAccessor;
+  ReferenceNodeAccessor? nodeAccessor;
 
   /// The corresponding [AstNode], or `null` if a named container.
-  AstNode node;
+  AstNode? node;
 
   /// The corresponding [Element], or `null` if a named container.
-  Element element;
+  Element? element;
 
   /// Temporary index used during serialization and linking.
-  int index;
+  int? index;
 
-  Map<String, Reference> _children;
+  Map<String, Reference>? _children;
 
   /// If this reference is an import prefix, the scope of this prefix.
-  Scope prefixScope;
+  Scope? prefixScope;
 
   Reference.root() : this._(null, '');
 
@@ -56,38 +56,38 @@
 
   Iterable<Reference> get children {
     if (_children != null) {
-      return _children.values;
+      return _children!.values;
     }
     return const [];
   }
 
-  bool get isClass => parent != null && parent.name == '@class';
+  bool get isClass => parent != null && parent!.name == '@class';
 
-  bool get isConstructor => parent != null && parent.name == '@constructor';
+  bool get isConstructor => parent != null && parent!.name == '@constructor';
 
   bool get isDynamic => name == 'dynamic' && parent?.name == 'dart:core';
 
-  bool get isEnum => parent != null && parent.name == '@enum';
+  bool get isEnum => parent != null && parent!.name == '@enum';
 
-  bool get isGetter => parent != null && parent.name == '@getter';
+  bool get isGetter => parent != null && parent!.name == '@getter';
 
-  bool get isLibrary => parent != null && parent.isRoot;
+  bool get isLibrary => parent != null && parent!.isRoot;
 
-  bool get isParameter => parent != null && parent.name == '@parameter';
+  bool get isParameter => parent != null && parent!.name == '@parameter';
 
-  bool get isPrefix => parent != null && parent.name == '@prefix';
+  bool get isPrefix => parent != null && parent!.name == '@prefix';
 
   bool get isRoot => parent == null;
 
-  bool get isSetter => parent != null && parent.name == '@setter';
+  bool get isSetter => parent != null && parent!.name == '@setter';
 
-  bool get isTypeAlias => parent != null && parent.name == '@typeAlias';
+  bool get isTypeAlias => parent != null && parent!.name == '@typeAlias';
 
-  bool get isUnit => parent != null && parent.name == '@unit';
+  bool get isUnit => parent != null && parent!.name == '@unit';
 
   /// Return the child with the given name, or `null` if does not exist.
-  Reference operator [](String name) {
-    return _children != null ? _children[name] : null;
+  Reference? operator [](String name) {
+    return _children != null ? _children![name] : null;
   }
 
   /// Return the child with the given name, create if does not exist yet.
@@ -104,7 +104,7 @@
     if (element != null && this.node == node) {
       return true;
     } else {
-      if (node == null) {
+      if (this.node == null) {
         this.node = node;
       }
       return false;
@@ -112,7 +112,7 @@
   }
 
   void removeChild(String name) {
-    _children.remove(name);
+    _children!.remove(name);
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/summary2/reference_resolver.dart b/pkg/analyzer/lib/src/summary2/reference_resolver.dart
index 73818f7..b8e2973 100644
--- a/pkg/analyzer/lib/src/summary2/reference_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/reference_resolver.dart
@@ -40,13 +40,13 @@
   /// The depth-first number of the next [GenericFunctionType] node.
   int _nextGenericFunctionTypeId = 0;
 
-  Reference reference;
+  Reference? reference;
   Scope scope;
 
   ReferenceResolver(
     this.nodesToBuildType,
     this.elementFactory,
-    LibraryElement libraryElement,
+    LibraryElementImpl libraryElement,
     this.unitReference,
     this.isNNBD,
     this.scope,
@@ -62,7 +62,7 @@
     var outerReference = reference;
 
     var element = node.declaredElement as ClassElementImpl;
-    reference = element.reference;
+    reference = element.reference!;
     element.accessors; // create elements
     element.constructors; // create elements
     element.methods; // create elements
@@ -91,15 +91,15 @@
     var outerReference = reference;
 
     var element = node.declaredElement as ClassElementImpl;
-    reference = element.reference;
+    reference = element.reference!;
 
     _createTypeParameterElements(element, node.typeParameters);
     scope = TypeParameterScope(scope, element.typeParameters);
     LinkingNodeContext(node, scope);
 
     node.typeParameters?.accept(this);
-    node.superclass?.accept(this);
-    node.withClause?.accept(this);
+    node.superclass.accept(this);
+    node.withClause.accept(this);
     node.implementsClause?.accept(this);
     nodesToBuildType.addDeclaration(node);
 
@@ -119,13 +119,13 @@
     var outerReference = reference;
 
     var element = node.declaredElement as ConstructorElementImpl;
-    reference = element.reference;
+    reference = element.reference!;
     element.parameters; // create elements
 
     scope = TypeParameterScope(scope, element.typeParameters);
     LinkingNodeContext(node, scope);
 
-    node.parameters?.accept(this);
+    node.parameters.accept(this);
 
     scope = outerScope;
     reference = outerReference;
@@ -153,7 +153,7 @@
     var outerReference = reference;
 
     var element = node.declaredElement as ExtensionElementImpl;
-    reference = element.reference;
+    reference = element.reference!;
 
     _createTypeParameterElements(element, node.typeParameters);
     scope = TypeParameterScope(scope, element.typeParameters);
@@ -208,7 +208,7 @@
     var outerReference = reference;
 
     var element = node.declaredElement as ExecutableElementImpl;
-    reference = element.reference;
+    reference = element.reference!;
     element.parameters; // create elements
 
     _createTypeParameterElements(
@@ -238,7 +238,7 @@
     var outerReference = reference;
 
     var element = node.declaredElement as FunctionTypeAliasElementImpl;
-    reference = element.reference;
+    reference = element.reference!;
 
     _createTypeParameterElements(element, node.typeParameters);
     scope = TypeParameterScope(outerScope, element.typeParameters);
@@ -247,7 +247,7 @@
     node.typeParameters?.accept(this);
 
     var functionElement = element.function;
-    reference = functionElement.reference;
+    reference = functionElement.reference!;
     functionElement.parameters; // create elements
     node.parameters.accept(this);
 
@@ -280,6 +280,7 @@
 
   @override
   void visitGenericFunctionType(GenericFunctionType node) {
+    var nodeImpl = node as GenericFunctionTypeImpl;
     var outerScope = scope;
     var outerReference = reference;
 
@@ -289,8 +290,8 @@
     reference = containerRef.getChild('$id');
 
     var element = GenericFunctionTypeElementImpl.forLinkedNode(
-      unitReference.element,
-      reference,
+      unitReference.element as CompilationUnitElementImpl,
+      reference!,
       node,
     );
     element.parameters; // create elements
@@ -303,8 +304,8 @@
     node.parameters.accept(this);
 
     var nullabilitySuffix = _getNullabilitySuffix(node.question != null);
-    var builder = FunctionTypeBuilder.of(isNNBD, node, nullabilitySuffix);
-    (node as GenericFunctionTypeImpl).type = builder;
+    var builder = FunctionTypeBuilder.of(isNNBD, nodeImpl, nullabilitySuffix);
+    nodeImpl.type = builder;
     nodesToBuildType.addTypeBuilder(builder);
 
     scope = outerScope;
@@ -317,13 +318,13 @@
     var outerReference = reference;
 
     var element = node.declaredElement as TypeAliasElementImpl;
-    reference = element.reference;
+    reference = element.reference!;
 
     _createTypeParameterElements(element, node.typeParameters);
     scope = TypeParameterScope(outerScope, element.typeParameters);
 
     node.typeParameters?.accept(this);
-    node.type?.accept(this);
+    node.type.accept(this);
     nodesToBuildType.addDeclaration(node);
 
     var aliasedType = node.type;
@@ -348,7 +349,7 @@
     var outerReference = reference;
 
     var element = node.declaredElement as ExecutableElementImpl;
-    reference = element.reference;
+    reference = element.reference!;
     element.parameters; // create elements
 
     _createTypeParameterElements(element, node.typeParameters);
@@ -371,7 +372,7 @@
     var outerReference = reference;
 
     var element = node.declaredElement as MixinElementImpl;
-    reference = element.reference;
+    reference = element.reference!;
     element.accessors; // create elements
     element.constructors; // create elements
     element.methods; // create elements
@@ -418,7 +419,7 @@
   void visitTypeName(TypeName node) {
     var typeIdentifier = node.name;
 
-    Element element;
+    Element? element;
     if (typeIdentifier is PrefixedIdentifier) {
       var prefix = typeIdentifier.prefix;
       var prefixName = prefix.name;
@@ -448,7 +449,9 @@
     node.typeArguments?.accept(this);
 
     var nullabilitySuffix = _getNullabilitySuffix(node.question != null);
-    if (element is TypeParameterElement) {
+    if (element == null) {
+      node.type = DynamicTypeImpl.instance;
+    } else if (element is TypeParameterElement) {
       node.type = TypeParameterTypeImpl(
         element: element,
         nullabilitySuffix: nullabilitySuffix,
@@ -499,7 +502,7 @@
 
   void _createTypeParameterElements(
     ElementImpl enclosingElement,
-    TypeParameterList typeParameterList,
+    TypeParameterList? typeParameterList,
   ) {
     if (typeParameterList == null) return;
 
diff --git a/pkg/analyzer/lib/src/summary2/scope.dart b/pkg/analyzer/lib/src/summary2/scope.dart
index 11d7d60..1f355ee 100644
--- a/pkg/analyzer/lib/src/summary2/scope.dart
+++ b/pkg/analyzer/lib/src/summary2/scope.dart
@@ -5,7 +5,7 @@
 import 'package:analyzer/src/summary2/reference.dart';
 
 class Scope {
-  final Scope parent;
+  final Scope? parent;
   final Map<String, Reference> map;
 
   Scope(this.parent, this.map);
@@ -20,11 +20,10 @@
     map.forEach(f);
   }
 
-  Reference lookup(String name) {
+  Reference? lookup(String name) {
     var reference = map[name];
     if (reference != null) return reference;
 
-    if (parent == null) return null;
-    return parent.lookup(name);
+    return parent?.lookup(name);
   }
 }
diff --git a/pkg/analyzer/lib/src/summary2/simply_bounded.dart b/pkg/analyzer/lib/src/summary2/simply_bounded.dart
index fb5d0ed..a325de8 100644
--- a/pkg/analyzer/lib/src/summary2/simply_bounded.dart
+++ b/pkg/analyzer/lib/src/summary2/simply_bounded.dart
@@ -136,50 +136,20 @@
   /// parameter declarations and their bounds are not included.
   static List<TypeAnnotation> _collectTypedefRhsTypes(AstNode node) {
     if (node is FunctionTypeAlias) {
-      // TODO(scheglov) https://github.com/dart-lang/sdk/issues/41023
-      if (node.parameters == null) {
-        var buffer = StringBuffer();
-        buffer.writeln('Unexpected FunctionTypeAlias state.');
-        try {
-          buffer.writeln('unit: ');
-          buffer.writeln(node.parent.toSource());
-        } catch (_) {
-          try {
-            buffer.writeln('node: ');
-            buffer.writeln(node.toSource());
-          } catch (_) {
-            try {
-              buffer.writeln('node parts:');
-              buffer.writeln('  name: ${node.name}');
-              buffer.writeln('  typeParameters: ${node.typeParameters}');
-              buffer.writeln('  returnType: ${node.returnType}');
-              buffer.writeln('  parameters: ${node.parameters}');
-            } catch (_) {
-              buffer.writeln('nothing worked');
-            }
-          }
-        }
-        throw StateError(buffer.toString());
-      }
-
       var collector = _TypeCollector();
       collector.addType(node.returnType);
       collector.visitParameters(node.parameters);
       return collector.types;
     } else if (node is GenericTypeAlias) {
       var type = node.type;
-      if (type != null) {
-        var collector = _TypeCollector();
-        if (type is GenericFunctionType) {
-          collector.addType(type.returnType);
-          collector.visitParameters(type.parameters);
-        } else {
-          collector.addType(type);
-        }
-        return collector.types;
+      var collector = _TypeCollector();
+      if (type is GenericFunctionType) {
+        collector.addType(type.returnType);
+        collector.visitParameters(type.parameters);
       } else {
-        return const <TypeAnnotation>[];
+        collector.addType(type);
       }
+      return collector.types;
     } else {
       throw StateError('(${node.runtimeType}) $node');
     }
@@ -280,8 +250,6 @@
   /// Otherwise `true` is returned.
   bool _visitType(List<SimplyBoundedNode> dependencies, TypeAnnotation type,
       bool allowTypeParameters) {
-    if (type == null) return true;
-
     if (type is TypeName) {
       var element = type.name.staticElement;
 
@@ -332,7 +300,7 @@
 class _TypeCollector {
   final List<TypeAnnotation> types = [];
 
-  void addType(TypeAnnotation type) {
+  void addType(TypeAnnotation? type) {
     if (type != null) {
       types.add(type);
     }
diff --git a/pkg/analyzer/lib/src/summary2/top_level_inference.dart b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
index cafca28..9832cee 100644
--- a/pkg/analyzer/lib/src/summary2/top_level_inference.dart
+++ b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
@@ -18,10 +18,10 @@
 import 'package:analyzer/src/summary2/linking_node_scope.dart';
 import 'package:analyzer/src/task/inference_error.dart';
 import 'package:analyzer/src/task/strong_mode.dart';
-import 'package:meta/meta.dart';
+import 'package:collection/collection.dart';
 
 AstNode _getLinkedNode(Element element) {
-  return (element as ElementImpl).linkedNode;
+  return (element as ElementImpl).linkedNode!;
 }
 
 /// Resolver for typed constant top-level variables and fields initializers.
@@ -30,10 +30,10 @@
 class ConstantInitializersResolver {
   final Linker linker;
 
-  CompilationUnitElement _unitElement;
-  LibraryElement _library;
+  late CompilationUnitElementImpl _unitElement;
+  late LibraryElement _library;
   bool _enclosingClassHasConstConstructor = false;
-  Scope _scope;
+  late Scope _scope;
 
   ConstantInitializersResolver(this.linker);
 
@@ -41,7 +41,7 @@
     for (var builder in linker.builders.values) {
       _library = builder.element;
       for (var unit in _library.units) {
-        _unitElement = unit;
+        _unitElement = unit as CompilationUnitElementImpl;
         unit.extensions.forEach(_resolveExtensionFields);
         unit.mixins.forEach(_resolveClassFields);
         unit.types.forEach(_resolveClassFields);
@@ -75,20 +75,20 @@
   void _resolveVariable(VariableElement element) {
     if (element.isSynthetic) return;
 
-    VariableDeclaration variable = _getLinkedNode(element);
+    var variable = _getLinkedNode(element) as VariableDeclaration;
     if (variable.initializer == null) return;
 
-    VariableDeclarationList declarationList = variable.parent;
+    var declarationList = variable.parent as VariableDeclarationList;
     var typeNode = declarationList.type;
     if (typeNode != null) {
       if (declarationList.isConst ||
           declarationList.isFinal && _enclosingClassHasConstConstructor) {
         var astResolver = AstResolver(linker, _unitElement, _scope);
         astResolver.resolve(
-          variable.initializer,
+          variable.initializer!,
           () {
             InferenceContext.setType(variable.initializer, typeNode.type);
-            return variable.initializer;
+            return variable.initializer!;
           },
           isTopLevelVariableInitializer: true,
         );
@@ -143,8 +143,7 @@
       if (parameterElement is FieldFormalParameterElement) {
         var parameterNode = _getLinkedNode(parameterElement);
         if (parameterNode is DefaultFormalParameter) {
-          var defaultParameter = parameterNode as DefaultFormalParameter;
-          parameterNode = defaultParameter.parameter;
+          parameterNode = parameterNode.parameter;
         }
 
         if (parameterNode is FieldFormalParameter &&
@@ -170,7 +169,7 @@
 
   @override
   List<_InferenceNode> computeDependencies() {
-    return _fields.map(_walker.getNode).where((node) => node != null).toList();
+    return _fields.map(_walker.getNode).whereNotNull().toList();
   }
 
   @override
@@ -244,7 +243,7 @@
     }
   }
 
-  _InferenceNode getNode(Element element) {
+  _InferenceNode? getNode(Element element) {
     return _nodes[element];
   }
 
@@ -261,15 +260,15 @@
   final Linker _linker;
   final _InferenceWalker _walker;
 
-  CompilationUnitElement _unitElement;
-  Scope _scope;
+  late CompilationUnitElementImpl _unitElement;
+  late Scope _scope;
 
   _InitializerInference(this._linker) : _walker = _InferenceWalker(_linker);
 
   void createNodes() {
     for (var builder in _linker.builders.values) {
       for (var unit in builder.element.units) {
-        _unitElement = unit;
+        _unitElement = unit as CompilationUnitElementImpl;
         unit.extensions.forEach(_addExtensionElementFields);
         unit.mixins.forEach(_addClassElementFields);
         unit.types.forEach(_addClassConstructorFieldFormals);
@@ -355,7 +354,7 @@
 
 class _VariableInferenceNode extends _InferenceNode {
   final _InferenceWalker _walker;
-  final CompilationUnitElement _unitElement;
+  final CompilationUnitElementImpl _unitElement;
   final TypeSystemImpl _typeSystem;
   final Scope _scope;
   final VariableDeclaration _node;
@@ -376,7 +375,7 @@
   }
 
   bool get isImplicitlyTypedInstanceField {
-    VariableDeclarationList variables = _node.parent;
+    var variables = _node.parent as VariableDeclarationList;
     if (variables.type == null) {
       var parent = variables.parent;
       return parent is FieldDeclaration && !parent.isStatic;
@@ -393,16 +392,14 @@
     _resolveInitializer(forDependencies: true);
 
     var collector = _InferenceDependenciesCollector();
-    _node.initializer.accept(collector);
+    _node.initializer!.accept(collector);
 
     if (collector._set.isEmpty) {
       return const <_InferenceNode>[];
     }
 
-    var dependencies = collector._set
-        .map(_walker.getNode)
-        .where((node) => node != null)
-        .toList();
+    var dependencies =
+        collector._set.map(_walker.getNode).whereNotNull().toList();
 
     for (var node in dependencies) {
       if (node is _VariableInferenceNode &&
@@ -421,7 +418,7 @@
     _resolveInitializer(forDependencies: false);
 
     if (!_elementImpl.hasTypeInferred) {
-      var initializerType = _node.initializer.staticType;
+      var initializerType = _node.initializer!.staticType!;
       initializerType = _refineType(initializerType);
       _elementImpl.type = initializerType;
     }
@@ -447,7 +444,7 @@
   }
 
   DartType _refineType(DartType type) {
-    if (type == null || type.isDartCoreNull) {
+    if (type.isDartCoreNull) {
       return DynamicTypeImpl.instance;
     }
 
@@ -461,11 +458,11 @@
     }
   }
 
-  void _resolveInitializer({@required bool forDependencies}) {
+  void _resolveInitializer({required bool forDependencies}) {
     var astResolver = AstResolver(_walker._linker, _unitElement, _scope);
     astResolver.resolve(
-      _node.initializer,
-      () => _node.initializer,
+      _node.initializer!,
+      () => _node.initializer!,
       buildElements: forDependencies,
       isTopLevelVariableInitializer: true,
     );
diff --git a/pkg/analyzer/lib/src/summary2/type_alias.dart b/pkg/analyzer/lib/src/summary2/type_alias.dart
index 303646c..6309bb5 100644
--- a/pkg/analyzer/lib/src/summary2/type_alias.dart
+++ b/pkg/analyzer/lib/src/summary2/type_alias.dart
@@ -11,7 +11,7 @@
   void perform(Linker linker) {
     for (var builder in linker.builders.values) {
       for (var unitContext in builder.context.units) {
-        for (var node in unitContext.unit.declarations) {
+        for (var node in unitContext.unit!.declarations) {
           if (node is FunctionTypeAlias) {
             var finder = _Finder(node);
             finder.functionTypeAlias(node);
@@ -47,7 +47,7 @@
     _visit(node.type);
   }
 
-  void _argumentList(TypeArgumentList node) {
+  void _argumentList(TypeArgumentList? node) {
     if (node != null) {
       for (var argument in node.arguments) {
         _visit(argument);
@@ -72,7 +72,7 @@
     }
   }
 
-  void _typeParameterList(TypeParameterList node) {
+  void _typeParameterList(TypeParameterList? node) {
     if (node != null) {
       for (var parameter in node.typeParameters) {
         _visit(parameter.bound);
@@ -80,7 +80,7 @@
     }
   }
 
-  void _visit(TypeAnnotation node) {
+  void _visit(TypeAnnotation? node) {
     if (hasSelfReference) return;
     if (node == null) return;
 
@@ -88,7 +88,7 @@
       var element = node.name.staticElement;
       if (element is ElementImpl &&
           element.enclosingElement != null &&
-          element.linkedContext.isLinking) {
+          element.linkedContext!.isLinking) {
         var typeNode = element.linkedNode;
         if (typeNode == self) {
           hasSelfReference = true;
diff --git a/pkg/analyzer/lib/src/summary2/types_builder.dart b/pkg/analyzer/lib/src/summary2/types_builder.dart
index 9ad85a2..cccd41f 100644
--- a/pkg/analyzer/lib/src/summary2/types_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/types_builder.dart
@@ -50,8 +50,8 @@
   }
 
   FunctionType _buildFunctionType(
-    TypeParameterList typeParameterList,
-    TypeAnnotation returnTypeNode,
+    TypeParameterList? typeParameterList,
+    TypeAnnotation? returnTypeNode,
     FormalParameterList parameterList,
     NullabilitySuffix nullabilitySuffix,
   ) {
@@ -148,7 +148,7 @@
 
   List<ParameterElement> _formalParameters(FormalParameterList node) {
     return node.parameters.asImpl.map((parameter) {
-      return parameter.declaredElement;
+      return parameter.declaredElement!;
     }).toList();
   }
 
@@ -171,7 +171,7 @@
 
   bool _isNonNullableByDefault(AstNode node) {
     var unit = node.thisOrAncestorOfType<CompilationUnit>();
-    return unit.featureSet.isEnabled(Feature.non_nullable);
+    return unit!.featureSet.isEnabled(Feature.non_nullable);
   }
 
   NullabilitySuffix _nullability(AstNode node, bool hasQuestion) {
@@ -186,13 +186,13 @@
     }
   }
 
-  List<TypeParameterElement> _typeParameters(TypeParameterList node) {
+  List<TypeParameterElement> _typeParameters(TypeParameterList? node) {
     if (node == null) {
       return const <TypeParameterElement>[];
     }
 
     return node.typeParameters
-        .map<TypeParameterElement>((p) => p.declaredElement)
+        .map<TypeParameterElement>((p) => p.declaredElement!)
         .toList();
   }
 }
@@ -204,7 +204,7 @@
   final FeatureSet featureSet;
   final InterfaceType classType;
 
-  InterfacesMerger interfacesMerger;
+  late final InterfacesMerger interfacesMerger;
 
   _MixinInference(this.element, this.featureSet)
       : typeSystem = element.library.typeSystem,
@@ -221,7 +221,7 @@
 
   bool get _nonNullableEnabled => featureSet.isEnabled(Feature.non_nullable);
 
-  void perform(WithClause withClause) {
+  void perform(WithClause? withClause) {
     if (withClause == null) return;
 
     for (var mixinNode in withClause.mixinTypes) {
@@ -230,7 +230,7 @@
     }
   }
 
-  InterfaceType _findInterfaceTypeForElement(
+  InterfaceType? _findInterfaceTypeForElement(
     ClassElement element,
     List<InterfaceType> interfaceTypes,
   ) {
@@ -240,7 +240,7 @@
     return null;
   }
 
-  List<InterfaceType> _findInterfaceTypesForConstraints(
+  List<InterfaceType>? _findInterfaceTypesForConstraints(
     List<InterfaceType> constraints,
     List<InterfaceType> interfaceTypes,
   ) {
@@ -262,7 +262,7 @@
   }
 
   InterfaceType _inferSingle(TypeName mixinNode) {
-    var mixinType = _interfaceType(mixinNode.type);
+    var mixinType = _interfaceType(mixinNode.type!);
 
     if (mixinNode.typeArguments != null) {
       return mixinType;
@@ -327,7 +327,7 @@
   void perform(List<AstNode> declarations) {
     for (var node in declarations) {
       if (node is ClassDeclaration || node is ClassTypeAlias) {
-        ClassElementImpl element = (node as Declaration).declaredElement;
+        var element = (node as Declaration).declaredElement as ClassElementImpl;
         element.linkedMixinInferenceCallback = _callbackWhenRecursion;
       }
     }
@@ -350,13 +350,13 @@
 
   /// This method is invoked when mixins are asked from the [element], and
   /// we are not inferring the [element] now, i.e. there is no loop.
-  List<InterfaceType> _callbackWhenRecursion(ClassElementImpl element) {
-    _inferDeclaration(element.linkedNode);
+  List<InterfaceType>? _callbackWhenRecursion(ClassElementImpl element) {
+    _inferDeclaration(element.linkedNode!);
     // The inference was successful, let the element return actual mixins.
     return null;
   }
 
-  void _infer(ClassElementImpl element, WithClause withClause) {
+  void _infer(ClassElementImpl element, WithClause? withClause) {
     element.linkedMixinInferenceCallback = _callbackWhenLoop;
     try {
       var featureSet = _unitFeatureSet(element);
@@ -368,9 +368,11 @@
 
   void _inferDeclaration(AstNode node) {
     if (node is ClassDeclaration) {
-      _infer(node.declaredElement, node.withClause);
+      var element = node.declaredElement as ClassElementImpl;
+      _infer(element, node.withClause);
     } else if (node is ClassTypeAlias) {
-      _infer(node.declaredElement, node.withClause);
+      var element = node.declaredElement as ClassElementImpl;
+      _infer(element, node.withClause);
     }
   }
 
@@ -381,7 +383,7 @@
   void _resetHierarchies(List<AstNode> declarations) {
     for (var declaration in declarations) {
       if (declaration is ClassOrMixinDeclaration) {
-        var element = declaration.declaredElement;
+        var element = declaration.declaredElement as ClassElementImpl;
         var sessionImpl = element.library.session as AnalysisSessionImpl;
         sessionImpl.classHierarchy.remove(element);
       }
@@ -389,7 +391,7 @@
   }
 
   static FeatureSet _unitFeatureSet(ClassElementImpl element) {
-    var unit = element.linkedNode.parent as CompilationUnit;
+    var unit = element.linkedNode!.parent as CompilationUnit;
     return unit.featureSet;
   }
 }
diff --git a/pkg/analyzer/lib/src/summary2/variance_builder.dart b/pkg/analyzer/lib/src/summary2/variance_builder.dart
index 5eb87ce..edae4df 100644
--- a/pkg/analyzer/lib/src/summary2/variance_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/variance_builder.dart
@@ -11,7 +11,6 @@
 import 'package:analyzer/src/summary2/function_type_builder.dart';
 import 'package:analyzer/src/summary2/link.dart';
 import 'package:analyzer/src/summary2/named_type_builder.dart';
-import 'package:meta/meta.dart';
 
 class VarianceBuilder {
   final Set<TypeAlias> _pending = Set.identity();
@@ -20,8 +19,10 @@
   void perform(Linker linker) {
     for (var builder in linker.builders.values) {
       for (var unitContext in builder.context.units) {
-        for (var node in unitContext.unit.declarations) {
-          if (node is FunctionTypeAlias || node is GenericTypeAlias) {
+        for (var node in unitContext.unit!.declarations) {
+          if (node is FunctionTypeAlias) {
+            _pending.add(node);
+          } else if (node is GenericTypeAlias) {
             _pending.add(node);
           }
         }
@@ -30,7 +31,7 @@
 
     for (var builder in linker.builders.values) {
       for (var unitContext in builder.context.units) {
-        for (var node in unitContext.unit.declarations) {
+        for (var node in unitContext.unit!.declarations) {
           if (node is ClassTypeAlias) {
             _typeParameters(node.typeParameters);
           } else if (node is ClassDeclaration) {
@@ -47,7 +48,7 @@
     }
   }
 
-  Variance _compute(TypeParameterElement variable, DartType type) {
+  Variance _compute(TypeParameterElement variable, DartType? type) {
     if (type is TypeParameterType) {
       var element = type.element;
       if (element is TypeParameterElement) {
@@ -106,17 +107,15 @@
 
   Variance _computeFunctionType(
     TypeParameterElement variable, {
-    @required DartType returnType,
-    @required List<TypeParameterElement> typeFormals,
-    @required List<ParameterElement> parameters,
+    required DartType? returnType,
+    required List<TypeParameterElement>? typeFormals,
+    required List<ParameterElement> parameters,
   }) {
     var result = Variance.unrelated;
 
-    if (result != null) {
-      result = result.meet(
-        _compute(variable, returnType),
-      );
-    }
+    result = result.meet(
+      _compute(variable, returnType),
+    );
 
     // If [variable] is referenced in a bound at all, it makes the
     // variance of [variable] in the entire type invariant.
@@ -163,7 +162,7 @@
     try {
       for (var parameter in parameterList.typeParameters) {
         var variance = _computeFunctionType(
-          parameter.declaredElement,
+          parameter.declaredElement!,
           returnType: node.returnType?.type,
           typeFormals: null,
           parameters: FunctionTypeBuilder.getParameters(
@@ -197,7 +196,7 @@
       return;
     }
 
-    var type = node.type?.type;
+    var type = node.type.type;
 
     // Not a function type, recover.
     if (type == null) {
@@ -209,7 +208,7 @@
     _visit.add(node);
     try {
       for (var parameter in parameterList.typeParameters) {
-        var variance = _compute(parameter.declaredElement, type);
+        var variance = _compute(parameter.declaredElement!, type);
         _setVariance(parameter, variance);
       }
     } finally {
@@ -228,7 +227,7 @@
     }
   }
 
-  void _typeParameters(TypeParameterList parameterList) {
+  void _typeParameters(TypeParameterList? parameterList) {
     if (parameterList == null) {
       return;
     }
diff --git a/pkg/analyzer/lib/src/task/api/model.dart b/pkg/analyzer/lib/src/task/api/model.dart
index d3d1fac..713d672 100644
--- a/pkg/analyzer/lib/src/task/api/model.dart
+++ b/pkg/analyzer/lib/src/task/api/model.dart
@@ -12,9 +12,9 @@
 abstract class AnalysisTarget {
   /// If this target is associated with a library, return the source of the
   /// library's defining compilation unit; otherwise return `null`.
-  Source get librarySource;
+  Source? get librarySource;
 
   /// Return the source associated with this target, or `null` if this target is
   /// not associated with a source.
-  Source get source;
+  Source? get source;
 }
diff --git a/pkg/analyzer/lib/src/task/inference_error.dart b/pkg/analyzer/lib/src/task/inference_error.dart
index 4a686ff..3bba402 100644
--- a/pkg/analyzer/lib/src/task/inference_error.dart
+++ b/pkg/analyzer/lib/src/task/inference_error.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/meta.dart';
-
 /// The top-level type inference error.
 class TopLevelInferenceError {
   /// The kind of the error.
@@ -13,8 +11,8 @@
   final List<String> arguments;
 
   TopLevelInferenceError({
-    @required this.kind,
-    @required this.arguments,
+    required this.kind,
+    required this.arguments,
   });
 }
 
diff --git a/pkg/analyzer/lib/src/task/options.dart b/pkg/analyzer/lib/src/task/options.dart
index 0aaf16d..5ed06e0 100644
--- a/pkg/analyzer/lib/src/task/options.dart
+++ b/pkg/analyzer/lib/src/task/options.dart
@@ -30,7 +30,7 @@
     Source source, String content, SourceFactory sourceFactory) {
   List<AnalysisError> errors = <AnalysisError>[];
   Source initialSource = source;
-  SourceSpan initialIncludeSpan;
+  SourceSpan? initialIncludeSpan;
   AnalysisOptionsProvider optionsProvider =
       AnalysisOptionsProvider(sourceFactory);
 
@@ -48,8 +48,8 @@
         ];
         errors.add(AnalysisError(
             initialSource,
-            initialIncludeSpan.start.offset,
-            initialIncludeSpan.length,
+            initialIncludeSpan!.start.offset,
+            initialIncludeSpan!.length,
             AnalysisOptionsWarningCode.INCLUDED_FILE_WARNING,
             args));
       }
@@ -57,19 +57,19 @@
       errors.addAll(validationErrors);
     }
 
-    YamlNode node = getValue(options, AnalyzerOptions.include);
+    var node = getValue(options, AnalyzerOptions.include);
     if (node == null) {
       return;
     }
     SourceSpan span = node.span;
     initialIncludeSpan ??= span;
     String includeUri = span.text;
-    Source includedSource = sourceFactory.resolveUri(source, includeUri);
+    var includedSource = sourceFactory.resolveUri(source, includeUri);
     if (includedSource == null || !includedSource.exists()) {
       errors.add(AnalysisError(
           initialSource,
-          initialIncludeSpan.start.offset,
-          initialIncludeSpan.length,
+          initialIncludeSpan!.start.offset,
+          initialIncludeSpan!.length,
           AnalysisOptionsWarningCode.INCLUDE_FILE_NOT_FOUND,
           [includeUri, source.fullName]));
       return;
@@ -81,16 +81,16 @@
     } on OptionsFormatException catch (e) {
       var args = [
         includedSource.fullName,
-        e.span.start.offset.toString(),
-        e.span.end.offset.toString(),
+        e.span!.start.offset.toString(),
+        e.span!.end.offset.toString(),
         e.message,
       ];
       // Report errors for included option files
       // on the include directive located in the initial options file.
       errors.add(AnalysisError(
           initialSource,
-          initialIncludeSpan.start.offset,
-          initialIncludeSpan.length,
+          initialIncludeSpan!.start.offset,
+          initialIncludeSpan!.length,
           AnalysisOptionsErrorCode.INCLUDED_FILE_PARSE_ERROR,
           args));
     }
@@ -100,7 +100,7 @@
     YamlMap options = optionsProvider.getOptionsFromString(content);
     validate(source, options);
   } on OptionsFormatException catch (e) {
-    SourceSpan span = e.span;
+    SourceSpan span = e.span!;
     errors.add(AnalysisError(source, span.start.offset, span.length,
         AnalysisOptionsErrorCode.PARSE_ERROR, [e.message]));
   }
@@ -242,12 +242,11 @@
 
 /// Builds error reports with value proposals.
 class ErrorBuilder {
-  String proposal;
-  AnalysisOptionsWarningCode code;
+  String? proposal;
+  late final AnalysisOptionsWarningCode code;
 
   /// Create a builder for the given [supportedOptions].
   ErrorBuilder(List<String> supportedOptions) {
-    assert(supportedOptions != null);
     if (supportedOptions.isEmpty) {
       code = noProposalCode;
     } else if (supportedOptions.length == 1) {
@@ -292,20 +291,20 @@
       StringUtilities.printListOfQuotedNames(legalValues);
 
   /// Lazily populated set of error codes (hashed for speedy lookup).
-  static HashSet<String> _errorCodes;
+  static HashSet<String>? _errorCodes;
 
   /// Legal error code names.
   static Set<String> get errorCodes {
     if (_errorCodes == null) {
       _errorCodes = HashSet<String>();
       // Engine codes.
-      _errorCodes.addAll(errorCodeValues.map((ErrorCode code) => code.name));
+      _errorCodes!.addAll(errorCodeValues.map((ErrorCode code) => code.name));
     }
-    return _errorCodes;
+    return _errorCodes!;
   }
 
   /// Lazily populated set of lint codes.
-  Set<String> _lintCodes;
+  Set<String>? _lintCodes;
 
   Set<String> get lintCodes {
     return _lintCodes ??= Set.from(
@@ -318,7 +317,7 @@
     if (analyzer is YamlMap) {
       var filters = getValue(analyzer, AnalyzerOptions.errors);
       if (filters is YamlMap) {
-        String value;
+        String? value;
         filters.nodes.forEach((k, v) {
           if (k is YamlScalar) {
             value = toUpperCase(k.value);
@@ -361,7 +360,7 @@
       var language = getValue(analyzer, AnalyzerOptions.language);
       if (language is YamlMap) {
         language.nodes.forEach((k, v) {
-          String key, value;
+          String? key, value;
           bool validKey = false;
           if (k is YamlScalar) {
             key = k.value?.toString();
@@ -383,7 +382,7 @@
           if (validKey && v is YamlScalar) {
             value = toLowerCase(v.value);
             if (!AnalyzerOptions.trueOrFalse.contains(value)) {
-              trueOrFalseBuilder.reportError(reporter, key, v);
+              trueOrFalseBuilder.reportError(reporter, key!, v);
             }
           }
         });
@@ -426,7 +425,7 @@
         }
       } else if (v is YamlMap) {
         v.nodes.forEach((k, v) {
-          String key, value;
+          String? key, value;
           if (k is YamlScalar) {
             key = k.value?.toString();
             if (key != AnalyzerOptions.chromeOsManifestChecks) {
@@ -435,7 +434,7 @@
             } else {
               value = toLowerCase(v.value);
               if (!AnalyzerOptions.trueOrFalse.contains(value)) {
-                trueOrFalseBuilder.reportError(reporter, key, v);
+                trueOrFalseBuilder.reportError(reporter, key!, v);
               }
             }
           }
@@ -494,7 +493,7 @@
         }
       } else if (v is YamlMap) {
         v.nodes.forEach((k, v) {
-          String key, value;
+          String? key, value;
           bool validKey = false;
           if (k is YamlScalar) {
             key = k.value?.toString();
@@ -513,7 +512,7 @@
           if (validKey && v is YamlScalar) {
             value = toLowerCase(v.value);
             if (!AnalyzerOptions.trueOrFalse.contains(value)) {
-              trueOrFalseBuilder.reportError(reporter, key, v);
+              trueOrFalseBuilder.reportError(reporter, key!, v);
             }
           }
         });
@@ -534,11 +533,11 @@
 class TopLevelOptionValidator extends OptionsValidator {
   final String pluginName;
   final List<String> supportedOptions;
-  String _valueProposal;
-  AnalysisOptionsWarningCode _warningCode;
+  late final String _valueProposal;
+  late final AnalysisOptionsWarningCode _warningCode;
 
   TopLevelOptionValidator(this.pluginName, this.supportedOptions) {
-    assert(supportedOptions != null && supportedOptions.isNotEmpty);
+    assert(supportedOptions.isNotEmpty);
     if (supportedOptions.length > 1) {
       _valueProposal = StringUtilities.printListOfQuotedNames(supportedOptions);
       _warningCode =
@@ -552,7 +551,7 @@
 
   @override
   void validate(ErrorReporter reporter, YamlMap options) {
-    YamlNode node = getValue(options, pluginName);
+    var node = getValue(options, pluginName);
     if (node is YamlMap) {
       node.nodes.forEach((k, v) {
         if (k is YamlScalar) {
@@ -579,7 +578,7 @@
 class _OptionsProcessor {
   /// Apply the options in the given [optionMap] to the given analysis
   /// [options].
-  void applyToAnalysisOptions(AnalysisOptionsImpl options, YamlMap optionMap) {
+  void applyToAnalysisOptions(AnalysisOptionsImpl options, YamlMap? optionMap) {
     if (optionMap == null) {
       return;
     }
@@ -599,7 +598,7 @@
       if (experimentNames is YamlList) {
         List<String> enabledExperiments = <String>[];
         for (var element in experimentNames.nodes) {
-          String experimentName = _toString(element);
+          var experimentName = _toString(element);
           if (experimentName != null) {
             enabledExperiments.add(experimentName);
           }
@@ -625,19 +624,19 @@
       // Process plugins.
       var names = getValue(analyzer, AnalyzerOptions.plugins);
       List<String> pluginNames = <String>[];
-      String pluginName = _toString(names);
+      var pluginName = _toString(names);
       if (pluginName != null) {
         pluginNames.add(pluginName);
       } else if (names is YamlList) {
         for (var element in names.nodes) {
-          String pluginName = _toString(element);
+          var pluginName = _toString(element);
           if (pluginName != null) {
             pluginNames.add(pluginName);
           }
         }
       } else if (names is YamlMap) {
         for (var key in names.nodes.keys) {
-          String pluginName = _toString(key);
+          var pluginName = _toString(key);
           if (pluginName != null) {
             pluginNames.add(pluginName);
           }
@@ -646,7 +645,7 @@
       options.enabledPluginNames = pluginNames;
     }
 
-    LintConfig config = parseConfig(optionMap);
+    var config = parseConfig(optionMap);
     if (config != null) {
       Iterable<LintRule> lintRules = Registry.ruleRegistry.enabled(config);
       if (lintRules.isNotEmpty) {
@@ -656,9 +655,9 @@
     }
   }
 
-  void _applyExcludes(AnalysisOptionsImpl options, YamlNode excludes) {
+  void _applyExcludes(AnalysisOptionsImpl options, YamlNode? excludes) {
     if (excludes is YamlList) {
-      List<String> excludeList = toStringList(excludes);
+      var excludeList = toStringList(excludes);
       if (excludeList != null) {
         options.excludePatterns = excludeList;
       }
@@ -666,8 +665,8 @@
   }
 
   void _applyLanguageOption(
-      AnalysisOptionsImpl options, Object feature, Object value) {
-    bool boolValue = toBool(value);
+      AnalysisOptionsImpl options, Object? feature, Object value) {
+    var boolValue = toBool(value);
     if (boolValue != null) {
       if (feature == AnalyzerOptions.strictInference) {
         options.strictInference = boolValue;
@@ -678,18 +677,18 @@
     }
   }
 
-  void _applyLanguageOptions(AnalysisOptionsImpl options, YamlNode configs) {
+  void _applyLanguageOptions(AnalysisOptionsImpl options, YamlNode? configs) {
     if (configs is YamlMap) {
       configs.nodes.forEach((key, value) {
         if (key is YamlScalar && value is YamlScalar) {
-          String feature = key.value?.toString();
+          var feature = key.value?.toString();
           _applyLanguageOption(options, feature, value.value);
         }
       });
     }
   }
 
-  void _applyOptionalChecks(AnalysisOptionsImpl options, YamlNode config) {
+  void _applyOptionalChecks(AnalysisOptionsImpl options, YamlNode? config) {
     if (config is YamlMap) {
       config.nodes.forEach((k, v) {
         if (k is YamlScalar && v is YamlScalar) {
@@ -705,8 +704,8 @@
   }
 
   void _applyOptionalChecksOption(
-      AnalysisOptionsImpl options, String feature, Object value) {
-    bool boolValue = toBool(value);
+      AnalysisOptionsImpl options, String? feature, Object value) {
+    var boolValue = toBool(value);
     if (boolValue != null) {
       if (feature == AnalyzerOptions.chromeOsManifestChecks) {
         options.chromeOsManifestChecks = boolValue;
@@ -714,14 +713,14 @@
     }
   }
 
-  void _applyProcessors(AnalysisOptionsImpl options, YamlNode codes) {
+  void _applyProcessors(AnalysisOptionsImpl options, YamlNode? codes) {
     ErrorConfig config = ErrorConfig(codes);
     options.errorProcessors = config.processors;
   }
 
   void _applyStrongModeOption(
-      AnalysisOptionsImpl options, String feature, Object value) {
-    bool boolValue = toBool(value);
+      AnalysisOptionsImpl options, String? feature, Object value) {
+    var boolValue = toBool(value);
     if (boolValue != null) {
       if (feature == AnalyzerOptions.implicitCasts) {
         options.implicitCasts = boolValue;
@@ -732,7 +731,7 @@
     }
   }
 
-  void _applyStrongOptions(AnalysisOptionsImpl options, YamlNode config) {
+  void _applyStrongOptions(AnalysisOptionsImpl options, YamlNode? config) {
     if (config is YamlMap) {
       config.nodes.forEach((k, v) {
         if (k is YamlScalar && v is YamlScalar) {
@@ -742,7 +741,7 @@
     }
   }
 
-  String _toString(YamlNode node) {
+  String? _toString(YamlNode? node) {
     if (node is YamlScalar) {
       var value = node.value;
       if (value is String) {
diff --git a/pkg/analyzer/lib/src/task/strong/checker.dart b/pkg/analyzer/lib/src/task/strong/checker.dart
index 7e57d0c..57914fd 100644
--- a/pkg/analyzer/lib/src/task/strong/checker.dart
+++ b/pkg/analyzer/lib/src/task/strong/checker.dart
@@ -21,9 +21,8 @@
 import 'package:analyzer/src/error/codes.dart'
     show CompileTimeErrorCode, StrongModeCode;
 import 'package:analyzer/src/task/inference_error.dart';
-import 'package:meta/meta.dart';
 
-DartType _elementType(Element e) {
+DartType _elementType(Element? e) {
   if (e == null) {
     // Malformed code - just return dynamic.
     return DynamicTypeImpl.instance;
@@ -31,7 +30,7 @@
   return (e as dynamic).type;
 }
 
-Element _getKnownElement(Expression expression) {
+Element? _getKnownElement(Expression expression) {
   if (expression is ParenthesizedExpression) {
     return _getKnownElement(expression.expression);
   } else if (expression is NamedExpression) {
@@ -53,7 +52,7 @@
   final InheritanceManager3 inheritance;
   final AnalysisErrorListener reporter;
 
-  FeatureSet _featureSet;
+  late final FeatureSet _featureSet;
 
   CodeChecker(TypeProvider typeProvider, TypeSystemImpl rules, this.inheritance,
       AnalysisErrorListener reporter)
@@ -82,7 +81,7 @@
     int len = list.length;
     for (int i = 0; i < len; ++i) {
       Expression arg = list[i];
-      ParameterElement element = arg.staticParameterElement;
+      var element = arg.staticParameterElement;
       if (element == null) {
         // We found an argument mismatch, the analyzer will report this too,
         // so no need to insert an error for this here.
@@ -93,7 +92,7 @@
   }
 
   void checkAssignment(Expression expr, DartType to) {
-    checkForCast(expr, from: expr.staticType, to: to);
+    checkForCast(expr, from: expr.staticType!, to: to);
   }
 
   /// Analyzer checks boolean conversions, but we need to check too, because
@@ -103,7 +102,7 @@
       checkAssignment(expr, typeProvider.boolType);
 
   void checkCollectionElement(
-      CollectionElement element, DartType expectedType) {
+      CollectionElement? element, DartType expectedType) {
     if (element is ForElement) {
       checkCollectionElement(element.body, expectedType);
     } else if (element is IfElement) {
@@ -118,7 +117,7 @@
       DartType expressionCastType = typeProvider.iterableDynamicType;
       checkAssignment(element.expression, expressionCastType);
 
-      var exprType = element.expression.staticType;
+      var exprType = element.expression.staticType!;
       var asIterableType = exprType.asInstanceOf(typeProvider.iterableElement);
 
       if (asIterableType != null) {
@@ -133,8 +132,8 @@
 
   void checkForCast(
     Expression expr, {
-    @required DartType from,
-    @required DartType to,
+    required DartType from,
+    required DartType to,
   }) {
     if (expr is ParenthesizedExpression) {
       checkForCast(expr.expression, from: from, to: to);
@@ -143,7 +142,7 @@
     }
   }
 
-  void checkMapElement(CollectionElement element, DartType expectedKeyType,
+  void checkMapElement(CollectionElement? element, DartType expectedKeyType,
       DartType expectedValueType) {
     if (element is ForElement) {
       checkMapElement(element.body, expectedKeyType, expectedValueType);
@@ -161,7 +160,7 @@
           DynamicTypeImpl.instance, DynamicTypeImpl.instance);
       checkAssignment(element.expression, expressionCastType);
 
-      var exprType = element.expression.staticType;
+      var exprType = element.expression.staticType!;
       var asMapType = exprType.asInstanceOf(typeProvider.mapElement);
 
       if (asMapType != null) {
@@ -179,10 +178,6 @@
     }
   }
 
-  DartType getAnnotatedType(TypeAnnotation type) {
-    return type?.type ?? DynamicTypeImpl.instance;
-  }
-
   @override
   void visitAsExpression(AsExpression node) {
     // We could do the same check as the IsExpression below, but that is
@@ -199,7 +194,7 @@
     TokenType operatorType = operator.type;
     if (operatorType == TokenType.EQ ||
         operatorType == TokenType.QUESTION_QUESTION_EQ) {
-      checkForCast(right, from: right.staticType, to: node.writeType);
+      checkForCast(right, from: right.staticType!, to: node.writeType!);
     } else if (operatorType == TokenType.AMPERSAND_AMPERSAND_EQ ||
         operatorType == TokenType.BAR_BAR_EQ) {
       checkBoolean(left);
@@ -264,7 +259,7 @@
         //  [CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR] or
         //  [CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS] is reported for
         //  this constructor.
-        var source = (node.root as CompilationUnit).declaredElement.source;
+        var source = (node.root as CompilationUnit).declaredElement!.source;
         var token = initializer.superKeyword;
         reporter.onError(AnalysisError(source, token.offset, token.length,
             CompileTimeErrorCode.INVALID_SUPER_INVOCATION, [initializer]));
@@ -286,7 +281,6 @@
     // Check that defaults have the proper subtype.
     var parameter = node.parameter;
     var parameterType = _elementType(parameter.declaredElement);
-    assert(parameterType != null);
     var defaultValue = node.defaultValue;
     if (defaultValue != null) {
       checkAssignment(defaultValue, parameterType);
@@ -309,7 +303,7 @@
 
   @override
   void visitForEachPartsWithDeclaration(ForEachPartsWithDeclaration node) {
-    _visitForEachParts(node, node.loopVariable?.identifier);
+    _visitForEachParts(node, node.loopVariable.identifier);
     node.visitChildren(this);
   }
 
@@ -322,7 +316,7 @@
   @override
   void visitForPartsWithDeclarations(ForPartsWithDeclarations node) {
     if (node.condition != null) {
-      checkBoolean(node.condition);
+      checkBoolean(node.condition!);
     }
     node.visitChildren(this);
   }
@@ -330,7 +324,7 @@
   @override
   void visitForPartsWithExpression(ForPartsWithExpression node) {
     if (node.condition != null) {
-      checkBoolean(node.condition);
+      checkBoolean(node.condition!);
     }
     node.visitChildren(this);
   }
@@ -368,7 +362,7 @@
     var arguments = node.argumentList;
     var element = node.constructorName.staticElement;
     if (element != null) {
-      var type = _elementType(element);
+      var type = _elementType(element) as FunctionType;
       checkArgumentList(arguments, type);
     }
     node.visitChildren(this);
@@ -378,17 +372,14 @@
   void visitListLiteral(ListLiteral node) {
     DartType type = DynamicTypeImpl.instance;
     if (node.typeArguments != null) {
-      NodeList<TypeAnnotation> targs = node.typeArguments.arguments;
+      NodeList<TypeAnnotation> targs = node.typeArguments!.arguments;
       if (targs.isNotEmpty) {
-        type = targs[0].type;
+        type = targs[0].type!;
       }
     } else {
-      DartType staticType = node.staticType;
+      DartType staticType = node.staticType!;
       if (staticType is InterfaceType) {
-        List<DartType> targs = staticType.typeArguments;
-        if (targs != null && targs.isNotEmpty) {
-          type = targs[0];
-        }
+        type = staticType.typeArguments[0];
       }
     }
     NodeList<CollectionElement> elements = node.elements;
@@ -407,13 +398,12 @@
     // Don't visit methodName, we already checked things related to the call.
     node.target?.accept(this);
     node.typeArguments?.accept(this);
-    node.argumentList?.accept(this);
+    node.argumentList.accept(this);
   }
 
   @override
   void visitPostfixExpression(PostfixExpression node) {
-    _checkUnary(node.operand, node.operator, node.staticElement,
-        readType: node.readType, writeType: node.writeType);
+    _checkUnary(node, node.operand, node.operator, node.staticElement);
     node.visitChildren(this);
   }
 
@@ -422,8 +412,7 @@
     if (node.operator.type == TokenType.BANG) {
       checkBoolean(node.operand);
     } else {
-      _checkUnary(node.operand, node.operator, node.staticElement,
-          readType: node.readType, writeType: node.writeType);
+      _checkUnary(node, node.operand, node.operator, node.staticElement);
     }
     node.visitChildren(this);
   }
@@ -453,25 +442,17 @@
       DartType keyType = DynamicTypeImpl.instance;
       DartType valueType = DynamicTypeImpl.instance;
       if (node.typeArguments != null) {
-        NodeList<TypeAnnotation> typeArguments = node.typeArguments.arguments;
+        NodeList<TypeAnnotation> typeArguments = node.typeArguments!.arguments;
         if (typeArguments.isNotEmpty) {
-          keyType = typeArguments[0].type;
+          keyType = typeArguments[0].type!;
         }
         if (typeArguments.length > 1) {
-          valueType = typeArguments[1].type;
+          valueType = typeArguments[1].type!;
         }
       } else {
-        DartType staticType = node.staticType;
+        DartType staticType = node.staticType!;
         if (staticType is InterfaceType) {
-          List<DartType> typeArguments = staticType.typeArguments;
-          if (typeArguments != null) {
-            if (typeArguments.isNotEmpty) {
-              keyType = typeArguments[0];
-            }
-            if (typeArguments.length > 1) {
-              valueType = typeArguments[1];
-            }
-          }
+          keyType = staticType.typeArguments[0];
         }
       }
       NodeList<CollectionElement> elements = node.elements;
@@ -481,17 +462,14 @@
     } else if (node.isSet) {
       DartType type = DynamicTypeImpl.instance;
       if (node.typeArguments != null) {
-        NodeList<TypeAnnotation> typeArguments = node.typeArguments.arguments;
+        NodeList<TypeAnnotation> typeArguments = node.typeArguments!.arguments;
         if (typeArguments.isNotEmpty) {
-          type = typeArguments[0].type;
+          type = typeArguments[0].type!;
         }
       } else {
-        DartType staticType = node.staticType;
+        DartType staticType = node.staticType!;
         if (staticType is InterfaceType) {
-          List<DartType> typeArguments = staticType.typeArguments;
-          if (typeArguments != null && typeArguments.isNotEmpty) {
-            type = typeArguments[0];
-          }
+          type = staticType.typeArguments[0];
         }
       }
       NodeList<CollectionElement> elements = node.elements;
@@ -506,7 +484,7 @@
   void visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     var element = node.staticElement;
     if (element != null) {
-      var type = node.staticElement.type;
+      var type = element.type;
       checkArgumentList(node.argumentList, type);
     }
     node.visitChildren(this);
@@ -522,31 +500,30 @@
   }
 
   @override
-  Object visitVariableDeclaration(VariableDeclaration node) {
-    VariableElement variableElement =
-        node == null ? null : node.declaredElement;
-    AstNode parent = node.parent;
+  void visitVariableDeclaration(VariableDeclaration node) {
+    var variableElement = node.declaredElement;
+    var parent = node.parent;
     if (variableElement != null &&
         parent is VariableDeclarationList &&
         parent.type == null &&
         node.initializer != null) {
       if (variableElement.kind == ElementKind.TOP_LEVEL_VARIABLE ||
           variableElement.kind == ElementKind.FIELD) {
-        _validateTopLevelInitializer(variableElement.name, node.initializer);
+        _validateTopLevelInitializer(variableElement.name!, node.initializer!);
       }
     }
-    return super.visitVariableDeclaration(node);
+    node.visitChildren(this);
   }
 
   @override
   void visitVariableDeclarationList(VariableDeclarationList node) {
-    TypeAnnotation type = node.type;
+    var type = node.type;
     if (type != null) {
       for (VariableDeclaration variable in node.variables) {
         var initializer = variable.initializer;
         if (initializer != null) {
           checkForCast(initializer,
-              from: initializer.staticType, to: type.type);
+              from: initializer.staticType!, to: type.type!);
         }
       }
     }
@@ -580,9 +557,9 @@
       assert(functionType.optionalParameterTypes.isEmpty);
 
       // Refine the return type.
-      var rhsType = expr.rightHandSide.staticType;
+      var rhsType = expr.rightHandSide.staticType!;
       var returnType = rules.refineBinaryExpressionType(
-        expr.readType,
+        expr.readType!,
         op,
         rhsType,
         functionType.returnType,
@@ -601,7 +578,7 @@
       //     /*implicit assignment cast*/y += 42;
       //
       _checkImplicitCast(expr.leftHandSide,
-          to: expr.writeType, from: returnType, opAssign: true);
+          to: expr.writeType!, from: returnType, opAssign: true);
     }
   }
 
@@ -616,10 +593,10 @@
   /// Given an expression [expr] of type [fromType], returns true if an implicit
   /// downcast is required, false if it is not, or null if the types are
   /// unrelated.
-  bool _checkFunctionTypeCasts(
+  bool? _checkFunctionTypeCasts(
       Expression expr, FunctionType to, DartType fromType) {
     bool callTearoff = false;
-    FunctionType from;
+    FunctionType? from;
     if (fromType is FunctionType) {
       from = fromType;
     } else if (fromType is InterfaceType) {
@@ -652,8 +629,8 @@
   /// If [expr] does not require an implicit cast because it is not related to
   /// [to] or is already a subtype of it, does nothing.
   void _checkImplicitCast(Expression expr,
-      {@required DartType to,
-      @required DartType from,
+      {required DartType to,
+      required DartType from,
       bool opAssign = false,
       bool forSpread = false,
       bool forSpreadKey = false,
@@ -672,9 +649,9 @@
     }
   }
 
-  void _checkReturnOrYield(Expression expression, AstNode node,
+  void _checkReturnOrYield(Expression? expression, AstNode node,
       {bool yieldStar = false}) {
-    FunctionBody body = node.thisOrAncestorOfType<FunctionBody>();
+    var body = node.thisOrAncestorOfType<FunctionBody>()!;
     var type = _getExpectedReturnType(body, yieldStar: yieldStar);
     if (type == null) {
       // We have a type mismatch: the async/async*/sync* modifier does
@@ -686,56 +663,54 @@
     if (expression != null) checkAssignment(expression, type);
   }
 
-  void _checkUnary(Expression operand, Token op, MethodElement element,
-      {@required DartType readType, @required DartType writeType}) {
+  void _checkUnary(CompoundAssignmentExpression node, Expression operand,
+      Token op, MethodElement? element) {
     bool isIncrementAssign = op.type.isIncrementOperator;
-    if (op.isUserDefinableOperator || isIncrementAssign) {
-      if (element != null && isIncrementAssign) {
-        // For ++ and --, even if it is not dynamic, we still need to check
-        // that the user defined method accepts an `int` as the RHS.
-        //
-        // We assume Analyzer has done this already (in ErrorVerifier).
-        //
-        // However, we also need to check the return type.
+    if (element != null && isIncrementAssign) {
+      // For ++ and --, even if it is not dynamic, we still need to check
+      // that the user defined method accepts an `int` as the RHS.
+      //
+      // We assume Analyzer has done this already (in ErrorVerifier).
+      //
+      // However, we also need to check the return type.
 
-        // Refine the return type.
-        var functionType = element.type;
-        var rhsType = typeProvider.intType;
-        var returnType = rules.refineBinaryExpressionType(
-          readType,
-          TokenType.PLUS,
-          rhsType,
-          functionType.returnType,
-          element,
-        );
+      // Refine the return type.
+      var functionType = element.type;
+      var rhsType = typeProvider.intType;
+      var returnType = rules.refineBinaryExpressionType(
+        node.readType!,
+        TokenType.PLUS,
+        rhsType,
+        functionType.returnType,
+        element,
+      );
 
-        // Skip the argument check - `int` cannot be downcast.
-        //
-        // Check the return type for an implicit cast.
-        //
-        // If needed, mark the assignment to indicate a down cast when we assign
-        // back to it. So these two implicit casts are equivalent:
-        //
-        //     y = /*implicit cast*/(y + 1);
-        //     /*implicit assignment cast*/y++;
-        //
-        _checkImplicitCast(operand,
-            to: writeType, from: returnType, opAssign: true);
-      }
+      // Skip the argument check - `int` cannot be downcast.
+      //
+      // Check the return type for an implicit cast.
+      //
+      // If needed, mark the assignment to indicate a down cast when we assign
+      // back to it. So these two implicit casts are equivalent:
+      //
+      //     y = /*implicit cast*/(y + 1);
+      //     /*implicit assignment cast*/y++;
+      //
+      _checkImplicitCast(operand,
+          to: node.writeType!, from: returnType, opAssign: true);
     }
   }
 
   /// Gets the expected return type of the given function [body], either from
   /// a normal return/yield, or from a yield*.
-  DartType _getExpectedReturnType(FunctionBody body, {bool yieldStar = false}) {
+  DartType? _getExpectedReturnType(FunctionBody body,
+      {bool yieldStar = false}) {
     FunctionType functionType;
     var parent = body.parent;
     if (parent is Declaration) {
-      functionType = _elementType(parent.declaredElement);
+      functionType = _elementType(parent.declaredElement) as FunctionType;
     } else {
       assert(parent is FunctionExpression);
-      functionType =
-          (parent as FunctionExpression).staticType ?? DynamicTypeImpl.instance;
+      functionType = (parent as FunctionExpression).staticType as FunctionType;
     }
 
     var type = functionType.returnType;
@@ -784,7 +759,7 @@
     }
   }
 
-  DartType _getInstanceTypeArgument(
+  DartType? _getInstanceTypeArgument(
       DartType expressionType, ClassElement instanceType) {
     var asInstanceType = expressionType.asInstanceOf(instanceType);
     if (asInstanceType != null) {
@@ -797,8 +772,8 @@
   /// in the caller position of a call (that is, accounting
   /// for the possibility of a call method).  Returns null
   /// if expression is not statically callable.
-  FunctionType _getTypeAsCaller(InvocationExpression node) {
-    DartType type = node.staticInvokeType;
+  FunctionType? _getTypeAsCaller(InvocationExpression node) {
+    var type = node.staticInvokeType;
     if (type is FunctionType) {
       return type;
     } else if (type is InterfaceType) {
@@ -814,13 +789,13 @@
   /// downcast implicitly).
   ///
   /// If [from] is omitted, uses the static type of [expr]
-  bool _needsImplicitCast(Expression expr,
-      {@required DartType from, @required DartType to}) {
+  bool? _needsImplicitCast(Expression expr,
+      {required DartType from, required DartType to}) {
     // Void is considered Top, but may only be *explicitly* cast.
     if (from.isVoid) return null;
 
     if (to is FunctionType) {
-      bool needsCast = _checkFunctionTypeCasts(expr, to, from);
+      var needsCast = _checkFunctionTypeCasts(expr, to, from);
       if (needsCast != null) return needsCast;
     }
 
@@ -854,7 +829,7 @@
   /// This will emit the appropriate error/warning/hint message as well as mark
   /// the AST node.
   void _recordImplicitCast(Expression expr, DartType to,
-      {DartType from,
+      {required DartType from,
       bool opAssign = false,
       bool forSpread = false,
       bool forSpreadKey = false,
@@ -905,7 +880,7 @@
       }
 
       if (expr is InstanceCreationExpression) {
-        ConstructorElement e = expr.constructorName.staticElement;
+        var e = expr.constructorName.staticElement;
         if (e == null || !e.isFactory) {
           // fromT should be an exact type - this will almost certainly fail at
           // runtime.
@@ -915,14 +890,14 @@
         }
       }
 
-      Element e = _getKnownElement(expr);
+      var e = _getKnownElement(expr);
       if (e is FunctionElement || e is MethodElement && e.isStatic) {
         _recordMessage(
             expr,
             e is MethodElement
                 ? CompileTimeErrorCode.INVALID_CAST_METHOD
                 : CompileTimeErrorCode.INVALID_CAST_FUNCTION,
-            [e.name, from, to]);
+            [e!.name, from, to]);
         return;
       }
     }
@@ -943,7 +918,7 @@
         ? node.firstTokenAfterCommentAndMetadata.offset
         : node.offset;
     int length = node.end - begin;
-    var source = (node.root as CompilationUnit).declaredElement.source;
+    var source = (node.root as CompilationUnit).declaredElement!.source;
     var error = AnalysisError(source, begin, length, errorCode, arguments);
     reporter.onError(error);
   }
@@ -956,14 +931,11 @@
     if (loopVariable.staticElement is! VariableElement) {
       return;
     }
-    VariableElement loopVariableElement = loopVariable.staticElement;
+    var loopVariableElement = loopVariable.staticElement as VariableElement;
 
     // Safely handle malformed statements.
-    if (loopVariable == null) {
-      return;
-    }
-    Token awaitKeyword;
-    AstNode parent = node.parent;
+    Token? awaitKeyword;
+    var parent = node.parent;
     if (parent is ForStatement) {
       awaitKeyword = parent.awaitKeyword;
     } else if (parent is ForElement) {
@@ -976,7 +948,7 @@
     var sequenceElement = awaitKeyword != null
         ? typeProvider.streamElement
         : typeProvider.iterableElement;
-    var iterableType = node.iterable.staticType;
+    var iterableType = node.iterable.staticType!;
     var elementType = _getInstanceTypeArgument(iterableType, sequenceElement);
 
     // If the sequence is not an Iterable (or Stream for await for) but is a
@@ -1013,7 +985,7 @@
   void validateHasType(AstNode n, PropertyAccessorElement e) {
     if (e.hasImplicitReturnType) {
       var variable = e.declaration.variable as PropertyInducingElementImpl;
-      TopLevelInferenceError error = variable.typeInferenceError;
+      var error = variable.typeInferenceError;
       if (error != null) {
         if (error.kind == TopLevelInferenceErrorKind.dependencyCycle) {
           // Errors on const should have been reported with
@@ -1030,13 +1002,13 @@
     }
   }
 
-  void validateIdentifierElement(AstNode n, Element e,
+  void validateIdentifierElement(AstNode n, Element? e,
       {bool isMethodCall = false}) {
     if (e == null) {
       return;
     }
 
-    Element enclosing = e.enclosingElement;
+    var enclosing = e.enclosingElement;
     if (enclosing is CompilationUnitElement) {
       if (e is PropertyAccessorElement) {
         validateHasType(n, e);
@@ -1093,7 +1065,7 @@
 
   @override
   visitFunctionExpression(FunctionExpression node) {
-    FunctionBody body = node.body;
+    var body = node.body;
     if (body is ExpressionFunctionBody) {
       body.expression.accept(this);
     } else {
@@ -1128,7 +1100,7 @@
   @override
   visitInstanceCreationExpression(InstanceCreationExpression node) {
     var constructor = node.constructorName.staticElement;
-    ClassElement class_ = constructor?.enclosingElement;
+    var class_ = constructor?.enclosingElement;
     if (node.constructorName.type.typeArguments == null &&
         class_ != null &&
         class_.typeParameters.isNotEmpty) {
@@ -1169,7 +1141,7 @@
               StrongModeCode.TOP_LEVEL_INSTANCE_METHOD, [_name, method.name]);
         }
         // Type inference might depend on the parameters
-        node.argumentList?.accept(this);
+        node.argumentList.accept(this);
       }
     }
   }
diff --git a/pkg/analyzer/lib/src/task/strong_mode.dart b/pkg/analyzer/lib/src/task/strong_mode.dart
index b303bf0..ca1afb2 100644
--- a/pkg/analyzer/lib/src/task/strong_mode.dart
+++ b/pkg/analyzer/lib/src/task/strong_mode.dart
@@ -12,6 +12,7 @@
 import 'package:analyzer/src/dart/element/type_algebra.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/task/inference_error.dart';
+import 'package:collection/collection.dart';
 
 /// An object used to infer the type of instance fields and the return types of
 /// instance methods within a single compilation unit.
@@ -19,9 +20,9 @@
   final InheritanceManager3 inheritance;
   final Set<ClassElement> elementsBeingInferred = HashSet<ClassElement>();
 
-  TypeSystemImpl typeSystem;
-  bool isNonNullableByDefault;
-  ClassElement currentClassElement;
+  late TypeSystemImpl typeSystem;
+  late bool isNonNullableByDefault;
+  late ClassElement currentClassElement;
 
   /// Initialize a newly create inferrer.
   InstanceMemberInferrer(this.inheritance);
@@ -31,7 +32,7 @@
   /// Infer type information for all of the instance members in the given
   /// compilation [unit].
   void inferCompilationUnit(CompilationUnitElement unit) {
-    typeSystem = unit.library.typeSystem;
+    typeSystem = unit.library.typeSystem as TypeSystemImpl;
     isNonNullableByDefault = typeSystem.isNonNullableByDefault;
     _inferClasses(unit.mixins);
     _inferClasses(unit.types);
@@ -53,7 +54,7 @@
   /// Given a method, return the parameter in the method that corresponds to the
   /// given [parameter]. If the parameter is positional, then it appears at the
   /// given [index] in its enclosing element's list of parameters.
-  ParameterElement _getCorrespondingParameter(ParameterElement parameter,
+  ParameterElement? _getCorrespondingParameter(ParameterElement parameter,
       int index, List<ParameterElement> methodParameters) {
     //
     // Find the corresponding parameter.
@@ -63,10 +64,10 @@
       // If we're looking for a named parameter, only a named parameter with
       // the same name will be matched.
       //
-      return methodParameters.lastWhere(
+      return methodParameters.lastWhereOrNull(
           (ParameterElement methodParameter) =>
-              methodParameter.isNamed && methodParameter.name == parameter.name,
-          orElse: () => null);
+              methodParameter.isNamed &&
+              methodParameter.name == parameter.name);
     }
     //
     // If we're looking for a positional parameter we ignore the difference
@@ -87,8 +88,8 @@
   /// If the given [field] represents a non-synthetic instance field for
   /// which no type was provided, infer the type of the field.
   void _inferAccessorOrField({
-    PropertyAccessorElementImpl accessor,
-    FieldElementImpl field,
+    PropertyAccessorElementImpl? accessor,
+    FieldElementImpl? field,
   }) {
     Uri elementLibraryUri;
     String elementName;
@@ -99,14 +100,14 @@
       }
       elementLibraryUri = accessor.library.source.uri;
       elementName = accessor.displayName;
-    }
-
-    if (field != null) {
+    } else if (field != null) {
       if (field.isSynthetic || field.isStatic) {
         return;
       }
       elementLibraryUri = field.library.source.uri;
       elementName = field.name;
+    } else {
+      throw UnimplementedError();
     }
 
     var getterName = Name(elementLibraryUri, elementName);
@@ -132,7 +133,7 @@
     DartType combinedGetterType() {
       var combinedGetter = inheritance.combineSignatures(
         targetClass: currentClassElement,
-        candidates: overriddenGetters,
+        candidates: overriddenGetters!,
         doTopMerge: true,
         name: getterName,
       );
@@ -146,7 +147,7 @@
     DartType combinedSetterType() {
       var combinedSetter = inheritance.combineSignatures(
         targetClass: currentClassElement,
-        candidates: overriddenSetters,
+        candidates: overriddenSetters!,
         doTopMerge: true,
         name: setterName,
       );
@@ -233,7 +234,7 @@
     if (field != null) {
       if (field.setter != null) {
         if (overriddenSetters.any(_isCovariantSetter)) {
-          var parameter = field.setter.parameters[0] as ParameterElementImpl;
+          var parameter = field.setter!.parameters[0] as ParameterElementImpl;
           parameter.inheritsCovariant = true;
         }
       }
@@ -330,14 +331,18 @@
         // Then infer the types for the members.
         //
         currentClassElement = classElement;
-        for (FieldElement field in classElement.fields) {
-          _inferAccessorOrField(field: field);
+        for (var field in classElement.fields) {
+          _inferAccessorOrField(
+            field: field as FieldElementImpl,
+          );
         }
-        for (PropertyAccessorElement accessor in classElement.accessors) {
-          _inferAccessorOrField(accessor: accessor);
+        for (var accessor in classElement.accessors) {
+          _inferAccessorOrField(
+            accessor: accessor as PropertyAccessorElementImpl,
+          );
         }
-        for (MethodElement method in classElement.methods) {
-          _inferExecutable(method);
+        for (var method in classElement.methods) {
+          _inferExecutable(method as MethodElementImpl);
         }
         //
         // Infer initializing formal parameter types. This must happen after
@@ -366,7 +371,7 @@
     for (ParameterElement parameter in constructor.parameters) {
       if (parameter.hasImplicitType &&
           parameter is FieldFormalParameterElementImpl) {
-        FieldElement field = parameter.field;
+        var field = parameter.field;
         if (field != null) {
           parameter.type = field.type;
         }
@@ -392,7 +397,7 @@
       return;
     }
 
-    FunctionType combinedSignatureType;
+    FunctionType? combinedSignatureType;
     var hasImplicitType = element.hasImplicitReturnType ||
         element.parameters.any((e) => e.hasImplicitType);
     if (hasImplicitType) {
@@ -476,7 +481,7 @@
   /// [combinedSignatureType], which might be `null` if there is no valid
   /// combined signature for signatures from direct superinterfaces.
   void _inferParameterType(ParameterElementImpl parameter, int index,
-      FunctionType combinedSignatureType) {
+      FunctionType? combinedSignatureType) {
     if (combinedSignatureType != null) {
       var matchingParameter = _getCorrespondingParameter(
         parameter,
@@ -497,12 +502,9 @@
 
   /// Infer type information for all of the instance members in the given
   /// interface [type].
-  void _inferType(InterfaceType type) {
+  void _inferType(InterfaceType? type) {
     if (type != null) {
-      ClassElement element = type.element;
-      if (element != null) {
-        _inferClass(element);
-      }
+      _inferClass(type.element);
     }
   }
 
@@ -525,13 +527,13 @@
       return;
     }
 
-    ParameterElementImpl parameter = parameters[0];
+    var parameter = parameters[0] as ParameterElementImpl;
     if (!parameter.hasImplicitType) {
       element.isOperatorEqualWithParameterTypeFromObject = false;
       return;
     }
 
-    for (MethodElement overridden in overriddenElements) {
+    for (var overridden in overriddenElements) {
       overridden = overridden.declaration;
 
       // Skip Object itself.
@@ -566,7 +568,7 @@
   /// we must express its parameter and return types in terms of its own
   /// parameters. For example, given `m<T>(t)` overriding `m<S>(S s)` we
   /// should infer this as `m<T>(T t)`.
-  FunctionType _toOverriddenFunctionType(
+  FunctionType? _toOverriddenFunctionType(
       ExecutableElement element, ExecutableElement overriddenElement) {
     var elementTypeParameters = element.typeParameters;
     var overriddenTypeParameters = overriddenElement.typeParameters;
@@ -575,7 +577,7 @@
       return null;
     }
 
-    var overriddenType = overriddenElement.type;
+    var overriddenType = overriddenElement.type as FunctionTypeImpl;
     if (elementTypeParameters.isEmpty) {
       return overriddenType;
     }
diff --git a/pkg/analyzer/lib/src/test_utilities/find_element.dart b/pkg/analyzer/lib/src/test_utilities/find_element.dart
index 2e8694b..b44613c 100644
--- a/pkg/analyzer/lib/src/test_utilities/find_element.dart
+++ b/pkg/analyzer/lib/src/test_utilities/find_element.dart
@@ -13,13 +13,13 @@
   FindElement(this.unit);
 
   @override
-  CompilationUnitElement get unitElement => unit.declaredElement;
+  CompilationUnitElement get unitElement => unit.declaredElement!;
 
   ExportElement export(String targetUri) {
-    ExportElement result;
+    ExportElement? result;
 
     for (var export in unitElement.library.exports) {
-      var exportedUri = export.exportedLibrary.source.uri.toString();
+      var exportedUri = export.exportedLibrary!.source.uri.toString();
       if (exportedUri == targetUri) {
         if (result != null) {
           throw StateError('Not unique: $targetUri');
@@ -48,10 +48,10 @@
   }
 
   ImportElement import(String targetUri, {bool mustBeUnique = true}) {
-    ImportElement importElement;
+    ImportElement? importElement;
 
     for (var import in unitElement.library.imports) {
-      var importedUri = import.importedLibrary.source.uri.toString();
+      var importedUri = import.importedLibrary!.source.uri.toString();
       if (importedUri == targetUri) {
         if (importElement == null) {
           importElement = import;
@@ -73,7 +73,7 @@
   }
 
   LabelElement label(String name) {
-    LabelElement result;
+    LabelElement? result;
 
     void updateResult(Element element) {
       if (element is LabelElement && element.name == name) {
@@ -86,18 +86,18 @@
 
     unit.accept(FunctionAstVisitor(
       label: (node) {
-        updateResult(node.label.staticElement);
+        updateResult(node.label.staticElement!);
       },
     ));
 
     if (result == null) {
       throw StateError('Not found: $name');
     }
-    return result;
+    return result!;
   }
 
   FunctionElement localFunction(String name) {
-    FunctionElement result;
+    FunctionElement? result;
 
     unit.accept(FunctionAstVisitor(
       functionDeclarationStatement: (node) {
@@ -114,11 +114,11 @@
     if (result == null) {
       throw StateError('Not found: $name');
     }
-    return result;
+    return result!;
   }
 
   LocalVariableElement localVar(String name) {
-    LocalVariableElement result;
+    LocalVariableElement? result;
 
     void updateResult(Element element) {
       if (element is LocalVariableElement && element.name == name) {
@@ -131,26 +131,26 @@
 
     unit.accept(FunctionAstVisitor(
       declaredIdentifier: (node) {
-        updateResult(node.declaredElement);
+        updateResult(node.declaredElement!);
       },
       simpleIdentifier: (node) {
         if (node.parent is CatchClause) {
-          updateResult(node.staticElement);
+          updateResult(node.staticElement!);
         }
       },
       variableDeclaration: (node) {
-        updateResult(node.declaredElement);
+        updateResult(node.declaredElement!);
       },
     ));
 
     if (result == null) {
       throw StateError('Not found: $name');
     }
-    return result;
+    return result!;
   }
 
   ParameterElement parameter(String name) {
-    ParameterElement result;
+    ParameterElement? result;
 
     void findIn(List<ParameterElement> parameters) {
       for (var parameter in parameters) {
@@ -199,20 +199,20 @@
     unit.accept(
       FunctionAstVisitor(functionExpression: (node, local) {
         if (local) {
-          var functionElement = node.declaredElement;
+          var functionElement = node.declaredElement!;
           findIn(functionElement.parameters);
         }
       }),
     );
 
     if (result != null) {
-      return result;
+      return result!;
     }
     throw StateError('Not found: $name');
   }
 
   CompilationUnitElement part(String targetUri) {
-    CompilationUnitElement partElement;
+    CompilationUnitElement? partElement;
 
     for (var part in unitElement.library.parts) {
       if (part.uri == targetUri) {
@@ -238,14 +238,14 @@
     for (var import_ in unitElement.library.imports) {
       var prefix = import_.prefix;
       if (prefix?.name == name) {
-        return prefix;
+        return prefix!;
       }
     }
     throw StateError('Not found: $name');
   }
 
   TypeParameterElement typeParameter(String name) {
-    TypeParameterElement result;
+    TypeParameterElement? result;
 
     void findIn(List<TypeParameterElement> typeParameters) {
       for (var typeParameter in typeParameters) {
@@ -287,7 +287,7 @@
     }
 
     if (result != null) {
-      return result;
+      return result!;
     }
     throw StateError('Not found: $name');
   }
@@ -299,9 +299,9 @@
 
   ImportFindElement(this.import);
 
-  LibraryElement get importedLibrary => import.importedLibrary;
+  LibraryElement get importedLibrary => import.importedLibrary!;
 
-  PrefixElement get prefix => import.prefix;
+  PrefixElement? get prefix => import.prefix;
 
   @override
   CompilationUnitElement get unitElement {
@@ -342,9 +342,9 @@
     throw StateError('Not found: $name');
   }
 
-  ConstructorElement constructor(String name, {String of}) {
+  ConstructorElement constructor(String name, {String? of}) {
     assert(name != '');
-    ConstructorElement result;
+    ConstructorElement? result;
     for (var class_ in unitElement.types) {
       if (of == null || class_.name == of) {
         for (var constructor in class_.constructors) {
@@ -381,8 +381,8 @@
     throw StateError('Not found: $name');
   }
 
-  FieldElement field(String name, {String of}) {
-    FieldElement result;
+  FieldElement field(String name, {String? of}) {
+    FieldElement? result;
 
     void findIn(List<FieldElement> fields) {
       for (var field in fields) {
@@ -424,13 +424,13 @@
     }
 
     if (result != null) {
-      return result;
+      return result!;
     }
     throw StateError('Not found: $name');
   }
 
-  PropertyAccessorElement getter(String name, {String of}) {
-    PropertyAccessorElement result;
+  PropertyAccessorElement getter(String name, {String? of}) {
+    PropertyAccessorElement? result;
 
     void findIn(List<PropertyAccessorElement> accessors) {
       for (var accessor in accessors) {
@@ -472,13 +472,13 @@
     }
 
     if (result != null) {
-      return result;
+      return result!;
     }
     throw StateError('Not found: $name');
   }
 
-  MethodElement method(String name, {String of}) {
-    MethodElement result;
+  MethodElement method(String name, {String? of}) {
+    MethodElement? result;
 
     void findIn(List<MethodElement> methods) {
       for (var method in methods) {
@@ -513,7 +513,7 @@
     }
 
     if (result != null) {
-      return result;
+      return result!;
     }
     throw StateError('Not found: $name');
   }
@@ -527,8 +527,8 @@
     throw StateError('Not found: $name');
   }
 
-  PropertyAccessorElement setter(String name, {String of}) {
-    PropertyAccessorElement result;
+  PropertyAccessorElement setter(String name, {String? of}) {
+    PropertyAccessorElement? result;
 
     void findIn(List<PropertyAccessorElement> accessors) {
       for (var accessor in accessors) {
@@ -563,7 +563,7 @@
     }
 
     if (result != null) {
-      return result;
+      return result!;
     }
     throw StateError('Not found: $name');
   }
@@ -578,11 +578,11 @@
   }
 
   PropertyAccessorElement topGet(String name) {
-    return topVar(name).getter;
+    return topVar(name).getter!;
   }
 
   PropertyAccessorElement topSet(String name) {
-    return topVar(name).setter;
+    return topVar(name).setter!;
   }
 
   TopLevelVariableElement topVar(String name) {
@@ -604,6 +604,6 @@
   }
 
   ConstructorElement unnamedConstructor(String name) {
-    return class_(name).unnamedConstructor;
+    return class_(name).unnamedConstructor!;
   }
 }
diff --git a/pkg/analyzer/lib/src/test_utilities/find_node.dart b/pkg/analyzer/lib/src/test_utilities/find_node.dart
index 91afc47..566e8d7 100644
--- a/pkg/analyzer/lib/src/test_utilities/find_node.dart
+++ b/pkg/analyzer/lib/src/test_utilities/find_node.dart
@@ -12,7 +12,8 @@
   FindNode(this.content, this.unit);
 
   LibraryDirective get libraryDirective {
-    return unit.directives.singleWhere((d) => d is LibraryDirective);
+    return unit.directives.singleWhere((d) => d is LibraryDirective)
+        as LibraryDirective;
   }
 
   Annotation annotation(String search) {
@@ -357,7 +358,7 @@
     return _node(search, (n) => n is WhileStatement);
   }
 
-  AstNode _node(String search, bool Function(AstNode) predicate) {
+  T _node<T>(String search, bool Function(AstNode) predicate) {
     int offset = this.offset(search);
 
     var node = NodeLocator2(offset).searchWithin(unit);
@@ -371,6 +372,6 @@
       throw StateError(
           'The node for |$search| had no matching ancestor in:\n$content');
     }
-    return result;
+    return result as T;
   }
 }
diff --git a/pkg/analyzer/lib/src/test_utilities/function_ast_visitor.dart b/pkg/analyzer/lib/src/test_utilities/function_ast_visitor.dart
index 4fc84f6..126dd97 100644
--- a/pkg/analyzer/lib/src/test_utilities/function_ast_visitor.dart
+++ b/pkg/analyzer/lib/src/test_utilities/function_ast_visitor.dart
@@ -7,13 +7,13 @@
 
 /// [RecursiveAstVisitor] that delegates visit methods to functions.
 class FunctionAstVisitor extends RecursiveAstVisitor<void> {
-  final void Function(DeclaredIdentifier) declaredIdentifier;
-  final void Function(FunctionDeclarationStatement)
+  final void Function(DeclaredIdentifier)? declaredIdentifier;
+  final void Function(FunctionDeclarationStatement)?
       functionDeclarationStatement;
-  final void Function(FunctionExpression, bool) functionExpression;
-  final void Function(Label) label;
-  final void Function(SimpleIdentifier) simpleIdentifier;
-  final void Function(VariableDeclaration) variableDeclaration;
+  final void Function(FunctionExpression, bool)? functionExpression;
+  final void Function(Label)? label;
+  final void Function(SimpleIdentifier)? simpleIdentifier;
+  final void Function(VariableDeclaration)? variableDeclaration;
 
   FunctionAstVisitor({
     this.declaredIdentifier,
@@ -27,7 +27,7 @@
   @override
   void visitDeclaredIdentifier(DeclaredIdentifier node) {
     if (declaredIdentifier != null) {
-      declaredIdentifier(node);
+      declaredIdentifier!(node);
     }
     super.visitDeclaredIdentifier(node);
   }
@@ -35,7 +35,7 @@
   @override
   void visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
     if (functionDeclarationStatement != null) {
-      functionDeclarationStatement(node);
+      functionDeclarationStatement!(node);
     }
     super.visitFunctionDeclarationStatement(node);
   }
@@ -44,8 +44,8 @@
   void visitFunctionExpression(FunctionExpression node) {
     if (functionExpression != null) {
       var local = node.parent is! FunctionDeclaration ||
-          node.parent.parent is FunctionDeclarationStatement;
-      functionExpression(node, local);
+          node.parent!.parent is FunctionDeclarationStatement;
+      functionExpression!(node, local);
     }
     super.visitFunctionExpression(node);
   }
@@ -53,7 +53,7 @@
   @override
   void visitLabel(Label node) {
     if (label != null) {
-      label(node);
+      label!(node);
     }
     super.visitLabel(node);
   }
@@ -61,7 +61,7 @@
   @override
   void visitSimpleIdentifier(SimpleIdentifier node) {
     if (simpleIdentifier != null) {
-      simpleIdentifier(node);
+      simpleIdentifier!(node);
     }
     super.visitSimpleIdentifier(node);
   }
@@ -69,7 +69,7 @@
   @override
   void visitVariableDeclaration(VariableDeclaration node) {
     if (variableDeclaration != null) {
-      variableDeclaration(node);
+      variableDeclaration!(node);
     }
     super.visitVariableDeclaration(node);
   }
diff --git a/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart b/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
index 16f0bcd..c6c83c4 100644
--- a/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
+++ b/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
@@ -10,7 +10,6 @@
 import 'package:analyzer/src/dart/sdk/sdk.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:meta/meta.dart';
 import 'package:pub_semver/src/version.dart';
 
 const String sdkRoot = '/sdk';
@@ -284,6 +283,7 @@
 
 abstract class Comparable<T> {
   int compareTo(T other);
+  static int compare(Comparable a, Comparable b) => a.compareTo(b);
 }
 
 typedef Comparator<T> = int Function(T a, T b);
@@ -1083,7 +1083,7 @@
   ],
 );
 
-final List<SdkLibrary> _LIBRARIES = [
+final List<MockSdkLibrary> _LIBRARIES = [
   _LIB_CORE,
   _LIB_ASYNC,
   _LIB_ASYNC2,
@@ -1117,9 +1117,9 @@
   final Map<String, String> uriMap = {};
 
   @override
-  final List<SdkLibrary> sdkLibraries = [];
+  final List<MockSdkLibrary> sdkLibraries = [];
 
-  File _versionFile;
+  late final File _versionFile;
 
   /// Optional [additionalLibraries] should have unique URIs, and paths in
   /// their units are relative (will be put into `sdkRoot/lib`).
@@ -1130,10 +1130,10 @@
   /// [sdkVersion], if supplied will override the version stored in the mock
   /// SDK's `version` file.
   MockSdk({
-    @required this.resourceProvider,
+    required this.resourceProvider,
     List<MockSdkLibrary> additionalLibraries = const [],
     List<String> nullSafePackages = const [],
-    String sdkVersion,
+    String? sdkVersion,
   }) {
     sdkVersion ??= '${ExperimentStatus.currentVersion.major}.'
         '${ExperimentStatus.currentVersion.minor}.0';
@@ -1215,7 +1215,7 @@
   }
 
   @override
-  String get allowedExperimentsJson {
+  String? get allowedExperimentsJson {
     try {
       var convertedRoot = resourceProvider.convertPath(sdkRoot);
       return resourceProvider
@@ -1243,7 +1243,7 @@
       sdkLibraries.map((SdkLibrary library) => library.shortName).toList();
 
   @override
-  Source fromFileUri(Uri uri) {
+  Source? fromFileUri(Uri uri) {
     String filePath = resourceProvider.pathContext.fromUri(uri);
     if (!filePath.startsWith(resourceProvider.convertPath('$sdkRoot/lib/'))) {
       return null;
@@ -1252,7 +1252,7 @@
       String libraryPath = library.path;
       if (filePath == libraryPath) {
         try {
-          File file = resourceProvider.getResource(filePath);
+          var file = resourceProvider.getFile(filePath);
           Uri dartUri = Uri.parse(library.shortName);
           return file.createSource(dartUri);
         } catch (exception) {
@@ -1266,7 +1266,7 @@
         String pathInLibrary = filePath.substring(libraryRootPath.length);
         String uriStr = '${library.shortName}/$pathInLibrary';
         try {
-          File file = resourceProvider.getResource(filePath);
+          var file = resourceProvider.getFile(filePath);
           Uri dartUri = Uri.parse(uriStr);
           return file.createSource(dartUri);
         } catch (exception) {
@@ -1278,7 +1278,7 @@
   }
 
   @override
-  SdkLibrary getSdkLibrary(String dartUri) {
+  SdkLibrary? getSdkLibrary(String dartUri) {
     for (SdkLibrary library in _LIBRARIES) {
       if (library.shortName == dartUri) {
         return library;
@@ -1288,10 +1288,10 @@
   }
 
   @override
-  Source mapDartUri(String dartUri) {
-    String path = uriMap[dartUri];
+  Source? mapDartUri(String dartUri) {
+    var path = uriMap[dartUri];
     if (path != null) {
-      File file = resourceProvider.getResource(path);
+      var file = resourceProvider.getFile(path);
       Uri uri = Uri(scheme: 'dart', path: dartUri.substring(5));
       return file.createSource(uri);
     }
diff --git a/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart b/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart
index 39b7903..cfd22eb 100644
--- a/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart
+++ b/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart
@@ -12,11 +12,10 @@
 import 'package:analyzer/src/generated/engine.dart' as engine;
 import 'package:analyzer/src/generated/testing/element_factory.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
-import 'package:meta/meta.dart';
 
 class MockSdkElements {
-  final LibraryElement coreLibrary;
-  final LibraryElement asyncLibrary;
+  final LibraryElementImpl coreLibrary;
+  final LibraryElementImpl asyncLibrary;
 
   factory MockSdkElements(
     engine.AnalysisContext analysisContext,
@@ -35,39 +34,39 @@
   final engine.AnalysisContext analysisContext;
   final AnalysisSessionImpl analysisSession;
 
-  ClassElementImpl _boolElement;
-  ClassElementImpl _comparableElement;
-  ClassElementImpl _completerElement;
-  ClassElementImpl _deprecatedElement;
-  ClassElementImpl _doubleElement;
-  ClassElementImpl _functionElement;
-  ClassElementImpl _futureElement;
-  ClassElementImpl _futureOrElement;
-  ClassElementImpl _intElement;
-  ClassElementImpl _iterableElement;
-  ClassElementImpl _iteratorElement;
-  ClassElementImpl _listElement;
-  ClassElementImpl _mapElement;
-  ClassElementImpl _nullElement;
-  ClassElementImpl _numElement;
-  ClassElementImpl _objectElement;
-  ClassElementImpl _overrideElement;
-  ClassElementImpl _proxyElement;
-  ClassElementImpl _setElement;
-  ClassElementImpl _stackTraceElement;
-  ClassElementImpl _streamElement;
-  ClassElementImpl _streamSubscriptionElement;
-  ClassElementImpl _stringElement;
-  ClassElementImpl _symbolElement;
-  ClassElementImpl _typeElement;
+  ClassElementImpl? _boolElement;
+  ClassElementImpl? _comparableElement;
+  ClassElementImpl? _completerElement;
+  ClassElementImpl? _deprecatedElement;
+  ClassElementImpl? _doubleElement;
+  ClassElementImpl? _functionElement;
+  ClassElementImpl? _futureElement;
+  ClassElementImpl? _futureOrElement;
+  ClassElementImpl? _intElement;
+  ClassElementImpl? _iterableElement;
+  ClassElementImpl? _iteratorElement;
+  ClassElementImpl? _listElement;
+  ClassElementImpl? _mapElement;
+  ClassElementImpl? _nullElement;
+  ClassElementImpl? _numElement;
+  ClassElementImpl? _objectElement;
+  ClassElementImpl? _overrideElement;
+  ClassElementImpl? _proxyElement;
+  ClassElementImpl? _setElement;
+  ClassElementImpl? _stackTraceElement;
+  ClassElementImpl? _streamElement;
+  ClassElementImpl? _streamSubscriptionElement;
+  ClassElementImpl? _stringElement;
+  ClassElementImpl? _symbolElement;
+  ClassElementImpl? _typeElement;
 
-  InterfaceType _boolType;
-  InterfaceType _doubleType;
-  InterfaceType _intType;
-  InterfaceType _numType;
-  InterfaceType _objectType;
-  InterfaceType _stringType;
-  InterfaceType _typeType;
+  InterfaceType? _boolType;
+  InterfaceType? _doubleType;
+  InterfaceType? _intType;
+  InterfaceType? _numType;
+  InterfaceType? _objectType;
+  InterfaceType? _stringType;
+  InterfaceType? _typeType;
 
   _MockSdkElementsBuilder(
     this.analysisContext,
@@ -75,12 +74,13 @@
   );
 
   ClassElementImpl get boolElement {
-    if (_boolElement != null) return _boolElement;
+    var boolElement = _boolElement;
+    if (boolElement != null) return boolElement;
 
-    _boolElement = _class(name: 'bool');
-    _boolElement.supertype = objectType;
+    _boolElement = boolElement = _class(name: 'bool');
+    boolElement.supertype = objectType;
 
-    _boolElement.constructors = [
+    boolElement.constructors = [
       _constructor(
         name: 'fromEnvironment',
         isConst: true,
@@ -92,7 +92,7 @@
       ),
     ];
 
-    return _boolElement;
+    return boolElement;
   }
 
   InterfaceType get boolType {
@@ -100,47 +100,50 @@
   }
 
   ClassElementImpl get comparableElement {
-    if (_comparableElement != null) return _comparableElement;
+    var comparableElement = _comparableElement;
+    if (comparableElement != null) return comparableElement;
 
     var tElement = _typeParameter('T');
-    _comparableElement = _class(
+    _comparableElement = comparableElement = _class(
       name: 'Comparable',
       isAbstract: true,
       typeParameters: [tElement],
     );
-    _comparableElement.supertype = objectType;
+    comparableElement.supertype = objectType;
 
-    return _comparableElement;
+    return comparableElement;
   }
 
   ClassElementImpl get completerElement {
-    if (_completerElement != null) return _completerElement;
+    var completerElement = _completerElement;
+    if (completerElement != null) return completerElement;
 
     var tElement = _typeParameter('T');
-    _completerElement = _class(
+    _completerElement = completerElement = _class(
       name: 'Completer',
       isAbstract: true,
       typeParameters: [tElement],
     );
-    _completerElement.supertype = objectType;
+    completerElement.supertype = objectType;
 
-    return _completerElement;
+    return completerElement;
   }
 
   ClassElementImpl get deprecatedElement {
-    if (_deprecatedElement != null) return _deprecatedElement;
+    var deprecatedElement = _deprecatedElement;
+    if (deprecatedElement != null) return deprecatedElement;
 
-    _deprecatedElement = _class(name: 'Deprecated');
-    _deprecatedElement.supertype = objectType;
+    _deprecatedElement = deprecatedElement = _class(name: 'Deprecated');
+    deprecatedElement.supertype = objectType;
 
-    _deprecatedElement.fields = <FieldElement>[
+    deprecatedElement.fields = <FieldElement>[
       _field('message', stringType, isFinal: true),
     ];
 
-    _deprecatedElement.accessors =
-        _deprecatedElement.fields.map((f) => f.getter).toList();
+    deprecatedElement.accessors =
+        deprecatedElement.fields.map((f) => f.getter!).toList();
 
-    _deprecatedElement.constructors = [
+    deprecatedElement.constructors = [
       _constructor(
         isConst: true,
         parameters: [
@@ -149,20 +152,24 @@
       ),
     ];
 
-    return _deprecatedElement;
+    return deprecatedElement;
   }
 
   ClassElementImpl get doubleElement {
-    if (_doubleElement != null) return _doubleElement;
+    var doubleElement = _doubleElement;
+    if (doubleElement != null) return doubleElement;
 
-    _doubleElement = _class(name: 'double', isAbstract: true);
-    _doubleElement.supertype = numType;
+    _doubleElement = doubleElement = _class(
+      name: 'double',
+      isAbstract: true,
+    );
+    doubleElement.supertype = numType;
 
     FieldElement staticConstDoubleField(String name) {
       return _field(name, doubleType, isStatic: true, isConst: true);
     }
 
-    _doubleElement.fields = <FieldElement>[
+    doubleElement.fields = <FieldElement>[
       staticConstDoubleField('nan'),
       staticConstDoubleField('infinity'),
       staticConstDoubleField('negativeInfinity'),
@@ -170,10 +177,10 @@
       staticConstDoubleField('maxFinite'),
     ];
 
-    _doubleElement.accessors =
-        _doubleElement.fields.map((field) => field.getter).toList();
+    doubleElement.accessors =
+        doubleElement.fields.map((field) => field.getter!).toList();
 
-    _doubleElement.methods = [
+    doubleElement.methods = [
       _method('+', doubleType, parameters: [
         _requiredParameter('other', numType),
       ]),
@@ -206,7 +213,7 @@
       _method('truncate', doubleType),
     ];
 
-    return _doubleElement;
+    return doubleElement;
   }
 
   InterfaceType get doubleType {
@@ -216,12 +223,16 @@
   DynamicTypeImpl get dynamicType => DynamicTypeImpl.instance;
 
   ClassElementImpl get functionElement {
-    if (_functionElement != null) return _functionElement;
+    var functionElement = _functionElement;
+    if (functionElement != null) return functionElement;
 
-    _functionElement = _class(name: 'Function', isAbstract: true);
-    _functionElement.supertype = objectType;
+    _functionElement = functionElement = _class(
+      name: 'Function',
+      isAbstract: true,
+    );
+    functionElement.supertype = objectType;
 
-    return _functionElement;
+    return functionElement;
   }
 
   InterfaceType get functionType {
@@ -229,20 +240,21 @@
   }
 
   ClassElementImpl get futureElement {
-    if (_futureElement != null) return _futureElement;
+    var futureElement = _futureElement;
+    if (futureElement != null) return futureElement;
 
     var tElement = _typeParameter('T');
     var tType = _typeParameterType(tElement);
 
-    _futureElement = _class(
+    _futureElement = futureElement = _class(
       name: 'Future',
       isAbstract: true,
       typeParameters: [tElement],
     );
-    _futureElement.supertype = objectType;
+    futureElement.supertype = objectType;
 
     //   factory Future.value([FutureOr<T> value])
-    _futureElement.constructors = [
+    futureElement.constructors = [
       _constructor(
         isFactory: true,
         parameters: [
@@ -254,7 +266,7 @@
     //   Future<R> then<R>(FutureOr<R> onValue(T value), {Function onError})
     var rElement = _typeParameter('R');
     var rType = _typeParameterType(rElement);
-    _futureElement.methods = [
+    futureElement.methods = [
       _method(
         'then',
         futureType(rType),
@@ -273,29 +285,31 @@
       ),
     ];
 
-    return _futureElement;
+    return futureElement;
   }
 
   ClassElementImpl get futureOrElement {
-    if (_futureOrElement != null) return _futureOrElement;
+    var futureOrElement = _futureOrElement;
+    if (futureOrElement != null) return futureOrElement;
 
     var tElement = _typeParameter('T');
-    _futureOrElement = _class(
+    _futureOrElement = futureOrElement = _class(
       name: 'FutureOr',
       typeParameters: [tElement],
     );
-    _futureOrElement.supertype = objectType;
+    futureOrElement.supertype = objectType;
 
-    return _futureOrElement;
+    return futureOrElement;
   }
 
   ClassElementImpl get intElement {
-    if (_intElement != null) return _intElement;
+    var intElement = _intElement;
+    if (intElement != null) return intElement;
 
-    _intElement = _class(name: 'int', isAbstract: true);
-    _intElement.supertype = numType;
+    _intElement = intElement = _class(name: 'int', isAbstract: true);
+    intElement.supertype = numType;
 
-    _intElement.constructors = [
+    intElement.constructors = [
       _constructor(
         name: 'fromEnvironment',
         isConst: true,
@@ -307,7 +321,7 @@
       ),
     ];
 
-    _intElement.methods = [
+    intElement.methods = [
       _method('&', intType, parameters: [
         _requiredParameter('other', intType),
       ]),
@@ -333,7 +347,7 @@
       _method('toString', stringType),
     ];
 
-    return _intElement;
+    return intElement;
   }
 
   InterfaceType get intType {
@@ -341,77 +355,80 @@
   }
 
   ClassElementImpl get iterableElement {
-    if (_iterableElement != null) return _iterableElement;
+    var iterableElement = _iterableElement;
+    if (iterableElement != null) return iterableElement;
 
     var eElement = _typeParameter('E');
     var eType = _typeParameterType(eElement);
 
-    _iterableElement = _class(
+    _iterableElement = iterableElement = _class(
       name: 'Iterable',
       isAbstract: true,
       typeParameters: [eElement],
     );
-    _iterableElement.supertype = objectType;
+    iterableElement.supertype = objectType;
 
-    _iterableElement.constructors = [
+    iterableElement.constructors = [
       _constructor(isConst: true),
     ];
 
-    _setAccessors(_iterableElement, [
+    _setAccessors(iterableElement, [
       _getter('iterator', iteratorType(eType)),
       _getter('last', eType),
     ]);
 
-    return _iterableElement;
+    return iterableElement;
   }
 
   ClassElementImpl get iteratorElement {
-    if (_iteratorElement != null) return _iteratorElement;
+    var iteratorElement = _iteratorElement;
+    if (iteratorElement != null) return iteratorElement;
 
     var eElement = _typeParameter('E');
     var eType = _typeParameterType(eElement);
 
-    _iteratorElement = _class(
+    _iteratorElement = iteratorElement = _class(
       name: 'Iterator',
       isAbstract: true,
       typeParameters: [eElement],
     );
-    _iteratorElement.supertype = objectType;
+    iteratorElement.supertype = objectType;
 
-    _setAccessors(_iterableElement, [
+    _setAccessors(iterableElement, [
       _getter('current', eType),
     ]);
 
-    return _iteratorElement;
+    return iteratorElement;
   }
 
   ClassElementImpl get listElement {
-    if (_listElement != null) return _listElement;
+    var listElement = _listElement;
+    if (listElement != null) return listElement;
 
     var eElement = _typeParameter('E');
     var eType = _typeParameterType(eElement);
 
-    _listElement = _class(
+    _listElement = listElement = _class(
       name: 'List',
       isAbstract: true,
       typeParameters: [eElement],
     );
-    _listElement.supertype = objectType;
-    _listElement.interfaces = [
+    listElement.supertype = objectType;
+    listElement.interfaces = [
       iterableType(eType),
     ];
 
-    _listElement.constructors = [
+    listElement.constructors = [
       _constructor(isFactory: true, parameters: [
         _positionalParameter('length', intType),
       ]),
     ];
 
-    _setAccessors(_listElement, [
+    _setAccessors(listElement, [
       _getter('length', intType),
     ]);
 
-    _listElement.methods = [
+    listElement.methods = [
       _method('[]', eType, parameters: [
         _requiredParameter('index', intType),
       ]),
@@ -424,29 +441,30 @@
       ]),
     ];
 
-    return _listElement;
+    return listElement;
   }
 
   ClassElementImpl get mapElement {
-    if (_mapElement != null) return _mapElement;
+    var mapElement = _mapElement;
+    if (mapElement != null) return mapElement;
 
     var kElement = _typeParameter('K');
     var vElement = _typeParameter('V');
     var kType = _typeParameterType(kElement);
     var vType = _typeParameterType(vElement);
 
-    _mapElement = _class(
+    _mapElement = mapElement = _class(
       name: 'Map',
       isAbstract: true,
       typeParameters: [kElement, vElement],
     );
-    _mapElement.supertype = objectType;
+    mapElement.supertype = objectType;
 
-    _setAccessors(_mapElement, [
+    _setAccessors(mapElement, [
       _getter('length', intType),
     ]);
 
-    _mapElement.methods = [
+    mapElement.methods = [
       _method('[]', vType, parameters: [
         _requiredParameter('key', objectType),
       ]),
@@ -456,38 +474,40 @@
       ]),
     ];
 
-    return _mapElement;
+    return mapElement;
   }
 
   ClassElementImpl get nullElement {
-    if (_nullElement != null) return _nullElement;
+    var nullElement = _nullElement;
+    if (nullElement != null) return nullElement;
 
-    _nullElement = _class(name: 'Null');
-    _nullElement.supertype = objectType;
+    _nullElement = nullElement = _class(name: 'Null');
+    nullElement.supertype = objectType;
 
-    _nullElement.constructors = [
+    nullElement.constructors = [
       _constructor(
         name: '_uninstantiatable',
         isFactory: true,
       ),
     ];
 
-    return _nullElement;
+    return nullElement;
   }
 
   ClassElementImpl get numElement {
-    if (_numElement != null) return _numElement;
+    var numElement = _numElement;
+    if (numElement != null) return numElement;
 
-    _numElement = _class(name: 'num', isAbstract: true);
-    _numElement.supertype = objectType;
-    _numElement.interfaces = [
+    _numElement = numElement = _class(name: 'num', isAbstract: true);
+    numElement.supertype = objectType;
+    numElement.interfaces = [
       _interfaceType(
         comparableElement,
         typeArguments: [numType],
       ),
     ];
 
-    _numElement.methods = [
+    numElement.methods = [
       _method('+', numType, parameters: [
         _requiredParameter('other', numType),
       ]),
@@ -545,13 +565,13 @@
       ]),
     ];
 
-    _setAccessors(_numElement, [
+    _setAccessors(numElement, [
       _getter('isInfinite', boolType),
       _getter('isNaN', boolType),
       _getter('isNegative', boolType),
     ]);
 
-    return _numElement;
+    return numElement;
   }
 
   InterfaceType get numType {
@@ -559,17 +579,18 @@
   }
 
   ClassElementImpl get objectElement {
-    if (_objectElement != null) return _objectElement;
+    var objectElement = _objectElement;
+    if (objectElement != null) return objectElement;
 
-    _objectElement = ElementFactory.object;
-    _objectElement.interfaces = const <InterfaceType>[];
-    _objectElement.mixins = const <InterfaceType>[];
-    _objectElement.typeParameters = const <TypeParameterElement>[];
-    _objectElement.constructors = [
+    _objectElement = objectElement = ElementFactory.object;
+    objectElement.interfaces = const <InterfaceType>[];
+    objectElement.mixins = const <InterfaceType>[];
+    objectElement.typeParameters = const <TypeParameterElement>[];
+    objectElement.constructors = [
       _constructor(isConst: true),
     ];
 
-    _objectElement.methods = [
+    objectElement.methods = [
       _method('toString', stringType),
       _method('==', boolType, parameters: [
         _requiredParameter('other', objectType),
@@ -579,12 +600,12 @@
       ]),
     ];
 
-    _setAccessors(_objectElement, [
+    _setAccessors(objectElement, [
       _getter('hashCode', intType),
       _getter('runtimeType', typeType),
     ]);
 
-    return _objectElement;
+    return objectElement;
   }
 
   InterfaceType get objectType {
@@ -592,76 +613,84 @@
   }
 
   ClassElementImpl get overrideElement {
-    if (_overrideElement != null) return _overrideElement;
+    var overrideElement = _overrideElement;
+    if (overrideElement != null) return overrideElement;
 
-    _overrideElement = _class(name: '_Override');
-    _overrideElement.supertype = objectType;
+    _overrideElement = overrideElement = _class(name: '_Override');
+    overrideElement.supertype = objectType;
 
-    _overrideElement.constructors = [
+    overrideElement.constructors = [
       _constructor(isConst: true),
     ];
 
-    return _overrideElement;
+    return overrideElement;
   }
 
   ClassElementImpl get proxyElement {
-    if (_proxyElement != null) return _proxyElement;
+    var proxyElement = _proxyElement;
+    if (proxyElement != null) return proxyElement;
 
-    _proxyElement = _class(name: '_Proxy');
-    _proxyElement.supertype = objectType;
+    _proxyElement = proxyElement = _class(name: '_Proxy');
+    proxyElement.supertype = objectType;
 
-    _proxyElement.constructors = [
+    proxyElement.constructors = [
       _constructor(isConst: true),
     ];
 
-    return _proxyElement;
+    return proxyElement;
   }
 
   ClassElementImpl get setElement {
-    if (_setElement != null) return _setElement;
+    var setElement = _setElement;
+    if (setElement != null) return setElement;
 
     var eElement = _typeParameter('E');
     var eType = _typeParameterType(eElement);
 
-    _setElement = _class(
+    _setElement = setElement = _class(
       name: 'Set',
       isAbstract: true,
       typeParameters: [eElement],
     );
-    _setElement.supertype = objectType;
-    _setElement.interfaces = [
+    setElement.supertype = objectType;
+    setElement.interfaces = [
       iterableType(eType),
     ];
 
-    return _setElement;
+    return setElement;
   }
 
   ClassElementImpl get stackTraceElement {
-    if (_stackTraceElement != null) return _stackTraceElement;
+    var stackTraceElement = _stackTraceElement;
+    if (stackTraceElement != null) return stackTraceElement;
 
-    _stackTraceElement = _class(name: 'StackTrace', isAbstract: true);
-    _stackTraceElement.supertype = objectType;
+    _stackTraceElement = stackTraceElement = _class(
+      name: 'StackTrace',
+      isAbstract: true,
+    );
+    stackTraceElement.supertype = objectType;
 
-    return _stackTraceElement;
+    return stackTraceElement;
   }
 
   ClassElementImpl get streamElement {
-    if (_streamElement != null) return _streamElement;
+    var streamElement = _streamElement;
+    if (streamElement != null) return streamElement;
 
     var tElement = _typeParameter('T');
     var tType = _typeParameterType(tElement);
 
-    _streamElement = _class(
+    _streamElement = streamElement = _class(
       name: 'Stream',
       isAbstract: true,
       typeParameters: [tElement],
     );
-    _streamElement.isAbstract = true;
-    _streamElement.supertype = objectType;
+    streamElement.isAbstract = true;
+    streamElement.supertype = objectType;
 
     //    StreamSubscription<T> listen(void onData(T event),
     //        {Function onError, void onDone(), bool cancelOnError});
-    _streamElement.methods = [
+    streamElement.methods = [
       _method(
         'listen',
         streamSubscriptionType(tType),
@@ -685,30 +714,35 @@
       ),
     ];
 
-    return _streamElement;
+    return streamElement;
   }
 
   ClassElementImpl get streamSubscriptionElement {
-    if (_streamSubscriptionElement != null) return _streamSubscriptionElement;
+    var streamSubscriptionElement = _streamSubscriptionElement;
+    if (streamSubscriptionElement != null) return streamSubscriptionElement;
 
     var tElement = _typeParameter('T');
-    _streamSubscriptionElement = _class(
+    _streamSubscriptionElement = streamSubscriptionElement = _class(
       name: 'StreamSubscription',
       isAbstract: true,
       typeParameters: [tElement],
     );
-    _streamSubscriptionElement.supertype = objectType;
+    streamSubscriptionElement.supertype = objectType;
 
-    return _streamSubscriptionElement;
+    return streamSubscriptionElement;
   }
 
   ClassElementImpl get stringElement {
-    if (_stringElement != null) return _stringElement;
+    var stringElement = _stringElement;
+    if (stringElement != null) return stringElement;
 
-    _stringElement = _class(name: 'String', isAbstract: true);
-    _stringElement.supertype = objectType;
+    _stringElement = stringElement = _class(
+      name: 'String',
+      isAbstract: true,
+    );
+    stringElement.supertype = objectType;
 
-    _stringElement.constructors = [
+    stringElement.constructors = [
       _constructor(
         name: 'fromEnvironment',
         isConst: true,
@@ -720,21 +754,21 @@
       ),
     ];
 
-    _setAccessors(_stringElement, [
+    _setAccessors(stringElement, [
       _getter('isEmpty', boolType),
       _getter('length', intType),
       _getter('codeUnits', listType(intType)),
     ]);
 
-    _stringElement.methods = [
-      _method('+', _stringType, parameters: [
-        _requiredParameter('other', _stringType),
+    stringElement.methods = [
+      _method('+', stringType, parameters: [
+        _requiredParameter('other', stringType),
       ]),
-      _method('toLowerCase', _stringType),
-      _method('toUpperCase', _stringType),
+      _method('toLowerCase', stringType),
+      _method('toUpperCase', stringType),
     ];
 
-    return _stringElement;
+    return stringElement;
   }
 
   InterfaceType get stringType {
@@ -742,12 +776,16 @@
   }
 
   ClassElementImpl get symbolElement {
-    if (_symbolElement != null) return _symbolElement;
+    var symbolElement = _symbolElement;
+    if (symbolElement != null) return symbolElement;
 
-    _symbolElement = _class(name: 'Symbol', isAbstract: true);
-    _symbolElement.supertype = objectType;
+    _symbolElement = symbolElement = _class(
+      name: 'Symbol',
+      isAbstract: true,
+    );
+    symbolElement.supertype = objectType;
 
-    _symbolElement.constructors = [
+    symbolElement.constructors = [
       _constructor(
         isConst: true,
         isFactory: true,
@@ -757,16 +795,20 @@
       ),
     ];
 
-    return _symbolElement;
+    return symbolElement;
   }
 
   ClassElementImpl get typeElement {
-    if (_typeElement != null) return _typeElement;
+    var typeElement = _typeElement;
+    if (typeElement != null) return typeElement;
 
-    _typeElement = _class(name: 'Type', isAbstract: true);
-    _typeElement.supertype = objectType;
+    _typeElement = typeElement = _class(
+      name: 'Type',
+      isAbstract: true,
+    );
+    typeElement.supertype = objectType;
 
-    return _typeElement;
+    return typeElement;
   }
 
   InterfaceType get typeType {
@@ -828,7 +870,7 @@
     );
 
     var asyncUnit = CompilationUnitElementImpl();
-    var asyncSource = analysisContext.sourceFactory.forUri('dart:async');
+    var asyncSource = analysisContext.sourceFactory.forUri('dart:async')!;
     asyncUnit.librarySource = asyncUnit.source = asyncSource;
     asyncLibrary.definingCompilationUnit = asyncUnit;
 
@@ -846,7 +888,7 @@
   LibraryElementImpl _buildCore() {
     var coreUnit = CompilationUnitElementImpl();
 
-    var coreSource = analysisContext.sourceFactory.forUri('dart:core');
+    var coreSource = analysisContext.sourceFactory.forUri('dart:core')!;
     coreUnit.librarySource = coreUnit.source = coreSource;
 
     coreUnit.types = <ClassElement>[
@@ -901,9 +943,9 @@
     );
 
     coreUnit.accessors = <PropertyAccessorElement>[
-      deprecatedVariable.getter,
-      overrideVariable.getter,
-      proxyVariable.getter,
+      deprecatedVariable.getter!,
+      overrideVariable.getter!,
+      proxyVariable.getter!,
     ];
     coreUnit.topLevelVariables = <TopLevelVariableElement>[
       deprecatedVariable,
@@ -925,7 +967,7 @@
   }
 
   ClassElementImpl _class({
-    @required String name,
+    required String name,
     bool isAbstract = false,
     List<TypeParameterElement> typeParameters = const [],
   }) {
@@ -973,7 +1015,7 @@
   }
 
   FunctionType _functionType({
-    @required DartType returnType,
+    required DartType returnType,
     List<TypeParameterElement> typeFormals = const [],
     List<ParameterElement> parameters = const [],
   }) {
@@ -1031,7 +1073,7 @@
   }
 
   ParameterElement _namedParameter(String name, DartType type,
-      {String initializerCode}) {
+      {String? initializerCode}) {
     var parameter = DefaultParameterElementImpl(name, 0);
     parameter.parameterKind = ParameterKind.NAMED;
     parameter.type = type;
diff --git a/pkg/analyzer/lib/src/test_utilities/package_config_file_builder.dart b/pkg/analyzer/lib/src/test_utilities/package_config_file_builder.dart
index 4f19b2e..88c13b0 100644
--- a/pkg/analyzer/lib/src/test_utilities/package_config_file_builder.dart
+++ b/pkg/analyzer/lib/src/test_utilities/package_config_file_builder.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/meta.dart';
-
 /// Helper for building `.dart_tool/package_config.json` files.
 ///
 /// See accepted/future-releases/language-versioning/package-config-file-v2.md
@@ -17,10 +15,10 @@
   /// The [packageUri] is optional, a URI reference, resolved against the
   /// file URI of the [rootPath]. The result must be inside the [rootPath].
   void add({
-    @required String name,
-    @required String rootPath,
+    required String name,
+    required String rootPath,
     String packageUri = 'lib/',
-    String languageVersion,
+    String? languageVersion,
   }) {
     if (_packages.any((e) => e.name == name)) {
       throw StateError('Already added: $name');
@@ -42,7 +40,7 @@
   }
 
   String toContent({
-    @required String Function(String) toUriStr,
+    required String Function(String) toUriStr,
   }) {
     var buffer = StringBuffer();
 
@@ -64,10 +62,8 @@
       var rootUri = toUriStr(package.rootPath);
       buffer.write('$prefix"rootUri": "$rootUri"');
 
-      if (package.packageUri != null) {
-        buffer.writeln(',');
-        buffer.write('$prefix"packageUri": "${package.packageUri}"');
-      }
+      buffer.writeln(',');
+      buffer.write('$prefix"packageUri": "${package.packageUri}"');
 
       if (package.languageVersion != null) {
         buffer.writeln(',');
@@ -92,12 +88,12 @@
   final String name;
   final String rootPath;
   final String packageUri;
-  final String languageVersion;
+  final String? languageVersion;
 
   _PackageDescription({
-    @required this.name,
-    @required this.rootPath,
-    @required this.packageUri,
-    @required this.languageVersion,
+    required this.name,
+    required this.rootPath,
+    required this.packageUri,
+    required this.languageVersion,
   });
 }
diff --git a/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart b/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart
index 24e1ae5..4358c03 100644
--- a/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart
+++ b/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart
@@ -35,13 +35,13 @@
   }
 
   String join(String part1,
-          [String part2,
-          String part3,
-          String part4,
-          String part5,
-          String part6,
-          String part7,
-          String part8]) =>
+          [String? part2,
+          String? part3,
+          String? part4,
+          String? part5,
+          String? part6,
+          String? part7,
+          String? part8]) =>
       resourceProvider.pathContext
           .join(part1, part2, part3, part4, part5, part6, part7, part8);
 
diff --git a/pkg/analyzer/lib/src/util/asserts.dart b/pkg/analyzer/lib/src/util/asserts.dart
index 3c251d3..127f484 100644
--- a/pkg/analyzer/lib/src/util/asserts.dart
+++ b/pkg/analyzer/lib/src/util/asserts.dart
@@ -5,7 +5,7 @@
 /// Ensures that the given [value] is not null.
 /// Otherwise throws an [ArgumentError].
 /// An optional [description] is used in the error message.
-void notNull(Object value, [String description]) {
+void notNull(Object? value, [String? description]) {
   if (value == null) {
     if (description == null) {
       throw ArgumentError('Must not be null');
diff --git a/pkg/analyzer/lib/src/util/ast_data_extractor.dart b/pkg/analyzer/lib/src/util/ast_data_extractor.dart
index a95a277..8668479 100644
--- a/pkg/analyzer/lib/src/util/ast_data_extractor.dart
+++ b/pkg/analyzer/lib/src/util/ast_data_extractor.dart
@@ -21,46 +21,46 @@
   NodeId computeDefaultNodeId(AstNode node) =>
       NodeId(_nodeOffset(node), IdKind.node);
 
-  T computeElementValue(Id id, Element element) => null;
+  T? computeElementValue(Id id, Element element) => null;
 
-  void computeForClass(Declaration node, Id id) {
+  void computeForClass(Declaration node, Id? id) {
     if (id == null) return;
-    T value = computeNodeValue(id, node);
+    T? value = computeNodeValue(id, node);
     registerValue(uri, _nodeOffset(node), id, value, node);
   }
 
-  void computeForCollectionElement(CollectionElement node, NodeId id) {
+  void computeForCollectionElement(CollectionElement node, NodeId? id) {
     if (id == null) return;
-    T value = computeNodeValue(id, node);
+    T? value = computeNodeValue(id, node);
     registerValue(uri, _nodeOffset(node), id, value, node);
   }
 
-  void computeForLibrary(LibraryElement library, Id id) {
+  void computeForLibrary(LibraryElement library, Id? id) {
     if (id == null) return;
-    T value = computeElementValue(id, library);
+    T? value = computeElementValue(id, library);
     registerValue(uri, 0, id, value, library);
   }
 
-  void computeForMember(Declaration node, Id id) {
+  void computeForMember(Declaration node, Id? id) {
     if (id == null) return;
-    T value = computeNodeValue(id, node);
+    T? value = computeNodeValue(id, node);
     registerValue(uri, _nodeOffset(node), id, value, node);
   }
 
-  void computeForStatement(Statement node, NodeId id) {
+  void computeForStatement(Statement node, NodeId? id) {
     if (id == null) return;
-    T value = computeNodeValue(id, node);
+    T? value = computeNodeValue(id, node);
     registerValue(uri, _nodeOffset(node), id, value, node);
   }
 
   /// Implement this to compute the data corresponding to [node].
   ///
   /// If `null` is returned, [node] has no associated data.
-  T computeNodeValue(Id id, AstNode node);
+  T? computeNodeValue(Id id, AstNode node);
 
   Id createClassId(Declaration node) {
-    var element = node.declaredElement;
-    return ClassId(element.name);
+    var element = node.declaredElement!;
+    return ClassId(element.name!);
   }
 
   Id createLibraryId(LibraryElement node) {
@@ -73,20 +73,20 @@
   }
 
   Id createMemberId(Declaration node) {
-    var element = node.declaredElement;
+    var element = node.declaredElement!;
     if (element.enclosingElement is CompilationUnitElement) {
-      var memberName = element.name;
+      var memberName = element.name!;
       if (element is PropertyAccessorElement && element.isSetter) {
         memberName += '=';
       }
       return MemberId.internal(memberName);
     } else if (element.enclosingElement is ClassElement) {
-      var memberName = element.name;
-      var className = element.enclosingElement.name;
+      var memberName = element.name!;
+      var className = element.enclosingElement!.name;
       return MemberId.internal(memberName, className: className);
     } else if (element.enclosingElement is ExtensionElement) {
       var memberName = element.name;
-      var extensionName = element.enclosingElement.name;
+      var extensionName = element.enclosingElement!.name;
       if (element is PropertyAccessorElement) {
         memberName = '${element.isGetter ? 'get' : 'set'}#$memberName';
       }
@@ -128,7 +128,7 @@
 
   @override
   void visitCompilationUnit(CompilationUnit node) {
-    var library = node.declaredElement.library;
+    var library = node.declaredElement!.library;
     computeForLibrary(library, createLibraryId(library));
     super.visitCompilationUnit(node);
   }
@@ -165,9 +165,9 @@
 
   @override
   void visitVariableDeclaration(VariableDeclaration node) {
-    if (node.parent.parent is TopLevelVariableDeclaration) {
+    if (node.parent!.parent is TopLevelVariableDeclaration) {
       computeForMember(node, createMemberId(node));
-    } else if (node.parent.parent is FieldDeclaration) {
+    } else if (node.parent!.parent is FieldDeclaration) {
       computeForMember(node, createMemberId(node));
     }
     super.visitVariableDeclaration(node);
@@ -182,14 +182,13 @@
     } else {
       offset = node.offset;
     }
-    assert(offset != null && offset >= 0,
-        "No fileOffset on $node (${node.runtimeType})");
+    assert(offset >= 0, "No fileOffset on $node (${node.runtimeType})");
     return offset;
   }
 }
 
 class _Failure implements Exception {
-  final String message;
+  final String? message;
 
   _Failure([this.message]);
 
diff --git a/pkg/analyzer/lib/src/util/comment.dart b/pkg/analyzer/lib/src/util/comment.dart
index 3188e04..cb295c6 100644
--- a/pkg/analyzer/lib/src/util/comment.dart
+++ b/pkg/analyzer/lib/src/util/comment.dart
@@ -5,7 +5,7 @@
 import 'package:analyzer/dart/ast/ast.dart';
 
 /// Return the raw text of the given comment node.
-String getCommentNodeRawText(Comment node) {
+String? getCommentNodeRawText(Comment? node) {
   if (node == null) return null;
 
   return node.tokens
@@ -15,7 +15,7 @@
 }
 
 /// Return the plain text from the given DartDoc [rawText], without delimiters.
-String getDartDocPlainText(String rawText) {
+String? getDartDocPlainText(String? rawText) {
   if (rawText == null) return null;
 
   // Remove /** */.
@@ -53,7 +53,7 @@
 }
 
 /// Return the DartDoc summary, i.e. the portion before the first empty line.
-String getDartDocSummary(String completeText) {
+String? getDartDocSummary(String? completeText) {
   if (completeText == null) return null;
 
   var result = StringBuffer();
diff --git a/pkg/analyzer/lib/src/util/glob.dart b/pkg/analyzer/lib/src/util/glob.dart
index 3fa8a1a9..2fc88cd 100644
--- a/pkg/analyzer/lib/src/util/glob.dart
+++ b/pkg/analyzer/lib/src/util/glob.dart
@@ -22,8 +22,8 @@
   /// The pattern string.
   final String _pattern;
 
-  String _suffix;
-  RegExp _regex;
+  String? _suffix;
+  RegExp? _regex;
 
   Glob(this._separator, this._pattern) {
     if (_hasJustPrefix(_pattern, '**/*')) {
@@ -46,9 +46,9 @@
   bool matches(String path) {
     String posixPath = _toPosixPath(path);
     if (_suffix != null) {
-      return posixPath.toLowerCase().endsWith(_suffix);
+      return posixPath.toLowerCase().endsWith(_suffix!);
     }
-    return _regex.matchAsPrefix(posixPath) != null;
+    return _regex!.matchAsPrefix(posixPath) != null;
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/util/graph.dart b/pkg/analyzer/lib/src/util/graph.dart
index b94a177..cc8f666 100644
--- a/pkg/analyzer/lib/src/util/graph.dart
+++ b/pkg/analyzer/lib/src/util/graph.dart
@@ -26,7 +26,7 @@
 
     // Step 3: For each edge from [vertex] to a neighboring vertex [neighbor]:
     for (T neighbor in graph.neighborsOf(vertex)) {
-      int neighborPreorderNumber = preorderNumbers[neighbor];
+      var neighborPreorderNumber = preorderNumbers[neighbor];
       if (neighborPreorderNumber == null) {
         // If the preorder number of [neighbor] has not yet been assigned,
         // recursively search [neighbor];
@@ -38,7 +38,7 @@
         // * Repeatedly pop vertices from [candidates] until the top element of
         //   [candidates] has a preorder number less than or equal to the
         //   preorder number of [neighbor].
-        while (preorderNumbers[candidates.last] > neighborPreorderNumber) {
+        while (preorderNumbers[candidates.last]! > neighborPreorderNumber) {
           candidates.removeLast();
         }
       }
diff --git a/pkg/analyzer/lib/src/util/lru_map.dart b/pkg/analyzer/lib/src/util/lru_map.dart
index 050663e..66f6129 100644
--- a/pkg/analyzer/lib/src/util/lru_map.dart
+++ b/pkg/analyzer/lib/src/util/lru_map.dart
@@ -14,14 +14,14 @@
 class LRUMap<K, V> {
   final LinkedHashMap<K, V> _map = LinkedHashMap<K, V>();
   final int _maxSize;
-  final EvictionHandler<K, V> _handler;
+  final EvictionHandler<K, V>? _handler;
 
   LRUMap(this._maxSize, [this._handler]);
 
   /// Returns the value for the given [key] or null if [key] is not
   /// in the cache.
-  V get(K key) {
-    V value = _map.remove(key);
+  V? get(K key) {
+    V? value = _map.remove(key);
     if (value != null) {
       _map[key] = value;
     }
@@ -37,9 +37,9 @@
     _map[key] = value;
     if (_map.length > _maxSize) {
       K evictedKey = _map.keys.first;
-      V evictedValue = _map.remove(evictedKey);
+      V evictedValue = _map.remove(evictedKey)!;
       if (_handler != null) {
-        _handler(evictedKey, evictedValue);
+        _handler!.call(evictedKey, evictedValue);
       }
     }
   }
diff --git a/pkg/analyzer/lib/src/util/performance/operation_performance.dart b/pkg/analyzer/lib/src/util/performance/operation_performance.dart
index c2ce9ae..3a090d2 100644
--- a/pkg/analyzer/lib/src/util/performance/operation_performance.dart
+++ b/pkg/analyzer/lib/src/util/performance/operation_performance.dart
@@ -2,7 +2,7 @@
 // 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.
 
-import 'package:meta/meta.dart';
+import 'package:collection/collection.dart';
 
 /// The performance of an operation.
 abstract class OperationPerformance {
@@ -22,11 +22,11 @@
   /// The name of the operation.
   String get name;
 
-  OperationPerformance getChild(String name);
+  OperationPerformance? getChild(String name);
 
   /// Write this operation and its children into the [buffer].
   void write({
-    @required StringBuffer buffer,
+    required StringBuffer buffer,
     String indent = '',
   });
 }
@@ -72,7 +72,7 @@
   final String name;
 
   final Stopwatch _timer = Stopwatch();
-  final List<OperationPerformance> _children = [];
+  final List<OperationPerformanceImpl> _children = [];
 
   final Map<String, OperationPerformanceData<Object>> _data = {};
 
@@ -106,18 +106,21 @@
   }
 
   @override
-  OperationPerformance getChild(String name) {
-    return children.firstWhere(
+  OperationPerformanceImpl? getChild(String name) {
+    return _children.firstWhereOrNull(
       (child) => child.name == name,
-      orElse: () => null,
     );
   }
 
   OperationPerformanceDataImpl_int getDataInt(String name) {
-    return _data.putIfAbsent(
-      name,
-      () => OperationPerformanceDataImpl_int(name),
-    );
+    var data = _data[name];
+    if (data is OperationPerformanceDataImpl_int) {
+      return data;
+    } else if (data != null) {
+      throw StateError('Not int: ${data.runtimeType}');
+    } else {
+      return _data[name] = OperationPerformanceDataImpl_int(name);
+    }
   }
 
   /// Run the [operation] as a child with the given [name].
@@ -166,7 +169,7 @@
   }
 
   @override
-  void write({@required StringBuffer buffer, String indent = ''}) {
+  void write({required StringBuffer buffer, String indent = ''}) {
     buffer.write('$indent${toString()}');
 
     if (_data.isNotEmpty) {
diff --git a/pkg/analyzer/lib/src/util/sdk.dart b/pkg/analyzer/lib/src/util/sdk.dart
index e1dd259..d588cc3 100644
--- a/pkg/analyzer/lib/src/util/sdk.dart
+++ b/pkg/analyzer/lib/src/util/sdk.dart
@@ -6,7 +6,7 @@
 
 import 'package:path/path.dart' as path;
 
-String getSdkPath([List<String> args]) {
+String getSdkPath([List<String>? args]) {
   // Look for --dart-sdk on the command line.
   if (args != null) {
     int index = args.indexOf('--dart-sdk');
@@ -24,7 +24,7 @@
 
   // Look in env['DART_SDK']
   if (Platform.environment['DART_SDK'] != null) {
-    return Platform.environment['DART_SDK'];
+    return Platform.environment['DART_SDK']!;
   }
 
   // Use Platform.resolvedExecutable.
diff --git a/pkg/analyzer/lib/src/util/yaml.dart b/pkg/analyzer/lib/src/util/yaml.dart
index 47593b0b..1696085 100644
--- a/pkg/analyzer/lib/src/util/yaml.dart
+++ b/pkg/analyzer/lib/src/util/yaml.dart
@@ -4,12 +4,13 @@
 
 import 'dart:collection';
 
+import 'package:source_span/source_span.dart';
 import 'package:yaml/src/event.dart';
 import 'package:yaml/yaml.dart';
 
 /// Given a [map], return the [YamlNode] associated with the given [key], or
 /// `null` if there is no matching key.
-YamlNode getKey(YamlMap map, String key) {
+YamlNode? getKey(YamlMap map, String key) {
   for (YamlNode k in map.nodes.keys) {
     if (k is YamlScalar && k.value == key) {
       return k;
@@ -20,7 +21,7 @@
 
 /// Given a [map], return the value associated with the key whose value matches
 /// the given [key], or `null` if there is no matching key.
-YamlNode getValue(YamlMap map, String key) {
+YamlNode? getValue(YamlMap map, String key) {
   for (var k in map.nodes.keys) {
     if (k is YamlScalar && k.value == key) {
       return map.nodes[k];
@@ -31,7 +32,7 @@
 
 /// If all of the elements of [list] are strings, return a list of strings
 /// containing the same elements. Otherwise, return `null`.
-List<String> toStringList(List list) {
+List<String>? toStringList(List? list) {
   if (list == null) {
     return null;
   }
@@ -68,16 +69,17 @@
   ///   * maps are merged recursively.
   ///   * if map values cannot be merged, the overriding value is taken.
   ///
-  YamlNode merge(YamlNode o1, YamlNode o2) {
+  YamlNode merge(YamlNode o1, YamlNode? o2) {
     // Handle promotion first.
     YamlMap listToMap(YamlList list) {
       Map<YamlNode, YamlNode> map =
           HashMap<YamlNode, YamlNode>(); // equals: _equals, hashCode: _hashCode
-      ScalarEvent event = ScalarEvent(null, 'true', ScalarStyle.PLAIN);
+      ScalarEvent event =
+          ScalarEvent(o1.span as FileSpan, 'true', ScalarStyle.PLAIN);
       for (var element in list.nodes) {
         map[element] = YamlScalar.internal(true, event);
       }
-      return YamlMap.internal(map, null, CollectionStyle.BLOCK);
+      return YamlMap.internal(map, o1.span, CollectionStyle.BLOCK);
     }
 
     if (isListOfString(o1) && isMapToBools(o2)) {
@@ -105,7 +107,7 @@
         list.add(n2);
       }
     }
-    return YamlList.internal(list, null, CollectionStyle.BLOCK);
+    return YamlList.internal(list, l1.span, CollectionStyle.BLOCK);
   }
 
   /// Merge maps (recursively).
@@ -116,18 +118,24 @@
       merged[k] = v;
     });
     m2.nodes.forEach((k, v) {
-      YamlScalar mergedKey = merged.keys
-          .firstWhere((key) => key.value == k.value, orElse: () => k);
-      merged[mergedKey] = merge(merged[mergedKey], v);
+      var mergedKey =
+          merged.keys.firstWhere((key) => key.value == k.value, orElse: () => k)
+              as YamlScalar;
+      var o1 = merged[mergedKey];
+      if (o1 != null) {
+        merged[mergedKey] = merge(o1, v);
+      } else {
+        merged[mergedKey] = v;
+      }
     });
-    return YamlMap.internal(merged, null, CollectionStyle.BLOCK);
+    return YamlMap.internal(merged, m1.span, CollectionStyle.BLOCK);
   }
 
-  static bool isListOfString(Object o) =>
+  static bool isListOfString(Object? o) =>
       o is YamlList &&
       o.nodes.every((e) => e is YamlScalar && e.value is String);
 
-  static bool isMapToBools(Object o) =>
+  static bool isMapToBools(Object? o) =>
       o is YamlMap &&
       o.nodes.values.every((v) => v is YamlScalar && v.value is bool);
 }
diff --git a/pkg/analyzer/lib/src/workspace/basic.dart b/pkg/analyzer/lib/src/workspace/basic.dart
index 5f3be2a..bf505d2 100644
--- a/pkg/analyzer/lib/src/workspace/basic.dart
+++ b/pkg/analyzer/lib/src/workspace/basic.dart
@@ -15,19 +15,20 @@
   /// The singular package in this workspace.
   ///
   /// Each basic workspace is itself one package.
-  BasicWorkspacePackage _theOnlyPackage;
+  late final BasicWorkspacePackage _theOnlyPackage;
 
   BasicWorkspace._(
     ResourceProvider provider,
     Map<String, List<Folder>> packageMap,
     String root,
-  ) : super(provider, packageMap, root);
+  ) : super(provider, packageMap, root) {
+    _theOnlyPackage = BasicWorkspacePackage(root, this);
+  }
 
   @override
-  WorkspacePackage findPackageFor(String filePath) {
+  WorkspacePackage? findPackageFor(String filePath) {
     final Folder folder = provider.getFolder(filePath);
     if (provider.pathContext.isWithin(root, folder.path)) {
-      _theOnlyPackage ??= BasicWorkspacePackage(root, this);
       return _theOnlyPackage;
     } else {
       return null;
@@ -46,7 +47,7 @@
   ) {
     Resource resource = provider.getResource(path);
     if (resource is File) {
-      path = resource.parent.path;
+      path = resource.parent!.path;
     }
     return BasicWorkspace._(provider, packageMap, path);
   }
diff --git a/pkg/analyzer/lib/src/workspace/bazel.dart b/pkg/analyzer/lib/src/workspace/bazel.dart
index db269c0..b7fdff1 100644
--- a/pkg/analyzer/lib/src/workspace/bazel.dart
+++ b/pkg/analyzer/lib/src/workspace/bazel.dart
@@ -15,7 +15,7 @@
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:analyzer/src/util/uri.dart';
 import 'package:analyzer/src/workspace/workspace.dart';
-import 'package:meta/meta.dart';
+import 'package:collection/collection.dart';
 import 'package:path/path.dart' as path;
 import 'package:pub_semver/pub_semver.dart';
 import 'package:watcher/watcher.dart';
@@ -41,8 +41,8 @@
   BazelFileNotification(this.requested, this.candidates, this._provider);
 
   BazelFileWatcher watcher(
-          {@required Duration pollingDelayShort,
-          @required Duration pollingDelayLong,
+          {required Duration pollingDelayShort,
+          required Duration pollingDelayLong,
           Timer Function(Duration, void Function(Timer)) timerFactory =
               _defaultTimerFactory}) =>
       BazelFileWatcher(candidates, _provider, pollingDelayShort,
@@ -64,12 +64,12 @@
         super(workspace.provider);
 
   @override
-  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
+  Source? resolveAbsolute(Uri uri, [Uri? actualUri]) {
     if (!ResourceUriResolver.isFileUri(uri)) {
       return null;
     }
     String filePath = fileUriToNormalizedPath(provider.pathContext, uri);
-    File file = workspace.findFile(filePath);
+    var file = workspace.findFile(filePath);
     if (file != null) {
       return file.createSource(actualUri ?? uri);
     }
@@ -96,7 +96,7 @@
   final _eventsController = StreamController<WatchEvent>.broadcast();
 
   /// The time of last modification of the file under [_validPath].
-  int _lastModified;
+  int? _lastModified;
 
   /// How often do we poll a file that we have found.
   final Duration _pollingDelayLong;
@@ -108,9 +108,9 @@
 
   /// One of the [_candidates] that is valid, i.e., we found a file with that
   /// path.
-  String _validPath;
+  String? _validPath;
 
-  Timer _timer;
+  Timer? _timer;
 
   /// Used to contruct a [Timer] for polling.
   final Timer Function(Duration, void Function(Timer)) _timerFactory;
@@ -137,14 +137,14 @@
   }
 
   void stop() {
-    _timer.cancel();
+    _timer?.cancel();
     _eventsController.close();
   }
 
   void _poll() {
     if (_eventsController.isClosed) return;
 
-    int modified;
+    int? modified;
     if (_validPath == null) {
       var info = _pollAll();
       if (info != null) {
@@ -152,7 +152,7 @@
         modified = info.modified;
       }
     } else {
-      modified = _pollOne(_validPath);
+      modified = _pollOne(_validPath!);
     }
 
     // If there is no file, then we have nothing to do.
@@ -161,14 +161,14 @@
     if (modified == null && _lastModified != null) {
       // The file is no longer there, so let's issue a REMOVE event, unset
       // `_validPath` and set the timer to poll more frequently.
-      _eventsController.add(WatchEvent(ChangeType.REMOVE, _validPath));
+      _eventsController.add(WatchEvent(ChangeType.REMOVE, _validPath!));
       _validPath = null;
       _setPollingDelayToShort();
     } else if (modified != null && _lastModified == null) {
-      _eventsController.add(WatchEvent(ChangeType.ADD, _validPath));
+      _eventsController.add(WatchEvent(ChangeType.ADD, _validPath!));
       _setPollingDelayToLong();
     } else if (_lastModified != null && modified != _lastModified) {
-      _eventsController.add(WatchEvent(ChangeType.MODIFY, _validPath));
+      _eventsController.add(WatchEvent(ChangeType.MODIFY, _validPath!));
     }
     _lastModified = modified;
   }
@@ -177,7 +177,7 @@
   ///
   /// Will set [_validPath] and return its modified time if a file is found.
   /// Returns [null] if nothing is found.
-  FileInfo _pollAll() {
+  FileInfo? _pollAll() {
     assert(_validPath == null);
     for (var path in _candidates) {
       var modified = _pollOne(path);
@@ -190,7 +190,7 @@
 
   /// Returns the modified time of the path or `null` if the file does not
   /// exist.
-  int _pollOne(String path) {
+  int? _pollOne(String path) {
     try {
       var file = _provider.getFile(path);
       return file.modificationStamp;
@@ -229,62 +229,29 @@
   }
 
   @override
-  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
-    return _sourceCache.putIfAbsent(uri, () {
-      if (uri.scheme == 'file') {
-        var path = fileUriToNormalizedPath(_context, uri);
-        var pathRelativeToRoot = _workspace._relativeToRoot(path);
-        if (pathRelativeToRoot == null) return null;
-        var fullFilePath = _context.join(_workspace.root, pathRelativeToRoot);
-        File file = _workspace.findFile(fullFilePath);
-        return file?.createSource(uri);
+  Source? resolveAbsolute(Uri uri, [Uri? actualUri]) {
+    var source = _sourceCache[uri];
+    if (source == null) {
+      source = _resolveAbsolute(uri);
+      if (source != null) {
+        _sourceCache[uri] = source;
       }
-      if (uri.scheme != 'package') {
-        return null;
-      }
-      String uriPath = uri.path;
-      int slash = uriPath.indexOf('/');
-
-      // If the path either starts with a slash or has no slash, it is invalid.
-      if (slash < 1) {
-        return null;
-      }
-
-      if (uriPath.contains('//') || uriPath.contains('..')) {
-        return null;
-      }
-
-      String packageName = uriPath.substring(0, slash);
-      String fileUriPart = uriPath.substring(slash + 1);
-      String filePath = fileUriPart.replaceAll('/', _context.separator);
-
-      if (!packageName.contains('.')) {
-        String fullFilePath = _context.join(_workspace.root, 'third_party',
-            'dart', packageName, 'lib', filePath);
-        File file = _workspace.findFile(fullFilePath);
-        return file?.createSource(uri);
-      } else {
-        String packagePath = packageName.replaceAll('.', _context.separator);
-        String fullFilePath =
-            _context.join(_workspace.root, packagePath, 'lib', filePath);
-        File file = _workspace.findFile(fullFilePath);
-        return file?.createSource(uri);
-      }
-    });
+    }
+    return source;
   }
 
   @override
-  Uri restoreAbsolute(Source source) {
+  Uri? restoreAbsolute(Source source) {
     String filePath = source.fullName;
 
     // Search in each root.
-    for (String root in [
+    for (var root in [
       ..._workspace.binPaths,
       _workspace.genfiles,
       _workspace.readonly,
       _workspace.root
     ]) {
-      List<String> uriParts = _restoreUriParts(root, filePath);
+      var uriParts = _restoreUriParts(root, filePath);
       if (uriParts != null) {
         return Uri.parse('package:${uriParts[0]}/${uriParts[1]}');
       }
@@ -293,10 +260,52 @@
     return null;
   }
 
+  Source? _resolveAbsolute(Uri uri) {
+    if (uri.scheme == 'file') {
+      var path = fileUriToNormalizedPath(_context, uri);
+      var pathRelativeToRoot = _workspace._relativeToRoot(path);
+      if (pathRelativeToRoot == null) return null;
+      var fullFilePath = _context.join(_workspace.root, pathRelativeToRoot);
+      var file = _workspace.findFile(fullFilePath);
+      return file?.createSource(uri);
+    }
+    if (uri.scheme != 'package') {
+      return null;
+    }
+    String uriPath = uri.path;
+    int slash = uriPath.indexOf('/');
+
+    // If the path either starts with a slash or has no slash, it is invalid.
+    if (slash < 1) {
+      return null;
+    }
+
+    if (uriPath.contains('//') || uriPath.contains('..')) {
+      return null;
+    }
+
+    String packageName = uriPath.substring(0, slash);
+    String fileUriPart = uriPath.substring(slash + 1);
+    String filePath = fileUriPart.replaceAll('/', _context.separator);
+
+    if (!packageName.contains('.')) {
+      String fullFilePath = _context.join(
+          _workspace.root, 'third_party', 'dart', packageName, 'lib', filePath);
+      var file = _workspace.findFile(fullFilePath);
+      return file?.createSource(uri);
+    } else {
+      String packagePath = packageName.replaceAll('.', _context.separator);
+      String fullFilePath =
+          _context.join(_workspace.root, packagePath, 'lib', filePath);
+      var file = _workspace.findFile(fullFilePath);
+      return file?.createSource(uri);
+    }
+  }
+
   /// Restore [filePath] to its 'package:' URI parts.
   ///
   /// Returns `null` if [root] is null or if [filePath] is not within [root].
-  List<String> _restoreUriParts(String root, String filePath) {
+  List<String>? _restoreUriParts(String? root, String filePath) {
     path.Context context = _workspace.provider.pathContext;
     if (root != null && context.isWithin(root, filePath)) {
       String relative = context.relative(filePath, from: root);
@@ -349,7 +358,7 @@
 
   /// The absolute path to the optional read only workspace root, in the
   /// `READONLY` folder if a git-based workspace, or `null`.
-  final String readonly;
+  final String? readonly;
 
   /// The absolute paths to all `bazel-bin` folders.
   ///
@@ -382,7 +391,10 @@
   UriResolver get packageUriResolver => BazelPackageUriResolver(this);
 
   @override
-  SourceFactory createSourceFactory(DartSdk sdk, SummaryDataStore summaryData) {
+  SourceFactory createSourceFactory(
+    DartSdk? sdk,
+    SummaryDataStore? summaryData,
+  ) {
     List<UriResolver> resolvers = <UriResolver>[];
     if (sdk != null) {
       resolvers.add(DartUriResolver(sdk));
@@ -400,7 +412,7 @@
   /// then into the workspace root. The file in the workspace root is returned
   /// even if it does not exist. Return `null` if the given [absolutePath] is
   /// not in the workspace [root].
-  File findFile(String absolutePath) {
+  File? findFile(String absolutePath) {
     path.Context context = provider.pathContext;
     try {
       String relative = context.relative(absolutePath, from: root);
@@ -408,10 +420,8 @@
         return null;
       }
       // First check genfiles and bin directories
-      var generatedCandidates = <String>[
-        if (genfiles != null) genfiles,
-        ...?binPaths
-      ].map((prefix) => context.join(prefix, relative));
+      var generatedCandidates = <String>[genfiles, ...binPaths]
+          .map((prefix) => context.join(prefix, relative));
       for (var path in generatedCandidates) {
         File file = provider.getFile(path);
         if (file.exists) {
@@ -427,7 +437,7 @@
       }
       // READONLY
       if (readonly != null) {
-        File file = provider.getFile(context.join(readonly, relative));
+        File file = provider.getFile(context.join(readonly!, relative));
         if (file.exists) {
           return file;
         }
@@ -444,7 +454,7 @@
   }
 
   @override
-  WorkspacePackage findPackageFor(String filePath) {
+  BazelWorkspacePackage? findPackageFor(String filePath) {
     path.Context context = provider.pathContext;
     var directoryPath = context.dirname(filePath);
 
@@ -469,22 +479,25 @@
     }
 
     // Return a Package rooted at [folder].
-    BazelWorkspacePackage packageRootedHere() {
-      List<String> uriParts = (packageUriResolver as BazelPackageUriResolver)
+    BazelWorkspacePackage? packageRootedHere() {
+      var uriParts = (packageUriResolver as BazelPackageUriResolver)
           ._restoreUriParts(root, '${folder.path}/lib/__fake__.dart');
-      String packageName;
+      String? packageName;
       if (uriParts != null && uriParts.isNotEmpty) {
         packageName = uriParts[0];
       }
       // TODO(srawlins): If [packageName] could not be derived from [uriParts],
       //  I imagine this should throw.
+      if (packageName == null) {
+        return null;
+      }
       var package = BazelWorkspacePackage(packageName, folder.path, this);
       _directoryToPackage[directoryPath] = package;
       return package;
     }
 
     while (true) {
-      Folder parent = folder.parent;
+      var parent = folder.parent;
       if (parent == null) {
         return null;
       }
@@ -530,10 +543,10 @@
     }
   }
 
-  String _relativeToRoot(String p) {
+  String? _relativeToRoot(String p) {
     path.Context context = provider.pathContext;
     // genfiles
-    if (genfiles != null && context.isWithin(genfiles, p)) {
+    if (context.isWithin(genfiles, p)) {
       return context.relative(p, from: genfiles);
     }
     // bin
@@ -544,7 +557,7 @@
     }
     // READONLY
     if (readonly != null) {
-      if (context.isWithin(readonly, p)) {
+      if (context.isWithin(readonly!, p)) {
         return context.relative(p, from: readonly);
       }
     }
@@ -570,15 +583,15 @@
   ///   BazelWorkspace rooted at _f_ is returned.
   /// * If _f_ has a child file named "WORKSPACE", then a BazelWorkspace rooted
   ///   at _f_ is returned.
-  static BazelWorkspace find(ResourceProvider provider, String filePath) {
+  static BazelWorkspace? find(ResourceProvider provider, String filePath) {
     Resource resource = provider.getResource(filePath);
     if (resource is File && resource.parent != null) {
-      filePath = resource.parent.path;
+      filePath = resource.parent!.path;
     }
     path.Context context = provider.pathContext;
     Folder folder = provider.getFolder(filePath);
     while (true) {
-      Folder parent = folder.parent;
+      var parent = folder.parent;
       if (parent == null) {
         return null;
       }
@@ -590,7 +603,7 @@
         String readonlyRoot =
             context.join(readonlyFolder.path, folder.shortName);
         if (provider.getFolder(readonlyRoot).exists) {
-          List<String> binPaths = _findBinFolderPaths(folder);
+          var binPaths = _findBinFolderPaths(folder);
           String symlinkPrefix =
               _findSymlinkPrefix(provider, root, binPaths: binPaths);
           binPaths ??= [context.join(root, '$symlinkPrefix-bin')];
@@ -602,7 +615,7 @@
       if (_firstExistingFolder(parent, ['blaze-out', 'bazel-out']) != null) {
         // Found the "out" folder; must be a bazel workspace.
         String root = parent.path;
-        List<String> binPaths = _findBinFolderPaths(parent);
+        var binPaths = _findBinFolderPaths(parent);
         String symlinkPrefix =
             _findSymlinkPrefix(provider, root, binPaths: binPaths);
         binPaths ??= [context.join(root, '$symlinkPrefix-bin')];
@@ -613,7 +626,7 @@
       // Found the WORKSPACE file, must be a non-git workspace.
       if (folder.getChildAssumingFile(_WORKSPACE).exists) {
         String root = folder.path;
-        List<String> binPaths = _findBinFolderPaths(folder);
+        var binPaths = _findBinFolderPaths(folder);
         String symlinkPrefix =
             _findSymlinkPrefix(provider, root, binPaths: binPaths);
         binPaths ??= [context.join(root, '$symlinkPrefix-bin')];
@@ -636,8 +649,8 @@
   /// for folders named "bin".
   ///
   /// If no "bin" folder is found in any of those locations, `null` is returned.
-  static List<String> _findBinFolderPaths(Folder root) {
-    Folder out = _firstExistingFolder(root, ['blaze-out', 'bazel-out']);
+  static List<String>? _findBinFolderPaths(Folder root) {
+    var out = _firstExistingFolder(root, ['blaze-out', 'bazel-out']);
     if (out == null) {
       return null;
     }
@@ -662,7 +675,7 @@
   /// assumption according to [defaultSymlinkPrefix] if neither of the folders
   /// exists.
   static String _findSymlinkPrefix(ResourceProvider provider, String root,
-      {List<String> binPaths}) {
+      {List<String>? binPaths}) {
     path.Context context = provider.pathContext;
     if (binPaths != null && binPaths.isNotEmpty) {
       return context.basename(binPaths.first).startsWith('bazel')
@@ -680,9 +693,9 @@
   }
 
   /// Return the first folder within [root], chosen from [names], which exists.
-  static Folder _firstExistingFolder(Folder root, List<String> names) => names
+  static Folder? _firstExistingFolder(Folder root, List<String> names) => names
       .map((name) => root.getChildAssumingFolder(name))
-      .firstWhere((folder) => folder.exists, orElse: () => null);
+      .firstWhereOrNull((folder) => folder.exists);
 }
 
 /// Information about a package defined in a BazelWorkspace.
@@ -701,20 +714,20 @@
   final BazelWorkspace workspace;
 
   bool _buildFileReady = false;
-  List<String> _enabledExperiments;
-  Version _languageVersion;
+  List<String>? _enabledExperiments;
+  Version? _languageVersion;
 
   BazelWorkspacePackage(String packageName, this.root, this.workspace)
       : _uriPrefix = 'package:$packageName/';
 
   @override
-  List<String> get enabledExperiments {
+  List<String>? get enabledExperiments {
     _readBuildFile();
     return _enabledExperiments;
   }
 
   @override
-  Version get languageVersion {
+  Version? get languageVersion {
     _readBuildFile();
     return _languageVersion;
   }
@@ -724,8 +737,7 @@
     if (source.uri.isScheme('package')) {
       return source.uri.toString().startsWith(_uriPrefix);
     }
-    String filePath = source.fullName;
-    if (filePath == null) return false;
+    var filePath = source.fullName;
     if (workspace.findFile(filePath) == null) {
       return false;
     }
@@ -736,7 +748,7 @@
     // Just because [filePath] is within [root] does not mean it is in this
     // package; it could be in a "subpackage." Must go through the work of
     // learning exactly which package [filePath] is contained in.
-    return workspace.findPackageFor(filePath).root == root;
+    return workspace.findPackageFor(filePath)!.root == root;
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/workspace/gn.dart b/pkg/analyzer/lib/src/workspace/gn.dart
index 3ceaea6..070c7cd 100644
--- a/pkg/analyzer/lib/src/workspace/gn.dart
+++ b/pkg/analyzer/lib/src/workspace/gn.dart
@@ -13,6 +13,7 @@
 import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:analyzer/src/workspace/workspace.dart';
+import 'package:collection/collection.dart';
 import 'package:meta/meta.dart';
 import 'package:path/path.dart' as path;
 
@@ -47,7 +48,10 @@
       PackageMapUriResolver(provider, _packageMap);
 
   @override
-  SourceFactory createSourceFactory(DartSdk sdk, SummaryDataStore summaryData) {
+  SourceFactory createSourceFactory(
+    DartSdk? sdk,
+    SummaryDataStore? summaryData,
+  ) {
     if (summaryData != null) {
       throw UnsupportedError(
           'Summary files are not supported in a GN workspace.');
@@ -64,7 +68,7 @@
   /// Return the file with the given [absolutePath].
   ///
   /// Return `null` if the given [absolutePath] is not in the workspace [root].
-  File findFile(String absolutePath) {
+  File? findFile(String absolutePath) {
     try {
       File writableFile = provider.getFile(absolutePath);
       if (writableFile.exists) {
@@ -75,11 +79,11 @@
   }
 
   @override
-  WorkspacePackage findPackageFor(String path) {
+  WorkspacePackage? findPackageFor(String path) {
     Folder folder = provider.getFolder(provider.pathContext.dirname(path));
 
     while (true) {
-      Folder parent = folder.parent;
+      var parent = folder.parent;
       if (parent == null) {
         return null;
       }
@@ -103,14 +107,14 @@
   /// Return `null` if a workspace could not be found. For a workspace to be
   /// found, both a `.jiri_root` file must be found, and at least one "packages"
   /// file must be found in [filePath]'s output directory.
-  static GnWorkspace find(ResourceProvider provider, String filePath) {
+  static GnWorkspace? find(ResourceProvider provider, String filePath) {
     Resource resource = provider.getResource(filePath);
     if (resource is File) {
-      filePath = resource.parent.path;
+      filePath = resource.parent!.path;
     }
     Folder folder = provider.getFolder(filePath);
     while (true) {
-      Folder parent = folder.parent;
+      var parent = folder.parent;
       if (parent == null) {
         return null;
       }
@@ -159,7 +163,7 @@
   ) {
     path.Context pathContext = provider.pathContext;
     String sourceDirectory = pathContext.relative(filePath, from: root);
-    Folder outDirectory = _getOutDirectory(root, provider);
+    var outDirectory = _getOutDirectory(root, provider);
     if (outDirectory == null) {
       return const <File>[];
     }
@@ -180,7 +184,7 @@
   ///
   /// First attempts to read a config file at the root of the source tree. If
   /// that file cannot be found, looks for standard output directory locations.
-  static Folder _getOutDirectory(String root, ResourceProvider provider) {
+  static Folder? _getOutDirectory(String root, ResourceProvider provider) {
     const String fuchsiaDirConfigFile = '.fx-build-dir';
 
     path.Context pathContext = provider.pathContext;
@@ -199,12 +203,14 @@
     if (!outDirectory.exists) {
       return null;
     }
-    return outDirectory.getChildren().whereType<Folder>().firstWhere((folder) {
-      String baseName = pathContext.basename(folder.path);
-      // Taking a best guess to identify a build dir. This is clearly a fallback
-      // to the config-based method.
-      return baseName.startsWith('debug') || baseName.startsWith('release');
-    }, orElse: () => null);
+    return outDirectory.getChildren().whereType<Folder>().firstWhereOrNull(
+      (folder) {
+        String baseName = pathContext.basename(folder.path);
+        // Taking a best guess to identify a build dir. This is clearly a fallback
+        // to the config-based method.
+        return baseName.startsWith('debug') || baseName.startsWith('release');
+      },
+    );
   }
 }
 
@@ -224,7 +230,7 @@
 
   @override
   bool contains(Source source) {
-    String filePath = filePathFromSource(source);
+    var filePath = filePathFromSource(source);
     if (filePath == null) return false;
     if (workspace.findFile(filePath) == null) {
       return false;
@@ -236,7 +242,7 @@
     // Just because [filePath] is within [root] does not mean it is in this
     // package; it could be in a "subpackage." Must go through the work of
     // learning exactly which package [filePath] is contained in.
-    return workspace.findPackageFor(filePath).root == root;
+    return workspace.findPackageFor(filePath)!.root == root;
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/workspace/package_build.dart b/pkg/analyzer/lib/src/workspace/package_build.dart
index 17ac171..df4e821 100644
--- a/pkg/analyzer/lib/src/workspace/package_build.dart
+++ b/pkg/analyzer/lib/src/workspace/package_build.dart
@@ -28,7 +28,7 @@
         super(workspace.provider);
 
   @override
-  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
+  Source? resolveAbsolute(Uri uri, [Uri? actualUri]) {
     if (!ResourceUriResolver.isFileUri(uri)) {
       return null;
     }
@@ -37,7 +37,7 @@
     if (resource is! File) {
       return null;
     }
-    File file = workspace.findFile(filePath);
+    var file = workspace.findFile(filePath);
     if (file != null) {
       return file.createSource(actualUri ?? uri);
     }
@@ -60,13 +60,13 @@
   Map<String, List<Folder>> get packageMap => _workspace._packageMap;
 
   @override
-  Source resolveAbsolute(Uri _ignore, [Uri uri]) {
+  Source? resolveAbsolute(Uri _ignore, [Uri? uri]) {
     uri ??= _ignore;
     if (uri.scheme != 'package') {
       return null;
     }
 
-    Source basicResolverSource = _normalUriResolver.resolveAbsolute(uri);
+    var basicResolverSource = _normalUriResolver.resolveAbsolute(uri);
     if (basicResolverSource != null && basicResolverSource.exists()) {
       return basicResolverSource;
     }
@@ -83,7 +83,7 @@
     String fileUriPart = uriPath.substring(slash + 1);
     String filePath = fileUriPart.replaceAll('/', _context.separator);
 
-    File file = _workspace.builtFile(
+    var file = _workspace.builtFile(
         _workspace.builtPackageSourcePath(filePath), packageName);
     if (file != null && file.exists) {
       return file.createSource(uri);
@@ -92,11 +92,11 @@
   }
 
   @override
-  Uri restoreAbsolute(Source source) {
+  Uri? restoreAbsolute(Source source) {
     String filePath = source.fullName;
 
     if (_context.isWithin(_workspace.root, filePath)) {
-      List<String> uriParts = _restoreUriParts(filePath);
+      var uriParts = _restoreUriParts(filePath);
       if (uriParts != null) {
         return Uri.parse('package:${uriParts[0]}/${uriParts[1]}');
       }
@@ -105,7 +105,7 @@
     return _normalUriResolver.restoreAbsolute(source);
   }
 
-  List<String> _restoreUriParts(String filePath) {
+  List<String>? _restoreUriParts(String filePath) {
     String relative = _context.relative(filePath, from: _workspace.root);
     List<String> components = _context.split(relative);
     if (components.length > 5 &&
@@ -167,7 +167,7 @@
   /// The singular package in this workspace.
   ///
   /// Each "package:build" workspace is itself one package.
-  PackageBuildWorkspacePackage _theOnlyPackage;
+  late final PackageBuildWorkspacePackage _theOnlyPackage;
 
   PackageBuildWorkspace._(
     this.provider,
@@ -176,7 +176,9 @@
     this.projectPackageName,
     this.generatedRootPath,
     this.generatedThisPath,
-  );
+  ) {
+    _theOnlyPackage = PackageBuildWorkspacePackage(root, this);
+  }
 
   @override
   UriResolver get packageUriResolver => PackageBuildPackageUriResolver(
@@ -189,7 +191,7 @@
   /// To get a [builtPath] for a package source file to use in this method,
   /// use [builtPackageSourcePath]. For `bin/`, `web/`, etc, it must be relative
   /// to the project root.
-  File builtFile(String builtPath, String packageName) {
+  File? builtFile(String builtPath, String packageName) {
     if (!_packageMap.containsKey(packageName)) {
       return null;
     }
@@ -211,7 +213,10 @@
   }
 
   @override
-  SourceFactory createSourceFactory(DartSdk sdk, SummaryDataStore summaryData) {
+  SourceFactory createSourceFactory(
+    DartSdk? sdk,
+    SummaryDataStore? summaryData,
+  ) {
     if (summaryData != null) {
       throw UnsupportedError(
           'Summary files are not supported in a package:build workspace.');
@@ -231,14 +236,14 @@
   ///
   /// The file in the workspace [root] is returned even if it does not exist.
   /// Return `null` if the given [filePath] is not in the workspace root.
-  File findFile(String filePath) {
+  File? findFile(String filePath) {
     path.Context context = provider.pathContext;
     assert(context.isAbsolute(filePath), 'Not an absolute path: $filePath');
     try {
       final String relativePath = context.relative(filePath, from: root);
-      final File file = builtFile(relativePath, projectPackageName);
+      final file = builtFile(relativePath, projectPackageName);
 
-      if (file.exists) {
+      if (file!.exists) {
         return file;
       }
 
@@ -249,7 +254,7 @@
   }
 
   @override
-  WorkspacePackage findPackageFor(String path) {
+  PackageBuildWorkspacePackage? findPackageFor(String path) {
     var pathContext = provider.pathContext;
 
     // Must be in this workspace.
@@ -264,17 +269,17 @@
       }
     }
 
-    return _theOnlyPackage ??= PackageBuildWorkspacePackage(root, this);
+    return _theOnlyPackage;
   }
 
   /// Find the package:build workspace that contains the given [filePath].
   ///
   /// Return `null` if the filePath is not in a package:build workspace.
-  static PackageBuildWorkspace find(ResourceProvider provider,
+  static PackageBuildWorkspace? find(ResourceProvider provider,
       Map<String, List<Folder>> packageMap, String filePath) {
     Folder folder = provider.getFolder(filePath);
     while (true) {
-      Folder parent = folder.parent;
+      var parent = folder.parent;
       if (parent == null) {
         return null;
       }
diff --git a/pkg/analyzer/lib/src/workspace/pub.dart b/pkg/analyzer/lib/src/workspace/pub.dart
index 1fed22e..ce2351c 100644
--- a/pkg/analyzer/lib/src/workspace/pub.dart
+++ b/pkg/analyzer/lib/src/workspace/pub.dart
@@ -17,7 +17,7 @@
   /// The singular package in this workspace.
   ///
   /// Each Pub workspace is itself one package.
-  PubWorkspacePackage _theOnlyPackage;
+  late final PubWorkspacePackage _theOnlyPackage;
 
   /// The associated pubspec file.
   final File _pubspecFile;
@@ -27,13 +27,14 @@
     Map<String, List<Folder>> packageMap,
     String root,
     this._pubspecFile,
-  ) : super(provider, packageMap, root);
+  ) : super(provider, packageMap, root) {
+    _theOnlyPackage = PubWorkspacePackage(root, this);
+  }
 
   @override
-  WorkspacePackage findPackageFor(String filePath) {
+  WorkspacePackage? findPackageFor(String filePath) {
     final Folder folder = provider.getFolder(filePath);
     if (provider.pathContext.isWithin(root, folder.path)) {
-      _theOnlyPackage ??= PubWorkspacePackage(root, this);
       return _theOnlyPackage;
     } else {
       return null;
@@ -41,18 +42,18 @@
   }
 
   /// Find the pub workspace that contains the given [path].
-  static PubWorkspace find(
+  static PubWorkspace? find(
     ResourceProvider provider,
     Map<String, List<Folder>> packageMap,
     String filePath,
   ) {
     Resource resource = provider.getResource(filePath);
     if (resource is File) {
-      filePath = resource.parent.path;
+      filePath = resource.parent!.path;
     }
     Folder folder = provider.getFolder(filePath);
     while (true) {
-      Folder parent = folder.parent;
+      var parent = folder.parent;
       if (parent == null) {
         return null;
       }
@@ -79,7 +80,7 @@
   @override
   final String root;
 
-  Pubspec _pubspec;
+  Pubspec? _pubspec;
 
   /// A flag to indicate if we've tried to parse the pubspec.
   bool _parsedPubspec = false;
@@ -91,7 +92,7 @@
 
   /// Get the associated parsed [Pubspec], or `null` if there was an error in
   /// reading or parsing.
-  Pubspec get pubspec {
+  Pubspec? get pubspec {
     if (!_parsedPubspec) {
       _parsedPubspec = true;
       try {
@@ -106,7 +107,7 @@
 
   @override
   bool contains(Source source) {
-    String filePath = filePathFromSource(source);
+    var filePath = filePathFromSource(source);
     if (filePath == null) return false;
     // There is a 1-1 relationship between [PubWorkspace]s and
     // [PubWorkspacePackage]s. If a file is in a package's workspace, then it
diff --git a/pkg/analyzer/lib/src/workspace/simple.dart b/pkg/analyzer/lib/src/workspace/simple.dart
index 5933878..4f9cc06 100644
--- a/pkg/analyzer/lib/src/workspace/simple.dart
+++ b/pkg/analyzer/lib/src/workspace/simple.dart
@@ -32,7 +32,10 @@
       PackageMapUriResolver(provider, packageMap);
 
   @override
-  SourceFactory createSourceFactory(DartSdk sdk, SummaryDataStore summaryData) {
+  SourceFactory createSourceFactory(
+    DartSdk? sdk,
+    SummaryDataStore? summaryData,
+  ) {
     if (summaryData != null) {
       throw UnsupportedError(
           'Summary files are not supported in a Pub workspace.');
diff --git a/pkg/analyzer/lib/src/workspace/workspace.dart b/pkg/analyzer/lib/src/workspace/workspace.dart
index 777f116..4b86e1d 100644
--- a/pkg/analyzer/lib/src/workspace/workspace.dart
+++ b/pkg/analyzer/lib/src/workspace/workspace.dart
@@ -23,14 +23,15 @@
 
   /// Create the source factory that should be used to resolve Uris to
   /// [Source]s. The [sdk] may be `null`. The [summaryData] can also be `null`.
-  SourceFactory createSourceFactory(DartSdk sdk, SummaryDataStore summaryData);
+  SourceFactory createSourceFactory(
+      DartSdk? sdk, SummaryDataStore? summaryData);
 
   /// Find the [WorkspacePackage] where the library at [path] is defined.
   ///
   /// Separate from [Packages] or [packageMap], this method is designed to find
   /// the package, by its root, in which a library at an arbitrary path is
   /// defined.
-  WorkspacePackage findPackageFor(String path);
+  WorkspacePackage? findPackageFor(String path);
 }
 
 /// Abstract superclass of classes that provide information about a package
@@ -43,7 +44,7 @@
   /// Return the experiments enabled for all files in the package.
   ///
   /// Return `null` if this package does not have enabled experiments.
-  List<String> get enabledExperiments => null;
+  List<String>? get enabledExperiments => null;
 
   /// Return the language version override for all files in the package.
   ///
@@ -52,7 +53,7 @@
   /// to disable Null Safety for packages that are not migrated yet.
   ///
   /// Return `null` if this package does not have a language version override.
-  Version get languageVersion => null;
+  Version? get languageVersion => null;
 
   String get root;
 
@@ -65,7 +66,7 @@
   /// If [source]'s URI scheme is package, it's fullName might be unusable (for
   /// example, the case of a [InSummarySource]). In this case, use
   /// [workspace]'s package URI resolver to fetch the file path.
-  String filePathFromSource(Source source) {
+  String? filePathFromSource(Source source) {
     if (source.uri.scheme == 'package') {
       return workspace.packageUriResolver.resolveAbsolute(source.uri)?.fullName;
     } else {
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 19837d5..bca7fa6 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,33 +1,33 @@
 name: analyzer
-version: 0.41.2-dev
+version: 0.42.0
 description: This package provides a library that performs static analysis of Dart code.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/analyzer
 
 environment:
-  sdk: '>=2.9.0 <3.0.0'
+  sdk: '>=2.12.0-0 <3.0.0'
 
 dependencies:
   _fe_analyzer_shared: ^14.0.0
-  args: ^1.0.0
-  cli_util: '>=0.1.4 <0.3.0'
+  args: ^2.0.0-nullsafety.0
+  cli_util: ^0.3.0-nullsafety.0
   collection: ^1.15.0-nullsafety.5
-  convert: ^2.0.0
-  crypto: '>=2.0.0 <4.0.0'
-  glob: '>=1.0.3 <3.0.0'
-  meta: ^1.2.3
+  convert: ^3.0.0-nullsafety.0
+  crypto: ^3.0.0-nullsafety.0
+  glob: ^2.0.0-nullsafety.0
+  meta: ^1.3.0-nullsafety.6
   package_config: ^1.0.0
-  path: ^1.0.0
-  pub_semver: ^1.4.2
-  source_span: ^1.2.0
+  path: ^1.8.0-nullsafety.3
+  pub_semver: ^2.0.0-nullsafety.0
+  source_span: ^1.8.0-nullsafety.4
   watcher: ^0.9.6
-  yaml: ">=2.1.2 <4.0.0"
+  yaml: ^3.0.0-nullsafety.0
 dev_dependencies:
   analyzer_utilities:
     path: ../analyzer_utilities
-  async: ^2.0.0
-  linter: any
-  matcher: ^0.12.3
-  pedantic: ^1.9.0
-  test: ^1.0.0
-  test_api: ^0.2.6
-  test_reflective_loader: ^0.1.8
+  async: ^2.5.0-nullsafety.3
+#  linter: any
+  matcher: ^0.12.10-nullsafety.3
+  pedantic: ^1.10.0-nullsafety.3
+  test: ^1.16.0-nullsafety.13
+  test_api: ^0.2.19-nullsafety.6
+  test_reflective_loader: ^0.2.0-nullsafety.0
diff --git a/pkg/analyzer/test/dart/analysis/from_environment_evaluator_test.dart b/pkg/analyzer/test/dart/analysis/from_environment_evaluator_test.dart
index 47d6dcb..f73cbf8 100644
--- a/pkg/analyzer/test/dart/analysis/from_environment_evaluator_test.dart
+++ b/pkg/analyzer/test/dart/analysis/from_environment_evaluator_test.dart
@@ -22,8 +22,8 @@
 class FromEnvironmentEvaluatorTest {
   static const String _defaultValue = 'defaultValue';
 
-  /*late final*/ TypeProvider typeProvider;
-  /*late final*/ TypeSystemImpl typeSystem;
+  late final TypeProvider typeProvider;
+  late final TypeSystemImpl typeSystem;
 
   DartObjectImpl get _boolValueFalse {
     return DartObjectImpl(
@@ -217,7 +217,7 @@
     return variables.getBool2(
       name,
       namedValues,
-      typeProvider.boolElement.getNamedConstructor('fromEnvironment'),
+      typeProvider.boolElement.getNamedConstructor('fromEnvironment')!,
     );
   }
 
@@ -229,7 +229,7 @@
     return variables.getInt2(
       name,
       namedValues,
-      typeProvider.intElement.getNamedConstructor('fromEnvironment'),
+      typeProvider.intElement.getNamedConstructor('fromEnvironment')!,
     );
   }
 
@@ -241,7 +241,7 @@
     return variables.getString2(
       name,
       namedValues,
-      typeProvider.stringElement.getNamedConstructor('fromEnvironment'),
+      typeProvider.stringElement.getNamedConstructor('fromEnvironment')!,
     );
   }
 
diff --git a/pkg/analyzer/test/dart/analysis/utilities_test.dart b/pkg/analyzer/test/dart/analysis/utilities_test.dart
index da03e22..2ac1bac 100644
--- a/pkg/analyzer/test/dart/analysis/utilities_test.dart
+++ b/pkg/analyzer/test/dart/analysis/utilities_test.dart
@@ -60,7 +60,7 @@
     String content = '''
 void main() => print('Hello, world!')
 ''';
-    /*late*/ String expectedPath;
+    late String expectedPath;
     ParseStringResult result =
         _withMemoryFile(content, (resourceProvider, path) {
       expectedPath = path;
@@ -221,7 +221,7 @@
       featureSet: FeatureSet.latestLanguageVersion(),
     );
 
-    var languageVersion = result.unit.languageVersionToken;
+    var languageVersion = result.unit.languageVersionToken!;
     expect(languageVersion.major, 2);
     expect(languageVersion.minor, 7);
   }
diff --git a/pkg/analyzer/test/dart/ast/ast_test.dart b/pkg/analyzer/test/dart/ast/ast_test.dart
index 913ea87..d5a0cf9 100644
--- a/pkg/analyzer/test/dart/ast/ast_test.dart
+++ b/pkg/analyzer/test/dart/ast/ast_test.dart
@@ -64,7 +64,7 @@
     expect(clazz.getConstructor(null), same(defaultConstructor));
     expect(clazz.getConstructor("a"), same(aConstructor));
     expect(clazz.getConstructor("b"), same(bConstructor));
-    expect(clazz.getConstructor("noSuchConstructor"), same(null));
+    expect(clazz.getConstructor("noSuchConstructor"), isNull);
   }
 
   void test_getField() {
@@ -79,7 +79,7 @@
     expect(clazz.getField("a"), same(aVar));
     expect(clazz.getField("b"), same(bVar));
     expect(clazz.getField("c"), same(cVar));
-    expect(clazz.getField("noSuchField"), same(null));
+    expect(clazz.getField("noSuchField"), isNull);
   }
 
   void test_getMethod() {
@@ -101,7 +101,7 @@
         null, "Test", null, null, null, null, [aMethod, bMethod]);
     expect(clazz.getMethod("a"), same(aMethod));
     expect(clazz.getMethod("b"), same(bMethod));
-    expect(clazz.getMethod("noSuchMethod"), same(null));
+    expect(clazz.getMethod("noSuchMethod"), isNull);
   }
 
   void test_isAbstract() {
@@ -121,12 +121,23 @@
 class ClassTypeAliasTest extends ParserTestCase {
   void test_isAbstract() {
     expect(
-        AstTestFactory.classTypeAlias("A", null, null, null, null, null)
+        AstTestFactory.classTypeAlias(
+                "A",
+                null,
+                null,
+                AstTestFactory.typeName4('B'),
+                AstTestFactory.withClause([AstTestFactory.typeName4('M')]),
+                null)
             .isAbstract,
         isFalse);
     expect(
         AstTestFactory.classTypeAlias(
-                "B", null, Keyword.ABSTRACT, null, null, null)
+                "B",
+                null,
+                Keyword.ABSTRACT,
+                AstTestFactory.typeName4('A'),
+                AstTestFactory.withClause([AstTestFactory.typeName4('M')]),
+                null)
             .isAbstract,
         isTrue);
   }
@@ -142,12 +153,12 @@
         Keyword.FACTORY,
         AstTestFactory.identifier3('int'),
         null,
-        null,
-        null,
-        null);
+        AstTestFactory.formalParameterList(),
+        [],
+        AstTestFactory.emptyFunctionBody());
     declaration.externalKeyword = externalKeyword;
-    declaration.constKeyword.offset = 8;
-    Token factoryKeyword = declaration.factoryKeyword;
+    declaration.constKeyword!.offset = 8;
+    Token factoryKeyword = declaration.factoryKeyword!;
     factoryKeyword.offset = 0;
     expect(declaration.firstTokenAfterCommentAndMetadata, factoryKeyword);
   }
@@ -160,12 +171,12 @@
         Keyword.FACTORY,
         AstTestFactory.identifier3('int'),
         null,
-        null,
-        null,
-        null);
+        AstTestFactory.formalParameterList(),
+        [],
+        AstTestFactory.emptyFunctionBody());
     declaration.externalKeyword = token;
-    declaration.constKeyword.offset = 9;
-    declaration.factoryKeyword.offset = 15;
+    declaration.constKeyword!.offset = 9;
+    declaration.factoryKeyword!.offset = 15;
     expect(declaration.firstTokenAfterCommentAndMetadata, token);
   }
 
@@ -175,9 +186,9 @@
         null,
         AstTestFactory.identifier3('int'),
         null,
-        null,
-        null,
-        null);
+        AstTestFactory.formalParameterList(),
+        [],
+        AstTestFactory.emptyFunctionBody());
     expect(declaration.firstTokenAfterCommentAndMetadata,
         declaration.constKeyword);
   }
@@ -185,7 +196,13 @@
   void test_firstTokenAfterCommentAndMetadata_externalOnly() {
     Token externalKeyword = TokenFactory.tokenFromKeyword(Keyword.EXTERNAL);
     ConstructorDeclaration declaration = AstTestFactory.constructorDeclaration2(
-        null, null, AstTestFactory.identifier3('int'), null, null, null, null);
+        null,
+        null,
+        AstTestFactory.identifier3('int'),
+        null,
+        AstTestFactory.formalParameterList(),
+        [],
+        AstTestFactory.emptyFunctionBody());
     declaration.externalKeyword = externalKeyword;
     expect(declaration.firstTokenAfterCommentAndMetadata, externalKeyword);
   }
@@ -196,9 +213,9 @@
         Keyword.FACTORY,
         AstTestFactory.identifier3('int'),
         null,
-        null,
-        null,
-        null);
+        AstTestFactory.formalParameterList(),
+        [],
+        AstTestFactory.emptyFunctionBody());
     expect(declaration.firstTokenAfterCommentAndMetadata,
         declaration.factoryKeyword);
   }
@@ -215,7 +232,7 @@
   void test_endToken_parameters() {
     FieldFormalParameter parameter = AstTestFactory.fieldFormalParameter(
         null, null, 'field', AstTestFactory.formalParameterList([]));
-    expect(parameter.endToken, parameter.parameters.endToken);
+    expect(parameter.endToken, parameter.parameters!.endToken);
   }
 }
 
@@ -584,36 +601,44 @@
 @reflectiveTest
 class MethodDeclarationTest {
   void test_firstTokenAfterCommentAndMetadata_external() {
-    MethodDeclaration declaration =
-        AstTestFactory.methodDeclaration4(external: true, name: 'm');
+    MethodDeclaration declaration = AstTestFactory.methodDeclaration4(
+        external: true, name: 'm', body: AstTestFactory.emptyFunctionBody());
     expect(declaration.firstTokenAfterCommentAndMetadata,
         declaration.externalKeyword);
   }
 
   void test_firstTokenAfterCommentAndMetadata_external_getter() {
     MethodDeclaration declaration = AstTestFactory.methodDeclaration4(
-        external: true, property: Keyword.GET, name: 'm');
+        external: true,
+        property: Keyword.GET,
+        name: 'm',
+        body: AstTestFactory.emptyFunctionBody());
     expect(declaration.firstTokenAfterCommentAndMetadata,
         declaration.externalKeyword);
   }
 
   void test_firstTokenAfterCommentAndMetadata_external_operator() {
     MethodDeclaration declaration = AstTestFactory.methodDeclaration4(
-        external: true, operator: true, name: 'm');
+        external: true,
+        operator: true,
+        name: 'm',
+        body: AstTestFactory.emptyFunctionBody());
     expect(declaration.firstTokenAfterCommentAndMetadata,
         declaration.externalKeyword);
   }
 
   void test_firstTokenAfterCommentAndMetadata_getter() {
-    MethodDeclaration declaration =
-        AstTestFactory.methodDeclaration4(property: Keyword.GET, name: 'm');
+    MethodDeclaration declaration = AstTestFactory.methodDeclaration4(
+        property: Keyword.GET,
+        name: 'm',
+        body: AstTestFactory.emptyFunctionBody());
     expect(declaration.firstTokenAfterCommentAndMetadata,
         declaration.propertyKeyword);
   }
 
   void test_firstTokenAfterCommentAndMetadata_operator() {
-    MethodDeclaration declaration =
-        AstTestFactory.methodDeclaration4(operator: true, name: 'm');
+    MethodDeclaration declaration = AstTestFactory.methodDeclaration4(
+        operator: true, name: 'm', body: AstTestFactory.emptyFunctionBody());
     expect(declaration.firstTokenAfterCommentAndMetadata,
         declaration.operatorKeyword);
   }
@@ -823,7 +848,6 @@
     expect(list.indexOf(secondNode), 1);
     expect(list.indexOf(thirdNode), 2);
     expect(list.indexOf(fourthNode), -1);
-    expect(list.indexOf(null), -1);
   }
 
   void test_remove() {
@@ -925,7 +949,7 @@
 
   final featureSet = FeatureSet.forTesting(sdkVersion: '2.2.2');
 
-  CompilationUnit _unit;
+  CompilationUnit? _unit;
 
   CompilationUnit get unit {
     if (_unit == null) {
@@ -945,7 +969,7 @@
         featureSet: featureSet,
       ).parseCompilationUnit(tokens);
     }
-    return _unit;
+    return _unit!;
   }
 
   Token findToken(String lexeme) {
@@ -954,20 +978,20 @@
       if (token.lexeme == lexeme) {
         return token;
       }
-      token = token.next;
+      token = token.next!;
     }
     fail('Failed to find $lexeme');
   }
 
   void test_findPrevious_basic_class() {
     var clazz = unit.declarations[0] as ClassDeclaration;
-    expect(clazz.findPrevious(findToken('A')).lexeme, 'class');
+    expect(clazz.findPrevious(findToken('A'))!.lexeme, 'class');
   }
 
   void test_findPrevious_basic_method() {
     var clazz = unit.declarations[0] as ClassDeclaration;
     var method = clazz.members[0] as MethodDeclaration;
-    expect(method.findPrevious(findToken('foo')).lexeme, 'B');
+    expect(method.findPrevious(findToken('foo'))!.lexeme, 'B');
   }
 
   void test_findPrevious_basic_statement() {
@@ -975,8 +999,8 @@
     var method = clazz.members[0] as MethodDeclaration;
     var body = method.body as BlockFunctionBody;
     Statement statement = body.block.statements[0];
-    expect(statement.findPrevious(findToken('bar')).lexeme, 'return');
-    expect(statement.findPrevious(findToken(';')).lexeme, 'bar');
+    expect(statement.findPrevious(findToken('bar'))!.lexeme, 'return');
+    expect(statement.findPrevious(findToken(';'))!.lexeme, 'bar');
   }
 
   void test_findPrevious_missing() {
@@ -995,13 +1019,12 @@
     Token missing = scanner.tokenize();
 
     expect(statement.findPrevious(missing), null);
-    expect(statement.findPrevious(null), null);
   }
 
   void test_findPrevious_parent_method() {
     var clazz = unit.declarations[0] as ClassDeclaration;
     var method = clazz.members[0] as MethodDeclaration;
-    expect(method.findPrevious(findToken('B')).lexeme, '{');
+    expect(method.findPrevious(findToken('B'))!.lexeme, '{');
   }
 
   void test_findPrevious_parent_statement() {
@@ -1009,18 +1032,18 @@
     var method = clazz.members[0] as MethodDeclaration;
     var body = method.body as BlockFunctionBody;
     Statement statement = body.block.statements[0];
-    expect(statement.findPrevious(findToken('return')).lexeme, '{');
+    expect(statement.findPrevious(findToken('return'))!.lexeme, '{');
   }
 
   void test_findPrevious_sibling_class() {
     CompilationUnitMember declaration = unit.declarations[1];
-    expect(declaration.findPrevious(findToken('E')).lexeme, '}');
+    expect(declaration.findPrevious(findToken('E'))!.lexeme, '}');
   }
 
   void test_findPrevious_sibling_method() {
     var clazz = unit.declarations[0] as ClassDeclaration;
     var method = clazz.members[1] as MethodDeclaration;
-    expect(method.findPrevious(findToken('D')).lexeme, '}');
+    expect(method.findPrevious(findToken('D'))!.lexeme, '}');
   }
 }
 
@@ -1128,8 +1151,7 @@
             assignment == _AssignmentKind.COMPOUND_RIGHT ||
             assignment == _AssignmentKind.POSTFIX_BANG ||
             assignment == _AssignmentKind.PREFIX_NOT ||
-            assignment == _AssignmentKind.SIMPLE_RIGHT ||
-            assignment == _AssignmentKind.NONE) {
+            assignment == _AssignmentKind.SIMPLE_RIGHT) {
           if (identifier.inSetterContext()) {
             fail("Expected ${_topMostNode(identifier).toSource()} to be false");
           }
@@ -1215,7 +1237,9 @@
       } else if (wrapper == _WrapperKind.PROPERTY_RIGHT) {
         expression = AstTestFactory.propertyAccess(
             AstTestFactory.identifier3("_"), identifier);
-      } else if (wrapper == _WrapperKind.NONE) {}
+      } else {
+        throw UnimplementedError();
+      }
       break;
     }
     while (true) {
@@ -1244,7 +1268,9 @@
       } else if (assignment == _AssignmentKind.SIMPLE_RIGHT) {
         AstTestFactory.assignmentExpression(
             AstTestFactory.identifier3("_"), TokenType.EQ, expression);
-      } else if (assignment == _AssignmentKind.NONE) {}
+      } else {
+        throw UnimplementedError();
+      }
       break;
     }
     return identifier;
@@ -1257,7 +1283,7 @@
   /// @return the root of the AST structure containing the identifier
   AstNode _topMostNode(SimpleIdentifier identifier) {
     AstNode child = identifier;
-    AstNode parent = identifier.parent;
+    var parent = identifier.parent;
     while (parent != null) {
       child = parent;
       parent = parent.parent;
@@ -1478,25 +1504,25 @@
     // '
     {
       var token = TokenFactory.tokenFromString("'X'");
-      var node = astFactory.simpleStringLiteral(token, null);
+      var node = astFactory.simpleStringLiteral(token, 'X');
       expect(node.isSingleQuoted, isTrue);
     }
     // '''
     {
       var token = TokenFactory.tokenFromString("'''X'''");
-      var node = astFactory.simpleStringLiteral(token, null);
+      var node = astFactory.simpleStringLiteral(token, 'X');
       expect(node.isSingleQuoted, isTrue);
     }
     // "
     {
       var token = TokenFactory.tokenFromString('"X"');
-      var node = astFactory.simpleStringLiteral(token, null);
+      var node = astFactory.simpleStringLiteral(token, 'X');
       expect(node.isSingleQuoted, isFalse);
     }
     // """
     {
       var token = TokenFactory.tokenFromString('"""X"""');
-      var node = astFactory.simpleStringLiteral(token, null);
+      var node = astFactory.simpleStringLiteral(token, 'X');
       expect(node.isSingleQuoted, isFalse);
     }
   }
@@ -1505,25 +1531,25 @@
     // r'
     {
       var token = TokenFactory.tokenFromString("r'X'");
-      var node = astFactory.simpleStringLiteral(token, null);
+      var node = astFactory.simpleStringLiteral(token, 'X');
       expect(node.isSingleQuoted, isTrue);
     }
     // r'''
     {
       var token = TokenFactory.tokenFromString("r'''X'''");
-      var node = astFactory.simpleStringLiteral(token, null);
+      var node = astFactory.simpleStringLiteral(token, 'X');
       expect(node.isSingleQuoted, isTrue);
     }
     // r"
     {
       var token = TokenFactory.tokenFromString('r"X"');
-      var node = astFactory.simpleStringLiteral(token, null);
+      var node = astFactory.simpleStringLiteral(token, 'X');
       expect(node.isSingleQuoted, isFalse);
     }
     // r"""
     {
       var token = TokenFactory.tokenFromString('r"""X"""');
-      var node = astFactory.simpleStringLiteral(token, null);
+      var node = astFactory.simpleStringLiteral(token, 'X');
       expect(node.isSingleQuoted, isFalse);
     }
   }
@@ -1692,8 +1718,7 @@
     VariableDeclaration varDecl = AstTestFactory.variableDeclaration("a");
     TopLevelVariableDeclaration decl =
         AstTestFactory.topLevelVariableDeclaration2(Keyword.VAR, [varDecl]);
-    Comment comment =
-        astFactory.documentationComment(List<Token>.filled(0, null));
+    Comment comment = astFactory.documentationComment([]);
     expect(varDecl.documentationComment, isNull);
     decl.documentationComment = comment;
     expect(varDecl.documentationComment, isNotNull);
@@ -1702,8 +1727,7 @@
 
   void test_getDocumentationComment_onNode() {
     VariableDeclaration decl = AstTestFactory.variableDeclaration("a");
-    Comment comment =
-        astFactory.documentationComment(List<Token>.filled(0, null));
+    Comment comment = astFactory.documentationComment([]);
     decl.documentationComment = comment;
     expect(decl.documentationComment, isNotNull);
   }
@@ -1733,8 +1757,6 @@
   static const _AssignmentKind SIMPLE_RIGHT =
       _AssignmentKind('SIMPLE_RIGHT', 9);
 
-  static const _AssignmentKind NONE = _AssignmentKind('NONE', 10);
-
   static const List<_AssignmentKind> values = [
     BINARY,
     COMPOUND_LEFT,
@@ -1746,7 +1768,6 @@
     PREFIX_NOT,
     SIMPLE_LEFT,
     SIMPLE_RIGHT,
-    NONE
   ];
 
   final String name;
@@ -1773,14 +1794,11 @@
 
   static const _WrapperKind PROPERTY_RIGHT = _WrapperKind('PROPERTY_RIGHT', 3);
 
-  static const _WrapperKind NONE = _WrapperKind('NONE', 4);
-
   static const List<_WrapperKind> values = [
     PREFIXED_LEFT,
     PREFIXED_RIGHT,
     PROPERTY_LEFT,
     PROPERTY_RIGHT,
-    NONE
   ];
 
   final String name;
diff --git a/pkg/analyzer/test/embedder_tests.dart b/pkg/analyzer/test/embedder_tests.dart
index ac01db8..8ad116d 100644
--- a/pkg/analyzer/test/embedder_tests.dart
+++ b/pkg/analyzer/test/embedder_tests.dart
@@ -14,8 +14,8 @@
   final String foxPath = '/home/.pub-cache/fox';
   final String foxLib = '/home/.pub-cache/fox/lib';
 
-  /*late*/ TestPathTranslator pathTranslator;
-  /*late*/ ResourceProvider resourceProvider;
+  late final TestPathTranslator pathTranslator;
+  late final ResourceProvider resourceProvider;
 
   buildResourceProvider() {
     MemoryResourceProvider rawProvider = MemoryResourceProvider();
diff --git a/pkg/analyzer/test/error/error_reporter_test.dart b/pkg/analyzer/test/error/error_reporter_test.dart
index 4abbae8..dba624a 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,
@@ -175,7 +175,7 @@
     reporter.reportErrorForNode(
       CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE,
       findNode.simple('x'),
-      [fa.variables.type.type, fb.variables.type.type],
+      [fa.variables.type!.type, fb.variables.type!.type],
     );
 
     var error = listener.errors[0];
@@ -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,
@@ -210,7 +210,7 @@
     reporter.reportErrorForNode(
       CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE,
       findNode.simple('x'),
-      [ba.variables.type.type, bb.variables.type.type],
+      [ba.variables.type!.type, bb.variables.type!.type],
     );
 
     var error = listener.errors[0];
diff --git a/pkg/analyzer/test/error/error_test.dart b/pkg/analyzer/test/error/error_test.dart
index d2daf51..6e14b89 100644
--- a/pkg/analyzer/test/error/error_test.dart
+++ b/pkg/analyzer/test/error/error_test.dart
@@ -5,7 +5,9 @@
 import 'dart:core';
 import 'dart:io';
 
+import 'package:analyzer/dart/analysis/utilities.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -21,7 +23,7 @@
   });
 }
 
-List<String> _analyzerRootComponents;
+late List<String> _analyzerRootComponents;
 
 @reflectiveTest
 class ErrorCodeValuesTest extends ParserTestCase {
@@ -34,7 +36,7 @@
     CompilationUnit definingUnit = parseFile(relativeComponents);
     for (CompilationUnitMember declaration in definingUnit.declarations) {
       if (declaration is ClassDeclaration) {
-        ExtendsClause extendsClause = declaration.extendsClause;
+        var extendsClause = declaration.extendsClause;
         if (extendsClause != null &&
             extendsClause.superclass.name.name == 'ErrorCode') {
           String className = declaration.name.name;
@@ -42,7 +44,7 @@
             if (member is FieldDeclaration && member.isStatic) {
               var fields = member.fields;
               if ((fields.type == null ? bad() : true) &&
-                  fields.type.toSource() == className) {
+                  fields.type!.toSource() == className) {
                 String fieldName = fields.variables[0].name.name;
                 declaredCodes.add(className + '.' + fieldName);
               }
@@ -59,11 +61,10 @@
     CompilationUnit listingUnit = parseFile(['lib', 'error', 'error.dart']);
     TopLevelVariableDeclaration declaration = listingUnit.declarations
         .whereType<TopLevelVariableDeclaration>()
-        .firstWhere(
-            (member) =>
-                member.variables.variables[0].name.name == 'errorCodeValues',
-            orElse: () => null);
-    ListLiteral listLiteral = declaration.variables.variables[0].initializer;
+        .firstWhere((member) =>
+            member.variables.variables[0].name.name == 'errorCodeValues');
+    var listLiteral =
+        declaration.variables.variables[0].initializer as ListLiteral;
     for (var element in listLiteral.elements.cast<PrefixedIdentifier>()) {
       listedCodes.add(element.name);
     }
@@ -74,7 +75,11 @@
     List<String> pathComponents = _analyzerRootComponents.toList()
       ..addAll(relativeComponents);
     String filePath = path.normalize(path.joinAll(pathComponents));
-    return parseCompilationUnit(File(filePath).readAsStringSync());
+    return parseString(
+      path: filePath,
+      content: File(filePath).readAsStringSync(),
+      featureSet: ExperimentStatus.latestWithNullSafety,
+    ).unit;
   }
 
   test_errorCodeValues() {
diff --git a/pkg/analyzer/test/file_system/file_system_test_support.dart b/pkg/analyzer/test/file_system/file_system_test_support.dart
index adf8754..e432f4d 100644
--- a/pkg/analyzer/test/file_system/file_system_test_support.dart
+++ b/pkg/analyzer/test/file_system/file_system_test_support.dart
@@ -4,7 +4,6 @@
 
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:meta/meta.dart';
 import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -37,22 +36,22 @@
   /// have the [defaultFileContent]. If the file does not exist then the content
   /// is ignored. If a [filePath] is provided, then the file will be located at
   /// that path; otherwise the file will have the [defaultFilePath].
-  File getFile({@required bool exists, String content, String filePath});
+  File getFile({required bool exists, String? content, String? filePath});
 
   /// Return a folder accessed through the resource provider. If [exists] is
   /// `true` then the returned folder will exist, otherwise it won't. If a
   /// [folderPath] is provided, then the folder will be located at that path;
   /// otherwise the folder will have the [defaultFolderPath].
-  Folder getFolder({@required bool exists, String folderPath});
+  Folder getFolder({required bool exists, String? folderPath});
 
   /// Return a file path composed of the provided parts as defined by the
   /// current path context.
   String join(String part1,
-          [String part2,
-          String part3,
-          String part4,
-          String part5,
-          String part6]) =>
+          [String? part2,
+          String? part3,
+          String? part4,
+          String? part5,
+          String? part6]) =>
       provider.pathContext.join(part1, part2, part3, part4, part5, part6);
 }
 
@@ -189,8 +188,7 @@
   test_parent() {
     File file = getFile(exists: true);
 
-    Folder parent = file.parent;
-    expect(parent, isNotNull);
+    var parent = file.parent!;
     expect(parent.exists, isTrue);
     expect(parent.path, defaultFolderPath);
   }
@@ -426,7 +424,7 @@
   test_delete() {
     File file =
         getFile(exists: true, filePath: join(defaultFolderPath, 'myFile'));
-    Folder folder = file.parent;
+    var folder = file.parent!;
     expect(folder.exists, isTrue);
     expect(file.exists, isTrue);
 
@@ -596,7 +594,7 @@
   test_parent() {
     Folder folder = getFolder(exists: true);
 
-    Folder parent = folder.parent;
+    var parent = folder.parent!;
     expect(parent.path, equals(tempPath));
     //
     // Since the OS is in control of where tempPath is, we don't know how far it
@@ -604,7 +602,7 @@
     // in a folder with a shorter path, and that we reach the root eventually.
     //
     while (true) {
-      Folder grandParent = parent.parent;
+      var grandParent = parent.parent;
       if (grandParent == null) {
         break;
       }
@@ -645,8 +643,8 @@
       }
     }
     for (String fileName in sourceFiles.keys) {
-      File sourceChild = sourceFiles[fileName];
-      File copiedChild = copyFiles[fileName];
+      var sourceChild = sourceFiles[fileName]!;
+      var copiedChild = copyFiles[fileName];
       if (copiedChild == null) {
         fail('Failed to copy file ${sourceChild.path}');
       }
@@ -654,8 +652,8 @@
           reason: 'Incorrectly copied file ${sourceChild.path}');
     }
     for (String fileName in sourceFolders.keys) {
-      Folder sourceChild = sourceFolders[fileName];
-      Folder copiedChild = copyFolders[fileName];
+      var sourceChild = sourceFolders[fileName]!;
+      var copiedChild = copyFolders[fileName];
       if (copiedChild == null) {
         fail('Failed to copy folder ${sourceChild.path}');
       }
@@ -700,14 +698,14 @@
   test_getModificationTimes_existing() async {
     Source source = getFile(exists: true).createSource();
 
-    List<int> times = await provider.getModificationTimes([source]);
+    var times = await provider.getModificationTimes([source]);
     expect(times, [source.modificationStamp]);
   }
 
   test_getModificationTimes_notExisting() async {
     Source source = getFile(exists: false).createSource();
 
-    List<int> times = await provider.getModificationTimes([source]);
+    var times = await provider.getModificationTimes([source]);
     expect(times, [-1]);
   }
 
@@ -733,10 +731,10 @@
   }
 
   test_getStateLocation_uniqueness() {
-    Folder folderOne = provider.getStateLocation('one');
+    var folderOne = provider.getStateLocation('one')!;
     expect(folderOne, isNotNull);
 
-    Folder folderTwo = provider.getStateLocation('two');
+    var folderTwo = provider.getStateLocation('two')!;
     expect(folderTwo, isNotNull);
     expect(folderTwo, isNot(equals(folderOne)));
 
diff --git a/pkg/analyzer/test/file_system/memory_file_system_test.dart b/pkg/analyzer/test/file_system/memory_file_system_test.dart
index c5a929b..ff2ae8c 100644
--- a/pkg/analyzer/test/file_system/memory_file_system_test.dart
+++ b/pkg/analyzer/test/file_system/memory_file_system_test.dart
@@ -7,7 +7,6 @@
 import 'package:analyzer/src/generated/engine.dart' show TimestampedData;
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
-import 'package:meta/meta.dart';
 import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -29,20 +28,20 @@
 abstract class BaseTest extends FileSystemTestSupport {
   /// The resource provider to be used by the tests. Tests should use [provider]
   /// to access the resource provider.
-  MemoryResourceProvider _provider;
+  MemoryResourceProvider? _provider;
 
   /// The absolute path to the temporary directory in which all of the tests are
   /// to work.
   @override
-  /*late*/ String tempPath;
+  late final String tempPath;
 
   /// A path to a folder within the [tempPath] that can be used by tests.
   @override
-  /*late*/ String defaultFolderPath;
+  late final String defaultFolderPath;
 
   /// A path to a file within the [defaultFolderPath] that can be used by tests.
   @override
-  /*late*/ String defaultFilePath;
+  late final String defaultFilePath;
 
   /// The content used for the file at the [defaultFilePath] if it is created
   /// and no other content is provided.
@@ -59,7 +58,7 @@
   MemoryResourceProvider createProvider() => MemoryResourceProvider();
 
   @override
-  File getFile({@required bool exists, String content, String filePath}) {
+  File getFile({required bool exists, String? content, String? filePath}) {
     if (filePath == null) {
       filePath = defaultFilePath;
     } else {
@@ -72,7 +71,7 @@
   }
 
   @override
-  Folder getFolder({@required bool exists, String folderPath}) {
+  Folder getFolder({required bool exists, String? folderPath}) {
     if (folderPath == null) {
       folderPath = defaultFolderPath;
     } else {
@@ -104,8 +103,8 @@
 
 @reflectiveTest
 class MemoryFileSourceExistingTest extends BaseTest {
-  /*late*/ String sourcePath;
-  /*late*/ Source source;
+  late final String sourcePath;
+  late final Source source;
 
   @override
   setUp() {
@@ -184,8 +183,8 @@
 
 @reflectiveTest
 class MemoryFileSourceNotExistingTest extends BaseTest {
-  /*late*/ String sourcePath;
-  /*late*/ Source source;
+  late final String sourcePath;
+  late final Source source;
 
   @override
   setUp() {
diff --git a/pkg/analyzer/test/file_system/overlay_file_system_test.dart b/pkg/analyzer/test/file_system/overlay_file_system_test.dart
index b93e057..2513ebb 100644
--- a/pkg/analyzer/test/file_system/overlay_file_system_test.dart
+++ b/pkg/analyzer/test/file_system/overlay_file_system_test.dart
@@ -6,7 +6,6 @@
 import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/file_system/overlay_file_system.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -37,7 +36,7 @@
     File targetFile =
         provider.getFile(baseProvider.convertPath('/foo/test.dart'));
     expect(targetFile.exists, isFalse);
-    file.copyTo(file.parent.parent);
+    file.copyTo(file.parent!.parent!);
     expect(targetFile.exists, isTrue);
   }
 
@@ -47,7 +46,7 @@
     File targetFile =
         provider.getFile(baseProvider.convertPath('/foo/test.dart'));
     expect(targetFile.exists, isFalse);
-    file.copyTo(file.parent.parent);
+    file.copyTo(file.parent!.parent!);
     expect(targetFile.exists, isTrue);
     expect(targetFile.readAsStringSync(), 'overlay');
     provider.removeOverlay(targetFile.path);
@@ -60,7 +59,7 @@
     File targetFile =
         provider.getFile(baseProvider.convertPath('/foo/test.dart'));
     expect(targetFile.exists, isFalse);
-    file.copyTo(file.parent.parent);
+    file.copyTo(file.parent!.parent!);
     expect(targetFile.exists, isTrue);
     expect(targetFile.readAsStringSync(), 'overlay');
     provider.removeOverlay(targetFile.path);
@@ -165,8 +164,7 @@
   }
 
   test_parent() {
-    Folder parent = _file(exists: true).parent;
-    expect(parent, isNotNull);
+    var parent = _file(exists: true).parent!;
     expect(parent.exists, isTrue);
     expect(parent.path, defaultFolderPath);
   }
@@ -579,7 +577,7 @@
 
   test_getChildren_nonExisting_withOverlay() {
     File file = _file(exists: false, withOverlay: true);
-    List<Resource> children = file.parent.parent.getChildren();
+    List<Resource> children = file.parent!.parent!.getChildren();
     expect(children, hasLength(1));
     expect(children[0], _isFolder);
   }
@@ -600,14 +598,13 @@
   }
 
   test_parent_ofNonRoot() {
-    Folder parent = _folder(exists: true).parent;
-    expect(parent, isNotNull);
+    Folder parent = _folder(exists: true).parent!;
     expect(parent.exists, isTrue);
     expect(parent.path, baseProvider.convertPath('/foo'));
   }
 
   test_parent_ofRoot() {
-    Folder parent = _folder(exists: true, path: '/').parent;
+    var parent = _folder(exists: true, path: '/').parent;
     expect(parent, isNull);
   }
 
@@ -672,8 +669,8 @@
       }
     }
     for (String fileName in sourceFiles.keys) {
-      File sourceChild = sourceFiles[fileName];
-      File copiedChild = copyFiles[fileName];
+      var sourceChild = sourceFiles[fileName]!;
+      var copiedChild = copyFiles[fileName];
       if (copiedChild == null) {
         fail('Failed to copy file ${sourceChild.path}');
       }
@@ -681,8 +678,8 @@
           reason: 'Incorrectly copied file ${sourceChild.path}');
     }
     for (String fileName in sourceFolders.keys) {
-      Folder sourceChild = sourceFolders[fileName];
-      Folder copiedChild = copyFolders[fileName];
+      var sourceChild = sourceFolders[fileName]!;
+      var copiedChild = copyFolders[fileName];
       if (copiedChild == null) {
         fail('Failed to copy folder ${sourceChild.path}');
       }
@@ -737,7 +734,7 @@
 
   test_getFolder_notExisting_withOverlay() {
     File file = _file(exists: false, withOverlay: true);
-    Folder folder = file.parent;
+    Folder folder = file.parent!;
     expect(folder, isNotNull);
     expect(folder.path, defaultFolderPath);
     expect(folder.exists, isTrue);
@@ -794,11 +791,11 @@
 
   test_getStateLocation_uniqueness() {
     String idOne = 'one';
-    Folder folderOne = provider.getStateLocation(idOne);
-    expect(folderOne, isNotNull);
+    Folder folderOne = provider.getStateLocation(idOne)!;
+
     String idTwo = 'two';
-    Folder folderTwo = provider.getStateLocation(idTwo);
-    expect(folderTwo, isNotNull);
+    Folder folderTwo = provider.getStateLocation(idTwo)!;
+
     expect(folderTwo, isNot(equals(folderOne)));
     expect(provider.getStateLocation(idOne), equals(folderOne));
   }
@@ -819,11 +816,11 @@
 }
 
 class OverlayTestSupport {
-  /*late*/ MemoryResourceProvider baseProvider;
-  /*late*/ OverlayResourceProvider provider;
+  late final MemoryResourceProvider baseProvider;
+  late final OverlayResourceProvider provider;
 
-  /*late*/ String defaultFolderPath;
-  /*late*/ String defaultFilePath;
+  late final String defaultFolderPath;
+  late final String defaultFilePath;
 
   void setUp() {
     baseProvider = MemoryResourceProvider();
@@ -834,9 +831,9 @@
   }
 
   File _file(
-      {@required bool exists,
-      String content,
-      String path,
+      {required bool exists,
+      String? content,
+      String? path,
       bool withOverlay = false,
       String overlayContent = 'bbb'}) {
     if (path == null) {
@@ -853,7 +850,7 @@
     return provider.getFile(path);
   }
 
-  Folder _folder({@required bool exists, String path}) {
+  Folder _folder({required bool exists, String? path}) {
     if (path == null) {
       path = defaultFolderPath;
     } else {
diff --git a/pkg/analyzer/test/file_system/physical_file_system_test.dart b/pkg/analyzer/test/file_system/physical_file_system_test.dart
index 8f41e08..c1c70a5 100644
--- a/pkg/analyzer/test/file_system/physical_file_system_test.dart
+++ b/pkg/analyzer/test/file_system/physical_file_system_test.dart
@@ -6,7 +6,6 @@
 
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
-import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -25,24 +24,24 @@
 abstract class BaseTest extends FileSystemTestSupport {
   /// The resource provider to be used by the tests. Tests should use [provider]
   /// to access the resource provider.
-  PhysicalResourceProvider _provider;
+  PhysicalResourceProvider? _provider;
 
   /// A temporary directory on disk. All files and folders created by the tests
   /// should be inside this directory.
-  /*late*/ io.Directory tempDirectory;
+  late final io.Directory tempDirectory;
 
   /// The absolute path to the [tempDirectory]. This path will contain a
   /// symbolic link on some operating systems.
   @override
-  /*late*/ String tempPath;
+  late final String tempPath;
 
   /// A path to a folder within the [tempDirectory] that can be used by tests.
   @override
-  /*late*/ String defaultFolderPath;
+  late final String defaultFolderPath;
 
   /// A path to a file within the [defaultFolderPath] that can be used by tests.
   @override
-  /*late*/ String defaultFilePath;
+  late final String defaultFilePath;
 
   /// The content used for the file at the [defaultFilePath] if it is created
   /// and no other content is provided.
@@ -59,17 +58,17 @@
   PhysicalResourceProvider createProvider() => PhysicalResourceProvider();
 
   @override
-  File getFile({@required bool exists, String content, String filePath}) {
+  File getFile({required bool exists, String? content, String? filePath}) {
     File file = provider.getFile(filePath ?? defaultFilePath);
     if (exists) {
-      file.parent.create();
+      file.parent!.create();
       file.writeAsStringSync(content ?? defaultFileContent);
     }
     return file;
   }
 
   @override
-  Folder getFolder({@required bool exists, String folderPath}) {
+  Folder getFolder({required bool exists, String? folderPath}) {
     Folder folder = provider.getFolder(folderPath ?? defaultFolderPath);
     if (exists) {
       folder.create();
diff --git a/pkg/analyzer/test/file_system/resource_uri_resolver_test.dart b/pkg/analyzer/test/file_system/resource_uri_resolver_test.dart
index 657586c..c6192fb 100644
--- a/pkg/analyzer/test/file_system/resource_uri_resolver_test.dart
+++ b/pkg/analyzer/test/file_system/resource_uri_resolver_test.dart
@@ -16,7 +16,7 @@
 
 @reflectiveTest
 class ResourceUriResolverTest with ResourceProviderMixin {
-  /*late*/ ResourceUriResolver resolver;
+  late final ResourceUriResolver resolver;
 
   void setUp() {
     resolver = ResourceUriResolver(resourceProvider);
@@ -32,8 +32,7 @@
   void test_resolveAbsolute_file() {
     var uri = toUri('/test.dart');
 
-    Source source = resolver.resolveAbsolute(uri);
-    expect(source, isNotNull);
+    var source = resolver.resolveAbsolute(uri)!;
     expect(source.exists(), isTrue);
     expect(source.fullName, convertPath('/test.dart'));
   }
@@ -41,8 +40,7 @@
   void test_resolveAbsolute_folder() {
     var uri = toUri('/folder');
 
-    Source source = resolver.resolveAbsolute(uri);
-    expect(source, isNotNull);
+    var source = resolver.resolveAbsolute(uri)!;
     expect(source.exists(), isFalse);
     expect(source.fullName, convertPath('/folder'));
   }
@@ -50,26 +48,25 @@
   void test_resolveAbsolute_notFile_dartUri() {
     var uri = Uri(scheme: 'dart', path: 'core');
 
-    Source source = resolver.resolveAbsolute(uri);
+    var source = resolver.resolveAbsolute(uri);
     expect(source, isNull);
   }
 
   void test_resolveAbsolute_notFile_httpsUri() {
     var uri = Uri(scheme: 'https', path: '127.0.0.1/test.dart');
 
-    Source source = resolver.resolveAbsolute(uri);
+    var source = resolver.resolveAbsolute(uri);
     expect(source, isNull);
   }
 
   void test_restoreAbsolute() {
     var uri = toUri('/test.dart');
 
-    Source source = resolver.resolveAbsolute(uri);
-    expect(source, isNotNull);
+    var source = resolver.resolveAbsolute(uri)!;
     expect(resolver.restoreAbsolute(source), uri);
     expect(
-        resolver
-            .restoreAbsolute(NonExistingSource(source.fullName, null, null)),
+        resolver.restoreAbsolute(NonExistingSource(
+            source.fullName, Uri.parse('dart:math'), UriKind.DART_URI)),
         uri);
   }
 }
diff --git a/pkg/analyzer/test/generated/all_the_rest_test.dart b/pkg/analyzer/test/generated/all_the_rest_test.dart
index d6c1131..0784b9c 100644
--- a/pkg/analyzer/test/generated/all_the_rest_test.dart
+++ b/pkg/analyzer/test/generated/all_the_rest_test.dart
@@ -49,7 +49,7 @@
 
 @reflectiveTest
 class DartUriResolverTest extends _SimpleDartSdkTest {
-  DartUriResolver resolver;
+  late final DartUriResolver resolver;
 
   @override
   setUp() {
@@ -68,37 +68,36 @@
   }
 
   void test_resolve_dart_library() {
-    Source source = resolver.resolveAbsolute(Uri.parse('dart:core'));
+    var source = resolver.resolveAbsolute(Uri.parse('dart:core'));
     expect(source, isNotNull);
   }
 
   void test_resolve_dart_nonExistingLibrary() {
-    Source result = resolver.resolveAbsolute(Uri.parse("dart:cor"));
+    var result = resolver.resolveAbsolute(Uri.parse("dart:cor"));
     expect(result, isNull);
   }
 
   void test_resolve_dart_part() {
-    Source source = resolver.resolveAbsolute(Uri.parse('dart:core/int.dart'));
+    var source = resolver.resolveAbsolute(Uri.parse('dart:core/int.dart'));
     expect(source, isNotNull);
   }
 
   void test_resolve_nonDart() {
-    Source result =
-        resolver.resolveAbsolute(Uri.parse("package:some/file.dart"));
+    var result = resolver.resolveAbsolute(Uri.parse("package:some/file.dart"));
     expect(result, isNull);
   }
 
   void test_restoreAbsolute_library() {
     _SourceMock source = _SourceMock();
     source.uri = toUri('/sdk/lib/core/core.dart');
-    Uri dartUri = resolver.restoreAbsolute(source);
+    var dartUri = resolver.restoreAbsolute(source);
     expect(dartUri.toString(), 'dart:core');
   }
 
   void test_restoreAbsolute_part() {
     _SourceMock source = _SourceMock();
     source.uri = toUri('/sdk/lib/core/int.dart');
-    Uri dartUri = resolver.restoreAbsolute(source);
+    var dartUri = resolver.restoreAbsolute(source);
     expect(dartUri.toString(), 'dart:core/int.dart');
   }
 }
@@ -164,7 +163,7 @@
   test_equals_false_null() async {
     JavaFile file = FileUtilities2.createFile("/does/not/exist1.dart");
     FileBasedSource source1 = FileBasedSource(file);
-    expect(source1 == null, isFalse);
+    expect(source1, isNotNull);
   }
 
   test_equals_true() async {
@@ -201,13 +200,13 @@
     UriResolver resolver = DartUriResolver(sdk);
     SourceFactory factory = SourceFactory([resolver]);
     // resolve dart:core
-    Source result = resolver.resolveAbsolute(Uri.parse("dart:core"));
+    var result = resolver.resolveAbsolute(Uri.parse("dart:core"));
     expect(result, isNotNull);
-    expect(result.isInSystemLibrary, isTrue);
+    expect(result!.isInSystemLibrary, isTrue);
     // system libraries reference only other system libraries
-    Source partSource = factory.resolveUri(result, "num.dart");
+    var partSource = factory.resolveUri(result, "num.dart");
     expect(partSource, isNotNull);
-    expect(partSource.isInSystemLibrary, isTrue);
+    expect(partSource!.isInSystemLibrary, isTrue);
   }
 
   test_isInSystemLibrary_false() async {
@@ -338,7 +337,7 @@
     expect(UriKind.fromEncoding(0x64), same(UriKind.DART_URI));
     expect(UriKind.fromEncoding(0x66), same(UriKind.FILE_URI));
     expect(UriKind.fromEncoding(0x70), same(UriKind.PACKAGE_URI));
-    expect(UriKind.fromEncoding(0x58), same(null));
+    expect(UriKind.fromEncoding(0x58), isNull);
   }
 
   test_getEncoding() async {
@@ -349,7 +348,7 @@
 }
 
 class _SimpleDartSdkTest with ResourceProviderMixin {
-  /*late*/ DartSdk sdk;
+  late final DartSdk sdk;
 
   void setUp() {
     newFile('/sdk/lib/_internal/sdk_library_metadata/lib/libraries.dart',
@@ -375,7 +374,7 @@
 
 class _SourceMock implements Source {
   @override
-  Uri uri;
+  late final Uri uri;
 
   @override
   noSuchMethod(Invocation invocation) {
diff --git a/pkg/analyzer/test/generated/class_member_parser_test.dart b/pkg/analyzer/test/generated/class_member_parser_test.dart
index 36f4c5d..f45c248 100644
--- a/pkg/analyzer/test/generated/class_member_parser_test.dart
+++ b/pkg/analyzer/test/generated/class_member_parser_test.dart
@@ -48,7 +48,7 @@
     var body = method.body as BlockFunctionBody;
     var statement = body.block.statements[0] as ExpressionStatement;
     var invocation = statement.expression as MethodInvocation;
-    expect(invocation.operator.lexeme, '.');
+    expect(invocation.operator!.lexeme, '.');
     expect(invocation.toSource(), 'new C().late()');
   }
 
@@ -58,7 +58,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isMethodDeclaration);
-    MethodDeclaration method = member;
+    var method = member as MethodDeclaration;
     FunctionBody body = method.body;
     expect(body, isBlockFunctionBody);
     Statement statement = (body as BlockFunctionBody).block.statements[0];
@@ -66,7 +66,7 @@
     Expression expression = (statement as ExpressionStatement).expression;
     expect(expression, isAwaitExpression);
     expect((expression as AwaitExpression).awaitKeyword, isNotNull);
-    expect((expression as AwaitExpression).expression, isNotNull);
+    expect(expression.expression, isNotNull);
   }
 
   void test_parseAwaitExpression_asStatement_inSync() {
@@ -75,7 +75,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isMethodDeclaration);
-    MethodDeclaration method = member;
+    var method = member as MethodDeclaration;
     FunctionBody body = method.body;
     expect(body, isBlockFunctionBody);
     Statement statement = (body as BlockFunctionBody).block.statements[0];
@@ -84,7 +84,7 @@
 
   void test_parseAwaitExpression_inSync() {
     createParser('m() { return await x + await y; }');
-    MethodDeclaration method = parser.parseClassMember('C');
+    var method = parser.parseClassMember('C') as MethodDeclaration;
     expect(method, isNotNull);
     listener.assertErrors([
       expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 13, 5),
@@ -94,7 +94,7 @@
     expect(body, isBlockFunctionBody);
     Statement statement = (body as BlockFunctionBody).block.statements[0];
     expect(statement, isReturnStatement);
-    Expression expression = (statement as ReturnStatement).expression;
+    Expression expression = (statement as ReturnStatement).expression!;
     expect(expression, isBinaryExpression);
   }
 
@@ -112,7 +112,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isConstructorDeclaration);
-    ConstructorDeclaration constructor = member;
+    var constructor = member as ConstructorDeclaration;
     expect(constructor.body, isNotNull);
     expect(constructor.separator, isNotNull);
     expect(constructor.externalKeyword, isNull);
@@ -131,7 +131,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isFieldDeclaration);
-    FieldDeclaration field = member;
+    var field = member as FieldDeclaration;
     expect(field.covariantKeyword, isNotNull);
     expect(field.documentationComment, isNull);
     expect(field.metadata, hasLength(0));
@@ -155,7 +155,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isFieldDeclaration);
-    FieldDeclaration field = member;
+    var field = member as FieldDeclaration;
     expect(field.covariantKeyword, isNull);
     expect(field.documentationComment, isNull);
     expect(field.metadata, hasLength(0));
@@ -168,15 +168,15 @@
     expect(list.isFinal, isFalse);
     expect(list.isLate, isFalse);
     expect(list.lateKeyword, isNull);
-    TypeName type = list.type;
+    var type = list.type as TypeName;
     expect(type.name.name, 'List');
-    NodeList typeArguments = type.typeArguments.arguments;
+    List typeArguments = type.typeArguments!.arguments;
     expect(typeArguments, hasLength(1));
-    TypeName type2 = typeArguments[0];
+    var type2 = typeArguments[0] as TypeName;
     expect(type2.name.name, 'List');
-    NodeList typeArguments2 = type2.typeArguments.arguments;
+    NodeList typeArguments2 = type2.typeArguments!.arguments;
     expect(typeArguments2, hasLength(1));
-    TypeName type3 = typeArguments2[0];
+    var type3 = typeArguments2[0] as TypeName;
     expect(type3.name.name, 'N');
     NodeList<VariableDeclaration> variables = list.variables;
     expect(variables, hasLength(1));
@@ -212,7 +212,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isFieldDeclaration);
-    FieldDeclaration field = member;
+    var field = member as FieldDeclaration;
     expect(field.covariantKeyword, isNull);
     expect(field.documentationComment, isNull);
     expect(field.metadata, hasLength(0));
@@ -238,7 +238,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isFieldDeclaration);
-    FieldDeclaration field = member;
+    var field = member as FieldDeclaration;
     expect(field.covariantKeyword, isNull);
     expect(field.documentationComment, isNull);
     expect(field.metadata, hasLength(0));
@@ -263,7 +263,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isFieldDeclaration);
-    FieldDeclaration field = member;
+    var field = member as FieldDeclaration;
     expect(field.covariantKeyword, isNull);
     expect(field.documentationComment, isNull);
     expect(field.metadata, hasLength(0));
@@ -288,7 +288,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isFieldDeclaration);
-    FieldDeclaration field = member;
+    var field = member as FieldDeclaration;
     expect(field.covariantKeyword, isNull);
     expect(field.documentationComment, isNull);
     expect(field.metadata, hasLength(0));
@@ -314,7 +314,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isFieldDeclaration);
-    FieldDeclaration field = member;
+    var field = member as FieldDeclaration;
     expect(field.covariantKeyword, isNull);
     expect(field.documentationComment, isNull);
     expect(field.metadata, hasLength(0));
@@ -364,7 +364,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isFieldDeclaration);
-    FieldDeclaration field = member;
+    var field = member as FieldDeclaration;
     expect(field.covariantKeyword, isNull);
     expect(field.documentationComment, isNull);
     expect(field.metadata, hasLength(0));
@@ -401,7 +401,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isMethodDeclaration);
-    MethodDeclaration method = member;
+    var method = member as MethodDeclaration;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword, isNull);
@@ -419,7 +419,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isMethodDeclaration);
-    MethodDeclaration method = member;
+    var method = member as MethodDeclaration;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword, isNull);
@@ -438,7 +438,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isMethodDeclaration);
-    MethodDeclaration method = member;
+    var method = member as MethodDeclaration;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNotNull);
     expect(method.modifierKeyword, isNull);
@@ -462,7 +462,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isMethodDeclaration);
-    MethodDeclaration method = member;
+    var method = member as MethodDeclaration;
     expect(method.body, isNotNull);
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNotNull);
@@ -481,7 +481,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isMethodDeclaration);
-    MethodDeclaration method = member;
+    var method = member as MethodDeclaration;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword, isNull);
@@ -500,7 +500,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isMethodDeclaration);
-    MethodDeclaration method = member;
+    var method = member as MethodDeclaration;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword, isNull);
@@ -510,7 +510,7 @@
     expect(method.operatorKeyword, isNull);
     expect(method.typeParameters, isNotNull);
 
-    FormalParameterList parameters = method.parameters;
+    FormalParameterList parameters = method.parameters!;
     expect(parameters, isNotNull);
     expect(parameters.parameters, hasLength(1));
     var parameter = parameters.parameters[0] as SimpleFormalParameter;
@@ -526,7 +526,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isMethodDeclaration);
-    MethodDeclaration method = member;
+    var method = member as MethodDeclaration;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword, isNull);
@@ -545,7 +545,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isMethodDeclaration);
-    MethodDeclaration method = member;
+    var method = member as MethodDeclaration;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword, isNull);
@@ -554,7 +554,7 @@
     expect(method.name, isNotNull);
     expect(method.operatorKeyword, isNull);
     expect(method.typeParameters, isNotNull);
-    TypeParameter tp = method.typeParameters.typeParameters[0];
+    TypeParameter tp = method.typeParameters!.typeParameters[0];
     expect(tp.name.name, 'T');
     expect(tp.extendsKeyword, isNotNull);
     expect((tp.bound as TypeName).name.name, 'num');
@@ -568,7 +568,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isMethodDeclaration);
-    MethodDeclaration method = member;
+    var method = member as MethodDeclaration;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword, isNull);
@@ -579,7 +579,7 @@
       expect(returnType, isNotNull);
       expect(returnType.name.name, 'Map');
 
-      List<TypeAnnotation> typeArguments = returnType.typeArguments.arguments;
+      List<TypeAnnotation> typeArguments = returnType.typeArguments!.arguments;
       expect(typeArguments, hasLength(2));
       expect((typeArguments[0] as TypeName).name.name, 'int');
       expect((typeArguments[1] as TypeName).name.name, 'T');
@@ -598,7 +598,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isMethodDeclaration);
-    MethodDeclaration method = member;
+    var method = member as MethodDeclaration;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword, isNotNull);
@@ -618,7 +618,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isMethodDeclaration);
-    MethodDeclaration method = member;
+    var method = member as MethodDeclaration;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword, isNull);
@@ -637,7 +637,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isMethodDeclaration);
-    MethodDeclaration method = member;
+    var method = member as MethodDeclaration;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword, isNull);
@@ -658,7 +658,7 @@
       expectedError(ParserErrorCode.MEMBER_WITH_CLASS_NAME, 15, 1),
     ]);
     expect(member, isMethodDeclaration);
-    MethodDeclaration method = member;
+    var method = member as MethodDeclaration;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword, isNotNull);
@@ -677,7 +677,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isMethodDeclaration);
-    MethodDeclaration method = member;
+    var method = member as MethodDeclaration;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword, isNull);
@@ -696,7 +696,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isMethodDeclaration);
-    MethodDeclaration method = member;
+    var method = member as MethodDeclaration;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword, isNull);
@@ -789,7 +789,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isMethodDeclaration);
-    MethodDeclaration method = member;
+    var method = member as MethodDeclaration;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword, isNull);
@@ -808,7 +808,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isMethodDeclaration);
-    MethodDeclaration method = member;
+    var method = member as MethodDeclaration;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword, isNull);
@@ -827,7 +827,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isMethodDeclaration);
-    MethodDeclaration method = member;
+    var method = member as MethodDeclaration;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword, isNull);
@@ -846,7 +846,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isMethodDeclaration);
-    MethodDeclaration method = member;
+    var method = member as MethodDeclaration;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword, isNull);
@@ -866,7 +866,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isMethodDeclaration);
-    MethodDeclaration method = member;
+    var method = member as MethodDeclaration;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword, isNull);
@@ -885,7 +885,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isMethodDeclaration);
-    MethodDeclaration method = member;
+    var method = member as MethodDeclaration;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword, isNull);
@@ -906,7 +906,7 @@
       expectedError(ParserErrorCode.MEMBER_WITH_CLASS_NAME, 16, 1),
     ]);
     expect(member, isMethodDeclaration);
-    MethodDeclaration method = member;
+    var method = member as MethodDeclaration;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword, isNotNull);
@@ -925,7 +925,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isMethodDeclaration);
-    MethodDeclaration method = member;
+    var method = member as MethodDeclaration;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword, isNull);
@@ -944,7 +944,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isMethodDeclaration);
-    MethodDeclaration method = member;
+    var method = member as MethodDeclaration;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword, isNull);
@@ -960,8 +960,8 @@
   void test_parseClassMember_method_static_class() {
     var unit = parseCompilationUnit('class C { static void m() {} }');
 
-    ClassDeclaration c = unit.declarations[0];
-    MethodDeclaration method = c.members[0];
+    var c = unit.declarations[0] as ClassDeclaration;
+    var method = c.members[0] as MethodDeclaration;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword, isNotNull);
@@ -976,8 +976,8 @@
 
   void test_parseClassMember_method_static_mixin() {
     var unit = parseCompilationUnit('mixin C { static void m() {} }');
-    MixinDeclaration c = unit.declarations[0];
-    MethodDeclaration method = c.members[0];
+    var c = unit.declarations[0] as MixinDeclaration;
+    var method = c.members[0] as MethodDeclaration;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword, isNotNull);
@@ -996,7 +996,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isMethodDeclaration);
-    MethodDeclaration method = member;
+    var method = member as MethodDeclaration;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword, isNull);
@@ -1015,7 +1015,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isMethodDeclaration);
-    MethodDeclaration method = member;
+    var method = member as MethodDeclaration;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword, isNull);
@@ -1025,7 +1025,7 @@
     expect(method.operatorKeyword, isNotNull);
     expect(method.typeParameters, isNull);
     expect(method.parameters, isNotNull);
-    NodeList<FormalParameter> parameters = method.parameters.parameters;
+    NodeList<FormalParameter> parameters = method.parameters!.parameters;
     expect(parameters, hasLength(1));
     expect(
         (parameters[0] as SimpleFormalParameter).type, isGenericFunctionType);
@@ -1075,7 +1075,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isMethodDeclaration);
-    MethodDeclaration method = member;
+    var method = member as MethodDeclaration;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword, isNull);
@@ -1094,7 +1094,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isMethodDeclaration);
-    MethodDeclaration method = member;
+    var method = member as MethodDeclaration;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword, isNull);
@@ -1113,7 +1113,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isMethodDeclaration);
-    MethodDeclaration method = member;
+    var method = member as MethodDeclaration;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword, isNull);
@@ -1132,20 +1132,20 @@
     assertNoErrors();
     expect(constructor, isNotNull);
     expect(constructor.externalKeyword, isNull);
-    expect(constructor.constKeyword.keyword, Keyword.CONST);
-    expect(constructor.factoryKeyword.keyword, Keyword.FACTORY);
+    expect(constructor.constKeyword!.keyword, Keyword.CONST);
+    expect(constructor.factoryKeyword!.keyword, Keyword.FACTORY);
     expect(constructor.returnType.name, 'C');
     expect(constructor.period, isNull);
     expect(constructor.name, isNull);
-    _assertIsDeclarationName(constructor.returnType, false);
+    _assertIsDeclarationName(constructor.returnType as SimpleIdentifier, false);
     expect(constructor.parameters, isNotNull);
     expect(constructor.parameters.parameters, isEmpty);
-    expect(constructor.separator.type, TokenType.EQ);
+    expect(constructor.separator!.type, TokenType.EQ);
     expect(constructor.initializers, isEmpty);
     expect(constructor.redirectedConstructor, isNotNull);
-    expect(constructor.redirectedConstructor.type.name.name, 'prefix.B');
-    expect(constructor.redirectedConstructor.period.type, TokenType.PERIOD);
-    expect(constructor.redirectedConstructor.name.name, 'foo');
+    expect(constructor.redirectedConstructor!.type.name.name, 'prefix.B');
+    expect(constructor.redirectedConstructor!.period!.type, TokenType.PERIOD);
+    expect(constructor.redirectedConstructor!.name!.name, 'foo');
     expect(constructor.body, isEmptyFunctionBody);
   }
 
@@ -1156,7 +1156,7 @@
     expect(constructor, isNotNull);
     expect(constructor.externalKeyword, isNull);
     expect(constructor.constKeyword, isNull);
-    expect(constructor.factoryKeyword.keyword, Keyword.FACTORY);
+    expect(constructor.factoryKeyword!.keyword, Keyword.FACTORY);
     expect(constructor.returnType.name, 'C');
     expect(constructor.period, isNull);
     expect(constructor.name, isNull);
@@ -1180,22 +1180,22 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isConstructorDeclaration);
-    ConstructorDeclaration constructor = member;
+    var constructor = member as ConstructorDeclaration;
     expect(constructor.externalKeyword, isNull);
     expect(constructor.constKeyword, isNull);
-    expect(constructor.factoryKeyword.keyword, Keyword.FACTORY);
+    expect(constructor.factoryKeyword!.keyword, Keyword.FACTORY);
     expect(constructor.returnType.name, 'C');
-    _assertIsDeclarationName(constructor.returnType, false);
+    _assertIsDeclarationName(constructor.returnType as SimpleIdentifier, false);
     expect(constructor.period, isNull);
     expect(constructor.name, isNull);
     expect(constructor.parameters, isNotNull);
     expect(constructor.parameters.parameters, isEmpty);
-    expect(constructor.separator.type, TokenType.EQ);
+    expect(constructor.separator!.type, TokenType.EQ);
     expect(constructor.initializers, isEmpty);
     expect(constructor.redirectedConstructor, isNotNull);
-    expect(constructor.redirectedConstructor.type.name.name, 'B');
-    expect(constructor.redirectedConstructor.period, isNull);
-    expect(constructor.redirectedConstructor.name, isNull);
+    expect(constructor.redirectedConstructor!.type.name.name, 'B');
+    expect(constructor.redirectedConstructor!.period, isNull);
+    expect(constructor.redirectedConstructor!.name, isNull);
     expect(constructor.body, isEmptyFunctionBody);
   }
 
@@ -1210,7 +1210,7 @@
     expect(initializers, hasLength(3));
     ConstructorInitializer initializer = initializers[1];
     expect(initializer, isAssertInitializer);
-    AssertInitializer assertInitializer = initializer;
+    var assertInitializer = initializer as AssertInitializer;
     expect(assertInitializer.condition, isNotNull);
     expect(assertInitializer.message, isNull);
   }
@@ -1234,10 +1234,10 @@
     expect(constructor.constKeyword, isNull);
     expect(constructor.factoryKeyword, isNotNull);
     expect(constructor.returnType.name, 'C');
-    _assertIsDeclarationName(constructor.returnType, false);
-    expect(constructor.period.type, TokenType.PERIOD);
-    expect(constructor.name.name, 'foo');
-    _assertIsDeclarationName(constructor.name);
+    _assertIsDeclarationName(constructor.returnType as SimpleIdentifier, false);
+    expect(constructor.period!.type, TokenType.PERIOD);
+    expect(constructor.name!.name, 'foo');
+    _assertIsDeclarationName(constructor.name!);
     expect(constructor.parameters, isNotNull);
     expect(constructor.parameters.parameters, isEmpty);
     expect(constructor.separator, isNull);
@@ -1290,10 +1290,10 @@
     expect(constructor.constKeyword, isNull);
     expect(constructor.factoryKeyword, isNull);
     expect(constructor.returnType.name, 'C');
-    _assertIsDeclarationName(constructor.returnType, false);
-    expect(constructor.period.type, TokenType.PERIOD);
-    expect(constructor.name.name, 'foo');
-    _assertIsDeclarationName(constructor.name);
+    _assertIsDeclarationName(constructor.returnType as SimpleIdentifier, false);
+    expect(constructor.period!.type, TokenType.PERIOD);
+    expect(constructor.name!.name, 'foo');
+    _assertIsDeclarationName(constructor.name!);
     expect(constructor.parameters, isNotNull);
     expect(constructor.parameters.parameters, isEmpty);
     expect(constructor.separator, isNull);
@@ -1344,13 +1344,13 @@
     expect(constructor.constKeyword, isNull);
     expect(constructor.factoryKeyword, isNull);
     expect(constructor.returnType.name, 'C');
-    _assertIsDeclarationName(constructor.returnType, false);
+    _assertIsDeclarationName(constructor.returnType as SimpleIdentifier, false);
     expect(constructor.name, isNull);
     expect(constructor.parameters, isNotNull);
     expect(constructor.parameters.parameters, isEmpty);
-    expect(constructor.separator.lexeme, ':');
+    expect(constructor.separator!.lexeme, ':');
     expect(constructor.initializers, hasLength(1));
-    SuperConstructorInvocation initializer = constructor.initializers[0];
+    var initializer = constructor.initializers[0] as SuperConstructorInvocation;
     expect(initializer.argumentList.arguments, isEmpty);
     expect(constructor.redirectedConstructor, isNull);
     expect(constructor.body, isEmptyFunctionBody);
@@ -1368,13 +1368,14 @@
     expect(constructor.constKeyword, isNull);
     expect(constructor.factoryKeyword, isNull);
     expect(constructor.returnType.name, 'C');
-    _assertIsDeclarationName(constructor.returnType, false);
+    _assertIsDeclarationName(constructor.returnType as SimpleIdentifier, false);
     expect(constructor.name, isNull);
     expect(constructor.parameters, isNotNull);
     expect(constructor.parameters.parameters, isEmpty);
-    expect(constructor.separator.lexeme, ':');
+    expect(constructor.separator!.lexeme, ':');
     expect(constructor.initializers, hasLength(1));
-    RedirectingConstructorInvocation initializer = constructor.initializers[0];
+    var initializer =
+        constructor.initializers[0] as RedirectingConstructorInvocation;
     expect(initializer.argumentList.arguments, isEmpty);
     expect(constructor.redirectedConstructor, isNull);
     expect(constructor.body, isEmptyFunctionBody);
@@ -1389,7 +1390,7 @@
     expect(constructor.constKeyword, isNull);
     expect(constructor.factoryKeyword, isNull);
     expect(constructor.returnType.name, 'C');
-    _assertIsDeclarationName(constructor.returnType, false);
+    _assertIsDeclarationName(constructor.returnType as SimpleIdentifier, false);
     expect(constructor.period, isNull);
     expect(constructor.name, isNull);
     expect(constructor.parameters, isNotNull);
@@ -1755,7 +1756,7 @@
 
   void test_parseGetter_identifier_colon_issue_36961() {
     createParser('get a:');
-    ConstructorDeclaration constructor = parser.parseClassMember('C');
+    var constructor = parser.parseClassMember('C') as ConstructorDeclaration;
     expect(constructor, isNotNull);
     listener.assertErrors([
       expectedError(ParserErrorCode.GETTER_CONSTRUCTOR, 0, 3),
@@ -1774,7 +1775,7 @@
 
   void test_parseGetter_nonStatic() {
     createParser('/// Doc\nT get a;');
-    MethodDeclaration method = parser.parseClassMember('C');
+    var method = parser.parseClassMember('C') as MethodDeclaration;
     expect(method, isNotNull);
     assertNoErrors();
     expect(method.body, isNotNull);
@@ -1790,13 +1791,13 @@
 
   void test_parseGetter_static() {
     createParser('/// Doc\nstatic T get a => 42;');
-    MethodDeclaration method = parser.parseClassMember('C');
+    var method = parser.parseClassMember('C') as MethodDeclaration;
     expect(method, isNotNull);
     assertNoErrors();
     expect(method.body, isNotNull);
     expectCommentText(method.documentationComment, '/// Doc');
     expect(method.externalKeyword, isNull);
-    expect(method.modifierKeyword.lexeme, 'static');
+    expect(method.modifierKeyword!.lexeme, 'static');
     expect(method.name, isNotNull);
     expect(method.operatorKeyword, isNull);
     expect(method.typeParameters, isNull);
@@ -1807,7 +1808,7 @@
 
   void test_parseInitializedIdentifierList_type() {
     createParser("/// Doc\nstatic T a = 1, b, c = 3;");
-    FieldDeclaration declaration = parser.parseClassMember('C');
+    var declaration = parser.parseClassMember('C') as FieldDeclaration;
     expect(declaration, isNotNull);
     assertNoErrors();
     expectCommentText(declaration.documentationComment, '/// Doc');
@@ -1816,28 +1817,28 @@
     expect(fields.keyword, isNull);
     expect((fields.type as TypeName).name.name, 'T');
     expect(fields.variables, hasLength(3));
-    expect(declaration.staticKeyword.lexeme, 'static');
+    expect(declaration.staticKeyword!.lexeme, 'static');
     expect(declaration.semicolon, isNotNull);
   }
 
   void test_parseInitializedIdentifierList_var() {
     createParser('/// Doc\nstatic var a = 1, b, c = 3;');
-    FieldDeclaration declaration = parser.parseClassMember('C');
+    var declaration = parser.parseClassMember('C') as FieldDeclaration;
     expect(declaration, isNotNull);
     assertNoErrors();
     expectCommentText(declaration.documentationComment, '/// Doc');
     VariableDeclarationList fields = declaration.fields;
     expect(fields, isNotNull);
-    expect(fields.keyword.lexeme, 'var');
+    expect(fields.keyword!.lexeme, 'var');
     expect(fields.type, isNull);
     expect(fields.variables, hasLength(3));
-    expect(declaration.staticKeyword.lexeme, 'static');
+    expect(declaration.staticKeyword!.lexeme, 'static');
     expect(declaration.semicolon, isNotNull);
   }
 
   void test_parseOperator() {
     createParser('/// Doc\nT operator +(A a);');
-    MethodDeclaration method = parser.parseClassMember('C');
+    var method = parser.parseClassMember('C') as MethodDeclaration;
     expect(method, isNotNull);
     assertNoErrors();
     expect(method.body, isNotNull);
@@ -1854,7 +1855,7 @@
 
   void test_parseSetter_nonStatic() {
     createParser('/// Doc\nT set a(var x);');
-    MethodDeclaration method = parser.parseClassMember('C');
+    var method = parser.parseClassMember('C') as MethodDeclaration;
     expect(method, isNotNull);
     assertNoErrors();
     expect(method.body, isNotNull);
@@ -1871,13 +1872,13 @@
 
   void test_parseSetter_static() {
     createParser('/// Doc\nstatic T set a(var x) {}');
-    MethodDeclaration method = parser.parseClassMember('C');
+    var method = parser.parseClassMember('C') as MethodDeclaration;
     expect(method, isNotNull);
     assertNoErrors();
     expect(method.body, isNotNull);
     expectCommentText(method.documentationComment, '/// Doc');
     expect(method.externalKeyword, isNull);
-    expect(method.modifierKeyword.lexeme, 'static');
+    expect(method.modifierKeyword!.lexeme, 'static');
     expect(method.name, isNotNull);
     expect(method.operatorKeyword, isNull);
     expect(method.typeParameters, isNull);
@@ -1893,7 +1894,7 @@
     int x) {}
 ''');
     var function = parseFullCompilationUnitMember() as FunctionDeclaration;
-    var parameter = function.functionExpression.parameters.parameters[0]
+    var parameter = function.functionExpression.parameters!.parameters[0]
         as NormalFormalParameter;
     expectCommentText(parameter.documentationComment, '/// Doc');
   }
diff --git a/pkg/analyzer/test/generated/collection_literal_parser_test.dart b/pkg/analyzer/test/generated/collection_literal_parser_test.dart
index 76e1dc8..b5b211a 100644
--- a/pkg/analyzer/test/generated/collection_literal_parser_test.dart
+++ b/pkg/analyzer/test/generated/collection_literal_parser_test.dart
@@ -20,9 +20,9 @@
 @reflectiveTest
 class CollectionLiteralParserTest extends FastaParserTestCase {
   Expression parseCollectionLiteral(String source,
-      {List<ErrorCode> codes,
-      List<ExpectedError> errors,
-      int expectedEndOffset,
+      {List<ErrorCode>? codes,
+      List<ExpectedError>? errors,
+      int? expectedEndOffset,
       bool inAsync = false}) {
     return parseExpression(source,
         codes: codes,
@@ -414,7 +414,8 @@
   }
 
   void test_mapLiteral_ifSpread() {
-    SetOrMapLiteral map = parseCollectionLiteral('{1:1, if (true) ...{2:4}}');
+    var map =
+        parseCollectionLiteral('{1:1, if (true) ...{2:4}}') as SetOrMapLiteral;
     expect(map.elements, hasLength(2));
     var first = map.elements[0] as MapLiteralEntry;
     var firstValue = first.value as IntegerLiteral;
@@ -444,7 +445,7 @@
     var map = parseCollectionLiteral('<int, int>{1: 2, ...{3: 4}}')
         as SetOrMapLiteral;
     expect(map.constKeyword, isNull);
-    expect(map.typeArguments.arguments, hasLength(2));
+    expect(map.typeArguments!.arguments, hasLength(2));
     expect(map.elements, hasLength(2));
 
     var element = map.elements[1] as SpreadElement;
@@ -457,7 +458,7 @@
     var map =
         parseCollectionLiteral('<int, int>{...{3: 4}}') as SetOrMapLiteral;
     expect(map.constKeyword, isNull);
-    expect(map.typeArguments.arguments, hasLength(2));
+    expect(map.typeArguments!.arguments, hasLength(2));
     expect(map.elements, hasLength(1));
 
     var element = map.elements[0] as SpreadElement;
@@ -482,7 +483,7 @@
     var map = parseCollectionLiteral('<int, int>{1: 2, ...?{3: 4}}')
         as SetOrMapLiteral;
     expect(map.constKeyword, isNull);
-    expect(map.typeArguments.arguments, hasLength(2));
+    expect(map.typeArguments!.arguments, hasLength(2));
     expect(map.elements, hasLength(2));
 
     var element = map.elements[1] as SpreadElement;
@@ -495,7 +496,7 @@
     var map =
         parseCollectionLiteral('<int, int>{...?{3: 4}}') as SetOrMapLiteral;
     expect(map.constKeyword, isNull);
-    expect(map.typeArguments.arguments, hasLength(2));
+    expect(map.typeArguments!.arguments, hasLength(2));
     expect(map.elements, hasLength(1));
 
     var element = map.elements[0] as SpreadElement;
diff --git a/pkg/analyzer/test/generated/complex_parser_test.dart b/pkg/analyzer/test/generated/complex_parser_test.dart
index 67ae21b..59752a5 100644
--- a/pkg/analyzer/test/generated/complex_parser_test.dart
+++ b/pkg/analyzer/test/generated/complex_parser_test.dart
@@ -27,43 +27,43 @@
 @reflectiveTest
 class ComplexParserTest extends FastaParserTestCase {
   void test_additiveExpression_normal() {
-    BinaryExpression expression = parseExpression("x + y - z");
+    var expression = parseExpression("x + y - z") as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_additiveExpression_noSpaces() {
-    BinaryExpression expression = parseExpression("i+1");
+    var expression = parseExpression("i+1") as BinaryExpression;
     expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.rightOperand, isIntegerLiteral);
   }
 
   void test_additiveExpression_precedence_multiplicative_left() {
-    BinaryExpression expression = parseExpression("x * y + z");
+    var expression = parseExpression("x * y + z") as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_additiveExpression_precedence_multiplicative_left_withSuper() {
-    BinaryExpression expression = parseExpression("super * y - z");
+    var expression = parseExpression("super * y - z") as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_additiveExpression_precedence_multiplicative_right() {
-    BinaryExpression expression = parseExpression("x + y * z");
+    var expression = parseExpression("x + y * z") as BinaryExpression;
     expect(expression.rightOperand, isBinaryExpression);
   }
 
   void test_additiveExpression_super() {
-    BinaryExpression expression = parseExpression("super + y - z");
+    var expression = parseExpression("super + y - z") as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_assignableExpression_arguments_normal_chain() {
-    PropertyAccess propertyAccess1 = parseExpression("a(b)(c).d(e).f");
+    var propertyAccess1 = parseExpression("a(b)(c).d(e).f") as PropertyAccess;
     expect(propertyAccess1.propertyName.name, "f");
     //
     // a(b)(c).d(e)
     //
-    MethodInvocation invocation2 = propertyAccess1.target;
+    var invocation2 = propertyAccess1.target as MethodInvocation;
     expect(invocation2.methodName.name, "d");
     expect(invocation2.typeArguments, isNull);
     ArgumentList argumentList2 = invocation2.argumentList;
@@ -72,7 +72,7 @@
     //
     // a(b)(c)
     //
-    FunctionExpressionInvocation invocation3 = invocation2.target;
+    var invocation3 = invocation2.target as FunctionExpressionInvocation;
     expect(invocation3.typeArguments, isNull);
     ArgumentList argumentList3 = invocation3.argumentList;
     expect(argumentList3, isNotNull);
@@ -80,7 +80,7 @@
     //
     // a(b)
     //
-    MethodInvocation invocation4 = invocation3.function;
+    var invocation4 = invocation3.function as MethodInvocation;
     expect(invocation4.methodName.name, "a");
     expect(invocation4.typeArguments, isNull);
     ArgumentList argumentList4 = invocation4.argumentList;
@@ -94,25 +94,25 @@
   }
 
   void test_assignmentExpression_compound() {
-    AssignmentExpression expression = parseExpression("x = y = 0");
+    var expression = parseExpression("x = y = 0") as AssignmentExpression;
     expect(expression.leftHandSide, isSimpleIdentifier);
     expect(expression.rightHandSide, isAssignmentExpression);
   }
 
   void test_assignmentExpression_indexExpression() {
-    AssignmentExpression expression = parseExpression("x[1] = 0");
+    var expression = parseExpression("x[1] = 0") as AssignmentExpression;
     expect(expression.leftHandSide, isIndexExpression);
     expect(expression.rightHandSide, isIntegerLiteral);
   }
 
   void test_assignmentExpression_prefixedIdentifier() {
-    AssignmentExpression expression = parseExpression("x.y = 0");
+    var expression = parseExpression("x.y = 0") as AssignmentExpression;
     expect(expression.leftHandSide, isPrefixedIdentifier);
     expect(expression.rightHandSide, isIntegerLiteral);
   }
 
   void test_assignmentExpression_propertyAccess() {
-    AssignmentExpression expression = parseExpression("super.y = 0");
+    var expression = parseExpression("super.y = 0") as AssignmentExpression;
     expect(expression.leftHandSide, isPropertyAccess);
     expect(expression.rightHandSide, isIntegerLiteral);
   }
@@ -128,69 +128,86 @@
     expect(rhs.name, 'y');
   }
 
+  void test_binary_operator_written_out_expression_logical() {
+    var expression = parseExpression('x > 0 and y > 1', errors: [
+      expectedError(ParserErrorCode.BINARY_OPERATOR_WRITTEN_OUT, 6, 3),
+    ]) as BinaryExpression;
+    var lhs = expression.leftOperand as BinaryExpression;
+    expect((lhs.leftOperand as SimpleIdentifier).name, 'x');
+    expect(lhs.operator.lexeme, '>');
+    expect((lhs.rightOperand as IntegerLiteral).value, 0);
+
+    expect(expression.operator.lexeme, '&&');
+
+    var rhs = expression.rightOperand as BinaryExpression;
+    expect((rhs.leftOperand as SimpleIdentifier).name, 'y');
+    expect(rhs.operator.lexeme, '>');
+    expect((rhs.rightOperand as IntegerLiteral).value, 1);
+  }
+
   void test_bitwiseAndExpression_normal() {
-    BinaryExpression expression = parseExpression("x & y & z");
+    var expression = parseExpression("x & y & z") as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_bitwiseAndExpression_precedence_equality_left() {
-    BinaryExpression expression = parseExpression("x == y && z");
+    var expression = parseExpression("x == y && z") as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_bitwiseAndExpression_precedence_equality_right() {
-    BinaryExpression expression = parseExpression("x && y == z");
+    var expression = parseExpression("x && y == z") as BinaryExpression;
     expect(expression.rightOperand, isBinaryExpression);
   }
 
   void test_bitwiseAndExpression_super() {
-    BinaryExpression expression = parseExpression("super & y & z");
+    var expression = parseExpression("super & y & z") as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_bitwiseOrExpression_normal() {
-    BinaryExpression expression = parseExpression("x | y | z");
+    var expression = parseExpression("x | y | z") as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_bitwiseOrExpression_precedence_xor_left() {
-    BinaryExpression expression = parseExpression("x ^ y | z");
+    var expression = parseExpression("x ^ y | z") as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_bitwiseOrExpression_precedence_xor_right() {
-    BinaryExpression expression = parseExpression("x | y ^ z");
+    var expression = parseExpression("x | y ^ z") as BinaryExpression;
     expect(expression.rightOperand, isBinaryExpression);
   }
 
   void test_bitwiseOrExpression_super() {
-    BinaryExpression expression = parseExpression("super | y | z");
+    var expression = parseExpression("super | y | z") as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_bitwiseXorExpression_normal() {
-    BinaryExpression expression = parseExpression("x ^ y ^ z");
+    var expression = parseExpression("x ^ y ^ z") as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_bitwiseXorExpression_precedence_and_left() {
-    BinaryExpression expression = parseExpression("x & y ^ z");
+    var expression = parseExpression("x & y ^ z") as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_bitwiseXorExpression_precedence_and_right() {
-    BinaryExpression expression = parseExpression("x ^ y & z");
+    var expression = parseExpression("x ^ y & z") as BinaryExpression;
     expect(expression.rightOperand, isBinaryExpression);
   }
 
   void test_bitwiseXorExpression_super() {
-    BinaryExpression expression = parseExpression("super ^ y ^ z");
+    var expression = parseExpression("super ^ y ^ z") as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_cascade_withAssignment() {
-    CascadeExpression cascade =
-        parseExpression("new Map()..[3] = 4 ..[0] = 11");
+    var cascade =
+        parseExpression("new Map()..[3] = 4 ..[0] = 11") as CascadeExpression;
     Expression target = cascade.target;
     for (Expression section in cascade.cascadeSections) {
       expect(section, isAssignmentExpression);
@@ -203,18 +220,19 @@
   }
 
   void test_conditionalExpression_precedence_ifNullExpression() {
-    ConditionalExpression expression = parseExpression('a ?? b ? y : z');
+    var expression = parseExpression('a ?? b ? y : z') as ConditionalExpression;
     expect(expression.condition, isBinaryExpression);
   }
 
   void test_conditionalExpression_precedence_logicalOrExpression() {
-    ConditionalExpression expression = parseExpression("a | b ? y : z");
+    var expression = parseExpression("a | b ? y : z") as ConditionalExpression;
     expect(expression.condition, isBinaryExpression);
   }
 
   void test_conditionalExpression_precedence_nullableType_as() {
-    ExpressionStatement statement = parseStatement('x as bool ? (x + y) : z;');
-    ConditionalExpression expression = statement.expression;
+    var statement =
+        parseStatement('x as bool ? (x + y) : z;') as ExpressionStatement;
+    var expression = statement.expression as ConditionalExpression;
     Expression condition = expression.condition;
     expect(condition, isAsExpression);
     Expression thenExpression = expression.thenExpression;
@@ -229,7 +247,7 @@
     var expression = statement.expression as ConditionalExpression;
     var asExpression = expression.condition as AsExpression;
     var type = asExpression.type as TypeName;
-    expect(type.question.lexeme, '?');
+    expect(type.question!.lexeme, '?');
     Expression thenExpression = expression.thenExpression;
     expect(thenExpression, isParenthesizedExpression);
     Expression elseExpression = expression.elseExpression;
@@ -244,7 +262,7 @@
     var condition = expression.condition as ParenthesizedExpression;
     var asExpression = condition.expression as AsExpression;
     var type = asExpression.type as TypeName;
-    expect(type.question.lexeme, '?');
+    expect(type.question!.lexeme, '?');
     Expression thenExpression = expression.thenExpression;
     expect(thenExpression, isParenthesizedExpression);
     Expression elseExpression = expression.elseExpression;
@@ -253,9 +271,9 @@
   }
 
   void test_conditionalExpression_precedence_nullableType_is() {
-    ExpressionStatement statement =
-        parseStatement('x is String ? (x + y) : z;');
-    ConditionalExpression expression = statement.expression;
+    var statement =
+        parseStatement('x is String ? (x + y) : z;') as ExpressionStatement;
+    var expression = statement.expression as ConditionalExpression;
     Expression condition = expression.condition;
     expect(condition, isIsExpression);
     Expression thenExpression = expression.thenExpression;
@@ -270,7 +288,7 @@
     var expression = statement.expression as ConditionalExpression;
     var isExpression = expression.condition as IsExpression;
     var type = isExpression.type as TypeName;
-    expect(type.question.lexeme, '?');
+    expect(type.question!.lexeme, '?');
     Expression thenExpression = expression.thenExpression;
     expect(thenExpression, isParenthesizedExpression);
     Expression elseExpression = expression.elseExpression;
@@ -285,7 +303,7 @@
     var condition = expression.condition as ParenthesizedExpression;
     var isExpression = condition.expression as IsExpression;
     var type = isExpression.type as TypeName;
-    expect(type.question.lexeme, '?');
+    expect(type.question!.lexeme, '?');
     Expression thenExpression = expression.thenExpression;
     expect(thenExpression, isParenthesizedExpression);
     Expression elseExpression = expression.elseExpression;
@@ -294,9 +312,9 @@
   }
 
   void test_conditionalExpression_precedence_nullableTypeWithTypeArg1_is() {
-    ExpressionStatement statement =
-        parseStatement('x is String<S> ? (x + y) : z;');
-    ConditionalExpression expression = statement.expression;
+    var statement =
+        parseStatement('x is String<S> ? (x + y) : z;') as ExpressionStatement;
+    var expression = statement.expression as ConditionalExpression;
     Expression condition = expression.condition;
     expect(condition, TypeMatcher<IsExpression>());
     Expression thenExpression = expression.thenExpression;
@@ -306,9 +324,9 @@
   }
 
   void test_conditionalExpression_precedence_nullableTypeWithTypeArg1GFT_is() {
-    ExpressionStatement statement =
-        parseStatement('x is String<S> Function() ? (x + y) : z;');
-    ConditionalExpression expression = statement.expression;
+    var statement = parseStatement('x is String<S> Function() ? (x + y) : z;')
+        as ExpressionStatement;
+    var expression = statement.expression as ConditionalExpression;
     Expression condition = expression.condition;
     expect(condition, TypeMatcher<IsExpression>());
     Expression thenExpression = expression.thenExpression;
@@ -318,9 +336,9 @@
   }
 
   void test_conditionalExpression_precedence_nullableTypeWithTypeArg2_is() {
-    ExpressionStatement statement =
-        parseStatement('x is String<S,T> ? (x + y) : z;');
-    ConditionalExpression expression = statement.expression;
+    var statement = parseStatement('x is String<S,T> ? (x + y) : z;')
+        as ExpressionStatement;
+    var expression = statement.expression as ConditionalExpression;
     Expression condition = expression.condition;
     expect(condition, TypeMatcher<IsExpression>());
     Expression thenExpression = expression.thenExpression;
@@ -330,10 +348,11 @@
   }
 
   void test_conditionalExpression_precedence_prefixedNullableType_is() {
-    ExpressionStatement statement = parseStatement('x is p.A ? (x + y) : z;');
-    ConditionalExpression expression = statement.expression;
+    var statement =
+        parseStatement('x is p.A ? (x + y) : z;') as ExpressionStatement;
+    var expression = statement.expression as ConditionalExpression;
 
-    Expression condition = expression.condition;
+    var condition = expression.condition;
     expect(condition, TypeMatcher<IsExpression>());
     Expression thenExpression = expression.thenExpression;
     expect(thenExpression, TypeMatcher<ParenthesizedExpression>());
@@ -342,29 +361,31 @@
   }
 
   void test_conditionalExpression_precedence_withAssignment() {
-    ExpressionStatement statement = parseStatement('b ? c = true : g();');
-    ConditionalExpression expression = statement.expression;
+    var statement =
+        parseStatement('b ? c = true : g();') as ExpressionStatement;
+    var expression = statement.expression as ConditionalExpression;
     expect(expression.condition, TypeMatcher<SimpleIdentifier>());
     expect(expression.thenExpression, TypeMatcher<AssignmentExpression>());
   }
 
   void test_conditionalExpression_precedence_withAssignment2() {
-    ExpressionStatement statement = parseStatement('b.x ? c = true : g();');
-    ConditionalExpression expression = statement.expression;
+    var statement =
+        parseStatement('b.x ? c = true : g();') as ExpressionStatement;
+    var expression = statement.expression as ConditionalExpression;
     expect(expression.condition, TypeMatcher<PrefixedIdentifier>());
     expect(expression.thenExpression, TypeMatcher<AssignmentExpression>());
   }
 
   void test_conditionalExpression_prefixedValue() {
-    ExpressionStatement statement = parseStatement('a.b ? y : z;');
-    ConditionalExpression expression = statement.expression;
+    var statement = parseStatement('a.b ? y : z;') as ExpressionStatement;
+    var expression = statement.expression as ConditionalExpression;
     expect(expression.condition, TypeMatcher<PrefixedIdentifier>());
     expect(expression.thenExpression, TypeMatcher<SimpleIdentifier>());
   }
 
   void test_conditionalExpression_prefixedValue2() {
-    ExpressionStatement statement = parseStatement('a.b ? x.y : z;');
-    ConditionalExpression expression = statement.expression;
+    var statement = parseStatement('a.b ? x.y : z;') as ExpressionStatement;
+    var expression = statement.expression as ConditionalExpression;
     expect(expression.condition, TypeMatcher<PrefixedIdentifier>());
     expect(expression.thenExpression, TypeMatcher<PrefixedIdentifier>());
   }
@@ -381,151 +402,154 @@
   }
 
   void test_equalityExpression_normal() {
-    BinaryExpression expression = parseExpression("x == y != z",
-        codes: [ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND]);
+    var expression = parseExpression("x == y != z",
+            codes: [ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND])
+        as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_equalityExpression_precedence_relational_left() {
-    BinaryExpression expression = parseExpression("x is y == z");
+    var expression = parseExpression("x is y == z") as BinaryExpression;
     expect(expression.leftOperand, isIsExpression);
   }
 
   void test_equalityExpression_precedence_relational_right() {
-    BinaryExpression expression = parseExpression("x == y is z");
+    var expression = parseExpression("x == y is z") as BinaryExpression;
     expect(expression.rightOperand, isIsExpression);
   }
 
   void test_equalityExpression_super() {
-    BinaryExpression expression = parseExpression("super == y != z",
-        codes: [ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND]);
+    var expression = parseExpression("super == y != z",
+            codes: [ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND])
+        as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_ifNullExpression() {
-    BinaryExpression expression = parseExpression('x ?? y ?? z');
+    var expression = parseExpression('x ?? y ?? z') as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_ifNullExpression_precedence_logicalOr_left() {
-    BinaryExpression expression = parseExpression('x || y ?? z');
+    var expression = parseExpression('x || y ?? z') as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_ifNullExpression_precedence_logicalOr_right() {
-    BinaryExpression expression = parseExpression('x ?? y || z');
+    var expression = parseExpression('x ?? y || z') as BinaryExpression;
     expect(expression.rightOperand, isBinaryExpression);
   }
 
   void test_logicalAndExpression() {
-    BinaryExpression expression = parseExpression("x && y && z");
+    var expression = parseExpression("x && y && z") as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_logicalAndExpression_precedence_bitwiseOr_left() {
-    BinaryExpression expression = parseExpression("x | y < z");
+    var expression = parseExpression("x | y < z") as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_logicalAndExpression_precedence_bitwiseOr_right() {
-    BinaryExpression expression = parseExpression("x < y | z");
+    var expression = parseExpression("x < y | z") as BinaryExpression;
     expect(expression.rightOperand, isBinaryExpression);
   }
 
   void test_logicalAndExpressionStatement() {
     // Assert that `<` and `>` are not interpreted as type arguments.
-    ExpressionStatement statement = parseStatement("C<T && T>U;");
-    BinaryExpression expression = statement.expression;
+    var statement = parseStatement("C<T && T>U;") as ExpressionStatement;
+    var expression = statement.expression as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_logicalOrExpression() {
-    BinaryExpression expression = parseExpression("x || y || z");
+    var expression = parseExpression("x || y || z") as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_logicalOrExpression_precedence_logicalAnd_left() {
-    BinaryExpression expression = parseExpression("x && y || z");
+    var expression = parseExpression("x && y || z") as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_logicalOrExpression_precedence_logicalAnd_right() {
-    BinaryExpression expression = parseExpression("x || y && z");
+    var expression = parseExpression("x || y && z") as BinaryExpression;
     expect(expression.rightOperand, isBinaryExpression);
   }
 
   void test_methodInvocation1() {
     // Assert that `<` and `>` are not interpreted as type arguments.
-    ExpressionStatement statement = parseStatement("f(a < b, c > 3);");
+    var statement = parseStatement("f(a < b, c > 3);") as ExpressionStatement;
     assertNoErrors();
-    MethodInvocation method = statement.expression;
+    var method = statement.expression as MethodInvocation;
     expect(method.argumentList.arguments, hasLength(2));
   }
 
   void test_methodInvocation2() {
     // Assert that `<` and `>` are not interpreted as type arguments.
-    ExpressionStatement statement = parseStatement("f(a < b, c >> 3);");
+    var statement = parseStatement("f(a < b, c >> 3);") as ExpressionStatement;
     assertNoErrors();
-    MethodInvocation method = statement.expression;
+    var method = statement.expression as MethodInvocation;
     expect(method.argumentList.arguments, hasLength(2));
   }
 
   void test_methodInvocation3() {
     // Assert that `<` and `>` are not interpreted as type arguments.
-    ExpressionStatement statement = parseStatement("f(a < b, c < d >> 3);");
+    var statement =
+        parseStatement("f(a < b, c < d >> 3);") as ExpressionStatement;
     assertNoErrors();
-    MethodInvocation method = statement.expression;
+    var method = statement.expression as MethodInvocation;
     expect(method.argumentList.arguments, hasLength(2));
   }
 
   void test_multipleLabels_statement() {
-    LabeledStatement statement = parseStatement("a: b: c: return x;");
+    var statement = parseStatement("a: b: c: return x;") as LabeledStatement;
     expect(statement.labels, hasLength(3));
     expect(statement.statement, isReturnStatement);
   }
 
   void test_multiplicativeExpression_normal() {
-    BinaryExpression expression = parseExpression("x * y / z");
+    var expression = parseExpression("x * y / z") as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_multiplicativeExpression_precedence_unary_left() {
-    BinaryExpression expression = parseExpression("-x * y");
+    var expression = parseExpression("-x * y") as BinaryExpression;
     expect(expression.leftOperand, isPrefixExpression);
   }
 
   void test_multiplicativeExpression_precedence_unary_right() {
-    BinaryExpression expression = parseExpression("x * -y");
+    var expression = parseExpression("x * -y") as BinaryExpression;
     expect(expression.rightOperand, isPrefixExpression);
   }
 
   void test_multiplicativeExpression_super() {
-    BinaryExpression expression = parseExpression("super * y / z");
+    var expression = parseExpression("super * y / z") as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_relationalExpression_precedence_shift_right() {
-    IsExpression expression = parseExpression("x << y is z");
+    var expression = parseExpression("x << y is z") as IsExpression;
     expect(expression.expression, isBinaryExpression);
   }
 
   void test_shiftExpression_normal() {
-    BinaryExpression expression = parseExpression("x >> 4 << 3");
+    var expression = parseExpression("x >> 4 << 3") as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_shiftExpression_precedence_additive_left() {
-    BinaryExpression expression = parseExpression("x + y << z");
+    var expression = parseExpression("x + y << z") as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_shiftExpression_precedence_additive_right() {
-    BinaryExpression expression = parseExpression("x << y + z");
+    var expression = parseExpression("x << y + z") as BinaryExpression;
     expect(expression.rightOperand, isBinaryExpression);
   }
 
   void test_shiftExpression_super() {
-    BinaryExpression expression = parseExpression("super >> 4 << 3");
+    var expression = parseExpression("super >> 4 << 3") as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
@@ -541,12 +565,13 @@
   void _validate_assignableExpression_arguments_normal_chain_typeArguments(
       String code,
       [List<ErrorCode> errorCodes = const <ErrorCode>[]]) {
-    PropertyAccess propertyAccess1 = parseExpression(code, codes: errorCodes);
+    var propertyAccess1 =
+        parseExpression(code, codes: errorCodes) as PropertyAccess;
     expect(propertyAccess1.propertyName.name, "f");
     //
     // a<E>(b)<F>(c).d<G>(e)
     //
-    MethodInvocation invocation2 = propertyAccess1.target;
+    var invocation2 = propertyAccess1.target as MethodInvocation;
     expect(invocation2.methodName.name, "d");
     expect(invocation2.typeArguments, isNotNull);
     ArgumentList argumentList2 = invocation2.argumentList;
@@ -555,7 +580,7 @@
     //
     // a<E>(b)<F>(c)
     //
-    FunctionExpressionInvocation invocation3 = invocation2.target;
+    var invocation3 = invocation2.target as FunctionExpressionInvocation;
     expect(invocation3.typeArguments, isNotNull);
     ArgumentList argumentList3 = invocation3.argumentList;
     expect(argumentList3, isNotNull);
@@ -563,7 +588,7 @@
     //
     // a(b)
     //
-    MethodInvocation invocation4 = invocation3.function;
+    var invocation4 = invocation3.function as MethodInvocation;
     expect(invocation4.methodName.name, "a");
     expect(invocation4.typeArguments, isNotNull);
     ArgumentList argumentList4 = invocation4.argumentList;
diff --git a/pkg/analyzer/test/generated/constant_test.dart b/pkg/analyzer/test/generated/constant_test.dart
index 996f5cc..f350ad7 100644
--- a/pkg/analyzer/test/generated/constant_test.dart
+++ b/pkg/analyzer/test/generated/constant_test.dart
@@ -5,6 +5,7 @@
 @deprecated
 library analyzer.test.constant_test;
 
+import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/generated/constant.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -60,12 +61,11 @@
 ''',
     );
     expect(result.isValid, isTrue);
-    DartObject value = result.value;
-    expect(value, isNotNull);
+    DartObject value = result.value!;
     assertType(value.type, 'Center');
-    DartObject superclassFields = value.getField(GenericState.SUPERCLASS_FIELD);
-    DartObject widthFactor = superclassFields.getField('widthFactor');
-    expect(widthFactor, isNotNull);
+    DartObject superclassFields =
+        value.getField(GenericState.SUPERCLASS_FIELD)!;
+    DartObject widthFactor = superclassFields.getField('widthFactor')!;
     expect(widthFactor.isNull, isTrue);
   }
 
@@ -76,8 +76,7 @@
 }
 ''');
     expect(result.isValid, isTrue);
-    DartObject value = result.value;
-    expect(value, isNotNull);
+    DartObject value = result.value!;
     assertType(value.type, 'C');
   }
 
@@ -89,11 +88,9 @@
 }
 ''');
     expect(result.isValid, isTrue);
-    DartObject value = result.value;
-    expect(value, isNotNull);
+    DartObject value = result.value!;
     assertType(value.type, 'C');
-    DartObject x = value.getField('x');
-    expect(x, isNotNull);
+    DartObject x = value.getField('x')!;
     assertType(x.type, 'int');
     expect(x.toIntValue(), 2);
   }
@@ -104,8 +101,7 @@
       context: 'class C {const C();}',
     );
     expect(result.isValid, isTrue);
-    DartObject value = result.value;
-    expect(value, isNotNull);
+    DartObject value = result.value!;
     assertType(value.type, 'C');
   }
 
@@ -115,7 +111,7 @@
       context: 'class C {}',
     );
     expect(result.isValid, isFalse);
-    DartObject value = result.value;
+    var value = result.value;
     expect(value, isNull);
   }
 
@@ -126,8 +122,7 @@
 }
 ''');
     expect(result.isValid, isTrue);
-    DartObject value = result.value;
-    expect(value, isNotNull);
+    DartObject value = result.value!;
     assertType(value.type, 'C');
   }
 
@@ -138,9 +133,9 @@
   test_divide_double_double_byZero() async {
     var result = await _getExpressionValue("3.2 / 0.0");
     expect(result.isValid, isTrue);
-    DartObject value = result.value;
+    DartObject value = result.value!;
     assertType(value.type, "double");
-    expect(value.toDoubleValue().isInfinite, isTrue);
+    expect(value.toDoubleValue()!.isInfinite, isTrue);
   }
 
   test_divide_int_int() async {
@@ -186,7 +181,7 @@
   test_identifier_class() async {
     var result = await _getExpressionValue("?");
     expect(result.isValid, isTrue);
-    DartObject value = result.value;
+    var value = result.value;
     expect(value, null);
   }
 
@@ -194,7 +189,7 @@
   test_identifier_function() async {
     var result = await _getExpressionValue("?");
     expect(result.isValid, isTrue);
-    DartObject value = result.value;
+    var value = result.value;
     expect(value, null);
   }
 
@@ -202,7 +197,7 @@
   test_identifier_static() async {
     var result = await _getExpressionValue("?");
     expect(result.isValid, isTrue);
-    DartObject value = result.value;
+    var value = result.value;
     expect(value, null);
   }
 
@@ -210,7 +205,7 @@
   test_identifier_staticMethod() async {
     var result = await _getExpressionValue("?");
     expect(result.isValid, isTrue);
-    DartObject value = result.value;
+    var value = result.value;
     expect(value, null);
   }
 
@@ -218,7 +213,7 @@
   test_identifier_topLevel() async {
     var result = await _getExpressionValue("?");
     expect(result.isValid, isTrue);
-    DartObject value = result.value;
+    var value = result.value;
     expect(value, null);
   }
 
@@ -226,7 +221,7 @@
   test_identifier_typeParameter() async {
     var result = await _getExpressionValue("?");
     expect(result.isValid, isTrue);
-    DartObject value = result.value;
+    var value = result.value;
     expect(value, null);
   }
 
@@ -268,14 +263,14 @@
       "const {'a' : 'm', 'b' : 'n', 'c' : 'o'}",
     );
     expect(result.isValid, isTrue);
-    Map<DartObject, DartObject> map = result.value.toMapValue();
-    expect(map.keys.map((k) => k.toStringValue()), ['a', 'b', 'c']);
+    var map = result.value!.toMapValue()!;
+    expect(map.keys.map((k) => k!.toStringValue()), ['a', 'b', 'c']);
   }
 
   test_literal_null() async {
     var result = await _getExpressionValue("null");
     expect(result.isValid, isTrue);
-    DartObject value = result.value;
+    DartObject value = result.value!;
     expect(value.isNull, isTrue);
   }
 
@@ -379,7 +374,7 @@
   test_prefixedIdentifier_invalid() async {
     var result = await _getExpressionValue("?");
     expect(result.isValid, isTrue);
-    DartObject value = result.value;
+    var value = result.value;
     expect(value, null);
   }
 
@@ -387,7 +382,7 @@
   test_prefixedIdentifier_valid() async {
     var result = await _getExpressionValue("?");
     expect(result.isValid, isTrue);
-    DartObject value = result.value;
+    var value = result.value;
     expect(value, null);
   }
 
@@ -395,7 +390,7 @@
   test_propertyAccess_invalid() async {
     var result = await _getExpressionValue("?");
     expect(result.isValid, isTrue);
-    DartObject value = result.value;
+    var value = result.value;
     expect(value, null);
   }
 
@@ -403,7 +398,7 @@
   test_propertyAccess_valid() async {
     var result = await _getExpressionValue("?");
     expect(result.isValid, isTrue);
-    DartObject value = result.value;
+    var value = result.value;
     expect(value, null);
   }
 
@@ -423,7 +418,7 @@
   test_simpleIdentifier_invalid() async {
     var result = await _getExpressionValue("?");
     expect(result.isValid, isTrue);
-    DartObject value = result.value;
+    var value = result.value;
     expect(value, null);
   }
 
@@ -431,7 +426,7 @@
   test_simpleIdentifier_valid() async {
     var result = await _getExpressionValue("?");
     expect(result.isValid, isTrue);
-    DartObject value = result.value;
+    var value = result.value;
     expect(value, null);
   }
 
@@ -461,7 +456,7 @@
 
   Future<void> _assertValueBool(bool expectedValue, String contents) async {
     var result = await _getExpressionValue(contents);
-    DartObject value = result.value;
+    DartObject value = result.value!;
     assertType(value.type, "bool");
     expect(value.toBoolValue(), expectedValue);
   }
@@ -469,7 +464,7 @@
   Future<void> _assertValueDouble(double expectedValue, String contents) async {
     var result = await _getExpressionValue(contents);
     expect(result.isValid, isTrue);
-    DartObject value = result.value;
+    DartObject value = result.value!;
     assertType(value.type, "double");
     expect(value.toDoubleValue(), expectedValue);
   }
@@ -477,14 +472,14 @@
   Future<void> _assertValueInt(int expectedValue, String contents) async {
     var result = await _getExpressionValue(contents);
     expect(result.isValid, isTrue);
-    DartObject value = result.value;
+    DartObject value = result.value!;
     assertType(value.type, "int");
     expect(value.toIntValue(), expectedValue);
   }
 
   Future<void> _assertValueString(String expectedValue, String contents) async {
     var result = await _getExpressionValue(contents);
-    DartObject value = result.value;
+    DartObject value = result.value!;
     assertType(value.type, 'String');
   }
 
@@ -496,12 +491,12 @@
 $context
 ''');
 
-    var expression = findNode.variableDeclaration('x =').initializer;
+    var expression = findNode.variableDeclaration('x =').initializer!;
 
-    var file = getFile(result.path);
+    var file = getFile(result.path!);
     var evaluator = ConstantEvaluator(
       file.createSource(result.uri),
-      result.libraryElement,
+      result.libraryElement as LibraryElementImpl,
     );
 
     return evaluator.evaluate(expression);
diff --git a/pkg/analyzer/test/generated/element_resolver_test.dart b/pkg/analyzer/test/generated/element_resolver_test.dart
index 53e2e9a..31f410d 100644
--- a/pkg/analyzer/test/generated/element_resolver_test.dart
+++ b/pkg/analyzer/test/generated/element_resolver_test.dart
@@ -54,16 +54,12 @@
   const A.named();
 }
 ''');
-    await _validateAnnotation('', '@A.named()', (SimpleIdentifier name1,
-        SimpleIdentifier name2,
-        SimpleIdentifier name3,
-        Element annotationElement) {
-      assert(name1 != null);
-      assert(name2 != null);
-      expect(name1.staticElement, isClassElement);
-      expect(name1.staticElement.displayName, 'A');
-      expect(name2.staticElement, isConstructorElement);
-      expect(name2.staticElement.displayName, 'named');
+    await _validateAnnotation('', '@A.named()',
+        (name1, name2, name3, annotationElement) {
+      expect(name1!.staticElement, isClassElement);
+      expect(name1.staticElement!.displayName, 'A');
+      expect(name2!.staticElement, isConstructorElement);
+      expect(name2.staticElement!.displayName, 'named');
       expect(name3, isNull);
       if (annotationElement is ConstructorElement) {
         expect(annotationElement, same(name2.staticElement));
@@ -72,7 +68,7 @@
         expect(annotationElement.parameters, isEmpty);
       } else {
         fail('Expected "annotationElement" is ConstructorElement, '
-            'but (${annotationElement?.runtimeType}) $annotationElement found.');
+            'but (${annotationElement.runtimeType}) $annotationElement found.');
       }
     });
   }
@@ -83,19 +79,14 @@
   const A.named();
 }
 ''');
-    await _validateAnnotation('as p', '@p.A.named()', (SimpleIdentifier name1,
-        SimpleIdentifier name2,
-        SimpleIdentifier name3,
-        Element annotationElement) {
-      assert(name1 != null);
-      assert(name2 != null);
-      assert(name3 != null);
-      expect(name1.staticElement, isPrefixElement);
-      expect(name1.staticElement.displayName, 'p');
-      expect(name2.staticElement, isClassElement);
-      expect(name2.staticElement.displayName, 'A');
-      expect(name3.staticElement, isConstructorElement);
-      expect(name3.staticElement.displayName, 'named');
+    await _validateAnnotation('as p', '@p.A.named()',
+        (name1, name2, name3, annotationElement) {
+      expect(name1!.staticElement, isPrefixElement);
+      expect(name1.staticElement!.displayName, 'p');
+      expect(name2!.staticElement, isClassElement);
+      expect(name2.staticElement!.displayName, 'A');
+      expect(name3!.staticElement, isConstructorElement);
+      expect(name3.staticElement!.displayName, 'named');
       if (annotationElement is ConstructorElement) {
         expect(annotationElement, same(name3.staticElement));
         expect(annotationElement.enclosingElement, name2.staticElement);
@@ -103,7 +94,7 @@
         expect(annotationElement.parameters, isEmpty);
       } else {
         fail('Expected "annotationElement" is ConstructorElement, '
-            'but (${annotationElement?.runtimeType}) $annotationElement found.');
+            'but (${annotationElement.runtimeType}) $annotationElement found.');
       }
     });
   }
@@ -114,26 +105,21 @@
   static const V = 0;
 }
 ''');
-    await _validateAnnotation('as p', '@p.A.V', (SimpleIdentifier name1,
-        SimpleIdentifier name2,
-        SimpleIdentifier name3,
-        Element annotationElement) {
-      assert(name1 != null);
-      assert(name2 != null);
-      assert(name3 != null);
-      expect(name1.staticElement, isPrefixElement);
-      expect(name1.staticElement.displayName, 'p');
-      expect(name2.staticElement, isClassElement);
-      expect(name2.staticElement.displayName, 'A');
-      expect(name3.staticElement, isPropertyAccessorElement);
-      expect(name3.staticElement.displayName, 'V');
+    await _validateAnnotation('as p', '@p.A.V',
+        (name1, name2, name3, annotationElement) {
+      expect(name1!.staticElement, isPrefixElement);
+      expect(name1.staticElement!.displayName, 'p');
+      expect(name2!.staticElement, isClassElement);
+      expect(name2.staticElement!.displayName, 'A');
+      expect(name3!.staticElement, isPropertyAccessorElement);
+      expect(name3.staticElement!.displayName, 'V');
       if (annotationElement is PropertyAccessorElement) {
         expect(annotationElement, same(name3.staticElement));
         expect(annotationElement.enclosingElement, name2.staticElement);
         expect(annotationElement.displayName, 'V');
       } else {
         fail('Expected "annotationElement" is PropertyAccessorElement, '
-            'but (${annotationElement?.runtimeType}) $annotationElement found.');
+            'but (${annotationElement.runtimeType}) $annotationElement found.');
       }
     });
   }
@@ -144,16 +130,12 @@
   const A();
 }
 ''');
-    await _validateAnnotation('as p', '@p.A', (SimpleIdentifier name1,
-        SimpleIdentifier name2,
-        SimpleIdentifier name3,
-        Element annotationElement) {
-      assert(name1 != null);
-      assert(name2 != null);
-      expect(name1.staticElement, isPrefixElement);
-      expect(name1.staticElement.displayName, 'p');
-      expect(name2.staticElement, isClassElement);
-      expect(name2.staticElement.displayName, 'A');
+    await _validateAnnotation('as p', '@p.A',
+        (name1, name2, name3, annotationElement) {
+      expect(name1!.staticElement, isPrefixElement);
+      expect(name1.staticElement!.displayName, 'p');
+      expect(name2!.staticElement, isClassElement);
+      expect(name2.staticElement!.displayName, 'A');
       expect(name3, isNull);
       if (annotationElement is ConstructorElement) {
         expect(annotationElement.enclosingElement, name2.staticElement);
@@ -161,7 +143,7 @@
         expect(annotationElement.parameters, isEmpty);
       } else {
         fail('Expected "annotationElement" is ConstructorElement, '
-            'but (${annotationElement?.runtimeType}) $annotationElement found.');
+            'but (${annotationElement.runtimeType}) $annotationElement found.');
       }
     });
   }
@@ -172,16 +154,12 @@
   static const V = 0;
 }
 ''');
-    await _validateAnnotation('', '@A.V', (SimpleIdentifier name1,
-        SimpleIdentifier name2,
-        SimpleIdentifier name3,
-        Element annotationElement) {
-      assert(name1 != null);
-      assert(name2 != null);
-      expect(name1.staticElement, isClassElement);
-      expect(name1.staticElement.displayName, 'A');
-      expect(name2.staticElement, isPropertyAccessorElement);
-      expect(name2.staticElement.displayName, 'V');
+    await _validateAnnotation('', '@A.V',
+        (name1, name2, name3, annotationElement) {
+      expect(name1!.staticElement, isClassElement);
+      expect(name1.staticElement!.displayName, 'A');
+      expect(name2!.staticElement, isPropertyAccessorElement);
+      expect(name2.staticElement!.displayName, 'V');
       expect(name3, isNull);
       if (annotationElement is PropertyAccessorElement) {
         expect(annotationElement, same(name2.staticElement));
@@ -189,7 +167,7 @@
         expect(annotationElement.displayName, 'V');
       } else {
         fail('Expected "annotationElement" is PropertyAccessorElement, '
-            'but (${annotationElement?.runtimeType}) $annotationElement found.');
+            'but (${annotationElement.runtimeType}) $annotationElement found.');
       }
     });
   }
@@ -200,13 +178,10 @@
   const A();
 }
 ''');
-    await _validateAnnotation('', '@A', (SimpleIdentifier name1,
-        SimpleIdentifier name2,
-        SimpleIdentifier name3,
-        Element annotationElement) {
-      assert(name1 != null);
-      expect(name1.staticElement, isClassElement);
-      expect(name1.staticElement.displayName, 'A');
+    await _validateAnnotation('', '@A',
+        (name1, name2, name3, annotationElement) {
+      expect(name1!.staticElement, isClassElement);
+      expect(name1.staticElement!.displayName, 'A');
       expect(name2, isNull);
       expect(name3, isNull);
       if (annotationElement is ConstructorElement) {
@@ -215,7 +190,7 @@
         expect(annotationElement.parameters, isEmpty);
       } else {
         fail('Expected "annotationElement" is ConstructorElement, '
-            'but (${annotationElement?.runtimeType}) $annotationElement found.');
+            'but (${annotationElement.runtimeType}) $annotationElement found.');
       }
     });
   }
@@ -224,13 +199,10 @@
     newFile('$testPackageLibPath/a.dart', content: r'''
 const V = 0;
 ''');
-    await _validateAnnotation('', '@V', (SimpleIdentifier name1,
-        SimpleIdentifier name2,
-        SimpleIdentifier name3,
-        Element annotationElement) {
-      assert(name1 != null);
-      expect(name1.staticElement, isPropertyAccessorElement);
-      expect(name1.staticElement.displayName, 'V');
+    await _validateAnnotation('', '@V',
+        (name1, name2, name3, annotationElement) {
+      expect(name1!.staticElement, isPropertyAccessorElement);
+      expect(name1.staticElement!.displayName, 'V');
       expect(name2, isNull);
       expect(name3, isNull);
       if (annotationElement is PropertyAccessorElement) {
@@ -239,7 +211,7 @@
         expect(annotationElement.displayName, 'V');
       } else {
         fail('Expected "annotationElement" is PropertyAccessorElement, '
-            'but (${annotationElement?.runtimeType}) $annotationElement found.');
+            'but (${annotationElement.runtimeType}) $annotationElement found.');
       }
     });
   }
@@ -248,16 +220,12 @@
     newFile('$testPackageLibPath/a.dart', content: r'''
 const V = 0;
 ''');
-    await _validateAnnotation('as p', '@p.V', (SimpleIdentifier name1,
-        SimpleIdentifier name2,
-        SimpleIdentifier name3,
-        Element annotationElement) {
-      assert(name1 != null);
-      assert(name2 != null);
-      expect(name1.staticElement, isPrefixElement);
-      expect(name1.staticElement.displayName, 'p');
-      expect(name2.staticElement, isPropertyAccessorElement);
-      expect(name2.staticElement.displayName, 'V');
+    await _validateAnnotation('as p', '@p.V',
+        (name1, name2, name3, annotationElement) {
+      expect(name1!.staticElement, isPrefixElement);
+      expect(name1.staticElement!.displayName, 'p');
+      expect(name2!.staticElement, isPropertyAccessorElement);
+      expect(name2.staticElement!.displayName, 'V');
       expect(name3, isNull);
       if (annotationElement is PropertyAccessorElement) {
         expect(annotationElement, same(name2.staticElement));
@@ -265,7 +233,7 @@
         expect(annotationElement.displayName, 'V');
       } else {
         fail('Expected "annotationElement" is PropertyAccessorElement, '
-            'but (${annotationElement?.runtimeType}) $annotationElement found.');
+            'but (${annotationElement.runtimeType}) $annotationElement found.');
       }
     });
   }
@@ -273,8 +241,8 @@
   Future<void> _validateAnnotation(
       String annotationPrefix,
       String annotationText,
-      Function(SimpleIdentifier name1, SimpleIdentifier name2,
-              SimpleIdentifier name3, Element annotationElement)
+      Function(SimpleIdentifier? name, SimpleIdentifier? name2,
+              SimpleIdentifier? name3, Element annotationElement)
           validator) async {
     await resolveTestCode('''
 import 'a.dart' $annotationPrefix;
@@ -284,14 +252,14 @@
     var clazz = findNode.classDeclaration('C');
     Annotation annotation = clazz.metadata.single;
     Identifier name = annotation.name;
-    Element annotationElement = annotation.element;
+    Element annotationElement = annotation.element!;
     if (name is SimpleIdentifier) {
       validator(name, null, annotation.constructorName, annotationElement);
     } else if (name is PrefixedIdentifier) {
       validator(name.prefix, name.identifier, annotation.constructorName,
           annotationElement);
     } else {
-      fail('Uknown "name": ${name?.runtimeType} $name');
+      fail('Uknown "name": ${name.runtimeType} $name');
     }
   }
 }
@@ -299,19 +267,19 @@
 @reflectiveTest
 class ElementResolverTest with ResourceProviderMixin, ElementsTypesMixin {
   /// The error listener to which errors will be reported.
-  /*late*/ GatheringErrorListener _listener;
+  late GatheringErrorListener _listener;
 
   /// The type provider used to access the types.
-  /*late*/ TypeProvider _typeProvider;
+  late TypeProvider _typeProvider;
 
   /// The library containing the code being resolved.
-  /*late*/ LibraryElementImpl _definingLibrary;
+  late LibraryElementImpl _definingLibrary;
 
   /// The resolver visitor that maintains the state for the resolver.
-  /*late*/ ResolverVisitor _visitor;
+  late ResolverVisitor _visitor;
 
   /// The resolver being used to resolve the test cases.
-  /*late*/ ElementResolver _resolver;
+  late ElementResolver _resolver;
 
   @override
   TypeProvider get typeProvider => _typeProvider;
@@ -320,7 +288,7 @@
     _fail("Not yet tested");
     // Need to set up the exported library so that the identifier can be
     // resolved.
-    ExportDirective directive = AstTestFactory.exportDirective2(null, [
+    ExportDirective directive = AstTestFactory.exportDirective2('dart:math', [
       AstTestFactory.hideCombinator2(["A"])
     ]);
     _resolveNode(directive);
@@ -336,7 +304,8 @@
     _fail("Not yet tested");
     // Need to set up the imported library so that the identifier can be
     // resolved.
-    ImportDirective directive = AstTestFactory.importDirective3(null, null, [
+    ImportDirective directive =
+        AstTestFactory.importDirective3('dart:math', null, [
       AstTestFactory.showCombinator2(["A"])
     ]);
     _resolveNode(directive);
@@ -349,10 +318,11 @@
     // resolved.
     String prefixName = "p";
     _definingLibrary.imports = <ImportElement>[
-      ElementFactory.importFor(null, ElementFactory.prefix(prefixName))
+      ElementFactory.importFor(
+          _LibraryElementMock(), ElementFactory.prefix(prefixName))
     ];
     ImportDirective directive =
-        AstTestFactory.importDirective3(null, prefixName, [
+        AstTestFactory.importDirective3('dart:math', prefixName, [
       AstTestFactory.showCombinator2(["A"]),
       AstTestFactory.hideCombinator2(["B"])
     ]);
@@ -370,6 +340,7 @@
     _createResolver();
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44522')
   test_visitBreakStatement_withLabel() async {
     // loop: while (true) {
     //   break loop;
@@ -392,6 +363,7 @@
     _listener.assertNoErrors();
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44522')
   test_visitCommentReference_prefixedIdentifier_class_getter() async {
     ClassElementImpl classA = ElementFactory.classElement2("A");
     // set accessors
@@ -402,7 +374,7 @@
         ElementFactory.setterElement(propName, false, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement>[getter, setter];
     // set name scope
-    _visitor.nameScope = LocalScope(null)..add(classA);
+    _visitor.nameScope = LocalScope(_RootScopeMock.instance)..add(classA);
     // prepare "A.p"
     PrefixedIdentifier prefixed = AstTestFactory.identifier5('A', 'p');
     CommentReference commentReference =
@@ -414,6 +386,7 @@
     _listener.assertNoErrors();
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44522')
   test_visitCommentReference_prefixedIdentifier_class_method() async {
     ClassElementImpl classA = ElementFactory.classElement2("A");
     // set method
@@ -421,7 +394,7 @@
         ElementFactory.methodElement("m", _typeProvider.intType);
     classA.methods = <MethodElement>[method];
     // set name scope
-    _visitor.nameScope = LocalScope(null)..add(classA);
+    _visitor.nameScope = LocalScope(_RootScopeMock.instance)..add(classA);
     // prepare "A.m"
     PrefixedIdentifier prefixed = AstTestFactory.identifier5('A', 'm');
     CommentReference commentReference =
@@ -433,6 +406,7 @@
     _listener.assertNoErrors();
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44522')
   test_visitCommentReference_prefixedIdentifier_class_operator() async {
     ClassElementImpl classA = ElementFactory.classElement2("A");
     // set method
@@ -440,7 +414,7 @@
         ElementFactory.methodElement("==", _typeProvider.boolType);
     classA.methods = <MethodElement>[method];
     // set name scope
-    _visitor.nameScope = LocalScope(null)..add(classA);
+    _visitor.nameScope = LocalScope(_RootScopeMock.instance)..add(classA);
     // prepare "A.=="
     PrefixedIdentifier prefixed = AstTestFactory.identifier5('A', '==');
     CommentReference commentReference =
@@ -469,7 +443,7 @@
   test_visitConstructorName_unnamed() async {
     ClassElementImpl classA = ElementFactory.classElement2("A");
     _encloseElement(classA);
-    String constructorName;
+    String constructorName = 'named';
     ConstructorElement constructor =
         ElementFactory.constructorElement2(classA, constructorName);
     classA.constructors = <ConstructorElement>[constructor];
@@ -480,6 +454,7 @@
     _listener.assertNoErrors();
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44522')
   test_visitContinueStatement_withLabel() async {
     // loop: while (true) {
     //   continue loop;
@@ -503,8 +478,9 @@
     _listener.assertNoErrors();
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44522')
   test_visitExportDirective_noCombinators() async {
-    ExportDirective directive = AstTestFactory.exportDirective2(null);
+    ExportDirective directive = AstTestFactory.exportDirective2('dart:math');
     directive.element = ElementFactory.exportFor(
         ElementFactory.library(_definingLibrary.context, "lib"));
     _resolveNode(directive);
@@ -526,17 +502,20 @@
     parameterElement.type = intType;
     parameter.identifier.staticElement = parameterElement;
     _resolveInClass(parameter, classA);
-    expect(parameter.declaredElement.type, same(intType));
+    expect(parameter.declaredElement!.type, same(intType));
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44522')
   test_visitImportDirective_noCombinators_noPrefix() async {
-    ImportDirective directive = AstTestFactory.importDirective3(null, null);
+    ImportDirective directive =
+        AstTestFactory.importDirective3('dart:math', null);
     directive.element = ElementFactory.importFor(
         ElementFactory.library(_definingLibrary.context, "lib"), null);
     _resolveNode(directive);
     _listener.assertNoErrors();
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44522')
   test_visitImportDirective_noCombinators_prefix() async {
     String prefixName = "p";
     ImportElement importElement = ElementFactory.importFor(
@@ -544,16 +523,17 @@
         ElementFactory.prefix(prefixName));
     _definingLibrary.imports = <ImportElement>[importElement];
     ImportDirective directive =
-        AstTestFactory.importDirective3(null, prefixName);
+        AstTestFactory.importDirective3('dart:math', prefixName);
     directive.element = importElement;
     _resolveNode(directive);
     _listener.assertNoErrors();
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44522')
   test_visitImportDirective_withCombinators() async {
     ShowCombinator combinator = AstTestFactory.showCombinator2(["A", "B", "C"]);
     ImportDirective directive =
-        AstTestFactory.importDirective3(null, null, [combinator]);
+        AstTestFactory.importDirective3('dart:math', null, [combinator]);
     LibraryElementImpl library =
         ElementFactory.library(_definingLibrary.context, "lib");
     TopLevelVariableElementImpl varA =
@@ -565,10 +545,10 @@
     CompilationUnitElementImpl unit =
         library.definingCompilationUnit as CompilationUnitElementImpl;
     unit.accessors = <PropertyAccessorElement>[
-      varA.getter,
-      varA.setter,
-      varB.getter,
-      varC.setter
+      varA.getter!,
+      varA.setter!,
+      varB.getter!,
+      varC.setter!
     ];
     unit.topLevelVariables = <TopLevelVariableElement>[varA, varB, varC];
     directive.element = ElementFactory.importFor(library, null);
@@ -596,7 +576,7 @@
 
   test_visitInstanceCreationExpression_unnamed() async {
     ClassElementImpl classA = ElementFactory.classElement2("A");
-    String constructorName;
+    String constructorName = 'named';
     ConstructorElement constructor =
         ElementFactory.constructorElement2(classA, constructorName);
     classA.constructors = <ConstructorElement>[constructor];
@@ -611,7 +591,7 @@
 
   test_visitInstanceCreationExpression_unnamed_namedParameter() async {
     ClassElementImpl classA = ElementFactory.classElement2("A");
-    String constructorName;
+    String constructorName = 'named';
     ConstructorElementImpl constructor =
         ElementFactory.constructorElement2(classA, constructorName);
     String parameterName = "a";
@@ -644,7 +624,7 @@
     MethodInvocation invocation =
         AstTestFactory.methodInvocation(left, methodName);
     _resolveNode(invocation);
-    expect(invocation.methodName.staticElement.declaration,
+    expect(invocation.methodName.staticElement!.declaration,
         same(numType.getMethod(methodName)));
     _listener.assertNoErrors();
   }
@@ -679,7 +659,8 @@
     SuperConstructorInvocation invocation =
         AstTestFactory.superConstructorInvocation();
     AstTestFactory.classDeclaration(null, 'C', null, null, null, null, [
-      AstTestFactory.constructorDeclaration(null, 'C', null, [invocation])
+      AstTestFactory.constructorDeclaration(AstTestFactory.identifier3('C'),
+          null, AstTestFactory.formalParameterList(), [invocation])
     ]);
     _resolveInClass(invocation, subclass);
     expect(invocation.staticElement, superConstructor);
@@ -706,7 +687,8 @@
       AstTestFactory.namedExpression2(parameterName, AstTestFactory.integer(0))
     ]);
     AstTestFactory.classDeclaration(null, 'C', null, null, null, null, [
-      AstTestFactory.constructorDeclaration(null, 'C', null, [invocation])
+      AstTestFactory.constructorDeclaration(AstTestFactory.identifier3('C'),
+          null, AstTestFactory.formalParameterList(), [invocation])
     ]);
     _resolveInClass(invocation, subclass);
     expect(invocation.staticElement, superConstructor);
@@ -752,10 +734,10 @@
   /// resolver has resolved it.  [labelElement] is the label element to be
   /// defined in the statement's label scope, and [labelTarget] is the statement
   /// the label resolves to.
-  Element _resolveBreak(BreakStatement statement, LabelElementImpl labelElement,
-      Statement labelTarget) {
+  Element? _resolveBreak(BreakStatement statement,
+      LabelElementImpl labelElement, Statement labelTarget) {
     _resolveStatement(statement, labelElement, labelTarget);
-    return statement.label.staticElement;
+    return statement.label!.staticElement;
   }
 
   /// Return the element associated with the label [statement] after the
@@ -767,10 +749,10 @@
   /// @param labelElement the label element to be defined in the statement's
   ///          label scope
   /// @return the element to which the statement's label was resolved
-  Element _resolveContinue(ContinueStatement statement,
+  Element? _resolveContinue(ContinueStatement statement,
       LabelElementImpl labelElement, AstNode labelTarget) {
     _resolveStatement(statement, labelElement, labelTarget);
-    return statement.label.staticElement;
+    return statement.label!.staticElement;
   }
 
   /// Return the element associated with the given identifier after the resolver
@@ -803,7 +785,7 @@
   /// @param definedElements the elements that are to be defined in the scope in
   ///          which the element is being resolved
   /// @return the element to which the expression was resolved
-  void _resolveNode(AstNode node, [List<Element> definedElements]) {
+  void _resolveNode(AstNode node, [List<Element>? definedElements]) {
     Scope outerScope = _visitor.nameScope;
     try {
       var innerScope = LocalScope(outerScope);
@@ -826,16 +808,16 @@
   /// @param labelElement the label element to be defined in the statement's
   ///          label scope
   /// @return the element to which the statement's label was resolved
-  void _resolveStatement(
-      Statement statement, LabelElementImpl labelElement, AstNode labelTarget) {
-    LabelScope outerScope = _visitor.labelScope;
+  void _resolveStatement(Statement statement, LabelElementImpl? labelElement,
+      AstNode? labelTarget) {
+    LabelScope? outerScope = _visitor.labelScope;
     try {
-      LabelScope innerScope;
+      LabelScope? innerScope;
       if (labelElement == null) {
         innerScope = outerScope;
       } else {
         innerScope = LabelScope(
-            outerScope, labelElement.name, labelTarget, labelElement);
+            outerScope, labelElement.name, labelTarget!, labelElement);
       }
       _visitor.labelScope = innerScope;
       statement.accept(_resolver);
@@ -844,3 +826,15 @@
     }
   }
 }
+
+class _LibraryElementMock implements LibraryElement {
+  @override
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+class _RootScopeMock implements Scope {
+  static final Scope instance = _RootScopeMock();
+
+  @override
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
diff --git a/pkg/analyzer/test/generated/elements_types_mixin.dart b/pkg/analyzer/test/generated/elements_types_mixin.dart
index becf671..68e092a 100644
--- a/pkg/analyzer/test/generated/elements_types_mixin.dart
+++ b/pkg/analyzer/test/generated/elements_types_mixin.dart
@@ -16,7 +16,6 @@
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
-import 'package:meta/meta.dart';
 
 mixin ElementsTypesMixin {
   InterfaceType get boolNone {
@@ -149,23 +148,23 @@
     return interfaceTypeStar(element);
   }
 
-  LibraryElementImpl get testLibrary => null;
+  LibraryElementImpl get testLibrary => throw UnimplementedError();
 
-  TypeProvider /*!*/ get typeProvider;
+  TypeProvider get typeProvider;
 
   VoidTypeImpl get voidNone => VoidTypeImpl.instance;
 
   ClassElementImpl class_({
-    @required String name,
+    required String name,
     bool isAbstract = false,
-    InterfaceType superType,
+    InterfaceType? superType,
     List<TypeParameterElement> typeParameters = const [],
     List<InterfaceType> interfaces = const [],
     List<InterfaceType> mixins = const [],
     List<MethodElement> methods = const [],
   }) {
     var element = ClassElementImpl(name, 0);
-    element.enclosingElement = testLibrary;
+    element.enclosingElement = testLibrary.definingCompilationUnit;
     element.typeParameters = typeParameters;
     element.supertype = superType ?? typeProvider.objectType;
     element.interfaces = interfaces;
@@ -176,7 +175,7 @@
 
   InterfaceType comparableNone(DartType type) {
     var coreLibrary = typeProvider.intElement.library;
-    var element = coreLibrary.getType('Comparable');
+    var element = coreLibrary.getType('Comparable')!;
     return element.instantiate(
       typeArguments: [type],
       nullabilitySuffix: NullabilitySuffix.none,
@@ -185,7 +184,7 @@
 
   InterfaceType comparableQuestion(DartType type) {
     var coreLibrary = typeProvider.intElement.library;
-    var element = coreLibrary.getType('Comparable');
+    var element = coreLibrary.getType('Comparable')!;
     return element.instantiate(
       typeArguments: [type],
       nullabilitySuffix: NullabilitySuffix.question,
@@ -194,7 +193,7 @@
 
   InterfaceType comparableStar(DartType type) {
     var coreLibrary = typeProvider.intElement.library;
-    var element = coreLibrary.getType('Comparable');
+    var element = coreLibrary.getType('Comparable')!;
     return element.instantiate(
       typeArguments: [type],
       nullabilitySuffix: NullabilitySuffix.star,
@@ -202,10 +201,10 @@
   }
 
   FunctionTypeImpl functionType({
-    @required List<TypeParameterElement> typeFormals,
-    @required List<ParameterElement> parameters,
-    @required DartType returnType,
-    @required NullabilitySuffix nullabilitySuffix,
+    required List<TypeParameterElement> typeFormals,
+    required List<ParameterElement> parameters,
+    required DartType returnType,
+    required NullabilitySuffix nullabilitySuffix,
   }) {
     return FunctionTypeImpl(
       typeFormals: typeFormals,
@@ -218,7 +217,7 @@
   FunctionTypeImpl functionTypeNone({
     List<TypeParameterElement> typeFormals = const [],
     List<ParameterElement> parameters = const [],
-    @required DartType returnType,
+    required DartType returnType,
   }) {
     return functionType(
       typeFormals: typeFormals,
@@ -231,7 +230,7 @@
   FunctionTypeImpl functionTypeQuestion({
     List<TypeParameterElement> typeFormals = const [],
     List<ParameterElement> parameters = const [],
-    @required DartType returnType,
+    required DartType returnType,
   }) {
     return functionType(
       typeFormals: typeFormals,
@@ -244,7 +243,7 @@
   FunctionTypeImpl functionTypeStar({
     List<TypeParameterElement> typeFormals = const [],
     List<ParameterElement> parameters = const [],
-    @required DartType returnType,
+    required DartType returnType,
   }) {
     return functionType(
       typeFormals: typeFormals,
@@ -301,22 +300,10 @@
     return interfaceTypeStar(futureElement, typeArguments: [T]);
   }
 
-  GenericFunctionTypeElementImpl genericFunctionType({
-    List<TypeParameterElement> typeParameters,
-    List<ParameterElement> parameters,
-    DartType returnType,
-  }) {
-    var result = GenericFunctionTypeElementImpl.forOffset(0);
-    result.typeParameters = typeParameters;
-    result.parameters = parameters;
-    result.returnType = returnType ?? typeProvider.voidType;
-    return result;
-  }
-
   InterfaceType interfaceType(
     ClassElement element, {
     List<DartType> typeArguments = const [],
-    @required NullabilitySuffix nullabilitySuffix,
+    required NullabilitySuffix nullabilitySuffix,
   }) {
     return element.instantiate(
       typeArguments: typeArguments,
@@ -376,10 +363,10 @@
   }
 
   LibraryElementImpl library_({
-    @required String uriStr,
-    @required TypeSystemImpl typeSystem,
-    @required AnalysisContext analysisContext,
-    @required AnalysisSessionImpl analysisSession,
+    required String uriStr,
+    required TypeSystemImpl typeSystem,
+    required AnalysisContext analysisContext,
+    required AnalysisSessionImpl analysisSession,
   }) {
     var library = LibraryElementImpl(
       analysisContext,
@@ -467,13 +454,13 @@
   }
 
   MixinElementImpl mixin_({
-    @required String name,
+    required String name,
     List<TypeParameterElement> typeParameters = const [],
-    List<InterfaceType> constraints,
+    List<InterfaceType>? constraints,
     List<InterfaceType> interfaces = const [],
   }) {
     var element = MixinElementImpl(name, 0);
-    element.enclosingElement = testLibrary;
+    element.enclosingElement = testLibrary.definingCompilationUnit;
     element.typeParameters = typeParameters;
     element.superclassConstraints = constraints ?? [typeProvider.objectType];
     element.interfaces = interfaces;
@@ -482,8 +469,8 @@
   }
 
   ParameterElement namedParameter({
-    @required String name,
-    @required DartType type,
+    required String name,
+    required DartType type,
     bool isCovariant = false,
   }) {
     var parameter = ParameterElementImpl(name, 0);
@@ -494,8 +481,8 @@
   }
 
   ParameterElement namedRequiredParameter({
-    @required String name,
-    @required DartType type,
+    required String name,
+    required DartType type,
     bool isCovariant = false,
   }) {
     var parameter = ParameterElementImpl(name, 0);
@@ -506,8 +493,8 @@
   }
 
   ParameterElement positionalParameter({
-    String name,
-    @required DartType type,
+    String? name,
+    required DartType type,
     bool isCovariant = false,
   }) {
     var parameter = ParameterElementImpl(name ?? '', 0);
@@ -518,9 +505,9 @@
   }
 
   TypeParameterTypeImpl promotedTypeParameterType({
-    @required TypeParameterElement element,
-    @required NullabilitySuffix nullabilitySuffix,
-    @required DartType promotedBound,
+    required TypeParameterElement element,
+    required NullabilitySuffix nullabilitySuffix,
+    required DartType promotedBound,
   }) {
     return TypeParameterTypeImpl(
       element: element,
@@ -563,8 +550,8 @@
   }
 
   ParameterElement requiredParameter({
-    String name,
-    @required DartType type,
+    String? name,
+    required DartType type,
     bool isCovariant = false,
   }) {
     var parameter = ParameterElementImpl(name ?? '', 0);
@@ -575,18 +562,19 @@
   }
 
   TypeAliasElementImpl typeAlias({
-    @required String name,
-    @required List<TypeParameterElement> typeParameters,
-    @required DartType aliasedType,
+    required String name,
+    required List<TypeParameterElement> typeParameters,
+    required DartType aliasedType,
   }) {
     var element = TypeAliasElementImpl(name, 0);
+    element.enclosingElement = testLibrary.definingCompilationUnit;
     element.typeParameters = typeParameters;
     element.aliasedType = aliasedType;
     return element;
   }
 
   TypeParameterElementImpl typeParameter(String name,
-      {DartType bound, Variance variance}) {
+      {DartType? bound, Variance? variance}) {
     var element = TypeParameterElementImpl.synthetic(name);
     element.bound = bound;
     element.variance = variance;
@@ -595,8 +583,8 @@
 
   TypeParameterTypeImpl typeParameterType(
     TypeParameterElement element, {
-    @required NullabilitySuffix nullabilitySuffix,
-    DartType promotedBound,
+    required NullabilitySuffix nullabilitySuffix,
+    DartType? promotedBound,
   }) {
     return TypeParameterTypeImpl(
       element: element,
@@ -607,7 +595,7 @@
 
   TypeParameterTypeImpl typeParameterTypeNone(
     TypeParameterElement element, {
-    DartType promotedBound,
+    DartType? promotedBound,
   }) {
     return typeParameterType(
       element,
@@ -618,7 +606,7 @@
 
   TypeParameterTypeImpl typeParameterTypeQuestion(
     TypeParameterElement element, {
-    DartType promotedBound,
+    DartType? promotedBound,
   }) {
     return typeParameterType(
       element,
@@ -629,7 +617,7 @@
 
   TypeParameterTypeImpl typeParameterTypeStar(
     TypeParameterElement element, {
-    DartType promotedBound,
+    DartType? promotedBound,
   }) {
     return typeParameterType(
       element,
diff --git a/pkg/analyzer/test/generated/error_parser_test.dart b/pkg/analyzer/test/generated/error_parser_test.dart
index 73f8f5f..235f297 100644
--- a/pkg/analyzer/test/generated/error_parser_test.dart
+++ b/pkg/analyzer/test/generated/error_parser_test.dart
@@ -139,32 +139,33 @@
   }
 
   void test_breakOutsideOfLoop_breakInDoStatement() {
-    DoStatement statement = parseStatement('do {break;} while (x);');
+    var statement = parseStatement('do {break;} while (x);') as DoStatement;
     expectNotNullIfNoErrors(statement);
     assertNoErrors();
   }
 
   void test_breakOutsideOfLoop_breakInForStatement() {
-    Statement statement = parseStatement('for (; x;) {break;}');
+    var statement = parseStatement('for (; x;) {break;}');
     expectNotNullIfNoErrors(statement);
     assertNoErrors();
   }
 
   void test_breakOutsideOfLoop_breakInIfStatement() {
-    IfStatement statement = parseStatement('if (x) {break;}');
+    var statement = parseStatement('if (x) {break;}') as IfStatement;
     expectNotNullIfNoErrors(statement);
     listener.assertErrors(
         [expectedError(ParserErrorCode.BREAK_OUTSIDE_OF_LOOP, 8, 5)]);
   }
 
   void test_breakOutsideOfLoop_breakInSwitchStatement() {
-    SwitchStatement statement = parseStatement('switch (x) {case 1: break;}');
+    var statement =
+        parseStatement('switch (x) {case 1: break;}') as SwitchStatement;
     expectNotNullIfNoErrors(statement);
     assertNoErrors();
   }
 
   void test_breakOutsideOfLoop_breakInWhileStatement() {
-    WhileStatement statement = parseStatement('while (x) {break;}');
+    var statement = parseStatement('while (x) {break;}') as WhileStatement;
     expectNotNullIfNoErrors(statement);
     assertNoErrors();
   }
@@ -427,33 +428,33 @@
   }
 
   void test_continueOutsideOfLoop_continueInDoStatement() {
-    DoStatement statement = parseStatement('do {continue;} while (x);');
+    var statement = parseStatement('do {continue;} while (x);') as DoStatement;
     expectNotNullIfNoErrors(statement);
     assertNoErrors();
   }
 
   void test_continueOutsideOfLoop_continueInForStatement() {
-    Statement statement = parseStatement('for (; x;) {continue;}');
+    var statement = parseStatement('for (; x;) {continue;}');
     expectNotNullIfNoErrors(statement);
     assertNoErrors();
   }
 
   void test_continueOutsideOfLoop_continueInIfStatement() {
-    IfStatement statement = parseStatement('if (x) {continue;}');
+    var statement = parseStatement('if (x) {continue;}') as IfStatement;
     expectNotNullIfNoErrors(statement);
     listener.assertErrors(
         [expectedError(ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP, 8, 8)]);
   }
 
   void test_continueOutsideOfLoop_continueInSwitchStatement() {
-    SwitchStatement statement =
-        parseStatement('switch (x) {case 1: continue a;}');
+    var statement =
+        parseStatement('switch (x) {case 1: continue a;}') as SwitchStatement;
     expectNotNullIfNoErrors(statement);
     assertNoErrors();
   }
 
   void test_continueOutsideOfLoop_continueInWhileStatement() {
-    WhileStatement statement = parseStatement('while (x) {continue;}');
+    var statement = parseStatement('while (x) {continue;}') as WhileStatement;
     expectNotNullIfNoErrors(statement);
     assertNoErrors();
   }
@@ -469,23 +470,24 @@
   }
 
   void test_continueWithoutLabelInCase_error() {
-    SwitchStatement statement =
-        parseStatement('switch (x) {case 1: continue;}');
+    var statement =
+        parseStatement('switch (x) {case 1: continue;}') as SwitchStatement;
     expectNotNullIfNoErrors(statement);
     listener.assertErrors(
         [expectedError(ParserErrorCode.CONTINUE_WITHOUT_LABEL_IN_CASE, 20, 8)]);
   }
 
   void test_continueWithoutLabelInCase_noError() {
-    SwitchStatement statement =
-        parseStatement('switch (x) {case 1: continue a;}');
+    var statement =
+        parseStatement('switch (x) {case 1: continue a;}') as SwitchStatement;
     expectNotNullIfNoErrors(statement);
     assertNoErrors();
   }
 
   void test_continueWithoutLabelInCase_noError_switchInLoop() {
-    WhileStatement statement =
-        parseStatement('while (a) { switch (b) {default: continue;}}');
+    var statement =
+        parseStatement('while (a) { switch (b) {default: continue;}}')
+            as WhileStatement;
     expectNotNullIfNoErrors(statement);
     assertNoErrors();
   }
@@ -523,7 +525,7 @@
 
   void test_covariantConstructor() {
     createParser('class C { covariant C(); }');
-    ClassDeclaration member = parseFullCompilationUnitMember();
+    var member = parseFullCompilationUnitMember() as ClassDeclaration;
     expectNotNullIfNoErrors(member);
     listener
         .assertErrors([expectedError(ParserErrorCode.COVARIANT_MEMBER, 10, 9)]);
@@ -555,7 +557,7 @@
 
   void test_covariantTopLevelDeclaration_class() {
     createParser('covariant class C {}');
-    ClassDeclaration member = parseFullCompilationUnitMember();
+    var member = parseFullCompilationUnitMember() as ClassDeclaration;
     expectNotNullIfNoErrors(member);
     listener.assertErrors(
         [expectedError(ParserErrorCode.COVARIANT_TOP_LEVEL_DECLARATION, 0, 9)]);
@@ -563,7 +565,7 @@
 
   void test_covariantTopLevelDeclaration_enum() {
     createParser('covariant enum E { v }');
-    EnumDeclaration member = parseFullCompilationUnitMember();
+    var member = parseFullCompilationUnitMember() as EnumDeclaration;
     expectNotNullIfNoErrors(member);
     listener.assertErrors(
         [expectedError(ParserErrorCode.COVARIANT_TOP_LEVEL_DECLARATION, 0, 9)]);
@@ -674,8 +676,9 @@
   }
 
   void test_duplicateLabelInSwitchStatement() {
-    SwitchStatement statement =
-        parseStatement('switch (e) {l1: case 0: break; l1: case 1: break;}');
+    var statement =
+        parseStatement('switch (e) {l1: case 0: break; l1: case 1: break;}')
+            as SwitchStatement;
     expectNotNullIfNoErrors(statement);
     listener.assertErrors([
       expectedError(ParserErrorCode.DUPLICATE_LABEL_IN_SWITCH_STATEMENT, 31, 2)
@@ -684,7 +687,7 @@
 
   void test_emptyEnumBody() {
     createParser('enum E {}');
-    EnumDeclaration declaration = parseFullCompilationUnitMember();
+    var declaration = parseFullCompilationUnitMember() as EnumDeclaration;
     expectNotNullIfNoErrors(declaration);
     // TODO(brianwilkerson) Convert codes to errors when highlighting is fixed.
     listener.assertErrorsWithCodes([ParserErrorCode.EMPTY_ENUM_BODY]);
@@ -726,7 +729,7 @@
   }
 
   void test_expectedCaseOrDefault() {
-    SwitchStatement statement = parseStatement('switch (e) {break;}');
+    var statement = parseStatement('switch (e) {break;}') as SwitchStatement;
     expectNotNullIfNoErrors(statement);
     listener
         .assertErrors([expectedError(ParserErrorCode.EXPECTED_TOKEN, 12, 5)]);
@@ -804,8 +807,9 @@
   }
 
   void test_expectedInterpolationIdentifier() {
-    StringLiteral literal = parseExpression("'\$x\$'",
-        errors: [expectedError(ScannerErrorCode.MISSING_IDENTIFIER, 4, 1)]);
+    var literal = parseExpression("'\$x\$'",
+            errors: [expectedError(ScannerErrorCode.MISSING_IDENTIFIER, 4, 1)])
+        as StringLiteral;
     expectNotNullIfNoErrors(literal);
   }
 
@@ -813,8 +817,9 @@
     // The scanner inserts an empty string token between the two $'s; we need to
     // make sure that the MISSING_IDENTIFIER error that is generated has a
     // nonzero width so that it will show up in the editor UI.
-    StringLiteral literal = parseExpression("'\$\$foo'",
-        errors: [expectedError(ScannerErrorCode.MISSING_IDENTIFIER, 2, 1)]);
+    var literal = parseExpression("'\$\$foo'",
+            errors: [expectedError(ScannerErrorCode.MISSING_IDENTIFIER, 2, 1)])
+        as StringLiteral;
     expectNotNullIfNoErrors(literal);
   }
 
@@ -1292,7 +1297,7 @@
         parseStatement("get x { return _x; }", expectedEndOffset: 4);
     // Fasta considers `get` to be an identifier in this situation.
     // TODO(danrubel): Investigate better recovery.
-    ExpressionStatement statement = result;
+    var statement = result as ExpressionStatement;
     listener
         .assertErrors([expectedError(ParserErrorCode.EXPECTED_TOKEN, 0, 3)]);
     expect(statement.expression.toSource(), 'get');
@@ -1411,7 +1416,7 @@
   }
 
   void test_initializedVariableInForEach() {
-    Statement statement = parseStatement('for (int a = 0 in foo) {}');
+    var statement = parseStatement('for (int a = 0 in foo) {}');
     expectNotNullIfNoErrors(statement);
     listener.assertErrors([
       expectedError(ParserErrorCode.INITIALIZED_VARIABLE_IN_FOR_EACH, 11, 1)
@@ -1419,7 +1424,7 @@
   }
 
   void test_initializedVariableInForEach_annotation() {
-    Statement statement = parseStatement('for (@Foo var a = 0 in foo) {}');
+    var statement = parseStatement('for (@Foo var a = 0 in foo) {}');
     expectNotNullIfNoErrors(statement);
     listener.assertErrors([
       expectedError(ParserErrorCode.INITIALIZED_VARIABLE_IN_FOR_EACH, 16, 1)
@@ -1427,7 +1432,7 @@
   }
 
   void test_initializedVariableInForEach_localFunction() {
-    Statement statement = parseStatement('for (f()) {}');
+    var statement = parseStatement('for (f()) {}');
     expectNotNullIfNoErrors(statement);
     listener.assertErrors([
       expectedError(ParserErrorCode.EXPECTED_TOKEN, 7, 1),
@@ -1437,7 +1442,7 @@
   }
 
   void test_initializedVariableInForEach_localFunction2() {
-    Statement statement = parseStatement('for (T f()) {}');
+    var statement = parseStatement('for (T f()) {}');
     expectNotNullIfNoErrors(statement);
     listener.assertErrors([
       expectedError(ParserErrorCode.EXPECTED_TOKEN, 7, 1),
@@ -1447,7 +1452,7 @@
   }
 
   void test_initializedVariableInForEach_var() {
-    Statement statement = parseStatement('for (var a = 0 in foo) {}');
+    var statement = parseStatement('for (var a = 0 in foo) {}');
     expectNotNullIfNoErrors(statement);
     listener.assertErrors([
       expectedError(ParserErrorCode.INITIALIZED_VARIABLE_IN_FOR_EACH, 11, 1)
@@ -1455,15 +1460,16 @@
   }
 
   void test_invalidAwaitInFor() {
-    Statement statement = parseStatement('await for (; ;) {}');
+    var statement = parseStatement('await for (; ;) {}');
     expectNotNullIfNoErrors(statement);
     listener.assertErrors(
         [expectedError(ParserErrorCode.INVALID_AWAIT_IN_FOR, 0, 5)]);
   }
 
   void test_invalidCodePoint() {
-    StringLiteral literal = parseExpression("'begin \\u{110000}'",
-        errors: [expectedError(ParserErrorCode.INVALID_CODE_POINT, 7, 9)]);
+    var literal = parseExpression("'begin \\u{110000}'",
+            errors: [expectedError(ParserErrorCode.INVALID_CODE_POINT, 7, 9)])
+        as StringLiteral;
     expectNotNullIfNoErrors(literal);
   }
 
@@ -1471,7 +1477,7 @@
   void test_invalidCommentReference__new_nonIdentifier() {
     // This test fails because the method parseCommentReference returns null.
     createParser('');
-    CommentReference reference = parseCommentReference('new 42', 0);
+    var reference = parseCommentReference('new 42', 0) as CommentReference;
     expectNotNullIfNoErrors(reference);
     listener.assertErrors(
         [expectedError(ParserErrorCode.INVALID_COMMENT_REFERENCE, 0, 6)]);
@@ -1480,7 +1486,7 @@
   @failingTest
   void test_invalidCommentReference__new_tooMuch() {
     createParser('');
-    CommentReference reference = parseCommentReference('new a.b.c.d', 0);
+    var reference = parseCommentReference('new a.b.c.d', 0) as CommentReference;
     expectNotNullIfNoErrors(reference);
     listener.assertErrors(
         [expectedError(ParserErrorCode.INVALID_COMMENT_REFERENCE, 0, 11)]);
@@ -1490,7 +1496,7 @@
   void test_invalidCommentReference__nonNew_nonIdentifier() {
     // This test fails because the method parseCommentReference returns null.
     createParser('');
-    CommentReference reference = parseCommentReference('42', 0);
+    var reference = parseCommentReference('42', 0) as CommentReference;
     expectNotNullIfNoErrors(reference);
     listener.assertErrors(
         [expectedError(ParserErrorCode.INVALID_COMMENT_REFERENCE, 0, 2)]);
@@ -1499,7 +1505,7 @@
   @failingTest
   void test_invalidCommentReference__nonNew_tooMuch() {
     createParser('');
-    CommentReference reference = parseCommentReference('a.b.c.d', 0);
+    var reference = parseCommentReference('a.b.c.d', 0) as CommentReference;
     expectNotNullIfNoErrors(reference);
     listener.assertErrors(
         [expectedError(ParserErrorCode.INVALID_COMMENT_REFERENCE, 0, 7)]);
@@ -1541,14 +1547,16 @@
   }
 
   void test_invalidHexEscape_invalidDigit() {
-    StringLiteral literal = parseExpression("'not \\x0 a'",
-        errors: [expectedError(ParserErrorCode.INVALID_HEX_ESCAPE, 5, 3)]);
+    var literal = parseExpression("'not \\x0 a'",
+            errors: [expectedError(ParserErrorCode.INVALID_HEX_ESCAPE, 5, 3)])
+        as StringLiteral;
     expectNotNullIfNoErrors(literal);
   }
 
   void test_invalidHexEscape_tooFewDigits() {
-    StringLiteral literal = parseExpression("'\\x0'",
-        errors: [expectedError(ParserErrorCode.INVALID_HEX_ESCAPE, 1, 3)]);
+    var literal = parseExpression("'\\x0'",
+            errors: [expectedError(ParserErrorCode.INVALID_HEX_ESCAPE, 1, 3)])
+        as StringLiteral;
     expectNotNullIfNoErrors(literal);
   }
 
@@ -1572,8 +1580,9 @@
   }
 
   void test_invalidInterpolationIdentifier_startWithDigit() {
-    StringLiteral literal = parseExpression("'\$1'",
-        errors: [expectedError(ScannerErrorCode.MISSING_IDENTIFIER, 2, 1)]);
+    var literal = parseExpression("'\$1'",
+            errors: [expectedError(ScannerErrorCode.MISSING_IDENTIFIER, 2, 1)])
+        as StringLiteral;
     expectNotNullIfNoErrors(literal);
   }
 
@@ -1755,12 +1764,12 @@
     CompilationUnit unit =
         parseCompilationUnit("class C { m() { @Foo f() {} } }");
     expect(unit.declarations, hasLength(1));
-    ClassDeclaration declaration = unit.declarations[0];
+    var declaration = unit.declarations[0] as ClassDeclaration;
     expect(declaration.members, hasLength(1));
-    MethodDeclaration member = declaration.members[0];
-    BlockFunctionBody body = member.body;
+    var member = declaration.members[0] as MethodDeclaration;
+    var body = member.body as BlockFunctionBody;
     expect(body.block.statements, hasLength(1));
-    FunctionDeclarationStatement statement = body.block.statements[0];
+    var statement = body.block.statements[0] as FunctionDeclarationStatement;
     expect(statement.functionDeclaration.metadata, hasLength(1));
     Annotation metadata = statement.functionDeclaration.metadata[0];
     expect(metadata.name.name, 'Foo');
@@ -1796,7 +1805,7 @@
     listener
         .assertErrors([expectedError(ParserErrorCode.EXPECTED_TOKEN, 7, 7)]);
     expect(member, isMethodDeclaration);
-    MethodDeclaration method = member;
+    var method = member as MethodDeclaration;
     expect(method.parameters.toString(), '(E)',
         reason: 'parser recovers what it can');
   }
@@ -1808,7 +1817,7 @@
     listener
         .assertErrors([expectedError(ParserErrorCode.EXPECTED_TOKEN, 10, 5)]);
     expect(member, isMethodDeclaration);
-    MethodDeclaration method = member;
+    var method = member as MethodDeclaration;
     expect(method.typeParameters.toString(), '<E, hello>',
         reason: 'parser recovers what it can');
   }
@@ -1853,12 +1862,12 @@
     CompilationUnit unit = parseCompilationUnit('main() {super;}', errors: [
       expectedError(ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR, 8, 5)
     ]);
-    FunctionDeclaration declaration = unit.declarations.first;
-    BlockFunctionBody blockBody = declaration.functionExpression.body;
-    ExpressionStatement statement = blockBody.block.statements.first;
-    Expression expression = statement.expression;
+    var declaration = unit.declarations.first as FunctionDeclaration;
+    var blockBody = declaration.functionExpression.body as BlockFunctionBody;
+    var statement = blockBody.block.statements.first as ExpressionStatement;
+    var expression = statement.expression;
     expect(expression, isSuperExpression);
-    SuperExpression superExpression = expression;
+    var superExpression = expression as SuperExpression;
     expect(superExpression.superKeyword, isNotNull);
   }
 
@@ -1867,7 +1876,7 @@
   }
 
   void test_missingCatchOrFinally() {
-    TryStatement statement = parseStatement('try {}');
+    var statement = parseStatement('try {}') as TryStatement;
     expectNotNullIfNoErrors(statement);
     listener.assertErrors(
         [expectedError(ParserErrorCode.MISSING_CATCH_OR_FINALLY, 0, 3)]);
@@ -1897,7 +1906,7 @@
 
   void test_missingEnumBody() {
     createParser('enum E;', expectedEndOffset: 6);
-    EnumDeclaration declaration = parseFullCompilationUnitMember();
+    var declaration = parseFullCompilationUnitMember() as EnumDeclaration;
     expectNotNullIfNoErrors(declaration);
     listener
         .assertErrors([expectedError(ParserErrorCode.MISSING_ENUM_BODY, 6, 1)]);
@@ -1905,15 +1914,15 @@
 
   void test_missingEnumComma() {
     createParser('enum E {one two}');
-    EnumDeclaration declaration = parseFullCompilationUnitMember();
+    var declaration = parseFullCompilationUnitMember() as EnumDeclaration;
     expectNotNullIfNoErrors(declaration);
     listener
         .assertErrors([expectedError(ParserErrorCode.EXPECTED_TOKEN, 12, 3)]);
   }
 
   void test_missingExpressionInThrow() {
-    ThrowExpression expression =
-        (parseStatement('throw;') as ExpressionStatement).expression;
+    var expression = (parseStatement('throw;') as ExpressionStatement)
+        .expression as ThrowExpression;
     expectNotNullIfNoErrors(expression);
     listener.assertErrors(
         [expectedError(ParserErrorCode.MISSING_EXPRESSION_IN_THROW, 5, 1)]);
@@ -1983,7 +1992,7 @@
     CompilationUnit unit = parseCompilationUnit("void f { return x;}", errors: [
       expectedError(ParserErrorCode.MISSING_FUNCTION_PARAMETERS, 5, 1)
     ]);
-    FunctionDeclaration funct = unit.declarations[0];
+    var funct = unit.declarations[0] as FunctionDeclaration;
     expect(funct.functionExpression.parameters, hasLength(0));
   }
 
@@ -1991,13 +2000,13 @@
     CompilationUnit unit = parseCompilationUnit("void f => x;", errors: [
       expectedError(ParserErrorCode.MISSING_FUNCTION_PARAMETERS, 5, 1)
     ]);
-    FunctionDeclaration funct = unit.declarations[0];
+    var funct = unit.declarations[0] as FunctionDeclaration;
     expect(funct.functionExpression.parameters, hasLength(0));
   }
 
   void test_missingIdentifier_afterOperator() {
     createParser('1 *');
-    BinaryExpression expression = parser.parseMultiplicativeExpression();
+    var expression = parser.parseMultiplicativeExpression() as BinaryExpression;
     expectNotNullIfNoErrors(expression);
     listener.assertErrors(
         [expectedError(ParserErrorCode.MISSING_IDENTIFIER, 3, 0)]);
@@ -2015,7 +2024,7 @@
 
   void test_missingIdentifier_inEnum() {
     createParser('enum E {, TWO}');
-    EnumDeclaration declaration = parseFullCompilationUnitMember();
+    var declaration = parseFullCompilationUnitMember() as EnumDeclaration;
     expectNotNullIfNoErrors(declaration);
     listener.assertErrors(
         [expectedError(ParserErrorCode.MISSING_IDENTIFIER, 8, 1)]);
@@ -2061,7 +2070,7 @@
 
   void test_missingKeywordOperator() {
     createParser('+(x) {}');
-    MethodDeclaration method = parser.parseClassMember('C');
+    var method = parser.parseClassMember('C') as MethodDeclaration;
     expectNotNullIfNoErrors(method);
     listener.assertErrors(
         [expectedError(ParserErrorCode.MISSING_KEYWORD_OPERATOR, 0, 1)]);
@@ -2098,7 +2107,7 @@
     listener.assertErrors(
         [expectedError(ParserErrorCode.MISSING_METHOD_PARAMETERS, 5, 1)]);
     expect(member, isMethodDeclaration);
-    MethodDeclaration method = member;
+    var method = member as MethodDeclaration;
     expect(method.parameters, hasLength(0));
   }
 
@@ -2164,7 +2173,8 @@
 
   void test_missingStartAfterSync() {
     createParser('sync {}');
-    FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
+    FunctionBody functionBody = parser.parseFunctionBody(
+        false, ParserErrorCode.MISSING_FUNCTION_BODY, false);
     expectNotNullIfNoErrors(functionBody);
     listener.assertErrors(
         [expectedError(ParserErrorCode.MISSING_STAR_AFTER_SYNC, 0, 4)]);
@@ -2220,7 +2230,7 @@
   }
 
   void test_missingVariableInForEach() {
-    Statement statement = parseStatement('for (a < b in foo) {}');
+    var statement = parseStatement('for (a < b in foo) {}');
     expectNotNullIfNoErrors(statement);
     listener
         .assertErrors([expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 7, 1)]);
@@ -2288,7 +2298,7 @@
   }
 
   void test_multipleVariablesInForEach() {
-    Statement statement = parseStatement('for (int a, b in foo) {}');
+    var statement = parseStatement('for (int a, b in foo) {}');
     expectNotNullIfNoErrors(statement);
     listener
         .assertErrors([expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 10, 1)]);
@@ -2388,7 +2398,7 @@
   }
 
   void test_parseCascadeSection_missingIdentifier() {
-    MethodInvocation methodInvocation = parseCascadeSection('..()');
+    var methodInvocation = parseCascadeSection('..()') as MethodInvocation;
     expectNotNullIfNoErrors(methodInvocation);
     listener.assertErrors([
       // Cascade section is preceded by `null` in this test
@@ -2402,7 +2412,7 @@
   }
 
   void test_parseCascadeSection_missingIdentifier_typeArguments() {
-    MethodInvocation methodInvocation = parseCascadeSection('..<E>()');
+    var methodInvocation = parseCascadeSection('..<E>()') as MethodInvocation;
     expectNotNullIfNoErrors(methodInvocation);
     listener.assertErrors([
       // Cascade section is preceded by `null` in this test
@@ -2599,23 +2609,25 @@
   }
 
   void test_switchCase_missingColon() {
-    SwitchStatement statement = parseStatement('switch (a) {case 1 return 0;}');
+    var statement =
+        parseStatement('switch (a) {case 1 return 0;}') as SwitchStatement;
     expect(statement, isNotNull);
     listener
         .assertErrors([expectedError(ParserErrorCode.EXPECTED_TOKEN, 19, 6)]);
   }
 
   void test_switchDefault_missingColon() {
-    SwitchStatement statement =
-        parseStatement('switch (a) {default return 0;}');
+    var statement =
+        parseStatement('switch (a) {default return 0;}') as SwitchStatement;
     expect(statement, isNotNull);
     listener
         .assertErrors([expectedError(ParserErrorCode.EXPECTED_TOKEN, 20, 6)]);
   }
 
   void test_switchHasCaseAfterDefaultCase() {
-    SwitchStatement statement =
-        parseStatement('switch (a) {default: return 0; case 1: return 1;}');
+    var statement =
+        parseStatement('switch (a) {default: return 0; case 1: return 1;}')
+            as SwitchStatement;
     expectNotNullIfNoErrors(statement);
     listener.assertErrors([
       expectedError(ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE, 31, 4)
@@ -2623,8 +2635,9 @@
   }
 
   void test_switchHasCaseAfterDefaultCase_repeated() {
-    SwitchStatement statement = parseStatement(
-        'switch (a) {default: return 0; case 1: return 1; case 2: return 2;}');
+    var statement = parseStatement(
+            'switch (a) {default: return 0; case 1: return 1; case 2: return 2;}')
+        as SwitchStatement;
     expectNotNullIfNoErrors(statement);
     listener.assertErrors([
       expectedError(ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE, 31, 4),
@@ -2633,8 +2646,9 @@
   }
 
   void test_switchHasMultipleDefaultCases() {
-    SwitchStatement statement =
-        parseStatement('switch (a) {default: return 0; default: return 1;}');
+    var statement =
+        parseStatement('switch (a) {default: return 0; default: return 1;}')
+            as SwitchStatement;
     expectNotNullIfNoErrors(statement);
     listener.assertErrors([
       expectedError(ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES, 31, 7)
@@ -2642,8 +2656,9 @@
   }
 
   void test_switchHasMultipleDefaultCases_repeated() {
-    SwitchStatement statement = parseStatement(
-        'switch (a) {default: return 0; default: return 1; default: return 2;}');
+    var statement = parseStatement(
+            'switch (a) {default: return 0; default: return 1; default: return 2;}')
+        as SwitchStatement;
     expectNotNullIfNoErrors(statement);
     listener.assertErrors([
       expectedError(ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES, 31, 7),
@@ -2652,8 +2667,8 @@
   }
 
   void test_switchMissingBlock() {
-    SwitchStatement statement =
-        parseStatement('switch (a) return;', expectedEndOffset: 11);
+    var statement = parseStatement('switch (a) return;', expectedEndOffset: 11)
+        as SwitchStatement;
     expect(statement, isNotNull);
     listener.assertErrors([expectedError(ParserErrorCode.EXPECTED_BODY, 9, 1)]);
   }
@@ -2664,7 +2679,7 @@
     expectNotNullIfNoErrors(member);
     assertNoErrors();
     expect(member, isFunctionDeclaration);
-    FunctionDeclaration function = member;
+    var function = member as FunctionDeclaration;
     expect(function.functionExpression.parameters, isNull);
   }
 
@@ -2792,7 +2807,7 @@
 
   void test_unexpectedToken_semicolonBetweenClassMembers() {
     createParser('class C { int x; ; int y;}');
-    ClassDeclaration declaration = parseFullCompilationUnitMember();
+    var declaration = parseFullCompilationUnitMember() as ClassDeclaration;
     expectNotNullIfNoErrors(declaration);
     listener.assertErrors(
         [expectedError(ParserErrorCode.EXPECTED_CLASS_MEMBER, 17, 1)]);
@@ -2890,10 +2905,10 @@
     expectNotNullIfNoErrors(expression);
     listener.assertErrors(
         [expectedError(ParserErrorCode.MISSING_IDENTIFIER, 0, 1)]);
-    BinaryExpression binaryExpression = expression;
+    var binaryExpression = expression as BinaryExpression;
     expect(binaryExpression.leftOperand.isSynthetic, isTrue);
     expect(binaryExpression.rightOperand.isSynthetic, isFalse);
-    SimpleIdentifier identifier = binaryExpression.rightOperand;
+    var identifier = binaryExpression.rightOperand as SimpleIdentifier;
     expect(identifier.name, 'x');
   }
 
@@ -2965,8 +2980,8 @@
   }
 
   void test_voidParameter() {
-    NormalFormalParameter parameter =
-        parseFormalParameterList('(void a)').parameters[0];
+    var parameter = parseFormalParameterList('(void a)').parameters[0]
+        as NormalFormalParameter;
     expectNotNullIfNoErrors(parameter);
     assertNoErrors();
   }
@@ -3024,7 +3039,7 @@
 
   void test_withWithoutExtends() {
     createParser('class A with B, C {}');
-    ClassDeclaration declaration = parseFullCompilationUnitMember();
+    var declaration = parseFullCompilationUnitMember() as ClassDeclaration;
     expectNotNullIfNoErrors(declaration);
     listener.assertNoErrors();
   }
diff --git a/pkg/analyzer/test/generated/expression_parser_test.dart b/pkg/analyzer/test/generated/expression_parser_test.dart
index 567af1a..b721f79 100644
--- a/pkg/analyzer/test/generated/expression_parser_test.dart
+++ b/pkg/analyzer/test/generated/expression_parser_test.dart
@@ -670,7 +670,7 @@
     expect(expression, isNotNull);
     assertNoErrors();
     expect(expression, isInstanceCreationExpression);
-    InstanceCreationExpression instanceCreation = expression;
+    var instanceCreation = expression as InstanceCreationExpression;
     expect(instanceCreation.keyword, isNotNull);
     ConstructorName name = instanceCreation.constructorName;
     expect(name, isNotNull);
@@ -806,8 +806,8 @@
     Expression expression = parseExpression('() async {}');
     var functionExpression = expression as FunctionExpression;
     expect(functionExpression.body, isNotNull);
-    expect(functionExpression.body.isAsynchronous, isTrue);
-    expect(functionExpression.body.isGenerator, isFalse);
+    expect(functionExpression.body!.isAsynchronous, isTrue);
+    expect(functionExpression.body!.isGenerator, isFalse);
     expect(functionExpression.parameters, isNotNull);
   }
 
@@ -815,8 +815,8 @@
     Expression expression = parseExpression('() async* {}');
     var functionExpression = expression as FunctionExpression;
     expect(functionExpression.body, isNotNull);
-    expect(functionExpression.body.isAsynchronous, isTrue);
-    expect(functionExpression.body.isGenerator, isTrue);
+    expect(functionExpression.body!.isAsynchronous, isTrue);
+    expect(functionExpression.body!.isGenerator, isTrue);
     expect(functionExpression.parameters, isNotNull);
   }
 
@@ -824,8 +824,8 @@
     Expression expression = parseExpression('() {}');
     var functionExpression = expression as FunctionExpression;
     expect(functionExpression.body, isNotNull);
-    expect(functionExpression.body.isAsynchronous, isFalse);
-    expect(functionExpression.body.isGenerator, isFalse);
+    expect(functionExpression.body!.isAsynchronous, isFalse);
+    expect(functionExpression.body!.isGenerator, isFalse);
     expect(functionExpression.parameters, isNotNull);
   }
 
@@ -833,8 +833,8 @@
     Expression expression = parseExpression('() sync* {}');
     var functionExpression = expression as FunctionExpression;
     expect(functionExpression.body, isNotNull);
-    expect(functionExpression.body.isAsynchronous, isFalse);
-    expect(functionExpression.body.isGenerator, isTrue);
+    expect(functionExpression.body!.isAsynchronous, isFalse);
+    expect(functionExpression.body!.isGenerator, isTrue);
     expect(functionExpression.parameters, isNotNull);
   }
 
@@ -863,20 +863,20 @@
   void test_parseExpression_sendWithTypeParam_afterIndex() {
     final unit = parseCompilationUnit('main() { factories[C]<num, int>(); }');
     expect(unit.declarations, hasLength(1));
-    FunctionDeclaration mainMethod = unit.declarations[0];
-    BlockFunctionBody body = mainMethod.functionExpression.body;
+    var mainMethod = unit.declarations[0] as FunctionDeclaration;
+    var body = mainMethod.functionExpression.body as BlockFunctionBody;
     NodeList<Statement> statements = body.block.statements;
     expect(statements, hasLength(1));
-    ExpressionStatement statement = statements[0];
-    FunctionExpressionInvocation expression = statement.expression;
+    var statement = statements[0] as ExpressionStatement;
+    var expression = statement.expression as FunctionExpressionInvocation;
 
-    IndexExpression function = expression.function;
-    SimpleIdentifier target = function.target;
+    var function = expression.function as IndexExpression;
+    var target = function.target as SimpleIdentifier;
     expect(target.name, 'factories');
-    SimpleIdentifier index = function.index;
+    var index = function.index as SimpleIdentifier;
     expect(index.name, 'C');
 
-    NodeList<TypeAnnotation> typeArguments = expression.typeArguments.arguments;
+    List<TypeAnnotation> typeArguments = expression.typeArguments!.arguments;
     expect(typeArguments, hasLength(2));
     expect((typeArguments[0] as NamedType).name.name, 'num');
     expect((typeArguments[1] as NamedType).name.name, 'int');
@@ -887,22 +887,22 @@
   void test_parseExpression_sendWithTypeParam_afterSend() {
     final unit = parseCompilationUnit('main() { factories(C)<num, int>(); }');
     expect(unit.declarations, hasLength(1));
-    FunctionDeclaration mainMethod = unit.declarations[0];
-    BlockFunctionBody body = mainMethod.functionExpression.body;
+    var mainMethod = unit.declarations[0] as FunctionDeclaration;
+    var body = mainMethod.functionExpression.body as BlockFunctionBody;
     NodeList<Statement> statements = body.block.statements;
     expect(statements, hasLength(1));
-    ExpressionStatement statement = statements[0];
-    FunctionExpressionInvocation expression = statement.expression;
+    var statement = statements[0] as ExpressionStatement;
+    var expression = statement.expression as FunctionExpressionInvocation;
 
-    MethodInvocation invocation = expression.function;
+    var invocation = expression.function as MethodInvocation;
     expect(invocation.methodName.name, 'factories');
     NodeList<Expression> invocationArguments =
         invocation.argumentList.arguments;
     expect(invocationArguments, hasLength(1));
-    SimpleIdentifier index = invocationArguments[0];
+    var index = invocationArguments[0] as SimpleIdentifier;
     expect(index.name, 'C');
 
-    NodeList<TypeAnnotation> typeArguments = expression.typeArguments.arguments;
+    List<TypeAnnotation> typeArguments = expression.typeArguments!.arguments;
     expect(typeArguments, hasLength(2));
     expect((typeArguments[0] as NamedType).name.name, 'num');
     expect((typeArguments[1] as NamedType).name.name, 'int');
@@ -931,7 +931,7 @@
   void test_parseExpression_superMethodInvocation_typeArguments_chained() {
     Expression expression = parseExpression('super.b.c<D>()');
     MethodInvocation invocation = expression as MethodInvocation;
-    Expression target = invocation.target;
+    var target = invocation.target as Expression;
     expect(target, isPropertyAccess);
     expect(invocation.methodName, isNotNull);
     expect(invocation.methodName.name, 'c');
@@ -1024,8 +1024,8 @@
     Expression expression = parseExpression('<test(' ', (){});>[0, 1, 2]',
         codes: [ParserErrorCode.EXPECTED_TOKEN]);
     expect(expression, isNotNull);
-    ListLiteral literal = expression;
-    expect(literal.typeArguments.arguments, hasLength(1));
+    var literal = expression as ListLiteral;
+    expect(literal.typeArguments!.arguments, hasLength(1));
   }
 
   void test_parseFunctionExpression_typeParameters() {
@@ -1044,7 +1044,7 @@
         parseInstanceCreationExpression('A.B()', token);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression.keyword.keyword, Keyword.NEW);
+    expect(expression.keyword!.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
     TypeName type = name.type;
@@ -1061,7 +1061,7 @@
         parseInstanceCreationExpression('A.B.c()', token);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression.keyword.keyword, Keyword.NEW);
+    expect(expression.keyword!.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
     TypeName type = name.type;
@@ -1079,12 +1079,12 @@
         parseInstanceCreationExpression('A.B<E>.c()', token);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression.keyword.keyword, Keyword.NEW);
+    expect(expression.keyword!.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
     TypeName type = name.type;
     expect(type, isNotNull);
-    expect(type.typeArguments.arguments, hasLength(1));
+    expect(type.typeArguments!.arguments, hasLength(1));
     expect(name.period, isNotNull);
     expect(name.name, isNotNull);
     expect(expression.argumentList, isNotNull);
@@ -1096,12 +1096,12 @@
         parseInstanceCreationExpression('A.B<E>()', token);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression.keyword.keyword, Keyword.NEW);
+    expect(expression.keyword!.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
     TypeName type = name.type;
     expect(type, isNotNull);
-    expect(type.typeArguments.arguments, hasLength(1));
+    expect(type.typeArguments!.arguments, hasLength(1));
     expect(name.period, isNull);
     expect(name.name, isNull);
     expect(expression.argumentList, isNotNull);
@@ -1113,7 +1113,7 @@
         parseInstanceCreationExpression('A()', token);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression.keyword.keyword, Keyword.NEW);
+    expect(expression.keyword!.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
     TypeName type = name.type;
@@ -1130,7 +1130,7 @@
         parseInstanceCreationExpression('A.c()', token);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression.keyword.keyword, Keyword.NEW);
+    expect(expression.keyword!.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
     TypeName type = name.type;
@@ -1143,16 +1143,16 @@
 
   void test_parseInstanceCreationExpression_type_named_typeArguments() {
     Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
-    InstanceCreationExpressionImpl expression =
-        parseInstanceCreationExpression('A<B>.c()', token);
+    var expression = parseInstanceCreationExpression('A<B>.c()', token)
+        as InstanceCreationExpressionImpl;
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression.keyword.keyword, Keyword.NEW);
+    expect(expression.keyword!.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
     TypeName type = name.type;
     expect(type, isNotNull);
-    expect(type.typeArguments.arguments, hasLength(1));
+    expect(type.typeArguments!.arguments, hasLength(1));
     expect(name.period, isNotNull);
     expect(name.name, isNotNull);
     expect(expression.argumentList, isNotNull);
@@ -1160,13 +1160,12 @@
   }
 
   void test_parseInstanceCreationExpression_type_named_typeArguments_34403() {
-    InstanceCreationExpressionImpl expression =
-        parseExpression('new a.b.c<C>()', errors: [
+    var expression = parseExpression('new a.b.c<C>()', errors: [
       expectedError(
           CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR, 8, 1)
-    ]);
+    ]) as InstanceCreationExpressionImpl;
     expect(expression, isNotNull);
-    expect(expression.keyword.keyword, Keyword.NEW);
+    expect(expression.keyword!.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
     TypeName type = name.type;
@@ -1175,7 +1174,7 @@
     expect(name.period, isNotNull);
     expect(name.name, isNotNull);
     expect(expression.argumentList, isNotNull);
-    expect(expression.typeArguments.arguments, hasLength(1));
+    expect(expression.typeArguments!.arguments, hasLength(1));
   }
 
   void test_parseInstanceCreationExpression_type_typeArguments() {
@@ -1184,12 +1183,12 @@
         parseInstanceCreationExpression('A<B>()', token);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression.keyword.keyword, Keyword.NEW);
+    expect(expression.keyword!.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
     TypeName type = name.type;
     expect(type, isNotNull);
-    expect(type.typeArguments.arguments, hasLength(1));
+    expect(type.typeArguments!.arguments, hasLength(1));
     expect(name.period, isNull);
     expect(name.name, isNull);
     expect(expression.argumentList, isNotNull);
@@ -1200,7 +1199,7 @@
     ListLiteral literal = parseListLiteral(token, null, '[]');
     expect(literal, isNotNull);
     assertNoErrors();
-    expect(literal.constKeyword.keyword, Keyword.CONST);
+    expect(literal.constKeyword!.keyword, Keyword.CONST);
     expect(literal.typeArguments, isNull);
     expect(literal.leftBracket, isNotNull);
     expect(literal.elements, hasLength(0));
@@ -1225,7 +1224,7 @@
     ListLiteral literal = parseListLiteral(token, null, '[ ]');
     expect(literal, isNotNull);
     assertNoErrors();
-    expect(literal.constKeyword.keyword, Keyword.CONST);
+    expect(literal.constKeyword!.keyword, Keyword.CONST);
     expect(literal.typeArguments, isNull);
     expect(literal.leftBracket, isNotNull);
     expect(literal.elements, hasLength(0));
@@ -1341,7 +1340,7 @@
     SetOrMapLiteral literal = parseMapLiteral(token, '<String, int>', '{}');
     expect(literal, isNotNull);
     assertNoErrors();
-    expect(literal.constKeyword.keyword, Keyword.CONST);
+    expect(literal.constKeyword!.keyword, Keyword.CONST);
     expect(literal.typeArguments, isNotNull);
     expect(literal.leftBracket, isNotNull);
     expect(literal.elements, hasLength(0));
@@ -1473,7 +1472,7 @@
     assertNoErrors();
     var methodInvocation = expression as MethodInvocation;
     expect(methodInvocation.target, isNotNull);
-    expect(methodInvocation.operator.type, TokenType.PERIOD);
+    expect(methodInvocation.operator!.type, TokenType.PERIOD);
     expect(methodInvocation.methodName, isNotNull);
     expect(methodInvocation.typeArguments, isNull);
     expect(methodInvocation.argumentList, isNotNull);
@@ -1485,7 +1484,7 @@
     assertNoErrors();
     var methodInvocation = expression as MethodInvocation;
     expect(methodInvocation.target, isNotNull);
-    expect(methodInvocation.operator.type, TokenType.QUESTION_PERIOD);
+    expect(methodInvocation.operator!.type, TokenType.QUESTION_PERIOD);
     expect(methodInvocation.methodName, isNotNull);
     expect(methodInvocation.typeArguments, isNull);
     expect(methodInvocation.argumentList, isNotNull);
@@ -1498,7 +1497,7 @@
     assertNoErrors();
     var methodInvocation = expression as MethodInvocation;
     expect(methodInvocation.target, isNotNull);
-    expect(methodInvocation.operator.type, TokenType.QUESTION_PERIOD);
+    expect(methodInvocation.operator!.type, TokenType.QUESTION_PERIOD);
     expect(methodInvocation.methodName, isNotNull);
     expect(methodInvocation.typeArguments, isNotNull);
     expect(methodInvocation.argumentList, isNotNull);
@@ -1510,7 +1509,7 @@
     assertNoErrors();
     var methodInvocation = expression as MethodInvocation;
     expect(methodInvocation.target, isNotNull);
-    expect(methodInvocation.operator.type, TokenType.PERIOD);
+    expect(methodInvocation.operator!.type, TokenType.PERIOD);
     expect(methodInvocation.methodName, isNotNull);
     expect(methodInvocation.typeArguments, isNotNull);
     expect(methodInvocation.argumentList, isNotNull);
@@ -1649,7 +1648,7 @@
     assertNoErrors();
     var literal = expression as ListLiteral;
     expect(literal.typeArguments, isNotNull);
-    expect(literal.typeArguments.arguments, hasLength(1));
+    expect(literal.typeArguments!.arguments, hasLength(1));
   }
 
   void test_parsePrimaryExpression_mapLiteral() {
@@ -1667,7 +1666,7 @@
     assertNoErrors();
     var literal = expression as SetOrMapLiteral;
     expect(literal.typeArguments, isNotNull);
-    expect(literal.typeArguments.arguments, hasLength(2));
+    expect(literal.typeArguments!.arguments, hasLength(2));
   }
 
   void test_parsePrimaryExpression_new() {
@@ -1683,7 +1682,7 @@
     expect(expression, isNotNull);
     assertNoErrors();
     expect(expression, isNullLiteral);
-    NullLiteral literal = expression;
+    var literal = expression as NullLiteral;
     expect(literal.literal, isNotNull);
   }
 
@@ -1774,13 +1773,14 @@
   }
 
   void test_parseRelationalExpression_as_chained() {
-    AsExpression asExpression = parseExpression('x as Y as Z',
-        errors: [expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 7, 2)]);
+    var asExpression = parseExpression('x as Y as Z',
+            errors: [expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 7, 2)])
+        as AsExpression;
     expect(asExpression, isNotNull);
-    SimpleIdentifier identifier = asExpression.expression;
+    var identifier = asExpression.expression as SimpleIdentifier;
     expect(identifier.name, 'x');
     expect(asExpression.asOperator, isNotNull);
-    TypeName typeName = asExpression.type;
+    var typeName = asExpression.type as TypeName;
     expect(typeName.name.name, 'Y');
   }
 
@@ -1847,13 +1847,14 @@
   }
 
   void test_parseRelationalExpression_is_chained() {
-    IsExpression isExpression = parseExpression('x is Y is! Z',
-        errors: [expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 7, 2)]);
+    var isExpression = parseExpression('x is Y is! Z',
+            errors: [expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 7, 2)])
+        as IsExpression;
     expect(isExpression, isNotNull);
-    SimpleIdentifier identifier = isExpression.expression;
+    var identifier = isExpression.expression as SimpleIdentifier;
     expect(identifier.name, 'x');
     expect(isExpression.isOperator, isNotNull);
-    TypeName typeName = isExpression.type;
+    var typeName = isExpression.type as TypeName;
     expect(typeName.name.name, 'Y');
   }
 
@@ -1959,15 +1960,15 @@
     var interpolation = expression as StringInterpolation;
     expect(interpolation.elements, hasLength(3));
     expect(interpolation.elements[0], isInterpolationString);
-    InterpolationString element0 = interpolation.elements[0];
+    var element0 = interpolation.elements[0] as InterpolationString;
     expect(element0.value, 'x');
     expect(interpolation.elements[1], isInterpolationExpression);
-    InterpolationExpression element1 = interpolation.elements[1];
+    var element1 = interpolation.elements[1] as InterpolationExpression;
     expect(element1.leftBracket.lexeme, '\$');
     expect(element1.expression, isSimpleIdentifier);
     expect(element1.rightBracket, isNull);
     expect(interpolation.elements[2], isInterpolationString);
-    InterpolationString element2 = interpolation.elements[2];
+    var element2 = interpolation.elements[2] as InterpolationString;
     expect(element2.value, '');
   }
 
@@ -1976,7 +1977,7 @@
     expect(expression, isNotNull);
     assertNoErrors();
     expect(expression, isStringInterpolation);
-    StringInterpolation literal = expression;
+    var literal = expression as StringInterpolation;
     NodeList<InterpolationElement> elements = literal.elements;
     expect(elements, hasLength(5));
     expect(elements[0] is InterpolationString, isTrue);
@@ -1985,7 +1986,7 @@
     expect(elements[3] is InterpolationExpression, isTrue);
     expect(elements[4] is InterpolationString, isTrue);
     expect((elements[1] as InterpolationExpression).leftBracket.lexeme, '\${');
-    expect((elements[1] as InterpolationExpression).rightBracket.lexeme, '}');
+    expect((elements[1] as InterpolationExpression).rightBracket!.lexeme, '}');
     expect((elements[3] as InterpolationExpression).leftBracket.lexeme, '\$');
     expect((elements[3] as InterpolationExpression).rightBracket, isNull);
   }
@@ -2023,13 +2024,13 @@
     var interpolation = expression as StringInterpolation;
     expect(interpolation.elements, hasLength(3));
     expect(interpolation.elements[0], isInterpolationString);
-    InterpolationString element0 = interpolation.elements[0];
+    var element0 = interpolation.elements[0] as InterpolationString;
     expect(element0.value, 'x');
     expect(interpolation.elements[1], isInterpolationExpression);
-    InterpolationExpression element1 = interpolation.elements[1];
+    var element1 = interpolation.elements[1] as InterpolationExpression;
     expect(element1.expression, isSimpleIdentifier);
     expect(interpolation.elements[2], isInterpolationString);
-    InterpolationString element2 = interpolation.elements[2];
+    var element2 = interpolation.elements[2] as InterpolationString;
     expect(element2.value, '');
   }
 
@@ -2112,13 +2113,13 @@
     var interpolation = expression as StringInterpolation;
     expect(interpolation.elements, hasLength(3));
     expect(interpolation.elements[0], isInterpolationString);
-    InterpolationString element0 = interpolation.elements[0];
+    var element0 = interpolation.elements[0] as InterpolationString;
     expect(element0.value, '');
     expect(interpolation.elements[1], isInterpolationExpression);
-    InterpolationExpression element1 = interpolation.elements[1];
+    var element1 = interpolation.elements[1] as InterpolationExpression;
     expect(element1.expression, isSimpleIdentifier);
     expect(interpolation.elements[2], isInterpolationString);
-    InterpolationString element2 = interpolation.elements[2];
+    var element2 = interpolation.elements[2] as InterpolationString;
     expect(element2.value, "'y");
   }
 
@@ -2129,13 +2130,13 @@
     var interpolation = expression as StringInterpolation;
     expect(interpolation.elements, hasLength(3));
     expect(interpolation.elements[0], isInterpolationString);
-    InterpolationString element0 = interpolation.elements[0];
+    var element0 = interpolation.elements[0] as InterpolationString;
     expect(element0.value, '');
     expect(interpolation.elements[1], isInterpolationExpression);
-    InterpolationExpression element1 = interpolation.elements[1];
+    var element1 = interpolation.elements[1] as InterpolationExpression;
     expect(element1.expression, isSimpleIdentifier);
     expect(interpolation.elements[2], isInterpolationString);
-    InterpolationString element2 = interpolation.elements[2];
+    var element2 = interpolation.elements[2] as InterpolationString;
     expect(element2.value, 'y');
   }
 
@@ -2173,13 +2174,13 @@
     var interpolation = expression as StringInterpolation;
     expect(interpolation.elements, hasLength(3));
     expect(interpolation.elements[0], isInterpolationString);
-    InterpolationString element0 = interpolation.elements[0];
+    var element0 = interpolation.elements[0] as InterpolationString;
     expect(element0.value, '');
     expect(interpolation.elements[1], isInterpolationExpression);
-    InterpolationExpression element1 = interpolation.elements[1];
+    var element1 = interpolation.elements[1] as InterpolationExpression;
     expect(element1.expression, isSimpleIdentifier);
     expect(interpolation.elements[2], isInterpolationString);
-    InterpolationString element2 = interpolation.elements[2];
+    var element2 = interpolation.elements[2] as InterpolationString;
     expect(element2.value, '"');
   }
 
@@ -2199,13 +2200,13 @@
     var interpolation = expression as StringInterpolation;
     expect(interpolation.elements, hasLength(3));
     expect(interpolation.elements[0], isInterpolationString);
-    InterpolationString element0 = interpolation.elements[0];
+    var element0 = interpolation.elements[0] as InterpolationString;
     expect(element0.value, '');
     expect(interpolation.elements[1], isInterpolationExpression);
-    InterpolationExpression element1 = interpolation.elements[1];
+    var element1 = interpolation.elements[1] as InterpolationExpression;
     expect(element1.expression, isSimpleIdentifier);
     expect(interpolation.elements[2], isInterpolationString);
-    InterpolationString element2 = interpolation.elements[2];
+    var element2 = interpolation.elements[2] as InterpolationString;
     expect(element2.value, 'y');
   }
 
@@ -2303,7 +2304,7 @@
   }
 
   void test_parseUnaryExpression_decrement_identifier_index() {
-    PrefixExpression expression = parseExpression('--a[0]');
+    var expression = parseExpression('--a[0]') as PrefixExpression;
     expect(expression, isNotNull);
     assertNoErrors();
     expect(expression.operator, isNotNull);
@@ -2376,7 +2377,7 @@
   }
 
   void test_parseUnaryExpression_increment_identifier_index() {
-    PrefixExpression expression = parseExpression('++a[0]');
+    var expression = parseExpression('++a[0]') as PrefixExpression;
     expect(expression, isNotNull);
     assertNoErrors();
     expect(expression.operator, isNotNull);
@@ -2421,7 +2422,7 @@
   }
 
   void test_parseUnaryExpression_minus_identifier_index() {
-    PrefixExpression expression = parseExpression('-a[0]');
+    var expression = parseExpression('-a[0]') as PrefixExpression;
     expect(expression, isNotNull);
     assertNoErrors();
     expect(expression.operator, isNotNull);
@@ -2487,7 +2488,7 @@
   }
 
   void test_parseUnaryExpression_tilde_identifier_index() {
-    PrefixExpression expression = parseExpression('~a[0]');
+    var expression = parseExpression('~a[0]') as PrefixExpression;
     expect(expression, isNotNull);
     assertNoErrors();
     expect(expression.operator, isNotNull);
@@ -2499,60 +2500,60 @@
   }
 
   void test_setLiteral() {
-    SetOrMapLiteral set = parseExpression('{3}');
+    var set = parseExpression('{3}') as SetOrMapLiteral;
     expect(set.constKeyword, isNull);
     expect(set.typeArguments, isNull);
     expect(set.elements, hasLength(1));
-    IntegerLiteral value = set.elements[0];
+    var value = set.elements[0] as IntegerLiteral;
     expect(value.value, 3);
   }
 
   void test_setLiteral_const() {
-    SetOrMapLiteral set = parseExpression('const {3, 6}');
+    var set = parseExpression('const {3, 6}') as SetOrMapLiteral;
     expect(set.constKeyword, isNotNull);
     expect(set.typeArguments, isNull);
     expect(set.elements, hasLength(2));
-    IntegerLiteral value1 = set.elements[0];
+    var value1 = set.elements[0] as IntegerLiteral;
     expect(value1.value, 3);
-    IntegerLiteral value2 = set.elements[1];
+    var value2 = set.elements[1] as IntegerLiteral;
     expect(value2.value, 6);
   }
 
   void test_setLiteral_const_typed() {
-    SetOrMapLiteral set = parseExpression('const <int>{3}');
+    var set = parseExpression('const <int>{3}') as SetOrMapLiteral;
     expect(set.constKeyword, isNotNull);
-    expect(set.typeArguments.arguments, hasLength(1));
-    NamedType typeArg = set.typeArguments.arguments[0];
+    expect(set.typeArguments!.arguments, hasLength(1));
+    var typeArg = set.typeArguments!.arguments[0] as NamedType;
     expect(typeArg.name.name, 'int');
     expect(set.elements.length, 1);
-    IntegerLiteral value = set.elements[0];
+    var value = set.elements[0] as IntegerLiteral;
     expect(value.value, 3);
   }
 
   void test_setLiteral_nested_typeArgument() {
-    SetOrMapLiteral set = parseExpression('<Set<int>>{{3}}');
+    var set = parseExpression('<Set<int>>{{3}}') as SetOrMapLiteral;
     expect(set.constKeyword, isNull);
-    expect(set.typeArguments.arguments, hasLength(1));
-    NamedType typeArg1 = set.typeArguments.arguments[0];
+    expect(set.typeArguments!.arguments, hasLength(1));
+    var typeArg1 = set.typeArguments!.arguments[0] as NamedType;
     expect(typeArg1.name.name, 'Set');
-    expect(typeArg1.typeArguments.arguments, hasLength(1));
-    NamedType typeArg2 = typeArg1.typeArguments.arguments[0];
+    expect(typeArg1.typeArguments!.arguments, hasLength(1));
+    var typeArg2 = typeArg1.typeArguments!.arguments[0] as NamedType;
     expect(typeArg2.name.name, 'int');
     expect(set.elements.length, 1);
-    SetOrMapLiteral intSet = set.elements[0];
+    var intSet = set.elements[0] as SetOrMapLiteral;
     expect(intSet.elements, hasLength(1));
-    IntegerLiteral value = intSet.elements[0];
+    var value = intSet.elements[0] as IntegerLiteral;
     expect(value.value, 3);
   }
 
   void test_setLiteral_typed() {
-    SetOrMapLiteral set = parseExpression('<int>{3}');
+    var set = parseExpression('<int>{3}') as SetOrMapLiteral;
     expect(set.constKeyword, isNull);
-    expect(set.typeArguments.arguments, hasLength(1));
-    NamedType typeArg = set.typeArguments.arguments[0];
+    expect(set.typeArguments!.arguments, hasLength(1));
+    var typeArg = set.typeArguments!.arguments[0] as NamedType;
     expect(typeArg.name.name, 'int');
     expect(set.elements.length, 1);
-    IntegerLiteral value = set.elements[0];
+    var value = set.elements[0] as IntegerLiteral;
     expect(value.value, 3);
   }
 }
diff --git a/pkg/analyzer/test/generated/extension_methods_parser_test.dart b/pkg/analyzer/test/generated/extension_methods_parser_test.dart
index e5b42d3..e76b4ac 100644
--- a/pkg/analyzer/test/generated/extension_methods_parser_test.dart
+++ b/pkg/analyzer/test/generated/extension_methods_parser_test.dart
@@ -32,7 +32,7 @@
         ]);
     expect(unit.declarations, hasLength(1));
     var extension = unit.declarations[0] as ExtensionDeclaration;
-    expect(extension.name.name, 'E');
+    expect(extension.name!.name, 'E');
     expect(extension.onKeyword.lexeme, 'extends');
     expect((extension.extendedType as NamedType).name.name, 'A');
     expect(extension.members, hasLength(0));
@@ -45,7 +45,7 @@
     ]);
     expect(unit.declarations, hasLength(1));
     var extension = unit.declarations[0] as ExtensionDeclaration;
-    expect(extension.name.name, 'E');
+    expect(extension.name!.name, 'E');
     expect(extension.onKeyword.lexeme, 'implements');
     expect((extension.extendedType as NamedType).name.name, 'C');
     expect(extension.members, hasLength(0));
@@ -55,11 +55,11 @@
     var unit = parseCompilationUnit('extension E on C<T> { }');
     expect(unit.declarations, hasLength(1));
     var extension = unit.declarations[0] as ExtensionDeclaration;
-    expect(extension.name.name, 'E');
+    expect(extension.name!.name, 'E');
     expect(extension.onKeyword.lexeme, 'on');
     var namedType = extension.extendedType as NamedType;
     expect(namedType.name.name, 'C');
-    expect(namedType.typeArguments.arguments, hasLength(1));
+    expect(namedType.typeArguments!.arguments, hasLength(1));
     expect(extension.members, hasLength(0));
   }
 
@@ -67,11 +67,11 @@
     var unit = parseCompilationUnit('extension E<T> on C<T> { }');
     expect(unit.declarations, hasLength(1));
     var extension = unit.declarations[0] as ExtensionDeclaration;
-    expect(extension.name.name, 'E');
+    expect(extension.name!.name, 'E');
     expect(extension.onKeyword.lexeme, 'on');
     var namedType = extension.extendedType as NamedType;
     expect(namedType.name.name, 'C');
-    expect(namedType.typeArguments.arguments, hasLength(1));
+    expect(namedType.typeArguments!.arguments, hasLength(1));
     expect(extension.members, hasLength(0));
   }
 
@@ -83,7 +83,7 @@
     expect(extension.onKeyword.lexeme, 'on');
     var namedType = extension.extendedType as NamedType;
     expect(namedType.name.name, 'C');
-    expect(namedType.typeArguments.arguments, hasLength(1));
+    expect(namedType.typeArguments!.arguments, hasLength(1));
     expect(extension.members, hasLength(0));
   }
 
@@ -123,7 +123,7 @@
     ]);
     expect(unit.declarations, hasLength(1));
     var extension = unit.declarations[0] as ExtensionDeclaration;
-    expect(extension.name.name, 'E');
+    expect(extension.name!.name, 'E');
     expect(extension.onKeyword.lexeme, 'on');
     expect((extension.extendedType as NamedType).name.name, '');
     expect(extension.members, hasLength(0));
@@ -136,7 +136,7 @@
     ]);
     expect(unit.declarations, hasLength(1));
     var extension = unit.declarations[0] as ExtensionDeclaration;
-    expect(extension.name.name, 'E');
+    expect(extension.name!.name, 'E');
     expect(extension.onKeyword.lexeme, 'on');
     expect((extension.extendedType as NamedType).name.name, '');
     expect(extension.members, hasLength(0));
@@ -148,16 +148,17 @@
     ]);
     expect(unit.declarations, hasLength(1));
     var extension = unit.declarations[0] as ExtensionDeclaration;
-    expect(extension.name.name, 'E');
+    expect(extension.name!.name, 'E');
     expect(extension.onKeyword.lexeme, 'on');
     expect((extension.extendedType as NamedType).name.name, 'C');
     expect(extension.members, hasLength(0));
   }
 
   void test_parse_toplevel_member_called_late_calling_self() {
-    CompilationUnitImpl unit = parseCompilationUnit('void late() { late(); }',
-        featureSet: nonNullable);
-    FunctionDeclaration method = unit.declarations[0];
+    var unit =
+        parseCompilationUnit('void late() { late(); }', featureSet: nonNullable)
+            as CompilationUnitImpl;
+    var method = unit.declarations[0] as FunctionDeclaration;
 
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
@@ -166,9 +167,9 @@
     expect(method.name.name, 'late');
     expect(method.functionExpression, isNotNull);
 
-    BlockFunctionBody body = method.functionExpression.body;
-    ExpressionStatement statement = body.block.statements[0];
-    MethodInvocation invocation = statement.expression;
+    var body = method.functionExpression.body as BlockFunctionBody;
+    var statement = body.block.statements[0] as ExpressionStatement;
+    var invocation = statement.expression as MethodInvocation;
     expect(invocation.operator, isNull);
     expect(invocation.toSource(), 'late()');
   }
@@ -177,7 +178,7 @@
     var unit = parseCompilationUnit('extension E on C { }');
     expect(unit.declarations, hasLength(1));
     var extension = unit.declarations[0] as ExtensionDeclaration;
-    expect(extension.name.name, 'E');
+    expect(extension.name!.name, 'E');
     expect(extension.onKeyword.lexeme, 'on');
     expect((extension.extendedType as NamedType).name.name, 'C');
     var namedType = extension.extendedType as NamedType;
@@ -192,7 +193,7 @@
     ]);
     expect(unit.declarations, hasLength(1));
     var extension = unit.declarations[0] as ExtensionDeclaration;
-    expect(extension.name.name, 'E');
+    expect(extension.name!.name, 'E');
     expect(extension.onKeyword.lexeme, 'extends');
     expect((extension.extendedType as NamedType).name.name, 'C');
     expect(extension.members, hasLength(0));
@@ -204,7 +205,7 @@
     ]);
     expect(unit.declarations, hasLength(1));
     var extension = unit.declarations[0] as ExtensionDeclaration;
-    expect(extension.name.name, 'E');
+    expect(extension.name!.name, 'E');
     expect(extension.onKeyword.lexeme, 'implements');
     expect((extension.extendedType as NamedType).name.name, 'C');
     expect(extension.members, hasLength(0));
@@ -243,7 +244,7 @@
     ]);
     expect(unit.declarations, hasLength(1));
     var extension = unit.declarations[0] as ExtensionDeclaration;
-    expect(extension.name.name, 'E');
+    expect(extension.name!.name, 'E');
     expect(extension.onKeyword.lexeme, 'with');
     expect((extension.extendedType as NamedType).name.name, 'C');
     expect(extension.members, hasLength(0));
@@ -253,7 +254,7 @@
     var unit = parseCompilationUnit('extension E on void { }');
     expect(unit.declarations, hasLength(1));
     var extension = unit.declarations[0] as ExtensionDeclaration;
-    expect(extension.name.name, 'E');
+    expect(extension.name!.name, 'E');
     expect(extension.onKeyword.lexeme, 'on');
     expect((extension.extendedType as NamedType).name.name, 'void');
     expect(extension.members, hasLength(0));
diff --git a/pkg/analyzer/test/generated/formal_parameter_parser_test.dart b/pkg/analyzer/test/generated/formal_parameter_parser_test.dart
index da72d4b..41de193 100644
--- a/pkg/analyzer/test/generated/formal_parameter_parser_test.dart
+++ b/pkg/analyzer/test/generated/formal_parameter_parser_test.dart
@@ -24,7 +24,7 @@
 @reflectiveTest
 class FormalParameterParserTest extends FastaParserTestCase {
   FormalParameter parseNNBDFormalParameter(String code, ParameterKind kind,
-      {List<ExpectedError> errors}) {
+      {List<ExpectedError>? errors}) {
     String parametersCode;
     if (kind == ParameterKind.REQUIRED) {
       parametersCode = '($code)';
@@ -48,7 +48,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isFieldFormalParameter);
-    FieldFormalParameter functionParameter = parameter;
+    var functionParameter = parameter as FieldFormalParameter;
     expect(functionParameter.type, isNotNull);
     expect(functionParameter.identifier, isNotNull);
     expect(functionParameter.typeParameters, isNull);
@@ -158,7 +158,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isDefaultFormalParameter);
-    DefaultFormalParameter defaultParameter = parameter;
+    var defaultParameter = parameter as DefaultFormalParameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNotNull);
@@ -178,7 +178,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isSimpleFormalParameter);
-    SimpleFormalParameter simpleParameter = parameter;
+    var simpleParameter = parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNotNull);
     expect(simpleParameter.requiredKeyword, isNull);
     expect(simpleParameter.identifier, isNotNull);
@@ -194,7 +194,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isDefaultFormalParameter);
-    DefaultFormalParameter defaultParameter = parameter;
+    var defaultParameter = parameter as DefaultFormalParameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNotNull);
@@ -215,7 +215,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isDefaultFormalParameter);
-    DefaultFormalParameter defaultParameter = parameter;
+    var defaultParameter = parameter as DefaultFormalParameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNotNull);
@@ -236,7 +236,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isSimpleFormalParameter);
-    SimpleFormalParameter simpleParameter = parameter;
+    var simpleParameter = parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNotNull);
     expect(simpleParameter.requiredKeyword, isNull);
     expect(simpleParameter.identifier, isNotNull);
@@ -252,7 +252,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isDefaultFormalParameter);
-    DefaultFormalParameter defaultParameter = parameter;
+    var defaultParameter = parameter as DefaultFormalParameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNotNull);
@@ -273,7 +273,7 @@
         errors: [expectedError(ParserErrorCode.MODIFIER_OUT_OF_ORDER, 12, 8)]);
     expect(parameter, isNotNull);
     expect(parameter, isDefaultFormalParameter);
-    DefaultFormalParameter defaultParameter = parameter;
+    var defaultParameter = parameter as DefaultFormalParameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNotNull);
@@ -294,7 +294,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isSimpleFormalParameter);
-    SimpleFormalParameter simpleParameter = parameter;
+    var simpleParameter = parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNotNull);
     expect(simpleParameter.requiredKeyword, isNull);
     expect(simpleParameter.identifier, isNotNull);
@@ -310,7 +310,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isDefaultFormalParameter);
-    DefaultFormalParameter defaultParameter = parameter;
+    var defaultParameter = parameter as DefaultFormalParameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNotNull);
@@ -331,7 +331,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isSimpleFormalParameter);
-    SimpleFormalParameter simpleParameter = parameter;
+    var simpleParameter = parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNotNull);
     expect(simpleParameter.requiredKeyword, isNull);
     expect(simpleParameter.identifier, isNotNull);
@@ -347,7 +347,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isDefaultFormalParameter);
-    DefaultFormalParameter defaultParameter = parameter;
+    var defaultParameter = parameter as DefaultFormalParameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNotNull);
@@ -368,7 +368,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isDefaultFormalParameter);
-    DefaultFormalParameter defaultParameter = parameter;
+    var defaultParameter = parameter as DefaultFormalParameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNotNull);
@@ -388,7 +388,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isSimpleFormalParameter);
-    SimpleFormalParameter simpleParameter = parameter;
+    var simpleParameter = parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNotNull);
     expect(simpleParameter.requiredKeyword, isNull);
     expect(simpleParameter.identifier, isNotNull);
@@ -404,7 +404,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isDefaultFormalParameter);
-    DefaultFormalParameter defaultParameter = parameter;
+    var defaultParameter = parameter as DefaultFormalParameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNotNull);
@@ -430,7 +430,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isDefaultFormalParameter);
-    DefaultFormalParameter defaultParameter = parameter;
+    var defaultParameter = parameter as DefaultFormalParameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
@@ -450,7 +450,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isSimpleFormalParameter);
-    SimpleFormalParameter simpleParameter = parameter;
+    var simpleParameter = parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
     expect(simpleParameter.requiredKeyword, isNull);
     expect(simpleParameter.identifier, isNotNull);
@@ -465,7 +465,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isDefaultFormalParameter);
-    DefaultFormalParameter defaultParameter = parameter;
+    var defaultParameter = parameter as DefaultFormalParameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
@@ -486,7 +486,7 @@
         errors: [expectedError(ParserErrorCode.MODIFIER_OUT_OF_ORDER, 8, 8)]);
     expect(parameter, isNotNull);
     expect(parameter, isDefaultFormalParameter);
-    DefaultFormalParameter defaultParameter = parameter;
+    var defaultParameter = parameter as DefaultFormalParameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
@@ -506,7 +506,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isDefaultFormalParameter);
-    DefaultFormalParameter defaultParameter = parameter;
+    var defaultParameter = parameter as DefaultFormalParameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
@@ -526,7 +526,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isSimpleFormalParameter);
-    SimpleFormalParameter simpleParameter = parameter;
+    var simpleParameter = parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
     expect(simpleParameter.requiredKeyword, isNull);
     expect(simpleParameter.identifier, isNotNull);
@@ -541,7 +541,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isDefaultFormalParameter);
-    DefaultFormalParameter defaultParameter = parameter;
+    var defaultParameter = parameter as DefaultFormalParameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
@@ -561,7 +561,7 @@
         parseNNBDFormalParameter('required covariant A a : null', kind);
     expect(parameter, isNotNull);
     expect(parameter, isDefaultFormalParameter);
-    DefaultFormalParameter defaultParameter = parameter;
+    var defaultParameter = parameter as DefaultFormalParameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNotNull);
@@ -581,7 +581,7 @@
         parseNNBDFormalParameter('required final a : null', kind);
     expect(parameter, isNotNull);
     expect(parameter, isDefaultFormalParameter);
-    DefaultFormalParameter defaultParameter = parameter;
+    var defaultParameter = parameter as DefaultFormalParameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
@@ -601,7 +601,7 @@
         parseNNBDFormalParameter('required A a : null', kind);
     expect(parameter, isNotNull);
     expect(parameter, isDefaultFormalParameter);
-    DefaultFormalParameter defaultParameter = parameter;
+    var defaultParameter = parameter as DefaultFormalParameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
@@ -621,7 +621,7 @@
         parseNNBDFormalParameter('required var a : null', kind);
     expect(parameter, isNotNull);
     expect(parameter, isDefaultFormalParameter);
-    DefaultFormalParameter defaultParameter = parameter;
+    var defaultParameter = parameter as DefaultFormalParameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
@@ -642,7 +642,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isSimpleFormalParameter);
-    SimpleFormalParameter simpleParameter = parameter;
+    var simpleParameter = parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
     expect(simpleParameter.requiredKeyword, isNull);
     expect(simpleParameter.identifier, isNotNull);
@@ -657,7 +657,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isDefaultFormalParameter);
-    DefaultFormalParameter defaultParameter = parameter;
+    var defaultParameter = parameter as DefaultFormalParameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
@@ -677,7 +677,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isDefaultFormalParameter);
-    DefaultFormalParameter defaultParameter = parameter;
+    var defaultParameter = parameter as DefaultFormalParameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
@@ -697,7 +697,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isSimpleFormalParameter);
-    SimpleFormalParameter simpleParameter = parameter;
+    var simpleParameter = parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
     expect(simpleParameter.requiredKeyword, isNull);
     expect(simpleParameter.identifier, isNotNull);
@@ -712,7 +712,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isDefaultFormalParameter);
-    DefaultFormalParameter defaultParameter = parameter;
+    var defaultParameter = parameter as DefaultFormalParameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
@@ -732,7 +732,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isDefaultFormalParameter);
-    DefaultFormalParameter defaultParameter = parameter;
+    var defaultParameter = parameter as DefaultFormalParameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
@@ -752,7 +752,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isDefaultFormalParameter);
-    DefaultFormalParameter defaultParameter = parameter;
+    var defaultParameter = parameter as DefaultFormalParameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
@@ -772,7 +772,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isSimpleFormalParameter);
-    SimpleFormalParameter simpleParameter = parameter;
+    var simpleParameter = parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
     expect(simpleParameter.requiredKeyword, isNull);
     expect(simpleParameter.identifier, isNotNull);
@@ -787,7 +787,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isDefaultFormalParameter);
-    DefaultFormalParameter defaultParameter = parameter;
+    var defaultParameter = parameter as DefaultFormalParameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
@@ -808,7 +808,7 @@
         errors: [expectedError(ParserErrorCode.MODIFIER_OUT_OF_ORDER, 6, 8)]);
     expect(parameter, isNotNull);
     expect(parameter, isDefaultFormalParameter);
-    DefaultFormalParameter defaultParameter = parameter;
+    var defaultParameter = parameter as DefaultFormalParameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
@@ -902,16 +902,16 @@
     expect(parameters, hasLength(2));
 
     expect(parameters[0], isSimpleFormalParameter);
-    SimpleFormalParameter required = parameters[0];
+    var required = parameters[0] as SimpleFormalParameter;
     expect(required.identifier, isNull);
     expect(required.type, isTypeName);
     expect((required.type as TypeName).name.name, 'A');
 
     expect(parameters[1], isDefaultFormalParameter);
-    DefaultFormalParameter named = parameters[1];
+    var named = parameters[1] as DefaultFormalParameter;
     expect(named.identifier, isNotNull);
     expect(named.parameter, isSimpleFormalParameter);
-    SimpleFormalParameter simple = named.parameter;
+    var simple = named.parameter as SimpleFormalParameter;
     expect(simple.type, isTypeName);
     expect((simple.type as TypeName).name.name, 'B');
   }
@@ -1014,11 +1014,11 @@
     expect(list.leftDelimiter, isNull);
     expect(list.parameters, hasLength(1));
     // TODO(danrubel): Investigate and improve recovery of parameter type/name.
-    SimpleFormalParameter parameter = list.parameters[0];
+    var parameter = list.parameters[0] as SimpleFormalParameter;
     expect(parameter.toSource(), 'io.File ');
-    expect(parameter.identifier.token.isSynthetic, isTrue);
-    TypeName type = parameter.type;
-    PrefixedIdentifier typeName = type.name;
+    expect(parameter.identifier!.token.isSynthetic, isTrue);
+    var type = parameter.type as TypeName;
+    var typeName = type.name as PrefixedIdentifier;
     expect(typeName.prefix.token.isSynthetic, isFalse);
     expect(typeName.identifier.token.isSynthetic, isFalse);
     expect(list.rightDelimiter, isNull);
@@ -1035,11 +1035,11 @@
     expect(list.leftDelimiter, isNull);
     expect(list.parameters, hasLength(1));
     // TODO(danrubel): Investigate and improve recovery of parameter type/name.
-    SimpleFormalParameter parameter = list.parameters[0];
+    var parameter = list.parameters[0] as SimpleFormalParameter;
     expect(parameter.toSource(), 'io. ');
-    expect(parameter.identifier.token.isSynthetic, isTrue);
-    TypeName type = parameter.type;
-    PrefixedIdentifier typeName = type.name;
+    expect(parameter.identifier!.token.isSynthetic, isTrue);
+    var type = parameter.type as TypeName;
+    var typeName = type.name as PrefixedIdentifier;
     expect(typeName.prefix.token.isSynthetic, isFalse);
     expect(typeName.identifier.token.isSynthetic, isTrue);
     expect(list.rightDelimiter, isNull);
@@ -1066,7 +1066,7 @@
         errorCodes: [ParserErrorCode.EXTRANEOUS_MODIFIER]);
     expect(parameter, isNotNull);
     expect(parameter, isFieldFormalParameter);
-    FieldFormalParameter fieldParameter = parameter;
+    var fieldParameter = parameter as FieldFormalParameter;
     expect(fieldParameter.keyword, isNotNull);
     expect(fieldParameter.type, isNull);
     expect(fieldParameter.identifier, isNotNull);
@@ -1079,7 +1079,7 @@
         errorCodes: [ParserErrorCode.EXTRANEOUS_MODIFIER]);
     expect(parameter, isNotNull);
     expect(parameter, isFieldFormalParameter);
-    FieldFormalParameter fieldParameter = parameter;
+    var fieldParameter = parameter as FieldFormalParameter;
     expect(fieldParameter.keyword, isNotNull);
     expect(fieldParameter.type, isNotNull);
     expect(fieldParameter.identifier, isNotNull);
@@ -1092,7 +1092,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isFieldFormalParameter);
-    FieldFormalParameter fieldParameter = parameter;
+    var fieldParameter = parameter as FieldFormalParameter;
     expect(fieldParameter.keyword, isNotNull);
     expect(fieldParameter.type, isNull);
     expect(fieldParameter.identifier, isNotNull);
@@ -1105,7 +1105,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isFieldFormalParameter);
-    FieldFormalParameter fieldParameter = parameter;
+    var fieldParameter = parameter as FieldFormalParameter;
     expect(fieldParameter.keyword, isNotNull);
     expect(fieldParameter.type, isNotNull);
     expect(fieldParameter.identifier, isNotNull);
@@ -1117,11 +1117,11 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isFieldFormalParameter);
-    FieldFormalParameter fieldParameter = parameter;
+    var fieldParameter = parameter as FieldFormalParameter;
     expect(fieldParameter.keyword, isNull);
     expect(fieldParameter.type, isNull);
     expect(fieldParameter.identifier, isNotNull);
-    FormalParameterList parameterList = fieldParameter.parameters;
+    FormalParameterList parameterList = fieldParameter.parameters!;
     expect(parameterList, isNotNull);
     expect(parameterList.parameters, hasLength(1));
   }
@@ -1131,11 +1131,11 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isFieldFormalParameter);
-    FieldFormalParameter fieldParameter = parameter;
+    var fieldParameter = parameter as FieldFormalParameter;
     expect(fieldParameter.keyword, isNull);
     expect(fieldParameter.type, isNull);
     expect(fieldParameter.identifier, isNotNull);
-    FormalParameterList parameterList = fieldParameter.parameters;
+    FormalParameterList parameterList = fieldParameter.parameters!;
     expect(parameterList, isNotNull);
     expect(parameterList.parameters, hasLength(0));
   }
@@ -1150,7 +1150,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isFieldFormalParameter);
-    FieldFormalParameter fieldParameter = parameter;
+    var fieldParameter = parameter as FieldFormalParameter;
     expect(fieldParameter.keyword, isNull);
     expect(fieldParameter.type, isNull);
     expect(fieldParameter.identifier, isNotNull);
@@ -1162,7 +1162,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isFieldFormalParameter);
-    FieldFormalParameter fieldParameter = parameter;
+    var fieldParameter = parameter as FieldFormalParameter;
     expect(fieldParameter.keyword, isNull);
     expect(fieldParameter.type, isNotNull);
     expect(fieldParameter.identifier, isNotNull);
@@ -1174,7 +1174,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isFieldFormalParameter);
-    FieldFormalParameter fieldParameter = parameter;
+    var fieldParameter = parameter as FieldFormalParameter;
     expect(fieldParameter.keyword, isNotNull);
     expect(fieldParameter.type, isNull);
     expect(fieldParameter.identifier, isNotNull);
@@ -1209,7 +1209,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isFunctionTypedFormalParameter);
-    FunctionTypedFormalParameter functionParameter = parameter;
+    var functionParameter = parameter as FunctionTypedFormalParameter;
     expect(functionParameter.returnType, isNull);
     expect(functionParameter.identifier, isNotNull);
     expect(functionParameter.typeParameters, isNull);
@@ -1223,7 +1223,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isFunctionTypedFormalParameter);
-    FunctionTypedFormalParameter functionParameter = parameter;
+    var functionParameter = parameter as FunctionTypedFormalParameter;
     expect(functionParameter.covariantKeyword, isNotNull);
     expect(functionParameter.returnType, isNull);
     expect(functionParameter.identifier, isNotNull);
@@ -1233,12 +1233,12 @@
   }
 
   void test_parseNormalFormalParameter_function_noType_nullable() {
-    NormalFormalParameter parameter =
-        parseNNBDFormalParameter('a()?', ParameterKind.REQUIRED);
+    var parameter = parseNNBDFormalParameter('a()?', ParameterKind.REQUIRED)
+        as NormalFormalParameter;
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isFunctionTypedFormalParameter);
-    FunctionTypedFormalParameter functionParameter = parameter;
+    var functionParameter = parameter as FunctionTypedFormalParameter;
     expect(functionParameter.returnType, isNull);
     expect(functionParameter.identifier, isNotNull);
     expect(functionParameter.typeParameters, isNull);
@@ -1252,7 +1252,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isFunctionTypedFormalParameter);
-    FunctionTypedFormalParameter functionParameter = parameter;
+    var functionParameter = parameter as FunctionTypedFormalParameter;
     expect(functionParameter.returnType, isNull);
     expect(functionParameter.identifier, isNotNull);
     expect(functionParameter.typeParameters, isNotNull);
@@ -1265,7 +1265,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isFunctionTypedFormalParameter);
-    FunctionTypedFormalParameter functionParameter = parameter;
+    var functionParameter = parameter as FunctionTypedFormalParameter;
     expect(functionParameter.returnType, isNotNull);
     expect(functionParameter.identifier, isNotNull);
     expect(functionParameter.typeParameters, isNull);
@@ -1278,7 +1278,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isFunctionTypedFormalParameter);
-    FunctionTypedFormalParameter functionParameter = parameter;
+    var functionParameter = parameter as FunctionTypedFormalParameter;
     expect(functionParameter.returnType, isNotNull);
     expect(functionParameter.identifier, isNotNull);
     expect(functionParameter.typeParameters, isNotNull);
@@ -1292,7 +1292,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isFunctionTypedFormalParameter);
-    FunctionTypedFormalParameter functionParameter = parameter;
+    var functionParameter = parameter as FunctionTypedFormalParameter;
     expect(functionParameter.covariantKeyword, isNotNull);
     expect(functionParameter.returnType, isNotNull);
     expect(functionParameter.identifier, isNotNull);
@@ -1306,7 +1306,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isFunctionTypedFormalParameter);
-    FunctionTypedFormalParameter functionParameter = parameter;
+    var functionParameter = parameter as FunctionTypedFormalParameter;
     expect(functionParameter.returnType, isNotNull);
     expect(functionParameter.identifier, isNotNull);
     expect(functionParameter.typeParameters, isNull);
@@ -1319,7 +1319,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isFunctionTypedFormalParameter);
-    FunctionTypedFormalParameter functionParameter = parameter;
+    var functionParameter = parameter as FunctionTypedFormalParameter;
     expect(functionParameter.returnType, isNotNull);
     expect(functionParameter.identifier, isNotNull);
     expect(functionParameter.typeParameters, isNotNull);
@@ -1327,6 +1327,7 @@
     expect(functionParameter.question, isNull);
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44522')
   void test_parseNormalFormalParameter_function_withDocComment() {
     var parameter = parseFormalParameter('/// Doc\nf()', ParameterKind.REQUIRED)
         as FunctionTypedFormalParameter;
@@ -1338,7 +1339,7 @@
         errorCodes: [ParserErrorCode.EXTRANEOUS_MODIFIER]);
     expect(parameter, isNotNull);
     expect(parameter, isSimpleFormalParameter);
-    SimpleFormalParameter simpleParameter = parameter;
+    var simpleParameter = parameter as SimpleFormalParameter;
     expect(simpleParameter.keyword, isNotNull);
     expect(simpleParameter.type, isNull);
     expect(simpleParameter.identifier, isNotNull);
@@ -1349,7 +1350,7 @@
         errorCodes: [ParserErrorCode.EXTRANEOUS_MODIFIER]);
     expect(parameter, isNotNull);
     expect(parameter, isSimpleFormalParameter);
-    SimpleFormalParameter simpleParameter = parameter;
+    var simpleParameter = parameter as SimpleFormalParameter;
     expect(simpleParameter.keyword, isNotNull);
     expect(simpleParameter.type, isNotNull);
     expect(simpleParameter.identifier, isNotNull);
@@ -1360,7 +1361,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isSimpleFormalParameter);
-    SimpleFormalParameter simpleParameter = parameter;
+    var simpleParameter = parameter as SimpleFormalParameter;
     expect(simpleParameter.keyword, isNotNull);
     expect(simpleParameter.type, isNull);
     expect(simpleParameter.identifier, isNotNull);
@@ -1371,7 +1372,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isSimpleFormalParameter);
-    SimpleFormalParameter simpleParameter = parameter;
+    var simpleParameter = parameter as SimpleFormalParameter;
     expect(simpleParameter.keyword, isNotNull);
     expect(simpleParameter.type, isNotNull);
     expect(simpleParameter.identifier, isNotNull);
@@ -1383,7 +1384,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isSimpleFormalParameter);
-    SimpleFormalParameter simpleParameter = parameter;
+    var simpleParameter = parameter as SimpleFormalParameter;
     expect(simpleParameter.keyword, isNull);
     expect(simpleParameter.type, isNotNull);
     expect(simpleParameter.identifier, isNull);
@@ -1394,7 +1395,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isSimpleFormalParameter);
-    SimpleFormalParameter simpleParameter = parameter;
+    var simpleParameter = parameter as SimpleFormalParameter;
     expect(simpleParameter.keyword, isNull);
     expect(simpleParameter.type, isNull);
     expect(simpleParameter.identifier, isNotNull);
@@ -1405,7 +1406,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isSimpleFormalParameter);
-    SimpleFormalParameter simpleParameter = parameter;
+    var simpleParameter = parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
     expect(simpleParameter.keyword, isNull);
     expect(simpleParameter.type, isNull);
@@ -1417,7 +1418,7 @@
     expect(parameter, isNotNull);
     assertNoErrors();
     expect(parameter, isSimpleFormalParameter);
-    SimpleFormalParameter simpleParameter = parameter;
+    var simpleParameter = parameter as SimpleFormalParameter;
     expect(simpleParameter.keyword, isNull);
     expect(simpleParameter.type, isNotNull);
     expect(simpleParameter.identifier, isNotNull);
diff --git a/pkg/analyzer/test/generated/invalid_code_test.dart b/pkg/analyzer/test/generated/invalid_code_test.dart
index 0d4c949..601a4c6 100644
--- a/pkg/analyzer/test/generated/invalid_code_test.dart
+++ b/pkg/analyzer/test/generated/invalid_code_test.dart
@@ -309,6 +309,7 @@
 ''');
   }
 
+  @FailingTest(reason: 'We should set the type of v')
   test_fuzz_38953() async {
     // When we enter a directive, we should stop using the element walker
     // of the unit, just like when we enter a method body. Even though using
diff --git a/pkg/analyzer/test/generated/nnbd_parser_test.dart b/pkg/analyzer/test/generated/nnbd_parser_test.dart
index 6fd7547..c1376ea 100644
--- a/pkg/analyzer/test/generated/nnbd_parser_test.dart
+++ b/pkg/analyzer/test/generated/nnbd_parser_test.dart
@@ -4,7 +4,7 @@
 
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/token.dart' show Token, TokenType;
+import 'package:analyzer/dart/ast/token.dart' show TokenType;
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/scanner/scanner.dart';
@@ -25,9 +25,9 @@
 class NNBDParserTest extends FastaParserTestCase {
   @override
   CompilationUnit parseCompilationUnit(String content,
-          {List<ErrorCode> codes,
-          List<ExpectedError> errors,
-          FeatureSet featureSet}) =>
+          {List<ErrorCode>? codes,
+          List<ExpectedError>? errors,
+          FeatureSet? featureSet}) =>
       super.parseCompilationUnit(content,
           codes: codes,
           errors: errors,
@@ -65,14 +65,14 @@
     expect(expression.toSource(), "f1!(42)");
 
     var functionExpression = expression.function as PostfixExpression;
-    SimpleIdentifier identifier = functionExpression.operand;
+    var identifier = functionExpression.operand as SimpleIdentifier;
     expect(identifier.name, 'f1');
     expect(functionExpression.operator.lexeme, '!');
 
     expect(expression.typeArguments, null);
 
     expect(expression.argumentList.arguments.length, 1);
-    IntegerLiteral argument = expression.argumentList.arguments.single;
+    var argument = expression.argumentList.arguments.single as IntegerLiteral;
     expect(argument.value, 42);
   }
 
@@ -90,62 +90,62 @@
     expect(expression.toSource(), "f2!<int>(42)");
 
     var functionExpression = expression.function as PostfixExpression;
-    SimpleIdentifier identifier = functionExpression.operand;
+    var identifier = functionExpression.operand as SimpleIdentifier;
     expect(identifier.name, 'f2');
     expect(functionExpression.operator.lexeme, '!');
 
-    expect(expression.typeArguments.arguments.length, 1);
-    TypeName typeArgument = expression.typeArguments.arguments.single;
+    expect(expression.typeArguments!.arguments.length, 1);
+    var typeArgument = expression.typeArguments!.arguments.single as TypeName;
     expect(typeArgument.name.name, "int");
 
     expect(expression.argumentList.arguments.length, 1);
-    IntegerLiteral argument = expression.argumentList.arguments.single;
+    var argument = expression.argumentList.arguments.single as IntegerLiteral;
     expect(argument.value, 42);
   }
 
   void test_bangQuestionIndex() {
     // http://dartbug.com/41177
     CompilationUnit unit = parseCompilationUnit('f(dynamic a) { a!?[0]; }');
-    FunctionDeclaration funct = unit.declarations[0];
-    BlockFunctionBody body = funct.functionExpression.body;
+    var funct = unit.declarations[0] as FunctionDeclaration;
+    var body = funct.functionExpression.body as BlockFunctionBody;
 
-    ExpressionStatement statement = body.block.statements[0];
-    IndexExpression expression = statement.expression;
+    var statement = body.block.statements[0] as ExpressionStatement;
+    var expression = statement.expression as IndexExpression;
 
-    IntegerLiteral index = expression.index;
+    var index = expression.index as IntegerLiteral;
     expect(index.value, 0);
 
-    Token question = expression.question;
+    var question = expression.question!;
     expect(question, isNotNull);
     expect(question.lexeme, "?");
 
-    PostfixExpression target = expression.target;
-    SimpleIdentifier identifier = target.operand;
+    var target = expression.target as PostfixExpression;
+    var identifier = target.operand as SimpleIdentifier;
     expect(identifier.name, 'a');
     expect(target.operator.lexeme, '!');
   }
 
   void test_binary_expression_statement() {
     final unit = parseCompilationUnit('D? foo(X? x) { X ?? x2; }');
-    FunctionDeclaration funct = unit.declarations[0];
-    BlockFunctionBody body = funct.functionExpression.body;
-    ExpressionStatement statement = body.block.statements[0];
-    BinaryExpression expression = statement.expression;
-    SimpleIdentifier lhs = expression.leftOperand;
+    var funct = unit.declarations[0] as FunctionDeclaration;
+    var body = funct.functionExpression.body as BlockFunctionBody;
+    var statement = body.block.statements[0] as ExpressionStatement;
+    var expression = statement.expression as BinaryExpression;
+    var lhs = expression.leftOperand as SimpleIdentifier;
     expect(lhs.name, 'X');
     expect(expression.operator.lexeme, '??');
-    SimpleIdentifier rhs = expression.rightOperand;
+    var rhs = expression.rightOperand as SimpleIdentifier;
     expect(rhs.name, 'x2');
   }
 
   void test_cascade_withNullCheck_indexExpression() {
     var unit = parseCompilationUnit('main() { a?..[27]; }');
-    FunctionDeclaration funct = unit.declarations[0];
-    BlockFunctionBody body = funct.functionExpression.body;
-    ExpressionStatement statement = body.block.statements[0];
-    CascadeExpression cascade = statement.expression;
-    IndexExpression indexExpression = cascade.cascadeSections[0];
-    expect(indexExpression.period.lexeme, '?..');
+    var funct = unit.declarations[0] as FunctionDeclaration;
+    var body = funct.functionExpression.body as BlockFunctionBody;
+    var statement = body.block.statements[0] as ExpressionStatement;
+    var cascade = statement.expression as CascadeExpression;
+    var indexExpression = cascade.cascadeSections[0] as IndexExpression;
+    expect(indexExpression.period!.lexeme, '?..');
     expect(indexExpression.toSource(), '?..[27]');
   }
 
@@ -157,22 +157,22 @@
 
   void test_cascade_withNullCheck_methodInvocation() {
     var unit = parseCompilationUnit('main() { a?..foo(); }');
-    FunctionDeclaration funct = unit.declarations[0];
-    BlockFunctionBody body = funct.functionExpression.body;
-    ExpressionStatement statement = body.block.statements[0];
-    CascadeExpression cascade = statement.expression;
-    MethodInvocation invocation = cascade.cascadeSections[0];
-    expect(invocation.operator.lexeme, '?..');
+    var funct = unit.declarations[0] as FunctionDeclaration;
+    var body = funct.functionExpression.body as BlockFunctionBody;
+    var statement = body.block.statements[0] as ExpressionStatement;
+    var cascade = statement.expression as CascadeExpression;
+    var invocation = cascade.cascadeSections[0] as MethodInvocation;
+    expect(invocation.operator!.lexeme, '?..');
     expect(invocation.toSource(), '?..foo()');
   }
 
   void test_cascade_withNullCheck_propertyAccess() {
     var unit = parseCompilationUnit('main() { a?..x27; }');
-    FunctionDeclaration funct = unit.declarations[0];
-    BlockFunctionBody body = funct.functionExpression.body;
-    ExpressionStatement statement = body.block.statements[0];
-    CascadeExpression cascade = statement.expression;
-    PropertyAccess propertyAccess = cascade.cascadeSections[0];
+    var funct = unit.declarations[0] as FunctionDeclaration;
+    var body = funct.functionExpression.body as BlockFunctionBody;
+    var statement = body.block.statements[0] as ExpressionStatement;
+    var cascade = statement.expression as CascadeExpression;
+    var propertyAccess = cascade.cascadeSections[0] as PropertyAccess;
     expect(propertyAccess.operator.lexeme, '?..');
     expect(propertyAccess.toSource(), '?..x27');
   }
@@ -263,19 +263,19 @@
 
   void test_indexed() {
     CompilationUnit unit = parseCompilationUnit('main() { a[7]; }');
-    FunctionDeclaration method = unit.declarations[0];
-    BlockFunctionBody body = method.functionExpression.body;
-    ExpressionStatement statement = body.block.statements[0];
-    IndexExpression expression = statement.expression;
+    var method = unit.declarations[0] as FunctionDeclaration;
+    var body = method.functionExpression.body as BlockFunctionBody;
+    var statement = body.block.statements[0] as ExpressionStatement;
+    var expression = statement.expression as IndexExpression;
     expect(expression.leftBracket.lexeme, '[');
   }
 
   void test_indexed_nullAware() {
     CompilationUnit unit = parseCompilationUnit('main() { a?[7]; }');
-    FunctionDeclaration method = unit.declarations[0];
-    BlockFunctionBody body = method.functionExpression.body;
-    ExpressionStatement statement = body.block.statements[0];
-    IndexExpression expression = statement.expression;
+    var method = unit.declarations[0] as FunctionDeclaration;
+    var body = method.functionExpression.body as BlockFunctionBody;
+    var statement = body.block.statements[0] as ExpressionStatement;
+    var expression = statement.expression as IndexExpression;
     expect(expression.question, isNotNull);
     expect(expression.leftBracket.lexeme, '[');
     expect(expression.rightBracket.lexeme, ']');
@@ -287,11 +287,11 @@
 // @dart = 2.2
 main() { a?[7]; }''',
         errors: [expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 25, 1)]);
-    FunctionDeclaration method = unit.declarations[0];
-    BlockFunctionBody body = method.functionExpression.body;
-    ExpressionStatement statement = body.block.statements[0];
-    IndexExpressionImpl expression = statement.expression;
-    expect(expression.target.toSource(), 'a');
+    var method = unit.declarations[0] as FunctionDeclaration;
+    var body = method.functionExpression.body as BlockFunctionBody;
+    var statement = body.block.statements[0] as ExpressionStatement;
+    var expression = statement.expression as IndexExpressionImpl;
+    expect(expression.target!.toSource(), 'a');
     expect(expression.question, isNotNull);
     expect(expression.leftBracket.lexeme, '[');
     expect(expression.rightBracket.lexeme, ']');
@@ -307,12 +307,12 @@
   void test_is_nullable() {
     CompilationUnit unit =
         parseCompilationUnit('main() { x is String? ? (x + y) : z; }');
-    FunctionDeclaration function = unit.declarations[0];
-    BlockFunctionBody body = function.functionExpression.body;
-    ExpressionStatement statement = body.block.statements[0];
-    ConditionalExpression expression = statement.expression;
+    var function = unit.declarations[0] as FunctionDeclaration;
+    var body = function.functionExpression.body as BlockFunctionBody;
+    var statement = body.block.statements[0] as ExpressionStatement;
+    var expression = statement.expression as ConditionalExpression;
 
-    IsExpression condition = expression.condition;
+    var condition = expression.condition as IsExpression;
     expect((condition.type as NamedType).question, isNotNull);
     Expression thenExpression = expression.thenExpression;
     expect(thenExpression, isParenthesizedExpression);
@@ -323,13 +323,13 @@
   void test_is_nullable_parenthesis() {
     CompilationUnit unit =
         parseCompilationUnit('main() { (x is String?) ? (x + y) : z; }');
-    FunctionDeclaration function = unit.declarations[0];
-    BlockFunctionBody body = function.functionExpression.body;
-    ExpressionStatement statement = body.block.statements[0];
-    ConditionalExpression expression = statement.expression;
+    var function = unit.declarations[0] as FunctionDeclaration;
+    var body = function.functionExpression.body as BlockFunctionBody;
+    var statement = body.block.statements[0] as ExpressionStatement;
+    var expression = statement.expression as ConditionalExpression;
 
-    ParenthesizedExpression condition = expression.condition;
-    IsExpression isExpression = condition.expression;
+    var condition = expression.condition as ParenthesizedExpression;
+    var isExpression = condition.expression as IsExpression;
     expect((isExpression.type as NamedType).question, isNotNull);
     Expression thenExpression = expression.thenExpression;
     expect(thenExpression, isParenthesizedExpression);
@@ -387,35 +387,39 @@
   Foo(Object? o) : x = o as String?, y = 0;
 }
 ''');
-    ClassDeclaration classDeclaration = unit.declarations.first;
-    ConstructorDeclaration constructor = classDeclaration.getConstructor(null);
+    var classDeclaration = unit.declarations.first as ClassDeclaration;
+    var constructor =
+        classDeclaration.getConstructor(null) as ConstructorDeclaration;
 
     // Object? o
-    SimpleFormalParameter parameter = constructor.parameters.parameters.single;
-    expect(parameter.identifier.name, 'o');
-    TypeName type = parameter.type;
-    expect(type.question.lexeme, '?');
+    var parameter =
+        constructor.parameters.parameters.single as SimpleFormalParameter;
+    expect(parameter.identifier!.name, 'o');
+    var type = parameter.type as TypeName;
+    expect(type.question!.lexeme, '?');
     expect(type.name.name, 'Object');
 
     expect(constructor.initializers.length, 2);
 
     // o as String?
     {
-      ConstructorFieldInitializer initializer = constructor.initializers[0];
+      var initializer =
+          constructor.initializers[0] as ConstructorFieldInitializer;
       expect(initializer.fieldName.name, 'x');
-      AsExpression expression = initializer.expression;
-      SimpleIdentifier identifier = expression.expression;
+      var expression = initializer.expression as AsExpression;
+      var identifier = expression.expression as SimpleIdentifier;
       expect(identifier.name, 'o');
-      TypeName expressionType = expression.type;
-      expect(expressionType.question.lexeme, '?');
+      var expressionType = expression.type as TypeName;
+      expect(expressionType.question!.lexeme, '?');
       expect(expressionType.name.name, 'String');
     }
 
     // y = 0
     {
-      ConstructorFieldInitializer initializer = constructor.initializers[1];
+      var initializer =
+          constructor.initializers[1] as ConstructorFieldInitializer;
       expect(initializer.fieldName.name, 'y');
-      IntegerLiteral expression = initializer.expression;
+      var expression = initializer.expression as IntegerLiteral;
       expect(expression.value, 0);
     }
   }
@@ -429,41 +433,45 @@
   Foo(Object? o) : y = o is String? ? o.length : null, x = null;
 }
 ''');
-    ClassDeclaration classDeclaration = unit.declarations.first;
-    ConstructorDeclaration constructor = classDeclaration.getConstructor(null);
+    var classDeclaration = unit.declarations.first as ClassDeclaration;
+    var constructor =
+        classDeclaration.getConstructor(null) as ConstructorDeclaration;
 
     // Object? o
-    SimpleFormalParameter parameter = constructor.parameters.parameters.single;
-    expect(parameter.identifier.name, 'o');
-    TypeName type = parameter.type;
-    expect(type.question.lexeme, '?');
+    var parameter =
+        constructor.parameters.parameters.single as SimpleFormalParameter;
+    expect(parameter.identifier!.name, 'o');
+    var type = parameter.type as TypeName;
+    expect(type.question!.lexeme, '?');
     expect(type.name.name, 'Object');
 
     expect(constructor.initializers.length, 2);
 
     // y = o is String? ? o.length : null
     {
-      ConstructorFieldInitializer initializer = constructor.initializers[0];
+      var initializer =
+          constructor.initializers[0] as ConstructorFieldInitializer;
       expect(initializer.fieldName.name, 'y');
-      ConditionalExpression expression = initializer.expression;
-      IsExpression condition = expression.condition;
-      SimpleIdentifier identifier = condition.expression;
+      var expression = initializer.expression as ConditionalExpression;
+      var condition = expression.condition as IsExpression;
+      var identifier = condition.expression as SimpleIdentifier;
       expect(identifier.name, 'o');
-      TypeName expressionType = condition.type;
-      expect(expressionType.question.lexeme, '?');
+      var expressionType = condition.type as TypeName;
+      expect(expressionType.question!.lexeme, '?');
       expect(expressionType.name.name, 'String');
-      PrefixedIdentifier thenExpression = expression.thenExpression;
+      var thenExpression = expression.thenExpression as PrefixedIdentifier;
       expect(thenExpression.identifier.name, 'length');
       expect(thenExpression.prefix.name, 'o');
-      NullLiteral elseExpression = expression.elseExpression;
+      var elseExpression = expression.elseExpression as NullLiteral;
       expect(elseExpression, isNotNull);
     }
 
     // x = null
     {
-      ConstructorFieldInitializer initializer = constructor.initializers[1];
+      var initializer =
+          constructor.initializers[1] as ConstructorFieldInitializer;
       expect(initializer.fieldName.name, 'x');
-      NullLiteral expression = initializer.expression;
+      var expression = initializer.expression as NullLiteral;
       expect(expression, isNotNull);
     }
   }
@@ -478,52 +486,57 @@
   Foo(Object? o) : y = o is String ? o.length : null, x = null;
 }
 ''');
-    ClassDeclaration classDeclaration = unit.declarations.first;
-    ConstructorDeclaration constructor = classDeclaration.getConstructor(null);
+    var classDeclaration = unit.declarations.first as ClassDeclaration;
+    var constructor =
+        classDeclaration.getConstructor(null) as ConstructorDeclaration;
 
     // Object? o
-    SimpleFormalParameter parameter = constructor.parameters.parameters.single;
-    expect(parameter.identifier.name, 'o');
-    TypeName type = parameter.type;
-    expect(type.question.lexeme, '?');
+    var parameter =
+        constructor.parameters.parameters.single as SimpleFormalParameter;
+    expect(parameter.identifier!.name, 'o');
+    var type = parameter.type as TypeName;
+    expect(type.question!.lexeme, '?');
     expect(type.name.name, 'Object');
 
     expect(constructor.initializers.length, 2);
 
     // y = o is String ? o.length : null
     {
-      ConstructorFieldInitializer initializer = constructor.initializers[0];
+      var initializer =
+          constructor.initializers[0] as ConstructorFieldInitializer;
       expect(initializer.fieldName.name, 'y');
-      ConditionalExpression expression = initializer.expression;
-      IsExpression condition = expression.condition;
-      SimpleIdentifier identifier = condition.expression;
+      var expression = initializer.expression as ConditionalExpression;
+      var condition = expression.condition as IsExpression;
+      var identifier = condition.expression as SimpleIdentifier;
       expect(identifier.name, 'o');
-      TypeName expressionType = condition.type;
+      var expressionType = condition.type as TypeName;
       expect(expressionType.question, isNull);
       expect(expressionType.name.name, 'String');
-      PrefixedIdentifier thenExpression = expression.thenExpression;
+      var thenExpression = expression.thenExpression as PrefixedIdentifier;
       expect(thenExpression.identifier.name, 'length');
       expect(thenExpression.prefix.name, 'o');
-      NullLiteral elseExpression = expression.elseExpression;
+      var elseExpression = expression.elseExpression as NullLiteral;
       expect(elseExpression, isNotNull);
     }
 
     // x = null
     {
-      ConstructorFieldInitializer initializer = constructor.initializers[1];
+      var initializer =
+          constructor.initializers[1] as ConstructorFieldInitializer;
       expect(initializer.fieldName.name, 'x');
-      NullLiteral expression = initializer.expression;
+      var expression = initializer.expression as NullLiteral;
       expect(expression, isNotNull);
     }
   }
 
   void test_nullCheck() {
     var unit = parseCompilationUnit('f(int? y) { var x = y!; }');
-    FunctionDeclaration function = unit.declarations[0];
-    BlockFunctionBody body = function.functionExpression.body;
-    VariableDeclarationStatement statement = body.block.statements[0];
-    PostfixExpression expression = statement.variables.variables[0].initializer;
-    SimpleIdentifier identifier = expression.operand;
+    var function = unit.declarations[0] as FunctionDeclaration;
+    var body = function.functionExpression.body as BlockFunctionBody;
+    var statement = body.block.statements[0] as VariableDeclarationStatement;
+    var expression =
+        statement.variables.variables[0].initializer as PostfixExpression;
+    var identifier = expression.operand as SimpleIdentifier;
     expect(identifier.name, 'y');
     expect(expression.operator.lexeme, '!');
   }
@@ -535,10 +548,11 @@
           expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 21, 1),
         ],
         featureSet: preNonNullable);
-    FunctionDeclaration function = unit.declarations[0];
-    BlockFunctionBody body = function.functionExpression.body;
-    VariableDeclarationStatement statement = body.block.statements[0];
-    SimpleIdentifier identifier = statement.variables.variables[0].initializer;
+    var function = unit.declarations[0] as FunctionDeclaration;
+    var body = function.functionExpression.body as BlockFunctionBody;
+    var statement = body.block.statements[0] as VariableDeclarationStatement;
+    var identifier =
+        statement.variables.variables[0].initializer as SimpleIdentifier;
     expect(identifier.name, 'y');
   }
 
diff --git a/pkg/analyzer/test/generated/non_error_resolver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_test.dart
index 8bfa672..67216c3 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -683,8 +683,8 @@
 class D {}
 class E {}
 ''');
-    CompilationUnit unit = result.unit;
-    ClassElement classC = unit.declaredElement.getType('C');
+    CompilationUnit unit = result.unit!;
+    ClassElement classC = unit.declaredElement!.getType('C')!;
     expect(classC.documentationComment, isNotNull);
   }
 
@@ -1668,8 +1668,8 @@
 
 class C extends A<B> with M {}
 ''');
-    CompilationUnit unit = result.unit;
-    ClassElement classC = unit.declaredElement.getType('C');
+    CompilationUnit unit = result.unit!;
+    ClassElement classC = unit.declaredElement!.getType('C')!;
     expect(classC.mixins, hasLength(1));
     assertType(classC.mixins[0], 'M<B>');
   }
@@ -1690,8 +1690,8 @@
         1,
       ),
     ]);
-    CompilationUnit unit = result.unit;
-    ClassElement classC = unit.declaredElement.getType('C');
+    CompilationUnit unit = result.unit!;
+    ClassElement classC = unit.declaredElement!.getType('C')!;
     expect(classC.mixins, hasLength(1));
     assertType(classC.mixins[0], 'M<int, String>');
   }
@@ -1706,8 +1706,8 @@
 
 class C extends A<List<B>> with M {}
 ''');
-    CompilationUnit unit = result.unit;
-    ClassElement classC = unit.declaredElement.getType('C');
+    CompilationUnit unit = result.unit!;
+    ClassElement classC = unit.declaredElement!.getType('C')!;
     expect(classC.mixins, hasLength(1));
     assertType(classC.mixins[0], 'M<B>');
   }
@@ -2153,7 +2153,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>');
@@ -2333,7 +2333,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]);
   }
 
@@ -2350,7 +2350,7 @@
 class Base implements A1<int> {}
 class C = Base with B;
 ''');
-    var bReference = result.unit.declaredElement.getType('C').mixins[0];
+    var bReference = result.unit!.declaredElement!.getType('C')!.mixins[0];
     assertType(bReference.typeArguments[0], 'int');
   }
 
@@ -2390,10 +2390,10 @@
 ''', [
       error(HintCode.UNUSED_LOCAL_VARIABLE, 135, 1),
     ]);
-    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;
+    var xElem = xDecl.variables.variables[0].declaredElement!;
     assertType(xElem.type, 'int');
   }
 
@@ -2858,25 +2858,25 @@
 @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();
+      final value = metadata.elementAnnotation!.computeConstantValue()!;
       expect(value, isNotNull);
       assertType(value.type, 'B');
-      final unbounded = value.getField('unbounded');
-      final bounded = value.getField('bounded');
+      final unbounded = value.getField('unbounded')!;
+      final bounded = value.getField('bounded')!;
       if (!unbounded.isNull) {
         expect(bounded.isNull, true);
         assertType(unbounded.type, 'Unbounded<dynamic>');
-        expect(unbounded.type.typeArguments, hasLength(1));
-        expect(unbounded.type.typeArguments[0].isDynamic, isTrue);
+        expect(unbounded.type!.typeArguments, hasLength(1));
+        expect(unbounded.type!.typeArguments[0].isDynamic, isTrue);
       } else {
         expect(unbounded.isNull, true);
         assertType(bounded.type, 'Bounded<String>');
-        expect(bounded.type.typeArguments, hasLength(1));
-        assertType(bounded.type.typeArguments[0], 'String');
+        expect(bounded.type!.typeArguments, hasLength(1));
+        assertType(bounded.type!.typeArguments[0], 'String');
       }
     });
   }
diff --git a/pkg/analyzer/test/generated/parser_fasta_listener.dart b/pkg/analyzer/test/generated/parser_fasta_listener.dart
index 4a88ce75..dd2f9b4 100644
--- a/pkg/analyzer/test/generated/parser_fasta_listener.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_listener.dart
@@ -30,7 +30,7 @@
 class ForwardingTestListener extends ForwardingListener {
   final _stack = <String>[];
 
-  ForwardingTestListener([Listener listener]) : super(listener);
+  ForwardingTestListener([Listener? listener]) : super(listener);
 
   void begin(String event) {
     expect(event, isNotNull);
@@ -87,7 +87,7 @@
 
   @override
   void beginClassDeclaration(
-      Token beginToken, Token abstractToken, Token name) {
+      Token beginToken, Token? abstractToken, Token name) {
     super.beginClassDeclaration(beginToken, abstractToken, name);
     begin('ClassDeclaration');
   }
@@ -179,7 +179,7 @@
   }
 
   @override
-  void beginExtensionDeclaration(Token extensionKeyword, Token name) {
+  void beginExtensionDeclaration(Token extensionKeyword, Token? name) {
     super.beginExtensionDeclaration(extensionKeyword, name);
     begin('ExtensionDeclaration');
   }
@@ -192,7 +192,7 @@
 
   @override
   void beginFactoryMethod(
-      Token lastConsumed, Token externalToken, Token constToken) {
+      Token lastConsumed, Token? externalToken, Token? constToken) {
     super.beginFactoryMethod(lastConsumed, externalToken, constToken);
     begin('FactoryMethod');
   }
@@ -204,7 +204,7 @@
   }
 
   @override
-  void beginForControlFlow(Token awaitToken, Token forToken) {
+  void beginForControlFlow(Token? awaitToken, Token forToken) {
     super.beginForControlFlow(awaitToken, forToken);
     begin('ForControlFlow');
   }
@@ -222,8 +222,8 @@
   }
 
   @override
-  void beginFormalParameter(Token token, MemberKind kind, Token requiredToken,
-      Token covariantToken, Token varFinalOrConst) {
+  void beginFormalParameter(Token token, MemberKind kind, Token? requiredToken,
+      Token? covariantToken, Token? varFinalOrConst) {
     super.beginFormalParameter(
         token, kind, requiredToken, covariantToken, varFinalOrConst);
     begin('FormalParameter');
@@ -370,8 +370,13 @@
   }
 
   @override
-  void beginMethod(Token externalToken, Token staticToken, Token covariantToken,
-      Token varFinalOrConst, Token getOrSet, Token name) {
+  void beginMethod(
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? varFinalOrConst,
+      Token? getOrSet,
+      Token name) {
     super.beginMethod(externalToken, staticToken, covariantToken,
         varFinalOrConst, getOrSet, name);
     begin('Method');
@@ -391,7 +396,7 @@
 
   @override
   void beginNamedMixinApplication(
-      Token beginToken, Token abstractToken, Token name) {
+      Token beginToken, Token? abstractToken, Token name) {
     super.beginNamedMixinApplication(beginToken, abstractToken, name);
     begin('NamedMixinApplication');
   }
@@ -475,7 +480,7 @@
   }
 
   @override
-  void beginTopLevelMethod(Token lastConsumed, Token externalToken) {
+  void beginTopLevelMethod(Token lastConsumed, Token? externalToken) {
     super.beginTopLevelMethod(lastConsumed, externalToken);
     begin('TopLevelMethod');
   }
@@ -518,7 +523,7 @@
 
   @override
   void beginVariablesDeclaration(
-      Token token, Token lateToken, Token varFinalOrConst) {
+      Token token, Token? lateToken, Token? varFinalOrConst) {
     super.beginVariablesDeclaration(token, lateToken, varFinalOrConst);
     begin('VariablesDeclaration');
   }
@@ -554,7 +559,7 @@
 
   @override
   void endAssert(Token assertKeyword, Assert kind, Token leftParenthesis,
-      Token commaToken, Token semicolonToken) {
+      Token? commaToken, Token semicolonToken) {
     end('Assert');
     super.endAssert(
         assertKeyword, kind, leftParenthesis, commaToken, semicolonToken);
@@ -598,8 +603,8 @@
   }
 
   @override
-  void endClassConstructor(Token getOrSet, Token beginToken, Token beginParam,
-      Token beginInitializers, Token endToken) {
+  void endClassConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
     end('Method');
     super.endClassConstructor(
         getOrSet, beginToken, beginParam, beginInitializers, endToken);
@@ -621,12 +626,12 @@
 
   @override
   void endClassFields(
-      Token abstractToken,
-      Token externalToken,
-      Token staticToken,
-      Token covariantToken,
-      Token lateToken,
-      Token varFinalOrConst,
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
       int count,
       Token beginToken,
       Token endToken) {
@@ -645,8 +650,8 @@
   }
 
   @override
-  void endClassMethod(Token getOrSet, Token beginToken, Token beginParam,
-      Token beginInitializers, Token endToken) {
+  void endClassMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
     end('Method');
     super.endClassMethod(
         getOrSet, beginToken, beginParam, beginInitializers, endToken);
@@ -673,7 +678,7 @@
   }
 
   @override
-  void endConditionalUri(Token ifKeyword, Token leftParen, Token equalSign) {
+  void endConditionalUri(Token ifKeyword, Token leftParen, Token? equalSign) {
     end('ConditionalUri');
     super.endConditionalUri(ifKeyword, leftParen, equalSign);
   }
@@ -698,7 +703,7 @@
 
   @override
   void endConstructorReference(
-      Token start, Token periodBeforeName, Token endToken) {
+      Token start, Token? periodBeforeName, Token endToken) {
     end('ConstructorReference');
     super.endConstructorReference(start, periodBeforeName, endToken);
   }
@@ -735,8 +740,8 @@
   }
 
   @override
-  void endExtensionConstructor(Token getOrSet, Token beginToken,
-      Token beginParam, Token beginInitializers, Token endToken) {
+  void endExtensionConstructor(Token? getOrSet, Token beginToken,
+      Token beginParam, Token? beginInitializers, Token endToken) {
     end('Method');
     super.endExtensionConstructor(
         getOrSet, beginToken, beginParam, beginInitializers, endToken);
@@ -758,12 +763,12 @@
 
   @override
   void endExtensionFields(
-      Token abstractToken,
-      Token externalToken,
-      Token staticToken,
-      Token covariantToken,
-      Token lateToken,
-      Token varFinalOrConst,
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
       int count,
       Token beginToken,
       Token endToken) {
@@ -782,8 +787,8 @@
   }
 
   @override
-  void endExtensionMethod(Token getOrSet, Token beginToken, Token beginParam,
-      Token beginInitializers, Token endToken) {
+  void endExtensionMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
     end('Method');
     super.endExtensionMethod(
         getOrSet, beginToken, beginParam, beginInitializers, endToken);
@@ -827,11 +832,11 @@
 
   @override
   void endFormalParameter(
-      Token thisKeyword,
-      Token periodAfterThis,
+      Token? thisKeyword,
+      Token? periodAfterThis,
       Token nameToken,
-      Token initializerStart,
-      Token initializerEnd,
+      Token? initializerStart,
+      Token? initializerEnd,
       FormalParameterKind kind,
       MemberKind memberKind) {
     end('FormalParameter');
@@ -871,20 +876,20 @@
   }
 
   @override
-  void endFunctionType(Token functionToken, Token questionMark) {
+  void endFunctionType(Token functionToken, Token? questionMark) {
     end('FunctionType');
     super.endFunctionType(functionToken, questionMark);
   }
 
   @override
   void endFunctionTypeAlias(
-      Token typedefKeyword, Token equals, Token endToken) {
+      Token typedefKeyword, Token? equals, Token endToken) {
     end('FunctionTypeAlias');
     super.endFunctionTypeAlias(typedefKeyword, equals, endToken);
   }
 
   @override
-  void endFunctionTypedFormalParameter(Token nameToken, Token question) {
+  void endFunctionTypedFormalParameter(Token nameToken, Token? question) {
     end('FunctionTypedFormalParameter');
     super.endFunctionTypedFormalParameter(nameToken, question);
   }
@@ -908,13 +913,13 @@
   }
 
   @override
-  void endIfStatement(Token ifToken, Token elseToken) {
+  void endIfStatement(Token ifToken, Token? elseToken) {
     end('IfStatement');
     super.endIfStatement(ifToken, elseToken);
   }
 
   @override
-  void endImport(Token importKeyword, Token semicolon) {
+  void endImport(Token importKeyword, Token? semicolon) {
     end('Import');
     super.endImport(importKeyword, semicolon);
   }
@@ -945,7 +950,7 @@
   }
 
   @override
-  void endInvalidYieldStatement(Token beginToken, Token starToken,
+  void endInvalidYieldStatement(Token beginToken, Token? starToken,
       Token endToken, MessageCode errorCode) {
     end('InvalidYieldStatement');
     super.endInvalidYieldStatement(beginToken, starToken, endToken, errorCode);
@@ -988,7 +993,7 @@
   }
 
   @override
-  void endMetadata(Token beginToken, Token periodBeforeName, Token endToken) {
+  void endMetadata(Token beginToken, Token? periodBeforeName, Token endToken) {
     end('Metadata');
     super.endMetadata(beginToken, periodBeforeName, endToken);
   }
@@ -1000,8 +1005,8 @@
   }
 
   @override
-  void endMixinConstructor(Token getOrSet, Token beginToken, Token beginParam,
-      Token beginInitializers, Token endToken) {
+  void endMixinConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
     end('Method');
     super.endMixinConstructor(
         getOrSet, beginToken, beginParam, beginInitializers, endToken);
@@ -1023,12 +1028,12 @@
 
   @override
   void endMixinFields(
-      Token abstractToken,
-      Token externalToken,
-      Token staticToken,
-      Token covariantToken,
-      Token lateToken,
-      Token varFinalOrConst,
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
       int count,
       Token beginToken,
       Token endToken) {
@@ -1047,8 +1052,8 @@
   }
 
   @override
-  void endMixinMethod(Token getOrSet, Token beginToken, Token beginParam,
-      Token beginInitializers, Token endToken) {
+  void endMixinMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
     end('Method');
     super.endMixinMethod(
         getOrSet, beginToken, beginParam, beginInitializers, endToken);
@@ -1062,7 +1067,7 @@
 
   @override
   void endNamedMixinApplication(Token begin, Token classKeyword, Token equals,
-      Token implementsKeyword, Token endToken) {
+      Token? implementsKeyword, Token endToken) {
     end('NamedMixinApplication');
     end('ClassOrNamedMixinApplication');
     super.endNamedMixinApplication(
@@ -1130,8 +1135,8 @@
   void endSwitchCase(
       int labelCount,
       int expressionCount,
-      Token defaultKeyword,
-      Token colonAfterDefault,
+      Token? defaultKeyword,
+      Token? colonAfterDefault,
       int statementCount,
       Token firstToken,
       Token endToken) {
@@ -1163,11 +1168,11 @@
 
   @override
   void endTopLevelFields(
-      Token externalToken,
-      Token staticToken,
-      Token covariantToken,
-      Token lateToken,
-      Token varFinalOrConst,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
       int count,
       Token beginToken,
       Token endToken) {
@@ -1177,14 +1182,15 @@
   }
 
   @override
-  void endTopLevelMethod(Token beginToken, Token getOrSet, Token endToken) {
+  void endTopLevelMethod(Token beginToken, Token? getOrSet, Token endToken) {
     end('TopLevelMethod');
     end('TopLevelMember');
     super.endTopLevelMethod(beginToken, getOrSet, endToken);
   }
 
   @override
-  void endTryStatement(int catchCount, Token tryKeyword, Token finallyKeyword) {
+  void endTryStatement(
+      int catchCount, Token tryKeyword, Token? finallyKeyword) {
     end('TryStatement');
     super.endTryStatement(catchCount, tryKeyword, finallyKeyword);
   }
@@ -1203,7 +1209,7 @@
 
   @override
   void endTypeVariable(
-      Token token, int index, Token extendsOrSuper, Token variance) {
+      Token token, int index, Token? extendsOrSuper, Token? variance) {
     end('TypeVariable');
     super.endTypeVariable(token, index, extendsOrSuper, variance);
   }
@@ -1221,7 +1227,7 @@
   }
 
   @override
-  void endVariablesDeclaration(int count, Token endToken) {
+  void endVariablesDeclaration(int count, Token? endToken) {
     end('VariablesDeclaration');
     super.endVariablesDeclaration(count, endToken);
   }
@@ -1239,7 +1245,7 @@
   }
 
   @override
-  void endYieldStatement(Token yieldToken, Token starToken, Token endToken) {
+  void endYieldStatement(Token yieldToken, Token? starToken, Token endToken) {
     end('YieldStatement');
     super.endYieldStatement(yieldToken, starToken, endToken);
   }
@@ -1261,22 +1267,22 @@
   }
 
   @override
-  void handleClassExtends(Token extendsKeyword, int typeCount) {
+  void handleClassExtends(Token? extendsKeyword, int typeCount) {
     expectIn('ClassDeclaration');
-    listener.handleClassExtends(extendsKeyword, typeCount);
+    listener?.handleClassExtends(extendsKeyword, typeCount);
   }
 
   @override
-  void handleClassHeader(Token begin, Token classKeyword, Token nativeToken) {
+  void handleClassHeader(Token begin, Token classKeyword, Token? nativeToken) {
     expectIn('ClassDeclaration');
-    listener.handleClassHeader(begin, classKeyword, nativeToken);
+    listener?.handleClassHeader(begin, classKeyword, nativeToken);
   }
 
   @override
   void handleClassOrMixinImplements(
-      Token implementsKeyword, int interfacesCount) {
+      Token? implementsKeyword, int interfacesCount) {
     expectInOneOf(['ClassDeclaration', 'MixinDeclaration']);
-    listener.handleClassOrMixinImplements(implementsKeyword, interfacesCount);
+    listener?.handleClassOrMixinImplements(implementsKeyword, interfacesCount);
   }
 
   @override
@@ -1292,11 +1298,11 @@
   }
 
   @override
-  void handleImportPrefix(Token deferredKeyword, Token asKeyword) {
+  void handleImportPrefix(Token? deferredKeyword, Token? asKeyword) {
     // This event normally happens within "Import",
     // but happens within "CompilationUnit" during recovery.
     expectInOneOf(const ['Import', 'CompilationUnit']);
-    listener.handleImportPrefix(deferredKeyword, asKeyword);
+    listener?.handleImportPrefix(deferredKeyword, asKeyword);
   }
 
   @override
@@ -1308,59 +1314,59 @@
   @override
   void handleInvalidTopLevelDeclaration(Token endToken) {
     end('TopLevelMember');
-    listener.handleInvalidTopLevelDeclaration(endToken);
+    listener?.handleInvalidTopLevelDeclaration(endToken);
   }
 
   @override
   void handleNativeClause(Token nativeToken, bool hasName) {
     expectInOneOf(['ClassDeclaration', 'Method']);
-    listener.handleNativeClause(nativeToken, hasName);
+    listener?.handleNativeClause(nativeToken, hasName);
   }
 
   @override
   void handleNativeFunctionBody(Token nativeToken, Token semicolon) {
     expectInOneOf(['Method']);
-    listener.handleNativeFunctionBody(nativeToken, semicolon);
+    listener?.handleNativeFunctionBody(nativeToken, semicolon);
   }
 
   @override
   void handleNativeFunctionBodyIgnored(Token nativeToken, Token semicolon) {
     expectInOneOf(['Method']);
-    listener.handleNativeFunctionBodyIgnored(nativeToken, semicolon);
+    listener?.handleNativeFunctionBodyIgnored(nativeToken, semicolon);
   }
 
   @override
   void handleNativeFunctionBodySkipped(Token nativeToken, Token semicolon) {
     expectInOneOf(['Method']);
-    listener.handleNativeFunctionBodySkipped(nativeToken, semicolon);
+    listener?.handleNativeFunctionBodySkipped(nativeToken, semicolon);
   }
 
   @override
   void handleRecoverClassHeader() {
     expectIn('ClassDeclaration');
-    listener.handleRecoverClassHeader();
+    listener?.handleRecoverClassHeader();
   }
 
   @override
-  void handleRecoverImport(Token semicolon) {
+  void handleRecoverImport(Token? semicolon) {
     expectIn('CompilationUnit');
-    listener.handleRecoverImport(semicolon);
+    listener?.handleRecoverImport(semicolon);
   }
 
   @override
   void handleRecoverMixinHeader() {
     expectIn('MixinDeclaration');
-    listener.handleRecoverMixinHeader();
+    listener?.handleRecoverMixinHeader();
   }
 
   @override
   void handleScript(Token token) {
     expectIn('CompilationUnit');
-    listener.handleScript(token);
+    listener?.handleScript(token);
   }
 
   @override
   void handleTypeVariablesDefined(Token token, int count) {
-    listener.handleTypeVariablesDefined(token, count);
+    listener?.handleTypeVariablesDefined(token, count);
   }
 }
diff --git a/pkg/analyzer/test/generated/parser_test_base.dart b/pkg/analyzer/test/generated/parser_test_base.dart
index f6387fe..323d52e 100644
--- a/pkg/analyzer/test/generated/parser_test_base.dart
+++ b/pkg/analyzer/test/generated/parser_test_base.dart
@@ -25,6 +25,7 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/string_source.dart';
+import 'package:analyzer/src/summary2/ast_binary_tokens.dart';
 import 'package:pub_semver/src/version.dart';
 import 'package:test/test.dart';
 
@@ -99,7 +100,7 @@
 
   Expression parseCascadeSection(String code);
 
-  CommentReference parseCommentReference(
+  CommentReference? parseCommentReference(
       String referenceSource, int sourceOffset);
 
   CompilationUnit parseCompilationUnit(String source,
@@ -232,9 +233,9 @@
     flags: [],
   );
 
-  ParserProxy parserProxy;
+  late ParserProxy parserProxy;
 
-  Token _fastaTokens;
+  late Token _fastaTokens;
 
   @override
   bool allowNativeClause = false;
@@ -258,7 +259,7 @@
   @override
   ParserProxy get parser => parserProxy;
 
-  void assertErrors({List<ErrorCode> codes, List<ExpectedError> errors}) {
+  void assertErrors({List<ErrorCode>? codes, List<ExpectedError>? errors}) {
     if (codes != null) {
       if (!identical(codes, NO_ERROR_COMPARISON)) {
         assertErrorsWithCodes(codes);
@@ -283,7 +284,7 @@
 
   @override
   void createParser(String content,
-      {int expectedEndOffset, FeatureSet featureSet}) {
+      {int? expectedEndOffset, FeatureSet? featureSet}) {
     featureSet ??= FeatureSet.forTesting();
     var result = scanString(content,
         configuration: featureSet.isEnabled(Feature.non_nullable)
@@ -301,7 +302,7 @@
       ExpectedError(_toFastaGeneratedAnalyzerErrorCode(code), offset, length);
 
   @override
-  void expectNotNullIfNoErrors(Object result) {
+  void expectNotNullIfNoErrors(Object? result) {
     if (!listener.hasErrors) {
       expect(result, isNotNull);
     }
@@ -337,7 +338,8 @@
   @override
   AwaitExpression parseAwaitExpression(String code) {
     var function = _parseExpression('() async => $code') as FunctionExpression;
-    return (function.body as ExpressionFunctionBody).expression;
+    return (function.body as ExpressionFunctionBody).expression
+        as AwaitExpression;
   }
 
   @override
@@ -362,13 +364,13 @@
   }
 
   @override
-  CommentReference parseCommentReference(
+  CommentReference? parseCommentReference(
       String referenceSource, int sourceOffset) {
     String padding = ' '.padLeft(sourceOffset - 4, 'a');
     String source = '/**$padding[$referenceSource] */ class C { }';
     CompilationUnit unit = parseCompilationUnit(source);
-    ClassDeclaration clazz = unit.declarations[0];
-    Comment comment = clazz.documentationComment;
+    var clazz = unit.declarations[0] as ClassDeclaration;
+    var comment = clazz.documentationComment!;
     List<CommentReference> references = comment.references;
     if (references.isEmpty) {
       return null;
@@ -380,9 +382,9 @@
 
   @override
   CompilationUnit parseCompilationUnit(String content,
-      {List<ErrorCode> codes,
-      List<ExpectedError> errors,
-      FeatureSet featureSet}) {
+      {List<ErrorCode>? codes,
+      List<ExpectedError>? errors,
+      FeatureSet? featureSet}) {
     GatheringErrorListener listener = GatheringErrorListener(checkRanges: true);
 
     CompilationUnit unit =
@@ -402,14 +404,14 @@
 
   CompilationUnit parseCompilationUnit2(
       String content, GatheringErrorListener listener,
-      {LanguageVersionToken languageVersion, FeatureSet featureSet}) {
+      {LanguageVersionToken? languageVersion, FeatureSet? featureSet}) {
     featureSet ??= FeatureSet.forTesting();
     var source = StringSource(content, 'parser_test_StringSource.dart');
 
     // Adjust the feature set based on language version comment.
     void languageVersionChanged(
         fasta.Scanner scanner, LanguageVersionToken languageVersion) {
-      featureSet = featureSet.restrictToVersion(
+      featureSet = featureSet!.restrictToVersion(
           Version(languageVersion.major, languageVersion.minor, 0));
       scanner.configuration = Scanner.buildConfig(featureSet);
     }
@@ -428,12 +430,12 @@
       isNonNullableByDefault: false,
     );
     AstBuilder astBuilder =
-        AstBuilder(errorReporter, source.uri, true, featureSet);
+        AstBuilder(errorReporter, source.uri, true, featureSet!);
     fasta.Parser parser = fasta.Parser(astBuilder);
     astBuilder.parser = parser;
     astBuilder.allowNativeClause = allowNativeClause;
     parser.parseUnit(_fastaTokens);
-    CompilationUnitImpl unit = astBuilder.pop();
+    var unit = astBuilder.pop() as CompilationUnitImpl;
 
     expect(unit, isNotNull);
     return unit;
@@ -441,7 +443,7 @@
 
   @override
   ConditionalExpression parseConditionalExpression(String code) {
-    return _parseExpression(code);
+    return _parseExpression(code) as ConditionalExpression;
   }
 
   @override
@@ -473,16 +475,16 @@
 
   @override
   BinaryExpression parseEqualityExpression(String code) {
-    return _parseExpression(code);
+    return _parseExpression(code) as BinaryExpression;
   }
 
   @override
   Expression parseExpression(String source,
-      {List<ErrorCode> codes,
-      List<ExpectedError> errors,
-      int expectedEndOffset,
+      {List<ErrorCode>? codes,
+      List<ExpectedError>? errors,
+      int? expectedEndOffset,
       bool inAsync = false,
-      FeatureSet featureSet}) {
+      FeatureSet? featureSet}) {
     createParser(source,
         expectedEndOffset: expectedEndOffset, featureSet: featureSet);
     if (inAsync) {
@@ -509,7 +511,7 @@
   @override
   FormalParameter parseFormalParameter(String code, ParameterKind kind,
       {List<ErrorCode> errorCodes = const <ErrorCode>[],
-      FeatureSet featureSet}) {
+      FeatureSet? featureSet}) {
     String parametersCode;
     if (kind == ParameterKind.REQUIRED) {
       parametersCode = '($code)';
@@ -529,8 +531,8 @@
   FormalParameterList parseFormalParameterList(String code,
       {bool inFunctionType = false,
       List<ErrorCode> errorCodes = const <ErrorCode>[],
-      List<ExpectedError> errors,
-      FeatureSet featureSet}) {
+      List<ExpectedError>? errors,
+      FeatureSet? featureSet}) {
     createParser(code, featureSet: featureSet);
     FormalParameterList result =
         parserProxy.parseFormalParameterList(inFunctionType: inFunctionType);
@@ -540,28 +542,28 @@
 
   @override
   CompilationUnitMember parseFullCompilationUnitMember() {
-    return parserProxy.parseTopLevelDeclaration(false);
+    return parserProxy.parseTopLevelDeclaration(false) as CompilationUnitMember;
   }
 
   @override
   Directive parseFullDirective() {
-    return parserProxy.parseTopLevelDeclaration(true);
+    return parserProxy.parseTopLevelDeclaration(true) as Directive;
   }
 
   @override
   FunctionExpression parseFunctionExpression(String code) {
-    return _parseExpression(code);
+    return _parseExpression(code) as FunctionExpression;
   }
 
   @override
   InstanceCreationExpression parseInstanceCreationExpression(
       String code, Token newToken) {
-    return _parseExpression('$newToken $code');
+    return _parseExpression('$newToken $code') as InstanceCreationExpression;
   }
 
   @override
   ListLiteral parseListLiteral(
-      Token token, String typeArgumentsCode, String code) {
+      Token? token, String? typeArgumentsCode, String code) {
     String sc = '';
     if (token != null) {
       sc += token.lexeme + ' ';
@@ -570,11 +572,11 @@
       sc += typeArgumentsCode;
     }
     sc += code;
-    return _parseExpression(sc);
+    return _parseExpression(sc) as ListLiteral;
   }
 
   @override
-  TypedLiteral parseListOrMapLiteral(Token modifier, String code) {
+  TypedLiteral parseListOrMapLiteral(Token? modifier, String code) {
     String literalCode = modifier != null ? '$modifier $code' : code;
     return parsePrimaryExpression(literalCode) as TypedLiteral;
   }
@@ -591,7 +593,7 @@
 
   @override
   SetOrMapLiteral parseMapLiteral(
-      Token token, String typeArgumentsCode, String code) {
+      Token? token, String? typeArgumentsCode, String code) {
     String sc = '';
     if (token != null) {
       sc += token.lexeme + ' ';
@@ -606,7 +608,7 @@
   @override
   MapLiteralEntry parseMapLiteralEntry(String code) {
     var mapLiteral = parseMapLiteral(null, null, '{ $code }');
-    return mapLiteral.elements.single;
+    return mapLiteral.elements.single as MapLiteralEntry;
   }
 
   @override
@@ -616,7 +618,7 @@
 
   @override
   InstanceCreationExpression parseNewExpression(String code) {
-    return _parseExpression(code);
+    return _parseExpression(code) as InstanceCreationExpression;
   }
 
   @override
@@ -625,7 +627,7 @@
       List<ErrorCode> errorCodes = const <ErrorCode>[]}) {
     FormalParameterList list = parseFormalParameterList('($code)',
         inFunctionType: inFunctionType, errorCodes: errorCodes);
-    return list.parameters.single;
+    return list.parameters.single as NormalFormalParameter;
   }
 
   @override
@@ -635,12 +637,12 @@
 
   @override
   Identifier parsePrefixedIdentifier(String code) {
-    return _parseExpression(code);
+    return _parseExpression(code) as Identifier;
   }
 
   @override
   Expression parsePrimaryExpression(String code,
-      {int expectedEndOffset, List<ExpectedError> errors}) {
+      {int? expectedEndOffset, List<ExpectedError>? errors}) {
     createParser(code, expectedEndOffset: expectedEndOffset);
     Expression result = parserProxy.parsePrimaryExpression();
     assertErrors(codes: null, errors: errors);
@@ -654,22 +656,22 @@
 
   @override
   RethrowExpression parseRethrowExpression(String code) {
-    return _parseExpression(code);
+    return _parseExpression(code) as RethrowExpression;
   }
 
   @override
   BinaryExpression parseShiftExpression(String code) {
-    return _parseExpression(code);
+    return _parseExpression(code) as BinaryExpression;
   }
 
   @override
   SimpleIdentifier parseSimpleIdentifier(String code) {
-    return _parseExpression(code);
+    return _parseExpression(code) as SimpleIdentifier;
   }
 
   @override
   Statement parseStatement(String source,
-      {int expectedEndOffset, FeatureSet featureSet, bool inAsync = false}) {
+      {int? expectedEndOffset, FeatureSet? featureSet, bool inAsync = false}) {
     createParser(source,
         expectedEndOffset: expectedEndOffset, featureSet: featureSet);
     if (inAsync) {
@@ -687,7 +689,7 @@
 
   @override
   SymbolLiteral parseSymbolLiteral(String code) {
-    return _parseExpression(code);
+    return _parseExpression(code) as SymbolLiteral;
   }
 
   @override
@@ -702,7 +704,7 @@
 
   @override
   PrefixExpression parseUnaryExpression(String code) {
-    return _parseExpression(code);
+    return _parseExpression(code) as PrefixExpression;
   }
 
   @override
@@ -747,14 +749,14 @@
   /// The error listener to which scanner and parser errors will be reported.
   final GatheringErrorListener errorListener;
 
-  ForwardingTestListener _eventListener;
+  late final ForwardingTestListener _eventListener;
 
-  final int expectedEndOffset;
+  final int? expectedEndOffset;
 
   /// Creates a [ParserProxy] which is prepared to begin parsing at the given
   /// Fasta token.
   factory ParserProxy(Token firstToken, FeatureSet featureSet,
-      {bool allowNativeClause = false, int expectedEndOffset}) {
+      {bool allowNativeClause = false, int? expectedEndOffset}) {
     TestSource source = TestSource();
     var errorListener = GatheringErrorListener(checkRanges: true);
     return ParserProxy._(firstToken, source, errorListener, featureSet,
@@ -779,7 +781,7 @@
     return _run('MetadataStar', () {
       currentToken = fastaParser
           .parseMetadata(fastaParser.syntheticPreviousToken(currentToken))
-          .next;
+          .next!;
       return astBuilder.pop() as Annotation;
     });
   }
@@ -788,7 +790,7 @@
     return _run('unspecified', () {
       currentToken = fastaParser
           .parseArguments(fastaParser.syntheticPreviousToken(currentToken))
-          .next;
+          .next!;
       var result = astBuilder.pop();
       return result is MethodInvocation
           ? result.argumentList
@@ -797,6 +799,10 @@
   }
 
   ClassMember parseClassMember(String className) {
+    return parseClassMemberOrNull(className)!;
+  }
+
+  ClassMember? parseClassMemberOrNull(String className) {
     return _run('ClassOrMixinBody', () {
       astBuilder.classDeclaration = astFactory.classDeclaration(
         null,
@@ -809,14 +815,14 @@
         null,
         null,
         null,
-        null /* leftBracket */,
+        Tokens.OPEN_CURLY_BRACKET /* leftBracket */,
         <ClassMember>[],
-        null /* rightBracket */,
+        Tokens.CLOSE_CURLY_BRACKET /* rightBracket */,
       ) as ClassDeclarationImpl;
       // TODO(danrubel): disambiguate between class and mixin
       currentToken = fastaParser.parseClassMember(currentToken, className);
       //currentToken = fastaParser.parseMixinMember(currentToken);
-      ClassDeclaration declaration = astBuilder.classDeclaration;
+      ClassDeclaration declaration = astBuilder.classDeclaration!;
       astBuilder.classDeclaration = null;
       return declaration.members.isNotEmpty ? declaration.members[0] : null;
     });
@@ -826,7 +832,7 @@
     return _run('Import', () {
       currentToken = fastaParser
           .parseCombinatorStar(fastaParser.syntheticPreviousToken(currentToken))
-          .next;
+          .next!;
       return astBuilder.pop() as List<Combinator>;
     });
   }
@@ -834,7 +840,7 @@
   List<CommentReference> parseCommentReferences(
       List<DocumentationCommentToken> tokens) {
     for (int index = 0; index < tokens.length - 1; ++index) {
-      Token next = tokens[index].next;
+      var next = tokens[index].next;
       if (next == null) {
         tokens[index].setNext(tokens[index + 1]);
       } else {
@@ -884,17 +890,17 @@
   @override
   FunctionBody parseFunctionBody(
       bool mayBeEmpty, ParserErrorCode emptyErrorCode, bool inExpression) {
-    Token lastToken;
+    Token? lastToken;
     FunctionBody body = _run('unspecified', () {
       FunctionBody body =
           super.parseFunctionBody(mayBeEmpty, emptyErrorCode, inExpression);
       lastToken = currentToken;
-      currentToken = currentToken.next;
+      currentToken = currentToken.next!;
       return body;
     });
     if (!inExpression) {
-      if (![';', '}'].contains(lastToken.lexeme)) {
-        fail('Expected ";" or "}", but found: ${lastToken.lexeme}');
+      if (![';', '}'].contains(lastToken!.lexeme)) {
+        fail('Expected ";" or "}", but found: ${lastToken!.lexeme}');
       }
     }
     return body;
@@ -942,7 +948,7 @@
   }
 
   @override
-  TypeParameterList parseTypeParameterList() {
+  TypeParameterList? parseTypeParameterList() {
     return _run('unspecified', () => super.parseTypeParameterList());
   }
 
@@ -1001,13 +1007,13 @@
   bool enableUriInPartOf = false;
 
   @override
-  GatheringErrorListener listener;
+  late final GatheringErrorListener listener;
 
   /// The parser used by the test.
   ///
   /// This field is typically initialized by invoking [createParser].
   @override
-  analyzer.Parser parser;
+  late final analyzer.Parser parser;
 
   @override
   void assertErrorsWithCodes(List<ErrorCode> expectedErrorCodes) {
@@ -1024,9 +1030,9 @@
   @override
   void createParser(
     String content, {
-    int expectedEndOffset,
-    LanguageVersionToken languageVersion,
-    FeatureSet featureSet,
+    int? expectedEndOffset,
+    LanguageVersionToken? languageVersion,
+    FeatureSet? featureSet,
   }) {
     featureSet ??= FeatureSet.latestLanguageVersion();
     Source source = TestSource();
@@ -1089,7 +1095,8 @@
   AwaitExpression parseAwaitExpression(String code) {
     createParser('() async => $code');
     var function = parser.parseExpression2() as FunctionExpression;
-    return (function.body as ExpressionFunctionBody).expression;
+    return (function.body as ExpressionFunctionBody).expression
+        as AwaitExpression;
   }
 
   @override
@@ -1118,13 +1125,13 @@
   }
 
   @override
-  CommentReference parseCommentReference(
+  CommentReference? parseCommentReference(
       String referenceSource, int sourceOffset) {
     String padding = ' '.padLeft(sourceOffset - 4, 'a');
     String source = '/**$padding[$referenceSource] */ class C { }';
     CompilationUnit unit = parseCompilationUnit(source);
-    ClassDeclaration clazz = unit.declarations[0];
-    Comment comment = clazz.documentationComment;
+    var clazz = unit.declarations[0] as ClassDeclaration;
+    var comment = clazz.documentationComment!;
     List<CommentReference> references = comment.references;
     if (references.isEmpty) {
       return null;
@@ -1145,7 +1152,7 @@
   ///           the result would have been `null`
   @override
   CompilationUnit parseCompilationUnit(String content,
-      {List<ErrorCode> codes, List<ExpectedError> errors}) {
+      {List<ErrorCode>? codes, List<ExpectedError>? errors}) {
     Source source = TestSource();
     GatheringErrorListener listener = GatheringErrorListener();
 
@@ -1173,7 +1180,7 @@
 
   /// Parse the given [content] as a compilation unit.
   CompilationUnit parseCompilationUnit2(String content,
-      {AnalysisErrorListener listener}) {
+      {AnalysisErrorListener? listener}) {
     Source source = NonExistingSource.unknown;
     listener ??= AnalysisErrorListener.NULL_LISTENER;
 
@@ -1194,7 +1201,7 @@
   @override
   ConditionalExpression parseConditionalExpression(String code) {
     createParser(code);
-    return parser.parseConditionalExpression();
+    return parser.parseConditionalExpression() as ConditionalExpression;
   }
 
   @override
@@ -1226,7 +1233,7 @@
   @override
   BinaryExpression parseEqualityExpression(String code) {
     createParser(code);
-    return parser.parseEqualityExpression();
+    return parser.parseEqualityExpression() as BinaryExpression;
   }
 
   /// Parse the given [source] as an expression. If a list of error [codes] is
@@ -1235,9 +1242,9 @@
   /// errors matches the list. Otherwise, assert that there are no errors.
   @override
   Expression parseExpression(String source,
-      {List<ErrorCode> codes,
-      List<ExpectedError> errors,
-      int expectedEndOffset}) {
+      {List<ErrorCode>? codes,
+      List<ExpectedError>? errors,
+      int? expectedEndOffset}) {
     createParser(source, expectedEndOffset: expectedEndOffset);
     Expression expression = parser.parseExpression2();
     expectNotNullIfNoErrors(expression);
@@ -1288,7 +1295,7 @@
   FormalParameterList parseFormalParameterList(String code,
       {bool inFunctionType = false,
       List<ErrorCode> errorCodes = const <ErrorCode>[],
-      List<ExpectedError> errors}) {
+      List<ExpectedError>? errors}) {
     createParser(code);
     FormalParameterList list =
         parser.parseFormalParameterList(inFunctionType: inFunctionType);
@@ -1307,7 +1314,7 @@
 
   @override
   Directive parseFullDirective() {
-    return parser.parseTopLevelDeclaration(true);
+    return parser.parseTopLevelDeclaration(true) as Directive;
   }
 
   @override
@@ -1320,12 +1327,12 @@
   InstanceCreationExpression parseInstanceCreationExpression(
       String code, Token newToken) {
     createParser('$newToken $code');
-    return parser.parseExpression2();
+    return parser.parseExpression2() as InstanceCreationExpression;
   }
 
   @override
   ListLiteral parseListLiteral(
-      Token token, String typeArgumentsCode, String code) {
+      Token? token, String? typeArgumentsCode, String code) {
     String sc = '';
     if (token != null) {
       sc += token.lexeme + ' ';
@@ -1335,11 +1342,11 @@
     }
     sc += code;
     createParser(sc);
-    return parser.parseExpression2();
+    return parser.parseExpression2() as ListLiteral;
   }
 
   @override
-  TypedLiteral parseListOrMapLiteral(Token modifier, String code) {
+  TypedLiteral parseListOrMapLiteral(Token? modifier, String code) {
     String literalCode = modifier != null ? '$modifier $code' : code;
     createParser(literalCode);
     return parser.parseExpression2() as TypedLiteral;
@@ -1359,7 +1366,7 @@
 
   @override
   SetOrMapLiteral parseMapLiteral(
-      Token token, String typeArgumentsCode, String code) {
+      Token? token, String? typeArgumentsCode, String code) {
     String sc = '';
     if (token != null) {
       sc += token.lexeme + ' ';
@@ -1375,7 +1382,7 @@
   @override
   MapLiteralEntry parseMapLiteralEntry(String code) {
     var mapLiteral = parseMapLiteral(null, null, '{ $code }');
-    return mapLiteral.elements.single;
+    return mapLiteral.elements.single as MapLiteralEntry;
   }
 
   @override
@@ -1396,7 +1403,7 @@
       List<ErrorCode> errorCodes = const <ErrorCode>[]}) {
     FormalParameterList list = parseFormalParameterList('($code)',
         inFunctionType: inFunctionType, errorCodes: errorCodes);
-    return list.parameters.single;
+    return list.parameters.single as NormalFormalParameter;
   }
 
   @override
@@ -1413,7 +1420,7 @@
 
   @override
   Expression parsePrimaryExpression(String code,
-      {int expectedEndOffset, List<ExpectedError> errors}) {
+      {int? expectedEndOffset, List<ExpectedError>? errors}) {
     createParser(code);
     var expression = parser.parsePrimaryExpression();
     if (errors != null) {
@@ -1431,13 +1438,13 @@
   @override
   RethrowExpression parseRethrowExpression(String code) {
     createParser(code);
-    return parser.parseRethrowExpression();
+    return parser.parseRethrowExpression() as RethrowExpression;
   }
 
   @override
   BinaryExpression parseShiftExpression(String code) {
     createParser(code);
-    return parser.parseShiftExpression();
+    return parser.parseShiftExpression() as BinaryExpression;
   }
 
   @override
@@ -1450,7 +1457,7 @@
   /// [enableLazyAssignmentOperators] is `true`, then lazy assignment operators
   /// should be enabled.
   @override
-  Statement parseStatement(String content, {int expectedEndOffset}) {
+  Statement parseStatement(String content, {int? expectedEndOffset}) {
     Source source = TestSource();
     listener = GatheringErrorListener();
 
@@ -1496,7 +1503,7 @@
   @override
   PrefixExpression parseUnaryExpression(String code) {
     createParser(code);
-    return parser.parseUnaryExpression();
+    return parser.parseUnaryExpression() as PrefixExpression;
   }
 
   @override
@@ -1514,7 +1521,8 @@
 ///
 /// Intended to be mixed in to parser test case classes.
 mixin ParserTestHelpers {
-  void expectCommentText(Comment comment, String expectedText) {
+  void expectCommentText(Comment? comment, String expectedText) {
+    comment!;
     expect(comment.beginToken, same(comment.endToken));
     expect(comment.beginToken.lexeme, expectedText);
   }
diff --git a/pkg/analyzer/test/generated/recovery_parser_test.dart b/pkg/analyzer/test/generated/recovery_parser_test.dart
index b578737..2c31385 100644
--- a/pkg/analyzer/test/generated/recovery_parser_test.dart
+++ b/pkg/analyzer/test/generated/recovery_parser_test.dart
@@ -23,17 +23,18 @@
 @reflectiveTest
 class RecoveryParserTest extends FastaParserTestCase {
   void test_additiveExpression_missing_LHS() {
-    BinaryExpression expression =
-        parseExpression("+ y", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
+    var expression =
+        parseExpression("+ y", codes: [ParserErrorCode.MISSING_IDENTIFIER])
+            as BinaryExpression;
     expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.leftOperand.isSynthetic, isTrue);
   }
 
   void test_additiveExpression_missing_LHS_RHS() {
-    BinaryExpression expression = parseExpression("+", codes: [
+    var expression = parseExpression("+", codes: [
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
-    ]);
+    ]) as BinaryExpression;
     expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.leftOperand.isSynthetic, isTrue);
     expect(expression.rightOperand, isSimpleIdentifier);
@@ -41,64 +42,69 @@
   }
 
   void test_additiveExpression_missing_RHS() {
-    BinaryExpression expression =
-        parseExpression("x +", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
+    var expression =
+        parseExpression("x +", codes: [ParserErrorCode.MISSING_IDENTIFIER])
+            as BinaryExpression;
     expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_additiveExpression_missing_RHS_super() {
-    BinaryExpression expression =
-        parseExpression("super +", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
+    var expression =
+        parseExpression("super +", codes: [ParserErrorCode.MISSING_IDENTIFIER])
+            as BinaryExpression;
     expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_additiveExpression_precedence_multiplicative_left() {
-    BinaryExpression expression = parseExpression("* +", codes: [
+    var expression = parseExpression("* +", codes: [
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
-    ]);
+    ]) as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_additiveExpression_precedence_multiplicative_right() {
-    BinaryExpression expression = parseExpression("+ *", codes: [
+    var expression = parseExpression("+ *", codes: [
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
-    ]);
+    ]) as BinaryExpression;
     expect(expression.rightOperand, isBinaryExpression);
   }
 
   void test_additiveExpression_super() {
-    BinaryExpression expression = parseExpression("super + +", codes: [
+    var expression = parseExpression("super + +", codes: [
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
-    ]);
+    ]) as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_assignableSelector() {
-    IndexExpression expression =
-        parseExpression("a.b[]", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
-    Expression index = expression.index;
+    var expression =
+        parseExpression("a.b[]", codes: [ParserErrorCode.MISSING_IDENTIFIER])
+            as IndexExpression;
+    var index = expression.index;
     expect(index, isSimpleIdentifier);
     expect(index.isSynthetic, isTrue);
   }
 
   void test_assignmentExpression_missing_compound1() {
-    AssignmentExpression expression =
-        parseExpression("= y = 0", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
+    var expression =
+        parseExpression("= y = 0", codes: [ParserErrorCode.MISSING_IDENTIFIER])
+            as AssignmentExpression;
     Expression syntheticExpression = expression.leftHandSide;
     expect(syntheticExpression, isSimpleIdentifier);
     expect(syntheticExpression.isSynthetic, isTrue);
   }
 
   void test_assignmentExpression_missing_compound2() {
-    AssignmentExpression expression =
-        parseExpression("x = = 0", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
+    var expression =
+        parseExpression("x = = 0", codes: [ParserErrorCode.MISSING_IDENTIFIER])
+            as AssignmentExpression;
     Expression syntheticExpression =
         (expression.rightHandSide as AssignmentExpression).leftHandSide;
     expect(syntheticExpression, isSimpleIdentifier);
@@ -106,8 +112,9 @@
   }
 
   void test_assignmentExpression_missing_compound3() {
-    AssignmentExpression expression =
-        parseExpression("x = y =", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
+    var expression =
+        parseExpression("x = y =", codes: [ParserErrorCode.MISSING_IDENTIFIER])
+            as AssignmentExpression;
     Expression syntheticExpression =
         (expression.rightHandSide as AssignmentExpression).rightHandSide;
     expect(syntheticExpression, isSimpleIdentifier);
@@ -115,31 +122,34 @@
   }
 
   void test_assignmentExpression_missing_LHS() {
-    AssignmentExpression expression =
-        parseExpression("= 0", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
+    var expression =
+        parseExpression("= 0", codes: [ParserErrorCode.MISSING_IDENTIFIER])
+            as AssignmentExpression;
     expect(expression.leftHandSide, isSimpleIdentifier);
     expect(expression.leftHandSide.isSynthetic, isTrue);
   }
 
   void test_assignmentExpression_missing_RHS() {
-    AssignmentExpression expression =
-        parseExpression("x =", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
+    var expression =
+        parseExpression("x =", codes: [ParserErrorCode.MISSING_IDENTIFIER])
+            as AssignmentExpression;
     expect(expression.leftHandSide, isSimpleIdentifier);
     expect(expression.rightHandSide.isSynthetic, isTrue);
   }
 
   void test_bitwiseAndExpression_missing_LHS() {
-    BinaryExpression expression =
-        parseExpression("& y", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
+    var expression =
+        parseExpression("& y", codes: [ParserErrorCode.MISSING_IDENTIFIER])
+            as BinaryExpression;
     expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.leftOperand.isSynthetic, isTrue);
   }
 
   void test_bitwiseAndExpression_missing_LHS_RHS() {
-    BinaryExpression expression = parseExpression("&", codes: [
+    var expression = parseExpression("&", codes: [
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
-    ]);
+    ]) as BinaryExpression;
     expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.leftOperand.isSynthetic, isTrue);
     expect(expression.rightOperand, isSimpleIdentifier);
@@ -147,57 +157,60 @@
   }
 
   void test_bitwiseAndExpression_missing_RHS() {
-    BinaryExpression expression =
-        parseExpression("x &", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
+    var expression =
+        parseExpression("x &", codes: [ParserErrorCode.MISSING_IDENTIFIER])
+            as BinaryExpression;
     expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_bitwiseAndExpression_missing_RHS_super() {
-    BinaryExpression expression =
-        parseExpression("super &", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
+    var expression =
+        parseExpression("super &", codes: [ParserErrorCode.MISSING_IDENTIFIER])
+            as BinaryExpression;
     expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_bitwiseAndExpression_precedence_equality_left() {
-    BinaryExpression expression = parseExpression("== &&", codes: [
+    var expression = parseExpression("== &&", codes: [
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
-    ]);
+    ]) as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_bitwiseAndExpression_precedence_equality_right() {
-    BinaryExpression expression = parseExpression("&& ==", codes: [
+    var expression = parseExpression("&& ==", codes: [
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
-    ]);
+    ]) as BinaryExpression;
     expect(expression.rightOperand, isBinaryExpression);
   }
 
   void test_bitwiseAndExpression_super() {
-    BinaryExpression expression = parseExpression("super &  &", codes: [
+    var expression = parseExpression("super &  &", codes: [
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
-    ]);
+    ]) as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_bitwiseOrExpression_missing_LHS() {
-    BinaryExpression expression =
-        parseExpression("| y", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
+    var expression =
+        parseExpression("| y", codes: [ParserErrorCode.MISSING_IDENTIFIER])
+            as BinaryExpression;
     expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.leftOperand.isSynthetic, isTrue);
   }
 
   void test_bitwiseOrExpression_missing_LHS_RHS() {
-    BinaryExpression expression = parseExpression("|", codes: [
+    var expression = parseExpression("|", codes: [
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
-    ]);
+    ]) as BinaryExpression;
     expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.leftOperand.isSynthetic, isTrue);
     expect(expression.rightOperand, isSimpleIdentifier);
@@ -205,57 +218,60 @@
   }
 
   void test_bitwiseOrExpression_missing_RHS() {
-    BinaryExpression expression =
-        parseExpression("x |", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
+    var expression =
+        parseExpression("x |", codes: [ParserErrorCode.MISSING_IDENTIFIER])
+            as BinaryExpression;
     expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_bitwiseOrExpression_missing_RHS_super() {
-    BinaryExpression expression =
-        parseExpression("super |", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
+    var expression =
+        parseExpression("super |", codes: [ParserErrorCode.MISSING_IDENTIFIER])
+            as BinaryExpression;
     expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_bitwiseOrExpression_precedence_xor_left() {
-    BinaryExpression expression = parseExpression("^ |", codes: [
+    var expression = parseExpression("^ |", codes: [
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
-    ]);
+    ]) as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_bitwiseOrExpression_precedence_xor_right() {
-    BinaryExpression expression = parseExpression("| ^", codes: [
+    var expression = parseExpression("| ^", codes: [
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
-    ]);
+    ]) as BinaryExpression;
     expect(expression.rightOperand, isBinaryExpression);
   }
 
   void test_bitwiseOrExpression_super() {
-    BinaryExpression expression = parseExpression("super |  |", codes: [
+    var expression = parseExpression("super |  |", codes: [
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
-    ]);
+    ]) as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_bitwiseXorExpression_missing_LHS() {
-    BinaryExpression expression =
-        parseExpression("^ y", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
+    var expression =
+        parseExpression("^ y", codes: [ParserErrorCode.MISSING_IDENTIFIER])
+            as BinaryExpression;
     expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.leftOperand.isSynthetic, isTrue);
   }
 
   void test_bitwiseXorExpression_missing_LHS_RHS() {
-    BinaryExpression expression = parseExpression("^", codes: [
+    var expression = parseExpression("^", codes: [
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
-    ]);
+    ]) as BinaryExpression;
     expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.leftOperand.isSynthetic, isTrue);
     expect(expression.rightOperand, isSimpleIdentifier);
@@ -263,42 +279,44 @@
   }
 
   void test_bitwiseXorExpression_missing_RHS() {
-    BinaryExpression expression =
-        parseExpression("x ^", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
+    var expression =
+        parseExpression("x ^", codes: [ParserErrorCode.MISSING_IDENTIFIER])
+            as BinaryExpression;
     expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_bitwiseXorExpression_missing_RHS_super() {
-    BinaryExpression expression =
-        parseExpression("super ^", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
+    var expression =
+        parseExpression("super ^", codes: [ParserErrorCode.MISSING_IDENTIFIER])
+            as BinaryExpression;
     expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_bitwiseXorExpression_precedence_and_left() {
-    BinaryExpression expression = parseExpression("& ^", codes: [
+    var expression = parseExpression("& ^", codes: [
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
-    ]);
+    ]) as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_bitwiseXorExpression_precedence_and_right() {
-    BinaryExpression expression = parseExpression("^ &", codes: [
+    var expression = parseExpression("^ &", codes: [
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
-    ]);
+    ]) as BinaryExpression;
     expect(expression.rightOperand, isBinaryExpression);
   }
 
   void test_bitwiseXorExpression_super() {
-    BinaryExpression expression = parseExpression("super ^  ^", codes: [
+    var expression = parseExpression("super ^  ^", codes: [
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
-    ]);
+    ]) as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
@@ -336,7 +354,7 @@
         parseExpression('x ? y :', codes: [ParserErrorCode.MISSING_IDENTIFIER]);
     expectNotNullIfNoErrors(expression);
     expect(expression, isConditionalExpression);
-    ConditionalExpression conditionalExpression = expression;
+    var conditionalExpression = expression as ConditionalExpression;
     expect(conditionalExpression.elseExpression, isSimpleIdentifier);
     expect(conditionalExpression.elseExpression.isSynthetic, isTrue);
   }
@@ -346,7 +364,7 @@
         parseExpression('x ? : z', codes: [ParserErrorCode.MISSING_IDENTIFIER]);
     expectNotNullIfNoErrors(expression);
     expect(expression, isConditionalExpression);
-    ConditionalExpression conditionalExpression = expression;
+    var conditionalExpression = expression as ConditionalExpression;
     expect(conditionalExpression.thenExpression, isSimpleIdentifier);
     expect(conditionalExpression.thenExpression.isSynthetic, isTrue);
   }
@@ -369,23 +387,24 @@
         codes: [ParserErrorCode.DIRECTIVE_AFTER_DECLARATION]);
     expect(unit.directives, hasLength(1));
     expect(unit.declarations, hasLength(1));
-    ClassDeclaration classDecl = unit.childEntities.first;
+    var classDecl = unit.childEntities.first as ClassDeclaration;
     expect(classDecl, isNotNull);
     expect(classDecl.name.name, 'foo');
   }
 
   void test_equalityExpression_missing_LHS() {
-    BinaryExpression expression =
-        parseExpression("== y", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
+    var expression =
+        parseExpression("== y", codes: [ParserErrorCode.MISSING_IDENTIFIER])
+            as BinaryExpression;
     expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.leftOperand.isSynthetic, isTrue);
   }
 
   void test_equalityExpression_missing_LHS_RHS() {
-    BinaryExpression expression = parseExpression("==", codes: [
+    var expression = parseExpression("==", codes: [
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
-    ]);
+    ]) as BinaryExpression;
     expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.leftOperand.isSynthetic, isTrue);
     expect(expression.rightOperand, isSimpleIdentifier);
@@ -393,15 +412,17 @@
   }
 
   void test_equalityExpression_missing_RHS() {
-    BinaryExpression expression =
-        parseExpression("x ==", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
+    var expression =
+        parseExpression("x ==", codes: [ParserErrorCode.MISSING_IDENTIFIER])
+            as BinaryExpression;
     expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_equalityExpression_missing_RHS_super() {
-    BinaryExpression expression = parseExpression("super ==",
-        codes: [ParserErrorCode.MISSING_IDENTIFIER]);
+    var expression =
+        parseExpression("super ==", codes: [ParserErrorCode.MISSING_IDENTIFIER])
+            as BinaryExpression;
     expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
@@ -415,11 +436,11 @@
   }
 
   void test_equalityExpression_super() {
-    BinaryExpression expression = parseExpression("super ==  ==", codes: [
+    var expression = parseExpression("super ==  ==", codes: [
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND
-    ]);
+    ]) as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
@@ -497,7 +518,7 @@
   void test_importDirectivePartial_as() {
     CompilationUnit unit = parseCompilationUnit("import 'b.dart' d as b;",
         codes: [ParserErrorCode.UNEXPECTED_TOKEN]);
-    ImportDirective importDirective = unit.childEntities.first;
+    var importDirective = unit.childEntities.first as ImportDirective;
     expect(importDirective.asKeyword, isNotNull);
     expect(unit.directives, hasLength(1));
     expect(unit.declarations, hasLength(0));
@@ -506,7 +527,7 @@
   void test_importDirectivePartial_hide() {
     CompilationUnit unit = parseCompilationUnit("import 'b.dart' d hide foo;",
         codes: [ParserErrorCode.UNEXPECTED_TOKEN]);
-    ImportDirective importDirective = unit.childEntities.first;
+    var importDirective = unit.childEntities.first as ImportDirective;
     expect(importDirective.combinators, hasLength(1));
     expect(unit.directives, hasLength(1));
     expect(unit.declarations, hasLength(0));
@@ -515,7 +536,7 @@
   void test_importDirectivePartial_show() {
     CompilationUnit unit = parseCompilationUnit("import 'b.dart' d show foo;",
         codes: [ParserErrorCode.UNEXPECTED_TOKEN]);
-    ImportDirective importDirective = unit.childEntities.first;
+    var importDirective = unit.childEntities.first as ImportDirective;
     expect(importDirective.combinators, hasLength(1));
     expect(unit.directives, hasLength(1));
     expect(unit.declarations, hasLength(0));
@@ -530,7 +551,7 @@
 
   void test_incomplete_constructorInitializers_empty() {
     createParser('C() : {}');
-    ClassMember member = parser.parseClassMember('C');
+    var member = parser.parseClassMember('C');
     expectNotNullIfNoErrors(member);
     listener.assertErrors(
         [expectedError(ParserErrorCode.MISSING_INITIALIZER, 4, 1)]);
@@ -538,7 +559,7 @@
 
   void test_incomplete_constructorInitializers_missingEquals() {
     createParser('C() : x(3) {}');
-    ClassMember member = parser.parseClassMember('C');
+    var member = parser.parseClassMember('C');
     expectNotNullIfNoErrors(member);
     listener.assertErrors([
       expectedError(ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALIZER, 6, 1)
@@ -557,7 +578,7 @@
 
   void test_incomplete_constructorInitializers_this() {
     createParser('C() : this {}');
-    ClassMember member = parser.parseClassMember('C');
+    var member = parser.parseClassMember('C');
     expectNotNullIfNoErrors(member);
     listener.assertErrors([
       expectedError(ParserErrorCode.EXPECTED_TOKEN, 11, 1),
@@ -567,7 +588,7 @@
 
   void test_incomplete_constructorInitializers_thisField() {
     createParser('C() : this.g {}');
-    ClassMember member = parser.parseClassMember('C');
+    var member = parser.parseClassMember('C');
     expectNotNullIfNoErrors(member);
     listener.assertErrors([
       expectedError(ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALIZER, 6, 4)
@@ -576,7 +597,7 @@
 
   void test_incomplete_constructorInitializers_thisPeriod() {
     createParser('C() : this. {}');
-    ClassMember member = parser.parseClassMember('C');
+    var member = parser.parseClassMember('C');
     expectNotNullIfNoErrors(member);
     listener.assertErrors([
       expectedError(ParserErrorCode.MISSING_IDENTIFIER, 12, 1),
@@ -586,7 +607,7 @@
 
   void test_incomplete_constructorInitializers_variable() {
     createParser('C() : x {}');
-    ClassMember member = parser.parseClassMember('C');
+    var member = parser.parseClassMember('C');
     expectNotNullIfNoErrors(member);
     listener.assertErrors([
       expectedError(ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALIZER, 6, 1)
@@ -596,15 +617,15 @@
   void test_incomplete_functionExpression() {
     var expression = parseExpression("() a => null",
         errors: [expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 3, 1)]);
-    FunctionExpression functionExpression = expression;
-    expect(functionExpression.parameters.parameters, hasLength(0));
+    var functionExpression = expression as FunctionExpression;
+    expect(functionExpression.parameters!.parameters, hasLength(0));
   }
 
   void test_incomplete_functionExpression2() {
     var expression = parseExpression("() a {}",
         errors: [expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 3, 1)]);
-    FunctionExpression functionExpression = expression;
-    expect(functionExpression.parameters.parameters, hasLength(0));
+    var functionExpression = expression as FunctionExpression;
+    expect(functionExpression.parameters!.parameters, hasLength(0));
   }
 
   void test_incomplete_returnType() {
@@ -709,7 +730,7 @@
     expect(classMember, isFieldDeclaration);
     VariableDeclarationList fieldList =
         (classMember as FieldDeclaration).fields;
-    expect(fieldList.keyword.keyword, Keyword.CONST);
+    expect(fieldList.keyword!.keyword, Keyword.CONST);
     NodeList<VariableDeclaration> fields = fieldList.variables;
     expect(fields, hasLength(1));
     VariableDeclaration field = fields[0];
@@ -734,7 +755,7 @@
     expect(classMember, isFieldDeclaration);
     VariableDeclarationList fieldList =
         (classMember as FieldDeclaration).fields;
-    expect(fieldList.keyword.keyword, Keyword.FINAL);
+    expect(fieldList.keyword!.keyword, Keyword.FINAL);
     NodeList<VariableDeclaration> fields = fieldList.variables;
     expect(fields, hasLength(1));
     VariableDeclaration field = fields[0];
@@ -757,8 +778,8 @@
     expect(members, hasLength(1));
     ClassMember classMember = members[0];
     expect(classMember, isFieldDeclaration);
-    FieldDeclaration declaration = classMember;
-    expect(declaration.staticKeyword.lexeme, 'static');
+    var declaration = classMember as FieldDeclaration;
+    expect(declaration.staticKeyword!.lexeme, 'static');
     VariableDeclarationList fieldList = declaration.fields;
     expect(fieldList.keyword, isNull);
     NodeList<VariableDeclaration> fields = fieldList.variables;
@@ -780,8 +801,8 @@
     expect(members, hasLength(1));
     ClassMember classMember = members[0];
     expect(classMember, isFieldDeclaration);
-    FieldDeclaration declaration = classMember;
-    expect(declaration.staticKeyword.lexeme, 'static');
+    var declaration = classMember as FieldDeclaration;
+    expect(declaration.staticKeyword!.lexeme, 'static');
     VariableDeclarationList fieldList = declaration.fields;
     expect(fieldList.keyword, isNull);
     NodeList<VariableDeclaration> fields = fieldList.variables;
@@ -808,7 +829,7 @@
     expect(classMember, isFieldDeclaration);
     VariableDeclarationList fieldList =
         (classMember as FieldDeclaration).fields;
-    TypeName type = fieldList.type;
+    var type = fieldList.type;
     NodeList<VariableDeclaration> fields = fieldList.variables;
     expect(fields, hasLength(1));
     VariableDeclaration field = fields[0];
@@ -834,7 +855,7 @@
     expect(classMember, isFieldDeclaration);
     VariableDeclarationList fieldList =
         (classMember as FieldDeclaration).fields;
-    expect(fieldList.keyword.keyword, Keyword.VAR);
+    expect(fieldList.keyword!.keyword, Keyword.VAR);
     NodeList<VariableDeclaration> fields = fieldList.variables;
     expect(fields, hasLength(1));
     VariableDeclaration field = fields[0];
@@ -844,7 +865,7 @@
   void test_incompleteForEach() {
 // TODO(danrubel): remove this once control flow and spread collection
 // entry parsing is enabled by default
-    ForStatement statement = parseStatement('for (String item i) {}');
+    var statement = parseStatement('for (String item i) {}') as ForStatement;
     listener.assertErrors([
       expectedError(ParserErrorCode.EXPECTED_TOKEN, 12, 4),
       expectedError(ParserErrorCode.EXPECTED_TOKEN, 17, 1)
@@ -859,14 +880,15 @@
   }
 
   void test_incompleteForEach2() {
-    ForStatement statement =
-        parseStatement('for (String item i) {}', featureSet: controlFlow);
+    var statement =
+        parseStatement('for (String item i) {}', featureSet: controlFlow)
+            as ForStatement;
     listener.assertErrors([
       expectedError(ParserErrorCode.EXPECTED_TOKEN, 12, 4),
       expectedError(ParserErrorCode.EXPECTED_TOKEN, 17, 1)
     ]);
     expect(statement.toSource(), 'for (String item; i;) {}');
-    ForPartsWithDeclarations forLoopParts = statement.forLoopParts;
+    var forLoopParts = statement.forLoopParts as ForPartsWithDeclarations;
     expect(forLoopParts.leftSeparator, isNotNull);
     expect(forLoopParts.leftSeparator.type, TokenType.SEMICOLON);
     expect(forLoopParts.rightSeparator, isNotNull);
@@ -946,7 +968,7 @@
     VariableDeclaration field = fields[0];
     expect(field.name.name, 'f');
 // validate the type
-    TypeArgumentList typeArguments = (fieldList.type as TypeName).typeArguments;
+    var typeArguments = (fieldList.type as TypeName).typeArguments!;
     expect(typeArguments.arguments, hasLength(1));
 // synthetic '>'
     Token token = typeArguments.endToken;
@@ -963,7 +985,7 @@
     expect(declarations, hasLength(1));
     ClassDeclaration classDecl = declarations[0] as ClassDeclaration;
 // validate the type parameters
-    TypeParameterList typeParameters = classDecl.typeParameters;
+    var typeParameters = classDecl.typeParameters!;
     expect(typeParameters.typeParameters, hasLength(1));
 // synthetic '>'
     Token token = typeParameters.endToken;
@@ -980,7 +1002,7 @@
     expect(declarations, hasLength(1));
     ClassDeclaration classDecl = declarations[0] as ClassDeclaration;
 // validate the type parameters
-    TypeParameterList typeParameters = classDecl.typeParameters;
+    var typeParameters = classDecl.typeParameters!;
     expect(typeParameters.typeParameters, hasLength(1));
 // synthetic '>'
     Token token = typeParameters.endToken;
@@ -997,7 +1019,7 @@
     expect(declarations, hasLength(1));
     ClassDeclaration classDecl = declarations[0] as ClassDeclaration;
 // validate the type parameters
-    TypeParameterList typeParameters = classDecl.typeParameters;
+    var typeParameters = classDecl.typeParameters!;
     expect(typeParameters.typeParameters, hasLength(1));
 // synthetic '>'
     Token token = typeParameters.endToken;
@@ -1032,7 +1054,7 @@
 // validate members
     ClassDeclaration classDecl = declarations[0] as ClassDeclaration;
     expect(classDecl.members, hasLength(1));
-    FieldDeclaration fields = classDecl.members.first;
+    var fields = classDecl.members.first as FieldDeclaration;
     expect(fields.fields.variables, hasLength(1));
     VariableDeclaration field = fields.fields.variables.first;
     expect(field.name.name, 'g');
@@ -1064,9 +1086,9 @@
     TypeAnnotation type = expression.type;
     expect(type, isNotNull);
     expect(type is TypeName && type.name.isSynthetic, isTrue);
-    ExpressionStatement thenStatement = ifStatement.thenStatement;
-    expect(thenStatement.semicolon.isSynthetic, isTrue);
-    SimpleIdentifier simpleId = thenStatement.expression;
+    var thenStatement = ifStatement.thenStatement as ExpressionStatement;
+    expect(thenStatement.semicolon!.isSynthetic, isTrue);
+    var simpleId = thenStatement.expression as SimpleIdentifier;
     expect(simpleId.isSynthetic, isTrue);
   }
 
@@ -1076,9 +1098,9 @@
       expectedError(ParserErrorCode.GETTER_CONSTRUCTOR, 10, 3),
       expectedError(ParserErrorCode.MISSING_METHOD_PARAMETERS, 14, 1),
     ]);
-    ClassDeclaration declaration = unit.declarations[0];
-    ConstructorDeclaration method = declaration.members[0];
-    expect(method.name.name, 'named');
+    var declaration = unit.declarations[0] as ClassDeclaration;
+    var method = declaration.members[0] as ConstructorDeclaration;
+    expect(method.name!.name, 'named');
     expect(method.parameters, isNotNull);
   }
 
@@ -1087,9 +1109,9 @@
         errors: [
           expectedError(ParserErrorCode.MISSING_METHOD_PARAMETERS, 10, 1)
         ]);
-    ClassDeclaration declaration = unit.declarations[0];
-    ConstructorDeclaration constructor = declaration.members[0];
-    expect(constructor.name.name, 'named');
+    var declaration = unit.declarations[0] as ClassDeclaration;
+    var constructor = declaration.members[0] as ConstructorDeclaration;
+    expect(constructor.name!.name, 'named');
     expect(constructor.parameters, isNotNull);
     expect(constructor.parameters.parameters, hasLength(0));
   }
@@ -1098,8 +1120,8 @@
     final unit = parseCompilationUnit('class C { C => null; }', errors: [
       expectedError(ParserErrorCode.MISSING_METHOD_PARAMETERS, 10, 1)
     ]);
-    ClassDeclaration declaration = unit.declarations[0];
-    ConstructorDeclaration constructor = declaration.members[0];
+    var declaration = unit.declarations[0] as ClassDeclaration;
+    var constructor = declaration.members[0] as ConstructorDeclaration;
     expect(constructor.name, isNull);
     expect(constructor.parameters, isNotNull);
     expect(constructor.parameters.parameters, hasLength(0));
@@ -1109,9 +1131,9 @@
     final unit = parseCompilationUnit('class C { C.named => null; }', errors: [
       expectedError(ParserErrorCode.MISSING_METHOD_PARAMETERS, 10, 1)
     ]);
-    ClassDeclaration declaration = unit.declarations[0];
-    ConstructorDeclaration constructor = declaration.members[0];
-    expect(constructor.name.name, 'named');
+    var declaration = unit.declarations[0] as ClassDeclaration;
+    var constructor = declaration.members[0] as ConstructorDeclaration;
+    expect(constructor.name!.name, 'named');
     expect(constructor.parameters, isNotNull);
     expect(constructor.parameters.parameters, hasLength(0));
   }
@@ -1122,9 +1144,9 @@
       expectedError(ParserErrorCode.SETTER_CONSTRUCTOR, 10, 3),
       expectedError(ParserErrorCode.MISSING_METHOD_PARAMETERS, 14, 1),
     ]);
-    ClassDeclaration declaration = unit.declarations[0];
-    ConstructorDeclaration method = declaration.members[0];
-    expect(method.name.name, 'named');
+    var declaration = unit.declarations[0] as ClassDeclaration;
+    var method = declaration.members[0] as ConstructorDeclaration;
+    expect(method.name!.name, 'named');
     expect(method.parameters, isNotNull);
     expect(method.parameters.parameters, hasLength(0));
   }
@@ -1136,17 +1158,18 @@
   }
 
   void test_logicalAndExpression_missing_LHS() {
-    BinaryExpression expression =
-        parseExpression("&& y", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
+    var expression =
+        parseExpression("&& y", codes: [ParserErrorCode.MISSING_IDENTIFIER])
+            as BinaryExpression;
     expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.leftOperand.isSynthetic, isTrue);
   }
 
   void test_logicalAndExpression_missing_LHS_RHS() {
-    BinaryExpression expression = parseExpression("&&", codes: [
+    var expression = parseExpression("&&", codes: [
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
-    ]);
+    ]) as BinaryExpression;
     expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.leftOperand.isSynthetic, isTrue);
     expect(expression.rightOperand, isSimpleIdentifier);
@@ -1154,42 +1177,44 @@
   }
 
   void test_logicalAndExpression_missing_RHS() {
-    BinaryExpression expression =
-        parseExpression("x &&", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
+    var expression =
+        parseExpression("x &&", codes: [ParserErrorCode.MISSING_IDENTIFIER])
+            as BinaryExpression;
     expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_logicalAndExpression_precedence_bitwiseOr_left() {
-    BinaryExpression expression = parseExpression("| &&", codes: [
+    var expression = parseExpression("| &&", codes: [
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
-    ]);
+    ]) as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_logicalAndExpression_precedence_bitwiseOr_right() {
-    BinaryExpression expression = parseExpression("&& |", codes: [
+    var expression = parseExpression("&& |", codes: [
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
-    ]);
+    ]) as BinaryExpression;
     expect(expression.rightOperand, isBinaryExpression);
   }
 
   void test_logicalOrExpression_missing_LHS() {
-    BinaryExpression expression =
-        parseExpression("|| y", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
+    var expression =
+        parseExpression("|| y", codes: [ParserErrorCode.MISSING_IDENTIFIER])
+            as BinaryExpression;
     expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.leftOperand.isSynthetic, isTrue);
   }
 
   void test_logicalOrExpression_missing_LHS_RHS() {
-    BinaryExpression expression = parseExpression("||", codes: [
+    var expression = parseExpression("||", codes: [
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
-    ]);
+    ]) as BinaryExpression;
     expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.leftOperand.isSynthetic, isTrue);
     expect(expression.rightOperand, isSimpleIdentifier);
@@ -1197,27 +1222,28 @@
   }
 
   void test_logicalOrExpression_missing_RHS() {
-    BinaryExpression expression =
-        parseExpression("x ||", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
+    var expression =
+        parseExpression("x ||", codes: [ParserErrorCode.MISSING_IDENTIFIER])
+            as BinaryExpression;
     expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_logicalOrExpression_precedence_logicalAnd_left() {
-    BinaryExpression expression = parseExpression("&& ||", codes: [
+    var expression = parseExpression("&& ||", codes: [
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
-    ]);
+    ]) as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_logicalOrExpression_precedence_logicalAnd_right() {
-    BinaryExpression expression = parseExpression("|| &&", codes: [
+    var expression = parseExpression("|| &&", codes: [
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
-    ]);
+    ]) as BinaryExpression;
     expect(expression.rightOperand, isBinaryExpression);
   }
 
@@ -1227,8 +1253,9 @@
   }
 
   void test_missing_commaInArgumentList() {
-    MethodInvocation expression = parseExpression("f(x: 1 y: 2)",
-        errors: [expectedError(ParserErrorCode.EXPECTED_TOKEN, 7, 1)]);
+    var expression = parseExpression("f(x: 1 y: 2)",
+            errors: [expectedError(ParserErrorCode.EXPECTED_TOKEN, 7, 1)])
+        as MethodInvocation;
     NodeList<Expression> arguments = expression.argumentList.arguments;
     expect(arguments, hasLength(2));
   }
@@ -1263,7 +1290,7 @@
 
   void test_missingIdentifier_afterAnnotation() {
     createParser('@override }', expectedEndOffset: 10);
-    ClassMember member = parser.parseClassMember('C');
+    var member = parser.parseClassMemberOrNull('C');
     expectNotNullIfNoErrors(member);
     listener.assertErrors(
         [expectedError(ParserErrorCode.EXPECTED_CLASS_MEMBER, 10, 1)]);
@@ -1276,7 +1303,7 @@
     void verify(CompilationUnitMember member, String expectedTypeName,
         String expectedName, String expectedSemicolon) {
       expect(member, isTopLevelVariableDeclaration);
-      TopLevelVariableDeclaration declaration = member;
+      var declaration = member as TopLevelVariableDeclaration;
       VariableDeclarationList variableList = declaration.variables;
       expect(variableList, isNotNull);
       NodeList<VariableDeclaration> variables = variableList.variables;
@@ -1307,17 +1334,18 @@
   }
 
   void test_multiplicativeExpression_missing_LHS() {
-    BinaryExpression expression =
-        parseExpression("* y", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
+    var expression =
+        parseExpression("* y", codes: [ParserErrorCode.MISSING_IDENTIFIER])
+            as BinaryExpression;
     expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.leftOperand.isSynthetic, isTrue);
   }
 
   void test_multiplicativeExpression_missing_LHS_RHS() {
-    BinaryExpression expression = parseExpression("*", codes: [
+    var expression = parseExpression("*", codes: [
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
-    ]);
+    ]) as BinaryExpression;
     expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.leftOperand.isSynthetic, isTrue);
     expect(expression.rightOperand, isSimpleIdentifier);
@@ -1325,37 +1353,41 @@
   }
 
   void test_multiplicativeExpression_missing_RHS() {
-    BinaryExpression expression =
-        parseExpression("x *", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
+    var expression =
+        parseExpression("x *", codes: [ParserErrorCode.MISSING_IDENTIFIER])
+            as BinaryExpression;
     expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_multiplicativeExpression_missing_RHS_super() {
-    BinaryExpression expression =
-        parseExpression("super *", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
+    var expression =
+        parseExpression("super *", codes: [ParserErrorCode.MISSING_IDENTIFIER])
+            as BinaryExpression;
     expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_multiplicativeExpression_precedence_unary_left() {
-    BinaryExpression expression =
-        parseExpression("-x *", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
+    var expression =
+        parseExpression("-x *", codes: [ParserErrorCode.MISSING_IDENTIFIER])
+            as BinaryExpression;
     expect(expression.leftOperand, isPrefixExpression);
   }
 
   void test_multiplicativeExpression_precedence_unary_right() {
-    BinaryExpression expression =
-        parseExpression("* -y", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
+    var expression =
+        parseExpression("* -y", codes: [ParserErrorCode.MISSING_IDENTIFIER])
+            as BinaryExpression;
     expect(expression.rightOperand, isPrefixExpression);
   }
 
   void test_multiplicativeExpression_super() {
-    BinaryExpression expression = parseExpression("super ==  ==", codes: [
+    var expression = parseExpression("super ==  ==", codes: [
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND
-    ]);
+    ]) as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
@@ -1366,10 +1398,10 @@
       expectedError(ParserErrorCode.NAMED_PARAMETER_OUTSIDE_GROUP, 23, 1)
     ]);
     expect(unit.declarations, hasLength(1));
-    ClassDeclaration classA = unit.declarations[0];
+    var classA = unit.declarations[0] as ClassDeclaration;
     expect(classA.members, hasLength(1));
-    MethodDeclaration method = classA.members[0];
-    NodeList<FormalParameter> parameters = method.parameters.parameters;
+    var method = classA.members[0] as MethodDeclaration;
+    List<FormalParameter> parameters = method.parameters!.parameters;
     expect(parameters, hasLength(3));
     expect(parameters[0].isNamed, isTrue);
     expect(parameters[1].isNamed, isTrue);
@@ -1388,17 +1420,19 @@
   }
 
   void test_prefixExpression_missing_operand_minus() {
-    PrefixExpression expression =
-        parseExpression("-", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
+    var expression =
+        parseExpression("-", codes: [ParserErrorCode.MISSING_IDENTIFIER])
+            as PrefixExpression;
     expect(expression.operand, isSimpleIdentifier);
     expect(expression.operand.isSynthetic, isTrue);
     expect(expression.operator.type, TokenType.MINUS);
   }
 
   void test_primaryExpression_argumentDefinitionTest() {
-    SimpleIdentifier expression = parsePrimaryExpression('?a',
-        expectedEndOffset: 0,
-        errors: [expectedError(ParserErrorCode.MISSING_IDENTIFIER, 0, 1)]);
+    var expression = parsePrimaryExpression('?a',
+            expectedEndOffset: 0,
+            errors: [expectedError(ParserErrorCode.MISSING_IDENTIFIER, 0, 1)])
+        as SimpleIdentifier;
     expectNotNullIfNoErrors(expression);
     expect(expression.isSynthetic, isTrue);
   }
@@ -1408,15 +1442,16 @@
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
     ]);
-    PrefixedIdentifier expression = result;
+    var expression = result as PrefixedIdentifier;
     expect(expression.prefix.isSynthetic, isTrue);
     expect(expression.period.lexeme, '.');
     expect(expression.identifier.isSynthetic, isTrue);
   }
 
   void test_relationalExpression_missing_LHS() {
-    IsExpression expression =
-        parseExpression("is y", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
+    var expression =
+        parseExpression("is y", codes: [ParserErrorCode.MISSING_IDENTIFIER])
+            as IsExpression;
     expect(expression.expression, isSimpleIdentifier);
     expect(expression.expression.isSynthetic, isTrue);
   }
@@ -1429,8 +1464,9 @@
   }
 
   void test_relationalExpression_missing_RHS() {
-    IsExpression expression =
-        parseExpression("x is", codes: [ParserErrorCode.EXPECTED_TYPE_NAME]);
+    var expression =
+        parseExpression("x is", codes: [ParserErrorCode.EXPECTED_TYPE_NAME])
+            as IsExpression;
     expect(expression.type, isTypeName);
     expect(expression.type.isSynthetic, isTrue);
   }
@@ -1444,17 +1480,18 @@
   }
 
   void test_shiftExpression_missing_LHS() {
-    BinaryExpression expression =
-        parseExpression("<< y", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
+    var expression =
+        parseExpression("<< y", codes: [ParserErrorCode.MISSING_IDENTIFIER])
+            as BinaryExpression;
     expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.leftOperand.isSynthetic, isTrue);
   }
 
   void test_shiftExpression_missing_LHS_RHS() {
-    BinaryExpression expression = parseExpression("<<", codes: [
+    var expression = parseExpression("<<", codes: [
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
-    ]);
+    ]) as BinaryExpression;
     expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.leftOperand.isSynthetic, isTrue);
     expect(expression.rightOperand, isSimpleIdentifier);
@@ -1462,42 +1499,44 @@
   }
 
   void test_shiftExpression_missing_RHS() {
-    BinaryExpression expression =
-        parseExpression("x <<", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
+    var expression =
+        parseExpression("x <<", codes: [ParserErrorCode.MISSING_IDENTIFIER])
+            as BinaryExpression;
     expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_shiftExpression_missing_RHS_super() {
-    BinaryExpression expression = parseExpression("super <<",
-        codes: [ParserErrorCode.MISSING_IDENTIFIER]);
+    var expression =
+        parseExpression("super <<", codes: [ParserErrorCode.MISSING_IDENTIFIER])
+            as BinaryExpression;
     expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_shiftExpression_precedence_unary_left() {
-    BinaryExpression expression = parseExpression("+ <<", codes: [
+    var expression = parseExpression("+ <<", codes: [
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
-    ]);
+    ]) as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_shiftExpression_precedence_unary_right() {
-    BinaryExpression expression = parseExpression("<< +", codes: [
+    var expression = parseExpression("<< +", codes: [
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
-    ]);
+    ]) as BinaryExpression;
     expect(expression.rightOperand, isBinaryExpression);
   }
 
   void test_shiftExpression_super() {
-    BinaryExpression expression = parseExpression("super << <<", codes: [
+    var expression = parseExpression("super << <<", codes: [
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
-    ]);
+    ]) as BinaryExpression;
     expect(expression.leftOperand, isBinaryExpression);
   }
 
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index 3453f53..6660814 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -7,7 +7,6 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/resolver/scope.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/parser.dart' show ParserErrorCode;
@@ -100,7 +99,7 @@
   Map<String, Element> _toMap(List<Element> elements) {
     Map<String, Element> map = HashMap<String, Element>();
     for (Element element in elements) {
-      map[element.name] = element;
+      map[element.name!] = element;
     }
     return map;
   }
@@ -180,7 +179,7 @@
   @override
   void visitExpression(Expression node) {
     node.visitChildren(this);
-    DartType staticType = node.staticType;
+    var staticType = node.staticType;
     if (staticType == null) {
       _unresolvedExpressions.add(node);
     } else {
@@ -201,7 +200,7 @@
   void visitPrefixedIdentifier(PrefixedIdentifier node) {
     // In cases where we have a prefixed identifier where the prefix is dynamic,
     // we don't want to assert that the node will have a type.
-    if (node.staticType == null && node.prefix.staticType.isDynamic) {
+    if (node.staticType == null && node.prefix.staticType!.isDynamic) {
       return;
     }
     super.visitPrefixedIdentifier(node);
@@ -211,7 +210,7 @@
   void visitSimpleIdentifier(SimpleIdentifier node) {
     // In cases where identifiers are being used for something other than an
     // expressions, then they can be ignored.
-    AstNode parent = node.parent;
+    var parent = node.parent;
     if (parent is MethodInvocation && identical(node, parent.methodName)) {
       return;
     } else if (parent is RedirectingConstructorInvocation &&
@@ -255,7 +254,7 @@
     }
   }
 
-  String _getFileName(AstNode node) {
+  String _getFileName(AstNode? node) {
     // TODO (jwren) there are two copies of this method, one here and one in
     // ResolutionVerifier, they should be resolved into a single method
     if (node != null) {
@@ -263,7 +262,7 @@
       if (root is CompilationUnit) {
         CompilationUnit rootCU = root;
         if (rootCU.declaredElement != null) {
-          return rootCU.declaredElement.source.fullName;
+          return rootCU.declaredElement!.source.fullName;
         } else {
           return "<unknown file- CompilationUnit.getElement() returned null>";
         }
diff --git a/pkg/analyzer/test/generated/resolver_test_case.dart b/pkg/analyzer/test/generated/resolver_test_case.dart
index f93c5d8..ceaa0ac 100644
--- a/pkg/analyzer/test/generated/resolver_test_case.dart
+++ b/pkg/analyzer/test/generated/resolver_test_case.dart
@@ -6,7 +6,6 @@
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:test/test.dart';
 
@@ -17,7 +16,7 @@
 class ResolutionVerifier extends RecursiveAstVisitor<void> {
   /// A set containing nodes that are known to not be resolvable and should
   /// therefore not cause the test to fail.
-  final Set<AstNode> _knownExceptions;
+  final Set<AstNode>? _knownExceptions;
 
   /// A list containing all of the AST nodes that were not resolved.
   final List<AstNode> _unresolvedNodes = <AstNode>[];
@@ -56,9 +55,9 @@
   @override
   void visitAnnotation(Annotation node) {
     node.visitChildren(this);
-    ElementAnnotation elementAnnotation = node.elementAnnotation;
+    var elementAnnotation = node.elementAnnotation;
     if (elementAnnotation == null) {
-      if (_knownExceptions == null || !_knownExceptions.contains(node)) {
+      if (_knownExceptions == null || !_knownExceptions!.contains(node)) {
         _unresolvedNodes.add(node);
       }
     } else if (elementAnnotation is! ElementAnnotation) {
@@ -72,7 +71,7 @@
     if (!node.operator.isUserDefinableOperator) {
       return;
     }
-    DartType operandType = node.leftOperand.staticType;
+    var operandType = node.leftOperand.staticType;
     if (operandType == null || operandType.isDynamic) {
       return;
     }
@@ -115,7 +114,7 @@
     // Not sure how to test the combinators given that it isn't an error if the
     // names are not defined.
     _checkResolved(node, node.element, (node) => node is ImportElement);
-    SimpleIdentifier prefix = node.prefix;
+    var prefix = node.prefix;
     if (prefix == null) {
       return;
     }
@@ -126,11 +125,11 @@
   @override
   void visitIndexExpression(IndexExpression node) {
     node.visitChildren(this);
-    DartType targetType = node.realTarget.staticType;
+    var targetType = node.realTarget.staticType;
     if (targetType == null || targetType.isDynamic) {
       return;
     }
-    AstNode parent = node.parent;
+    var parent = node.parent;
     if (parent is AssignmentExpression && parent.leftHandSide == node) {
       return;
     }
@@ -164,7 +163,7 @@
     if (!node.operator.isUserDefinableOperator) {
       return;
     }
-    DartType operandType = node.operand.staticType;
+    var operandType = node.operand.staticType;
     if (operandType == null || operandType.isDynamic) {
       return;
     }
@@ -175,7 +174,7 @@
   void visitPrefixedIdentifier(PrefixedIdentifier node) {
     SimpleIdentifier prefix = node.prefix;
     prefix.accept(this);
-    DartType prefixType = prefix.staticType;
+    var prefixType = prefix.staticType;
     if (prefixType == null || prefixType.isDynamic) {
       return;
     }
@@ -188,7 +187,7 @@
     if (!node.operator.isUserDefinableOperator) {
       return;
     }
-    DartType operandType = node.operand.staticType;
+    var operandType = node.operand.staticType;
     if (operandType == null || operandType.isDynamic) {
       return;
     }
@@ -199,11 +198,11 @@
   void visitPropertyAccess(PropertyAccess node) {
     Expression target = node.realTarget;
     target.accept(this);
-    DartType targetType = target.staticType;
+    var targetType = target.staticType;
     if (targetType == null || targetType.isDynamic) {
       return;
     }
-    AstNode parent = node.parent;
+    var parent = node.parent;
     if (parent is AssignmentExpression && parent.leftHandSide == node) {
       return;
     }
@@ -215,20 +214,23 @@
     if (node.name == "void") {
       return;
     }
-    if (node.staticType != null &&
-        node.staticType.isDynamic &&
+
+    var staticType = node.staticType;
+    if (staticType != null &&
+        staticType.isDynamic &&
         node.staticElement == null) {
       return;
     }
-    AstNode parent = node.parent;
+
+    var parent = node.parent;
     if (parent is AssignmentExpression && parent.leftHandSide == node) {
       return;
     }
     if (parent is MethodInvocation) {
       MethodInvocation invocation = parent;
       if (identical(invocation.methodName, node)) {
-        Expression target = invocation.realTarget;
-        DartType targetType = target == null ? null : target.staticType;
+        var target = invocation.realTarget;
+        var targetType = target == null ? null : target.staticType;
         if (targetType == null || targetType.isDynamic) {
           return;
         }
@@ -238,9 +240,9 @@
   }
 
   void _checkResolved(
-      AstNode node, Element element, Predicate<Element> predicate) {
+      AstNode node, Element? element, Predicate<Element>? predicate) {
     if (element == null) {
-      if (_knownExceptions == null || !_knownExceptions.contains(node)) {
+      if (_knownExceptions == null || !_knownExceptions!.contains(node)) {
         _unresolvedNodes.add(node);
       }
     } else if (predicate != null) {
@@ -250,7 +252,7 @@
     }
   }
 
-  String _getFileName(AstNode node) {
+  String _getFileName(AstNode? node) {
     // TODO (jwren) there are two copies of this method, one here and one in
     // StaticTypeVerifier, they should be resolved into a single method
     if (node != null) {
@@ -258,7 +260,7 @@
       if (root is CompilationUnit) {
         CompilationUnit rootCU = root;
         if (rootCU.declaredElement != null) {
-          return rootCU.declaredElement.source.fullName;
+          return rootCU.declaredElement!.source.fullName;
         } else {
           return "<unknown file- CompilationUnit.getElement() returned null>";
         }
@@ -287,11 +289,11 @@
   /// Looks up the identifier with [name] and validates that its type type
   /// stringifies to [type] and that its generics match the given stringified
   /// output.
-  FunctionTypeImpl expectFunctionType(String name, String type,
+  FunctionType expectFunctionType(String name, String type,
       {String typeParams = '[]',
       String typeArgs = '[]',
       String typeFormals = '[]',
-      String identifierType}) {
+      String? identifierType}) {
     identifierType ??= type;
 
     String typeParametersStr(List<TypeParameterElement> elements) {
@@ -313,7 +315,7 @@
   /// Looks up the identifier with [name] and validates that its element type
   /// stringifies to [type] and that its generics match the given stringified
   /// output.
-  FunctionTypeImpl expectFunctionType2(String name, String type) {
+  FunctionType expectFunctionType2(String name, String type) {
     var identifier = findNode.simple(name);
     var functionType = _getFunctionTypedElementType(identifier);
     assertType(functionType, type);
@@ -338,9 +340,8 @@
   /// to match the type.
   void expectInitializerType(String name, type) {
     SimpleIdentifier identifier = findNode.simple(name);
-    VariableDeclaration declaration =
-        identifier.thisOrAncestorOfType<VariableDeclaration>();
-    Expression initializer = declaration.initializer;
+    var declaration = identifier.thisOrAncestorOfType<VariableDeclaration>()!;
+    var initializer = declaration.initializer!;
     _expectType(initializer.staticType, type);
   }
 
@@ -349,7 +350,7 @@
   /// If [expected] is a string, validates that the type stringifies to that
   /// text. Otherwise, [expected] is used directly a [Matcher] to match the
   /// type.
-  _expectType(DartType type, expected) {
+  _expectType(DartType? type, expected) {
     if (expected is String) {
       assertType(type, expected);
     } else {
@@ -357,12 +358,12 @@
     }
   }
 
-  FunctionTypeImpl _getFunctionTypedElementType(SimpleIdentifier identifier) {
+  FunctionType _getFunctionTypedElementType(SimpleIdentifier identifier) {
     var element = identifier.staticElement;
     if (element is ExecutableElement) {
       return element.type;
     } else if (element is VariableElement) {
-      return element.type;
+      return element.type as FunctionType;
     } else {
       fail('Unexpected element: (${element.runtimeType}) $element');
     }
diff --git a/pkg/analyzer/test/generated/scanner_test.dart b/pkg/analyzer/test/generated/scanner_test.dart
index c0c874f..939b23e 100644
--- a/pkg/analyzer/test/generated/scanner_test.dart
+++ b/pkg/analyzer/test/generated/scanner_test.dart
@@ -133,11 +133,12 @@
   void test_linestarts() {
     String source = "var\r\ni\n=\n1;\n";
     GatheringErrorListener listener = GatheringErrorListener();
-    Scanner scanner = Scanner(null, CharSequenceReader(source), listener)
-      ..configureFeatures(
-        featureSetForOverriding: featureSet,
-        featureSet: featureSet,
-      );
+    Scanner scanner =
+        Scanner(TestSource(), CharSequenceReader(source), listener)
+          ..configureFeatures(
+            featureSetForOverriding: featureSet,
+            featureSet: featureSet,
+          );
     var token = scanner.tokenize();
     expect(token.lexeme, 'var');
     var lineStarts = scanner.lineStarts;
@@ -150,16 +151,17 @@
     // See https://github.com/dart-lang/sdk/issues/30320
     String source = '<!-- @Component(';
     GatheringErrorListener listener = GatheringErrorListener();
-    Scanner scanner = Scanner(null, CharSequenceReader(source), listener)
-      ..configureFeatures(
-        featureSetForOverriding: featureSet,
-        featureSet: featureSet,
-      );
+    Scanner scanner =
+        Scanner(TestSource(), CharSequenceReader(source), listener)
+          ..configureFeatures(
+            featureSetForOverriding: featureSet,
+            featureSet: featureSet,
+          );
     Token token = scanner.tokenize(reportScannerErrors: false);
     expect(token, TypeMatcher<UnmatchedToken>());
-    token = token.next;
+    token = token.next!;
     expect(token, TypeMatcher<UnmatchedToken>());
-    token = token.next;
+    token = token.next!;
     expect(token, isNot(TypeMatcher<ErrorToken>()));
   }
 
@@ -168,7 +170,7 @@
     GatheringErrorListener listener = GatheringErrorListener();
     _scanWithListener(source, listener);
     listener.assertNoErrors();
-    LineInfo info = listener.getLineInfo(TestSource());
+    LineInfo info = listener.getLineInfo(TestSource())!;
     expect(info, isNotNull);
     int count = expectedLocations.length;
     for (int i = 0; i < count; i++) {
@@ -186,11 +188,12 @@
     String source,
     GatheringErrorListener listener,
   ) {
-    Scanner scanner = Scanner(null, CharSequenceReader(source), listener)
-      ..configureFeatures(
-        featureSetForOverriding: featureSet,
-        featureSet: featureSet,
-      );
+    Scanner scanner =
+        Scanner(TestSource(), CharSequenceReader(source), listener)
+          ..configureFeatures(
+            featureSetForOverriding: featureSet,
+            featureSet: featureSet,
+          );
     Token result = scanner.tokenize();
     listener.setLineInfo(TestSource(), scanner.lineStarts);
     return result;
@@ -277,13 +280,13 @@
     }
   }
 
-  void _validateStream(StringBuffer buffer, Token token) {
+  void _validateStream(StringBuffer buffer, Token? token) {
     if (token == null) {
       return;
     }
-    Token previousToken;
+    late Token previousToken;
     int previousEnd = -1;
-    Token currentToken = token;
+    Token? currentToken = token;
     while (currentToken != null && currentToken.type != TokenType.EOF) {
       _validateStream(buffer, currentToken.precedingComments);
       TokenType type = currentToken.type;
diff --git a/pkg/analyzer/test/generated/simple_parser_test.dart b/pkg/analyzer/test/generated/simple_parser_test.dart
index c3f40da..e8b9023 100644
--- a/pkg/analyzer/test/generated/simple_parser_test.dart
+++ b/pkg/analyzer/test/generated/simple_parser_test.dart
@@ -42,9 +42,9 @@
     CompilationUnit unit = parser.parseCompilationUnit2();
     expect(unit, isNotNull);
     expect(unit.declarations, hasLength(1));
-    ClassDeclaration classDecl = unit.declarations[0];
+    var classDecl = unit.declarations[0] as ClassDeclaration;
     expect(classDecl, isNotNull);
-    return classDecl.extendsClause;
+    return classDecl.extendsClause!;
   }
 
   List<SimpleIdentifier> parseIdentifierList(String identifiers) {
@@ -59,9 +59,9 @@
     CompilationUnit unit = parser.parseCompilationUnit2();
     expect(unit, isNotNull);
     expect(unit.declarations, hasLength(1));
-    ClassDeclaration classDecl = unit.declarations[0];
+    var classDecl = unit.declarations[0] as ClassDeclaration;
     expect(classDecl, isNotNull);
-    return classDecl.implementsClause;
+    return classDecl.implementsClause!;
   }
 
   LibraryIdentifier parseLibraryIdentifier(String name) {
@@ -69,7 +69,7 @@
     CompilationUnit unit = parser.parseCompilationUnit2();
     expect(unit, isNotNull);
     expect(unit.directives, hasLength(1));
-    LibraryDirective directive = unit.directives[0];
+    var directive = unit.directives[0] as LibraryDirective;
     return directive.name;
   }
 
@@ -80,7 +80,7 @@
   void parseStatementList(String content, int expectedCount) {
     Statement statement = parseStatement('{$content}');
     expect(statement, isBlock);
-    Block block = statement;
+    var block = statement as Block;
     expect(block.statements, hasLength(expectedCount));
   }
 
@@ -89,7 +89,7 @@
     CompilationUnit unit = parser.parseCompilationUnit2();
     expect(unit, isNotNull);
     expect(unit.declarations, hasLength(1));
-    TopLevelVariableDeclaration decl = unit.declarations[0];
+    var decl = unit.declarations[0] as TopLevelVariableDeclaration;
     expect(decl, isNotNull);
     return decl.variables.variables[0];
   }
@@ -99,19 +99,19 @@
     CompilationUnit unit = parser.parseCompilationUnit2();
     expect(unit, isNotNull);
     expect(unit.declarations, hasLength(1));
-    ClassDeclaration classDecl = unit.declarations[0];
+    var classDecl = unit.declarations[0] as ClassDeclaration;
     expect(classDecl, isNotNull);
-    return classDecl.withClause;
+    return classDecl.withClause!;
   }
 
   void test_classDeclaration_complexTypeParam() {
     CompilationUnit unit = parseCompilationUnit('''
 class C<@Foo.bar(const [], const [1], const{"":r""}, 0xFF + 2, .3, 4.5) T> {}
 ''');
-    ClassDeclaration clazz = unit.declarations[0];
+    var clazz = unit.declarations[0] as ClassDeclaration;
     expect(clazz.name.name, 'C');
-    expect(clazz.typeParameters.typeParameters, hasLength(1));
-    TypeParameter typeParameter = clazz.typeParameters.typeParameters[0];
+    expect(clazz.typeParameters!.typeParameters, hasLength(1));
+    TypeParameter typeParameter = clazz.typeParameters!.typeParameters[0];
     expect(typeParameter.name.name, 'T');
     expect(typeParameter.metadata, hasLength(1));
     Annotation metadata = typeParameter.metadata[0];
@@ -125,9 +125,9 @@
     ]);
     var classDeclaration = unit.declarations[0] as ClassDeclaration;
     var method = classDeclaration.members[0] as MethodDeclaration;
-    expect(method.parameters.parameters, hasLength(1));
+    expect(method.parameters!.parameters, hasLength(1));
     var parameter =
-        method.parameters.parameters[0] as FunctionTypedFormalParameter;
+        method.parameters!.parameters[0] as FunctionTypedFormalParameter;
     expect(parameter.identifier, isNotNull);
   }
 
@@ -206,15 +206,15 @@
   test_parseArgument() {
     Expression result = parseArgument('3');
     expect(result, const TypeMatcher<IntegerLiteral>());
-    IntegerLiteral literal = result;
+    var literal = result as IntegerLiteral;
     expect(literal.value, 3);
   }
 
   test_parseArgument_named() {
     Expression result = parseArgument('foo: "a"');
     expect(result, const TypeMatcher<NamedExpression>());
-    NamedExpression expression = result;
-    StringLiteral literal = expression.expression;
+    var expression = result as NamedExpression;
+    var literal = expression.expression as StringLiteral;
     expect(literal.stringValue, 'a');
   }
 
@@ -343,7 +343,7 @@
     CompilationUnit unit = parser.parseCompilationUnit2();
     expectNotNullIfNoErrors(unit);
     assertNoErrors();
-    ClassDeclaration declaration = unit.declarations[0];
+    var declaration = unit.declarations[0] as ClassDeclaration;
     expect(declaration.documentationComment, isNotNull);
     expect(declaration.metadata, isEmpty);
   }
@@ -353,8 +353,8 @@
     CompilationUnit unit = parser.parseCompilationUnit2();
     expectNotNullIfNoErrors(unit);
     assertNoErrors();
-    ClassDeclaration declaration = unit.declarations[0];
-    Comment comment = declaration.documentationComment;
+    var declaration = unit.declarations[0] as ClassDeclaration;
+    Comment comment = declaration.documentationComment!;
     expect(comment.isDocumentation, isTrue);
     expect(comment.tokens, hasLength(1));
     expect(comment.tokens[0].lexeme, '/** 2 */');
@@ -366,7 +366,7 @@
     CompilationUnit unit = parser.parseCompilationUnit2();
     expectNotNullIfNoErrors(unit);
     assertNoErrors();
-    ClassDeclaration declaration = unit.declarations[0];
+    var declaration = unit.declarations[0] as ClassDeclaration;
     expect(declaration.documentationComment, isNotNull);
     expect(declaration.metadata, hasLength(2));
   }
@@ -376,7 +376,7 @@
     CompilationUnit unit = parser.parseCompilationUnit2();
     expectNotNullIfNoErrors(unit);
     assertNoErrors();
-    ClassDeclaration declaration = unit.declarations[0];
+    var declaration = unit.declarations[0] as ClassDeclaration;
     expect(declaration.documentationComment, isNotNull);
     expect(declaration.metadata, hasLength(2));
   }
@@ -386,7 +386,7 @@
     CompilationUnit unit = parser.parseCompilationUnit2();
     expectNotNullIfNoErrors(unit);
     assertNoErrors();
-    ClassDeclaration declaration = unit.declarations[0];
+    var declaration = unit.declarations[0] as ClassDeclaration;
     expect(declaration.documentationComment, isNull);
     expect(declaration.metadata, hasLength(1));
   }
@@ -396,7 +396,7 @@
     CompilationUnit unit = parser.parseCompilationUnit2();
     expectNotNullIfNoErrors(unit);
     assertNoErrors();
-    ClassDeclaration declaration = unit.declarations[0];
+    var declaration = unit.declarations[0] as ClassDeclaration;
     expect(declaration.documentationComment, isNotNull);
     expect(declaration.metadata, hasLength(2));
   }
@@ -406,9 +406,9 @@
     CompilationUnit unit = parser.parseCompilationUnit2();
     expectNotNullIfNoErrors(unit);
     assertNoErrors();
-    ClassDeclaration declaration = unit.declarations[0];
+    var declaration = unit.declarations[0] as ClassDeclaration;
     expect(declaration.documentationComment, isNotNull);
-    expect(declaration.documentationComment.tokens[0].lexeme, contains('2'));
+    expect(declaration.documentationComment!.tokens[0].lexeme, contains('2'));
     expect(declaration.metadata, hasLength(2));
   }
 
@@ -425,9 +425,9 @@
     CompilationUnit unit = parser.parseCompilationUnit2();
     expectNotNullIfNoErrors(unit);
     assertNoErrors();
-    ClassDeclaration declaration = unit.declarations[0];
+    var declaration = unit.declarations[0] as ClassDeclaration;
     expect(declaration.metadata, hasLength(0));
-    List<Token> tokens = declaration.documentationComment.tokens;
+    List<Token> tokens = declaration.documentationComment!.tokens;
     expect(tokens, hasLength(1));
     expect(tokens[0].lexeme, contains('bbb'));
   }
@@ -444,9 +444,9 @@
     CompilationUnit unit = parser.parseCompilationUnit2();
     expectNotNullIfNoErrors(unit);
     assertNoErrors();
-    ClassDeclaration declaration = unit.declarations[0];
+    var declaration = unit.declarations[0] as ClassDeclaration;
     expect(declaration.metadata, hasLength(0));
-    List<Token> tokens = declaration.documentationComment.tokens;
+    List<Token> tokens = declaration.documentationComment!.tokens;
     expect(tokens, hasLength(2));
     expect(tokens[0].lexeme, contains('bbb'));
     expect(tokens[1].lexeme, contains('ccc'));
@@ -464,9 +464,9 @@
     CompilationUnit unit = parser.parseCompilationUnit2();
     expectNotNullIfNoErrors(unit);
     assertNoErrors();
-    ClassDeclaration declaration = unit.declarations[0];
+    var declaration = unit.declarations[0] as ClassDeclaration;
     expect(declaration.metadata, hasLength(0));
-    List<Token> tokens = declaration.documentationComment.tokens;
+    List<Token> tokens = declaration.documentationComment!.tokens;
     expect(tokens, hasLength(1));
     expect(tokens[0].lexeme, contains('ccc'));
   }
@@ -484,9 +484,9 @@
     CompilationUnit unit = parser.parseCompilationUnit2();
     expectNotNullIfNoErrors(unit);
     assertNoErrors();
-    ClassDeclaration declaration = unit.declarations[0];
+    var declaration = unit.declarations[0] as ClassDeclaration;
     expect(declaration.metadata, hasLength(0));
-    List<Token> tokens = declaration.documentationComment.tokens;
+    List<Token> tokens = declaration.documentationComment!.tokens;
     expect(tokens, hasLength(1));
     expect(tokens[0].lexeme, contains('ddd'));
   }
@@ -502,9 +502,9 @@
     CompilationUnit unit = parser.parseCompilationUnit2();
     expectNotNullIfNoErrors(unit);
     assertNoErrors();
-    ClassDeclaration declaration = unit.declarations[0];
+    var declaration = unit.declarations[0] as ClassDeclaration;
     expect(declaration.metadata, hasLength(0));
-    List<Token> tokens = declaration.documentationComment.tokens;
+    List<Token> tokens = declaration.documentationComment!.tokens;
     expect(tokens, hasLength(1));
     expect(tokens[0].lexeme, contains('aaa'));
   }
@@ -514,7 +514,7 @@
     CompilationUnit unit = parser.parseCompilationUnit2();
     expectNotNullIfNoErrors(unit);
     assertNoErrors();
-    ClassDeclaration declaration = unit.declarations[0];
+    var declaration = unit.declarations[0] as ClassDeclaration;
     expect(declaration.documentationComment, isNull);
     expect(declaration.metadata, hasLength(2));
   }
@@ -524,7 +524,7 @@
     CompilationUnit unit = parser.parseCompilationUnit2();
     expectNotNullIfNoErrors(unit);
     assertNoErrors();
-    ClassDeclaration declaration = unit.declarations[0];
+    var declaration = unit.declarations[0] as ClassDeclaration;
     expect(declaration.documentationComment, isNull);
     expect(declaration.metadata, isEmpty);
   }
@@ -538,18 +538,18 @@
     CompilationUnit unit = parser.parseCompilationUnit2();
     expectNotNullIfNoErrors(unit);
     assertNoErrors();
-    ClassDeclaration declaration = unit.declarations[0];
+    var declaration = unit.declarations[0] as ClassDeclaration;
     expect(declaration.documentationComment, isNotNull);
     expect(declaration.metadata, isEmpty);
   }
 
   void test_parseCommentReference_new_prefixed() {
     createParser('');
-    CommentReference reference = parseCommentReference('new a.b', 7);
+    var reference = parseCommentReference('new a.b', 7)!;
     expectNotNullIfNoErrors(reference);
     assertNoErrors();
     expect(reference.identifier, isPrefixedIdentifier);
-    PrefixedIdentifier prefixedIdentifier = reference.identifier;
+    var prefixedIdentifier = reference.identifier as PrefixedIdentifier;
     SimpleIdentifier prefix = prefixedIdentifier.prefix;
     expect(prefix.token, isNotNull);
     expect(prefix.name, "a");
@@ -563,11 +563,11 @@
 
   void test_parseCommentReference_new_simple() {
     createParser('');
-    CommentReference reference = parseCommentReference('new a', 5);
+    var reference = parseCommentReference('new a', 5)!;
     expectNotNullIfNoErrors(reference);
     assertNoErrors();
     expect(reference.identifier, isSimpleIdentifier);
-    SimpleIdentifier identifier = reference.identifier;
+    var identifier = reference.identifier as SimpleIdentifier;
     expect(identifier.token, isNotNull);
     expect(identifier.name, "a");
     expect(identifier.offset, 9);
@@ -575,11 +575,11 @@
 
   void test_parseCommentReference_operator_withKeyword_notPrefixed() {
     createParser('');
-    CommentReference reference = parseCommentReference('operator ==', 5);
+    var reference = parseCommentReference('operator ==', 5)!;
     expectNotNullIfNoErrors(reference);
     assertNoErrors();
     expect(reference.identifier, isSimpleIdentifier);
-    SimpleIdentifier identifier = reference.identifier;
+    var identifier = reference.identifier as SimpleIdentifier;
     expect(identifier.token, isNotNull);
     expect(identifier.name, "==");
     expect(identifier.offset, 14);
@@ -587,11 +587,11 @@
 
   void test_parseCommentReference_operator_withKeyword_prefixed() {
     createParser('');
-    CommentReference reference = parseCommentReference('Object.operator==', 7);
+    var reference = parseCommentReference('Object.operator==', 7)!;
     expectNotNullIfNoErrors(reference);
     assertNoErrors();
     expect(reference.identifier, isPrefixedIdentifier);
-    PrefixedIdentifier prefixedIdentifier = reference.identifier;
+    var prefixedIdentifier = reference.identifier as PrefixedIdentifier;
     SimpleIdentifier prefix = prefixedIdentifier.prefix;
     expect(prefix.token, isNotNull);
     expect(prefix.name, "Object");
@@ -605,11 +605,11 @@
 
   void test_parseCommentReference_operator_withoutKeyword_notPrefixed() {
     createParser('');
-    CommentReference reference = parseCommentReference('==', 5);
+    var reference = parseCommentReference('==', 5)!;
     expectNotNullIfNoErrors(reference);
     assertNoErrors();
     expect(reference.identifier, isSimpleIdentifier);
-    SimpleIdentifier identifier = reference.identifier;
+    var identifier = reference.identifier as SimpleIdentifier;
     expect(identifier.token, isNotNull);
     expect(identifier.name, "==");
     expect(identifier.offset, 5);
@@ -617,11 +617,11 @@
 
   void test_parseCommentReference_operator_withoutKeyword_prefixed() {
     createParser('');
-    CommentReference reference = parseCommentReference('Object.==', 7);
+    var reference = parseCommentReference('Object.==', 7)!;
     expectNotNullIfNoErrors(reference);
     assertNoErrors();
     expect(reference.identifier, isPrefixedIdentifier);
-    PrefixedIdentifier prefixedIdentifier = reference.identifier;
+    var prefixedIdentifier = reference.identifier as PrefixedIdentifier;
     SimpleIdentifier prefix = prefixedIdentifier.prefix;
     expect(prefix.token, isNotNull);
     expect(prefix.name, "Object");
@@ -635,11 +635,11 @@
 
   void test_parseCommentReference_prefixed() {
     createParser('');
-    CommentReference reference = parseCommentReference('a.b', 7);
+    var reference = parseCommentReference('a.b', 7)!;
     expectNotNullIfNoErrors(reference);
     assertNoErrors();
     expect(reference.identifier, isPrefixedIdentifier);
-    PrefixedIdentifier prefixedIdentifier = reference.identifier;
+    var prefixedIdentifier = reference.identifier as PrefixedIdentifier;
     SimpleIdentifier prefix = prefixedIdentifier.prefix;
     expect(prefix.token, isNotNull);
     expect(prefix.name, "a");
@@ -653,11 +653,11 @@
 
   void test_parseCommentReference_simple() {
     createParser('');
-    CommentReference reference = parseCommentReference('a', 5);
+    var reference = parseCommentReference('a', 5)!;
     expectNotNullIfNoErrors(reference);
     assertNoErrors();
     expect(reference.identifier, isSimpleIdentifier);
-    SimpleIdentifier identifier = reference.identifier;
+    var identifier = reference.identifier as SimpleIdentifier;
     expect(identifier.token, isNotNull);
     expect(identifier.name, "a");
     expect(identifier.offset, 5);
@@ -665,18 +665,18 @@
 
   void test_parseCommentReference_synthetic() {
     createParser('');
-    CommentReference reference = parseCommentReference('', 5);
+    var reference = parseCommentReference('', 5)!;
     expectNotNullIfNoErrors(reference);
     assertNoErrors();
     expect(reference.identifier, isSimpleIdentifier);
-    SimpleIdentifier identifier = reference.identifier;
+    var identifier = reference.identifier as SimpleIdentifier;
     expect(identifier, isNotNull);
     expect(identifier.isSynthetic, isTrue);
     expect(identifier.token, isNotNull);
     expect(identifier.name, "");
     expect(identifier.offset, 5);
     // Should end with EOF token.
-    Token nextToken = identifier.token.next;
+    Token nextToken = identifier.token.next!;
     expect(nextToken, isNotNull);
     expect(nextToken.type, TokenType.EOF);
   }
@@ -686,10 +686,10 @@
     // This fails because we are returning null from the method and asserting
     // that the return value is not null.
     createParser('');
-    CommentReference reference = parseCommentReference('this', 5);
+    var reference = parseCommentReference('this', 5)!;
     expectNotNullIfNoErrors(reference);
     assertNoErrors();
-    SimpleIdentifier identifier = reference.identifier;
+    var identifier = reference.identifier as SimpleIdentifier;
     expect(identifier.token, isNotNull);
     expect(identifier.name, "a");
     expect(identifier.offset, 5);
@@ -698,8 +698,8 @@
   void test_parseCommentReferences_33738() {
     CompilationUnit unit =
         parseCompilationUnit('/** [String] */ abstract class Foo {}');
-    ClassDeclaration clazz = unit.declarations[0];
-    Comment comment = clazz.documentationComment;
+    var clazz = unit.declarations[0] as ClassDeclaration;
+    Comment comment = clazz.documentationComment!;
     expect(clazz.isAbstract, isTrue);
     List<CommentReference> references = comment.references;
     expect(references, hasLength(1));
@@ -716,8 +716,8 @@
 @Annotation
 abstract class Foo {}
 ''');
-    ClassDeclaration clazz = unit.declarations[0];
-    Comment comment = clazz.documentationComment;
+    var clazz = unit.declarations[0] as ClassDeclaration;
+    Comment comment = clazz.documentationComment!;
     expect(clazz.isAbstract, isTrue);
     List<CommentReference> references = comment.references;
     expect(references, hasLength(3));
@@ -746,8 +746,8 @@
 /// and [Object].
 abstract class Foo {}
 ''');
-    ClassDeclaration clazz = unit.declarations[0];
-    Comment comment = clazz.documentationComment;
+    var clazz = unit.declarations[0] as ClassDeclaration;
+    Comment comment = clazz.documentationComment!;
     expect(clazz.isAbstract, isTrue);
     List<CommentReference> references = comment.references;
     expect(references, hasLength(4));
@@ -809,7 +809,7 @@
     expect(reference.identifier.isSynthetic, isTrue);
     expect(reference.identifier.name, "");
     // Should end with EOF token.
-    Token nextToken = referenceToken.next;
+    Token nextToken = referenceToken.next!;
     expect(nextToken, isNotNull);
     expect(nextToken.type, TokenType.EOF);
   }
@@ -831,7 +831,7 @@
     expect(reference.identifier.isSynthetic, isFalse);
     expect(reference.identifier.name, "namePrefix");
     // Should end with EOF token.
-    Token nextToken = referenceToken.next;
+    Token nextToken = referenceToken.next!;
     expect(nextToken, isNotNull);
     expect(nextToken.type, TokenType.EOF);
   }
@@ -1180,7 +1180,7 @@
   void test_parseDocumentationComment_block() {
     createParser('/** */ class C {}');
     CompilationUnit unit = parser.parseCompilationUnit2();
-    Comment comment = unit.declarations[0].documentationComment;
+    Comment comment = unit.declarations[0].documentationComment!;
     expectNotNullIfNoErrors(comment);
     assertNoErrors();
     expect(comment.isBlock, isFalse);
@@ -1191,7 +1191,7 @@
   void test_parseDocumentationComment_block_withReference() {
     createParser('/** [a] */ class C {}');
     CompilationUnit unit = parser.parseCompilationUnit2();
-    Comment comment = unit.declarations[0].documentationComment;
+    Comment comment = unit.declarations[0].documentationComment!;
     expectNotNullIfNoErrors(comment);
     assertNoErrors();
     expect(comment.isBlock, isFalse);
@@ -1207,7 +1207,7 @@
   void test_parseDocumentationComment_endOfLine() {
     createParser('/// \n/// \n class C {}');
     CompilationUnit unit = parser.parseCompilationUnit2();
-    Comment comment = unit.declarations[0].documentationComment;
+    Comment comment = unit.declarations[0].documentationComment!;
     expectNotNullIfNoErrors(comment);
     assertNoErrors();
     expect(comment.isBlock, isFalse);
@@ -1226,11 +1226,12 @@
 
   void test_parseFunctionBody_block() {
     createParser('{}');
-    FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
+    FunctionBody functionBody = parser.parseFunctionBody(
+        false, ParserErrorCode.MISSING_FUNCTION_BODY, false);
     expectNotNullIfNoErrors(functionBody);
     assertNoErrors();
     expect(functionBody, isBlockFunctionBody);
-    BlockFunctionBody body = functionBody;
+    var body = functionBody as BlockFunctionBody;
     expect(body.keyword, isNull);
     expect(body.star, isNull);
     expect(body.block, isNotNull);
@@ -1241,13 +1242,14 @@
 
   void test_parseFunctionBody_block_async() {
     createParser('async {}');
-    FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
+    FunctionBody functionBody = parser.parseFunctionBody(
+        false, ParserErrorCode.MISSING_FUNCTION_BODY, false);
     expectNotNullIfNoErrors(functionBody);
     assertNoErrors();
     expect(functionBody, isBlockFunctionBody);
-    BlockFunctionBody body = functionBody;
+    var body = functionBody as BlockFunctionBody;
     expect(body.keyword, isNotNull);
-    expect(body.keyword.lexeme, Keyword.ASYNC.lexeme);
+    expect(body.keyword!.lexeme, Keyword.ASYNC.lexeme);
     expect(body.star, isNull);
     expect(body.block, isNotNull);
     expect(body.isAsynchronous, isTrue);
@@ -1257,13 +1259,14 @@
 
   void test_parseFunctionBody_block_asyncGenerator() {
     createParser('async* {}');
-    FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
+    FunctionBody functionBody = parser.parseFunctionBody(
+        false, ParserErrorCode.MISSING_FUNCTION_BODY, false);
     expectNotNullIfNoErrors(functionBody);
     assertNoErrors();
     expect(functionBody, isBlockFunctionBody);
-    BlockFunctionBody body = functionBody;
+    var body = functionBody as BlockFunctionBody;
     expect(body.keyword, isNotNull);
-    expect(body.keyword.lexeme, Keyword.ASYNC.lexeme);
+    expect(body.keyword!.lexeme, Keyword.ASYNC.lexeme);
     expect(body.star, isNotNull);
     expect(body.block, isNotNull);
     expect(body.isAsynchronous, isTrue);
@@ -1273,13 +1276,14 @@
 
   void test_parseFunctionBody_block_syncGenerator() {
     createParser('sync* {}');
-    FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
+    FunctionBody functionBody = parser.parseFunctionBody(
+        false, ParserErrorCode.MISSING_FUNCTION_BODY, false);
     expectNotNullIfNoErrors(functionBody);
     assertNoErrors();
     expect(functionBody, isBlockFunctionBody);
-    BlockFunctionBody body = functionBody;
+    var body = functionBody as BlockFunctionBody;
     expect(body.keyword, isNotNull);
-    expect(body.keyword.lexeme, Keyword.SYNC.lexeme);
+    expect(body.keyword!.lexeme, Keyword.SYNC.lexeme);
     expect(body.star, isNotNull);
     expect(body.block, isNotNull);
     expect(body.isAsynchronous, isFalse);
@@ -1289,21 +1293,23 @@
 
   void test_parseFunctionBody_empty() {
     createParser(';');
-    FunctionBody functionBody = parser.parseFunctionBody(true, null, false);
+    FunctionBody functionBody = parser.parseFunctionBody(
+        true, ParserErrorCode.MISSING_FUNCTION_BODY, false);
     expectNotNullIfNoErrors(functionBody);
     assertNoErrors();
     expect(functionBody, isEmptyFunctionBody);
-    EmptyFunctionBody body = functionBody;
+    var body = functionBody as EmptyFunctionBody;
     expect(body.semicolon, isNotNull);
   }
 
   void test_parseFunctionBody_expression() {
     createParser('=> y;');
-    FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
+    FunctionBody functionBody = parser.parseFunctionBody(
+        false, ParserErrorCode.MISSING_FUNCTION_BODY, false);
     expectNotNullIfNoErrors(functionBody);
     assertNoErrors();
     expect(functionBody, isExpressionFunctionBody);
-    ExpressionFunctionBody body = functionBody;
+    var body = functionBody as ExpressionFunctionBody;
     expect(body.keyword, isNull);
     expect(body.functionDefinition, isNotNull);
     expect(body.expression, isNotNull);
@@ -1315,13 +1321,14 @@
 
   void test_parseFunctionBody_expression_async() {
     createParser('async => y;');
-    FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
+    FunctionBody functionBody = parser.parseFunctionBody(
+        false, ParserErrorCode.MISSING_FUNCTION_BODY, false);
     expectNotNullIfNoErrors(functionBody);
     assertNoErrors();
     expect(functionBody, isExpressionFunctionBody);
-    ExpressionFunctionBody body = functionBody;
+    var body = functionBody as ExpressionFunctionBody;
     expect(body.keyword, isNotNull);
-    expect(body.keyword.lexeme, Keyword.ASYNC.lexeme);
+    expect(body.keyword!.lexeme, Keyword.ASYNC.lexeme);
     expect(body.functionDefinition, isNotNull);
     expect(body.expression, isNotNull);
     expect(body.semicolon, isNotNull);
@@ -1366,10 +1373,10 @@
 var c = new Future<int>.sync(() => 3).then<int>((e) => e);
 ''');
     expect(unit, isNotNull);
-    TopLevelVariableDeclaration v = unit.declarations[0];
-    MethodInvocation init = v.variables.variables[0].initializer;
+    var v = unit.declarations[0] as TopLevelVariableDeclaration;
+    var init = v.variables.variables[0].initializer as MethodInvocation;
     expect(init.methodName.name, 'then');
-    NodeList<TypeAnnotation> typeArg = init.typeArguments.arguments;
+    NodeList<TypeAnnotation> typeArg = init.typeArguments!.arguments;
     expect(typeArg, hasLength(1));
     expect(typeArg[0].beginToken.lexeme, 'int');
   }
@@ -1380,10 +1387,10 @@
 var c = Future<int>.sync(() => 3).then<int>((e) => e);
 ''');
     expect(unit, isNotNull);
-    TopLevelVariableDeclaration v = unit.declarations[0];
-    MethodInvocation init = v.variables.variables[0].initializer;
+    var v = unit.declarations[0] as TopLevelVariableDeclaration;
+    var init = v.variables.variables[0].initializer as MethodInvocation;
     expect(init.methodName.name, 'then');
-    NodeList<TypeAnnotation> typeArg = init.typeArguments.arguments;
+    NodeList<TypeAnnotation> typeArg = init.typeArguments!.arguments;
     expect(typeArg, hasLength(1));
     expect(typeArg[0].beginToken.lexeme, 'int');
   }
@@ -1393,10 +1400,10 @@
     createParser('f() => C<E>.n();');
     CompilationUnit unit = parser.parseCompilationUnit2();
     expect(unit, isNotNull);
-    FunctionDeclaration f = unit.declarations[0];
-    ExpressionFunctionBody body = f.functionExpression.body;
+    var f = unit.declarations[0] as FunctionDeclaration;
+    var body = f.functionExpression.body as ExpressionFunctionBody;
     expect(body.expression, isInstanceCreationExpression);
-    InstanceCreationExpressionImpl creation = body.expression;
+    var creation = body.expression as InstanceCreationExpressionImpl;
     expect(creation.keyword, isNull);
     ConstructorName constructorName = creation.constructorName;
     expect(constructorName.type.toSource(), 'C<E>');
@@ -1411,17 +1418,17 @@
     createParser('f() => C<E>.n<B>();');
     CompilationUnit unit = parser.parseCompilationUnit2();
     expect(unit, isNotNull);
-    FunctionDeclaration f = unit.declarations[0];
-    ExpressionFunctionBody body = f.functionExpression.body;
+    var f = unit.declarations[0] as FunctionDeclaration;
+    var body = f.functionExpression.body as ExpressionFunctionBody;
     expect(body.expression, isInstanceCreationExpression);
-    InstanceCreationExpressionImpl creation = body.expression;
+    var creation = body.expression as InstanceCreationExpressionImpl;
     expect(creation.keyword, isNull);
     ConstructorName constructorName = creation.constructorName;
     expect(constructorName.type.toSource(), 'C<E>');
     expect(constructorName.period, isNotNull);
     expect(constructorName.name, isNotNull);
     expect(creation.argumentList, isNotNull);
-    expect(creation.typeArguments.arguments, hasLength(1));
+    expect(creation.typeArguments!.arguments, hasLength(1));
   }
 
   void test_parseInstanceCreation_noKeyword_prefix() {
@@ -1429,10 +1436,10 @@
     createParser('f() => p.C<E>.n();');
     CompilationUnit unit = parser.parseCompilationUnit2();
     expect(unit, isNotNull);
-    FunctionDeclaration f = unit.declarations[0];
-    ExpressionFunctionBody body = f.functionExpression.body;
+    var f = unit.declarations[0] as FunctionDeclaration;
+    var body = f.functionExpression.body as ExpressionFunctionBody;
     expect(body.expression, isInstanceCreationExpression);
-    InstanceCreationExpression creation = body.expression;
+    var creation = body.expression as InstanceCreationExpression;
     expect(creation.keyword, isNull);
     ConstructorName constructorName = creation.constructorName;
     expect(constructorName.type.toSource(), 'p.C<E>');
@@ -1449,13 +1456,13 @@
 ''');
     CompilationUnit unit = parser.parseCompilationUnit2();
     expect(unit, isNotNull);
-    FunctionDeclaration f = unit.declarations[1];
-    BlockFunctionBody body = f.functionExpression.body;
-    VariableDeclarationStatement statement = body.block.statements[0];
+    var f = unit.declarations[1] as FunctionDeclaration;
+    var body = f.functionExpression.body as BlockFunctionBody;
+    var statement = body.block.statements[0] as VariableDeclarationStatement;
     VariableDeclaration variable = statement.variables.variables[0];
-    MethodInvocation creation = variable.initializer;
+    var creation = variable.initializer as MethodInvocation;
     expect(creation.methodName.name, 'C');
-    expect(creation.typeArguments.toSource(), '<int, int Function(String)>');
+    expect(creation.typeArguments!.toSource(), '<int, int Function(String)>');
   }
 
   void test_parseLibraryIdentifier_builtin() {
@@ -1504,7 +1511,7 @@
   }
 
   void test_parseReturnStatement_noValue() {
-    ReturnStatement statement = parseStatement('return;');
+    var statement = parseStatement('return;') as ReturnStatement;
     expectNotNullIfNoErrors(statement);
     assertNoErrors();
     expect(statement.returnKeyword, isNotNull);
@@ -1513,7 +1520,7 @@
   }
 
   void test_parseReturnStatement_value() {
-    ReturnStatement statement = parseStatement('return x;');
+    var statement = parseStatement('return x;') as ReturnStatement;
     expectNotNullIfNoErrors(statement);
     assertNoErrors();
     expect(statement.returnKeyword, isNotNull);
@@ -1545,7 +1552,7 @@
 
   void test_parseTypeAnnotation_function_noReturnType_noParameters() {
     createParser('Function()');
-    GenericFunctionType functionType = parser.parseTypeAnnotation(false);
+    var functionType = parser.parseTypeAnnotation(false) as GenericFunctionType;
     expectNotNullIfNoErrors(functionType);
     assertNoErrors();
     expect(functionType.returnType, isNull);
@@ -1558,7 +1565,7 @@
 
   void test_parseTypeAnnotation_function_noReturnType_parameters() {
     createParser('Function(int, int)');
-    GenericFunctionType functionType = parser.parseTypeAnnotation(false);
+    var functionType = parser.parseTypeAnnotation(false) as GenericFunctionType;
     expectNotNullIfNoErrors(functionType);
     assertNoErrors();
     expect(functionType.returnType, isNull);
@@ -1570,13 +1577,13 @@
     expect(parameters, hasLength(2));
 
     expect(parameters[0], isSimpleFormalParameter);
-    SimpleFormalParameter parameter = parameters[0];
+    var parameter = parameters[0] as SimpleFormalParameter;
     expect(parameter.identifier, isNull);
     expect(parameter.type, isTypeName);
     expect((parameter.type as TypeName).name.name, 'int');
 
     expect(parameters[1], isSimpleFormalParameter);
-    parameter = parameters[1];
+    parameter = parameters[1] as SimpleFormalParameter;
     expect(parameter.identifier, isNull);
     expect(parameter.type, isTypeName);
     expect((parameter.type as TypeName).name.name, 'int');
@@ -1584,12 +1591,12 @@
 
   void test_parseTypeAnnotation_function_noReturnType_typeParameters() {
     createParser('Function<S, T>()');
-    GenericFunctionType functionType = parser.parseTypeAnnotation(false);
+    var functionType = parser.parseTypeAnnotation(false) as GenericFunctionType;
     expectNotNullIfNoErrors(functionType);
     assertNoErrors();
     expect(functionType.returnType, isNull);
     expect(functionType.functionKeyword, isNotNull);
-    TypeParameterList typeParameters = functionType.typeParameters;
+    var typeParameters = functionType.typeParameters!;
     expect(typeParameters, isNotNull);
     expect(typeParameters.typeParameters, hasLength(2));
     FormalParameterList parameterList = functionType.parameters;
@@ -1600,12 +1607,12 @@
   void
       test_parseTypeAnnotation_function_noReturnType_typeParameters_parameters() {
     createParser('Function<T>(String, {T t})');
-    GenericFunctionType functionType = parser.parseTypeAnnotation(false);
+    var functionType = parser.parseTypeAnnotation(false) as GenericFunctionType;
     expectNotNullIfNoErrors(functionType);
     assertNoErrors();
     expect(functionType.returnType, isNull);
     expect(functionType.functionKeyword, isNotNull);
-    TypeParameterList typeParameters = functionType.typeParameters;
+    var typeParameters = functionType.typeParameters!;
     expect(typeParameters, isNotNull);
     expect(typeParameters.typeParameters, hasLength(1));
     FormalParameterList parameterList = functionType.parameters;
@@ -1615,7 +1622,7 @@
 
   void test_parseTypeAnnotation_function_returnType_classFunction() {
     createParser('Function');
-    TypeName functionType = parser.parseTypeAnnotation(false);
+    var functionType = parser.parseTypeAnnotation(false) as TypeName;
     expectNotNullIfNoErrors(functionType);
     assertNoErrors();
   }
@@ -1630,7 +1637,7 @@
 
   void test_parseTypeAnnotation_function_returnType_noParameters() {
     createParser('List<int> Function()');
-    GenericFunctionType functionType = parser.parseTypeAnnotation(false);
+    var functionType = parser.parseTypeAnnotation(false) as GenericFunctionType;
     expectNotNullIfNoErrors(functionType);
     assertNoErrors();
     expect(functionType.returnType, isNotNull);
@@ -1643,7 +1650,7 @@
 
   void test_parseTypeAnnotation_function_returnType_parameters() {
     createParser('List<int> Function(String s, int i)');
-    GenericFunctionType functionType = parser.parseTypeAnnotation(false);
+    var functionType = parser.parseTypeAnnotation(false) as GenericFunctionType;
     expectNotNullIfNoErrors(functionType);
     assertNoErrors();
     expect(functionType.returnType, isNotNull);
@@ -1655,16 +1662,16 @@
     expect(parameters, hasLength(2));
 
     expect(parameters[0], isSimpleFormalParameter);
-    SimpleFormalParameter parameter = parameters[0];
+    var parameter = parameters[0] as SimpleFormalParameter;
     expect(parameter.identifier, isNotNull);
-    expect(parameter.identifier.name, 's');
+    expect(parameter.identifier!.name, 's');
     expect(parameter.type, isTypeName);
     expect((parameter.type as TypeName).name.name, 'String');
 
     expect(parameters[1], isSimpleFormalParameter);
-    parameter = parameters[1];
+    parameter = parameters[1] as SimpleFormalParameter;
     expect(parameter.identifier, isNotNull);
-    expect(parameter.identifier.name, 'i');
+    expect(parameter.identifier!.name, 'i');
     expect(parameter.type, isTypeName);
     expect((parameter.type as TypeName).name.name, 'int');
   }
@@ -1679,12 +1686,12 @@
 
   void test_parseTypeAnnotation_function_returnType_typeParameters() {
     createParser('List<T> Function<T>()');
-    GenericFunctionType functionType = parser.parseTypeAnnotation(false);
+    var functionType = parser.parseTypeAnnotation(false) as GenericFunctionType;
     expectNotNullIfNoErrors(functionType);
     assertNoErrors();
     expect(functionType.returnType, isNotNull);
     expect(functionType.functionKeyword, isNotNull);
-    TypeParameterList typeParameters = functionType.typeParameters;
+    var typeParameters = functionType.typeParameters!;
     expect(typeParameters, isNotNull);
     expect(typeParameters.typeParameters, hasLength(1));
     FormalParameterList parameterList = functionType.parameters;
@@ -1695,12 +1702,12 @@
   void
       test_parseTypeAnnotation_function_returnType_typeParameters_parameters() {
     createParser('List<T> Function<T>(String s, [T])');
-    GenericFunctionType functionType = parser.parseTypeAnnotation(false);
+    var functionType = parser.parseTypeAnnotation(false) as GenericFunctionType;
     expectNotNullIfNoErrors(functionType);
     assertNoErrors();
     expect(functionType.returnType, isNotNull);
     expect(functionType.functionKeyword, isNotNull);
-    TypeParameterList typeParameters = functionType.typeParameters;
+    var typeParameters = functionType.typeParameters!;
     expect(typeParameters, isNotNull);
     expect(typeParameters.typeParameters, hasLength(1));
     FormalParameterList parameterList = functionType.parameters;
@@ -1718,7 +1725,7 @@
 
   void test_parseTypeAnnotation_named() {
     createParser('A<B>');
-    TypeName typeName = parser.parseTypeAnnotation(false);
+    var typeName = parser.parseTypeAnnotation(false) as TypeName;
     expectNotNullIfNoErrors(typeName);
     assertNoErrors();
   }
@@ -1750,9 +1757,9 @@
     assertNoErrors();
     expect(argumentList.leftBracket, isNotNull);
     expect(argumentList.arguments, hasLength(1));
-    TypeName argument = argumentList.arguments[0];
+    var argument = argumentList.arguments[0] as TypeName;
     expect(argument, isNotNull);
-    TypeArgumentList innerList = argument.typeArguments;
+    var innerList = argument.typeArguments!;
     expect(innerList, isNotNull);
     expect(innerList.arguments, hasLength(1));
     expect(argumentList.rightBracket, isNotNull);
@@ -1767,10 +1774,10 @@
     expect(argumentList.rightBracket, isNotNull);
     expect(argumentList.arguments, hasLength(1));
 
-    TypeName argument = argumentList.arguments[0];
+    var argument = argumentList.arguments[0] as TypeName;
     expect(argument, isNotNull);
 
-    TypeArgumentList innerList = argument.typeArguments;
+    var innerList = argument.typeArguments!;
     expect(innerList, isNotNull);
     expect(innerList.leftBracket, isNotNull);
     expect(innerList.arguments, hasLength(1));
@@ -1787,19 +1794,19 @@
     expect(argumentList.rightBracket, isNotNull);
     expect(argumentList.arguments, hasLength(1));
 
-    TypeName argument = argumentList.arguments[0];
+    var argument = argumentList.arguments[0] as TypeName;
     expect(argument, isNotNull);
 
-    TypeArgumentList innerList = argument.typeArguments;
+    var innerList = argument.typeArguments!;
     expect(innerList, isNotNull);
     expect(innerList.leftBracket, isNotNull);
     expect(innerList.arguments, hasLength(1));
     expect(innerList.rightBracket, isNotNull);
 
-    TypeName innerArgument = innerList.arguments[0];
+    var innerArgument = innerList.arguments[0] as TypeName;
     expect(innerArgument, isNotNull);
 
-    TypeArgumentList innerInnerList = innerArgument.typeArguments;
+    var innerInnerList = innerArgument.typeArguments!;
     expect(innerInnerList, isNotNull);
     expect(innerInnerList.leftBracket, isNotNull);
     expect(innerInnerList.arguments, hasLength(1));
@@ -1887,7 +1894,7 @@
 
   void test_parseTypeParameterList_multiple() {
     createParser('<A, B extends C, D>');
-    TypeParameterList parameterList = parser.parseTypeParameterList();
+    TypeParameterList parameterList = parser.parseTypeParameterList()!;
     expectNotNullIfNoErrors(parameterList);
     assertNoErrors();
     expect(parameterList.leftBracket, isNotNull);
@@ -1897,7 +1904,7 @@
 
   void test_parseTypeParameterList_parameterizedWithTrailingEquals() {
     createParser('<A extends B<E>>=', expectedEndOffset: 16);
-    TypeParameterList parameterList = parser.parseTypeParameterList();
+    TypeParameterList parameterList = parser.parseTypeParameterList()!;
     expectNotNullIfNoErrors(parameterList);
     assertNoErrors();
     expect(parameterList.leftBracket, isNotNull);
@@ -1907,7 +1914,7 @@
 
   void test_parseTypeParameterList_parameterizedWithTrailingEquals2() {
     createParser('<A extends B<E /* foo */ >>=', expectedEndOffset: 27);
-    TypeParameterList parameterList = parser.parseTypeParameterList();
+    TypeParameterList parameterList = parser.parseTypeParameterList()!;
     expectNotNullIfNoErrors(parameterList);
     assertNoErrors();
     expect(parameterList.leftBracket, isNotNull);
@@ -1915,19 +1922,19 @@
     expect(parameterList.typeParameters, hasLength(1));
     TypeParameter typeParameter = parameterList.typeParameters[0];
     expect(typeParameter.name.name, 'A');
-    TypeName bound = typeParameter.bound;
+    var bound = typeParameter.bound as TypeName;
     expect(bound.name.name, 'B');
-    TypeArgumentList typeArguments = bound.typeArguments;
+    var typeArguments = bound.typeArguments!;
     expect(typeArguments.arguments, hasLength(1));
     expect(typeArguments.rightBracket, isNotNull);
-    expect(typeArguments.rightBracket.precedingComments.lexeme, '/* foo */');
-    TypeName argument = typeArguments.arguments[0];
+    expect(typeArguments.rightBracket.precedingComments!.lexeme, '/* foo */');
+    var argument = typeArguments.arguments[0] as TypeName;
     expect(argument.name.name, 'E');
   }
 
   void test_parseTypeParameterList_single() {
     createParser('<<A>', expectedEndOffset: 0);
-    TypeParameterList parameterList = parser.parseTypeParameterList();
+    var parameterList = parser.parseTypeParameterList();
     // TODO(danrubel): Consider splitting `<<` and marking the first `<`
     // as an unexpected token.
     expect(parameterList, isNull);
@@ -1936,7 +1943,7 @@
 
   void test_parseTypeParameterList_withTrailingEquals() {
     createParser('<A>=', expectedEndOffset: 3);
-    TypeParameterList parameterList = parser.parseTypeParameterList();
+    TypeParameterList parameterList = parser.parseTypeParameterList()!;
     expectNotNullIfNoErrors(parameterList);
     assertNoErrors();
     expect(parameterList.leftBracket, isNotNull);
@@ -1959,7 +1966,7 @@
     var declarationList = statement.variables;
     assertErrors(
         errors: [expectedError(ParserErrorCode.MODIFIER_OUT_OF_ORDER, 6, 4)]);
-    expect(declarationList.keyword.lexeme, 'final');
+    expect(declarationList.keyword!.lexeme, 'final');
     expect(declarationList.type, isNull);
     expect(declarationList.variables, hasLength(1));
   }
@@ -1981,7 +1988,7 @@
         as VariableDeclarationStatement;
     var declarationList = statement.variables;
     assertNoErrors();
-    expect(declarationList.keyword.lexeme, 'final');
+    expect(declarationList.keyword!.lexeme, 'final');
     expect(declarationList.type, isNull);
     expect(declarationList.variables, hasLength(1));
   }
@@ -2068,7 +2075,7 @@
     ]);
     var typeAlias = unit.declarations[0] as GenericTypeAlias;
     expect(typeAlias.name.toSource(), 'K');
-    var functionType = typeAlias.functionType;
+    var functionType = typeAlias.functionType!;
     expect(functionType.parameters.parameters, hasLength(1));
     var parameter = functionType.parameters.parameters[0];
     expect(parameter.identifier, isNotNull);
@@ -2082,7 +2089,7 @@
     ]);
     var typeAlias = unit.declarations[0] as GenericTypeAlias;
     expect(typeAlias.name.toSource(), 'T');
-    var functionType = typeAlias.functionType;
+    var functionType = typeAlias.functionType!;
     expect(functionType.parameters.parameters, hasLength(1));
     var parameter = functionType.parameters.parameters[0];
     expect(parameter.identifier, isNotNull);
diff --git a/pkg/analyzer/test/generated/simple_resolver_test.dart b/pkg/analyzer/test/generated/simple_resolver_test.dart
index d1a5b58..6269fe3 100644
--- a/pkg/analyzer/test/generated/simple_resolver_test.dart
+++ b/pkg/analyzer/test/generated/simple_resolver_test.dart
@@ -431,7 +431,7 @@
 ''');
 
     var library = result.libraryElement;
-    var main = library.entryPoint;
+    var main = library.entryPoint!;
 
     expect(main, isNotNull);
     expect(main.library, isNot(same(library)));
@@ -443,7 +443,7 @@
 ''');
 
     var library = result.libraryElement;
-    var main = library.entryPoint;
+    var main = library.entryPoint!;
 
     expect(main, isNotNull);
     expect(main.library, same(library));
@@ -1112,7 +1112,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/source_factory_test.dart b/pkg/analyzer/test/generated/source_factory_test.dart
index 3282f36..b6d31f4 100644
--- a/pkg/analyzer/test/generated/source_factory_test.dart
+++ b/pkg/analyzer/test/generated/source_factory_test.dart
@@ -27,7 +27,7 @@
   AbsoluteUriResolver(this.resourceProvider);
 
   @override
-  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
+  Source resolveAbsolute(Uri uri, [Uri? actualUri]) {
     return FileSource(
         resourceProvider.getFile(resourceProvider.pathContext.fromUri(uri)),
         actualUri);
@@ -55,7 +55,7 @@
     String targetPath = convertPath(targetRawPath);
     String targetUri = toUri(targetRawPath).toString();
     Source sourceSource = FileSource(getFile(sourcePath));
-    Source result = factory.resolveUri(sourceSource, targetUri);
+    var result = factory.resolveUri(sourceSource, targetUri)!;
     expect(result.fullName, targetPath);
   }
 
@@ -63,7 +63,7 @@
     SourceFactory factory =
         SourceFactory([AbsoluteUriResolver(resourceProvider)]);
     Source containingSource = FileSource(getFile('/does/not/have.dart'));
-    Source result = factory.resolveUri(containingSource, 'exist.dart');
+    var result = factory.resolveUri(containingSource, 'exist.dart')!;
     expect(result.fullName, convertPath('/does/not/exist.dart'));
   }
 
@@ -90,7 +90,7 @@
     Source librarySource =
         firstFile.createSource(Uri.parse('package:package/dir/first.dart'));
 
-    Source result = factory.resolveUri(librarySource, 'second.dart');
+    var result = factory.resolveUri(librarySource, 'second.dart')!;
     expect(result, isNotNull);
     expect(result.fullName, secondPath);
     expect(result.uri.toString(), 'package:package/dir/second.dart');
@@ -105,7 +105,7 @@
     SourceFactory factory =
         SourceFactory([UriResolver_restoreUri(source1, expected1)]);
     expect(factory.restoreUri(source1), same(expected1));
-    expect(factory.restoreUri(source2), same(null));
+    expect(factory.restoreUri(source2), isNull);
   }
 }
 
@@ -115,7 +115,7 @@
   UriResolver_absolute();
 
   @override
-  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
+  Source? resolveAbsolute(Uri uri, [Uri? actualUri]) {
     invoked = true;
     return null;
   }
@@ -127,10 +127,10 @@
   UriResolver_restoreUri(this.source1, this.expected1);
 
   @override
-  Source resolveAbsolute(Uri uri, [Uri actualUri]) => null;
+  Source? resolveAbsolute(Uri uri, [Uri? actualUri]) => null;
 
   @override
-  Uri restoreAbsolute(Source source) {
+  Uri? restoreAbsolute(Source source) {
     if (identical(source, source1)) {
       return expected1;
     }
@@ -144,7 +144,7 @@
   UriResolver_SourceFactoryTest_test_fromEncoding_valid(this.encoding);
 
   @override
-  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
+  Source? resolveAbsolute(Uri uri, [Uri? actualUri]) {
     if (uri.toString() == encoding) {
       return TestSource();
     }
diff --git a/pkg/analyzer/test/generated/statement_parser_test.dart b/pkg/analyzer/test/generated/statement_parser_test.dart
index 189d673..e1a4243 100644
--- a/pkg/analyzer/test/generated/statement_parser_test.dart
+++ b/pkg/analyzer/test/generated/statement_parser_test.dart
@@ -23,21 +23,21 @@
 @reflectiveTest
 class StatementParserTest extends FastaParserTestCase {
   void test_35177() {
-    ExpressionStatement statement = parseStatement('(f)()<int>();');
+    var statement = parseStatement('(f)()<int>();') as ExpressionStatement;
 
-    FunctionExpressionInvocation funct1 = statement.expression;
-    NodeList<TypeAnnotation> typeArgs = funct1.typeArguments.arguments;
+    var funct1 = statement.expression as FunctionExpressionInvocation;
+    List<TypeAnnotation> typeArgs = funct1.typeArguments!.arguments;
     expect(typeArgs, hasLength(1));
-    TypeName typeName = typeArgs[0];
+    var typeName = typeArgs[0] as TypeName;
     expect(typeName.name.name, 'int');
     expect(funct1.argumentList.arguments, hasLength(0));
 
-    FunctionExpressionInvocation funct2 = funct1.function;
+    var funct2 = funct1.function as FunctionExpressionInvocation;
     expect(funct2.typeArguments, isNull);
     expect(funct2.argumentList.arguments, hasLength(0));
 
-    ParenthesizedExpression expression = funct2.function;
-    SimpleIdentifier identifier = expression.expression;
+    var expression = funct2.function as ParenthesizedExpression;
+    var identifier = expression.expression as SimpleIdentifier;
     expect(identifier.name, 'f');
   }
 
@@ -51,7 +51,7 @@
     analyzer.Token token = unit.beginToken;
     while (!token.isEof) {
       expect(token.type, isNot(TokenType.GT_GT));
-      analyzer.Token next = token.next;
+      analyzer.Token next = token.next!;
       expect(next.previous, token);
       token = next;
     }
@@ -165,10 +165,11 @@
   }
 
   void test_parseBreakStatement_label() {
-    LabeledStatement labeledStatement =
-        parseStatement('foo: while (true) { break foo; }');
-    WhileStatement whileStatement = labeledStatement.statement;
-    BreakStatement statement = (whileStatement.body as Block).statements[0];
+    var labeledStatement =
+        parseStatement('foo: while (true) { break foo; }') as LabeledStatement;
+    var whileStatement = labeledStatement.statement as WhileStatement;
+    var statement =
+        (whileStatement.body as Block).statements[0] as BreakStatement;
     assertNoErrors();
     expect(statement.breakKeyword, isNotNull);
     expect(statement.label, isNotNull);
@@ -176,8 +177,10 @@
   }
 
   void test_parseBreakStatement_noLabel() {
-    WhileStatement whileStatement = parseStatement('while (true) { break; }');
-    BreakStatement statement = (whileStatement.body as Block).statements[0];
+    var whileStatement =
+        parseStatement('while (true) { break; }') as WhileStatement;
+    var statement =
+        (whileStatement.body as Block).statements[0] as BreakStatement;
     assertNoErrors();
     expect(statement.breakKeyword, isNotNull);
     expect(statement.label, isNull);
@@ -185,10 +188,11 @@
   }
 
   void test_parseContinueStatement_label() {
-    LabeledStatement labeledStatement =
-        parseStatement('foo: while (true) { continue foo; }');
-    WhileStatement whileStatement = labeledStatement.statement;
-    ContinueStatement statement = (whileStatement.body as Block).statements[0];
+    var labeledStatement = parseStatement('foo: while (true) { continue foo; }')
+        as LabeledStatement;
+    var whileStatement = labeledStatement.statement as WhileStatement;
+    var statement =
+        (whileStatement.body as Block).statements[0] as ContinueStatement;
     assertNoErrors();
     expect(statement.continueKeyword, isNotNull);
     expect(statement.label, isNotNull);
@@ -196,9 +200,10 @@
   }
 
   void test_parseContinueStatement_noLabel() {
-    WhileStatement whileStatement =
-        parseStatement('while (true) { continue; }');
-    ContinueStatement statement = (whileStatement.body as Block).statements[0];
+    var whileStatement =
+        parseStatement('while (true) { continue; }') as WhileStatement;
+    var statement =
+        (whileStatement.body as Block).statements[0] as ContinueStatement;
     assertNoErrors();
     expect(statement.continueKeyword, isNotNull);
     expect(statement.label, isNull);
@@ -249,16 +254,16 @@
   }
 
   void test_parseForStatement_each_await2() {
-    ForStatement forStatement = parseStatement(
+    var forStatement = parseStatement(
       'await for (element in list) {}',
       inAsync: true,
       featureSet: controlFlow,
-    );
+    ) as ForStatement;
     assertNoErrors();
     expect(forStatement.awaitKeyword, isNotNull);
     expect(forStatement.forKeyword, isNotNull);
     expect(forStatement.leftParenthesis, isNotNull);
-    ForEachPartsWithIdentifier forLoopParts = forStatement.forLoopParts;
+    var forLoopParts = forStatement.forLoopParts as ForEachPartsWithIdentifier;
     expect(forLoopParts.identifier, isNotNull);
     expect(forLoopParts.inKeyword, isNotNull);
     expect(forLoopParts.iterable, isNotNull);
@@ -267,15 +272,15 @@
   }
 
   void test_parseForStatement_each_finalExternal() {
-    ForStatement forStatement = parseStatement(
+    var forStatement = parseStatement(
       'for (final external in list) {}',
       featureSet: controlFlow,
-    );
+    ) as ForStatement;
     assertNoErrors();
     expect(forStatement.awaitKeyword, isNull);
     expect(forStatement.forKeyword, isNotNull);
     expect(forStatement.leftParenthesis, isNotNull);
-    ForEachPartsWithDeclaration forLoopParts = forStatement.forLoopParts;
+    var forLoopParts = forStatement.forLoopParts as ForEachPartsWithDeclaration;
     expect(forLoopParts.loopVariable.identifier.name, 'external');
     expect(forLoopParts.inKeyword, isNotNull);
     expect(forLoopParts.iterable, isNotNull);
@@ -284,15 +289,15 @@
   }
 
   void test_parseForStatement_each_finalRequired() {
-    ForStatement forStatement = parseStatement(
+    var forStatement = parseStatement(
       'for (final required in list) {}',
       featureSet: controlFlow,
-    );
+    ) as ForStatement;
     assertNoErrors();
     expect(forStatement.awaitKeyword, isNull);
     expect(forStatement.forKeyword, isNotNull);
     expect(forStatement.leftParenthesis, isNotNull);
-    ForEachPartsWithDeclaration forLoopParts = forStatement.forLoopParts;
+    var forLoopParts = forStatement.forLoopParts as ForEachPartsWithDeclaration;
     expect(forLoopParts.loopVariable.identifier.name, 'required');
     expect(forLoopParts.inKeyword, isNotNull);
     expect(forLoopParts.iterable, isNotNull);
@@ -319,15 +324,15 @@
   }
 
   void test_parseForStatement_each_genericFunctionType2() {
-    ForStatement forStatement = parseStatement(
+    var forStatement = parseStatement(
       'for (void Function<T>(T) element in list) {}',
       featureSet: controlFlow,
-    );
+    ) as ForStatement;
     assertNoErrors();
     expect(forStatement.awaitKeyword, isNull);
     expect(forStatement.forKeyword, isNotNull);
     expect(forStatement.leftParenthesis, isNotNull);
-    ForEachPartsWithDeclaration forLoopParts = forStatement.forLoopParts;
+    var forLoopParts = forStatement.forLoopParts as ForEachPartsWithDeclaration;
     expect(forLoopParts.loopVariable, isNotNull);
     expect(forLoopParts.inKeyword, isNotNull);
     expect(forLoopParts.iterable, isNotNull);
@@ -353,15 +358,15 @@
   }
 
   void test_parseForStatement_each_identifier2() {
-    ForStatement forStatement = parseStatement(
+    var forStatement = parseStatement(
       'for (element in list) {}',
       featureSet: controlFlow,
-    );
+    ) as ForStatement;
     assertNoErrors();
     expect(forStatement.awaitKeyword, isNull);
     expect(forStatement.forKeyword, isNotNull);
     expect(forStatement.leftParenthesis, isNotNull);
-    ForEachPartsWithIdentifier forLoopParts = forStatement.forLoopParts;
+    var forLoopParts = forStatement.forLoopParts as ForEachPartsWithIdentifier;
     expect(forLoopParts.identifier, isNotNull);
     expect(forLoopParts.inKeyword, isNotNull);
     expect(forLoopParts.iterable, isNotNull);
@@ -388,15 +393,15 @@
   }
 
   void test_parseForStatement_each_noType_metadata2() {
-    ForStatement forStatement = parseStatement(
+    var forStatement = parseStatement(
       'for (@A var element in list) {}',
       featureSet: controlFlow,
-    );
+    ) as ForStatement;
     assertNoErrors();
     expect(forStatement.awaitKeyword, isNull);
     expect(forStatement.forKeyword, isNotNull);
     expect(forStatement.leftParenthesis, isNotNull);
-    ForEachPartsWithDeclaration forLoopParts = forStatement.forLoopParts;
+    var forLoopParts = forStatement.forLoopParts as ForEachPartsWithDeclaration;
     expect(forLoopParts.loopVariable, isNotNull);
     expect(forLoopParts.loopVariable.metadata, hasLength(1));
     expect(forLoopParts.inKeyword, isNotNull);
@@ -423,15 +428,15 @@
   }
 
   void test_parseForStatement_each_type2() {
-    ForStatement forStatement = parseStatement(
+    var forStatement = parseStatement(
       'for (A element in list) {}',
       featureSet: controlFlow,
-    );
+    ) as ForStatement;
     assertNoErrors();
     expect(forStatement.awaitKeyword, isNull);
     expect(forStatement.forKeyword, isNotNull);
     expect(forStatement.leftParenthesis, isNotNull);
-    ForEachPartsWithDeclaration forLoopParts = forStatement.forLoopParts;
+    var forLoopParts = forStatement.forLoopParts as ForEachPartsWithDeclaration;
     expect(forLoopParts.loopVariable, isNotNull);
     expect(forLoopParts.inKeyword, isNotNull);
     expect(forLoopParts.iterable, isNotNull);
@@ -457,15 +462,15 @@
   }
 
   void test_parseForStatement_each_var2() {
-    ForStatement forStatement = parseStatement(
+    var forStatement = parseStatement(
       'for (var element in list) {}',
       featureSet: controlFlow,
-    );
+    ) as ForStatement;
     assertNoErrors();
     expect(forStatement.awaitKeyword, isNull);
     expect(forStatement.forKeyword, isNotNull);
     expect(forStatement.leftParenthesis, isNotNull);
-    ForEachPartsWithDeclaration forLoopParts = forStatement.forLoopParts;
+    var forLoopParts = forStatement.forLoopParts as ForEachPartsWithDeclaration;
     expect(forLoopParts.loopVariable, isNotNull);
     expect(forLoopParts.inKeyword, isNotNull);
     expect(forLoopParts.iterable, isNotNull);
@@ -491,14 +496,14 @@
   }
 
   void test_parseForStatement_loop_c2() {
-    ForStatement forStatement = parseStatement(
+    var forStatement = parseStatement(
       'for (; i < count;) {}',
       featureSet: controlFlow,
-    );
+    ) as ForStatement;
     assertNoErrors();
     expect(forStatement.forKeyword, isNotNull);
     expect(forStatement.leftParenthesis, isNotNull);
-    ForPartsWithExpression forLoopParts = forStatement.forLoopParts;
+    var forLoopParts = forStatement.forLoopParts as ForPartsWithExpression;
     expect(forLoopParts.initialization, isNull);
     expect(forLoopParts.leftSeparator, isNotNull);
     expect(forLoopParts.condition, isNotNull);
@@ -527,14 +532,14 @@
   }
 
   void test_parseForStatement_loop_cu2() {
-    ForStatement forStatement = parseStatement(
+    var forStatement = parseStatement(
       'for (; i < count; i++) {}',
       featureSet: controlFlow,
-    );
+    ) as ForStatement;
     assertNoErrors();
     expect(forStatement.forKeyword, isNotNull);
     expect(forStatement.leftParenthesis, isNotNull);
-    ForPartsWithExpression forLoopParts = forStatement.forLoopParts;
+    var forLoopParts = forStatement.forLoopParts as ForPartsWithExpression;
     expect(forLoopParts.initialization, isNull);
     expect(forLoopParts.leftSeparator, isNotNull);
     expect(forLoopParts.condition, isNotNull);
@@ -563,14 +568,14 @@
   }
 
   void test_parseForStatement_loop_ecu2() {
-    ForStatement forStatement = parseStatement(
+    var forStatement = parseStatement(
       'for (i--; i < count; i++) {}',
       featureSet: spread,
-    );
+    ) as ForStatement;
     assertNoErrors();
     expect(forStatement.forKeyword, isNotNull);
     expect(forStatement.leftParenthesis, isNotNull);
-    ForPartsWithExpression forLoopParts = forStatement.forLoopParts;
+    var forLoopParts = forStatement.forLoopParts as ForPartsWithExpression;
     expect(forLoopParts.initialization, isNotNull);
     expect(forLoopParts.leftSeparator, isNotNull);
     expect(forLoopParts.condition, isNotNull);
@@ -601,14 +606,14 @@
   }
 
   void test_parseForStatement_loop_i2() {
-    ForStatement forStatement = parseStatement(
+    var forStatement = parseStatement(
       'for (var i = 0;;) {}',
       featureSet: spread,
-    );
+    ) as ForStatement;
     assertNoErrors();
     expect(forStatement.forKeyword, isNotNull);
     expect(forStatement.leftParenthesis, isNotNull);
-    ForPartsWithDeclarations forLoopParts = forStatement.forLoopParts;
+    var forLoopParts = forStatement.forLoopParts as ForPartsWithDeclarations;
     VariableDeclarationList variables = forLoopParts.variables;
     expect(variables, isNotNull);
     expect(variables.metadata, hasLength(0));
@@ -643,14 +648,14 @@
   }
 
   void test_parseForStatement_loop_i_withMetadata2() {
-    ForStatement forStatement = parseStatement(
+    var forStatement = parseStatement(
       'for (@A var i = 0;;) {}',
       featureSet: spread,
-    );
+    ) as ForStatement;
     assertNoErrors();
     expect(forStatement.forKeyword, isNotNull);
     expect(forStatement.leftParenthesis, isNotNull);
-    ForPartsWithDeclarations forLoopParts = forStatement.forLoopParts;
+    var forLoopParts = forStatement.forLoopParts as ForPartsWithDeclarations;
     VariableDeclarationList variables = forLoopParts.variables;
     expect(variables, isNotNull);
     expect(variables.metadata, hasLength(1));
@@ -684,14 +689,14 @@
   }
 
   void test_parseForStatement_loop_ic2() {
-    ForStatement forStatement = parseStatement(
+    var forStatement = parseStatement(
       'for (var i = 0; i < count;) {}',
       featureSet: spread,
-    );
+    ) as ForStatement;
     assertNoErrors();
     expect(forStatement.forKeyword, isNotNull);
     expect(forStatement.leftParenthesis, isNotNull);
-    ForPartsWithDeclarations forLoopParts = forStatement.forLoopParts;
+    var forLoopParts = forStatement.forLoopParts as ForPartsWithDeclarations;
     VariableDeclarationList variables = forLoopParts.variables;
     expect(variables, isNotNull);
     expect(variables.variables, hasLength(1));
@@ -724,14 +729,14 @@
   }
 
   void test_parseForStatement_loop_icu2() {
-    ForStatement forStatement = parseStatement(
+    var forStatement = parseStatement(
       'for (var i = 0; i < count; i++) {}',
       featureSet: spread,
-    );
+    ) as ForStatement;
     assertNoErrors();
     expect(forStatement.forKeyword, isNotNull);
     expect(forStatement.leftParenthesis, isNotNull);
-    ForPartsWithDeclarations forLoopParts = forStatement.forLoopParts;
+    var forLoopParts = forStatement.forLoopParts as ForPartsWithDeclarations;
     VariableDeclarationList variables = forLoopParts.variables;
     expect(variables, isNotNull);
     expect(variables.variables, hasLength(1));
@@ -765,14 +770,14 @@
   }
 
   void test_parseForStatement_loop_iicuu2() {
-    ForStatement forStatement = parseStatement(
+    var forStatement = parseStatement(
       'for (int i = 0, j = count; i < j; i++, j--) {}',
       featureSet: spread,
-    );
+    ) as ForStatement;
     assertNoErrors();
     expect(forStatement.forKeyword, isNotNull);
     expect(forStatement.leftParenthesis, isNotNull);
-    ForPartsWithDeclarations forLoopParts = forStatement.forLoopParts;
+    var forLoopParts = forStatement.forLoopParts as ForPartsWithDeclarations;
     VariableDeclarationList variables = forLoopParts.variables;
     expect(variables, isNotNull);
     expect(variables.variables, hasLength(2));
@@ -805,14 +810,14 @@
   }
 
   void test_parseForStatement_loop_iu2() {
-    ForStatement forStatement = parseStatement(
+    var forStatement = parseStatement(
       'for (var i = 0;; i++) {}',
       featureSet: spread,
-    );
+    ) as ForStatement;
     assertNoErrors();
     expect(forStatement.forKeyword, isNotNull);
     expect(forStatement.leftParenthesis, isNotNull);
-    ForPartsWithDeclarations forLoopParts = forStatement.forLoopParts;
+    var forLoopParts = forStatement.forLoopParts as ForPartsWithDeclarations;
     VariableDeclarationList variables = forLoopParts.variables;
     expect(variables, isNotNull);
     expect(variables.variables, hasLength(1));
@@ -842,14 +847,14 @@
   }
 
   void test_parseForStatement_loop_u2() {
-    ForStatement forStatement = parseStatement(
+    var forStatement = parseStatement(
       'for (;; i++) {}',
       featureSet: spread,
-    );
+    ) as ForStatement;
     assertNoErrors();
     expect(forStatement.forKeyword, isNotNull);
     expect(forStatement.leftParenthesis, isNotNull);
-    ForPartsWithExpression forLoopParts = forStatement.forLoopParts;
+    var forLoopParts = forStatement.forLoopParts as ForPartsWithExpression;
     expect(forLoopParts.initialization, isNull);
     expect(forLoopParts.leftSeparator, isNotNull);
     expect(forLoopParts.condition, isNull);
@@ -1011,7 +1016,7 @@
     var statement = parseStatement('f() {}') as FunctionDeclarationStatement;
     assertNoErrors();
     var function = statement.functionDeclaration.functionExpression;
-    expect(function.parameters.parameters, isEmpty);
+    expect(function.parameters!.parameters, isEmpty);
     expect(function.body, isNotNull);
   }
 
@@ -1020,7 +1025,7 @@
         parseStatement('f(void g()) {}') as FunctionDeclarationStatement;
     assertNoErrors();
     var function = statement.functionDeclaration.functionExpression;
-    expect(function.parameters.parameters, hasLength(1));
+    expect(function.parameters!.parameters, hasLength(1));
     expect(function.body, isNotNull);
   }
 
@@ -1174,54 +1179,54 @@
   }
 
   void test_parseNonLabeledStatement_variableDeclaration_typeParam() {
-    VariableDeclarationStatement statement = parseStatement('C<T> v;');
+    var statement = parseStatement('C<T> v;') as VariableDeclarationStatement;
     assertNoErrors();
     VariableDeclarationList variableList = statement.variables;
     List<VariableDeclaration> variables = variableList.variables;
     expect(variables, hasLength(1));
     expect(variables[0].name.name, 'v');
-    TypeName typeName = variableList.type;
+    var typeName = variableList.type as TypeName;
     expect(typeName.name.name, 'C');
-    expect(typeName.typeArguments.arguments, hasLength(1));
-    TypeName typeArgument = typeName.typeArguments.arguments[0];
+    expect(typeName.typeArguments!.arguments, hasLength(1));
+    var typeArgument = typeName.typeArguments!.arguments[0] as TypeName;
     expect(typeArgument.name.name, 'T');
   }
 
   void test_parseNonLabeledStatement_variableDeclaration_typeParam2() {
-    VariableDeclarationStatement statement =
-        parseStatement('C<T /* ignored comment */ > v;');
+    var statement = parseStatement('C<T /* ignored comment */ > v;')
+        as VariableDeclarationStatement;
     assertNoErrors();
     VariableDeclarationList variableList = statement.variables;
     List<VariableDeclaration> variables = variableList.variables;
     expect(variables, hasLength(1));
     expect(variables[0].name.name, 'v');
-    TypeName typeName = variableList.type;
+    var typeName = variableList.type as TypeName;
     expect(typeName.name.name, 'C');
-    expect(typeName.typeArguments.arguments, hasLength(1));
-    TypeName typeArgument = typeName.typeArguments.arguments[0];
+    expect(typeName.typeArguments!.arguments, hasLength(1));
+    var typeArgument = typeName.typeArguments!.arguments[0] as TypeName;
     expect(typeArgument.name.name, 'T');
   }
 
   void test_parseNonLabeledStatement_variableDeclaration_typeParam3() {
-    VariableDeclarationStatement statement =
-        parseStatement('C<T Function(String s)> v;');
+    var statement = parseStatement('C<T Function(String s)> v;')
+        as VariableDeclarationStatement;
     assertNoErrors();
     VariableDeclarationList variableList = statement.variables;
     List<VariableDeclaration> variables = variableList.variables;
     expect(variables, hasLength(1));
     expect(variables[0].name.name, 'v');
-    TypeName typeName = variableList.type;
+    var typeName = variableList.type as TypeName;
     expect(typeName.name.name, 'C');
-    expect(typeName.typeArguments.arguments, hasLength(1));
-    expect(typeName.typeArguments.arguments[0], isGenericFunctionType);
+    expect(typeName.typeArguments!.arguments, hasLength(1));
+    expect(typeName.typeArguments!.arguments[0], isGenericFunctionType);
   }
 
   void test_parseStatement_emptyTypeArgumentList() {
     var declaration = parseStatement('C<> c;') as VariableDeclarationStatement;
     assertErrorsWithCodes([ParserErrorCode.EXPECTED_TYPE_NAME]);
     VariableDeclarationList variables = declaration.variables;
-    TypeName type = variables.type;
-    TypeArgumentList argumentList = type.typeArguments;
+    var type = variables.type as TypeName;
+    var argumentList = type.typeArguments!;
     expect(argumentList.leftBracket, isNotNull);
     expect(argumentList.arguments, hasLength(1));
     expect(argumentList.arguments[0].isSynthetic, isTrue);
@@ -1330,8 +1335,9 @@
   }
 
   void test_parseSwitchStatement_labeledCase2() {
-    SwitchStatement statement =
-        parseStatement('switch (a) {l1: case 0: l2: case 1: return;}');
+    var statement =
+        parseStatement('switch (a) {l1: case 0: l2: case 1: return;}')
+            as SwitchStatement;
     assertNoErrors();
     expect(statement.switchKeyword, isNotNull);
     expect(statement.leftParenthesis, isNotNull);
@@ -1373,8 +1379,9 @@
   }
 
   void test_parseSwitchStatement_labeledDefault2() {
-    SwitchStatement statement =
-        parseStatement('switch (a) {l1: case 0: l2: default: return;}');
+    var statement =
+        parseStatement('switch (a) {l1: case 0: l2: default: return;}')
+            as SwitchStatement;
     assertNoErrors();
     expect(statement.switchKeyword, isNotNull);
     expect(statement.leftParenthesis, isNotNull);
@@ -1432,9 +1439,9 @@
     CompilationUnit unit = parseCompilationUnit(
         'main() { try {} catch (int e) { } }',
         errors: [expectedError(ParserErrorCode.CATCH_SYNTAX, 27, 1)]);
-    FunctionDeclaration method = unit.declarations[0];
-    BlockFunctionBody body = method.functionExpression.body;
-    TryStatement statement = body.block.statements[0];
+    var method = unit.declarations[0] as FunctionDeclaration;
+    var body = method.functionExpression.body as BlockFunctionBody;
+    var statement = body.block.statements[0] as TryStatement;
     expect(statement.tryKeyword, isNotNull);
     expect(statement.body, isNotNull);
     NodeList<CatchClause> catchClauses = statement.catchClauses;
@@ -1443,9 +1450,9 @@
     expect(clause.onKeyword, isNull);
     expect(clause.exceptionType, isNull);
     expect(clause.catchKeyword, isNotNull);
-    expect(clause.exceptionParameter.name, 'int');
+    expect(clause.exceptionParameter!.name, 'int');
     expect(clause.comma, isNotNull);
-    expect(clause.stackTraceParameter.name, 'e');
+    expect(clause.stackTraceParameter!.name, 'e');
     expect(clause.body, isNotNull);
     expect(statement.finallyKeyword, isNull);
     expect(statement.finallyBlock, isNull);
@@ -1610,7 +1617,8 @@
   }
 
   void test_parseVariableDeclaration_equals_builtIn() {
-    VariableDeclarationStatement statement = parseStatement('int set = 0;');
+    var statement =
+        parseStatement('int set = 0;') as VariableDeclarationStatement;
     assertNoErrors();
     expect(statement.semicolon, isNotNull);
     VariableDeclarationList variableList = statement.variables;
@@ -1621,7 +1629,7 @@
   void test_parseVariableDeclarationListAfterMetadata_const_noType() {
     var declarationList = parseVariableDeclarationList('const a = 0');
     assertNoErrors();
-    expect(declarationList.keyword.lexeme, 'const');
+    expect(declarationList.keyword!.lexeme, 'const');
     expect(declarationList.type, isNull);
     expect(declarationList.variables, hasLength(1));
   }
@@ -1629,7 +1637,7 @@
   void test_parseVariableDeclarationListAfterMetadata_const_type() {
     var declarationList = parseVariableDeclarationList('const A a');
     assertNoErrors();
-    expect(declarationList.keyword.lexeme, 'const');
+    expect(declarationList.keyword!.lexeme, 'const');
     expect(declarationList.type, isNotNull);
     expect(declarationList.variables, hasLength(1));
   }
@@ -1645,7 +1653,7 @@
   void test_parseVariableDeclarationListAfterMetadata_final_type() {
     var declarationList = parseVariableDeclarationList('final A a');
     assertNoErrors();
-    expect(declarationList.keyword.lexeme, 'final');
+    expect(declarationList.keyword!.lexeme, 'final');
     expect(declarationList.type, isNotNull);
     expect(declarationList.variables, hasLength(1));
   }
@@ -1669,7 +1677,7 @@
   void test_parseVariableDeclarationListAfterMetadata_var_multiple() {
     var declarationList = parseVariableDeclarationList('var a, b, c');
     assertNoErrors();
-    expect(declarationList.keyword.lexeme, 'var');
+    expect(declarationList.keyword!.lexeme, 'var');
     expect(declarationList.type, isNull);
     expect(declarationList.variables, hasLength(3));
   }
@@ -1677,7 +1685,7 @@
   void test_parseVariableDeclarationListAfterMetadata_var_single() {
     var declarationList = parseVariableDeclarationList('var a');
     assertNoErrors();
-    expect(declarationList.keyword.lexeme, 'var');
+    expect(declarationList.keyword!.lexeme, 'var');
     expect(declarationList.type, isNull);
     expect(declarationList.variables, hasLength(1));
   }
@@ -1743,7 +1751,7 @@
     analyzer.Token token = unit.beginToken;
     while (!token.isEof) {
       expect(token.type, isNot(TokenType.GT_GT));
-      analyzer.Token next = token.next;
+      analyzer.Token next = token.next!;
       expect(next.previous, token);
       token = next;
     }
@@ -1760,7 +1768,7 @@
     analyzer.Token token = unit.beginToken;
     while (!token.isEof) {
       expect(token.type, isNot(TokenType.GT_GT));
-      analyzer.Token next = token.next;
+      analyzer.Token next = token.next!;
       expect(next.previous, token);
       token = next;
     }
diff --git a/pkg/analyzer/test/generated/static_type_analyzer_test.dart b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
index 819c49a..68d56a2 100644
--- a/pkg/analyzer/test/generated/static_type_analyzer_test.dart
+++ b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/analysis/features.dart';
+import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
@@ -43,19 +44,19 @@
 @reflectiveTest
 class StaticTypeAnalyzerTest with ResourceProviderMixin, ElementsTypesMixin {
   /// The error listener to which errors will be reported.
-  GatheringErrorListener _listener;
+  late final GatheringErrorListener _listener;
 
   /// The resolver visitor used to create the analyzer.
-  ResolverVisitor _visitor;
+  late final ResolverVisitor _visitor;
 
   /// The library containing the code being resolved.
-  LibraryElementImpl _definingLibrary;
+  late final LibraryElementImpl _definingLibrary;
 
   /// The analyzer being used to analyze the test cases.
-  StaticTypeAnalyzer _analyzer;
+  late final StaticTypeAnalyzer _analyzer;
 
   /// The type provider used to access the types.
-  TypeProvider _typeProvider;
+  late final TypeProvider _typeProvider;
 
   @override
   TypeProvider get typeProvider => _definingLibrary.typeProvider;
@@ -83,6 +84,7 @@
     _createAnalyzer();
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44522')
   void test_flatten_derived() {
     // class Derived<T> extends Future<T> { ... }
     ClassElementImpl derivedClass =
@@ -111,6 +113,7 @@
         derivedIntType);
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44522')
   void test_flatten_inhibit_recursion() {
     // class A extends B
     // class B extends A
@@ -125,6 +128,7 @@
     expect(_flatten(interfaceTypeStar(classB)), interfaceTypeStar(classB));
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44522')
   void test_flatten_related_derived_types() {
     InterfaceType intType = _typeProvider.intType;
     InterfaceType numType = _typeProvider.numType;
@@ -152,6 +156,7 @@
     expect(_flatten(interfaceTypeStar(classB)), intType);
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44522')
   void test_flatten_related_types() {
     InterfaceType intType = _typeProvider.intType;
     InterfaceType numType = _typeProvider.numType;
@@ -191,6 +196,7 @@
     expect(_flatten(futureFutureIntType), futureIntType);
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44522')
   void test_flatten_unrelated_types() {
     InterfaceType intType = _typeProvider.intType;
     InterfaceType stringType = _typeProvider.stringType;
@@ -351,6 +357,7 @@
   void test_visitIntegerLiteral() {
     // 42
     Expression node = _resolvedInteger(42);
+    AstTestFactory.argumentList([node]);
     expect(_analyze(node), same(_typeProvider.intType));
     _listener.assertNoErrors();
   }
@@ -445,13 +452,6 @@
     _listener.assertNoErrors();
   }
 
-  void test_visitThrowExpression_withoutValue() {
-    // throw
-    Expression node = AstTestFactory.throwExpression();
-    expect(_analyze(node), same(_typeProvider.bottomType));
-    _listener.assertNoErrors();
-  }
-
   void test_visitThrowExpression_withValue() {
     // throw 0
     Expression node = AstTestFactory.throwExpression2(_resolvedInteger(0));
@@ -462,10 +462,12 @@
   /// Return the type associated with the given [node] after the static type
   /// analyzer has computed a type for it. If [thisType] is provided, it is the
   /// type of 'this'.
-  DartType _analyze(Expression node, [InterfaceType thisType]) {
-    _visitor.setThisInterfaceType(thisType);
+  DartType _analyze(Expression node, [InterfaceType? thisType]) {
+    if (thisType != null) {
+      _visitor.setThisInterfaceType(thisType);
+    }
     node.accept(_analyzer);
-    return node.staticType;
+    return node.staticType!;
   }
 
   void _assertType(
@@ -503,8 +505,8 @@
         definingCompilationUnit.source = source;
     var featureSet = FeatureSet.forTesting();
 
-    _definingLibrary =
-        LibraryElementImpl(context, null, null, -1, 0, featureSet);
+    _definingLibrary = LibraryElementImpl(
+        context, _AnalysisSessionMock(), 'name', -1, 0, featureSet);
     _definingLibrary.definingCompilationUnit = definingCompilationUnit;
 
     _definingLibrary.typeProvider = context.typeProviderLegacy;
@@ -566,3 +568,8 @@
     return identifier;
   }
 }
+
+class _AnalysisSessionMock implements AnalysisSession {
+  @override
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
diff --git a/pkg/analyzer/test/generated/strong_mode_test.dart b/pkg/analyzer/test/generated/strong_mode_test.dart
index eb9c936..2364704 100644
--- a/pkg/analyzer/test/generated/strong_mode_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_test.dart
@@ -27,52 +27,55 @@
 /// Strong mode static analyzer local type inference tests
 @reflectiveTest
 class StrongModeLocalInferenceTest extends PubPackageResolutionTest {
-  TypeAssertions _assertions;
+  TypeAssertions? _assertions;
 
-  Asserter<DartType> _isDynamic;
-  Asserter<InterfaceType> _isFutureOfDynamic;
-  Asserter<InterfaceType> _isFutureOfInt;
-  Asserter<InterfaceType> _isFutureOfNull;
-  Asserter<InterfaceType> _isFutureOrOfInt;
-  Asserter<DartType> _isInt;
-  Asserter<DartType> _isNull;
-  Asserter<DartType> _isNum;
-  Asserter<DartType> _isObject;
-  Asserter<DartType> _isString;
+  late final Asserter<DartType> _isDynamic;
+  late final Asserter<InterfaceType> _isFutureOfDynamic;
+  late final Asserter<InterfaceType> _isFutureOfInt;
+  late final Asserter<InterfaceType> _isFutureOfNull;
+  late final Asserter<InterfaceType> _isFutureOrOfInt;
+  late final Asserter<DartType> _isInt;
+  late final Asserter<DartType> _isNull;
+  late final Asserter<DartType> _isNum;
+  late final Asserter<DartType> _isObject;
+  late final Asserter<DartType> _isString;
 
-  AsserterBuilder2<Asserter<DartType>, Asserter<DartType>, DartType>
+  late final AsserterBuilder2<Asserter<DartType>, Asserter<DartType>, DartType>
       _isFunction2Of;
-  AsserterBuilder<List<Asserter<DartType>>, InterfaceType> _isFutureOf;
-  AsserterBuilder<List<Asserter<DartType>>, InterfaceType> _isFutureOrOf;
-  AsserterBuilderBuilder<Asserter<DartType>, List<Asserter<DartType>>, DartType>
-      _isInstantiationOf;
-  AsserterBuilder<Asserter<DartType>, InterfaceType> _isListOf;
-  AsserterBuilder2<Asserter<DartType>, Asserter<DartType>, InterfaceType>
-      _isMapOf;
-  AsserterBuilder<DartType, DartType> _isType;
+  late final AsserterBuilder<List<Asserter<DartType>>, InterfaceType>
+      _isFutureOf;
+  late final AsserterBuilder<List<Asserter<DartType>>, InterfaceType>
+      _isFutureOrOf;
+  late final AsserterBuilderBuilder<Asserter<DartType>,
+      List<Asserter<DartType>>, DartType> _isInstantiationOf;
+  late final AsserterBuilder<Asserter<DartType>, InterfaceType> _isListOf;
+  late final AsserterBuilder2<Asserter<DartType>, Asserter<DartType>,
+      InterfaceType> _isMapOf;
+  late final AsserterBuilder<DartType, DartType> _isType;
 
-  AsserterBuilder<Element, DartType> _hasElement;
+  late final AsserterBuilder<Element, DartType> _hasElement;
 
-  CompilationUnit get unit => result.unit;
+  CompilationUnit get unit => result.unit!;
 
   @override
   Future<void> resolveTestFile() async {
     var result = await super.resolveTestFile();
 
-    if (_assertions == null) {
-      _assertions = TypeAssertions(typeProvider);
-      _isType = _assertions.isType;
-      _hasElement = _assertions.hasElement;
-      _isInstantiationOf = _assertions.isInstantiationOf;
-      _isInt = _assertions.isInt;
-      _isNull = _assertions.isNull;
-      _isNum = _assertions.isNum;
-      _isObject = _assertions.isObject;
-      _isString = _assertions.isString;
-      _isDynamic = _assertions.isDynamic;
-      _isListOf = _assertions.isListOf;
-      _isMapOf = _assertions.isMapOf;
-      _isFunction2Of = _assertions.isFunction2Of;
+    var assertions = _assertions;
+    if (assertions == null) {
+      assertions = _assertions = TypeAssertions(typeProvider);
+      _isType = assertions.isType;
+      _hasElement = assertions.hasElement;
+      _isInstantiationOf = assertions.isInstantiationOf;
+      _isInt = assertions.isInt;
+      _isNull = assertions.isNull;
+      _isNum = assertions.isNum;
+      _isObject = assertions.isObject;
+      _isString = assertions.isString;
+      _isDynamic = assertions.isDynamic;
+      _isListOf = assertions.isListOf;
+      _isMapOf = assertions.isMapOf;
+      _isFunction2Of = assertions.isFunction2Of;
       _isFutureOf = _isInstantiationOf(_hasElement(typeProvider.futureElement));
       _isFutureOrOf =
           _isInstantiationOf(_hasElement(typeProvider.futureOrElement));
@@ -116,11 +119,11 @@
       } else {
         var stmt =
             (body as BlockFunctionBody).block.statements[0] as ReturnStatement;
-        returnExp = stmt.expression;
+        returnExp = stmt.expression!;
       }
-      DartType type = returnExp.staticType;
+      DartType type = returnExp.staticType!;
       if (returnExp is AwaitExpression) {
-        type = returnExp.expression.staticType;
+        type = returnExp.expression.staticType!;
       }
       typeTest(type as InterfaceType);
     }
@@ -164,18 +167,18 @@
 
     void check(String name, Asserter<InterfaceType> typeTest) {
       FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, name);
-      FunctionBody body = test.functionExpression.body;
+      var body = test.functionExpression.body as FunctionBody;
       Expression returnExp;
       if (body is ExpressionFunctionBody) {
         returnExp = body.expression;
       } else {
         var stmt =
             (body as BlockFunctionBody).block.statements[0] as ReturnStatement;
-        returnExp = stmt.expression;
+        returnExp = stmt.expression!;
       }
-      DartType type = returnExp.staticType;
+      DartType type = returnExp.staticType!;
       if (returnExp is AwaitExpression) {
-        type = returnExp.expression.staticType;
+        type = returnExp.expression.staticType!;
       }
       typeTest(type as InterfaceType);
     }
@@ -217,13 +220,13 @@
       return exp;
     }
 
-    Element elementA = AstFinder.getClass(unit, "A").declaredElement;
+    Element elementA = AstFinder.getClass(unit, "A").declaredElement!;
 
     CascadeExpression cascade = fetch(0);
-    _isInstantiationOf(_hasElement(elementA))([_isInt])(cascade.staticType);
+    _isInstantiationOf(_hasElement(elementA))([_isInt])(cascade.staticType!);
     var invoke = cascade.cascadeSections[0] as MethodInvocation;
     var function = invoke.argumentList.arguments[1] as FunctionExpression;
-    ExecutableElement f0 = function.declaredElement;
+    ExecutableElement f0 = function.declaredElement!;
     _isListOf(_isInt)(f0.type.returnType as InterfaceType);
     expect(f0.type.normalParameterTypes[0], typeProvider.intType);
   }
@@ -244,8 +247,8 @@
         AstFinder.getStatementsInTopLevelFunction(unit, "test");
     var stmt = statements[0] as VariableDeclarationStatement;
     VariableDeclaration decl = stmt.variables.variables[0];
-    Expression call = decl.initializer;
-    _isInt(call.staticType);
+    Expression call = decl.initializer!;
+    _isInt(call.staticType!);
   }
 
   test_constrainedByBounds2() async {
@@ -264,8 +267,8 @@
         AstFinder.getStatementsInTopLevelFunction(unit, "test");
     var stmt = statements[0] as VariableDeclarationStatement;
     VariableDeclaration decl = stmt.variables.variables[0];
-    Expression call = decl.initializer;
-    _isInt(call.staticType);
+    Expression call = decl.initializer!;
+    _isInt(call.staticType!);
   }
 
   test_constrainedByBounds3() async {
@@ -281,8 +284,8 @@
         AstFinder.getStatementsInTopLevelFunction(unit, "test");
     var stmt = statements[0] as VariableDeclarationStatement;
     VariableDeclaration decl = stmt.variables.variables[0];
-    Expression call = decl.initializer;
-    _isInt(call.staticType);
+    Expression call = decl.initializer!;
+    _isInt(call.staticType!);
   }
 
   test_constrainedByBounds4() async {
@@ -303,8 +306,8 @@
         AstFinder.getStatementsInTopLevelFunction(unit, "test");
     var stmt = statements[0] as VariableDeclarationStatement;
     VariableDeclaration decl = stmt.variables.variables[0];
-    Expression call = decl.initializer;
-    _isInt(call.staticType);
+    Expression call = decl.initializer!;
+    _isInt(call.staticType!);
   }
 
   test_constrainedByBounds5() async {
@@ -327,8 +330,8 @@
         AstFinder.getStatementsInTopLevelFunction(unit, "test");
     var stmt = statements[0] as VariableDeclarationStatement;
     VariableDeclaration decl = stmt.variables.variables[0];
-    Expression call = decl.initializer;
-    _isDynamic(call.staticType);
+    Expression call = decl.initializer!;
+    _isDynamic(call.staticType!);
   }
 
   test_constructorInitializer_propagation() async {
@@ -363,13 +366,13 @@
     var body = constructor.body as BlockFunctionBody;
     var stmt = body.block.statements[0] as ReturnStatement;
     var exp = stmt.expression as InstanceCreationExpression;
-    ClassElement elementB = AstFinder.getClass(unit, "B").declaredElement;
-    ClassElement elementA = AstFinder.getClass(unit, "A").declaredElement;
-    expect(exp.constructorName.type.type.element, elementB);
+    ClassElement elementB = AstFinder.getClass(unit, "B").declaredElement!;
+    ClassElement elementA = AstFinder.getClass(unit, "A").declaredElement!;
+    expect(exp.constructorName.type.type!.element, elementB);
     _isInstantiationOf(_hasElement(elementB))([
       _isType(elementA.typeParameters[0]
           .instantiate(nullabilitySuffix: NullabilitySuffix.star))
-    ])(exp.staticType);
+    ])(exp.staticType!);
   }
 
   test_fieldDeclaration_propagation() async {
@@ -382,7 +385,7 @@
 
     VariableDeclaration field = AstFinder.getFieldInClass(unit, "A", "f0");
 
-    _isListOf(_isString)(field.initializer.staticType as InterfaceType);
+    _isListOf(_isString)(field.initializer!.staticType as InterfaceType);
   }
 
   test_functionDeclaration_body_propagation() async {
@@ -415,14 +418,14 @@
         (statements[0] as FunctionDeclarationStatement).functionDeclaration;
     var body0 = inner.functionExpression.body as BlockFunctionBody;
     var return0 = body0.block.statements[0] as ReturnStatement;
-    Expression anon0 = return0.expression;
+    Expression anon0 = return0.expression!;
     var type0 = anon0.staticType as FunctionType;
     expect(type0.returnType, typeProvider.intType);
     expect(type0.normalParameterTypes[0], typeProvider.stringType);
 
     var anon1 =
         (statements[1] as ReturnStatement).expression as FunctionExpression;
-    FunctionType type1 = anon1.declaredElement.type;
+    FunctionType type1 = anon1.declaredElement!.type;
     expect(type1.returnType, typeProvider.intType);
     expect(type1.normalParameterTypes[0], typeProvider.intType);
   }
@@ -456,7 +459,7 @@
       var stmt = statements[i] as VariableDeclarationStatement;
       VariableDeclaration decl = stmt.variables.variables[0];
       var exp = decl.initializer as FunctionExpression;
-      return exp.declaredElement.type;
+      return exp.declaredElement!.type;
     }
 
     _isFunction2Of(_isInt, _isNull)(literal(0));
@@ -494,7 +497,7 @@
       var stmt = statements[i] as VariableDeclarationStatement;
       VariableDeclaration decl = stmt.variables.variables[0];
       var exp = decl.initializer as FunctionExpression;
-      return exp.declaredElement.type;
+      return exp.declaredElement!.type;
     }
 
     _isFunction2Of(_isInt, _isNull)(literal(0));
@@ -531,12 +534,12 @@
       var stmt = statements[i] as VariableDeclarationStatement;
       VariableDeclaration decl = stmt.variables.variables[0];
       var exp = decl.initializer as FunctionExpression;
-      FunctionBody body = exp.body;
+      FunctionBody body = exp.body!;
       if (body is ExpressionFunctionBody) {
         return body.expression;
       } else {
         Statement stmt = (body as BlockFunctionBody).block.statements[0];
-        return (stmt as ReturnStatement).expression;
+        return (stmt as ReturnStatement).expression!;
       }
     }
 
@@ -573,7 +576,7 @@
       var stmt = statements[i] as ExpressionStatement;
       var invk = stmt.expression as FunctionExpressionInvocation;
       var exp = invk.argumentList.arguments[0] as FunctionExpression;
-      return exp.declaredElement.type;
+      return exp.declaredElement!.type;
     }
 
     _isFunction2Of(_isInt, _isNull)(literal(0));
@@ -608,7 +611,7 @@
       var stmt = statements[i] as ExpressionStatement;
       var invk = stmt.expression as FunctionExpressionInvocation;
       var exp = invk.argumentList.arguments[0] as FunctionExpression;
-      return exp.declaredElement.type;
+      return exp.declaredElement!.type;
     }
 
     _isFunction2Of(_isInt, _isNull)(literal(0));
@@ -642,7 +645,7 @@
       var stmt = statements[i] as ExpressionStatement;
       var invk = stmt.expression as MethodInvocation;
       var exp = invk.argumentList.arguments[0] as FunctionExpression;
-      return exp.declaredElement.type;
+      return exp.declaredElement!.type;
     }
 
     _isFunction2Of(_isInt, _isNull)(literal(0));
@@ -675,7 +678,7 @@
       var stmt = statements[i] as ExpressionStatement;
       var invk = stmt.expression as MethodInvocation;
       var exp = invk.argumentList.arguments[0] as FunctionExpression;
-      return exp.declaredElement.type;
+      return exp.declaredElement!.type;
     }
 
     _isFunction2Of(_isInt, _isNull)(literal(0));
@@ -711,7 +714,7 @@
       var stmt = statements[i] as ExpressionStatement;
       var invk = stmt.expression as MethodInvocation;
       var exp = invk.argumentList.arguments[0] as FunctionExpression;
-      return exp.declaredElement.type;
+      return exp.declaredElement!.type;
     }
 
     _isFunction2Of(_isInt, _isNull)(literal(0));
@@ -746,7 +749,7 @@
       var stmt = statements[i] as ExpressionStatement;
       var invk = stmt.expression as MethodInvocation;
       var exp = invk.argumentList.arguments[0] as FunctionExpression;
-      return exp.declaredElement.type;
+      return exp.declaredElement!.type;
     }
 
     _isFunction2Of(_isInt, _isNull)(literal(0));
@@ -784,12 +787,12 @@
       var stmt = statements[i] as VariableDeclarationStatement;
       VariableDeclaration decl = stmt.variables.variables[0];
       var exp = decl.initializer as FunctionExpression;
-      FunctionBody body = exp.body;
+      FunctionBody body = exp.body!;
       if (body is ExpressionFunctionBody) {
         return body.expression;
       } else {
         Statement stmt = (body as BlockFunctionBody).block.statements[0];
-        return (stmt as ReturnStatement).expression;
+        return (stmt as ReturnStatement).expression!;
       }
     }
 
@@ -947,7 +950,7 @@
     FutureOr<List<int>> test() => mk(3);
     ''');
     _isListOf(_isInt)(invoke.staticType as InterfaceType);
-    _isInt(invoke.argumentList.arguments[0].staticType);
+    _isInt(invoke.argumentList.arguments[0].staticType!);
   }
 
   test_futureOr_methods1() async {
@@ -955,7 +958,7 @@
     MethodInvocation invoke = await _testFutureOr(r'''
     dynamic test(FutureOr<int> x) => x.toString();
     ''');
-    _isString(invoke.staticType);
+    _isString(invoke.staticType!);
   }
 
   test_futureOr_methods2() async {
@@ -965,7 +968,7 @@
     ''', expectedErrors: [
       error(CompileTimeErrorCode.UNDEFINED_METHOD, 61, 3),
     ]);
-    _isDynamic(invoke.staticType);
+    _isDynamic(invoke.staticType!);
   }
 
   test_futureOr_methods3() async {
@@ -975,7 +978,7 @@
     ''', expectedErrors: [
       error(CompileTimeErrorCode.UNDEFINED_METHOD, 61, 4),
     ]);
-    _isDynamic(invoke.staticType);
+    _isDynamic(invoke.staticType!);
   }
 
   test_futureOr_methods4() async {
@@ -985,7 +988,7 @@
     ''', expectedErrors: [
       error(CompileTimeErrorCode.UNDEFINED_METHOD, 65, 3),
     ]);
-    _isDynamic(invoke.staticType);
+    _isDynamic(invoke.staticType!);
   }
 
   test_futureOr_no_return() async {
@@ -995,7 +998,7 @@
     test() => f.then((int x) {});
     ''');
     _isFunction2Of(_isInt, _isNull)(
-        invoke.argumentList.arguments[0].staticType);
+        invoke.argumentList.arguments[0].staticType!);
     _isFutureOfNull(invoke.staticType as InterfaceType);
   }
 
@@ -1006,7 +1009,7 @@
     test() => f.then((int x) {return;});
     ''');
     _isFunction2Of(_isInt, _isNull)(
-        invoke.argumentList.arguments[0].staticType);
+        invoke.argumentList.arguments[0].staticType!);
     _isFutureOfNull(invoke.staticType as InterfaceType);
   }
 
@@ -1017,7 +1020,7 @@
     test() => f.then((int x) {return null;});
     ''');
     _isFunction2Of(_isInt, _isNull)(
-        invoke.argumentList.arguments[0].staticType);
+        invoke.argumentList.arguments[0].staticType!);
     _isFutureOfNull(invoke.staticType as InterfaceType);
   }
 
@@ -1050,7 +1053,7 @@
     test() => f.then<Null>((int x) {});
     ''');
     _isFunction2Of(_isInt, _isNull)(
-        invoke.argumentList.arguments[0].staticType);
+        invoke.argumentList.arguments[0].staticType!);
     _isFutureOfNull(invoke.staticType as InterfaceType);
   }
 
@@ -1061,7 +1064,7 @@
     test() => f.then<Null>((int x) {return;});
     ''');
     _isFunction2Of(_isInt, _isNull)(
-        invoke.argumentList.arguments[0].staticType);
+        invoke.argumentList.arguments[0].staticType!);
     _isFutureOfNull(invoke.staticType as InterfaceType);
   }
 
@@ -1072,7 +1075,7 @@
     test() => f.then<Null>((int x) { return null;});
     ''');
     _isFunction2Of(_isInt, _isNull)(
-        invoke.argumentList.arguments[0].staticType);
+        invoke.argumentList.arguments[0].staticType!);
     _isFutureOfNull(invoke.staticType as InterfaceType);
   }
 
@@ -1111,14 +1114,14 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 347, 2),
     ]);
 
-    Element elementA = AstFinder.getClass(unit, "A").declaredElement;
+    Element elementA = AstFinder.getClass(unit, "A").declaredElement!;
     List<Statement> statements =
         AstFinder.getStatementsInTopLevelFunction(unit, "test");
     void check(int i) {
       var stmt = statements[i] as VariableDeclarationStatement;
       VariableDeclaration decl = stmt.variables.variables[0];
-      Expression init = decl.initializer;
-      _isInstantiationOf(_hasElement(elementA))([_isInt])(init.staticType);
+      Expression init = decl.initializer!;
+      _isInstantiationOf(_hasElement(elementA))([_isInt])(init.staticType!);
     }
 
     for (var i = 0; i < 5; i++) {
@@ -1142,7 +1145,7 @@
     ]);
 
     DartType cType = findElement.localVar('c').type;
-    Element elementC = AstFinder.getClass(unit, "C").declaredElement;
+    Element elementC = AstFinder.getClass(unit, "C").declaredElement!;
 
     _isInstantiationOf(_hasElement(elementC))([_isDynamic])(cType);
   }
@@ -1419,7 +1422,7 @@
             as VariableDeclarationStatement)
         .variables
         .variables[0];
-    _isDynamic(h.declaredElement.type);
+    _isDynamic(h.declaredElement!.type);
     var fCall = h.initializer as MethodInvocation;
     assertInvokeType(fCall, 'dynamic Function(dynamic Function(dynamic))');
     var g = fCall.argumentList.arguments[0];
@@ -1473,8 +1476,9 @@
 
     VariableDeclaration mapB = AstFinder.getFieldInClass(unit, "B", "map");
     MethodDeclaration mapC = AstFinder.getMethodInClass(unit, "C", "map");
-    assertMapOfIntToListOfInt(mapB.declaredElement.type as InterfaceType);
-    assertMapOfIntToListOfInt(mapC.declaredElement.returnType as InterfaceType);
+    assertMapOfIntToListOfInt(mapB.declaredElement!.type as InterfaceType);
+    assertMapOfIntToListOfInt(
+        mapC.declaredElement!.returnType as InterfaceType);
 
     var mapLiteralB = mapB.initializer as SetOrMapLiteral;
     var mapLiteralC =
@@ -1649,21 +1653,22 @@
       error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 3154, 7),
     ]);
 
-    Expression rhs(VariableDeclarationStatement stmt) {
+    Expression rhs(AstNode stmt) {
+      stmt as VariableDeclarationStatement;
       VariableDeclaration decl = stmt.variables.variables[0];
-      Expression exp = decl.initializer;
+      Expression exp = decl.initializer!;
       return exp;
     }
 
     void hasType(Asserter<DartType> assertion, Expression exp) =>
-        assertion(exp.staticType);
+        assertion(exp.staticType!);
 
-    Element elementA = AstFinder.getClass(unit, "A").declaredElement;
-    Element elementB = AstFinder.getClass(unit, "B").declaredElement;
-    Element elementC = AstFinder.getClass(unit, "C").declaredElement;
-    Element elementD = AstFinder.getClass(unit, "D").declaredElement;
-    Element elementE = AstFinder.getClass(unit, "E").declaredElement;
-    Element elementF = AstFinder.getClass(unit, "F").declaredElement;
+    Element elementA = AstFinder.getClass(unit, "A").declaredElement!;
+    Element elementB = AstFinder.getClass(unit, "B").declaredElement!;
+    Element elementC = AstFinder.getClass(unit, "C").declaredElement!;
+    Element elementD = AstFinder.getClass(unit, "D").declaredElement!;
+    Element elementE = AstFinder.getClass(unit, "E").declaredElement!;
+    Element elementF = AstFinder.getClass(unit, "F").declaredElement!;
 
     AsserterBuilder<List<Asserter<DartType>>, DartType> assertAOf =
         _isInstantiationOf(_hasElement(elementA));
@@ -1811,7 +1816,7 @@
 
     Asserter<InterfaceType> assertListOfInt = _isListOf(_isInt);
     Asserter<InterfaceType> assertListOfListOfInt =
-        _isListOf((DartType type) => assertListOfInt(type));
+        _isListOf((DartType type) => assertListOfInt(type as InterfaceType));
 
     assertListOfListOfInt(literal(0).staticType as InterfaceType);
     assertListOfListOfInt(literal(1).staticType as InterfaceType);
@@ -1850,7 +1855,7 @@
       var stmt = statements[i] as VariableDeclarationStatement;
       VariableDeclaration decl = stmt.variables.variables[0];
       var exp = decl.initializer as ListLiteral;
-      return exp.staticType;
+      return exp.staticType!;
     }
 
     Asserter<InterfaceType> assertListOfInt = _isListOf(_isInt);
@@ -1885,7 +1890,7 @@
       var stmt = statements[i] as VariableDeclarationStatement;
       VariableDeclaration decl = stmt.variables.variables[0];
       var exp = decl.initializer as ListLiteral;
-      return exp.staticType;
+      return exp.staticType!;
     }
 
     Asserter<InterfaceType> assertListOfInt = _isListOf(_isInt);
@@ -1922,7 +1927,7 @@
       var stmt = statements[i] as VariableDeclarationStatement;
       VariableDeclaration decl = stmt.variables.variables[0];
       var exp = decl.initializer as ListLiteral;
-      return exp.staticType;
+      return exp.staticType!;
     }
 
     _isListOf(_isNum)(literal(0) as InterfaceType);
@@ -1951,11 +1956,11 @@
 
     List<Statement> statements =
         AstFinder.getStatementsInTopLevelFunction(unit, "main");
-    DartType literal(int i) {
-      VariableDeclarationStatement stmt = statements[i];
+    InterfaceType literal(int i) {
+      var stmt = statements[i] as VariableDeclarationStatement;
       VariableDeclaration decl = stmt.variables.variables[0];
-      ListLiteral exp = decl.initializer;
-      return exp.staticType;
+      var exp = decl.initializer as ListLiteral;
+      return exp.staticType as InterfaceType;
     }
 
     Asserter<InterfaceType> assertListOfInt = _isListOf(_isInt);
@@ -1991,30 +1996,34 @@
     List<Statement> statements =
         AstFinder.getStatementsInTopLevelFunction(unit, "main");
     SetOrMapLiteral literal(int i) {
-      VariableDeclarationStatement stmt = statements[i];
+      var stmt = statements[i] as VariableDeclarationStatement;
       VariableDeclaration decl = stmt.variables.variables[0];
-      SetOrMapLiteral exp = decl.initializer;
+      var exp = decl.initializer as SetOrMapLiteral;
       return exp;
     }
 
     Asserter<InterfaceType> assertListOfString = _isListOf(_isString);
-    Asserter<InterfaceType> assertMapOfIntToListOfString =
-        _isMapOf(_isInt, (DartType type) => assertListOfString(type));
+    Asserter<InterfaceType> assertMapOfIntToListOfString = _isMapOf(
+        _isInt, (DartType type) => assertListOfString(type as InterfaceType));
 
-    assertMapOfIntToListOfString(literal(0).staticType);
-    assertMapOfIntToListOfString(literal(1).staticType);
-    assertMapOfIntToListOfString(literal(2).staticType);
-    assertMapOfIntToListOfString(literal(3).staticType);
-    assertMapOfIntToListOfString(literal(4).staticType);
+    assertMapOfIntToListOfString(literal(0).staticType as InterfaceType);
+    assertMapOfIntToListOfString(literal(1).staticType as InterfaceType);
+    assertMapOfIntToListOfString(literal(2).staticType as InterfaceType);
+    assertMapOfIntToListOfString(literal(3).staticType as InterfaceType);
+    assertMapOfIntToListOfString(literal(4).staticType as InterfaceType);
 
-    assertListOfString(
-        (literal(1).elements[0] as MapLiteralEntry).value.staticType);
-    assertListOfString(
-        (literal(2).elements[0] as MapLiteralEntry).value.staticType);
-    assertListOfString(
-        (literal(3).elements[0] as MapLiteralEntry).value.staticType);
-    assertListOfString(
-        (literal(4).elements[0] as MapLiteralEntry).value.staticType);
+    assertListOfString((literal(1).elements[0] as MapLiteralEntry)
+        .value
+        .staticType as InterfaceType);
+    assertListOfString((literal(2).elements[0] as MapLiteralEntry)
+        .value
+        .staticType as InterfaceType);
+    assertListOfString((literal(3).elements[0] as MapLiteralEntry)
+        .value
+        .staticType as InterfaceType);
+    assertListOfString((literal(4).elements[0] as MapLiteralEntry)
+        .value
+        .staticType as InterfaceType);
   }
 
   test_mapLiteral_simple() async {
@@ -2041,11 +2050,11 @@
 
     List<Statement> statements =
         AstFinder.getStatementsInTopLevelFunction(unit, "main");
-    DartType literal(int i) {
-      VariableDeclarationStatement stmt = statements[i];
+    InterfaceType literal(int i) {
+      var stmt = statements[i] as VariableDeclarationStatement;
       VariableDeclaration decl = stmt.variables.variables[0];
-      SetOrMapLiteral exp = decl.initializer;
-      return exp.staticType;
+      var exp = decl.initializer as SetOrMapLiteral;
+      return exp.staticType as InterfaceType;
     }
 
     Asserter<InterfaceType> assertMapOfIntToString =
@@ -2080,11 +2089,11 @@
 
     List<Statement> statements =
         AstFinder.getStatementsInTopLevelFunction(unit, "main");
-    DartType literal(int i) {
-      VariableDeclarationStatement stmt = statements[i];
+    InterfaceType literal(int i) {
+      var stmt = statements[i] as VariableDeclarationStatement;
       VariableDeclaration decl = stmt.variables.variables[0];
-      SetOrMapLiteral exp = decl.initializer;
-      return exp.staticType;
+      var exp = decl.initializer as SetOrMapLiteral;
+      return exp.staticType as InterfaceType;
     }
 
     Asserter<InterfaceType> assertMapOfIntToDynamic =
@@ -2115,13 +2124,13 @@
         return body.expression;
       } else {
         Statement stmt = (body as BlockFunctionBody).block.statements[0];
-        return (stmt as ReturnStatement).expression;
+        return (stmt as ReturnStatement).expression!;
       }
     }
 
     Asserter<InterfaceType> assertListOfString = _isListOf(_isString);
-    assertListOfString(methodReturnValue("m0").staticType);
-    assertListOfString(methodReturnValue("m1").staticType);
+    assertListOfString(methodReturnValue("m0").staticType as InterfaceType);
+    assertListOfString(methodReturnValue("m1").staticType as InterfaceType);
   }
 
   test_partialTypes1() async {
@@ -2136,11 +2145,11 @@
     await assertNoErrorsInCode(code);
 
     FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test");
-    ExpressionFunctionBody body = test.functionExpression.body;
-    _isString(body.expression.staticType);
-    MethodInvocation invoke = body.expression;
-    FunctionExpression function = invoke.argumentList.arguments[0];
-    ExecutableElement f0 = function.declaredElement;
+    var body = test.functionExpression.body as ExpressionFunctionBody;
+    _isString(body.expression.staticType!);
+    var invoke = body.expression as MethodInvocation;
+    var function = invoke.argumentList.arguments[0] as FunctionExpression;
+    ExecutableElement f0 = function.declaredElement!;
     FunctionType type = f0.type;
     _isFunction2Of(_isString, _isInt)(type);
   }
@@ -2162,10 +2171,10 @@
     ]);
 
     FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test");
-    ExpressionFunctionBody body = test.functionExpression.body;
-    DartType type = body.expression.staticType;
+    var body = test.functionExpression.body as ExpressionFunctionBody;
+    DartType type = body.expression.staticType!;
 
-    Element elementB = AstFinder.getClass(unit, "B").declaredElement;
+    Element elementB = AstFinder.getClass(unit, "B").declaredElement!;
 
     _isInstantiationOf(_hasElement(elementB))([_isNull])(type);
   }
@@ -2184,10 +2193,10 @@
     await assertNoErrorsInCode(code);
 
     FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test");
-    ExpressionFunctionBody body = test.functionExpression.body;
-    DartType type = body.expression.staticType;
+    var body = test.functionExpression.body as ExpressionFunctionBody;
+    DartType type = body.expression.staticType!;
 
-    Element elementB = AstFinder.getClass(unit, "B").declaredElement;
+    Element elementB = AstFinder.getClass(unit, "B").declaredElement!;
 
     _isInstantiationOf(_hasElement(elementB))([_isNum])(type);
   }
@@ -2209,10 +2218,10 @@
     ]);
 
     FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test");
-    ExpressionFunctionBody body = test.functionExpression.body;
-    DartType type = body.expression.staticType;
+    var body = test.functionExpression.body as ExpressionFunctionBody;
+    DartType type = body.expression.staticType!;
 
-    Element elementB = AstFinder.getClass(unit, "B").declaredElement;
+    Element elementB = AstFinder.getClass(unit, "B").declaredElement!;
 
     _isInstantiationOf(_hasElement(elementB))([_isNull])(type);
   }
@@ -2232,10 +2241,10 @@
     await assertNoErrorsInCode(code);
 
     FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test");
-    ExpressionFunctionBody body = test.functionExpression.body;
-    DartType type = body.expression.staticType;
+    var body = test.functionExpression.body as ExpressionFunctionBody;
+    DartType type = body.expression.staticType!;
 
-    Element elementB = AstFinder.getClass(unit, "B").declaredElement;
+    Element elementB = AstFinder.getClass(unit, "B").declaredElement!;
 
     _isInstantiationOf(_hasElement(elementB))([_isInt])(type);
   }
@@ -2257,11 +2266,11 @@
     await assertNoErrorsInCode(code);
 
     FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test");
-    ExpressionFunctionBody body = test.functionExpression.body;
-    FunctionType functionType = body.expression.staticType;
+    var body = test.functionExpression.body as ExpressionFunctionBody;
+    var functionType = body.expression.staticType as FunctionType;
     DartType type = functionType.normalParameterTypes[0];
 
-    Element elementA = AstFinder.getClass(unit, "A").declaredElement;
+    Element elementA = AstFinder.getClass(unit, "A").declaredElement!;
 
     _isInstantiationOf(_hasElement(elementA))([_isObject, _isObject])(type);
   }
@@ -2282,11 +2291,11 @@
     await assertNoErrorsInCode(code);
 
     FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test");
-    ExpressionFunctionBody body = test.functionExpression.body;
-    FunctionType functionType = body.expression.staticType;
+    var body = test.functionExpression.body as ExpressionFunctionBody;
+    var functionType = body.expression.staticType as FunctionType;
     DartType type = functionType.normalParameterTypes[0];
 
-    Element elementA = AstFinder.getClass(unit, "A").declaredElement;
+    Element elementA = AstFinder.getClass(unit, "A").declaredElement!;
 
     _isInstantiationOf(_hasElement(elementA))([_isNum, _isNum])(type);
   }
@@ -2308,11 +2317,11 @@
     await assertNoErrorsInCode(code);
 
     FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test");
-    ExpressionFunctionBody body = test.functionExpression.body;
-    FunctionType functionType = body.expression.staticType;
+    var body = test.functionExpression.body as ExpressionFunctionBody;
+    var functionType = body.expression.staticType as FunctionType;
     DartType type = functionType.normalParameterTypes[0];
 
-    Element elementA = AstFinder.getClass(unit, "A").declaredElement;
+    Element elementA = AstFinder.getClass(unit, "A").declaredElement!;
 
     _isInstantiationOf(_hasElement(elementA))([_isNum, _isNum])(type);
   }
@@ -2334,11 +2343,11 @@
     await assertNoErrorsInCode(code);
 
     FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test");
-    ExpressionFunctionBody body = test.functionExpression.body;
-    FunctionType functionType = body.expression.staticType;
+    var body = test.functionExpression.body as ExpressionFunctionBody;
+    var functionType = body.expression.staticType as FunctionType;
     DartType type = functionType.normalParameterTypes[0];
 
-    Element elementA = AstFinder.getClass(unit, "A").declaredElement;
+    Element elementA = AstFinder.getClass(unit, "A").declaredElement!;
 
     _isInstantiationOf(_hasElement(elementA))([_isNum, _isNum])(type);
   }
@@ -2355,20 +2364,20 @@
    ''';
     await assertNoErrorsInCode(code);
 
-    ClassDeclaration b = unit.declarations[1];
-    ConstructorDeclaration bConstructor = b.members[0];
-    ConstructorName redirected = bConstructor.redirectedConstructor;
+    var b = unit.declarations[1] as ClassDeclaration;
+    var bConstructor = b.members[0] as ConstructorDeclaration;
+    var redirected = bConstructor.redirectedConstructor as ConstructorName;
 
-    TypeName typeName = redirected.type;
+    var typeName = redirected.type;
     assertType(typeName.type, 'A<T2, U2>');
     assertType(typeName.type, 'A<T2, U2>');
 
-    var constructorMember = redirected.staticElement;
+    var constructorMember = redirected.staticElement!;
     expect(
       constructorMember.getDisplayString(withNullability: false),
       'A<T2, U2> A.named()',
     );
-    expect(redirected.name.staticElement, constructorMember);
+    expect(redirected.name!.staticElement, constructorMember);
   }
 
   test_redirectedConstructor_self() async {
@@ -2391,17 +2400,17 @@
 }
 ''');
 
-    ClassDeclaration b = result.unit.declarations[1];
-    ConstructorDeclaration bConstructor = b.members[0];
-    ConstructorName redirected = bConstructor.redirectedConstructor;
+    var b = result.unit!.declarations[1] as ClassDeclaration;
+    var bConstructor = b.members[0] as ConstructorDeclaration;
+    var redirected = bConstructor.redirectedConstructor as ConstructorName;
 
-    TypeName typeName = redirected.type;
+    var typeName = redirected.type;
     assertType(typeName.type, 'A<T2, U2>');
     assertType(typeName.type, 'A<T2, U2>');
 
     expect(redirected.name, isNull);
     expect(
-      redirected.staticElement.getDisplayString(withNullability: false),
+      redirected.staticElement!.getDisplayString(withNullability: false),
       'A<T2, U2> A()',
     );
   }
@@ -2417,9 +2426,10 @@
 
     ConstructorDeclaration constructor =
         AstFinder.getConstructorInClass(unit, "A", null);
-    RedirectingConstructorInvocation invocation = constructor.initializers[0];
+    var invocation =
+        constructor.initializers[0] as RedirectingConstructorInvocation;
     Expression exp = invocation.argumentList.arguments[0];
-    _isListOf(_isString)(exp.staticType);
+    _isListOf(_isString)(exp.staticType as InterfaceType);
   }
 
   test_returnType_variance1() async {
@@ -2433,10 +2443,10 @@
     await assertNoErrorsInCode(code);
 
     FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test");
-    ExpressionFunctionBody body = test.functionExpression.body;
-    MethodInvocation invoke = body.expression;
+    var body = test.functionExpression.body as ExpressionFunctionBody;
+    var invoke = body.expression as MethodInvocation;
     _isFunction2Of(_isNum, _isFunction2Of(_isNum, _isString))(
-        invoke.staticInvokeType);
+        invoke.staticInvokeType!);
   }
 
   test_returnType_variance2() async {
@@ -2450,10 +2460,10 @@
     await assertNoErrorsInCode(code);
 
     FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test");
-    ExpressionFunctionBody body = test.functionExpression.body;
-    MethodInvocation invoke = body.expression;
+    var body = test.functionExpression.body as ExpressionFunctionBody;
+    var invoke = body.expression as MethodInvocation;
     _isFunction2Of(_isNum, _isFunction2Of(_isString, _isNum))(
-        invoke.staticInvokeType);
+        invoke.staticInvokeType!);
   }
 
   test_returnType_variance3() async {
@@ -2468,8 +2478,8 @@
     await assertNoErrorsInCode(code);
 
     FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test");
-    ExpressionFunctionBody body = test.functionExpression.body;
-    FunctionType functionType = body.expression.staticType;
+    var body = test.functionExpression.body as ExpressionFunctionBody;
+    var functionType = body.expression.staticType as FunctionType;
     DartType type = functionType.normalParameterTypes[0];
     _isInt(type);
   }
@@ -2486,8 +2496,8 @@
     await assertNoErrorsInCode(code);
 
     FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test");
-    ExpressionFunctionBody body = test.functionExpression.body;
-    FunctionType functionType = body.expression.staticType;
+    var body = test.functionExpression.body as ExpressionFunctionBody;
+    var functionType = body.expression.staticType as FunctionType;
     DartType type = functionType.returnType;
     _isInt(type);
   }
@@ -2504,11 +2514,11 @@
     await assertNoErrorsInCode(code);
 
     FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test");
-    ExpressionFunctionBody body = test.functionExpression.body;
-    MethodInvocation call = body.expression;
-    _isNum(call.staticType);
+    var body = test.functionExpression.body as ExpressionFunctionBody;
+    var call = body.expression as MethodInvocation;
+    _isNum(call.staticType!);
     _isFunction2Of(_isFunction2Of(_isNum, _isString), _isNum)(
-        call.staticInvokeType);
+        call.staticInvokeType!);
   }
 
   test_returnType_variance6() async {
@@ -2523,11 +2533,11 @@
     await assertNoErrorsInCode(code);
 
     FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test");
-    ExpressionFunctionBody body = test.functionExpression.body;
-    MethodInvocation call = body.expression;
-    _isNum(call.staticType);
+    var body = test.functionExpression.body as ExpressionFunctionBody;
+    var call = body.expression as MethodInvocation;
+    _isNum(call.staticType!);
     _isFunction2Of(_isFunction2Of(_isString, _isNum), _isNum)(
-        call.staticInvokeType);
+        call.staticInvokeType!);
   }
 
   test_superConstructorInvocation_propagation() async {
@@ -2543,9 +2553,9 @@
 
     ConstructorDeclaration constructor =
         AstFinder.getConstructorInClass(unit, "A", null);
-    SuperConstructorInvocation invocation = constructor.initializers[0];
+    var invocation = constructor.initializers[0] as SuperConstructorInvocation;
     Expression exp = invocation.argumentList.arguments[0];
-    _isListOf(_isString)(exp.staticType);
+    _isListOf(_isString)(exp.staticType as InterfaceType);
   }
 
   /// Verifies the result has [CompileTimeErrorCode.COULD_NOT_INFER] with
@@ -2577,8 +2587,8 @@
     await assertErrorsInCode(fullCode, expectedErrors);
 
     FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test");
-    ExpressionFunctionBody body = test.functionExpression.body;
-    return body.expression;
+    var body = test.functionExpression.body as ExpressionFunctionBody;
+    return body.expression as MethodInvocation;
   }
 }
 
@@ -2658,7 +2668,7 @@
     await assertNoErrorsInCode(r'T f<T>(T x) => null;');
     expectFunctionType('f', 'T Function<T>(T)', typeFormals: '[T]');
     SimpleIdentifier f = findNode.simple('f');
-    FunctionElementImpl e = f.staticElement;
+    var e = f.staticElement as FunctionElementImpl;
     FunctionType ft = e.type.instantiate([typeProvider.stringType]);
     assertType(ft, 'String Function(String)');
   }
@@ -2686,7 +2696,7 @@
 ''');
     expectFunctionType('f', 'T Function<T>(T)', typeFormals: '[T]');
     SimpleIdentifier f = findNode.simple('f');
-    MethodElementImpl e = f.staticElement;
+    var e = f.staticElement as MethodElementImpl;
     FunctionType ft = e.type.instantiate([typeProvider.stringType]);
     assertType(ft, 'String Function(String)');
   }
@@ -2773,7 +2783,7 @@
     assertType(findElement.method('f').type, 'List<T> Function<T>(E)');
 
     var cOfString = findElement.localVar('cOfString');
-    var ft = (cOfString.type as InterfaceType).getMethod('f').type;
+    var ft = (cOfString.type as InterfaceType).getMethod('f')!.type;
     assertType(ft, 'List<T> Function<T>(String)');
     assertType(
         ft.instantiate([typeProvider.intType]), 'List<int> Function(String)');
@@ -2791,8 +2801,8 @@
 ''', [
       error(HintCode.UNUSED_LOCAL_VARIABLE, 82, 1),
     ]);
-    MethodInvocation f = findNode.simple('f<int>').parent;
-    FunctionType ft = f.staticInvokeType;
+    var f = findNode.simple('f<int>').parent as MethodInvocation;
+    var ft = f.staticInvokeType as FunctionType;
     assertType(ft, 'List<int> Function(String)');
 
     var x = findElement.localVar('x');
@@ -3022,7 +3032,7 @@
         findElement.method('f').type, 'List<T> Function<T>(T Function(E))');
 
     var cOfString = findElement.localVar('cOfString');
-    var ft = (cOfString.type as InterfaceType).getMethod('f').type;
+    var ft = (cOfString.type as InterfaceType).getMethod('f')!.type;
     assertType(ft, 'List<T> Function<T>(T Function(String))');
     assertType(ft.instantiate([typeProvider.intType]),
         'List<int> Function(int Function(String))');
@@ -3163,7 +3173,7 @@
 ''');
     MethodInvocation f = findNode.methodInvocation('f<int>(3);');
     assertInvokeType(f, 'S Function(int)');
-    FunctionType ft = f.staticInvokeType;
+    var ft = f.staticInvokeType as FunctionType;
     expect('${ft.typeArguments}', '[S, int]');
 
     expectIdentifierType('f;', 'S Function<Sâ‚€ extends S>(Sâ‚€)');
@@ -3195,7 +3205,7 @@
     expectFunctionType('f<T>(T x) => null; // from D', 'T Function<T>(T)',
         typeFormals: '[T]');
     SimpleIdentifier f = findNode.simple('f<T>(T x) => null; // from D');
-    MethodElementImpl e = f.staticElement;
+    var e = f.staticElement as MethodElementImpl;
     FunctionType ft = e.type.instantiate([typeProvider.stringType]);
     assertType(ft, 'String Function(String)');
   }
diff --git a/pkg/analyzer/test/generated/test_analysis_context.dart b/pkg/analyzer/test/generated/test_analysis_context.dart
index 2f24e5c..473c34a 100644
--- a/pkg/analyzer/test/generated/test_analysis_context.dart
+++ b/pkg/analyzer/test/generated/test_analysis_context.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/analysis/session.dart';
 import 'package:analyzer/src/dart/element/class_hierarchy.dart';
 import 'package:analyzer/src/dart/element/element.dart';
@@ -19,15 +18,15 @@
   final SourceFactory sourceFactory = _MockSourceFactory();
 
   final _MockAnalysisSession _analysisSession = _MockAnalysisSession();
-  AnalysisOptionsImpl _analysisOptions;
+  late AnalysisOptionsImpl _analysisOptions;
 
-  TypeProvider _typeProviderLegacy;
-  TypeProvider _typeProviderNonNullableByDefault;
+  late TypeProviderImpl _typeProviderLegacy;
+  late TypeProviderImpl _typeProviderNonNullableByDefault;
 
-  TypeSystemImpl _typeSystemLegacy;
-  TypeSystemImpl _typeSystemNonNullableByDefault;
+  late TypeSystemImpl _typeSystemLegacy;
+  late TypeSystemImpl _typeSystemNonNullableByDefault;
 
-  TestAnalysisContext({FeatureSet featureSet}) {
+  TestAnalysisContext({FeatureSet? featureSet}) {
     _analysisOptions = AnalysisOptionsImpl()
       ..contextFeatures = featureSet ?? FeatureSet.forTesting();
 
@@ -68,11 +67,11 @@
 
   AnalysisSessionImpl get analysisSession => _analysisSession;
 
-  TypeProvider get typeProviderLegacy {
+  TypeProviderImpl get typeProviderLegacy {
     return _typeProviderLegacy;
   }
 
-  TypeProvider get typeProviderNonNullableByDefault {
+  TypeProviderImpl get typeProviderNonNullableByDefault {
     return _typeProviderNonNullableByDefault;
   }
 
diff --git a/pkg/analyzer/test/generated/test_support.dart b/pkg/analyzer/test/generated/test_support.dart
index 43a53ee..97ca394 100644
--- a/pkg/analyzer/test/generated/test_support.dart
+++ b/pkg/analyzer/test/generated/test_support.dart
@@ -22,7 +22,7 @@
   final int length;
 
   /// The message text for the error.
-  final String text;
+  final String? text;
 
   ExpectedContextMessage(this.filePath, this.offset, this.length, {this.text});
 
@@ -51,11 +51,11 @@
   final int length;
 
   /// The message text of the error or `null` if the message should not be checked.
-  final String message;
+  final String? message;
 
   /// A pattern that should be contained in the error message or `null` if the message
   /// contents should not be checked.
-  final Pattern messageContains;
+  final Pattern? messageContains;
 
   /// The list of context messages that are expected to be associated with the
   /// error.
@@ -79,7 +79,7 @@
       return false;
     }
     if (messageContains != null &&
-        error.message?.contains(messageContains) != true) {
+        error.message.contains(messageContains!) != true) {
       return false;
     }
     List<DiagnosticMessage> contextMessages = error.contextMessages.toList();
@@ -246,7 +246,7 @@
     //
     Map<ErrorCode, int> expectedCounts = <ErrorCode, int>{};
     for (ErrorCode code in expectedErrorCodes) {
-      int count = expectedCounts[code];
+      var count = expectedCounts[code];
       if (count == null) {
         count = 1;
       } else {
@@ -269,7 +269,7 @@
     //
     expectedCounts.forEach((ErrorCode code, int expectedCount) {
       int actualCount;
-      List<AnalysisError> list = errorsByCode.remove(code);
+      var list = errorsByCode.remove(code);
       if (list == null) {
         actualCount = 0;
       } else {
@@ -357,7 +357,7 @@
 
   /// Return the line information associated with the given [source], or `null`
   /// if no line information has been associated with the source.
-  LineInfo getLineInfo(Source source) => _lineInfoMap[source];
+  LineInfo? getLineInfo(Source source) => _lineInfoMap[source];
 
   /// Return `true` if an error with the given [errorCode] has been gathered.
   bool hasError(ErrorCode errorCode) {
@@ -394,8 +394,8 @@
 
   @override
   void logException(dynamic exception,
-      [StackTrace stackTrace,
-      List<InstrumentationServiceAttachment> attachments]) {
+      [StackTrace? stackTrace,
+      List<InstrumentationServiceAttachment>? attachments]) {
     log.add("error: $exception $stackTrace");
   }
 
@@ -418,7 +418,7 @@
   /// The number of times that the contents of this source have been requested.
   int readCount = 0;
 
-  TestSource([this._name = '/test.dart', this._contents]);
+  TestSource([this._name = '/test.dart', this._contents = '']);
 
   @override
   TimestampedData<String> get contents {
@@ -492,7 +492,7 @@
   @override
   final Uri uri;
 
-  TestSourceWithUri(String path, this.uri, [String content])
+  TestSourceWithUri(String path, this.uri, [String content = ''])
       : super(path, content);
 
   @override
@@ -500,9 +500,7 @@
 
   @override
   UriKind get uriKind {
-    if (uri == null) {
-      return UriKind.FILE_URI;
-    } else if (uri.scheme == 'dart') {
+    if (uri.scheme == 'dart') {
       return UriKind.DART_URI;
     } else if (uri.scheme == 'package') {
       return UriKind.PACKAGE_URI;
diff --git a/pkg/analyzer/test/generated/top_level_parser_test.dart b/pkg/analyzer/test/generated/top_level_parser_test.dart
index 140b38a..f61ec88 100644
--- a/pkg/analyzer/test/generated/top_level_parser_test.dart
+++ b/pkg/analyzer/test/generated/top_level_parser_test.dart
@@ -85,23 +85,23 @@
     ]);
 
     expect(member, isTopLevelVariableDeclaration);
-    TopLevelVariableDeclaration declaration = member;
+    var declaration = member as TopLevelVariableDeclaration;
     expect(declaration.semicolon, isNotNull);
     expect(declaration.variables, isNotNull);
 
     // Ensure type parsed as "Future<List<[empty name]>>".
     expect(declaration.variables.type, isNotNull);
-    expect(declaration.variables.type.question, isNull);
+    expect(declaration.variables.type!.question, isNull);
     expect(declaration.variables.type, TypeMatcher<TypeName>());
-    TypeName type = declaration.variables.type;
+    var type = declaration.variables.type as TypeName;
     expect(type.name.name, "Future");
-    expect(type.typeArguments.arguments.length, 1);
-    expect(type.typeArguments.arguments.single, TypeMatcher<TypeName>());
-    TypeName subType = type.typeArguments.arguments.single;
+    expect(type.typeArguments!.arguments.length, 1);
+    expect(type.typeArguments!.arguments.single, TypeMatcher<TypeName>());
+    var subType = type.typeArguments!.arguments.single as TypeName;
     expect(subType.name.name, "List");
-    expect(subType.typeArguments.arguments.length, 1);
-    expect(subType.typeArguments.arguments.single, TypeMatcher<TypeName>());
-    TypeName subSubType = subType.typeArguments.arguments.single;
+    expect(subType.typeArguments!.arguments.length, 1);
+    expect(subType.typeArguments!.arguments.single, TypeMatcher<TypeName>());
+    var subSubType = subType.typeArguments!.arguments.single as TypeName;
     expect(subSubType.name.name, "");
     expect(subSubType.typeArguments, isNull);
   }
@@ -112,7 +112,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isClassDeclaration);
-    ClassDeclaration declaration = member;
+    var declaration = member as ClassDeclaration;
     expect(declaration.documentationComment, isNull);
     expect(declaration.abstractKeyword, isNotNull);
     expect(declaration.extendsClause, isNull);
@@ -131,7 +131,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isClassDeclaration);
-    ClassDeclaration declaration = member;
+    var declaration = member as ClassDeclaration;
     expect(declaration.documentationComment, isNull);
     expect(declaration.abstractKeyword, isNull);
     expect(declaration.extendsClause, isNull);
@@ -151,7 +151,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isClassDeclaration);
-    ClassDeclaration declaration = member;
+    var declaration = member as ClassDeclaration;
     expect(declaration.documentationComment, isNull);
     expect(declaration.abstractKeyword, isNull);
     expect(declaration.extendsClause, isNotNull);
@@ -170,7 +170,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isClassDeclaration);
-    ClassDeclaration declaration = member;
+    var declaration = member as ClassDeclaration;
     expect(declaration.documentationComment, isNull);
     expect(declaration.abstractKeyword, isNull);
     expect(declaration.extendsClause, isNotNull);
@@ -189,7 +189,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isClassDeclaration);
-    ClassDeclaration declaration = member;
+    var declaration = member as ClassDeclaration;
     expect(declaration.documentationComment, isNull);
     expect(declaration.abstractKeyword, isNull);
     expect(declaration.classKeyword, isNotNull);
@@ -209,7 +209,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isClassDeclaration);
-    ClassDeclaration declaration = member;
+    var declaration = member as ClassDeclaration;
     expect(declaration.documentationComment, isNull);
     expect(declaration.abstractKeyword, isNull);
     expect(declaration.classKeyword, isNotNull);
@@ -229,7 +229,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isClassDeclaration);
-    ClassDeclaration declaration = member;
+    var declaration = member as ClassDeclaration;
     expect(declaration.documentationComment, isNull);
     expect(declaration.abstractKeyword, isNull);
     expect(declaration.extendsClause, isNull);
@@ -265,7 +265,7 @@
       expect(annotation.period, isNull);
       expect(annotation.constructorName, isNull);
       expect(annotation.arguments, isNotNull);
-      expect(annotation.arguments.arguments, hasLength(1));
+      expect(annotation.arguments!.arguments, hasLength(1));
     }
 
     {
@@ -276,7 +276,7 @@
       expect(annotation.period, isNull);
       expect(annotation.constructorName, isNull);
       expect(annotation.arguments, isNotNull);
-      expect(annotation.arguments.arguments, hasLength(1));
+      expect(annotation.arguments!.arguments, hasLength(1));
     }
 
     {
@@ -286,9 +286,9 @@
       expect(annotation.name.name, 'd.E');
       expect(annotation.period, isNotNull);
       expect(annotation.constructorName, isNotNull);
-      expect(annotation.constructorName.name, 'bar');
+      expect(annotation.constructorName!.name, 'bar');
       expect(annotation.arguments, isNotNull);
-      expect(annotation.arguments.arguments, hasLength(2));
+      expect(annotation.arguments!.arguments, hasLength(2));
     }
   }
 
@@ -304,13 +304,13 @@
       assertNoErrors();
     }
     expect(member, isClassDeclaration);
-    ClassDeclaration declaration = member;
-    NativeClause nativeClause = declaration.nativeClause;
+    var declaration = member as ClassDeclaration;
+    var nativeClause = declaration.nativeClause!;
     expect(nativeClause, isNotNull);
     expect(nativeClause.nativeKeyword, isNotNull);
-    expect(nativeClause.name.stringValue, "nativeValue");
+    expect(nativeClause.name!.stringValue, "nativeValue");
     expect(nativeClause.beginToken, same(nativeClause.nativeKeyword));
-    expect(nativeClause.endToken, same(nativeClause.name.endToken));
+    expect(nativeClause.endToken, same(nativeClause.name!.endToken));
   }
 
   void test_parseClassDeclaration_native_allowed() {
@@ -343,10 +343,10 @@
       ]);
     }
     expect(member, TypeMatcher<ClassDeclaration>());
-    ClassDeclaration declaration = member;
+    var declaration = member as ClassDeclaration;
     expect(declaration.nativeClause, isNotNull);
-    expect(declaration.nativeClause.nativeKeyword, isNotNull);
-    expect(declaration.nativeClause.name, isNull);
+    expect(declaration.nativeClause!.nativeKeyword, isNotNull);
+    expect(declaration.nativeClause!.name, isNull);
     expect(declaration.endToken.type, TokenType.CLOSE_CURLY_BRACKET);
   }
 
@@ -371,7 +371,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isClassDeclaration);
-    ClassDeclaration declaration = member;
+    var declaration = member as ClassDeclaration;
     expect(declaration.documentationComment, isNull);
     expect(declaration.abstractKeyword, isNull);
     expect(declaration.extendsClause, isNull);
@@ -390,15 +390,15 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isClassTypeAlias);
-    ClassTypeAlias typeAlias = member;
+    var typeAlias = member as ClassTypeAlias;
     expect(typeAlias.typedefKeyword, isNotNull);
     expect(typeAlias.name, isNotNull);
     _assertIsDeclarationName(typeAlias.name);
     expect(typeAlias.typeParameters, isNull);
     expect(typeAlias.withClause, isNotNull);
     expect(typeAlias.implementsClause, isNotNull);
-    expect(typeAlias.implementsClause.implementsKeyword, isNotNull);
-    expect(typeAlias.implementsClause.interfaces.length, 1);
+    expect(typeAlias.implementsClause!.implementsKeyword, isNotNull);
+    expect(typeAlias.implementsClause!.interfaces.length, 1);
     expect(typeAlias.semicolon, isNotNull);
   }
 
@@ -408,7 +408,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isClassTypeAlias);
-    ClassTypeAlias typeAlias = member;
+    var typeAlias = member as ClassTypeAlias;
     expect(typeAlias.typedefKeyword, isNotNull);
     expect(typeAlias.name, isNotNull);
     expect(typeAlias.typeParameters, isNull);
@@ -425,7 +425,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isClassDeclaration);
-    ClassDeclaration declaration = member;
+    var declaration = member as ClassDeclaration;
     expect(declaration.documentationComment, isNull);
     expect(declaration.abstractKeyword, isNull);
     expect(declaration.extendsClause, isNull);
@@ -437,8 +437,9 @@
     expect(declaration.members, hasLength(0));
     expect(declaration.rightBracket, isNotNull);
     expect(declaration.typeParameters, isNotNull);
-    expect(declaration.typeParameters.typeParameters, hasLength(1));
-    _assertIsDeclarationName(declaration.typeParameters.typeParameters[0].name);
+    expect(declaration.typeParameters!.typeParameters, hasLength(1));
+    _assertIsDeclarationName(
+        declaration.typeParameters!.typeParameters[0].name);
   }
 
   void test_parseClassDeclaration_typeParameters_extends_void() {
@@ -644,7 +645,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isTopLevelVariableDeclaration);
-    TopLevelVariableDeclaration declaration = member;
+    var declaration = member as TopLevelVariableDeclaration;
     expect(declaration.semicolon, isNotNull);
     expect(declaration.variables, isNotNull);
   }
@@ -655,7 +656,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isClassDeclaration);
-    ClassDeclaration declaration = member;
+    var declaration = member as ClassDeclaration;
     expect(declaration.name.name, "A");
     expect(declaration.members, hasLength(0));
   }
@@ -666,7 +667,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isClassTypeAlias);
-    ClassTypeAlias declaration = member;
+    var declaration = member as ClassTypeAlias;
     expect(declaration.name.name, "A");
     expect(declaration.abstractKeyword, isNotNull);
   }
@@ -677,10 +678,10 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isTopLevelVariableDeclaration);
-    TopLevelVariableDeclaration declaration = member;
+    var declaration = member as TopLevelVariableDeclaration;
     expect(declaration.semicolon, isNotNull);
     expect(declaration.variables, isNotNull);
-    expect(declaration.variables.keyword.lexeme, 'const');
+    expect(declaration.variables.keyword!.lexeme, 'const');
     _assertIsDeclarationName(declaration.variables.variables[0].name);
   }
 
@@ -689,7 +690,7 @@
     var f = parseFullCompilationUnitMember() as FunctionDeclaration;
     var body = f.functionExpression.body as ExpressionFunctionBody;
     expect(body.functionDefinition.lexeme, '=>');
-    expect(body.semicolon.lexeme, ';');
+    expect(body.semicolon!.lexeme, ';');
     _assertIsDeclarationName(f.name);
   }
 
@@ -699,10 +700,10 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isTopLevelVariableDeclaration);
-    TopLevelVariableDeclaration declaration = member;
+    var declaration = member as TopLevelVariableDeclaration;
     expect(declaration.semicolon, isNotNull);
     expect(declaration.variables, isNotNull);
-    expect(declaration.variables.keyword.lexeme, 'final');
+    expect(declaration.variables.keyword!.lexeme, 'final');
   }
 
   void test_parseCompilationUnitMember_function_external_noType() {
@@ -711,7 +712,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isFunctionDeclaration);
-    FunctionDeclaration declaration = member;
+    var declaration = member as FunctionDeclaration;
     expect(declaration.externalKeyword, isNotNull);
     expect(declaration.functionExpression, isNotNull);
     expect(declaration.propertyKeyword, isNull);
@@ -723,7 +724,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isFunctionDeclaration);
-    FunctionDeclaration declaration = member;
+    var declaration = member as FunctionDeclaration;
     expect(declaration.externalKeyword, isNotNull);
     expect(declaration.functionExpression, isNotNull);
     expect(declaration.propertyKeyword, isNull);
@@ -735,7 +736,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isFunctionDeclaration);
-    FunctionDeclaration declaration = member;
+    var declaration = member as FunctionDeclaration;
     expect(declaration.returnType, isNull);
     expect(declaration.functionExpression.typeParameters, isNotNull);
   }
@@ -747,7 +748,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isFunctionDeclaration);
-    FunctionDeclaration declaration = member;
+    var declaration = member as FunctionDeclaration;
     expect(declaration.returnType, isNull);
     expect(declaration.functionExpression.typeParameters, isNotNull);
   }
@@ -758,7 +759,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isFunctionDeclaration);
-    FunctionDeclaration declaration = member;
+    var declaration = member as FunctionDeclaration;
     expect(declaration.returnType, isNotNull);
     expect(declaration.functionExpression.typeParameters, isNotNull);
   }
@@ -769,7 +770,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isFunctionDeclaration);
-    FunctionDeclaration declaration = member;
+    var declaration = member as FunctionDeclaration;
     expect(declaration.functionExpression, isNotNull);
     expect(declaration.propertyKeyword, isNull);
   }
@@ -800,7 +801,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isFunctionDeclaration);
-    FunctionDeclaration declaration = member;
+    var declaration = member as FunctionDeclaration;
     expect(declaration.functionExpression, isNotNull);
     expect(declaration.propertyKeyword, isNull);
   }
@@ -811,7 +812,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isFunctionDeclaration);
-    FunctionDeclaration declaration = member;
+    var declaration = member as FunctionDeclaration;
     expect(declaration.functionExpression, isNotNull);
     expect(declaration.propertyKeyword, isNull);
   }
@@ -822,7 +823,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isFunctionDeclaration);
-    FunctionDeclaration declaration = member;
+    var declaration = member as FunctionDeclaration;
     expect(declaration.returnType, isNotNull);
   }
 
@@ -832,7 +833,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isFunctionDeclaration);
-    FunctionDeclaration declaration = member;
+    var declaration = member as FunctionDeclaration;
     expect(declaration.externalKeyword, isNotNull);
     expect(declaration.functionExpression, isNotNull);
     expect(declaration.propertyKeyword, isNotNull);
@@ -845,7 +846,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isFunctionDeclaration);
-    FunctionDeclaration declaration = member;
+    var declaration = member as FunctionDeclaration;
     expect(declaration.externalKeyword, isNotNull);
     expect(declaration.functionExpression, isNotNull);
     expect(declaration.propertyKeyword, isNotNull);
@@ -857,7 +858,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isFunctionDeclaration);
-    FunctionDeclaration declaration = member;
+    var declaration = member as FunctionDeclaration;
     expect(declaration.functionExpression, isNotNull);
     expect(declaration.propertyKeyword, isNotNull);
   }
@@ -868,7 +869,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isFunctionDeclaration);
-    FunctionDeclaration declaration = member;
+    var declaration = member as FunctionDeclaration;
     expect(declaration.functionExpression, isNotNull);
     expect(declaration.propertyKeyword, isNotNull);
   }
@@ -879,7 +880,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isFunctionDeclaration);
-    FunctionDeclaration declaration = member;
+    var declaration = member as FunctionDeclaration;
     expect(declaration.externalKeyword, isNotNull);
     expect(declaration.functionExpression, isNotNull);
     expect(declaration.propertyKeyword, isNotNull);
@@ -891,7 +892,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isFunctionDeclaration);
-    FunctionDeclaration declaration = member;
+    var declaration = member as FunctionDeclaration;
     expect(declaration.externalKeyword, isNotNull);
     expect(declaration.functionExpression, isNotNull);
     expect(declaration.propertyKeyword, isNotNull);
@@ -903,7 +904,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isFunctionDeclaration);
-    FunctionDeclaration declaration = member;
+    var declaration = member as FunctionDeclaration;
     expect(declaration.functionExpression, isNotNull);
     expect(declaration.propertyKeyword, isNotNull);
     _assertIsDeclarationName(declaration.name);
@@ -915,7 +916,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isFunctionDeclaration);
-    FunctionDeclaration declaration = member;
+    var declaration = member as FunctionDeclaration;
     expect(declaration.functionExpression, isNotNull);
     expect(declaration.propertyKeyword, isNotNull);
     expect(declaration.returnType, isNotNull);
@@ -927,7 +928,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isClassTypeAlias);
-    ClassTypeAlias typeAlias = member;
+    var typeAlias = member as ClassTypeAlias;
     expect(typeAlias.typedefKeyword, isNotNull);
     expect(typeAlias.name.name, "C");
     _assertIsDeclarationName(typeAlias.name);
@@ -946,10 +947,10 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isClassTypeAlias);
-    ClassTypeAlias typeAlias = member;
+    var typeAlias = member as ClassTypeAlias;
     expect(typeAlias.typedefKeyword, isNotNull);
     expect(typeAlias.name.name, "C");
-    expect(typeAlias.typeParameters.typeParameters, hasLength(1));
+    expect(typeAlias.typeParameters!.typeParameters, hasLength(1));
     expect(typeAlias.equals, isNotNull);
     expect(typeAlias.abstractKeyword, isNull);
     expect(typeAlias.superclass.name.name, "S");
@@ -964,7 +965,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isClassTypeAlias);
-    ClassTypeAlias typeAlias = member;
+    var typeAlias = member as ClassTypeAlias;
     expect(typeAlias.typedefKeyword, isNotNull);
     expect(typeAlias.name.name, "C");
     expect(typeAlias.typeParameters, isNull);
@@ -982,7 +983,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isClassTypeAlias);
-    ClassTypeAlias typeAlias = member;
+    var typeAlias = member as ClassTypeAlias;
     expect(typeAlias.typedefKeyword, isNotNull);
     expect(typeAlias.name.name, "C");
     expect(typeAlias.typeParameters, isNull);
@@ -1000,7 +1001,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, TypeMatcher<FunctionTypeAlias>());
-    FunctionTypeAlias typeAlias = member;
+    var typeAlias = member as FunctionTypeAlias;
     expect(typeAlias.name.name, "F");
     expect(typeAlias.parameters.parameters, hasLength(0));
     _assertIsDeclarationName(typeAlias.name);
@@ -1018,7 +1019,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isTopLevelVariableDeclaration);
-    TopLevelVariableDeclaration declaration = member;
+    var declaration = member as TopLevelVariableDeclaration;
     expect(declaration.semicolon, isNotNull);
     expect(declaration.variables, isNotNull);
     expect(declaration.variables.type, isNotNull);
@@ -1032,10 +1033,10 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isTopLevelVariableDeclaration);
-    TopLevelVariableDeclaration declaration = member;
+    var declaration = member as TopLevelVariableDeclaration;
     expect(declaration.semicolon, isNotNull);
     expect(declaration.variables, isNotNull);
-    expect(declaration.variables.keyword.lexeme, 'var');
+    expect(declaration.variables.keyword!.lexeme, 'var');
   }
 
   void test_parseCompilationUnitMember_variable_gftType_gftReturnType() {
@@ -1074,7 +1075,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isTopLevelVariableDeclaration);
-    TopLevelVariableDeclaration declaration = member;
+    var declaration = member as TopLevelVariableDeclaration;
     expect(declaration.semicolon, isNotNull);
     expect(declaration.variables, isNotNull);
   }
@@ -1085,7 +1086,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isTopLevelVariableDeclaration);
-    TopLevelVariableDeclaration declaration = member;
+    var declaration = member as TopLevelVariableDeclaration;
     expect(declaration.semicolon, isNotNull);
     expect(declaration.variables, isNotNull);
   }
@@ -1096,7 +1097,7 @@
     expect(directive, isNotNull);
     assertNoErrors();
     expect(directive, TypeMatcher<ExportDirective>());
-    ExportDirective exportDirective = directive;
+    var exportDirective = directive as ExportDirective;
     expect(exportDirective.keyword, isNotNull);
     expect(exportDirective.uri, isNotNull);
     expect(exportDirective.combinators, hasLength(0));
@@ -1115,7 +1116,7 @@
     expect(directive, isNotNull);
     assertNoErrors();
     expect(directive, TypeMatcher<ImportDirective>());
-    ImportDirective importDirective = directive;
+    var importDirective = directive as ImportDirective;
     expect(importDirective.keyword, isNotNull);
     expect(importDirective.uri, isNotNull);
     expect(importDirective.asKeyword, isNull);
@@ -1130,7 +1131,7 @@
     expect(directive, isNotNull);
     assertNoErrors();
     expect(directive, TypeMatcher<LibraryDirective>());
-    LibraryDirective libraryDirective = directive;
+    var libraryDirective = directive as LibraryDirective;
     expect(libraryDirective.libraryKeyword, isNotNull);
     expect(libraryDirective.name, isNotNull);
     expect(libraryDirective.semicolon, isNotNull);
@@ -1166,7 +1167,7 @@
     expect(directive, isNotNull);
     assertNoErrors();
     expect(directive, TypeMatcher<LibraryDirective>());
-    LibraryDirective libraryDirective = directive;
+    var libraryDirective = directive as LibraryDirective;
     expect(libraryDirective.libraryKeyword, isNotNull);
     expect(libraryDirective.name, isNotNull);
     expect(libraryDirective.semicolon, isNotNull);
@@ -1181,7 +1182,7 @@
     expect(directive, isNotNull);
     assertNoErrors();
     expect(directive, TypeMatcher<LibraryDirective>());
-    LibraryDirective libraryDirective = directive;
+    var libraryDirective = directive as LibraryDirective;
     expect(libraryDirective.libraryKeyword, isNotNull);
     expect(libraryDirective.name, isNotNull);
     expect(libraryDirective.semicolon, isNotNull);
@@ -1201,7 +1202,7 @@
     expect(directive, isNotNull);
     assertNoErrors();
     expect(directive, TypeMatcher<PartDirective>());
-    PartDirective partDirective = directive;
+    var partDirective = directive as PartDirective;
     expect(partDirective.partKeyword, isNotNull);
     expect(partDirective.uri, isNotNull);
     expect(partDirective.semicolon, isNotNull);
@@ -1210,25 +1211,25 @@
   void test_parseDirective_part_of_1_component() {
     createParser("part of a;");
     var partOf = parseFullDirective() as PartOfDirective;
-    expect(partOf.libraryName.components, hasLength(1));
-    expect(partOf.libraryName.components[0].name, 'a');
+    expect(partOf.libraryName!.components, hasLength(1));
+    expect(partOf.libraryName!.components[0].name, 'a');
   }
 
   void test_parseDirective_part_of_2_components() {
     createParser("part of a.b;");
     var partOf = parseFullDirective() as PartOfDirective;
-    expect(partOf.libraryName.components, hasLength(2));
-    expect(partOf.libraryName.components[0].name, 'a');
-    expect(partOf.libraryName.components[1].name, 'b');
+    expect(partOf.libraryName!.components, hasLength(2));
+    expect(partOf.libraryName!.components[0].name, 'a');
+    expect(partOf.libraryName!.components[1].name, 'b');
   }
 
   void test_parseDirective_part_of_3_components() {
     createParser("part of a.b.c;");
     var partOf = parseFullDirective() as PartOfDirective;
-    expect(partOf.libraryName.components, hasLength(3));
-    expect(partOf.libraryName.components[0].name, 'a');
-    expect(partOf.libraryName.components[1].name, 'b');
-    expect(partOf.libraryName.components[2].name, 'c');
+    expect(partOf.libraryName!.components, hasLength(3));
+    expect(partOf.libraryName!.components[0].name, 'a');
+    expect(partOf.libraryName!.components[1].name, 'b');
+    expect(partOf.libraryName!.components[2].name, 'c');
   }
 
   void test_parseDirective_part_of_withDocumentationComment() {
@@ -1249,7 +1250,7 @@
     expect(directive, isNotNull);
     assertNoErrors();
     expect(directive, TypeMatcher<PartOfDirective>());
-    PartOfDirective partOfDirective = directive;
+    var partOfDirective = directive as PartOfDirective;
     expect(partOfDirective.partKeyword, isNotNull);
     expect(partOfDirective.ofKeyword, isNotNull);
     expect(partOfDirective.libraryName, isNotNull);
@@ -1310,7 +1311,7 @@
 
   void test_parseEnumDeclaration_one() {
     createParser("enum E {ONE}");
-    EnumDeclaration declaration = parseFullCompilationUnitMember();
+    var declaration = parseFullCompilationUnitMember() as EnumDeclaration;
     expect(declaration, isNotNull);
     assertNoErrors();
     expect(declaration.documentationComment, isNull);
@@ -1323,7 +1324,7 @@
 
   void test_parseEnumDeclaration_trailingComma() {
     createParser("enum E {ONE,}");
-    EnumDeclaration declaration = parseFullCompilationUnitMember();
+    var declaration = parseFullCompilationUnitMember() as EnumDeclaration;
     expect(declaration, isNotNull);
     assertNoErrors();
     expect(declaration.documentationComment, isNull);
@@ -1336,7 +1337,7 @@
 
   void test_parseEnumDeclaration_two() {
     createParser("enum E {ONE, TWO}");
-    EnumDeclaration declaration = parseFullCompilationUnitMember();
+    var declaration = parseFullCompilationUnitMember() as EnumDeclaration;
     expect(declaration, isNotNull);
     assertNoErrors();
     expect(declaration.documentationComment, isNull);
@@ -1380,7 +1381,7 @@
 
   void test_parseExportDirective_configuration_multiple() {
     createParser("export 'lib/lib.dart' if (a) 'b.dart' if (c) 'd.dart';");
-    ExportDirective directive = parseFullDirective();
+    var directive = parseFullDirective() as ExportDirective;
     expect(directive, isNotNull);
     assertNoErrors();
     expect(directive.keyword, isNotNull);
@@ -1394,7 +1395,7 @@
 
   void test_parseExportDirective_configuration_single() {
     createParser("export 'lib/lib.dart' if (a.b == 'c.dart') '';");
-    ExportDirective directive = parseFullDirective();
+    var directive = parseFullDirective() as ExportDirective;
     expect(directive, isNotNull);
     assertNoErrors();
     expect(directive.keyword, isNotNull);
@@ -1407,7 +1408,7 @@
 
   void test_parseExportDirective_hide() {
     createParser("export 'lib/lib.dart' hide A, B;");
-    ExportDirective directive = parseFullDirective();
+    var directive = parseFullDirective() as ExportDirective;
     expect(directive, isNotNull);
     assertNoErrors();
     expect(directive.keyword, isNotNull);
@@ -1418,7 +1419,7 @@
 
   void test_parseExportDirective_hide_show() {
     createParser("export 'lib/lib.dart' hide A show B;");
-    ExportDirective directive = parseFullDirective();
+    var directive = parseFullDirective() as ExportDirective;
     expect(directive, isNotNull);
     assertNoErrors();
     expect(directive.keyword, isNotNull);
@@ -1429,7 +1430,7 @@
 
   void test_parseExportDirective_noCombinator() {
     createParser("export 'lib/lib.dart';");
-    ExportDirective directive = parseFullDirective();
+    var directive = parseFullDirective() as ExportDirective;
     expect(directive, isNotNull);
     assertNoErrors();
     expect(directive.keyword, isNotNull);
@@ -1440,7 +1441,7 @@
 
   void test_parseExportDirective_show() {
     createParser("export 'lib/lib.dart' show A, B;");
-    ExportDirective directive = parseFullDirective();
+    var directive = parseFullDirective() as ExportDirective;
     expect(directive, isNotNull);
     assertNoErrors();
     expect(directive.keyword, isNotNull);
@@ -1451,7 +1452,7 @@
 
   void test_parseExportDirective_show_hide() {
     createParser("export 'lib/lib.dart' show B hide A;");
-    ExportDirective directive = parseFullDirective();
+    var directive = parseFullDirective() as ExportDirective;
     expect(directive, isNotNull);
     assertNoErrors();
     expect(directive.keyword, isNotNull);
@@ -1462,7 +1463,7 @@
 
   void test_parseFunctionDeclaration_function() {
     createParser('/// Doc\nT f() {}');
-    FunctionDeclaration declaration = parseFullCompilationUnitMember();
+    var declaration = parseFullCompilationUnitMember() as FunctionDeclaration;
     expect(declaration, isNotNull);
     assertNoErrors();
     expectCommentText(declaration.documentationComment, '/// Doc');
@@ -1478,7 +1479,7 @@
 
   void test_parseFunctionDeclaration_functionWithTypeParameters() {
     createParser('/// Doc\nT f<E>() {}');
-    FunctionDeclaration declaration = parseFullCompilationUnitMember();
+    var declaration = parseFullCompilationUnitMember() as FunctionDeclaration;
     expect(declaration, isNotNull);
     assertNoErrors();
     expectCommentText(declaration.documentationComment, '/// Doc');
@@ -1494,7 +1495,7 @@
 
   void test_parseFunctionDeclaration_getter() {
     createParser('/// Doc\nT get p => 0;');
-    FunctionDeclaration declaration = parseFullCompilationUnitMember();
+    var declaration = parseFullCompilationUnitMember() as FunctionDeclaration;
     expect(declaration, isNotNull);
     assertNoErrors();
     expectCommentText(declaration.documentationComment, '/// Doc');
@@ -1511,7 +1512,7 @@
   void test_parseFunctionDeclaration_metadata() {
     createParser(
         'T f(@A a, @B(2) Foo b, {@C.foo(3) c : 0, @d.E.bar(4, 5) x:0}) {}');
-    FunctionDeclaration declaration = parseFullCompilationUnitMember();
+    var declaration = parseFullCompilationUnitMember() as FunctionDeclaration;
     expect(declaration, isNotNull);
     assertNoErrors();
     expect(declaration.documentationComment, isNull);
@@ -1521,7 +1522,7 @@
     expect(expression, isNotNull);
     expect(expression.body, isNotNull);
     expect(expression.typeParameters, isNull);
-    NodeList<FormalParameter> parameters = expression.parameters.parameters;
+    NodeList<FormalParameter> parameters = expression.parameters!.parameters;
     expect(parameters, hasLength(4));
     expect(declaration.propertyKeyword, isNull);
 
@@ -1543,7 +1544,7 @@
       expect(annotation.period, isNull);
       expect(annotation.constructorName, isNull);
       expect(annotation.arguments, isNotNull);
-      expect(annotation.arguments.arguments, hasLength(1));
+      expect(annotation.arguments!.arguments, hasLength(1));
     }
 
     {
@@ -1554,7 +1555,7 @@
       expect(annotation.period, isNull);
       expect(annotation.constructorName, isNull);
       expect(annotation.arguments, isNotNull);
-      expect(annotation.arguments.arguments, hasLength(1));
+      expect(annotation.arguments!.arguments, hasLength(1));
     }
 
     {
@@ -1564,15 +1565,15 @@
       expect(annotation.name.name, 'd.E');
       expect(annotation.period, isNotNull);
       expect(annotation.constructorName, isNotNull);
-      expect(annotation.constructorName.name, 'bar');
+      expect(annotation.constructorName!.name, 'bar');
       expect(annotation.arguments, isNotNull);
-      expect(annotation.arguments.arguments, hasLength(2));
+      expect(annotation.arguments!.arguments, hasLength(2));
     }
   }
 
   void test_parseFunctionDeclaration_setter() {
     createParser('/// Doc\nT set p(v) {}');
-    FunctionDeclaration declaration = parseFullCompilationUnitMember();
+    var declaration = parseFullCompilationUnitMember() as FunctionDeclaration;
     expect(declaration, isNotNull);
     assertNoErrors();
     expectCommentText(declaration.documentationComment, '/// Doc');
@@ -1588,7 +1589,7 @@
 
   void test_parseGenericTypeAlias_noTypeParameters() {
     createParser('typedef F = int Function(int);');
-    GenericTypeAlias alias = parseFullCompilationUnitMember();
+    var alias = parseFullCompilationUnitMember() as GenericTypeAlias;
     expect(alias, isNotNull);
     assertNoErrors();
     expect(alias.name, isNotNull);
@@ -1601,12 +1602,12 @@
 
   void test_parseGenericTypeAlias_typeParameters() {
     createParser('typedef F<T> = T Function(T);');
-    GenericTypeAlias alias = parseFullCompilationUnitMember();
+    var alias = parseFullCompilationUnitMember() as GenericTypeAlias;
     expect(alias, isNotNull);
     assertNoErrors();
     expect(alias.name, isNotNull);
     expect(alias.name.name, 'F');
-    expect(alias.typeParameters.typeParameters, hasLength(1));
+    expect(alias.typeParameters!.typeParameters, hasLength(1));
     expect(alias.equals, isNotNull);
     expect(alias.functionType, isNotNull);
     expect(alias.semicolon, isNotNull);
@@ -1616,12 +1617,12 @@
     // The scanner creates a single token for `>=`
     // then the parser must split it into two separate tokens.
     createParser('typedef F<T>= T Function(T);');
-    GenericTypeAlias alias = parseFullCompilationUnitMember();
+    var alias = parseFullCompilationUnitMember() as GenericTypeAlias;
     expect(alias, isNotNull);
     assertNoErrors();
     expect(alias.name, isNotNull);
     expect(alias.name.name, 'F');
-    expect(alias.typeParameters.typeParameters, hasLength(1));
+    expect(alias.typeParameters!.typeParameters, hasLength(1));
     expect(alias.equals, isNotNull);
     expect(alias.functionType, isNotNull);
     expect(alias.semicolon, isNotNull);
@@ -1629,12 +1630,12 @@
 
   void test_parseGenericTypeAlias_typeParameters3() {
     createParser('typedef F<A,B,C> = Function(A a, B b, C c);');
-    GenericTypeAlias alias = parseFullCompilationUnitMember();
+    var alias = parseFullCompilationUnitMember() as GenericTypeAlias;
     expect(alias, isNotNull);
     assertNoErrors();
     expect(alias.name, isNotNull);
     expect(alias.name.name, 'F');
-    expect(alias.typeParameters.typeParameters, hasLength(3));
+    expect(alias.typeParameters!.typeParameters, hasLength(3));
     expect(alias.equals, isNotNull);
     expect(alias.functionType, isNotNull);
     expect(alias.semicolon, isNotNull);
@@ -1644,12 +1645,12 @@
     // The scanner creates a single token for `>=`
     // then the parser must split it into two separate tokens.
     createParser('typedef F<A,B,C>=Function(A a, B b, C c);');
-    GenericTypeAlias alias = parseFullCompilationUnitMember();
+    var alias = parseFullCompilationUnitMember() as GenericTypeAlias;
     expect(alias, isNotNull);
     assertNoErrors();
     expect(alias.name, isNotNull);
     expect(alias.name.name, 'F');
-    expect(alias.typeParameters.typeParameters, hasLength(3));
+    expect(alias.typeParameters!.typeParameters, hasLength(3));
     expect(alias.equals, isNotNull);
     expect(alias.functionType, isNotNull);
     expect(alias.semicolon, isNotNull);
@@ -1657,15 +1658,15 @@
 
   void test_parseGenericTypeAlias_typeParameters_extends() {
     createParser('typedef F<A,B,C extends D<E>> = Function(A a, B b, C c);');
-    GenericTypeAlias alias = parseFullCompilationUnitMember();
+    var alias = parseFullCompilationUnitMember() as GenericTypeAlias;
     expect(alias, isNotNull);
     assertNoErrors();
     expect(alias.name, isNotNull);
     expect(alias.name.name, 'F');
-    expect(alias.typeParameters.typeParameters, hasLength(3));
-    TypeParameter typeParam = alias.typeParameters.typeParameters[2];
-    NamedType type = typeParam.bound;
-    expect(type.typeArguments.arguments, hasLength(1));
+    expect(alias.typeParameters!.typeParameters, hasLength(3));
+    TypeParameter typeParam = alias.typeParameters!.typeParameters[2];
+    var type = typeParam.bound as NamedType;
+    expect(type.typeArguments!.arguments, hasLength(1));
     expect(alias.equals, isNotNull);
     expect(alias.functionType, isNotNull);
     expect(alias.semicolon, isNotNull);
@@ -1674,15 +1675,15 @@
   void test_parseGenericTypeAlias_typeParameters_extends3() {
     createParser(
         'typedef F<A,B,C extends D<E,G,H>> = Function(A a, B b, C c);');
-    GenericTypeAlias alias = parseFullCompilationUnitMember();
+    var alias = parseFullCompilationUnitMember() as GenericTypeAlias;
     expect(alias, isNotNull);
     assertNoErrors();
     expect(alias.name, isNotNull);
     expect(alias.name.name, 'F');
-    expect(alias.typeParameters.typeParameters, hasLength(3));
-    TypeParameter typeParam = alias.typeParameters.typeParameters[2];
-    NamedType type = typeParam.bound;
-    expect(type.typeArguments.arguments, hasLength(3));
+    expect(alias.typeParameters!.typeParameters, hasLength(3));
+    TypeParameter typeParam = alias.typeParameters!.typeParameters[2];
+    var type = typeParam.bound as NamedType;
+    expect(type.typeArguments!.arguments, hasLength(3));
     expect(alias.equals, isNotNull);
     expect(alias.functionType, isNotNull);
     expect(alias.semicolon, isNotNull);
@@ -1692,15 +1693,15 @@
     // The scanner creates a single token for `>>=`
     // then the parser must split it into three separate tokens.
     createParser('typedef F<A,B,C extends D<E,G,H>>=Function(A a, B b, C c);');
-    GenericTypeAlias alias = parseFullCompilationUnitMember();
+    var alias = parseFullCompilationUnitMember() as GenericTypeAlias;
     expect(alias, isNotNull);
     assertNoErrors();
     expect(alias.name, isNotNull);
     expect(alias.name.name, 'F');
-    expect(alias.typeParameters.typeParameters, hasLength(3));
-    TypeParameter typeParam = alias.typeParameters.typeParameters[2];
-    NamedType type = typeParam.bound;
-    expect(type.typeArguments.arguments, hasLength(3));
+    expect(alias.typeParameters!.typeParameters, hasLength(3));
+    TypeParameter typeParam = alias.typeParameters!.typeParameters[2];
+    var type = typeParam.bound as NamedType;
+    expect(type.typeArguments!.arguments, hasLength(3));
     expect(alias.equals, isNotNull);
     expect(alias.functionType, isNotNull);
     expect(alias.semicolon, isNotNull);
@@ -1710,15 +1711,15 @@
     // The scanner creates a single token for `>>=`
     // then the parser must split it into three separate tokens.
     createParser('typedef F<A,B,C extends D<E>>=Function(A a, B b, C c);');
-    GenericTypeAlias alias = parseFullCompilationUnitMember();
+    var alias = parseFullCompilationUnitMember() as GenericTypeAlias;
     expect(alias, isNotNull);
     assertNoErrors();
     expect(alias.name, isNotNull);
     expect(alias.name.name, 'F');
-    expect(alias.typeParameters.typeParameters, hasLength(3));
-    TypeParameter typeParam = alias.typeParameters.typeParameters[2];
-    NamedType type = typeParam.bound;
-    expect(type.typeArguments.arguments, hasLength(1));
+    expect(alias.typeParameters!.typeParameters, hasLength(3));
+    TypeParameter typeParam = alias.typeParameters!.typeParameters[2];
+    var type = typeParam.bound as NamedType;
+    expect(type.typeArguments!.arguments, hasLength(1));
     expect(alias.equals, isNotNull);
     expect(alias.functionType, isNotNull);
     expect(alias.semicolon, isNotNull);
@@ -1726,7 +1727,7 @@
 
   void test_parseImportDirective_configuration_multiple() {
     createParser("import 'lib/lib.dart' if (a) 'b.dart' if (c) 'd.dart';");
-    ImportDirective directive = parseFullDirective();
+    var directive = parseFullDirective() as ImportDirective;
     expect(directive, isNotNull);
     assertNoErrors();
     expect(directive.keyword, isNotNull);
@@ -1743,7 +1744,7 @@
 
   void test_parseImportDirective_configuration_single() {
     createParser("import 'lib/lib.dart' if (a.b == 'c.dart') '';");
-    ImportDirective directive = parseFullDirective();
+    var directive = parseFullDirective() as ImportDirective;
     expect(directive, isNotNull);
     assertNoErrors();
     expect(directive.keyword, isNotNull);
@@ -1759,7 +1760,7 @@
 
   void test_parseImportDirective_deferred() {
     createParser("import 'lib/lib.dart' deferred as a;");
-    ImportDirective directive = parseFullDirective();
+    var directive = parseFullDirective() as ImportDirective;
     expect(directive, isNotNull);
     assertNoErrors();
     expect(directive.keyword, isNotNull);
@@ -1773,7 +1774,7 @@
 
   void test_parseImportDirective_hide() {
     createParser("import 'lib/lib.dart' hide A, B;");
-    ImportDirective directive = parseFullDirective();
+    var directive = parseFullDirective() as ImportDirective;
     expect(directive, isNotNull);
     assertNoErrors();
     expect(directive.keyword, isNotNull);
@@ -1787,7 +1788,7 @@
 
   void test_parseImportDirective_noCombinator() {
     createParser("import 'lib/lib.dart';");
-    ImportDirective directive = parseFullDirective();
+    var directive = parseFullDirective() as ImportDirective;
     expect(directive, isNotNull);
     assertNoErrors();
     expect(directive.keyword, isNotNull);
@@ -1801,7 +1802,7 @@
 
   void test_parseImportDirective_prefix() {
     createParser("import 'lib/lib.dart' as a;");
-    ImportDirective directive = parseFullDirective();
+    var directive = parseFullDirective() as ImportDirective;
     expect(directive, isNotNull);
     assertNoErrors();
     expect(directive.keyword, isNotNull);
@@ -1815,7 +1816,7 @@
 
   void test_parseImportDirective_prefix_hide_show() {
     createParser("import 'lib/lib.dart' as a hide A show B;");
-    ImportDirective directive = parseFullDirective();
+    var directive = parseFullDirective() as ImportDirective;
     expect(directive, isNotNull);
     assertNoErrors();
     expect(directive.keyword, isNotNull);
@@ -1829,7 +1830,7 @@
 
   void test_parseImportDirective_prefix_show_hide() {
     createParser("import 'lib/lib.dart' as a show B hide A;");
-    ImportDirective directive = parseFullDirective();
+    var directive = parseFullDirective() as ImportDirective;
     expect(directive, isNotNull);
     assertNoErrors();
     expect(directive.keyword, isNotNull);
@@ -1843,7 +1844,7 @@
 
   void test_parseImportDirective_show() {
     createParser("import 'lib/lib.dart' show A, B;");
-    ImportDirective directive = parseFullDirective();
+    var directive = parseFullDirective() as ImportDirective;
     expect(directive, isNotNull);
     assertNoErrors();
     expect(directive.keyword, isNotNull);
@@ -1857,7 +1858,7 @@
 
   void test_parseLibraryDirective() {
     createParser('library l;');
-    LibraryDirective directive = parseFullDirective();
+    var directive = parseFullDirective() as LibraryDirective;
     expect(directive, isNotNull);
     assertNoErrors();
     expect(directive.libraryKeyword, isNotNull);
@@ -1867,7 +1868,7 @@
 
   void test_parseMixinDeclaration_empty() {
     createParser('mixin A {}');
-    MixinDeclaration declaration = parseFullCompilationUnitMember();
+    var declaration = parseFullCompilationUnitMember() as MixinDeclaration;
     expect(declaration, isNotNull);
     assertNoErrors();
     expect(declaration.metadata, isEmpty);
@@ -1884,13 +1885,13 @@
 
   void test_parseMixinDeclaration_implements() {
     createParser('mixin A implements B {}');
-    MixinDeclaration declaration = parseFullCompilationUnitMember();
+    var declaration = parseFullCompilationUnitMember() as MixinDeclaration;
     expect(declaration, isNotNull);
     assertNoErrors();
     expect(declaration.metadata, isEmpty);
     expect(declaration.documentationComment, isNull);
     expect(declaration.onClause, isNull);
-    ImplementsClause implementsClause = declaration.implementsClause;
+    var implementsClause = declaration.implementsClause!;
     expect(implementsClause.implementsKeyword, isNotNull);
     NodeList<TypeName> interfaces = implementsClause.interfaces;
     expect(interfaces, hasLength(1));
@@ -1906,18 +1907,18 @@
 
   void test_parseMixinDeclaration_implements2() {
     createParser('mixin A implements B<T>, C {}');
-    MixinDeclaration declaration = parseFullCompilationUnitMember();
+    var declaration = parseFullCompilationUnitMember() as MixinDeclaration;
     expect(declaration, isNotNull);
     assertNoErrors();
     expect(declaration.metadata, isEmpty);
     expect(declaration.documentationComment, isNull);
     expect(declaration.onClause, isNull);
-    ImplementsClause implementsClause = declaration.implementsClause;
+    var implementsClause = declaration.implementsClause!;
     expect(implementsClause.implementsKeyword, isNotNull);
     NodeList<TypeName> interfaces = implementsClause.interfaces;
     expect(interfaces, hasLength(2));
     expect(interfaces[0].name.name, 'B');
-    expect(interfaces[0].typeArguments.arguments, hasLength(1));
+    expect(interfaces[0].typeArguments!.arguments, hasLength(1));
     expect(interfaces[1].name.name, 'C');
     expect(interfaces[1].typeArguments, isNull);
     expect(declaration.mixinKeyword, isNotNull);
@@ -1930,7 +1931,7 @@
 
   void test_parseMixinDeclaration_metadata() {
     createParser('@Z mixin A {}');
-    MixinDeclaration declaration = parseFullCompilationUnitMember();
+    var declaration = parseFullCompilationUnitMember() as MixinDeclaration;
     expect(declaration, isNotNull);
     assertNoErrors();
     NodeList<Annotation> metadata = declaration.metadata;
@@ -1949,12 +1950,12 @@
 
   void test_parseMixinDeclaration_on() {
     createParser('mixin A on B {}');
-    MixinDeclaration declaration = parseFullCompilationUnitMember();
+    var declaration = parseFullCompilationUnitMember() as MixinDeclaration;
     expect(declaration, isNotNull);
     assertNoErrors();
     expect(declaration.metadata, isEmpty);
     expect(declaration.documentationComment, isNull);
-    OnClause onClause = declaration.onClause;
+    var onClause = declaration.onClause!;
     expect(onClause.onKeyword, isNotNull);
     NodeList<TypeName> constraints = onClause.superclassConstraints;
     expect(constraints, hasLength(1));
@@ -1971,19 +1972,19 @@
 
   void test_parseMixinDeclaration_on2() {
     createParser('mixin A on B, C<T> {}');
-    MixinDeclaration declaration = parseFullCompilationUnitMember();
+    var declaration = parseFullCompilationUnitMember() as MixinDeclaration;
     expect(declaration, isNotNull);
     assertNoErrors();
     expect(declaration.metadata, isEmpty);
     expect(declaration.documentationComment, isNull);
-    OnClause onClause = declaration.onClause;
+    var onClause = declaration.onClause!;
     expect(onClause.onKeyword, isNotNull);
     NodeList<TypeName> constraints = onClause.superclassConstraints;
     expect(constraints, hasLength(2));
     expect(constraints[0].name.name, 'B');
     expect(constraints[0].typeArguments, isNull);
     expect(constraints[1].name.name, 'C');
-    expect(constraints[1].typeArguments.arguments, hasLength(1));
+    expect(constraints[1].typeArguments!.arguments, hasLength(1));
     expect(declaration.implementsClause, isNull);
     expect(declaration.mixinKeyword, isNotNull);
     expect(declaration.leftBracket, isNotNull);
@@ -1995,18 +1996,18 @@
 
   void test_parseMixinDeclaration_onAndImplements() {
     createParser('mixin A on B implements C {}');
-    MixinDeclaration declaration = parseFullCompilationUnitMember();
+    var declaration = parseFullCompilationUnitMember() as MixinDeclaration;
     expect(declaration, isNotNull);
     assertNoErrors();
     expect(declaration.metadata, isEmpty);
     expect(declaration.documentationComment, isNull);
-    OnClause onClause = declaration.onClause;
+    var onClause = declaration.onClause!;
     expect(onClause.onKeyword, isNotNull);
     NodeList<TypeName> constraints = onClause.superclassConstraints;
     expect(constraints, hasLength(1));
     expect(constraints[0].name.name, 'B');
     expect(constraints[0].typeArguments, isNull);
-    ImplementsClause implementsClause = declaration.implementsClause;
+    var implementsClause = declaration.implementsClause!;
     expect(implementsClause.implementsKeyword, isNotNull);
     NodeList<TypeName> interfaces = implementsClause.interfaces;
     expect(interfaces, hasLength(1));
@@ -2028,7 +2029,7 @@
   set s(int v) {f = v;}
   int add(int v) => f = f + v;
 }''');
-    MixinDeclaration declaration = parseFullCompilationUnitMember();
+    var declaration = parseFullCompilationUnitMember() as MixinDeclaration;
     expect(declaration, isNotNull);
     assertNoErrors();
     expect(declaration.metadata, isEmpty);
@@ -2045,13 +2046,13 @@
 
   void test_parseMixinDeclaration_withDocumentationComment() {
     createParser('/// Doc\nmixin M {}');
-    MixinDeclaration declaration = parseFullCompilationUnitMember();
+    var declaration = parseFullCompilationUnitMember() as MixinDeclaration;
     expectCommentText(declaration.documentationComment, '/// Doc');
   }
 
   void test_parsePartDirective() {
     createParser("part 'lib/lib.dart';");
-    PartDirective directive = parseFullDirective();
+    var directive = parseFullDirective() as PartDirective;
     expect(directive, isNotNull);
     assertNoErrors();
     expect(directive.partKeyword, isNotNull);
@@ -2062,7 +2063,7 @@
   void test_parsePartOfDirective_name() {
     enableUriInPartOf = true;
     createParser("part of l;");
-    PartOfDirective directive = parseFullDirective();
+    var directive = parseFullDirective() as PartOfDirective;
     expect(directive.partKeyword, isNotNull);
     expect(directive.ofKeyword, isNotNull);
     expect(directive.libraryName, isNotNull);
@@ -2073,7 +2074,7 @@
   void test_parsePartOfDirective_uri() {
     enableUriInPartOf = true;
     createParser("part of 'lib.dart';");
-    PartOfDirective directive = parseFullDirective();
+    var directive = parseFullDirective() as PartOfDirective;
     expect(directive.partKeyword, isNotNull);
     expect(directive.ofKeyword, isNotNull);
     expect(directive.libraryName, isNull);
@@ -2113,7 +2114,7 @@
         errors: [expectedError(ParserErrorCode.MODIFIER_OUT_OF_ORDER, 6, 4)]);
     var declaration = unit.declarations[0] as TopLevelVariableDeclaration;
     var declarationList = declaration.variables;
-    expect(declarationList.keyword.lexeme, 'final');
+    expect(declarationList.keyword!.lexeme, 'final');
     expect(declarationList.type, isNull);
     expect(declarationList.variables, hasLength(1));
   }
@@ -2135,7 +2136,7 @@
     var unit = parseCompilationUnit('late final a;', featureSet: nonNullable);
     var declaration = unit.declarations[0] as TopLevelVariableDeclaration;
     var declarationList = declaration.variables;
-    expect(declarationList.keyword.lexeme, 'final');
+    expect(declarationList.keyword!.lexeme, 'final');
     expect(declarationList.type, isNull);
     expect(declarationList.variables, hasLength(1));
   }
@@ -2171,7 +2172,7 @@
 
   void test_parseTypeAlias_function_noParameters() {
     createParser('typedef bool F();');
-    FunctionTypeAlias typeAlias = parseFullCompilationUnitMember();
+    var typeAlias = parseFullCompilationUnitMember() as FunctionTypeAlias;
     expect(typeAlias, isNotNull);
     assertNoErrors();
     expect(typeAlias.typedefKeyword, isNotNull);
@@ -2184,7 +2185,7 @@
 
   void test_parseTypeAlias_function_noReturnType() {
     createParser('typedef F();');
-    FunctionTypeAlias typeAlias = parseFullCompilationUnitMember();
+    var typeAlias = parseFullCompilationUnitMember() as FunctionTypeAlias;
     expect(typeAlias, isNotNull);
     assertNoErrors();
     expect(typeAlias.typedefKeyword, isNotNull);
@@ -2197,7 +2198,7 @@
 
   void test_parseTypeAlias_function_parameterizedReturnType() {
     createParser('typedef A<B> F();');
-    FunctionTypeAlias typeAlias = parseFullCompilationUnitMember();
+    var typeAlias = parseFullCompilationUnitMember() as FunctionTypeAlias;
     expect(typeAlias, isNotNull);
     assertNoErrors();
     expect(typeAlias.typedefKeyword, isNotNull);
@@ -2210,7 +2211,7 @@
 
   void test_parseTypeAlias_function_parameters() {
     createParser('typedef bool F(Object value);');
-    FunctionTypeAlias typeAlias = parseFullCompilationUnitMember();
+    var typeAlias = parseFullCompilationUnitMember() as FunctionTypeAlias;
     expect(typeAlias, isNotNull);
     assertNoErrors();
     expect(typeAlias.typedefKeyword, isNotNull);
@@ -2223,7 +2224,7 @@
 
   void test_parseTypeAlias_function_typeParameters() {
     createParser('typedef bool F<E>();');
-    FunctionTypeAlias typeAlias = parseFullCompilationUnitMember();
+    var typeAlias = parseFullCompilationUnitMember() as FunctionTypeAlias;
     expect(typeAlias, isNotNull);
     assertNoErrors();
     expect(typeAlias.typedefKeyword, isNotNull);
@@ -2236,7 +2237,7 @@
 
   void test_parseTypeAlias_function_voidReturnType() {
     createParser('typedef void F();');
-    FunctionTypeAlias typeAlias = parseFullCompilationUnitMember();
+    var typeAlias = parseFullCompilationUnitMember() as FunctionTypeAlias;
     expect(typeAlias, isNotNull);
     assertNoErrors();
     expect(typeAlias.typedefKeyword, isNotNull);
@@ -2249,14 +2250,14 @@
 
   void test_parseTypeAlias_genericFunction_noParameters() {
     createParser('typedef F = bool Function();');
-    GenericTypeAlias typeAlias = parseFullCompilationUnitMember();
+    var typeAlias = parseFullCompilationUnitMember() as GenericTypeAlias;
     expect(typeAlias, isNotNull);
     assertNoErrors();
     expect(typeAlias.typedefKeyword, isNotNull);
     expect(typeAlias.name, isNotNull);
     expect(typeAlias.typeParameters, isNull);
     expect(typeAlias.semicolon, isNotNull);
-    GenericFunctionType functionType = typeAlias.functionType;
+    var functionType = typeAlias.functionType as GenericFunctionType;
     expect(functionType, isNotNull);
     expect(functionType.parameters, isNotNull);
     expect(functionType.returnType, isNotNull);
@@ -2265,14 +2266,14 @@
 
   void test_parseTypeAlias_genericFunction_noReturnType() {
     createParser('typedef F = Function();');
-    GenericTypeAlias typeAlias = parseFullCompilationUnitMember();
+    var typeAlias = parseFullCompilationUnitMember() as GenericTypeAlias;
     expect(typeAlias, isNotNull);
     assertNoErrors();
     expect(typeAlias.typedefKeyword, isNotNull);
     expect(typeAlias.name, isNotNull);
     expect(typeAlias.typeParameters, isNull);
     expect(typeAlias.semicolon, isNotNull);
-    GenericFunctionType functionType = typeAlias.functionType;
+    var functionType = typeAlias.functionType as GenericFunctionType;
     expect(functionType, isNotNull);
     expect(functionType.parameters, isNotNull);
     expect(functionType.returnType, isNull);
@@ -2281,14 +2282,14 @@
 
   void test_parseTypeAlias_genericFunction_parameterizedReturnType() {
     createParser('typedef F = A<B> Function();');
-    GenericTypeAlias typeAlias = parseFullCompilationUnitMember();
+    var typeAlias = parseFullCompilationUnitMember() as GenericTypeAlias;
     expect(typeAlias, isNotNull);
     assertNoErrors();
     expect(typeAlias.typedefKeyword, isNotNull);
     expect(typeAlias.name, isNotNull);
     expect(typeAlias.typeParameters, isNull);
     expect(typeAlias.semicolon, isNotNull);
-    GenericFunctionType functionType = typeAlias.functionType;
+    var functionType = typeAlias.functionType as GenericFunctionType;
     expect(functionType, isNotNull);
     expect(functionType.parameters, isNotNull);
     expect(functionType.returnType, isNotNull);
@@ -2297,14 +2298,14 @@
 
   void test_parseTypeAlias_genericFunction_parameters() {
     createParser('typedef F = bool Function(Object value);');
-    GenericTypeAlias typeAlias = parseFullCompilationUnitMember();
+    var typeAlias = parseFullCompilationUnitMember() as GenericTypeAlias;
     expect(typeAlias, isNotNull);
     assertNoErrors();
     expect(typeAlias.typedefKeyword, isNotNull);
     expect(typeAlias.name, isNotNull);
     expect(typeAlias.typeParameters, isNull);
     expect(typeAlias.semicolon, isNotNull);
-    GenericFunctionType functionType = typeAlias.functionType;
+    var functionType = typeAlias.functionType as GenericFunctionType;
     expect(functionType, isNotNull);
     expect(functionType.parameters, isNotNull);
     expect(functionType.returnType, isNotNull);
@@ -2313,14 +2314,14 @@
 
   void test_parseTypeAlias_genericFunction_typeParameters() {
     createParser('typedef F = bool Function<E>();');
-    GenericTypeAlias typeAlias = parseFullCompilationUnitMember();
+    var typeAlias = parseFullCompilationUnitMember() as GenericTypeAlias;
     expect(typeAlias, isNotNull);
     assertNoErrors();
     expect(typeAlias.typedefKeyword, isNotNull);
     expect(typeAlias.name, isNotNull);
     expect(typeAlias.typeParameters, isNull);
     expect(typeAlias.semicolon, isNotNull);
-    GenericFunctionType functionType = typeAlias.functionType;
+    var functionType = typeAlias.functionType as GenericFunctionType;
     expect(functionType, isNotNull);
     expect(functionType.parameters, isNotNull);
     expect(functionType.returnType, isNotNull);
@@ -2329,14 +2330,14 @@
 
   void test_parseTypeAlias_genericFunction_typeParameters_noParameters() {
     createParser('typedef F<T> = bool Function();');
-    GenericTypeAlias typeAlias = parseFullCompilationUnitMember();
+    var typeAlias = parseFullCompilationUnitMember() as GenericTypeAlias;
     expect(typeAlias, isNotNull);
     assertNoErrors();
     expect(typeAlias.typedefKeyword, isNotNull);
     expect(typeAlias.name, isNotNull);
     expect(typeAlias.typeParameters, isNotNull);
     expect(typeAlias.semicolon, isNotNull);
-    GenericFunctionType functionType = typeAlias.functionType;
+    var functionType = typeAlias.functionType as GenericFunctionType;
     expect(functionType, isNotNull);
     expect(functionType.parameters, isNotNull);
     expect(functionType.returnType, isNotNull);
@@ -2345,14 +2346,14 @@
 
   void test_parseTypeAlias_genericFunction_typeParameters_noReturnType() {
     createParser('typedef F<T> = Function();');
-    GenericTypeAlias typeAlias = parseFullCompilationUnitMember();
+    var typeAlias = parseFullCompilationUnitMember() as GenericTypeAlias;
     expect(typeAlias, isNotNull);
     assertNoErrors();
     expect(typeAlias.typedefKeyword, isNotNull);
     expect(typeAlias.name, isNotNull);
     expect(typeAlias.typeParameters, isNotNull);
     expect(typeAlias.semicolon, isNotNull);
-    GenericFunctionType functionType = typeAlias.functionType;
+    var functionType = typeAlias.functionType as GenericFunctionType;
     expect(functionType, isNotNull);
     expect(functionType.parameters, isNotNull);
     expect(functionType.returnType, isNull);
@@ -2362,14 +2363,14 @@
   void
       test_parseTypeAlias_genericFunction_typeParameters_parameterizedReturnType() {
     createParser('typedef F<T> = A<B> Function();');
-    GenericTypeAlias typeAlias = parseFullCompilationUnitMember();
+    var typeAlias = parseFullCompilationUnitMember() as GenericTypeAlias;
     expect(typeAlias, isNotNull);
     assertNoErrors();
     expect(typeAlias.typedefKeyword, isNotNull);
     expect(typeAlias.name, isNotNull);
     expect(typeAlias.typeParameters, isNotNull);
     expect(typeAlias.semicolon, isNotNull);
-    GenericFunctionType functionType = typeAlias.functionType;
+    var functionType = typeAlias.functionType as GenericFunctionType;
     expect(functionType, isNotNull);
     expect(functionType.parameters, isNotNull);
     expect(functionType.returnType, isNotNull);
@@ -2378,14 +2379,14 @@
 
   void test_parseTypeAlias_genericFunction_typeParameters_parameters() {
     createParser('typedef F<T> = bool Function(Object value);');
-    GenericTypeAlias typeAlias = parseFullCompilationUnitMember();
+    var typeAlias = parseFullCompilationUnitMember() as GenericTypeAlias;
     expect(typeAlias, isNotNull);
     assertNoErrors();
     expect(typeAlias.typedefKeyword, isNotNull);
     expect(typeAlias.name, isNotNull);
     expect(typeAlias.typeParameters, isNotNull);
     expect(typeAlias.semicolon, isNotNull);
-    GenericFunctionType functionType = typeAlias.functionType;
+    var functionType = typeAlias.functionType as GenericFunctionType;
     expect(functionType, isNotNull);
     expect(functionType.parameters, isNotNull);
     expect(functionType.returnType, isNotNull);
@@ -2394,14 +2395,14 @@
 
   void test_parseTypeAlias_genericFunction_typeParameters_typeParameters() {
     createParser('typedef F<T> = bool Function<E>();');
-    GenericTypeAlias typeAlias = parseFullCompilationUnitMember();
+    var typeAlias = parseFullCompilationUnitMember() as GenericTypeAlias;
     expect(typeAlias, isNotNull);
     assertNoErrors();
     expect(typeAlias.typedefKeyword, isNotNull);
     expect(typeAlias.name, isNotNull);
     expect(typeAlias.typeParameters, isNotNull);
     expect(typeAlias.semicolon, isNotNull);
-    GenericFunctionType functionType = typeAlias.functionType;
+    var functionType = typeAlias.functionType as GenericFunctionType;
     expect(functionType, isNotNull);
     expect(functionType.parameters, isNotNull);
     expect(functionType.returnType, isNotNull);
@@ -2410,14 +2411,14 @@
 
   void test_parseTypeAlias_genericFunction_typeParameters_voidReturnType() {
     createParser('typedef F<T> = void Function();');
-    GenericTypeAlias typeAlias = parseFullCompilationUnitMember();
+    var typeAlias = parseFullCompilationUnitMember() as GenericTypeAlias;
     expect(typeAlias, isNotNull);
     assertNoErrors();
     expect(typeAlias.typedefKeyword, isNotNull);
     expect(typeAlias.name, isNotNull);
     expect(typeAlias.typeParameters, isNotNull);
     expect(typeAlias.semicolon, isNotNull);
-    GenericFunctionType functionType = typeAlias.functionType;
+    var functionType = typeAlias.functionType as GenericFunctionType;
     expect(functionType, isNotNull);
     expect(functionType.parameters, isNotNull);
     expect(functionType.returnType, isNotNull);
@@ -2426,14 +2427,14 @@
 
   void test_parseTypeAlias_genericFunction_voidReturnType() {
     createParser('typedef F = void Function();');
-    GenericTypeAlias typeAlias = parseFullCompilationUnitMember();
+    var typeAlias = parseFullCompilationUnitMember() as GenericTypeAlias;
     expect(typeAlias, isNotNull);
     assertNoErrors();
     expect(typeAlias.typedefKeyword, isNotNull);
     expect(typeAlias.name, isNotNull);
     expect(typeAlias.typeParameters, isNull);
     expect(typeAlias.semicolon, isNotNull);
-    GenericFunctionType functionType = typeAlias.functionType;
+    var functionType = typeAlias.functionType as GenericFunctionType;
     expect(functionType, isNotNull);
     expect(functionType.parameters, isNotNull);
     expect(functionType.returnType, isNotNull);
@@ -2453,7 +2454,7 @@
     B> {}
 ''');
     var classDeclaration = parseFullCompilationUnitMember() as ClassDeclaration;
-    var typeVariable = classDeclaration.typeParameters.typeParameters[0];
+    var typeVariable = classDeclaration.typeParameters!.typeParameters[0];
     expectCommentText(typeVariable.documentationComment, '/// Doc');
   }
 
diff --git a/pkg/analyzer/test/generated/type_system_test.dart b/pkg/analyzer/test/generated/type_system_test.dart
index 0d06335..146d36f 100644
--- a/pkg/analyzer/test/generated/type_system_test.dart
+++ b/pkg/analyzer/test/generated/type_system_test.dart
@@ -8,6 +8,7 @@
 import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -23,15 +24,15 @@
 }
 
 abstract class AbstractTypeSystemNullSafetyTest with ElementsTypesMixin {
-  TestAnalysisContext analysisContext;
+  late TestAnalysisContext analysisContext;
 
   @override
-  LibraryElementImpl testLibrary;
+  late LibraryElementImpl testLibrary;
 
   @override
-  TypeProvider typeProvider;
+  late TypeProviderImpl typeProvider;
 
-  TypeSystemImpl typeSystem;
+  late TypeSystemImpl typeSystem;
 
   FeatureSet get testFeatureSet {
     return FeatureSet.forTesting(
@@ -56,15 +57,15 @@
 }
 
 abstract class AbstractTypeSystemTest with ElementsTypesMixin {
-  TestAnalysisContext analysisContext;
+  late TestAnalysisContext analysisContext;
 
   @override
-  LibraryElementImpl testLibrary;
+  late LibraryElementImpl testLibrary;
 
   @override
-  TypeProvider typeProvider;
+  late TypeProvider typeProvider;
 
-  TypeSystemImpl typeSystem;
+  late TypeSystemImpl typeSystem;
 
   FeatureSet get testFeatureSet {
     return FeatureSet.forTesting();
@@ -390,7 +391,7 @@
   }
 
   void _checkGroups(DartType t1,
-      {List<DartType> interassignable, List<DartType> unrelated}) {
+      {List<DartType>? interassignable, List<DartType>? unrelated}) {
     if (interassignable != null) {
       for (DartType t2 in interassignable) {
         _checkEquivalent(t1, t2);
@@ -467,6 +468,10 @@
   }
 
   test_typeParameter() {
+    TypeParameterTypeImpl tryPromote(DartType to, TypeParameterTypeImpl from) {
+      return typeSystem.tryPromoteToType(to, from) as TypeParameterTypeImpl;
+    }
+
     void check(
       TypeParameterTypeImpl type,
       TypeParameterElement expectedElement,
@@ -479,10 +484,10 @@
     var T = typeParameter('T');
     var T0 = typeParameterTypeNone(T);
 
-    var T1 = typeSystem.tryPromoteToType(numNone, T0);
+    var T1 = tryPromote(numNone, T0);
     check(T1, T, numNone);
 
-    var T2 = typeSystem.tryPromoteToType(intNone, T1);
+    var T2 = tryPromote(intNone, T1);
     check(T2, T, intNone);
   }
 }
diff --git a/pkg/analyzer/test/generated/utilities_test.dart b/pkg/analyzer/test/generated/utilities_test.dart
index 9bf5576b..9f59914 100644
--- a/pkg/analyzer/test/generated/utilities_test.dart
+++ b/pkg/analyzer/test/generated/utilities_test.dart
@@ -16,6 +16,7 @@
 import 'package:analyzer/src/generated/parser.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/testing/ast_test_factory.dart';
+import 'package:analyzer/src/generated/testing/token_factory.dart';
 import 'package:analyzer/src/generated/utilities_collection.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -40,7 +41,7 @@
   AstCloneComparator(this.expectTokensCopied);
 
   @override
-  bool isEqualNodes(AstNode first, AstNode second) {
+  bool isEqualNodes(AstNode? first, AstNode? second) {
     if (first != null && identical(first, second)) {
       fail('Failed to copy node: $first (${first.offset})');
     }
@@ -48,14 +49,15 @@
   }
 
   @override
-  bool isEqualTokens(Token first, Token second) {
+  bool isEqualTokens(Token? first, Token? second) {
     if (expectTokensCopied && first != null && identical(first, second)) {
       fail('Failed to copy token: ${first.lexeme} (${first.offset})');
     }
-    if (first?.precedingComments != null) {
-      CommentToken comment = first.precedingComments;
-      if (comment.parent != first) {
-        fail('Failed to link the comment "$comment" with the token "$first".');
+    var firstComment = first?.precedingComments;
+    if (firstComment != null) {
+      if (firstComment.parent != first) {
+        fail(
+            'Failed to link the comment "$firstComment" with the token "$first".');
       }
     }
     return super.isEqualTokens(first, second);
@@ -1126,7 +1128,7 @@
   ///           given node
   void _assertClone(AstNode node) {
     {
-      AstNode clone = node.accept(AstCloner());
+      AstNode clone = node.accept(AstCloner())!;
       AstCloneComparator comparator = AstCloneComparator(false);
       if (!comparator.isEqualNodes(node, clone)) {
         fail("Failed to clone ${node.runtimeType.toString()}");
@@ -1134,7 +1136,7 @@
       _assertEqualTokens(clone, node);
     }
     {
-      AstNode clone = node.accept(AstCloner(true));
+      AstNode clone = node.accept(AstCloner(true))!;
       AstCloneComparator comparator = AstCloneComparator(true);
       if (!comparator.isEqualNodes(node, clone)) {
         fail("Failed to clone ${node.runtimeType.toString()}");
@@ -1166,7 +1168,7 @@
   Expression _parseExpression(String code) {
     CompilationUnit unit = _parseUnit('var v = $code;');
     var decl = unit.declarations.single as TopLevelVariableDeclaration;
-    return decl.variables.variables.single.initializer;
+    return decl.variables.variables.single.initializer!;
   }
 
   Statement _parseStatement(String code) {
@@ -1180,7 +1182,7 @@
     GatheringErrorListener listener = GatheringErrorListener();
     CharSequenceReader reader = CharSequenceReader(code);
     var featureSet = FeatureSet.forTesting(sdkVersion: '2.2.2');
-    Scanner scanner = Scanner(null, reader, listener)
+    Scanner scanner = Scanner(TestSource(), reader, listener)
       ..configureFeatures(
         featureSetForOverriding: featureSet,
         featureSet: featureSet,
@@ -1216,16 +1218,16 @@
       _assertHasPrevious(original);
       _assertHasPrevious(clone);
     }
-    Token stopOriginalToken = originalNode.endToken.next;
-    Token skipCloneComment;
-    Token skipOriginalComment;
+    Token stopOriginalToken = originalNode.endToken.next!;
+    Token? skipCloneComment;
+    Token? skipOriginalComment;
     while (original != stopOriginalToken) {
       expect(clone, isNotNull);
       _assertEqualToken(clone, original);
       // comments
       {
-        Token cloneComment = clone.precedingComments;
-        Token originalComment = original.precedingComments;
+        var cloneComment = clone.precedingComments;
+        var originalComment = original.precedingComments;
         if (cloneComment != skipCloneComment &&
             originalComment != skipOriginalComment) {
           while (true) {
@@ -1234,9 +1236,9 @@
               break;
             }
             expect(cloneComment, isNotNull);
-            _assertEqualToken(cloneComment, originalComment);
-            cloneComment = cloneComment.next;
-            originalComment = originalComment.next;
+            _assertEqualToken(cloneComment!, originalComment);
+            cloneComment = cloneComment.next as CommentToken?;
+            originalComment = originalComment.next as CommentToken?;
           }
         }
       }
@@ -1245,24 +1247,26 @@
         expect(clone, TypeMatcher<CommentToken>());
         skipOriginalComment = original;
         skipCloneComment = clone;
-        original = (original as CommentToken).parent;
-        clone = (clone as CommentToken).parent;
+        original = original.parent!;
+        clone = (clone as CommentToken).parent!;
       } else {
-        clone = clone.next;
-        original = original.next;
+        clone = clone.next!;
+        original = original.next!;
       }
     }
   }
 
   /// Assert that the [token] has `previous` set, and if it `EOF`, then it
   /// points itself.
-  static void _assertHasPrevious(Token token) {
-    expect(token, isNotNull);
+  static void _assertHasPrevious(Token? token) {
+    if (token == null) {
+      fail('Expected not null');
+    }
     if (token.type == TokenType.EOF) {
       return;
     }
     while (token != null) {
-      Token previous = token.previous;
+      var previous = token.previous;
       expect(previous, isNotNull);
       if (token.type == TokenType.EOF) {
         expect(previous, same(token));
@@ -1343,7 +1347,9 @@
             dynamic exception, StackTrace stackTrace) {
       handlerInvoked = true;
     });
-    astFactory.nullLiteral(null).accept(visitor);
+    astFactory
+        .nullLiteral(TokenFactory.tokenFromKeyword(Keyword.NULL))
+        .accept(visitor);
     expect(handlerInvoked, isTrue);
   }
 }
@@ -1351,7 +1357,7 @@
 class Getter_NodeReplacerTest_test_annotation
     implements NodeReplacerTest_Getter<Annotation, ArgumentList> {
   @override
-  ArgumentList get(Annotation node) => node.arguments;
+  ArgumentList? get(Annotation node) => node.arguments;
 }
 
 class Getter_NodeReplacerTest_test_annotation_2
@@ -1363,13 +1369,13 @@
 class Getter_NodeReplacerTest_test_annotation_3
     implements NodeReplacerTest_Getter<Annotation, SimpleIdentifier> {
   @override
-  SimpleIdentifier get(Annotation node) => node.constructorName;
+  SimpleIdentifier? get(Annotation node) => node.constructorName;
 }
 
 class Getter_NodeReplacerTest_test_asExpression
     implements NodeReplacerTest_Getter<AsExpression, TypeAnnotation> {
   @override
-  TypeAnnotation get(AsExpression node) => node.type;
+  TypeAnnotation? get(AsExpression node) => node.type;
 }
 
 class Getter_NodeReplacerTest_test_asExpression_2
@@ -1387,7 +1393,7 @@
 class Getter_NodeReplacerTest_test_assertStatement_2
     implements NodeReplacerTest_Getter<AssertStatement, Expression> {
   @override
-  Expression get(AssertStatement node) => node.message;
+  Expression? get(AssertStatement node) => node.message;
 }
 
 class Getter_NodeReplacerTest_test_assignmentExpression
@@ -1429,7 +1435,7 @@
 class Getter_NodeReplacerTest_test_breakStatement
     implements NodeReplacerTest_Getter<BreakStatement, SimpleIdentifier> {
   @override
-  SimpleIdentifier get(BreakStatement node) => node.label;
+  SimpleIdentifier? get(BreakStatement node) => node.label;
 }
 
 class Getter_NodeReplacerTest_test_cascadeExpression
@@ -1441,49 +1447,49 @@
 class Getter_NodeReplacerTest_test_catchClause
     implements NodeReplacerTest_Getter<CatchClause, SimpleIdentifier> {
   @override
-  SimpleIdentifier get(CatchClause node) => node.stackTraceParameter;
+  SimpleIdentifier? get(CatchClause node) => node.stackTraceParameter;
 }
 
 class Getter_NodeReplacerTest_test_catchClause_2
     implements NodeReplacerTest_Getter<CatchClause, SimpleIdentifier> {
   @override
-  SimpleIdentifier get(CatchClause node) => node.exceptionParameter;
+  SimpleIdentifier? get(CatchClause node) => node.exceptionParameter;
 }
 
 class Getter_NodeReplacerTest_test_catchClause_3
     implements NodeReplacerTest_Getter<CatchClause, TypeAnnotation> {
   @override
-  TypeAnnotation get(CatchClause node) => node.exceptionType;
+  TypeAnnotation? get(CatchClause node) => node.exceptionType;
 }
 
 class Getter_NodeReplacerTest_test_classDeclaration
     implements NodeReplacerTest_Getter<ClassDeclaration, ImplementsClause> {
   @override
-  ImplementsClause get(ClassDeclaration node) => node.implementsClause;
+  ImplementsClause? get(ClassDeclaration node) => node.implementsClause;
 }
 
 class Getter_NodeReplacerTest_test_classDeclaration_2
     implements NodeReplacerTest_Getter<ClassDeclaration, WithClause> {
   @override
-  WithClause get(ClassDeclaration node) => node.withClause;
+  WithClause? get(ClassDeclaration node) => node.withClause;
 }
 
 class Getter_NodeReplacerTest_test_classDeclaration_3
     implements NodeReplacerTest_Getter<ClassDeclaration, NativeClause> {
   @override
-  NativeClause get(ClassDeclaration node) => node.nativeClause;
+  NativeClause? get(ClassDeclaration node) => node.nativeClause;
 }
 
 class Getter_NodeReplacerTest_test_classDeclaration_4
     implements NodeReplacerTest_Getter<ClassDeclaration, ExtendsClause> {
   @override
-  ExtendsClause get(ClassDeclaration node) => node.extendsClause;
+  ExtendsClause? get(ClassDeclaration node) => node.extendsClause;
 }
 
 class Getter_NodeReplacerTest_test_classDeclaration_5
     implements NodeReplacerTest_Getter<ClassDeclaration, TypeParameterList> {
   @override
-  TypeParameterList get(ClassDeclaration node) => node.typeParameters;
+  TypeParameterList? get(ClassDeclaration node) => node.typeParameters;
 }
 
 class Getter_NodeReplacerTest_test_classDeclaration_6
@@ -1501,7 +1507,7 @@
 class Getter_NodeReplacerTest_test_classTypeAlias_2
     implements NodeReplacerTest_Getter<ClassTypeAlias, ImplementsClause> {
   @override
-  ImplementsClause get(ClassTypeAlias node) => node.implementsClause;
+  ImplementsClause? get(ClassTypeAlias node) => node.implementsClause;
 }
 
 class Getter_NodeReplacerTest_test_classTypeAlias_3
@@ -1519,7 +1525,7 @@
 class Getter_NodeReplacerTest_test_classTypeAlias_5
     implements NodeReplacerTest_Getter<ClassTypeAlias, TypeParameterList> {
   @override
-  TypeParameterList get(ClassTypeAlias node) => node.typeParameters;
+  TypeParameterList? get(ClassTypeAlias node) => node.typeParameters;
 }
 
 class Getter_NodeReplacerTest_test_commentReference
@@ -1531,7 +1537,7 @@
 class Getter_NodeReplacerTest_test_compilationUnit
     implements NodeReplacerTest_Getter<CompilationUnit, ScriptTag> {
   @override
-  ScriptTag get(CompilationUnit node) => node.scriptTag;
+  ScriptTag? get(CompilationUnit node) => node.scriptTag;
 }
 
 class Getter_NodeReplacerTest_test_conditionalExpression
@@ -1556,7 +1562,7 @@
     implements
         NodeReplacerTest_Getter<ConstructorDeclaration, ConstructorName> {
   @override
-  ConstructorName get(ConstructorDeclaration node) =>
+  ConstructorName? get(ConstructorDeclaration node) =>
       node.redirectedConstructor;
 }
 
@@ -1564,7 +1570,7 @@
     implements
         NodeReplacerTest_Getter<ConstructorDeclaration, SimpleIdentifier> {
   @override
-  SimpleIdentifier get(ConstructorDeclaration node) => node.name;
+  SimpleIdentifier? get(ConstructorDeclaration node) => node.name;
 }
 
 class Getter_NodeReplacerTest_test_constructorDeclaration_3
@@ -1583,7 +1589,7 @@
 class Getter_NodeReplacerTest_test_constructorDeclaration_5
     implements NodeReplacerTest_Getter<ConstructorDeclaration, FunctionBody> {
   @override
-  FunctionBody get(ConstructorDeclaration node) => node.body;
+  FunctionBody? get(ConstructorDeclaration node) => node.body;
 }
 
 class Getter_NodeReplacerTest_test_constructorFieldInitializer
@@ -1609,19 +1615,19 @@
 class Getter_NodeReplacerTest_test_constructorName_2
     implements NodeReplacerTest_Getter<ConstructorName, SimpleIdentifier> {
   @override
-  SimpleIdentifier get(ConstructorName node) => node.name;
+  SimpleIdentifier? get(ConstructorName node) => node.name;
 }
 
 class Getter_NodeReplacerTest_test_continueStatement
     implements NodeReplacerTest_Getter<ContinueStatement, SimpleIdentifier> {
   @override
-  SimpleIdentifier get(ContinueStatement node) => node.label;
+  SimpleIdentifier? get(ContinueStatement node) => node.label;
 }
 
 class Getter_NodeReplacerTest_test_declaredIdentifier
     implements NodeReplacerTest_Getter<DeclaredIdentifier, TypeAnnotation> {
   @override
-  TypeAnnotation get(DeclaredIdentifier node) => node.type;
+  TypeAnnotation? get(DeclaredIdentifier node) => node.type;
 }
 
 class Getter_NodeReplacerTest_test_declaredIdentifier_2
@@ -1640,7 +1646,7 @@
 class Getter_NodeReplacerTest_test_defaultFormalParameter_2
     implements NodeReplacerTest_Getter<DefaultFormalParameter, Expression> {
   @override
-  Expression get(DefaultFormalParameter node) => node.defaultValue;
+  Expression? get(DefaultFormalParameter node) => node.defaultValue;
 }
 
 class Getter_NodeReplacerTest_test_doStatement
@@ -1697,13 +1703,13 @@
     implements
         NodeReplacerTest_Getter<FieldFormalParameter, FormalParameterList> {
   @override
-  FormalParameterList get(FieldFormalParameter node) => node.parameters;
+  FormalParameterList? get(FieldFormalParameter node) => node.parameters;
 }
 
 class Getter_NodeReplacerTest_test_fieldFormalParameter_2
     implements NodeReplacerTest_Getter<FieldFormalParameter, TypeAnnotation> {
   @override
-  TypeAnnotation get(FieldFormalParameter node) => node.type;
+  TypeAnnotation? get(FieldFormalParameter node) => node.type;
 }
 
 class Getter_NodeReplacerTest_test_forEachStatement_withIdentifier
@@ -1755,14 +1761,14 @@
 class Getter_NodeReplacerTest_test_forStatement_withInitialization_2
     implements NodeReplacerTest_Getter<ForStatement, Expression> {
   @override
-  Expression get(ForStatement node) =>
+  Expression? get(ForStatement node) =>
       (node.forLoopParts as ForParts).condition;
 }
 
 class Getter_NodeReplacerTest_test_forStatement_withInitialization_3
     implements NodeReplacerTest_Getter<ForStatement, Expression> {
   @override
-  Expression get(ForStatement node) =>
+  Expression? get(ForStatement node) =>
       (node.forLoopParts as ForPartsWithExpression).initialization;
 }
 
@@ -1782,14 +1788,14 @@
 class Getter_NodeReplacerTest_test_forStatement_withVariables_3
     implements NodeReplacerTest_Getter<ForStatement, Expression> {
   @override
-  Expression get(ForStatement node) =>
+  Expression? get(ForStatement node) =>
       (node.forLoopParts as ForParts).condition;
 }
 
 class Getter_NodeReplacerTest_test_functionDeclaration
     implements NodeReplacerTest_Getter<FunctionDeclaration, TypeAnnotation> {
   @override
-  TypeAnnotation get(FunctionDeclaration node) => node.returnType;
+  TypeAnnotation? get(FunctionDeclaration node) => node.returnType;
 }
 
 class Getter_NodeReplacerTest_test_functionDeclaration_2
@@ -1818,13 +1824,13 @@
     implements
         NodeReplacerTest_Getter<FunctionExpression, FormalParameterList> {
   @override
-  FormalParameterList get(FunctionExpression node) => node.parameters;
+  FormalParameterList? get(FunctionExpression node) => node.parameters;
 }
 
 class Getter_NodeReplacerTest_test_functionExpression_2
     implements NodeReplacerTest_Getter<FunctionExpression, FunctionBody> {
   @override
-  FunctionBody get(FunctionExpression node) => node.body;
+  FunctionBody? get(FunctionExpression node) => node.body;
 }
 
 class Getter_NodeReplacerTest_test_functionExpressionInvocation
@@ -1844,7 +1850,7 @@
 class Getter_NodeReplacerTest_test_functionTypeAlias
     implements NodeReplacerTest_Getter<FunctionTypeAlias, TypeParameterList> {
   @override
-  TypeParameterList get(FunctionTypeAlias node) => node.typeParameters;
+  TypeParameterList? get(FunctionTypeAlias node) => node.typeParameters;
 }
 
 class Getter_NodeReplacerTest_test_functionTypeAlias_2
@@ -1856,7 +1862,7 @@
 class Getter_NodeReplacerTest_test_functionTypeAlias_3
     implements NodeReplacerTest_Getter<FunctionTypeAlias, TypeAnnotation> {
   @override
-  TypeAnnotation get(FunctionTypeAlias node) => node.returnType;
+  TypeAnnotation? get(FunctionTypeAlias node) => node.returnType;
 }
 
 class Getter_NodeReplacerTest_test_functionTypeAlias_4
@@ -1869,7 +1875,7 @@
     implements
         NodeReplacerTest_Getter<FunctionTypedFormalParameter, TypeAnnotation> {
   @override
-  TypeAnnotation get(FunctionTypedFormalParameter node) => node.returnType;
+  TypeAnnotation? get(FunctionTypedFormalParameter node) => node.returnType;
 }
 
 class Getter_NodeReplacerTest_test_functionTypedFormalParameter_2
@@ -1889,7 +1895,7 @@
 class Getter_NodeReplacerTest_test_ifStatement_2
     implements NodeReplacerTest_Getter<IfStatement, Statement> {
   @override
-  Statement get(IfStatement node) => node.elseStatement;
+  Statement? get(IfStatement node) => node.elseStatement;
 }
 
 class Getter_NodeReplacerTest_test_ifStatement_3
@@ -1901,13 +1907,13 @@
 class Getter_NodeReplacerTest_test_importDirective
     implements NodeReplacerTest_Getter<ImportDirective, SimpleIdentifier> {
   @override
-  SimpleIdentifier get(ImportDirective node) => node.prefix;
+  SimpleIdentifier? get(ImportDirective node) => node.prefix;
 }
 
 class Getter_NodeReplacerTest_test_indexExpression
     implements NodeReplacerTest_Getter<IndexExpression, Expression> {
   @override
-  Expression get(IndexExpression node) => node.target;
+  Expression? get(IndexExpression node) => node.target;
 }
 
 class Getter_NodeReplacerTest_test_indexExpression_2
@@ -1945,7 +1951,7 @@
 class Getter_NodeReplacerTest_test_isExpression_2
     implements NodeReplacerTest_Getter<IsExpression, TypeAnnotation> {
   @override
-  TypeAnnotation get(IsExpression node) => node.type;
+  TypeAnnotation? get(IsExpression node) => node.type;
 }
 
 class Getter_NodeReplacerTest_test_label
@@ -1981,7 +1987,7 @@
 class Getter_NodeReplacerTest_test_methodDeclaration
     implements NodeReplacerTest_Getter<MethodDeclaration, TypeAnnotation> {
   @override
-  TypeAnnotation get(MethodDeclaration node) => node.returnType;
+  TypeAnnotation? get(MethodDeclaration node) => node.returnType;
 }
 
 class Getter_NodeReplacerTest_test_methodDeclaration_2
@@ -1999,7 +2005,7 @@
 class Getter_NodeReplacerTest_test_methodDeclaration_4
     implements NodeReplacerTest_Getter<MethodDeclaration, FormalParameterList> {
   @override
-  FormalParameterList get(MethodDeclaration node) => node.parameters;
+  FormalParameterList? get(MethodDeclaration node) => node.parameters;
 }
 
 class Getter_NodeReplacerTest_test_methodInvocation
@@ -2011,7 +2017,7 @@
 class Getter_NodeReplacerTest_test_methodInvocation_2
     implements NodeReplacerTest_Getter<MethodInvocation, Expression> {
   @override
-  Expression get(MethodInvocation node) => node.target;
+  Expression? get(MethodInvocation node) => node.target;
 }
 
 class Getter_NodeReplacerTest_test_methodInvocation_3
@@ -2035,13 +2041,13 @@
 class Getter_NodeReplacerTest_test_nativeClause
     implements NodeReplacerTest_Getter<NativeClause, StringLiteral> {
   @override
-  StringLiteral get(NativeClause node) => node.name;
+  StringLiteral? get(NativeClause node) => node.name;
 }
 
 class Getter_NodeReplacerTest_test_nativeFunctionBody
     implements NodeReplacerTest_Getter<NativeFunctionBody, StringLiteral> {
   @override
-  StringLiteral get(NativeFunctionBody node) => node.stringLiteral;
+  StringLiteral? get(NativeFunctionBody node) => node.stringLiteral;
 }
 
 class Getter_NodeReplacerTest_test_parenthesizedExpression
@@ -2053,7 +2059,7 @@
 class Getter_NodeReplacerTest_test_partOfDirective
     implements NodeReplacerTest_Getter<PartOfDirective, LibraryIdentifier> {
   @override
-  LibraryIdentifier get(PartOfDirective node) => node.libraryName;
+  LibraryIdentifier? get(PartOfDirective node) => node.libraryName;
 }
 
 class Getter_NodeReplacerTest_test_postfixExpression
@@ -2083,7 +2089,7 @@
 class Getter_NodeReplacerTest_test_propertyAccess
     implements NodeReplacerTest_Getter<PropertyAccess, Expression> {
   @override
-  Expression get(PropertyAccess node) => node.target;
+  Expression? get(PropertyAccess node) => node.target;
 }
 
 class Getter_NodeReplacerTest_test_propertyAccess_2
@@ -2097,7 +2103,7 @@
         NodeReplacerTest_Getter<RedirectingConstructorInvocation,
             SimpleIdentifier> {
   @override
-  SimpleIdentifier get(RedirectingConstructorInvocation node) =>
+  SimpleIdentifier? get(RedirectingConstructorInvocation node) =>
       node.constructorName;
 }
 
@@ -2112,20 +2118,21 @@
 class Getter_NodeReplacerTest_test_returnStatement
     implements NodeReplacerTest_Getter<ReturnStatement, Expression> {
   @override
-  Expression get(ReturnStatement node) => node.expression;
+  Expression? get(ReturnStatement node) => node.expression;
 }
 
 class Getter_NodeReplacerTest_test_simpleFormalParameter
     implements NodeReplacerTest_Getter<SimpleFormalParameter, TypeAnnotation> {
   @override
-  TypeAnnotation get(SimpleFormalParameter node) => node.type;
+  TypeAnnotation? get(SimpleFormalParameter node) => node.type;
 }
 
 class Getter_NodeReplacerTest_test_superConstructorInvocation
     implements
         NodeReplacerTest_Getter<SuperConstructorInvocation, SimpleIdentifier> {
   @override
-  SimpleIdentifier get(SuperConstructorInvocation node) => node.constructorName;
+  SimpleIdentifier? get(SuperConstructorInvocation node) =>
+      node.constructorName;
 }
 
 class Getter_NodeReplacerTest_test_superConstructorInvocation_2
@@ -2165,7 +2172,7 @@
 class Getter_NodeReplacerTest_test_tryStatement
     implements NodeReplacerTest_Getter<TryStatement, Block> {
   @override
-  Block get(TryStatement node) => node.finallyBlock;
+  Block? get(TryStatement node) => node.finallyBlock;
 }
 
 class Getter_NodeReplacerTest_test_tryStatement_2
@@ -2177,7 +2184,7 @@
 class Getter_NodeReplacerTest_test_typeName
     implements NodeReplacerTest_Getter<TypeName, TypeArgumentList> {
   @override
-  TypeArgumentList get(TypeName node) => node.typeArguments;
+  TypeArgumentList? get(TypeName node) => node.typeArguments;
 }
 
 class Getter_NodeReplacerTest_test_typeName_2
@@ -2189,7 +2196,7 @@
 class Getter_NodeReplacerTest_test_typeParameter
     implements NodeReplacerTest_Getter<TypeParameter, TypeAnnotation> {
   @override
-  TypeAnnotation get(TypeParameter node) => node.bound;
+  TypeAnnotation? get(TypeParameter node) => node.bound;
 }
 
 class Getter_NodeReplacerTest_test_typeParameter_2
@@ -2207,14 +2214,14 @@
 class Getter_NodeReplacerTest_test_variableDeclaration_2
     implements NodeReplacerTest_Getter<VariableDeclaration, Expression> {
   @override
-  Expression get(VariableDeclaration node) => node.initializer;
+  Expression? get(VariableDeclaration node) => node.initializer;
 }
 
 class Getter_NodeReplacerTest_test_variableDeclarationList
     implements
         NodeReplacerTest_Getter<VariableDeclarationList, TypeAnnotation> {
   @override
-  TypeAnnotation get(VariableDeclarationList node) => node.type;
+  TypeAnnotation? get(VariableDeclarationList node) => node.type;
 }
 
 class Getter_NodeReplacerTest_test_variableDeclarationStatement
@@ -2247,26 +2254,26 @@
 class Getter_NodeReplacerTest_testAnnotatedNode
     implements NodeReplacerTest_Getter<AnnotatedNode, Comment> {
   @override
-  Comment get(AnnotatedNode node) => node.documentationComment;
+  Comment? get(AnnotatedNode node) => node.documentationComment;
 }
 
 class Getter_NodeReplacerTest_testNormalFormalParameter
     implements
         NodeReplacerTest_Getter<NormalFormalParameter, SimpleIdentifier> {
   @override
-  SimpleIdentifier get(NormalFormalParameter node) => node.identifier;
+  SimpleIdentifier? get(NormalFormalParameter node) => node.identifier;
 }
 
 class Getter_NodeReplacerTest_testNormalFormalParameter_2
     implements NodeReplacerTest_Getter<NormalFormalParameter, Comment> {
   @override
-  Comment get(NormalFormalParameter node) => node.documentationComment;
+  Comment? get(NormalFormalParameter node) => node.documentationComment;
 }
 
 class Getter_NodeReplacerTest_testTypedLiteral
     implements NodeReplacerTest_Getter<TypedLiteral, TypeArgumentList> {
   @override
-  TypeArgumentList get(TypedLiteral node) => node.typeArguments;
+  TypeArgumentList? get(TypedLiteral node) => node.typeArguments;
 }
 
 class Getter_NodeReplacerTest_testUriBasedDirective
@@ -2287,29 +2294,23 @@
     }, throwsArgumentError);
   }
 
-  void test_creation_null() {
-    expect(() {
-      LineInfo(null);
-    }, throwsArgumentError);
-  }
-
   void test_getLocation_firstLine() {
     LineInfo info = LineInfo(<int>[0, 12, 34]);
-    CharacterLocation location = info.getLocation(4);
+    var location = info.getLocation(4);
     expect(location.lineNumber, 1);
     expect(location.columnNumber, 5);
   }
 
   void test_getLocation_lastLine() {
     LineInfo info = LineInfo(<int>[0, 12, 34]);
-    CharacterLocation location = info.getLocation(36);
+    var location = info.getLocation(36);
     expect(location.lineNumber, 3);
     expect(location.columnNumber, 3);
   }
 
   void test_getLocation_middleLine() {
     LineInfo info = LineInfo(<int>[0, 12, 34]);
-    CharacterLocation location = info.getLocation(12);
+    var location = info.getLocation(12);
     expect(location.lineNumber, 2);
     expect(location.columnNumber, 1);
   }
@@ -3406,7 +3407,7 @@
 
   void test_typeArgumentList() {
     TypeArgumentList node =
-        AstTestFactory.typeArgumentList([AstTestFactory.typeName4("A")]);
+        AstTestFactory.typeArgumentList2([AstTestFactory.typeName4("A")]);
     _assertReplace(node, ListGetter_NodeReplacerTest_test_typeArgumentList(0));
   }
 
@@ -3425,7 +3426,7 @@
   }
 
   void test_typeParameterList() {
-    TypeParameterList node = AstTestFactory.typeParameterList(["A", "B"]);
+    TypeParameterList node = AstTestFactory.typeParameterList2(["A", "B"]);
     _assertReplace(node, ListGetter_NodeReplacerTest_test_typeParameterList(0));
   }
 
@@ -3484,9 +3485,9 @@
   }
 
   void _assertReplace(AstNode parent, NodeReplacerTest_Getter getter) {
-    AstNode child = getter.get(parent);
+    var child = getter.get(parent);
     if (child != null) {
-      AstNode clone = child.accept(AstCloner());
+      AstNode clone = child.accept(AstCloner())!;
       NodeReplacer.replace(child, clone);
       expect(getter.get(parent), clone);
       expect(clone.parent, child.parent);
@@ -3525,8 +3526,8 @@
   }
 }
 
-abstract class NodeReplacerTest_Getter<P, C> {
-  C get(P parent);
+abstract class NodeReplacerTest_Getter<P, C extends AstNode> {
+  C? get(P parent);
 }
 
 abstract class NodeReplacerTest_ListGetter<P extends AstNode, C extends AstNode>
@@ -3536,7 +3537,7 @@
   NodeReplacerTest_ListGetter(this._index);
 
   @override
-  C get(P parent) {
+  C? get(P parent) {
     NodeList<C> list = getList(parent);
     if (list.isEmpty) {
       return null;
@@ -3618,7 +3619,6 @@
 
   void test_equals() {
     SourceRange r = SourceRange(10, 1);
-    expect(r == null, isFalse);
     // ignore: unrelated_type_equality_checks
     expect(r == this, isFalse);
     expect(r == SourceRange(20, 2), isFalse);
@@ -3808,7 +3808,7 @@
 
   void test_printListOfQuotedNames_empty() {
     expect(() {
-      StringUtilities.printListOfQuotedNames(List<String>.filled(0, null));
+      StringUtilities.printListOfQuotedNames([]);
     }, throwsArgumentError);
   }
 
@@ -3937,7 +3937,6 @@
   }
 
   void test_substringBeforeChar() {
-    expect(StringUtilities.substringBeforeChar(null, 0x61), null);
     expect(StringUtilities.substringBeforeChar("", 0x61), "");
     expect(StringUtilities.substringBeforeChar("abc", 0x61), "");
     expect(StringUtilities.substringBeforeChar("abcba", 0x62), "a");
diff --git a/pkg/analyzer/test/generated/variance_parser_test.dart b/pkg/analyzer/test/generated/variance_parser_test.dart
index 256eb10..bdb86c3 100644
--- a/pkg/analyzer/test/generated/variance_parser_test.dart
+++ b/pkg/analyzer/test/generated/variance_parser_test.dart
@@ -23,9 +23,9 @@
 class VarianceParserTest extends FastaParserTestCase {
   @override
   CompilationUnit parseCompilationUnit(String content,
-      {List<ErrorCode> codes,
-      List<ExpectedError> errors,
-      FeatureSet featureSet}) {
+      {List<ErrorCode>? codes,
+      List<ExpectedError>? errors,
+      FeatureSet? featureSet}) {
     return super.parseCompilationUnit(content,
         codes: codes,
         errors: errors,
@@ -60,27 +60,28 @@
     var classDecl = unit.declarations[0] as ClassDeclaration;
     expect(classDecl.name.name, 'A');
 
-    expect(classDecl.typeParameters.typeParameters, hasLength(4));
-    expect(classDecl.typeParameters.typeParameters[0].name.name, 'T');
-    expect(classDecl.typeParameters.typeParameters[1].name.name, 'U');
-    expect(classDecl.typeParameters.typeParameters[2].name.name, 'V');
-    expect(classDecl.typeParameters.typeParameters[3].name.name, 'W');
+    var typeParameters = classDecl.typeParameters!;
+    expect(typeParameters.typeParameters, hasLength(4));
+    expect(typeParameters.typeParameters[0].name.name, 'T');
+    expect(typeParameters.typeParameters[1].name.name, 'U');
+    expect(typeParameters.typeParameters[2].name.name, 'V');
+    expect(typeParameters.typeParameters[3].name.name, 'W');
 
-    var typeParameterImplList = classDecl.typeParameters.typeParameters;
+    var typeParameterImplList = typeParameters.typeParameters;
     expect((typeParameterImplList[0] as TypeParameterImpl).varianceKeyword,
         isNotNull);
     expect(
-        (typeParameterImplList[0] as TypeParameterImpl).varianceKeyword.lexeme,
+        (typeParameterImplList[0] as TypeParameterImpl).varianceKeyword!.lexeme,
         "in");
     expect((typeParameterImplList[1] as TypeParameterImpl).varianceKeyword,
         isNotNull);
     expect(
-        (typeParameterImplList[1] as TypeParameterImpl).varianceKeyword.lexeme,
+        (typeParameterImplList[1] as TypeParameterImpl).varianceKeyword!.lexeme,
         "inout");
     expect((typeParameterImplList[2] as TypeParameterImpl).varianceKeyword,
         isNotNull);
     expect(
-        (typeParameterImplList[2] as TypeParameterImpl).varianceKeyword.lexeme,
+        (typeParameterImplList[2] as TypeParameterImpl).varianceKeyword!.lexeme,
         "out");
     expect((typeParameterImplList[3] as TypeParameterImpl).varianceKeyword,
         isNull);
@@ -94,8 +95,10 @@
     expect(unit.declarations, hasLength(1));
     var classDecl = unit.declarations[0] as ClassDeclaration;
     expect(classDecl.name.name, 'A');
-    expect(classDecl.typeParameters.typeParameters, hasLength(1));
-    expect(classDecl.typeParameters.typeParameters[0].name.name, 'T');
+
+    var typeParameters = classDecl.typeParameters!;
+    expect(typeParameters.typeParameters, hasLength(1));
+    expect(typeParameters.typeParameters[0].name.name, 'T');
   }
 
   void test_class_enabled_single() {
@@ -103,13 +106,15 @@
     expect(unit.declarations, hasLength(1));
     var classDecl = unit.declarations[0] as ClassDeclaration;
     expect(classDecl.name.name, 'A');
-    expect(classDecl.typeParameters.typeParameters, hasLength(1));
-    expect(classDecl.typeParameters.typeParameters[0].name.name, 'T');
+
+    var typeParameters = classDecl.typeParameters!;
+    expect(typeParameters.typeParameters, hasLength(1));
+    expect(typeParameters.typeParameters[0].name.name, 'T');
 
     var typeParameterImpl =
-        classDecl.typeParameters.typeParameters[0] as TypeParameterImpl;
+        typeParameters.typeParameters[0] as TypeParameterImpl;
     expect(typeParameterImpl.varianceKeyword, isNotNull);
-    expect(typeParameterImpl.varianceKeyword.lexeme, "in");
+    expect(typeParameterImpl.varianceKeyword!.lexeme, "in");
   }
 
   void test_function_disabled() {
@@ -165,8 +170,10 @@
     expect(unit.declarations, hasLength(1));
     var mixinDecl = unit.declarations[0] as MixinDeclaration;
     expect(mixinDecl.name.name, 'A');
-    expect(mixinDecl.typeParameters.typeParameters, hasLength(1));
-    expect(mixinDecl.typeParameters.typeParameters[0].name.name, 'T');
+
+    var typeParameters = mixinDecl.typeParameters!;
+    expect(typeParameters.typeParameters, hasLength(1));
+    expect(typeParameters.typeParameters[0].name.name, 'T');
   }
 
   void test_typedef_disabled() {
diff --git a/pkg/analyzer/test/id_tests/assigned_variables_test.dart b/pkg/analyzer/test/id_tests/assigned_variables_test.dart
index 00c8a11..1781d16 100644
--- a/pkg/analyzer/test/id_tests/assigned_variables_test.dart
+++ b/pkg/analyzer/test/id_tests/assigned_variables_test.dart
@@ -40,10 +40,10 @@
   @override
   void computeUnitData(TestingData testingData, CompilationUnit unit,
       Map<Id, ActualData<_Data>> actualMap) {
-    var flowResult =
-        testingData.uriToFlowAnalysisData[unit.declaredElement.source.uri];
+    var unitElement = unit.declaredElement!;
+    var flowResult = testingData.uriToFlowAnalysisData[unitElement.source.uri]!;
     _AssignedVariablesDataExtractor(
-            unit.declaredElement.source.uri, actualMap, flowResult)
+            unitElement.source.uri, actualMap, flowResult)
         .run(unit);
   }
 }
@@ -51,9 +51,9 @@
 class _AssignedVariablesDataExtractor extends AstDataExtractor<_Data> {
   final FlowAnalysisDataForTesting _flowResult;
 
-  Declaration _currentDeclaration;
+  Declaration? _currentDeclaration;
 
-  AssignedVariablesForTesting<AstNode, PromotableElement>
+  AssignedVariablesForTesting<AstNode, PromotableElement>?
       _currentAssignedVariables;
 
   _AssignedVariablesDataExtractor(
@@ -61,26 +61,27 @@
       : super(uri, actualMap);
 
   @override
-  _Data computeNodeValue(Id id, AstNode node) {
+  _Data? computeNodeValue(Id id, AstNode node) {
     if (node is FunctionDeclarationStatement) {
-      node = (node as FunctionDeclarationStatement).functionDeclaration;
+      node = node.functionDeclaration;
     }
-    if (_currentAssignedVariables == null) return null;
+    var currentAssignedVariables = _currentAssignedVariables;
+    if (currentAssignedVariables == null) return null;
     if (node == _currentDeclaration) {
       return _Data(
-          _convertVars(_currentAssignedVariables.declaredAtTopLevel),
-          _convertVars(_currentAssignedVariables.readAnywhere),
-          _convertVars(_currentAssignedVariables.readCapturedAnywhere),
-          _convertVars(_currentAssignedVariables.writtenAnywhere),
-          _convertVars(_currentAssignedVariables.capturedAnywhere));
+          _convertVars(currentAssignedVariables.declaredAtTopLevel),
+          _convertVars(currentAssignedVariables.readAnywhere),
+          _convertVars(currentAssignedVariables.readCapturedAnywhere),
+          _convertVars(currentAssignedVariables.writtenAnywhere),
+          _convertVars(currentAssignedVariables.capturedAnywhere));
     }
-    if (!_currentAssignedVariables.isTracked(node)) return null;
+    if (!currentAssignedVariables.isTracked(node)) return null;
     return _Data(
-        _convertVars(_currentAssignedVariables.declaredInNode(node)),
-        _convertVars(_currentAssignedVariables.readInNode(node)),
-        _convertVars(_currentAssignedVariables.readCapturedInNode(node)),
-        _convertVars(_currentAssignedVariables.writtenInNode(node)),
-        _convertVars(_currentAssignedVariables.capturedInNode(node)));
+        _convertVars(currentAssignedVariables.declaredInNode(node)),
+        _convertVars(currentAssignedVariables.readInNode(node)),
+        _convertVars(currentAssignedVariables.readCapturedInNode(node)),
+        _convertVars(currentAssignedVariables.writtenInNode(node)),
+        _convertVars(currentAssignedVariables.capturedInNode(node)));
   }
 
   @override
@@ -102,12 +103,12 @@
   }
 
   Set<String> _convertVars(Iterable<PromotableElement> x) =>
-      x.map((e) => e.name).toSet();
+      x.map((e) => e.name!).toSet();
 
   void _handlePossibleTopLevelDeclaration(
       AstNode node, void Function() callback) {
     if (_currentDeclaration == null) {
-      _currentDeclaration = node;
+      _currentDeclaration = node as Declaration;
       _currentAssignedVariables = _flowResult.assignedVariables[node];
       callback();
       _currentDeclaration = null;
@@ -122,7 +123,7 @@
   const _AssignedVariablesDataInterpreter();
 
   @override
-  String getText(_Data actualData, [String indentation]) {
+  String getText(_Data actualData, [String? indentation]) {
     var parts = <String>[];
     if (actualData.declared.isNotEmpty) {
       parts.add('declared=${_setToString(actualData.declared)}');
@@ -144,7 +145,7 @@
   }
 
   @override
-  String isAsExpected(_Data actualData, String expectedData) {
+  String? isAsExpected(_Data actualData, String? expectedData) {
     var actualDataText = getText(actualData);
     if (actualDataText == expectedData) {
       return null;
diff --git a/pkg/analyzer/test/id_tests/constant_test.dart b/pkg/analyzer/test/id_tests/constant_test.dart
index ff39009..79e212b 100644
--- a/pkg/analyzer/test/id_tests/constant_test.dart
+++ b/pkg/analyzer/test/id_tests/constant_test.dart
@@ -41,7 +41,7 @@
   bool get supportsErrors => true;
 
   @override
-  String computeErrorData(TestConfig config, TestingData testingData, Id id,
+  String? computeErrorData(TestConfig config, TestingData testingData, Id id,
       List<AnalysisError> errors) {
     var errorCodes = errors.map((e) => e.errorCode).where((errorCode) =>
         errorCode !=
@@ -52,7 +52,7 @@
   @override
   void computeUnitData(TestingData testingData, CompilationUnit unit,
       Map<Id, ActualData<String>> actualMap) {
-    ConstantsDataExtractor(unit.declaredElement.source.uri, actualMap)
+    ConstantsDataExtractor(unit.declaredElement!.source.uri, actualMap)
         .run(unit);
   }
 }
@@ -62,7 +62,7 @@
       : super(uri, actualMap);
 
   @override
-  String computeNodeValue(Id id, AstNode node) {
+  String? computeNodeValue(Id id, AstNode node) {
     if (node is Identifier) {
       var element = node.staticElement;
       if (element is PropertyAccessorElement && element.isSynthetic) {
@@ -92,27 +92,27 @@
       } else if (type.isDartCoreSymbol) {
         return 'Symbol(${value.toSymbolValue()})';
       } else if (type.isDartCoreSet) {
-        var elements = value.toSetValue().map(_stringify).join(',');
+        var elements = value.toSetValue()!.map(_stringify).join(',');
         return '${_stringifyType(type)}($elements)';
       } else if (type.isDartCoreList) {
-        var elements = value.toListValue().map(_stringify).join(',');
+        var elements = value.toListValue()!.map(_stringify).join(',');
         return '${_stringifyType(type)}($elements)';
       } else if (type.isDartCoreMap) {
-        var elements = value.toMapValue().entries.map((entry) {
-          var key = _stringify(entry.key);
-          var value = _stringify(entry.value);
+        var elements = value.toMapValue()!.entries.map((entry) {
+          var key = _stringify(entry.key!);
+          var value = _stringify(entry.value!);
           return '$key:$value';
         }).join(',');
         return '${_stringifyType(type)}($elements)';
       } else {
         // TODO(paulberry): Add `isDartCoreType` to properly recognize type
         // literal constants.
-        return 'TypeLiteral(${_stringifyType(value.toTypeValue())})';
+        return 'TypeLiteral(${_stringifyType(value.toTypeValue()!)})';
       }
       // TODO(paulberry): Support object constants.
     } else if (type is FunctionType) {
-      var element = value.toFunctionValue();
-      return 'Function(${element.name},type=${_stringifyType(value.type)})';
+      var element = value.toFunctionValue()!;
+      return 'Function(${element.name},type=${_stringifyType(value.type!)})';
     }
     throw UnimplementedError('_stringify for type $type');
   }
diff --git a/pkg/analyzer/test/id_tests/definite_assignment_test.dart b/pkg/analyzer/test/id_tests/definite_assignment_test.dart
index 03d7c45..72071678 100644
--- a/pkg/analyzer/test/id_tests/definite_assignment_test.dart
+++ b/pkg/analyzer/test/id_tests/definite_assignment_test.dart
@@ -42,7 +42,7 @@
   bool get supportsErrors => true;
 
   @override
-  String computeErrorData(TestConfig config, TestingData testingData, Id id,
+  String? computeErrorData(TestConfig config, TestingData testingData, Id id,
       List<AnalysisError> errors) {
     var errorCodes = errors.map((e) => e.errorCode).where((errorCode) =>
         errorCode !=
@@ -53,10 +53,10 @@
   @override
   void computeUnitData(TestingData testingData, CompilationUnit unit,
       Map<Id, ActualData<String>> actualMap) {
-    var flowResult =
-        testingData.uriToFlowAnalysisData[unit.declaredElement.source.uri];
+    var unitElement = unit.declaredElement!;
+    var flowResult = testingData.uriToFlowAnalysisData[unitElement.source.uri]!;
     _DefiniteAssignmentDataExtractor(
-            unit.declaredElement.source.uri, actualMap, flowResult)
+            unitElement.source.uri, actualMap, flowResult)
         .run(unit);
   }
 }
@@ -69,7 +69,7 @@
       : super(uri, actualMap);
 
   @override
-  String computeNodeValue(Id id, AstNode node) {
+  String? computeNodeValue(Id id, AstNode node) {
     if (node is SimpleIdentifier && node.inGetterContext()) {
       var element = node.staticElement;
       if (element is LocalVariableElement || element is ParameterElement) {
@@ -86,10 +86,10 @@
   const _DefiniteAssignmentDataInterpreter();
 
   @override
-  String getText(String actualData, [String indentation]) => actualData;
+  String getText(String actualData, [String? indentation]) => actualData;
 
   @override
-  String isAsExpected(String actualData, String expectedData) {
+  String? isAsExpected(String actualData, String? expectedData) {
     if (actualData == expectedData) {
       return null;
     } else {
@@ -98,5 +98,5 @@
   }
 
   @override
-  bool isEmpty(String actualData) => actualData == null;
+  bool isEmpty(String? actualData) => actualData == null;
 }
diff --git a/pkg/analyzer/test/id_tests/definite_unassignment_test.dart b/pkg/analyzer/test/id_tests/definite_unassignment_test.dart
index c0e1153..0f3cf47 100644
--- a/pkg/analyzer/test/id_tests/definite_unassignment_test.dart
+++ b/pkg/analyzer/test/id_tests/definite_unassignment_test.dart
@@ -42,7 +42,7 @@
   bool get supportsErrors => true;
 
   @override
-  String computeErrorData(TestConfig config, TestingData testingData, Id id,
+  String? computeErrorData(TestConfig config, TestingData testingData, Id id,
       List<AnalysisError> errors) {
     var errorCodes = errors.map((e) => e.errorCode).where((errorCode) =>
         errorCode !=
@@ -53,10 +53,10 @@
   @override
   void computeUnitData(TestingData testingData, CompilationUnit unit,
       Map<Id, ActualData<String>> actualMap) {
-    var flowResult =
-        testingData.uriToFlowAnalysisData[unit.declaredElement.source.uri];
+    var unitElement = unit.declaredElement!;
+    var flowResult = testingData.uriToFlowAnalysisData[unitElement.source.uri]!;
     _DefiniteUnassignmentDataExtractor(
-            unit.declaredElement.source.uri, actualMap, flowResult)
+            unitElement.source.uri, actualMap, flowResult)
         .run(unit);
   }
 }
@@ -69,7 +69,7 @@
       : super(uri, actualMap);
 
   @override
-  String computeNodeValue(Id id, AstNode node) {
+  String? computeNodeValue(Id id, AstNode node) {
     if (node is SimpleIdentifier && node.inGetterContext()) {
       var element = node.staticElement;
       if (element is LocalVariableElement || element is ParameterElement) {
@@ -86,10 +86,10 @@
   const _DefiniteUnassignmentDataInterpreter();
 
   @override
-  String getText(String actualData, [String indentation]) => actualData;
+  String getText(String actualData, [String? indentation]) => actualData;
 
   @override
-  String isAsExpected(String actualData, String expectedData) {
+  String? isAsExpected(String actualData, String? expectedData) {
     if (actualData == expectedData) {
       return null;
     } else {
@@ -98,5 +98,5 @@
   }
 
   @override
-  bool isEmpty(String actualData) => actualData == null;
+  bool isEmpty(String? actualData) => actualData == null;
 }
diff --git a/pkg/analyzer/test/id_tests/inheritance_test.dart b/pkg/analyzer/test/id_tests/inheritance_test.dart
index 3233740..a8a7dea 100644
--- a/pkg/analyzer/test/id_tests/inheritance_test.dart
+++ b/pkg/analyzer/test/id_tests/inheritance_test.dart
@@ -71,7 +71,7 @@
   @override
   void computeUnitData(TestingData testingData, CompilationUnit unit,
       Map<Id, ActualData<String>> actualMap) {
-    _InheritanceDataExtractor(unit.declaredElement.source.uri, actualMap)
+    _InheritanceDataExtractor(unit.declaredElement!.source.uri, actualMap)
         .run(unit);
   }
 }
@@ -83,7 +83,7 @@
       : super(uri, actualMap);
 
   @override
-  String computeElementValue(Id id, Element element) {
+  String? computeElementValue(Id id, Element element) {
     if (element is LibraryElement) {
       return 'nnbd=${element.isNonNullableByDefault}';
     }
@@ -91,10 +91,10 @@
   }
 
   @override
-  void computeForClass(Declaration node, Id id) {
+  void computeForClass(Declaration node, Id? id) {
     super.computeForClass(node, id);
     if (node is ClassDeclaration) {
-      var element = node.declaredElement;
+      var element = node.declaredElement!;
 
       void registerMember(
           MemberId id, int offset, Object object, DartType type) {
@@ -104,9 +104,9 @@
 
       var interface = inheritance.getInterface(element);
       for (var name in interface.map.keys) {
-        var executable = interface.map[name];
+        var executable = interface.map[name]!;
 
-        ClassElement enclosingClass = executable.enclosingElement;
+        var enclosingClass = executable.enclosingElement as ClassElement;
         if (enclosingClass.isDartCoreObject) continue;
 
         var id = MemberId.internal(
@@ -127,6 +127,8 @@
           } else {
             type = executable.parameters.first.type;
           }
+        } else {
+          throw UnimplementedError('(${executable.runtimeType}) $executable');
         }
 
         registerMember(id, offset, executable, type);
@@ -135,9 +137,9 @@
   }
 
   @override
-  String computeNodeValue(Id id, AstNode node) {
+  String? computeNodeValue(Id id, AstNode node) {
     if (node is ClassDeclaration) {
-      var cls = node.declaredElement;
+      var cls = node.declaredElement!;
       var supertypes = <String>[];
       supertypes.add(supertypeToString(cls.thisType));
       for (var supertype in cls.allSupertypes) {
diff --git a/pkg/analyzer/test/id_tests/nullability_test.dart b/pkg/analyzer/test/id_tests/nullability_test.dart
index 19c6869..b2f1561 100644
--- a/pkg/analyzer/test/id_tests/nullability_test.dart
+++ b/pkg/analyzer/test/id_tests/nullability_test.dart
@@ -13,7 +13,6 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_system.dart';
 import 'package:analyzer/src/dart/analysis/testing_data.dart';
-import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/resolver/flow_analysis_visitor.dart';
 import 'package:analyzer/src/util/ast_data_extractor.dart';
 import 'package:test/test.dart';
@@ -34,7 +33,7 @@
 }
 
 class FlowTestBase {
-  FlowAnalysisDataForTesting flowResult;
+  late final FlowAnalysisDataForTesting flowResult;
 
   /// Resolve the given [code] and track nullability in the unit.
   Future<void> trackCode(String code) async {
@@ -59,8 +58,9 @@
   @override
   void computeUnitData(TestingData testingData, CompilationUnit unit,
       Map<Id, ActualData<String>> actualMap) {
-    _NullabilityDataExtractor(unit.declaredElement.source.uri, actualMap,
-            unit.declaredElement.library.typeSystem)
+    var unitElement = unit.declaredElement!;
+    _NullabilityDataExtractor(
+            unitElement.source.uri, actualMap, unitElement.library.typeSystem)
         .run(unit);
   }
 }
@@ -73,15 +73,15 @@
       : super(uri, actualMap);
 
   @override
-  String computeNodeValue(Id id, AstNode node) {
+  String? computeNodeValue(Id id, AstNode node) {
     if (node is SimpleIdentifier &&
         node.inGetterContext() &&
         !node.inDeclarationContext()) {
       var element = node.staticElement;
       if (element is LocalVariableElement || element is ParameterElement) {
-        TypeImpl promotedType = _readType(node);
-        TypeImpl declaredType = (element as VariableElement).type;
-        var isPromoted = promotedType != null && promotedType != declaredType;
+        var promotedType = _readType(node);
+        var declaredType = (element as VariableElement).type;
+        var isPromoted = promotedType != declaredType;
         if (isPromoted &&
             _typeSystem.isPotentiallyNullable(declaredType) &&
             !_typeSystem.isPotentiallyNullable(promotedType)) {
@@ -95,13 +95,13 @@
   static DartType _readType(SimpleIdentifier node) {
     var parent = node.parent;
     if (parent is AssignmentExpression && parent.leftHandSide == node) {
-      return parent.readType;
+      return parent.readType!;
     } else if (parent is PostfixExpression) {
-      return parent.readType;
+      return parent.readType ?? node.staticType!;
     } else if (parent is PrefixExpression) {
-      return parent.readType;
+      return parent.readType ?? node.staticType!;
     } else {
-      return node.staticType;
+      return node.staticType!;
     }
   }
 }
@@ -110,10 +110,10 @@
   const _NullabilityDataInterpreter();
 
   @override
-  String getText(String actualData, [String indentation]) => actualData;
+  String getText(String actualData, [String? indentation]) => actualData;
 
   @override
-  String isAsExpected(String actualData, String expectedData) {
+  String? isAsExpected(String actualData, String? expectedData) {
     if (actualData == expectedData) {
       return null;
     } else {
diff --git a/pkg/analyzer/test/id_tests/reachability_test.dart b/pkg/analyzer/test/id_tests/reachability_test.dart
index c8751ff..aff26d2 100644
--- a/pkg/analyzer/test/id_tests/reachability_test.dart
+++ b/pkg/analyzer/test/id_tests/reachability_test.dart
@@ -30,7 +30,7 @@
 }
 
 class FlowTestBase {
-  FlowAnalysisDataForTesting flowResult;
+  late final FlowAnalysisDataForTesting flowResult;
 
   /// Resolve the given [code] and track nullability in the unit.
   Future<void> trackCode(String code) async {
@@ -61,10 +61,9 @@
   @override
   void computeUnitData(TestingData testingData, CompilationUnit unit,
       Map<Id, ActualData<Set<_ReachabilityAssertion>>> actualMap) {
-    var flowResult =
-        testingData.uriToFlowAnalysisData[unit.declaredElement.source.uri];
-    _ReachabilityDataExtractor(
-            unit.declaredElement.source.uri, actualMap, flowResult)
+    var unitElement = unit.declaredElement!;
+    var flowResult = testingData.uriToFlowAnalysisData[unitElement.source.uri]!;
+    _ReachabilityDataExtractor(unitElement.source.uri, actualMap, flowResult)
         .run(unit);
   }
 }
@@ -80,7 +79,7 @@
       : super(uri, actualMap);
 
   @override
-  Set<_ReachabilityAssertion> computeNodeValue(Id id, AstNode node) {
+  Set<_ReachabilityAssertion>? computeNodeValue(Id id, AstNode node) {
     Set<_ReachabilityAssertion> result = {};
     if (node is Expression && node.parent is ExpressionStatement) {
       // The reachability of an expression statement and the statement it
@@ -103,7 +102,7 @@
   }
 
   void _checkBodyCompletion(
-      FunctionBody body, Set<_ReachabilityAssertion> result) {
+      FunctionBody? body, Set<_ReachabilityAssertion> result) {
     if (body != null &&
         _flowResult.functionBodiesThatDontComplete.contains(body)) {
       result.add(_ReachabilityAssertion.doesNotComplete);
@@ -117,12 +116,12 @@
 
   @override
   String getText(Set<_ReachabilityAssertion> actualData,
-          [String indentation]) =>
+          [String? indentation]) =>
       _sortedRepresentation(_toStrings(actualData));
 
   @override
-  String isAsExpected(
-      Set<_ReachabilityAssertion> actualData, String expectedData) {
+  String? isAsExpected(
+      Set<_ReachabilityAssertion> actualData, String? expectedData) {
     var actualStrings = _toStrings(actualData);
     var actualSorted = _sortedRepresentation(actualStrings);
     var expectedSorted = _sortedRepresentation(expectedData?.split(','));
@@ -136,7 +135,7 @@
   @override
   bool isEmpty(Set<_ReachabilityAssertion> actualData) => actualData.isEmpty;
 
-  String _sortedRepresentation(Iterable<String> values) {
+  String _sortedRepresentation(Iterable<String>? values) {
     var list = values == null || values.isEmpty ? ['none'] : values.toList();
     list.sort();
     return list.join(',');
diff --git a/pkg/analyzer/test/id_tests/type_promotion_test.dart b/pkg/analyzer/test/id_tests/type_promotion_test.dart
index 177ce59..302be7f 100644
--- a/pkg/analyzer/test/id_tests/type_promotion_test.dart
+++ b/pkg/analyzer/test/id_tests/type_promotion_test.dart
@@ -11,7 +11,6 @@
 import 'package:analyzer/dart/element/null_safety_understanding_flag.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/analysis/testing_data.dart';
-import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/util/ast_data_extractor.dart';
 
 import '../util/id_testing_helper.dart';
@@ -40,7 +39,7 @@
   @override
   void computeUnitData(TestingData testingData, CompilationUnit unit,
       Map<Id, ActualData<DartType>> actualMap) {
-    _TypePromotionDataExtractor(unit.declaredElement.source.uri, actualMap)
+    _TypePromotionDataExtractor(unit.declaredElement!.source.uri, actualMap)
         .run(unit);
   }
 }
@@ -50,12 +49,12 @@
       : super(uri, actualMap);
 
   @override
-  DartType computeNodeValue(Id id, AstNode node) {
+  DartType? computeNodeValue(Id id, AstNode node) {
     if (node is SimpleIdentifier && node.inGetterContext()) {
       var element = _readElement(node);
       if (element is LocalVariableElement || element is ParameterElement) {
-        var promotedType = _readType(node) as TypeImpl;
-        var declaredType = (element as VariableElement).type as TypeImpl;
+        var promotedType = _readType(node);
+        var declaredType = (element as VariableElement).type;
         var isPromoted = promotedType != declaredType;
         if (isPromoted) {
           return promotedType;
@@ -65,7 +64,7 @@
     return null;
   }
 
-  static Element _readElement(SimpleIdentifier node) {
+  static Element? _readElement(SimpleIdentifier node) {
     var parent = node.parent;
     if (parent is AssignmentExpression && parent.leftHandSide == node) {
       return parent.readElement;
@@ -78,7 +77,7 @@
     }
   }
 
-  static DartType _readType(SimpleIdentifier node) {
+  static DartType? _readType(SimpleIdentifier node) {
     var parent = node.parent;
     if (parent is AssignmentExpression && parent.leftHandSide == node) {
       return parent.readType;
@@ -96,12 +95,12 @@
   const _TypePromotionDataInterpreter();
 
   @override
-  String getText(DartType actualData, [String indentation]) {
+  String getText(DartType actualData, [String? indentation]) {
     return actualData.getDisplayString(withNullability: true);
   }
 
   @override
-  String isAsExpected(DartType actualData, String expectedData) {
+  String? isAsExpected(DartType actualData, String? expectedData) {
     var actualDataText = getText(actualData);
     if (actualDataText == expectedData) {
       return null;
@@ -111,5 +110,5 @@
   }
 
   @override
-  bool isEmpty(DartType actualData) => actualData == null;
+  bool isEmpty(DartType? actualData) => actualData == null;
 }
diff --git a/pkg/analyzer/test/instrumentation/instrumentation_test.dart b/pkg/analyzer/test/instrumentation/instrumentation_test.dart
index b6b4af5..8ed202b 100644
--- a/pkg/analyzer/test/instrumentation/instrumentation_test.dart
+++ b/pkg/analyzer/test/instrumentation/instrumentation_test.dart
@@ -177,7 +177,7 @@
 class MulticastInstrumentationServerTest {
   TestInstrumentationLogger loggerA = TestInstrumentationLogger();
   TestInstrumentationLogger loggerB = TestInstrumentationLogger();
-  MulticastInstrumentationService logger;
+  late final MulticastInstrumentationService logger;
 
   void setUp() {
     logger = MulticastInstrumentationService([
diff --git a/pkg/analyzer/test/resource_utils.dart b/pkg/analyzer/test/resource_utils.dart
index c38b139..d51194e 100644
--- a/pkg/analyzer/test/resource_utils.dart
+++ b/pkg/analyzer/test/resource_utils.dart
@@ -97,7 +97,7 @@
 
   @override
   Folder getStateLocation(String pluginId) =>
-      _provider.getStateLocation(pluginId);
+      _provider.getStateLocation(pluginId)!;
 
   /// Assert that the given path is valid for the OS platform on which the
   /// tests are running.
diff --git a/pkg/analyzer/test/source/analysis_options_provider_test.dart b/pkg/analyzer/test/source/analysis_options_provider_test.dart
index 810d8d2..ae41532 100644
--- a/pkg/analyzer/test/source/analysis_options_provider_test.dart
+++ b/pkg/analyzer/test/source/analysis_options_provider_test.dart
@@ -101,10 +101,10 @@
 
 @reflectiveTest
 class AnalysisOptionsProviderTest {
-  /*late*/ TestPathTranslator pathTranslator;
-  /*late*/ ResourceProvider resourceProvider;
+  late final TestPathTranslator pathTranslator;
+  late final ResourceProvider resourceProvider;
 
-  /*late*/ AnalysisOptionsProvider provider;
+  late final AnalysisOptionsProvider provider;
 
   String get optionsFileName => AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE;
 
@@ -232,7 +232,7 @@
   }
 
   YamlMap _getOptions(String posixPath, {bool crawlUp = false}) {
-    Resource resource = pathTranslator.getResource(posixPath);
+    var resource = pathTranslator.getResource(posixPath) as Folder;
     return provider.getOptions(resource, crawlUp: crawlUp);
   }
 }
diff --git a/pkg/analyzer/test/source/error_processor_test.dart b/pkg/analyzer/test/source/error_processor_test.dart
index 2a58d77..d9a581f 100644
--- a/pkg/analyzer/test/source/error_processor_test.dart
+++ b/pkg/analyzer/test/source/error_processor_test.dart
@@ -10,7 +10,9 @@
 import 'package:analyzer/src/dart/analysis/session.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/task/options.dart';
+import 'package:collection/collection.dart';
 import 'package:test/test.dart';
 import 'package:yaml/yaml.dart';
 
@@ -58,8 +60,8 @@
     unused_local_variable: true # skipped
     use_of_void_result: unsupported_action # skipped
 ''');
-      expect(getProcessor(invalid_assignment).severity, ErrorSeverity.ERROR);
-      expect(getProcessor(missing_return).severity, isNull);
+      expect(getProcessor(invalid_assignment)!.severity, ErrorSeverity.ERROR);
+      expect(getProcessor(missing_return)!.severity, isNull);
       expect(getProcessor(unused_local_variable), isNull);
       expect(getProcessor(use_of_void_result), isNull);
     });
@@ -100,9 +102,8 @@
         expect(unusedLocalProcessor.severity, ErrorSeverity.ERROR);
 
         // skip
-        var invalidAssignmentProcessor = errorConfig.processors.firstWhere(
-            (p) => p.appliesTo(invalid_assignment),
-            orElse: () => null);
+        var invalidAssignmentProcessor = errorConfig.processors
+            .firstWhereOrNull((p) => p.appliesTo(invalid_assignment));
         expect(invalidAssignmentProcessor, isNull);
       });
 
@@ -126,9 +127,8 @@
         expect(unusedLocalProcessor.severity, ErrorSeverity.ERROR);
 
         // skip
-        var invalidAssignmentProcessor = errorConfig.processors.firstWhere(
-            (p) => p.appliesTo(invalid_assignment),
-            orElse: () => null);
+        var invalidAssignmentProcessor = errorConfig.processors
+            .firstWhereOrNull((p) => p.appliesTo(invalid_assignment));
         expect(invalidAssignmentProcessor, isNull);
       });
     });
@@ -146,17 +146,16 @@
   });
 }
 
-TestContext context;
+late TestContext context;
 
 AnalysisOptionsProvider optionsProvider = AnalysisOptionsProvider();
-ErrorProcessor processor;
 
 void configureOptions(String options) {
   YamlMap optionMap = optionsProvider.getOptionsFromString(options);
   applyToAnalysisOptions(context.analysisOptions, optionMap);
 }
 
-ErrorProcessor getProcessor(AnalysisError error) =>
+ErrorProcessor? getProcessor(AnalysisError error) =>
     ErrorProcessor.getProcessor(context.analysisOptions, error);
 
 class TestContext extends AnalysisContextImpl {
@@ -166,6 +165,11 @@
             AnalysisOptionsImpl(),
             DeclaredVariables(),
           ),
-          null,
+          _SourceFactoryMock(),
         );
 }
+
+class _SourceFactoryMock implements SourceFactory {
+  @override
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
diff --git a/pkg/analyzer/test/source/package_map_resolver_test.dart b/pkg/analyzer/test/source/package_map_resolver_test.dart
index db9a3d1..faa7e02 100644
--- a/pkg/analyzer/test/source/package_map_resolver_test.dart
+++ b/pkg/analyzer/test/source/package_map_resolver_test.dart
@@ -39,24 +39,12 @@
     expect(PackageMapUriResolver.isPackageUri(uri), isFalse);
   }
 
-  void test_new_null_packageMap() {
-    expect(() {
-      PackageMapUriResolver(provider, null);
-    }, throwsArgumentError);
-  }
-
-  void test_new_null_resourceProvider() {
-    expect(() {
-      PackageMapUriResolver(null, <String, List<Folder>>{});
-    }, throwsArgumentError);
-  }
-
   void test_resolve_multiple_folders() {
     var a = provider.newFile(provider.convertPath('/aaa/a.dart'), '');
     var b = provider.newFile(provider.convertPath('/bbb/b.dart'), '');
     expect(() {
       PackageMapUriResolver(provider, <String, List<Folder>>{
-        'pkg': <Folder>[a.parent, b.parent]
+        'pkg': <Folder>[a.parent!, b.parent!]
       });
     }, throwsArgumentError);
   }
@@ -64,7 +52,7 @@
   void test_resolve_nonPackage() {
     UriResolver resolver = PackageMapUriResolver(provider, EMPTY_MAP);
     Uri uri = Uri.parse('dart:core');
-    Source result = resolver.resolveAbsolute(uri);
+    var result = resolver.resolveAbsolute(uri);
     expect(result, isNull);
   }
 
@@ -75,21 +63,19 @@
     provider.newFile(pkgFileB, 'library lib_b;');
     PackageMapUriResolver resolver =
         PackageMapUriResolver(provider, <String, List<Folder>>{
-      'pkgA': <Folder>[provider.getResource(provider.convertPath('/pkgA/lib'))],
-      'pkgB': <Folder>[provider.getResource(provider.convertPath('/pkgB/lib'))]
+      'pkgA': <Folder>[provider.getFolder(provider.convertPath('/pkgA/lib'))],
+      'pkgB': <Folder>[provider.getFolder(provider.convertPath('/pkgB/lib'))]
     });
     {
       Uri uri = Uri.parse('package:pkgA/libA.dart');
-      Source result = resolver.resolveAbsolute(uri);
-      expect(result, isNotNull);
+      var result = resolver.resolveAbsolute(uri)!;
       expect(result.exists(), isTrue);
       expect(result.uriKind, UriKind.PACKAGE_URI);
       expect(result.fullName, pkgFileA);
     }
     {
       Uri uri = Uri.parse('package:pkgB/libB.dart');
-      Source result = resolver.resolveAbsolute(uri);
-      expect(result, isNotNull);
+      var result = resolver.resolveAbsolute(uri)!;
       expect(result.exists(), isTrue);
       expect(result.uriKind, UriKind.PACKAGE_URI);
       expect(result.fullName, pkgFileB);
@@ -106,7 +92,7 @@
     });
 
     var uri = Uri.parse('package:aaa/проба/a.dart');
-    var result = resolver.resolveAbsolute(uri);
+    var result = resolver.resolveAbsolute(uri)!;
     expect(
       result.fullName,
       provider.convertPath('/packages/aaa/lib/проба/a.dart'),
@@ -123,7 +109,7 @@
     });
 
     var uri = Uri.parse('package:aaa/with space/a.dart');
-    var result = resolver.resolveAbsolute(uri);
+    var result = resolver.resolveAbsolute(uri)!;
     expect(
       result.fullName,
       provider.convertPath('/packages/aaa/lib/with space/a.dart'),
@@ -133,28 +119,28 @@
   void test_resolve_package_invalid_leadingSlash() {
     UriResolver resolver = PackageMapUriResolver(provider, EMPTY_MAP);
     Uri uri = Uri.parse('package:/foo');
-    Source result = resolver.resolveAbsolute(uri);
+    var result = resolver.resolveAbsolute(uri);
     expect(result, isNull);
   }
 
   void test_resolve_package_invalid_noSlash() {
     UriResolver resolver = PackageMapUriResolver(provider, EMPTY_MAP);
     Uri uri = Uri.parse('package:foo');
-    Source result = resolver.resolveAbsolute(uri);
+    var result = resolver.resolveAbsolute(uri);
     expect(result, isNull);
   }
 
   void test_resolve_package_invalid_onlySlash() {
     UriResolver resolver = PackageMapUriResolver(provider, EMPTY_MAP);
     Uri uri = Uri.parse('package:/');
-    Source result = resolver.resolveAbsolute(uri);
+    var result = resolver.resolveAbsolute(uri);
     expect(result, isNull);
   }
 
   void test_resolve_package_notInMap() {
     UriResolver resolver = PackageMapUriResolver(provider, EMPTY_MAP);
     Uri uri = Uri.parse('package:analyzer/analyzer.dart');
-    Source result = resolver.resolveAbsolute(uri);
+    var result = resolver.resolveAbsolute(uri);
     expect(result, isNull);
   }
 
@@ -165,26 +151,24 @@
     provider.newFile(pkgFileB, 'library lib_b;');
     PackageMapUriResolver resolver =
         PackageMapUriResolver(provider, <String, List<Folder>>{
-      'pkgA': <Folder>[provider.getResource(provider.convertPath('/pkgA/lib'))],
-      'pkgB': <Folder>[provider.getResource(provider.convertPath('/pkgB/lib'))]
+      'pkgA': <Folder>[provider.getFolder(provider.convertPath('/pkgA/lib'))],
+      'pkgB': <Folder>[provider.getFolder(provider.convertPath('/pkgB/lib'))]
     });
     {
       Source source =
           _createFileSource(provider.convertPath('/pkgA/lib/libA.dart'));
-      Uri uri = resolver.restoreAbsolute(source);
-      expect(uri, isNotNull);
+      var uri = resolver.restoreAbsolute(source)!;
       expect(uri.toString(), 'package:pkgA/libA.dart');
     }
     {
       Source source =
           _createFileSource(provider.convertPath('/pkgB/lib/src/libB.dart'));
-      Uri uri = resolver.restoreAbsolute(source);
-      expect(uri, isNotNull);
+      var uri = resolver.restoreAbsolute(source)!;
       expect(uri.toString(), 'package:pkgB/src/libB.dart');
     }
     {
       Source source = _createFileSource('/no/such/file');
-      Uri uri = resolver.restoreAbsolute(source);
+      var uri = resolver.restoreAbsolute(source);
       expect(uri, isNull);
     }
   }
diff --git a/pkg/analyzer/test/src/command_line/arguments_test.dart b/pkg/analyzer/test/src/command_line/arguments_test.dart
index 4f8ada1..83b2bda 100644
--- a/pkg/analyzer/test/src/command_line/arguments_test.dart
+++ b/pkg/analyzer/test/src/command_line/arguments_test.dart
@@ -51,12 +51,12 @@
       endsWith(dartSdkSummaryPath),
     );
 
-    Map<String, String> declaredVariables = options.declaredVariables;
+    var declaredVariables = options.declaredVariables;
     expect(declaredVariables, hasLength(2));
     expect(declaredVariables['foo'], '1');
     expect(declaredVariables['bar'], '2');
 
-    AnalysisOptionsImpl defaultOptions = options.defaultOptions;
+    var defaultOptions = options.defaultOptions as AnalysisOptionsImpl;
     expect(defaultOptions, isNotNull);
     expect(defaultOptions.implicitCasts, false);
     expect(defaultOptions.implicitDynamic, false);
@@ -74,7 +74,7 @@
     expect(options.declaredVariables, isEmpty);
     expect(options.defaultAnalysisOptionsFilePath, isNull);
     expect(options.defaultPackageFilePath, isNull);
-    AnalysisOptionsImpl defaultOptions = options.defaultOptions;
+    var defaultOptions = options.defaultOptions as AnalysisOptionsImpl;
     expect(defaultOptions, isNotNull);
     expect(defaultOptions.implicitCasts, true);
     expect(defaultOptions.implicitDynamic, true);
@@ -122,7 +122,7 @@
     ContextBuilderOptions options =
         createContextBuilderOptions(resourceProvider, result);
     expect(options, isNotNull);
-    AnalysisOptionsImpl defaultOptions = options.defaultOptions;
+    var defaultOptions = options.defaultOptions as AnalysisOptionsImpl;
     expect(defaultOptions, isNotNull);
     expect(defaultOptions.implicitCasts, true);
   }
@@ -137,7 +137,7 @@
     ContextBuilderOptions options =
         createContextBuilderOptions(resourceProvider, result);
     expect(options, isNotNull);
-    AnalysisOptionsImpl defaultOptions = options.defaultOptions;
+    var defaultOptions = options.defaultOptions as AnalysisOptionsImpl;
     expect(defaultOptions, isNotNull);
     expect(defaultOptions.implicitCasts, false);
   }
diff --git a/pkg/analyzer/test/src/context/builder_test.dart b/pkg/analyzer/test/src/context/builder_test.dart
index 588e22f..5f911df 100644
--- a/pkg/analyzer/test/src/context/builder_test.dart
+++ b/pkg/analyzer/test/src/context/builder_test.dart
@@ -42,25 +42,25 @@
 @reflectiveTest
 class ContextBuilderTest with ResourceProviderMixin {
   /// The SDK manager used by the tests;
-  DartSdkManager sdkManager;
+  late final DartSdkManager sdkManager;
 
   /// The content cache used by the tests.
-  ContentCache contentCache;
+  late final ContentCache contentCache;
 
   /// The options passed to the context builder.
   ContextBuilderOptions builderOptions = ContextBuilderOptions();
 
   /// The context builder to be used in the test.
-  ContextBuilder builder;
+  late ContextBuilder builder;
 
   /// The path to the default SDK, or `null` if the test has not explicitly
   /// invoked [createDefaultSdk].
-  String defaultSdkPath;
+  late final String defaultSdkPath;
 
-  _MockLintRule _mockLintRule;
-  _MockLintRule _mockLintRule2;
-  _MockLintRule _mockLintRule3;
-  _MockLintRule _mockPublicMemberApiDocs;
+  late final _MockLintRule _mockLintRule;
+  late final _MockLintRule _mockLintRule2;
+  late final _MockLintRule _mockLintRule3;
+  late final _MockLintRule _mockPublicMemberApiDocs;
 
   Uri convertedDirectoryUri(String directoryPath) {
     return Uri.directory(convertPath(directoryPath),
@@ -100,7 +100,7 @@
     AnalysisOptionsImpl expected = AnalysisOptionsImpl();
     expected.lint = true;
     expected.lintRules = <LintRule>[
-      Registry.ruleRegistry['mock_lint_rule'],
+      Registry.ruleRegistry['mock_lint_rule']!,
     ];
 
     String path = convertPath('/some/directory/path');
@@ -111,7 +111,7 @@
     - mock_lint_rule
 ''');
 
-    AnalysisOptions options = builder.getAnalysisOptions(path);
+    var options = builder.getAnalysisOptions(path);
     _expectEqualOptions(options, expected);
   }
 
@@ -125,7 +125,7 @@
     AnalysisOptionsImpl expected = AnalysisOptionsImpl();
     expected.lint = false;
     expected.lintRules = <LintRule>[
-      Registry.ruleRegistry['mock_lint_rule'],
+      Registry.ruleRegistry['mock_lint_rule']!,
     ];
 
     String path = convertPath('/some/directory/path');
@@ -136,7 +136,7 @@
     - mock_lint_rule
 ''');
 
-    AnalysisOptions options = builder.getAnalysisOptions(path);
+    var options = builder.getAnalysisOptions(path);
     _expectEqualOptions(options, expected);
   }
 
@@ -150,7 +150,7 @@
     AnalysisOptionsImpl expected = AnalysisOptionsImpl();
     expected.lint = true;
     expected.lintRules = <LintRule>[
-      Registry.ruleRegistry['mock_lint_rule'],
+      Registry.ruleRegistry['mock_lint_rule']!,
     ];
 
     String path = convertPath('/some/directory/path');
@@ -161,7 +161,7 @@
     - mock_lint_rule
 ''');
 
-    AnalysisOptions options = builder.getAnalysisOptions(path);
+    var options = builder.getAnalysisOptions(path);
     _expectEqualOptions(options, expected);
   }
 
@@ -181,7 +181,7 @@
     newFile(filePath, content: '''
 ''');
 
-    AnalysisOptions options = builder.getAnalysisOptions(path);
+    var options = builder.getAnalysisOptions(path);
     _expectEqualOptions(options, expected);
   }
 
@@ -216,12 +216,12 @@
     AnalysisOptionsImpl defaultOptions = AnalysisOptionsImpl();
     defaultOptions.implicitCasts = !defaultOptions.implicitCasts;
     builderOptions.defaultOptions = defaultOptions;
-    AnalysisOptions options = builder.createDefaultOptions();
+    var options = builder.createDefaultOptions();
     _expectEqualOptions(options, defaultOptions);
   }
 
   void test_createDefaultOptions_noDefault() {
-    AnalysisOptions options = builder.createDefaultOptions();
+    var options = builder.createDefaultOptions();
     _expectEqualOptions(options, AnalysisOptionsImpl());
   }
 
@@ -309,7 +309,7 @@
     newFolder('/workspace/bazel-genfiles');
     newFolder(projectPath);
 
-    SourceFactoryImpl factory = builder.createSourceFactory(projectPath);
+    var factory = builder.createSourceFactory(projectPath) as SourceFactoryImpl;
     expect(factory.resolvers,
         contains(predicate((r) => r is BazelFileUriResolver)));
     expect(factory.resolvers,
@@ -324,7 +324,7 @@
     newFolder(projectPath);
     newFile(join(projectPath, '.packages'));
 
-    SourceFactoryImpl factory = builder.createSourceFactory(projectPath);
+    var factory = builder.createSourceFactory(projectPath) as SourceFactoryImpl;
     expect(factory.resolvers,
         contains(predicate((r) => r is ResourceUriResolver)));
     expect(factory.resolvers,
@@ -355,11 +355,11 @@
 
     SourceFactory factory = builder.createSourceFactory(projectPath);
 
-    Source dartSource = factory.forUri('dart:async');
+    var dartSource = factory.forUri('dart:async')!;
     expect(dartSource, isNotNull);
     expect(dartSource.fullName, asyncPath);
 
-    Source packageSource = factory.forUri('package:b/b.dart');
+    var packageSource = factory.forUri('package:b/b.dart')!;
     expect(packageSource, isNotNull);
     expect(packageSource.fullName, join(packageB, 'b.dart'));
   }
@@ -383,12 +383,12 @@
 
     SourceFactory factory = builder.createSourceFactory(projectPath);
 
-    Source dartSource = factory.forUri('dart:core');
+    var dartSource = factory.forUri('dart:core')!;
     expect(dartSource, isNotNull);
     expect(
         dartSource.fullName, join(defaultSdkPath, 'lib', 'core', 'core.dart'));
 
-    Source packageSource = factory.forUri('package:a/a.dart');
+    var packageSource = factory.forUri('package:a/a.dart')!;
     expect(packageSource, isNotNull);
     expect(packageSource.fullName, join(packageA, 'a.dart'));
   }
@@ -491,7 +491,7 @@
   void test_findSdk_noPackageMap_html_strong() {
     DartSdk sdk = builder.findSdk(null);
     expect(sdk, isNotNull);
-    Source htmlSource = sdk.mapDartUri('dart:html');
+    Source htmlSource = sdk.mapDartUri('dart:html')!;
     expect(htmlSource.fullName,
         convertPath('/sdk/lib/html/dart2js/html_dart2js.dart'));
     expect(htmlSource.exists(), isTrue);
@@ -515,8 +515,7 @@
   rules:
     - mock_lint_rule2
 ''');
-    AnalysisOptions options =
-        builder.getAnalysisOptions(convertPath('/root/some/path'));
+    var options = builder.getAnalysisOptions(convertPath('/root/some/path'));
     _expectEqualOptions(options, expected);
   }
 
@@ -537,7 +536,7 @@
     - mock_lint_rule
 ''');
     String projectPath = convertPath('/some/directory/path');
-    AnalysisOptions options = builder.getAnalysisOptions(projectPath);
+    var options = builder.getAnalysisOptions(projectPath);
     _expectEqualOptions(options, expected);
   }
 
@@ -553,7 +552,7 @@
     - non_existent_lint_rule
 ''');
 
-    AnalysisOptions options = builder.getAnalysisOptions(path);
+    var options = builder.getAnalysisOptions(path);
     _expectEqualOptions(options, expected);
   }
 
@@ -571,7 +570,7 @@
     implicit-dynamic: false
 ''');
 
-    AnalysisOptions options = builder.getAnalysisOptions(path);
+    var options = builder.getAnalysisOptions(path);
     _expectEqualOptions(options, expected);
   }
 
@@ -589,7 +588,7 @@
     builder = ContextBuilder(resourceProvider, sdkManager, contentCache,
         options: builderOptions);
     AnalysisOptionsImpl expected = AnalysisOptionsImpl();
-    AnalysisOptions options = builder.getAnalysisOptions(projectPath);
+    var options = builder.getAnalysisOptions(projectPath);
     _expectEqualOptions(options, expected);
   }
 
@@ -627,7 +626,7 @@
     - mock_lint_rule
 ''');
 
-    AnalysisOptions options = builder.getAnalysisOptions(path);
+    var options = builder.getAnalysisOptions(path);
     _expectEqualOptions(options, expected);
   }
 
@@ -649,7 +648,7 @@
     - non_existent_lint_rule
 ''');
 
-    AnalysisOptions options = builder.getAnalysisOptions(path);
+    var options = builder.getAnalysisOptions(path);
     _expectEqualOptions(options, AnalysisOptionsImpl());
   }
 
@@ -664,7 +663,7 @@
     implicit-dynamic: false
 ''');
 
-    AnalysisOptions options = builder.getAnalysisOptions(path);
+    var options = builder.getAnalysisOptions(path);
     _expectEqualOptions(options, expected);
   }
 
@@ -706,7 +705,7 @@
     newFile(filePath);
 
     builderOptions.defaultAnalysisOptionsFilePath = filePath;
-    File result = builder.getOptionsFile(path);
+    var result = builder.getOptionsFile(path)!;
     expect(result, isNotNull);
     expect(result.path, filePath);
   }
@@ -718,7 +717,7 @@
         join(parentPath, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
     newFile(filePath);
 
-    File result = builder.getOptionsFile(path);
+    var result = builder.getOptionsFile(path)!;
     expect(result, isNotNull);
     expect(result.path, filePath);
   }
@@ -728,7 +727,7 @@
     String filePath = join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
     newFile(filePath);
 
-    File result = builder.getOptionsFile(path);
+    var result = builder.getOptionsFile(path)!;
     expect(result, isNotNull);
     expect(result.path, filePath);
   }
@@ -738,7 +737,7 @@
     expect(packages.packages, hasLength(nameToPath.length));
     for (var name in nameToPath.keys) {
       var expectedPath = nameToPath[name];
-      var path = packages[name].libFolder.path;
+      var path = packages[name]!.libFolder.path;
       expect(path, expectedPath, reason: 'package $name');
     }
   }
@@ -770,7 +769,7 @@
     expect(actual.strictRawTypes, expected.strictRawTypes);
   }
 
-  Uri _relativeUri(String path, {String from}) {
+  Uri _relativeUri(String path, {String? from}) {
     var pathContext = resourceProvider.pathContext;
     String relativePath = pathContext.relative(path, from: from);
     return pathContext.toUri(relativePath);
@@ -781,20 +780,23 @@
 class EmbedderYamlLocatorTest extends EmbedderRelatedTest {
   void test_empty() {
     EmbedderYamlLocator locator = EmbedderYamlLocator({
-      'fox': <Folder>[pathTranslator.getResource(emptyPath)]
+      'fox': <Folder>[pathTranslator.getResource(emptyPath) as Folder]
     });
     expect(locator.embedderYamls, hasLength(0));
   }
 
   void test_invalid() {
     EmbedderYamlLocator locator = EmbedderYamlLocator(null);
-    locator.addEmbedderYaml(null, r'''{{{,{{}}},}}''');
+    locator.addEmbedderYaml(
+      pathTranslator.getResource(foxLib) as Folder,
+      r'''{{{,{{}}},}}''',
+    );
     expect(locator.embedderYamls, hasLength(0));
   }
 
   void test_valid() {
     EmbedderYamlLocator locator = EmbedderYamlLocator({
-      'fox': <Folder>[pathTranslator.getResource(foxLib)]
+      'fox': <Folder>[pathTranslator.getResource(foxLib) as Folder]
     });
     expect(locator.embedderYamls, hasLength(1));
   }
diff --git a/pkg/analyzer/test/src/context/package_config_json_test.dart b/pkg/analyzer/test/src/context/package_config_json_test.dart
index f1e2b45..382d4ce 100644
--- a/pkg/analyzer/test/src/context/package_config_json_test.dart
+++ b/pkg/analyzer/test/src/context/package_config_json_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:analyzer/src/context/package_config_json.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
-import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -86,18 +85,20 @@
   "generatorVersion": "2.8.0-edge.28b0f1839726c0743e25a2765c5322a24f6e2afa"
 }
 ''');
-    expect(config.generated.year, 2019);
-    expect(config.generated.month, 12);
-    expect(config.generated.day, 10);
-    expect(config.generated.hour, 18);
-    expect(config.generated.minute, 29);
-    expect(config.generated.second, 14);
+    var generated = config.generated!;
+    expect(generated.year, 2019);
+    expect(generated.month, 12);
+    expect(generated.day, 10);
+    expect(generated.hour, 18);
+    expect(generated.minute, 29);
+    expect(generated.second, 14);
 
     expect(config.generator, 'pub');
 
-    expect(config.generatorVersion.major, 2);
-    expect(config.generatorVersion.minor, 8);
-    expect(config.generatorVersion.patch, 0);
+    var generatorVersion = config.generatorVersion!;
+    expect(generatorVersion.major, 2);
+    expect(generatorVersion.minor, 8);
+    expect(generatorVersion.patch, 0);
   }
 
   test_packages() {
@@ -320,12 +321,12 @@
   final String name;
   final String rootUriPath;
   final String packageUriPath;
-  final LanguageVersion languageVersion;
+  final LanguageVersion? languageVersion;
 
   _ExpectedPackage({
-    @required this.name,
-    @required this.rootUriPath,
-    @required this.packageUriPath,
-    @required this.languageVersion,
+    required this.name,
+    required this.rootUriPath,
+    required this.packageUriPath,
+    required this.languageVersion,
   });
 }
diff --git a/pkg/analyzer/test/src/context/packages_test.dart b/pkg/analyzer/test/src/context/packages_test.dart
index 0313bbc..204ca42 100644
--- a/pkg/analyzer/test/src/context/packages_test.dart
+++ b/pkg/analyzer/test/src/context/packages_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:analyzer/src/context/packages.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
-import 'package:meta/meta.dart';
 import 'package:pub_semver/pub_semver.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -126,7 +125,7 @@
       },
     );
 
-    void check(String posixPath, String expectedPackageName) {
+    void check(String posixPath, String? expectedPackageName) {
       var path = convertPath(posixPath);
       var package = packages.packageForPath(path);
       expect(package?.name, expectedPackageName);
@@ -135,7 +134,7 @@
     check('/home/aaa/lib/a.dart', 'aaa');
     check('/home/aaa/bbb/lib/b.dart', 'bbb');
     check('/home/ccc/lib/c.dart', 'ccc');
-    check('/home/ddd/lib/c.dart', null);
+    check('/home/ddd/lib/d.dart', null);
   }
 
   test_parseDotPackagesFile() {
@@ -313,11 +312,11 @@
 
   void _assertPackage(
     Packages packages, {
-    @required String name,
-    @required String expectedLibPath,
-    @required Version expectedVersion,
+    required String name,
+    required String expectedLibPath,
+    required Version? expectedVersion,
   }) {
-    var package = packages[name];
+    var package = packages[name]!;
     expect(package.name, name);
     expect(package.libFolder.path, convertPath(expectedLibPath));
     expect(package.languageVersion, expectedVersion);
diff --git a/pkg/analyzer/test/src/dart/analysis/analysis_context_collection_test.dart b/pkg/analyzer/test/src/dart/analysis/analysis_context_collection_test.dart
index 02eadbe..2cb3c25 100644
--- a/pkg/analyzer/test/src/dart/analysis/analysis_context_collection_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/analysis_context_collection_test.dart
@@ -5,7 +5,6 @@
 import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart';
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
-import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -108,7 +107,7 @@
   }
 
   AnalysisContextCollectionImpl _newCollection(
-      {@required List<String> includedPaths}) {
+      {required List<String> includedPaths}) {
     return AnalysisContextCollectionImpl(
       resourceProvider: resourceProvider,
       includedPaths: includedPaths,
diff --git a/pkg/analyzer/test/src/dart/analysis/base.dart b/pkg/analyzer/test/src/dart/analysis/base.dart
index 91a5398..c262ddd 100644
--- a/pkg/analyzer/test/src/dart/analysis/base.dart
+++ b/pkg/analyzer/test/src/dart/analysis/base.dart
@@ -24,25 +24,25 @@
 import 'package:test/test.dart';
 
 class BaseAnalysisDriverTest with ResourceProviderMixin {
-  DartSdk sdk;
+  late final DartSdk sdk;
   final ByteStore byteStore = MemoryByteStore();
   final FileContentOverlay contentOverlay = FileContentOverlay();
 
   final StringBuffer logBuffer = StringBuffer();
-  PerformanceLog logger;
+  late final PerformanceLog logger;
 
   final _GeneratedUriResolverMock generatedUriResolver =
       _GeneratedUriResolverMock();
-  AnalysisDriverScheduler scheduler;
-  AnalysisDriver driver;
+  late final AnalysisDriverScheduler scheduler;
+  late final AnalysisDriver driver;
   final List<AnalysisStatus> allStatuses = <AnalysisStatus>[];
   final List<ResolvedUnitResult> allResults = <ResolvedUnitResult>[];
   final List<ExceptionResult> allExceptions = <ExceptionResult>[];
 
-  String testProject;
-  String testProject2;
-  String testFile;
-  String testCode;
+  late final String testProject;
+  late final String testProject2;
+  late final String testFile;
+  late final String testCode;
 
   List<String> enabledExperiments = [];
 
@@ -56,8 +56,8 @@
   }
 
   AnalysisDriver createAnalysisDriver(
-      {Map<String, List<Folder>> packageMap,
-      SummaryDataStore externalSummaries}) {
+      {Map<String, List<Folder>>? packageMap,
+      SummaryDataStore? externalSummaries}) {
     packageMap ??= <String, List<Folder>>{
       'test': [getFolder('$testProject/lib')],
       'aaa': [getFolder('/aaa/lib')],
@@ -155,9 +155,9 @@
 }
 
 class _GeneratedUriResolverMock implements UriResolver {
-  Source Function(Uri, Uri) resolveAbsoluteFunction;
+  Source? Function(Uri, Uri?)? resolveAbsoluteFunction;
 
-  Uri Function(Source) restoreAbsoluteFunction;
+  Uri? Function(Source)? restoreAbsoluteFunction;
 
   @override
   void clearCache() {}
@@ -168,17 +168,17 @@
   }
 
   @override
-  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
+  Source? resolveAbsolute(Uri uri, [Uri? actualUri]) {
     if (resolveAbsoluteFunction != null) {
-      return resolveAbsoluteFunction(uri, actualUri);
+      return resolveAbsoluteFunction!(uri, actualUri);
     }
     return null;
   }
 
   @override
-  Uri restoreAbsolute(Source source) {
+  Uri? restoreAbsolute(Source source) {
     if (restoreAbsoluteFunction != null) {
-      return restoreAbsoluteFunction(source);
+      return restoreAbsoluteFunction!(source);
     }
     return null;
   }
diff --git a/pkg/analyzer/test/src/dart/analysis/byte_store_test.dart b/pkg/analyzer/test/src/dart/analysis/byte_store_test.dart
index 42bc17b..47202d9 100644
--- a/pkg/analyzer/test/src/dart/analysis/byte_store_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/byte_store_test.dart
@@ -14,7 +14,7 @@
 }
 
 List<int> _b(int length) {
-  return List<int>.filled(length, null);
+  return List<int>.filled(length, 0);
 }
 
 @reflectiveTest
diff --git a/pkg/analyzer/test/src/dart/analysis/cache_test.dart b/pkg/analyzer/test/src/dart/analysis/cache_test.dart
index b966f63..9a6cac3 100644
--- a/pkg/analyzer/test/src/dart/analysis/cache_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/cache_test.dart
@@ -13,7 +13,7 @@
 }
 
 List<int> _b(int length) {
-  return List<int>.filled(length, null);
+  return List<int>.filled(length, 0);
 }
 
 @reflectiveTest
@@ -97,5 +97,5 @@
   Cache<String, List<int>> _newBytesCache(int maxSizeBytes) =>
       Cache<String, List<int>>(maxSizeBytes, (bytes) => bytes.length);
 
-  static List<int> _noBytes() => null;
+  static List<int>? _noBytes() => null;
 }
diff --git a/pkg/analyzer/test/src/dart/analysis/context_builder_test.dart b/pkg/analyzer/test/src/dart/analysis/context_builder_test.dart
index 439d445..bf798bc 100644
--- a/pkg/analyzer/test/src/dart/analysis/context_builder_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/context_builder_test.dart
@@ -21,8 +21,8 @@
 
 @reflectiveTest
 class ContextBuilderImplTest with ResourceProviderMixin {
-  ContextBuilderImpl contextBuilder;
-  ContextRoot contextRoot;
+  late final ContextBuilderImpl contextBuilder;
+  late final ContextRoot contextRoot;
 
   void assertEquals(DeclaredVariables actual, DeclaredVariables expected) {
     Iterable<String> actualNames = actual.variableNames;
@@ -43,11 +43,11 @@
     MockSdk(resourceProvider: resourceProvider);
     DeclaredVariables declaredVariables =
         DeclaredVariables.fromMap({'foo': 'true'});
-    DriverBasedAnalysisContext context = contextBuilder.createContext(
+    var context = contextBuilder.createContext(
       contextRoot: contextRoot,
       declaredVariables: declaredVariables,
       sdkPath: resourceProvider.convertPath(sdkRoot),
-    );
+    ) as DriverBasedAnalysisContext;
     expect(context.analysisOptions, isNotNull);
     expect(context.contextRoot, contextRoot);
     assertEquals(context.driver.declaredVariables, declaredVariables);
@@ -57,14 +57,15 @@
     DeclaredVariables declaredVariables =
         DeclaredVariables.fromMap({'bar': 'true'});
     MockSdk sdk = MockSdk(resourceProvider: resourceProvider);
-    DriverBasedAnalysisContext context = contextBuilder.createContext(
-        contextRoot: contextRoot,
-        declaredVariables: declaredVariables,
-        sdkPath: resourceProvider.convertPath(sdkRoot));
+    var context = contextBuilder.createContext(
+            contextRoot: contextRoot,
+            declaredVariables: declaredVariables,
+            sdkPath: resourceProvider.convertPath(sdkRoot))
+        as DriverBasedAnalysisContext;
     expect(context.analysisOptions, isNotNull);
     expect(context.contextRoot, contextRoot);
     assertEquals(context.driver.declaredVariables, declaredVariables);
-    expect(context.driver.sourceFactory.dartSdk.mapDartUri('dart:core'),
+    expect(context.driver.sourceFactory.dartSdk!.mapDartUri('dart:core'),
         sdk.mapDartUri('dart:core'));
   }
 
@@ -80,12 +81,13 @@
 
   test_createContext_sdkPath() {
     MockSdk sdk = MockSdk(resourceProvider: resourceProvider);
-    DriverBasedAnalysisContext context = contextBuilder.createContext(
-        contextRoot: contextRoot,
-        sdkPath: resourceProvider.convertPath(sdkRoot));
+    var context = contextBuilder.createContext(
+            contextRoot: contextRoot,
+            sdkPath: resourceProvider.convertPath(sdkRoot))
+        as DriverBasedAnalysisContext;
     expect(context.analysisOptions, isNotNull);
     expect(context.contextRoot, contextRoot);
-    expect(context.driver.sourceFactory.dartSdk.mapDartUri('dart:core'),
+    expect(context.driver.sourceFactory.dartSdk!.mapDartUri('dart:core'),
         sdk.mapDartUri('dart:core'));
   }
 
diff --git a/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart b/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart
index df58649..560bb58 100644
--- a/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart
@@ -17,7 +17,7 @@
 
 @reflectiveTest
 class ContextLocatorImplTest with ResourceProviderMixin {
-  ContextLocatorImpl contextLocator;
+  late final ContextLocatorImpl contextLocator;
 
   ContextRoot findRoot(List<ContextRoot> roots, Resource rootFolder) {
     for (ContextRoot root in roots) {
@@ -120,7 +120,7 @@
     expect(outer1Root.optionsFile, outer1OptionsFile);
     expect(outer1Root.packagesFile, outer1PackagesFile);
 
-    ContextRoot outer2Root = findRoot(roots, testFile.parent);
+    ContextRoot outer2Root = findRoot(roots, testFile.parent!);
     expect(outer2Root.includedPaths, unorderedEquals([testFile.path]));
     expect(outer2Root.excludedPaths, isEmpty);
     expect(outer2Root.optionsFile, outer2OptionsFile);
@@ -369,7 +369,7 @@
     expect(
       outerRoot.excludedPaths,
       unorderedEquals([
-        outerPackagesFile.parent.path,
+        outerPackagesFile.parent!.path,
         innerRootFolder.path,
       ]),
     );
@@ -381,7 +381,7 @@
     expect(
       innerRoot.excludedPaths,
       unorderedEquals([
-        innerPackagesFile.parent.path,
+        innerPackagesFile.parent!.path,
       ]),
     );
     expect(innerRoot.optionsFile, outerOptionsFile);
@@ -471,7 +471,7 @@
     ContextRoot outerRoot = findRoot(roots, outerRootFolder);
     expect(outerRoot.includedPaths, unorderedEquals([outerRootFolder.path]));
     expect(outerRoot.excludedPaths,
-        unorderedEquals([innerOptionsFile.parent.path]));
+        unorderedEquals([innerOptionsFile.parent!.path]));
     expect(outerRoot.optionsFile, outerOptionsFile);
     expect(outerRoot.packagesFile, outerPackagesFile);
   }
@@ -577,7 +577,7 @@
     expect(
       contentRoot.excludedPaths,
       unorderedEquals(
-        [packageConfigJsonFile.parent.path],
+        [packageConfigJsonFile.parent!.path],
       ),
     );
     expect(contentRoot.optionsFile, optionsFile);
@@ -593,7 +593,7 @@
         contextLocator.locateRoots(includedPaths: [testFile.path]);
     expect(roots, hasLength(1));
 
-    ContextRoot package1Root = findRoot(roots, testFile.parent);
+    ContextRoot package1Root = findRoot(roots, testFile.parent!);
     expect(package1Root.includedPaths, unorderedEquals([testFile.path]));
     expect(package1Root.excludedPaths, isEmpty);
     expect(package1Root.optionsFile, optionsFile);
diff --git a/pkg/analyzer/test/src/dart/analysis/context_root_test.dart b/pkg/analyzer/test/src/dart/analysis/context_root_test.dart
index ce510fe..d640ddd 100644
--- a/pkg/analyzer/test/src/dart/analysis/context_root_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/context_root_test.dart
@@ -16,9 +16,9 @@
 
 @reflectiveTest
 class ContextRootTest with ResourceProviderMixin {
-  String rootPath;
-  Folder rootFolder;
-  ContextRootImpl contextRoot;
+  late final String rootPath;
+  late final Folder rootFolder;
+  late ContextRootImpl contextRoot;
 
   void setUp() {
     rootPath = convertPath('/test/root');
diff --git a/pkg/analyzer/test/src/dart/analysis/dependency/base.dart b/pkg/analyzer/test/src/dart/analysis/dependency/base.dart
index 6c12cef..5581413 100644
--- a/pkg/analyzer/test/src/dart/analysis/dependency/base.dart
+++ b/pkg/analyzer/test/src/dart/analysis/dependency/base.dart
@@ -5,24 +5,23 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/analysis/dependency/library_builder.dart';
 import 'package:analyzer/src/dart/analysis/dependency/node.dart';
-import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 
 import '../../resolution/context_collection_resolution.dart';
 
 class BaseDependencyTest extends PubPackageResolutionTest {
 //  DependencyTracker tracker;
-  String a;
-  String b;
-  String c;
-  Uri aUri;
-  Uri bUri;
-  Uri cUri;
+  late final String a;
+  late final String b;
+  late final String c;
+  late final Uri aUri;
+  late final Uri bUri;
+  late final Uri cUri;
 
   bool hasDartCore = false;
 
   void assertNodes(List<Node> actualNodes, List<ExpectedNode> expectedNodes,
-      {Node expectedEnclosingClass}) {
+      {Node? expectedEnclosingClass}) {
     expect(actualNodes, hasLength(expectedNodes.length));
     for (var expectedNode in expectedNodes) {
       var topNode = _getNode(
@@ -34,7 +33,7 @@
       expect(topNode.enclosingClass, expectedEnclosingClass);
 
       if (expectedNode.classMembers != null) {
-        assertNodes(topNode.classMembers, expectedNode.classMembers,
+        assertNodes(topNode.classMembers!, expectedNode.classMembers!,
             expectedEnclosingClass: topNode);
       } else {
         expect(topNode.classMembers, isNull);
@@ -42,8 +41,8 @@
 
       if (expectedNode.classTypeParameters != null) {
         assertNodes(
-          topNode.classTypeParameters,
-          expectedNode.classTypeParameters,
+          topNode.classTypeParameters!,
+          expectedNode.classTypeParameters!,
           expectedEnclosingClass: topNode,
         );
       } else {
@@ -65,7 +64,7 @@
     driverFor(path).changeFile(path);
 
     var units = await _resolveLibrary(path);
-    var uri = units.first.declaredElement.source.uri;
+    var uri = units.first.declaredElement!.source.uri;
 
     return buildLibrary(uri, units);
 
@@ -78,10 +77,10 @@
   }
 
   Node getNode(Library library,
-      {@required String name,
-      NodeKind kind,
-      String memberOf,
-      String typeParameterOf}) {
+      {required String name,
+      NodeKind? kind,
+      String? memberOf,
+      String? typeParameterOf}) {
     var uri = library.uri;
     var nodes = library.declaredNodes;
     if (memberOf != null) {
@@ -90,11 +89,11 @@
         class_.kind,
         anyOf(NodeKind.CLASS, NodeKind.ENUM, NodeKind.MIXIN),
       );
-      nodes = class_.classMembers;
+      nodes = class_.classMembers!;
     } else if (typeParameterOf != null) {
       var class_ = _getNode(nodes, uri: uri, name: typeParameterOf);
       expect(class_.kind, anyOf(NodeKind.CLASS, NodeKind.MIXIN));
-      nodes = class_.classTypeParameters;
+      nodes = class_.classTypeParameters!;
     }
     return _getNode(nodes, uri: uri, name: name, kind: kind);
   }
@@ -124,7 +123,7 @@
 //  }
 
   Node _getNode(List<Node> nodes,
-      {@required Uri uri, @required String name, NodeKind kind}) {
+      {required Uri uri, required String name, NodeKind? kind}) {
     var nameObj = LibraryQualifiedName(uri, name);
     for (var node in nodes) {
       if (node.name == nameObj) {
@@ -140,7 +139,7 @@
   Future<List<CompilationUnit>> _resolveLibrary(String libraryPath) async {
     var session = contextFor(libraryPath).currentSession;
     var resolvedLibrary = await session.getResolvedLibrary(libraryPath);
-    return resolvedLibrary.units.map((ru) => ru.unit).toList();
+    return resolvedLibrary.units!.map((ru) => ru.unit!).toList();
   }
 }
 
@@ -148,8 +147,8 @@
   final Uri uri;
   final String name;
   final NodeKind kind;
-  final List<ExpectedNode> classMembers;
-  final List<ExpectedNode> classTypeParameters;
+  final List<ExpectedNode>? classMembers;
+  final List<ExpectedNode>? classTypeParameters;
 
   ExpectedNode(
     this.uri,
diff --git a/pkg/analyzer/test/src/dart/analysis/dependency/declared_nodes_test.dart b/pkg/analyzer/test/src/dart/analysis/dependency/declared_nodes_test.dart
index 5fbbf4b..c59eefd 100644
--- a/pkg/analyzer/test/src/dart/analysis/dependency/declared_nodes_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/dependency/declared_nodes_test.dart
@@ -1683,7 +1683,7 @@
 
   Future<void> _assertApiTokenSignatureNotSame(
       String name, NodeKind kind, String codeBefore, String codeAfter,
-      {String memberOf, String typeParameterOf}) async {
+      {String? memberOf, String? typeParameterOf}) async {
     Node getNodeLocal(Library library) {
       return getNode(
         library,
@@ -1708,7 +1708,7 @@
 
   Future<void> _assertApiTokenSignatureSame(
       String name, NodeKind kind, String codeBefore, String codeAfter,
-      {String memberOf, String typeParameterOf}) async {
+      {String? memberOf, String? typeParameterOf}) async {
     Node getNodeLocal(Library library) {
       return getNode(
         library,
diff --git a/pkg/analyzer/test/src/dart/analysis/dependency/reference_collector_test.dart b/pkg/analyzer/test/src/dart/analysis/dependency/reference_collector_test.dart
index 196abda..01ca1e1 100644
--- a/pkg/analyzer/test/src/dart/analysis/dependency/reference_collector_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/dependency/reference_collector_test.dart
@@ -2246,8 +2246,8 @@
 
 class _Base extends BaseDependencyTest {
   void _assertApi(Library library, String name, NodeKind kind,
-      {String memberOf,
-      String typeParameterOf,
+      {String? memberOf,
+      String? typeParameterOf,
       List<String> unprefixed = const [],
       Map<String, List<String>> prefixed = const {},
       List<String> superPrefixed = const [],
@@ -2295,8 +2295,8 @@
   }
 
   void _assertImpl(Library library, String name, NodeKind kind,
-      {String memberOf,
-      String typeParameterOf,
+      {String? memberOf,
+      String? typeParameterOf,
       List<String> unprefixed = const [],
       Map<String, List<String>> prefixed = const {},
       List<String> superPrefixed = const [],
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_caching_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_caching_test.dart
index 31db512..72108e0 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_caching_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_caching_test.dart
@@ -96,6 +96,7 @@
     _assertNoLinkedCycles();
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/linter/issues/2399')
   test_lints() async {
     useEmptyByteStore();
 
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 25d5b03..020f3a0 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -37,12 +37,12 @@
 class AnalysisDriverResolutionTest extends PubPackageResolutionTest
     with ElementsTypesMixin {
   void assertDeclaredVariableType(SimpleIdentifier node, String expected) {
-    VariableElement element = node.staticElement;
+    var element = node.staticElement as VariableElement;
     assertType(element.type, expected);
   }
 
   void assertDeclaredVariableTypeDynamic(SimpleIdentifier node) {
-    VariableElement element = node.staticElement;
+    var element = node.staticElement as VariableElement;
     expect(element.type, isDynamicType);
   }
 
@@ -83,7 +83,7 @@
       expect(nameIdentifier.staticElement, isNull);
       expect(nameIdentifier.staticType, isNull);
 
-      SimpleIdentifier expression = named.expression;
+      var expression = named.expression as SimpleIdentifier;
       expect(expression.staticElement, same(variable.getter));
       expect(expression.staticType, variable.type);
     };
@@ -100,8 +100,8 @@
 
     List<Statement> statements = _getMainStatements(result);
 
-    ExpressionStatement statement = statements[0];
-    AdjacentStrings expression = statement.expression;
+    var statement = statements[0] as ExpressionStatement;
+    var expression = statement.expression as AdjacentStrings;
     expect(expression.staticType, typeProvider.stringType);
     expect(expression.strings, hasLength(3));
 
@@ -141,46 +141,47 @@
 
     await resolveTestFile();
 
-    TopLevelVariableDeclaration myDeclaration = result.unit.declarations[0];
-    VariableDeclaration myVariable = myDeclaration.variables.variables[0];
-    TopLevelVariableElement myElement = myVariable.declaredElement;
+    var myDeclaration =
+        result.unit!.declarations[0] as TopLevelVariableDeclaration;
+    var myVariable = myDeclaration.variables.variables[0];
+    var myElement = myVariable.declaredElement as TopLevelVariableElement;
 
     void assertMyAnnotation(AnnotatedNode node) {
       Annotation annotation = node.metadata[0];
       expect(annotation.element, same(myElement.getter));
 
-      SimpleIdentifier identifier_1 = annotation.name;
+      var identifier_1 = annotation.name as SimpleIdentifier;
       expect(identifier_1.staticElement, same(myElement.getter));
       expect(identifier_1.staticType, isNull);
     }
 
     {
-      ClassDeclaration classNode = result.unit.declarations[1];
+      var classNode = result.unit!.declarations[1] as ClassDeclaration;
       assertMyAnnotation(classNode);
 
       {
-        FieldDeclaration node = classNode.members[0];
+        var node = classNode.members[0] as FieldDeclaration;
         assertMyAnnotation(node);
       }
 
       {
-        ConstructorDeclaration node = classNode.members[1];
+        var node = classNode.members[1] as ConstructorDeclaration;
         assertMyAnnotation(node);
       }
 
       {
-        MethodDeclaration node = classNode.members[2];
+        var node = classNode.members[2] as MethodDeclaration;
         assertMyAnnotation(node);
       }
     }
 
     {
-      TopLevelVariableDeclaration node = result.unit.declarations[2];
+      var node = result.unit!.declarations[2] as TopLevelVariableDeclaration;
       assertMyAnnotation(node);
     }
 
     {
-      FunctionDeclaration node = result.unit.declarations[3];
+      var node = result.unit!.declarations[3] as FunctionDeclaration;
       assertMyAnnotation(node);
     }
   }
@@ -200,7 +201,7 @@
     Annotation annotation = directive.metadata[0];
     expect(annotation.element, findElement.topGet('a'));
 
-    SimpleIdentifier aRef = annotation.name;
+    var aRef = annotation.name as SimpleIdentifier;
     assertElement(aRef, findElement.topGet('a'));
     assertTypeNull(aRef);
   }
@@ -220,7 +221,7 @@
     Annotation annotation = directive.metadata[0];
     expect(annotation.element, findElement.topGet('a'));
 
-    SimpleIdentifier aRef = annotation.name;
+    var aRef = annotation.name as SimpleIdentifier;
     assertElement(aRef, findElement.topGet('a'));
     assertTypeNull(aRef);
   }
@@ -240,7 +241,7 @@
     Annotation annotation = directive.metadata[0];
     expect(annotation.element, findElement.topGet('a'));
 
-    SimpleIdentifier aRef = annotation.name;
+    var aRef = annotation.name as SimpleIdentifier;
     assertElement(aRef, findElement.topGet('a'));
     assertTypeNull(aRef);
   }
@@ -263,7 +264,7 @@
     Annotation annotation = directive.metadata[0];
     expect(annotation.element, findElement.topGet('a'));
 
-    SimpleIdentifier aRef = annotation.name;
+    var aRef = annotation.name as SimpleIdentifier;
     assertElement(aRef, findElement.topGet('a'));
     assertTypeNull(aRef);
   }
@@ -286,7 +287,7 @@
     Annotation annotation = directive.metadata[0];
     expect(annotation.element, findElement.topGet('a'));
 
-    SimpleIdentifier aRef = annotation.name;
+    var aRef = annotation.name as SimpleIdentifier;
     assertElement(aRef, findElement.topGet('a'));
     assertTypeNull(aRef);
   }
@@ -308,7 +309,7 @@
       var getter = findElement.topGet(name);
       expect(annotation.element, getter);
 
-      SimpleIdentifier ref = annotation.name;
+      var ref = annotation.name as SimpleIdentifier;
       assertElement(ref, getter);
       assertTypeNull(ref);
     }
@@ -344,17 +345,18 @@
 
     await resolveTestFile();
 
-    ClassDeclaration c = result.unit.declarations[0];
-    ConstructorDeclaration constructor = c.members[1];
-    ConstructorElement element = constructor.declaredElement;
+    var c = result.unit!.declarations[0] as ClassDeclaration;
+    var constructor = c.members[1] as ConstructorDeclaration;
+    ConstructorElement element = constructor.declaredElement!;
 
-    FunctionDeclaration main = result.unit.declarations[1];
-    VariableDeclarationStatement statement =
-        (main.functionExpression.body as BlockFunctionBody).block.statements[0];
+    var main = result.unit!.declarations[1] as FunctionDeclaration;
+    var statement = (main.functionExpression.body as BlockFunctionBody)
+        .block
+        .statements[0] as VariableDeclarationStatement;
     Annotation annotation = statement.variables.metadata[0];
     expect(annotation.element, same(element));
 
-    SimpleIdentifier identifier_1 = annotation.name;
+    var identifier_1 = annotation.name as SimpleIdentifier;
     expect(identifier_1.staticElement, same(c.declaredElement));
   }
 
@@ -373,18 +375,19 @@
 
     await resolveTestFile();
 
-    TopLevelVariableDeclaration myDeclaration = result.unit.declarations[0];
+    var myDeclaration =
+        result.unit!.declarations[0] as TopLevelVariableDeclaration;
     VariableDeclaration myVariable = myDeclaration.variables.variables[0];
-    TopLevelVariableElement myElement = myVariable.declaredElement;
+    var myElement = myVariable.declaredElement as TopLevelVariableElement;
 
-    ClassDeclaration classNode = result.unit.declarations[1];
-    MethodDeclaration node = classNode.members[0];
-    VariableDeclarationStatement statement =
-        (node.body as BlockFunctionBody).block.statements[0];
+    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;
     Annotation annotation = statement.variables.metadata[0];
     expect(annotation.element, same(myElement.getter));
 
-    SimpleIdentifier identifier_1 = annotation.name;
+    var identifier_1 = annotation.name as SimpleIdentifier;
     expect(identifier_1.staticElement, same(myElement.getter));
     assertTypeNull(identifier_1);
   }
@@ -402,19 +405,19 @@
 main() {}
 ''');
     await resolveTestFile();
-    CompilationUnit unit = result.unit;
+    CompilationUnit unit = result.unit!;
 
-    ImportElement aImport = unit.declaredElement.library.imports[0];
-    PrefixElement aPrefix = aImport.prefix;
-    LibraryElement aLibrary = aImport.importedLibrary;
+    ImportElement aImport = unit.declaredElement!.library.imports[0];
+    PrefixElement aPrefix = aImport.prefix!;
+    LibraryElement aLibrary = aImport.importedLibrary!;
 
     CompilationUnitElement aUnitElement = aLibrary.definingCompilationUnit;
-    ClassElement aClass = aUnitElement.getType('A');
-    var aGetter = aClass.getField('a').getter;
+    ClassElement aClass = aUnitElement.getType('A')!;
+    var aGetter = aClass.getField('a')!.getter;
 
     Annotation annotation = unit.declarations[0].metadata.single;
     expect(annotation.element, same(aGetter));
-    PrefixedIdentifier prefixed = annotation.name;
+    var prefixed = annotation.name as PrefixedIdentifier;
 
     expect(prefixed.prefix.staticElement, same(aPrefix));
     expect(prefixed.prefix.staticType, isNull);
@@ -422,8 +425,8 @@
     expect(prefixed.identifier.staticElement, same(aClass));
     expect(prefixed.prefix.staticType, isNull);
 
-    expect(annotation.constructorName.staticElement, aGetter);
-    expect(annotation.constructorName.staticType, typeProvider.intType);
+    expect(annotation.constructorName!.staticElement, aGetter);
+    expect(annotation.constructorName!.staticType, typeProvider.intType);
 
     expect(annotation.arguments, isNull);
   }
@@ -441,19 +444,19 @@
 main() {}
 ''');
     await resolveTestFile();
-    CompilationUnit unit = result.unit;
+    CompilationUnit unit = result.unit!;
 
-    ImportElement aImport = unit.declaredElement.library.imports[0];
-    PrefixElement aPrefix = aImport.prefix;
-    LibraryElement aLibrary = aImport.importedLibrary;
+    ImportElement aImport = unit.declaredElement!.library.imports[0];
+    PrefixElement aPrefix = aImport.prefix!;
+    LibraryElement aLibrary = aImport.importedLibrary!;
 
     CompilationUnitElement aUnitElement = aLibrary.definingCompilationUnit;
-    ClassElement aClass = aUnitElement.getType('A');
-    ConstructorElement constructor = aClass.unnamedConstructor;
+    ClassElement aClass = aUnitElement.getType('A')!;
+    ConstructorElement constructor = aClass.unnamedConstructor!;
 
     Annotation annotation = unit.declarations[0].metadata.single;
     expect(annotation.element, same(constructor));
-    PrefixedIdentifier prefixed = annotation.name;
+    var prefixed = annotation.name as PrefixedIdentifier;
 
     expect(prefixed.prefix.staticElement, same(aPrefix));
     expect(prefixed.prefix.staticType, isNull);
@@ -463,7 +466,7 @@
 
     expect(annotation.constructorName, isNull);
 
-    var arguments = annotation.arguments.arguments;
+    var arguments = annotation.arguments!.arguments;
     var parameters = constructor.parameters;
     _assertArgumentToParameter(arguments[0], parameters[0]);
     _assertArgumentToParameter(arguments[1], parameters[1]);
@@ -482,19 +485,19 @@
 main() {}
 ''');
     await resolveTestFile();
-    CompilationUnit unit = result.unit;
+    CompilationUnit unit = result.unit!;
 
-    ImportElement aImport = unit.declaredElement.library.imports[0];
-    PrefixElement aPrefix = aImport.prefix;
-    LibraryElement aLibrary = aImport.importedLibrary;
+    ImportElement aImport = unit.declaredElement!.library.imports[0];
+    PrefixElement aPrefix = aImport.prefix!;
+    LibraryElement aLibrary = aImport.importedLibrary!;
 
     CompilationUnitElement aUnitElement = aLibrary.definingCompilationUnit;
-    ClassElement aClass = aUnitElement.getType('A');
-    ConstructorElement constructor = aClass.getNamedConstructor('named');
+    ClassElement aClass = aUnitElement.getType('A')!;
+    ConstructorElement constructor = aClass.getNamedConstructor('named')!;
 
     Annotation annotation = unit.declarations[0].metadata.single;
     expect(annotation.element, same(constructor));
-    PrefixedIdentifier prefixed = annotation.name;
+    var prefixed = annotation.name as PrefixedIdentifier;
 
     expect(prefixed.prefix.staticElement, same(aPrefix));
     expect(prefixed.prefix.staticType, isNull);
@@ -502,11 +505,11 @@
     expect(prefixed.identifier.staticElement, same(aClass));
     expect(prefixed.prefix.staticType, isNull);
 
-    SimpleIdentifier constructorName = annotation.constructorName;
+    var constructorName = annotation.constructorName as SimpleIdentifier;
     expect(constructorName.staticElement, same(constructor));
     assertType(constructorName.staticType, 'A Function(int, {int b})');
 
-    var arguments = annotation.arguments.arguments;
+    var arguments = annotation.arguments!.arguments;
     var parameters = constructor.parameters;
     _assertArgumentToParameter(arguments[0], parameters[0]);
     _assertArgumentToParameter(arguments[1], parameters[1]);
@@ -523,18 +526,18 @@
 main() {}
 ''');
     await resolveTestFile();
-    CompilationUnit unit = result.unit;
+    CompilationUnit unit = result.unit!;
 
-    ImportElement aImport = unit.declaredElement.library.imports[0];
-    PrefixElement aPrefix = aImport.prefix;
-    LibraryElement aLibrary = aImport.importedLibrary;
+    ImportElement aImport = unit.declaredElement!.library.imports[0];
+    PrefixElement aPrefix = aImport.prefix!;
+    LibraryElement aLibrary = aImport.importedLibrary!;
 
     CompilationUnitElement aUnitElement = aLibrary.definingCompilationUnit;
     var topAnnotation = aUnitElement.topLevelVariables[0].getter;
 
     Annotation annotation = unit.declarations[0].metadata.single;
     expect(annotation.element, same(topAnnotation));
-    PrefixedIdentifier prefixed = annotation.name;
+    var prefixed = annotation.name as PrefixedIdentifier;
 
     expect(prefixed.prefix.staticElement, same(aPrefix));
     expect(prefixed.prefix.staticType, isNull);
@@ -556,15 +559,15 @@
 }
 ''');
     await resolveTestFile();
-    CompilationUnit unit = result.unit;
-    CompilationUnitElement unitElement = unit.declaredElement;
+    CompilationUnit unit = result.unit!;
+    CompilationUnitElement unitElement = unit.declaredElement!;
 
-    ClassElement aClass = unitElement.getType('A');
-    var aGetter = aClass.getField('a').getter;
+    ClassElement aClass = unitElement.getType('A')!;
+    var aGetter = aClass.getField('a')!.getter;
 
     Annotation annotation = unit.declarations[0].metadata.single;
     expect(annotation.element, same(aGetter));
-    PrefixedIdentifier prefixed = annotation.name;
+    var prefixed = annotation.name as PrefixedIdentifier;
 
     expect(prefixed.prefix.staticElement, same(aClass));
     assertTypeNull(prefixed.prefix);
@@ -586,21 +589,21 @@
 }
 ''');
     await resolveTestFile();
-    CompilationUnit unit = result.unit;
-    CompilationUnitElement unitElement = unit.declaredElement;
+    CompilationUnit unit = result.unit!;
+    CompilationUnitElement unitElement = unit.declaredElement!;
 
-    ClassElement aClass = unitElement.getType('A');
-    ConstructorElement constructor = aClass.unnamedConstructor;
+    ClassElement aClass = unitElement.getType('A')!;
+    ConstructorElement constructor = aClass.unnamedConstructor!;
 
     Annotation annotation = unit.declarations[0].metadata.single;
     expect(annotation.element, same(constructor));
 
-    SimpleIdentifier name = annotation.name;
+    var name = annotation.name as SimpleIdentifier;
     expect(name.staticElement, same(aClass));
 
     expect(annotation.constructorName, isNull);
 
-    var arguments = annotation.arguments.arguments;
+    var arguments = annotation.arguments!.arguments;
     var parameters = constructor.parameters;
     _assertArgumentToParameter(arguments[0], parameters[0]);
     _assertArgumentToParameter(arguments[1], parameters[1]);
@@ -616,15 +619,15 @@
 }
 ''');
     await resolveTestFile();
-    CompilationUnit unit = result.unit;
-    CompilationUnitElement unitElement = unit.declaredElement;
+    CompilationUnit unit = result.unit!;
+    CompilationUnitElement unitElement = unit.declaredElement!;
 
-    ClassElement aClass = unitElement.getType('A');
+    ClassElement aClass = unitElement.getType('A')!;
     ConstructorElement constructor = aClass.constructors.single;
 
     Annotation annotation = unit.declarations[0].metadata.single;
     expect(annotation.element, same(constructor));
-    PrefixedIdentifier prefixed = annotation.name;
+    var prefixed = annotation.name as PrefixedIdentifier;
 
     expect(prefixed.prefix.staticElement, same(aClass));
     assertTypeNull(prefixed.prefix);
@@ -634,7 +637,7 @@
 
     expect(annotation.constructorName, isNull);
 
-    var arguments = annotation.arguments.arguments;
+    var arguments = annotation.arguments!.arguments;
     var parameters = constructor.parameters;
     _assertArgumentToParameter(arguments[0], parameters[0]);
     _assertArgumentToParameter(arguments[1], parameters[1]);
@@ -653,12 +656,12 @@
 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];
-    InstanceCreationExpression constC = atD.arguments.arguments[0];
+    var atD = AstFinder.getTopLevelFunction(result.unit!, 'f').metadata[0];
+    var constC = atD.arguments!.arguments[0] as InstanceCreationExpression;
 
     expect(atD.name.staticElement, elementD);
     expect(atD.element, constructorD);
@@ -684,27 +687,29 @@
 
     await resolveTestFile();
 
-    TopLevelVariableDeclaration declaration_1 = result.unit.declarations[0];
+    var declaration_1 =
+        result.unit!.declarations[0] as TopLevelVariableDeclaration;
     VariableDeclaration variable_1 = declaration_1.variables.variables[0];
-    TopLevelVariableElement element_1 = variable_1.declaredElement;
+    var element_1 = variable_1.declaredElement as TopLevelVariableElement;
 
-    TopLevelVariableDeclaration declaration_2 = result.unit.declarations[1];
+    var declaration_2 =
+        result.unit!.declarations[1] as TopLevelVariableDeclaration;
     VariableDeclaration variable_2 = declaration_2.variables.variables[0];
-    TopLevelVariableElement element_2 = variable_2.declaredElement;
+    var element_2 = variable_2.declaredElement as TopLevelVariableElement;
 
-    FunctionDeclaration main = result.unit.declarations[2];
+    var main = result.unit!.declarations[2] as FunctionDeclaration;
 
     Annotation annotation_1 = main.metadata[0];
     expect(annotation_1.element, same(element_1.getter));
 
-    SimpleIdentifier identifier_1 = annotation_1.name;
+    var identifier_1 = annotation_1.name as SimpleIdentifier;
     expect(identifier_1.staticElement, same(element_1.getter));
     assertTypeNull(identifier_1);
 
     Annotation annotation_2 = main.metadata[1];
     expect(annotation_2.element, same(element_2.getter));
 
-    SimpleIdentifier identifier_2 = annotation_2.name;
+    var identifier_2 = annotation_2.name as SimpleIdentifier;
     expect(identifier_2.staticElement, same(element_2.getter));
     assertTypeNull(identifier_2);
   }
@@ -717,27 +722,28 @@
 }
 ''');
 
-    NodeList<Statement> statements = _getMainStatements(result);
+    List<Statement> statements = _getMainStatements(result);
 
     // num v = 42;
     VariableElement vElement;
     {
-      VariableDeclarationStatement statement = statements[0];
-      vElement = statement.variables.variables[0].name.staticElement;
+      var statement = statements[0] as VariableDeclarationStatement;
+      vElement = statement.variables.variables[0].name.staticElement
+          as VariableElement;
       expect(vElement.type, typeProvider.numType);
     }
 
     // v as int;
     {
-      ExpressionStatement statement = statements[1];
-      AsExpression asExpression = statement.expression;
+      var statement = statements[1] as ExpressionStatement;
+      var asExpression = statement.expression as AsExpression;
       expect(asExpression.staticType, typeProvider.intType);
 
-      SimpleIdentifier target = asExpression.expression;
+      var target = asExpression.expression as SimpleIdentifier;
       expect(target.staticElement, vElement);
       expect(target.staticType, typeProvider.numType);
 
-      TypeName intName = asExpression.type;
+      var intName = asExpression.type as TypeName;
       expect(intName.name.staticElement, typeProvider.intType.element);
       expect(intName.name.staticType, isNull);
     }
@@ -768,15 +774,15 @@
 
     List<Statement> mainStatements = _getMainStatements(result);
 
-    VariableDeclarationStatement statement = mainStatements[0];
+    var statement = mainStatements[0] as VariableDeclarationStatement;
     VariableDeclaration vNode = statement.variables.variables[0];
-    VariableElement vElement = vNode.declaredElement;
+    VariableElement vElement = vNode.declaredElement!;
     expect(vElement.type, typeProvider.intType);
 
-    BinaryExpression value = vNode.initializer;
+    var value = vNode.initializer as BinaryExpression;
     expect(value.leftOperand.staticType, typeProvider.intType);
     expect(value.rightOperand.staticType, typeProvider.intType);
-    expect(value.staticElement.name, '+');
+    expect(value.staticElement!.name, '+');
     expect(value.staticType, typeProvider.intType);
   }
 
@@ -827,8 +833,8 @@
 
     List<Statement> mainStatements = _getMainStatements(result);
 
-    ExpressionStatement statement = mainStatements[0];
-    BinaryExpression binary = statement.expression;
+    var statement = mainStatements[0] as ExpressionStatement;
+    var binary = statement.expression as BinaryExpression;
     expect(binary.operator.type, TokenType.QUESTION_QUESTION);
     expect(binary.staticElement, isNull);
     expect(binary.staticType, typeProvider.numType);
@@ -849,15 +855,15 @@
     List<Statement> statements = _getMainStatements(result);
 
     {
-      ExpressionStatement statement = statements[0];
-      BinaryExpression binaryExpression = statement.expression;
+      var statement = statements[0] as ExpressionStatement;
+      var binaryExpression = statement.expression as BinaryExpression;
       expect(binaryExpression.staticElement, isNull);
       expect(binaryExpression.staticType, typeProvider.boolType);
     }
 
     {
-      ExpressionStatement statement = statements[1];
-      BinaryExpression binaryExpression = statement.expression;
+      var statement = statements[1] as ExpressionStatement;
+      var binaryExpression = statement.expression as BinaryExpression;
       expect(binaryExpression.staticElement, isNull);
       expect(binaryExpression.staticType, typeProvider.boolType);
     }
@@ -874,12 +880,12 @@
     await resolveTestFile();
 
     List<Statement> statements = _getMainStatements(result);
-    ExpressionStatement statement = statements[0];
-    BinaryExpression expression = statement.expression;
+    var statement = statements[0] as ExpressionStatement;
+    var expression = statement.expression as BinaryExpression;
     expect(expression.operator.type, TokenType.BANG_EQ);
     expect(expression.leftOperand.staticType, typeProvider.intType);
     expect(expression.rightOperand.staticType, typeProvider.intType);
-    expect(expression.staticElement.name, '==');
+    expect(expression.staticElement!.name, '==');
     expect(expression.staticType, typeProvider.boolType);
   }
 
@@ -924,16 +930,16 @@
 
     List<Statement> statements = _getMainStatements(result);
 
-    ExpressionStatement statement = statements[0];
-    CascadeExpression expression = statement.expression;
+    var statement = statements[0] as ExpressionStatement;
+    var expression = statement.expression as CascadeExpression;
     expect(expression.target.staticType, isNotNull);
     NodeList<Expression> sections = expression.cascadeSections;
 
-    MethodInvocation a = sections[0];
+    var a = sections[0] as MethodInvocation;
     expect(a.methodName.staticElement, isNotNull);
     expect(a.staticType, isNotNull);
 
-    MethodInvocation b = sections[1];
+    var b = sections[1] as MethodInvocation;
     expect(b.methodName.staticElement, isNotNull);
     expect(b.staticType, isNotNull);
   }
@@ -952,27 +958,28 @@
 ''');
     await resolveTestFile();
 
-    FunctionDeclaration mainDeclaration = result.unit.declarations[0];
-    FunctionElement mainElement = mainDeclaration.declaredElement;
-    BlockFunctionBody mainBody = mainDeclaration.functionExpression.body;
+    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;
 
-    VariableDeclarationStatement itemsStatement = mainStatements[0];
-    var itemsElement = itemsStatement.variables.variables[0].declaredElement;
+    var itemsStatement = mainStatements[0] as VariableDeclarationStatement;
+    var itemsElement = itemsStatement.variables.variables[0].declaredElement!;
 
     // First closure.
     ParameterElement itemElement1;
     {
-      ExpressionStatement forStatement = mainStatements[1];
-      MethodInvocation forInvocation = forStatement.expression;
+      var forStatement = mainStatements[1] as ExpressionStatement;
+      var forInvocation = forStatement.expression as MethodInvocation;
 
-      SimpleIdentifier forTarget = forInvocation.target;
+      var forTarget = forInvocation.target as SimpleIdentifier;
       expect(forTarget.staticElement, itemsElement);
 
       var closureTypeStr = 'Null Function(int)';
-      FunctionExpression closure = forInvocation.argumentList.arguments[0];
+      var closure =
+          forInvocation.argumentList.arguments[0] as FunctionExpression;
 
-      FunctionElementImpl closureElement = closure.declaredElement;
+      var closureElement = closure.declaredElement as FunctionElementImpl;
       expect(closureElement.enclosingElement, same(mainElement));
 
       ParameterElement itemElement = closureElement.parameters[0];
@@ -982,37 +989,38 @@
       assertType(closureElement.type, closureTypeStr);
       expect(closure.staticType, same(closureElement.type));
 
-      List<FormalParameter> closureParameters = closure.parameters.parameters;
+      List<FormalParameter> closureParameters = closure.parameters!.parameters;
       expect(closureParameters, hasLength(1));
 
-      SimpleFormalParameter itemNode = closureParameters[0];
+      var itemNode = closureParameters[0] as SimpleFormalParameter;
       _assertSimpleParameter(itemNode, itemElement,
           name: 'item',
           offset: 56,
           kind: ParameterKind.REQUIRED,
           type: typeProvider.intType);
 
-      BlockFunctionBody closureBody = closure.body;
+      var closureBody = closure.body as BlockFunctionBody;
       List<Statement> closureStatements = closureBody.block.statements;
 
-      ExpressionStatement itemStatement = closureStatements[0];
-      SimpleIdentifier itemIdentifier = itemStatement.expression;
+      var itemStatement = closureStatements[0] as ExpressionStatement;
+      var itemIdentifier = itemStatement.expression as SimpleIdentifier;
       expect(itemIdentifier.staticElement, itemElement);
       expect(itemIdentifier.staticType, typeProvider.intType);
     }
 
     // Second closure, same names, different elements.
     {
-      ExpressionStatement forStatement = mainStatements[2];
-      MethodInvocation forInvocation = forStatement.expression;
+      var forStatement = mainStatements[2] as ExpressionStatement;
+      var forInvocation = forStatement.expression as MethodInvocation;
 
-      SimpleIdentifier forTarget = forInvocation.target;
+      var forTarget = forInvocation.target as SimpleIdentifier;
       expect(forTarget.staticElement, itemsElement);
 
       var closureTypeStr = 'Null Function(int)';
-      FunctionExpression closure = forInvocation.argumentList.arguments[0];
+      var closure =
+          forInvocation.argumentList.arguments[0] as FunctionExpression;
 
-      FunctionElementImpl closureElement = closure.declaredElement;
+      var closureElement = closure.declaredElement as FunctionElementImpl;
       expect(closureElement.enclosingElement, same(mainElement));
 
       ParameterElement itemElement = closureElement.parameters[0];
@@ -1022,21 +1030,21 @@
       assertType(closureElement.type, closureTypeStr);
       expect(closure.staticType, same(closureElement.type));
 
-      List<FormalParameter> closureParameters = closure.parameters.parameters;
+      List<FormalParameter> closureParameters = closure.parameters!.parameters;
       expect(closureParameters, hasLength(1));
 
-      SimpleFormalParameter itemNode = closureParameters[0];
+      var itemNode = closureParameters[0] as SimpleFormalParameter;
       _assertSimpleParameter(itemNode, itemElement,
           name: 'item',
           offset: 97,
           kind: ParameterKind.REQUIRED,
           type: typeProvider.intType);
 
-      BlockFunctionBody closureBody = closure.body;
+      var closureBody = closure.body as BlockFunctionBody;
       List<Statement> closureStatements = closureBody.block.statements;
 
-      ExpressionStatement itemStatement = closureStatements[0];
-      SimpleIdentifier itemIdentifier = itemStatement.expression;
+      var itemStatement = closureStatements[0] as ExpressionStatement;
+      var itemIdentifier = itemStatement.expression as SimpleIdentifier;
       expect(itemIdentifier.staticElement, itemElement);
       expect(itemIdentifier.staticType, typeProvider.intType);
     }
@@ -1055,7 +1063,7 @@
     var closure = findNode.functionExpression('<T>() =>');
     assertType(closure, 'List<T> Function<T>()');
 
-    FunctionElementImpl closureElement = closure.declaredElement;
+    var closureElement = closure.declaredElement as FunctionElementImpl;
     expect(closureElement.enclosingElement, findElement.function('main'));
     assertType(closureElement.returnType, 'List<T>');
     expect(closureElement.parameters, isEmpty);
@@ -1081,15 +1089,15 @@
 }
 ''');
     await resolveTestFile();
-    CompilationUnit unit = result.unit;
+    CompilationUnit unit = result.unit!;
 
-    ClassDeclaration c = unit.declarations[0];
-    FieldDeclaration declaration = c.members[0];
+    var c = unit.declarations[0] as ClassDeclaration;
+    var declaration = c.members[0] as FieldDeclaration;
     VariableDeclaration field = declaration.fields.variables[0];
 
-    FunctionExpressionInvocation invocation = field.initializer;
-    FunctionExpression closure = invocation.function.unParenthesized;
-    FunctionElementImpl closureElement = closure.declaredElement;
+    var invocation = field.initializer as FunctionExpressionInvocation;
+    var closure = invocation.function.unParenthesized as FunctionExpression;
+    var closureElement = closure.declaredElement as FunctionElementImpl;
     expect(closureElement, isNotNull);
   }
 
@@ -1098,14 +1106,14 @@
 var v = (() => 42)();
 ''');
     await resolveTestFile();
-    CompilationUnit unit = result.unit;
+    CompilationUnit unit = result.unit!;
 
-    TopLevelVariableDeclaration declaration = unit.declarations[0];
+    var declaration = unit.declarations[0] as TopLevelVariableDeclaration;
     VariableDeclaration variable = declaration.variables.variables[0];
 
-    FunctionExpressionInvocation invocation = variable.initializer;
-    FunctionExpression closure = invocation.function.unParenthesized;
-    FunctionElementImpl closureElement = closure.declaredElement;
+    var invocation = variable.initializer as FunctionExpressionInvocation;
+    var closure = invocation.function.unParenthesized as FunctionExpression;
+    var closureElement = closure.declaredElement as FunctionElementImpl;
     expect(closureElement, isNotNull);
   }
 
@@ -1120,8 +1128,8 @@
 
     List<Statement> statements = _getMainStatements(result);
 
-    ExpressionStatement statement = statements[0];
-    ConditionalExpression expression = statement.expression;
+    var statement = statements[0] as ExpressionStatement;
+    var expression = statement.expression as ConditionalExpression;
     expect(expression.staticType, typeProvider.numType);
     expect(expression.condition.staticType, typeProvider.boolType);
     expect(expression.thenExpression.staticType, typeProvider.intType);
@@ -1155,15 +1163,15 @@
 ''');
     await resolveTestFile();
 
-    ClassDeclaration cNode = result.unit.declarations[0];
+    var cNode = result.unit!.declarations[0] as ClassDeclaration;
 
-    ConstructorDeclaration constructorNode = cNode.members[0];
-    ParameterElement pElement = constructorNode.declaredElement.parameters[0];
+    var constructorNode = cNode.members[0] as ConstructorDeclaration;
+    ParameterElement pElement = constructorNode.declaredElement!.parameters[0];
 
-    BlockFunctionBody constructorBody = constructorNode.body;
-    ExpressionStatement pStatement = constructorBody.block.statements[0];
+    var constructorBody = constructorNode.body as BlockFunctionBody;
+    var pStatement = constructorBody.block.statements[0] as ExpressionStatement;
 
-    SimpleIdentifier pIdentifier = pStatement.expression;
+    var pIdentifier = pStatement.expression as SimpleIdentifier;
     expect(pIdentifier.staticElement, same(pElement));
     expect(pIdentifier.staticType, typeProvider.intType);
   }
@@ -1179,19 +1187,20 @@
 ''');
     await resolveTestFile();
 
-    ClassDeclaration cNode = result.unit.declarations[0];
-    ClassElement cElement = cNode.declaredElement;
-    FieldElement fElement = cElement.getField('f');
+    var cNode = result.unit!.declarations[0] as ClassDeclaration;
+    ClassElement cElement = cNode.declaredElement!;
+    FieldElement fElement = cElement.getField('f')!;
 
-    ConstructorDeclaration constructorNode = cNode.members[1];
+    var constructorNode = cNode.members[1] as ConstructorDeclaration;
     ParameterElement pParameterElement =
-        constructorNode.declaredElement.parameters[0];
+        constructorNode.declaredElement!.parameters[0];
 
     {
-      ConstructorFieldInitializer initializer = constructorNode.initializers[0];
+      var initializer =
+          constructorNode.initializers[0] as ConstructorFieldInitializer;
       expect(initializer.fieldName.staticElement, same(fElement));
 
-      SimpleIdentifier expression = initializer.expression;
+      var expression = initializer.expression as SimpleIdentifier;
       expect(expression.staticElement, same(pParameterElement));
     }
   }
@@ -1209,26 +1218,28 @@
 ''');
     await resolveTestFile();
 
-    ClassDeclaration aNode = result.unit.declarations[0];
-    ClassElement aElement = aNode.declaredElement;
+    var aNode = result.unit!.declarations[0] as ClassDeclaration;
+    ClassElement aElement = aNode.declaredElement!;
 
-    ClassDeclaration bNode = result.unit.declarations[1];
+    var bNode = result.unit!.declarations[1] as ClassDeclaration;
 
     {
-      ConstructorDeclaration constructor = bNode.members[0];
-      SuperConstructorInvocation initializer = constructor.initializers[0];
+      var constructor = bNode.members[0] as ConstructorDeclaration;
+      var initializer =
+          constructor.initializers[0] as SuperConstructorInvocation;
       expect(initializer.staticElement, same(aElement.unnamedConstructor));
       expect(initializer.constructorName, isNull);
     }
 
     {
-      var namedConstructor = aElement.getNamedConstructor('named');
+      var namedConstructor = aElement.getNamedConstructor('named')!;
 
-      ConstructorDeclaration constructor = bNode.members[1];
-      SuperConstructorInvocation initializer = constructor.initializers[0];
+      var constructor = bNode.members[1] as ConstructorDeclaration;
+      var initializer =
+          constructor.initializers[0] as SuperConstructorInvocation;
       expect(initializer.staticElement, same(namedConstructor));
 
-      var constructorName = initializer.constructorName;
+      var constructorName = initializer.constructorName!;
       expect(constructorName.staticElement, same(namedConstructor));
       expect(constructorName.staticType, isNull);
 
@@ -1249,15 +1260,15 @@
 ''');
     await resolveTestFile();
 
-    ClassDeclaration cNode = result.unit.declarations[0];
-    ClassElement cElement = cNode.declaredElement;
+    var cNode = result.unit!.declarations[0] as ClassDeclaration;
+    ClassElement cElement = cNode.declaredElement!;
 
     {
       var unnamedConstructor = cElement.constructors[0];
 
-      ConstructorDeclaration constructor = cNode.members[2];
-      RedirectingConstructorInvocation initializer =
-          constructor.initializers[0];
+      var constructor = cNode.members[2] as ConstructorDeclaration;
+      var initializer =
+          constructor.initializers[0] as RedirectingConstructorInvocation;
       expect(initializer.staticElement, same(unnamedConstructor));
       expect(initializer.constructorName, isNull);
 
@@ -1271,12 +1282,12 @@
     {
       var namedConstructor = cElement.constructors[1];
 
-      ConstructorDeclaration constructor = cNode.members[3];
-      RedirectingConstructorInvocation initializer =
-          constructor.initializers[0];
+      var constructor = cNode.members[3] as ConstructorDeclaration;
+      var initializer =
+          constructor.initializers[0] as RedirectingConstructorInvocation;
       expect(initializer.staticElement, same(namedConstructor));
 
-      var constructorName = initializer.constructorName;
+      var constructorName = initializer.constructorName!;
       expect(constructorName.staticElement, same(namedConstructor));
       expect(constructorName.staticType, isNull);
 
@@ -1300,25 +1311,25 @@
     await resolveTestFile();
     expect(result.errors, isEmpty);
 
-    ClassDeclaration aNode = result.unit.declarations[0];
-    ClassElement aElement = aNode.declaredElement;
+    var aNode = result.unit!.declarations[0] as ClassDeclaration;
+    ClassElement aElement = aNode.declaredElement!;
 
-    ClassDeclaration bNode = result.unit.declarations[1];
+    var bNode = result.unit!.declarations[1] as ClassDeclaration;
 
     {
       ConstructorElement aUnnamed = aElement.constructors[0];
 
-      ConstructorDeclaration constructor = bNode.members[0];
-      ConstructorElement element = constructor.declaredElement;
+      var constructor = bNode.members[0] as ConstructorDeclaration;
+      ConstructorElement element = constructor.declaredElement!;
       expect(element.redirectedConstructor, same(aUnnamed));
 
-      var constructorName = constructor.redirectedConstructor;
+      var constructorName = constructor.redirectedConstructor!;
       expect(constructorName.staticElement, same(aUnnamed));
 
       TypeName typeName = constructorName.type;
       expect(typeName.type, interfaceTypeStar(aElement));
 
-      SimpleIdentifier identifier = typeName.name;
+      var identifier = typeName.name as SimpleIdentifier;
       expect(identifier.staticElement, same(aElement));
       expect(identifier.staticType, isNull);
 
@@ -1328,22 +1339,22 @@
     {
       ConstructorElement aNamed = aElement.constructors[1];
 
-      ConstructorDeclaration constructor = bNode.members[1];
-      ConstructorElement element = constructor.declaredElement;
+      var constructor = bNode.members[1] as ConstructorDeclaration;
+      ConstructorElement element = constructor.declaredElement!;
       expect(element.redirectedConstructor, same(aNamed));
 
-      var constructorName = constructor.redirectedConstructor;
+      var constructorName = constructor.redirectedConstructor!;
       expect(constructorName.staticElement, same(aNamed));
 
-      TypeName typeName = constructorName.type;
+      var typeName = constructorName.type;
       expect(typeName.type, interfaceTypeStar(aElement));
 
-      SimpleIdentifier identifier = typeName.name;
+      var identifier = typeName.name as SimpleIdentifier;
       expect(identifier.staticElement, same(aElement));
       expect(identifier.staticType, isNull);
 
-      expect(constructorName.name.staticElement, aNamed);
-      expect(constructorName.name.staticType, isNull);
+      expect(constructorName.name!.staticElement, aNamed);
+      expect(constructorName.name!.staticType, isNull);
     }
   }
 
@@ -1361,12 +1372,12 @@
     await resolveTestFile();
     expect(result.errors, isEmpty);
 
-    ClassDeclaration aNode = result.unit.declarations[0];
-    ClassElement aElement = aNode.declaredElement;
+    var aNode = result.unit!.declarations[0] as ClassDeclaration;
+    ClassElement aElement = aNode.declaredElement!;
 
-    ClassDeclaration bNode = result.unit.declarations[1];
+    var bNode = result.unit!.declarations[1] as ClassDeclaration;
     TypeParameterType uType =
-        typeParameterTypeStar(bNode.declaredElement.typeParameters[0]);
+        typeParameterTypeStar(bNode.declaredElement!.typeParameters[0]);
     InterfaceType auType = aElement.instantiate(
       typeArguments: [uType],
       nullabilitySuffix: NullabilitySuffix.star,
@@ -1375,19 +1386,19 @@
     {
       ConstructorElement expectedElement = aElement.constructors[0];
 
-      ConstructorDeclaration constructor = bNode.members[0];
-      ConstructorElement element = constructor.declaredElement;
+      var constructor = bNode.members[0] as ConstructorDeclaration;
+      ConstructorElement element = constructor.declaredElement!;
 
-      ConstructorMember actualMember = element.redirectedConstructor;
+      var actualMember = element.redirectedConstructor!;
       assertMember(actualMember, expectedElement, {'T': 'U'});
 
-      var constructorName = constructor.redirectedConstructor;
+      var constructorName = constructor.redirectedConstructor!;
       expect(constructorName.staticElement, same(actualMember));
 
       TypeName typeName = constructorName.type;
       expect(typeName.type, auType);
 
-      SimpleIdentifier identifier = typeName.name;
+      var identifier = typeName.name as SimpleIdentifier;
       expect(identifier.staticElement, same(aElement));
       expect(identifier.staticType, isNull);
 
@@ -1397,24 +1408,24 @@
     {
       ConstructorElement expectedElement = aElement.constructors[1];
 
-      ConstructorDeclaration constructor = bNode.members[1];
-      ConstructorElement element = constructor.declaredElement;
+      var constructor = bNode.members[1] as ConstructorDeclaration;
+      ConstructorElement element = constructor.declaredElement!;
 
-      ConstructorMember actualMember = element.redirectedConstructor;
+      var actualMember = element.redirectedConstructor!;
       assertMember(actualMember, expectedElement, {'T': 'U'});
 
-      var constructorName = constructor.redirectedConstructor;
+      var constructorName = constructor.redirectedConstructor!;
       expect(constructorName.staticElement, same(actualMember));
 
       TypeName typeName = constructorName.type;
       expect(typeName.type, auType);
 
-      SimpleIdentifier identifier = typeName.name;
+      var identifier = typeName.name as SimpleIdentifier;
       expect(identifier.staticElement, same(aElement));
       expect(identifier.staticType, isNull);
 
-      expect(constructorName.name.staticElement, same(actualMember));
-      expect(constructorName.name.staticType, isNull);
+      expect(constructorName.name!.staticElement, same(actualMember));
+      expect(constructorName.name!.staticType, isNull);
     }
   }
 
@@ -1433,12 +1444,12 @@
     assertType(invocation, 'Future<dynamic>');
     assertInvokeType(invocation, 'Future<dynamic> Function()');
 
-    SimpleIdentifier target = invocation.target;
+    var target = invocation.target as SimpleIdentifier;
     assertElement(target, import.prefix);
     assertType(target, null);
 
     var name = invocation.methodName;
-    assertElement(name, import.importedLibrary.loadLibraryFunction);
+    assertElement(name, import.importedLibrary!.loadLibraryFunction);
     assertType(name, 'Future<dynamic> Function()');
   }
 
@@ -1459,12 +1470,12 @@
     assertType(invocation, 'Future<dynamic>');
     assertInvokeType(invocation, 'Future<dynamic> Function()');
 
-    SimpleIdentifier target = invocation.target;
+    var target = invocation.target as SimpleIdentifier;
     assertElement(target, import.prefix);
     assertType(target, null);
 
     var name = invocation.methodName;
-    assertElement(name, import.importedLibrary.loadLibraryFunction);
+    assertElement(name, import.importedLibrary!.loadLibraryFunction);
     assertType(name, 'Future<dynamic> Function()');
 
     var bRef = invocation.argumentList.arguments[0];
@@ -1495,7 +1506,7 @@
     assertType(prefix, null);
 
     var identifier = prefixed.identifier;
-    assertElement(identifier, import.importedLibrary.loadLibraryFunction);
+    assertElement(identifier, import.importedLibrary!.loadLibraryFunction);
     assertType(identifier, 'Future<dynamic> Function()');
   }
 
@@ -1510,9 +1521,9 @@
 ''');
     await resolveTestFile();
     var import = findElement.import('package:test/a.dart');
-    TopLevelVariableElement v = (import.importedLibrary.publicNamespace.get('v')
+    var v = (import.importedLibrary!.publicNamespace.get('v')
             as PropertyAccessorElement)
-        .variable;
+        .variable as TopLevelVariableElement;
 
     {
       var prefixed = findNode.prefixed('a.v;');
@@ -1561,7 +1572,7 @@
 ''');
     await resolveTestFile();
     var export = findElement.export('package:test/a.dart');
-    var namespace = export.exportedLibrary.exportNamespace;
+    var namespace = export.exportedLibrary!.exportNamespace;
 
     {
       var ref = findNode.simple('MyClass');
@@ -1571,21 +1582,21 @@
 
     {
       var ref = findNode.simple('myVar');
-      PropertyAccessorElement getter = namespace.get('myVar');
+      var getter = namespace.get('myVar') as PropertyAccessorElement;
       assertElement(ref, getter.variable);
       assertType(ref, null);
     }
 
     {
       var ref = findNode.simple('myGetter');
-      PropertyAccessorElement getter = namespace.get('myGetter');
+      var getter = namespace.get('myGetter') as PropertyAccessorElement;
       assertElement(ref, getter.variable);
       assertType(ref, null);
     }
 
     {
       var ref = findNode.simple('mySetter');
-      PropertyAccessorElement getter = namespace.get('mySetter=');
+      var getter = namespace.get('mySetter=') as PropertyAccessorElement;
       assertElement(ref, getter.variable);
       assertType(ref, null);
     }
@@ -1609,7 +1620,7 @@
 ''');
     await resolveTestFile();
     var import = findElement.import('package:test/a.dart');
-    var namespace = import.importedLibrary.exportNamespace;
+    var namespace = import.importedLibrary!.exportNamespace;
 
     {
       var ref = findNode.simple('MyClass');
@@ -1619,21 +1630,21 @@
 
     {
       var ref = findNode.simple('myVar');
-      PropertyAccessorElement getter = namespace.get('myVar');
+      var getter = namespace.get('myVar') as PropertyAccessorElement;
       assertElement(ref, getter.variable);
       assertType(ref, null);
     }
 
     {
       var ref = findNode.simple('myGetter');
-      PropertyAccessorElement getter = namespace.get('myGetter');
+      var getter = namespace.get('myGetter') as PropertyAccessorElement;
       assertElement(ref, getter.variable);
       assertType(ref, null);
     }
 
     {
       var ref = findNode.simple('mySetter');
-      PropertyAccessorElement getter = namespace.get('mySetter=');
+      var getter = namespace.get('mySetter=') as PropertyAccessorElement;
       assertElement(ref, getter.variable);
       assertType(ref, null);
     }
@@ -1657,7 +1668,7 @@
 ''');
     await resolveTestFile();
     var import = findElement.import('package:test/a.dart');
-    var namespace = import.importedLibrary.exportNamespace;
+    var namespace = import.importedLibrary!.exportNamespace;
 
     {
       var ref = findNode.simple('MyClass');
@@ -1667,21 +1678,21 @@
 
     {
       var ref = findNode.simple('myVar');
-      PropertyAccessorElement getter = namespace.get('myVar');
+      var getter = namespace.get('myVar') as PropertyAccessorElement;
       assertElement(ref, getter.variable);
       assertType(ref, null);
     }
 
     {
       var ref = findNode.simple('myGetter');
-      PropertyAccessorElement getter = namespace.get('myGetter');
+      var getter = namespace.get('myGetter') as PropertyAccessorElement;
       assertElement(ref, getter.variable);
       assertType(ref, null);
     }
 
     {
       var ref = findNode.simple('mySetter');
-      PropertyAccessorElement getter = namespace.get('mySetter=');
+      var getter = namespace.get('mySetter=') as PropertyAccessorElement;
       assertElement(ref, getter.variable);
       assertType(ref, null);
     }
@@ -1702,16 +1713,16 @@
 ''');
     await resolveTestFile();
 
-    EnumDeclaration enumNode = result.unit.declarations[0];
-    ClassElement enumElement = enumNode.declaredElement;
+    var enumNode = result.unit!.declarations[0] as EnumDeclaration;
+    ClassElement enumElement = enumNode.declaredElement!;
 
     List<Statement> mainStatements = _getMainStatements(result);
 
-    ExpressionStatement statement = mainStatements[0];
-    MethodInvocation invocation = statement.expression;
+    var statement = mainStatements[0] as ExpressionStatement;
+    var invocation = statement.expression as MethodInvocation;
     assertInvokeType(invocation, 'String Function()');
 
-    MethodElement methodElement = invocation.methodName.staticElement;
+    var methodElement = invocation.methodName.staticElement as MethodElement;
     expect(methodElement.name, 'toString');
     expect(methodElement.enclosingElement, same(enumElement));
   }
@@ -1727,15 +1738,15 @@
 
     var statements = _getMainStatements(result);
 
-    VariableDeclarationStatement statement = statements[0];
+    var statement = statements[0] as VariableDeclarationStatement;
 
-    TypeName typeName = statement.variables.type;
+    var typeName = statement.variables.type as TypeName;
     expect(typeName.type, isDynamicType);
-    expect(typeName.typeArguments.arguments[0].type, typeProvider.intType);
+    expect(typeName.typeArguments!.arguments[0].type, typeProvider.intType);
 
     VariableDeclaration vNode = statement.variables.variables[0];
     expect(vNode.name.staticType, isNull);
-    expect(vNode.declaredElement.type, isDynamicType);
+    expect(vNode.declaredElement!.type, isDynamicType);
   }
 
   test_field_context() async {
@@ -1746,12 +1757,12 @@
 ''');
     await resolveTestFile();
 
-    ClassDeclaration cNode = result.unit.declarations[0];
-    var tElement = cNode.declaredElement.typeParameters[0];
+    var cNode = result.unit!.declarations[0] as ClassDeclaration;
+    var tElement = cNode.declaredElement!.typeParameters[0];
 
-    FieldDeclaration fDeclaration = cNode.members[0];
+    var fDeclaration = cNode.members[0] as FieldDeclaration;
     VariableDeclaration fNode = fDeclaration.fields.variables[0];
-    FieldElement fElement = fNode.declaredElement;
+    var fElement = fNode.declaredElement as FieldElement;
     expect(
         fElement.type, typeProvider.listType2(typeParameterTypeStar(tElement)));
   }
@@ -1794,27 +1805,28 @@
 ''');
     await resolveTestFile();
 
-    ClassDeclaration clazz = result.unit.declarations[0];
-    ConstructorDeclaration constructor = clazz.members[0];
+    var clazz = result.unit!.declarations[0] as ClassDeclaration;
+    var constructor = clazz.members[0] as ConstructorDeclaration;
     List<FormalParameter> parameters = constructor.parameters.parameters;
 
-    FunctionTypedFormalParameter p = parameters[0];
-    expect(p.declaredElement, same(constructor.declaredElement.parameters[0]));
+    var p = parameters[0] as FunctionTypedFormalParameter;
+    expect(p.declaredElement, same(constructor.declaredElement!.parameters[0]));
 
     {
-      FunctionType type = (p.identifier.staticElement as ParameterElement).type;
+      var type =
+          (p.identifier.staticElement as ParameterElement).type as FunctionType;
       expect(type.returnType, typeProvider.stringType);
 
       expect(type.parameters, hasLength(1));
       expect(type.parameters[0].type, typeProvider.intType);
     }
 
-    _assertTypeNameSimple(p.returnType, typeProvider.stringType);
+    _assertTypeNameSimple(p.returnType!, typeProvider.stringType);
 
     {
-      SimpleFormalParameter a = p.parameters.parameters[0];
-      _assertTypeNameSimple(a.type, typeProvider.intType);
-      expect(a.identifier.staticType, isNull);
+      var a = p.parameters.parameters[0] as SimpleFormalParameter;
+      _assertTypeNameSimple(a.type!, typeProvider.intType);
+      expect(a.identifier!.staticType, isNull);
     }
   }
 
@@ -1828,39 +1840,39 @@
 ''');
     await resolveTestFile();
 
-    ClassDeclaration clazz = result.unit.declarations[0];
+    var clazz = result.unit!.declarations[0] as ClassDeclaration;
 
-    FieldDeclaration fDeclaration = clazz.members[0];
+    var fDeclaration = clazz.members[0] as FieldDeclaration;
     VariableDeclaration fNode = fDeclaration.fields.variables[0];
-    FieldElement fElement = fNode.declaredElement;
+    var fElement = fNode.declaredElement as FieldElement;
 
-    ConstructorDeclaration constructor = clazz.members[1];
+    var constructor = clazz.members[1] as ConstructorDeclaration;
 
-    FieldFormalParameterElement pElement =
-        constructor.declaredElement.parameters[0];
+    var pElement = constructor.declaredElement!.parameters[0]
+        as FieldFormalParameterElement;
     expect(pElement.field, same(fElement));
 
     List<FormalParameter> parameters = constructor.parameters.parameters;
-    FieldFormalParameter p = parameters[0];
+    var p = parameters[0] as FieldFormalParameter;
     expect(p.declaredElement, same(pElement));
 
     expect(p.identifier.staticElement, same(pElement));
     assertType(p.identifier.staticType, 'String Function(int)');
 
     {
-      FunctionType type = p.identifier.staticType;
+      var type = p.identifier.staticType as FunctionType;
       expect(type.returnType, typeProvider.stringType);
 
       expect(type.parameters, hasLength(1));
       expect(type.parameters[0].type, typeProvider.intType);
     }
 
-    _assertTypeNameSimple(p.type, typeProvider.stringType);
+    _assertTypeNameSimple(p.type!, typeProvider.stringType);
 
     {
-      SimpleFormalParameter a = p.parameters.parameters[0];
-      _assertTypeNameSimple(a.type, typeProvider.intType);
-      expect(a.identifier.staticType, isNull);
+      var a = p.parameters!.parameters[0] as SimpleFormalParameter;
+      _assertTypeNameSimple(a.type!, typeProvider.intType);
+      expect(a.identifier!.staticType, isNull);
     }
   }
 
@@ -1873,20 +1885,20 @@
 ''');
     await resolveTestFile();
 
-    ClassDeclaration clazz = result.unit.declarations[0];
+    var clazz = result.unit!.declarations[0] as ClassDeclaration;
 
-    FieldDeclaration fDeclaration = clazz.members[0];
+    var fDeclaration = clazz.members[0] as FieldDeclaration;
     VariableDeclaration fNode = fDeclaration.fields.variables[0];
-    FieldElement fElement = fNode.declaredElement;
+    var fElement = fNode.declaredElement as FieldElement;
 
-    ConstructorDeclaration constructor = clazz.members[1];
+    var constructor = clazz.members[1] as ConstructorDeclaration;
     List<FormalParameter> parameters = constructor.parameters.parameters;
 
-    FieldFormalParameterElement parameterElement =
-        constructor.declaredElement.parameters[0];
+    var parameterElement = constructor.declaredElement!.parameters[0]
+        as FieldFormalParameterElement;
     expect(parameterElement.field, same(fElement));
 
-    FieldFormalParameter parameterNode = parameters[0];
+    var parameterNode = parameters[0] as FieldFormalParameter;
     expect(parameterNode.type, isNull);
     expect(parameterNode.declaredElement, same(parameterElement));
 
@@ -1903,21 +1915,21 @@
 ''');
     await resolveTestFile();
 
-    ClassDeclaration clazz = result.unit.declarations[0];
+    var clazz = result.unit!.declarations[0] as ClassDeclaration;
 
-    FieldDeclaration fDeclaration = clazz.members[0];
+    var fDeclaration = clazz.members[0] as FieldDeclaration;
     VariableDeclaration fNode = fDeclaration.fields.variables[0];
-    FieldElement fElement = fNode.declaredElement;
+    var fElement = fNode.declaredElement as FieldElement;
 
-    ConstructorDeclaration constructor = clazz.members[1];
+    var constructor = clazz.members[1] as ConstructorDeclaration;
     List<FormalParameter> parameters = constructor.parameters.parameters;
 
-    FieldFormalParameterElement parameterElement =
-        constructor.declaredElement.parameters[0];
+    var parameterElement = constructor.declaredElement!.parameters[0]
+        as FieldFormalParameterElement;
     expect(parameterElement.field, same(fElement));
 
-    FieldFormalParameter parameterNode = parameters[0];
-    _assertTypeNameSimple(parameterNode.type, typeProvider.intType);
+    var parameterNode = parameters[0] as FieldFormalParameter;
+    _assertTypeNameSimple(parameterNode.type!, typeProvider.intType);
     expect(parameterNode.declaredElement, same(parameterElement));
 
     expect(parameterNode.identifier.staticElement, same(parameterElement));
@@ -1936,14 +1948,14 @@
 ''');
     await resolveTestFile();
 
-//    ClassDeclaration aNode = result.unit.declarations[0];
-//    ClassElement eElement = aNode.declaredElement;
+//    var aNode = result.unit!.declarations[0] as ClassDeclaration;
+//    ClassElement eElement = aNode.declaredElement!;
 //    MethodElement mElement = eElement.getMethod('m');
 
     List<Statement> mainStatements = _getMainStatements(result);
 
-    ExpressionStatement statement = mainStatements[0];
-    MethodInvocation invocation = statement.expression;
+    var statement = mainStatements[0] as ExpressionStatement;
+    var invocation = statement.expression as MethodInvocation;
     assertInvokeType(invocation, 'void Function(int)');
     // TODO(scheglov) Check for MethodElement
 //    expect(invocation.methodName.staticElement, same(mElement));
@@ -1976,14 +1988,14 @@
 
     List<Statement> statements = _getMainStatements(result);
 
-    ExpressionStatement statement = statements[0];
-    FunctionExpressionInvocation invocation = statement.expression;
+    var statement = statements[0] as ExpressionStatement;
+    var invocation = statement.expression as FunctionExpressionInvocation;
 
     expect(invocation.staticElement, isNull);
     assertInvokeType(invocation, 'int Function(String)');
     expect(invocation.staticType, typeProvider.intType);
 
-    List<TypeAnnotation> typeArguments = invocation.typeArguments.arguments;
+    List<TypeAnnotation> typeArguments = invocation.typeArguments!.arguments;
     expect(typeArguments, hasLength(1));
     _assertTypeNameSimple(typeArguments[0], typeProvider.stringType);
   }
@@ -2012,7 +2024,7 @@
     var fTypeParameter = fType.normalParameterTypes[0] as TypeParameterType;
     expect(fTypeParameter.element, same(fTypeTypeParameter));
     var tRef = findNode.simple('T>');
-    var functionTypeNode = tRef.parent.parent.parent as GenericFunctionType;
+    var functionTypeNode = tRef.parent!.parent!.parent as GenericFunctionType;
     var functionType = functionTypeNode.type as FunctionType;
     assertElement(tRef, functionType.typeFormals[0]);
   }
@@ -2035,18 +2047,18 @@
 
     VariableElement itemsElement;
     {
-      VariableDeclarationStatement statement = mainStatements[0];
+      var statement = mainStatements[0] as VariableDeclarationStatement;
       VariableDeclaration itemsNode = statement.variables.variables[0];
-      itemsElement = itemsNode.declaredElement;
+      itemsElement = itemsNode.declaredElement!;
       expect(itemsElement.type, listIntType);
     }
 
-    ExpressionStatement statement = mainStatements[1];
-    IndexExpression indexExpression = statement.expression;
+    var statement = mainStatements[1] as ExpressionStatement;
+    var indexExpression = statement.expression as IndexExpression;
     expect(indexExpression.staticType, intType);
 
-    MethodMember actualElement = indexExpression.staticElement;
-    MethodMember expectedElement = listIntType.getMethod('[]');
+    var actualElement = indexExpression.staticElement as MethodMember;
+    var expectedElement = listIntType.getMethod('[]') as MethodMember;
     expect(actualElement.name, '[]');
     expect(actualElement.declaration, same(expectedElement.declaration));
     expect(actualElement.returnType, intType);
@@ -2065,17 +2077,17 @@
     addTestFile(content);
 
     await resolveTestFile();
-    CompilationUnit unit = result.unit;
+    CompilationUnit unit = result.unit!;
 
-    ClassDeclaration cNode = unit.declarations[0];
-    ClassElement cElement = cNode.declaredElement;
+    var cNode = unit.declarations[0] as ClassDeclaration;
+    ClassElement cElement = cNode.declaredElement!;
     ConstructorElement defaultConstructor = cElement.constructors[0];
     ConstructorElement namedConstructor = cElement.constructors[1];
 
     {
-      TopLevelVariableDeclaration aDeclaration = unit.declarations[1];
+      var aDeclaration = unit.declarations[1] as TopLevelVariableDeclaration;
       VariableDeclaration aNode = aDeclaration.variables.variables[0];
-      InstanceCreationExpression value = aNode.initializer;
+      var value = aNode.initializer as InstanceCreationExpression;
       expect(value.staticType, interfaceTypeStar(cElement));
 
       var constructorName = value.constructorName;
@@ -2091,19 +2103,19 @@
     }
 
     {
-      TopLevelVariableDeclaration bDeclaration = unit.declarations[2];
+      var bDeclaration = unit.declarations[2] as TopLevelVariableDeclaration;
       VariableDeclaration bNode = bDeclaration.variables.variables[0];
-      InstanceCreationExpression value = bNode.initializer;
+      var value = bNode.initializer as InstanceCreationExpression;
       expect(value.staticType, interfaceTypeStar(cElement));
 
       var constructorName = value.constructorName;
       expect(constructorName.staticElement, namedConstructor);
-      expect(constructorName.name.staticType, isNull);
+      expect(constructorName.name!.staticType, isNull);
 
       TypeName typeName = constructorName.type;
       expect(typeName.typeArguments, isNull);
 
-      SimpleIdentifier typeIdentifier = typeName.name;
+      var typeIdentifier = typeName.name as SimpleIdentifier;
       expect(typeIdentifier.staticElement, cElement);
       expect(typeIdentifier.staticType, isNull);
     }
@@ -2118,16 +2130,16 @@
 ''');
 
     await resolveTestFile();
-    CompilationUnit unit = result.unit;
+    CompilationUnit unit = result.unit!;
 
-    ClassDeclaration xNode = unit.declarations[0];
-    ClassElement xElement = xNode.declaredElement;
+    var xNode = unit.declarations[0] as ClassDeclaration;
+    ClassElement xElement = xNode.declaredElement!;
     ConstructorElement constructorElement = xElement.constructors[0];
 
-    TopLevelVariableDeclaration vDeclaration = unit.declarations[1];
+    var vDeclaration = unit.declarations[1] as TopLevelVariableDeclaration;
     VariableDeclaration vNode = vDeclaration.variables.variables[0];
 
-    InstanceCreationExpression creation = vNode.initializer;
+    var creation = vNode.initializer as InstanceCreationExpression;
     List<Expression> arguments = creation.argumentList.arguments;
     expect(creation.staticType, interfaceTypeStar(xElement));
 
@@ -2159,17 +2171,17 @@
     addTestFile(content);
 
     await resolveTestFile();
-    CompilationUnit unit = result.unit;
+    CompilationUnit unit = result.unit!;
 
-    ClassDeclaration cNode = unit.declarations[0];
-    ClassElement cElement = cNode.declaredElement;
+    var cNode = unit.declarations[0] as ClassDeclaration;
+    ClassElement cElement = cNode.declaredElement!;
     ConstructorElement defaultConstructor = cElement.constructors[0];
     ConstructorElement namedConstructor = cElement.constructors[1];
 
     {
-      TopLevelVariableDeclaration aDeclaration = unit.declarations[1];
+      var aDeclaration = unit.declarations[1] as TopLevelVariableDeclaration;
       VariableDeclaration aNode = aDeclaration.variables.variables[0];
-      InstanceCreationExpression value = aNode.initializer;
+      var value = aNode.initializer as InstanceCreationExpression;
       expect(value.staticType, interfaceTypeStar(cElement));
 
       var constructorName = value.constructorName;
@@ -2188,20 +2200,20 @@
     }
 
     {
-      TopLevelVariableDeclaration bDeclaration = unit.declarations[2];
+      var bDeclaration = unit.declarations[2] as TopLevelVariableDeclaration;
       VariableDeclaration bNode = bDeclaration.variables.variables[0];
-      InstanceCreationExpression value = bNode.initializer;
+      var value = bNode.initializer as InstanceCreationExpression;
       expect(value.staticType, interfaceTypeStar(cElement));
 
       var constructorName = value.constructorName;
       expect(constructorName.staticElement, namedConstructor);
-      expect(constructorName.name.staticElement, namedConstructor);
-      expect(constructorName.name.staticType, isNull);
+      expect(constructorName.name!.staticElement, namedConstructor);
+      expect(constructorName.name!.staticType, isNull);
 
       TypeName typeName = constructorName.type;
       expect(typeName.typeArguments, isNull);
 
-      SimpleIdentifier typeIdentifier = typeName.name;
+      var typeIdentifier = typeName.name as SimpleIdentifier;
       expect(typeIdentifier.staticElement, cElement);
       expect(typeIdentifier.staticType, isNull);
 
@@ -2226,12 +2238,12 @@
 }
 ''');
     await resolveTestFile();
-    CompilationUnit unit = result.unit;
+    CompilationUnit unit = result.unit!;
 
-    ImportElement aImport = unit.declaredElement.library.imports[0];
-    LibraryElement aLibrary = aImport.importedLibrary;
+    ImportElement aImport = unit.declaredElement!.library.imports[0];
+    LibraryElement aLibrary = aImport.importedLibrary!;
 
-    ClassElement cElement = aLibrary.getType('C');
+    ClassElement cElement = aLibrary.getType('C')!;
     ConstructorElement defaultConstructor = cElement.constructors[0];
     ConstructorElement namedConstructor = cElement.constructors[1];
 
@@ -2242,8 +2254,8 @@
         nullabilitySuffix: NullabilitySuffix.star,
       );
 
-      ExpressionStatement statement = statements[0];
-      InstanceCreationExpression creation = statement.expression;
+      var statement = statements[0] as ExpressionStatement;
+      var creation = statement.expression as InstanceCreationExpression;
       expect(creation.staticType, cTypeInt);
 
       var constructorName = creation.constructorName;
@@ -2253,7 +2265,7 @@
       TypeName typeName = constructorName.type;
       expect(typeName.typeArguments, isNull);
 
-      PrefixedIdentifier typeIdentifier = typeName.name;
+      var typeIdentifier = typeName.name as PrefixedIdentifier;
       expect(typeIdentifier.staticElement, same(cElement));
       expect(typeIdentifier.staticType, isNull);
 
@@ -2271,19 +2283,19 @@
         nullabilitySuffix: NullabilitySuffix.star,
       );
 
-      ExpressionStatement statement = statements[1];
-      InstanceCreationExpression creation = statement.expression;
+      var statement = statements[1] as ExpressionStatement;
+      var creation = statement.expression as InstanceCreationExpression;
       expect(creation.staticType, cTypeDouble);
 
       var constructorName = creation.constructorName;
-      expect(constructorName.name.staticElement, namedConstructor);
-      expect(constructorName.name.staticType, isNull);
+      expect(constructorName.name!.staticElement, namedConstructor);
+      expect(constructorName.name!.staticType, isNull);
       expect(constructorName.staticElement, namedConstructor);
 
       TypeName typeName = constructorName.type;
       expect(typeName.typeArguments, isNull);
 
-      PrefixedIdentifier typeIdentifier = typeName.name;
+      var typeIdentifier = typeName.name as PrefixedIdentifier;
       expect(typeIdentifier.staticElement, cElement);
       expect(typeIdentifier.staticType, isNull);
 
@@ -2301,21 +2313,21 @@
         nullabilitySuffix: NullabilitySuffix.star,
       );
 
-      ExpressionStatement statement = statements[2];
-      InstanceCreationExpression creation = statement.expression;
+      var statement = statements[2] as ExpressionStatement;
+      var creation = statement.expression as InstanceCreationExpression;
       expect(creation.staticType, cTypeBool);
 
       var constructorName = creation.constructorName;
-      expect(constructorName.name.staticElement, namedConstructor);
-      expect(constructorName.name.staticType, isNull);
+      expect(constructorName.name!.staticElement, namedConstructor);
+      expect(constructorName.name!.staticType, isNull);
       expect(constructorName.staticElement, namedConstructor);
 
       TypeName typeName = constructorName.type;
-      expect(typeName.typeArguments.arguments, hasLength(1));
+      expect(typeName.typeArguments!.arguments, hasLength(1));
       _assertTypeNameSimple(
-          typeName.typeArguments.arguments[0], typeProvider.boolType);
+          typeName.typeArguments!.arguments[0], typeProvider.boolType);
 
-      PrefixedIdentifier typeIdentifier = typeName.name;
+      var typeIdentifier = typeName.name as PrefixedIdentifier;
       expect(typeIdentifier.staticElement, cElement);
       expect(typeIdentifier.staticType, isNull);
 
@@ -2343,10 +2355,10 @@
 }
 ''');
     await resolveTestFile();
-    CompilationUnit unit = result.unit;
-    CompilationUnitElement unitElement = unit.declaredElement;
+    CompilationUnit unit = result.unit!;
+    CompilationUnitElement unitElement = unit.declaredElement!;
 
-    ClassElement cElement = unitElement.getType('C');
+    ClassElement cElement = unitElement.getType('C')!;
     ConstructorElement defaultConstructor = cElement.constructors[0];
     ConstructorElement namedConstructor = cElement.constructors[1];
 
@@ -2357,8 +2369,8 @@
         nullabilitySuffix: NullabilitySuffix.star,
       );
 
-      ExpressionStatement statement = statements[0];
-      InstanceCreationExpression creation = statement.expression;
+      var statement = statements[0] as ExpressionStatement;
+      var creation = statement.expression as InstanceCreationExpression;
       expect(creation.staticType, cTypeInt);
 
       var constructorName = creation.constructorName;
@@ -2368,7 +2380,7 @@
       TypeName typeName = constructorName.type;
       expect(typeName.typeArguments, isNull);
 
-      SimpleIdentifier typeIdentifier = typeName.name;
+      var typeIdentifier = typeName.name as SimpleIdentifier;
       expect(typeIdentifier.staticElement, same(cElement));
       expect(typeIdentifier.staticType, isNull);
     }
@@ -2379,8 +2391,8 @@
         nullabilitySuffix: NullabilitySuffix.star,
       );
 
-      ExpressionStatement statement = statements[1];
-      InstanceCreationExpression creation = statement.expression;
+      var statement = statements[1] as ExpressionStatement;
+      var creation = statement.expression as InstanceCreationExpression;
       expect(creation.staticType, cTypeBool);
 
       var constructorName = creation.constructorName;
@@ -2388,11 +2400,11 @@
       expect(constructorName.staticElement, defaultConstructor);
 
       TypeName typeName = constructorName.type;
-      expect(typeName.typeArguments.arguments, hasLength(1));
+      expect(typeName.typeArguments!.arguments, hasLength(1));
       _assertTypeNameSimple(
-          typeName.typeArguments.arguments[0], typeProvider.boolType);
+          typeName.typeArguments!.arguments[0], typeProvider.boolType);
 
-      SimpleIdentifier typeIdentifier = typeName.name;
+      var typeIdentifier = typeName.name as SimpleIdentifier;
       expect(typeIdentifier.staticElement, same(cElement));
       expect(typeIdentifier.staticType, isNull);
     }
@@ -2403,19 +2415,19 @@
         nullabilitySuffix: NullabilitySuffix.star,
       );
 
-      ExpressionStatement statement = statements[2];
-      InstanceCreationExpression creation = statement.expression;
+      var statement = statements[2] as ExpressionStatement;
+      var creation = statement.expression as InstanceCreationExpression;
       expect(creation.staticType, cTypeDouble);
 
       var constructorName = creation.constructorName;
-      expect(constructorName.name.staticElement, namedConstructor);
-      expect(constructorName.name.staticType, isNull);
+      expect(constructorName.name!.staticElement, namedConstructor);
+      expect(constructorName.name!.staticType, isNull);
       expect(constructorName.staticElement, namedConstructor);
 
       TypeName typeName = constructorName.type;
       expect(typeName.typeArguments, isNull);
 
-      SimpleIdentifier typeIdentifier = typeName.name;
+      var typeIdentifier = typeName.name as SimpleIdentifier;
       expect(typeIdentifier.staticElement, cElement);
       expect(typeIdentifier.staticType, isNull);
     }
@@ -2426,21 +2438,21 @@
         nullabilitySuffix: NullabilitySuffix.star,
       );
 
-      ExpressionStatement statement = statements[3];
-      InstanceCreationExpression creation = statement.expression;
+      var statement = statements[3] as ExpressionStatement;
+      var creation = statement.expression as InstanceCreationExpression;
       expect(creation.staticType, cTypeBool);
 
       var constructorName = creation.constructorName;
-      expect(constructorName.name.staticElement, namedConstructor);
-      expect(constructorName.name.staticType, isNull);
+      expect(constructorName.name!.staticElement, namedConstructor);
+      expect(constructorName.name!.staticType, isNull);
       expect(constructorName.staticElement, namedConstructor);
 
       TypeName typeName = constructorName.type;
-      expect(typeName.typeArguments.arguments, hasLength(1));
+      expect(typeName.typeArguments!.arguments, hasLength(1));
       _assertTypeNameSimple(
-          typeName.typeArguments.arguments[0], typeProvider.boolType);
+          typeName.typeArguments!.arguments[0], typeProvider.boolType);
 
-      SimpleIdentifier typeIdentifier = typeName.name;
+      var typeIdentifier = typeName.name as SimpleIdentifier;
       expect(typeIdentifier.staticElement, cElement);
       expect(typeIdentifier.staticType, isNull);
     }
@@ -2458,8 +2470,8 @@
     await resolveTestFile();
 
     var cElement = findElement.class_('C');
-    var defaultConstructor = cElement.unnamedConstructor;
-    var namedConstructor = cElement.getNamedConstructor('named');
+    var defaultConstructor = cElement.unnamedConstructor!;
+    var namedConstructor = cElement.getNamedConstructor('named')!;
 
     {
       var creation = findNode.instanceCreation('new C<int, double>(1, 2.3);');
@@ -2470,9 +2482,9 @@
       var typeName = creation.constructorName.type;
       assertTypeName(typeName, cElement, 'C<int, double>');
 
-      var typeArguments = typeName.typeArguments.arguments;
-      assertTypeName(typeArguments[0], intElement, 'int');
-      assertTypeName(typeArguments[1], doubleElement, 'double');
+      var typeArguments = typeName.typeArguments!.arguments;
+      assertTypeName(typeArguments[0] as TypeName, intElement, 'int');
+      assertTypeName(typeArguments[1] as TypeName, doubleElement, 'double');
 
       expect(creation.constructorName.name, isNull);
 
@@ -2489,9 +2501,9 @@
       var typeName = creation.constructorName.type;
       assertTypeName(typeName, cElement, 'C<num, String>');
 
-      var typeArguments = typeName.typeArguments.arguments;
-      assertTypeName(typeArguments[0], numElement, 'num');
-      assertTypeName(typeArguments[1], stringElement, 'String');
+      var typeArguments = typeName.typeArguments!.arguments;
+      assertTypeName(typeArguments[0] as TypeName, numElement, 'num');
+      assertTypeName(typeArguments[1] as TypeName, stringElement, 'String');
 
       var constructorName = creation.constructorName.name;
       assertMember(
@@ -3087,7 +3099,7 @@
       assertElement(type.name, c);
       assertTypeNull(type.name);
 
-      SimpleIdentifier aRef = creation.argumentList.arguments[0];
+      var aRef = creation.argumentList.arguments[0] as SimpleIdentifier;
       assertElement(aRef, findElement.topGet('a'));
       assertType(aRef, 'int');
     }
@@ -3097,14 +3109,14 @@
       assertType(creation, 'C<bool>');
 
       ConstructorName constructorName = creation.constructorName;
-      expect(constructorName.name.name, 'named');
+      expect(constructorName.name!.name, 'named');
 
       TypeName type = constructorName.type;
       expect(type.typeArguments, isNull);
       assertElement(type.name, c);
       assertType(type.name, 'C<bool>');
 
-      SimpleIdentifier bRef = creation.argumentList.arguments[0];
+      var bRef = creation.argumentList.arguments[0] as SimpleIdentifier;
       assertElement(bRef, findElement.topGet('b'));
       assertType(bRef, 'bool');
     }
@@ -3114,10 +3126,10 @@
       assertType(creation, 'C<double>');
 
       ConstructorName constructorName = creation.constructorName;
-      expect(constructorName.name.name, 'named2');
+      expect(constructorName.name!.name, 'named2');
 
       TypeName type = constructorName.type;
-      assertTypeArguments(type.typeArguments, [doubleType]);
+      assertTypeArguments(type.typeArguments!, [doubleType]);
       assertElement(type.name, c);
       assertType(type.name, 'C<double>');
     }
@@ -3140,7 +3152,7 @@
     var creation = findNode.instanceCreation('new C(x: a)');
     _assertConstructorInvocation(creation, classElement);
 
-    NamedExpression argument = creation.argumentList.arguments[0];
+    var argument = creation.argumentList.arguments[0] as NamedExpression;
     assertElementNull(argument.name.label);
     var aRef = argument.expression;
     assertElement(aRef, findElement.topGet('a'));
@@ -3249,7 +3261,7 @@
     await resolveTestFile();
     expect(result.errors, isNotEmpty);
 
-    ImportElement import = findNode.import('dart:math').element;
+    ImportElement import = findNode.import('dart:math').element!;
 
     var pRef = findNode.simple('p(a)');
     assertElement(pRef, import.prefix);
@@ -3301,13 +3313,13 @@
     assertType(invocation.methodName, 'void Function({dynamic p})');
     assertType(invocation, 'void');
 
-    NamedExpression arg0 = invocation.argumentList.arguments[0];
+    var arg0 = invocation.argumentList.arguments[0] as NamedExpression;
     assertElement(arg0.name.label, f.parameters[0]);
-    assertIdentifierTopGetRef(arg0.expression, 'a');
+    assertIdentifierTopGetRef(arg0.expression as SimpleIdentifier, 'a');
 
-    NamedExpression arg1 = invocation.argumentList.arguments[1];
+    var arg1 = invocation.argumentList.arguments[1] as NamedExpression;
     assertElement(arg1.name.label, f.parameters[0]);
-    assertIdentifierTopGetRef(arg1.expression, 'b');
+    assertIdentifierTopGetRef(arg1.expression as SimpleIdentifier, 'b');
   }
 
   test_invalid_invocation_arguments_named_duplicate3() async {
@@ -3327,17 +3339,17 @@
     assertType(invocation.methodName, 'void Function({dynamic p})');
     assertType(invocation, 'void');
 
-    NamedExpression arg0 = invocation.argumentList.arguments[0];
+    var arg0 = invocation.argumentList.arguments[0] as NamedExpression;
     assertElement(arg0.name.label, f.parameters[0]);
-    assertIdentifierTopGetRef(arg0.expression, 'a');
+    assertIdentifierTopGetRef(arg0.expression as SimpleIdentifier, 'a');
 
-    NamedExpression arg1 = invocation.argumentList.arguments[1];
+    var arg1 = invocation.argumentList.arguments[1] as NamedExpression;
     assertElement(arg1.name.label, f.parameters[0]);
-    assertIdentifierTopGetRef(arg1.expression, 'b');
+    assertIdentifierTopGetRef(arg1.expression as SimpleIdentifier, 'b');
 
-    NamedExpression arg2 = invocation.argumentList.arguments[2];
+    var arg2 = invocation.argumentList.arguments[2] as NamedExpression;
     assertElement(arg2.name.label, f.parameters[0]);
-    assertIdentifierTopGetRef(arg2.expression, 'c');
+    assertIdentifierTopGetRef(arg2.expression as SimpleIdentifier, 'c');
   }
 
   test_invalid_invocation_arguments_requiredAfterNamed() async {
@@ -3458,11 +3470,11 @@
     await resolveTestFile();
     expect(result.errors, isNotEmpty);
 
-    ImportElement import = findNode.import('dart:math').element;
+    ImportElement import = findNode.import('dart:math').element!;
 
     var invocation = findNode.methodInvocation('p(a)');
     expect(invocation.staticType, isDynamicType);
-    assertUnresolvedInvokeType(invocation.staticInvokeType);
+    assertUnresolvedInvokeType(invocation.staticInvokeType!);
 
     var pRef = invocation.methodName;
     assertElement(pRef, import.prefix);
@@ -3631,8 +3643,8 @@
     await resolveTestFile();
     expect(result.errors, isNotEmpty);
 
-    ImportElement import = findNode.import('a.dart').element;
-    var tElement = import.importedLibrary.publicNamespace.get('T');
+    ImportElement import = findNode.import('a.dart').element!;
+    var tElement = import.importedLibrary!.publicNamespace.get('T');
 
     var prefixedName = findNode.prefixed('p.T');
     assertTypeDynamic(prefixedName);
@@ -3645,7 +3657,7 @@
     assertElement(tRef, tElement);
     assertTypeDynamic(tRef);
 
-    TypeName typeName = prefixedName.parent;
+    var typeName = prefixedName.parent as TypeName;
     expect(typeName.type, isDynamicType);
   }
 
@@ -3699,8 +3711,8 @@
     await resolveTestFile();
     expect(result.errors, isNotEmpty);
 
-    ImportElement import = findNode.import('a.dart').element;
-    var tElement = import.importedLibrary.publicNamespace.get('T');
+    ImportElement import = findNode.import('a.dart').element!;
+    var tElement = import.importedLibrary!.publicNamespace.get('T');
 
     var prefixedName = findNode.prefixed('p.T');
     assertTypeDynamic(prefixedName);
@@ -3713,7 +3725,7 @@
     assertElement(tRef, tElement);
     assertTypeDynamic(tRef);
 
-    TypeName typeName = prefixedName.parent;
+    var typeName = prefixedName.parent as TypeName;
     expect(typeName.type, isDynamicType);
   }
 
@@ -3728,7 +3740,7 @@
     expect(result.errors, isNotEmpty);
 
     var tRef = findNode.simple('T.U v;');
-    var tElement = findNode.typeParameter('T>()').declaredElement;
+    var tElement = findNode.typeParameter('T>()').declaredElement!;
     assertElement(tRef, tElement);
     assertTypeDynamic(tRef);
   }
@@ -3791,27 +3803,28 @@
 }
 ''');
 
-    NodeList<Statement> statements = _getMainStatements(result);
+    List<Statement> statements = _getMainStatements(result);
 
     // var v = 42;
     VariableElement vElement;
     {
-      VariableDeclarationStatement statement = statements[0];
-      vElement = statement.variables.variables[0].name.staticElement;
+      var statement = statements[0] as VariableDeclarationStatement;
+      vElement = statement.variables.variables[0].name.staticElement
+          as VariableElement;
     }
 
     // v is num;
     {
-      ExpressionStatement statement = statements[1];
-      IsExpression isExpression = statement.expression;
+      var statement = statements[1] as ExpressionStatement;
+      var isExpression = statement.expression as IsExpression;
       expect(isExpression.notOperator, isNull);
       expect(isExpression.staticType, typeProvider.boolType);
 
-      SimpleIdentifier target = isExpression.expression;
+      var target = isExpression.expression as SimpleIdentifier;
       expect(target.staticElement, vElement);
       expect(target.staticType, typeProvider.intType);
 
-      TypeName numName = isExpression.type;
+      var numName = isExpression.type as TypeName;
       expect(numName.name.staticElement, typeProvider.numType.element);
       expect(numName.name.staticType, isNull);
     }
@@ -3825,27 +3838,28 @@
 }
 ''');
 
-    NodeList<Statement> statements = _getMainStatements(result);
+    List<Statement> statements = _getMainStatements(result);
 
     // var v = 42;
     VariableElement vElement;
     {
-      VariableDeclarationStatement statement = statements[0];
-      vElement = statement.variables.variables[0].name.staticElement;
+      var statement = statements[0] as VariableDeclarationStatement;
+      vElement = statement.variables.variables[0].name.staticElement
+          as VariableElement;
     }
 
     // v is! num;
     {
-      ExpressionStatement statement = statements[1];
-      IsExpression isExpression = statement.expression;
+      var statement = statements[1] as ExpressionStatement;
+      var isExpression = statement.expression as IsExpression;
       expect(isExpression.notOperator, isNotNull);
       expect(isExpression.staticType, typeProvider.boolType);
 
-      SimpleIdentifier target = isExpression.expression;
+      var target = isExpression.expression as SimpleIdentifier;
       expect(target.staticElement, vElement);
       expect(target.staticType, typeProvider.intType);
 
-      TypeName numName = isExpression.type;
+      var numName = isExpression.type as TypeName;
       expect(numName.name.staticElement, typeProvider.numType.element);
       expect(numName.name.staticType, isNull);
     }
@@ -3864,21 +3878,21 @@
     await resolveTestFile();
     List<Statement> statements = _getMainStatements(result);
 
-    LabeledStatement statement = statements[0];
+    var statement = statements[0] as LabeledStatement;
 
     Label label = statement.labels.single;
-    LabelElement labelElement = label.label.staticElement;
+    var labelElement = label.label.staticElement as LabelElement;
 
-    WhileStatement whileStatement = statement.statement;
-    Block whileBlock = whileStatement.body;
+    var whileStatement = statement.statement as WhileStatement;
+    var whileBlock = whileStatement.body as Block;
 
-    ContinueStatement continueStatement = whileBlock.statements[0];
-    expect(continueStatement.label.staticElement, same(labelElement));
-    expect(continueStatement.label.staticType, isNull);
+    var continueStatement = whileBlock.statements[0] as ContinueStatement;
+    expect(continueStatement.label!.staticElement, same(labelElement));
+    expect(continueStatement.label!.staticType, isNull);
 
-    BreakStatement breakStatement = whileBlock.statements[1];
-    expect(breakStatement.label.staticElement, same(labelElement));
-    expect(breakStatement.label.staticType, isNull);
+    var breakStatement = whileBlock.statements[1] as BreakStatement;
+    expect(breakStatement.label!.staticElement, same(labelElement));
+    expect(breakStatement.label!.staticType, isNull);
   }
 
   test_listLiteral_01() async {
@@ -3944,17 +3958,17 @@
 
     InterfaceType doubleType = typeProvider.doubleType;
 
-    FunctionDeclarationStatement fStatement = mainStatements[0];
+    var fStatement = mainStatements[0] as FunctionDeclarationStatement;
     FunctionDeclaration fNode = fStatement.functionDeclaration;
     FunctionExpression fExpression = fNode.functionExpression;
-    FunctionElement fElement = fNode.declaredElement;
+    var fElement = fNode.declaredElement as FunctionElement;
     expect(fElement, isNotNull);
     assertType(fElement.type, fTypeString);
 
     expect(fNode.name.staticElement, same(fElement));
     expect(fNode.name.staticType, isNull);
 
-    TypeName fReturnTypeNode = fNode.returnType;
+    var fReturnTypeNode = fNode.returnType as TypeName;
     expect(fReturnTypeNode.name.staticElement, same(doubleType.element));
     expect(fReturnTypeNode.type, doubleType);
 
@@ -3964,27 +3978,27 @@
       List<ParameterElement> elements = fElement.parameters;
       expect(elements, hasLength(2));
 
-      List<FormalParameter> nodes = fExpression.parameters.parameters;
+      List<FormalParameter> nodes = fExpression.parameters!.parameters;
       expect(nodes, hasLength(2));
 
-      _assertSimpleParameter(nodes[0], elements[0],
+      _assertSimpleParameter(nodes[0] as SimpleFormalParameter, elements[0],
           name: 'a',
           offset: 29,
           kind: ParameterKind.REQUIRED,
           type: typeProvider.intType);
 
-      _assertSimpleParameter(nodes[1], elements[1],
+      _assertSimpleParameter(nodes[1] as SimpleFormalParameter, elements[1],
           name: 'b',
           offset: 39,
           kind: ParameterKind.REQUIRED,
           type: typeProvider.stringType);
     }
 
-    VariableDeclarationStatement vStatement = mainStatements[1];
+    var vStatement = mainStatements[1] as VariableDeclarationStatement;
     VariableDeclaration vDeclaration = vStatement.variables.variables[0];
-    expect(vDeclaration.declaredElement.type, doubleType);
+    expect(vDeclaration.declaredElement!.type, doubleType);
 
-    MethodInvocation fInvocation = vDeclaration.initializer;
+    var fInvocation = vDeclaration.initializer as MethodInvocation;
     expect(fInvocation.methodName.staticElement, same(fElement));
     assertType(fInvocation.methodName, fTypeString);
     expect(fInvocation.staticType, doubleType);
@@ -4020,16 +4034,16 @@
 
     List<Statement> mainStatements = _getMainStatements(result);
 
-    FunctionDeclarationStatement fStatement = mainStatements[0];
+    var fStatement = mainStatements[0] as FunctionDeclarationStatement;
     FunctionDeclaration fNode = fStatement.functionDeclaration;
     FunctionExpression fExpression = fNode.functionExpression;
-    FunctionElement fElement = fNode.declaredElement;
+    var fElement = fNode.declaredElement as FunctionElement;
 
     TypeParameterElement tElement = fElement.typeParameters[0];
     TypeParameterElement uElement = fElement.typeParameters[1];
 
     {
-      var fTypeParameters = fExpression.typeParameters.typeParameters;
+      var fTypeParameters = fExpression.typeParameters!.typeParameters;
       expect(fTypeParameters, hasLength(2));
 
       TypeParameter tNode = fTypeParameters[0];
@@ -4049,7 +4063,7 @@
     expect(fNode.name.staticElement, same(fElement));
     expect(fNode.name.staticType, fElement.type);
 
-    TypeName fReturnTypeNode = fNode.returnType;
+    var fReturnTypeNode = fNode.returnType as TypeName;
     expect(fReturnTypeNode.name.staticElement, same(tElement));
     expect(fReturnTypeNode.type, typeParameterTypeStar(tElement));
 
@@ -4059,16 +4073,16 @@
       List<ParameterElement> parameters = fElement.parameters;
       expect(parameters, hasLength(2));
 
-      List<FormalParameter> nodes = fExpression.parameters.parameters;
+      List<FormalParameter> nodes = fExpression.parameters!.parameters;
       expect(nodes, hasLength(2));
 
-      _assertSimpleParameter(nodes[0], parameters[0],
+      _assertSimpleParameter(nodes[0] as SimpleFormalParameter, parameters[0],
           name: 'a',
           offset: 28,
           kind: ParameterKind.REQUIRED,
           type: typeParameterTypeStar(tElement));
 
-      _assertSimpleParameter(nodes[1], parameters[1],
+      _assertSimpleParameter(nodes[1] as SimpleFormalParameter, parameters[1],
           name: 'b',
           offset: 33,
           kind: ParameterKind.REQUIRED,
@@ -4083,11 +4097,11 @@
       assertType(bRef, 'U');
     }
 
-    VariableDeclarationStatement vStatement = mainStatements[1];
+    var vStatement = mainStatements[1] as VariableDeclarationStatement;
     VariableDeclaration vDeclaration = vStatement.variables.variables[0];
-    expect(vDeclaration.declaredElement.type, typeProvider.intType);
+    expect(vDeclaration.declaredElement!.type, typeProvider.intType);
 
-    MethodInvocation fInvocation = vDeclaration.initializer;
+    var fInvocation = vDeclaration.initializer as MethodInvocation;
     expect(fInvocation.methodName.staticElement, same(fElement));
     expect(fInvocation.staticType, typeProvider.intType);
 
@@ -4104,9 +4118,9 @@
     await resolveTestFile();
     List<Statement> mainStatements = _getMainStatements(result);
 
-    FunctionDeclarationStatement fStatement = mainStatements[0];
+    var fStatement = mainStatements[0] as FunctionDeclarationStatement;
     FunctionDeclaration fNode = fStatement.functionDeclaration;
-    FunctionElement fElement = fNode.declaredElement;
+    var fElement = fNode.declaredElement as FunctionElement;
 
     assertType(
         fElement.type, 'void Function<T extends U, U, V extends U>(T, U, V)');
@@ -4126,9 +4140,9 @@
     await resolveTestFile();
     List<Statement> mainStatements = _getMainStatements(result);
 
-    FunctionDeclarationStatement fStatement = mainStatements[0];
+    var fStatement = mainStatements[0] as FunctionDeclarationStatement;
     FunctionDeclaration fNode = fStatement.functionDeclaration;
-    FunctionElement fElement = fNode.declaredElement;
+    var fElement = fNode.declaredElement as FunctionElement;
 
     assertType(fElement.type, 'void Function<T>({T x})');
     var tElement = fElement.typeParameters[0];
@@ -4146,9 +4160,9 @@
     await resolveTestFile();
     List<Statement> mainStatements = _getMainStatements(result);
 
-    FunctionDeclarationStatement fStatement = mainStatements[0];
+    var fStatement = mainStatements[0] as FunctionDeclarationStatement;
     FunctionDeclaration fNode = fStatement.functionDeclaration;
-    FunctionElement fElement = fNode.declaredElement;
+    var fElement = fNode.declaredElement as FunctionElement;
 
     assertType(fElement.type, 'void Function<T>([T])');
     var tElement = fElement.typeParameters[0];
@@ -4171,17 +4185,17 @@
 
     InterfaceType doubleType = typeProvider.doubleType;
 
-    FunctionDeclarationStatement fStatement = mainStatements[0];
+    var fStatement = mainStatements[0] as FunctionDeclarationStatement;
     FunctionDeclaration fNode = fStatement.functionDeclaration;
     FunctionExpression fExpression = fNode.functionExpression;
-    FunctionElement fElement = fNode.declaredElement;
+    var fElement = fNode.declaredElement as FunctionElement;
     expect(fElement, isNotNull);
     assertType(fElement.type, fTypeString);
 
     expect(fNode.name.staticElement, same(fElement));
     expect(fNode.name.staticType, isNull);
 
-    TypeName fReturnTypeNode = fNode.returnType;
+    var fReturnTypeNode = fNode.returnType as TypeName;
     expect(fReturnTypeNode.name.staticElement, same(doubleType.element));
     expect(fReturnTypeNode.type, doubleType);
 
@@ -4191,22 +4205,22 @@
       List<ParameterElement> elements = fElement.parameters;
       expect(elements, hasLength(3));
 
-      List<FormalParameter> nodes = fExpression.parameters.parameters;
+      List<FormalParameter> nodes = fExpression.parameters!.parameters;
       expect(nodes, hasLength(3));
 
-      _assertSimpleParameter(nodes[0], elements[0],
+      _assertSimpleParameter(nodes[0] as SimpleFormalParameter, elements[0],
           name: 'a',
           offset: 29,
           kind: ParameterKind.REQUIRED,
           type: typeProvider.intType);
 
-      _assertDefaultParameter(nodes[1], elements[1],
+      _assertDefaultParameter(nodes[1] as DefaultFormalParameter, elements[1],
           name: 'b',
           offset: 40,
           kind: ParameterKind.NAMED,
           type: typeProvider.stringType);
 
-      _assertDefaultParameter(nodes[2], elements[2],
+      _assertDefaultParameter(nodes[2] as DefaultFormalParameter, elements[2],
           name: 'c',
           offset: 48,
           kind: ParameterKind.NAMED,
@@ -4214,8 +4228,8 @@
     }
 
     {
-      ExpressionStatement statement = mainStatements[1];
-      MethodInvocation invocation = statement.expression;
+      var statement = mainStatements[1] as ExpressionStatement;
+      var invocation = statement.expression as MethodInvocation;
       List<Expression> arguments = invocation.argumentList.arguments;
 
       _assertArgumentToParameter(arguments[0], fElement.parameters[0]);
@@ -4234,10 +4248,10 @@
     await resolveTestFile();
     List<Statement> mainStatements = _getMainStatements(result);
 
-    FunctionDeclarationStatement fStatement = mainStatements[0];
+    var fStatement = mainStatements[0] as FunctionDeclarationStatement;
     FunctionDeclaration fNode = fStatement.functionDeclaration;
     FunctionExpression fExpression = fNode.functionExpression;
-    FunctionElement fElement = fNode.declaredElement;
+    var fElement = fNode.declaredElement as FunctionElement;
 
     expect(fNode.returnType, isNull);
     expect(fElement, isNotNull);
@@ -4263,17 +4277,17 @@
 
     InterfaceType doubleType = typeProvider.doubleType;
 
-    FunctionDeclarationStatement fStatement = mainStatements[0];
+    var fStatement = mainStatements[0] as FunctionDeclarationStatement;
     FunctionDeclaration fNode = fStatement.functionDeclaration;
     FunctionExpression fExpression = fNode.functionExpression;
-    FunctionElement fElement = fNode.declaredElement;
+    var fElement = fNode.declaredElement as FunctionElement;
     expect(fElement, isNotNull);
     assertType(fElement.type, fTypeString);
 
     expect(fNode.name.staticElement, same(fElement));
     expect(fNode.name.staticType, isNull);
 
-    TypeName fReturnTypeNode = fNode.returnType;
+    var fReturnTypeNode = fNode.returnType as TypeName;
     expect(fReturnTypeNode.name.staticElement, same(doubleType.element));
     expect(fReturnTypeNode.type, doubleType);
 
@@ -4283,22 +4297,22 @@
       List<ParameterElement> elements = fElement.parameters;
       expect(elements, hasLength(3));
 
-      List<FormalParameter> nodes = fExpression.parameters.parameters;
+      List<FormalParameter> nodes = fExpression.parameters!.parameters;
       expect(nodes, hasLength(3));
 
-      _assertSimpleParameter(nodes[0], elements[0],
+      _assertSimpleParameter(nodes[0] as SimpleFormalParameter, elements[0],
           name: 'a',
           offset: 29,
           kind: ParameterKind.REQUIRED,
           type: typeProvider.intType);
 
-      _assertDefaultParameter(nodes[1], elements[1],
+      _assertDefaultParameter(nodes[1] as DefaultFormalParameter, elements[1],
           name: 'b',
           offset: 40,
           kind: ParameterKind.POSITIONAL,
           type: typeProvider.stringType);
 
-      _assertDefaultParameter(nodes[2], elements[2],
+      _assertDefaultParameter(nodes[2] as DefaultFormalParameter, elements[2],
           name: 'c',
           offset: 48,
           kind: ParameterKind.POSITIONAL,
@@ -4306,11 +4320,11 @@
     }
 
     {
-      VariableDeclarationStatement statement = mainStatements[1];
+      var statement = mainStatements[1] as VariableDeclarationStatement;
       VariableDeclaration declaration = statement.variables.variables[0];
-      expect(declaration.declaredElement.type, doubleType);
+      expect(declaration.declaredElement!.type, doubleType);
 
-      MethodInvocation invocation = declaration.initializer;
+      var invocation = declaration.initializer as MethodInvocation;
       expect(invocation.methodName.staticElement, same(fElement));
       assertType(invocation.methodName, fTypeString);
       expect(invocation.staticType, doubleType);
@@ -4359,17 +4373,17 @@
 
     InterfaceType intType = typeProvider.intType;
 
-    FunctionDeclaration main = result.unit.declarations[0];
+    var main = result.unit!.declarations[0] as FunctionDeclaration;
     List<Statement> statements = _getMainStatements(result);
 
     // (int p)
-    VariableElement pElement = main.declaredElement.parameters[0];
+    VariableElement pElement = main.declaredElement!.parameters[0];
     expect(pElement.type, intType);
 
     // p;
     {
-      ExpressionStatement statement = statements[0];
-      SimpleIdentifier identifier = statement.expression;
+      var statement = statements[0] as ExpressionStatement;
+      var identifier = statement.expression as SimpleIdentifier;
       expect(identifier.staticElement, pElement);
       expect(identifier.staticType, intType);
     }
@@ -4391,44 +4405,48 @@
     List<Statement> mainStatements = _getMainStatements(result);
 
     // f(int a) {}
-    FunctionDeclarationStatement fStatement = mainStatements[0];
+    var fStatement = mainStatements[0] as FunctionDeclarationStatement;
     FunctionDeclaration fNode = fStatement.functionDeclaration;
     FunctionExpression fExpression = fNode.functionExpression;
-    FunctionElement fElement = fNode.declaredElement;
+    var fElement = fNode.declaredElement as FunctionElement;
     ParameterElement aElement = fElement.parameters[0];
-    _assertSimpleParameter(fExpression.parameters.parameters[0], aElement,
+    _assertSimpleParameter(
+        fExpression.parameters!.parameters[0] as SimpleFormalParameter,
+        aElement,
         name: 'a',
         offset: 27,
         kind: ParameterKind.REQUIRED,
         type: typeProvider.intType);
 
-    BlockFunctionBody fBody = fExpression.body;
+    var fBody = fExpression.body as BlockFunctionBody;
     List<Statement> fStatements = fBody.block.statements;
 
     // a;
-    ExpressionStatement aStatement = fStatements[0];
-    SimpleIdentifier aNode = aStatement.expression;
+    var aStatement = fStatements[0] as ExpressionStatement;
+    var aNode = aStatement.expression as SimpleIdentifier;
     expect(aNode.staticElement, same(aElement));
     expect(aNode.staticType, typeProvider.intType);
 
     // g(double b) {}
-    FunctionDeclarationStatement gStatement = fStatements[1];
+    var gStatement = fStatements[1] as FunctionDeclarationStatement;
     FunctionDeclaration gNode = gStatement.functionDeclaration;
     FunctionExpression gExpression = gNode.functionExpression;
-    FunctionElement gElement = gNode.declaredElement;
+    var gElement = gNode.declaredElement as FunctionElement;
     ParameterElement bElement = gElement.parameters[0];
-    _assertSimpleParameter(gExpression.parameters.parameters[0], bElement,
+    _assertSimpleParameter(
+        gExpression.parameters!.parameters[0] as SimpleFormalParameter,
+        bElement,
         name: 'b',
         offset: 57,
         kind: ParameterKind.REQUIRED,
         type: typeProvider.doubleType);
 
-    BlockFunctionBody gBody = gExpression.body;
+    var gBody = gExpression.body as BlockFunctionBody;
     List<Statement> gStatements = gBody.block.statements;
 
     // b;
-    ExpressionStatement bStatement = gStatements[0];
-    SimpleIdentifier bNode = bStatement.expression;
+    var bStatement = gStatements[0] as ExpressionStatement;
+    var bNode = bStatement.expression as SimpleIdentifier;
     expect(bNode.staticElement, same(bElement));
     expect(bNode.staticType, typeProvider.doubleType);
   }
@@ -4446,7 +4464,7 @@
 
     var mainStatements = _getMainStatements(result);
     var fDeclaration = mainStatements[0] as FunctionDeclarationStatement;
-    var fElement = fDeclaration.functionDeclaration.declaredElement;
+    var fElement = fDeclaration.functionDeclaration.declaredElement!;
     var tElement = fElement.typeParameters[0];
     var body = fDeclaration.functionDeclaration.functionExpression.body
         as BlockFunctionBody;
@@ -4469,7 +4487,7 @@
 
     var mainStatements = _getMainStatements(result);
     var fDeclaration = mainStatements[0] as FunctionDeclarationStatement;
-    var fElement = fDeclaration.functionDeclaration.declaredElement;
+    var fElement = fDeclaration.functionDeclaration.declaredElement!;
     var tElement = fElement.typeParameters[0];
     var body = fDeclaration.functionDeclaration.functionExpression.body
         as BlockFunctionBody;
@@ -4501,7 +4519,7 @@
 
     var mainStatements = _getMainStatements(result);
     var fDeclaration = mainStatements[0] as FunctionDeclarationStatement;
-    var fElement = fDeclaration.functionDeclaration.declaredElement;
+    var fElement = fDeclaration.functionDeclaration.declaredElement!;
     var tElement = fElement.typeParameters[0];
     var body = fDeclaration.functionDeclaration.functionExpression.body
         as BlockFunctionBody;
@@ -4532,7 +4550,7 @@
 
     var mainStatements = _getMainStatements(result);
     var fDeclaration = mainStatements[0] as FunctionDeclarationStatement;
-    var fElement = fDeclaration.functionDeclaration.declaredElement;
+    var fElement = fDeclaration.functionDeclaration.declaredElement!;
     var tElement = fElement.typeParameters[0];
     var body = fDeclaration.functionDeclaration.functionExpression.body
         as BlockFunctionBody;
@@ -4564,7 +4582,7 @@
 
     var mainStatements = _getMainStatements(result);
     var fDeclaration = mainStatements[0] as FunctionDeclarationStatement;
-    var fElement = fDeclaration.functionDeclaration.declaredElement;
+    var fElement = fDeclaration.functionDeclaration.declaredElement!;
     var tElement = fElement.typeParameters[0];
     var body = fDeclaration.functionDeclaration.functionExpression.body
         as BlockFunctionBody;
@@ -4592,7 +4610,7 @@
 
     var mainStatements = _getMainStatements(result);
     var fDeclaration = mainStatements[0] as FunctionDeclarationStatement;
-    var fElement = fDeclaration.functionDeclaration.declaredElement;
+    var fElement = fDeclaration.functionDeclaration.declaredElement!;
     var tElement = fElement.typeParameters[0];
     var body = fDeclaration.functionDeclaration.functionExpression.body
         as BlockFunctionBody;
@@ -4601,7 +4619,7 @@
     var yTypeType = yType.type as InterfaceType;
     var yTypeTypeArgument = yTypeType.typeArguments[0] as TypeParameterType;
     expect(yTypeTypeArgument.element, same(tElement));
-    var yElementType = yType.typeArguments.arguments[0] as TypeName;
+    var yElementType = yType.typeArguments!.arguments[0] as TypeName;
     var tReference = yElementType.name;
     assertElement(tReference, tElement);
     assertTypeNull(tReference);
@@ -4620,7 +4638,7 @@
 
     var mainStatements = _getMainStatements(result);
     var fDeclaration = mainStatements[0] as FunctionDeclarationStatement;
-    var fElement = fDeclaration.functionDeclaration.declaredElement;
+    var fElement = fDeclaration.functionDeclaration.declaredElement!;
     var tElement = fElement.typeParameters[0];
     var body = fDeclaration.functionDeclaration.functionExpression.body
         as BlockFunctionBody;
@@ -4643,7 +4661,7 @@
 ''');
     await resolveTestFile();
 
-    var tElement = findNode.typeParameter('T>(T x)').declaredElement;
+    var tElement = findNode.typeParameter('T>(T x)').declaredElement!;
 
     var gType = findNode.typeName('Consumer<T>');
     var gTypeType = gType.type as FunctionType;
@@ -4652,7 +4670,7 @@
         gTypeType.namedParameterTypes['u'] as TypeParameterType;
     expect(gTypeParameterType.element, same(tElement));
 
-    var gArgumentType = gType.typeArguments.arguments[0] as TypeName;
+    var gArgumentType = gType.typeArguments!.arguments[0] as TypeName;
     var tReference = gArgumentType.name;
     assertElement(tReference, tElement);
     assertTypeNull(tReference);
@@ -4670,7 +4688,7 @@
 ''');
     await resolveTestFile();
 
-    var tElement = findNode.typeParameter('T>(T x)').declaredElement;
+    var tElement = findNode.typeParameter('T>(T x)').declaredElement!;
 
     var gType = findNode.typeName('Consumer<T>');
     var gTypeType = gType.type as FunctionType;
@@ -4679,7 +4697,7 @@
         gTypeType.normalParameterTypes[0] as TypeParameterType;
     expect(gTypeParameterType.element, same(tElement));
 
-    var gArgumentType = gType.typeArguments.arguments[0] as TypeName;
+    var gArgumentType = gType.typeArguments!.arguments[0] as TypeName;
     var tReference = gArgumentType.name;
     assertElement(tReference, tElement);
     assertTypeNull(tReference);
@@ -4697,7 +4715,7 @@
 ''');
     await resolveTestFile();
 
-    var tElement = findNode.typeParameter('T>(T x)').declaredElement;
+    var tElement = findNode.typeParameter('T>(T x)').declaredElement!;
 
     var gType = findNode.typeName('Consumer<T>');
     var gTypeType = gType.type as FunctionType;
@@ -4706,7 +4724,7 @@
         gTypeType.optionalParameterTypes[0] as TypeParameterType;
     expect(gTypeParameterType.element, same(tElement));
 
-    var gArgumentType = gType.typeArguments.arguments[0] as TypeName;
+    var gArgumentType = gType.typeArguments!.arguments[0] as TypeName;
     var tReference = gArgumentType.name;
     assertElement(tReference, tElement);
     assertTypeNull(tReference);
@@ -4724,7 +4742,7 @@
 ''');
     await resolveTestFile();
 
-    var tElement = findNode.typeParameter('T>(T x)').declaredElement;
+    var tElement = findNode.typeParameter('T>(T x)').declaredElement!;
 
     var gType = findNode.typeName('Producer<T>');
     var gTypeType = gType.type as FunctionType;
@@ -4732,7 +4750,7 @@
     var gTypeReturnType = gTypeType.returnType as TypeParameterType;
     expect(gTypeReturnType.element, same(tElement));
 
-    var gArgumentType = gType.typeArguments.arguments[0] as TypeName;
+    var gArgumentType = gType.typeArguments!.arguments[0] as TypeName;
     var tReference = gArgumentType.name;
     assertElement(tReference, tElement);
     assertTypeNull(tReference);
@@ -4748,23 +4766,23 @@
 
     InterfaceType intType = typeProvider.intType;
 
-    FunctionDeclaration main = result.unit.declarations[0];
+    var main = result.unit!.declarations[0] as FunctionDeclaration;
     expect(main.declaredElement, isNotNull);
     expect(main.name.staticElement, isNotNull);
     expect(main.name.staticType, isNull);
 
-    BlockFunctionBody body = main.functionExpression.body;
+    var body = main.functionExpression.body as BlockFunctionBody;
     NodeList<Statement> statements = body.block.statements;
 
     // var v = 42;
     VariableElement vElement;
     {
-      VariableDeclarationStatement statement = statements[0];
+      var statement = statements[0] as VariableDeclarationStatement;
       VariableDeclaration vNode = statement.variables.variables[0];
       expect(vNode.name.staticType, isNull);
-      expect(vNode.initializer.staticType, intType);
+      expect(vNode.initializer!.staticType, intType);
 
-      vElement = vNode.name.staticElement;
+      vElement = vNode.name.staticElement as VariableElement;
       expect(vElement, isNotNull);
       expect(vElement.type, isNotNull);
       expect(vElement.type, intType);
@@ -4772,8 +4790,8 @@
 
     // v;
     {
-      ExpressionStatement statement = statements[1];
-      SimpleIdentifier identifier = statement.expression;
+      var statement = statements[1] as ExpressionStatement;
+      var identifier = statement.expression as SimpleIdentifier;
       expect(identifier.staticElement, same(vElement));
       expect(identifier.staticType, intType);
     }
@@ -4791,21 +4809,21 @@
 }
 ''');
     await resolveTestFile();
-    CompilationUnit unit = result.unit;
+    CompilationUnit unit = result.unit!;
 
-    ClassDeclaration cDeclaration = unit.declarations[0];
+    var cDeclaration = unit.declarations[0] as ClassDeclaration;
 
-    FieldDeclaration vDeclaration = cDeclaration.members[0];
+    var vDeclaration = cDeclaration.members[0] as FieldDeclaration;
     VariableDeclaration vNode = vDeclaration.fields.variables[0];
-    FieldElement vElement = vNode.declaredElement;
+    var vElement = vNode.declaredElement as FieldElement;
     expect(vElement.type, typeProvider.numType);
 
-    MethodDeclaration fooDeclaration = cDeclaration.members[1];
-    BlockFunctionBody fooBody = fooDeclaration.body;
+    var fooDeclaration = cDeclaration.members[1] as MethodDeclaration;
+    var fooBody = fooDeclaration.body as BlockFunctionBody;
     List<Statement> statements = fooBody.block.statements;
 
-    ForStatement forEachStatement = statements[0];
-    Block forBlock = forEachStatement.body;
+    var forEachStatement = statements[0] as ForStatement;
+    var forBlock = forEachStatement.body as Block;
     var forEachParts =
         forEachStatement.forLoopParts as ForEachPartsWithIdentifier;
 
@@ -4813,8 +4831,8 @@
     expect(vInFor.staticElement, same(vElement.setter));
     expect(vInFor.staticType, typeProvider.numType);
 
-    ExpressionStatement statement = forBlock.statements[0];
-    SimpleIdentifier identifier = statement.expression;
+    var statement = forBlock.statements[0] as ExpressionStatement;
+    var identifier = statement.expression as SimpleIdentifier;
     expect(identifier.staticElement, same(vElement.getter));
     expect(identifier.staticType, typeProvider.numType);
   }
@@ -4832,13 +4850,13 @@
 
     List<Statement> statements = _getMainStatements(result);
 
-    VariableDeclarationStatement vStatement = statements[0];
+    var vStatement = statements[0] as VariableDeclarationStatement;
     VariableDeclaration vNode = vStatement.variables.variables[0];
-    LocalVariableElement vElement = vNode.declaredElement;
+    var vElement = vNode.declaredElement as LocalVariableElement;
     expect(vElement.type, typeProvider.numType);
 
-    ForStatement forEachStatement = statements[1];
-    Block forBlock = forEachStatement.body;
+    var forEachStatement = statements[1] as ForStatement;
+    var forBlock = forEachStatement.body as Block;
     var forEachParts =
         forEachStatement.forLoopParts as ForEachPartsWithIdentifier;
 
@@ -4846,8 +4864,8 @@
     expect(vInFor.staticElement, vElement);
     expect(vInFor.staticType, typeProvider.numType);
 
-    ExpressionStatement statement = forBlock.statements[0];
-    SimpleIdentifier identifier = statement.expression;
+    var statement = forBlock.statements[0] as ExpressionStatement;
+    var identifier = statement.expression as SimpleIdentifier;
     expect(identifier.staticElement, same(vElement));
     expect(identifier.staticType, typeProvider.numType);
   }
@@ -4862,17 +4880,17 @@
 num v;
 ''');
     await resolveTestFile();
-    CompilationUnit unit = result.unit;
+    CompilationUnit unit = result.unit!;
 
     List<Statement> statements = _getMainStatements(result);
 
-    TopLevelVariableDeclaration vDeclaration = unit.declarations[1];
+    var vDeclaration = unit.declarations[1] as TopLevelVariableDeclaration;
     VariableDeclaration vNode = vDeclaration.variables.variables[0];
-    TopLevelVariableElement vElement = vNode.declaredElement;
+    var vElement = vNode.declaredElement as TopLevelVariableElement;
     expect(vElement.type, typeProvider.numType);
 
-    ForStatement forEachStatement = statements[0];
-    Block forBlock = forEachStatement.body;
+    var forEachStatement = statements[0] as ForStatement;
+    var forBlock = forEachStatement.body as Block;
     var forEachParts =
         forEachStatement.forLoopParts as ForEachPartsWithIdentifier;
 
@@ -4880,8 +4898,8 @@
     expect(vInFor.staticElement, same(vElement.setter));
     expect(vInFor.staticType, typeProvider.numType);
 
-    ExpressionStatement statement = forBlock.statements[0];
-    SimpleIdentifier identifier = statement.expression;
+    var statement = forBlock.statements[0] as ExpressionStatement;
+    var identifier = statement.expression as SimpleIdentifier;
     expect(identifier.staticElement, same(vElement.getter));
     expect(identifier.staticType, typeProvider.numType);
   }
@@ -4898,20 +4916,20 @@
 
     List<Statement> statements = _getMainStatements(result);
 
-    ForStatement forEachStatement = statements[0];
-    Block forBlock = forEachStatement.body;
+    var forEachStatement = statements[0] as ForStatement;
+    var forBlock = forEachStatement.body as Block;
     var forEachParts =
         forEachStatement.forLoopParts as ForEachPartsWithDeclaration;
 
     DeclaredIdentifier vNode = forEachParts.loopVariable;
-    LocalVariableElement vElement = vNode.declaredElement;
+    LocalVariableElement vElement = vNode.declaredElement!;
     expect(vElement.type, typeProvider.intType);
 
     expect(vNode.identifier.staticElement, vElement);
     expect(vNode.identifier.staticType, isNull);
 
-    ExpressionStatement statement = forBlock.statements[0];
-    SimpleIdentifier identifier = statement.expression;
+    var statement = forBlock.statements[0] as ExpressionStatement;
+    var identifier = statement.expression as SimpleIdentifier;
     expect(identifier.staticElement, vElement);
     expect(identifier.staticType, typeProvider.intType);
   }
@@ -4928,27 +4946,27 @@
 
     List<Statement> statements = _getMainStatements(result);
 
-    ForStatement forEachStatement = statements[0];
-    Block forBlock = forEachStatement.body;
+    var forEachStatement = statements[0] as ForStatement;
+    var forBlock = forEachStatement.body as Block;
     var forEachParts =
         forEachStatement.forLoopParts as ForEachPartsWithDeclaration;
 
     DeclaredIdentifier vNode = forEachParts.loopVariable;
-    LocalVariableElement vElement = vNode.declaredElement;
+    LocalVariableElement vElement = vNode.declaredElement!;
     expect(vElement.type, typeProvider.numType);
 
-    TypeName vTypeName = vNode.type;
+    var vTypeName = vNode.type as TypeName;
     expect(vTypeName.type, typeProvider.numType);
 
-    SimpleIdentifier vTypeIdentifier = vTypeName.name;
+    var vTypeIdentifier = vTypeName.name as SimpleIdentifier;
     expect(vTypeIdentifier.staticElement, typeProvider.numType.element);
     expect(vTypeIdentifier.staticType, isNull);
 
     expect(vNode.identifier.staticElement, vElement);
     expect(vNode.identifier.staticType, isNull);
 
-    ExpressionStatement statement = forBlock.statements[0];
-    SimpleIdentifier identifier = statement.expression;
+    var statement = forBlock.statements[0] as ExpressionStatement;
+    var identifier = statement.expression as SimpleIdentifier;
     expect(identifier.staticElement, vElement);
     expect(identifier.staticType, typeProvider.numType);
   }
@@ -4963,14 +4981,14 @@
 
     List<Statement> statements = _getMainStatements(result);
 
-    VariableDeclarationStatement declarationStatement = statements[0];
+    var declarationStatement = statements[0] as VariableDeclarationStatement;
 
     VariableDeclaration aNode = declarationStatement.variables.variables[0];
-    LocalVariableElement aElement = aNode.declaredElement;
+    var aElement = aNode.declaredElement as LocalVariableElement;
     expect(aElement.type, typeProvider.intType);
 
     VariableDeclaration bNode = declarationStatement.variables.variables[1];
-    LocalVariableElement bElement = bNode.declaredElement;
+    var bElement = bNode.declaredElement as LocalVariableElement;
     expect(bElement.type, typeProvider.doubleType);
   }
 
@@ -4993,47 +5011,47 @@
     List<Statement> mainStatements = _getMainStatements(result);
 
     // f() {}
-    FunctionDeclarationStatement fStatement = mainStatements[0];
+    var fStatement = mainStatements[0] as FunctionDeclarationStatement;
     FunctionDeclaration fNode = fStatement.functionDeclaration;
-    BlockFunctionBody fBody = fNode.functionExpression.body;
+    var fBody = fNode.functionExpression.body as BlockFunctionBody;
     List<Statement> fStatements = fBody.block.statements;
 
     // int a;
-    VariableDeclarationStatement aDeclaration = fStatements[0];
+    var aDeclaration = fStatements[0] as VariableDeclarationStatement;
     VariableElement aElement =
-        aDeclaration.variables.variables[0].declaredElement;
+        aDeclaration.variables.variables[0].declaredElement!;
 
     // a;
     {
-      ExpressionStatement aStatement = fStatements[1];
-      SimpleIdentifier aNode = aStatement.expression;
+      var aStatement = fStatements[1] as ExpressionStatement;
+      var aNode = aStatement.expression as SimpleIdentifier;
       expect(aNode.staticElement, same(aElement));
       expect(aNode.staticType, typeProvider.intType);
     }
 
     // g(double b) {}
-    FunctionDeclarationStatement gStatement = fStatements[2];
+    var gStatement = fStatements[2] as FunctionDeclarationStatement;
     FunctionDeclaration gNode = gStatement.functionDeclaration;
-    BlockFunctionBody gBody = gNode.functionExpression.body;
+    var gBody = gNode.functionExpression.body as BlockFunctionBody;
     List<Statement> gStatements = gBody.block.statements;
 
     // double b;
-    VariableDeclarationStatement bDeclaration = gStatements[0];
+    var bDeclaration = gStatements[0] as VariableDeclarationStatement;
     VariableElement bElement =
-        bDeclaration.variables.variables[0].declaredElement;
+        bDeclaration.variables.variables[0].declaredElement!;
 
     // a;
     {
-      ExpressionStatement aStatement = gStatements[1];
-      SimpleIdentifier aNode = aStatement.expression;
+      var aStatement = gStatements[1] as ExpressionStatement;
+      var aNode = aStatement.expression as SimpleIdentifier;
       expect(aNode.staticElement, same(aElement));
       expect(aNode.staticType, typeProvider.intType);
     }
 
     // b;
     {
-      ExpressionStatement bStatement = gStatements[2];
-      SimpleIdentifier bNode = bStatement.expression;
+      var bStatement = gStatements[2] as ExpressionStatement;
+      var bNode = bStatement.expression as SimpleIdentifier;
       expect(bNode.staticElement, same(bElement));
       expect(bNode.staticType, typeProvider.doubleType);
     }
@@ -5051,15 +5069,15 @@
     var statements = _getMainStatements(result);
 
     {
-      ExpressionStatement statement = statements[0];
-      SetOrMapLiteral mapLiteral = statement.expression;
+      var statement = statements[0] as ExpressionStatement;
+      var mapLiteral = statement.expression as SetOrMapLiteral;
       expect(mapLiteral.staticType,
           typeProvider.mapType2(typeProvider.intType, typeProvider.doubleType));
     }
 
     {
-      ExpressionStatement statement = statements[1];
-      SetOrMapLiteral mapLiteral = statement.expression;
+      var statement = statements[1] as ExpressionStatement;
+      var mapLiteral = statement.expression as SetOrMapLiteral;
       expect(
           mapLiteral.staticType,
           typeProvider.mapType2(
@@ -5104,9 +5122,9 @@
     String fTypeString = 'double Function(int, {String b, bool c})';
 
     await resolveTestFile();
-    ClassDeclaration classDeclaration = result.unit.declarations[0];
-    MethodDeclaration methodDeclaration = classDeclaration.members[0];
-    MethodElement methodElement = methodDeclaration.declaredElement;
+    var classDeclaration = result.unit!.declarations[0] as ClassDeclaration;
+    var methodDeclaration = classDeclaration.members[0] as MethodDeclaration;
+    var methodElement = methodDeclaration.declaredElement as MethodElement;
 
     InterfaceType doubleType = typeProvider.doubleType;
 
@@ -5116,7 +5134,7 @@
     expect(methodDeclaration.name.staticElement, same(methodElement));
     expect(methodDeclaration.name.staticType, isNull);
 
-    TypeName fReturnTypeNode = methodDeclaration.returnType;
+    var fReturnTypeNode = methodDeclaration.returnType as TypeName;
     expect(fReturnTypeNode.name.staticElement, same(doubleType.element));
     expect(fReturnTypeNode.type, doubleType);
     //
@@ -5125,22 +5143,22 @@
     List<ParameterElement> elements = methodElement.parameters;
     expect(elements, hasLength(3));
 
-    List<FormalParameter> nodes = methodDeclaration.parameters.parameters;
+    List<FormalParameter> nodes = methodDeclaration.parameters!.parameters;
     expect(nodes, hasLength(3));
 
-    _assertSimpleParameter(nodes[0], elements[0],
+    _assertSimpleParameter(nodes[0] as SimpleFormalParameter, elements[0],
         name: 'a',
         offset: 25,
         kind: ParameterKind.REQUIRED,
         type: typeProvider.intType);
 
-    _assertDefaultParameter(nodes[1], elements[1],
+    _assertDefaultParameter(nodes[1] as DefaultFormalParameter, elements[1],
         name: 'b',
         offset: 36,
         kind: ParameterKind.NAMED,
         type: typeProvider.stringType);
 
-    _assertDefaultParameter(nodes[2], elements[2],
+    _assertDefaultParameter(nodes[2] as DefaultFormalParameter, elements[2],
         name: 'c',
         offset: 44,
         kind: ParameterKind.NAMED,
@@ -5148,10 +5166,11 @@
     //
     // Validate the arguments at the call site.
     //
-    FunctionDeclaration functionDeclaration = result.unit.declarations[1];
-    BlockFunctionBody body = functionDeclaration.functionExpression.body;
-    ExpressionStatement statement = body.block.statements[0];
-    MethodInvocation invocation = statement.expression;
+    var 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;
 
     List<Expression> arguments = invocation.argumentList.arguments;
     _assertArgumentToParameter(arguments[0], methodElement.parameters[0]);
@@ -5171,14 +5190,14 @@
     await resolveTestFile();
     expect(result.errors, isEmpty);
 
-    ClassDeclaration cNode = result.unit.declarations[0];
-    ClassElement cElement = cNode.declaredElement;
+    var cNode = result.unit!.declarations[0] as ClassDeclaration;
+    ClassElement cElement = cNode.declaredElement!;
     MethodElement callElement = cElement.methods[0];
 
     List<Statement> statements = _getMainStatements(result);
 
-    ExpressionStatement statement = statements[0];
-    MethodInvocation invocation = statement.expression;
+    var statement = statements[0] as ExpressionStatement;
+    var invocation = statement.expression as MethodInvocation;
 
     expect(invocation.staticType, typeProvider.doubleType);
     assertInvokeType(invocation, 'double Function(int)');
@@ -5197,20 +5216,20 @@
     await resolveTestFile();
     expect(result.errors, isEmpty);
 
-    FunctionDeclaration main = result.unit.declarations[0];
-    FunctionElement mainElement = main.declaredElement;
+    var main = result.unit!.declarations[0] as FunctionDeclaration;
+    var mainElement = main.declaredElement as FunctionElement;
     ParameterElement parameter = mainElement.parameters[0];
 
-    BlockFunctionBody mainBody = main.functionExpression.body;
+    var mainBody = main.functionExpression.body as BlockFunctionBody;
     List<Statement> statements = mainBody.block.statements;
 
-    ExpressionStatement statement = statements[0];
-    MethodInvocation invocation = statement.expression;
+    var statement = statements[0] as ExpressionStatement;
+    var invocation = statement.expression as MethodInvocation;
 
     expect(invocation.staticType, typeProvider.doubleType);
     assertInvokeType(invocation, 'double Function(int)');
 
-    SimpleIdentifier target = invocation.target;
+    var target = invocation.target as SimpleIdentifier;
     expect(target.staticElement, same(parameter));
     assertType(target.staticType, 'double Function(int)');
 
@@ -5234,13 +5253,13 @@
 ''');
     await resolveTestFile();
 
-    ClassDeclaration aNode = result.unit.declarations[0];
-    MethodDeclaration fooNode = aNode.members[0];
-    MethodElement fooElement = fooNode.declaredElement;
+    var aNode = result.unit!.declarations[0] as ClassDeclaration;
+    var fooNode = aNode.members[0] as MethodDeclaration;
+    var fooElement = fooNode.declaredElement as MethodElement;
 
     List<Statement> mainStatements = _getMainStatements(result);
-    ExpressionStatement statement = mainStatements[0];
-    MethodInvocation invocation = statement.expression;
+    var statement = mainStatements[0] as ExpressionStatement;
+    var invocation = statement.expression as MethodInvocation;
     expect(invocation.methodName.staticElement, same(fooElement));
 
     var invokeTypeStr = 'void Function(int)';
@@ -5319,11 +5338,11 @@
     await resolveTestFile();
     List<Statement> mainStatements = _getMainStatements(result);
 
-    FunctionDeclaration foo = result.unit.declarations[1];
-    ExecutableElement fooElement = foo.declaredElement;
+    var foo = result.unit!.declarations[1] as FunctionDeclaration;
+    ExecutableElement fooElement = foo.declaredElement!;
 
-    ExpressionStatement statement = mainStatements[0];
-    MethodInvocation invocation = statement.expression;
+    var statement = mainStatements[0] as ExpressionStatement;
+    var invocation = statement.expression as MethodInvocation;
     List<Expression> arguments = invocation.argumentList.arguments;
 
     _assertArgumentToParameter(arguments[0], fooElement.parameters[0]);
@@ -5466,17 +5485,17 @@
     await resolveTestFile();
     List<Statement> mainStatements = _getMainStatements(result);
 
-    ClassDeclaration cNode = result.unit.declarations[1];
-    ClassElement cElement = cNode.declaredElement;
-    MethodDeclaration mNode = cNode.members[0];
-    MethodElement mElement = mNode.declaredElement;
+    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;
 
     {
-      ExpressionStatement statement = mainStatements[0];
-      MethodInvocation invocation = statement.expression;
+      var statement = mainStatements[0] as ExpressionStatement;
+      var invocation = statement.expression as MethodInvocation;
       List<Expression> arguments = invocation.argumentList.arguments;
 
-      SimpleIdentifier target = invocation.target;
+      var target = invocation.target as SimpleIdentifier;
       expect(target.staticElement, same(cElement));
       assertTypeNull(target);
 
@@ -5491,12 +5510,12 @@
     }
 
     {
-      MethodDeclaration fooNode = cNode.members[1];
-      BlockFunctionBody fooBody = fooNode.body;
+      var fooNode = cNode.members[1] as MethodDeclaration;
+      var fooBody = fooNode.body as BlockFunctionBody;
       List<Statement> statements = fooBody.block.statements;
 
-      ExpressionStatement statement = statements[0];
-      MethodInvocation invocation = statement.expression;
+      var statement = statements[0] as ExpressionStatement;
+      var invocation = statement.expression as MethodInvocation;
       List<Expression> arguments = invocation.argumentList.arguments;
 
       expect(invocation.target, isNull);
@@ -5523,16 +5542,16 @@
 ''');
     await resolveTestFile();
 
-    ClassDeclaration cNode = result.unit.declarations[0];
-    TypeParameterElement tElement = cNode.declaredElement.typeParameters[0];
+    var cNode = result.unit!.declarations[0] as ClassDeclaration;
+    TypeParameterElement tElement = cNode.declaredElement!.typeParameters[0];
 
-    MethodDeclaration barNode = cNode.members[1];
-    BlockFunctionBody barBody = barNode.body;
-    ExpressionStatement fooStatement = barBody.block.statements[0];
-    MethodInvocation fooInvocation = fooStatement.expression;
+    var barNode = cNode.members[1] as MethodDeclaration;
+    var barBody = barNode.body as BlockFunctionBody;
+    var fooStatement = barBody.block.statements[0] as ExpressionStatement;
+    var fooInvocation = fooStatement.expression as MethodInvocation;
     assertInvokeType(fooInvocation, 'T Function(C<T>)');
     assertType(fooInvocation.staticType, 'T');
-    expect(fooInvocation.staticType.element, same(tElement));
+    expect(fooInvocation.staticType!.element, same(tElement));
   }
 
   test_methodInvocation_topLevelFunction() async {
@@ -5549,11 +5568,11 @@
 
     InterfaceType doubleType = typeProvider.doubleType;
 
-    FunctionDeclaration fNode = result.unit.declarations[1];
-    FunctionElement fElement = fNode.declaredElement;
+    var fNode = result.unit!.declarations[1] as FunctionDeclaration;
+    var fElement = fNode.declaredElement as FunctionElement;
 
-    ExpressionStatement statement = mainStatements[0];
-    MethodInvocation invocation = statement.expression;
+    var statement = mainStatements[0] as ExpressionStatement;
+    var invocation = statement.expression as MethodInvocation;
     List<Expression> arguments = invocation.argumentList.arguments;
 
     expect(invocation.methodName.staticElement, same(fElement));
@@ -5578,26 +5597,26 @@
 
     List<Statement> mainStatements = _getMainStatements(result);
 
-    FunctionDeclaration fNode = result.unit.declarations[1];
-    FunctionElement fElement = fNode.declaredElement;
+    var fNode = result.unit!.declarations[1] as FunctionDeclaration;
+    var fElement = fNode.declaredElement as FunctionElement;
 
     // f<bool, String>(true, 'str');
     {
       String fTypeString = 'void Function(bool, String)';
-      ExpressionStatement statement = mainStatements[0];
-      MethodInvocation invocation = statement.expression;
+      var statement = mainStatements[0] as ExpressionStatement;
+      var invocation = statement.expression as MethodInvocation;
 
-      List<TypeAnnotation> typeArguments = invocation.typeArguments.arguments;
+      List<TypeAnnotation> typeArguments = invocation.typeArguments!.arguments;
       expect(typeArguments, hasLength(2));
       {
-        TypeName typeArgument = typeArguments[0];
+        var typeArgument = typeArguments[0] as TypeName;
         InterfaceType boolType = typeProvider.boolType;
         expect(typeArgument.type, boolType);
         expect(typeArgument.name.staticElement, boolType.element);
         expect(typeArgument.name.staticType, boolType);
       }
       {
-        TypeName typeArgument = typeArguments[1];
+        var typeArgument = typeArguments[1] as TypeName;
         InterfaceType stringType = typeProvider.stringType;
         expect(typeArgument.type, stringType);
         expect(typeArgument.name.staticElement, stringType.element);
@@ -5620,8 +5639,8 @@
     // f(1, 2.3);
     {
       String fTypeString = 'void Function(int, double)';
-      ExpressionStatement statement = mainStatements[1];
-      MethodInvocation invocation = statement.expression;
+      var statement = mainStatements[1] as ExpressionStatement;
+      var invocation = statement.expression as MethodInvocation;
       List<Expression> arguments = invocation.argumentList.arguments;
 
       expect(invocation.methodName.staticElement, same(fElement));
@@ -5659,7 +5678,7 @@
 
     {
       var creation = findNode.instanceCreation('C.named(); // ref');
-      var namedConstructor = c.getNamedConstructor('named');
+      var namedConstructor = c.getNamedConstructor('named')!;
       assertElement(creation, namedConstructor);
       assertType(creation, 'C');
 
@@ -5683,7 +5702,7 @@
     await resolveTestFile();
     expect(result.errors, isEmpty);
     var import = findElement.import('package:test/a.dart');
-    var c = import.importedLibrary.getType('C');
+    var c = import.importedLibrary!.getType('C')!;
 
     {
       var creation = findNode.instanceCreation('C(); // ref');
@@ -5696,7 +5715,7 @@
 
     {
       var creation = findNode.instanceCreation('C.named(); // ref');
-      var namedConstructor = c.getNamedConstructor('named');
+      var namedConstructor = c.getNamedConstructor('named')!;
       assertElement(creation, namedConstructor);
       assertType(creation, 'C');
 
@@ -5721,7 +5740,7 @@
 
     {
       var creation = findNode.instanceCreation('C<int>(); // ref');
-      assertMember(creation, c.unnamedConstructor, {'T': 'int'});
+      assertMember(creation, c.unnamedConstructor!, {'T': 'int'});
       assertType(creation, 'C<int>');
 
       assertTypeName(creation.constructorName.type, c, 'C<int>');
@@ -5730,7 +5749,7 @@
 
     {
       var creation = findNode.instanceCreation('C<String>.named(); // ref');
-      var namedConstructor = c.getNamedConstructor('named');
+      var namedConstructor = c.getNamedConstructor('named')!;
       assertMember(creation, namedConstructor, {'T': 'String'});
       assertType(creation, 'C<String>');
 
@@ -6008,20 +6027,20 @@
 
     VariableElement v;
     {
-      VariableDeclarationStatement statement = mainStatements[0];
-      v = statement.variables.variables[0].declaredElement;
+      var statement = mainStatements[0] as VariableDeclarationStatement;
+      v = statement.variables.variables[0].declaredElement!;
       expect(v.type, typeProvider.intType);
     }
 
     {
-      ExpressionStatement statement = mainStatements[1];
+      var statement = mainStatements[1] as ExpressionStatement;
 
-      PostfixExpression postfix = statement.expression;
+      var postfix = statement.expression as PostfixExpression;
       expect(postfix.operator.type, TokenType.PLUS_PLUS);
-      expect(postfix.staticElement.name, '+');
+      expect(postfix.staticElement!.name, '+');
       expect(postfix.staticType, typeProvider.intType);
 
-      SimpleIdentifier operand = postfix.operand;
+      var operand = postfix.operand as SimpleIdentifier;
       if (hasAssignmentLeftResolution) {
         expect(operand.staticElement, same(v));
         expect(operand.staticType, typeProvider.intType);
@@ -6044,23 +6063,23 @@
     addTestFile(content);
 
     await resolveTestFile();
-    CompilationUnit unit = result.unit;
+    CompilationUnit unit = result.unit!;
 
-    ClassDeclaration cClassDeclaration = unit.declarations[1];
-    ClassElement cClassElement = cClassDeclaration.declaredElement;
-    FieldElement fElement = cClassElement.getField('f');
+    var cClassDeclaration = unit.declarations[1] as ClassDeclaration;
+    ClassElement cClassElement = cClassDeclaration.declaredElement!;
+    FieldElement fElement = cClassElement.getField('f')!;
 
     List<Statement> mainStatements = _getMainStatements(result);
 
     {
-      ExpressionStatement statement = mainStatements[0];
+      var statement = mainStatements[0] as ExpressionStatement;
 
-      PostfixExpression postfix = statement.expression;
+      var postfix = statement.expression as PostfixExpression;
       expect(postfix.operator.type, TokenType.PLUS_PLUS);
-      expect(postfix.staticElement.name, '+');
+      expect(postfix.staticElement!.name, '+');
       expect(postfix.staticType, typeProvider.intType);
 
-      PropertyAccess propertyAccess = postfix.operand;
+      var propertyAccess = postfix.operand as PropertyAccess;
       if (hasAssignmentLeftResolution) {
         expect(propertyAccess.staticType, typeProvider.intType);
       } else {
@@ -6143,16 +6162,16 @@
 
     List<Statement> statements = _getMainStatements(result);
 
-    ClassDeclaration cDeclaration = result.unit.declarations[1];
-    ClassElement cElement = cDeclaration.declaredElement;
+    var cDeclaration = result.unit!.declarations[1] as ClassDeclaration;
+    ClassElement cElement = cDeclaration.declaredElement!;
     FieldElement fElement = cElement.fields[0];
 
-    VariableDeclarationStatement cStatement = statements[0];
+    var cStatement = statements[0] as VariableDeclarationStatement;
     VariableElement vElement =
-        cStatement.variables.variables[0].declaredElement;
+        cStatement.variables.variables[0].declaredElement!;
 
-    ExpressionStatement statement = statements[1];
-    PrefixedIdentifier prefixed = statement.expression;
+    var statement = statements[1] as ExpressionStatement;
+    var prefixed = statement.expression as PrefixedIdentifier;
 
     SimpleIdentifier prefix = prefixed.prefix;
     expect(prefix.staticElement, same(vElement));
@@ -6178,12 +6197,12 @@
 
     List<Statement> statements = _getMainStatements(result);
 
-    ClassDeclaration cDeclaration = result.unit.declarations[1];
-    ClassElement cElement = cDeclaration.declaredElement;
+    var cDeclaration = result.unit!.declarations[1] as ClassDeclaration;
+    ClassElement cElement = cDeclaration.declaredElement!;
     FieldElement fElement = cElement.fields[0];
 
-    ExpressionStatement statement = statements[0];
-    PrefixedIdentifier prefixed = statement.expression;
+    var statement = statements[0] as ExpressionStatement;
+    var prefixed = statement.expression as PrefixedIdentifier;
 
     SimpleIdentifier prefix = prefixed.prefix;
     expect(prefix.staticElement, same(cElement));
@@ -6203,15 +6222,15 @@
     await resolveTestFile();
     expect(result.errors, isEmpty);
 
-    FunctionDeclaration main = result.unit.declarations[0];
-    FunctionElement mainElement = main.declaredElement;
+    var main = result.unit!.declarations[0] as FunctionDeclaration;
+    var mainElement = main.declaredElement as FunctionElement;
     ParameterElement parameter = mainElement.parameters[0];
 
-    BlockFunctionBody mainBody = main.functionExpression.body;
+    var mainBody = main.functionExpression.body as BlockFunctionBody;
     List<Statement> statements = mainBody.block.statements;
 
-    ExpressionStatement statement = statements[0];
-    PrefixedIdentifier prefixed = statement.expression;
+    var statement = statements[0] as ExpressionStatement;
+    var prefixed = statement.expression as PrefixedIdentifier;
 
     expect(prefixed.prefix.staticElement, same(parameter));
     assertType(prefixed.prefix.staticType, 'double Function(int)');
@@ -6246,18 +6265,18 @@
     // 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;
+    PrefixElement myPrefix = myImport.prefix!;
 
-    var myLibrary = myImport.importedLibrary;
+    var myLibrary = myImport.importedLibrary!;
     var myUnit = myLibrary.definingCompilationUnit;
     var myClass = myUnit.types.single;
     var myTypeAlias = myUnit.typeAliases.single;
     var myTopVariable = myUnit.topLevelVariables[0];
     var myTopFunction = myUnit.functions.single;
-    var myGetter = myUnit.topLevelVariables[1].getter;
-    var mySetter = myUnit.topLevelVariables[2].setter;
+    var myGetter = myUnit.topLevelVariables[1].getter!;
+    var mySetter = myUnit.topLevelVariables[2].setter!;
     expect(myTopVariable.name, 'myTopVariable');
     expect(myGetter.displayName, 'myGetter');
     expect(mySetter.displayName, 'mySetter');
@@ -6271,8 +6290,8 @@
 
     void assertPrefixedIdentifier(
         int statementIndex, Element expectedElement, DartType expectedType) {
-      ExpressionStatement statement = statements[statementIndex];
-      PrefixedIdentifier prefixed = statement.expression;
+      var statement = statements[statementIndex] as ExpressionStatement;
+      var prefixed = statement.expression as PrefixedIdentifier;
       assertPrefix(prefixed.prefix);
 
       expect(prefixed.identifier.staticElement, same(expectedElement));
@@ -6281,11 +6300,11 @@
 
     assertPrefixedIdentifier(0, myClass, typeProvider.typeType);
     assertPrefixedIdentifier(1, myTypeAlias, typeProvider.typeType);
-    assertPrefixedIdentifier(2, myTopVariable.getter, typeProvider.intType);
+    assertPrefixedIdentifier(2, myTopVariable.getter!, typeProvider.intType);
 
     {
-      ExpressionStatement statement = statements[3];
-      PrefixedIdentifier prefixed = statement.expression;
+      var statement = statements[3] as ExpressionStatement;
+      var prefixed = statement.expression as PrefixedIdentifier;
       assertPrefix(prefixed.prefix);
 
       expect(prefixed.identifier.staticElement, same(myTopFunction));
@@ -6293,9 +6312,9 @@
     }
 
     {
-      ExpressionStatement statement = statements[4];
-      MethodInvocation invocation = statement.expression;
-      assertPrefix(invocation.target);
+      var statement = statements[4] as ExpressionStatement;
+      var invocation = statement.expression as MethodInvocation;
+      assertPrefix(invocation.target as SimpleIdentifier);
 
       expect(invocation.methodName.staticElement, same(myTopFunction));
       expect(invocation.methodName.staticType, isNotNull);
@@ -6304,9 +6323,9 @@
     assertPrefixedIdentifier(5, myGetter, typeProvider.intType);
 
     {
-      ExpressionStatement statement = statements[6];
-      AssignmentExpression assignment = statement.expression;
-      PrefixedIdentifier left = assignment.leftHandSide;
+      var statement = statements[6] as ExpressionStatement;
+      var assignment = statement.expression as AssignmentExpression;
+      var left = assignment.leftHandSide as PrefixedIdentifier;
       assertPrefix(left.prefix);
 
       if (hasAssignmentLeftResolution) {
@@ -6335,20 +6354,20 @@
 
     VariableElement v;
     {
-      VariableDeclarationStatement statement = mainStatements[0];
-      v = statement.variables.variables[0].declaredElement;
+      var statement = mainStatements[0] as VariableDeclarationStatement;
+      v = statement.variables.variables[0].declaredElement!;
       expect(v.type, typeProvider.intType);
     }
 
     {
-      ExpressionStatement statement = mainStatements[1];
+      var statement = mainStatements[1] as ExpressionStatement;
 
-      PrefixExpression prefix = statement.expression;
+      var prefix = statement.expression as PrefixExpression;
       expect(prefix.operator.type, TokenType.PLUS_PLUS);
-      expect(prefix.staticElement.name, '+');
+      expect(prefix.staticElement!.name, '+');
       expect(prefix.staticType, typeProvider.intType);
 
-      SimpleIdentifier operand = prefix.operand;
+      var operand = prefix.operand as SimpleIdentifier;
       if (hasAssignmentLeftResolution) {
         expect(operand.staticElement, same(v));
         expect(operand.staticType, typeProvider.intType);
@@ -6359,14 +6378,14 @@
     }
 
     {
-      ExpressionStatement statement = mainStatements[2];
+      var statement = mainStatements[2] as ExpressionStatement;
 
-      PrefixExpression prefix = statement.expression;
+      var prefix = statement.expression as PrefixExpression;
       expect(prefix.operator.type, TokenType.TILDE);
-      expect(prefix.staticElement.name, '~');
+      expect(prefix.staticElement!.name, '~');
       expect(prefix.staticType, typeProvider.intType);
 
-      SimpleIdentifier operand = prefix.operand;
+      var operand = prefix.operand as SimpleIdentifier;
       expect(operand.staticElement, same(v));
       expect(operand.staticType, typeProvider.intType);
     }
@@ -6387,20 +6406,20 @@
 
     VariableElement v;
     {
-      VariableDeclarationStatement statement = mainStatements[0];
-      v = statement.variables.variables[0].declaredElement;
+      var statement = mainStatements[0] as VariableDeclarationStatement;
+      v = statement.variables.variables[0].declaredElement!;
       expect(v.type, typeProvider.boolType);
     }
 
     {
-      ExpressionStatement statement = mainStatements[1];
+      var statement = mainStatements[1] as ExpressionStatement;
 
-      PrefixExpression prefix = statement.expression;
+      var prefix = statement.expression as PrefixExpression;
       expect(prefix.operator.type, TokenType.BANG);
       expect(prefix.staticElement, isNull);
       expect(prefix.staticType, typeProvider.boolType);
 
-      SimpleIdentifier operand = prefix.operand;
+      var operand = prefix.operand as SimpleIdentifier;
       expect(operand.staticElement, same(v));
       expect(operand.staticType, typeProvider.boolType);
     }
@@ -6419,23 +6438,23 @@
     addTestFile(content);
 
     await resolveTestFile();
-    CompilationUnit unit = result.unit;
+    CompilationUnit unit = result.unit!;
 
-    ClassDeclaration cClassDeclaration = unit.declarations[1];
-    ClassElement cClassElement = cClassDeclaration.declaredElement;
-    FieldElement fElement = cClassElement.getField('f');
+    var cClassDeclaration = unit.declarations[1] as ClassDeclaration;
+    ClassElement cClassElement = cClassDeclaration.declaredElement!;
+    FieldElement fElement = cClassElement.getField('f')!;
 
     List<Statement> mainStatements = _getMainStatements(result);
 
     {
-      ExpressionStatement statement = mainStatements[0];
+      var statement = mainStatements[0] as ExpressionStatement;
 
-      PrefixExpression prefix = statement.expression;
+      var prefix = statement.expression as PrefixExpression;
       expect(prefix.operator.type, TokenType.PLUS_PLUS);
-      expect(prefix.staticElement.name, '+');
+      expect(prefix.staticElement!.name, '+');
       expect(prefix.staticType, typeProvider.intType);
 
-      PropertyAccess propertyAccess = prefix.operand;
+      var propertyAccess = prefix.operand as PropertyAccess;
       if (hasAssignmentLeftResolution) {
         expect(propertyAccess.staticType, typeProvider.intType);
       } else {
@@ -6453,14 +6472,14 @@
     }
 
     {
-      ExpressionStatement statement = mainStatements[1];
+      var statement = mainStatements[1] as ExpressionStatement;
 
-      PrefixExpression prefix = statement.expression;
+      var prefix = statement.expression as PrefixExpression;
       expect(prefix.operator.type, TokenType.TILDE);
-      expect(prefix.staticElement.name, '~');
+      expect(prefix.staticElement!.name, '~');
       expect(prefix.staticType, typeProvider.intType);
 
-      PropertyAccess propertyAccess = prefix.operand;
+      var propertyAccess = prefix.operand as PropertyAccess;
       expect(propertyAccess.staticType, typeProvider.intType);
 
       SimpleIdentifier propertyName = propertyAccess.propertyName;
@@ -6481,20 +6500,20 @@
     addTestFile(content);
 
     await resolveTestFile();
-    CompilationUnit unit = result.unit;
+    CompilationUnit unit = result.unit!;
 
-    ClassDeclaration cClassDeclaration = unit.declarations[1];
-    ClassElement cClassElement = cClassDeclaration.declaredElement;
-    FieldElement fElement = cClassElement.getField('f');
+    var cClassDeclaration = unit.declarations[1] as ClassDeclaration;
+    ClassElement cClassElement = cClassDeclaration.declaredElement!;
+    FieldElement fElement = cClassElement.getField('f')!;
 
     List<Statement> mainStatements = _getMainStatements(result);
 
     {
-      ExpressionStatement statement = mainStatements[0];
-      PropertyAccess access = statement.expression;
+      var statement = mainStatements[0] as ExpressionStatement;
+      var access = statement.expression as PropertyAccess;
       expect(access.staticType, typeProvider.intType);
 
-      InstanceCreationExpression newC = access.target;
+      var newC = access.target as InstanceCreationExpression;
       expect(
         newC.constructorName.staticElement,
         cClassElement.unnamedConstructor,
@@ -6518,20 +6537,20 @@
     addTestFile(content);
 
     await resolveTestFile();
-    CompilationUnit unit = result.unit;
+    CompilationUnit unit = result.unit!;
 
-    ClassDeclaration cClassDeclaration = unit.declarations[1];
-    ClassElement cClassElement = cClassDeclaration.declaredElement;
-    FieldElement fElement = cClassElement.getField('f');
+    var cClassDeclaration = unit.declarations[1] as ClassDeclaration;
+    ClassElement cClassElement = cClassDeclaration.declaredElement!;
+    FieldElement fElement = cClassElement.getField('f')!;
 
     List<Statement> mainStatements = _getMainStatements(result);
 
     {
-      ExpressionStatement statement = mainStatements[0];
-      PropertyAccess access = statement.expression;
+      var statement = mainStatements[0] as ExpressionStatement;
+      var access = statement.expression as PropertyAccess;
       expect(access.staticType, typeProvider.intType);
 
-      InstanceCreationExpression newC = access.target;
+      var newC = access.target as InstanceCreationExpression;
       expect(
         newC.constructorName.staticElement,
         cClassElement.unnamedConstructor,
@@ -6585,50 +6604,51 @@
 }
 ''');
 
-    FunctionDeclaration main = result.unit.declarations[0];
+    var main = result.unit!.declarations[0] as FunctionDeclaration;
     expect(main.declaredElement, isNotNull);
     expect(main.name.staticElement, isNotNull);
     expect(main.name.staticType, isNull);
 
-    BlockFunctionBody body = main.functionExpression.body;
+    var body = main.functionExpression.body as BlockFunctionBody;
     NodeList<Statement> statements = body.block.statements;
 
     // var v = 42;
     VariableElement vElement;
     {
-      VariableDeclarationStatement statement = statements[0];
-      vElement = statement.variables.variables[0].name.staticElement;
+      var statement = statements[0] as VariableDeclarationStatement;
+      vElement = statement.variables.variables[0].name.staticElement
+          as VariableElement;
     }
 
     {
-      ExpressionStatement statement = statements[1];
-      StringInterpolation interpolation = statement.expression;
+      var statement = statements[1] as ExpressionStatement;
+      var interpolation = statement.expression as StringInterpolation;
 
-      InterpolationExpression element_1 = interpolation.elements[1];
-      SimpleIdentifier expression_1 = element_1.expression;
+      var element_1 = interpolation.elements[1] as InterpolationExpression;
+      var expression_1 = element_1.expression as SimpleIdentifier;
       expect(expression_1.staticElement, same(vElement));
       expect(expression_1.staticType, typeProvider.intType);
 
-      InterpolationExpression element_3 = interpolation.elements[3];
-      SimpleIdentifier expression_3 = element_3.expression;
+      var element_3 = interpolation.elements[3] as InterpolationExpression;
+      var expression_3 = element_3.expression as SimpleIdentifier;
       expect(expression_3.staticElement, same(vElement));
       expect(expression_3.staticType, typeProvider.intType);
 
-      InterpolationExpression element_5 = interpolation.elements[5];
-      SimpleIdentifier expression_5 = element_5.expression;
+      var element_5 = interpolation.elements[5] as InterpolationExpression;
+      var expression_5 = element_5.expression as SimpleIdentifier;
       expect(expression_5.staticElement, same(vElement));
       expect(expression_5.staticType, typeProvider.intType);
     }
 
     {
-      ExpressionStatement statement = statements[2];
-      StringInterpolation interpolation = statement.expression;
+      var statement = statements[2] as ExpressionStatement;
+      var interpolation = statement.expression as StringInterpolation;
 
-      InterpolationExpression element_1 = interpolation.elements[1];
-      BinaryExpression expression = element_1.expression;
+      var element_1 = interpolation.elements[1] as InterpolationExpression;
+      var expression = element_1.expression as BinaryExpression;
       expect(expression.staticType, typeProvider.intType);
 
-      SimpleIdentifier left = expression.leftOperand;
+      var left = expression.leftOperand as SimpleIdentifier;
       expect(left.staticElement, same(vElement));
       expect(left.staticType, typeProvider.intType);
     }
@@ -6668,22 +6688,24 @@
     addTestFile(content);
     await resolveTestFile();
 
-    ClassDeclaration aNode = result.unit.declarations[0];
-    ClassDeclaration bNode = result.unit.declarations[1];
+    var aNode = result.unit!.declarations[0] as ClassDeclaration;
+    var bNode = result.unit!.declarations[1] as ClassDeclaration;
 
-    MethodElement methodElement = aNode.members[0].declaredElement;
-    PropertyAccessorElement getterElement = aNode.members[1].declaredElement;
-    PropertyAccessorElement setterElement = aNode.members[2].declaredElement;
-    MethodElement operatorElement = aNode.members[3].declaredElement;
+    var methodElement = aNode.members[0].declaredElement as MethodElement;
+    var getterElement =
+        aNode.members[1].declaredElement as PropertyAccessorElement;
+    var setterElement =
+        aNode.members[2].declaredElement as PropertyAccessorElement;
+    var operatorElement = aNode.members[3].declaredElement as MethodElement;
 
-    MethodDeclaration testNode = bNode.members[0];
-    BlockFunctionBody testBody = testNode.body;
+    var testNode = bNode.members[0] as MethodDeclaration;
+    var testBody = testNode.body as BlockFunctionBody;
     List<Statement> testStatements = testBody.block.statements;
 
     // method(1);
     {
-      ExpressionStatement statement = testStatements[0];
-      MethodInvocation invocation = statement.expression;
+      var statement = testStatements[0] as ExpressionStatement;
+      var invocation = statement.expression as MethodInvocation;
 
       expect(invocation.target, isNull);
 
@@ -6692,20 +6714,20 @@
 
     // super.method(2);
     {
-      ExpressionStatement statement = testStatements[1];
-      MethodInvocation invocation = statement.expression;
+      var statement = testStatements[1] as ExpressionStatement;
+      var invocation = statement.expression as MethodInvocation;
 
-      SuperExpression target = invocation.target;
+      var target = invocation.target as SuperExpression;
       expect(
-          target.staticType, interfaceTypeStar(bNode.declaredElement)); // raw
+          target.staticType, interfaceTypeStar(bNode.declaredElement!)); // raw
 
       expect(invocation.methodName.staticElement, same(methodElement));
     }
 
     // getter;
     {
-      ExpressionStatement statement = testStatements[2];
-      SimpleIdentifier identifier = statement.expression;
+      var statement = testStatements[2] as ExpressionStatement;
+      var identifier = statement.expression as SimpleIdentifier;
 
       expect(identifier.staticElement, same(getterElement));
       expect(identifier.staticType, typeProvider.intType);
@@ -6713,13 +6735,13 @@
 
     // super.getter;
     {
-      ExpressionStatement statement = testStatements[3];
-      PropertyAccess propertyAccess = statement.expression;
+      var statement = testStatements[3] as ExpressionStatement;
+      var propertyAccess = statement.expression as PropertyAccess;
       expect(propertyAccess.staticType, typeProvider.intType);
 
-      SuperExpression target = propertyAccess.target;
+      var target = propertyAccess.target as SuperExpression;
       expect(
-          target.staticType, interfaceTypeStar(bNode.declaredElement)); // raw
+          target.staticType, interfaceTypeStar(bNode.declaredElement!)); // raw
 
       expect(propertyAccess.propertyName.staticElement, same(getterElement));
       expect(propertyAccess.propertyName.staticType, typeProvider.intType);
@@ -6727,10 +6749,10 @@
 
     // setter = 3;
     {
-      ExpressionStatement statement = testStatements[4];
-      AssignmentExpression assignment = statement.expression;
+      var statement = testStatements[4] as ExpressionStatement;
+      var assignment = statement.expression as AssignmentExpression;
 
-      SimpleIdentifier identifier = assignment.leftHandSide;
+      var identifier = assignment.leftHandSide as SimpleIdentifier;
       if (hasAssignmentLeftResolution) {
         expect(identifier.staticElement, same(setterElement));
         expect(identifier.staticType, typeProvider.intType);
@@ -6742,14 +6764,14 @@
 
     // this.setter = 4;
     {
-      ExpressionStatement statement = testStatements[5];
-      AssignmentExpression assignment = statement.expression;
+      var statement = testStatements[5] as ExpressionStatement;
+      var assignment = statement.expression as AssignmentExpression;
 
-      PropertyAccess propertyAccess = assignment.leftHandSide;
+      var propertyAccess = assignment.leftHandSide as PropertyAccess;
 
-      SuperExpression target = propertyAccess.target;
+      var target = propertyAccess.target as SuperExpression;
       expect(
-          target.staticType, interfaceTypeStar(bNode.declaredElement)); // raw
+          target.staticType, interfaceTypeStar(bNode.declaredElement!)); // raw
 
       if (hasAssignmentLeftResolution) {
         expect(propertyAccess.propertyName.staticElement, same(setterElement));
@@ -6762,12 +6784,12 @@
 
     // super + 5;
     {
-      ExpressionStatement statement = testStatements[6];
-      BinaryExpression binary = statement.expression;
+      var statement = testStatements[6] as ExpressionStatement;
+      var binary = statement.expression as BinaryExpression;
 
-      ThisExpression target = binary.leftOperand;
+      var target = binary.leftOperand as ThisExpression;
       expect(
-          target.staticType, interfaceTypeStar(bNode.declaredElement)); // raw
+          target.staticType, interfaceTypeStar(bNode.declaredElement!)); // raw
 
       expect(binary.staticElement, same(operatorElement));
       expect(binary.staticType, typeProvider.intType);
@@ -6795,15 +6817,17 @@
     addTestFile(content);
     await resolveTestFile();
 
-    ClassDeclaration aNode = result.unit.declarations[0];
+    var aNode = result.unit!.declarations[0] as ClassDeclaration;
 
-    MethodElement methodElement = aNode.members[0].declaredElement;
-    PropertyAccessorElement getterElement = aNode.members[1].declaredElement;
-    PropertyAccessorElement setterElement = aNode.members[2].declaredElement;
-    MethodElement operatorElement = aNode.members[3].declaredElement;
+    var methodElement = aNode.members[0].declaredElement as MethodElement;
+    var getterElement =
+        aNode.members[1].declaredElement as PropertyAccessorElement;
+    var setterElement =
+        aNode.members[2].declaredElement as PropertyAccessorElement;
+    var operatorElement = aNode.members[3].declaredElement as MethodElement;
 
-    MethodDeclaration testNode = aNode.members[4];
-    BlockFunctionBody testBody = testNode.body;
+    var testNode = aNode.members[4] as MethodDeclaration;
+    var testBody = testNode.body as BlockFunctionBody;
     List<Statement> testStatements = testBody.block.statements;
 
     var elementA = findElement.class_('A');
@@ -6811,8 +6835,8 @@
 
     // method(1);
     {
-      ExpressionStatement statement = testStatements[0];
-      MethodInvocation invocation = statement.expression;
+      var statement = testStatements[0] as ExpressionStatement;
+      var invocation = statement.expression as MethodInvocation;
 
       expect(invocation.target, isNull);
 
@@ -6821,10 +6845,10 @@
 
     // this.method(2);
     {
-      ExpressionStatement statement = testStatements[1];
-      MethodInvocation invocation = statement.expression;
+      var statement = testStatements[1] as ExpressionStatement;
+      var invocation = statement.expression as MethodInvocation;
 
-      ThisExpression target = invocation.target;
+      var target = invocation.target as ThisExpression;
       expect(target.staticType, thisTypeA); // raw
 
       expect(invocation.methodName.staticElement, same(methodElement));
@@ -6832,8 +6856,8 @@
 
     // getter;
     {
-      ExpressionStatement statement = testStatements[2];
-      SimpleIdentifier identifier = statement.expression;
+      var statement = testStatements[2] as ExpressionStatement;
+      var identifier = statement.expression as SimpleIdentifier;
 
       expect(identifier.staticElement, same(getterElement));
       expect(identifier.staticType, typeProvider.intType);
@@ -6841,11 +6865,11 @@
 
     // this.getter;
     {
-      ExpressionStatement statement = testStatements[3];
-      PropertyAccess propertyAccess = statement.expression;
+      var statement = testStatements[3] as ExpressionStatement;
+      var propertyAccess = statement.expression as PropertyAccess;
       expect(propertyAccess.staticType, typeProvider.intType);
 
-      ThisExpression target = propertyAccess.target;
+      var target = propertyAccess.target as ThisExpression;
       expect(target.staticType, thisTypeA); // raw
 
       expect(propertyAccess.propertyName.staticElement, same(getterElement));
@@ -6854,10 +6878,10 @@
 
     // setter = 3;
     {
-      ExpressionStatement statement = testStatements[4];
-      AssignmentExpression assignment = statement.expression;
+      var statement = testStatements[4] as ExpressionStatement;
+      var assignment = statement.expression as AssignmentExpression;
 
-      SimpleIdentifier identifier = assignment.leftHandSide;
+      var identifier = assignment.leftHandSide as SimpleIdentifier;
       if (hasAssignmentLeftResolution) {
         expect(identifier.staticElement, same(setterElement));
         expect(identifier.staticType, typeProvider.intType);
@@ -6869,12 +6893,12 @@
 
     // this.setter = 4;
     {
-      ExpressionStatement statement = testStatements[5];
-      AssignmentExpression assignment = statement.expression;
+      var statement = testStatements[5] as ExpressionStatement;
+      var assignment = statement.expression as AssignmentExpression;
 
-      PropertyAccess propertyAccess = assignment.leftHandSide;
+      var propertyAccess = assignment.leftHandSide as PropertyAccess;
 
-      ThisExpression target = propertyAccess.target;
+      var target = propertyAccess.target as ThisExpression;
       expect(target.staticType, thisTypeA); // raw
 
       if (hasAssignmentLeftResolution) {
@@ -6888,10 +6912,10 @@
 
     // this + 5;
     {
-      ExpressionStatement statement = testStatements[6];
-      BinaryExpression binary = statement.expression;
+      var statement = testStatements[6] as ExpressionStatement;
+      var binary = statement.expression as BinaryExpression;
 
-      ThisExpression target = binary.leftOperand;
+      var target = binary.leftOperand as ThisExpression;
       expect(target.staticType, thisTypeA); // raw
 
       expect(binary.staticElement, same(operatorElement));
@@ -6909,19 +6933,20 @@
     addTestFile(content);
     await resolveTestFile();
 
-    ClassDeclaration cNode = result.unit.declarations[0];
-    ClassElement cElement = cNode.declaredElement;
+    var cNode = result.unit!.declarations[0] as ClassDeclaration;
+    ClassElement cElement = cNode.declaredElement!;
 
-    ConstructorDeclaration constructorNode = cNode.members[1];
+    var constructorNode = cNode.members[1] as ConstructorDeclaration;
 
-    DefaultFormalParameter aNode = constructorNode.parameters.parameters[0];
-    _assertDefaultParameter(aNode, cElement.unnamedConstructor.parameters[0],
+    var aNode =
+        constructorNode.parameters.parameters[0] as DefaultFormalParameter;
+    _assertDefaultParameter(aNode, cElement.unnamedConstructor!.parameters[0],
         name: 'a',
         offset: 31,
         kind: ParameterKind.POSITIONAL,
         type: typeProvider.intType);
 
-    BinaryExpression binary = aNode.defaultValue;
+    var binary = aNode.defaultValue as BinaryExpression;
     expect(binary.staticElement, isNotNull);
     expect(binary.staticType, typeProvider.intType);
     expect(binary.leftOperand.staticType, typeProvider.intType);
@@ -6953,17 +6978,17 @@
     addTestFile(content);
     await resolveTestFile();
 
-    ClassDeclaration aNode = result.unit.declarations[0];
-    ClassElement aElement = aNode.declaredElement;
+    var aNode = result.unit!.declarations[0] as ClassDeclaration;
+    ClassElement aElement = aNode.declaredElement!;
 
-    ClassDeclaration bNode = result.unit.declarations[1];
-    ClassElement bElement = bNode.declaredElement;
+    var bNode = result.unit!.declarations[1] as ClassDeclaration;
+    ClassElement bElement = bNode.declaredElement!;
 
-    ClassDeclaration cNode = result.unit.declarations[2];
-    ClassElement cElement = cNode.declaredElement;
+    var cNode = result.unit!.declarations[2] as ClassDeclaration;
+    ClassElement cElement = cNode.declaredElement!;
 
-    ClassDeclaration dNode = result.unit.declarations[3];
-    Element dElement = dNode.declaredElement;
+    var dNode = result.unit!.declarations[3] as ClassDeclaration;
+    Element dElement = dNode.declaredElement!;
 
     SimpleIdentifier dName = dNode.name;
     expect(dName.staticElement, same(dElement));
@@ -6975,10 +7000,10 @@
         nullabilitySuffix: NullabilitySuffix.star,
       );
 
-      TypeName superClass = dNode.extendsClause.superclass;
+      TypeName superClass = dNode.extendsClause!.superclass;
       expect(superClass.type, expectedType);
 
-      SimpleIdentifier identifier = superClass.name;
+      var identifier = superClass.name as SimpleIdentifier;
       expect(identifier.staticElement, aElement);
       expect(identifier.staticType, isNull);
     }
@@ -6989,10 +7014,10 @@
         nullabilitySuffix: NullabilitySuffix.star,
       );
 
-      TypeName mixinType = dNode.withClause.mixinTypes[0];
+      TypeName mixinType = dNode.withClause!.mixinTypes[0];
       expect(mixinType.type, expectedType);
 
-      SimpleIdentifier identifier = mixinType.name;
+      var identifier = mixinType.name as SimpleIdentifier;
       expect(identifier.staticElement, bElement);
       expect(identifier.staticType, isNull);
     }
@@ -7003,10 +7028,10 @@
         nullabilitySuffix: NullabilitySuffix.star,
       );
 
-      TypeName implementedType = dNode.implementsClause.interfaces[0];
+      TypeName implementedType = dNode.implementsClause!.interfaces[0];
       expect(implementedType.type, expectedType);
 
-      SimpleIdentifier identifier = implementedType.name;
+      var identifier = implementedType.name as SimpleIdentifier;
       expect(identifier.staticElement, cElement);
       expect(identifier.staticType, isNull);
     }
@@ -7022,17 +7047,17 @@
     addTestFile(content);
     await resolveTestFile();
 
-    ClassDeclaration aNode = result.unit.declarations[0];
-    ClassElement aElement = aNode.declaredElement;
+    var aNode = result.unit!.declarations[0] as ClassDeclaration;
+    ClassElement aElement = aNode.declaredElement!;
 
-    ClassDeclaration bNode = result.unit.declarations[1];
-    ClassElement bElement = bNode.declaredElement;
+    var bNode = result.unit!.declarations[1] as ClassDeclaration;
+    ClassElement bElement = bNode.declaredElement!;
 
-    ClassDeclaration cNode = result.unit.declarations[2];
-    ClassElement cElement = cNode.declaredElement;
+    var cNode = result.unit!.declarations[2] as ClassDeclaration;
+    ClassElement cElement = cNode.declaredElement!;
 
-    ClassTypeAlias dNode = result.unit.declarations[3];
-    Element dElement = dNode.declaredElement;
+    var dNode = result.unit!.declarations[3] as ClassTypeAlias;
+    Element dElement = dNode.declaredElement!;
 
     SimpleIdentifier dName = dNode.name;
     expect(dName.staticElement, same(dElement));
@@ -7047,7 +7072,7 @@
       TypeName superClass = dNode.superclass;
       expect(superClass.type, expectedType);
 
-      SimpleIdentifier identifier = superClass.name;
+      var identifier = superClass.name as SimpleIdentifier;
       expect(identifier.staticElement, same(aElement));
       expect(identifier.staticType, isNull);
     }
@@ -7061,7 +7086,7 @@
       TypeName mixinType = dNode.withClause.mixinTypes[0];
       expect(mixinType.type, expectedType);
 
-      SimpleIdentifier identifier = mixinType.name;
+      var identifier = mixinType.name as SimpleIdentifier;
       expect(identifier.staticElement, same(bElement));
       expect(identifier.staticType, isNull);
     }
@@ -7072,10 +7097,10 @@
         nullabilitySuffix: NullabilitySuffix.star,
       );
 
-      TypeName interfaceType = dNode.implementsClause.interfaces[0];
+      TypeName interfaceType = dNode.implementsClause!.interfaces[0];
       expect(interfaceType.type, expectedType);
 
-      SimpleIdentifier identifier = interfaceType.name;
+      var identifier = interfaceType.name as SimpleIdentifier;
       expect(identifier.staticElement, same(cElement));
       expect(identifier.staticType, isNull);
     }
@@ -7090,8 +7115,8 @@
     addTestFile(content);
     await resolveTestFile();
 
-    EnumDeclaration enumNode = result.unit.declarations[0];
-    ClassElement enumElement = enumNode.declaredElement;
+    var enumNode = result.unit!.declarations[0] as EnumDeclaration;
+    ClassElement enumElement = enumNode.declaredElement!;
 
     SimpleIdentifier dName = enumNode.name;
     expect(dName.staticElement, same(enumElement));
@@ -7131,8 +7156,8 @@
     ClassElement doubleElement = doubleType.element;
     ClassElement intElement = intType.element;
 
-    ClassDeclaration cNode = result.unit.declarations[0];
-    ClassElement cElement = cNode.declaredElement;
+    var cNode = result.unit!.declarations[0] as ClassDeclaration;
+    ClassElement cElement = cNode.declaredElement!;
 
     // The class name identifier.
     expect(cNode.name.staticElement, same(cElement));
@@ -7140,9 +7165,9 @@
 
     // unnamed constructor
     {
-      ConstructorDeclaration node = cNode.members[0];
+      var node = cNode.members[0] as ConstructorDeclaration;
       expect(node.declaredElement, isNotNull);
-      assertType(node.declaredElement.type, 'C Function(int)');
+      assertType(node.declaredElement!.type, 'C Function(int)');
       expect(node.returnType.staticElement, same(cElement));
       expect(node.returnType.staticType, isNull);
       expect(node.name, isNull);
@@ -7150,24 +7175,24 @@
 
     // named constructor
     {
-      ConstructorDeclaration node = cNode.members[1];
+      var node = cNode.members[1] as ConstructorDeclaration;
       expect(node.declaredElement, isNotNull);
-      assertType(node.declaredElement.type, 'C Function(int)');
+      assertType(node.declaredElement!.type, 'C Function(int)');
       expect(node.returnType.staticElement, same(cElement));
       expect(node.returnType.staticType, isNull);
-      expect(node.name.staticElement, same(node.declaredElement));
-      expect(node.name.staticType, isNull);
+      expect(node.name!.staticElement, same(node.declaredElement));
+      expect(node.name!.staticType, isNull);
     }
 
     // publicMethod()
     {
-      MethodDeclaration node = cNode.members[2];
+      var node = cNode.members[2] as MethodDeclaration;
       expect(node.declaredElement, isNotNull);
-      assertType(node.declaredElement.type, 'int Function(double)');
+      assertType(node.declaredElement!.type, 'int Function(double)');
 
       // method return type
-      TypeName returnType = node.returnType;
-      SimpleIdentifier returnTypeName = returnType.name;
+      var returnType = node.returnType as TypeName;
+      var returnTypeName = returnType.name as SimpleIdentifier;
       expect(returnType.type, intType);
       expect(returnTypeName.staticElement, intElement);
       expect(returnTypeName.staticType, isNull);
@@ -7178,28 +7203,28 @@
 
       // method parameter
       {
-        SimpleFormalParameter pNode = node.parameters.parameters[0];
+        var pNode = node.parameters!.parameters[0] as SimpleFormalParameter;
         expect(pNode.declaredElement, isNotNull);
-        expect(pNode.declaredElement.type, doubleType);
+        expect(pNode.declaredElement!.type, doubleType);
 
-        TypeName pType = pNode.type;
+        var pType = pNode.type as TypeName;
         expect(pType.name.staticElement, doubleElement);
         expect(pType.name.staticType, isNull);
 
-        expect(pNode.identifier.staticElement, pNode.declaredElement);
-        expect(pNode.identifier.staticType, isNull);
+        expect(pNode.identifier!.staticElement, pNode.declaredElement);
+        expect(pNode.identifier!.staticType, isNull);
       }
     }
 
     // publicGetter()
     {
-      MethodDeclaration node = cNode.members[3];
+      var node = cNode.members[3] as MethodDeclaration;
       expect(node.declaredElement, isNotNull);
-      assertType(node.declaredElement.type, 'int Function()');
+      assertType(node.declaredElement!.type, 'int Function()');
 
       // getter return type
-      TypeName returnType = node.returnType;
-      SimpleIdentifier returnTypeName = returnType.name;
+      var returnType = node.returnType as TypeName;
+      var returnTypeName = returnType.name as SimpleIdentifier;
       expect(returnType.type, intType);
       expect(returnTypeName.staticElement, intElement);
       expect(returnTypeName.staticType, isNull);
@@ -7211,13 +7236,13 @@
 
     // publicSetter()
     {
-      MethodDeclaration node = cNode.members[4];
+      var node = cNode.members[4] as MethodDeclaration;
       expect(node.declaredElement, isNotNull);
-      assertType(node.declaredElement.type, 'void Function(double)');
+      assertType(node.declaredElement!.type, 'void Function(double)');
 
       // setter return type
-      TypeName returnType = node.returnType;
-      SimpleIdentifier returnTypeName = returnType.name;
+      var returnType = node.returnType as TypeName;
+      var returnTypeName = returnType.name as SimpleIdentifier;
       expect(returnType.type, VoidTypeImpl.instance);
       expect(returnTypeName.staticElement, isNull);
       expect(returnTypeName.staticType, isNull);
@@ -7228,16 +7253,16 @@
 
       // setter parameter
       {
-        SimpleFormalParameter pNode = node.parameters.parameters[0];
+        var pNode = node.parameters!.parameters[0] as SimpleFormalParameter;
         expect(pNode.declaredElement, isNotNull);
-        expect(pNode.declaredElement.type, doubleType);
+        expect(pNode.declaredElement!.type, doubleType);
 
-        TypeName pType = pNode.type;
+        var pType = pNode.type as TypeName;
         expect(pType.name.staticElement, doubleElement);
         expect(pType.name.staticType, isNull);
 
-        expect(pNode.identifier.staticElement, pNode.declaredElement);
-        expect(pNode.identifier.staticType, isNull);
+        expect(pNode.identifier!.staticElement, pNode.declaredElement);
+        expect(pNode.identifier!.staticType, isNull);
       }
     }
   }
@@ -7256,13 +7281,13 @@
 
     // topFunction()
     {
-      FunctionDeclaration node = result.unit.declarations[0];
+      var node = result.unit!.declarations[0] as FunctionDeclaration;
       expect(node.declaredElement, isNotNull);
-      assertType(node.declaredElement.type, 'int Function(double)');
+      assertType(node.declaredElement!.type, 'int Function(double)');
 
       // function return type
-      TypeName returnType = node.returnType;
-      SimpleIdentifier returnTypeName = returnType.name;
+      var returnType = node.returnType as TypeName;
+      var returnTypeName = returnType.name as SimpleIdentifier;
       expect(returnType.type, intType);
       expect(returnTypeName.staticElement, intElement);
       expect(returnTypeName.staticType, isNull);
@@ -7273,29 +7298,29 @@
 
       // function parameter
       {
-        SimpleFormalParameter pNode =
-            node.functionExpression.parameters.parameters[0];
+        var pNode = node.functionExpression.parameters!.parameters[0]
+            as SimpleFormalParameter;
         expect(pNode.declaredElement, isNotNull);
-        expect(pNode.declaredElement.type, doubleType);
+        expect(pNode.declaredElement!.type, doubleType);
 
-        TypeName pType = pNode.type;
+        var pType = pNode.type as TypeName;
         expect(pType.name.staticElement, doubleElement);
         expect(pType.name.staticType, isNull);
 
-        expect(pNode.identifier.staticElement, pNode.declaredElement);
-        expect(pNode.identifier.staticType, isNull);
+        expect(pNode.identifier!.staticElement, pNode.declaredElement);
+        expect(pNode.identifier!.staticType, isNull);
       }
     }
 
     // topGetter()
     {
-      FunctionDeclaration node = result.unit.declarations[1];
+      var node = result.unit!.declarations[1] as FunctionDeclaration;
       expect(node.declaredElement, isNotNull);
-      assertType(node.declaredElement.type, 'int Function()');
+      assertType(node.declaredElement!.type, 'int Function()');
 
       // getter return type
-      TypeName returnType = node.returnType;
-      SimpleIdentifier returnTypeName = returnType.name;
+      var returnType = node.returnType as TypeName;
+      var returnTypeName = returnType.name as SimpleIdentifier;
       expect(returnType.type, intType);
       expect(returnTypeName.staticElement, intElement);
       expect(returnTypeName.staticType, isNull);
@@ -7307,13 +7332,13 @@
 
     // topSetter()
     {
-      FunctionDeclaration node = result.unit.declarations[2];
+      var node = result.unit!.declarations[2] as FunctionDeclaration;
       expect(node.declaredElement, isNotNull);
-      assertType(node.declaredElement.type, 'void Function(double)');
+      assertType(node.declaredElement!.type, 'void Function(double)');
 
       // setter return type
-      TypeName returnType = node.returnType;
-      SimpleIdentifier returnTypeName = returnType.name;
+      var returnType = node.returnType as TypeName;
+      var returnTypeName = returnType.name as SimpleIdentifier;
       expect(returnType.type, VoidTypeImpl.instance);
       expect(returnTypeName.staticElement, isNull);
       expect(returnTypeName.staticType, isNull);
@@ -7324,17 +7349,17 @@
 
       // setter parameter
       {
-        SimpleFormalParameter pNode =
-            node.functionExpression.parameters.parameters[0];
+        var pNode = node.functionExpression.parameters!.parameters[0]
+            as SimpleFormalParameter;
         expect(pNode.declaredElement, isNotNull);
-        expect(pNode.declaredElement.type, doubleType);
+        expect(pNode.declaredElement!.type, doubleType);
 
-        TypeName pType = pNode.type;
+        var pType = pNode.type as TypeName;
         expect(pType.name.staticElement, doubleElement);
         expect(pType.name.staticType, isNull);
 
-        expect(pNode.identifier.staticElement, pNode.declaredElement);
-        expect(pNode.identifier.staticType, isNull);
+        expect(pNode.identifier!.staticElement, pNode.declaredElement);
+        expect(pNode.identifier!.staticType, isNull);
       }
     }
   }
@@ -7349,33 +7374,33 @@
     addTestFile(content);
 
     await resolveTestFile();
-    CompilationUnit unit = result.unit;
-    CompilationUnitElement unitElement = unit.declaredElement;
+    CompilationUnit unit = result.unit!;
+    CompilationUnitElement unitElement = unit.declaredElement!;
 
-    ClassDeclaration cNode = unit.declarations[0];
-    ClassElement cElement = cNode.declaredElement;
+    var cNode = unit.declarations[0] as ClassDeclaration;
+    ClassElement cElement = cNode.declaredElement!;
     TypeParameterElement tElement = cElement.typeParameters[0];
     expect(cElement, same(unitElement.types[0]));
 
     {
-      FieldElement aElement = cElement.getField('a');
-      FieldDeclaration aDeclaration = cNode.members[0];
+      FieldElement aElement = cElement.getField('a')!;
+      var aDeclaration = cNode.members[0] as FieldDeclaration;
       VariableDeclaration aNode = aDeclaration.fields.variables[0];
       expect(aNode.declaredElement, same(aElement));
       expect(aElement.type, typeProvider.intType);
       expect(aNode.name.staticElement, same(aElement));
       expect(aNode.name.staticType, isNull);
 
-      Expression aValue = aNode.initializer;
+      var aValue = aNode.initializer as Expression;
       expect(aValue.staticType, typeProvider.intType);
     }
 
     {
-      FieldElement bElement = cElement.getField('b');
-      FieldDeclaration bDeclaration = cNode.members[1];
+      FieldElement bElement = cElement.getField('b')!;
+      var bDeclaration = cNode.members[1] as FieldDeclaration;
 
-      TypeName typeName = bDeclaration.fields.type;
-      SimpleIdentifier typeIdentifier = typeName.name;
+      var typeName = bDeclaration.fields.type as TypeName;
+      var typeIdentifier = typeName.name as SimpleIdentifier;
       expect(typeIdentifier.staticElement, same(tElement));
       expect(typeIdentifier.staticType, isNull);
 
@@ -7396,15 +7421,15 @@
     addTestFile(content);
 
     await resolveTestFile();
-    CompilationUnit unit = result.unit;
+    CompilationUnit unit = result.unit!;
 
-    ClassDeclaration cNode = unit.declarations[0];
-    ClassElement cElement = cNode.declaredElement;
+    var cNode = unit.declarations[0] as ClassDeclaration;
+    ClassElement cElement = cNode.declaredElement!;
 
-    FieldDeclaration fieldDeclaration = cNode.members[0];
+    var fieldDeclaration = cNode.members[0] as FieldDeclaration;
 
     {
-      FieldElement aElement = cElement.getField('a');
+      FieldElement aElement = cElement.getField('a')!;
 
       VariableDeclaration aNode = fieldDeclaration.fields.variables[0];
       expect(aNode.declaredElement, same(aElement));
@@ -7413,12 +7438,12 @@
       expect(aNode.name.staticElement, same(aElement));
       expect(aNode.name.staticType, isNull);
 
-      Expression aValue = aNode.initializer;
+      Expression aValue = aNode.initializer!;
       expect(aValue.staticType, typeProvider.intType);
     }
 
     {
-      FieldElement bElement = cElement.getField('b');
+      FieldElement bElement = cElement.getField('b')!;
 
       VariableDeclaration bNode = fieldDeclaration.fields.variables[1];
       expect(bNode.declaredElement, same(bElement));
@@ -7427,7 +7452,7 @@
       expect(bNode.name.staticElement, same(bElement));
       expect(bNode.name.staticType, isNull);
 
-      Expression aValue = bNode.initializer;
+      Expression aValue = bNode.initializer!;
       expect(aValue.staticType, typeProvider.doubleType);
     }
   }
@@ -7440,37 +7465,37 @@
     addTestFile(content);
 
     await resolveTestFile();
-    CompilationUnit unit = result.unit;
-    CompilationUnitElement unitElement = unit.declaredElement;
+    CompilationUnit unit = result.unit!;
+    CompilationUnitElement unitElement = unit.declaredElement!;
 
     {
-      TopLevelVariableDeclaration aDeclaration = unit.declarations[0];
+      var aDeclaration = unit.declarations[0] as TopLevelVariableDeclaration;
       VariableDeclaration aNode = aDeclaration.variables.variables[0];
-      TopLevelVariableElement aElement = aNode.declaredElement;
+      var aElement = aNode.declaredElement as TopLevelVariableElement;
       expect(aElement, same(unitElement.topLevelVariables[0]));
       expect(aElement.type, typeProvider.intType);
       expect(aNode.name.staticElement, same(aElement));
       expect(aNode.name.staticType, isNull);
 
-      Expression aValue = aNode.initializer;
+      Expression aValue = aNode.initializer!;
       expect(aValue.staticType, typeProvider.intType);
     }
 
     {
-      TopLevelVariableDeclaration bDeclaration = unit.declarations[1];
+      var bDeclaration = unit.declarations[1] as TopLevelVariableDeclaration;
 
       VariableDeclaration bNode = bDeclaration.variables.variables[0];
-      TopLevelVariableElement bElement = bNode.declaredElement;
+      var bElement = bNode.declaredElement as TopLevelVariableElement;
       expect(bElement, same(unitElement.topLevelVariables[1]));
       expect(bElement.type, typeProvider.doubleType);
 
-      TypeName typeName = bDeclaration.variables.type;
+      var typeName = bDeclaration.variables.type as TypeName;
       _assertTypeNameSimple(typeName, typeProvider.doubleType);
 
       expect(bNode.name.staticElement, same(bElement));
       expect(bNode.name.staticType, isNull);
 
-      Expression aValue = bNode.initializer;
+      Expression aValue = bNode.initializer!;
       expect(aValue.staticType, typeProvider.doubleType);
     }
   }
@@ -7482,35 +7507,36 @@
     addTestFile(content);
 
     await resolveTestFile();
-    CompilationUnit unit = result.unit;
-    CompilationUnitElement unitElement = unit.declaredElement;
+    CompilationUnit unit = result.unit!;
+    CompilationUnitElement unitElement = unit.declaredElement!;
 
-    TopLevelVariableDeclaration variableDeclaration = unit.declarations[0];
+    var variableDeclaration =
+        unit.declarations[0] as TopLevelVariableDeclaration;
     expect(variableDeclaration.variables.type, isNull);
 
     {
       VariableDeclaration aNode = variableDeclaration.variables.variables[0];
-      TopLevelVariableElement aElement = aNode.declaredElement;
+      var aElement = aNode.declaredElement as TopLevelVariableElement;
       expect(aElement, same(unitElement.topLevelVariables[0]));
       expect(aElement.type, typeProvider.intType);
 
       expect(aNode.name.staticElement, same(aElement));
       expect(aNode.name.staticType, isNull);
 
-      Expression aValue = aNode.initializer;
+      Expression aValue = aNode.initializer!;
       expect(aValue.staticType, typeProvider.intType);
     }
 
     {
       VariableDeclaration bNode = variableDeclaration.variables.variables[1];
-      TopLevelVariableElement bElement = bNode.declaredElement;
+      var bElement = bNode.declaredElement as TopLevelVariableElement;
       expect(bElement, same(unitElement.topLevelVariables[1]));
       expect(bElement.type, typeProvider.doubleType);
 
       expect(bNode.name.staticElement, same(bElement));
       expect(bNode.name.staticType, isNull);
 
-      Expression aValue = bNode.initializer;
+      Expression aValue = bNode.initializer!;
       expect(aValue.staticType, typeProvider.doubleType);
     }
   }
@@ -7525,8 +7551,8 @@
     String fTypeString = 'double Function(int, {String b, bool c})';
 
     await resolveTestFile();
-    FunctionDeclaration fDeclaration = result.unit.declarations[0];
-    FunctionElement fElement = fDeclaration.declaredElement;
+    var fDeclaration = result.unit!.declarations[0] as FunctionDeclaration;
+    var fElement = fDeclaration.declaredElement as FunctionElement;
 
     InterfaceType doubleType = typeProvider.doubleType;
 
@@ -7536,7 +7562,7 @@
     expect(fDeclaration.name.staticElement, same(fElement));
     expect(fDeclaration.name.staticType, isNull);
 
-    TypeName fReturnTypeNode = fDeclaration.returnType;
+    var fReturnTypeNode = fDeclaration.returnType as TypeName;
     expect(fReturnTypeNode.name.staticElement, same(doubleType.element));
     expect(fReturnTypeNode.type, doubleType);
     //
@@ -7546,16 +7572,16 @@
     expect(elements, hasLength(3));
 
     List<FormalParameter> nodes =
-        fDeclaration.functionExpression.parameters.parameters;
+        fDeclaration.functionExpression.parameters!.parameters;
     expect(nodes, hasLength(3));
 
-    _assertSimpleParameter(nodes[0], elements[0],
+    _assertSimpleParameter(nodes[0] as SimpleFormalParameter, elements[0],
         name: 'a',
         offset: 13,
         kind: ParameterKind.REQUIRED,
         type: typeProvider.intType);
 
-    DefaultFormalParameter bNode = nodes[1];
+    var bNode = nodes[1] as DefaultFormalParameter;
     _assertDefaultParameter(bNode, elements[1],
         name: 'b',
         offset: 24,
@@ -7563,14 +7589,14 @@
         type: typeProvider.stringType);
     expect(bNode.defaultValue, isNull);
 
-    DefaultFormalParameter cNode = nodes[2];
+    var cNode = nodes[2] as DefaultFormalParameter;
     _assertDefaultParameter(cNode, elements[2],
         name: 'c',
         offset: 32,
         kind: ParameterKind.NAMED,
         type: typeProvider.boolType);
     {
-      BinaryExpression defaultValue = cNode.defaultValue;
+      var defaultValue = cNode.defaultValue as BinaryExpression;
       expect(defaultValue.staticElement, isNotNull);
       expect(defaultValue.staticType, typeProvider.boolType);
     }
@@ -7578,10 +7604,10 @@
     //
     // Validate the arguments at the call site.
     //
-    FunctionDeclaration mainDeclaration = result.unit.declarations[1];
-    BlockFunctionBody body = mainDeclaration.functionExpression.body;
-    ExpressionStatement statement = body.block.statements[0];
-    MethodInvocation invocation = statement.expression;
+    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;
     List<Expression> arguments = invocation.argumentList.arguments;
 
     _assertArgumentToParameter(arguments[0], fElement.parameters[0]);
@@ -7596,25 +7622,27 @@
     addTestFile(content);
 
     await resolveTestFile();
-    CompilationUnit unit = result.unit;
+    CompilationUnit unit = result.unit!;
 
-    FunctionTypeAlias alias = unit.declarations[0];
-    TypeAliasElement aliasElement = alias.declaredElement;
+    var alias = unit.declarations[0] as FunctionTypeAlias;
+    TypeAliasElement aliasElement = alias.declaredElement!;
     var function = aliasElement.aliasedElement as GenericFunctionTypeElement;
     expect(aliasElement, same(findElement.typeAlias('F')));
     expect(function.returnType, typeProvider.intType);
 
-    _assertTypeNameSimple(alias.returnType, typeProvider.intType);
+    _assertTypeNameSimple(alias.returnType as TypeName, typeProvider.intType);
 
     _assertSimpleParameter(
-        alias.parameters.parameters[0], function.parameters[0],
+        alias.parameters.parameters[0] as SimpleFormalParameter,
+        function.parameters[0],
         name: 'a',
         offset: 22,
         kind: ParameterKind.REQUIRED,
         type: typeProvider.boolType);
 
     _assertSimpleParameter(
-        alias.parameters.parameters[1], function.parameters[1],
+        alias.parameters.parameters[1] as SimpleFormalParameter,
+        function.parameters[1],
         name: 'b',
         offset: 27,
         kind: ParameterKind.REQUIRED,
@@ -7628,25 +7656,25 @@
 ''';
     addTestFile(content);
     await resolveTestFile();
-    CompilationUnit unit = result.unit;
-    CompilationUnitElement unitElement = unit.declaredElement;
+    CompilationUnit unit = result.unit!;
+    CompilationUnitElement unitElement = unit.declaredElement!;
 
-    ClassDeclaration aNode = unit.declarations[0];
-    ClassElement aElement = aNode.declaredElement;
+    var aNode = unit.declarations[0] as ClassDeclaration;
+    ClassElement aElement = aNode.declaredElement!;
     expect(aElement, same(unitElement.types[0]));
 
-    ClassDeclaration cNode = unit.declarations[1];
-    ClassElement cElement = cNode.declaredElement;
+    var cNode = unit.declarations[1] as ClassDeclaration;
+    ClassElement cElement = cNode.declaredElement!;
     expect(cElement, same(unitElement.types[1]));
 
     {
-      TypeParameter tNode = cNode.typeParameters.typeParameters[0];
+      TypeParameter tNode = cNode.typeParameters!.typeParameters[0];
       expect(tNode.declaredElement, same(cElement.typeParameters[0]));
 
-      TypeName bound = tNode.bound;
+      var bound = tNode.bound as TypeName;
       expect(bound.type, interfaceTypeStar(aElement));
 
-      SimpleIdentifier boundIdentifier = bound.name;
+      var boundIdentifier = bound.name as SimpleIdentifier;
       expect(boundIdentifier.staticElement, same(aElement));
       expect(boundIdentifier.staticType, isNull);
     }
@@ -7658,26 +7686,26 @@
         nullabilitySuffix: NullabilitySuffix.star,
       );
 
-      TypeParameter uNode = cNode.typeParameters.typeParameters[1];
+      TypeParameter uNode = cNode.typeParameters!.typeParameters[1];
       expect(uNode.declaredElement, same(cElement.typeParameters[1]));
 
-      TypeName bound = uNode.bound;
+      var bound = uNode.bound as TypeName;
       expect(bound.type, listOfA);
 
-      SimpleIdentifier listIdentifier = bound.name;
+      var listIdentifier = bound.name as SimpleIdentifier;
       expect(listIdentifier.staticElement, same(listElement));
       expect(listIdentifier.staticType, isNull);
 
-      TypeName aTypeName = bound.typeArguments.arguments[0];
+      var aTypeName = bound.typeArguments!.arguments[0] as TypeName;
       expect(aTypeName.type, interfaceTypeStar(aElement));
 
-      SimpleIdentifier aIdentifier = aTypeName.name;
+      var aIdentifier = aTypeName.name as SimpleIdentifier;
       expect(aIdentifier.staticElement, same(aElement));
       expect(aIdentifier.staticType, isNull);
     }
 
     {
-      TypeParameter vNode = cNode.typeParameters.typeParameters[2];
+      TypeParameter vNode = cNode.typeParameters!.typeParameters[2];
       expect(vNode.declaredElement, same(cElement.typeParameters[2]));
       expect(vNode.bound, isNull);
     }
@@ -7709,87 +7737,95 @@
 
     // catch (e, st)
     {
-      TryStatement statement = statements[0];
+      var statement = statements[0] as TryStatement;
       CatchClause catchClause = statement.catchClauses[0];
       expect(catchClause.exceptionType, isNull);
 
-      SimpleIdentifier exceptionNode = catchClause.exceptionParameter;
-      LocalVariableElement exceptionElement = exceptionNode.staticElement;
+      var exceptionNode = catchClause.exceptionParameter as SimpleIdentifier;
+      var exceptionElement =
+          exceptionNode.staticElement as LocalVariableElement;
       expect(exceptionElement.type, DynamicTypeImpl.instance);
 
-      SimpleIdentifier stackNode = catchClause.stackTraceParameter;
-      LocalVariableElement stackElement = stackNode.staticElement;
+      var stackNode = catchClause.stackTraceParameter as SimpleIdentifier;
+      var stackElement = stackNode.staticElement as LocalVariableElement;
       expect(stackElement.type, typeProvider.stackTraceType);
 
       List<Statement> catchStatements = catchClause.body.statements;
 
-      ExpressionStatement exceptionStatement = catchStatements[0];
-      SimpleIdentifier exceptionIdentifier = exceptionStatement.expression;
+      var exceptionStatement = catchStatements[0] as ExpressionStatement;
+      var exceptionIdentifier =
+          exceptionStatement.expression as SimpleIdentifier;
       expect(exceptionIdentifier.staticElement, same(exceptionElement));
       expect(exceptionIdentifier.staticType, DynamicTypeImpl.instance);
 
-      ExpressionStatement stackStatement = catchStatements[1];
-      SimpleIdentifier stackIdentifier = stackStatement.expression;
+      var stackStatement = catchStatements[1] as ExpressionStatement;
+      var stackIdentifier = stackStatement.expression as SimpleIdentifier;
       expect(stackIdentifier.staticElement, same(stackElement));
       expect(stackIdentifier.staticType, typeProvider.stackTraceType);
     }
 
     // on int catch (e, st)
     {
-      TryStatement statement = statements[1];
+      var statement = statements[1] as TryStatement;
       CatchClause catchClause = statement.catchClauses[0];
-      _assertTypeNameSimple(catchClause.exceptionType, typeProvider.intType);
+      _assertTypeNameSimple(
+          catchClause.exceptionType as TypeName, typeProvider.intType);
 
-      SimpleIdentifier exceptionNode = catchClause.exceptionParameter;
-      LocalVariableElement exceptionElement = exceptionNode.staticElement;
+      var exceptionNode = catchClause.exceptionParameter as SimpleIdentifier;
+      var exceptionElement =
+          exceptionNode.staticElement as LocalVariableElement;
       expect(exceptionElement.type, typeProvider.intType);
 
-      SimpleIdentifier stackNode = catchClause.stackTraceParameter;
-      LocalVariableElement stackElement = stackNode.staticElement;
+      var stackNode = catchClause.stackTraceParameter as SimpleIdentifier;
+      var stackElement = stackNode.staticElement as LocalVariableElement;
       expect(stackElement.type, typeProvider.stackTraceType);
 
       List<Statement> catchStatements = catchClause.body.statements;
 
-      ExpressionStatement exceptionStatement = catchStatements[0];
-      SimpleIdentifier exceptionIdentifier = exceptionStatement.expression;
+      var exceptionStatement = catchStatements[0] as ExpressionStatement;
+      var exceptionIdentifier =
+          exceptionStatement.expression as SimpleIdentifier;
       expect(exceptionIdentifier.staticElement, same(exceptionElement));
       expect(exceptionIdentifier.staticType, typeProvider.intType);
 
-      ExpressionStatement stackStatement = catchStatements[1];
-      SimpleIdentifier stackIdentifier = stackStatement.expression;
+      var stackStatement = catchStatements[1] as ExpressionStatement;
+      var stackIdentifier = stackStatement.expression as SimpleIdentifier;
       expect(stackIdentifier.staticElement, same(stackElement));
       expect(stackIdentifier.staticType, typeProvider.stackTraceType);
     }
 
     // catch (e)
     {
-      TryStatement statement = statements[2];
+      var statement = statements[2] as TryStatement;
       CatchClause catchClause = statement.catchClauses[0];
       expect(catchClause.exceptionType, isNull);
       expect(catchClause.stackTraceParameter, isNull);
 
-      SimpleIdentifier exceptionNode = catchClause.exceptionParameter;
-      LocalVariableElement exceptionElement = exceptionNode.staticElement;
+      var exceptionNode = catchClause.exceptionParameter as SimpleIdentifier;
+      var exceptionElement =
+          exceptionNode.staticElement as LocalVariableElement;
       expect(exceptionElement.type, DynamicTypeImpl.instance);
     }
 
     // on int catch (e)
     {
-      TryStatement statement = statements[3];
+      var statement = statements[3] as TryStatement;
       CatchClause catchClause = statement.catchClauses[0];
-      _assertTypeNameSimple(catchClause.exceptionType, typeProvider.intType);
+      _assertTypeNameSimple(catchClause.exceptionType!, typeProvider.intType);
       expect(catchClause.stackTraceParameter, isNull);
 
-      SimpleIdentifier exceptionNode = catchClause.exceptionParameter;
-      LocalVariableElement exceptionElement = exceptionNode.staticElement;
+      var exceptionNode = catchClause.exceptionParameter as SimpleIdentifier;
+      var exceptionElement =
+          exceptionNode.staticElement as LocalVariableElement;
       expect(exceptionElement.type, typeProvider.intType);
     }
 
     // on int catch (e)
     {
-      TryStatement statement = statements[4];
+      var statement = statements[4] as TryStatement;
       CatchClause catchClause = statement.catchClauses[0];
-      _assertTypeNameSimple(catchClause.exceptionType, typeProvider.intType);
+      _assertTypeNameSimple(
+          catchClause.exceptionType as TypeName, typeProvider.intType);
       expect(catchClause.exceptionParameter, isNull);
       expect(catchClause.stackTraceParameter, isNull);
     }
@@ -7823,18 +7859,18 @@
     await resolveTestFile();
 
     FunctionTypeAlias alias = findNode.functionTypeAlias('F<T>');
-    TypeAliasElement aliasElement = alias.declaredElement;
+    TypeAliasElement aliasElement = alias.declaredElement!;
 
     FieldDeclaration fDeclaration = findNode.fieldDeclaration('F<int> f');
 
-    TypeName typeName = fDeclaration.fields.type;
+    var typeName = fDeclaration.fields.type as TypeName;
     assertType(typeName, 'int Function(bool)');
 
-    SimpleIdentifier typeIdentifier = typeName.name;
+    var typeIdentifier = typeName.name as SimpleIdentifier;
     expect(typeIdentifier.staticElement, same(aliasElement));
     expect(typeIdentifier.staticType, isNull);
 
-    List<TypeAnnotation> typeArguments = typeName.typeArguments.arguments;
+    List<TypeAnnotation> typeArguments = typeName.typeArguments!.arguments;
     expect(typeArguments, hasLength(1));
     _assertTypeNameSimple(typeArguments[0], typeProvider.intType);
   }
@@ -7867,20 +7903,20 @@
 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];
+    ImportElement bImport = unit.declaredElement!.library.imports[0];
+    ImportElement cImport = unit.declaredElement!.library.imports[1];
 
-    LibraryElement bLibrary = bImport.importedLibrary;
-    LibraryElement aLibrary = bLibrary.exports[0].exportedLibrary;
-    ClassElement aClass = aLibrary.getType('A');
+    LibraryElement bLibrary = bImport.importedLibrary!;
+    LibraryElement aLibrary = bLibrary.exports[0].exportedLibrary!;
+    ClassElement aClass = aLibrary.getType('A')!;
 
     {
-      TopLevelVariableDeclaration declaration = unit.declarations[0];
-      TypeName typeName = declaration.variables.type;
+      var declaration = unit.declarations[0] as TopLevelVariableDeclaration;
+      var typeName = declaration.variables.type as TypeName;
 
-      PrefixedIdentifier typeIdentifier = typeName.name;
+      var typeIdentifier = typeName.name as PrefixedIdentifier;
       expect(typeIdentifier.staticElement, aClass);
 
       expect(typeIdentifier.prefix.name, 'b');
@@ -7890,10 +7926,10 @@
     }
 
     {
-      TopLevelVariableDeclaration declaration = unit.declarations[1];
-      TypeName typeName = declaration.variables.type;
+      var declaration = unit.declarations[1] as TopLevelVariableDeclaration;
+      var typeName = declaration.variables.type as TypeName;
 
-      PrefixedIdentifier typeIdentifier = typeName.name;
+      var typeIdentifier = typeName.name as PrefixedIdentifier;
       expect(typeIdentifier.staticElement, aClass);
 
       expect(typeIdentifier.prefix.name, 'c');
@@ -7912,23 +7948,23 @@
 typedef void F(int p);
 ''');
     await resolveTestFile();
-    CompilationUnit unit = result.unit;
+    CompilationUnit unit = result.unit!;
 
-    FunctionTypeAlias fNode = unit.declarations[1];
-    TypeAliasElement fElement = fNode.declaredElement;
+    var fNode = unit.declarations[1] as FunctionTypeAlias;
+    TypeAliasElement fElement = fNode.declaredElement!;
 
     var statements = _getMainStatements(result);
 
     {
-      ExpressionStatement statement = statements[0];
-      SimpleIdentifier identifier = statement.expression;
+      var statement = statements[0] as ExpressionStatement;
+      var identifier = statement.expression as SimpleIdentifier;
       expect(identifier.staticElement, same(typeProvider.intType.element));
       expect(identifier.staticType, typeProvider.typeType);
     }
 
     {
-      ExpressionStatement statement = statements[1];
-      SimpleIdentifier identifier = statement.expression;
+      var statement = statements[1] as ExpressionStatement;
+      var identifier = statement.expression as SimpleIdentifier;
       expect(identifier.staticElement, same(fElement));
       expect(identifier.staticType, typeProvider.typeType);
     }
@@ -7958,9 +7994,9 @@
     expect(result.errors, isNotEmpty);
 
     List<Statement> statements = _getMainStatements(result);
-    ExpressionStatement statement = statements[0];
+    var statement = statements[0] as ExpressionStatement;
 
-    InstanceCreationExpression creation = statement.expression;
+    var creation = statement.expression as InstanceCreationExpression;
     expect(creation.staticType, isDynamicType);
 
     ConstructorName constructorName = creation.constructorName;
@@ -7969,11 +8005,11 @@
     TypeName typeName = constructorName.type;
     expect(typeName.type, isDynamicType);
 
-    SimpleIdentifier typeIdentifier = typeName.name;
+    var typeIdentifier = typeName.name as SimpleIdentifier;
     expect(typeIdentifier.staticElement, isNull);
     expect(typeIdentifier.staticType, isNull);
 
-    assertTypeArguments(typeName.typeArguments, [intType, doubleType]);
+    assertTypeArguments(typeName.typeArguments!, [intType, doubleType]);
     _assertInvocationArguments(creation.argumentList,
         [checkTopVarRef('arg1'), checkTopVarUndefinedNamedRef('arg2')]);
   }
@@ -7990,9 +8026,9 @@
     expect(result.errors, isNotEmpty);
 
     List<Statement> statements = _getMainStatements(result);
-    ExpressionStatement statement = statements[0];
+    var statement = statements[0] as ExpressionStatement;
 
-    InstanceCreationExpression creation = statement.expression;
+    var creation = statement.expression as InstanceCreationExpression;
     expect(creation.staticType, isDynamicType);
 
     ConstructorName constructorName = creation.constructorName;
@@ -8001,7 +8037,7 @@
     TypeName typeName = constructorName.type;
     expect(typeName.type, isDynamicType);
 
-    PrefixedIdentifier typePrefixed = typeName.name;
+    var typePrefixed = typeName.name as PrefixedIdentifier;
     expect(typePrefixed.staticElement, isNull);
     expect(typePrefixed.staticType, isDynamicType);
 
@@ -8013,7 +8049,7 @@
     expect(typeIdentifier.staticElement, isNull);
     expect(typeIdentifier.staticType, isDynamicType);
 
-    assertTypeArguments(typeName.typeArguments, [intType, doubleType]);
+    assertTypeArguments(typeName.typeArguments!, [intType, doubleType]);
     _assertInvocationArguments(creation.argumentList,
         [checkTopVarRef('arg1'), checkTopVarUndefinedNamedRef('arg2')]);
   }
@@ -8030,13 +8066,13 @@
     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);
-    ExpressionStatement statement = statements[0];
+    var statement = statements[0] as ExpressionStatement;
 
-    InstanceCreationExpression creation = statement.expression;
+    var creation = statement.expression as InstanceCreationExpression;
     expect(creation.staticType, isDynamicType);
 
     ConstructorName constructorName = creation.constructorName;
@@ -8045,7 +8081,7 @@
     TypeName typeName = constructorName.type;
     expect(typeName.type, isDynamicType);
 
-    PrefixedIdentifier typePrefixed = typeName.name;
+    var typePrefixed = typeName.name as PrefixedIdentifier;
     expect(typePrefixed.staticElement, isNull);
     expect(typePrefixed.staticType, isDynamicType);
 
@@ -8057,7 +8093,7 @@
     expect(typeIdentifier.staticElement, isNull);
     expect(typeIdentifier.staticType, isDynamicType);
 
-    assertTypeArguments(typeName.typeArguments, [intType, doubleType]);
+    assertTypeArguments(typeName.typeArguments!, [intType, doubleType]);
     _assertInvocationArguments(creation.argumentList,
         [checkTopVarRef('arg1'), checkTopVarUndefinedNamedRef('arg2')]);
   }
@@ -8073,9 +8109,9 @@
     expect(result.errors, isNotEmpty);
 
     List<Statement> statements = _getMainStatements(result);
-    ExpressionStatement statement = statements[0];
+    var statement = statements[0] as ExpressionStatement;
 
-    InstanceCreationExpression creation = statement.expression;
+    var creation = statement.expression as InstanceCreationExpression;
     expect(creation.staticType, isDynamicType);
 
     ConstructorName constructorName = creation.constructorName;
@@ -8083,7 +8119,7 @@
     TypeName typeName = constructorName.type;
     expect(typeName.type, isDynamicType);
 
-    PrefixedIdentifier typePrefixed = typeName.name;
+    var typePrefixed = typeName.name as PrefixedIdentifier;
     assertElementNull(typePrefixed);
     assertTypeNull(typePrefixed);
 
@@ -8096,9 +8132,9 @@
     assertTypeNull(typeIdentifier);
 
     assertElementNull(constructorName.name);
-    assertTypeNull(constructorName.name);
+    assertTypeNull(constructorName.name!);
 
-    assertTypeArguments(typeName.typeArguments, [intType, doubleType]);
+    assertTypeArguments(typeName.typeArguments!, [intType, doubleType]);
     _assertInvocationArguments(creation.argumentList,
         [checkTopVarRef('arg1'), checkTopVarUndefinedNamedRef('arg2')]);
   }
@@ -8114,14 +8150,14 @@
     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;
 
     List<Statement> statements = _getMainStatements(result);
-    ExpressionStatement statement = statements[0];
+    var statement = statements[0] as ExpressionStatement;
 
-    InstanceCreationExpression creation = statement.expression;
+    var creation = statement.expression as InstanceCreationExpression;
     expect(creation.staticType, isDynamicType);
 
     ConstructorName constructorName = creation.constructorName;
@@ -8129,7 +8165,7 @@
     TypeName typeName = constructorName.type;
     expect(typeName.type, isDynamicType);
 
-    PrefixedIdentifier typePrefixed = typeName.name;
+    var typePrefixed = typeName.name as PrefixedIdentifier;
     assertElementNull(typePrefixed);
     assertTypeNull(typePrefixed);
 
@@ -8142,9 +8178,9 @@
     assertTypeNull(typeIdentifier);
 
     assertElementNull(constructorName.name);
-    assertTypeNull(constructorName.name);
+    assertTypeNull(constructorName.name!);
 
-    assertTypeArguments(typeName.typeArguments, [intType, doubleType]);
+    assertTypeArguments(typeName.typeArguments!, [intType, doubleType]);
     _assertInvocationArguments(creation.argumentList,
         [checkTopVarRef('arg1'), checkTopVarUndefinedNamedRef('arg2')]);
   }
@@ -8160,15 +8196,15 @@
     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');
+    var randomElement = mathImport.importedLibrary!.getType('Random')!;
 
     List<Statement> statements = _getMainStatements(result);
-    ExpressionStatement statement = statements[0];
+    var statement = statements[0] as ExpressionStatement;
 
-    InstanceCreationExpression creation = statement.expression;
+    var creation = statement.expression as InstanceCreationExpression;
     expect(creation.staticType, interfaceTypeStar(randomElement));
 
     ConstructorName constructorName = creation.constructorName;
@@ -8176,7 +8212,7 @@
     TypeName typeName = constructorName.type;
     assertType(typeName, 'Random');
 
-    PrefixedIdentifier typePrefixed = typeName.name;
+    var typePrefixed = typeName.name as PrefixedIdentifier;
     assertElement(typePrefixed, randomElement);
     assertTypeNull(typePrefixed);
 
@@ -8189,9 +8225,9 @@
     assertTypeNull(typeIdentifier);
 
     assertElementNull(constructorName.name);
-    assertTypeNull(constructorName.name);
+    assertTypeNull(constructorName.name!);
 
-    assertTypeArguments(typeName.typeArguments, [intType, doubleType]);
+    assertTypeArguments(typeName.typeArguments!, [intType, doubleType]);
     _assertInvocationArguments(creation.argumentList,
         [checkTopVarRef('arg1'), checkTopVarUndefinedNamedRef('arg2')]);
   }
@@ -8207,18 +8243,18 @@
     expect(result.errors, isNotEmpty);
 
     List<Statement> statements = _getMainStatements(result);
-    ExpressionStatement statement = statements[0];
+    var statement = statements[0] as ExpressionStatement;
 
-    MethodInvocation invocation = statement.expression;
+    var invocation = statement.expression as MethodInvocation;
     expect(invocation.target, isNull);
     expect(invocation.staticType, isDynamicType);
-    assertUnresolvedInvokeType(invocation.staticInvokeType);
+    assertUnresolvedInvokeType(invocation.staticInvokeType!);
 
     SimpleIdentifier name = invocation.methodName;
     expect(name.staticElement, isNull);
     expect(name.staticType, isDynamicType);
 
-    assertTypeArguments(invocation.typeArguments, [intType, doubleType]);
+    assertTypeArguments(invocation.typeArguments!, [intType, doubleType]);
     _assertInvocationArguments(invocation.argumentList,
         [checkTopVarRef('arg1'), checkTopVarUndefinedNamedRef('arg2')]);
   }
@@ -8237,21 +8273,21 @@
     TopLevelVariableElement foo = _getTopLevelVariable(result, 'foo');
 
     List<Statement> statements = _getMainStatements(result);
-    ExpressionStatement statement = statements[0];
+    var statement = statements[0] as ExpressionStatement;
 
-    MethodInvocation invocation = statement.expression;
+    var invocation = statement.expression as MethodInvocation;
     expect(invocation.staticType, isDynamicType);
-    assertUnresolvedInvokeType(invocation.staticInvokeType);
+    assertUnresolvedInvokeType(invocation.staticInvokeType!);
 
-    SimpleIdentifier target = invocation.target;
+    var target = invocation.target as SimpleIdentifier;
     expect(target.staticElement, same(foo.getter));
     expect(target.staticType, typeProvider.objectType);
 
     SimpleIdentifier name = invocation.methodName;
     expect(name.staticElement, isNull);
-    assertUnresolvedInvokeType(name.staticType);
+    assertUnresolvedInvokeType(name.staticType!);
 
-    assertTypeArguments(invocation.typeArguments, [intType, doubleType]);
+    assertTypeArguments(invocation.typeArguments!, [intType, doubleType]);
     _assertInvocationArguments(invocation.argumentList,
         [checkTopVarRef('arg1'), checkTopVarUndefinedNamedRef('arg2')]);
   }
@@ -8268,17 +8304,17 @@
 
     var invocation = findNode.methodInvocation('foo.bar');
     assertTypeDynamic(invocation);
-    assertUnresolvedInvokeType(invocation.staticInvokeType);
+    assertUnresolvedInvokeType(invocation.staticInvokeType!);
 
-    SimpleIdentifier target = invocation.target;
+    var target = invocation.target as SimpleIdentifier;
     assertElementNull(target);
     assertTypeDynamic(target);
 
     SimpleIdentifier name = invocation.methodName;
     assertElementNull(name);
-    assertUnresolvedInvokeType(name.staticType);
+    assertUnresolvedInvokeType(name.staticType!);
 
-    assertTypeArguments(invocation.typeArguments, [intType, doubleType]);
+    assertTypeArguments(invocation.typeArguments!, [intType, doubleType]);
     _assertInvocationArguments(invocation.argumentList,
         [checkTopVarRef('arg1'), checkTopVarUndefinedNamedRef('arg2')]);
   }
@@ -8296,7 +8332,7 @@
     assertElementNull(postfix);
     assertTypeDynamic(postfix);
 
-    SimpleIdentifier aRef = postfix.operand;
+    var aRef = postfix.operand as SimpleIdentifier;
     if (hasAssignmentLeftResolution) {
       assertElementNull(aRef);
       assertTypeDynamic(aRef);
@@ -8321,7 +8357,7 @@
     assertElementNull(postfix);
     assertType(postfix, 'A');
 
-    SimpleIdentifier aRef = postfix.operand;
+    var aRef = postfix.operand as SimpleIdentifier;
     if (hasAssignmentLeftResolution) {
       assertElement(aRef, findElement.topSet('a'));
       assertType(aRef, 'A');
@@ -8344,7 +8380,7 @@
     assertElementNull(prefix);
     assertTypeDynamic(prefix);
 
-    SimpleIdentifier aRef = prefix.operand;
+    var aRef = prefix.operand as SimpleIdentifier;
     if (hasAssignmentLeftResolution) {
       assertElementNull(aRef);
       assertTypeDynamic(aRef);
@@ -8369,7 +8405,7 @@
     assertElementNull(prefix);
     assertTypeDynamic(prefix);
 
-    SimpleIdentifier aRef = prefix.operand;
+    var aRef = prefix.operand as SimpleIdentifier;
     if (hasAssignmentLeftResolution) {
       assertElement(aRef, findElement.topSet('a'));
       assertType(aRef, 'A');
@@ -8392,9 +8428,9 @@
     TopLevelVariableElement foo = _getTopLevelVariable(result, 'foo');
 
     List<Statement> statements = _getMainStatements(result);
-    ExpressionStatement statement = statements[0];
+    var statement = statements[0] as ExpressionStatement;
 
-    PrefixedIdentifier prefixed = statement.expression;
+    var prefixed = statement.expression as PrefixedIdentifier;
     expect(prefixed.staticElement, isNull);
     expect(prefixed.staticType, isDynamicType);
 
@@ -8417,9 +8453,9 @@
     expect(result.errors, isNotEmpty);
 
     List<Statement> statements = _getMainStatements(result);
-    ExpressionStatement statement = statements[0];
+    var statement = statements[0] as ExpressionStatement;
 
-    PrefixedIdentifier prefixed = statement.expression;
+    var prefixed = statement.expression as PrefixedIdentifier;
     expect(prefixed.staticElement, isNull);
     expect(prefixed.staticType, isDynamicType);
 
@@ -8442,13 +8478,13 @@
     expect(result.errors, isNotEmpty);
 
     List<Statement> statements = _getMainStatements(result);
-    ExpressionStatement statement = statements[0];
+    var statement = statements[0] as ExpressionStatement;
 
-    PropertyAccess propertyAccess = statement.expression;
+    var propertyAccess = statement.expression as PropertyAccess;
     expect(propertyAccess.staticType, isDynamicType);
 
     {
-      PrefixedIdentifier prefixed = propertyAccess.target;
+      var prefixed = propertyAccess.target as PrefixedIdentifier;
       expect(prefixed.staticElement, isNull);
       expect(prefixed.staticType, isDynamicType);
 
@@ -8479,13 +8515,13 @@
     TopLevelVariableElement foo = _getTopLevelVariable(result, 'foo');
 
     List<Statement> statements = _getMainStatements(result);
-    ExpressionStatement statement = statements[0];
+    var statement = statements[0] as ExpressionStatement;
 
-    PropertyAccess propertyAccess = statement.expression;
+    var propertyAccess = statement.expression as PropertyAccess;
     expect(propertyAccess.staticType, isDynamicType);
 
     {
-      PrefixedIdentifier prefixed = propertyAccess.target;
+      var prefixed = propertyAccess.target as PrefixedIdentifier;
       expect(prefixed.staticElement, isNull);
       expect(prefixed.staticType, isDynamicType);
 
@@ -8514,17 +8550,17 @@
     expect(result.errors, isNotEmpty);
 
     PropertyAccessorElement objectHashCode =
-        objectElement.getGetter('hashCode');
+        objectElement.getGetter('hashCode')!;
     TopLevelVariableElement foo = _getTopLevelVariable(result, 'foo');
 
     List<Statement> statements = _getMainStatements(result);
-    ExpressionStatement statement = statements[0];
+    var statement = statements[0] as ExpressionStatement;
 
-    PropertyAccess propertyAccess = statement.expression;
+    var propertyAccess = statement.expression as PropertyAccess;
     expect(propertyAccess.staticType, isDynamicType);
 
     {
-      PrefixedIdentifier prefixed = propertyAccess.target;
+      var prefixed = propertyAccess.target as PrefixedIdentifier;
       assertPrefixedIdentifier(
         prefixed,
         element: elementMatcher(
@@ -8593,8 +8629,8 @@
     expect(result.errors, isNotEmpty);
 
     List<Statement> statements = _getMainStatements(result);
-    ExpressionStatement statement = statements[0];
-    SimpleIdentifier identifier = statement.expression;
+    var statement = statements[0] as ExpressionStatement;
+    var identifier = statement.expression as SimpleIdentifier;
     expect(identifier.staticElement, isNull);
     expect(identifier.staticType, isDynamicType);
   }
@@ -8604,8 +8640,8 @@
   /// parameter.
   void _assertArgumentToParameter(
       Expression argument, ParameterElement expected,
-      {DartType memberType}) {
-    ParameterElement actual = argument.staticParameterElement;
+      {DartType? memberType}) {
+    ParameterElement actual = argument.staticParameterElement!;
     if (memberType != null) {
       expect(actual.type, memberType);
     }
@@ -8622,7 +8658,7 @@
   /// Assert that the [argument] has the [expectedType]. If the [argument] is
   /// a [NamedExpression], the name must be resolved to the same parameter.
   void _assertArgumentToParameter2(Expression argument, String expectedType) {
-    ParameterElement actual = argument.staticParameterElement;
+    ParameterElement actual = argument.staticParameterElement!;
     assertType(actual.type, expectedType);
 
     if (argument is NamedExpression) {
@@ -8645,7 +8681,7 @@
     var typeName = constructorName.type;
     expect(typeName.typeArguments, isNull);
 
-    SimpleIdentifier typeIdentifier = typeName.name;
+    var typeIdentifier = typeName.name as SimpleIdentifier;
     assertElement(typeIdentifier, classElement);
     assertTypeNull(typeIdentifier);
 
@@ -8655,9 +8691,9 @@
 
   void _assertDefaultParameter(
       DefaultFormalParameter node, ParameterElement element,
-      {String name, int offset, ParameterKind kind, DartType type}) {
+      {String? name, int? offset, ParameterKind? kind, DartType? type}) {
     expect(node, isNotNull);
-    NormalFormalParameter normalNode = node.parameter;
+    var normalNode = node.parameter as SimpleFormalParameter;
     _assertSimpleParameter(normalNode, element,
         name: name, offset: offset, kind: kind, type: type);
   }
@@ -8673,7 +8709,7 @@
   }
 
   void _assertParameterElement(ParameterElement element,
-      {String name, int offset, ParameterKind kind, DartType type}) {
+      {String? name, int? offset, ParameterKind? kind, DartType? type}) {
     expect(element, isNotNull);
     expect(name, isNotNull);
     expect(offset, isNotNull);
@@ -8688,34 +8724,35 @@
 
   void _assertSimpleParameter(
       SimpleFormalParameter node, ParameterElement element,
-      {String name, int offset, ParameterKind kind, DartType type}) {
+      {String? name, int? offset, ParameterKind? kind, DartType? type}) {
     _assertParameterElement(element,
         name: name, offset: offset, kind: kind, type: type);
 
     expect(node, isNotNull);
     expect(node.declaredElement, same(element));
-    expect(node.identifier.staticElement, same(element));
+    expect(node.identifier!.staticElement, same(element));
 
-    TypeName typeName = node.type;
+    var typeName = node.type as TypeName?;
     if (typeName != null) {
       expect(typeName.type, type);
-      expect(typeName.name.staticElement, same(type.element));
+      expect(typeName.name.staticElement, same(type!.element));
     }
   }
 
-  void _assertTypeNameSimple(TypeName typeName, DartType type) {
+  void _assertTypeNameSimple(TypeAnnotation typeName, DartType type) {
+    typeName as TypeName;
     expect(typeName.type, type);
 
-    SimpleIdentifier identifier = typeName.name;
+    var identifier = typeName.name as SimpleIdentifier;
     expect(identifier.staticElement, same(type.element));
     expect(identifier.staticType, isNull);
   }
 
   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') {
-        BlockFunctionBody body = declaration.functionExpression.body;
+        var body = declaration.functionExpression.body as BlockFunctionBody;
         return body.block.statements;
       }
     }
@@ -8724,7 +8761,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 e47b257..1430912 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -51,14 +51,14 @@
 
 @reflectiveTest
 class AnalysisDriverSchedulerTest with ResourceProviderMixin {
-  DartSdk sdk;
+  late DartSdk sdk;
   final ByteStore byteStore = MemoryByteStore();
   final FileContentOverlay contentOverlay = FileContentOverlay();
 
   final StringBuffer logBuffer = StringBuffer();
-  PerformanceLog logger;
+  late final PerformanceLog logger;
 
-  AnalysisDriverScheduler scheduler;
+  late final AnalysisDriverScheduler scheduler;
 
   List<ResolvedUnitResult> allResults = [];
 
@@ -193,7 +193,7 @@
     driver1.priorityFiles = [a];
     driver2.priorityFiles = [a];
 
-    ResolvedUnitResult result = await driver2.getResult(b);
+    ResolvedUnitResult result = (await driver2.getResult(b))!;
     expect(result.path, b);
 
     await scheduler.status.firstWhere((status) => status.isIdle);
@@ -442,17 +442,17 @@
 part of 'lib.dart';
 ''');
 
-    ResolvedUnitResult libResult = await driver.getResult(lib);
-    ResolvedUnitResult partResult1 = await driver.getResult(part1);
-    ResolvedUnitResult partResult2 = await driver.getResult(part2);
+    ResolvedUnitResult libResult = (await driver.getResult(lib))!;
+    ResolvedUnitResult partResult1 = (await driver.getResult(part1))!;
+    ResolvedUnitResult partResult2 = (await driver.getResult(part2))!;
 
-    CompilationUnit libUnit = libResult.unit;
-    CompilationUnit partUnit1 = partResult1.unit;
-    CompilationUnit partUnit2 = partResult2.unit;
+    CompilationUnit libUnit = libResult.unit!;
+    CompilationUnit partUnit1 = partResult1.unit!;
+    CompilationUnit partUnit2 = partResult2.unit!;
 
-    CompilationUnitElement unitElement = libUnit.declaredElement;
-    CompilationUnitElement partElement1 = partUnit1.declaredElement;
-    CompilationUnitElement partElement2 = partUnit2.declaredElement;
+    CompilationUnitElement unitElement = libUnit.declaredElement!;
+    CompilationUnitElement partElement1 = partUnit1.declaredElement!;
+    CompilationUnitElement partElement2 = partUnit2.declaredElement!;
 
     LibraryElement libraryElement = unitElement.library;
     {
@@ -489,7 +489,7 @@
 
     driver.addFile(lib);
 
-    ResolvedUnitResult libResult = await driver.getResult(lib);
+    ResolvedUnitResult libResult = (await driver.getResult(lib))!;
     List<AnalysisError> errors = libResult.errors;
     expect(errors, hasLength(1));
     expect(errors[0].errorCode, CompileTimeErrorCode.PART_OF_UNNAMED_LIBRARY);
@@ -508,7 +508,7 @@
 
     driver.addFile(lib);
 
-    ResolvedUnitResult libResult = await driver.getResult(lib);
+    ResolvedUnitResult libResult = (await driver.getResult(lib))!;
     List<AnalysisError> errors = libResult.errors;
     expect(errors, hasLength(1));
     expect(errors[0].errorCode, CompileTimeErrorCode.PART_OF_DIFFERENT_LIBRARY);
@@ -527,7 +527,7 @@
 
     driver.addFile(lib);
 
-    ResolvedUnitResult libResult = await driver.getResult(lib);
+    ResolvedUnitResult libResult = (await driver.getResult(lib))!;
     List<AnalysisError> errors = libResult.errors;
     expect(errors, hasLength(1));
     expect(errors[0].errorCode, CompileTimeErrorCode.PART_OF_DIFFERENT_LIBRARY);
@@ -546,7 +546,7 @@
 
     driver.addFile(lib);
 
-    ResolvedUnitResult libResult = await driver.getResult(lib);
+    ResolvedUnitResult libResult = (await driver.getResult(lib))!;
     List<AnalysisError> errors = libResult.errors;
     expect(errors, hasLength(1));
     expect(errors[0].errorCode, CompileTimeErrorCode.PART_OF_NON_PART);
@@ -558,7 +558,7 @@
 
     driver.priorityFiles = [a];
 
-    ResolvedUnitResult result1 = await driver.getResult(a);
+    ResolvedUnitResult result1 = (await driver.getResult(a))!;
     expect(driver.test.priorityResults, containsPair(a, result1));
 
     await waitForIdleWithoutExceptions();
@@ -566,7 +566,7 @@
 
     // Get the (cached) result, not reported to the stream.
     {
-      ResolvedUnitResult result2 = await driver.getResult(a);
+      ResolvedUnitResult result2 = (await driver.getResult(a))!;
       expect(result2, same(result1));
       expect(allResults, isEmpty);
     }
@@ -574,7 +574,7 @@
     // Get the (cached) result, reported to the stream.
     {
       ResolvedUnitResult result2 =
-          await driver.getResult(a, sendCachedToStream: true);
+          (await driver.getResult(a, sendCachedToStream: true))!;
       expect(result2, same(result1));
 
       expect(allResults, hasLength(1));
@@ -590,21 +590,21 @@
 
     driver.priorityFiles = [a];
 
-    ResolvedUnitResult result1 = await driver.getResult(a);
+    ResolvedUnitResult result1 = (await driver.getResult(a))!;
     expect(driver.test.priorityResults, containsPair(a, result1));
 
     // Change a file.
     // The cache is flushed.
     driver.changeFile(a);
     expect(driver.test.priorityResults, isEmpty);
-    ResolvedUnitResult result2 = await driver.getResult(a);
+    ResolvedUnitResult result2 = (await driver.getResult(a))!;
     expect(driver.test.priorityResults, containsPair(a, result2));
 
     // Add a file.
     // The cache is flushed.
     driver.addFile(b);
     expect(driver.test.priorityResults, isEmpty);
-    ResolvedUnitResult result3 = await driver.getResult(a);
+    ResolvedUnitResult result3 = (await driver.getResult(a))!;
     expect(driver.test.priorityResults, containsPair(a, result3));
 
     // Remove a file.
@@ -621,7 +621,7 @@
 
     driver.priorityFiles = [a];
 
-    ResolvedUnitResult result1 = await driver.getResult(a);
+    ResolvedUnitResult result1 = (await driver.getResult(a))!;
     expect(driver.test.priorityResults, hasLength(1));
     expect(driver.test.priorityResults, containsPair(a, result1));
 
@@ -632,7 +632,7 @@
     expect(driver.test.priorityResults, containsPair(a, result1));
 
     // Get the result for "b".
-    ResolvedUnitResult result2 = await driver.getResult(b);
+    ResolvedUnitResult result2 = (await driver.getResult(b))!;
     expect(driver.test.priorityResults, hasLength(2));
     expect(driver.test.priorityResults, containsPair(a, result1));
     expect(driver.test.priorityResults, containsPair(b, result2));
@@ -648,11 +648,11 @@
     var a = convertPath('/test/bin/a.dart');
     newFile(a, content: 'var a = 1;');
 
-    ResolvedUnitResult result1 = await driver.getResult(a);
+    ResolvedUnitResult result1 = (await driver.getResult(a))!;
     expect(driver.test.priorityResults, isEmpty);
 
     // The file is not priority, so its result is not cached.
-    ResolvedUnitResult result2 = await driver.getResult(a);
+    ResolvedUnitResult result2 = (await driver.getResult(a))!;
     expect(result2, isNot(same(result1)));
   }
 
@@ -673,7 +673,7 @@
     expect(allResults, hasLength(1));
     {
       ResolvedUnitResult ar = allResults.firstWhere((r) => r.path == a);
-      _assertTopLevelVarType(ar.unit, 'A', 'int');
+      _assertTopLevelVarType(ar.unit!, 'A', 'int');
     }
     allResults.clear();
 
@@ -690,7 +690,7 @@
     expect(allResults, hasLength(1));
     {
       ResolvedUnitResult ar = allResults.firstWhere((r) => r.path == a);
-      _assertTopLevelVarType(ar.unit, 'A', 'double');
+      _assertTopLevelVarType(ar.unit!, 'A', 'double');
     }
   }
 
@@ -744,12 +744,12 @@
     expect(allResults, hasLength(2));
     {
       ResolvedUnitResult ar = allResults.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.firstWhere((r) => r.path == b);
-      _assertTopLevelVarType(br.unit, 'B1', 'int');
+      _assertTopLevelVarType(br.unit!, 'B1', 'int');
     }
 
     // Clear the results and update "a".
@@ -767,12 +767,12 @@
     expect(allResults, hasLength(2));
     {
       ResolvedUnitResult ar = allResults.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.firstWhere((r) => r.path == b);
-      _assertTopLevelVarType(br.unit, 'B1', 'double');
+      _assertTopLevelVarType(br.unit!, 'B1', 'double');
     }
   }
 
@@ -785,7 +785,7 @@
       expect(allResults, hasLength(1));
       ResolvedUnitResult result = allResults[0];
       expect(result.path, testFile);
-      _assertTopLevelVarType(result.unit, 'V', 'int');
+      _assertTopLevelVarType(result.unit!, 'V', 'int');
     }
 
     // Update the file, but don't notify the driver.
@@ -808,7 +808,7 @@
       expect(allResults, hasLength(1));
       ResolvedUnitResult result = allResults[0];
       expect(result.path, testFile);
-      _assertTopLevelVarType(result.unit, 'V', 'double');
+      _assertTopLevelVarType(result.unit!, 'V', 'double');
     }
   }
 
@@ -822,10 +822,10 @@
 @A(5)
 class C {}
 ''');
-    var result = await driver.getResult(testFile);
-    var atD = AstFinder.getClass(result.unit, 'C').metadata[0];
+    var result = (await driver.getResult(testFile))!;
+    var atD = AstFinder.getClass(result.unit!, 'C').metadata[0];
     var atDI = atD.elementAnnotation as ElementAnnotationImpl;
-    var value = atDI.evaluationResult.value;
+    var value = atDI.evaluationResult!.value;
     // That is illegal.
     expect(value, isNull);
   }
@@ -839,16 +839,15 @@
   final value;
 }
 ''');
-    var result = await driver.getResult(testFile);
-    var atD = AstFinder.getClass(result.unit, 'C').metadata[0];
+    var result = (await driver.getResult(testFile))!;
+    var atD = AstFinder.getClass(result.unit!, 'C').metadata[0];
     var atDI = atD.elementAnnotation as ElementAnnotationImpl;
-    var value = atDI.evaluationResult.value;
-    expect(value, isNotNull);
+    var value = atDI.evaluationResult!.value!;
     expect(value.type, isNotNull);
     assertType(value.type, 'D');
-    expect(value.fields.keys, ['value']);
-    expect(value.getField('value').toIntValue(), 1);
-    expect(atDI.evaluationResult.errors, isEmpty);
+    expect(value.fields!.keys, ['value']);
+    expect(value.getField('value')!.toIntValue(), 1);
+    expect(atDI.evaluationResult!.errors, isEmpty);
   }
 
   test_const_annotation_withoutArgs() async {
@@ -856,9 +855,9 @@
 const x = 1;
 @x class C {}
 ''');
-    var result = await driver.getResult(testFile);
-    Annotation at_x = AstFinder.getClass(result.unit, 'C').metadata[0];
-    expect(at_x.elementAnnotation.computeConstantValue().toIntValue(), 1);
+    var result = (await driver.getResult(testFile))!;
+    Annotation at_x = AstFinder.getClass(result.unit!, 'C').metadata[0];
+    expect(at_x.elementAnnotation!.computeConstantValue()!.toIntValue(), 1);
   }
 
   test_const_circular_reference() async {
@@ -866,10 +865,10 @@
 const x = y + 1;
 const y = x + 1;
 ''');
-    var result = await driver.getResult(testFile);
-    var x = AstFinder.getTopLevelVariableElement(result.unit, 'x')
+    var result = (await driver.getResult(testFile))!;
+    var x = AstFinder.getTopLevelVariableElement(result.unit!, 'x')
         as TopLevelVariableElementImpl;
-    _expectCircularityError(x.evaluationResult);
+    _expectCircularityError(x.evaluationResult!);
   }
 
   test_const_dependency_sameUnit() async {
@@ -877,11 +876,11 @@
 const x = y + 1;
 const y = 1;
 ''');
-    var result = await driver.getResult(testFile);
-    var x = AstFinder.getTopLevelVariableElement(result.unit, 'x');
-    var y = AstFinder.getTopLevelVariableElement(result.unit, 'y');
-    expect(x.computeConstantValue().toIntValue(), 2);
-    expect(y.computeConstantValue().toIntValue(), 1);
+    var result = (await driver.getResult(testFile))!;
+    var x = AstFinder.getTopLevelVariableElement(result.unit!, 'x');
+    var y = AstFinder.getTopLevelVariableElement(result.unit!, 'y');
+    expect(x.computeConstantValue()!.toIntValue(), 2);
+    expect(y.computeConstantValue()!.toIntValue(), 1);
   }
 
   test_const_externalConstFactory() async {
@@ -894,8 +893,8 @@
 
 class B {}
 ''');
-    var result = await driver.getResult(testFile);
-    var x = AstFinder.getTopLevelVariableElement(result.unit, 'x');
+    var result = (await driver.getResult(testFile))!;
+    var x = AstFinder.getTopLevelVariableElement(result.unit!, 'x');
     expect(x.computeConstantValue(), isNotNull);
   }
 
@@ -919,7 +918,7 @@
 const c = C.WARNING;
 const d = D.WARNING;
 ''');
-    ResolvedUnitResult result = await driver.getResult(b);
+    ResolvedUnitResult result = (await driver.getResult(b))!;
     expect(result.errors, isEmpty);
   }
 
@@ -948,7 +947,7 @@
   const C();
 }
 ''');
-    ResolvedUnitResult result = await driver.getResult(b);
+    ResolvedUnitResult result = (await driver.getResult(b))!;
     expect(result.errors, isEmpty);
   }
 
@@ -960,8 +959,8 @@
 }
 const x = const Derived();
 ''');
-    var result = await driver.getResult(testFile);
-    var x = AstFinder.getTopLevelVariableElement(result.unit, 'x');
+    var result = (await driver.getResult(testFile))!;
+    var x = AstFinder.getTopLevelVariableElement(result.unit!, 'x');
     expect(x.computeConstantValue(), isNotNull);
   }
 
@@ -969,23 +968,23 @@
     addTestFile('''
 const x = 1;
 ''');
-    var result = await driver.getResult(testFile);
-    var x = AstFinder.getTopLevelVariableElement(result.unit, 'x');
-    expect(x.computeConstantValue().toIntValue(), 1);
+    var result = (await driver.getResult(testFile))!;
+    var x = AstFinder.getTopLevelVariableElement(result.unit!, 'x');
+    expect(x.computeConstantValue()!.toIntValue(), 1);
   }
 
   test_currentSession() async {
     var a = convertPath('/a.dart');
 
     newFile(a, content: 'var V = 1;');
-    await driver.getResult(a);
+    (await driver.getResult(a))!;
 
     var session1 = driver.currentSession;
     expect(session1, isNotNull);
 
     modifyFile(a, 'var V = 2;');
     driver.changeFile(a);
-    await driver.getResult(a);
+    (await driver.getResult(a))!;
 
     var session2 = driver.currentSession;
     expect(session2, isNotNull);
@@ -1030,7 +1029,7 @@
     await driver.discoverAvailableFiles();
 
     void assertHasDartUri(String uri) {
-      var file = sdk.mapDartUri(uri).fullName;
+      var file = sdk.mapDartUri(uri)!.fullName;
       expect(driver.knownFiles, contains(file));
     }
 
@@ -1046,7 +1045,7 @@
 export 'foo.dart';
 ''');
 
-    ResolvedUnitResult result = await driver.getResult(testFile);
+    ResolvedUnitResult result = (await driver.getResult(testFile))!;
     List<AnalysisError> errors = result.errors;
     expect(errors, hasLength(1));
     expect(errors[0].errorCode, CompileTimeErrorCode.URI_DOES_NOT_EXIST);
@@ -1057,7 +1056,7 @@
 import 'foo.dart';
 ''');
 
-    ResolvedUnitResult result = await driver.getResult(testFile);
+    ResolvedUnitResult result = (await driver.getResult(testFile))!;
     List<AnalysisError> errors = result.errors;
     expect(errors, hasLength(1));
     expect(errors[0].errorCode, CompileTimeErrorCode.URI_DOES_NOT_EXIST);
@@ -1071,7 +1070,7 @@
 }
 ''', priority: true);
 
-    ResolvedUnitResult result = await driver.getResult(testFile);
+    ResolvedUnitResult result = (await driver.getResult(testFile))!;
     List<AnalysisError> errors = result.errors;
     expect(errors, hasLength(1));
     expect(errors[0].errorCode, CompileTimeErrorCode.URI_DOES_NOT_EXIST);
@@ -1083,7 +1082,7 @@
 part 'foo.dart';
 ''');
 
-    ResolvedUnitResult result = await driver.getResult(testFile);
+    ResolvedUnitResult result = (await driver.getResult(testFile))!;
     List<AnalysisError> errors = result.errors;
     expect(errors, hasLength(1));
     expect(errors[0].errorCode, CompileTimeErrorCode.URI_DOES_NOT_EXIST);
@@ -1149,7 +1148,7 @@
     expect(driver.getCachedResult(a), isNull);
 
     driver.priorityFiles = [a];
-    ResolvedUnitResult result = await driver.getResult(a);
+    ResolvedUnitResult result = (await driver.getResult(a))!;
 
     expect(driver.getCachedResult(a), same(result));
   }
@@ -1158,7 +1157,7 @@
     String content = 'int f() => 42 + bar();';
     addTestFile(content, priority: true);
 
-    ErrorsResult result = await driver.getErrors(testFile);
+    var result = (await driver.getErrors(testFile))!;
     expect(result.path, testFile);
     expect(result.uri.toString(), 'package:test/test.dart');
     expect(result.errors, hasLength(1));
@@ -1286,7 +1285,7 @@
 
     // Ensure that [a.dart] library cycle is loaded.
     // So, `a.dart` is in the library context.
-    await driver.getResult(a);
+    (await driver.getResult(a))!;
 
     // Update the file, changing its API signature.
     // Note that we don't call `changeFile`.
@@ -1300,14 +1299,14 @@
     expect(driver.getFileSync(a).lineInfo.lineCount, 1);
 
     // We have not read `a.dart`, so `A` is still not declared.
-    expect((await driver.getResult(b)).errors, isNotEmpty);
+    expect(((await driver.getResult(b))!).errors, isNotEmpty);
 
     // Notify the driver that the file was changed.
     driver.changeFile(a);
 
     // So, `class A {}` is declared now.
     expect(driver.getFileSync(a).lineInfo.lineCount, 2);
-    expect((await driver.getResult(b)).errors, isEmpty);
+    expect(((await driver.getResult(b))!).errors, isEmpty);
   }
 
   test_getFileSync_library() async {
@@ -1343,7 +1342,7 @@
 ''';
     addTestFile(content);
 
-    AnalysisDriverUnitIndex index = await driver.getIndex(testFile);
+    AnalysisDriverUnitIndex index = (await driver.getIndex(testFile))!;
 
     int unitId = index.strings.indexOf('package:test/test.dart');
     int fooId = index.strings.indexOf('foo');
@@ -1396,17 +1395,17 @@
     String content = 'int f() => 42;';
     addTestFile(content, priority: true);
 
-    ResolvedUnitResult result = await driver.getResult(testFile);
+    ResolvedUnitResult result = (await driver.getResult(testFile))!;
     expect(result.path, testFile);
     expect(result.uri.toString(), 'package:test/test.dart');
     expect(result.state, ResultState.VALID);
     expect(result.content, content);
-    expect(result.unit, isNotNull);
+    expect(result.unit!, isNotNull);
     expect(result.errors, hasLength(0));
 
-    var f = result.unit.declarations[0] as FunctionDeclaration;
-    assertType(f.declaredElement.type, 'int Function()');
-    assertType(f.returnType.type, 'int');
+    var f = result.unit!.declarations[0] as FunctionDeclaration;
+    assertType(f.declaredElement!.type, 'int Function()');
+    assertType(f.returnType!.type!, 'int');
 
     // The same result is also received through the stream.
     await waitForIdleWithoutExceptions();
@@ -1428,14 +1427,14 @@
     driver.addFile(b);
     await waitForIdleWithoutExceptions();
 
-    ResolvedUnitResult result = await driver.getResult(b);
+    ResolvedUnitResult result = (await driver.getResult(b))!;
     expect(result.errors, isEmpty);
   }
 
   test_getResult_doesNotExist() async {
     var a = convertPath('/test/lib/a.dart');
 
-    ResolvedUnitResult result = await driver.getResult(a);
+    ResolvedUnitResult result = (await driver.getResult(a))!;
     expect(result.path, a);
     expect(result.uri.toString(), 'package:test/a.dart');
     expect(result.state, ResultState.NOT_A_FILE);
@@ -1446,7 +1445,7 @@
     String content = 'main() { int vv; }';
     addTestFile(content, priority: true);
 
-    ResolvedUnitResult result = await driver.getResult(testFile);
+    ResolvedUnitResult result = (await driver.getResult(testFile))!;
     expect(result.path, testFile);
     expect(result.errors, hasLength(1));
     {
@@ -1469,7 +1468,7 @@
 class B {}
 ''');
 
-    ResolvedUnitResult result = await driver.getResult(testFile);
+    ResolvedUnitResult result = (await driver.getResult(testFile))!;
     expect(result.path, testFile);
   }
 
@@ -1481,7 +1480,7 @@
 ''';
     addTestFile(content, priority: true);
 
-    var result = await driver.getResult(testFile);
+    var result = (await driver.getResult(testFile))!;
     expect(result.errors, isEmpty);
   }
 
@@ -1500,7 +1499,7 @@
 
     // No errors in b.dart
     {
-      ResolvedUnitResult result = await driver.getResult(b);
+      ResolvedUnitResult result = (await driver.getResult(b))!;
       expect(result.errors, isEmpty);
     }
 
@@ -1510,7 +1509,7 @@
 
     // The unresolved URI error must be reported.
     {
-      ResolvedUnitResult result = await driver.getResult(b);
+      ResolvedUnitResult result = (await driver.getResult(b))!;
       expect(
           result.errors,
           contains(predicate((AnalysisError e) =>
@@ -1523,7 +1522,7 @@
 
     // No errors in b.dart again.
     {
-      ResolvedUnitResult result = await driver.getResult(b);
+      ResolvedUnitResult result = (await driver.getResult(b))!;
       expect(result.errors, isEmpty);
     }
   }
@@ -1536,8 +1535,8 @@
 ''', priority: true);
     await waitForIdleWithoutExceptions();
 
-    ResolvedUnitResult result = await driver.getResult(testFile);
-    _assertClassFieldType(result.unit, 'C', 'f', 'int');
+    ResolvedUnitResult result = (await driver.getResult(testFile))!;
+    _assertClassFieldType(result.unit!, 'C', 'f', 'int');
   }
 
   test_getResult_inferTypes_instanceMethod() async {
@@ -1551,9 +1550,9 @@
 ''', priority: true);
     await waitForIdleWithoutExceptions();
 
-    ResolvedUnitResult result = await driver.getResult(testFile);
-    _assertClassMethodReturnType(result.unit, 'A', 'm', 'int');
-    _assertClassMethodReturnType(result.unit, 'B', 'm', 'int');
+    ResolvedUnitResult result = (await driver.getResult(testFile))!;
+    _assertClassMethodReturnType(result.unit!, 'A', 'm', 'int');
+    _assertClassMethodReturnType(result.unit!, 'B', 'm', 'int');
   }
 
   test_getResult_invalid_annotation_functionAsConstructor() async {
@@ -1564,8 +1563,8 @@
 class C {}
 ''', priority: true);
 
-    ResolvedUnitResult result = await driver.getResult(testFile);
-    ClassDeclaration c = result.unit.declarations[1] as ClassDeclaration;
+    ResolvedUnitResult result = (await driver.getResult(testFile))!;
+    ClassDeclaration c = result.unit!.declarations[1] as ClassDeclaration;
     Annotation a = c.metadata[0];
     expect(a.name.name, 'fff');
     expect(a.name.staticElement, isFunctionElement);
@@ -1591,7 +1590,7 @@
 ''';
     addTestFile(content);
 
-    ResolvedUnitResult result = await driver.getResult(testFile);
+    ResolvedUnitResult result = (await driver.getResult(testFile))!;
     expect(result.path, testFile);
   }
 
@@ -1603,12 +1602,12 @@
 ''';
     addTestFile(content, priority: true);
 
-    ResolvedUnitResult result = await driver.getResult(testFile);
+    ResolvedUnitResult result = (await driver.getResult(testFile))!;
     expect(result.path, testFile);
     // Has only exports for valid URIs.
     List<ExportElement> imports = result.libraryElement.exports;
     expect(imports.map((import) {
-      return import.exportedLibrary?.source?.uri?.toString();
+      return import.exportedLibrary?.source.uri.toString();
     }), ['dart:async', null, 'dart:math']);
   }
 
@@ -1620,12 +1619,12 @@
 ''';
     addTestFile(content, priority: true);
 
-    ResolvedUnitResult result = await driver.getResult(testFile);
+    ResolvedUnitResult result = (await driver.getResult(testFile))!;
     expect(result.path, testFile);
     // Has only imports for valid URIs.
     List<ImportElement> imports = result.libraryElement.imports;
     expect(imports.map((import) {
-      return import.importedLibrary?.source?.uri?.toString();
+      return import.importedLibrary?.source.uri.toString();
     }), ['dart:async', null, 'dart:math', 'dart:core']);
   }
 
@@ -1641,7 +1640,7 @@
 part '';
 ''';
     addTestFile(content);
-    await driver.getResult(testFile);
+    (await driver.getResult(testFile))!;
   }
 
   test_getResult_languageVersion() async {
@@ -1651,8 +1650,8 @@
 class A{}
 ''');
 
-    var result = await driver.getResult(path);
-    var languageVersion = result.unit.languageVersionToken;
+    var result = (await driver.getResult(path))!;
+    var languageVersion = result.unit!.languageVersionToken!;
     expect(languageVersion.major, 2);
     expect(languageVersion.minor, 7);
   }
@@ -1688,7 +1687,7 @@
     // package:my_pkg/c.dart's import is erroneous, causing y's reference to z
     // to be unresolved (and therefore have type dynamic).
     {
-      ResolvedUnitResult result = await driver.getResult(a);
+      ResolvedUnitResult result = (await driver.getResult(a))!;
       expect(result.errors, isEmpty);
     }
 
@@ -1698,7 +1697,7 @@
     // successfully imports file:///my_pkg/test/d.dart, causing y to have an
     // inferred type of String.
     {
-      ResolvedUnitResult result = await driver.getResult(b);
+      ResolvedUnitResult result = (await driver.getResult(b))!;
       List<AnalysisError> errors = result.errors;
       expect(errors, hasLength(1));
       expect(errors[0].errorCode, CompileTimeErrorCode.INVALID_ASSIGNMENT);
@@ -1712,7 +1711,7 @@
 var V;
 ''';
     addTestFile(content);
-    await driver.getResult(testFile);
+    (await driver.getResult(testFile))!;
   }
 
   test_getResult_nameConflict_local_typeInference() async {
@@ -1726,7 +1725,7 @@
 }
 ''';
     addTestFile(content);
-    await driver.getResult(testFile);
+    (await driver.getResult(testFile))!;
   }
 
   test_getResult_notAbsolutePath() async {
@@ -1739,9 +1738,9 @@
     var path = convertPath('/test/lib/test.txt');
     newFile(path, content: 'class A {}');
 
-    ResolvedUnitResult result = await driver.getResult(path);
+    ResolvedUnitResult result = (await driver.getResult(path))!;
     expect(result, isNotNull);
-    expect(result.unit.declaredElement.types.map((e) => e.name), ['A']);
+    expect(result.unit!.declaredElement!.types.map((e) => e.name), ['A']);
   }
 
   test_getResult_recursiveFlatten() async {
@@ -1751,7 +1750,7 @@
 ''';
     addTestFile(content);
     // Should not throw exceptions.
-    await driver.getResult(testFile);
+    (await driver.getResult(testFile))!;
   }
 
   test_getResult_sameFile_twoUris() async {
@@ -1773,19 +1772,19 @@
     await waitForIdleWithoutExceptions();
 
     {
-      ResolvedUnitResult result = await driver.getResult(b);
-      expect(_getImportSource(result.unit, 0).uri.toString(),
+      ResolvedUnitResult result = (await driver.getResult(b))!;
+      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.getResult(c);
+      ResolvedUnitResult result = (await driver.getResult(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>');
     }
   }
 
@@ -1807,9 +1806,9 @@
     await waitForIdleWithoutExceptions();
 
     {
-      ResolvedUnitResult result = await driver.getResult(a);
-      _assertTopLevelVarType(result.unit, 'A1', 'int');
-      _assertTopLevelVarType(result.unit, 'A2', 'int');
+      ResolvedUnitResult result = (await driver.getResult(a))!;
+      _assertTopLevelVarType(result.unit!, 'A1', 'int');
+      _assertTopLevelVarType(result.unit!, 'A2', 'int');
     }
 
     // Update "a" so that "A1" is now "double".
@@ -1827,37 +1826,36 @@
     driver.changeFile(a);
 
     {
-      ResolvedUnitResult result = await driver.getResult(a);
-      _assertTopLevelVarType(result.unit, 'A1', 'double');
-      _assertTopLevelVarType(result.unit, 'A2', 'double');
+      ResolvedUnitResult result = (await driver.getResult(a))!;
+      _assertTopLevelVarType(result.unit!, 'A1', 'double');
+      _assertTopLevelVarType(result.unit!, 'A2', 'double');
     }
   }
 
   test_getResult_thenRemove() async {
     addTestFile('main() {}', priority: true);
 
-    Future<ResolvedUnitResult> resultFuture = driver.getResult(testFile);
+    var resultFuture = driver.getResult(testFile);
     driver.removeFile(testFile);
 
-    ResolvedUnitResult result = await resultFuture;
-    expect(result, isNotNull);
+    var result = (await resultFuture)!;
     expect(result.path, testFile);
-    expect(result.unit, isNotNull);
+    expect(result.unit!, isNotNull);
   }
 
   test_getResult_twoPendingFutures() async {
     String content = 'main() {}';
     addTestFile(content, priority: true);
 
-    Future<ResolvedUnitResult> future1 = driver.getResult(testFile);
-    Future<ResolvedUnitResult> future2 = driver.getResult(testFile);
+    var future1 = driver.getResult(testFile);
+    var future2 = driver.getResult(testFile);
 
     // Both futures complete, with the same result.
-    ResolvedUnitResult result1 = await future1;
-    ResolvedUnitResult result2 = await future2;
+    ResolvedUnitResult result1 = (await future1)!;
+    ResolvedUnitResult result2 = (await future2)!;
     expect(result2, same(result1));
     expect(result1.path, testFile);
-    expect(result1.unit, isNotNull);
+    expect(result1.unit!, isNotNull);
   }
 
   test_getSourceKind_changedFile() async {
@@ -1873,7 +1871,7 @@
 
     // Ensure that [a.dart] library cycle is loaded.
     // So, `a.dart` is in the library context.
-    await driver.getResult(a);
+    (await driver.getResult(a))!;
 
     // Update the file, changing its API signature.
     // Note that we don't call `changeFile`.
@@ -1887,14 +1885,14 @@
     expect(await driver.getSourceKind(a), SourceKind.PART);
 
     // We have not read `a.dart`, so `A` is still not declared.
-    expect((await driver.getResult(b)).errors, isNotEmpty);
+    expect(((await driver.getResult(b))!).errors, isNotEmpty);
 
     // Notify the driver that the file was changed.
     driver.changeFile(a);
 
     // So, `class A {}` is declared now.
     expect(await driver.getSourceKind(a), SourceKind.LIBRARY);
-    expect((await driver.getResult(b)).errors, isEmpty);
+    expect(((await driver.getResult(b))!).errors, isEmpty);
   }
 
   test_getSourceKind_changeFile() async {
@@ -1948,8 +1946,7 @@
 ''';
     addTestFile(content);
 
-    UnitElementResult unitResult = await driver.getUnitElement(testFile);
-    expect(unitResult, isNotNull);
+    UnitElementResult unitResult = (await driver.getUnitElement(testFile))!;
     CompilationUnitElement unitElement = unitResult.element;
     expect(unitElement.source.fullName, testFile);
     expect(unitElement.functions.map((c) => c.name),
@@ -1977,8 +1974,7 @@
   test_getUnitElement_notDart() async {
     var path = convertPath('/test.txt');
     newFile(path, content: 'class A {}');
-    UnitElementResult unitResult = await driver.getUnitElement(path);
-    expect(unitResult, isNotNull);
+    UnitElementResult unitResult = (await driver.getUnitElement(path))!;
     expect(unitResult.element.types.map((e) => e.name), ['A']);
   }
 
@@ -1990,7 +1986,7 @@
     String signature = await driver.getUnitElementSignature(a);
     expect(signature, isNotNull);
 
-    UnitElementResult unitResult = await driver.getUnitElement(a);
+    UnitElementResult unitResult = (await driver.getUnitElement(a))!;
     expect(unitResult.path, a);
     expect(unitResult.signature, signature);
 
@@ -2015,7 +2011,7 @@
     expect(driver.hasFilesToAnalyze, isFalse);
 
     // Ask to analyze the file, so there is a file to analyze.
-    Future<ResolvedUnitResult> future = driver.getResult(testFile);
+    var future = driver.getResult(testFile);
     expect(driver.hasFilesToAnalyze, isTrue);
 
     // Once analysis is done, there is nothing to analyze.
@@ -2052,7 +2048,7 @@
     driver.addFile(a);
     driver.addFile(b);
 
-    await driver.getResult(b);
+    (await driver.getResult(b))!;
 
     // Modify the library, but don't notify the driver.
     // The driver should use the previous library content and elements.
@@ -2064,9 +2060,9 @@
 }
 ''');
 
-    var result = await driver.getResult(b);
-    var c = _getTopLevelVar(result.unit, 'c');
-    var typeC = c.declaredElement.type as InterfaceType;
+    var result = (await driver.getResult(b))!;
+    var c = _getTopLevelVar(result.unit!, 'c');
+    var typeC = c.declaredElement!.type as InterfaceType;
     // The class C has an old field 'foo', not the new 'bar'.
     expect(typeC.element.getField('foo'), isNotNull);
     expect(typeC.element.getField('bar'), isNull);
@@ -2086,9 +2082,9 @@
     driver.addFile(a);
     driver.addFile(b);
 
-    ResolvedUnitResult result = await driver.getResult(a);
+    ResolvedUnitResult result = (await driver.getResult(a))!;
     expect(result.errors, isEmpty);
-    _assertTopLevelVarType(result.unit, 'b', 'B');
+    _assertTopLevelVarType(result.unit!, 'b', 'B');
   }
 
   test_importOfNonLibrary_part_afterLibrary() async {
@@ -2111,10 +2107,10 @@
 ''');
 
     // This ensures that `a.dart` linked library is cached.
-    await driver.getResult(a);
+    (await driver.getResult(a))!;
 
     // Should not fail because of considering `b.dart` part as `a.dart` library.
-    await driver.getResult(c);
+    (await driver.getResult(c))!;
   }
 
   test_instantiateToBounds_invalid() async {
@@ -2213,11 +2209,11 @@
   }
 
   test_missingDartLibrary_async() async {
-    var asyncPath = sdk.mapDartUri('dart:async').fullName;
+    var asyncPath = sdk.mapDartUri('dart:async')!.fullName;
     getFile(asyncPath).delete();
     addTestFile('class C {}');
 
-    ErrorsResult result = await driver.getErrors(testFile);
+    ErrorsResult result = (await driver.getErrors(testFile))!;
     expect(result.errors, hasLength(1));
 
     AnalysisError error = result.errors[0];
@@ -2225,11 +2221,11 @@
   }
 
   test_missingDartLibrary_core() async {
-    var corePath = sdk.mapDartUri('dart:core').fullName;
+    var corePath = sdk.mapDartUri('dart:core')!.fullName;
     getFile(corePath).delete();
     addTestFile('class C {}');
 
-    ErrorsResult result = await driver.getErrors(testFile);
+    ErrorsResult result = (await driver.getErrors(testFile))!;
     expect(result.errors, hasLength(1));
 
     AnalysisError error = result.errors[0];
@@ -2249,7 +2245,7 @@
 
     // Ensure that [a.dart] library cycle is loaded.
     // So, `a.dart` is in the library context.
-    await driver.getResult(a);
+    (await driver.getResult(a))!;
 
     // Update the file, changing its API signature.
     // Note that we don't call `changeFile`.
@@ -2267,7 +2263,7 @@
 
     // We have not read `a.dart`, so `A` is still not declared.
     {
-      var bResult = await driver.getResult(b);
+      var bResult = (await driver.getResult(b))!;
       expect(bResult.errors, isNotEmpty);
     }
 
@@ -2280,7 +2276,7 @@
       expect(parseResult.unit.declarations, hasLength(1));
     }
     {
-      var bResult = await driver.getResult(b);
+      var bResult = (await driver.getResult(b))!;
       expect(bResult.errors, isEmpty);
     }
   }
@@ -2313,7 +2309,7 @@
 
     // Ensure that [a.dart] library cycle is loaded.
     // So, `a.dart` is in the library context.
-    await driver.getResult(a);
+    (await driver.getResult(a))!;
 
     // Update the file, changing its API signature.
     // Note that we don't call `changeFile`.
@@ -2331,7 +2327,7 @@
 
     // We have not read `a.dart`, so `A` is still not declared.
     {
-      var bResult = await driver.getResult(b);
+      var bResult = (await driver.getResult(b))!;
       expect(bResult.errors, isNotEmpty);
     }
 
@@ -2344,7 +2340,7 @@
       expect(parseResult.unit.declarations, hasLength(1));
     }
     {
-      var bResult = await driver.getResult(b);
+      var bResult = (await driver.getResult(b))!;
       expect(bResult.errors, isEmpty);
     }
   }
@@ -2401,7 +2397,7 @@
 ''');
 
     var parseResult = driver.parseFileSync(path);
-    var languageVersion = parseResult.unit.languageVersionToken;
+    var languageVersion = parseResult.unit.languageVersionToken!;
     expect(languageVersion.major, 2);
     expect(languageVersion.minor, 7);
   }
@@ -2457,13 +2453,13 @@
 
     // Process a.dart so that we know that it's a library for c.dart later.
     {
-      ErrorsResult result = await driver.getErrors(a);
+      ErrorsResult result = (await driver.getErrors(a))!;
       expect(result.errors, isEmpty);
     }
 
     // c.dart does not have errors in the context of a.dart
     {
-      ErrorsResult result = await driver.getErrors(c);
+      ErrorsResult result = (await driver.getErrors(c))!;
       expect(result.errors, isEmpty);
     }
   }
@@ -2493,7 +2489,7 @@
 
     // c.dart is resolve in the context of a.dart, so have no errors
     {
-      ErrorsResult result = await driver.getErrors(c);
+      ErrorsResult result = (await driver.getErrors(c))!;
       expect(result.errors, isEmpty);
     }
   }
@@ -2523,17 +2519,17 @@
 
     // Process a.dart so that we know that it's a library for c.dart later.
     {
-      ResolvedUnitResult result = await driver.getResult(a);
+      ResolvedUnitResult result = (await driver.getResult(a))!;
       expect(result.errors, isEmpty);
-      _assertTopLevelVarType(result.unit, 'c', 'C');
+      _assertTopLevelVarType(result.unit!, 'c', 'C');
     }
 
     // Now c.dart can be resolved without errors in the context of a.dart
     {
-      ResolvedUnitResult result = await driver.getResult(c);
+      ResolvedUnitResult result = (await driver.getResult(c))!;
       expect(result.errors, isEmpty);
-      _assertTopLevelVarType(result.unit, 'a', 'A');
-      _assertTopLevelVarType(result.unit, 'b', 'B');
+      _assertTopLevelVarType(result.unit!, 'a', 'A');
+      _assertTopLevelVarType(result.unit!, 'b', 'B');
     }
   }
 
@@ -2562,10 +2558,10 @@
 
     // b.dart will be analyzed after a.dart is analyzed.
     // So, A and B references are resolved.
-    ResolvedUnitResult result = await driver.getResult(c);
+    ResolvedUnitResult result = (await driver.getResult(c))!;
     expect(result.errors, isEmpty);
-    _assertTopLevelVarType(result.unit, 'a', 'A');
-    _assertTopLevelVarType(result.unit, 'b', 'B');
+    _assertTopLevelVarType(result.unit!, 'a', 'A');
+    _assertTopLevelVarType(result.unit!, 'b', 'B');
   }
 
   test_part_getResult_changePart_invalidatesLibraryCycle() async {
@@ -2578,7 +2574,7 @@
     driver.addFile(a);
 
     // Analyze the library without the part.
-    await driver.getResult(a);
+    (await driver.getResult(a))!;
 
     // Create the part file.
     // This should invalidate library file state (specifically the library
@@ -2590,7 +2586,7 @@
     driver.changeFile(b);
 
     // This should not crash.
-    var result = await driver.getResult(b);
+    var result = (await driver.getResult(b))!;
     expect(result.errors, isEmpty);
   }
 
@@ -2607,9 +2603,9 @@
 
     // There is no library which c.dart is a part of, so it has unresolved
     // A and B references.
-    ResolvedUnitResult result = await driver.getResult(c);
+    ResolvedUnitResult result = (await driver.getResult(c))!;
     expect(result.errors, isNotEmpty);
-    expect(result.unit, isNotNull);
+    expect(result.unit!, isNotNull);
   }
 
   test_part_getUnitElement_afterLibrary() async {
@@ -2636,11 +2632,11 @@
     driver.addFile(c);
 
     // Process a.dart so that we know that it's a library for c.dart later.
-    await driver.getResult(a);
+    (await driver.getResult(a))!;
 
     // c.dart is resolve in the context of a.dart, knows 'A' and 'B'.
     {
-      UnitElementResult result = await driver.getUnitElement(c);
+      UnitElementResult result = (await driver.getUnitElement(c))!;
       var partUnit = result.element;
 
       assertType(partUnit.topLevelVariables[0].type, 'A');
@@ -2676,7 +2672,7 @@
 
     // c.dart is resolve in the context of a.dart, knows 'A' and 'B'.
     {
-      UnitElementResult result = await driver.getUnitElement(c);
+      UnitElementResult result = (await driver.getUnitElement(c))!;
       var partUnit = result.element;
 
       assertType(partUnit.topLevelVariables[0].type, 'A');
@@ -2700,7 +2696,7 @@
     // We don't know the library of c.dart, but we should get a result.
     // The types "A" and "B" are unresolved.
     {
-      UnitElementResult result = await driver.getUnitElement(c);
+      UnitElementResult result = (await driver.getUnitElement(c))!;
       var partUnit = result.element;
 
       expect(partUnit.topLevelVariables[0].name, 'a');
@@ -2738,7 +2734,7 @@
     String signatureBefore = await driver.getUnitElementSignature(c);
 
     // Process a.dart so that we know that it's a library for c.dart later.
-    await driver.getResult(a);
+    (await driver.getResult(a))!;
 
     // The before and after signatures must be the same.
     String signatureAfter = await driver.getUnitElementSignature(c);
@@ -2881,7 +2877,7 @@
     // analyze the delayed parts.
     ResolvedUnitResult result = allResults.lastWhere((r) => r.path == c);
     expect(result.errors, isEmpty);
-    expect(result.unit, isNotNull);
+    expect(result.unit!, isNotNull);
   }
 
   test_removeFile_changeFile_implicitlyAnalyzed() async {
@@ -2902,11 +2898,11 @@
     expect(allResults, hasLength(2));
     {
       ResolvedUnitResult ar = allResults.firstWhere((r) => r.path == a);
-      _assertTopLevelVarType(ar.unit, 'A', 'int');
+      _assertTopLevelVarType(ar.unit!, 'A', 'int');
     }
     {
       ResolvedUnitResult br = allResults.firstWhere((r) => r.path == b);
-      _assertTopLevelVarType(br.unit, 'B', 'int');
+      _assertTopLevelVarType(br.unit!, 'B', 'int');
     }
     allResults.clear();
 
@@ -2922,7 +2918,7 @@
     expect(allResults, hasLength(1));
     {
       ResolvedUnitResult ar = allResults.firstWhere((r) => r.path == a);
-      _assertTopLevelVarType(ar.unit, 'A', 'double');
+      _assertTopLevelVarType(ar.unit!, 'A', 'double');
     }
   }
 
@@ -3067,7 +3063,7 @@
     driver.changeFile(b);
     await waitForIdleWithoutExceptions();
 
-    List<String> analyzedPaths = allResults.map((r) => r.path).toList();
+    List<String> analyzedPaths = allResults.map((r) => r.path!).toList();
 
     // The changed file must be the first.
     expect(analyzedPaths[0], b);
@@ -3109,7 +3105,7 @@
     driver.changeFile(a);
     await waitForIdleWithoutExceptions();
 
-    List<String> analyzedPaths = allResults.map((r) => r.path).toList();
+    List<String> analyzedPaths = allResults.map((r) => r.path!).toList();
 
     // The changed files must be the first.
     expect(analyzedPaths[0], a);
@@ -3131,12 +3127,12 @@
     expect(result.path, testFile);
     expect(result.uri.toString(), 'package:test/test.dart');
     expect(result.content, content);
-    expect(result.unit, isNotNull);
+    expect(result.unit!, isNotNull);
     expect(result.errors, hasLength(0));
 
-    var f = result.unit.declarations[0] as FunctionDeclaration;
-    assertType(f.declaredElement.type, 'int Function()');
-    assertType(f.returnType.type, 'int');
+    var f = result.unit!.declarations[0] as FunctionDeclaration;
+    assertType(f.declaredElement!.type, 'int Function()');
+    assertType(f.returnType!.type!, 'int');
   }
 
   test_results_priorityFirst() async {
@@ -3156,7 +3152,7 @@
     expect(allResults, hasLength(3));
     ResolvedUnitResult result = allResults[0];
     expect(result.path, b);
-    expect(result.unit, isNotNull);
+    expect(result.unit!, isNotNull);
     expect(result.errors, hasLength(0));
   }
 
@@ -3259,21 +3255,21 @@
   void _assertClassFieldType(CompilationUnit unit, String className,
       String fieldName, String expected) {
     var node = _getClassField(unit, className, fieldName);
-    var type = node.declaredElement.type;
+    var type = node.declaredElement!.type;
     assertType(type, expected);
   }
 
   void _assertClassMethodReturnType(CompilationUnit unit, String className,
       String fieldName, String expected) {
     var node = _getClassMethod(unit, className, fieldName);
-    var type = node.declaredElement.returnType;
+    var type = node.declaredElement!.returnType;
     assertType(type, expected);
   }
 
   void _assertTopLevelVarType(
       CompilationUnit unit, String name, String expected) {
     VariableDeclaration variable = _getTopLevelVar(unit, name);
-    assertType(variable.declaredElement.type, expected);
+    assertType(variable.declaredElement!.type, expected);
   }
 
   void _expectCircularityError(EvaluationResultImpl evaluationResult) {
@@ -3325,11 +3321,11 @@
 
   ImportElement _getImportElement(CompilationUnit unit, int directiveIndex) {
     var import = unit.directives[directiveIndex] as ImportDirective;
-    return import.element;
+    return import.element!;
   }
 
   Source _getImportSource(CompilationUnit unit, int directiveIndex) {
-    return _getImportElement(unit, directiveIndex).importedLibrary.source;
+    return _getImportElement(unit, directiveIndex).importedLibrary!.source;
   }
 
   VariableDeclaration _getTopLevelVar(CompilationUnit unit, String name) {
diff --git a/pkg/analyzer/test/src/dart/analysis/experiments_test.dart b/pkg/analyzer/test/src/dart/analysis/experiments_test.dart
index 422cce7..573bc1b 100644
--- a/pkg/analyzer/test/src/dart/analysis/experiments_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/experiments_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/analysis/experiments_impl.dart';
-import 'package:meta/meta.dart';
 import 'package:pub_semver/pub_semver.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -37,8 +36,8 @@
   }
 
   ExperimentStatus fromStrings2({
-    @required Version sdkLanguageVersion,
-    @required List<String> flags,
+    required Version sdkLanguageVersion,
+    required List<String> flags,
   }) {
     return overrideKnownFeatures(knownFeatures, () {
       return ExperimentStatus.fromStrings2(
@@ -375,12 +374,14 @@
       expect(getFlags(status), [true, true, true]);
 
       // Restricting to the SDK version does not change anything.
-      var status2 = status.restrictToVersion(Version.parse('1.5.0'));
+      var status2 =
+          status.restrictToVersion(Version.parse('1.5.0')) as ExperimentStatus;
       assertSdkLanguageVersion(status2, '1.5');
       expect(getFlags(status2), [true, true, true]);
 
       // Restricting to the previous version disables the experiments.
-      var status3 = status.restrictToVersion(Version.parse('1.4.0'));
+      var status3 =
+          status.restrictToVersion(Version.parse('1.4.0')) as ExperimentStatus;
       assertSdkLanguageVersion(status3, '1.5');
       expect(getFlags(status3), [true, false, false]);
     });
@@ -432,12 +433,14 @@
       expect(getFlags(status), [true, true, true, true]);
 
       // Restricting to the SDK version does not change anything.
-      var status2 = status.restrictToVersion(Version.parse('1.5.0'));
+      var status2 =
+          status.restrictToVersion(Version.parse('1.5.0')) as ExperimentStatus;
       assertSdkLanguageVersion(status2, '1.5');
       expect(getFlags(status2), [true, true, true, true]);
 
       // Restricting to a version disables some experiments.
-      var status3 = status.restrictToVersion(Version.parse('1.4.0'));
+      var status3 =
+          status.restrictToVersion(Version.parse('1.4.0')) as ExperimentStatus;
       assertSdkLanguageVersion(status3, '1.5');
       expect(getFlags(status3), [true, true, false, false]);
     });
diff --git a/pkg/analyzer/test/src/dart/analysis/feature_set_provider_test.dart b/pkg/analyzer/test/src/dart/analysis/feature_set_provider_test.dart
index 441fe5b..0a48c66 100644
--- a/pkg/analyzer/test/src/dart/analysis/feature_set_provider_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/feature_set_provider_test.dart
@@ -14,7 +14,6 @@
 import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
-import 'package:meta/meta.dart';
 import 'package:pub_semver/pub_semver.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -27,9 +26,9 @@
 
 @reflectiveTest
 class FeatureSetProviderTest with ResourceProviderMixin {
-  MockSdk mockSdk;
-  SourceFactory sourceFactory;
-  FeatureSetProvider provider;
+  late final MockSdk mockSdk;
+  late SourceFactory sourceFactory;
+  late FeatureSetProvider provider;
 
   void setUp() {
     newFile('/test/lib/test.dart', content: '');
@@ -264,9 +263,9 @@
     );
 
     void check({
-      @required String uriStr,
-      @required String posixPath,
-      @required Version expected,
+      required String uriStr,
+      required String posixPath,
+      required Version expected,
     }) {
       var uri = Uri.parse(uriStr);
       var path = convertPath(posixPath);
@@ -426,7 +425,7 @@
     return PackageMapUriResolver(resourceProvider, map);
   }
 
-  void _createSourceFactory({UriResolver packageUriResolver}) {
+  void _createSourceFactory({UriResolver? packageUriResolver}) {
     var resolvers = <UriResolver>[];
     if (packageUriResolver != null) {
       resolvers.add(packageUriResolver);
@@ -441,14 +440,14 @@
   FeatureSet _getPathFeatureSet(String path) {
     path = convertPath(path);
     var fileUri = toUri(path);
-    var fileSource = sourceFactory.forUri2(fileUri);
-    var uri = sourceFactory.restoreUri(fileSource);
+    var fileSource = sourceFactory.forUri2(fileUri)!;
+    var uri = sourceFactory.restoreUri(fileSource)!;
     return provider.getFeatureSet(path, uri);
   }
 
   FeatureSet _getSdkFeatureSet(String uriStr) {
     var uri = Uri.parse(uriStr);
-    var path = sourceFactory.forUri2(uri).fullName;
+    var path = sourceFactory.forUri2(uri)!.fullName;
     return provider.getFeatureSet(path, uri);
   }
 
diff --git a/pkg/analyzer/test/src/dart/analysis/file_byte_store_test.dart b/pkg/analyzer/test/src/dart/analysis/file_byte_store_test.dart
index af1072d..c767dce 100644
--- a/pkg/analyzer/test/src/dart/analysis/file_byte_store_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/file_byte_store_test.dart
@@ -18,13 +18,13 @@
 
   test_get_bad_notEnoughBytes() {
     List<int> bytes = <int>[1, 2, 3];
-    List<int> data = validator.getData(bytes);
+    var data = validator.getData(bytes);
     expect(data, isNull);
   }
 
   test_get_bad_notEnoughBytes_zero() {
     List<int> bytes = <int>[];
-    List<int> data = validator.getData(bytes);
+    var data = validator.getData(bytes);
     expect(data, isNull);
   }
 
@@ -36,20 +36,20 @@
     expect(bytes[bytes.length - 1], isNot(42));
     bytes[bytes.length - 1] = 42;
 
-    List<int> data2 = validator.getData(bytes);
+    var data2 = validator.getData(bytes);
     expect(data2, isNull);
   }
 
   test_get_bad_wrongVersion() {
     List<int> bytes = <int>[0xBA, 0xDA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00];
-    List<int> data = validator.getData(bytes);
+    var data = validator.getData(bytes);
     expect(data, isNull);
   }
 
   test_get_good() {
     List<int> data = <int>[1, 2, 3];
     List<int> bytes = validator.wrapData(data);
-    List<int> data2 = validator.getData(bytes);
+    var data2 = validator.getData(bytes);
     expect(data2, hasLength(3));
     expect(data2, data);
   }
@@ -57,7 +57,7 @@
   test_get_good_zeroBytesData() {
     List<int> data = <int>[];
     List<int> bytes = validator.wrapData(data);
-    List<int> data2 = validator.getData(bytes);
+    var data2 = validator.getData(bytes);
     expect(data2, hasLength(0));
     expect(data2, data);
   }
diff --git a/pkg/analyzer/test/src/dart/analysis/file_state_test.dart b/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
index 56774cd..13f4be9 100644
--- a/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
@@ -36,7 +36,7 @@
 
 @reflectiveTest
 class FileSystemStateTest with ResourceProviderMixin {
-  MockSdk sdk;
+  late final MockSdk sdk;
 
   final ByteStore byteStore = MemoryByteStore();
   final FileContentOverlay contentOverlay = FileContentOverlay();
@@ -44,10 +44,10 @@
   final StringBuffer logBuffer = StringBuffer();
   final _GeneratedUriResolverMock generatedUriResolver =
       _GeneratedUriResolverMock();
-  SourceFactory sourceFactory;
-  PerformanceLog logger;
+  late final SourceFactory sourceFactory;
+  late final PerformanceLog logger;
 
-  FileSystemState fileSystemState;
+  late final FileSystemState fileSystemState;
 
   void setUp() {
     logger = PerformanceLog(logBuffer);
@@ -194,21 +194,21 @@
     FileState file = fileSystemState.getFileForPath(a);
 
     expect(_excludeSdk(file.importedFiles), hasLength(2));
-    expect(file.importedFiles[0].path, a1);
-    expect(file.importedFiles[0].uri, Uri.parse('package:aaa/a1.dart'));
-    expect(file.importedFiles[0].source, isNotNull);
+    expect(file.importedFiles[0]!.path, a1);
+    expect(file.importedFiles[0]!.uri, Uri.parse('package:aaa/a1.dart'));
+    expect(file.importedFiles[0]!.source, isNotNull);
     _assertIsUnresolvedFile(file.importedFiles[1]);
 
     expect(_excludeSdk(file.exportedFiles), hasLength(2));
-    expect(file.exportedFiles[0].path, a2);
-    expect(file.exportedFiles[0].uri, Uri.parse('package:aaa/a2.dart'));
-    expect(file.exportedFiles[0].source, isNotNull);
+    expect(file.exportedFiles[0]!.path, a2);
+    expect(file.exportedFiles[0]!.uri, Uri.parse('package:aaa/a2.dart'));
+    expect(file.exportedFiles[0]!.source, isNotNull);
     _assertIsUnresolvedFile(file.exportedFiles[1]);
 
     expect(_excludeSdk(file.partedFiles), hasLength(2));
-    expect(file.partedFiles[0].path, a3);
-    expect(file.partedFiles[0].uri, Uri.parse('package:aaa/a3.dart'));
-    expect(file.partedFiles[0].source, isNotNull);
+    expect(file.partedFiles[0]!.path, a3);
+    expect(file.partedFiles[0]!.uri, Uri.parse('package:aaa/a3.dart'));
+    expect(file.partedFiles[0]!.source, isNotNull);
     _assertIsUnresolvedFile(file.partedFiles[1]);
   }
 
@@ -240,24 +240,24 @@
     expect(file.unlinked2, isNotNull);
 
     expect(_excludeSdk(file.importedFiles), hasLength(2));
-    expect(file.importedFiles[0].path, a2);
-    expect(file.importedFiles[0].uri, Uri.parse('package:aaa/a2.dart'));
-    expect(file.importedFiles[0].source, isNotNull);
-    expect(file.importedFiles[1].path, b1);
-    expect(file.importedFiles[1].uri, Uri.parse('package:bbb/b1.dart'));
-    expect(file.importedFiles[1].source, isNotNull);
+    expect(file.importedFiles[0]!.path, a2);
+    expect(file.importedFiles[0]!.uri, Uri.parse('package:aaa/a2.dart'));
+    expect(file.importedFiles[0]!.source, isNotNull);
+    expect(file.importedFiles[1]!.path, b1);
+    expect(file.importedFiles[1]!.uri, Uri.parse('package:bbb/b1.dart'));
+    expect(file.importedFiles[1]!.source, isNotNull);
 
     expect(file.exportedFiles, hasLength(2));
-    expect(file.exportedFiles[0].path, b2);
-    expect(file.exportedFiles[0].uri, Uri.parse('package:bbb/b2.dart'));
-    expect(file.exportedFiles[0].source, isNotNull);
-    expect(file.exportedFiles[1].path, a3);
-    expect(file.exportedFiles[1].uri, Uri.parse('package:aaa/a3.dart'));
-    expect(file.exportedFiles[1].source, isNotNull);
+    expect(file.exportedFiles[0]!.path, b2);
+    expect(file.exportedFiles[0]!.uri, Uri.parse('package:bbb/b2.dart'));
+    expect(file.exportedFiles[0]!.source, isNotNull);
+    expect(file.exportedFiles[1]!.path, a3);
+    expect(file.exportedFiles[1]!.uri, Uri.parse('package:aaa/a3.dart'));
+    expect(file.exportedFiles[1]!.source, isNotNull);
 
     expect(file.partedFiles, hasLength(1));
-    expect(file.partedFiles[0].path, a4);
-    expect(file.partedFiles[0].uri, Uri.parse('package:aaa/a4.dart'));
+    expect(file.partedFiles[0]!.path, a4);
+    expect(file.partedFiles[0]!.uri, Uri.parse('package:aaa/a4.dart'));
 
     expect(file.libraryFiles, [file, file.partedFiles[0]]);
 
@@ -283,9 +283,9 @@
 part 'not_dart.txt';
 ''');
     FileState file = fileSystemState.getFileForPath(a);
-    expect(_excludeSdk(file.importedFiles).map((f) => f.path), [b, not_dart]);
-    expect(file.exportedFiles.map((f) => f.path), [c, not_dart]);
-    expect(file.partedFiles.map((f) => f.path), [d, not_dart]);
+    expect(_excludeSdk(file.importedFiles).map((f) => f!.path), [b, not_dart]);
+    expect(file.exportedFiles.map((f) => f!.path), [c, not_dart]);
+    expect(file.partedFiles.map((f) => f!.path), [d, not_dart]);
     expect(_excludeSdk(fileSystemState.knownFilePaths),
         unorderedEquals([a, b, c, d, not_dart]));
   }
@@ -357,8 +357,8 @@
     var fileUri = toUri(path);
 
     // The files with `package:` and `file:` URIs are different.
-    FileState filePackageUri = fileSystemState.getFileForUri(packageUri);
-    FileState fileFileUri = fileSystemState.getFileForUri(fileUri);
+    FileState filePackageUri = fileSystemState.getFileForUri(packageUri)!;
+    FileState fileFileUri = fileSystemState.getFileForUri(fileUri)!;
     expect(filePackageUri, isNot(same(fileFileUri)));
 
     expect(filePackageUri.path, path);
@@ -665,7 +665,7 @@
     expect(_excludeSdk(actual), unorderedEquals(expected));
   }
 
-  void _assertIsUnresolvedFile(FileState file) {
+  void _assertIsUnresolvedFile(FileState? file) {
     expect(file, isNull);
   }
 
@@ -682,11 +682,11 @@
   }
 
   List<T> _excludeSdk<T>(Iterable<T> files) {
-    return files.where((Object file) {
+    return files.where((file) {
       if (file is LibraryCycle) {
         return !file.libraries.any((file) => file.uri.isScheme('dart'));
       } else if (file is FileState) {
-        return file.uri?.scheme != 'dart';
+        return file.uri.scheme != 'dart';
       } else if (file == null) {
         return true;
       } else {
@@ -701,9 +701,9 @@
 }
 
 class _GeneratedUriResolverMock implements UriResolver {
-  Source Function(Uri, Uri) resolveAbsoluteFunction;
+  Source? Function(Uri, Uri?)? resolveAbsoluteFunction;
 
-  Uri Function(Source) restoreAbsoluteFunction;
+  Uri? Function(Source)? restoreAbsoluteFunction;
 
   @override
   noSuchMethod(Invocation invocation) {
@@ -711,17 +711,17 @@
   }
 
   @override
-  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
+  Source? resolveAbsolute(Uri uri, [Uri? actualUri]) {
     if (resolveAbsoluteFunction != null) {
-      return resolveAbsoluteFunction(uri, actualUri);
+      return resolveAbsoluteFunction!(uri, actualUri);
     }
     return null;
   }
 
   @override
-  Uri restoreAbsolute(Source source) {
+  Uri? restoreAbsolute(Source source) {
     if (restoreAbsoluteFunction != null) {
-      return restoreAbsoluteFunction(source);
+      return restoreAbsoluteFunction!(source);
     }
     return null;
   }
diff --git a/pkg/analyzer/test/src/dart/analysis/index_test.dart b/pkg/analyzer/test/src/dart/analysis/index_test.dart
index 3ba7ab9..808c5fb 100644
--- a/pkg/analyzer/test/src/dart/analysis/index_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/index_test.dart
@@ -124,7 +124,7 @@
 class A {}
 ''');
     ClassElement elementA = findElement.class_('A');
-    ClassElement elementObject = elementA.supertype.element;
+    ClassElement elementObject = elementA.supertype!.element;
     assertThat(elementObject).isExtendedAt('A {}', true, length: 0);
   }
 
@@ -264,7 +264,7 @@
   math.loadLibrary(); // 2
 }
 ''');
-    LibraryElement mathLib = findElement.import('dart:math').importedLibrary;
+    LibraryElement mathLib = findElement.import('dart:math').importedLibrary!;
     FunctionElement element = mathLib.loadLibraryFunction;
     assertThat(element).isInvokedAt('loadLibrary(); // 1', true);
     assertThat(element).isInvokedAt('loadLibrary(); // 2', true);
@@ -330,11 +330,11 @@
 ''');
 
     var intMethod = findNode.methodDeclaration('foo() {} // int');
-    assertThat(intMethod.declaredElement)
+    assertThat(intMethod.declaredElement!)
       ..isInvokedAt('foo(); // int ref', true);
 
     var doubleMethod = findNode.methodDeclaration('foo() {} // double');
-    assertThat(doubleMethod.declaredElement)
+    assertThat(doubleMethod.declaredElement!)
       ..isInvokedAt('foo(); // double ref', true);
   }
 
@@ -476,7 +476,7 @@
   }
 }''');
     FieldElement field = findElement.field('field');
-    assertThat(field.getter)
+    assertThat(field.getter!)
       ..isReferencedAt('field(); // q', true)
       ..isReferencedAt('field(); // nq', false);
   }
@@ -609,7 +609,7 @@
     await _indexTestUnit('''
 export 'lib.dart';
 ''');
-    var element = findElement.export('package:test/lib.dart').exportedLibrary;
+    var element = findElement.export('package:test/lib.dart').exportedLibrary!;
     assertThat(element)..isReferencedAt("'lib.dart'", true, length: 10);
   }
 
@@ -620,7 +620,7 @@
     await _indexTestUnit('''
 import 'lib.dart';
 ''');
-    var element = findElement.import('package:test/lib.dart').importedLibrary;
+    var element = findElement.import('package:test/lib.dart').importedLibrary!;
     assertThat(element)..isReferencedAt("'lib.dart'", true, length: 10);
   }
 
@@ -733,8 +733,8 @@
 ''');
     // has ".named()", but does not have "named()"
     var constructorName = findNode.constructorName('.named();');
-    var offsetWithoutDot = constructorName.name.offset;
-    var offsetWithDot = constructorName.period.offset;
+    var offsetWithoutDot = constructorName.name!.offset;
+    var offsetWithDot = constructorName.period!.offset;
     expect(index.usedElementOffsets, isNot(contains(offsetWithoutDot)));
     expect(index.usedElementOffsets, contains(offsetWithDot));
   }
@@ -803,8 +803,8 @@
 }
 ''');
     FieldElement field = findElement.field('field');
-    PropertyAccessorElement getter = field.getter;
-    PropertyAccessorElement setter = field.setter;
+    PropertyAccessorElement getter = field.getter!;
+    PropertyAccessorElement setter = field.setter!;
     // A()
     assertThat(field)..isWrittenAt('field});', true);
     // m()
@@ -833,8 +833,8 @@
     // aaa
     {
       FieldElement field = findElement.field('aaa');
-      PropertyAccessorElement getter = field.getter;
-      PropertyAccessorElement setter = field.setter;
+      PropertyAccessorElement getter = field.getter!;
+      PropertyAccessorElement setter = field.setter!;
       assertThat(field)..isWrittenAt('aaa, ', true);
       assertThat(getter)..isReferencedAt('aaa);', false);
       assertThat(setter)..isReferencedAt('aaa = 1;', false);
@@ -842,8 +842,8 @@
     // bbb
     {
       FieldElement field = findElement.field('bbb');
-      PropertyAccessorElement getter = field.getter;
-      PropertyAccessorElement setter = field.setter;
+      PropertyAccessorElement getter = field.getter!;
+      PropertyAccessorElement setter = field.setter!;
       assertThat(field)..isWrittenAt('bbb) {}', true);
       assertThat(getter)..isReferencedAt('bbb);', false);
       assertThat(setter)..isReferencedAt('bbb = 2;', false);
@@ -863,11 +863,12 @@
 }
 ''');
     ClassElement enumElement = findElement.enum_('MyEnum');
-    assertThat(enumElement.getGetter('values'))
+    assertThat(enumElement.getGetter('values')!)
       ..isReferencedAt('values);', true);
-    assertThat(enumElement.getGetter('index'))..isReferencedAt('index);', true);
-    assertThat(enumElement.getGetter('A'))..isReferencedAt('A);', true);
-    assertThat(enumElement.getGetter('B'))..isReferencedAt('B);', true);
+    assertThat(enumElement.getGetter('index')!)
+      ..isReferencedAt('index);', true);
+    assertThat(enumElement.getGetter('A')!)..isReferencedAt('A);', true);
+    assertThat(enumElement.getGetter('B')!)..isReferencedAt('B);', true);
   }
 
   test_isReferencedBy_FieldElement_synthetic_hasGetter() async {
@@ -878,7 +879,7 @@
 }
 ''');
     ClassElement element2 = findElement.class_('A');
-    assertThat(element2.getField('f')).isWrittenAt('f = 42', true);
+    assertThat(element2.getField('f')!).isWrittenAt('f = 42', true);
   }
 
   test_isReferencedBy_FieldElement_synthetic_hasGetterSetter() async {
@@ -890,7 +891,7 @@
 }
 ''');
     ClassElement element2 = findElement.class_('A');
-    assertThat(element2.getField('f')).isWrittenAt('f = 42', true);
+    assertThat(element2.getField('f')!).isWrittenAt('f = 42', true);
   }
 
   test_isReferencedBy_FieldElement_synthetic_hasSetter() async {
@@ -901,7 +902,7 @@
 }
 ''');
     ClassElement element2 = findElement.class_('A');
-    assertThat(element2.getField('f')).isWrittenAt('f = 42', true);
+    assertThat(element2.getField('f')!).isWrittenAt('f = 42', true);
   }
 
   test_isReferencedBy_FunctionElement() async {
@@ -1171,16 +1172,16 @@
 
     var intGetter = findNode.methodDeclaration('0; // int getter');
     var intSetter = findNode.methodDeclaration('{} // int setter');
-    assertThat(intGetter.declaredElement)
+    assertThat(intGetter.declaredElement!)
       ..isReferencedAt('foo; // int getter ref', true);
-    assertThat(intSetter.declaredElement)
+    assertThat(intSetter.declaredElement!)
       ..isReferencedAt('foo = 0; // int setter ref', true);
 
     var doubleGetter = findNode.methodDeclaration('0; // double getter');
     var doubleSetter = findNode.methodDeclaration('{} // double setter');
-    assertThat(doubleGetter.declaredElement)
+    assertThat(doubleGetter.declaredElement!)
       ..isReferencedAt('foo; // double getter ref', true);
-    assertThat(doubleSetter.declaredElement)
+    assertThat(doubleSetter.declaredElement!)
       ..isReferencedAt('foo = 0; // double setter ref', true);
   }
 
@@ -1212,10 +1213,10 @@
 }''');
     TopLevelVariableElement variable = importFindLib().topVar('V');
     assertThat(variable)..isReferencedAt('V; // imp', true);
-    assertThat(variable.getter)
+    assertThat(variable.getter!)
       ..isReferencedAt('V); // q', true)
       ..isReferencedAt('V); // nq', false);
-    assertThat(variable.setter)
+    assertThat(variable.setter!)
       ..isReferencedAt('V = 5; // q', true)
       ..isReferencedAt('V = 5; // nq', false);
   }
@@ -1505,7 +1506,7 @@
     expect(relations, hasLength(expectedCount));
   }
 
-  void isAncestorOf(String search, {int length}) {
+  void isAncestorOf(String search, {int? length}) {
     test._assertHasRelation(
         element,
         relations,
@@ -1513,7 +1514,7 @@
         test._expectedLocation(search, false, length: length));
   }
 
-  void isExtendedAt(String search, bool isQualified, {int length}) {
+  void isExtendedAt(String search, bool isQualified, {int? length}) {
     test._assertHasRelation(
         element,
         relations,
@@ -1521,7 +1522,7 @@
         test._expectedLocation(search, isQualified, length: length));
   }
 
-  void isImplementedAt(String search, bool isQualified, {int length}) {
+  void isImplementedAt(String search, bool isQualified, {int? length}) {
     test._assertHasRelation(
         element,
         relations,
@@ -1529,12 +1530,12 @@
         test._expectedLocation(search, isQualified, length: length));
   }
 
-  void isInvokedAt(String search, bool isQualified, {int length}) {
+  void isInvokedAt(String search, bool isQualified, {int? length}) {
     test._assertHasRelation(element, relations, IndexRelationKind.IS_INVOKED_BY,
         test._expectedLocation(search, isQualified, length: length));
   }
 
-  void isMixedInAt(String search, bool isQualified, {int length}) {
+  void isMixedInAt(String search, bool isQualified, {int? length}) {
     test._assertHasRelation(
         element,
         relations,
@@ -1542,7 +1543,7 @@
         test._expectedLocation(search, isQualified, length: length));
   }
 
-  void isReferencedAt(String search, bool isQualified, {int length}) {
+  void isReferencedAt(String search, bool isQualified, {int? length}) {
     test._assertHasRelation(
         element,
         relations,
@@ -1550,14 +1551,14 @@
         test._expectedLocation(search, isQualified, length: length));
   }
 
-  void isWrittenAt(String search, bool isQualified, {int length}) {
+  void isWrittenAt(String search, bool isQualified, {int? length}) {
     test._assertHasRelation(element, relations, IndexRelationKind.IS_WRITTEN_BY,
         test._expectedLocation(search, isQualified, length: length));
   }
 }
 
 mixin _IndexMixin on PubPackageResolutionTest {
-  AnalysisDriverUnitIndex index;
+  late AnalysisDriverUnitIndex index;
 
   _ElementIndexAssert assertThat(Element element) {
     List<_Relation> relations = _getElementRelations(element);
@@ -1627,7 +1628,7 @@
   }
 
   ExpectedLocation _expectedLocation(String search, bool isQualified,
-      {int length}) {
+      {int? length}) {
     int offset = findNode.offset(search);
     length ??= findNode.simple(search).length;
     return ExpectedLocation(offset, length, isQualified);
@@ -1685,7 +1686,7 @@
     return relations;
   }
 
-  int _getStringId(String str) {
+  int _getStringId(String? str) {
     if (str == null) {
       return index.nullStringId;
     }
@@ -1720,14 +1721,14 @@
   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);
   }
 }
 
 class _NameIndexAssert {
-  final IndexTest test;
+  final _IndexMixin test;
   final String name;
 
   _NameIndexAssert(this.test, this.name);
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 69e058e..71c8f83 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
@@ -19,15 +19,15 @@
 }
 
 mixin GetElementDeclarationMixin implements PubPackageResolutionTest {
-  Future<ElementDeclarationResult> getElementDeclaration(Element element);
+  Future<ElementDeclarationResult?> getElementDeclaration(Element element);
 
   test_class() async {
     await resolveTestCode(r'''
 class A {}
 ''');
-    var element = findNode.classDeclaration('A').declaredElement;
+    var element = findNode.classDeclaration('A').declaredElement!;
     var result = await getElementDeclaration(element);
-    ClassDeclaration node = result.node;
+    var node = result!.node as ClassDeclaration;
     expect(node.name.name, 'A');
   }
 
@@ -37,24 +37,24 @@
 class A {} // 2
 ''');
     {
-      var element = findNode.classDeclaration('A {} // 1').declaredElement;
+      var element = findNode.classDeclaration('A {} // 1').declaredElement!;
       var result = await getElementDeclaration(element);
-      ClassDeclaration node = result.node;
+      var node = result!.node as ClassDeclaration;
       expect(node.name.name, 'A');
       expect(
         node.name.offset,
-        this.result.content.indexOf('A {} // 1'),
+        this.result.content!.indexOf('A {} // 1'),
       );
     }
 
     {
-      var element = findNode.classDeclaration('A {} // 2').declaredElement;
+      var element = findNode.classDeclaration('A {} // 2').declaredElement!;
       var result = await getElementDeclaration(element);
-      ClassDeclaration node = result.node;
+      var node = result!.node as ClassDeclaration;
       expect(node.name.name, 'A');
       expect(
         node.name.offset,
-        this.result.content.indexOf('A {} // 2'),
+        this.result.content!.indexOf('A {} // 2'),
       );
     }
   }
@@ -67,10 +67,10 @@
     await resolveTestCode(r'''
 part 'a.dart';
 ''');
-    var library = this.result.unit.declaredElement.library;
-    var element = library.getType('A');
+    var library = this.result.unit!.declaredElement!.library;
+    var element = library.getType('A')!;
     var result = await getElementDeclaration(element);
-    ClassDeclaration node = result.node;
+    var node = result!.node as ClassDeclaration;
     expect(node.name.name, 'A');
   }
 
@@ -78,9 +78,9 @@
     await resolveTestCode('''
 class {}
 ''');
-    var element = findNode.classDeclaration('class {}').declaredElement;
+    var element = findNode.classDeclaration('class {}').declaredElement!;
     var result = await getElementDeclaration(element);
-    ClassDeclaration node = result.node;
+    var node = result!.node as ClassDeclaration;
     expect(node.name.name, '');
     expect(node.name.offset, 6);
   }
@@ -93,10 +93,17 @@
 ''');
     var element = findElement.class_('B');
     var result = await getElementDeclaration(element);
-    ClassTypeAlias node = result.node;
+    var node = result!.node as ClassTypeAlias;
     expect(node.name.name, 'B');
   }
 
+  test_compilationUnit() async {
+    await resolveTestCode('');
+    var element = findElement.unitElement;
+    var result = await getElementDeclaration(element);
+    expect(result, isNull);
+  }
+
   test_constructor() async {
     await resolveTestCode(r'''
 class A {
@@ -105,17 +112,17 @@
 }
 ''');
     {
-      var unnamed = findNode.constructor('A();').declaredElement;
+      var unnamed = findNode.constructor('A();').declaredElement!;
       var result = await getElementDeclaration(unnamed);
-      ConstructorDeclaration node = result.node;
+      var node = result!.node as ConstructorDeclaration;
       expect(node.name, isNull);
     }
 
     {
-      var named = findNode.constructor('A.named();').declaredElement;
+      var named = findNode.constructor('A.named();').declaredElement!;
       var result = await getElementDeclaration(named);
-      ConstructorDeclaration node = result.node;
-      expect(node.name.name, 'named');
+      var node = result!.node as ConstructorDeclaration;
+      expect(node.name!.name, 'named');
     }
   }
 
@@ -127,24 +134,24 @@
 }
 ''');
     {
-      var element = findNode.constructor('A.named(); // 1').declaredElement;
+      var element = findNode.constructor('A.named(); // 1').declaredElement!;
       var result = await getElementDeclaration(element);
-      ConstructorDeclaration node = result.node;
-      expect(node.name.name, 'named');
+      var node = result!.node as ConstructorDeclaration;
+      expect(node.name!.name, 'named');
       expect(
-        node.name.offset,
-        this.result.content.indexOf('named(); // 1'),
+        node.name!.offset,
+        this.result.content!.indexOf('named(); // 1'),
       );
     }
 
     {
-      var element = findNode.constructor('A.named(); // 2').declaredElement;
+      var element = findNode.constructor('A.named(); // 2').declaredElement!;
       var result = await getElementDeclaration(element);
-      ConstructorDeclaration node = result.node;
-      expect(node.name.name, 'named');
+      var node = result!.node as ConstructorDeclaration;
+      expect(node.name!.name, 'named');
       expect(
-        node.name.offset,
-        this.result.content.indexOf('named(); // 2'),
+        node.name!.offset,
+        this.result.content!.indexOf('named(); // 2'),
       );
     }
   }
@@ -157,24 +164,24 @@
 }
 ''');
     {
-      var element = findNode.constructor('A(); // 1').declaredElement;
+      var element = findNode.constructor('A(); // 1').declaredElement!;
       var result = await getElementDeclaration(element);
-      ConstructorDeclaration node = result.node;
+      var node = result!.node as ConstructorDeclaration;
       expect(node.name, isNull);
       expect(
         node.returnType.offset,
-        this.result.content.indexOf('A(); // 1'),
+        this.result.content!.indexOf('A(); // 1'),
       );
     }
 
     {
-      var element = findNode.constructor('A(); // 2').declaredElement;
+      var element = findNode.constructor('A(); // 2').declaredElement!;
       var result = await getElementDeclaration(element);
-      ConstructorDeclaration node = result.node;
+      var node = result!.node as ConstructorDeclaration;
       expect(node.name, isNull);
       expect(
         node.returnType.offset,
-        this.result.content.indexOf('A(); // 2'),
+        this.result.content!.indexOf('A(); // 2'),
       );
     }
   }
@@ -183,7 +190,7 @@
     await resolveTestCode(r'''
 class A {}
 ''');
-    var element = findElement.class_('A').unnamedConstructor;
+    var element = findElement.class_('A').unnamedConstructor!;
     expect(element.isSynthetic, isTrue);
 
     var result = await getElementDeclaration(element);
@@ -196,7 +203,7 @@
 ''');
     var element = findElement.enum_('MyEnum');
     var result = await getElementDeclaration(element);
-    EnumDeclaration node = result.node;
+    var node = result!.node as EnumDeclaration;
     expect(node.name.name, 'MyEnum');
   }
 
@@ -206,7 +213,7 @@
 ''');
     var element = findElement.field('a');
     var result = await getElementDeclaration(element);
-    EnumConstantDeclaration node = result.node;
+    var node = result!.node as EnumConstantDeclaration;
     expect(node.name.name, 'a');
   }
 
@@ -214,10 +221,10 @@
     await resolveTestCode(r'''
 extension E on int {}
 ''');
-    var element = findNode.extensionDeclaration('E').declaredElement;
+    var element = findNode.extensionDeclaration('E').declaredElement!;
     var result = await getElementDeclaration(element);
-    ExtensionDeclaration node = result.node;
-    expect(node.name.name, 'E');
+    var node = result!.node as ExtensionDeclaration;
+    expect(node.name!.name, 'E');
   }
 
   test_field() async {
@@ -229,7 +236,7 @@
     var element = findElement.field('foo');
 
     var result = await getElementDeclaration(element);
-    VariableDeclaration node = result.node;
+    var node = result!.node as VariableDeclaration;
     expect(node.name.name, 'foo');
   }
 
@@ -242,7 +249,7 @@
     var element = findElement.localFunction('foo');
 
     var result = await getElementDeclaration(element);
-    FunctionDeclaration node = result.node;
+    var node = result!.node as FunctionDeclaration;
     expect(node.name.name, 'foo');
   }
 
@@ -253,10 +260,19 @@
     var element = findElement.topFunction('foo');
 
     var result = await getElementDeclaration(element);
-    FunctionDeclaration node = result.node;
+    var node = result!.node as FunctionDeclaration;
     expect(node.name.name, 'foo');
   }
 
+  test_genericFunctionTypeElement() async {
+    await resolveTestCode(r'''
+typedef F = void Function();
+''');
+    var element = findElement.typeAlias('F').aliasedElement!;
+    var result = await getElementDeclaration(element);
+    expect(result, isNull);
+  }
+
   test_getter_class() async {
     await resolveTestCode(r'''
 class A {
@@ -265,7 +281,7 @@
 ''');
     var element = findElement.getter('x');
     var result = await getElementDeclaration(element);
-    MethodDeclaration node = result.node;
+    var node = result!.node as MethodDeclaration;
     expect(node.name.name, 'x');
     expect(node.isGetter, isTrue);
   }
@@ -276,11 +292,20 @@
 ''');
     var element = findElement.topGet('x');
     var result = await getElementDeclaration(element);
-    FunctionDeclaration node = result.node;
+    var node = result!.node as FunctionDeclaration;
     expect(node.name.name, 'x');
     expect(node.isGetter, isTrue);
   }
 
+  test_library() async {
+    await resolveTestCode(r'''
+library foo;
+''');
+    var element = findElement.unitElement.enclosingElement;
+    var result = await getElementDeclaration(element);
+    expect(result, isNull);
+  }
+
   test_localVariable() async {
     await resolveTestCode(r'''
 main() {
@@ -290,7 +315,7 @@
     var element = findElement.localVar('foo');
 
     var result = await getElementDeclaration(element);
-    VariableDeclaration node = result.node;
+    var node = result!.node as VariableDeclaration;
     expect(node.name.name, 'foo');
   }
 
@@ -303,7 +328,7 @@
     var element = findElement.method('foo');
 
     var result = await getElementDeclaration(element);
-    MethodDeclaration node = result.node;
+    var node = result!.node as MethodDeclaration;
     expect(node.name.name, 'foo');
   }
 
@@ -313,7 +338,7 @@
 ''');
     var element = findElement.mixin('M');
     var result = await getElementDeclaration(element);
-    MixinDeclaration node = result.node;
+    var node = result!.node as MixinDeclaration;
     expect(node.name.name, 'M');
   }
 
@@ -324,8 +349,8 @@
     var element = findElement.parameter('a');
 
     var result = await getElementDeclaration(element);
-    SimpleFormalParameter node = result.node;
-    expect(node.identifier.name, 'a');
+    var node = result!.node as SimpleFormalParameter;
+    expect(node.identifier!.name, 'a');
   }
 
   test_parameter_missingName_named() async {
@@ -338,8 +363,8 @@
     expect(element.isNamed, isTrue);
 
     var result = await getElementDeclaration(element);
-    DefaultFormalParameter node = result.node;
-    expect(node.identifier.name, '');
+    var node = result!.node as DefaultFormalParameter;
+    expect(node.identifier!.name, '');
   }
 
   test_parameter_missingName_required() async {
@@ -352,8 +377,8 @@
     expect(element.isPositional, isTrue);
 
     var result = await getElementDeclaration(element);
-    SimpleFormalParameter node = result.node;
-    expect(node.identifier.name, '');
+    var node = result!.node as SimpleFormalParameter;
+    expect(node.identifier!.name, '');
   }
 
   test_setter_class() async {
@@ -364,7 +389,7 @@
 ''');
     var element = findElement.setter('x');
     var result = await getElementDeclaration(element);
-    MethodDeclaration node = result.node;
+    var node = result!.node as MethodDeclaration;
     expect(node.name.name, 'x');
     expect(node.isSetter, isTrue);
   }
@@ -375,7 +400,7 @@
 ''');
     var element = findElement.topSet('x');
     var result = await getElementDeclaration(element);
-    FunctionDeclaration node = result.node;
+    var node = result!.node as FunctionDeclaration;
     expect(node.name.name, 'x');
     expect(node.isSetter, isTrue);
   }
@@ -387,7 +412,7 @@
     var element = findElement.topVar('foo');
 
     var result = await getElementDeclaration(element);
-    VariableDeclaration node = result.node;
+    var node = result!.node as VariableDeclaration;
     expect(node.name.name, 'foo');
   }
 
@@ -406,16 +431,16 @@
 class GetElementDeclarationParsedTest extends PubPackageResolutionTest
     with GetElementDeclarationMixin {
   @override
-  Future<ElementDeclarationResult> getElementDeclaration(
+  Future<ElementDeclarationResult?> getElementDeclaration(
       Element element) async {
-    var libraryPath = element.library.source.fullName;
+    var libraryPath = element.library!.source.fullName;
     var library = _getParsedLibrary(libraryPath);
     return library.getElementDeclaration(element);
   }
 
   ParsedLibraryResultImpl _getParsedLibrary(String path) {
     var session = contextFor(path).currentSession;
-    return session.getParsedLibrary(path);
+    return session.getParsedLibrary(path) as ParsedLibraryResultImpl;
   }
 }
 
@@ -423,9 +448,9 @@
 class GetElementDeclarationResolvedTest extends PubPackageResolutionTest
     with GetElementDeclarationMixin {
   @override
-  Future<ElementDeclarationResult> getElementDeclaration(
+  Future<ElementDeclarationResult?> getElementDeclaration(
       Element element) async {
-    var libraryPath = element.library.source.fullName;
+    var libraryPath = element.library!.source.fullName;
     var library = await _getResolvedLibrary(libraryPath);
     return library.getElementDeclaration(element);
   }
diff --git a/pkg/analyzer/test/src/dart/analysis/search_test.dart b/pkg/analyzer/test/src/dart/analysis/search_test.dart
index c788f13..6a0844c 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 @@
     with WithNonFunctionTypeAliasesMixin {
   AnalysisDriver get driver => driverFor(testFilePath);
 
-  CompilationUnitElement get resultUnitElement => result.unit.declaredElement;
+  CompilationUnitElement get resultUnitElement => result.unit!.declaredElement!;
 
   String get testUriStr => 'package:test/test.dart';
 
@@ -258,7 +258,7 @@
   A v;
 }
 ''');
-    var element = findNode.simple('A p').staticElement;
+    var element = findNode.simple('A p').staticElement!;
     var p = findElement.parameter('p');
     var main = findElement.function('main');
     var expected = [
@@ -358,8 +358,8 @@
 ''');
     var element = findElement.unnamedConstructor('A');
 
-    CompilationUnit otherUnit = (await driver.getResult(other)).unit;
-    Element main = otherUnit.declaredElement.functions[0];
+    CompilationUnit otherUnit = (await driver.getResult(other))!.unit!;
+    Element main = otherUnit.declaredElement!.functions[0];
     var expected = [
       ExpectedResult(main, SearchResultKind.REFERENCE,
           otherCode.indexOf('(); // in other'), 0,
@@ -492,15 +492,15 @@
 ''');
     var enumElement = findElement.enum_('MyEnum');
     var main = findElement.function('main');
-    await _verifyReferences(enumElement.getField('index'),
+    await _verifyReferences(enumElement.getField('index')!,
         [_expectIdQ(main, SearchResultKind.READ, 'index);')]);
-    await _verifyReferences(enumElement.getField('values'),
+    await _verifyReferences(enumElement.getField('values')!,
         [_expectIdQ(main, SearchResultKind.READ, 'values);')]);
-    await _verifyReferences(enumElement.getField('A'), [
+    await _verifyReferences(enumElement.getField('A')!, [
       _expectIdQ(main, SearchResultKind.READ, 'A.index);'),
       _expectIdQ(main, SearchResultKind.READ, 'A);')
     ]);
-    await _verifyReferences(enumElement.getField('B'),
+    await _verifyReferences(enumElement.getField('B')!,
         [_expectIdQ(main, SearchResultKind.READ, 'B);')]);
   }
 
@@ -1516,9 +1516,9 @@
   V(); // nq
 }
 ''');
-    ImportElement importElement = findNode.import('show V').element;
+    ImportElement importElement = findNode.import('show V').element!;
     CompilationUnitElement impUnit =
-        importElement.importedLibrary.definingCompilationUnit;
+        importElement.importedLibrary!.definingCompilationUnit;
     TopLevelVariableElement variable = impUnit.topLevelVariables[0];
     var main = findElement.function('main');
     var expected = [
@@ -1804,7 +1804,7 @@
 ''');
 
     var aLibrary = await driver.getLibraryByUri(aUri);
-    ClassElement aClass = aLibrary.getType('A');
+    ClassElement aClass = aLibrary.getType('A')!;
 
     // Search by 'type'.
     List<SubtypeResult> subtypes =
@@ -1849,7 +1849,7 @@
     newFile(cccFilePath, content: 'class C implements List {}');
 
     LibraryElement coreLib = await driver.getLibraryByUri('dart:core');
-    ClassElement listElement = coreLib.getType('List');
+    ClassElement listElement = coreLib.getType('List')!;
 
     var searchedFiles = SearchedFiles();
     var results = await driver.search.subTypes(listElement, searchedFiles);
@@ -1857,7 +1857,7 @@
     void assertHasResult(String path, String name, {bool not = false}) {
       var matcher = contains(predicate((SearchResult r) {
         var element = r.enclosingElement;
-        return element.name == name && element.source.fullName == path;
+        return element.name == name && element.source!.fullName == path;
       }));
       expect(results, not ? isNot(matcher) : matcher);
     }
@@ -1977,7 +1977,7 @@
 
   ExpectedResult _expectId(
       Element enclosingElement, SearchResultKind kind, String search,
-      {int length, bool isResolved = true, bool isQualified = false}) {
+      {int? length, bool isResolved = true, bool isQualified = false}) {
     int offset = findNode.offset(search);
     length ??= findNode.simple(search).length;
     return ExpectedResult(enclosingElement, kind, offset, length,
@@ -1987,14 +1987,14 @@
   /// Create [ExpectedResult] for a qualified and resolved match.
   ExpectedResult _expectIdQ(
       Element element, SearchResultKind kind, String search,
-      {int length}) {
+      {int? length}) {
     return _expectId(element, kind, search, isQualified: true, length: length);
   }
 
   /// Create [ExpectedResult] for a qualified and unresolved match.
   ExpectedResult _expectIdQU(
       Element element, SearchResultKind kind, String search,
-      {int length}) {
+      {int? length}) {
     return _expectId(element, kind, search,
         isQualified: true, isResolved: false, length: length);
   }
@@ -2002,7 +2002,7 @@
   /// Create [ExpectedResult] for a unqualified and unresolved match.
   ExpectedResult _expectIdU(
       Element element, SearchResultKind kind, String search,
-      {int length}) {
+      {int? length}) {
     return _expectId(element, kind, search,
         isQualified: false, isResolved: false, length: length);
   }
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 c9d188a..6e96379 100644
--- a/pkg/analyzer/test/src/dart/analysis/session_helper_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/session_helper_test.dart
@@ -18,7 +18,7 @@
 
 @reflectiveTest
 class AnalysisSessionHelperTest extends PubPackageResolutionTest {
-  AnalysisSessionHelper helper;
+  late final AnalysisSessionHelper helper;
 
   @override
   void setUp() {
@@ -34,8 +34,7 @@
 ''');
     String uri = file.toUri().toString();
 
-    var element = await helper.getClass(uri, 'C');
-    expect(element, isNotNull);
+    var element = (await helper.getClass(uri, 'C'))!;
     expect(element.displayName, 'C');
   }
 
@@ -58,8 +57,7 @@
 ''');
     String bUri = bFile.toUri().toString();
 
-    var element = await helper.getClass(bUri, 'A');
-    expect(element, isNotNull);
+    var element = (await helper.getClass(bUri, 'A'))!;
     expect(element.displayName, 'A');
   }
 
@@ -81,8 +79,8 @@
 class A {}
 ''');
     var element = findElement.class_('A');
-    var result = await helper.getElementDeclaration(element);
-    ClassDeclaration node = result.node;
+    var result = (await helper.getElementDeclaration(element))!;
+    var node = result.node as ClassDeclaration;
     expect(node.name.name, 'A');
   }
 
@@ -91,9 +89,9 @@
 class A {}
 class B {}
 ''');
-    var element = findNode.classDeclaration('A').declaredElement;
-    var resolvedUnit = await helper.getResolvedUnitByElement(element);
-    expect(resolvedUnit.unit.declarations, hasLength(2));
+    var element = findNode.classDeclaration('A').declaredElement!;
+    var resolvedUnit = (await helper.getResolvedUnitByElement(element))!;
+    expect(resolvedUnit.unit!.declarations, hasLength(2));
   }
 
   test_getTopLevelPropertyAccessor_defined_getter() async {
@@ -102,8 +100,7 @@
 ''');
     String uri = file.toUri().toString();
 
-    var element = await helper.getTopLevelPropertyAccessor(uri, 'a');
-    expect(element, isNotNull);
+    var element = (await helper.getTopLevelPropertyAccessor(uri, 'a'))!;
     expect(element.kind, ElementKind.GETTER);
     expect(element.displayName, 'a');
   }
@@ -114,8 +111,7 @@
 ''');
     String uri = file.toUri().toString();
 
-    var element = await helper.getTopLevelPropertyAccessor(uri, 'a=');
-    expect(element, isNotNull);
+    var element = (await helper.getTopLevelPropertyAccessor(uri, 'a='))!;
     expect(element.kind, ElementKind.SETTER);
     expect(element.displayName, 'a');
   }
@@ -126,8 +122,7 @@
 ''');
     String uri = file.toUri().toString();
 
-    var element = await helper.getTopLevelPropertyAccessor(uri, 'a');
-    expect(element, isNotNull);
+    var element = (await helper.getTopLevelPropertyAccessor(uri, 'a'))!;
     expect(element.kind, ElementKind.GETTER);
     expect(element.displayName, 'a');
   }
@@ -141,8 +136,7 @@
 ''');
     String bUri = bFile.toUri().toString();
 
-    var element = await helper.getTopLevelPropertyAccessor(bUri, 'a');
-    expect(element, isNotNull);
+    var element = (await helper.getTopLevelPropertyAccessor(bUri, 'a'))!;
     expect(element.kind, ElementKind.GETTER);
     expect(element.displayName, 'a');
   }
diff --git a/pkg/analyzer/test/src/dart/analysis/session_test.dart b/pkg/analyzer/test/src/dart/analysis/session_test.dart
index 733f92f..a1c0131 100644
--- a/pkg/analyzer/test/src/dart/analysis/session_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/session_test.dart
@@ -21,15 +21,15 @@
 
 @reflectiveTest
 class AnalysisSessionImplTest with ResourceProviderMixin {
-  /*late final*/ AnalysisContextCollection contextCollection;
-  /*late final*/ AnalysisContext context;
-  /*late final*/ AnalysisSessionImpl session;
+  late final AnalysisContextCollection contextCollection;
+  late final AnalysisContext context;
+  late final AnalysisSessionImpl session;
 
-  /*late final*/ String testContextPath;
-  /*late final*/ String aaaContextPath;
-  /*late final*/ String bbbContextPath;
+  late final String testContextPath;
+  late final String aaaContextPath;
+  late final String bbbContextPath;
 
-  /*late final*/ String testPath;
+  late final String testPath;
 
   void setUp() {
     MockSdk(resourceProvider: resourceProvider);
@@ -48,14 +48,14 @@
       sdkPath: convertPath(sdkRoot),
     );
     context = contextCollection.contextFor(testContextPath);
-    session = context.currentSession;
+    session = context.currentSession as AnalysisSessionImpl;
 
     testPath = convertPath('/home/test/lib/test.dart');
   }
 
   test_getErrors() async {
     newFile(testPath, content: 'class C {');
-    var errorsResult = await session.getErrors(testPath);
+    var errorsResult = (await session.getErrors(testPath))!;
     expect(errorsResult.session, session);
     expect(errorsResult.path, testPath);
     expect(errorsResult.errors, isNotEmpty);
@@ -92,7 +92,7 @@
 
     expect(parsedLibrary.units, hasLength(1));
     {
-      var parsedUnit = parsedLibrary.units[0];
+      var parsedUnit = parsedLibrary.units![0];
       expect(parsedUnit.session, session);
       expect(parsedUnit.path, testPath);
       expect(parsedUnit.uri, Uri.parse('package:test/test.dart'));
@@ -109,9 +109,9 @@
     var library = await session.getLibraryByUri('package:test/test.dart');
     var parsedLibrary = session.getParsedLibrary(testPath);
 
-    var element = library.getType('A');
-    var declaration = parsedLibrary.getElementDeclaration(element);
-    ClassDeclaration node = declaration.node;
+    var element = library.getType('A')!;
+    var declaration = parsedLibrary.getElementDeclaration(element)!;
+    var node = declaration.node as ClassDeclaration;
     expect(node.name.name, 'A');
     expect(node.offset, 0);
     expect(node.length, 10);
@@ -120,7 +120,7 @@
   test_getParsedLibrary_getElementDeclaration_notThisLibrary() async {
     newFile(testPath, content: '');
 
-    var resolvedUnit = await session.getResolvedUnit(testPath);
+    var resolvedUnit = (await session.getResolvedUnit(testPath))!;
     var typeProvider = resolvedUnit.typeProvider;
     var intClass = typeProvider.intType.element;
 
@@ -138,21 +138,21 @@
 
     var parsedLibrary = session.getParsedLibrary(testPath);
 
-    var unitElement = (await session.getUnitElement(testPath)).element;
+    var unitElement = (await session.getUnitElement(testPath))!.element;
     var fooElement = unitElement.topLevelVariables[0];
     expect(fooElement.name, 'foo');
 
     // We can get the variable element declaration.
-    var fooDeclaration = parsedLibrary.getElementDeclaration(fooElement);
-    VariableDeclaration fooNode = fooDeclaration.node;
+    var fooDeclaration = parsedLibrary.getElementDeclaration(fooElement)!;
+    var fooNode = fooDeclaration.node as VariableDeclaration;
     expect(fooNode.name.name, 'foo');
     expect(fooNode.offset, 4);
     expect(fooNode.length, 7);
     expect(fooNode.name.staticElement, isNull);
 
     // Synthetic elements don't have nodes.
-    expect(parsedLibrary.getElementDeclaration(fooElement.getter), isNull);
-    expect(parsedLibrary.getElementDeclaration(fooElement.setter), isNull);
+    expect(parsedLibrary.getElementDeclaration(fooElement.getter!), isNull);
+    expect(parsedLibrary.getElementDeclaration(fooElement.setter!), isNull);
   }
 
   test_getParsedLibrary_invalidPartUri() async {
@@ -166,15 +166,15 @@
 
     expect(parsedLibrary.units, hasLength(3));
     expect(
-      parsedLibrary.units[0].path,
+      parsedLibrary.units![0].path,
       convertPath('/home/test/lib/test.dart'),
     );
     expect(
-      parsedLibrary.units[1].path,
+      parsedLibrary.units![1].path,
       convertPath('/home/test/lib/a.dart'),
     );
     expect(
-      parsedLibrary.units[2].path,
+      parsedLibrary.units![2].path,
       convertPath('/home/test/lib/c.dart'),
     );
   }
@@ -224,21 +224,21 @@
     expect(parsedLibrary.units, hasLength(3));
 
     {
-      var aUnit = parsedLibrary.units[0];
+      var aUnit = parsedLibrary.units![0];
       expect(aUnit.path, a);
       expect(aUnit.uri, Uri.parse('package:test/a.dart'));
       expect(aUnit.unit.declarations, hasLength(1));
     }
 
     {
-      var bUnit = parsedLibrary.units[1];
+      var bUnit = parsedLibrary.units![1];
       expect(bUnit.path, b);
       expect(bUnit.uri, Uri.parse('package:test/b.dart'));
       expect(bUnit.unit.declarations, hasLength(2));
     }
 
     {
-      var cUnit = parsedLibrary.units[2];
+      var cUnit = parsedLibrary.units![2];
       expect(cUnit.path, c);
       expect(cUnit.uri, Uri.parse('package:test/c.dart'));
       expect(cUnit.unit.declarations, hasLength(3));
@@ -310,46 +310,43 @@
     var typeProvider = resolvedLibrary.typeProvider;
     expect(typeProvider.intType.element.name, 'int');
 
-    var libraryElement = resolvedLibrary.element;
-    expect(libraryElement, isNotNull);
+    var libraryElement = resolvedLibrary.element!;
 
-    var aClass = libraryElement.getType('A');
-    expect(aClass, isNotNull);
+    var aClass = libraryElement.getType('A')!;
 
-    var bClass = libraryElement.getType('B');
-    expect(bClass, isNotNull);
+    var bClass = libraryElement.getType('B')!;
 
-    var aUnitResult = resolvedLibrary.units[0];
+    var aUnitResult = resolvedLibrary.units![0];
     expect(aUnitResult.path, a);
     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];
+    var bUnitResult = resolvedLibrary.units![1];
     expect(bUnitResult.path, b);
     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);
-    ClassDeclaration aNode = aDeclaration.node;
+    var aDeclaration = resolvedLibrary.getElementDeclaration(aClass)!;
+    var aNode = aDeclaration.node as ClassDeclaration;
     expect(aNode.name.name, 'A');
     expect(aNode.offset, 16);
     expect(aNode.length, 16);
-    expect(aNode.name.staticElement.name, 'A');
+    expect(aNode.declaredElement!.name, 'A');
 
-    var bDeclaration = resolvedLibrary.getElementDeclaration(bClass);
-    ClassDeclaration bNode = bDeclaration.node;
+    var bDeclaration = resolvedLibrary.getElementDeclaration(bClass)!;
+    var bNode = bDeclaration.node as ClassDeclaration;
     expect(bNode.name.name, 'B');
     expect(bNode.offset, 19);
     expect(bNode.length, 16);
-    expect(bNode.name.staticElement.name, 'B');
+    expect(bNode.declaredElement!.name, 'B');
   }
 
   test_getResolvedLibrary_getElementDeclaration_notThisLibrary() async {
@@ -369,22 +366,22 @@
 ''');
 
     var resolvedLibrary = await session.getResolvedLibrary(testPath);
-    var unitElement = resolvedLibrary.element.definingCompilationUnit;
+    var unitElement = resolvedLibrary.element!.definingCompilationUnit;
 
     var fooElement = unitElement.topLevelVariables[0];
     expect(fooElement.name, 'foo');
 
     // We can get the variable element declaration.
-    var fooDeclaration = resolvedLibrary.getElementDeclaration(fooElement);
-    VariableDeclaration fooNode = fooDeclaration.node;
+    var fooDeclaration = resolvedLibrary.getElementDeclaration(fooElement)!;
+    var fooNode = fooDeclaration.node as VariableDeclaration;
     expect(fooNode.name.name, 'foo');
     expect(fooNode.offset, 4);
     expect(fooNode.length, 7);
-    expect(fooNode.name.staticElement.name, 'foo');
+    expect(fooNode.declaredElement!.name, 'foo');
 
     // Synthetic elements don't have nodes.
-    expect(resolvedLibrary.getElementDeclaration(fooElement.getter), isNull);
-    expect(resolvedLibrary.getElementDeclaration(fooElement.setter), isNull);
+    expect(resolvedLibrary.getElementDeclaration(fooElement.getter!), isNull);
+    expect(resolvedLibrary.getElementDeclaration(fooElement.setter!), isNull);
   }
 
   test_getResolvedLibrary_invalidPartUri() async {
@@ -398,15 +395,15 @@
 
     expect(resolvedLibrary.units, hasLength(3));
     expect(
-      resolvedLibrary.units[0].path,
+      resolvedLibrary.units![0].path,
       convertPath('/home/test/lib/test.dart'),
     );
     expect(
-      resolvedLibrary.units[1].path,
+      resolvedLibrary.units![1].path,
       convertPath('/home/test/lib/a.dart'),
     );
     expect(
-      resolvedLibrary.units[2].path,
+      resolvedLibrary.units![2].path,
       convertPath('/home/test/lib/c.dart'),
     );
   }
@@ -429,7 +426,7 @@
     expect(resolvedLibrary.path, testPath);
     expect(resolvedLibrary.uri, Uri.parse('package:test/test.dart'));
     expect(resolvedLibrary.units, hasLength(1));
-    expect(resolvedLibrary.units[0].unit.declaredElement, isNotNull);
+    expect(resolvedLibrary.units![0].unit!.declaredElement, isNotNull);
   }
 
   test_getResolvedLibraryByElement_differentSession() async {
@@ -451,11 +448,11 @@
 class B {}
 ''');
 
-    var unitResult = await session.getResolvedUnit(testPath);
+    var unitResult = (await session.getResolvedUnit(testPath))!;
     expect(unitResult.session, session);
     expect(unitResult.path, testPath);
     expect(unitResult.uri, Uri.parse('package:test/test.dart'));
-    expect(unitResult.unit.declarations, hasLength(2));
+    expect(unitResult.unit!.declarations, hasLength(2));
     expect(unitResult.typeProvider, isNotNull);
     expect(unitResult.libraryElement, isNotNull);
   }
@@ -480,7 +477,7 @@
 class B {}
 ''');
 
-    var unitResult = await session.getUnitElement(testPath);
+    var unitResult = (await session.getUnitElement(testPath))!;
     expect(unitResult.session, session);
     expect(unitResult.path, testPath);
     expect(unitResult.uri, Uri.parse('package:test/test.dart'));
diff --git a/pkg/analyzer/test/src/dart/analysis/unlinked_api_signature_test.dart b/pkg/analyzer/test/src/dart/analysis/unlinked_api_signature_test.dart
index 83e8192..6fdda84 100644
--- a/pkg/analyzer/test/src/dart/analysis/unlinked_api_signature_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/unlinked_api_signature_test.dart
@@ -27,7 +27,7 @@
     assertSignature(oldCode, newCode, same: true);
   }
 
-  void assertSignature(String oldCode, String newCode, {bool same}) {
+  void assertSignature(String oldCode, String newCode, {required bool same}) {
     var path = convertPath('/test.dart');
 
     newFile(path, content: oldCode);
diff --git a/pkg/analyzer/test/src/dart/analysis/uri_converter_test.dart b/pkg/analyzer/test/src/dart/analysis/uri_converter_test.dart
index 55af8a5..069a4ca 100644
--- a/pkg/analyzer/test/src/dart/analysis/uri_converter_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/uri_converter_test.dart
@@ -21,7 +21,7 @@
 
 @reflectiveTest
 class DriverBasedUriConverterTest with ResourceProviderMixin {
-  DriverBasedUriConverter uriConverter;
+  late final DriverBasedUriConverter uriConverter;
 
   void setUp() {
     Folder barFolder = newFolder('/packages/bar/lib');
@@ -84,13 +84,13 @@
 
 class MockAnalysisDriver implements AnalysisDriver {
   @override
-  ResourceProvider resourceProvider;
+  late final ResourceProvider resourceProvider;
 
   @override
-  SourceFactory sourceFactory;
+  late final SourceFactory sourceFactory;
 
   @override
-  ContextRoot contextRoot;
+  late final ContextRoot contextRoot;
 
   @override
   dynamic noSuchMethod(Invocation invocation) {
diff --git a/pkg/analyzer/test/src/dart/ast/ast_test.dart b/pkg/analyzer/test/src/dart/ast/ast_test.dart
index d054121..36a1ab1 100644
--- a/pkg/analyzer/test/src/dart/ast/ast_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/ast_test.dart
@@ -21,12 +21,12 @@
 
 @reflectiveTest
 class CompilationUnitImplTest extends ParserTestCase {
-  /*late*/ String testSource;
-  /*late*/ CompilationUnitImpl testUnit;
+  late final String testSource;
+  late final CompilationUnitImpl testUnit;
 
   parse(String source) {
     testSource = source;
-    testUnit = parseCompilationUnit(source);
+    testUnit = parseCompilationUnit(source) as CompilationUnitImpl;
   }
 
   test_languageVersionComment_firstComment() {
@@ -60,7 +60,7 @@
 void main() {}
 ''');
     expect(testUnit.languageVersionToken,
-        testUnit.beginToken.precedingComments.next);
+        testUnit.beginToken.precedingComments!.next);
   }
 
   test_languageVersionComment_thirdComment() {
@@ -71,14 +71,14 @@
 void main() {}
 ''');
     expect(testUnit.languageVersionToken,
-        testUnit.beginToken.precedingComments.next.next);
+        testUnit.beginToken.precedingComments!.next!.next);
   }
 }
 
 @reflectiveTest
 class ExpressionImplTest extends ParserTestCase {
-  String testSource;
-  CompilationUnitImpl testUnit;
+  late final String testSource;
+  late final CompilationUnitImpl testUnit;
 
   assertInContext(String snippet, bool isInContext) {
     int index = testSource.indexOf(snippet);
@@ -92,7 +92,7 @@
 
   parse(String source) {
     testSource = source;
-    testUnit = parseCompilationUnit(source);
+    testUnit = parseCompilationUnit(source) as CompilationUnitImpl;
   }
 
   test_inConstantContext_instanceCreation_annotation_true() {
diff --git a/pkg/analyzer/test/src/dart/ast/constant_evaluator_test.dart b/pkg/analyzer/test/src/dart/ast/constant_evaluator_test.dart
index dfa42c6..d491c73 100644
--- a/pkg/analyzer/test/src/dart/ast/constant_evaluator_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/constant_evaluator_test.dart
@@ -33,47 +33,47 @@
   }
 
   void test_binary_divide_double() {
-    Object value = _getConstantValue("3.2 / 2.3");
+    var value = _getConstantValue("3.2 / 2.3");
     expect(value, 3.2 / 2.3);
   }
 
   void test_binary_divide_integer() {
-    Object value = _getConstantValue("3 / 2");
+    var value = _getConstantValue("3 / 2");
     expect(value, 1.5);
   }
 
   void test_binary_equal_boolean() {
-    Object value = _getConstantValue("true == false");
+    var value = _getConstantValue("true == false");
     expect(value, false);
   }
 
   void test_binary_equal_integer() {
-    Object value = _getConstantValue("2 == 3");
+    var value = _getConstantValue("2 == 3");
     expect(value, false);
   }
 
   void test_binary_equal_invalidLeft() {
-    Object value = _getConstantValue("a == 3");
+    var value = _getConstantValue("a == 3");
     expect(value, ConstantEvaluator.NOT_A_CONSTANT);
   }
 
   void test_binary_equal_invalidRight() {
-    Object value = _getConstantValue("2 == a");
+    var value = _getConstantValue("2 == a");
     expect(value, ConstantEvaluator.NOT_A_CONSTANT);
   }
 
   void test_binary_equal_string() {
-    Object value = _getConstantValue("'a' == 'b'");
+    var value = _getConstantValue("'a' == 'b'");
     expect(value, false);
   }
 
   void test_binary_greaterThan() {
-    Object value = _getConstantValue("2 > 3");
+    var value = _getConstantValue("2 > 3");
     expect(value, false);
   }
 
   void test_binary_greaterThanOrEqual() {
-    Object value = _getConstantValue("2 >= 3");
+    var value = _getConstantValue("2 >= 3");
     expect(value, false);
   }
 
@@ -83,102 +83,102 @@
   }
 
   void test_binary_lessThan() {
-    Object value = _getConstantValue("2 < 3");
+    var value = _getConstantValue("2 < 3");
     expect(value, true);
   }
 
   void test_binary_lessThanOrEqual() {
-    Object value = _getConstantValue("2 <= 3");
+    var value = _getConstantValue("2 <= 3");
     expect(value, true);
   }
 
   void test_binary_logicalAnd() {
-    Object value = _getConstantValue("true && false");
+    var value = _getConstantValue("true && false");
     expect(value, false);
   }
 
   void test_binary_logicalOr() {
-    Object value = _getConstantValue("true || false");
+    var value = _getConstantValue("true || false");
     expect(value, true);
   }
 
   void test_binary_minus_double() {
-    Object value = _getConstantValue("3.2 - 2.3");
+    var value = _getConstantValue("3.2 - 2.3");
     expect(value, 3.2 - 2.3);
   }
 
   void test_binary_minus_integer() {
-    Object value = _getConstantValue("3 - 2");
+    var value = _getConstantValue("3 - 2");
     expect(value, 1);
   }
 
   void test_binary_notEqual_boolean() {
-    Object value = _getConstantValue("true != false");
+    var value = _getConstantValue("true != false");
     expect(value, true);
   }
 
   void test_binary_notEqual_integer() {
-    Object value = _getConstantValue("2 != 3");
+    var value = _getConstantValue("2 != 3");
     expect(value, true);
   }
 
   void test_binary_notEqual_invalidLeft() {
-    Object value = _getConstantValue("a != 3");
+    var value = _getConstantValue("a != 3");
     expect(value, ConstantEvaluator.NOT_A_CONSTANT);
   }
 
   void test_binary_notEqual_invalidRight() {
-    Object value = _getConstantValue("2 != a");
+    var value = _getConstantValue("2 != a");
     expect(value, ConstantEvaluator.NOT_A_CONSTANT);
   }
 
   void test_binary_notEqual_string() {
-    Object value = _getConstantValue("'a' != 'b'");
+    var value = _getConstantValue("'a' != 'b'");
     expect(value, true);
   }
 
   void test_binary_plus_double() {
-    Object value = _getConstantValue("2.3 + 3.2");
+    var value = _getConstantValue("2.3 + 3.2");
     expect(value, 2.3 + 3.2);
   }
 
   void test_binary_plus_double_string() {
-    Object value = _getConstantValue("'world' + 5.5");
+    var value = _getConstantValue("'world' + 5.5");
     expect(value, ConstantEvaluator.NOT_A_CONSTANT);
   }
 
   void test_binary_plus_int_string() {
-    Object value = _getConstantValue("'world' + 5");
+    var value = _getConstantValue("'world' + 5");
     expect(value, ConstantEvaluator.NOT_A_CONSTANT);
   }
 
   void test_binary_plus_integer() {
-    Object value = _getConstantValue("2 + 3");
+    var value = _getConstantValue("2 + 3");
     expect(value, 5);
   }
 
   void test_binary_plus_string() {
-    Object value = _getConstantValue("'hello ' + 'world'");
+    var value = _getConstantValue("'hello ' + 'world'");
     expect(value, 'hello world');
   }
 
   void test_binary_plus_string_double() {
-    Object value = _getConstantValue("5.5 + 'world'");
+    var value = _getConstantValue("5.5 + 'world'");
     expect(value, ConstantEvaluator.NOT_A_CONSTANT);
   }
 
   void test_binary_plus_string_int() {
-    Object value = _getConstantValue("5 + 'world'");
+    var value = _getConstantValue("5 + 'world'");
     expect(value, ConstantEvaluator.NOT_A_CONSTANT);
   }
 
   void test_binary_remainder_double() {
-    Object value = _getConstantValue("3.2 % 2.3");
+    var value = _getConstantValue("3.2 % 2.3");
     expect(value, 3.2 % 2.3);
   }
 
   void test_binary_remainder_integer() {
-    Object value = _getConstantValue("8 % 3");
+    var value = _getConstantValue("8 % 3");
     expect(value, 2);
   }
 
@@ -188,12 +188,12 @@
   }
 
   void test_binary_times_double() {
-    Object value = _getConstantValue("2.3 * 3.2");
+    var value = _getConstantValue("2.3 * 3.2");
     expect(value, 2.3 * 3.2);
   }
 
   void test_binary_times_integer() {
-    Object value = _getConstantValue("2 * 3");
+    var value = _getConstantValue("2 * 3");
     expect(value, 6);
   }
 
@@ -209,53 +209,53 @@
 
   @failingTest
   void test_constructor() {
-    Object value = _getConstantValue("?");
+    var value = _getConstantValue("?");
     expect(value, null);
   }
 
   @failingTest
   void test_identifier_class() {
-    Object value = _getConstantValue("?");
+    var value = _getConstantValue("?");
     expect(value, null);
   }
 
   @failingTest
   void test_identifier_function() {
-    Object value = _getConstantValue("?");
+    var value = _getConstantValue("?");
     expect(value, null);
   }
 
   @failingTest
   void test_identifier_static() {
-    Object value = _getConstantValue("?");
+    var value = _getConstantValue("?");
     expect(value, null);
   }
 
   @failingTest
   void test_identifier_staticMethod() {
-    Object value = _getConstantValue("?");
+    var value = _getConstantValue("?");
     expect(value, null);
   }
 
   @failingTest
   void test_identifier_topLevel() {
-    Object value = _getConstantValue("?");
+    var value = _getConstantValue("?");
     expect(value, null);
   }
 
   @failingTest
   void test_identifier_typeParameter() {
-    Object value = _getConstantValue("?");
+    var value = _getConstantValue("?");
     expect(value, null);
   }
 
   void test_literal_boolean_false() {
-    Object value = _getConstantValue("false");
+    var value = _getConstantValue("false");
     expect(value, false);
   }
 
   void test_literal_boolean_true() {
-    Object value = _getConstantValue("true");
+    var value = _getConstantValue("true");
     expect(value, true);
   }
 
@@ -277,42 +277,42 @@
   }
 
   void test_literal_null() {
-    Object value = _getConstantValue("null");
+    var value = _getConstantValue("null");
     expect(value, null);
   }
 
   void test_literal_number_double() {
-    Object value = _getConstantValue("3.45");
+    var value = _getConstantValue("3.45");
     expect(value, 3.45);
   }
 
   void test_literal_number_integer() {
-    Object value = _getConstantValue("42");
+    var value = _getConstantValue("42");
     expect(value, 42);
   }
 
   void test_literal_string_adjacent() {
-    Object value = _getConstantValue("'abc' 'def'");
+    var value = _getConstantValue("'abc' 'def'");
     expect(value, "abcdef");
   }
 
   void test_literal_string_interpolation_invalid() {
-    Object value = _getConstantValue("'a\${f()}c'");
+    var value = _getConstantValue("'a\${f()}c'");
     expect(value, ConstantEvaluator.NOT_A_CONSTANT);
   }
 
   void test_literal_string_interpolation_valid() {
-    Object value = _getConstantValue("'a\${3}c'");
+    var value = _getConstantValue("'a\${3}c'");
     expect(value, "a3c");
   }
 
   void test_literal_string_simple() {
-    Object value = _getConstantValue("'abc'");
+    var value = _getConstantValue("'abc'");
     expect(value, "abc");
   }
 
   void test_parenthesizedExpression() {
-    Object value = _getConstantValue("('a')");
+    var value = _getConstantValue("('a')");
     expect(value, "a");
   }
 
@@ -322,21 +322,21 @@
   }
 
   void test_unary_logicalNot() {
-    Object value = _getConstantValue("!true");
+    var value = _getConstantValue("!true");
     expect(value, false);
   }
 
   void test_unary_negated_double() {
-    Object value = _getConstantValue("-42.3");
+    var value = _getConstantValue("-42.3");
     expect(value, -42.3);
   }
 
   void test_unary_negated_integer() {
-    Object value = _getConstantValue("-42");
+    var value = _getConstantValue("-42");
     expect(value, -42);
   }
 
-  Object _getConstantValue(String expressionCode) {
+  Object? _getConstantValue(String expressionCode) {
     var path = convertPath('/test/lib/test.dart');
 
     newFile(path, content: '''
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 1f5e0cb..b6f51e2 100644
--- a/pkg/analyzer/test/src/dart/ast/element_locator_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/element_locator_test.dart
@@ -46,8 +46,7 @@
   test_locate_CompilationUnit() async {
     await resolveTestCode('// only comment');
 
-    var unitElement = result.unit.declaredElement;
-    expect(unitElement, isNotNull);
+    var unitElement = result.unit!.declaredElement!;
 
     var element = ElementLocator.locate(result.unit);
     expect(element, same(unitElement));
diff --git a/pkg/analyzer/test/src/dart/ast/parse_base.dart b/pkg/analyzer/test/src/dart/ast/parse_base.dart
index eb662b2..4e8f64e 100644
--- a/pkg/analyzer/test/src/dart/ast/parse_base.dart
+++ b/pkg/analyzer/test/src/dart/ast/parse_base.dart
@@ -49,7 +49,7 @@
     return ParseResult(
       path,
       content,
-      unit.lineInfo,
+      unit.lineInfo!,
       unit,
       errorListener.errors,
     );
diff --git a/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart b/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart
index 2898bae..4251d35 100644
--- a/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart
@@ -9,6 +9,7 @@
 import 'package:analyzer/src/dart/ast/to_source_visitor.dart';
 import 'package:analyzer/src/generated/testing/ast_test_factory.dart';
 import 'package:analyzer/src/generated/testing/token_factory.dart';
+import 'package:analyzer/src/summary2/ast_binary_tokens.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -555,7 +556,7 @@
             AstTestFactory.identifier3("C"),
             null,
             AstTestFactory.formalParameterList(),
-            null,
+            [],
             AstTestFactory.blockFunctionBody2()));
   }
 
@@ -563,7 +564,7 @@
     _assertSource(
         "external C();",
         AstTestFactory.constructorDeclaration(AstTestFactory.identifier3("C"),
-            null, AstTestFactory.formalParameterList(), null));
+            null, AstTestFactory.formalParameterList(), []));
   }
 
   void test_visitConstructorDeclaration_minimal() {
@@ -575,7 +576,7 @@
             AstTestFactory.identifier3("C"),
             null,
             AstTestFactory.formalParameterList(),
-            null,
+            [],
             AstTestFactory.blockFunctionBody2()));
   }
 
@@ -609,7 +610,7 @@
               AstTestFactory.simpleFormalParameter(Keyword.VAR, "a"),
               AstTestFactory.simpleFormalParameter(Keyword.VAR, "b")
             ]),
-            null,
+            [],
             AstTestFactory.blockFunctionBody2()));
   }
 
@@ -622,7 +623,7 @@
             AstTestFactory.identifier3("C"),
             "m",
             AstTestFactory.formalParameterList(),
-            null,
+            [],
             AstTestFactory.blockFunctionBody2()));
   }
 
@@ -649,7 +650,7 @@
         AstTestFactory.identifier3("C"),
         null,
         AstTestFactory.formalParameterList(),
-        null,
+        [],
         AstTestFactory.blockFunctionBody2());
     declaration.metadata.add(
         AstTestFactory.annotation(AstTestFactory.identifier3("deprecated")));
@@ -999,6 +1000,7 @@
         'var e in l',
         astFactory.forEachPartsWithDeclaration(
             loopVariable: AstTestFactory.declaredIdentifier3('e'),
+            inKeyword: Tokens.IN,
             iterable: AstTestFactory.identifier3('l')));
   }
 
@@ -1007,6 +1009,7 @@
         'e in l',
         astFactory.forEachPartsWithIdentifier(
             identifier: AstTestFactory.identifier3('e'),
+            inKeyword: Tokens.IN,
             iterable: AstTestFactory.identifier3('l')));
   }
 
@@ -1051,12 +1054,17 @@
 
   void test_visitForElement() {
     _assertSource(
-        'for (e in l) 0',
-        astFactory.forElement(
-            forLoopParts: astFactory.forEachPartsWithIdentifier(
-                identifier: AstTestFactory.identifier3('e'),
-                iterable: AstTestFactory.identifier3('l')),
-            body: AstTestFactory.integer(0)));
+      'for (e in l) 0',
+      astFactory.forElement(
+          forKeyword: Tokens.FOR,
+          leftParenthesis: Tokens.OPEN_PAREN,
+          forLoopParts: astFactory.forEachPartsWithIdentifier(
+              identifier: AstTestFactory.identifier3('e'),
+              inKeyword: Tokens.IN,
+              iterable: AstTestFactory.identifier3('l')),
+          rightParenthesis: Tokens.CLOSE_PAREN,
+          body: AstTestFactory.integer(0)),
+    );
   }
 
   void test_visitFormalParameterList_empty() {
@@ -1235,7 +1243,9 @@
         astFactory.forPartsWithDeclarations(
             variables: AstTestFactory.variableDeclarationList2(
                 Keyword.VAR, [AstTestFactory.variableDeclaration('v')]),
+            leftSeparator: Tokens.SEMICOLON,
             condition: AstTestFactory.identifier3('b'),
+            rightSeparator: Tokens.SEMICOLON,
             updaters: [AstTestFactory.identifier3('u')]));
   }
 
@@ -1244,19 +1254,26 @@
         'v; b; u',
         astFactory.forPartsWithExpression(
             initialization: AstTestFactory.identifier3('v'),
+            leftSeparator: Tokens.SEMICOLON,
             condition: AstTestFactory.identifier3('b'),
+            rightSeparator: Tokens.SEMICOLON,
             updaters: [AstTestFactory.identifier3('u')]));
   }
 
   void test_visitForStatement() {
     _assertSource(
-        'for (e in l) s;',
-        astFactory.forStatement(
-            forLoopParts: astFactory.forEachPartsWithIdentifier(
-                identifier: AstTestFactory.identifier3('e'),
-                iterable: AstTestFactory.identifier3('l')),
-            body: AstTestFactory.expressionStatement(
-                AstTestFactory.identifier3('s'))));
+      'for (e in l) s;',
+      astFactory.forStatement(
+          forKeyword: Tokens.FOR,
+          leftParenthesis: Tokens.OPEN_PAREN,
+          forLoopParts: astFactory.forEachPartsWithIdentifier(
+              identifier: AstTestFactory.identifier3('e'),
+              inKeyword: Tokens.IN,
+              iterable: AstTestFactory.identifier3('l')),
+          rightParenthesis: Tokens.CLOSE_PAREN,
+          body: AstTestFactory.expressionStatement(
+              AstTestFactory.identifier3('s'))),
+    );
   }
 
   void test_visitForStatement_c() {
@@ -1463,7 +1480,7 @@
             null,
             "f",
             AstTestFactory.functionExpression3(
-                AstTestFactory.typeParameterList(['E']),
+                AstTestFactory.typeParameterList2(['E']),
                 AstTestFactory.formalParameterList(),
                 AstTestFactory.blockFunctionBody2())));
   }
@@ -1491,7 +1508,7 @@
     _assertSource(
         "<E>() {}",
         AstTestFactory.functionExpression3(
-            AstTestFactory.typeParameterList(['E']),
+            AstTestFactory.typeParameterList2(['E']),
             AstTestFactory.formalParameterList(),
             AstTestFactory.blockFunctionBody2()));
   }
@@ -1592,7 +1609,7 @@
         "int Function<T>(T)",
         AstTestFactory.genericFunctionType(
             AstTestFactory.typeName4("int"),
-            AstTestFactory.typeParameterList(['T']),
+            AstTestFactory.typeParameterList2(['T']),
             AstTestFactory.formalParameterList([
               AstTestFactory.simpleFormalParameter4(
                   AstTestFactory.typeName4("T"), null)
@@ -1604,7 +1621,7 @@
         "int Function<T>(T)?",
         AstTestFactory.genericFunctionType(
             AstTestFactory.typeName4("int"),
-            AstTestFactory.typeParameterList(['T']),
+            AstTestFactory.typeParameterList2(['T']),
             AstTestFactory.formalParameterList([
               AstTestFactory.simpleFormalParameter4(
                   AstTestFactory.typeName4("T"), null)
@@ -1617,10 +1634,10 @@
         "typedef X<S> = S Function<T>(T)",
         AstTestFactory.genericTypeAlias(
             'X',
-            AstTestFactory.typeParameterList(['S']),
+            AstTestFactory.typeParameterList2(['S']),
             AstTestFactory.genericFunctionType(
                 AstTestFactory.typeName4("S"),
-                AstTestFactory.typeParameterList(['T']),
+                AstTestFactory.typeParameterList2(['T']),
                 AstTestFactory.formalParameterList([
                   AstTestFactory.simpleFormalParameter4(
                       AstTestFactory.typeName4("T"), null)
@@ -1631,8 +1648,12 @@
     _assertSource(
         'if (b) 1 else 0',
         astFactory.ifElement(
+            ifKeyword: Tokens.IF,
+            leftParenthesis: Tokens.OPEN_PAREN,
             condition: AstTestFactory.identifier3('b'),
+            rightParenthesis: Tokens.CLOSE_PAREN,
             thenElement: AstTestFactory.integer(1),
+            elseKeyword: Tokens.ELSE,
             elseElement: AstTestFactory.integer(0)));
   }
 
@@ -1640,7 +1661,10 @@
     _assertSource(
         'if (b) 1',
         astFactory.ifElement(
+            ifKeyword: Tokens.IF,
+            leftParenthesis: Tokens.OPEN_PAREN,
             condition: AstTestFactory.identifier3('b'),
+            rightParenthesis: Tokens.CLOSE_PAREN,
             thenElement: AstTestFactory.integer(1)));
   }
 
@@ -1869,24 +1893,35 @@
         astFactory.listLiteral(
             null,
             AstTestFactory.typeArgumentList([AstTestFactory.typeName4('int')]),
-            null,
+            Tokens.OPEN_SQUARE_BRACKET,
             [
               AstTestFactory.integer(0),
               astFactory.forElement(
+                  forKeyword: Tokens.FOR,
+                  leftParenthesis: Tokens.OPEN_PAREN,
                   forLoopParts: astFactory.forEachPartsWithIdentifier(
                       identifier: AstTestFactory.identifier3('e'),
+                      inKeyword: Tokens.IN,
                       iterable: AstTestFactory.identifier3('l')),
+                  rightParenthesis: Tokens.CLOSE_PAREN,
                   body: AstTestFactory.integer(0)),
               astFactory.ifElement(
+                  ifKeyword: Tokens.IF,
+                  leftParenthesis: Tokens.OPEN_PAREN,
                   condition: AstTestFactory.identifier3('b'),
+                  rightParenthesis: Tokens.CLOSE_PAREN,
                   thenElement: AstTestFactory.integer(1)),
               astFactory.spreadElement(
                   spreadOperator: TokenFactory.tokenFromType(
                       TokenType.PERIOD_PERIOD_PERIOD),
                   expression: astFactory.listLiteral(
-                      null, null, null, [AstTestFactory.integer(0)], null))
+                      null,
+                      null,
+                      Tokens.OPEN_SQUARE_BRACKET,
+                      [AstTestFactory.integer(0)],
+                      Tokens.CLOSE_SQUARE_BRACKET))
             ],
-            null));
+            Tokens.CLOSE_SQUARE_BRACKET));
   }
 
   void test_visitListLiteral_const() {
@@ -1910,8 +1945,12 @@
   void test_visitListLiteral_withConst_withoutTypeArgs() {
     _assertSource(
         'const [0]',
-        astFactory.listLiteral(TokenFactory.tokenFromKeyword(Keyword.CONST),
-            null, null, [AstTestFactory.integer(0)], null));
+        astFactory.listLiteral(
+            TokenFactory.tokenFromKeyword(Keyword.CONST),
+            null,
+            Tokens.OPEN_SQUARE_BRACKET,
+            [AstTestFactory.integer(0)],
+            Tokens.CLOSE_SQUARE_BRACKET));
   }
 
   void test_visitListLiteral_withConst_withTypeArgs() {
@@ -1920,16 +1959,16 @@
         astFactory.listLiteral(
             TokenFactory.tokenFromKeyword(Keyword.CONST),
             AstTestFactory.typeArgumentList([AstTestFactory.typeName4('int')]),
-            null,
+            Tokens.OPEN_SQUARE_BRACKET,
             [AstTestFactory.integer(0)],
-            null));
+            Tokens.CLOSE_SQUARE_BRACKET));
   }
 
   void test_visitListLiteral_withoutConst_withoutTypeArgs() {
     _assertSource(
         '[0]',
-        astFactory.listLiteral(
-            null, null, null, [AstTestFactory.integer(0)], null));
+        astFactory.listLiteral(null, null, Tokens.OPEN_SQUARE_BRACKET,
+            [AstTestFactory.integer(0)], Tokens.CLOSE_SQUARE_BRACKET));
   }
 
   void test_visitListLiteral_withoutConst_withTypeArgs() {
@@ -1938,9 +1977,9 @@
         astFactory.listLiteral(
             null,
             AstTestFactory.typeArgumentList([AstTestFactory.typeName4('int')]),
-            null,
+            Tokens.OPEN_SQUARE_BRACKET,
             [AstTestFactory.integer(0)],
-            null));
+            Tokens.CLOSE_SQUARE_BRACKET));
   }
 
   void test_visitMapLiteral_const() {
@@ -2171,7 +2210,7 @@
     _assertSource(
         "t?.m()",
         AstTestFactory.methodInvocation(AstTestFactory.identifier3("t"), "m",
-            null, TokenType.QUESTION_PERIOD));
+            [], TokenType.QUESTION_PERIOD));
   }
 
   void test_visitMethodInvocation_noTarget() {
@@ -2324,122 +2363,192 @@
 
   void test_visitSetOrMapLiteral_map_complex() {
     _assertSource(
-        "<String, String>{'a' : 'b', for (c in d) 'e' : 'f', if (g) 'h' : 'i', ...{'j' : 'k'}}",
-        astFactory.setOrMapLiteral(
-            typeArguments: AstTestFactory.typeArgumentList([
-              AstTestFactory.typeName4('String'),
-              AstTestFactory.typeName4('String')
-            ]),
-            elements: [
-              AstTestFactory.mapLiteralEntry3('a', 'b'),
-              astFactory.forElement(
-                  forLoopParts: astFactory.forEachPartsWithIdentifier(
-                      identifier: AstTestFactory.identifier3('c'),
-                      iterable: AstTestFactory.identifier3('d')),
-                  body: AstTestFactory.mapLiteralEntry3('e', 'f')),
-              astFactory.ifElement(
-                  condition: AstTestFactory.identifier3('g'),
-                  thenElement: AstTestFactory.mapLiteralEntry3('h', 'i')),
-              astFactory.spreadElement(
-                  spreadOperator: TokenFactory.tokenFromType(
-                      TokenType.PERIOD_PERIOD_PERIOD),
-                  expression: astFactory.setOrMapLiteral(
-                      elements: [AstTestFactory.mapLiteralEntry3('j', 'k')]))
-            ]));
+      "<String, String>{'a' : 'b', for (c in d) 'e' : 'f', if (g) 'h' : 'i', ...{'j' : 'k'}}",
+      astFactory.setOrMapLiteral(
+        leftBracket: Tokens.OPEN_CURLY_BRACKET,
+        typeArguments: AstTestFactory.typeArgumentList([
+          AstTestFactory.typeName4('String'),
+          AstTestFactory.typeName4('String')
+        ]),
+        elements: [
+          AstTestFactory.mapLiteralEntry3('a', 'b'),
+          astFactory.forElement(
+              forKeyword: Tokens.FOR,
+              leftParenthesis: Tokens.OPEN_PAREN,
+              forLoopParts: astFactory.forEachPartsWithIdentifier(
+                identifier: AstTestFactory.identifier3('c'),
+                inKeyword: Tokens.IN,
+                iterable: AstTestFactory.identifier3('d'),
+              ),
+              rightParenthesis: Tokens.CLOSE_PAREN,
+              body: AstTestFactory.mapLiteralEntry3('e', 'f')),
+          astFactory.ifElement(
+            ifKeyword: Tokens.IF,
+            leftParenthesis: Tokens.OPEN_PAREN,
+            condition: AstTestFactory.identifier3('g'),
+            rightParenthesis: Tokens.CLOSE_PAREN,
+            thenElement: AstTestFactory.mapLiteralEntry3('h', 'i'),
+          ),
+          astFactory.spreadElement(
+            spreadOperator:
+                TokenFactory.tokenFromType(TokenType.PERIOD_PERIOD_PERIOD),
+            expression: astFactory.setOrMapLiteral(
+              leftBracket: Tokens.OPEN_CURLY_BRACKET,
+              elements: [AstTestFactory.mapLiteralEntry3('j', 'k')],
+              rightBracket: Tokens.CLOSE_CURLY_BRACKET,
+            ),
+          )
+        ],
+        rightBracket: Tokens.CLOSE_CURLY_BRACKET,
+      ),
+    );
   }
 
   void test_visitSetOrMapLiteral_map_withConst_withoutTypeArgs() {
     _assertSource(
-        "const {'a' : 'b'}",
-        astFactory.setOrMapLiteral(
-            constKeyword: TokenFactory.tokenFromKeyword(Keyword.CONST),
-            elements: [AstTestFactory.mapLiteralEntry3('a', 'b')]));
+      "const {'a' : 'b'}",
+      astFactory.setOrMapLiteral(
+        leftBracket: Tokens.OPEN_CURLY_BRACKET,
+        constKeyword: TokenFactory.tokenFromKeyword(Keyword.CONST),
+        elements: [AstTestFactory.mapLiteralEntry3('a', 'b')],
+        rightBracket: Tokens.CLOSE_CURLY_BRACKET,
+      ),
+    );
   }
 
   void test_visitSetOrMapLiteral_map_withConst_withTypeArgs() {
     _assertSource(
-        "const <String, String>{'a' : 'b'}",
-        astFactory.setOrMapLiteral(
-            constKeyword: TokenFactory.tokenFromKeyword(Keyword.CONST),
-            typeArguments: AstTestFactory.typeArgumentList([
-              AstTestFactory.typeName4('String'),
-              AstTestFactory.typeName4('String')
-            ]),
-            elements: [AstTestFactory.mapLiteralEntry3('a', 'b')]));
+      "const <String, String>{'a' : 'b'}",
+      astFactory.setOrMapLiteral(
+        constKeyword: TokenFactory.tokenFromKeyword(Keyword.CONST),
+        typeArguments: AstTestFactory.typeArgumentList([
+          AstTestFactory.typeName4('String'),
+          AstTestFactory.typeName4('String')
+        ]),
+        leftBracket: Tokens.OPEN_CURLY_BRACKET,
+        elements: [AstTestFactory.mapLiteralEntry3('a', 'b')],
+        rightBracket: Tokens.CLOSE_CURLY_BRACKET,
+      ),
+    );
   }
 
   void test_visitSetOrMapLiteral_map_withoutConst_withoutTypeArgs() {
     _assertSource(
-        "{'a' : 'b'}",
-        astFactory.setOrMapLiteral(
-            elements: [AstTestFactory.mapLiteralEntry3('a', 'b')]));
+      "{'a' : 'b'}",
+      astFactory.setOrMapLiteral(
+        leftBracket: Tokens.OPEN_CURLY_BRACKET,
+        elements: [AstTestFactory.mapLiteralEntry3('a', 'b')],
+        rightBracket: Tokens.CLOSE_CURLY_BRACKET,
+      ),
+    );
   }
 
   void test_visitSetOrMapLiteral_map_withoutConst_withTypeArgs() {
     _assertSource(
-        "<String, String>{'a' : 'b'}",
-        astFactory.setOrMapLiteral(
-            typeArguments: AstTestFactory.typeArgumentList([
-              AstTestFactory.typeName4('String'),
-              AstTestFactory.typeName4('String')
-            ]),
-            elements: [AstTestFactory.mapLiteralEntry3('a', 'b')]));
+      "<String, String>{'a' : 'b'}",
+      astFactory.setOrMapLiteral(
+        typeArguments: AstTestFactory.typeArgumentList([
+          AstTestFactory.typeName4('String'),
+          AstTestFactory.typeName4('String')
+        ]),
+        leftBracket: Tokens.OPEN_CURLY_BRACKET,
+        elements: [AstTestFactory.mapLiteralEntry3('a', 'b')],
+        rightBracket: Tokens.CLOSE_CURLY_BRACKET,
+      ),
+    );
   }
 
   void test_visitSetOrMapLiteral_set_complex() {
     _assertSource(
-        '<int>{0, for (e in l) 0, if (b) 1, ...[0]}',
-        astFactory.setOrMapLiteral(
-            typeArguments: AstTestFactory.typeArgumentList(
-                [AstTestFactory.typeName4('int')]),
-            elements: [
-              AstTestFactory.integer(0),
-              astFactory.forElement(
-                  forLoopParts: astFactory.forEachPartsWithIdentifier(
-                      identifier: AstTestFactory.identifier3('e'),
-                      iterable: AstTestFactory.identifier3('l')),
-                  body: AstTestFactory.integer(0)),
-              astFactory.ifElement(
-                  condition: AstTestFactory.identifier3('b'),
-                  thenElement: AstTestFactory.integer(1)),
-              astFactory.spreadElement(
-                  spreadOperator: TokenFactory.tokenFromType(
-                      TokenType.PERIOD_PERIOD_PERIOD),
-                  expression: astFactory.listLiteral(
-                      null, null, null, [AstTestFactory.integer(0)], null))
-            ]));
+      '<int>{0, for (e in l) 0, if (b) 1, ...[0]}',
+      astFactory.setOrMapLiteral(
+        typeArguments:
+            AstTestFactory.typeArgumentList([AstTestFactory.typeName4('int')]),
+        leftBracket: Tokens.OPEN_CURLY_BRACKET,
+        elements: [
+          AstTestFactory.integer(0),
+          astFactory.forElement(
+              forKeyword: Tokens.FOR,
+              leftParenthesis: Tokens.OPEN_PAREN,
+              forLoopParts: astFactory.forEachPartsWithIdentifier(
+                identifier: AstTestFactory.identifier3('e'),
+                inKeyword: Tokens.IN,
+                iterable: AstTestFactory.identifier3('l'),
+              ),
+              rightParenthesis: Tokens.CLOSE_PAREN,
+              body: AstTestFactory.integer(0)),
+          astFactory.ifElement(
+            ifKeyword: Tokens.IF,
+            leftParenthesis: Tokens.OPEN_PAREN,
+            condition: AstTestFactory.identifier3('b'),
+            rightParenthesis: Tokens.CLOSE_PAREN,
+            thenElement: AstTestFactory.integer(1),
+          ),
+          astFactory.spreadElement(
+            spreadOperator:
+                TokenFactory.tokenFromType(TokenType.PERIOD_PERIOD_PERIOD),
+            expression: astFactory.listLiteral(
+              null,
+              null,
+              Tokens.OPEN_SQUARE_BRACKET,
+              [AstTestFactory.integer(0)],
+              Tokens.CLOSE_SQUARE_BRACKET,
+            ),
+          )
+        ],
+        rightBracket: Tokens.CLOSE_CURLY_BRACKET,
+      ),
+    );
   }
 
   void test_visitSetOrMapLiteral_set_withConst_withoutTypeArgs() {
     _assertSource(
-        'const {0}',
-        astFactory.setOrMapLiteral(
-            constKeyword: TokenFactory.tokenFromKeyword(Keyword.CONST),
-            elements: [AstTestFactory.integer(0)]));
+      'const {0}',
+      astFactory.setOrMapLiteral(
+        constKeyword: TokenFactory.tokenFromKeyword(Keyword.CONST),
+        leftBracket: Tokens.OPEN_CURLY_BRACKET,
+        elements: [AstTestFactory.integer(0)],
+        rightBracket: Tokens.CLOSE_CURLY_BRACKET,
+      ),
+    );
   }
 
   void test_visitSetOrMapLiteral_set_withConst_withTypeArgs() {
     _assertSource(
-        'const <int>{0}',
-        astFactory.setOrMapLiteral(
-            constKeyword: TokenFactory.tokenFromKeyword(Keyword.CONST),
-            typeArguments: AstTestFactory.typeArgumentList(
-                [AstTestFactory.typeName4('int')]),
-            elements: [AstTestFactory.integer(0)]));
+      'const <int>{0}',
+      astFactory.setOrMapLiteral(
+        constKeyword: TokenFactory.tokenFromKeyword(Keyword.CONST),
+        typeArguments:
+            AstTestFactory.typeArgumentList([AstTestFactory.typeName4('int')]),
+        leftBracket: Tokens.OPEN_CURLY_BRACKET,
+        elements: [AstTestFactory.integer(0)],
+        rightBracket: Tokens.CLOSE_CURLY_BRACKET,
+      ),
+    );
   }
 
   void test_visitSetOrMapLiteral_set_withoutConst_withoutTypeArgs() {
-    _assertSource('{0}',
-        astFactory.setOrMapLiteral(elements: [AstTestFactory.integer(0)]));
+    _assertSource(
+      '{0}',
+      astFactory.setOrMapLiteral(
+        leftBracket: Tokens.OPEN_CURLY_BRACKET,
+        elements: [AstTestFactory.integer(0)],
+        rightBracket: Tokens.CLOSE_CURLY_BRACKET,
+      ),
+    );
   }
 
   void test_visitSetOrMapLiteral_set_withoutConst_withTypeArgs() {
     _assertSource(
-        '<int>{0}',
-        astFactory.setOrMapLiteral(
-            typeArguments: AstTestFactory.typeArgumentList(
-                [AstTestFactory.typeName4('int')]),
-            elements: [AstTestFactory.integer(0)]));
+      '<int>{0}',
+      astFactory.setOrMapLiteral(
+        typeArguments:
+            AstTestFactory.typeArgumentList([AstTestFactory.typeName4('int')]),
+        leftBracket: Tokens.OPEN_CURLY_BRACKET,
+        elements: [AstTestFactory.integer(0)],
+        rightBracket: Tokens.CLOSE_CURLY_BRACKET,
+      ),
+    );
   }
 
   void test_visitSimpleFormalParameter_annotation() {
@@ -2492,7 +2601,11 @@
             spreadOperator:
                 TokenFactory.tokenFromType(TokenType.PERIOD_PERIOD_PERIOD),
             expression: astFactory.listLiteral(
-                null, null, null, [AstTestFactory.integer(0)], null)));
+                null,
+                null,
+                Tokens.OPEN_SQUARE_BRACKET,
+                [AstTestFactory.integer(0)],
+                Tokens.CLOSE_SQUARE_BRACKET)));
   }
 
   @failingTest
@@ -2505,7 +2618,11 @@
             spreadOperator:
                 TokenFactory.tokenFromType(TokenType.PERIOD_PERIOD_PERIOD),
             expression: astFactory.listLiteral(
-                null, null, null, [AstTestFactory.integer(0)], null)));
+                null,
+                null,
+                Tokens.OPEN_SQUARE_BRACKET,
+                [AstTestFactory.integer(0)],
+                Tokens.CLOSE_SQUARE_BRACKET)));
   }
 
   void test_visitStringInterpolation() {
@@ -2674,13 +2791,13 @@
   void test_visitTypeArgumentList_multiple() {
     _assertSource(
         "<E, F>",
-        AstTestFactory.typeArgumentList(
+        AstTestFactory.typeArgumentList2(
             [AstTestFactory.typeName4("E"), AstTestFactory.typeName4("F")]));
   }
 
   void test_visitTypeArgumentList_single() {
     _assertSource("<E>",
-        AstTestFactory.typeArgumentList([AstTestFactory.typeName4("E")]));
+        AstTestFactory.typeArgumentList2([AstTestFactory.typeName4("E")]));
   }
 
   void test_visitTypeName_multipleArgs() {
@@ -2745,11 +2862,11 @@
   }
 
   void test_visitTypeParameterList_multiple() {
-    _assertSource("<E, F>", AstTestFactory.typeParameterList(["E", "F"]));
+    _assertSource("<E, F>", AstTestFactory.typeParameterList2(["E", "F"]));
   }
 
   void test_visitTypeParameterList_single() {
-    _assertSource("<E>", AstTestFactory.typeParameterList(["E"]));
+    _assertSource("<E>", AstTestFactory.typeParameterList2(["E"]));
   }
 
   void test_visitVariableDeclaration_initialized() {
diff --git a/pkg/analyzer/test/src/dart/ast/utilities_test.dart b/pkg/analyzer/test/src/dart/ast/utilities_test.dart
index b274c98..acca07b 100644
--- a/pkg/analyzer/test/src/dart/ast/utilities_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/utilities_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/analysis/features.dart';
+import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/standard_ast_factory.dart';
 import 'package:analyzer/dart/ast/token.dart';
@@ -12,6 +13,7 @@
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/testing/ast_test_factory.dart';
 import 'package:analyzer/src/generated/testing/element_factory.dart';
 import 'package:analyzer/src/generated/testing/test_type_provider.dart';
@@ -99,7 +101,7 @@
 class A {}
 class B {}''');
     NodeLocator locator = NodeLocator(1024, 1024);
-    AstNode node = locator.searchWithin(unit.declarations[0]);
+    var node = locator.searchWithin(unit.declarations[0]);
     expect(node, isNull);
   }
 
@@ -108,7 +110,7 @@
 class A {}
 class B {}''');
     NodeLocator locator = NodeLocator(0, 0);
-    AstNode node = locator.searchWithin(unit.declarations[1]);
+    var node = locator.searchWithin(unit.declarations[1]);
     expect(node, isNull);
   }
 
@@ -118,8 +120,7 @@
     int end,
   ) {
     NodeLocator locator = NodeLocator(start, end);
-    AstNode node = locator.searchWithin(unit);
-    expect(node, isNotNull);
+    var node = locator.searchWithin(unit)!;
     expect(locator.foundNode, same(node));
     expect(node.offset <= start, isTrue, reason: "Node starts after range");
     expect(node.offset + node.length > end, isTrue,
@@ -158,8 +159,14 @@
 
   void test_visitAdjacentStrings() {
     AdjacentStrings createNode() => astFactory.adjacentStrings([
-          astFactory.simpleStringLiteral(null, 'hello'),
-          astFactory.simpleStringLiteral(null, 'world')
+          astFactory.simpleStringLiteral(
+            TokenFactory.tokenFromString('hello'),
+            'hello',
+          ),
+          astFactory.simpleStringLiteral(
+            TokenFactory.tokenFromString('world'),
+            'world',
+          )
         ]);
 
     AdjacentStrings fromNode = createNode();
@@ -280,16 +287,14 @@
     var fromNode = AstTestFactory.constructorDeclaration(
         AstTestFactory.identifier3(className),
         constructorName,
-        AstTestFactory.formalParameterList(),
-        null) as ConstructorDeclarationImpl;
+        AstTestFactory.formalParameterList(), []) as ConstructorDeclarationImpl;
     ConstructorElement element = ElementFactory.constructorElement2(
         ElementFactory.classElement2(className), constructorName);
     fromNode.declaredElement = element;
     ConstructorDeclaration toNode = AstTestFactory.constructorDeclaration(
         AstTestFactory.identifier3(className),
         constructorName,
-        AstTestFactory.formalParameterList(),
-        null);
+        AstTestFactory.formalParameterList(), []);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
     expect(toNode.declaredElement, same(element));
   }
@@ -368,6 +373,7 @@
     ForEachPartsWithDeclaration createNode() =>
         astFactory.forEachPartsWithDeclaration(
             loopVariable: AstTestFactory.declaredIdentifier3('a'),
+            inKeyword: TokenFactory.tokenFromKeyword(Keyword.IN),
             iterable: AstTestFactory.identifier3('b'));
 
     DartType typeB = interfaceTypeStar(ElementFactory.classElement2('B'));
@@ -384,6 +390,7 @@
     ForEachPartsWithIdentifier createNode() =>
         astFactory.forEachPartsWithIdentifier(
             identifier: AstTestFactory.identifier3('a'),
+            inKeyword: TokenFactory.tokenFromKeyword(Keyword.IN),
             iterable: AstTestFactory.identifier3('b'));
 
     DartType typeA = interfaceTypeStar(ElementFactory.classElement2('A'));
@@ -401,9 +408,13 @@
 
   void test_visitForElement() {
     ForElement createNode() => astFactory.forElement(
+        forKeyword: TokenFactory.tokenFromKeyword(Keyword.FOR),
+        leftParenthesis: TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
         forLoopParts: astFactory.forEachPartsWithIdentifier(
             identifier: AstTestFactory.identifier3('a'),
+            inKeyword: TokenFactory.tokenFromKeyword(Keyword.IN),
             iterable: AstTestFactory.identifier3('b')),
+        rightParenthesis: TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
         body: AstTestFactory.identifier3('c'));
 
     DartType typeC = interfaceTypeStar(ElementFactory.classElement2('C'));
@@ -421,7 +432,9 @@
         astFactory.forPartsWithDeclarations(
             variables: AstTestFactory.variableDeclarationList2(
                 Keyword.VAR, [AstTestFactory.variableDeclaration('a')]),
+            leftSeparator: TokenFactory.tokenFromType(TokenType.SEMICOLON),
             condition: AstTestFactory.identifier3('b'),
+            rightSeparator: TokenFactory.tokenFromType(TokenType.SEMICOLON),
             updaters: [AstTestFactory.identifier3('c')]);
 
     DartType typeB = interfaceTypeStar(ElementFactory.classElement2('B'));
@@ -440,7 +453,9 @@
   void test_visitForPartsWithExpression() {
     ForPartsWithExpression createNode() => astFactory.forPartsWithExpression(
         initialization: AstTestFactory.identifier3('a'),
+        leftSeparator: TokenFactory.tokenFromType(TokenType.SEMICOLON),
         condition: AstTestFactory.identifier3('b'),
+        rightSeparator: TokenFactory.tokenFromType(TokenType.SEMICOLON),
         updaters: [AstTestFactory.identifier3('c')]);
 
     DartType typeA = interfaceTypeStar(ElementFactory.classElement2('A'));
@@ -461,9 +476,13 @@
 
   void test_visitForStatement() {
     ForStatement createNode() => astFactory.forStatement(
+        forKeyword: TokenFactory.tokenFromKeyword(Keyword.FOR),
+        leftParenthesis: TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
         forLoopParts: astFactory.forEachPartsWithIdentifier(
             identifier: AstTestFactory.identifier3('a'),
+            inKeyword: TokenFactory.tokenFromKeyword(Keyword.IN),
             iterable: AstTestFactory.identifier3('b')),
+        rightParenthesis: TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
         body: AstTestFactory.expressionStatement(
             AstTestFactory.identifier3('c')));
 
@@ -530,7 +549,10 @@
 
   void test_visitIfElement() {
     IfElement createNode() => astFactory.ifElement(
+        ifKeyword: TokenFactory.tokenFromKeyword(Keyword.IF),
+        leftParenthesis: TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
         condition: AstTestFactory.identifier3('a'),
+        rightParenthesis: TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
         thenElement: AstTestFactory.identifier3('b'),
         elseElement: AstTestFactory.identifier3('c'));
 
@@ -629,24 +651,25 @@
 
   void test_visitListLiteral() {
     ListLiteral createNode() => astFactory.listLiteral(
-        null,
-        AstTestFactory.typeArgumentList([AstTestFactory.typeName4('A')]),
-        null,
-        [AstTestFactory.identifier3('b')],
-        null);
+          null,
+          AstTestFactory.typeArgumentList([AstTestFactory.typeName4('A')]),
+          TokenFactory.tokenFromType(TokenType.OPEN_SQUARE_BRACKET),
+          [AstTestFactory.identifier3('b')],
+          TokenFactory.tokenFromType(TokenType.CLOSE_SQUARE_BRACKET),
+        );
 
     DartType typeA = interfaceTypeStar(ElementFactory.classElement2('A'));
     DartType typeB = interfaceTypeStar(ElementFactory.classElement2('B'));
     DartType typeC = interfaceTypeStar(ElementFactory.classElement2('C'));
 
     ListLiteral fromNode = createNode();
-    (fromNode.typeArguments.arguments[0] as TypeName).type = typeA;
+    (fromNode.typeArguments!.arguments[0] as TypeName).type = typeA;
     (fromNode.elements[0] as SimpleIdentifier).staticType = typeB;
     fromNode.staticType = typeC;
 
     ListLiteral toNode = createNode();
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    expect((toNode.typeArguments.arguments[0] as TypeName).type, same(typeA));
+    expect((toNode.typeArguments!.arguments[0] as TypeName).type, same(typeA));
     expect((toNode.elements[0] as SimpleIdentifier).staticType, same(typeB));
     expect(fromNode.staticType, same(typeC));
   }
@@ -705,7 +728,12 @@
   void test_visitPartDirective() {
     PartDirective fromNode = AstTestFactory.partDirective2("part.dart");
     LibraryElement element = LibraryElementImpl(
-        null, null, 'lib', -1, 0, FeatureSet.latestLanguageVersion());
+        _AnalysisContextMock(),
+        _AnalysisSessionMock(),
+        'lib',
+        -1,
+        0,
+        FeatureSet.latestLanguageVersion());
     fromNode.element = element;
     PartDirective toNode = AstTestFactory.partDirective2("part.dart");
     ResolutionCopier.copyResolutionData(fromNode, toNode);
@@ -716,7 +744,12 @@
     PartOfDirective fromNode = AstTestFactory.partOfDirective(
         AstTestFactory.libraryIdentifier2(["lib"]));
     LibraryElement element = LibraryElementImpl(
-        null, null, 'lib', -1, 0, FeatureSet.latestLanguageVersion());
+        _AnalysisContextMock(),
+        _AnalysisSessionMock(),
+        'lib',
+        -1,
+        0,
+        FeatureSet.latestLanguageVersion());
     fromNode.element = element;
     PartOfDirective toNode = AstTestFactory.partOfDirective(
         AstTestFactory.libraryIdentifier2(["lib"]));
@@ -798,9 +831,13 @@
 
   void test_visitSetOrMapLiteral_map() {
     SetOrMapLiteral createNode() => astFactory.setOrMapLiteral(
-        typeArguments: AstTestFactory.typeArgumentList(
-            [AstTestFactory.typeName4('A'), AstTestFactory.typeName4('B')]),
-        elements: [AstTestFactory.mapLiteralEntry3('c', 'd')]);
+          typeArguments: AstTestFactory.typeArgumentList(
+              [AstTestFactory.typeName4('A'), AstTestFactory.typeName4('B')]),
+          leftBracket: TokenFactory.tokenFromType(TokenType.OPEN_CURLY_BRACKET),
+          elements: [AstTestFactory.mapLiteralEntry3('c', 'd')],
+          rightBracket:
+              TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET),
+        );
 
     DartType typeA = interfaceTypeStar(ElementFactory.classElement2('A'));
     DartType typeB = interfaceTypeStar(ElementFactory.classElement2('B'));
@@ -808,16 +845,16 @@
     DartType typeD = interfaceTypeStar(ElementFactory.classElement2('D'));
 
     SetOrMapLiteral fromNode = createNode();
-    (fromNode.typeArguments.arguments[0] as TypeName).type = typeA;
-    (fromNode.typeArguments.arguments[1] as TypeName).type = typeB;
+    (fromNode.typeArguments!.arguments[0] as TypeName).type = typeA;
+    (fromNode.typeArguments!.arguments[1] as TypeName).type = typeB;
     MapLiteralEntry fromEntry = fromNode.elements[0] as MapLiteralEntry;
     (fromEntry.key as SimpleStringLiteral).staticType = typeC;
     (fromEntry.value as SimpleStringLiteral).staticType = typeD;
 
     SetOrMapLiteral toNode = createNode();
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    expect((toNode.typeArguments.arguments[0] as TypeName).type, same(typeA));
-    expect((toNode.typeArguments.arguments[1] as TypeName).type, same(typeB));
+    expect((toNode.typeArguments!.arguments[0] as TypeName).type, same(typeA));
+    expect((toNode.typeArguments!.arguments[1] as TypeName).type, same(typeB));
     MapLiteralEntry toEntry = fromNode.elements[0] as MapLiteralEntry;
     expect((toEntry.key as SimpleStringLiteral).staticType, same(typeC));
     expect((toEntry.value as SimpleStringLiteral).staticType, same(typeD));
@@ -825,20 +862,24 @@
 
   void test_visitSetOrMapLiteral_set() {
     SetOrMapLiteral createNode() => astFactory.setOrMapLiteral(
-        typeArguments:
-            AstTestFactory.typeArgumentList([AstTestFactory.typeName4('A')]),
-        elements: [AstTestFactory.identifier3('b')]);
+          typeArguments:
+              AstTestFactory.typeArgumentList([AstTestFactory.typeName4('A')]),
+          leftBracket: TokenFactory.tokenFromType(TokenType.OPEN_CURLY_BRACKET),
+          elements: [AstTestFactory.identifier3('b')],
+          rightBracket:
+              TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET),
+        );
 
     DartType typeA = interfaceTypeStar(ElementFactory.classElement2('A'));
     DartType typeB = interfaceTypeStar(ElementFactory.classElement2('B'));
 
     SetOrMapLiteral fromNode = createNode();
-    (fromNode.typeArguments.arguments[0] as TypeName).type = typeA;
+    (fromNode.typeArguments!.arguments[0] as TypeName).type = typeA;
     (fromNode.elements[0] as SimpleIdentifier).staticType = typeB;
 
     SetOrMapLiteral toNode = createNode();
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    expect((toNode.typeArguments.arguments[0] as TypeName).type, same(typeA));
+    expect((toNode.typeArguments!.arguments[0] as TypeName).type, same(typeA));
     expect((toNode.elements[0] as SimpleIdentifier).staticType, same(typeB));
   }
 
@@ -869,7 +910,11 @@
         spreadOperator:
             TokenFactory.tokenFromType(TokenType.PERIOD_PERIOD_PERIOD),
         expression: astFactory.listLiteral(
-            null, null, null, [AstTestFactory.identifier3('a')], null));
+            null,
+            null,
+            TokenFactory.tokenFromType(TokenType.OPEN_SQUARE_BRACKET),
+            [AstTestFactory.identifier3('a')],
+            TokenFactory.tokenFromType(TokenType.CLOSE_SQUARE_BRACKET)));
 
     DartType typeA = interfaceTypeStar(ElementFactory.classElement2('A'));
 
@@ -936,10 +981,14 @@
   }
 
   void test_visitThrowExpression() {
-    ThrowExpression fromNode = AstTestFactory.throwExpression();
+    ThrowExpression fromNode = AstTestFactory.throwExpression2(
+      AstTestFactory.integer(0),
+    );
     DartType staticType = interfaceTypeStar(ElementFactory.classElement2('C'));
     fromNode.staticType = staticType;
-    ThrowExpression toNode = AstTestFactory.throwExpression();
+    ThrowExpression toNode = AstTestFactory.throwExpression2(
+      AstTestFactory.integer(0),
+    );
     ResolutionCopier.copyResolutionData(fromNode, toNode);
     expect(toNode.staticType, same(staticType));
   }
@@ -965,14 +1014,22 @@
     ResolutionCopier.copyResolutionData(fromNode, toNode);
     expect(toNode.staticType, same(staticType));
     expect(toNode.staticInvokeType, same(staticInvokeType));
-    List<TypeAnnotation> fromTypeArguments = toNode.typeArguments.arguments;
-    List<TypeAnnotation> toTypeArguments = fromNode.typeArguments.arguments;
-    if (fromTypeArguments != null) {
-      for (int i = 0; i < fromTypeArguments.length; i++) {
-        TypeAnnotation toArgument = fromTypeArguments[i];
-        TypeAnnotation fromArgument = toTypeArguments[i];
-        expect(toArgument.type, same(fromArgument.type));
-      }
+    List<TypeAnnotation> fromTypeArguments = toNode.typeArguments!.arguments;
+    List<TypeAnnotation> toTypeArguments = fromNode.typeArguments!.arguments;
+    for (int i = 0; i < fromTypeArguments.length; i++) {
+      TypeAnnotation toArgument = fromTypeArguments[i];
+      TypeAnnotation fromArgument = toTypeArguments[i];
+      expect(toArgument.type, same(fromArgument.type));
     }
   }
 }
+
+class _AnalysisContextMock implements AnalysisContext {
+  @override
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+class _AnalysisSessionMock implements AnalysisSession {
+  @override
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
diff --git a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
index 30e51fb..4cfa035 100644
--- a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
+++ b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
@@ -6,6 +6,7 @@
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/constant.dart';
 import 'package:test/test.dart';
@@ -34,7 +35,7 @@
 ''');
     DartObjectImpl result = _evaluateConstant('c');
     expect(result.type, typeProvider.listType2(typeProvider.intType));
-    expect(result.toListValue().map((e) => e.toIntValue()), [1, 3, 4]);
+    expect(result.toListValue()!.map((e) => e.toIntValue()), [1, 3, 4]);
   }
 
   test_listLiteral_ifElement_false_withoutElse() async {
@@ -43,7 +44,7 @@
 ''');
     DartObjectImpl result = _evaluateConstant('c');
     expect(result.type, typeProvider.listType2(typeProvider.intType));
-    expect(result.toListValue().map((e) => e.toIntValue()), [1, 3]);
+    expect(result.toListValue()!.map((e) => e.toIntValue()), [1, 3]);
   }
 
   test_listLiteral_ifElement_true_withElse() async {
@@ -52,7 +53,7 @@
 ''');
     DartObjectImpl result = _evaluateConstant('c');
     expect(result.type, typeProvider.listType2(typeProvider.intType));
-    expect(result.toListValue().map((e) => e.toIntValue()), [1, 2, 4]);
+    expect(result.toListValue()!.map((e) => e.toIntValue()), [1, 2, 4]);
   }
 
   test_listLiteral_ifElement_true_withoutElse() async {
@@ -61,7 +62,7 @@
 ''');
     DartObjectImpl result = _evaluateConstant('c');
     expect(result.type, typeProvider.listType2(typeProvider.intType));
-    expect(result.toListValue().map((e) => e.toIntValue()), [1, 2, 3]);
+    expect(result.toListValue()!.map((e) => e.toIntValue()), [1, 2, 3]);
   }
 
   test_listLiteral_nested() async {
@@ -72,7 +73,7 @@
     // The expected type ought to be `List<int>`, but type inference isn't yet
     // implemented.
     expect(result.type, typeProvider.listType2(typeProvider.intType));
-    expect(result.toListValue().map((e) => e.toIntValue()), [1, 2, 3]);
+    expect(result.toListValue()!.map((e) => e.toIntValue()), [1, 2, 3]);
   }
 
   test_listLiteral_spreadElement() async {
@@ -81,7 +82,7 @@
 ''');
     DartObjectImpl result = _evaluateConstant('c');
     expect(result.type, typeProvider.listType2(typeProvider.intType));
-    expect(result.toListValue().map((e) => e.toIntValue()), [1, 2, 3, 4]);
+    expect(result.toListValue()!.map((e) => e.toIntValue()), [1, 2, 3, 4]);
   }
 
   test_mapLiteral_ifElement_false_withElse() async {
@@ -91,7 +92,7 @@
     DartObjectImpl result = _evaluateConstant('c');
     expect(result.type,
         typeProvider.mapType2(typeProvider.stringType, typeProvider.intType));
-    Map<DartObject, DartObject> value = result.toMapValue();
+    Map<DartObject, DartObject> value = result.toMapValue()!;
     expect(value.keys.map((e) => e.toStringValue()),
         unorderedEquals(['a', 'c', 'd']));
     expect(value.values.map((e) => e.toIntValue()), unorderedEquals([1, 3, 4]));
@@ -104,7 +105,7 @@
     DartObjectImpl result = _evaluateConstant('c');
     expect(result.type,
         typeProvider.mapType2(typeProvider.stringType, typeProvider.intType));
-    Map<DartObject, DartObject> value = result.toMapValue();
+    Map<DartObject, DartObject> value = result.toMapValue()!;
     expect(
         value.keys.map((e) => e.toStringValue()), unorderedEquals(['a', 'c']));
     expect(value.values.map((e) => e.toIntValue()), unorderedEquals([1, 3]));
@@ -117,7 +118,7 @@
     DartObjectImpl result = _evaluateConstant('c');
     expect(result.type,
         typeProvider.mapType2(typeProvider.stringType, typeProvider.intType));
-    Map<DartObject, DartObject> value = result.toMapValue();
+    Map<DartObject, DartObject> value = result.toMapValue()!;
     expect(value.keys.map((e) => e.toStringValue()),
         unorderedEquals(['a', 'b', 'd']));
     expect(value.values.map((e) => e.toIntValue()), unorderedEquals([1, 2, 4]));
@@ -130,7 +131,7 @@
     DartObjectImpl result = _evaluateConstant('c');
     expect(result.type,
         typeProvider.mapType2(typeProvider.stringType, typeProvider.intType));
-    Map<DartObject, DartObject> value = result.toMapValue();
+    Map<DartObject, DartObject> value = result.toMapValue()!;
     expect(value.keys.map((e) => e.toStringValue()),
         unorderedEquals(['a', 'b', 'c']));
     expect(value.values.map((e) => e.toIntValue()), unorderedEquals([1, 2, 3]));
@@ -145,7 +146,7 @@
     DartObjectImpl result = _evaluateConstant('c');
     expect(result.type,
         typeProvider.mapType2(typeProvider.intType, typeProvider.intType));
-    Map<DartObject, DartObject> value = result.toMapValue();
+    Map<DartObject, DartObject> value = result.toMapValue()!;
     expect(value.keys.map((e) => e.toStringValue()),
         unorderedEquals(['a', 'b', 'c']));
     expect(value.values.map((e) => e.toIntValue()), unorderedEquals([1, 2, 3]));
@@ -158,7 +159,7 @@
     DartObjectImpl result = _evaluateConstant('c');
     expect(result.type,
         typeProvider.mapType2(typeProvider.stringType, typeProvider.intType));
-    Map<DartObject, DartObject> value = result.toMapValue();
+    Map<DartObject, DartObject> value = result.toMapValue()!;
     expect(value.keys.map((e) => e.toStringValue()),
         unorderedEquals(['a', 'b', 'c', 'd']));
     expect(
@@ -171,7 +172,7 @@
 ''');
     DartObjectImpl result = _evaluateConstant('c');
     expect(result.type, typeProvider.setType2(typeProvider.intType));
-    expect(result.toSetValue().map((e) => e.toIntValue()), [1, 3, 4]);
+    expect(result.toSetValue()!.map((e) => e.toIntValue()), [1, 3, 4]);
   }
 
   test_setLiteral_ifElement_false_withoutElse() async {
@@ -180,7 +181,7 @@
 ''');
     DartObjectImpl result = _evaluateConstant('c');
     expect(result.type, typeProvider.setType2(typeProvider.intType));
-    expect(result.toSetValue().map((e) => e.toIntValue()), [1, 3]);
+    expect(result.toSetValue()!.map((e) => e.toIntValue()), [1, 3]);
   }
 
   test_setLiteral_ifElement_true_withElse() async {
@@ -189,7 +190,7 @@
 ''');
     DartObjectImpl result = _evaluateConstant('c');
     expect(result.type, typeProvider.setType2(typeProvider.intType));
-    expect(result.toSetValue().map((e) => e.toIntValue()), [1, 2, 4]);
+    expect(result.toSetValue()!.map((e) => e.toIntValue()), [1, 2, 4]);
   }
 
   test_setLiteral_ifElement_true_withoutElse() async {
@@ -198,7 +199,7 @@
 ''');
     DartObjectImpl result = _evaluateConstant('c');
     expect(result.type, typeProvider.setType2(typeProvider.intType));
-    expect(result.toSetValue().map((e) => e.toIntValue()), [1, 2, 3]);
+    expect(result.toSetValue()!.map((e) => e.toIntValue()), [1, 2, 3]);
   }
 
   test_setLiteral_nested() async {
@@ -207,7 +208,7 @@
 ''');
     DartObjectImpl result = _evaluateConstant('c');
     expect(result.type, typeProvider.setType2(typeProvider.intType));
-    expect(result.toSetValue().map((e) => e.toIntValue()), [1, 2, 3]);
+    expect(result.toSetValue()!.map((e) => e.toIntValue()), [1, 2, 3]);
   }
 
   test_setLiteral_spreadElement() async {
@@ -216,7 +217,7 @@
 ''');
     DartObjectImpl result = _evaluateConstant('c');
     expect(result.type, typeProvider.setType2(typeProvider.intType));
-    expect(result.toSetValue().map((e) => e.toIntValue()), [1, 2, 3, 4]);
+    expect(result.toSetValue()!.map((e) => e.toIntValue()), [1, 2, 3, 4]);
   }
 
   test_visitAsExpression_instanceOfSameClass() async {
@@ -259,7 +260,7 @@
   const B();
 }
 ''');
-    DartObjectImpl result = _evaluateConstant('b',
+    var result = _evaluateConstantOrNull('b',
         errorCodes: [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
     expect(result, isNull);
   }
@@ -275,7 +276,7 @@
   const B();
 }
 ''');
-    DartObjectImpl result = _evaluateConstant('b',
+    var result = _evaluateConstantOrNull('b',
         errorCodes: [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
     expect(result, isNull);
   }
@@ -351,7 +352,7 @@
     await resolveTestCode('''
 const c = 3 & false;
 ''');
-    _evaluateConstant('c',
+    _evaluateConstantOrNull('c',
         errorCodes: [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_INT]);
   }
 
@@ -403,7 +404,7 @@
     await resolveTestCode('''
 const c = 3 | false;
 ''');
-    _evaluateConstant('c',
+    _evaluateConstantOrNull('c',
         errorCodes: [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_INT]);
   }
 
@@ -457,7 +458,8 @@
 const c = null ?? new C();
 class C {}
 ''');
-    _evaluateConstant('c', errorCodes: [CompileTimeErrorCode.INVALID_CONSTANT]);
+    _evaluateConstantOrNull('c',
+        errorCodes: [CompileTimeErrorCode.INVALID_CONSTANT]);
   }
 
   test_visitBinaryExpression_questionQuestion_lazy_null_notNull() async {
@@ -525,7 +527,7 @@
     await resolveTestCode('''
 const c = 3 ^ false;
 ''');
-    _evaluateConstant('c',
+    _evaluateConstantOrNull('c',
         errorCodes: [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_INT]);
   }
 
@@ -542,7 +544,7 @@
     await resolveTestCode('''
 const c = null ? 1 : 0;
 ''');
-    DartObjectImpl result = _evaluateConstant(
+    var result = _evaluateConstantOrNull(
       'c',
       errorCodes: [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL],
     );
@@ -577,7 +579,7 @@
     await resolveTestCode('''
 const c = true ? x : 0;
 ''');
-    DartObjectImpl result = _evaluateConstant(
+    var result = _evaluateConstantOrNull(
       'c',
       errorCodes: [CompileTimeErrorCode.INVALID_CONSTANT],
     );
@@ -597,7 +599,8 @@
     await resolveTestCode('''
 const c = false ? 1 : new C();
 ''');
-    _evaluateConstant('c', errorCodes: [CompileTimeErrorCode.INVALID_CONSTANT]);
+    _evaluateConstantOrNull('c',
+        errorCodes: [CompileTimeErrorCode.INVALID_CONSTANT]);
   }
 
   test_visitConditionalExpression_lazy_false_invalid_int() async {
@@ -614,7 +617,7 @@
     await resolveTestCode('''
 const c = 3 ? 1 : 0;
 ''');
-    _evaluateConstant('c',
+    _evaluateConstantOrNull('c',
         errorCodes: [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL]);
   }
 
@@ -642,7 +645,8 @@
 const c = true ? new C() : 0;
 class C {}
 ''');
-    _evaluateConstant('c', errorCodes: [CompileTimeErrorCode.INVALID_CONSTANT]);
+    _evaluateConstantOrNull('c',
+        errorCodes: [CompileTimeErrorCode.INVALID_CONSTANT]);
   }
 
   test_visitInstanceCreationExpression_bool_fromEnvironment() async {
@@ -1016,13 +1020,27 @@
 class ConstantVisitorTestSupport extends PubPackageResolutionTest {
   DartObjectImpl _evaluateConstant(
     String name, {
-    List<ErrorCode> errorCodes,
+    List<ErrorCode>? errorCodes,
     Map<String, String> declaredVariables = const {},
-    Map<String, DartObjectImpl> lexicalEnvironment,
+    Map<String, DartObjectImpl>? lexicalEnvironment,
   }) {
-    var expression = findNode.topVariableDeclarationByName(name).initializer;
+    return _evaluateConstantOrNull(
+      name,
+      errorCodes: errorCodes,
+      declaredVariables: declaredVariables,
+      lexicalEnvironment: lexicalEnvironment,
+    )!;
+  }
 
-    var source = this.result.unit.declaredElement.source;
+  DartObjectImpl? _evaluateConstantOrNull(
+    String name, {
+    List<ErrorCode>? errorCodes,
+    Map<String, String> declaredVariables = const {},
+    Map<String, DartObjectImpl>? lexicalEnvironment,
+  }) {
+    var expression = findNode.topVariableDeclarationByName(name).initializer!;
+
+    var source = this.result.unit!.declaredElement!.source;
     var errorListener = GatheringErrorListener();
     var errorReporter = ErrorReporter(
       errorListener,
@@ -1030,12 +1048,12 @@
       isNonNullableByDefault: false,
     );
 
-    DartObjectImpl result = expression.accept(
+    DartObjectImpl? result = expression.accept(
       ConstantVisitor(
         ConstantEvaluationEngine(
           DeclaredVariables.fromMap(declaredVariables),
         ),
-        this.result.libraryElement,
+        this.result.libraryElement as LibraryElementImpl,
         errorReporter,
         lexicalEnvironment: lexicalEnvironment,
       ),
@@ -1120,7 +1138,7 @@
     await resolveTestCode('''
 const c = 0xFFFFFFFF >>> -2;
 ''');
-    _evaluateConstant('c',
+    _evaluateConstantOrNull('c',
         errorCodes: [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
   }
 
@@ -1164,7 +1182,7 @@
     await resolveTestCode('''
 const c = 0xFF >>> -2;
 ''');
-    _evaluateConstant('c',
+    _evaluateConstantOrNull('c',
         errorCodes: [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
   }
 
diff --git a/pkg/analyzer/test/src/dart/constant/potentially_constant_test.dart b/pkg/analyzer/test/src/dart/constant/potentially_constant_test.dart
index 97a88b3..9951612 100644
--- a/pkg/analyzer/test/src/dart/constant/potentially_constant_test.dart
+++ b/pkg/analyzer/test/src/dart/constant/potentially_constant_test.dart
@@ -122,19 +122,19 @@
 
   Future<void> _assertConst(String code) async {
     await resolveTestCode(code);
-    var type = findNode.variableDeclarationList('x;').type;
+    var type = findNode.variableDeclarationList('x;').type!;
     expect(isConstantTypeExpression(type), isTrue);
   }
 
   Future<void> _assertNeverConst(String code) async {
     await resolveTestCode(code);
-    var type = findNode.variableDeclarationList('x;').type;
+    var type = findNode.variableDeclarationList('x;').type!;
     expect(isConstantTypeExpression(type), isFalse);
   }
 
   Future<void> _assertPotentiallyConst(String code) async {
     await resolveTestCode(code);
-    var type = findNode.variableDeclarationList('x;').type;
+    var type = findNode.variableDeclarationList('x;').type!;
     expect(isConstantTypeExpression(type), isFalse);
   }
 }
@@ -166,14 +166,14 @@
   @override
   Future<void> _assertConst(String code) async {
     await resolveTestCode(code);
-    var type = findNode.variableDeclarationList('x;').type;
+    var type = findNode.variableDeclarationList('x;').type!;
     expect(isPotentiallyConstantTypeExpression(type), isTrue);
   }
 
   @override
   Future<void> _assertPotentiallyConst(String code) async {
     await resolveTestCode(code);
-    var type = findNode.variableDeclarationList('x;').type;
+    var type = findNode.variableDeclarationList('x;').type!;
     expect(isPotentiallyConstantTypeExpression(type), isTrue);
   }
 }
@@ -920,7 +920,7 @@
   }
 
   Expression _xInitializer() {
-    return findNode.variableDeclaration('x = ').initializer;
+    return findNode.variableDeclaration('x = ').initializer!;
   }
 }
 
diff --git a/pkg/analyzer/test/src/dart/constant/utilities_test.dart b/pkg/analyzer/test/src/dart/constant/utilities_test.dart
index cc8199f..c8c64b8 100644
--- a/pkg/analyzer/test/src/dart/constant/utilities_test.dart
+++ b/pkg/analyzer/test/src/dart/constant/utilities_test.dart
@@ -12,6 +12,7 @@
 import 'package:analyzer/src/dart/constant/evaluation.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/generated/constant.dart';
+import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/testing/ast_test_factory.dart';
@@ -31,9 +32,9 @@
 
 @reflectiveTest
 class ConstantFinderTest {
-  AstNode _node;
-  TypeProvider _typeProvider;
-  Source _source;
+  late final AstNode _node;
+  late final TypeProvider _typeProvider;
+  late final Source _source;
 
   void setUp() {
     _typeProvider = TestTypeProvider();
@@ -43,10 +44,10 @@
   /// Test an annotation that consists solely of an identifier (and hence
   /// represents a reference to a compile-time constant variable).
   void test_visitAnnotation_constantVariable() {
-    CompilationUnitElement compilationUnitElement =
+    var compilationUnitElement =
         ElementFactory.compilationUnit('/test.dart', _source)..source = _source;
-    ElementFactory.library(null, 'L').definingCompilationUnit =
-        compilationUnitElement;
+    ElementFactory.library(_AnalysisContextMock(), 'L')
+        .definingCompilationUnit = compilationUnitElement;
     ElementAnnotationImpl elementAnnotation =
         ElementAnnotationImpl(compilationUnitElement);
     _node = elementAnnotation.annotationAst =
@@ -67,10 +68,10 @@
   /// Test an annotation that represents the invocation of a constant
   /// constructor.
   void test_visitAnnotation_invocation() {
-    CompilationUnitElement compilationUnitElement =
+    var compilationUnitElement =
         ElementFactory.compilationUnit('/test.dart', _source)..source = _source;
-    ElementFactory.library(null, 'L').definingCompilationUnit =
-        compilationUnitElement;
+    ElementFactory.library(_AnalysisContextMock(), 'L')
+        .definingCompilationUnit = compilationUnitElement;
     ElementAnnotationImpl elementAnnotation =
         ElementAnnotationImpl(compilationUnitElement);
     _node = elementAnnotation.annotationAst = AstTestFactory.annotation2(
@@ -182,16 +183,15 @@
   }
 
   ConstructorElement _setupConstructorDeclaration(String name, bool isConst) {
-    Keyword constKeyword = isConst ? Keyword.CONST : null;
-    ConstructorDeclarationImpl constructorDeclaration =
-        AstTestFactory.constructorDeclaration2(
-            constKeyword,
-            null,
-            null,
-            name,
-            AstTestFactory.formalParameterList(),
-            null,
-            AstTestFactory.blockFunctionBody2());
+    var constKeyword = isConst ? Keyword.CONST : null;
+    var constructorDeclaration = AstTestFactory.constructorDeclaration2(
+        constKeyword,
+        null,
+        AstTestFactory.identifier3(name),
+        null,
+        AstTestFactory.formalParameterList(),
+        [],
+        AstTestFactory.blockFunctionBody2()) as ConstructorDeclarationImpl;
     ClassElement classElement = ElementFactory.classElement2(name);
     ConstructorElement element =
         ElementFactory.constructorElement(classElement, name, isConst);
@@ -209,7 +209,7 @@
         ? AstTestFactory.variableDeclaration2(
             fieldName, AstTestFactory.integer(0))
         : AstTestFactory.variableDeclaration(fieldName);
-    VariableElement fieldElement = ElementFactory.fieldElement(
+    var fieldElement = ElementFactory.fieldElement(
         fieldName,
         isStatic,
         keyword == Keyword.FINAL,
@@ -226,15 +226,14 @@
     classElement.fields = <FieldElement>[fieldElement];
     classDeclaration.name.staticElement = classElement;
     if (hasConstConstructor) {
-      ConstructorDeclarationImpl constructorDeclaration =
-          AstTestFactory.constructorDeclaration2(
-              Keyword.CONST,
-              null,
-              AstTestFactory.identifier3(className),
-              null,
-              AstTestFactory.formalParameterList(),
-              null,
-              AstTestFactory.blockFunctionBody2());
+      var constructorDeclaration = AstTestFactory.constructorDeclaration2(
+          Keyword.CONST,
+          null,
+          AstTestFactory.identifier3(className),
+          null,
+          AstTestFactory.formalParameterList(),
+          [],
+          AstTestFactory.blockFunctionBody2()) as ConstructorDeclarationImpl;
       classDeclaration.members.add(constructorDeclaration);
       ConstructorElement constructorElement =
           ElementFactory.constructorElement(classElement, '', true);
@@ -255,7 +254,11 @@
     SimpleIdentifier identifier = variableDeclaration.name;
     VariableElement element = ElementFactory.localVariableElement(identifier);
     identifier.staticElement = element;
-    Keyword keyword = isConst ? Keyword.CONST : isFinal ? Keyword.FINAL : null;
+    var keyword = isConst
+        ? Keyword.CONST
+        : isFinal
+            ? Keyword.FINAL
+            : null;
     AstTestFactory.variableDeclarationList2(keyword, [variableDeclaration]);
     _node = variableDeclaration;
     return element;
@@ -264,7 +267,7 @@
 
 @reflectiveTest
 class ReferenceFinderTest {
-  Element _tail;
+  late final Element _tail;
   final List<ConstantEvaluationTarget> _dependencies = [];
 
   void test_visitSimpleIdentifier_const() {
@@ -338,3 +341,8 @@
     node.accept(referenceFinder);
   }
 }
+
+class _AnalysisContextMock implements AnalysisContext {
+  @override
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
diff --git a/pkg/analyzer/test/src/dart/constant/value_test.dart b/pkg/analyzer/test/src/dart/constant/value_test.dart
index df77b25..160770d 100644
--- a/pkg/analyzer/test/src/dart/constant/value_test.dart
+++ b/pkg/analyzer/test/src/dart/constant/value_test.dart
@@ -25,8 +25,8 @@
 
 @reflectiveTest
 class DartObjectImplTest {
-  TypeProvider _typeProvider;
-  TypeSystemImpl _typeSystem;
+  late final TypeProvider _typeProvider;
+  late final TypeSystemImpl _typeSystem;
 
   void setUp() {
     var analysisContext = TestAnalysisContext();
@@ -504,14 +504,14 @@
   }
 
   void test_getValue_list_empty() {
-    Object result = _listValue(_typeProvider.intType, []).toListValue();
+    var result = _listValue(_typeProvider.intType, []).toListValue();
     _assertInstanceOfObjectArray(result);
     List<Object> array = result as List<Object>;
     expect(array, hasLength(0));
   }
 
   void test_getValue_list_valid() {
-    Object result =
+    var result =
         _listValue(_typeProvider.intType, [_intValue(23)]).toListValue();
     _assertInstanceOfObjectArray(result);
     List<Object> array = result as List<Object>;
@@ -519,13 +519,13 @@
   }
 
   void test_getValue_map_empty() {
-    Map result = _mapValue(_typeProvider.intType, _typeProvider.stringType, [])
+    var result = _mapValue(_typeProvider.intType, _typeProvider.stringType, [])
         .toMapValue();
     expect(result, hasLength(0));
   }
 
   void test_getValue_map_valid() {
-    Map result = _mapValue(_typeProvider.stringType, _typeProvider.stringType,
+    var result = _mapValue(_typeProvider.stringType, _typeProvider.stringType,
         [_stringValue("key"), _stringValue("value")]).toMapValue();
     expect(result, hasLength(1));
   }
@@ -536,13 +536,13 @@
 
   void test_getValue_set_empty() {
     DartObjectImpl object = _setValue(_typeProvider.intType, null);
-    Set<DartObject> set = object.toSetValue();
+    var set = object.toSetValue();
     expect(set, hasLength(0));
   }
 
   void test_getValue_set_valid() {
     DartObjectImpl object = _setValue(_typeProvider.intType, {_intValue(23)});
-    Set<DartObject> set = object.toSetValue();
+    var set = object.toSetValue();
     expect(set, hasLength(1));
   }
 
@@ -1732,7 +1732,7 @@
   /// [expected] value, or that the operation throws an exception if the
   /// expected value is `null`.
   void _assertAdd(
-      DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) {
+      DartObjectImpl? expected, DartObjectImpl left, DartObjectImpl right) {
     if (expected == null) {
       expect(() {
         left.add(_typeSystem, right);
@@ -1746,7 +1746,7 @@
 
   /// Assert that the bit-not of the [operand] is the [expected] value, or that
   /// the operation throws an exception if the expected value is `null`.
-  void _assertBitNot(DartObjectImpl expected, DartObjectImpl operand) {
+  void _assertBitNot(DartObjectImpl? expected, DartObjectImpl operand) {
     if (expected == null) {
       expect(() {
         operand.bitNot(_typeSystem);
@@ -1762,7 +1762,7 @@
   /// the [expected] value, or that the operation throws an exception if the
   /// expected value is `null`.
   void _assertConcatenate(
-      DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) {
+      DartObjectImpl? expected, DartObjectImpl left, DartObjectImpl right) {
     if (expected == null) {
       expect(() {
         left.concatenate(_typeSystem, right);
@@ -1778,7 +1778,7 @@
   /// [expected] value, or that the operation throws an exception if the
   /// expected value is `null`.
   void _assertDivide(
-      DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) {
+      DartObjectImpl? expected, DartObjectImpl left, DartObjectImpl right) {
     if (expected == null) {
       expect(() {
         left.divide(_typeSystem, right);
@@ -1794,7 +1794,7 @@
   /// the [expected] value, or that the operation throws an exception if the
   /// expected value is `null`.
   void _assertEagerAnd(
-      DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) {
+      DartObjectImpl? expected, DartObjectImpl left, DartObjectImpl right) {
     if (expected == null) {
       expect(() {
         left.eagerAnd(_typeSystem, right);
@@ -1810,7 +1810,7 @@
   /// [expected] value, or that the operation throws an exception if the
   /// expected value is `null`.
   void _assertEagerOr(
-      DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) {
+      DartObjectImpl? expected, DartObjectImpl left, DartObjectImpl right) {
     if (expected == null) {
       expect(() {
         left.eagerOr(_typeSystem, right);
@@ -1826,7 +1826,7 @@
   /// the [expected] value, or that the operation throws an exception if the
   /// expected value is `null`.
   void _assertEagerXor(
-      DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) {
+      DartObjectImpl? expected, DartObjectImpl left, DartObjectImpl right) {
     if (expected == null) {
       expect(() {
         left.eagerXor(_typeSystem, right);
@@ -1842,7 +1842,7 @@
   /// equality is the [expected] value, or that the operation throws an
   /// exception if the expected value is `null`.
   void _assertEqualEqual(
-      DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) {
+      DartObjectImpl? expected, DartObjectImpl left, DartObjectImpl right) {
     if (expected == null) {
       expect(() {
         left.equalEqual(_typeSystem, right);
@@ -1858,7 +1858,7 @@
   /// [expected] value, or that the operation throws an exception if the
   /// expected value is `null`.
   void _assertGreaterThan(
-      DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) {
+      DartObjectImpl? expected, DartObjectImpl left, DartObjectImpl right) {
     if (expected == null) {
       expect(() {
         left.greaterThan(_typeSystem, right);
@@ -1874,7 +1874,7 @@
   /// [expected] value, or that the operation throws an exception if the
   /// expected value is `null`.
   void _assertGreaterThanOrEqual(
-      DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) {
+      DartObjectImpl? expected, DartObjectImpl left, DartObjectImpl right) {
     if (expected == null) {
       expect(() {
         left.greaterThanOrEqual(_typeSystem, right);
@@ -1895,7 +1895,7 @@
     expect(result, expected);
   }
 
-  void _assertInstanceOfObjectArray(Object result) {
+  void _assertInstanceOfObjectArray(Object? result) {
     // TODO(scheglov) implement
   }
 
@@ -1903,7 +1903,7 @@
   /// integers is the [expected] value, or that the operation throws an
   /// exception if the expected value is `null`.
   void _assertIntegerDivide(
-      DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) {
+      DartObjectImpl? expected, DartObjectImpl left, DartObjectImpl right) {
     if (expected == null) {
       expect(() {
         left.integerDivide(_typeSystem, right);
@@ -1919,7 +1919,7 @@
   /// is the [expected] value, or that the operation throws an exception if the
   /// expected value is `null`.
   void _assertLazyAnd(
-      DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) {
+      DartObjectImpl? expected, DartObjectImpl left, DartObjectImpl right) {
     if (expected == null) {
       expect(() {
         left.lazyAnd(_typeSystem, () => right);
@@ -1935,7 +1935,7 @@
   /// the [expected] value, or that the operation throws an exception if the
   /// expected value is `null`.
   void _assertLazyOr(
-      DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) {
+      DartObjectImpl? expected, DartObjectImpl left, DartObjectImpl right) {
     if (expected == null) {
       expect(() {
         left.lazyOr(_typeSystem, () => right);
@@ -1951,7 +1951,7 @@
   /// [expected] value, or that the operation throws an exception if the
   /// expected value is `null`.
   void _assertLessThan(
-      DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) {
+      DartObjectImpl? expected, DartObjectImpl left, DartObjectImpl right) {
     if (expected == null) {
       expect(() {
         left.lessThan(_typeSystem, right);
@@ -1967,7 +1967,7 @@
   /// [expected] value, or that the operation throws an exception if the
   /// expected value is `null`.
   void _assertLessThanOrEqual(
-      DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) {
+      DartObjectImpl? expected, DartObjectImpl left, DartObjectImpl right) {
     if (expected == null) {
       expect(() {
         left.lessThanOrEqual(_typeSystem, right);
@@ -1981,7 +1981,7 @@
 
   /// Assert that the logical-not of the [operand] is the [expected] value, or
   /// that the operation throws an exception if the expected value is `null`.
-  void _assertLogicalNot(DartObjectImpl expected, DartObjectImpl operand) {
+  void _assertLogicalNot(DartObjectImpl? expected, DartObjectImpl operand) {
     if (expected == null) {
       expect(() {
         operand.logicalNot(_typeSystem);
@@ -1997,7 +1997,7 @@
   /// the [expected] value, or that the operation throws an exception if the
   /// expected value is `null`.
   void _assertMinus(
-      DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) {
+      DartObjectImpl? expected, DartObjectImpl left, DartObjectImpl right) {
     if (expected == null) {
       expect(() {
         left.minus(_typeSystem, right);
@@ -2011,7 +2011,7 @@
 
   /// Assert that the negation of the [operand] is the [expected] value, or that
   /// the operation throws an exception if the expected value is `null`.
-  void _assertNegated(DartObjectImpl expected, DartObjectImpl operand) {
+  void _assertNegated(DartObjectImpl? expected, DartObjectImpl operand) {
     if (expected == null) {
       expect(() {
         operand.negated(_typeSystem);
@@ -2027,7 +2027,7 @@
   /// inequality is the [expected] value, or that the operation throws an
   /// exception if the expected value is `null`.
   void _assertNotEqual(
-      DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) {
+      DartObjectImpl? expected, DartObjectImpl left, DartObjectImpl right) {
     if (expected == null) {
       expect(() {
         left.notEqual(_typeSystem, right);
@@ -2041,7 +2041,8 @@
 
   /// Assert that converting the [operand] to a string is the [expected] value,
   /// or that the operation throws an exception if the expected value is `null`.
-  void _assertPerformToString(DartObjectImpl expected, DartObjectImpl operand) {
+  void _assertPerformToString(
+      DartObjectImpl? expected, DartObjectImpl operand) {
     if (expected == null) {
       expect(() {
         operand.performToString(_typeSystem);
@@ -2057,7 +2058,7 @@
   /// operands is the [expected] value, or that the operation throws an
   /// exception if the expected value is `null`.
   void _assertRemainder(
-      DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) {
+      DartObjectImpl? expected, DartObjectImpl left, DartObjectImpl right) {
     if (expected == null) {
       expect(() {
         left.remainder(_typeSystem, right);
@@ -2073,7 +2074,7 @@
   /// the [expected] value, or that the operation throws an exception if the
   /// expected value is `null`.
   void _assertShiftLeft(
-      DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) {
+      DartObjectImpl? expected, DartObjectImpl left, DartObjectImpl right) {
     if (expected == null) {
       expect(() {
         left.shiftLeft(_typeSystem, right);
@@ -2089,7 +2090,7 @@
   /// the [expected] value, or that the operation throws an exception if the
   /// expected value is `null`.
   void _assertShiftRight(
-      DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) {
+      DartObjectImpl? expected, DartObjectImpl left, DartObjectImpl right) {
     if (expected == null) {
       expect(() {
         left.shiftRight(_typeSystem, right);
@@ -2103,7 +2104,7 @@
 
   /// Assert that the length of the [operand] is the [expected] value, or that
   /// the operation throws an exception if the expected value is `null`.
-  void _assertStringLength(DartObjectImpl expected, DartObjectImpl operand) {
+  void _assertStringLength(DartObjectImpl? expected, DartObjectImpl operand) {
     if (expected == null) {
       expect(() {
         operand.stringLength(_typeSystem);
@@ -2119,7 +2120,7 @@
   /// the [expected] value, or that the operation throws an exception if the
   /// expected value is `null`.
   void _assertTimes(
-      DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) {
+      DartObjectImpl? expected, DartObjectImpl left, DartObjectImpl right) {
     if (expected == null) {
       expect(() {
         left.times(_typeSystem, right);
@@ -2131,7 +2132,7 @@
     }
   }
 
-  DartObjectImpl _boolValue(bool value) {
+  DartObjectImpl _boolValue(bool? value) {
     if (value == null) {
       return DartObjectImpl(
         _typeSystem,
@@ -2154,7 +2155,7 @@
     fail("Invalid boolean value used in test");
   }
 
-  DartObjectImpl _doubleValue(double value) {
+  DartObjectImpl _doubleValue(double? value) {
     if (value == null) {
       return DartObjectImpl(
         _typeSystem,
@@ -2170,7 +2171,7 @@
     }
   }
 
-  DartObjectImpl _intValue(int value) {
+  DartObjectImpl _intValue(int? value) {
     if (value == null) {
       return DartObjectImpl(
         _typeSystem,
@@ -2220,7 +2221,8 @@
     );
   }
 
-  DartObjectImpl _setValue(DartType type, Set<DartObjectImpl> elements) {
+  DartObjectImpl _setValue(
+      ParameterizedType type, Set<DartObjectImpl>? elements) {
     return DartObjectImpl(
       _typeSystem,
       type,
@@ -2228,7 +2230,7 @@
     );
   }
 
-  DartObjectImpl _stringValue(String value) {
+  DartObjectImpl _stringValue(String? value) {
     if (value == null) {
       return DartObjectImpl(
         _typeSystem,
diff --git a/pkg/analyzer/test/src/dart/element/class_hierarchy_test.dart b/pkg/analyzer/test/src/dart/element/class_hierarchy_test.dart
index 08ec4f4..2dd1c49 100644
--- a/pkg/analyzer/test/src/dart/element/class_hierarchy_test.dart
+++ b/pkg/analyzer/test/src/dart/element/class_hierarchy_test.dart
@@ -7,7 +7,6 @@
 import 'package:analyzer/src/dart/element/class_hierarchy.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
-import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -86,7 +85,7 @@
 }
 
 mixin _AbstractClassHierarchyMixin on ElementsTypesMixin {
-  ClassElementImpl A;
+  late ClassElementImpl A;
 
   void _assertErrors(List<ClassHierarchyError> errors, List<String> expected) {
     expect(
@@ -112,8 +111,8 @@
   }
 
   void _checkA({
-    @required List<DartType> typeArguments,
-    @required List<String> interfaces,
+    required List<DartType> typeArguments,
+    required List<String> interfaces,
     List<String> errors = const [],
   }) {
     var specifiedInterfaces = typeArguments
diff --git a/pkg/analyzer/test/src/dart/element/element_test.dart b/pkg/analyzer/test/src/dart/element/element_test.dart
index 167c6d5..66aa3e5 100644
--- a/pkg/analyzer/test/src/dart/element/element_test.dart
+++ b/pkg/analyzer/test/src/dart/element/element_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/analysis/features.dart';
+import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/constant/value.dart';
 import 'package:analyzer/dart/element/element.dart';
@@ -41,15 +42,15 @@
 }
 
 class AbstractTypeTest with ElementsTypesMixin {
-  TestAnalysisContext _analysisContext;
+  late final TestAnalysisContext _analysisContext;
 
   @override
-  LibraryElementImpl testLibrary;
+  late final LibraryElementImpl testLibrary;
 
   @override
-  TypeProvider typeProvider;
+  late final TypeProvider typeProvider;
 
-  TypeSystemImpl typeSystem;
+  late final TypeSystemImpl typeSystem;
 
   void setUp() {
     _analysisContext = TestAnalysisContext();
@@ -71,7 +72,7 @@
     var classA = class_(name: 'A');
     String fieldName = "f";
     FieldElementImpl field =
-        ElementFactory.fieldElement(fieldName, false, false, false, null);
+        ElementFactory.fieldElement(fieldName, false, false, false, intNone);
     classA.fields = <FieldElement>[field];
     expect(classA.getField(fieldName), same(field));
     expect(field.isEnumConstant, false);
@@ -82,7 +83,7 @@
   void test_getMethod_declared() {
     var classA = class_(name: 'A');
     String methodName = "m";
-    MethodElement method = ElementFactory.methodElement(methodName, null);
+    MethodElement method = ElementFactory.methodElement(methodName, intNone);
     classA.methods = <MethodElement>[method];
     expect(classA.getMethod(methodName), same(method));
   }
@@ -90,7 +91,7 @@
   void test_getMethod_undeclared() {
     var classA = class_(name: 'A');
     String methodName = "m";
-    MethodElement method = ElementFactory.methodElement(methodName, null);
+    MethodElement method = ElementFactory.methodElement(methodName, intNone);
     classA.methods = <MethodElement>[method];
     expect(classA.getMethod("${methodName}x"), isNull);
   }
@@ -115,8 +116,10 @@
 
   void test_hasNonFinalField_false_recursive() {
     var classA = class_(name: 'A');
-    ClassElementImpl classB =
-        ElementFactory.classElement("B", interfaceTypeStar(classA));
+    ClassElementImpl classB = class_(
+      name: 'B',
+      superType: interfaceTypeStar(classA),
+    );
     classA.supertype = interfaceTypeStar(classB);
     expect(classA.hasNonFinalField, isFalse);
   }
@@ -130,6 +133,7 @@
     expect(classA.hasNonFinalField, isTrue);
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44522')
   void test_hasNonFinalField_true_inherited() {
     var classA = class_(name: 'A');
     ClassElementImpl classB =
@@ -149,7 +153,7 @@
 
   void test_hasStaticMember_false_instanceMethod() {
     var classA = class_(name: 'A');
-    MethodElement method = ElementFactory.methodElement("foo", null);
+    MethodElement method = ElementFactory.methodElement("foo", intNone);
     classA.methods = <MethodElement>[method];
     expect(classA.hasStaticMember, isFalse);
   }
@@ -157,7 +161,7 @@
   void test_hasStaticMember_instanceGetter() {
     var classA = class_(name: 'A');
     PropertyAccessorElement getter =
-        ElementFactory.getterElement("foo", false, null);
+        ElementFactory.getterElement("foo", false, intNone);
     classA.accessors = <PropertyAccessorElement>[getter];
     expect(classA.hasStaticMember, isFalse);
   }
@@ -165,7 +169,7 @@
   void test_hasStaticMember_true_getter() {
     var classA = class_(name: 'A');
     PropertyAccessorElementImpl getter =
-        ElementFactory.getterElement("foo", false, null);
+        ElementFactory.getterElement("foo", false, intNone);
     classA.accessors = <PropertyAccessorElement>[getter];
     // "foo" is static
     getter.isStatic = true;
@@ -174,7 +178,7 @@
 
   void test_hasStaticMember_true_method() {
     var classA = class_(name: 'A');
-    MethodElementImpl method = ElementFactory.methodElement("foo", null);
+    MethodElementImpl method = ElementFactory.methodElement("foo", intNone);
     classA.methods = <MethodElement>[method];
     // "foo" is static
     method.isStatic = true;
@@ -184,7 +188,7 @@
   void test_hasStaticMember_true_setter() {
     var classA = class_(name: 'A');
     PropertyAccessorElementImpl setter =
-        ElementFactory.setterElement("foo", false, null);
+        ElementFactory.setterElement("foo", false, intNone);
     classA.accessors = <PropertyAccessorElement>[setter];
     // "foo" is static
     setter.isStatic = true;
@@ -198,7 +202,7 @@
     LibraryElementImpl library = _newLibrary();
     var classA = class_(name: 'A');
     String methodName = "m";
-    MethodElement method = ElementFactory.methodElement(methodName, null);
+    MethodElement method = ElementFactory.methodElement(methodName, intNone);
     classA.methods = <MethodElement>[method];
     (library.definingCompilationUnit as CompilationUnitElementImpl).types =
         <ClassElement>[classA];
@@ -212,7 +216,8 @@
     LibraryElementImpl library = _newLibrary();
     var classA = class_(name: 'A');
     String methodName = "m";
-    MethodElementImpl method = ElementFactory.methodElement(methodName, null);
+    MethodElementImpl method =
+        ElementFactory.methodElement(methodName, intNone);
     method.isAbstract = true;
     classA.methods = <MethodElement>[method];
     (library.definingCompilationUnit as CompilationUnitElementImpl).types =
@@ -231,11 +236,12 @@
     var classA = class_(name: 'A');
     String methodName = "m";
     MethodElement inheritedMethod =
-        ElementFactory.methodElement(methodName, null);
+        ElementFactory.methodElement(methodName, intNone);
     classA.methods = <MethodElement>[inheritedMethod];
     ClassElementImpl classB =
         ElementFactory.classElement("B", interfaceTypeStar(classA));
-    MethodElementImpl method = ElementFactory.methodElement(methodName, null);
+    MethodElementImpl method =
+        ElementFactory.methodElement(methodName, intNone);
     method.isAbstract = true;
     classB.methods = <MethodElement>[method];
     (library.definingCompilationUnit as CompilationUnitElementImpl).types =
@@ -255,11 +261,11 @@
     var classA = class_(name: 'A');
     String methodName = "m";
     MethodElement inheritedMethod =
-        ElementFactory.methodElement(methodName, null);
+        ElementFactory.methodElement(methodName, intNone);
     classA.methods = <MethodElement>[inheritedMethod];
     ClassElementImpl classB =
         ElementFactory.classElement("B", interfaceTypeStar(classA));
-    MethodElement method = ElementFactory.methodElement(methodName, null);
+    MethodElement method = ElementFactory.methodElement(methodName, intNone);
     classB.methods = <MethodElement>[method];
     (library.definingCompilationUnit as CompilationUnitElementImpl).types =
         <ClassElement>[classA, classB];
@@ -278,12 +284,12 @@
     classA.isAbstract = true;
     String methodName = "m";
     MethodElementImpl inheritedMethod =
-        ElementFactory.methodElement(methodName, null);
+        ElementFactory.methodElement(methodName, intNone);
     inheritedMethod.isAbstract = true;
     classA.methods = <MethodElement>[inheritedMethod];
     ClassElementImpl classB =
         ElementFactory.classElement("B", interfaceTypeStar(classA));
-    MethodElement method = ElementFactory.methodElement(methodName, null);
+    MethodElement method = ElementFactory.methodElement(methodName, intNone);
     classB.methods = <MethodElement>[method];
     (library.definingCompilationUnit as CompilationUnitElementImpl).types =
         <ClassElement>[classA, classB];
@@ -300,7 +306,7 @@
     var classA = class_(name: 'A');
     String methodName = "m";
     MethodElement inheritedMethod =
-        ElementFactory.methodElement(methodName, null);
+        ElementFactory.methodElement(methodName, intNone);
     classA.methods = <MethodElement>[inheritedMethod];
     ClassElementImpl classB =
         ElementFactory.classElement("B", interfaceTypeStar(classA));
@@ -328,7 +334,7 @@
     var classA = class_(name: 'A');
     String getterName = "g";
     PropertyAccessorElement getter =
-        ElementFactory.getterElement(getterName, false, null);
+        ElementFactory.getterElement(getterName, false, intNone);
     classA.accessors = <PropertyAccessorElement>[getter];
     (library.definingCompilationUnit as CompilationUnitElementImpl).types =
         <ClassElement>[classA];
@@ -345,7 +351,7 @@
     var classA = class_(name: 'A');
     String getterName = "g";
     PropertyAccessorElement getter =
-        ElementFactory.getterElement(getterName, false, null);
+        ElementFactory.getterElement(getterName, false, intNone);
     classA.accessors = <PropertyAccessorElement>[getter];
     ClassElementImpl classB =
         ElementFactory.classElement("B", interfaceTypeStar(classA));
@@ -387,7 +393,7 @@
     var classA = class_(name: 'A');
     String getterName = "g";
     PropertyAccessorElement getter =
-        ElementFactory.getterElement(getterName, false, null);
+        ElementFactory.getterElement(getterName, false, intNone);
     classA.accessors = <PropertyAccessorElement>[getter];
     (library.definingCompilationUnit as CompilationUnitElementImpl).types =
         <ClassElement>[classA];
@@ -404,7 +410,7 @@
     var classA = class_(name: 'A');
     String getterName = "g";
     PropertyAccessorElement inheritedGetter =
-        ElementFactory.getterElement(getterName, false, null);
+        ElementFactory.getterElement(getterName, false, intNone);
     classA.accessors = <PropertyAccessorElement>[inheritedGetter];
     ClassElementImpl classB =
         ElementFactory.classElement("B", interfaceTypeStar(classA));
@@ -446,7 +452,7 @@
     LibraryElementImpl library = _newLibrary();
     var classA = class_(name: 'A');
     String methodName = "m";
-    MethodElement method = ElementFactory.methodElement(methodName, null);
+    MethodElement method = ElementFactory.methodElement(methodName, intNone);
     classA.methods = <MethodElement>[method];
     (library.definingCompilationUnit as CompilationUnitElementImpl).types =
         <ClassElement>[classA];
@@ -464,11 +470,12 @@
     var classA = class_(name: 'A');
     String methodName = "m";
     MethodElement inheritedMethod =
-        ElementFactory.methodElement(methodName, null);
+        ElementFactory.methodElement(methodName, intNone);
     classA.methods = <MethodElement>[inheritedMethod];
     ClassElementImpl classB =
         ElementFactory.classElement("B", interfaceTypeStar(classA));
-    MethodElementImpl method = ElementFactory.methodElement(methodName, null);
+    MethodElementImpl method =
+        ElementFactory.methodElement(methodName, intNone);
     method.isAbstract = true;
     classB.methods = <MethodElement>[method];
     (library.definingCompilationUnit as CompilationUnitElementImpl).types =
@@ -488,11 +495,11 @@
     var classA = class_(name: 'A');
     String methodName = "m";
     MethodElement inheritedMethod =
-        ElementFactory.methodElement(methodName, null);
+        ElementFactory.methodElement(methodName, intNone);
     classA.methods = <MethodElement>[inheritedMethod];
     ClassElementImpl classB =
         ElementFactory.classElement("B", interfaceTypeStar(classA));
-    MethodElement method = ElementFactory.methodElement(methodName, null);
+    MethodElement method = ElementFactory.methodElement(methodName, intNone);
     classB.methods = <MethodElement>[method];
     (library.definingCompilationUnit as CompilationUnitElementImpl).types =
         <ClassElement>[classA, classB];
@@ -512,12 +519,12 @@
     classA.isAbstract = true;
     String methodName = "m";
     MethodElementImpl inheritedMethod =
-        ElementFactory.methodElement(methodName, null);
+        ElementFactory.methodElement(methodName, intNone);
     inheritedMethod.isAbstract = true;
     classA.methods = <MethodElement>[inheritedMethod];
     ClassElementImpl classB =
         ElementFactory.classElement("B", interfaceTypeStar(classA));
-    MethodElement method = ElementFactory.methodElement(methodName, null);
+    MethodElement method = ElementFactory.methodElement(methodName, intNone);
     classB.methods = <MethodElement>[method];
     (library.definingCompilationUnit as CompilationUnitElementImpl).types =
         <ClassElement>[classA, classB];
@@ -539,17 +546,18 @@
     var classA = class_(name: 'A');
     String methodName = "m";
     MethodElement inheritedMethod =
-        ElementFactory.methodElement(methodName, null);
+        ElementFactory.methodElement(methodName, intNone);
     classA.methods = <MethodElement>[inheritedMethod];
     ClassElementImpl classB =
         ElementFactory.classElement("B", interfaceTypeStar(classA));
     MethodElementImpl abstractMethod =
-        ElementFactory.methodElement(methodName, null);
+        ElementFactory.methodElement(methodName, intNone);
     abstractMethod.isAbstract = true;
     classB.methods = <MethodElement>[abstractMethod];
     ClassElementImpl classC =
         ElementFactory.classElement("C", interfaceTypeStar(classB));
-    MethodElementImpl method = ElementFactory.methodElement(methodName, null);
+    MethodElementImpl method =
+        ElementFactory.methodElement(methodName, intNone);
     classC.methods = <MethodElement>[method];
     (library.definingCompilationUnit as CompilationUnitElementImpl).types =
         <ClassElement>[classA, classB, classC];
@@ -567,7 +575,7 @@
     var classA = class_(name: 'A');
     String methodName = "m";
     MethodElement inheritedMethod =
-        ElementFactory.methodElement(methodName, null);
+        ElementFactory.methodElement(methodName, intNone);
     classA.methods = <MethodElement>[inheritedMethod];
     ClassElementImpl classB =
         ElementFactory.classElement("B", interfaceTypeStar(classA));
@@ -595,7 +603,7 @@
     var classA = class_(name: 'A');
     String setterName = "s";
     PropertyAccessorElement setter =
-        ElementFactory.setterElement(setterName, false, null);
+        ElementFactory.setterElement(setterName, false, intNone);
     classA.accessors = <PropertyAccessorElement>[setter];
     (library.definingCompilationUnit as CompilationUnitElementImpl).types =
         <ClassElement>[classA];
@@ -612,7 +620,7 @@
     var classA = class_(name: 'A');
     String setterName = "s";
     PropertyAccessorElement setter =
-        ElementFactory.setterElement(setterName, false, null);
+        ElementFactory.setterElement(setterName, false, intNone);
     classA.accessors = <PropertyAccessorElement>[setter];
     ClassElementImpl classB =
         ElementFactory.classElement("B", interfaceTypeStar(classA));
@@ -654,7 +662,7 @@
     LibraryElementImpl library = _newLibrary();
     var classA = class_(name: 'A');
     String methodName = "m";
-    MethodElement method = ElementFactory.methodElement(methodName, null);
+    MethodElement method = ElementFactory.methodElement(methodName, intNone);
     classA.methods = <MethodElement>[method];
     (library.definingCompilationUnit as CompilationUnitElementImpl).types =
         <ClassElement>[classA];
@@ -672,11 +680,11 @@
     var classA = class_(name: 'A');
     String methodName = "m";
     MethodElement inheritedMethod =
-        ElementFactory.methodElement(methodName, null);
+        ElementFactory.methodElement(methodName, intNone);
     classA.methods = <MethodElement>[inheritedMethod];
     ClassElementImpl classB =
         ElementFactory.classElement("B", interfaceTypeStar(classA));
-    MethodElement method = ElementFactory.methodElement(methodName, null);
+    MethodElement method = ElementFactory.methodElement(methodName, intNone);
     classB.methods = <MethodElement>[method];
     (library.definingCompilationUnit as CompilationUnitElementImpl).types =
         <ClassElement>[classA, classB];
@@ -694,7 +702,7 @@
     var classA = class_(name: 'A');
     String methodName = "m";
     MethodElement inheritedMethod =
-        ElementFactory.methodElement(methodName, null);
+        ElementFactory.methodElement(methodName, intNone);
     classA.methods = <MethodElement>[inheritedMethod];
     ClassElementImpl classB =
         ElementFactory.classElement("B", interfaceTypeStar(classA));
@@ -718,7 +726,7 @@
     LibraryElementImpl library = _newLibrary();
     var classA = class_(name: 'A');
     String methodName = "m";
-    MethodElement method = ElementFactory.methodElement(methodName, null);
+    MethodElement method = ElementFactory.methodElement(methodName, intNone);
     classA.methods = <MethodElement>[method];
     (library.definingCompilationUnit as CompilationUnitElementImpl).types =
         <ClassElement>[classA];
@@ -729,7 +737,7 @@
     LibraryElementImpl library = _newLibrary();
     var classA = class_(name: 'A');
     String methodName = "m";
-    MethodElement method = ElementFactory.methodElement(methodName, null);
+    MethodElement method = ElementFactory.methodElement(methodName, intNone);
     classA.methods = <MethodElement>[method];
     ClassElementImpl classB =
         ElementFactory.classElement("B", interfaceTypeStar(classA));
@@ -765,7 +773,7 @@
     var classA = class_(name: 'A');
     String setterName = "s";
     PropertyAccessorElement setter =
-        ElementFactory.setterElement(setterName, false, null);
+        ElementFactory.setterElement(setterName, false, intNone);
     classA.accessors = <PropertyAccessorElement>[setter];
     (library.definingCompilationUnit as CompilationUnitElementImpl).types =
         <ClassElement>[classA];
@@ -782,7 +790,7 @@
     var classA = class_(name: 'A');
     String setterName = "s";
     PropertyAccessorElement setter =
-        ElementFactory.setterElement(setterName, false, null);
+        ElementFactory.setterElement(setterName, false, intNone);
     classA.accessors = <PropertyAccessorElement>[setter];
     ClassElementImpl classB =
         ElementFactory.classElement("B", interfaceTypeStar(classA));
@@ -816,7 +824,8 @@
     expect(classA.lookUpSetter("s", library), isNull);
   }
 
-  LibraryElementImpl _newLibrary() => ElementFactory.library(null, 'lib');
+  LibraryElementImpl _newLibrary() =>
+      ElementFactory.library(_analysisContext, 'lib');
 }
 
 @reflectiveTest
@@ -857,13 +866,12 @@
 }
 ''');
     var argument = findNode.integerLiteral('3');
-    ParameterElement parameter = argument.staticParameterElement;
+    ParameterElement parameter = argument.staticParameterElement!;
 
     ElementAnnotation annotation = parameter.metadata[0];
 
-    DartObject value = annotation.computeConstantValue();
-    expect(value, isNotNull);
-    expect(value.getField('f').toStringValue(), 'x');
+    DartObject value = annotation.computeConstantValue()!;
+    expect(value.getField('f')!.toStringValue(), 'x');
   }
 }
 
@@ -939,8 +947,9 @@
     expect(element.isPrivate, isFalse);
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44522')
   void test_isPrivate_null() {
-    Element element = ElementFactory.classElement2(null);
+    Element element = ElementFactory.classElement2('A');
     expect(element.isPrivate, isTrue);
   }
 
@@ -954,8 +963,9 @@
     expect(element.isPublic, isFalse);
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44522')
   void test_isPublic_null() {
-    Element element = ElementFactory.classElement2(null);
+    Element element = ElementFactory.classElement2('A');
     expect(element.isPublic, isFalse);
   }
 
@@ -1047,10 +1057,10 @@
 ''');
     var B = findElement.enum_('B');
 
-    FieldElement b2Element = B.getField('B2');
+    FieldElement b2Element = B.getField('B2')!;
     expect(b2Element.isEnumConstant, isTrue);
 
-    FieldElement indexElement = B.getField('index');
+    FieldElement indexElement = B.getField('index')!;
     expect(indexElement.isEnumConstant, isFalse);
   }
 }
@@ -1188,7 +1198,7 @@
     );
 
     // Returns this.
-    expect(type.resolveToBound(null), same(type));
+    expect(type.resolveToBound(objectNone), same(type));
   }
 }
 
@@ -1230,8 +1240,8 @@
 
     B.interfaces = <InterfaceType>[AofC];
 
-    InterfaceTypeImpl targetType = interfaceTypeStar(B);
-    InterfaceType result = targetType.asInstanceOf(A);
+    var targetType = interfaceTypeStar(B);
+    var result = targetType.asInstanceOf(A);
     expect(result, AofC);
   }
 
@@ -1256,11 +1266,11 @@
 
     var C = class_(name: 'C');
 
-    InterfaceTypeImpl targetType = B.instantiate(
+    var targetType = B.instantiate(
       typeArguments: [interfaceTypeStar(C)],
       nullabilitySuffix: NullabilitySuffix.star,
     );
-    InterfaceType result = targetType.asInstanceOf(A);
+    var result = targetType.asInstanceOf(A);
     expect(
       result,
       A.instantiate(
@@ -1277,17 +1287,17 @@
   void test_getAccessors() {
     ClassElementImpl typeElement = class_(name: 'A');
     PropertyAccessorElement getterG =
-        ElementFactory.getterElement("g", false, null);
+        ElementFactory.getterElement("g", false, intNone);
     PropertyAccessorElement getterH =
-        ElementFactory.getterElement("h", false, null);
+        ElementFactory.getterElement("h", false, intNone);
     typeElement.accessors = <PropertyAccessorElement>[getterG, getterH];
-    InterfaceTypeImpl type = interfaceTypeStar(typeElement);
+    InterfaceType type = interfaceTypeStar(typeElement);
     expect(type.accessors.length, 2);
   }
 
   void test_getAccessors_empty() {
     ClassElementImpl typeElement = class_(name: 'A');
-    InterfaceTypeImpl type = interfaceTypeStar(typeElement);
+    InterfaceType type = interfaceTypeStar(typeElement);
     expect(type.accessors.length, 0);
   }
 
@@ -1301,20 +1311,20 @@
       constructorOne,
       constructorTwo
     ];
-    InterfaceTypeImpl type = interfaceTypeStar(typeElement);
+    InterfaceType type = interfaceTypeStar(typeElement);
     expect(type.constructors, hasLength(2));
   }
 
   void test_getConstructors_empty() {
     ClassElementImpl typeElement = class_(name: 'A');
     typeElement.constructors = const <ConstructorElement>[];
-    InterfaceTypeImpl type = interfaceTypeStar(typeElement);
+    InterfaceType type = interfaceTypeStar(typeElement);
     expect(type.constructors, isEmpty);
   }
 
   void test_getElement() {
     ClassElementImpl typeElement = class_(name: 'A');
-    InterfaceTypeImpl type = interfaceTypeStar(typeElement);
+    InterfaceType type = interfaceTypeStar(typeElement);
     expect(type.element, typeElement);
   }
 
@@ -1325,7 +1335,7 @@
     var classA = class_(name: 'A');
     String getterName = "g";
     PropertyAccessorElement getterG =
-        ElementFactory.getterElement(getterName, false, null);
+        ElementFactory.getterElement(getterName, false, intNone);
     classA.accessors = <PropertyAccessorElement>[getterG];
     InterfaceType typeA = interfaceTypeStar(classA);
     expect(typeA.getGetter(getterName), same(getterG));
@@ -1346,13 +1356,13 @@
     //
     // A<I>
     //
-    InterfaceType I = interfaceTypeStar(class_(name: 'I'));
-    InterfaceTypeImpl AofI = A.instantiate(
+    var I = interfaceTypeStar(class_(name: 'I'));
+    var AofI = A.instantiate(
       typeArguments: [I],
       nullabilitySuffix: NullabilitySuffix.star,
     );
 
-    PropertyAccessorElement getter = AofI.getGetter(getterName);
+    PropertyAccessorElement getter = AofI.getGetter(getterName)!;
     expect(getter, isNotNull);
     FunctionType getterType = getter.type;
     expect(getterType.returnType, same(I));
@@ -1408,8 +1418,8 @@
     //
     // B<I>
     //
-    InterfaceType typeI = interfaceTypeStar(class_(name: 'I'));
-    InterfaceTypeImpl typeBI = interfaceTypeStar(B, typeArguments: [typeI]);
+    var typeI = interfaceTypeStar(class_(name: 'I'));
+    var typeBI = interfaceTypeStar(B, typeArguments: [typeI]);
 
     List<InterfaceType> interfaces = typeBI.interfaces;
     expect(interfaces, hasLength(1));
@@ -1424,7 +1434,8 @@
     //
     var classA = class_(name: 'A');
     String methodName = "m";
-    MethodElementImpl methodM = ElementFactory.methodElement(methodName, null);
+    MethodElementImpl methodM =
+        ElementFactory.methodElement(methodName, intNone);
     classA.methods = <MethodElement>[methodM];
     InterfaceType typeA = interfaceTypeStar(classA);
     expect(typeA.getMethod(methodName), same(methodM));
@@ -1444,10 +1455,9 @@
     //
     // A<I>
     //
-    InterfaceType typeI = interfaceTypeStar(class_(name: 'I'));
-    InterfaceTypeImpl typeAI =
-        interfaceTypeStar(A, typeArguments: <DartType>[typeI]);
-    MethodElement method = typeAI.getMethod(methodName);
+    var typeI = interfaceTypeStar(class_(name: 'I'));
+    var typeAI = interfaceTypeStar(A, typeArguments: <DartType>[typeI]);
+    MethodElement method = typeAI.getMethod(methodName)!;
     expect(method, isNotNull);
     FunctionType methodType = method.type;
     expect(methodType.typeArguments, isEmpty);
@@ -1468,16 +1478,16 @@
 
   void test_getMethods() {
     ClassElementImpl typeElement = class_(name: 'A');
-    MethodElementImpl methodOne = ElementFactory.methodElement("one", null);
-    MethodElementImpl methodTwo = ElementFactory.methodElement("two", null);
+    MethodElementImpl methodOne = ElementFactory.methodElement("one", intNone);
+    MethodElementImpl methodTwo = ElementFactory.methodElement("two", intNone);
     typeElement.methods = <MethodElement>[methodOne, methodTwo];
-    InterfaceTypeImpl type = interfaceTypeStar(typeElement);
+    InterfaceType type = interfaceTypeStar(typeElement);
     expect(type.methods.length, 2);
   }
 
   void test_getMethods_empty() {
     ClassElementImpl typeElement = class_(name: 'A');
-    InterfaceTypeImpl type = interfaceTypeStar(typeElement);
+    InterfaceType type = interfaceTypeStar(typeElement);
     expect(type.methods.length, 0);
   }
 
@@ -1523,8 +1533,7 @@
     // B<I>
     //
     InterfaceType typeI = interfaceTypeStar(class_(name: 'I'));
-    InterfaceTypeImpl typeBI =
-        interfaceTypeStar(B, typeArguments: <DartType>[typeI]);
+    var typeBI = interfaceTypeStar(B, typeArguments: <DartType>[typeI]);
     List<InterfaceType> interfaces = typeBI.mixins;
     expect(interfaces, hasLength(1));
     InterfaceType result = interfaces[0];
@@ -1539,7 +1548,7 @@
     var classA = class_(name: 'A');
     String setterName = "s";
     PropertyAccessorElement setterS =
-        ElementFactory.setterElement(setterName, false, null);
+        ElementFactory.setterElement(setterName, false, intNone);
     classA.accessors = <PropertyAccessorElement>[setterS];
     InterfaceType typeA = interfaceTypeStar(classA);
     expect(typeA.getSetter(setterName), same(setterS));
@@ -1559,10 +1568,9 @@
     //
     // A<I>
     //
-    InterfaceType typeI = interfaceTypeStar(class_(name: 'I'));
-    InterfaceTypeImpl typeAI =
-        interfaceTypeStar(A, typeArguments: <DartType>[typeI]);
-    PropertyAccessorElement setter = typeAI.getSetter(setterName);
+    var typeI = interfaceTypeStar(class_(name: 'I'));
+    var typeAI = interfaceTypeStar(A, typeArguments: <DartType>[typeI]);
+    PropertyAccessorElement setter = typeAI.getSetter(setterName)!;
     expect(setter, isNotNull);
     FunctionType setterType = setter.type;
     List<DartType> parameterTypes = setterType.normalParameterTypes;
@@ -1611,10 +1619,9 @@
     //
     // B<I>
     //
-    InterfaceType typeI = interfaceTypeStar(class_(name: 'I'));
-    InterfaceTypeImpl typeBI =
-        interfaceTypeStar(classB, typeArguments: <DartType>[typeI]);
-    InterfaceType superclass = typeBI.superclass;
+    var typeI = interfaceTypeStar(class_(name: 'I'));
+    var typeBI = interfaceTypeStar(classB, typeArguments: <DartType>[typeI]);
+    InterfaceType superclass = typeBI.superclass!;
     expect(superclass.element, same(A));
     expect(superclass.typeArguments[0], same(typeI));
   }
@@ -1638,7 +1645,7 @@
     var classA = class_(name: 'A');
     String getterName = "g";
     PropertyAccessorElement getterG =
-        ElementFactory.getterElement(getterName, false, null);
+        ElementFactory.getterElement(getterName, false, intNone);
     classA.accessors = <PropertyAccessorElement>[getterG];
     InterfaceType typeA = interfaceTypeStar(classA);
     LibraryElementImpl library =
@@ -1657,7 +1664,7 @@
     var classA = class_(name: 'A');
     String getterName = "g";
     PropertyAccessorElement getterG =
-        ElementFactory.getterElement(getterName, false, null);
+        ElementFactory.getterElement(getterName, false, intNone);
     classA.accessors = <PropertyAccessorElement>[getterG];
     ClassElementImpl classB =
         ElementFactory.classElement("B", interfaceTypeStar(classA));
@@ -1696,7 +1703,7 @@
     ];
     LibraryElementImpl library =
         ElementFactory.library(_analysisContext, "lib");
-    CompilationUnitElementImpl unit = library.definingCompilationUnit;
+    var unit = library.definingCompilationUnit as CompilationUnitElementImpl;
     unit.types = <ClassElement>[classB, classM1, classM2, classC];
     expect(
         interfaceTypeStar(classC).lookUpGetter(getterName, library), getterM2g);
@@ -1740,7 +1747,8 @@
     //
     var classA = class_(name: 'A');
     String methodName = "m";
-    MethodElementImpl methodM = ElementFactory.methodElement(methodName, null);
+    MethodElementImpl methodM =
+        ElementFactory.methodElement(methodName, intNone);
     classA.methods = <MethodElement>[methodM];
     InterfaceType typeA = interfaceTypeStar(classA);
     LibraryElementImpl library =
@@ -1758,7 +1766,8 @@
     //
     var classA = class_(name: 'A');
     String methodName = "m";
-    MethodElementImpl methodM = ElementFactory.methodElement(methodName, null);
+    MethodElementImpl methodM =
+        ElementFactory.methodElement(methodName, intNone);
     classA.methods = <MethodElement>[methodM];
     ClassElementImpl classB =
         ElementFactory.classElement("B", interfaceTypeStar(classA));
@@ -1782,11 +1791,11 @@
     var classB = class_(name: 'B');
     ClassElementImpl classM1 = ElementFactory.classElement2('M1');
     MethodElementImpl methodM1m =
-        ElementFactory.methodElement(methodName, null);
+        ElementFactory.methodElement(methodName, intNone);
     classM1.methods = <MethodElement>[methodM1m];
     ClassElementImpl classM2 = ElementFactory.classElement2('M2');
     MethodElementImpl methodM2m =
-        ElementFactory.methodElement(methodName, null);
+        ElementFactory.methodElement(methodName, intNone);
     classM2.methods = <MethodElement>[methodM2m];
     ClassElementImpl classC =
         ElementFactory.classElement('C', interfaceTypeStar(classB));
@@ -1796,12 +1805,13 @@
     ];
     LibraryElementImpl library =
         ElementFactory.library(_analysisContext, "lib");
-    CompilationUnitElementImpl unit = library.definingCompilationUnit;
+    var unit = library.definingCompilationUnit as CompilationUnitElementImpl;
     unit.types = <ClassElement>[classB, classM1, classM2, classC];
     expect(
         interfaceTypeStar(classC).lookUpMethod(methodName, library), methodM2m);
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44522')
   @deprecated
   void test_lookUpMethod_parameterized() {
     //
@@ -1831,10 +1841,9 @@
     //
     // B<I>
     //
-    InterfaceType typeI = interfaceTypeStar(class_(name: 'I'));
-    InterfaceTypeImpl typeBI =
-        interfaceTypeStar(B, typeArguments: <DartType>[typeI]);
-    MethodElement method = typeBI.lookUpMethod(methodName, library);
+    var typeI = interfaceTypeStar(class_(name: 'I'));
+    var typeBI = interfaceTypeStar(B, typeArguments: <DartType>[typeI]);
+    MethodElement method = typeBI.lookUpMethod(methodName, library)!;
     expect(method, isNotNull);
     FunctionType methodType = method.type;
     expect(methodType.returnType, same(typeI));
@@ -1882,7 +1891,7 @@
     var classA = class_(name: 'A');
     String setterName = "s";
     PropertyAccessorElement setterS =
-        ElementFactory.setterElement(setterName, false, null);
+        ElementFactory.setterElement(setterName, false, intNone);
     classA.accessors = <PropertyAccessorElement>[setterS];
     InterfaceType typeA = interfaceTypeStar(classA);
     LibraryElementImpl library =
@@ -1901,7 +1910,7 @@
     var classA = class_(name: 'A');
     String setterName = "g";
     PropertyAccessorElement setterS =
-        ElementFactory.setterElement(setterName, false, null);
+        ElementFactory.setterElement(setterName, false, intNone);
     classA.accessors = <PropertyAccessorElement>[setterS];
     ClassElementImpl classB =
         ElementFactory.classElement("B", interfaceTypeStar(classA));
@@ -1940,7 +1949,7 @@
     ];
     LibraryElementImpl library =
         ElementFactory.library(_analysisContext, "lib");
-    CompilationUnitElementImpl unit = library.definingCompilationUnit;
+    var unit = library.definingCompilationUnit as CompilationUnitElementImpl;
     unit.types = <ClassElement>[classB, classM1, classM2, classC];
     expect(
         interfaceTypeStar(classC).lookUpGetter(setterName, library), setterM2g);
@@ -1978,11 +1987,10 @@
   }
 
   void test_resolveToBound() {
-    InterfaceTypeImpl type =
-        interfaceTypeStar(ElementFactory.classElement2('A'));
+    var type = interfaceTypeStar(ElementFactory.classElement2('A'));
 
     // Returns this.
-    expect(type.resolveToBound(null), same(type));
+    expect(type.resolveToBound(objectNone), same(type));
   }
 }
 
@@ -2049,7 +2057,12 @@
   void test_setImports() {
     AnalysisContext context = TestAnalysisContext();
     LibraryElementImpl library = LibraryElementImpl(
-        context, null, 'l1', -1, 0, FeatureSet.latestLanguageVersion());
+        context,
+        _AnalysisSessionMock(),
+        'l1',
+        -1,
+        0,
+        FeatureSet.latestLanguageVersion());
     List<ImportElementImpl> expectedImports = [
       ElementFactory.importFor(ElementFactory.library(context, "l2"), null),
       ElementFactory.importFor(ElementFactory.library(context, "l3"), null)
@@ -2076,10 +2089,10 @@
 }
 ''');
     SimpleIdentifier argument = findNode.simple('C);');
-    PropertyAccessorElementImpl getter = argument.staticElement;
-    TopLevelVariableElement constant = getter.variable;
+    var getter = argument.staticElement as PropertyAccessorElementImpl;
+    var constant = getter.variable as TopLevelVariableElement;
 
-    DartObject value = constant.computeConstantValue();
+    DartObject value = constant.computeConstantValue()!;
     expect(value, isNotNull);
     expect(value.toIntValue(), 42);
   }
@@ -2153,7 +2166,7 @@
     TypeParameterElementImpl element = TypeParameterElementImpl('E', -1);
     element.bound = interfaceTypeStar(classS);
     TypeParameterTypeImpl type = typeParameterTypeStar(element);
-    expect(type.resolveToBound(null), interfaceTypeStar(classS));
+    expect(type.resolveToBound(objectNone), interfaceTypeStar(classS));
   }
 
   void test_resolveToBound_bound_nullableInner() {
@@ -2161,60 +2174,62 @@
     TypeParameterElementImpl element = TypeParameterElementImpl('E', -1);
     element.bound = interfaceTypeQuestion(classS);
     TypeParameterTypeImpl type = typeParameterTypeStar(element);
-    expect(type.resolveToBound(null), same(element.bound));
+    expect(type.resolveToBound(objectNone), same(element.bound));
   }
 
   void test_resolveToBound_bound_nullableInnerOuter() {
     ClassElementImpl classS = class_(name: 'A');
     TypeParameterElementImpl element = TypeParameterElementImpl('E', -1);
     element.bound = interfaceTypeQuestion(classS);
-    TypeParameterTypeImpl type = typeParameterTypeStar(element)
+    var type = typeParameterTypeStar(element)
         .withNullability(NullabilitySuffix.question);
-    expect(type.resolveToBound(null), same(element.bound));
+    expect(type.resolveToBound(objectNone), same(element.bound));
   }
 
   void test_resolveToBound_bound_nullableInnerStarOuter() {
     ClassElementImpl classS = class_(name: 'A');
     TypeParameterElementImpl element = TypeParameterElementImpl('E', -1);
     element.bound = interfaceTypeQuestion(classS);
-    TypeParameterTypeImpl type = typeParameterTypeStar(element)
+    var type = typeParameterTypeStar(element)
         .withNullability(NullabilitySuffix.question);
-    expect(type.resolveToBound(null), equals(interfaceTypeQuestion(classS)));
+    expect(
+        type.resolveToBound(objectNone), equals(interfaceTypeQuestion(classS)));
   }
 
   void test_resolveToBound_bound_nullableOuter() {
     ClassElementImpl classS = class_(name: 'A');
     TypeParameterElementImpl element = TypeParameterElementImpl('E', -1);
     element.bound = interfaceTypeStar(classS);
-    TypeParameterTypeImpl type = typeParameterTypeStar(element)
+    var type = typeParameterTypeStar(element)
         .withNullability(NullabilitySuffix.question);
-    expect(type.resolveToBound(null), equals(interfaceTypeQuestion(classS)));
+    expect(
+        type.resolveToBound(objectNone), equals(interfaceTypeQuestion(classS)));
   }
 
   void test_resolveToBound_bound_starInner() {
     ClassElementImpl classS = class_(name: 'A');
     TypeParameterElementImpl element = TypeParameterElementImpl('E', -1);
     element.bound = interfaceTypeStar(classS);
-    TypeParameterTypeImpl type = typeParameterTypeStar(element);
-    expect(type.resolveToBound(null), same(element.bound));
+    var type = typeParameterTypeStar(element);
+    expect(type.resolveToBound(objectNone), same(element.bound));
   }
 
   void test_resolveToBound_bound_starInnerNullableOuter() {
     ClassElementImpl classS = class_(name: 'A');
     TypeParameterElementImpl element = TypeParameterElementImpl('E', -1);
     element.bound = interfaceTypeQuestion(classS);
-    TypeParameterTypeImpl type =
+    var type =
         typeParameterTypeStar(element).withNullability(NullabilitySuffix.star);
-    expect(type.resolveToBound(null), same(element.bound));
+    expect(type.resolveToBound(objectNone), same(element.bound));
   }
 
   void test_resolveToBound_bound_starOuter() {
     ClassElementImpl classS = class_(name: 'A');
     TypeParameterElementImpl element = TypeParameterElementImpl('E', -1);
     element.bound = interfaceTypeStar(classS);
-    TypeParameterTypeImpl type =
+    var type =
         typeParameterTypeStar(element).withNullability(NullabilitySuffix.star);
-    expect(type.resolveToBound(null), interfaceTypeStar(classS));
+    expect(type.resolveToBound(objectNone), interfaceTypeStar(classS));
   }
 
   void test_resolveToBound_nestedBound() {
@@ -2225,7 +2240,7 @@
     TypeParameterElementImpl elementF = TypeParameterElementImpl('F', -1);
     elementF.bound = typeE;
     TypeParameterTypeImpl typeF = typeParameterTypeStar(elementE);
-    expect(typeF.resolveToBound(null), interfaceTypeStar(classS));
+    expect(typeF.resolveToBound(objectNone), interfaceTypeStar(classS));
   }
 
   void test_resolveToBound_unbound() {
@@ -2239,7 +2254,7 @@
   void _assert_asInstanceOf(
     DartType type,
     ClassElement element,
-    String expected,
+    String? expected,
   ) {
     var result = (type as TypeImpl).asInstanceOf(element);
     expect(
@@ -2255,8 +2270,10 @@
     await resolveTestCode('''
 void f() => [() => 0, () => 1];
 ''');
-    expect(findNode.functionExpression('() => 0').declaredElement.location,
-        isNot(findNode.functionExpression('() => 1').declaredElement.location));
+    expect(
+        findNode.functionExpression('() => 0').declaredElement!.location,
+        isNot(
+            findNode.functionExpression('() => 1').declaredElement!.location));
   }
 
   test_ambiguous_closure_in_local_variable() async {
@@ -2265,16 +2282,20 @@
   var x = [() => 0, () => 1];
 }
 ''');
-    expect(findNode.functionExpression('() => 0').declaredElement.location,
-        isNot(findNode.functionExpression('() => 1').declaredElement.location));
+    expect(
+        findNode.functionExpression('() => 0').declaredElement!.location,
+        isNot(
+            findNode.functionExpression('() => 1').declaredElement!.location));
   }
 
   test_ambiguous_closure_in_top_level_variable() async {
     await resolveTestCode('''
 var x = [() => 0, () => 1];
 ''');
-    expect(findNode.functionExpression('() => 0').declaredElement.location,
-        isNot(findNode.functionExpression('() => 1').declaredElement.location));
+    expect(
+        findNode.functionExpression('() => 0').declaredElement!.location,
+        isNot(
+            findNode.functionExpression('() => 1').declaredElement!.location));
   }
 
   test_ambiguous_local_variable_in_executable() async {
@@ -2288,8 +2309,8 @@
   }
 }
 ''');
-    expect(findNode.variableDeclaration('x = 0').declaredElement.location,
-        isNot(findNode.variableDeclaration('x = 1').declaredElement.location));
+    expect(findNode.variableDeclaration('x = 0').declaredElement!.location,
+        isNot(findNode.variableDeclaration('x = 1').declaredElement!.location));
   }
 }
 
@@ -2304,6 +2325,11 @@
 
   void test_resolveToBound() {
     // Returns this.
-    expect(_voidType.resolveToBound(null), same(_voidType));
+    expect(_voidType.resolveToBound(objectNone), same(_voidType));
   }
 }
+
+class _AnalysisSessionMock implements AnalysisSession {
+  @override
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
diff --git a/pkg/analyzer/test/src/dart/element/factor_type_test.dart b/pkg/analyzer/test/src/dart/element/factor_type_test.dart
index cfd1420..240c5bf 100644
--- a/pkg/analyzer/test/src/dart/element/factor_type_test.dart
+++ b/pkg/analyzer/test/src/dart/element/factor_type_test.dart
@@ -23,9 +23,9 @@
 @reflectiveTest
 class FactorTypeTest with FactorTypeTestMixin<DartType>, ElementsTypesMixin {
   @override
-  TypeProvider typeProvider;
+  late final TypeProvider typeProvider;
 
-  TypeSystemImpl typeSystem;
+  late final TypeSystemImpl typeSystem;
 
   FeatureSet get testFeatureSet {
     return FeatureSet.forTesting(
diff --git a/pkg/analyzer/test/src/dart/element/flatten_type_test.dart b/pkg/analyzer/test/src/dart/element/flatten_type_test.dart
index 878bcb0..105e799 100644
--- a/pkg/analyzer/test/src/dart/element/flatten_type_test.dart
+++ b/pkg/analyzer/test/src/dart/element/flatten_type_test.dart
@@ -22,9 +22,9 @@
 @reflectiveTest
 class FlattenTypeTest with ElementsTypesMixin {
   @override
-  TypeProvider typeProvider;
+  late final TypeProvider typeProvider;
 
-  TypeSystemImpl typeSystem;
+  late final TypeSystemImpl typeSystem;
 
   FeatureSet get testFeatureSet {
     return FeatureSet.forTesting(
diff --git a/pkg/analyzer/test/src/dart/element/function_type_test.dart b/pkg/analyzer/test/src/dart/element/function_type_test.dart
index 609d293..7fffdbf 100644
--- a/pkg/analyzer/test/src/dart/element/function_type_test.dart
+++ b/pkg/analyzer/test/src/dart/element/function_type_test.dart
@@ -416,38 +416,6 @@
   }
 }
 
-class MockFunctionTypedElement implements FunctionTypedElement {
-  @override
-  final List<ParameterElement> parameters;
-
-  @override
-  final DartType returnType;
-
-  @override
-  final List<TypeParameterElement> typeParameters;
-
-  @override
-  final Element enclosingElement;
-
-  MockFunctionTypedElement(
-      {this.parameters = const [],
-      DartType returnType,
-      this.typeParameters = const [],
-      this.enclosingElement = const MockCompilationUnitElement()})
-      : returnType = returnType ?? dynamicType;
-
-  MockFunctionTypedElement.withNullReturn(
-      {this.parameters = const [],
-      this.typeParameters = const [],
-      this.enclosingElement = const MockCompilationUnitElement()})
-      : returnType = null;
-
-  @override
-  noSuchMethod(Invocation invocation) {
-    return super.noSuchMethod(invocation);
-  }
-}
-
 class MockLibraryElement implements LibraryElement {
   const MockLibraryElement();
 
diff --git a/pkg/analyzer/test/src/dart/element/generic_inferrer_test.dart b/pkg/analyzer/test/src/dart/element/generic_inferrer_test.dart
index 428784d..00ab99f 100644
--- a/pkg/analyzer/test/src/dart/element/generic_inferrer_test.dart
+++ b/pkg/analyzer/test/src/dart/element/generic_inferrer_test.dart
@@ -88,13 +88,13 @@
     // B b;
     // cOfB.m(b); // infer <B>
     _assertType(
-        _inferCall2(cOfB.getMethod('m').type, [typeB]), 'B Function(B)');
+        _inferCall2(cOfB.getMethod('m')!.type, [typeB]), 'B Function(B)');
     // cOfA.m(b); // infer <B>
     _assertType(
-        _inferCall2(cOfA.getMethod('m').type, [typeB]), 'B Function(B)');
+        _inferCall2(cOfA.getMethod('m')!.type, [typeB]), 'B Function(B)');
     // cOfObject.m(b); // infer <B>
     _assertType(
-        _inferCall2(cOfObject.getMethod('m').type, [typeB]), 'B Function(B)');
+        _inferCall2(cOfObject.getMethod('m')!.type, [typeB]), 'B Function(B)');
   }
 
   void test_boundedByOuterClassSubstituted() {
@@ -141,13 +141,13 @@
     // List<B> b;
     var listOfB = listNone(typeB);
     // cOfB.m(b); // infer <B>
-    _assertType(_inferCall2(cOfB.getMethod('m').type, [listOfB]),
+    _assertType(_inferCall2(cOfB.getMethod('m')!.type, [listOfB]),
         'List<B> Function(List<B>)');
     // cOfA.m(b); // infer <B>
-    _assertType(_inferCall2(cOfA.getMethod('m').type, [listOfB]),
+    _assertType(_inferCall2(cOfA.getMethod('m')!.type, [listOfB]),
         'List<B> Function(List<B>)');
     // cOfObject.m(b); // infer <B>
-    _assertType(_inferCall2(cOfObject.getMethod('m').type, [listOfB]),
+    _assertType(_inferCall2(cOfObject.getMethod('m')!.type, [listOfB]),
         'List<B> Function(List<B>)');
   }
 
@@ -636,8 +636,8 @@
     expect(actualStr, expectedStr);
   }
 
-  List<DartType> _inferCall(FunctionTypeImpl ft, List<DartType> arguments,
-      {DartType returnType, bool expectError = false}) {
+  List<DartType> _inferCall(FunctionType ft, List<DartType> arguments,
+      {DartType? returnType, bool expectError = false}) {
     var listener = RecordingErrorListener();
 
     var reporter = ErrorReporter(
@@ -663,11 +663,11 @@
     } else {
       expect(listener.errors, isEmpty, reason: 'did not expect any errors.');
     }
-    return typeArguments;
+    return typeArguments!;
   }
 
-  FunctionType _inferCall2(FunctionTypeImpl ft, List<DartType> arguments,
-      {DartType returnType, bool expectError = false}) {
+  FunctionType _inferCall2(FunctionType ft, List<DartType> arguments,
+      {DartType? returnType, bool expectError = false}) {
     var typeArguments = _inferCall(
       ft,
       arguments,
diff --git a/pkg/analyzer/test/src/dart/element/inheritance_manager3_test.dart b/pkg/analyzer/test/src/dart/element/inheritance_manager3_test.dart
index 562224c..f1f5973 100644
--- a/pkg/analyzer/test/src/dart/element/inheritance_manager3_test.dart
+++ b/pkg/analyzer/test/src/dart/element/inheritance_manager3_test.dart
@@ -5,7 +5,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/null_safety_understanding_flag.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
-import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -1284,7 +1283,7 @@
 }
 
 class _InheritanceManager3Base extends PubPackageResolutionTest {
-  InheritanceManager3 manager;
+  late final InheritanceManager3 manager;
 
   @override
   Future<void> resolveTestFile() async {
@@ -1292,8 +1291,8 @@
     manager = InheritanceManager3();
   }
 
-  void _assertExecutable(ExecutableElement element, String expected) {
-    if (expected != null) {
+  void _assertExecutable(ExecutableElement? element, String? expected) {
+    if (expected != null && element != null) {
       var enclosingElement = element.enclosingElement;
 
       var type = element.type;
@@ -1307,9 +1306,9 @@
   }
 
   void _assertGetInherited({
-    @required String className,
-    @required String name,
-    String expected,
+    required String className,
+    required String name,
+    String? expected,
   }) {
     var member = manager.getInherited2(
       findElement.classOrMixin(className),
@@ -1320,13 +1319,13 @@
   }
 
   void _assertGetMember({
-    @required String className,
-    @required String name,
-    String expected,
+    required String className,
+    required String name,
+    String? expected,
     bool concrete = false,
     bool forSuper = false,
   }) {
-    ExecutableElement member;
+    ExecutableElement? member;
     NullSafetyUnderstandingFlag.enableNullSafetyTypes(() {
       member = manager.getMember2(
         findElement.classOrMixin(className),
@@ -1340,9 +1339,9 @@
   }
 
   void _assertGetMember2({
-    @required String className,
-    @required String name,
-    String expected,
+    required String className,
+    required String name,
+    String? expected,
   }) {
     _assertGetMember(
       className: className,
@@ -1374,8 +1373,8 @@
   void _assertNameToExecutableMap(
       Map<Name, ExecutableElement> map, String expected) {
     var lines = <String>[];
-    for (var name in map.keys) {
-      var element = map[name];
+    for (var entry in map.entries) {
+      var element = entry.value;
       var type = element.type;
 
       var enclosingElement = element.enclosingElement;
diff --git a/pkg/analyzer/test/src/dart/element/least_greatest_closure_test.dart b/pkg/analyzer/test/src/dart/element/least_greatest_closure_test.dart
index 2d92505..8c1a570 100644
--- a/pkg/analyzer/test/src/dart/element/least_greatest_closure_test.dart
+++ b/pkg/analyzer/test/src/dart/element/least_greatest_closure_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -19,10 +18,10 @@
 
 @reflectiveTest
 class GreatestClosureLegacyTest extends AbstractTypeSystemTest {
-  TypeParameterElement T;
-  TypeParameterType T_none;
-  TypeParameterType T_question;
-  TypeParameterType T_star;
+  late final TypeParameterElement T;
+  late final TypeParameterType T_none;
+  late final TypeParameterType T_question;
+  late final TypeParameterType T_star;
 
   @override
   void setUp() {
@@ -120,8 +119,8 @@
 
   void _check(
     DartType type, {
-    @required String greatest,
-    @required String least,
+    required String greatest,
+    required String least,
   }) {
     var greatestResult = typeSystem.greatestClosure(type, [T]);
     expect(
@@ -143,10 +142,10 @@
 
 @reflectiveTest
 class GreatestClosureNullSafetyTest extends AbstractTypeSystemNullSafetyTest {
-  TypeParameterElement T;
-  TypeParameterType T_none;
-  TypeParameterType T_question;
-  TypeParameterType T_star;
+  late final TypeParameterElement T;
+  late final TypeParameterType T_none;
+  late final TypeParameterType T_question;
+  late final TypeParameterType T_star;
 
   @override
   void setUp() {
@@ -253,8 +252,8 @@
 
   void _check(
     DartType type, {
-    @required String greatest,
-    @required String least,
+    required String greatest,
+    required String least,
   }) {
     var greatestResult = typeSystem.greatestClosure(type, [T]);
     expect(
diff --git a/pkg/analyzer/test/src/dart/element/least_upper_bound_helper_test.dart b/pkg/analyzer/test/src/dart/element/least_upper_bound_helper_test.dart
index d99c0e8..c5e85ce 100644
--- a/pkg/analyzer/test/src/dart/element/least_upper_bound_helper_test.dart
+++ b/pkg/analyzer/test/src/dart/element/least_upper_bound_helper_test.dart
@@ -124,11 +124,11 @@
     //    \ /
     //     E
     //
-    ClassElementImpl classA = ElementFactory.classElement2("A");
-    ClassElementImpl classB = ElementFactory.classElement2("B");
-    ClassElementImpl classC = ElementFactory.classElement2("C");
-    ClassElementImpl classD = ElementFactory.classElement2("D");
-    ClassElementImpl classE = ElementFactory.classElement2("E");
+    ClassElementImpl classA = class_(name: "A");
+    ClassElementImpl classB = class_(name: "B");
+    ClassElementImpl classC = class_(name: "C");
+    ClassElementImpl classD = class_(name: "D");
+    ClassElementImpl classE = class_(name: "E");
     classB.interfaces = <InterfaceType>[interfaceTypeStar(classA)];
     classC.interfaces = <InterfaceType>[interfaceTypeStar(classA)];
     classD.interfaces = <InterfaceType>[interfaceTypeStar(classC)];
@@ -155,15 +155,15 @@
     //    \ /
     //     E
     //
-    ClassElement classA = ElementFactory.classElement2("A");
+    ClassElement classA = class_(name: "A");
     ClassElement classB =
-        ElementFactory.classElement("B", interfaceTypeStar(classA));
+        class_(name: "B", superType: interfaceTypeStar(classA));
     ClassElement classC =
-        ElementFactory.classElement("C", interfaceTypeStar(classA));
+        class_(name: "C", superType: interfaceTypeStar(classA));
     ClassElement classD =
-        ElementFactory.classElement("D", interfaceTypeStar(classC));
+        class_(name: "D", superType: interfaceTypeStar(classC));
     ClassElementImpl classE =
-        ElementFactory.classElement("E", interfaceTypeStar(classB));
+        class_(name: "E", superType: interfaceTypeStar(classB));
     classE.interfaces = <InterfaceType>[interfaceTypeStar(classD)];
     // assertion: even though the longest path to Object for typeB is 2, and
     // typeE extends typeB, the longest path for typeE is 4 since it also
@@ -177,9 +177,9 @@
   }
 
   void test_class_recursion() {
-    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classA = class_(name: "A");
     ClassElementImpl classB =
-        ElementFactory.classElement("B", interfaceTypeStar(classA));
+        class_(name: "B", superType: interfaceTypeStar(classA));
     classA.supertype = interfaceTypeStar(classB);
     expect(_longestPathToObject(classA), 2);
   }
@@ -194,9 +194,9 @@
     //     |
     //     C
     //
-    ClassElementImpl classA = ElementFactory.classElement2("A");
-    ClassElementImpl classB = ElementFactory.classElement2("B");
-    ClassElementImpl classC = ElementFactory.classElement2("C");
+    ClassElementImpl classA = class_(name: "A");
+    ClassElementImpl classB = class_(name: "B");
+    ClassElementImpl classC = class_(name: "C");
     classB.interfaces = <InterfaceType>[interfaceTypeStar(classA)];
     classC.interfaces = <InterfaceType>[interfaceTypeStar(classB)];
     expect(_longestPathToObject(classA), 1);
@@ -214,11 +214,11 @@
     //     |
     //     C
     //
-    ClassElement classA = ElementFactory.classElement2("A");
+    ClassElement classA = class_(name: "A");
     ClassElement classB =
-        ElementFactory.classElement("B", interfaceTypeStar(classA));
+        class_(name: "B", superType: interfaceTypeStar(classA));
     ClassElement classC =
-        ElementFactory.classElement("C", interfaceTypeStar(classB));
+        class_(name: "C", superType: interfaceTypeStar(classB));
     expect(_longestPathToObject(classA), 1);
     expect(_longestPathToObject(classB), 2);
     expect(_longestPathToObject(classC), 3);
@@ -432,26 +432,26 @@
 
     var instObject = InstantiatedClass.of(typeProvider.objectType);
 
-    ClassElementImpl classA = ElementFactory.classElement2('A');
+    ClassElementImpl classA = class_(name: 'A');
     var instA = InstantiatedClass(classA, const []);
 
-    var classB = ElementFactory.classElement3(
+    var classB = class_(
       name: 'B',
-      typeParameterNames: ['T'],
-      supertype: instA.withNullabilitySuffixNone,
+      typeParameters: [typeParameter('T')],
+      superType: instA.withNullabilitySuffixNone,
     );
 
     var typeParametersC = ElementFactory.typeParameters(['T']);
-    var classC = ElementFactory.classElement3(
+    var classC = class_(
       name: 'B',
       typeParameters: typeParametersC,
-      supertype: InstantiatedClass(
+      superType: InstantiatedClass(
         classB,
         [typeParameterTypeStar(typeParametersC[0])],
       ).withNullabilitySuffixNone,
     );
 
-    var classD = ElementFactory.classElement2('D');
+    var classD = class_(name: 'D');
 
     // A
     expect(
@@ -483,16 +483,16 @@
   void test_mixin_constraints() {
     var instObject = InstantiatedClass.of(typeProvider.objectType);
 
-    var classA = ElementFactory.classElement3(name: 'A');
+    var classA = class_(name: 'A');
     var instA = InstantiatedClass(classA, const []);
 
-    var classB = ElementFactory.classElement3(
+    var classB = class_(
       name: 'B',
       interfaces: [instA.withNullabilitySuffixNone],
     );
     var instB = InstantiatedClass(classB, const []);
 
-    var classC = ElementFactory.classElement3(name: 'C');
+    var classC = class_(name: 'C');
     var instC = InstantiatedClass(classC, const []);
 
     var mixinM = mixin_(
@@ -525,16 +525,16 @@
   void test_mixin_interfaces() {
     var instObject = InstantiatedClass.of(typeProvider.objectType);
 
-    var classA = ElementFactory.classElement3(name: 'A');
+    var classA = class_(name: 'A');
     var instA = InstantiatedClass(classA, const []);
 
-    var classB = ElementFactory.classElement3(
+    var classB = class_(
       name: 'B',
       interfaces: [instA.withNullabilitySuffixNone],
     );
     var instB = InstantiatedClass(classB, const []);
 
-    var classC = ElementFactory.classElement3(name: 'C');
+    var classC = class_(name: 'C');
     var instC = InstantiatedClass(classC, const []);
 
     var mixinM = mixin_(
@@ -555,28 +555,28 @@
   void test_multipleInterfacePaths() {
     var instObject = InstantiatedClass.of(typeProvider.objectType);
 
-    var classA = ElementFactory.classElement3(name: 'A');
+    var classA = class_(name: 'A');
     var instA = InstantiatedClass(classA, const []);
 
-    var classB = ElementFactory.classElement3(
+    var classB = class_(
       name: 'B',
       interfaces: [instA.withNullabilitySuffixNone],
     );
     var instB = InstantiatedClass(classB, const []);
 
-    var classC = ElementFactory.classElement3(
+    var classC = class_(
       name: 'C',
       interfaces: [instA.withNullabilitySuffixNone],
     );
     var instC = InstantiatedClass(classC, const []);
 
-    var classD = ElementFactory.classElement3(
+    var classD = class_(
       name: 'D',
       interfaces: [instC.withNullabilitySuffixNone],
     );
     var instD = InstantiatedClass(classD, const []);
 
-    var classE = ElementFactory.classElement3(
+    var classE = class_(
       name: 'E',
       interfaces: [
         instB.withNullabilitySuffixNone,
@@ -601,30 +601,30 @@
   void test_multipleSuperclassPaths() {
     var instObject = InstantiatedClass.of(typeProvider.objectType);
 
-    var classA = ElementFactory.classElement3(name: 'A');
+    var classA = class_(name: 'A');
     var instA = InstantiatedClass(classA, const []);
 
-    var classB = ElementFactory.classElement3(
+    var classB = class_(
       name: 'B',
-      supertype: instA.withNullabilitySuffixNone,
+      superType: instA.withNullabilitySuffixNone,
     );
     var instB = InstantiatedClass(classB, const []);
 
-    var classC = ElementFactory.classElement3(
+    var classC = class_(
       name: 'C',
-      supertype: instA.withNullabilitySuffixNone,
+      superType: instA.withNullabilitySuffixNone,
     );
     var instC = InstantiatedClass(classC, const []);
 
-    var classD = ElementFactory.classElement3(
+    var classD = class_(
       name: 'D',
-      supertype: instC.withNullabilitySuffixNone,
+      superType: instC.withNullabilitySuffixNone,
     );
     var instD = InstantiatedClass(classD, const []);
 
-    var classE = ElementFactory.classElement3(
+    var classE = class_(
       name: 'E',
-      supertype: instB.withNullabilitySuffixNone,
+      superType: instB.withNullabilitySuffixNone,
       interfaces: [
         instD.withNullabilitySuffixNone,
       ],
@@ -645,12 +645,12 @@
   }
 
   void test_recursion() {
-    var classA = ElementFactory.classElement3(name: 'A');
+    var classA = class_(name: 'A');
     var instA = InstantiatedClass(classA, const []);
 
-    var classB = ElementFactory.classElement3(
+    var classB = class_(
       name: 'B',
-      supertype: instA.withNullabilitySuffixNone,
+      superType: instA.withNullabilitySuffixNone,
     );
     var instB = InstantiatedClass(classB, const []);
 
@@ -670,16 +670,16 @@
   void test_singleInterfacePath() {
     var instObject = InstantiatedClass.of(typeProvider.objectType);
 
-    var classA = ElementFactory.classElement3(name: 'A');
+    var classA = class_(name: 'A');
     var instA = InstantiatedClass(classA, const []);
 
-    var classB = ElementFactory.classElement3(
+    var classB = class_(
       name: 'B',
       interfaces: [instA.withNullabilitySuffixNone],
     );
     var instB = InstantiatedClass(classB, const []);
 
-    var classC = ElementFactory.classElement3(
+    var classC = class_(
       name: 'C',
       interfaces: [instB.withNullabilitySuffixNone],
     );
@@ -714,18 +714,18 @@
     //
     var instObject = InstantiatedClass.of(typeProvider.objectType);
 
-    var classA = ElementFactory.classElement3(name: 'A');
+    var classA = class_(name: 'A');
     var instA = InstantiatedClass(classA, const []);
 
-    var classB = ElementFactory.classElement3(
+    var classB = class_(
       name: 'B',
-      supertype: instA.withNullabilitySuffixNone,
+      superType: instA.withNullabilitySuffixNone,
     );
     var instB = InstantiatedClass(classB, const []);
 
-    var classC = ElementFactory.classElement3(
+    var classC = class_(
       name: 'C',
-      supertype: instB.withNullabilitySuffixNone,
+      superType: instB.withNullabilitySuffixNone,
     );
     var instC = InstantiatedClass(classC, const []);
 
diff --git a/pkg/analyzer/test/src/dart/element/normalize_type_test.dart b/pkg/analyzer/test/src/dart/element/normalize_type_test.dart
index 9309834..f99b5a0 100644
--- a/pkg/analyzer/test/src/dart/element/normalize_type_test.dart
+++ b/pkg/analyzer/test/src/dart/element/normalize_type_test.dart
@@ -25,9 +25,9 @@
 @reflectiveTest
 class NormalizeTypeTest with ElementsTypesMixin {
   @override
-  TypeProvider typeProvider;
+  late final TypeProvider typeProvider;
 
-  TypeSystemImpl typeSystem;
+  late final TypeSystemImpl typeSystem;
 
   FeatureSet get testFeatureSet {
     return FeatureSet.forTesting(
@@ -504,7 +504,7 @@
     }
   }
 
-  String _typeParametersStr(TypeImpl type) {
+  String _typeParametersStr(DartType type) {
     var typeStr = '';
 
     var typeParameterCollector = _TypeParameterCollector();
@@ -515,8 +515,7 @@
     return typeStr;
   }
 
-  String _typeString(TypeImpl type) {
-    if (type == null) return null;
+  String _typeString(DartType type) {
     return type.getDisplayString(withNullability: true) +
         _typeParametersStr(type);
   }
diff --git a/pkg/analyzer/test/src/dart/element/nullability_eliminator_test.dart b/pkg/analyzer/test/src/dart/element/nullability_eliminator_test.dart
index 227d2cf..632677a 100644
--- a/pkg/analyzer/test/src/dart/element/nullability_eliminator_test.dart
+++ b/pkg/analyzer/test/src/dart/element/nullability_eliminator_test.dart
@@ -2,16 +2,13 @@
 // 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.
 
-import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/element/nullability_eliminator.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../../generated/elements_types_mixin.dart';
-import '../../../generated/test_analysis_context.dart';
+import '../../../generated/type_system_test.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -20,20 +17,7 @@
 }
 
 @reflectiveTest
-class NullabilityEliminatorTest with ElementsTypesMixin {
-  @override
-  TypeProvider typeProvider;
-
-  void setUp() {
-    var analysisContext = TestAnalysisContext(
-      featureSet: FeatureSet.forTesting(
-        sdkVersion: '2.6.0',
-        additionalFeatures: [Feature.non_nullable],
-      ),
-    );
-    typeProvider = analysisContext.typeProviderNonNullableByDefault;
-  }
-
+class NullabilityEliminatorTest extends AbstractTypeSystemNullSafetyTest {
   test_dynamicType() {
     _verifySame(typeProvider.dynamicType);
   }
@@ -172,12 +156,12 @@
     );
     expect(_typeToString(input), 'int Function()');
     expect(input.aliasElement, same(A));
-    expect(input.aliasArguments.map(_typeToString).join(', '), 'int');
+    expect(input.aliasArguments!.map(_typeToString).join(', '), 'int');
 
     var result = NullabilityEliminator.perform(typeProvider, input);
     expect(_typeToString(result), 'int* Function()*');
     expect(result.aliasElement, same(A));
-    expect(result.aliasArguments.map(_typeToString).join(', '), 'int*');
+    expect(result.aliasArguments!.map(_typeToString).join(', '), 'int*');
   }
 
   test_functionType_typeParameters() {
@@ -295,7 +279,7 @@
     var result = NullabilityEliminator.perform(typeProvider, input);
     expect(_typeToString(result), 'List<int*>*');
     expect(result.aliasElement, same(A));
-    expect(result.aliasArguments.map(_typeToString).join(', '), 'int*');
+    expect(result.aliasArguments!.map(_typeToString).join(', '), 'int*');
   }
 
   test_interfaceType_int() {
diff --git a/pkg/analyzer/test/src/dart/element/nullable_test.dart b/pkg/analyzer/test/src/dart/element/nullable_test.dart
index a2a8c54..1bfb595 100644
--- a/pkg/analyzer/test/src/dart/element/nullable_test.dart
+++ b/pkg/analyzer/test/src/dart/element/nullable_test.dart
@@ -6,7 +6,6 @@
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type.dart';
-import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -784,8 +783,8 @@
 
   void _checkTypeParameter(
     TypeParameterType type, {
-    @required TypeParameterElement element,
-    @required DartType promotedBound,
+    required TypeParameterElement element,
+    required DartType? promotedBound,
   }) {
     var actual = typeSystem.promoteToNonNull(type) as TypeParameterTypeImpl;
     expect(actual.element, same(element));
diff --git a/pkg/analyzer/test/src/dart/element/replace_top_bottom_test.dart b/pkg/analyzer/test/src/dart/element/replace_top_bottom_test.dart
index ea0ffef..8a6db58 100644
--- a/pkg/analyzer/test/src/dart/element/replace_top_bottom_test.dart
+++ b/pkg/analyzer/test/src/dart/element/replace_top_bottom_test.dart
@@ -5,7 +5,6 @@
 import 'package:analyzer/dart/element/null_safety_understanding_flag.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/resolver/variance.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -63,7 +62,7 @@
     _check(listStar(intStar), 'List<int*>*');
   }
 
-  void _check(DartType type, String expectedStr, {String typeStr}) {
+  void _check(DartType type, String expectedStr, {String? typeStr}) {
     NullSafetyUnderstandingFlag.enableNullSafetyTypes(() {
       if (typeStr != null) {
         expect(_typeString(type), typeStr);
@@ -75,7 +74,7 @@
     });
   }
 
-  String _typeString(TypeImpl type) {
+  String _typeString(DartType type) {
     return type.getDisplayString(withNullability: true);
   }
 }
@@ -163,7 +162,7 @@
     _check(F_dynamic, 'Never Function(Never)');
   }
 
-  void _check(DartType type, String expectedStr, {String typeStr}) {
+  void _check(DartType type, String expectedStr, {String? typeStr}) {
     NullSafetyUnderstandingFlag.enableNullSafetyTypes(() {
       if (typeStr != null) {
         expect(_typeString(type), typeStr);
@@ -175,7 +174,7 @@
     });
   }
 
-  String _typeString(TypeImpl type) {
+  String _typeString(DartType type) {
     return type.getDisplayString(withNullability: true);
   }
 }
diff --git a/pkg/analyzer/test/src/dart/element/runtime_type_equality_test.dart b/pkg/analyzer/test/src/dart/element/runtime_type_equality_test.dart
index 600019f..f7aee23 100644
--- a/pkg/analyzer/test/src/dart/element/runtime_type_equality_test.dart
+++ b/pkg/analyzer/test/src/dart/element/runtime_type_equality_test.dart
@@ -6,7 +6,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
-import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -23,9 +22,9 @@
 @reflectiveTest
 class RuntimeTypeEqualityTypeTest with ElementsTypesMixin {
   @override
-  TypeProvider typeProvider;
+  late final TypeProvider typeProvider;
 
-  TypeSystemImpl typeSystem;
+  late final TypeSystemImpl typeSystem;
 
   FeatureSet get testFeatureSet {
     return FeatureSet.forTesting(
@@ -353,8 +352,7 @@
     _check(T1, T2, false);
   }
 
-  String _typeString(TypeImpl type) {
-    if (type == null) return null;
+  String _typeString(DartType type) {
     return type.getDisplayString(withNullability: true);
   }
 }
diff --git a/pkg/analyzer/test/src/dart/element/subtype_test.dart b/pkg/analyzer/test/src/dart/element/subtype_test.dart
index 18b28e1..2a22d03 100644
--- a/pkg/analyzer/test/src/dart/element/subtype_test.dart
+++ b/pkg/analyzer/test/src/dart/element/subtype_test.dart
@@ -7,7 +7,6 @@
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_visitor.dart';
-import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/resolver/variance.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -270,7 +269,7 @@
 class SubtypeTest extends _SubtypingTestBase {
   final Map<String, DartType> _types = {};
 
-  void assertExpectedString(TypeImpl type, String expectedString) {
+  void assertExpectedString(DartType type, String? expectedString) {
     if (expectedString != null) {
       var typeStr = _typeStr(type);
 
@@ -283,8 +282,8 @@
   void isNotSubtype(
     DartType T0,
     DartType T1, {
-    String strT0,
-    String strT1,
+    required String strT0,
+    required String strT1,
   }) {
     assertExpectedString(T0, strT0);
     assertExpectedString(T1, strT1);
@@ -301,8 +300,8 @@
   }
 
   void isNotSubtype3({
-    String strT0,
-    String strT1,
+    required String strT0,
+    required String strT1,
   }) {
     isNotSubtype2(strT0, strT1);
   }
@@ -310,8 +309,8 @@
   void isSubtype(
     DartType T0,
     DartType T1, {
-    String strT0,
-    String strT1,
+    String? strT0,
+    String? strT1,
   }) {
     assertExpectedString(T0, strT0);
     assertExpectedString(T1, strT1);
@@ -5426,11 +5425,12 @@
   }
 
   void _defineType(String str, DartType type) {
-    for (var key in _types.keys) {
+    for (var entry in _types.entries) {
+      var key = entry.key;
       if (key == 'Never' || _typeStr(type) == 'Never') {
         // We have aliases for Never.
       } else {
-        var value = _types[key];
+        var value = entry.value;
         if (key == str) {
           fail('Duplicate type: $str;  existing: $value;  new: $type');
         }
@@ -5799,11 +5799,13 @@
 
   DartType _getTypeByStr(String str) {
     var type = _types[str];
-    expect(type, isNotNull, reason: 'No DartType for: $str');
+    if (type == null) {
+      fail('No DartType for: $str');
+    }
     return type;
   }
 
-  String _typeParametersStr(TypeImpl type) {
+  String _typeParametersStr(DartType type) {
     var typeStr = '';
 
     var typeParameterCollector = _TypeParameterCollector();
@@ -5933,10 +5935,10 @@
   }
 
   void _checkGroups(DartType t1,
-      {List<DartType> equivalents,
-      List<DartType> unrelated,
-      List<DartType> subtypes,
-      List<DartType> supertypes}) {
+      {List<DartType>? equivalents,
+      List<DartType>? unrelated,
+      List<DartType>? subtypes,
+      List<DartType>? supertypes}) {
     if (equivalents != null) {
       for (DartType t2 in equivalents) {
         _checkEquivalent(t1, t2);
@@ -6037,10 +6039,8 @@
 
       var str = '';
 
-      if (bound != null) {
-        var boundStr = bound.getDisplayString(withNullability: true);
-        str += '${type.element.name} extends ' + boundStr;
-      }
+      var boundStr = bound.getDisplayString(withNullability: true);
+      str += '${type.element.name} extends ' + boundStr;
 
       typeParameters.add(str);
     }
diff --git a/pkg/analyzer/test/src/dart/element/top_merge_test.dart b/pkg/analyzer/test/src/dart/element/top_merge_test.dart
index 8dec084..44ec079 100644
--- a/pkg/analyzer/test/src/dart/element/top_merge_test.dart
+++ b/pkg/analyzer/test/src/dart/element/top_merge_test.dart
@@ -344,9 +344,9 @@
 
 abstract class _Base with ElementsTypesMixin {
   @override
-  TypeProvider typeProvider;
+  late final TypeProvider typeProvider;
 
-  TypeSystemImpl typeSystem;
+  late final TypeSystemImpl typeSystem;
 
   FeatureSet get testFeatureSet {
     return FeatureSet.forTesting();
diff --git a/pkg/analyzer/test/src/dart/element/type_algebra_test.dart b/pkg/analyzer/test/src/dart/element/type_algebra_test.dart
index 298138f..15bf4c5 100644
--- a/pkg/analyzer/test/src/dart/element/type_algebra_test.dart
+++ b/pkg/analyzer/test/src/dart/element/type_algebra_test.dart
@@ -8,11 +8,10 @@
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_algebra.dart';
 import 'package:analyzer/src/dart/element/type_schema.dart';
-import 'package:analyzer/src/generated/testing/test_type_provider.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../../generated/elements_types_mixin.dart';
+import '../../../generated/type_system_test.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -32,7 +31,7 @@
     var T = typeParameter('T');
     var A = class_(name: 'A', typeParameters: [T]);
 
-    var type = interfaceTypeStar(A, typeArguments: [intType]);
+    var type = interfaceTypeNone(A, typeArguments: [intNone]);
 
     var result = Substitution.empty.substituteType(type);
     expect(result, same(type));
@@ -50,11 +49,11 @@
     var U = typeParameter('U');
     var B = class_(name: 'B', typeParameters: [U]);
 
-    var BofInt = interfaceTypeStar(B, typeArguments: [intType]);
+    var BofInt = interfaceTypeNone(B, typeArguments: [intNone]);
     var substitution = Substitution.fromInterfaceType(BofInt);
 
     // A<U>
-    var type = interfaceTypeStar(A, typeArguments: [typeParameterTypeStar(U)]);
+    var type = interfaceTypeNone(A, typeArguments: [typeParameterTypeNone(U)]);
     assertType(type, 'A<U>');
 
     var result = substitution.substituteType(type);
@@ -70,17 +69,17 @@
     var U = typeParameter('U');
     var A = class_(name: 'A', typeParameters: [T, U]);
 
-    var type = interfaceTypeStar(
+    var type = interfaceTypeNone(
       A,
       typeArguments: [
-        typeParameterTypeStar(T),
-        typeParameterTypeStar(U),
+        typeParameterTypeNone(T),
+        typeParameterTypeNone(U),
       ],
     );
 
     var result = Substitution.fromPairs(
       [T, U],
-      [intType, doubleType],
+      [intNone, doubleNone],
     ).substituteType(type);
     assertType(result, 'A<int, double>');
   }
@@ -91,16 +90,16 @@
   test_function() async {
     // T Function(T)
     var T = typeParameter('T');
-    var type = functionTypeStar(
+    var type = functionTypeNone(
       parameters: [
-        requiredParameter(type: typeParameterTypeStar(T)),
+        requiredParameter(type: typeParameterTypeNone(T)),
       ],
-      returnType: typeParameterTypeStar(T),
+      returnType: typeParameterTypeNone(T),
     );
 
     var result = Substitution.fromUpperAndLowerBounds(
       {T: typeProvider.intType},
-      {T: NeverTypeImpl.instance},
+      {T: neverNone},
     ).substituteType(type);
     assertType(result, 'int Function(Never)');
   }
@@ -110,47 +109,47 @@
 class SubstituteTest extends _Base {
   test_bottom() async {
     var T = typeParameter('T');
-    _assertIdenticalType(typeProvider.bottomType, {T: intType});
+    _assertIdenticalType(typeProvider.bottomType, {T: intNone});
   }
 
   test_dynamic() async {
     var T = typeParameter('T');
-    _assertIdenticalType(typeProvider.dynamicType, {T: intType});
+    _assertIdenticalType(typeProvider.dynamicType, {T: intNone});
   }
 
   test_function_noSubstitutions() async {
-    var type = functionTypeStar(
+    var type = functionTypeNone(
       parameters: [
-        requiredParameter(type: intType),
+        requiredParameter(type: intNone),
       ],
-      returnType: boolType,
+      returnType: boolNone,
     );
 
     var T = typeParameter('T');
-    _assertIdenticalType(type, {T: intType});
+    _assertIdenticalType(type, {T: intNone});
   }
 
   test_function_parameters_returnType() async {
     // typedef F<T, U> = T Function(U u, bool);
     var T = typeParameter('T');
     var U = typeParameter('U');
-    var type = functionTypeStar(
+    var type = functionTypeNone(
       parameters: [
-        requiredParameter(type: typeParameterTypeStar(U)),
-        requiredParameter(type: boolType),
+        requiredParameter(type: typeParameterTypeNone(U)),
+        requiredParameter(type: boolNone),
       ],
-      returnType: typeParameterTypeStar(T),
+      returnType: typeParameterTypeNone(T),
     );
 
     assertType(type, 'T Function(U, bool)');
     _assertSubstitution(
       type,
-      {T: intType},
+      {T: intNone},
       'int Function(U, bool)',
     );
     _assertSubstitution(
       type,
-      {T: intType, U: doubleType},
+      {T: intNone, U: doubleNone},
       'int Function(double, bool)',
     );
   }
@@ -158,19 +157,19 @@
   test_function_typeFormals() async {
     // typedef F<T> = T Function<U extends T>(U);
     var T = typeParameter('T');
-    var U = typeParameter('U', bound: typeParameterTypeStar(T));
-    var type = functionTypeStar(
+    var U = typeParameter('U', bound: typeParameterTypeNone(T));
+    var type = functionTypeNone(
       typeFormals: [U],
       parameters: [
-        requiredParameter(type: typeParameterTypeStar(U)),
+        requiredParameter(type: typeParameterTypeNone(U)),
       ],
-      returnType: typeParameterTypeStar(T),
+      returnType: typeParameterTypeNone(T),
     );
 
     assertType(type, 'T Function<U extends T>(U)');
     _assertSubstitution(
       type,
-      {T: intType},
+      {T: intNone},
       'int Function<U extends int>(U)',
     );
   }
@@ -187,14 +186,14 @@
     var T = typeParameter('T');
     var U = typeParameter('U');
     var V = typeParameter('V');
-    T.bound = interfaceTypeStar(classTriplet, typeArguments: [
-      typeParameterTypeStar(T),
-      typeParameterTypeStar(U),
-      typeParameterTypeStar(V),
+    T.bound = interfaceTypeNone(classTriplet, typeArguments: [
+      typeParameterTypeNone(T),
+      typeParameterTypeNone(U),
+      typeParameterTypeNone(V),
     ]);
-    var type = functionTypeStar(
+    var type = functionTypeNone(
       typeFormals: [T, U],
-      returnType: boolType,
+      returnType: boolNone,
     );
 
     assertType(
@@ -202,7 +201,7 @@
       'bool Function<T extends Triple<T, U, V>, U>()',
     );
 
-    var result = substitute(type, {V: intType}) as FunctionType;
+    var result = substitute(type, {V: intNone}) as FunctionType;
     assertType(
       result,
       'bool Function<T extends Triple<T, U, int>, U>()',
@@ -220,12 +219,12 @@
     var A = class_(name: 'A', typeParameters: [T]);
 
     var U = typeParameter('U');
-    var type = interfaceTypeStar(A, typeArguments: [
-      typeParameterTypeStar(U),
+    var type = interfaceTypeNone(A, typeArguments: [
+      typeParameterTypeNone(U),
     ]);
 
     assertType(type, 'A<U>');
-    _assertSubstitution(type, {U: intType}, 'A<int>');
+    _assertSubstitution(type, {U: intNone}, 'A<int>');
   }
 
   test_interface_arguments_deep() async {
@@ -233,26 +232,26 @@
     var A = class_(name: 'A', typeParameters: [T]);
 
     var U = typeParameter('U');
-    var type = interfaceTypeStar(A, typeArguments: [
-      interfaceTypeStar(
+    var type = interfaceTypeNone(A, typeArguments: [
+      interfaceTypeNone(
         typeProvider.listElement,
         typeArguments: [
-          typeParameterTypeStar(U),
+          typeParameterTypeNone(U),
         ],
       )
     ]);
     assertType(type, 'A<List<U>>');
 
-    _assertSubstitution(type, {U: intType}, 'A<List<int>>');
+    _assertSubstitution(type, {U: intNone}, 'A<List<int>>');
   }
 
   test_interface_noArguments() async {
     // class A {}
     var A = class_(name: 'A');
 
-    var type = interfaceTypeStar(A);
+    var type = interfaceTypeNone(A);
     var T = typeParameter('T');
-    _assertIdenticalType(type, {T: intType});
+    _assertIdenticalType(type, {T: intNone});
   }
 
   test_interface_noArguments_inArguments() async {
@@ -260,10 +259,10 @@
     var T = typeParameter('T');
     var A = class_(name: 'A', typeParameters: [T]);
 
-    var type = interfaceTypeStar(A, typeArguments: [intType]);
+    var type = interfaceTypeNone(A, typeArguments: [intNone]);
 
     var U = typeParameter('U');
-    _assertIdenticalType(type, {U: doubleType});
+    _assertIdenticalType(type, {U: doubleNone});
   }
 
   test_typeParameter_nullability() async {
@@ -271,8 +270,8 @@
 
     void check(
       NullabilitySuffix typeParameterNullability,
-      InterfaceTypeImpl typeArgument,
-      InterfaceTypeImpl expectedType,
+      InterfaceType typeArgument,
+      InterfaceType expectedType,
     ) {
       var result = Substitution.fromMap(
         {tElement: typeArgument},
@@ -300,16 +299,16 @@
 
   test_unknownInferredType() async {
     var T = typeParameter('T');
-    _assertIdenticalType(UnknownInferredType.instance, {T: intType});
+    _assertIdenticalType(UnknownInferredType.instance, {T: intNone});
   }
 
   test_void() async {
     var T = typeParameter('T');
-    _assertIdenticalType(typeProvider.voidType, {T: intType});
+    _assertIdenticalType(typeProvider.voidType, {T: intNone});
   }
 
   test_void_emptyMap() async {
-    _assertIdenticalType(intType, {});
+    _assertIdenticalType(intNone, {});
   }
 
   void _assertIdenticalType(
@@ -321,7 +320,7 @@
 
 @reflectiveTest
 class SubstituteWithNullabilityTest extends _Base {
-  SubstituteWithNullabilityTest() : super(useNnbd: true);
+  SubstituteWithNullabilityTest();
 
   test_interface_none() async {
     // class A<T> {}
@@ -335,7 +334,7 @@
       ],
       nullabilitySuffix: NullabilitySuffix.none,
     );
-    _assertSubstitution(type, {U: intType}, 'A<int>');
+    _assertSubstitution(type, {U: intNone}, 'A<int>');
   }
 
   test_interface_question() async {
@@ -350,7 +349,7 @@
       ],
       nullabilitySuffix: NullabilitySuffix.question,
     );
-    _assertSubstitution(type, {U: intType}, 'A<int>?');
+    _assertSubstitution(type, {U: intNone}, 'A<int>?');
   }
 
   test_interface_star() async {
@@ -365,31 +364,14 @@
       ],
       nullabilitySuffix: NullabilitySuffix.star,
     );
-    _assertSubstitution(type, {U: intType}, 'A<int>*');
+    _assertSubstitution(type, {U: intNone}, 'A<int>*');
   }
 }
 
-class _Base with ElementsTypesMixin {
-  @override
-  final TestTypeProvider typeProvider = TestTypeProvider();
-
-  /// TODO(scheglov) remove it
-  final bool useNnbd;
-
-  _Base({this.useNnbd = false});
-
-  InterfaceType get boolType => typeProvider.boolType;
-
-  InterfaceType get doubleType => typeProvider.doubleType;
-
-  InterfaceType get intType => typeProvider.intType;
-
-  /// Whether `DartType.toString()` with nullability should be asked.
-  bool get typeToStringWithNullability => useNnbd;
-
+class _Base extends AbstractTypeSystemNullSafetyTest {
   void assertType(DartType type, String expected) {
     var typeStr = type.getDisplayString(
-      withNullability: typeToStringWithNullability,
+      withNullability: true,
     );
     expect(typeStr, expected);
   }
diff --git a/pkg/analyzer/test/src/dart/element/type_constraint_gatherer_test.dart b/pkg/analyzer/test/src/dart/element/type_constraint_gatherer_test.dart
index 94d6e21..bed7bd4 100644
--- a/pkg/analyzer/test/src/dart/element/type_constraint_gatherer_test.dart
+++ b/pkg/analyzer/test/src/dart/element/type_constraint_gatherer_test.dart
@@ -6,7 +6,6 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_constraint_gatherer.dart';
 import 'package:analyzer/src/dart/element/type_schema.dart';
-import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -20,10 +19,10 @@
 
 @reflectiveTest
 class TypeConstraintGathererTest extends AbstractTypeSystemNullSafetyTest {
-  /*late*/ TypeParameterElement T;
-  /*late*/ TypeParameterType T_none;
-  /*late*/ TypeParameterType T_question;
-  /*late*/ TypeParameterType T_star;
+  late final TypeParameterElement T;
+  late final TypeParameterType T_none;
+  late final TypeParameterType T_question;
+  late final TypeParameterType T_star;
 
   UnknownInferredType get unknownType => UnknownInferredType.instance;
 
@@ -442,10 +441,10 @@
 
   test_functionType_noTypeFormals_parameters_leftOptionalPositional() {
     void check({
-      @required DartType left,
-      @required ParameterElement right,
-      @required bool leftSchema,
-      @required String expected,
+      required DartType left,
+      required ParameterElement right,
+      required bool leftSchema,
+      required String? expected,
     }) {
       var P = functionTypeNone(
         returnType: voidNone,
@@ -520,10 +519,10 @@
 
   test_functionType_noTypeFormals_parameters_leftRequiredPositional() {
     void check({
-      @required DartType left,
-      @required ParameterElement right,
-      @required bool leftSchema,
-      @required String expected,
+      required DartType left,
+      required ParameterElement right,
+      required bool leftSchema,
+      required String? expected,
     }) {
       var P = functionTypeNone(
         returnType: voidNone,
diff --git a/pkg/analyzer/test/src/dart/element/type_parameter_element_test.dart b/pkg/analyzer/test/src/dart/element/type_parameter_element_test.dart
index c6928f3..c809a6f 100644
--- a/pkg/analyzer/test/src/dart/element/type_parameter_element_test.dart
+++ b/pkg/analyzer/test/src/dart/element/type_parameter_element_test.dart
@@ -4,11 +4,10 @@
 
 import 'package:analyzer/dart/element/null_safety_understanding_flag.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/dart/element/element.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import 'element_test.dart';
+import '../../../generated/type_system_test.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -18,15 +17,12 @@
 }
 
 @reflectiveTest
-class TypeParameterElementTest extends _TypeParameterElementBase {
+class TypeParameterElementTest extends AbstractTypeSystemNullSafetyTest {
   test_equal_elementElement_sameLocation() {
     var T1 = typeParameter('T');
     var T2 = typeParameter('T');
     var U = typeParameter('U');
-
-    _setEnclosingElement(T1);
-    _setEnclosingElement(T2);
-    _setEnclosingElement(U);
+    class_(name: 'A', typeParameters: [T1, T2, U]);
 
     expect(T1 == T1, isTrue);
     expect(T2 == T2, isTrue);
@@ -50,13 +46,11 @@
 }
 
 @reflectiveTest
-class TypeParameterTypeTest extends _TypeParameterElementBase {
+class TypeParameterTypeTest extends AbstractTypeSystemNullSafetyTest {
   test_equal_equalElements() {
     var T1 = typeParameter('T');
     var T2 = typeParameter('T');
-
-    _setEnclosingElement(T1);
-    _setEnclosingElement(T2);
+    class_(name: 'A', typeParameters: [T1, T2]);
 
     _assertEqual(typeParameterTypeNone(T1), typeParameterTypeNone(T2), isTrue);
     _assertEqual(typeParameterTypeNone(T2), typeParameterTypeNone(T1), isTrue);
@@ -78,8 +72,7 @@
       typeParameterTypeStar(T2),
     ]);
 
-    _setEnclosingElement(T1);
-    _setEnclosingElement(T2);
+    class_(name: 'B', typeParameters: [T1, T2]);
 
     _assertEqual(typeParameterTypeNone(T1), typeParameterTypeNone(T2), isTrue);
     _assertEqual(typeParameterTypeNone(T2), typeParameterTypeNone(T1), isTrue);
@@ -90,7 +83,7 @@
 
   test_equal_sameElement_promotedBounds() {
     var T = typeParameter('T');
-    _setEnclosingElement(T);
+    class_(name: 'A', typeParameters: [T]);
 
     _assertEqual(
       promotedTypeParameterTypeNone(T, intNone),
@@ -159,10 +152,3 @@
     });
   }
 }
-
-class _TypeParameterElementBase extends AbstractTypeTest {
-  /// Ensure that the [element] has a location.
-  void _setEnclosingElement(TypeParameterElementImpl element) {
-    element.enclosingElement = method('foo', typeProvider.voidType);
-  }
-}
diff --git a/pkg/analyzer/test/src/dart/element/type_references_any_test.dart b/pkg/analyzer/test/src/dart/element/type_references_any_test.dart
index 60b8192..6a45016 100644
--- a/pkg/analyzer/test/src/dart/element/type_references_any_test.dart
+++ b/pkg/analyzer/test/src/dart/element/type_references_any_test.dart
@@ -18,8 +18,8 @@
 
 @reflectiveTest
 class TypeReferencesAnyTest extends AbstractTypeSystemNullSafetyTest {
-  TypeParameterElement T;
-  TypeParameterType T_none;
+  late TypeParameterElement T;
+  late TypeParameterType T_none;
 
   @override
   void setUp() {
diff --git a/pkg/analyzer/test/src/dart/element/type_visitor_test.dart b/pkg/analyzer/test/src/dart/element/type_visitor_test.dart
index 2989a22..b0bed4f 100644
--- a/pkg/analyzer/test/src/dart/element/type_visitor_test.dart
+++ b/pkg/analyzer/test/src/dart/element/type_visitor_test.dart
@@ -18,7 +18,7 @@
 
 @reflectiveTest
 class RecursiveTypeVisitorTest extends AbstractTypeTest {
-  _MockRecursiveVisitor visitor;
+  late final _MockRecursiveVisitor visitor;
 
   @override
   void setUp() {
@@ -179,8 +179,8 @@
 }
 
 class _MockRecursiveVisitor extends RecursiveTypeVisitor {
-  final visitedTypes = <DartType>{};
-  DartType stopOnType;
+  final Set<DartType> visitedTypes = {};
+  DartType? stopOnType;
 
   void assertNotVisitedType(DartType type) {
     expect(visitedTypes, isNot(contains(type)));
diff --git a/pkg/analyzer/test/src/dart/element/upper_lower_bound_test.dart b/pkg/analyzer/test/src/dart/element/upper_lower_bound_test.dart
index 6e4b9fe..2c3a877 100644
--- a/pkg/analyzer/test/src/dart/element/upper_lower_bound_test.dart
+++ b/pkg/analyzer/test/src/dart/element/upper_lower_bound_test.dart
@@ -1407,7 +1407,7 @@
   }
 
   test_typeParameter() {
-    void check({DartType bound, DartType T2}) {
+    void check({DartType? bound, required DartType T2}) {
       var T1 = typeParameterTypeNone(
         typeParameter('T', bound: bound),
       );
@@ -2094,14 +2094,14 @@
     var bElementStar = class_(name: 'B', superType: aStar);
     var bElementNone = class_(name: 'B', superType: aNone);
 
-    InterfaceTypeImpl _bTypeStarElement(NullabilitySuffix nullability) {
+    InterfaceType _bTypeStarElement(NullabilitySuffix nullability) {
       return interfaceType(
         bElementStar,
         nullabilitySuffix: nullability,
       );
     }
 
-    InterfaceTypeImpl _bTypeNoneElement(NullabilitySuffix nullability) {
+    InterfaceType _bTypeNoneElement(NullabilitySuffix nullability) {
       return interfaceType(
         bElementNone,
         nullabilitySuffix: nullability,
@@ -2310,14 +2310,14 @@
     var cElementNone = class_(name: 'C', superType: aNone);
     var cElementStar = class_(name: 'C', superType: aStar);
 
-    InterfaceTypeImpl bTypeElementNone(NullabilitySuffix nullability) {
+    InterfaceType bTypeElementNone(NullabilitySuffix nullability) {
       return interfaceType(
         bElementNone,
         nullabilitySuffix: nullability,
       );
     }
 
-    InterfaceTypeImpl bTypeElementStar(NullabilitySuffix nullability) {
+    InterfaceType bTypeElementStar(NullabilitySuffix nullability) {
       return interfaceType(
         bElementStar,
         nullabilitySuffix: nullability,
@@ -2332,14 +2332,14 @@
     var bStarStar = bTypeElementStar(NullabilitySuffix.star);
     var bStarNone = bTypeElementStar(NullabilitySuffix.none);
 
-    InterfaceTypeImpl cTypeElementNone(NullabilitySuffix nullability) {
+    InterfaceType cTypeElementNone(NullabilitySuffix nullability) {
       return interfaceType(
         cElementNone,
         nullabilitySuffix: nullability,
       );
     }
 
-    InterfaceTypeImpl cTypeElementStar(NullabilitySuffix nullability) {
+    InterfaceType cTypeElementStar(NullabilitySuffix nullability) {
       return interfaceType(
         cElementStar,
         nullabilitySuffix: nullability,
@@ -3260,8 +3260,8 @@
   void test_typeParameters_multi_basic() {
     // class A<out T, inout U, in V>
     var T = typeParameter('T', variance: Variance.covariant);
-    var U = typeParameter('T', variance: Variance.invariant);
-    var V = typeParameter('T', variance: Variance.contravariant);
+    var U = typeParameter('U', variance: Variance.invariant);
+    var V = typeParameter('V', variance: Variance.contravariant);
     var A = class_(name: 'A', typeParameters: [T, U, V]);
 
     // A<num, num, num>
@@ -3270,7 +3270,7 @@
       A,
       typeArguments: [numNone, numNone, numNone],
     );
-    var A_num_int_num = interfaceTypeNone(
+    var A_int_num_int = interfaceTypeNone(
       A,
       typeArguments: [intNone, numNone, intNone],
     );
@@ -3281,7 +3281,7 @@
       typeArguments: [numNone, numNone, intNone],
     );
 
-    _checkLeastUpperBound(A_num_num_num, A_num_int_num, A_num_num_int);
+    _checkLeastUpperBound(A_num_num_num, A_int_num_int, A_num_num_int);
   }
 
   void test_typeParameters_multi_objectInterface() {
@@ -3447,7 +3447,7 @@
     });
   }
 
-  String _typeParametersStr(TypeImpl type) {
+  String _typeParametersStr(DartType type) {
     var typeStr = '';
 
     var typeParameterCollector = _TypeParameterCollector();
@@ -3458,8 +3458,7 @@
     return typeStr;
   }
 
-  String _typeString(TypeImpl type) {
-    if (type == null) return null;
+  String _typeString(DartType type) {
     return type.getDisplayString(withNullability: true) +
         _typeParametersStr(type);
   }
diff --git a/pkg/analyzer/test/src/dart/micro/file_resolution.dart b/pkg/analyzer/test/src/dart/micro/file_resolution.dart
index 1cf1d10..d2c3eaf 100644
--- a/pkg/analyzer/test/src/dart/micro/file_resolution.dart
+++ b/pkg/analyzer/test/src/dart/micro/file_resolution.dart
@@ -14,7 +14,8 @@
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer/src/workspace/bazel.dart';
 import 'package:crypto/crypto.dart';
-import 'package:linter/src/rules.dart';
+
+// import 'package:linter/src/rules.dart';
 
 import '../resolution/resolution.dart';
 
@@ -26,10 +27,10 @@
       CiderCachedByteStore(20 * 1024 * 1024 /* 20 MB */);
 
   final StringBuffer logBuffer = StringBuffer();
-  PerformanceLog logger;
-  MockSdk sdk;
+  late PerformanceLog logger;
+  late MockSdk sdk;
 
-  FileResolver fileResolver;
+  late FileResolver fileResolver;
 
   @override
   void addTestFile(String content) {
@@ -43,7 +44,7 @@
     var workspace = BazelWorkspace.find(
       resourceProvider,
       convertPath(_testFile),
-    );
+    )!;
 
     byteStore.testView = CiderByteStoreTestView();
     fileResolver = FileResolver.from(
@@ -72,12 +73,12 @@
   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() {
-    registerLintRules();
+    // registerLintRules();
 
     logger = PerformanceLog(logBuffer);
     sdk = MockSdk(resourceProvider: resourceProvider);
diff --git a/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart b/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
index 2f77d87..65c8cdf 100644
--- a/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
+++ b/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
@@ -21,9 +21,9 @@
 
 @reflectiveTest
 class FileResolver_changeFile_Test extends FileResolutionTest {
-  String aPath;
-  String bPath;
-  String cPath;
+  late final String aPath;
+  late final String bPath;
+  late final String cPath;
 
   @override
   void setUp() {
@@ -207,7 +207,7 @@
         ..add(convertPath('/sdk/lib/math/math.dart'));
     }
 
-    var refreshedFiles = fileResolver.fsState.testView.refreshedFiles;
+    var refreshedFiles = fileResolver.fsState!.testView.refreshedFiles;
     expect(refreshedFiles, unorderedEquals(expectedPlusSdk));
 
     refreshedFiles.clear();
@@ -297,6 +297,7 @@
     ]);
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/linter/issues/2399')
   test_analysisOptions_lints() async {
     newFile('/workspace/dart/analysis_options/lib/default.yaml', content: r'''
 linter:
@@ -304,7 +305,7 @@
     - omit_local_variable_types
 ''');
 
-    var rule = Registry.ruleRegistry.getRule('omit_local_variable_types');
+    var rule = Registry.ruleRegistry.getRule('omit_local_variable_types')!;
 
     await assertErrorsInCode(r'''
 main() {
@@ -344,7 +345,7 @@
     await resolveFile(aPath);
     fileResolver.collectSharedDataIdentifiers();
     expect(fileResolver.removedCacheIds.length,
-        (fileResolver.byteStore as CiderCachedByteStore).testView.length);
+        (fileResolver.byteStore as CiderCachedByteStore).testView!.length);
   }
 
   test_getErrors() {
@@ -368,34 +369,34 @@
     var path = convertPath('/workspace/dart/test/lib/test.dart');
 
     // No resolved files yet.
-    expect(fileResolver.testView.resolvedFiles, isEmpty);
+    expect(fileResolver.testView!.resolvedFiles, isEmpty);
 
     // No cached, will resolve once.
     expect(getTestErrors().errors, hasLength(1));
-    expect(fileResolver.testView.resolvedFiles, [path]);
+    expect(fileResolver.testView!.resolvedFiles, [path]);
 
     // Has cached, will be not resolved again.
     expect(getTestErrors().errors, hasLength(1));
-    expect(fileResolver.testView.resolvedFiles, [path]);
+    expect(fileResolver.testView!.resolvedFiles, [path]);
 
     // New resolver.
     // Still has cached, will be not resolved.
     createFileResolver();
     expect(getTestErrors().errors, hasLength(1));
-    expect(fileResolver.testView.resolvedFiles, <Object>[]);
+    expect(fileResolver.testView!.resolvedFiles, <Object>[]);
 
     // Change the file, new resolver.
     // With changed file the previously cached result cannot be used.
     addTestFile('var a = c;');
     createFileResolver();
     expect(getTestErrors().errors, hasLength(1));
-    expect(fileResolver.testView.resolvedFiles, [path]);
+    expect(fileResolver.testView!.resolvedFiles, [path]);
 
     // New resolver.
     // Still has cached, will be not resolved.
     createFileResolver();
     expect(getTestErrors().errors, hasLength(1));
-    expect(fileResolver.testView.resolvedFiles, <Object>[]);
+    expect(fileResolver.testView!.resolvedFiles, <Object>[]);
   }
 
   test_getErrors_reuse_changeDependency() {
@@ -411,15 +412,15 @@
     var path = convertPath('/workspace/dart/test/lib/test.dart');
 
     // No resolved files yet.
-    expect(fileResolver.testView.resolvedFiles, isEmpty);
+    expect(fileResolver.testView!.resolvedFiles, isEmpty);
 
     // No cached, will resolve once.
     expect(getTestErrors().errors, hasLength(1));
-    expect(fileResolver.testView.resolvedFiles, [path]);
+    expect(fileResolver.testView!.resolvedFiles, [path]);
 
     // Has cached, will be not resolved again.
     expect(getTestErrors().errors, hasLength(1));
-    expect(fileResolver.testView.resolvedFiles, [path]);
+    expect(fileResolver.testView!.resolvedFiles, [path]);
 
     // Change the dependency, new resolver.
     // The signature of the result is different.
@@ -429,13 +430,13 @@
 ''');
     createFileResolver();
     expect(getTestErrors().errors, hasLength(1));
-    expect(fileResolver.testView.resolvedFiles, [path]);
+    expect(fileResolver.testView!.resolvedFiles, [path]);
 
     // New resolver.
     // Still has cached, will be not resolved.
     createFileResolver();
     expect(getTestErrors().errors, hasLength(1));
-    expect(fileResolver.testView.resolvedFiles, <Object>[]);
+    expect(fileResolver.testView!.resolvedFiles, <Object>[]);
   }
 
   test_hint() async {
@@ -627,8 +628,8 @@
     await resolveFile(bPath);
     await resolveFile(cPath);
     fileResolver.removeFilesNotNecessaryForAnalysisOf([cPath]);
-    expect(fileResolver.fsState.testView.unusedFiles.contains(bPath), true);
-    expect(fileResolver.fsState.testView.unusedFiles.length, 1);
+    expect(fileResolver.fsState!.testView.unusedFiles.contains(bPath), true);
+    expect(fileResolver.fsState!.testView.unusedFiles.length, 1);
   }
 
   test_unusedFiles_mutilple() async {
@@ -665,7 +666,7 @@
     await resolveFile(ePath);
     await resolveFile(fPath);
     fileResolver.removeFilesNotNecessaryForAnalysisOf([dPath, fPath]);
-    expect(fileResolver.fsState.testView.unusedFiles.contains(ePath), true);
-    expect(fileResolver.fsState.testView.unusedFiles.length, 2);
+    expect(fileResolver.fsState!.testView.unusedFiles.contains(ePath), true);
+    expect(fileResolver.fsState!.testView.unusedFiles.length, 2);
   }
 }
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 4225019..ab1f6c6 100644
--- a/pkg/analyzer/test/src/dart/resolution/ast_rewrite_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/ast_rewrite_test.dart
@@ -6,7 +6,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -352,16 +351,16 @@
     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);
   }
 
   void _assertExtensionOverride(
     ExtensionOverride override, {
-    @required ExtensionElement expectedElement,
-    @required List<String> expectedTypeArguments,
-    @required String expectedExtendedType,
+    required ExtensionElement expectedElement,
+    required List<String> expectedTypeArguments,
+    required String expectedExtendedType,
   }) {
     expect(override.staticElement, expectedElement);
 
@@ -376,11 +375,15 @@
   }
 
   void _assertTypeArgumentList(
-    TypeArgumentList argumentList,
+    TypeArgumentList? argumentList,
     List<String> expectedArguments,
   ) {
+    if (argumentList == null) {
+      fail('Expected TypeArgumentList, actually null.');
+    }
+
     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 87260dc..7d9f46b 100644
--- a/pkg/analyzer/test/src/dart/resolution/constant_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/constant_test.dart
@@ -33,14 +33,14 @@
 const a = const A();
 ''');
 
-    var aLib = findElement.import('package:test/a.dart').importedLibrary;
-    var aConstructor = aLib.getType('A').constructors.single;
-    DefaultParameterElementImpl p = aConstructor.parameters.single;
+    var aLib = findElement.import('package:test/a.dart').importedLibrary!;
+    var aConstructor = aLib.getType('A')!.constructors.single;
+    var p = aConstructor.parameters.single as DefaultParameterElementImpl;
 
     // To evaluate `const A()` we have to evaluate `{int p}`.
     // Even if its value is `null`.
     expect(p.isConstantEvaluated, isTrue);
-    expect(p.computeConstantValue().isNull, isTrue);
+    expect(p.computeConstantValue()!.isNull, isTrue);
   }
 
   test_constFactoryRedirection_super() async {
@@ -64,8 +64,8 @@
 ''');
 
     var node = findNode.annotation('@I');
-    var value = node.elementAnnotation.computeConstantValue();
-    expect(value.getField('(super)').getField('f').toIntValue(), 42);
+    var value = node.elementAnnotation!.computeConstantValue()!;
+    expect(value.getField('(super)')!.getField('f')!.toIntValue(), 42);
   }
 
   test_constNotInitialized() async {
@@ -120,7 +120,7 @@
 ''');
 
     var v = findElement.topVar('v') as ConstVariableElement;
-    var value = v.computeConstantValue();
+    var value = v.computeConstantValue()!;
 
     var type = value.type as InterfaceType;
     assertType(type, 'C<double Function(int)>');
@@ -137,7 +137,7 @@
 
     // TODO(scheglov) https://github.com/dart-lang/sdk/issues/44629
     expect(typeArgument.element, alias.aliasedElement);
-    expect(typeArgument.element.enclosingElement, alias);
+    expect(typeArgument.element!.enclosingElement, alias);
     assertElementTypeStrings(typeArgument.typeArguments, ['double']);
   }
 
@@ -155,7 +155,7 @@
 
     var import_ = findElement.importFind('package:test/a.dart');
     var a = import_.topVar('a') as ConstVariableElement;
-    expect(a.computeConstantValue().toIntValue(), 42);
+    expect(a.computeConstantValue()!.toIntValue(), 42);
   }
 
   test_imported_prefixedIdentifier_staticField_extension() async {
@@ -172,7 +172,7 @@
 
     var import_ = findElement.importFind('package:test/a.dart');
     var a = import_.topVar('a') as ConstVariableElement;
-    expect(a.computeConstantValue().toIntValue(), 42);
+    expect(a.computeConstantValue()!.toIntValue(), 42);
   }
 
   test_imported_prefixedIdentifier_staticField_mixin() async {
@@ -191,7 +191,7 @@
 
     var import_ = findElement.importFind('package:test/a.dart');
     var a = import_.topVar('a') as ConstVariableElement;
-    expect(a.computeConstantValue().toIntValue(), 42);
+    expect(a.computeConstantValue()!.toIntValue(), 42);
   }
 
   test_imported_super_defaultFieldFormalParameter() async {
@@ -219,10 +219,10 @@
     result = await resolveFile(convertPath('$testPackageLibPath/a.dart'));
     assertErrorsInResolvedUnit(result, []);
 
-    var bElement = FindElement(result.unit).field('b') as ConstVariableElement;
-    var bValue = bElement.evaluationResult.value;
+    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);
+    expect(superFields!.getField('f1')!.toBoolValue(), false);
   }
 
   test_local_prefixedIdentifier_staticField_extension() async {
@@ -234,7 +234,7 @@
 }
 ''');
     var a = findElement.topVar('a') as ConstVariableElement;
-    expect(a.computeConstantValue().toIntValue(), 42);
+    expect(a.computeConstantValue()!.toIntValue(), 42);
   }
 
   /// See https://github.com/dart-lang/sdk/issues/43462
@@ -280,7 +280,7 @@
 ''');
 
     var b = findElement.topVar('b');
-    assertType(b.computeConstantValue().type, 'B*');
+    assertType(b.computeConstantValue()!.type, 'B*');
   }
 
   test_constructor_nullSafe_fromLegacy_this() async {
@@ -300,7 +300,7 @@
 ''');
 
     var b = findElement.topVar('b');
-    assertType(b.computeConstantValue().type, 'A*');
+    assertType(b.computeConstantValue()!.type, 'A*');
   }
 
   test_context_eliminateTypeVariables() async {
@@ -362,7 +362,7 @@
     ]);
 
     DartObjectImpl evaluate(String name) {
-      return findElement.topVar(name).computeConstantValue();
+      return findElement.topVar(name).computeConstantValue() as DartObjectImpl;
     }
 
     expect(evaluate('vBool').toBoolValue(), false);
@@ -429,6 +429,6 @@
   }
 
   void _assertIntValue(VariableElement element, int value) {
-    expect(element.computeConstantValue().toIntValue(), value);
+    expect(element.computeConstantValue()!.toIntValue(), value);
   }
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/constructor_test.dart b/pkg/analyzer/test/src/dart/resolution/constructor_test.dart
index fac300f..cb88920 100644
--- a/pkg/analyzer/test/src/dart/resolution/constructor_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/constructor_test.dart
@@ -26,16 +26,16 @@
 
 B<int> b;
 ''');
-    var classB_constructor = findElement.class_('B').unnamedConstructor;
+    var classB_constructor = findElement.class_('B').unnamedConstructor!;
     assertMember(
       classB_constructor.redirectedConstructor,
       findElement.unnamedConstructor('A'),
       {'T': 'U'},
     );
 
-    InterfaceType B_int = findElement.topVar('b').type;
+    var B_int = findElement.topVar('b').type as InterfaceType;
     var B_int_constructor = B_int.constructors.single;
-    var B_int_redirect = B_int_constructor.redirectedConstructor;
+    var B_int_redirect = B_int_constructor.redirectedConstructor!;
     assertMember(
       B_int_redirect,
       findElement.unnamedConstructor('A'),
diff --git a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
index 8f9f2df..a0be018 100644
--- a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
@@ -21,7 +21,7 @@
 import 'package:analyzer/src/workspace/gn.dart';
 import 'package:analyzer/src/workspace/package_build.dart';
 import 'package:analyzer/src/workspace/pub.dart';
-import 'package:linter/src/rules.dart';
+// import 'package:linter/src/rules.dart';
 import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 
@@ -50,45 +50,22 @@
   String toContent() {
     var buffer = StringBuffer();
 
-    if (experiments != null ||
-        implicitCasts != null ||
-        implicitDynamic != null ||
-        strictRawTypes != null ||
-        strictInference != null) {
-      buffer.writeln('analyzer:');
-
-      if (experiments != null) {
-        buffer.writeln('  enable-experiment:');
-        for (var experiment in experiments) {
-          buffer.writeln('    - $experiment');
-        }
-      }
-
-      buffer.writeln('  language:');
-      if (strictRawTypes != null) {
-        buffer.writeln('    strict-raw-types: $strictRawTypes');
-      }
-      if (strictInference != null) {
-        buffer.writeln('    strict-inference: $strictInference');
-      }
-
-      if (implicitCasts != null || implicitDynamic != null) {
-        buffer.writeln('  strong-mode:');
-        if (implicitCasts != null) {
-          buffer.writeln('    implicit-casts: $implicitCasts');
-        }
-        if (implicitDynamic != null) {
-          buffer.writeln('    implicit-dynamic: $implicitDynamic');
-        }
-      }
+    buffer.writeln('analyzer:');
+    buffer.writeln('  enable-experiment:');
+    for (var experiment in experiments) {
+      buffer.writeln('    - $experiment');
     }
+    buffer.writeln('  language:');
+    buffer.writeln('    strict-raw-types: $strictRawTypes');
+    buffer.writeln('    strict-inference: $strictInference');
+    buffer.writeln('  strong-mode:');
+    buffer.writeln('    implicit-casts: $implicitCasts');
+    buffer.writeln('    implicit-dynamic: $implicitDynamic');
 
-    if (lints != null) {
-      buffer.writeln('linter:');
-      buffer.writeln('  rules:');
-      for (var lint in lints) {
-        buffer.writeln('    - $lint');
-      }
+    buffer.writeln('linter:');
+    buffer.writeln('  rules:');
+    for (var lint in lints) {
+      buffer.writeln('    - $lint');
     }
 
     return buffer.toString();
@@ -134,11 +111,11 @@
   ByteStore _byteStore = getContextResolutionTestByteStore();
 
   Map<String, String> _declaredVariables = {};
-  AnalysisContextCollection _analysisContextCollection;
+  AnalysisContextCollection? _analysisContextCollection;
 
   /// If not `null`, [resolveFile] will use the context that corresponds
   /// to this path, instead of the given path.
-  String pathForContextSelection;
+  String? pathForContextSelection;
 
   List<MockSdkLibrary> get additionalMockSdkLibraries => [];
 
@@ -183,7 +160,7 @@
     _createAnalysisContexts();
 
     path = convertPath(path);
-    return _analysisContextCollection.contextFor(path);
+    return _analysisContextCollection!.contextFor(path);
   }
 
   void disposeAnalysisContextCollection() {
@@ -207,16 +184,16 @@
   }
 
   @override
-  Future<ResolvedUnitResult> resolveFile(String path) {
+  Future<ResolvedUnitResult> resolveFile(String path) async {
     var analysisContext = contextFor(pathForContextSelection ?? path);
     var session = analysisContext.currentSession;
-    return session.getResolvedUnit(path);
+    return (await session.getResolvedUnit(path))!;
   }
 
   @mustCallSuper
   void setUp() {
     if (!_lintRulesAreRegistered) {
-      registerLintRules();
+      // registerLintRules();
       _lintRulesAreRegistered = true;
     }
 
@@ -257,7 +234,7 @@
 class PubPackageResolutionTest extends ContextResolutionTest {
   AnalysisOptionsImpl get analysisOptions {
     var path = convertPath(testPackageRootPath);
-    return contextFor(path).analysisOptions;
+    return contextFor(path).analysisOptions as AnalysisOptionsImpl;
   }
 
   @override
@@ -270,7 +247,7 @@
   String get testFilePath => '$testPackageLibPath/test.dart';
 
   /// The language version to use by default for `package:test`.
-  String get testPackageLanguageVersion => '2.9';
+  String? get testPackageLanguageVersion => '2.9';
 
   String get testPackageLibPath => '$testPackageRootPath/lib';
 
@@ -304,7 +281,7 @@
 
   void writeTestPackageConfig(
     PackageConfigFileBuilder config, {
-    String languageVersion,
+    String? languageVersion,
     bool js = false,
     bool meta = false,
   }) {
@@ -349,7 +326,7 @@
 }
 
 class PubspecYamlFileConfig {
-  final String sdkVersion;
+  final String? sdkVersion;
 
   PubspecYamlFileConfig({this.sdkVersion});
 
@@ -367,7 +344,7 @@
 
 mixin WithNonFunctionTypeAliasesMixin on PubPackageResolutionTest {
   @override
-  String get testPackageLanguageVersion => null;
+  String? get testPackageLanguageVersion => null;
 
   @override
   bool get typeToStringWithNullability => true;
@@ -387,7 +364,7 @@
 
 mixin WithNullSafetyMixin on PubPackageResolutionTest {
   @override
-  String get testPackageLanguageVersion => null;
+  String? get testPackageLanguageVersion => null;
 
   @override
   bool get typeToStringWithNullability => true;
diff --git a/pkg/analyzer/test/src/dart/resolution/extension_override_test.dart b/pkg/analyzer/test/src/dart/resolution/extension_override_test.dart
index 806ada7..7946260 100644
--- a/pkg/analyzer/test/src/dart/resolution/extension_override_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/extension_override_test.dart
@@ -6,7 +6,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -21,17 +20,17 @@
 
 @reflectiveTest
 class ExtensionOverrideTest extends PubPackageResolutionTest {
-  ExtensionElement extension;
-  ExtensionOverride extensionOverride;
+  late ExtensionElement extension;
+  late ExtensionOverride extensionOverride;
 
   void findDeclarationAndOverride(
-      {@required String declarationName,
-      @required String overrideSearch,
-      String declarationUri}) {
+      {required String declarationName,
+      required String overrideSearch,
+      String? declarationUri}) {
     if (declarationUri == null) {
       ExtensionDeclaration declaration =
           findNode.extensionDeclaration('extension $declarationName');
-      extension = declaration?.declaredElement;
+      extension = declaration.declaredElement as ExtensionElement;
     } else {
       extension =
           findElement.importFind(declarationUri).extension_(declarationName);
@@ -670,14 +669,14 @@
 
   void validateBinaryExpression() {
     BinaryExpression binary = extensionOverride.parent as BinaryExpression;
-    Element resolvedElement = binary.staticElement;
+    Element? resolvedElement = binary.staticElement;
     expect(resolvedElement, extension.getMethod('+'));
   }
 
   void validateCall() {
     FunctionExpressionInvocation invocation =
         extensionOverride.parent as FunctionExpressionInvocation;
-    Element resolvedElement = invocation.staticElement;
+    Element? resolvedElement = invocation.staticElement;
     expect(resolvedElement, extension.getMethod('call'));
 
     NodeList<Expression> arguments = invocation.argumentList.arguments;
@@ -701,7 +700,7 @@
     }
   }
 
-  void validateOverride({List<DartType> typeArguments}) {
+  void validateOverride({List<DartType>? typeArguments}) {
     expect(extensionOverride.extensionName.staticElement, extension);
 
     expect(extensionOverride.staticType, isNull);
@@ -711,7 +710,7 @@
       expect(extensionOverride.typeArguments, isNull);
     } else {
       expect(
-          extensionOverride.typeArguments.arguments
+          extensionOverride.typeArguments!.arguments
               .map((annotation) => annotation.type),
           unorderedEquals(typeArguments));
     }
diff --git a/pkg/analyzer/test/src/dart/resolution/function_type_alias_test.dart b/pkg/analyzer/test/src/dart/resolution/function_type_alias_test.dart
index 08c8f37..38d3b3d 100644
--- a/pkg/analyzer/test/src/dart/resolution/function_type_alias_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/function_type_alias_test.dart
@@ -23,7 +23,7 @@
 
 typedef T G<T>();
 ''');
-    FunctionType type = findElement.topVar('g').type;
+    var type = findElement.topVar('g').type as FunctionType;
     assertType(type, 'int Function()');
 
     var typedefG = findElement.typeAlias('G');
diff --git a/pkg/analyzer/test/src/dart/resolution/generic_function_type_test.dart b/pkg/analyzer/test/src/dart/resolution/generic_function_type_test.dart
index 3332d08..a717dea 100644
--- a/pkg/analyzer/test/src/dart/resolution/generic_function_type_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/generic_function_type_test.dart
@@ -55,7 +55,7 @@
 Function<@a T>() x;
 ''');
     var T = findNode.typeParameter('T');
-    var annotation = T.declaredElement.metadata[0];
+    var annotation = T.declaredElement!.metadata[0];
     expect(annotation.element, findElement.topGet('a'));
   }
 
diff --git a/pkg/analyzer/test/src/dart/resolution/index_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/index_expression_test.dart
index 7558067..e3e0404 100644
--- a/pkg/analyzer/test/src/dart/resolution/index_expression_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/index_expression_test.dart
@@ -111,7 +111,7 @@
 
     var indexElement = findElement.method('[]');
     var indexEqElement = findElement.method('[]=');
-    var numPlusElement = numElement.getMethod('+');
+    var numPlusElement = numElement.getMethod('+')!;
 
     var indexExpression = findNode.index('a[0]');
     if (hasAssignmentLeftResolution) {
@@ -160,7 +160,7 @@
 
     var indexElement = findElement.method('[]');
     var indexEqElement = findElement.method('[]=');
-    var doublePlusElement = doubleElement.getMethod('+');
+    var doublePlusElement = doubleElement.getMethod('+')!;
 
     var indexExpression = findNode.index('a[0]');
     if (hasAssignmentLeftResolution) {
@@ -369,7 +369,7 @@
 
     var indexElement = findElement.method('[]');
     var indexEqElement = findElement.method('[]=');
-    var numPlusElement = numElement.getMethod('+');
+    var numPlusElement = numElement.getMethod('+')!;
 
     var indexExpression = findNode.index('a?[0]');
     if (hasAssignmentLeftResolution) {
diff --git a/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart b/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
index a51df3a..b37c4cb 100644
--- a/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
@@ -162,7 +162,7 @@
     var creation = findNode.instanceCreation('Foo.bar<int>');
     assertInstanceCreation(
       creation,
-      import.importedLibrary.getType('Foo'),
+      import.importedLibrary!.getType('Foo')!,
       'Foo<int>',
       constructorName: 'bar',
       expectedConstructorMember: true,
diff --git a/pkg/analyzer/test/src/dart/resolution/instance_member_inference_class_test.dart b/pkg/analyzer/test/src/dart/resolution/instance_member_inference_class_test.dart
index ad8a1e9..0516a3a 100644
--- a/pkg/analyzer/test/src/dart/resolution/instance_member_inference_class_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/instance_member_inference_class_test.dart
@@ -907,17 +907,19 @@
     }
   }
 
-  void _assertGetterType(PropertyAccessorElement accessor, String expected) {
+  void _assertGetterType(PropertyAccessorElement? accessor, String expected) {
+    accessor!;
     assertType(accessor.returnType, expected);
   }
 
-  void _assertGetterTypeDynamic(PropertyAccessorElement accessor) {
+  void _assertGetterTypeDynamic(PropertyAccessorElement? accessor) {
+    accessor!;
     assertTypeDynamic(accessor.returnType);
   }
 
   void _assertParameter(
     ParameterElement element, {
-    String type,
+    String? type,
     bool isCovariant = false,
   }) {
     assertType(element.type, type);
@@ -934,7 +936,8 @@
     expect(parameter.isCovariant, isCovariant);
   }
 
-  void _assertSetterTypeDynamic(PropertyAccessorElement accessor) {
+  void _assertSetterTypeDynamic(PropertyAccessorElement? accessor) {
+    accessor!;
     assertTypeDynamic(accessor.parameters.single.type);
   }
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/library_element_test.dart b/pkg/analyzer/test/src/dart/resolution/library_element_test.dart
index c5edca5..9ab142f 100644
--- a/pkg/analyzer/test/src/dart/resolution/library_element_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/library_element_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/src/dart/analysis/experiments.dart';
-import 'package:meta/meta.dart';
 import 'package:pub_semver/pub_semver.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -279,8 +278,8 @@
   }
 
   void _assertLanguageVersion({
-    @required Version package,
-    @required Version override,
+    required Version package,
+    required Version? override,
   }) async {
     var element = result.libraryElement;
     expect(element.languageVersion.package, package);
diff --git a/pkg/analyzer/test/src/dart/resolution/local_function_test.dart b/pkg/analyzer/test/src/dart/resolution/local_function_test.dart
index d1de9b1..a8c2186 100644
--- a/pkg/analyzer/test/src/dart/resolution/local_function_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/local_function_test.dart
@@ -40,7 +40,7 @@
       error(HintCode.UNUSED_ELEMENT, 23, 1),
     ]);
     var node = findNode.functionDeclaration('g() {}');
-    var element = node.declaredElement;
+    var element = node.declaredElement!;
     expect(element.name, 'g');
     expect(element.nameOffset, 23);
   }
diff --git a/pkg/analyzer/test/src/dart/resolution/metadata_test.dart b/pkg/analyzer/test/src/dart/resolution/metadata_test.dart
index c325cf2..2f5b4ba 100644
--- a/pkg/analyzer/test/src/dart/resolution/metadata_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/metadata_test.dart
@@ -6,7 +6,6 @@
 import 'package:analyzer/dart/constant/value.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/test_utilities/find_element.dart';
-import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -195,11 +194,11 @@
 B b;
 ''');
 
-    var classB = findNode.typeName('B b;').name.staticElement;
+    var classB = findNode.typeName('B b;').name.staticElement!;
     var annotation = classB.metadata.single;
-    var value = annotation.computeConstantValue();
+    var value = annotation.computeConstantValue()!;
     assertType(value.type, 'A');
-    expect(value.getField('f').toIntValue(), 42);
+    expect(value.getField('f')!.toIntValue(), 42);
   }
 
   test_otherLibrary_constructor_unnamed() async {
@@ -223,11 +222,11 @@
 B b;
 ''');
 
-    var classB = findNode.typeName('B b;').name.staticElement;
+    var classB = findNode.typeName('B b;').name.staticElement!;
     var annotation = classB.metadata.single;
-    var value = annotation.computeConstantValue();
+    var value = annotation.computeConstantValue()!;
     assertType(value.type, 'A');
-    expect(value.getField('f').toIntValue(), 42);
+    expect(value.getField('f')!.toIntValue(), 42);
   }
 
   test_otherLibrary_implicitConst() async {
@@ -252,11 +251,11 @@
 C c;
 ''');
 
-    var classC = findNode.typeName('C c;').name.staticElement;
+    var classC = findNode.typeName('C c;').name.staticElement!;
     var annotation = classC.metadata.single;
-    var value = annotation.computeConstantValue();
+    var value = annotation.computeConstantValue()!;
     assertType(value.type, 'B');
-    expect(value.getField('a').getField('f').toIntValue(), 42);
+    expect(value.getField('a')!.getField('f')!.toIntValue(), 42);
   }
 
   @FailingTest(reason: 'Reverted because of dartbug.com/38565')
@@ -271,9 +270,9 @@
 class B {}
 ''');
     var annotation = findElement.class_('B').metadata.single;
-    var value = annotation.computeConstantValue();
+    var value = annotation.computeConstantValue()!;
     assertType(value.type, 'A<int>');
-    expect(value.getField('f').toIntValue(), 42);
+    expect(value.getField('f')!.toIntValue(), 42);
   }
 
   void _assertResolvedNodeText(AstNode node, String expected) {
@@ -356,7 +355,7 @@
     );
 
     _assertConstantValue(
-      findElement.function('f').metadata[0].computeConstantValue(),
+      findElement.function('f').metadata[0].computeConstantValue()!,
       type: 'A*',
       fieldMap: {'a': 42},
     );
@@ -390,7 +389,7 @@
     );
 
     _assertConstantValue(
-      findElement.function('f').metadata[0].computeConstantValue(),
+      findElement.function('f').metadata[0].computeConstantValue()!,
       type: 'A*',
       fieldMap: {'a': 42},
     );
@@ -550,9 +549,9 @@
 
   void _assertConstantValue(
     DartObject object, {
-    @required String type,
-    Map<String, Object> fieldMap,
-    int intValue,
+    required String type,
+    Map<String, Object>? fieldMap,
+    int? intValue,
   }) {
     assertType(object.type, type);
     if (fieldMap != null) {
@@ -560,7 +559,7 @@
         var actual = object.getField(entry.key);
         var expected = entry.value;
         if (expected is int) {
-          expect(actual.toIntValue(), expected);
+          expect(actual!.toIntValue(), expected);
         } else {
           fail('Unsupported expected type: ${expected.runtimeType} $expected');
         }
@@ -574,7 +573,7 @@
 
   void _assertIntValue(ElementAnnotation annotation, int intValue) {
     _assertConstantValue(
-      annotation.computeConstantValue(),
+      annotation.computeConstantValue()!,
       type: 'int',
       intValue: intValue,
     );
diff --git a/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart b/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
index bf3ee80..9393416 100644
--- a/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
@@ -1501,6 +1501,31 @@
     assertType(foo.propertyName, 'double Function(int)');
   }
 
+  test_hasReceiver_instance_getter_switchStatementExpression() async {
+    await assertNoErrorsInCode(r'''
+class C {
+  int Function() get foo => throw Error();
+}
+
+void f(C c) {
+  switch ( c.foo() ) {
+    default:
+      break;
+  }
+}
+''');
+
+    var invocation = findNode.functionExpressionInvocation('foo()');
+    assertElementNull(invocation);
+    assertInvokeType(invocation, 'int Function()');
+    assertType(invocation, 'int');
+
+    var foo = invocation.function as PropertyAccess;
+    assertType(foo, 'int Function()');
+    assertElement(foo.propertyName, findElement.getter('foo'));
+    assertType(foo.propertyName, 'int Function()');
+  }
+
   test_hasReceiver_instance_method() async {
     await assertNoErrorsInCode(r'''
 class C {
@@ -2318,9 +2343,9 @@
     assertTypeArgumentTypes(invocation, []);
   }
 
-  void _assertInvalidInvocation(String search, Element expectedElement,
-      {String expectedMethodNameType,
-      String expectedNameType,
+  void _assertInvalidInvocation(String search, Element? expectedElement,
+      {String? expectedMethodNameType,
+      String? expectedNameType,
       List<String> expectedTypeArguments = const <String>[],
       bool dynamicNameType = false}) {
     var invocation = findNode.methodInvocation(search);
diff --git a/pkg/analyzer/test/src/dart/resolution/mixin_test.dart b/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
index bd227a0..a95d9f4 100644
--- a/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
@@ -320,7 +320,7 @@
       error(CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS, 56, 11),
     ]);
     var mathImport = findElement.import('dart:math');
-    var randomElement = mathImport.importedLibrary.getType('Random');
+    var randomElement = mathImport.importedLibrary!.getType('Random')!;
 
     var element = findElement.mixin('M');
     assertElementTypes(element.interfaces, [interfaceTypeStar(randomElement)]);
@@ -852,7 +852,7 @@
           48, 11),
     ]);
     var mathImport = findElement.import('dart:math');
-    var randomElement = mathImport.importedLibrary.getType('Random');
+    var randomElement = mathImport.importedLibrary!.getType('Random')!;
 
     var element = findElement.mixin('M');
     assertElementTypes(element.superclassConstraints, [
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 cd08b22..e32e7e8 100644
--- a/pkg/analyzer/test/src/dart/resolution/optional_const_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/optional_const_test.dart
@@ -19,13 +19,13 @@
 class OptionalConstDriverResolutionTest extends PubPackageResolutionTest {
   Map<String, LibraryElement> libraries = {};
 
-  LibraryElement get libraryA => libraries['package:test/a.dart'];
+  LibraryElement get libraryA => libraries['package:test/a.dart']!;
 
   test_instantiateToBounds_notPrefixed_named() async {
     var creation = await _resolveImplicitConst('B.named()');
     assertInstanceCreation(
       creation,
-      libraryA.getType('B'),
+      libraryA.getType('B')!,
       'B<num>',
       constructorName: 'named',
       expectedConstructorMember: true,
@@ -37,7 +37,7 @@
     var creation = await _resolveImplicitConst('B()');
     assertInstanceCreation(
       creation,
-      libraryA.getType('B'),
+      libraryA.getType('B')!,
       'B<num>',
       expectedConstructorMember: true,
       expectedSubstitution: {'T': 'num'},
@@ -48,12 +48,12 @@
     var creation = await _resolveImplicitConst('p.B.named()', prefix: 'p');
     assertInstanceCreation(
       creation,
-      libraryA.getType('B'),
+      libraryA.getType('B')!,
       'B<num>',
       constructorName: 'named',
       expectedConstructorMember: true,
       expectedSubstitution: {'T': 'num'},
-      expectedPrefix: _importOfA()?.prefix,
+      expectedPrefix: _importOfA().prefix,
     );
   }
 
@@ -61,11 +61,11 @@
     var creation = await _resolveImplicitConst('p.B()', prefix: 'p');
     assertInstanceCreation(
       creation,
-      libraryA.getType('B'),
+      libraryA.getType('B')!,
       'B<num>',
       expectedConstructorMember: true,
       expectedSubstitution: {'T': 'num'},
-      expectedPrefix: _importOfA()?.prefix,
+      expectedPrefix: _importOfA().prefix,
     );
   }
 
@@ -73,7 +73,7 @@
     var creation = await _resolveImplicitConst('A.named()');
     assertInstanceCreation(
       creation,
-      libraryA.getType('A'),
+      libraryA.getType('A')!,
       'A',
       constructorName: 'named',
     );
@@ -83,7 +83,7 @@
     var creation = await _resolveImplicitConst('A()');
     assertInstanceCreation(
       creation,
-      libraryA.getType('A'),
+      libraryA.getType('A')!,
       'A',
     );
   }
@@ -93,10 +93,10 @@
     // Note, that we don't resynthesize the import prefix.
     assertInstanceCreation(
       creation,
-      libraryA.getType('A'),
+      libraryA.getType('A')!,
       'A',
       constructorName: 'named',
-      expectedPrefix: _importOfA()?.prefix,
+      expectedPrefix: _importOfA().prefix,
     );
   }
 
@@ -105,9 +105,9 @@
     // Note, that we don't resynthesize the import prefix.
     assertInstanceCreation(
       creation,
-      libraryA.getType('A'),
+      libraryA.getType('A')!,
       'A',
-      expectedPrefix: _importOfA()?.prefix,
+      expectedPrefix: _importOfA().prefix,
     );
   }
 
@@ -148,11 +148,11 @@
     assertElement(ref_C, element_C);
     assertTypeNull(ref_C);
 
-    assertType(typeName.typeArguments.arguments[0], 'int');
+    assertType(typeName.typeArguments!.arguments[0], 'int');
   }
 
-  void _fillLibraries([LibraryElement library]) {
-    library ??= result.unit.declaredElement.library;
+  void _fillLibraries([LibraryElement? library]) {
+    library ??= result.unit!.declaredElement!.library;
     var uriStr = library.source.uri.toString();
     if (!libraries.containsKey(uriStr)) {
       libraries[uriStr] = library;
@@ -162,11 +162,11 @@
 
   ImportElement _importOfA() {
     var importOfB = findElement.import('package:test/b.dart');
-    return importOfB.importedLibrary.imports[0];
+    return importOfB.importedLibrary!.imports[0];
   }
 
   Future<InstanceCreationExpression> _resolveImplicitConst(String expr,
-      {String prefix}) async {
+      {String? prefix}) async {
     newFile('$testPackageLibPath/a.dart', content: '''
 class A {
   const A();
@@ -199,7 +199,7 @@
     var vg = findNode.simple('a;').staticElement as PropertyAccessorElement;
     var v = vg.variable as ConstVariableElement;
 
-    InstanceCreationExpression /*!*/ creation = v.constantInitializer;
+    var creation = v.constantInitializer as InstanceCreationExpression;
     return creation;
   }
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/prefix_element_test.dart b/pkg/analyzer/test/src/dart/resolution/prefix_element_test.dart
index dfdc7a4..a87e051 100644
--- a/pkg/analyzer/test/src/dart/resolution/prefix_element_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/prefix_element_test.dart
@@ -252,9 +252,10 @@
   }
 
   void _assertMultiplyDefinedElement(
-    MultiplyDefinedElementImpl element,
+    Element? element,
     List<Element> expected,
   ) {
+    element as MultiplyDefinedElementImpl;
     expect(element.conflictingElements, unorderedEquals(expected));
   }
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index 458981d..78d48cf 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -19,7 +19,6 @@
 import 'package:analyzer/src/test_utilities/find_element.dart';
 import 'package:analyzer/src/test_utilities/find_node.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
-import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 
 import '../../../generated/test_support.dart';
@@ -32,9 +31,9 @@
 
 /// Base for resolution tests.
 mixin ResolutionTest implements ResourceProviderMixin {
-  ResolvedUnitResult result;
-  FindNode findNode;
-  FindElement findElement;
+  late ResolvedUnitResult result;
+  late FindNode findNode;
+  late FindElement findElement;
 
   ClassElement get boolElement => typeProvider.boolElement;
 
@@ -42,7 +41,7 @@
 
   InterfaceType get doubleType => typeProvider.doubleType;
 
-  Element get dynamicElement => typeProvider.dynamicType.element;
+  Element get dynamicElement => typeProvider.dynamicType.element!;
 
   bool get enableUnusedElement => false;
 
@@ -84,7 +83,7 @@
 
   TypeProvider get typeProvider => result.typeProvider;
 
-  TypeSystemImpl get typeSystem => result.typeSystem;
+  TypeSystemImpl get typeSystem => result.typeSystem as TypeSystemImpl;
 
   /// Whether `DartType.toString()` with nullability should be asked.
   bool get typeToStringWithNullability => false;
@@ -97,12 +96,12 @@
 
   void assertAssignment(
     AssignmentExpression node, {
-    @required Object readElement,
-    @required String readType,
-    @required Object writeElement,
-    @required String writeType,
-    @required Object operatorElement,
-    @required String type,
+    required Object? readElement,
+    required String? readType,
+    required Object? writeElement,
+    required String writeType,
+    required Object? operatorElement,
+    required String type,
   }) {
     assertCompoundAssignment(
       node,
@@ -117,8 +116,8 @@
 
   void assertBinaryExpression(
     BinaryExpression node, {
-    @required Object element,
-    @required String type,
+    required Object? element,
+    required String type,
   }) {
     assertElement(node.staticElement, element);
     assertType(node, type);
@@ -127,18 +126,18 @@
   /// Assert that the given [identifier] is a reference to a class, in the
   /// form that is not a separate expression, e.g. in a static method
   /// invocation like `C.staticMethod()`, or a type annotation `C c = null`.
-  void assertClassRef(
-      SimpleIdentifier identifier, ClassElement expectedElement) {
+  void assertClassRef(Expression? identifier, ClassElement expectedElement) {
+    identifier as SimpleIdentifier;
     assertElement(identifier, expectedElement);
     assertTypeNull(identifier);
   }
 
   void assertCompoundAssignment(
     CompoundAssignmentExpression node, {
-    @required Object readElement,
-    @required String readType,
-    @required Object writeElement,
-    @required String writeType,
+    required Object? readElement,
+    required String? readType,
+    required Object? writeElement,
+    required String? writeType,
   }) {
     assertElement(node.readElement, readElement);
     if (readType == null) {
@@ -156,7 +155,7 @@
   }
 
   void assertConstructorElement(
-      ConstructorElement expected, ConstructorElement actual) {
+      ConstructorElement? expected, ConstructorElement? actual) {
     if (expected is ConstructorMember && actual is ConstructorMember) {
       expect(expected.declaration, same(actual.declaration));
       // TODO(brianwilkerson) Compare the type arguments of the two members.
@@ -174,28 +173,28 @@
     );
   }
 
-  void assertElement(Object nodeOrElement, Object elementOrMatcher) {
-    Element element;
+  void assertElement(Object? nodeOrElement, Object? elementOrMatcher) {
+    Element? element;
     if (nodeOrElement is AstNode) {
       element = getNodeElement(nodeOrElement);
     } else {
-      element = nodeOrElement as Element;
+      element = nodeOrElement as Element?;
     }
 
     expect(element, _elementMatcher(elementOrMatcher));
   }
 
   void assertElement2(
-    Object nodeOrElement, {
-    @required Element declaration,
+    Object? nodeOrElement, {
+    required Element declaration,
     bool isLegacy = false,
     Map<String, String> substitution = const {},
   }) {
-    Element element;
+    Element? element;
     if (nodeOrElement is AstNode) {
       element = getNodeElement(nodeOrElement);
     } else {
-      element = nodeOrElement as Element;
+      element = nodeOrElement as Element?;
     }
 
     var actualDeclaration = element?.declaration;
@@ -211,13 +210,13 @@
     }
   }
 
-  void assertElementLibraryUri(Element element, String expected) {
-    var uri = element.library.source.uri;
+  void assertElementLibraryUri(Element? element, String expected) {
+    var uri = element!.library!.source.uri;
     expect('$uri', expected);
   }
 
   void assertElementName(Element element, String name,
-      {bool isSynthetic = false, int offset}) {
+      {bool isSynthetic = false, int? offset}) {
     expect(element.name, name);
     expect(element.isSynthetic, isSynthetic);
     if (offset != null) {
@@ -225,12 +224,12 @@
     }
   }
 
-  void assertElementNull(Object nodeOrElement) {
-    Element element;
+  void assertElementNull(Object? nodeOrElement) {
+    Element? element;
     if (nodeOrElement is AstNode) {
       element = getNodeElement(nodeOrElement);
     } else {
-      element = nodeOrElement as Element;
+      element = nodeOrElement as Element?;
     }
 
     expect(element, isNull);
@@ -252,7 +251,11 @@
     }
   }
 
-  void assertElementTypeStrings(List<DartType> types, List<String> expected) {
+  void assertElementTypeStrings(List<DartType>? types, List<String> expected) {
+    if (types == null) {
+      fail('Expected types, actually null.');
+    }
+
     expect(types.map(typeString).toList(), expected);
   }
 
@@ -314,21 +317,21 @@
 
   void assertExtensionOverride(
     ExtensionOverride node, {
-    @required Object element,
-    @required String extendedType,
-    @required List<String> typeArgumentTypes,
+    required Object element,
+    required String extendedType,
+    required List<String> typeArgumentTypes,
   }) {
     assertElement(node, element);
     assertType(node.extendedType, extendedType);
-    assertElementTypeStrings(node.typeArgumentTypes, typeArgumentTypes);
+    assertElementTypeStrings(node.typeArgumentTypes!, typeArgumentTypes);
   }
 
   void assertFunctionExpressionInvocation(
     FunctionExpressionInvocation node, {
-    @required ExecutableElement element,
-    @required List<String> typeArgumentTypes,
-    @required String invokeType,
-    @required String type,
+    required ExecutableElement? element,
+    required List<String> typeArgumentTypes,
+    required String invokeType,
+    required String type,
   }) {
     assertElement(node, element);
     assertTypeArgumentTypes(node, typeArgumentTypes);
@@ -340,8 +343,8 @@
   /// typedefs carry the element of the typedef, and the type arguments.
   void assertFunctionTypeTypedef(
     FunctionType type, {
-    @required FunctionTypeAliasElement element,
-    @required List<String> typeArguments,
+    required FunctionTypeAliasElement element,
+    required List<String> typeArguments,
   }) {
     assertElement2(type.aliasElement, declaration: element);
     assertElementTypeStrings(type.aliasArguments, typeArguments);
@@ -376,16 +379,17 @@
 
   /// In valid code [element] must be a [PrefixElement], but for invalid code
   /// like `int.double v;` we want to resolve `int` somehow. Still not type.
-  void assertImportPrefix(SimpleIdentifier identifier, Element element) {
+  void assertImportPrefix(Expression? identifier, Element? element) {
+    identifier as SimpleIdentifier;
     assertElement(identifier, element);
     assertTypeNull(identifier);
   }
 
   void assertIndexExpression(
     IndexExpression node, {
-    @required Object readElement,
-    @required Object writeElement,
-    @required String type,
+    required Object? readElement,
+    required Object? writeElement,
+    required String? type,
   }) {
     var isRead = node.inGetterContext();
     var isWrite = node.inSetterContext();
@@ -411,15 +415,15 @@
     InstanceCreationExpression creation,
     ClassElement expectedClassElement,
     String expectedType, {
-    String constructorName,
+    String? constructorName,
     bool expectedConstructorMember = false,
-    Map<String, String> expectedSubstitution,
-    PrefixElement expectedPrefix,
-    Element expectedTypeNameElement,
+    Map<String, String>? expectedSubstitution,
+    PrefixElement? expectedPrefix,
+    Element? expectedTypeNameElement,
   }) {
     String expectedClassName = expectedClassElement.name;
 
-    ConstructorElement expectedConstructorElement;
+    ConstructorElement? expectedConstructorElement;
     if (constructorName != null) {
       expectedConstructorElement =
           expectedClassElement.getNamedConstructor(constructorName);
@@ -434,20 +438,26 @@
       }
     }
 
-    var actualConstructorElement = getNodeElement(creation);
-    if (creation.constructorName.name != null) {
+    var actualConstructorElement =
+        getNodeElement(creation) as ConstructorElement?;
+    var constructorName2 = creation.constructorName.name;
+    if (constructorName2 != null) {
       // TODO(brianwilkerson) This used to enforce that the two elements were
       // the same object, but the changes to the AstRewriteVisitor broke that.
       // We should explore re-establishing this restriction for performance.
       assertConstructorElement(
-        creation.constructorName.name.staticElement,
+        constructorName2.staticElement as ConstructorElement?,
         actualConstructorElement,
       );
     }
 
     if (expectedConstructorMember) {
       expect(actualConstructorElement, const TypeMatcher<Member>());
-      assertMember(creation, expectedConstructorElement, expectedSubstitution);
+      assertMember(
+        creation,
+        expectedConstructorElement,
+        expectedSubstitution!,
+      );
     } else {
       assertElement(creation, expectedConstructorElement);
     }
@@ -468,7 +478,7 @@
   }
 
   void assertInvokeType(Expression node, String expected) {
-    DartType actual;
+    DartType? actual;
     if (node is BinaryExpression) {
       actual = node.staticInvokeType;
     } else if (node is InvocationExpression) {
@@ -476,29 +486,29 @@
     } else {
       fail('Unsupported node: (${node.runtimeType}) $node');
     }
-    expect(typeString(actual), expected);
+    expect(typeString(actual!), expected);
   }
 
   void assertInvokeTypeDynamic(InvocationExpression node) {
-    DartType actual = node.staticInvokeType;
+    var actual = node.staticInvokeType;
     expect(actual, isDynamicType);
   }
 
   void assertInvokeTypeNull(BinaryExpression node) {
-    DartType actual = node.staticInvokeType;
+    var actual = node.staticInvokeType;
     expect(actual, isNull);
   }
 
   void assertMember(
-    Object elementOrNode,
+    Object? elementOrNode,
     Element expectedBase,
     Map<String, String> expectedSubstitution,
   ) {
-    Member actual;
+    Member? actual;
     if (elementOrNode is Member) {
       actual = elementOrNode;
     } else {
-      actual = getNodeElement(elementOrNode as AstNode);
+      actual = getNodeElement(elementOrNode as AstNode) as Member;
     }
 
     expect(actual.declaration, same(expectedBase));
@@ -508,14 +518,14 @@
 
   void assertMethodInvocation(
     MethodInvocation invocation,
-    Object expectedElement,
+    Object? expectedElement,
     String expectedInvokeType, {
-    String expectedMethodNameType,
-    String expectedNameType,
-    String expectedType,
+    String? expectedMethodNameType,
+    String? expectedNameType,
+    String? expectedType,
     List<String> expectedTypeArguments = const <String>[],
   }) {
-    MethodInvocationImpl invocationImpl = invocation;
+    var invocationImpl = invocation as MethodInvocationImpl;
 
     // TODO(scheglov) Check for Member.
     var element = invocation.methodName.staticElement;
@@ -548,10 +558,10 @@
 
   void assertMethodInvocation2(
     MethodInvocation node, {
-    @required Object element,
-    @required List<String> typeArgumentTypes,
-    @required String invokeType,
-    @required String type,
+    required Object? element,
+    required List<String> typeArgumentTypes,
+    required String invokeType,
+    required String type,
   }) {
     assertElement(node.methodName, element);
     assertTypeArgumentTypes(node, typeArgumentTypes);
@@ -567,11 +577,11 @@
 
   void assertNamespaceDirectiveSelected(
     NamespaceDirective directive, {
-    @required String expectedRelativeUri,
-    @required String expectedUri,
+    required String expectedRelativeUri,
+    required String expectedUri,
   }) {
     expect(directive.selectedUriContent, expectedRelativeUri);
-    expect('${directive.selectedSource.uri}', expectedUri);
+    expect('${directive.selectedSource!.uri}', expectedUri);
   }
 
   Future<void> assertNoErrorsInCode(String code) async {
@@ -593,18 +603,18 @@
   }
 
   void assertParameterElementType(FormalParameter node, String expected) {
-    var parameterElement = node.declaredElement;
+    var parameterElement = node.declaredElement!;
     assertType(parameterElement.type, expected);
   }
 
   void assertPostfixExpression(
     PostfixExpression node, {
-    @required Object readElement,
-    @required String readType,
-    @required Object writeElement,
-    @required String writeType,
-    @required Object element,
-    @required String type,
+    required Object? readElement,
+    required String? readType,
+    required Object? writeElement,
+    required String? writeType,
+    required Object? element,
+    required String type,
   }) {
     assertCompoundAssignment(
       node,
@@ -619,8 +629,8 @@
 
   void assertPrefixedIdentifier(
     PrefixedIdentifier node, {
-    @required Object element,
-    @required String type,
+    required Object? element,
+    required String type,
   }) {
     assertElement(node.staticElement, element);
     assertType(node, type);
@@ -628,12 +638,12 @@
 
   void assertPrefixExpression(
     PrefixExpression node, {
-    @required Object readElement,
-    @required String readType,
-    @required Object writeElement,
-    @required String writeType,
-    @required Object element,
-    @required String type,
+    required Object? readElement,
+    required String? readType,
+    required Object? writeElement,
+    required String? writeType,
+    required Object? element,
+    required String type,
   }) {
     assertCompoundAssignment(
       node,
@@ -657,18 +667,22 @@
 
   void assertPropertyAccess2(
     PropertyAccess node, {
-    @required Object element,
-    @required String type,
+    required Object? element,
+    required String type,
   }) {
     assertElement(node.propertyName.staticElement, element);
     assertType(node.staticType, type);
   }
 
   void assertSimpleIdentifier(
-    SimpleIdentifier node, {
-    @required Object element,
-    @required String type,
+    Expression node, {
+    required Object? element,
+    required String? type,
   }) {
+    if (node is! SimpleIdentifier) {
+      _failNotSimpleIdentifier(node);
+    }
+
     var isRead = node.inGetterContext();
     expect(isRead, isTrue);
 
@@ -677,7 +691,11 @@
   }
 
   /// TODO(scheglov) https://github.com/dart-lang/sdk/issues/43608
-  void assertSimpleIdentifierAssignmentTarget(SimpleIdentifier node) {
+  void assertSimpleIdentifierAssignmentTarget(Expression node) {
+    if (node is! SimpleIdentifier) {
+      _failNotSimpleIdentifier(node);
+    }
+
     // TODO(scheglov) Enforce maybe?
     // Currently VariableResolverVisitor sets it.
     // expect(node.staticElement, isNull);
@@ -701,7 +719,11 @@
     expect(actualMapString, expected);
   }
 
-  void assertSuperExpression(SuperExpression superExpression) {
+  void assertSuperExpression(Expression? node) {
+    if (node is! SuperExpression) {
+      fail('Expected SuperExpression: (${node.runtimeType}) $node');
+    }
+
     // TODO(scheglov) I think `super` does not have type itself.
     // It is just a signal to look for implemented method in the supertype.
     // With mixins there isn't a type anyway.
@@ -713,11 +735,9 @@
     assertIdentifierTopGetRef(ref, name);
   }
 
-  void assertType(Object typeOrNode, String expected) {
-    DartType actual;
-    if (typeOrNode == null) {
-      actual = typeOrNode;
-    } else if (typeOrNode is DartType) {
+  void assertType(Object? typeOrNode, String? expected) {
+    DartType? actual;
+    if (typeOrNode is DartType) {
       actual = typeOrNode;
     } else if (typeOrNode is Expression) {
       actual = typeOrNode.staticType;
@@ -731,6 +751,8 @@
 
     if (expected == null) {
       expect(actual, isNull);
+    } else if (actual == null) {
+      fail('Null, expected: $expected');
     } else {
       expect(typeString(actual), expected);
     }
@@ -749,13 +771,13 @@
     InvocationExpression node,
     List<String> expected,
   ) {
-    var actual = node.typeArgumentTypes.map((t) => typeString(t)).toList();
+    var actual = node.typeArgumentTypes!.map((t) => typeString(t)).toList();
     expect(actual, expected);
   }
 
-  void assertTypeDynamic(Object typeOrExpression) {
-    DartType actual;
-    if (typeOrExpression is DartType) {
+  void assertTypeDynamic(Object? typeOrExpression) {
+    DartType? actual;
+    if (typeOrExpression is DartType?) {
       actual = typeOrExpression;
       var type = typeOrExpression;
       expect(type, isDynamicType);
@@ -765,14 +787,15 @@
     expect(actual, isDynamicType);
   }
 
-  void assertTypeLegacy(Expression expression) {
-    NullabilitySuffix actual = expression.staticType.nullabilitySuffix;
+  void assertTypeLegacy(Expression? expression) {
+    expression!;
+    NullabilitySuffix actual = expression.staticType!.nullabilitySuffix;
     expect(actual, NullabilitySuffix.star);
   }
 
   void assertTypeName(
-      TypeName node, Element expectedElement, String expectedType,
-      {Element expectedPrefix}) {
+      TypeName node, Element? expectedElement, String expectedType,
+      {Element? expectedPrefix}) {
     assertType(node, expectedType);
 
     if (expectedPrefix == null) {
@@ -797,22 +820,23 @@
     expect(node.staticType, isNull);
   }
 
+  /// TODO(scheglov) Remove `?` from [declaration].
   Matcher elementMatcher(
-    Element declaration, {
+    Element? declaration, {
     bool isLegacy = false,
     Map<String, String> substitution = const {},
   }) {
     return _ElementMatcher(
       this,
-      declaration: declaration,
+      declaration: declaration!,
       isLegacy: isLegacy,
       substitution: substitution,
     );
   }
 
   ExpectedError error(ErrorCode code, int offset, int length,
-          {String text,
-          Pattern messageContains,
+          {String? text,
+          Pattern? messageContains,
           List<ExpectedContextMessage> contextMessages =
               const <ExpectedContextMessage>[]}) =>
       ExpectedError(code, offset, length,
@@ -821,8 +845,8 @@
           expectedContextMessages: contextMessages);
 
   List<ExpectedError> expectedErrorsByNullability({
-    @required List<ExpectedError> nullable,
-    @required List<ExpectedError> legacy,
+    required List<ExpectedError> nullable,
+    required List<ExpectedError> legacy,
   }) {
     if (typeToStringWithNullability) {
       return nullable;
@@ -831,7 +855,7 @@
     }
   }
 
-  Element getNodeElement(AstNode node) {
+  Element? getNodeElement(AstNode node) {
     if (node is Annotation) {
       return node.element;
     } else if (node is AssignmentExpression) {
@@ -883,8 +907,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].
@@ -919,8 +943,8 @@
       type.getDisplayString(withNullability: typeToStringWithNullability);
 
   String typeStringByNullability({
-    @required String nullable,
-    @required String legacy,
+    required String nullable,
+    required String legacy,
   }) {
     if (typeToStringWithNullability) {
       return nullable;
@@ -929,7 +953,7 @@
     }
   }
 
-  Matcher _elementMatcher(Object elementOrMatcher) {
+  Matcher _elementMatcher(Object? elementOrMatcher) {
     if (elementOrMatcher is Element) {
       return _ElementMatcher(this, declaration: elementOrMatcher);
     } else {
@@ -937,6 +961,10 @@
     }
   }
 
+  Never _failNotSimpleIdentifier(AstNode node) {
+    fail('Expected SimpleIdentifier: (${node.runtimeType}) $node');
+  }
+
   static String _extractReturnType(String invokeType) {
     int functionIndex = invokeType.indexOf(' Function');
     expect(functionIndex, isNonNegative);
@@ -952,7 +980,7 @@
 
   _ElementMatcher(
     this.test, {
-    this.declaration,
+    required this.declaration,
     this.isLegacy = false,
     this.substitution = const {},
   });
diff --git a/pkg/analyzer/test/src/dart/resolution/try_statement_test.dart b/pkg/analyzer/test/src/dart/resolution/try_statement_test.dart
index d3f8c6b..d5d60964 100644
--- a/pkg/analyzer/test/src/dart/resolution/try_statement_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/try_statement_test.dart
@@ -37,8 +37,8 @@
     assertType(st.type, 'StackTrace');
 
     var node = findNode.catchClause('catch');
-    expect(node.exceptionParameter.staticElement, e);
-    expect(node.stackTraceParameter.staticElement, st);
+    expect(node.exceptionParameter!.staticElement, e);
+    expect(node.stackTraceParameter!.staticElement, st);
   }
 
   test_catch_withType() async {
@@ -59,8 +59,8 @@
     assertType(st.type, 'StackTrace');
 
     var node = findNode.catchClause('catch');
-    expect(node.exceptionParameter.staticElement, e);
-    expect(node.stackTraceParameter.staticElement, st);
+    expect(node.exceptionParameter!.staticElement, e);
+    expect(node.stackTraceParameter!.staticElement, st);
   }
 }
 
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/function_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/function_expression_test.dart
index d665880..7de1d06 100644
--- a/pkg/analyzer/test/src/dart/resolution/type_inference/function_expression_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/type_inference/function_expression_test.dart
@@ -453,7 +453,7 @@
   }
 
   void _assertReturnType(String search, String expected) {
-    var element = findNode.functionExpression(search).declaredElement;
+    var element = findNode.functionExpression(search).declaredElement!;
     assertType(element.returnType, expected);
   }
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/tear_off_test.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/tear_off_test.dart
index 5f939e3..27c24a5 100644
--- a/pkg/analyzer/test/src/dart/resolution/type_inference/tear_off_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/type_inference/tear_off_test.dart
@@ -139,7 +139,7 @@
     String search,
     ExecutableElement element,
     String type,
-    List<String> typeArguments,
+    List<String>? typeArguments,
   ) {
     var id = findNode.simple(search);
     assertElement(id, element);
diff --git a/pkg/analyzer/test/src/dart/resolution/type_name_test.dart b/pkg/analyzer/test/src/dart/resolution/type_name_test.dart
index 91aa242..7587a08 100644
--- a/pkg/analyzer/test/src/dart/resolution/type_name_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/type_name_test.dart
@@ -2,6 +2,8 @@
 // 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.
 
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/test_utilities/find_element.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -614,8 +616,8 @@
     assertTypeName(typeName, element, 'int* Function(bool*)*');
 
     assertFunctionTypeTypedef(
-      typeName.type,
-      element: element,
+      typeName.type as FunctionType,
+      element: element as FunctionTypeAliasElement,
       typeArguments: [],
     );
   }
@@ -638,8 +640,8 @@
     assertTypeName(typeName, element, 'dynamic Function(bool*)*');
 
     assertFunctionTypeTypedef(
-      typeName.type,
-      element: element,
+      typeName.type as FunctionType,
+      element: element as FunctionTypeAliasElement,
       typeArguments: ['dynamic'],
     );
   }
@@ -662,8 +664,8 @@
     assertTypeName(typeName, element, 'num* Function(bool*)*');
 
     assertFunctionTypeTypedef(
-      typeName.type,
-      element: element,
+      typeName.type as FunctionType,
+      element: element as FunctionTypeAliasElement,
       typeArguments: ['num*'],
     );
   }
@@ -686,8 +688,8 @@
     assertTypeName(typeName, element, 'int* Function(bool*)*');
 
     assertFunctionTypeTypedef(
-      typeName.type,
-      element: element,
+      typeName.type as FunctionType,
+      element: element as FunctionTypeAliasElement,
       typeArguments: ['int*'],
     );
   }
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 e60d05c..bb0999a 100644
--- a/pkg/analyzer/test/src/dart/resolver/exit_detector_test.dart
+++ b/pkg/analyzer/test/src/dart/resolver/exit_detector_test.dart
@@ -1083,8 +1083,8 @@
   Future<void> _assertHasReturn(String code, int n, bool expected) async {
     await resolveTestCode(code);
 
-    FunctionDeclaration function = result.unit.declarations.last;
-    BlockFunctionBody body = function.functionExpression.body;
+    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/dart/resolver/legacy_type_asserter_test.dart b/pkg/analyzer/test/src/dart/resolver/legacy_type_asserter_test.dart
index 75d3b88..3f1f84e 100644
--- a/pkg/analyzer/test/src/dart/resolver/legacy_type_asserter_test.dart
+++ b/pkg/analyzer/test/src/dart/resolver/legacy_type_asserter_test.dart
@@ -24,7 +24,7 @@
 
 @reflectiveTest
 class LegacyTypeAsserterTest {
-  TypeProvider typeProvider;
+  late final TypeProvider typeProvider;
 
   void setUp() {
     var analysisContext = TestAnalysisContext();
@@ -145,9 +145,10 @@
         AstTestFactory.functionDeclaration(
             null,
             null,
-            null,
+            'f',
             AstTestFactory.functionExpression2(
-                null, AstTestFactory.expressionFunctionBody(e)))
+                AstTestFactory.formalParameterList(),
+                AstTestFactory.expressionFunctionBody(e)))
       ],
       featureSet: nonNullable
           ? FeatureSet.latestLanguageVersion()
diff --git a/pkg/analyzer/test/src/dart/sdk/sdk_test.dart b/pkg/analyzer/test/src/dart/sdk/sdk_test.dart
index db9c3b4..6af1989 100644
--- a/pkg/analyzer/test/src/dart/sdk/sdk_test.dart
+++ b/pkg/analyzer/test/src/dart/sdk/sdk_test.dart
@@ -7,7 +7,6 @@
 import 'package:analyzer/src/dart/sdk/sdk.dart';
 import 'package:analyzer/src/generated/java_engine_io.dart';
 import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:pub_semver/pub_semver.dart';
 import 'package:test/test.dart';
@@ -28,7 +27,7 @@
 class EmbedderSdkTest extends EmbedderRelatedTest {
   void test_allowedExperimentsJson() {
     EmbedderYamlLocator locator = EmbedderYamlLocator({
-      'fox': <Folder>[pathTranslator.getResource(foxLib)]
+      'fox': <Folder>[pathTranslator.getResource(foxLib) as Folder]
     });
     EmbedderSdk sdk = EmbedderSdk(
       resourceProvider,
@@ -47,7 +46,7 @@
 
   void test_creation() {
     EmbedderYamlLocator locator = EmbedderYamlLocator({
-      'fox': <Folder>[pathTranslator.getResource(foxLib)]
+      'fox': <Folder>[pathTranslator.getResource(foxLib) as Folder]
     });
     EmbedderSdk sdk = EmbedderSdk(
       resourceProvider,
@@ -60,7 +59,7 @@
 
   void test_fromFileUri() {
     EmbedderYamlLocator locator = EmbedderYamlLocator({
-      'fox': <Folder>[pathTranslator.getResource(foxLib)]
+      'fox': <Folder>[pathTranslator.getResource(foxLib) as Folder]
     });
     EmbedderSdk sdk = EmbedderSdk(
       resourceProvider,
@@ -70,7 +69,7 @@
 
     expectSource(String posixPath, String dartUri) {
       Uri uri = Uri.parse(posixToOSFileUri(posixPath));
-      Source source = sdk.fromFileUri(uri);
+      var source = sdk.fromFileUri(uri)!;
       expect(source, isNotNull, reason: posixPath);
       expect(source.uri.toString(), dartUri);
       expect(source.fullName, posixToOSPath(posixPath));
@@ -83,7 +82,7 @@
 
   void test_getSdkLibrary() {
     EmbedderYamlLocator locator = EmbedderYamlLocator({
-      'fox': <Folder>[pathTranslator.getResource(foxLib)]
+      'fox': <Folder>[pathTranslator.getResource(foxLib) as Folder]
     });
     EmbedderSdk sdk = EmbedderSdk(
       resourceProvider,
@@ -91,7 +90,7 @@
       languageVersion: Version.parse('2.10.0'),
     );
 
-    SdkLibrary lib = sdk.getSdkLibrary('dart:fox');
+    var lib = sdk.getSdkLibrary('dart:fox')!;
     expect(lib, isNotNull);
     expect(lib.path, posixToOSPath('$foxLib/slippy.dart'));
     expect(lib.shortName, 'dart:fox');
@@ -99,7 +98,7 @@
 
   void test_mapDartUri() {
     EmbedderYamlLocator locator = EmbedderYamlLocator({
-      'fox': <Folder>[pathTranslator.getResource(foxLib)]
+      'fox': <Folder>[pathTranslator.getResource(foxLib) as Folder]
     });
     EmbedderSdk sdk = EmbedderSdk(
       resourceProvider,
@@ -108,7 +107,7 @@
     );
 
     void expectSource(String dartUri, String posixPath) {
-      Source source = sdk.mapDartUri(dartUri);
+      var source = sdk.mapDartUri(dartUri)!;
       expect(source, isNotNull, reason: posixPath);
       expect(source.uri.toString(), dartUri);
       expect(source.fullName, posixToOSPath(posixPath));
@@ -146,10 +145,10 @@
 
   void test_fromFile_library() {
     FolderBasedDartSdk sdk = _createDartSdk();
-    Source source = sdk.fromFileUri(sdk.libraryDirectory
+    var source = sdk.fromFileUri(sdk.libraryDirectory
         .getChildAssumingFolder("core")
         .getChildAssumingFile("core.dart")
-        .toUri());
+        .toUri())!;
     expect(source, isNotNull);
     expect(source.isInSystemLibrary, isTrue);
     expect(source.uri.toString(), "dart:core");
@@ -160,7 +159,7 @@
     Folder dirHtml = sdk.libraryDirectory.getChildAssumingFolder("html");
     Folder dirDartium = dirHtml.getChildAssumingFolder("dart2js");
     File file = dirDartium.getChildAssumingFile("html_dart2js.dart");
-    Source source = sdk.fromFileUri(file.toUri());
+    var source = sdk.fromFileUri(file.toUri())!;
     expect(source, isNotNull);
     expect(source.isInSystemLibrary, isTrue);
     expect(source.uri.toString(), "dart:html");
@@ -171,7 +170,7 @@
     Folder dirHtml = sdk.libraryDirectory.getChildAssumingFolder("html");
     Folder dirCommon = dirHtml.getChildAssumingFolder("html_common");
     File file = dirCommon.getChildAssumingFile("html_common_dart2js.dart");
-    Source source = sdk.fromFileUri(file.toUri());
+    var source = sdk.fromFileUri(file.toUri())!;
     expect(source, isNotNull);
     expect(source.isInSystemLibrary, isTrue);
     expect(source.uri.toString(), "dart:html_common");
@@ -179,10 +178,10 @@
 
   void test_fromFile_part() {
     FolderBasedDartSdk sdk = _createDartSdk();
-    Source source = sdk.fromFileUri(sdk.libraryDirectory
+    var source = sdk.fromFileUri(sdk.libraryDirectory
         .getChildAssumingFolder("core")
         .getChildAssumingFile("num.dart")
-        .toUri());
+        .toUri())!;
     expect(source, isNotNull);
     expect(source.isInSystemLibrary, isTrue);
     expect(source.uri.toString(), "dart:core/num.dart");
@@ -226,8 +225,8 @@
   /// when the file is the library file.
   void test_mapDartUri_partFormatForLibrary() {
     FolderBasedDartSdk sdk = _createDartSdk();
-    Source normalSource = sdk.mapDartUri('dart:core');
-    Source partSource = sdk.mapDartUri('dart:core/core.dart');
+    var normalSource = sdk.mapDartUri('dart:core')!;
+    var partSource = sdk.mapDartUri('dart:core/core.dart')!;
     expect(partSource, normalSource);
   }
 
@@ -321,7 +320,7 @@
 };''');
     expect(libraryMap, isNotNull);
     expect(libraryMap.size(), 2);
-    SdkLibrary first = libraryMap.getLibrary("dart:first");
+    var first = libraryMap.getLibrary("dart:first")!;
     expect(first, isNotNull);
     expect(first.category, "Client");
     expect(first.path, "first/first.dart");
@@ -330,7 +329,7 @@
     expect(first.isDocumented, true);
     expect(first.isImplementation, false);
     expect(first.isVmLibrary, true);
-    SdkLibrary second = libraryMap.getLibrary("dart:second");
+    var second = libraryMap.getLibrary("dart:second")!;
     expect(second, isNotNull);
     expect(second.category, "Server");
     expect(second.path, "second/second.dart");
diff --git a/pkg/analyzer/test/src/diagnostics/analysis_options/analysis_options_test_support.dart b/pkg/analyzer/test/src/diagnostics/analysis_options/analysis_options_test_support.dart
index c510595..900fd85 100644
--- a/pkg/analyzer/test/src/diagnostics/analysis_options/analysis_options_test_support.dart
+++ b/pkg/analyzer/test/src/diagnostics/analysis_options/analysis_options_test_support.dart
@@ -19,8 +19,8 @@
   }
 
   ExpectedError error(ErrorCode code, int offset, int length,
-          {String text,
-          Pattern messageContains,
+          {String? text,
+          Pattern? messageContains,
           List<ExpectedContextMessage> contextMessages =
               const <ExpectedContextMessage>[]}) =>
       ExpectedError(code, offset, length,
diff --git a/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_catch_error_on_error_test.dart b/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_catch_error_on_error_test.dart
index 704f988..d457687 100644
--- a/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_catch_error_on_error_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_catch_error_on_error_test.dart
@@ -37,13 +37,11 @@
   }
 
   void test_firstParameterIsOptional() async {
-    await assertErrorsInCode('''
+    await assertNoErrorsInCode('''
 void f(Future<int> future, Future<int> Function([Object a]) callback) {
   future.catchError(callback);
 }
-''', [
-      error(HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE_CATCH_ERROR_ON_ERROR, 92, 8),
-    ]);
+''');
   }
 
   void test_functionExpression_firstParameterIsDynamic() async {
@@ -73,13 +71,11 @@
   }
 
   void test_functionExpression_firstParameterIsOptional() async {
-    await assertErrorsInCode('''
+    await assertNoErrorsInCode('''
 void f(Future<void> future) {
   future.catchError(([Object a = 1]) {});
 }
-''', [
-      error(HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE_CATCH_ERROR_ON_ERROR, 50, 19),
-    ]);
+''');
   }
 
   void test_functionExpression_firstParameterIsVar() async {
@@ -126,6 +122,14 @@
     ]);
   }
 
+  void test_functionExpression_secondParameterIsOptional() async {
+    await assertNoErrorsInCode('''
+void f(Future<void> future) {
+  future.catchError((Object a, [StackTrace st]) {});
+}
+''');
+  }
+
   void test_functionExpression_secondParameterIsVar() async {
     await assertNoErrorsInCode('''
 void f(Future<void> future) {
@@ -261,4 +265,13 @@
 }
 ''');
   }
+
+  @override
+  void test_functionExpression_secondParameterIsOptional() async {
+    await assertNoErrorsInCode('''
+void f(Future<void> future) {
+  future.catchError((Object a, [StackTrace? st]) {});
+}
+''');
+  }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart b/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
index 186c7a6..6a45253 100644
--- a/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/src/error/codes.dart';
-import 'package:meta/meta.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -1522,9 +1521,9 @@
   }
 
   void _newTestPackageGeneratedFile({
-    @required String packageName,
-    @required String pathInLib,
-    @required String content,
+    required String packageName,
+    required String pathInLib,
+    required String content,
   }) {
     newFile(
       '$testPackageGeneratedPath/$packageName/lib/$pathInLib',
diff --git a/pkg/analyzer/test/src/diagnostics/extension_override_with_cascade_test.dart b/pkg/analyzer/test/src/diagnostics/extension_override_with_cascade_test.dart
index b1d34fe..7eed85a 100644
--- a/pkg/analyzer/test/src/diagnostics/extension_override_with_cascade_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/extension_override_with_cascade_test.dart
@@ -26,6 +26,7 @@
 ''', [
       error(CompileTimeErrorCode.EXTENSION_OVERRIDE_WITH_CASCADE, 49, 1),
     ]);
+    assertTypeDynamic(findNode.extensionOverride('E('));
   }
 
   test_method() async {
@@ -39,6 +40,7 @@
 ''', [
       error(CompileTimeErrorCode.EXTENSION_OVERRIDE_WITH_CASCADE, 45, 1),
     ]);
+    assertTypeDynamic(findNode.extensionOverride('E('));
   }
 
   test_setter() async {
@@ -52,5 +54,6 @@
 ''', [
       error(CompileTimeErrorCode.EXTENSION_OVERRIDE_WITH_CASCADE, 49, 1),
     ]);
+    assertTypeDynamic(findNode.extensionOverride('E('));
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/inconsistent_language_version_override_test.dart b/pkg/analyzer/test/src/diagnostics/inconsistent_language_version_override_test.dart
index 22eb5ae..66e52d0 100644
--- a/pkg/analyzer/test/src/diagnostics/inconsistent_language_version_override_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/inconsistent_language_version_override_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/src/error/codes.dart';
-import 'package:meta/meta.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../../generated/test_support.dart';
@@ -93,9 +92,9 @@
   }
 
   Future<void> _checkLibraryAndPart({
-    @required String libraryContent,
-    @required String partContent,
-    @required List<ExpectedError> libraryErrors,
+    required String libraryContent,
+    required String partContent,
+    required List<ExpectedError> libraryErrors,
   }) async {
     var libraryPath = convertPath('$testPackageLibPath/a.dart');
     var partPath = convertPath('$testPackageLibPath/b.dart');
diff --git a/pkg/analyzer/test/src/diagnostics/integer_literal_imprecise_as_double_test.dart b/pkg/analyzer/test/src/diagnostics/integer_literal_imprecise_as_double_test.dart
index 8c831b2..4384477 100644
--- a/pkg/analyzer/test/src/diagnostics/integer_literal_imprecise_as_double_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/integer_literal_imprecise_as_double_test.dart
@@ -32,7 +32,7 @@
     // Check that we suggest the max double instead.
     expect(
         true,
-        firstError.correction.contains(
+        firstError.correction!.contains(
             '179769313486231570814527423731704356798070567525844996598917476803'
             '157260780028538760589558632766878171540458953514382464234321326889'
             '464182768467546703537516986049910576551282076245490090389328944075'
@@ -48,6 +48,6 @@
     ]);
     AnalysisError firstError = result.errors[0];
     // Check that we suggest a valid double instead.
-    expect(true, firstError.correction.contains('9223372036854775808'));
+    expect(true, firstError.correction!.contains('9223372036854775808'));
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_language_override_greater_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_language_override_greater_test.dart
index dd1ee88..b70e7b3 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_language_override_greater_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_language_override_greater_test.dart
@@ -5,7 +5,6 @@
 import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/error/hint_codes.dart';
-import 'package:meta/meta.dart';
 import 'package:pub_semver/pub_semver.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -60,11 +59,11 @@
   }
 
   void _assertUnitLanguageVersion({
-    @required Version package,
-    @required Version override,
+    required Version package,
+    required Version? override,
   }) {
     var unitImpl = result.unit as CompilationUnitImpl;
-    var languageVersion = unitImpl.languageVersion;
+    var languageVersion = unitImpl.languageVersion!;
     expect(languageVersion.package, package);
     expect(languageVersion.override, override);
   }
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 13fcb26..31546d9 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
@@ -110,7 +110,8 @@
 ''', [
       error(HintCode.UNUSED_ELEMENT, 96, 15),
     ]);
-    var mixins = result.unit.declaredElement.getType('_LocalDirectory').mixins;
+    var mixins =
+        result.unit!.declaredElement!.getType('_LocalDirectory')!.mixins;
     assertType(mixins[0], 'ForwardingDirectory<_LocalDirectory>');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/mixin_declares_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/mixin_declares_constructor_test.dart
index e171fde..654ef07 100644
--- a/pkg/analyzer/test/src/diagnostics/mixin_declares_constructor_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/mixin_declares_constructor_test.dart
@@ -36,7 +36,7 @@
     var fpNode = findNode.fieldFormalParameter('f);');
     assertElement(fpNode.identifier, constructorElement.parameters[0]);
 
-    FieldFormalParameterElement fpElement = fpNode.declaredElement;
+    var fpElement = fpNode.declaredElement as FieldFormalParameterElement;
     assertElement(fpElement.field, findElement.field('f'));
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/non_null_opt_out_test.dart b/pkg/analyzer/test/src/diagnostics/non_null_opt_out_test.dart
index 25b5b05..9cd23cf 100644
--- a/pkg/analyzer/test/src/diagnostics/non_null_opt_out_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_null_opt_out_test.dart
@@ -352,7 +352,7 @@
     assertInvokeType(binaryExpression, 'int* Function(int*)*');
     assertType(binaryExpression, 'int*');
 
-    MethodElement element = binaryExpression.staticElement;
+    var element = binaryExpression.staticElement as MethodElement;
     _assertLegacyMember(element, _import_a.method('+'));
   }
 
@@ -838,7 +838,7 @@
     var prefixExpression = findNode.postfix('a++');
     assertType(prefixExpression, 'A*');
 
-    MethodElement element = prefixExpression.staticElement;
+    var element = prefixExpression.staticElement as MethodElement;
     _assertLegacyMember(element, _import_a.method('+'));
   }
 
@@ -859,7 +859,7 @@
     var prefixExpression = findNode.prefix('-a');
     assertType(prefixExpression, 'int*');
 
-    MethodElement element = prefixExpression.staticElement;
+    var element = prefixExpression.staticElement as MethodElement;
     _assertLegacyMember(element, _import_a.method('unary-'));
   }
 
@@ -880,7 +880,7 @@
     var indexExpression = findNode.index('a[');
     assertType(indexExpression, 'int*');
 
-    MethodElement element = indexExpression.staticElement;
+    var element = indexExpression.staticElement as MethodElement;
     _assertLegacyMember(element, _import_a.method('[]'));
   }
 
@@ -1286,7 +1286,7 @@
   }
 
   void _assertLegacyMember(
-    Element actualElement,
+    Element? actualElement,
     Element declaration, {
     Map<String, String> expectedSubstitution = const {},
   }) {
diff --git a/pkg/analyzer/test/src/diagnostics/null_safety_read_write_test.dart b/pkg/analyzer/test/src/diagnostics/null_safety_read_write_test.dart
index 2920519..c8fe983 100644
--- a/pkg/analyzer/test/src/diagnostics/null_safety_read_write_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/null_safety_read_write_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/src/error/codes.dart';
-import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -1214,13 +1213,13 @@
 
   void _assertAssigned(
     String search, {
-    @required bool assigned,
-    @required bool unassigned,
+    required bool assigned,
+    required bool unassigned,
   }) {
     var node = findNode.simple(search);
 
-    var testingData = driverFor(testFilePath).testingData;
-    var unitData = testingData.uriToFlowAnalysisData[result.uri];
+    var testingData = driverFor(testFilePath).testingData!;
+    var unitData = testingData.uriToFlowAnalysisData[result.uri]!;
 
     if (assigned) {
       expect(unitData.definitelyAssigned, contains(node));
diff --git a/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart b/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
index a5c4ffc..411e564 100644
--- a/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
@@ -569,7 +569,7 @@
     assertBinaryExpression(
       findNode.binary('=='),
       element: elementMatcher(
-        objectElement.getMethod('=='),
+        objectElement.getMethod('==')!,
         isLegacy: isNullSafetySdkAndLegacyLibrary,
       ),
       type: 'bool',
@@ -619,7 +619,7 @@
     assertSimpleIdentifier(
       findNode.simple('toString'),
       element: elementMatcher(
-        objectElement.getMethod('toString'),
+        objectElement.getMethod('toString')!,
         isLegacy: isNullSafetySdkAndLegacyLibrary,
       ),
       type: 'String Function()',
@@ -636,7 +636,7 @@
     assertSimpleIdentifier(
       findNode.simple('hashCode'),
       element: elementMatcher(
-        objectElement.getGetter('hashCode'),
+        objectElement.getGetter('hashCode')!,
         isLegacy: isNullSafetySdkAndLegacyLibrary,
       ),
       type: 'int',
diff --git a/pkg/analyzer/test/src/diagnostics/recursive_compile_time_constant_test.dart b/pkg/analyzer/test/src/diagnostics/recursive_compile_time_constant_test.dart
index 90d06b2..325c407 100644
--- a/pkg/analyzer/test/src/diagnostics/recursive_compile_time_constant_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/recursive_compile_time_constant_test.dart
@@ -45,12 +45,10 @@
 ''',
     );
     // No errors, because the cycle is not in this source.
-    await assertErrorsInCode(r'''
+    await assertNoErrorsInCode(r'''
 import 'constants.dart';
 final z = {x: 0, y: 1};
-''', [
-      error(HintCode.EQUAL_KEYS_IN_MAP, 42, 1),
-    ]);
+''');
   }
 
   test_initializer_after_toplevel_var() async {
diff --git a/pkg/analyzer/test/src/diagnostics/sdk_constraint_verifier_support.dart b/pkg/analyzer/test/src/diagnostics/sdk_constraint_verifier_support.dart
index b196ff0..34dbac4 100644
--- a/pkg/analyzer/test/src/diagnostics/sdk_constraint_verifier_support.dart
+++ b/pkg/analyzer/test/src/diagnostics/sdk_constraint_verifier_support.dart
@@ -11,7 +11,7 @@
   /// Verify that the [expectedErrors] are produced if the [source] is analyzed
   /// in a context that specifies the minimum SDK version to be [version].
   Future<void> verifyVersion(String version, String source,
-      {List<ExpectedError> expectedErrors}) async {
+      {List<ExpectedError>? expectedErrors}) async {
     writeTestPackagePubspecYamlFile(
       PubspecYamlFileConfig(
         sdkVersion: '>=$version',
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 c515d56..fba1fe4 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
@@ -303,7 +303,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/diagnostics/use_of_nullable_value_test.dart b/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart
index 5e0338c..4c97b99 100644
--- a/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart
@@ -505,7 +505,7 @@
       writeElement: findElement.setter('x'),
       writeType: 'int',
       operatorElement: elementMatcher(
-        numElement.getMethod('+'),
+        numElement.getMethod('+')!,
         isLegacy: isNullSafetySdkAndLegacyLibrary,
       ),
       type: 'int',
@@ -518,7 +518,7 @@
       writeElement: findElement.setter('y'),
       writeType: 'int?',
       operatorElement: elementMatcher(
-        numElement.getMethod('+'),
+        numElement.getMethod('+')!,
         isLegacy: isNullSafetySdkAndLegacyLibrary,
       ),
       type: 'int',
@@ -560,7 +560,7 @@
       writeElement: findElement.setter('x'),
       writeType: 'int',
       operatorElement: elementMatcher(
-        numElement.getMethod('+'),
+        numElement.getMethod('+')!,
         isLegacy: isNullSafetySdkAndLegacyLibrary,
       ),
       type: 'int?',
@@ -573,7 +573,7 @@
       writeElement: findElement.setter('x'),
       writeType: 'int',
       operatorElement: elementMatcher(
-        numElement.getMethod('+'),
+        numElement.getMethod('+')!,
         isLegacy: isNullSafetySdkAndLegacyLibrary,
       ),
       type: 'int',
@@ -607,7 +607,7 @@
       writeElement: findElement.parameter('x'),
       writeType: 'int',
       operatorElement: elementMatcher(
-        numElement.getMethod('+'),
+        numElement.getMethod('+')!,
         isLegacy: isNullSafetySdkAndLegacyLibrary,
       ),
       type: 'int',
@@ -620,7 +620,7 @@
       writeElement: findElement.parameter('y'),
       writeType: 'int?',
       operatorElement: elementMatcher(
-        numElement.getMethod('+'),
+        numElement.getMethod('+')!,
         isLegacy: isNullSafetySdkAndLegacyLibrary,
       ),
       type: 'int',
@@ -1534,8 +1534,8 @@
     ]);
     var propertyAccess1 = findNode.propertyAccess('x; // 1');
     var propertyAccess2 = findNode.propertyAccess('x; // 2');
-    PropertyAccess propertyAccess1t = propertyAccess1.target;
-    PropertyAccess propertyAccess2t = propertyAccess1.target;
+    var propertyAccess1t = propertyAccess1.target as PropertyAccess;
+    var propertyAccess2t = propertyAccess1.target as PropertyAccess;
     assertType(propertyAccess1t.target, 'B?');
     assertType(propertyAccess2t.target, 'B?');
     assertType(propertyAccess1t, 'A');
diff --git a/pkg/analyzer/test/src/fasta/ast_builder_test.dart b/pkg/analyzer/test/src/fasta/ast_builder_test.dart
index 356122e..be10148 100644
--- a/pkg/analyzer/test/src/fasta/ast_builder_test.dart
+++ b/pkg/analyzer/test/src/fasta/ast_builder_test.dart
@@ -25,10 +25,10 @@
 ''');
     expect(unit, isNotNull);
     expect(unit.declarations, hasLength(1));
-    ClassDeclaration declaration = unit.declarations[0];
+    var declaration = unit.declarations[0] as ClassDeclaration;
     expect(declaration, isNotNull);
     expect(declaration.members, hasLength(1));
-    ConstructorDeclaration member = declaration.members[0];
+    var member = declaration.members[0] as ConstructorDeclaration;
     expect(member, isNotNull);
     expect(member.factoryKeyword, isNotNull);
     expect(member.name, isNull);
@@ -45,10 +45,10 @@
     ]);
     expect(unit, isNotNull);
     expect(unit.declarations, hasLength(1));
-    ClassDeclaration declaration = unit.declarations[0];
+    var declaration = unit.declarations[0] as ClassDeclaration;
     expect(declaration, isNotNull);
     expect(declaration.members, hasLength(1));
-    ConstructorDeclaration member = declaration.members[0];
+    var member = declaration.members[0] as ConstructorDeclaration;
     expect(member, isNotNull);
     expect(member.initializers, hasLength(1));
   }
@@ -63,10 +63,10 @@
     ]);
     expect(unit, isNotNull);
     expect(unit.declarations, hasLength(1));
-    ClassDeclaration declaration = unit.declarations[0];
+    var declaration = unit.declarations[0] as ClassDeclaration;
     expect(declaration, isNotNull);
     expect(declaration.members, hasLength(1));
-    MethodDeclaration member = declaration.members[0];
+    var member = declaration.members[0] as MethodDeclaration;
     expect(member, isNotNull);
     expect(member.isGetter, isTrue);
     expect(member.name.name, 'A');
diff --git a/pkg/analyzer/test/src/fasta/message_coverage_test.dart b/pkg/analyzer/test/src/fasta/message_coverage_test.dart
index 11f9a85..f21e632 100644
--- a/pkg/analyzer/test/src/fasta/message_coverage_test.dart
+++ b/pkg/analyzer/test/src/fasta/message_coverage_test.dart
@@ -68,7 +68,7 @@
       for (String name in contents.keys) {
         Object value = contents[name];
         if (value is YamlMap) {
-          String code = value['analyzerCode']?.toString();
+          var code = value['analyzerCode']?.toString();
           if (code != null) {
             codes.add(code);
           }
@@ -83,21 +83,20 @@
   List<String> getTranslatedCodes(String astBuilderPath) {
     String content = io.File(astBuilderPath).readAsStringSync();
     CompilationUnit unit = parseCompilationUnit(content);
-    ClassDeclaration astBuilder = unit.declarations[0];
-    expect(astBuilder, isNotNull);
-    MethodDeclaration method = astBuilder.members.firstWhere(
-        (x) => x is MethodDeclaration && x.name.name == 'reportMessage',
-        orElse: () => null);
-    expect(method, isNotNull);
+    var astBuilder = unit.declarations[0] as ClassDeclaration;
+    var method = astBuilder.members
+        .whereType<MethodDeclaration>()
+        .firstWhere((x) => x.name.name == 'reportMessage');
     SwitchStatement statement = (method.body as BlockFunctionBody)
         .block
         .statements
-        .firstWhere((x) => x is SwitchStatement, orElse: () => null);
+        .whereType<SwitchStatement>()
+        .first;
     expect(statement, isNotNull);
     List<String> codes = <String>[];
     for (SwitchMember member in statement.members) {
       if (member is SwitchCase) {
-        codes.add((member.expression as StringLiteral).stringValue);
+        codes.add((member.expression as StringLiteral).stringValue!);
       }
     }
     return codes;
diff --git a/pkg/analyzer/test/src/fasta/recovery/extra_code_test.dart b/pkg/analyzer/test/src/fasta/recovery/extra_code_test.dart
index 7130d73..9b95376 100644
--- a/pkg/analyzer/test/src/fasta/recovery/extra_code_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/extra_code_test.dart
@@ -64,9 +64,8 @@
         codes: [ParserErrorCode.GETTER_WITH_PARAMETERS]);
     validateTokenStream(unit.beginToken);
 
-    FunctionDeclaration g = unit.declarations.first;
-    var parameters = g.functionExpression.parameters;
-    expect(parameters, isNotNull);
+    var g = unit.declarations.first as FunctionDeclaration;
+    var parameters = g.functionExpression.parameters!;
     expect(parameters.parameters, hasLength(1));
   }
 
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/constructor_declaration_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/constructor_declaration_test.dart
index 8d7499d..cc830fb 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/constructor_declaration_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/constructor_declaration_test.dart
@@ -114,8 +114,8 @@
   }
 
   CompilationUnit setSeparator(CompilationUnit unit) {
-    ClassDeclaration declaration = unit.declarations[0];
-    ConstructorDeclaration member = declaration.members[0];
+    var declaration = unit.declarations[0] as ClassDeclaration;
+    var member = declaration.members[0] as ConstructorDeclaration;
     member.separator =
         Token(TokenType.COLON, member.parameters.endToken.charOffset + 1);
     return unit;
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/partial_code_support.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/partial_code_support.dart
index 9b357b4..8247907 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/partial_code_support.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/partial_code_support.dart
@@ -98,10 +98,10 @@
   /// `descriptors.length * (suffixes.length + 1)` tests generated.
   buildTests(String groupName, List<TestDescriptor> descriptors,
       List<TestSuffix> suffixes,
-      {FeatureSet featureSet,
-      String head,
+      {FeatureSet? featureSet,
+      String? head,
       bool includeEof = true,
-      String tail}) {
+      String? tail}) {
     group(groupName, () {
       for (TestDescriptor descriptor in descriptors) {
         if (includeEof) {
@@ -116,7 +116,7 @@
         }
         if (descriptor.failing != null) {
           test('${descriptor.name}_failingList', () {
-            Set<String> failing = Set.from(descriptor.failing);
+            Set<String> failing = Set.from(descriptor.failing!);
             if (includeEof) {
               failing.remove('eof');
             }
@@ -132,8 +132,8 @@
 
   /// Build a single test based on the given [descriptor] and [suffix].
   _buildTestForDescriptorAndSuffix(TestDescriptor descriptor, TestSuffix suffix,
-      int suffixIndex, String head, String tail,
-      {FeatureSet featureSet}) {
+      int suffixIndex, String? head, String? tail,
+      {FeatureSet? featureSet}) {
     test('${descriptor.name}_${suffix.name}', () {
       //
       // Compose the invalid and valid pieces of code.
@@ -180,18 +180,18 @@
       var expectedValidCodeErrors = <ErrorCode>[];
       expectedValidCodeErrors.addAll(baseErrorCodes);
       if (descriptor.expectedErrorsInValidCode != null) {
-        expectedValidCodeErrors.addAll(descriptor.expectedErrorsInValidCode);
+        expectedValidCodeErrors.addAll(descriptor.expectedErrorsInValidCode!);
       }
 
       var expectedInvalidCodeErrors = <ErrorCode>[];
       expectedInvalidCodeErrors.addAll(baseErrorCodes);
       if (descriptor.errorCodes != null) {
-        expectedInvalidCodeErrors.addAll(descriptor.errorCodes);
+        expectedInvalidCodeErrors.addAll(descriptor.errorCodes!);
       }
       //
       // Run the test.
       //
-      List<String> failing = descriptor.failing;
+      var failing = descriptor.failing;
       if (descriptor.allFailing ||
           (failing != null && failing.contains(suffix.name))) {
         bool failed = false;
@@ -229,25 +229,25 @@
   final String invalid;
 
   /// Error codes that the parser is expected to produce.
-  final List<ErrorCode> errorCodes;
+  final List<ErrorCode>? errorCodes;
 
   /// Valid code that is equivalent to what the parser should produce as part of
   /// recovering from the invalid code.
   final String valid;
 
   /// Error codes that the parser is expected to produce in the valid code.
-  final List<ErrorCode> expectedErrorsInValidCode;
+  final List<ErrorCode>? expectedErrorsInValidCode;
 
   /// A flag indicating whether all of the tests are expected to fail.
   final bool allFailing;
 
   /// A list containing the names of the suffixes for which the test is expected
   /// to fail.
-  final List<String> failing;
+  final List<String>? failing;
 
   /// A function that modifies the valid compilation unit before it is compared
   /// with the invalid compilation unit, or `null` if no modification needed.
-  AdjustValidUnitBeforeComparison adjustValidUnitBeforeComparison;
+  AdjustValidUnitBeforeComparison? adjustValidUnitBeforeComparison;
 
   /// Initialize a newly created test descriptor.
   TestDescriptor(this.name, this.invalid, this.errorCodes, this.valid,
diff --git a/pkg/analyzer/test/src/fasta/recovery/recovery_test_support.dart b/pkg/analyzer/test/src/fasta/recovery/recovery_test_support.dart
index a335ee4..61c070a 100644
--- a/pkg/analyzer/test/src/fasta/recovery/recovery_test_support.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/recovery_test_support.dart
@@ -16,11 +16,11 @@
 /// syntactic errors.
 abstract class AbstractRecoveryTest extends FastaParserTestCase {
   void testRecovery(
-      String invalidCode, List<ErrorCode> errorCodes, String validCode,
-      {CompilationUnit Function(CompilationUnit unit)
+      String invalidCode, List<ErrorCode>? errorCodes, String validCode,
+      {CompilationUnit Function(CompilationUnit unit)?
           adjustValidUnitBeforeComparison,
-      List<ErrorCode> expectedErrorsInValidCode,
-      FeatureSet featureSet}) {
+      List<ErrorCode>? expectedErrorsInValidCode,
+      FeatureSet? featureSet}) {
     CompilationUnit validUnit;
 
     // Assert that the valid code is indeed valid.
@@ -57,7 +57,7 @@
 
   void validateTokenStream(Token token) {
     while (!token.isEof) {
-      Token next = token.next;
+      Token next = token.next!;
       expect(token.end, lessThanOrEqualTo(next.offset));
       if (next.isSynthetic) {
         if (const [')', ']', '}'].contains(next.lexeme)) {
@@ -86,7 +86,7 @@
   }
 
   @override
-  bool failIfNotNull(Object first, Object second) {
+  bool failIfNotNull(Object? first, Object? second) {
     if (second != null) {
       StringBuffer buffer = StringBuffer();
       buffer.write('Expected null; found a ');
@@ -100,7 +100,7 @@
   }
 
   @override
-  bool failIsNull(Object first, Object second) {
+  bool failIsNull(Object first, Object? second) {
     StringBuffer buffer = StringBuffer();
     buffer.write('Expected a ');
     buffer.write(first.runtimeType);
@@ -127,7 +127,7 @@
   /// Overridden to allow the valid code to contain an explicit identifier where
   /// a synthetic identifier is expected to be inserted by recovery.
   @override
-  bool isEqualNodes(AstNode first, AstNode second) {
+  bool isEqualNodes(AstNode? first, AstNode? second) {
     if (first is SimpleIdentifier && second is SimpleIdentifier) {
       if (first.isSynthetic && second.name == '_s_') {
         return true;
@@ -143,7 +143,7 @@
       (first.isSynthetic && first.type == second.type) ||
       (first.length == second.length && first.lexeme == second.lexeme);
 
-  void _safelyWriteNodePath(StringBuffer buffer, AstNode node) {
+  void _safelyWriteNodePath(StringBuffer buffer, AstNode? node) {
     buffer.write('  path: ');
     if (node == null) {
       buffer.write(' null');
@@ -153,7 +153,7 @@
   }
 
   void _writeNodePath(StringBuffer buffer, AstNode node) {
-    AstNode parent = node.parent;
+    var parent = node.parent;
     if (parent != null) {
       _writeNodePath(buffer, parent);
       buffer.write(', ');
diff --git a/pkg/analyzer/test/src/fasta/token_utils_test.dart b/pkg/analyzer/test/src/fasta/token_utils_test.dart
index 8db705a..9fdc10e 100644
--- a/pkg/analyzer/test/src/fasta/token_utils_test.dart
+++ b/pkg/analyzer/test/src/fasta/token_utils_test.dart
@@ -18,15 +18,15 @@
   void test_findPrevious() {
     Token a =
         scanString('a b c /* comment */ d e', includeComments: true).tokens;
-    Token b = a.next;
-    Token c = b.next;
-    Token d = c.next;
-    Token e = d.next;
+    Token b = a.next!;
+    Token c = b.next!;
+    Token d = c.next!;
+    Token e = d.next!;
 
     expect(findPrevious(a, b), a);
     expect(findPrevious(a, c), b);
     expect(findPrevious(a, d), c);
-    expect(findPrevious(d.precedingComments, e), d);
+    expect(findPrevious(d.precedingComments!, e), d);
 
     Token x = scanString('x').tokens;
     expect(findPrevious(a, x), null);
diff --git a/pkg/analyzer/test/src/lint/config_test.dart b/pkg/analyzer/test/src/lint/config_test.dart
index cf75cf2..793c42d 100644
--- a/pkg/analyzer/test/src/lint/config_test.dart
+++ b/pkg/analyzer/test/src/lint/config_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:analyzer/src/lint/config.dart';
 import 'package:test/test.dart';
+import 'package:yaml/yaml.dart';
 
 import '../util/yaml_test.dart';
 
@@ -80,7 +81,7 @@
       unnecessary_getters: false #disable
       camel_case_types: true #enable
 ''';
-          var config = processAnalysisOptionsFile(src);
+          var config = processAnalysisOptionsFile(src)!;
           var ruleNames = config.ruleConfigs.map((rc) => rc.name);
           expect(ruleNames, hasLength(2));
           expect(ruleNames, contains('unnecessary_getters'));
@@ -99,7 +100,7 @@
   rules:
     - camel_case_types
 ''';
-          var config = processAnalysisOptionsFile(src);
+          var config = processAnalysisOptionsFile(src)!;
           expect(config.ruleConfigs.length, 1);
           // Verify that defaults are enabled.
           expect(config.ruleConfigs[0].args['enabled'], isTrue);
@@ -116,10 +117,10 @@
     camel_case_types: true #enable
     unnecessary_getters: false #disable
 ''';
-          var config = processAnalysisOptionsFile(src);
+          var config = processAnalysisOptionsFile(src)!;
           var ruleConfigs = config.ruleConfigs.toList();
-          ruleConfigs.sort(
-              (RuleConfig rc1, RuleConfig rc2) => rc1.name.compareTo(rc2.name));
+          ruleConfigs.sort((RuleConfig rc1, RuleConfig rc2) =>
+              rc1.name!.compareTo(rc2.name!));
           expect(ruleConfigs, hasLength(2));
           expect(ruleConfigs[0].name, 'camel_case_types');
           expect(ruleConfigs[0].args['enabled'], isTrue);
@@ -140,44 +141,48 @@
 
   group('options processing', () {
     group('raw maps', () {
+      LintConfig parseMap(Map<Object, Object?> map) {
+        return parseConfig(wrap(map) as YamlMap)!;
+      }
+
       test('rule list', () {
-        Map options = {};
+        var options = <Object, Object?>{};
         var lintOptions = {
           'rules': ['camel_case_types']
         };
         options['linter'] = lintOptions;
 
-        var config = parseConfig(wrap(options));
+        var config = parseMap(options);
         expect(config, isNotNull);
         expect(config.ruleConfigs, hasLength(1));
       });
 
       test('rule map (bool)', () {
-        Map options = {};
+        var options = <Object, Object?>{};
         var lintOptions = {
           'rules': {'camel_case_types': true}
         };
         options['linter'] = lintOptions;
 
-        var config = parseConfig(wrap(options));
+        var config = parseMap(options);
         expect(config, isNotNull);
         expect(config.ruleConfigs, hasLength(1));
       });
 
       test('rule map (string)', () {
-        Map options = {};
+        var options = <Object, Object?>{};
         var lintOptions = {
           'rules': {'camel_case_types': 'true'}
         };
         options['linter'] = lintOptions;
 
-        var config = parseConfig(wrap(options));
+        var config = parseMap(options);
         expect(config, isNotNull);
         expect(config.ruleConfigs, hasLength(1));
       });
 
       test('nested rule map (bool)', () {
-        Map options = {};
+        var options = <Object, Object?>{};
         var lintOptions = {
           'rules': {
             'style_guide': {'camel_case_types': true}
@@ -185,13 +190,13 @@
         };
         options['linter'] = lintOptions;
 
-        var config = parseConfig(wrap(options));
+        var config = parseMap(options);
         expect(config, isNotNull);
         expect(config.ruleConfigs, hasLength(1));
       });
 
       test('nested rule map (string)', () {
-        Map options = {};
+        var options = <Object, Object?>{};
         var lintOptions = {
           'rules': {
             'style_guide': {'camel_case_types': true}
@@ -199,7 +204,7 @@
         };
         options['linter'] = lintOptions;
 
-        var config = parseConfig(wrap(options));
+        var config = parseMap(options);
         expect(config, isNotNull);
         expect(config.ruleConfigs, hasLength(1));
       });
diff --git a/pkg/analyzer/test/src/lint/lint_rule_test.dart b/pkg/analyzer/test/src/lint/lint_rule_test.dart
index cca6a47..c6a04fb 100644
--- a/pkg/analyzer/test/src/lint/lint_rule_test.dart
+++ b/pkg/analyzer/test/src/lint/lint_rule_test.dart
@@ -67,26 +67,26 @@
     correction: 'Implement `==`.');
 
 class CollectingReporter extends ErrorReporter {
-  ErrorCode code;
+  ErrorCode? code;
 
   CollectingReporter(AnalysisErrorListener listener, Source source)
       : super(listener, source, isNonNullableByDefault: false);
 
   @override
   void reportErrorForElement(ErrorCode errorCode, Element element,
-      [List<Object> arguments]) {
+      [List<Object?>? arguments]) {
     code = errorCode;
   }
 
   @override
   void reportErrorForNode(ErrorCode errorCode, AstNode node,
-      [List<Object> arguments]) {
+      [List<Object?>? arguments]) {
     code = errorCode;
   }
 
   @override
   void reportErrorForToken(ErrorCode errorCode, Token token,
-      [List<Object> arguments]) {
+      [List<Object?>? arguments]) {
     code = errorCode;
   }
 }
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 003906c..d70792b 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
@@ -4,6 +4,7 @@
 
 import 'package:analyzer/src/context/builder.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
+import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/lint/linter.dart';
 import 'package:analyzer/src/workspace/pub.dart';
 import 'package:test/test.dart';
@@ -23,11 +24,11 @@
 
 @reflectiveTest
 abstract class AbstractLinterContextTest extends PubPackageResolutionTest {
-  LinterContextImpl context;
+  late final LinterContextImpl context;
 
   Future<void> resolve(String content) async {
     await resolveTestCode(content);
-    var contextUnit = LinterContextUnit(result.content, result.unit);
+    var contextUnit = LinterContextUnit(result.content!, result.unit!);
 
     final libraryPath = result.libraryElement.source.fullName;
     final builder = ContextBuilder(
@@ -42,7 +43,7 @@
       contextUnit,
       result.session.declaredVariables,
       result.typeProvider,
-      result.typeSystem,
+      result.typeSystem as TypeSystemImpl,
       InheritanceManager3(),
       analysisOptions,
       // todo (pq): test package or consider passing in null
@@ -54,7 +55,7 @@
 @reflectiveTest
 class CanBeConstConstructorTest extends AbstractLinterContextTest {
   @override
-  LinterContextImpl context;
+  late final LinterContextImpl context;
 
   void assertCanBeConstConstructor(String search, bool expectedResult) {
     var constructor = findNode.constructor(search);
@@ -440,7 +441,7 @@
 ''');
     var result = _evaluateX();
     expect(result.errors, isEmpty);
-    expect(result.value.toIntValue(), 3);
+    expect(result.value!.toIntValue(), 3);
   }
 
   test_hasValue_intLiteral() async {
@@ -449,11 +450,11 @@
 ''');
     var result = _evaluateX();
     expect(result.errors, isEmpty);
-    expect(result.value.toIntValue(), 42);
+    expect(result.value!.toIntValue(), 42);
   }
 
   LinterConstantEvaluationResult _evaluateX() {
-    var node = findNode.topVariableDeclarationByName('x').initializer;
+    var node = findNode.topVariableDeclarationByName('x').initializer!;
     return context.evaluateConstant(node);
   }
 }
@@ -475,14 +476,14 @@
 
     expect(context.package, TypeMatcher<PubWorkspacePackage>());
     final pubPackage = context.package as PubWorkspacePackage;
-    final pubspec = pubPackage.pubspec;
+    final pubspec = pubPackage.pubspec!;
 
-    final argsDep = pubspec.dependencies
-        .singleWhere((element) => element.name.text == 'args');
-    expect(argsDep.version.value.text, '>=0.12.1 <2.0.0');
+    final argsDep = pubspec.dependencies!
+        .singleWhere((element) => element.name!.text == 'args');
+    expect(argsDep.version!.value.text, '>=0.12.1 <2.0.0');
 
-    final charCodeDep = pubspec.dependencies
-        .singleWhere((element) => element.name.text == 'charcode');
-    expect(charCodeDep.version.value.text, '^1.1.0');
+    final charCodeDep = pubspec.dependencies!
+        .singleWhere((element) => element.name!.text == 'charcode');
+    expect(charCodeDep.version!.value.text, '^1.1.0');
   }
 }
diff --git a/pkg/analyzer/test/src/lint/project_test.dart b/pkg/analyzer/test/src/lint/project_test.dart
index 1c67dfb..00e6361 100644
--- a/pkg/analyzer/test/src/lint/project_test.dart
+++ b/pkg/analyzer/test/src/lint/project_test.dart
@@ -4,6 +4,7 @@
 
 import 'dart:io';
 
+import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/lint/project.dart';
 import 'package:test/test.dart';
 
@@ -17,7 +18,7 @@
       // TODO(brianwilkerson) These tests fail on the bots because the cwd is
       // not the same there as when we run tests locally.
       group('cwd', () async {
-        var project = await DartProject.create(null, null);
+        var project = await DartProject.create(_AnalysisDriverMock(), []);
         test('name', () {
           expect(project.name, 'analyzer');
         });
@@ -59,3 +60,8 @@
     });
   });
 }
+
+class _AnalysisDriverMock implements AnalysisDriver {
+  @override
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
diff --git a/pkg/analyzer/test/src/lint/pub_test.dart b/pkg/analyzer/test/src/lint/pub_test.dart
index da528d9..4e71879 100644
--- a/pkg/analyzer/test/src/lint/pub_test.dart
+++ b/pkg/analyzer/test/src/lint/pub_test.dart
@@ -60,7 +60,7 @@
       testValueSpan('name', ps.name, startOffset: 6, endOffset: 12);
       group('documentation', () {
         test('no value', () {
-          expect(ps.documentation.value.text, isNull);
+          expect(ps.documentation!.value.text, isNull);
         });
       });
       testValue('homepage', ps.homepage,
@@ -71,7 +71,7 @@
       testValue('author', ps.author, equals('Dart Team <misc@dartlang.org>'));
 
       group('authors', () {
-        PSNodeList authors = ps.authors;
+        PSNodeList authors = ps.authors!;
         test('contents', () {
           expect(authors, isNotNull);
           expect(authors.any((PSNode n) => n.text == 'Bill'), isTrue);
@@ -94,14 +94,14 @@
       group('path', () {
         PSDependency dep =
             findDependency(ps.dependencies, name: 'relative_path');
-        PSEntry depPath = dep.path;
+        PSEntry depPath = dep.path!;
         testValue('path', depPath, equals('../somewhere'));
       });
 
       group('hosted', () {
         PSDependency dep =
             findDependency(ps.dependencies, name: 'transmogrify');
-        PSHost host = dep.host;
+        PSHost host = dep.host!;
         testValue('name', host.name, equals('transmogrify'));
         testValue('url', host.url, equals('http://your-package-server.com'));
         testKeySpan('name', host.name, startOffset: 237, endOffset: 241);
@@ -110,7 +110,7 @@
 
       group('git', () {
         PSDependency dep = findDependency(ps.dependencies, name: 'kittens');
-        PSGitRepo git = dep.git;
+        PSGitRepo git = dep.git!;
         testValue('ref', git.ref, equals('some-branch'));
         testValue(
             'url', git.url, equals('git://github.com/munificent/kittens.git'));
@@ -155,17 +155,17 @@
   });
 }
 
-PSDependency findDependency(PSDependencyList deps, {String name}) =>
-    deps.firstWhere((dep) => dep.name.text == name, orElse: () => null);
+PSDependency findDependency(PSDependencyList? deps, {String? name}) =>
+    deps!.firstWhere((dep) => dep.name!.text == name);
 
 testDepListContains(
-    String label, PSDependencyList list, List<Map<String, String>> exp) {
+    String label, PSDependencyList? list, List<Map<String, String>> exp) {
   test(label, () {
     exp.forEach((Map<String, String> entry) {
       entry.forEach((k, v) {
         PSDependency dep = findDependency(list, name: k);
         expect(dep, isNotNull);
-        expect(dep.version.value.text, equals(v));
+        expect(dep.version!.value.text, equals(v));
       });
     });
   });
@@ -179,15 +179,15 @@
   });
 }
 
-testKeySpan(String label, PSEntry node, {int startOffset, int endOffset}) {
+testKeySpan(String label, PSEntry? node, {int? startOffset, int? endOffset}) {
   group(label, () {
     group('key', () {
-      testSpan(node.key.span, startOffset: startOffset, endOffset: endOffset);
+      testSpan(node!.key!.span, startOffset: startOffset, endOffset: endOffset);
     });
   });
 }
 
-testSpan(SourceSpan span, {int startOffset, int endOffset}) {
+testSpan(SourceSpan span, {int? startOffset, int? endOffset}) {
   test('span', () {
     var start = span.start;
     expect(start, isNotNull);
@@ -198,18 +198,19 @@
   });
 }
 
-testValue(String label, PSEntry node, Matcher m) {
+testValue(String label, PSEntry? node, Matcher m) {
   group(label, () {
     test('value', () {
-      expect(node.value.text, m);
+      expect(node!.value.text, m);
     });
   });
 }
 
-testValueSpan(String label, PSEntry node, {int startOffset, int endOffset}) {
+testValueSpan(String label, PSEntry? node, {int? startOffset, int? endOffset}) {
   group(label, () {
     group('value', () {
-      testSpan(node.value.span, startOffset: startOffset, endOffset: endOffset);
+      testSpan(node!.value.span,
+          startOffset: startOffset, endOffset: endOffset);
     });
   });
 }
diff --git a/pkg/analyzer/test/src/manifest/manifest_validator_test.dart b/pkg/analyzer/test/src/manifest/manifest_validator_test.dart
index 4f2dce2..a3f0cc1 100644
--- a/pkg/analyzer/test/src/manifest/manifest_validator_test.dart
+++ b/pkg/analyzer/test/src/manifest/manifest_validator_test.dart
@@ -55,7 +55,7 @@
 
     result = parser.parseXmlTag();
     expect(result.parseResult, ParseResult.relevantElement);
-    expect(result.element.name, MANIFEST_TAG);
+    expect(result.element!.name, MANIFEST_TAG);
   }
 
   void test_emptyFileDoesNotCrash() {
@@ -151,7 +151,7 @@
   void test_manifestTag_attributeWithEmptyValue_emptyElement_isParsed() {
     var parser = ManifestParser('<manifest xmlns:android=""/>', _manifestUri);
     var result = parser.parseXmlTag();
-    expect(result.element.name, MANIFEST_TAG);
+    expect(result.element!.name, MANIFEST_TAG);
   }
 
   void test_manifestTag_emptyElement_isParsed() {
@@ -160,21 +160,21 @@
 ''', _manifestUri);
     var result = parser.parseXmlTag();
     expect(result.parseResult, ParseResult.relevantElement);
-    expect(result.element.name, MANIFEST_TAG);
+    expect(result.element!.name, MANIFEST_TAG);
   }
 
   void test_manifestTag_emptyElement_noAttributes_isParsed() {
     var parser = ManifestParser('<manifest/>', _manifestUri);
     var result = parser.parseXmlTag();
     expect(result.parseResult, ParseResult.relevantElement);
-    expect(result.element.name, MANIFEST_TAG);
+    expect(result.element!.name, MANIFEST_TAG);
   }
 
   void test_manifestTag_emptyElement_noAttributes_whitespace_isParsed() {
     var parser = ManifestParser('<manifest />', _manifestUri);
     var result = parser.parseXmlTag();
     expect(result.parseResult, ParseResult.relevantElement);
-    expect(result.element.name, MANIFEST_TAG);
+    expect(result.element!.name, MANIFEST_TAG);
   }
 
   void test_manifestTag_emptyElement_whitespace_isParsed() {
@@ -183,7 +183,7 @@
 ''', _manifestUri);
     var result = parser.parseXmlTag();
     expect(result.parseResult, ParseResult.relevantElement);
-    expect(result.element.name, MANIFEST_TAG);
+    expect(result.element!.name, MANIFEST_TAG);
   }
 
   void test_manifestTag_isParsed() {
@@ -193,7 +193,7 @@
 ''', _manifestUri);
     var result = parser.parseXmlTag();
     expect(result.parseResult, ParseResult.relevantElement);
-    expect(result.element.name, MANIFEST_TAG);
+    expect(result.element!.name, MANIFEST_TAG);
   }
 
   void test_manifestTag_uppercase_isParsed() {
@@ -203,7 +203,7 @@
 ''', _manifestUri);
     var result = parser.parseXmlTag();
     expect(result.parseResult, ParseResult.relevantElement);
-    expect(result.element.name, MANIFEST_TAG);
+    expect(result.element!.name, MANIFEST_TAG);
   }
 
   void test_manifestTag_withDoctype_isParsed() {
@@ -218,7 +218,7 @@
 
     result = parser.parseXmlTag();
     expect(result.parseResult, ParseResult.relevantElement);
-    expect(result.element.name, MANIFEST_TAG);
+    expect(result.element!.name, MANIFEST_TAG);
   }
 
   void test_manifestTag_withFeatures_isParsed() {
@@ -230,21 +230,21 @@
 </manifest>
 ''', _manifestUri);
     var result = parser.parseXmlTag();
-    expect(result.element.name, MANIFEST_TAG);
-    var children = result.element.children;
+    expect(result.element!.name, MANIFEST_TAG);
+    var children = result.element!.children;
     expect(children, hasLength(2));
 
     expect(children[0].name, equals(USES_FEATURE_TAG));
     var touchscreenAttributes = children[0].attributes;
     expect(touchscreenAttributes, hasLength(2));
-    expect(touchscreenAttributes[ANDROID_NAME].value,
+    expect(touchscreenAttributes[ANDROID_NAME]!.value,
         equals(HARDWARE_FEATURE_TOUCHSCREEN));
-    expect(touchscreenAttributes[ANDROID_REQUIRED].value, equals('false'));
+    expect(touchscreenAttributes[ANDROID_REQUIRED]!.value, equals('false'));
 
     expect(children[1].name, equals(USES_FEATURE_TAG));
     var homeScreenAttributes = children[1].attributes;
     expect(homeScreenAttributes, hasLength(1));
-    expect(homeScreenAttributes[ANDROID_NAME].value,
+    expect(homeScreenAttributes[ANDROID_NAME]!.value,
         equals('android.software.home_screen'));
   }
 
@@ -256,7 +256,7 @@
 ''', _manifestUri);
     var result = parser.parseXmlTag();
     expect(result.parseResult, ParseResult.relevantElement);
-    expect(result.element.name, MANIFEST_TAG);
+    expect(result.element!.name, MANIFEST_TAG);
   }
 
   void test_manifestTag_withSurroundingText_isParsed() {
@@ -268,7 +268,7 @@
 ''', _manifestUri);
     var result = parser.parseXmlTag();
     expect(result.parseResult, ParseResult.relevantElement);
-    expect(result.element.name, MANIFEST_TAG);
+    expect(result.element!.name, MANIFEST_TAG);
   }
 
   void test_manifestTag_withXmlTag_isParsed() {
@@ -283,7 +283,7 @@
 
     result = parser.parseXmlTag();
     expect(result.parseResult, ParseResult.relevantElement);
-    expect(result.element.name, MANIFEST_TAG);
+    expect(result.element!.name, MANIFEST_TAG);
   }
 
   void test_outsideTagClosedBeforeInside() {
@@ -297,10 +297,9 @@
     var parser =
         ManifestParser('<manifest aaa="bbb"></manifest>', _manifestUri);
     var result = parser.parseXmlTag();
-    expect(result.element.name, MANIFEST_TAG);
-    expect(result.element.attributes, hasLength(1));
-    var attribute = result.element.attributes['aaa'];
-    expect(attribute, isNotNull);
+    expect(result.element!.name, MANIFEST_TAG);
+    expect(result.element!.attributes, hasLength(1));
+    var attribute = result.element!.attributes['aaa']!;
     expect(attribute.name, equals('aaa'));
     expect(attribute.value, equals('bbb'));
     var sourceSpan = attribute.sourceSpan;
@@ -312,10 +311,9 @@
     var parser =
         ManifestParser('<manifest aaa="b\'b\'b"></manifest>', _manifestUri);
     var result = parser.parseXmlTag();
-    expect(result.element.name, MANIFEST_TAG);
-    expect(result.element.attributes, hasLength(1));
-    var attribute = result.element.attributes['aaa'];
-    expect(attribute, isNotNull);
+    expect(result.element!.name, MANIFEST_TAG);
+    expect(result.element!.attributes, hasLength(1));
+    var attribute = result.element!.attributes['aaa']!;
     expect(attribute.name, equals('aaa'));
     expect(attribute.value, equals("b'b'b"));
     var sourceSpan = attribute.sourceSpan;
@@ -326,10 +324,9 @@
   void test_relevantTag_attributeIsParsed_emptyValue() {
     var parser = ManifestParser('<manifest aaa=""></manifest>', _manifestUri);
     var result = parser.parseXmlTag();
-    expect(result.element.name, MANIFEST_TAG);
-    expect(result.element.attributes, hasLength(1));
-    var attribute = result.element.attributes['aaa'];
-    expect(attribute, isNotNull);
+    expect(result.element!.name, MANIFEST_TAG);
+    expect(result.element!.attributes, hasLength(1));
+    var attribute = result.element!.attributes['aaa']!;
     expect(attribute.name, equals('aaa'));
     expect(attribute.value, equals(''));
     var sourceSpan = attribute.sourceSpan;
@@ -341,10 +338,9 @@
     var parser =
         ManifestParser("<manifest aaa='bbb'></manifest>", _manifestUri);
     var result = parser.parseXmlTag();
-    expect(result.element.name, MANIFEST_TAG);
-    expect(result.element.attributes, hasLength(1));
-    var attribute = result.element.attributes['aaa'];
-    expect(attribute, isNotNull);
+    expect(result.element!.name, MANIFEST_TAG);
+    expect(result.element!.attributes, hasLength(1));
+    var attribute = result.element!.attributes['aaa']!;
     expect(attribute.name, equals('aaa'));
     expect(attribute.value, equals('bbb'));
     var sourceSpan = attribute.sourceSpan;
@@ -356,10 +352,9 @@
     var parser =
         ManifestParser('<manifest AAA="bbb"></manifest>', _manifestUri);
     var result = parser.parseXmlTag();
-    expect(result.element.name, MANIFEST_TAG);
-    expect(result.element.attributes, hasLength(1));
-    var attribute = result.element.attributes['aaa'];
-    expect(attribute, isNotNull);
+    expect(result.element!.name, MANIFEST_TAG);
+    expect(result.element!.attributes, hasLength(1));
+    var attribute = result.element!.attributes['aaa']!;
     expect(attribute.name, equals('aaa'));
     expect(attribute.value, equals('bbb'));
   }
@@ -368,18 +363,17 @@
     var parser =
         ManifestParser('<manifest xmlns:android=""></manifest>', _manifestUri);
     var result = parser.parseXmlTag();
-    expect(result.element.name, MANIFEST_TAG);
-    expect(result.element.attributes, hasLength(1));
-    var attribute = result.element.attributes['xmlns:android'];
-    expect(attribute, isNotNull);
+    expect(result.element!.name, MANIFEST_TAG);
+    expect(result.element!.attributes, hasLength(1));
+    var attribute = result.element!.attributes['xmlns:android']!;
     expect(attribute.value, equals(''));
   }
 
   void test_relevantTag_emptyElement_nameIsParsed() {
     var parser = ManifestParser('<manifest/>', _manifestUri);
     var result = parser.parseXmlTag();
-    expect(result.element.name, MANIFEST_TAG);
-    var sourceSpan = result.element.sourceSpan;
+    expect(result.element!.name, MANIFEST_TAG);
+    var sourceSpan = result.element!.sourceSpan!;
     expect(sourceSpan.start.offset, equals(0));
     expect(sourceSpan.end.offset, equals(10));
   }
@@ -387,8 +381,8 @@
   void test_relevantTag_emptyElement_whitespace_nameIsParsed() {
     var parser = ManifestParser('<manifest />', _manifestUri);
     var result = parser.parseXmlTag();
-    expect(result.element.name, MANIFEST_TAG);
-    var sourceSpan = result.element.sourceSpan;
+    expect(result.element!.name, MANIFEST_TAG);
+    var sourceSpan = result.element!.sourceSpan!;
     expect(sourceSpan.start.offset, equals(0));
     expect(sourceSpan.end.offset, equals(11));
   }
@@ -396,8 +390,8 @@
   void test_relevantTag_withAttributes_emptyElement_nameIsParsed() {
     var parser = ManifestParser('<manifest aaa="bbb" />', _manifestUri);
     var result = parser.parseXmlTag();
-    expect(result.element.name, MANIFEST_TAG);
-    var sourceSpan = result.element.sourceSpan;
+    expect(result.element!.name, MANIFEST_TAG);
+    var sourceSpan = result.element!.sourceSpan!;
     expect(sourceSpan.start.offset, equals(0));
     expect(sourceSpan.end.offset, equals(21));
   }
@@ -406,8 +400,8 @@
     var parser =
         ManifestParser('<manifest aaa="bbb"></manifest>', _manifestUri);
     var result = parser.parseXmlTag();
-    expect(result.element.name, MANIFEST_TAG);
-    var sourceSpan = result.element.sourceSpan;
+    expect(result.element!.name, MANIFEST_TAG);
+    var sourceSpan = result.element!.sourceSpan!;
     expect(sourceSpan.start.offset, equals(0));
     expect(sourceSpan.end.offset, equals(30));
   }
@@ -421,7 +415,7 @@
 
 @reflectiveTest
 class ManifestValidatorTest with ResourceProviderMixin {
-  ManifestValidator validator;
+  late final ManifestValidator validator;
 
   /// Assert that when the validator is used on the given [content] the
   /// [expectedErrorCodes] are produced.
diff --git a/pkg/analyzer/test/src/options/options_rule_validator_test.dart b/pkg/analyzer/test/src/options/options_rule_validator_test.dart
index 2c04a4e..506b2b6 100644
--- a/pkg/analyzer/test/src/options/options_rule_validator_test.dart
+++ b/pkg/analyzer/test/src/options/options_rule_validator_test.dart
@@ -22,9 +22,12 @@
 class DeprecatedLint extends LintRule {
   DeprecatedLint()
       : super(
-            name: 'deprecated_lint',
-            group: Group.style,
-            maturity: Maturity.deprecated);
+          name: 'deprecated_lint',
+          group: Group.style,
+          maturity: Maturity.deprecated,
+          description: '',
+          details: '',
+        );
 }
 
 @reflectiveTest
@@ -41,7 +44,7 @@
       StringSource(content, 'analysis_options.yaml'),
       isNonNullableByDefault: false,
     );
-    validator.validate(reporter, loadYamlNode(content));
+    validator.validate(reporter, loadYamlNode(content) as YamlMap);
     listener.assertErrorsWithCodes(expectedErrorCodes);
   }
 
@@ -89,13 +92,25 @@
 }
 
 class RuleNeg extends LintRule {
-  RuleNeg() : super(name: 'rule_neg', group: Group.style);
+  RuleNeg()
+      : super(
+          name: 'rule_neg',
+          group: Group.style,
+          description: '',
+          details: '',
+        );
   @override
   List<String> get incompatibleRules => ['rule_pos'];
 }
 
 class RulePos extends LintRule {
-  RulePos() : super(name: 'rule_pos', group: Group.style);
+  RulePos()
+      : super(
+          name: 'rule_pos',
+          group: Group.style,
+          description: '',
+          details: '',
+        );
   @override
   List<String> get incompatibleRules => ['rule_neg'];
 }
@@ -103,5 +118,10 @@
 class StableLint extends LintRule {
   StableLint()
       : super(
-            name: 'stable_lint', group: Group.style, maturity: Maturity.stable);
+          name: 'stable_lint',
+          group: Group.style,
+          maturity: Maturity.stable,
+          description: '',
+          details: '',
+        );
 }
diff --git a/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart b/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart
index e815d5e..7e2437f 100644
--- a/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart
+++ b/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart
@@ -21,7 +21,7 @@
 
 @reflectiveTest
 class PubspecValidatorTest with ResourceProviderMixin {
-  PubspecValidator validator;
+  late final PubspecValidator validator;
 
   /// Assert that when the validator is used on the given [content] the
   /// [expectedErrorCodes] are produced.
@@ -31,7 +31,7 @@
       // The file is empty.
       node = YamlMap();
     }
-    List<AnalysisError> errors = validator.validate((node as YamlMap).nodes);
+    List<AnalysisError> errors = validator.validate(node.nodes);
     GatheringErrorListener listener = GatheringErrorListener();
     listener.addAll(errors);
     listener.assertErrorsWithCodes(expectedErrorCodes);
diff --git a/pkg/analyzer/test/src/services/available_declarations_test.dart b/pkg/analyzer/test/src/services/available_declarations_test.dart
index 0b22124..752bf6d 100644
--- a/pkg/analyzer/test/src/services/available_declarations_test.dart
+++ b/pkg/analyzer/test/src/services/available_declarations_test.dart
@@ -7,12 +7,10 @@
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart';
 import 'package:analyzer/src/dart/analysis/byte_store.dart';
-import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart';
 import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/services/available_declarations.dart';
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
-import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -30,9 +28,9 @@
 class AbstractContextTest with ResourceProviderMixin {
   final byteStore = MemoryByteStore();
 
-  AnalysisContextCollection analysisContextCollection;
+  late AnalysisContextCollection analysisContextCollection;
 
-  AnalysisContext testAnalysisContext;
+  late AnalysisContext testAnalysisContext;
 
   /// The file system specific `/home/test/analysis_options.yaml` path.
   String get analysisOptionsPath =>
@@ -78,7 +76,7 @@
   }
 
   /// Create an analysis options file based on the given arguments.
-  void createAnalysisOptionsFile({List<String> experiments}) {
+  void createAnalysisOptionsFile({List<String>? experiments}) {
     var buffer = StringBuffer();
     if (experiments != null) {
       buffer.writeln('analyzer:');
@@ -89,9 +87,7 @@
     }
     newFile(analysisOptionsPath, content: buffer.toString());
 
-    if (analysisContextCollection != null) {
-      createAnalysisContexts();
-    }
+    createAnalysisContexts();
   }
 
   /// Return the existing analysis context that should be used to analyze the
@@ -195,8 +191,8 @@
 
     await _doAllTrackerWork();
 
-    var id = uriToLibrary['package:test/test.dart'].id;
-    var library = tracker.getLibrary(id);
+    var id = uriToLibrary['package:test/test.dart']!.id;
+    var library = tracker.getLibrary(id)!;
     expect(library.id, id);
     expect(library.uriStr, 'package:test/test.dart');
   }
@@ -210,8 +206,8 @@
 
     await _doAllTrackerWork();
 
-    var id = uriToLibrary['package:test/a.dart'].id;
-    var library = tracker.getLibrary(id);
+    var id = uriToLibrary['package:test/a.dart']!.id;
+    var library = tracker.getLibrary(id)!;
     expect(library.id, id);
   }
 
@@ -229,8 +225,8 @@
 
     await _doAllTrackerWork();
 
-    var id = uriToLibrary['package:test/a.dart'].id;
-    var library = tracker.getLibrary(id);
+    var id = uriToLibrary['package:test/a.dart']!.id;
+    var library = tracker.getLibrary(id)!;
     expect(library.id, id);
   }
 
@@ -1172,14 +1168,13 @@
 
     createAnalysisContexts();
 
-    DriverBasedAnalysisContext context =
-        analysisContextCollection.contextFor(file.path);
+    var context = analysisContextCollection.contextFor(file.path);
 
     tracker.addContext(context);
     await _doAllTrackerWork();
 
-    String result =
-        tracker.getContext(context).dartdocDirectiveInfo.processDartdoc('''
+    var declarationsContext = tracker.getContext(context)!;
+    var result = declarationsContext.dartdocDirectiveInfo.processDartdoc('''
 /// Before macro.
 /// {@macro foo}
 /// After macro.''');
@@ -2294,9 +2289,9 @@
 
     await _doAllTrackerWork();
 
-    expect(uriToLibrary['package:test/a.dart'].isDeprecated, isFalse);
-    expect(uriToLibrary['package:test/b.dart'].isDeprecated, isTrue);
-    expect(uriToLibrary['package:test/c.dart'].isDeprecated, isTrue);
+    expect(uriToLibrary['package:test/a.dart']!.isDeprecated, isFalse);
+    expect(uriToLibrary['package:test/b.dart']!.isDeprecated, isTrue);
+    expect(uriToLibrary['package:test/c.dart']!.isDeprecated, isTrue);
   }
 
   test_library_partDirective_empty() async {
@@ -3530,7 +3525,7 @@
   }
 
   static void _assertHasLibraries(List<Library> libraries,
-      {@required List<String> uriList, bool only = false}) {
+      {required List<String> uriList, bool only = false}) {
     var actualUriList = libraries.map((lib) => lib.uriStr).toList();
     if (only) {
       expect(actualUriList, unorderedEquals(uriList));
@@ -3548,7 +3543,7 @@
 }
 
 class _Base extends AbstractContextTest {
-  DeclarationsTracker tracker;
+  late DeclarationsTracker tracker;
 
   final List<LibraryChange> changes = [];
 
@@ -3565,26 +3560,26 @@
     Declaration declaration,
     String name,
     DeclarationKind kind, {
-    String defaultArgumentListString,
-    List<int> defaultArgumentListTextRanges,
-    String docComplete,
-    String docSummary,
+    String? defaultArgumentListString,
+    List<int>? defaultArgumentListTextRanges,
+    String? docComplete,
+    String? docSummary,
     bool isAbstract = false,
     bool isConst = false,
     bool isDeprecated = false,
     bool isFinal = false,
     bool isStatic = false,
-    int locationOffset,
-    String locationPath,
-    int locationStartColumn,
-    int locationStartLine,
-    String parameters,
-    List<String> parameterNames,
-    List<String> parameterTypes,
-    List<String> relevanceTags,
-    int requiredParameterCount,
-    String returnType,
-    String typeParameters,
+    int? locationOffset,
+    String? locationPath,
+    int? locationStartColumn,
+    int? locationStartLine,
+    String? parameters,
+    List<String>? parameterNames,
+    List<String>? parameterTypes,
+    List<String>? relevanceTags,
+    int? requiredParameterCount,
+    String? returnType,
+    String? typeParameters,
   }) {
     expect(declaration.defaultArgumentListString, defaultArgumentListString);
     expect(
@@ -3636,9 +3631,8 @@
   /// If [declarations] provided, also checks that the library has exactly
   /// these declarations.
   void _assertHasLibrary(String uri,
-      {List<_ExpectedDeclaration> declarations}) {
-    var library = uriToLibrary[uri];
-    expect(library, isNotNull);
+      {List<_ExpectedDeclaration>? declarations}) {
+    var library = uriToLibrary[uri]!;
     if (declarations != null) {
       expect(library.declarations, hasLength(declarations.length));
       for (var expected in declarations) {
@@ -3690,9 +3684,7 @@
   }
 
   Library _getLibrary(String uriStr) {
-    var library = uriToLibrary[uriStr];
-    expect(library, isNotNull);
-    return library;
+    return uriToLibrary[uriStr]!;
   }
 }
 
diff --git a/pkg/analyzer/test/src/source/source_resource_test.dart b/pkg/analyzer/test/src/source/source_resource_test.dart
index 5e6f3ec..0dc63d4 100644
--- a/pkg/analyzer/test/src/source/source_resource_test.dart
+++ b/pkg/analyzer/test/src/source/source_resource_test.dart
@@ -32,7 +32,7 @@
   void test_equals_false_null() {
     File file = getFile("/does/not/exist1.dart");
     FileSource source1 = FileSource(file);
-    expect(source1 == null, isFalse);
+    expect(source1, isNotNull);
   }
 
   void test_equals_true() {
@@ -87,12 +87,10 @@
     UriResolver resolver = DartUriResolver(sdk);
     SourceFactory factory = SourceFactory([resolver]);
     // resolve dart:core
-    Source result = resolver.resolveAbsolute(Uri.parse("dart:async"));
-    expect(result, isNotNull);
+    Source result = resolver.resolveAbsolute(Uri.parse("dart:async"))!;
     expect(result.isInSystemLibrary, isTrue);
     // system libraries reference only other system libraries
-    Source partSource = factory.resolveUri(result, "stream.dart");
-    expect(partSource, isNotNull);
+    Source partSource = factory.resolveUri(result, "stream.dart")!;
     expect(partSource.isInSystemLibrary, isTrue);
   }
 
diff --git a/pkg/analyzer/test/src/summary/element_text.dart b/pkg/analyzer/test/src/summary/element_text.dart
index b4af040..69609aa 100644
--- a/pkg/analyzer/test/src/summary/element_text.dart
+++ b/pkg/analyzer/test/src/summary/element_text.dart
@@ -12,33 +12,32 @@
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/task/inference_error.dart';
-import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 
 import 'resolved_ast_printer.dart';
 
 /// Set this path to automatically replace expectations in invocations of
 /// [checkElementText] with the new actual texts.
-const String _testPath = null;
+const String? _testPath = null;
 
 /// The list of replacements that update expectations.
 final List<_Replacement> _replacements = [];
 
 /// The cached content of the file with the [_testPath].
-String _testCode;
+String? _testCode;
 
 /// The cache line information for the [_testPath] file.
-LineInfo _testCodeLines;
+LineInfo? _testCodeLines;
 
 void applyCheckElementTextReplacements() {
   if (_testPath != null && _replacements.isNotEmpty) {
     _replacements.sort((a, b) => b.offset - a.offset);
-    String newCode = _testCode;
+    String newCode = _testCode!;
     _replacements.forEach((r) {
       newCode =
           newCode.substring(0, r.offset) + r.text + newCode.substring(r.end);
     });
-    File(_testPath).writeAsStringSync(newCode);
+    File(_testPath!).writeAsStringSync(newCode);
   }
 }
 
@@ -78,8 +77,8 @@
 
   if (_testPath != null && actualText != expected) {
     if (_testCode == null) {
-      _testCode = File(_testPath).readAsStringSync();
-      _testCodeLines = LineInfo.fromContent(_testCode);
+      _testCode = File(_testPath!).readAsStringSync();
+      _testCodeLines = LineInfo.fromContent(_testCode!);
     }
 
     try {
@@ -90,27 +89,28 @@
       // Assuming traceString contains "$_testPath:$invocationLine:$column",
       // figure out the value of invocationLine.
 
-      int testFilePathOffset = traceString.indexOf(_testPath);
+      int testFilePathOffset = traceString.indexOf(_testPath!);
       expect(testFilePathOffset, isNonNegative);
 
       // Sanity check: there must be ':' after the path.
-      expect(traceString[testFilePathOffset + _testPath.length], ':');
+      expect(traceString[testFilePathOffset + _testPath!.length], ':');
 
-      int lineOffset = testFilePathOffset + _testPath.length + ':'.length;
+      int lineOffset = testFilePathOffset + _testPath!.length + ':'.length;
       int invocationLine = int.parse(traceString.substring(
           lineOffset, traceString.indexOf(':', lineOffset)));
-      int invocationOffset = _testCodeLines.getOffsetOfLine(invocationLine - 1);
+      int invocationOffset =
+          _testCodeLines!.getOffsetOfLine(invocationLine - 1);
 
       const String rawStringPrefix = "r'''";
       int expectationOffset =
-          _testCode.indexOf(rawStringPrefix, invocationOffset);
+          _testCode!.indexOf(rawStringPrefix, invocationOffset);
 
       // Sanity check: there must be no other strings or blocks.
-      expect(_testCode.substring(invocationOffset, expectationOffset),
+      expect(_testCode!.substring(invocationOffset, expectationOffset),
           isNot(anyOf(contains("'"), contains('"'), contains('}'))));
 
       expectationOffset += rawStringPrefix.length;
-      int expectationEnd = _testCode.indexOf("'''", expectationOffset);
+      int expectationEnd = _testCode!.indexOf("'''", expectationOffset);
 
       _replacements.add(
           _Replacement(expectationOffset, expectationEnd, '\n' + actualText));
@@ -118,17 +118,17 @@
   }
 
   // Print the actual text to simplify copy/paste into the expectation.
-//  if (actualText != expected) {
-//    print('-------- Actual --------');
-//    print(actualText + '------------------------');
-//  }
+  // if (actualText != expected) {
+  //   print('-------- Actual --------');
+  //   print(actualText + '------------------------');
+  // }
 
   expect(actualText, expected);
 }
 
 /// Writes the canonical text presentation of elements.
 class _ElementWriter {
-  final String selfUriStr;
+  final String? selfUriStr;
   final bool withCodeRanges;
   final bool withExportScope;
   final bool withFullyResolvedAst;
@@ -144,7 +144,7 @@
 
   _ElementWriter({
     this.selfUriStr,
-    this.withCodeRanges,
+    this.withCodeRanges = false,
     this.withConstElements = true,
     this.withExportScope = false,
     this.withFullyResolvedAst = false,
@@ -152,13 +152,13 @@
     this.withSyntheticAccessors = false,
     this.withSyntheticFields = false,
     this.withTypes = false,
-    this.withTypeParameterVariance,
+    this.withTypeParameterVariance = false,
   });
 
   bool isDynamicType(DartType type) => type is DynamicTypeImpl;
 
   bool isEnumField(Element e) {
-    Element enclosing = e.enclosingElement;
+    var enclosing = e.enclosingElement;
     return enclosing is ClassElement && enclosing.isEnum;
   }
 
@@ -203,10 +203,10 @@
     writeCodeRange(e);
     writeTypeParameterElements(e.typeParameters, withDefault: true);
 
-    if (e.supertype != null && e.supertype.element.name != 'Object' ||
+    if (e.supertype != null && e.supertype!.element.name != 'Object' ||
         e.mixins.isNotEmpty) {
       buffer.write(' extends ');
-      writeType(e.supertype);
+      writeType(e.supertype!);
     }
 
     if (e.isMixin) {
@@ -287,7 +287,7 @@
     writeParameterElements(e.parameters);
 
     {
-      ConstructorElement redirected = e.redirectedConstructor;
+      var redirected = e.redirectedConstructor;
       if (redirected != null) {
         buffer.write(' = ');
         writeType(redirected.returnType);
@@ -302,7 +302,7 @@
     if (withFullyResolvedAst) {
       buffer.writeln(';');
       _withIndent(() {
-        if (initializers != null && initializers.isNotEmpty) {
+        if (initializers.isNotEmpty) {
           _writelnWithIndent('constantInitializers');
           _withIndent(() {
             for (var initializer in initializers) {
@@ -313,9 +313,7 @@
         _writeParameterElementDefaultValues(e.parameters);
       });
     } else {
-      if (initializers != null) {
-        writeList(' : ', '', initializers, ', ', writeNode);
-      }
+      writeList(' : ', '', initializers, ', ', writeNode);
       buffer.writeln(';');
     }
 
@@ -324,7 +322,7 @@
   }
 
   void writeDocumentation(Element e, [String prefix = '']) {
-    String comment = e.documentationComment;
+    var comment = e.documentationComment;
     if (comment != null) {
       if (comment.startsWith('///')) {
         comment = comment.split('\n').join('\n$prefix');
@@ -368,10 +366,8 @@
     writeName(e);
     writeCodeRange(e);
     writeTypeParameterElements(e.typeParameters, withDefault: false);
-    if (e.extendedType != null) {
-      buffer.write(' on ');
-      writeType(e.extendedType);
-    }
+    buffer.write(' on ');
+    writeType(e.extendedType);
 
     buffer.writeln(' {');
 
@@ -432,7 +428,7 @@
 
       if (e.prefix != null) {
         buffer.write(' as ');
-        writeName(e.prefix);
+        writeName(e.prefix!);
         if (withOffsets) {
           buffer.write('(${e.prefixOffset})');
         }
@@ -560,7 +556,7 @@
     }
   }
 
-  void writeNode(AstNode e, {Expression enclosing}) {
+  void writeNode(AstNode? e, {Expression? enclosing}) {
     bool needsParenthesis = e is Expression &&
         enclosing != null &&
         e.precedence < enclosing.precedence;
@@ -582,10 +578,10 @@
       writeNode(e.name);
       if (e.constructorName != null) {
         buffer.write('.');
-        writeNode(e.constructorName);
+        writeNode(e.constructorName!);
       }
       if (e.arguments != null) {
-        writeList('(', ')', e.arguments.arguments, ', ', writeNode,
+        writeList('(', ')', e.arguments!.arguments, ', ', writeNode,
             includeEmpty: true);
       }
     } else if (e is AsExpression) {
@@ -597,7 +593,7 @@
       writeNode(e.condition);
       if (e.message != null) {
         buffer.write(', ');
-        writeNode(e.message);
+        writeNode(e.message!);
       }
       buffer.write(')');
     } else if (e is BinaryExpression) {
@@ -622,24 +618,24 @@
       writeNode(e.type);
       if (e.name != null) {
         buffer.write('.');
-        writeNode(e.name);
+        writeNode(e.name!);
       }
     } else if (e is DoubleLiteral) {
       buffer.write(e.value);
     } else if (e is GenericFunctionType) {
       if (e.returnType != null) {
-        writeNode(e.returnType);
+        writeNode(e.returnType!);
         buffer.write(' ');
       }
       buffer.write('Function');
       if (e.typeParameters != null) {
-        writeList('<', '>', e.typeParameters.typeParameters, ', ', writeNode);
+        writeList('<', '>', e.typeParameters!.typeParameters, ', ', writeNode);
       }
       writeList('(', ')', e.parameters.parameters, ', ', writeNode,
           includeEmpty: true);
     } else if (e is InstanceCreationExpression) {
       if (e.keyword != null) {
-        buffer.write(e.keyword.lexeme);
+        buffer.write(e.keyword!.lexeme);
         buffer.write(' ');
       }
       if (withTypes && e.constructorName.type.typeArguments == null) {
@@ -665,7 +661,7 @@
         buffer.write('const ');
       }
       if (e.typeArguments != null) {
-        writeList('<', '>', e.typeArguments.arguments, ', ', writeNode);
+        writeList('<', '>', e.typeArguments!.arguments, ', ', writeNode);
       } else if (withTypes) {
         writeInterfaceTypeArgsComment(e);
       }
@@ -678,7 +674,7 @@
         buffer.write('const ');
       }
       if (e.typeArguments != null) {
-        writeList('<', '>', e.typeArguments.arguments, ', ', writeNode);
+        writeList('<', '>', e.typeArguments!.arguments, ', ', writeNode);
       } else if (withTypes) {
         writeInterfaceTypeArgsComment(e);
       }
@@ -700,7 +696,7 @@
       }
       writeNode(e.methodName);
       if (e.typeArguments != null) {
-        writeList('<', '>', e.typeArguments.arguments, ', ', writeNode);
+        writeList('<', '>', e.typeArguments!.arguments, ', ', writeNode);
       }
       writeList('(', ')', e.argumentList.arguments, ', ', writeNode,
           includeEmpty: true);
@@ -734,7 +730,7 @@
       writeNode(e.type);
       if (e.identifier != null) {
         buffer.write(' ');
-        buffer.write(e.identifier.name);
+        buffer.write(e.identifier!.name);
       }
     } else if (e is SimpleIdentifier) {
       if (withConstElements) {
@@ -778,7 +774,7 @@
     } else if (e is TypeName) {
       writeNode(e.name);
       if (e.typeArguments != null) {
-        writeList('<', '>', e.typeArguments.arguments, ', ', writeNode);
+        writeList('<', '>', e.typeArguments!.arguments, ', ', writeNode);
       }
     } else if (e is SpreadElement) {
       buffer.write(e.spreadOperator.lexeme);
@@ -803,8 +799,8 @@
   }
 
   void writeParameterElement(ParameterElement e) {
-    String defaultValueSeparator;
-    Expression defaultValue;
+    String? defaultValueSeparator;
+    Expression? defaultValue;
     String closeString;
     if (e.isRequiredPositional) {
       closeString = '';
@@ -884,12 +880,12 @@
       if (e.isGetter) {
         expect(variable.getter, same(e));
         if (variable.setter != null) {
-          expect(variable.setter.variable, same(variable));
+          expect(variable.setter!.variable, same(variable));
         }
       } else {
         expect(variable.setter, same(e));
         if (variable.getter != null) {
-          expect(variable.getter.variable, same(variable));
+          expect(variable.getter!.variable, same(variable));
         }
       }
     }
@@ -947,10 +943,10 @@
 
     if (!e.isSynthetic) {
       expect(e.getter, isNotNull);
-      _assertSyntheticAccessorEnclosing(e, e.getter);
+      _assertSyntheticAccessorEnclosing(e, e.getter!);
 
       if (e.setter != null) {
-        _assertSyntheticAccessorEnclosing(e, e.setter);
+        _assertSyntheticAccessorEnclosing(e, e.setter!);
       }
     }
 
@@ -998,8 +994,7 @@
       });
     } else {
       if (e is ConstVariableElement) {
-        Expression initializer =
-            (e as ConstVariableElement).constantInitializer;
+        var initializer = (e as ConstVariableElement).constantInitializer;
         if (initializer != null) {
           buffer.write(' = ');
           writeNode(initializer);
@@ -1050,7 +1045,7 @@
   }
 
   void writeTypeInferenceError(Element e) {
-    TopLevelInferenceError inferenceError;
+    TopLevelInferenceError? inferenceError;
     if (e is MethodElementImpl) {
       inferenceError = e.typeInferenceError;
     } else if (e is PropertyInducingElementImpl) {
@@ -1068,7 +1063,7 @@
 
   void writeTypeParameterElement(
     TypeParameterElement e, {
-    @required bool withDefault,
+    required bool withDefault,
   }) {
     var impl = e as TypeParameterElementImpl;
 
@@ -1083,13 +1078,13 @@
 
     writeName(e);
     writeCodeRange(e);
-    if (e.bound != null && !e.bound.isDartCoreObject) {
+    if (e.bound != null && !e.bound!.isDartCoreObject) {
       buffer.write(' extends ');
-      writeType(e.bound);
+      writeType(e.bound!);
     }
 
     if (withDefault) {
-      var defaultType = impl.defaultType;
+      var defaultType = impl.defaultType!;
       if (defaultType is! DynamicTypeImpl) {
         buffer.write(' = ');
         writeType(defaultType);
@@ -1099,10 +1094,10 @@
 
   void writeTypeParameterElements(
     List<TypeParameterElement> elements, {
-    @required bool withDefault,
+    required bool withDefault,
   }) {
     if (!withFullyResolvedAst) {
-      writeList('<', '>', elements, ', ', (e) {
+      writeList<TypeParameterElement>('<', '>', elements, ', ', (e) {
         writeTypeParameterElement(e, withDefault: withDefault);
       });
     }
@@ -1111,7 +1106,7 @@
   void writeUnitElement(CompilationUnitElement e) {
     if (e.library.definingCompilationUnit != e) {
       buffer.writeln('-' * 20);
-      buffer.writeln('unit: ${e.source?.shortName}');
+      buffer.writeln('unit: ${e.source.shortName}');
       buffer.writeln();
     }
     e.typeAliases.forEach(writeTypeAliasElement);
@@ -1124,7 +1119,7 @@
     e.functions.forEach(writeFunctionElement);
   }
 
-  void writeUri(Source source) {
+  void writeUri(Source? source) {
     if (source != null) {
       Uri uri = source.uri;
       String uriStr = uri.toString();
@@ -1154,7 +1149,7 @@
     }
   }
 
-  String _getElementLocationString(Element element) {
+  String _getElementLocationString(Element? element) {
     if (element == null) {
       return 'null';
     }
@@ -1166,7 +1161,7 @@
       return uri;
     }
 
-    ElementLocation location = element.location;
+    var location = element.location!;
     List<String> components = location.components.toList();
     if (components.isNotEmpty) {
       components[0] = onlyName(components[0]);
@@ -1180,7 +1175,7 @@
     return components.join(';');
   }
 
-  String _typeStr(DartType type) {
+  String? _typeStr(DartType? type) {
     return type?.getDisplayString(
       withNullability: true,
     );
@@ -1193,7 +1188,7 @@
     this.indent = indent;
   }
 
-  void _writelnTypeWithIndent(String name, DartType type) {
+  void _writelnTypeWithIndent(String name, DartType? type) {
     buffer.write(indent);
     buffer.write('$name: ');
     buffer.writeln(_typeStr(type));
@@ -1232,7 +1227,8 @@
     if (metadata.isNotEmpty) {
       _writelnWithIndent('metadata');
       _withIndent(() {
-        for (ElementAnnotationImpl annotation in metadata) {
+        for (var annotation in metadata) {
+          annotation as ElementAnnotationImpl;
           _writeResolvedNode(annotation.annotationAst);
         }
       });
@@ -1255,7 +1251,8 @@
     if (elements.isNotEmpty) {
       _writelnWithIndent('typeParameters');
       _withIndent(() {
-        for (TypeParameterElementImpl e in elements) {
+        for (var e in elements) {
+          e as TypeParameterElementImpl;
           _writelnWithIndent(e.name);
           _withIndent(() {
             _writelnTypeWithIndent('bound', e.bound);
diff --git a/pkg/analyzer/test/src/summary/flat_buffers_test.dart b/pkg/analyzer/test/src/summary/flat_buffers_test.dart
index c822a77..adb1fd5 100644
--- a/pkg/analyzer/test/src/summary/flat_buffers_test.dart
+++ b/pkg/analyzer/test/src/summary/flat_buffers_test.dart
@@ -164,8 +164,10 @@
     // read and verify
     BufferContext buf = BufferContext.fromBytes(byteList);
     int objectOffset = buf.derefObject(0);
-    expect(const StringReader().vTableGet(buf, objectOffset, 0), latinString);
-    expect(const StringReader().vTableGet(buf, objectOffset, 1), unicodeString);
+    expect(const StringReader().vTableGetOrNull(buf, objectOffset, 0),
+        latinString);
+    expect(const StringReader().vTableGetOrNull(buf, objectOffset, 1),
+        unicodeString);
   }
 
   void test_table_types() {
@@ -188,14 +190,15 @@
     // read and verify
     BufferContext buf = BufferContext.fromBytes(byteList);
     int objectOffset = buf.derefObject(0);
-    expect(const BoolReader().vTableGet(buf, objectOffset, 0), true);
-    expect(const Int8Reader().vTableGet(buf, objectOffset, 1), 10);
-    expect(const Int32Reader().vTableGet(buf, objectOffset, 2), 20);
-    expect(const StringReader().vTableGet(buf, objectOffset, 3), '12345');
-    expect(const Int32Reader().vTableGet(buf, objectOffset, 4), 40);
-    expect(const Uint32Reader().vTableGet(buf, objectOffset, 5), 0x9ABCDEF0);
-    expect(const Uint8Reader().vTableGet(buf, objectOffset, 6), 0x9A);
-    expect(const Float64Reader().vTableGet(buf, objectOffset, 7), -12.34);
+    expect(const BoolReader().vTableGetOrNull(buf, objectOffset, 0), true);
+    expect(const Int8Reader().vTableGetOrNull(buf, objectOffset, 1), 10);
+    expect(const Int32Reader().vTableGetOrNull(buf, objectOffset, 2), 20);
+    expect(const StringReader().vTableGetOrNull(buf, objectOffset, 3), '12345');
+    expect(const Int32Reader().vTableGetOrNull(buf, objectOffset, 4), 40);
+    expect(
+        const Uint32Reader().vTableGetOrNull(buf, objectOffset, 5), 0x9ABCDEF0);
+    expect(const Uint8Reader().vTableGetOrNull(buf, objectOffset, 6), 0x9A);
+    expect(const Float64Reader().vTableGetOrNull(buf, objectOffset, 7), -12.34);
   }
 
   void test_writeList_of_Uint32() {
@@ -352,7 +355,7 @@
     // read and verify
     BufferContext buf = BufferContext.fromBytes(byteList);
     StringListWrapperImpl reader = StringListWrapperReader().read(buf, 0);
-    List<String> items = reader.items;
+    List<String> items = reader.items!;
     expect(items, hasLength(2));
     expect(items, contains('12345'));
     expect(items, contains('ABC'));
@@ -393,8 +396,8 @@
 
   StringListWrapperImpl(this.bp, this.offset);
 
-  List<String> get items =>
-      const ListReader<String>(StringReader()).vTableGet(bp, offset, 0);
+  List<String>? get items =>
+      const ListReader<String>(StringReader()).vTableGetOrNull(bp, offset, 0);
 }
 
 class StringListWrapperReader extends TableReader<StringListWrapperImpl> {
diff --git a/pkg/analyzer/test/src/summary/in_summary_source_test.dart b/pkg/analyzer/test/src/summary/in_summary_source_test.dart
index 240fa1c..570ebce 100644
--- a/pkg/analyzer/test/src/summary/in_summary_source_test.dart
+++ b/pkg/analyzer/test/src/summary/in_summary_source_test.dart
@@ -27,15 +27,17 @@
           }))
     ]);
 
-    InSummarySource source = sourceFactory.forUri('package:foo/foo.dart');
+    var source =
+        sourceFactory.forUri('package:foo/foo.dart') as InSummarySource;
     expect(source, isNotNull);
     expect(source.summaryPath, 'foo.sum');
 
-    source = sourceFactory.forUri('package:foo/src/foo_impl.dart');
+    source = sourceFactory.forUri('package:foo/src/foo_impl.dart')
+        as InSummarySource;
     expect(source, isNotNull);
     expect(source.summaryPath, 'foo.sum');
 
-    source = sourceFactory.forUri('package:bar/baz.dart');
+    source = sourceFactory.forUri('package:bar/baz.dart') as InSummarySource;
     expect(source, isNotNull);
     expect(source.summaryPath, 'bar.sum');
   }
diff --git a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
index b8eaf24..3b4f286 100644
--- a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
+++ b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
@@ -12,7 +12,6 @@
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/summary2/reference.dart';
-import 'package:meta/meta.dart';
 
 /// Used in [ResolvedAstPrinter] to print lines of code that corresponding
 /// to a subtree of AST. This help to make the bulky presentation of AST a
@@ -26,13 +25,13 @@
 /// Prints AST as a tree, with properties and children.
 class ResolvedAstPrinter extends ThrowingAstVisitor<void> {
   /// The URI of the library that contains the AST being printed.
-  final String _selfUriStr;
+  final String? _selfUriStr;
 
   /// The target sink to print AST.
   final StringSink _sink;
 
   /// The optional provider for code lines, might be `null`.
-  final CodeLinesProvider _codeLinesProvider;
+  final CodeLinesProvider? _codeLinesProvider;
 
   /// If `true`, types should be printed with nullability suffixes.
   final bool _withNullability;
@@ -40,10 +39,10 @@
   String _indent = '';
 
   ResolvedAstPrinter({
-    @required String selfUriStr,
-    @required StringSink sink,
-    @required String indent,
-    CodeLinesProvider codeLinesProvider,
+    required String? selfUriStr,
+    required StringSink sink,
+    required String indent,
+    CodeLinesProvider? codeLinesProvider,
     bool withNullability = false,
   })  : _selfUriStr = selfUriStr,
         _sink = sink,
@@ -613,7 +612,7 @@
     _writeln('FunctionDeclaration');
     _withIndent(() {
       var properties = _Properties();
-      properties.addType('declaredElementType', node.declaredElement.type);
+      properties.addType('declaredElementType', node.declaredElement!.type);
       properties.addToken('externalKeyword', node.externalKeyword);
       properties.addNode('functionExpression', node.functionExpression);
       properties.addToken('propertyKeyword', node.propertyKeyword);
@@ -916,7 +915,7 @@
     _withIndent(() {
       var properties = _Properties();
       properties.addNode('body', node.body);
-      properties.addType('declaredElementType', node.declaredElement.type);
+      properties.addType('declaredElementType', node.declaredElement!.type);
       properties.addToken('externalKeyword', node.externalKeyword);
       properties.addToken('modifierKeyword', node.modifierKeyword);
       properties.addNode('name', node.name);
@@ -1339,8 +1338,7 @@
       // TODO (kallentu) : Clean up TypeParameterImpl casting once variance is
       // added to the interface.
       if ((node as TypeParameterImpl).varianceKeyword != null) {
-        properties.addToken(
-            'variance', (node as TypeParameterImpl).varianceKeyword);
+        properties.addToken('variance', node.varianceKeyword);
       }
       properties.addNode('bound', node.bound);
       properties.addNode('name', node.name);
@@ -1524,7 +1522,7 @@
   void _addFormalParameter(_Properties properties, FormalParameter node) {
     properties.addToken('covariantKeyword', node.covariantKeyword);
     properties.addElement('declaredElement', node.declaredElement);
-    properties.addType('declaredElementType', node.declaredElement.type);
+    properties.addType('declaredElementType', node.declaredElement!.type);
     properties.addNode('identifier', node.identifier);
     properties.addNodeList('metadata', node.metadata);
     properties.addToken('requiredKeyword', node.requiredKeyword);
@@ -1565,7 +1563,7 @@
     properties.addNode('argumentList', node.argumentList);
     properties.addType('staticInvokeType', node.staticInvokeType);
     properties.addNode('typeArguments', node.typeArguments);
-    properties.addTypeList('typeArgumentTypes', node.typeArgumentTypes);
+    properties.addTypeList('typeArgumentTypes', node.typeArgumentTypes!);
     _addExpression(properties, node);
   }
 
@@ -1659,7 +1657,8 @@
   }
 
   String _referenceToString(Reference reference) {
-    if (reference.parent.parent == null) {
+    var parent = reference.parent!;
+    if (parent.parent == null) {
       var libraryUriStr = reference.name;
       if (libraryUriStr == _selfUriStr) {
         return 'self';
@@ -1668,15 +1667,15 @@
     }
 
     // Ignore the unit, skip to the library.
-    if (reference.parent.name == '@unit') {
-      return _referenceToString(reference.parent.parent);
+    if (parent.name == '@unit') {
+      return _referenceToString(parent.parent!);
     }
 
     var name = reference.name;
     if (name.isEmpty) {
       name = '•';
     }
-    return _referenceToString(reference.parent) + '::$name';
+    return _referenceToString(parent) + '::$name';
   }
 
   String _substitutionMapStr(Map<TypeParameterElement, DartType> map) {
@@ -1686,7 +1685,7 @@
     return '{$entriesStr}';
   }
 
-  String _typeStr(DartType type) {
+  String? _typeStr(DartType? type) {
     return type?.getDisplayString(withNullability: _withNullability);
   }
 
@@ -1697,13 +1696,13 @@
     _indent = indent;
   }
 
-  void _writeElement(String name, Element element) {
+  void _writeElement(String name, Element? element) {
     _sink.write(_indent);
     _sink.write('$name: ');
     _writeElement0(element);
   }
 
-  void _writeElement0(Element element) {
+  void _writeElement0(Element? element) {
     if (element == null) {
       _sink.writeln('<null>');
       return;
@@ -1744,7 +1743,7 @@
     }
   }
 
-  void _writeNode(String name, AstNode node) {
+  void _writeNode(String name, AstNode? node) {
     if (node != null) {
       _sink.write(_indent);
       _sink.write('$name: ');
@@ -1772,7 +1771,7 @@
     }
   }
 
-  void _writeSource(String name, Source source) {
+  void _writeSource(String name, Source? source) {
     if (source != null) {
       _writelnWithIndent('$name: ${source.uri}');
     } else {
@@ -1780,14 +1779,14 @@
     }
   }
 
-  void _writeToken(String name, Token token) {
+  void _writeToken(String name, Token? token) {
     if (token != null) {
       _sink.write(_indent);
       _sink.writeln('$name: $token');
     }
   }
 
-  void _writeType(String name, DartType type) {
+  void _writeType(String name, DartType? type) {
     var typeStr = _typeStr(type);
     _writelnWithIndent('$name: $typeStr');
   }
@@ -1810,7 +1809,7 @@
 }
 
 class _ElementProperty extends _Property {
-  final Element element;
+  final Element? element;
 
   _ElementProperty(String name, this.element) : super(name);
 
@@ -1832,7 +1831,7 @@
 }
 
 class _NodeProperty extends _Property {
-  final AstNode node;
+  final AstNode? node;
 
   _NodeProperty(String name, this.node) : super(name);
 
@@ -1845,13 +1844,13 @@
 class _Properties {
   final properties = <_Property>[];
 
-  void addElement(String name, Element element) {
+  void addElement(String name, Element? element) {
     properties.add(
       _ElementProperty(name, element),
     );
   }
 
-  void addNode(String name, AstNode node) {
+  void addNode(String name, AstNode? node) {
     properties.add(
       _NodeProperty(name, node),
     );
@@ -1863,25 +1862,25 @@
     );
   }
 
-  void addRaw(String name, Object value) {
+  void addRaw(String name, Object? value) {
     properties.add(
       _RawProperty(name, value),
     );
   }
 
-  void addSource(String name, Source source) {
+  void addSource(String name, Source? source) {
     properties.add(
       _SourceProperty(name, source),
     );
   }
 
-  void addToken(String name, Token token) {
+  void addToken(String name, Token? token) {
     properties.add(
       _TokenProperty(name, token),
     );
   }
 
-  void addType(String name, DartType type) {
+  void addType(String name, DartType? type) {
     properties.add(
       _TypeProperty(name, type),
     );
@@ -1903,7 +1902,7 @@
 }
 
 class _RawProperty extends _Property {
-  final Object value;
+  final Object? value;
 
   _RawProperty(String name, this.value) : super(name);
 
@@ -1914,7 +1913,7 @@
 }
 
 class _SourceProperty extends _Property {
-  final Source source;
+  final Source? source;
 
   _SourceProperty(String name, this.source) : super(name);
 
@@ -1925,7 +1924,7 @@
 }
 
 class _TokenProperty extends _Property {
-  final Token token;
+  final Token? token;
 
   _TokenProperty(String name, this.token) : super(name);
 
@@ -1947,7 +1946,7 @@
 }
 
 class _TypeProperty extends _Property {
-  final DartType type;
+  final DartType? type;
 
   _TypeProperty(String name, this.type) : super(name);
 
diff --git a/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart b/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
index 1627018..7dd1655 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
@@ -18,7 +18,6 @@
 import 'package:analyzer/src/summary2/link.dart';
 import 'package:analyzer/src/summary2/linked_element_factory.dart';
 import 'package:analyzer/src/summary2/reference.dart';
-import 'package:meta/meta.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'resynthesize_common.dart';
@@ -34,17 +33,17 @@
 class ResynthesizeAst2Test extends AbstractResynthesizeTest
     with ResynthesizeTestCases {
   /// The shared SDK bundle, computed once and shared among test invocations.
-  static _SdkBundle _sdkBundle;
+  static _SdkBundle? _sdkBundle;
 
   _SdkBundle get sdkBundle {
     if (_sdkBundle != null) {
-      return _sdkBundle;
+      return _sdkBundle!;
     }
 
     var featureSet = FeatureSet.latestLanguageVersion();
     var inputLibraries = <LinkInputLibrary>[];
     for (var sdkLibrary in sdk.sdkLibraries) {
-      var source = sourceFactory.resolveUri(null, sdkLibrary.shortName);
+      var source = sourceFactory.resolveUri(null, sdkLibrary.shortName)!;
       var text = getFile(source.fullName).readAsStringSync();
       var unit = parseText(text, featureSet);
 
@@ -118,7 +117,7 @@
       ),
     );
 
-    return elementFactory.libraryOfUri('${source.uri}');
+    return elementFactory.libraryOfUri('${source.uri}')!;
   }
 
   void setUp() {
@@ -149,11 +148,6 @@
           units.add(
             LinkInputUnit(relativeUriStr, partSource, false, unit),
           );
-        } else {
-          var unit = parseText('', featureSet);
-          units.add(
-            LinkInputUnit(relativeUriStr, partSource, false, unit),
-          );
         }
       }
     }
@@ -162,7 +156,7 @@
   void _addNonDartLibraries(
     Set<Source> addedLibraries,
     List<LinkInputLibrary> libraries,
-    Source source,
+    Source? source,
   ) {
     if (source == null ||
         source.uri.isScheme('dart') ||
@@ -221,7 +215,7 @@
   final Uint8List resolutionBytes;
 
   _SdkBundle({
-    @required this.astBytes,
-    @required this.resolutionBytes,
+    required this.astBytes,
+    required this.resolutionBytes,
   });
 }
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index d690b6c..2ed4e8f 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -24,14 +24,14 @@
 /// The return type separator: →
 abstract class AbstractResynthesizeTest with ResourceProviderMixin {
   /// The set of features enabled in this test.
-  FeatureSet featureSet;
+  late FeatureSet featureSet;
 
   DeclaredVariables declaredVariables = DeclaredVariables();
-  /*late final*/ SourceFactory sourceFactory;
-  /*late final*/ MockSdk sdk;
+  late final SourceFactory sourceFactory;
+  late final MockSdk sdk;
 
-  /*late final*/ String testFile;
-  Source testSource;
+  late String testFile;
+  late Source testSource;
   Set<Source> otherLibrarySources = <Source>{};
 
   AbstractResynthesizeTest() {
@@ -48,7 +48,7 @@
   }
 
   void addLibrary(String uri) {
-    var source = sourceFactory.forUri(uri);
+    var source = sourceFactory.forUri(uri)!;
     otherLibrarySources.add(source);
   }
 
@@ -64,7 +64,7 @@
     return source;
   }
 
-  Source addTestSource(String code, [Uri uri]) {
+  Source addTestSource(String code, [Uri? uri]) {
     testSource = addSource(testFile, code);
     return testSource;
   }
@@ -2924,18 +2924,18 @@
         C/*location: test.dart;C*/.
         named/*location: test.dart;C;named*/(0);
 ''');
-    TopLevelVariableElementImpl x =
-        library.definingCompilationUnit.topLevelVariables[0];
-    InstanceCreationExpression xExpr = x.constantInitializer;
-    var xType = xExpr.constructorName.staticElement.returnType;
+    var x = library.definingCompilationUnit.topLevelVariables[0]
+        as TopLevelVariableElementImpl;
+    var xExpr = x.constantInitializer as InstanceCreationExpression;
+    var xType = xExpr.constructorName.staticElement!.returnType;
     _assertTypeStr(
       xType,
       'C<int>',
     );
-    TopLevelVariableElementImpl y =
-        library.definingCompilationUnit.topLevelVariables[0];
-    InstanceCreationExpression yExpr = y.constantInitializer;
-    var yType = yExpr.constructorName.staticElement.returnType;
+    var y = library.definingCompilationUnit.topLevelVariables[0]
+        as TopLevelVariableElementImpl;
+    var yExpr = y.constantInitializer as InstanceCreationExpression;
+    var yType = yExpr.constructorName.staticElement!.returnType;
     _assertTypeStr(yType, 'C<int>');
   }
 
@@ -3066,6 +3066,7 @@
 ''');
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44522')
   test_const_invalid_intLiteral() async {
     var library = await checkLibrary(r'''
 const int x = 0x;
@@ -3684,6 +3685,7 @@
         withTypes: true);
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44522')
   test_const_map_if_else() async {
     var library = await checkLibrary('''
 const Object x = const <int, int>{if (true) 1: 2 else 3: 4];
@@ -4346,6 +4348,7 @@
         withTypes: true);
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44522')
   test_const_set_if_else() async {
     var library = await checkLibrary('''
 const Object x = const <int>{if (true) 1 else 2];
@@ -4525,6 +4528,7 @@
     ListLiteral
       elements
         PropertyAccess
+          operator: ?.
           propertyName: SimpleIdentifier
             staticElement: dart:core::@class::String::@getter::length
             staticType: int
@@ -5823,6 +5827,36 @@
         withFullyResolvedAst: true);
   }
 
+  test_defaultValue_methodMember_legacy() async {
+    featureSet = FeatureSets.beforeNullSafe;
+    var library = await checkLibrary('''
+void f([Comparator<T> compare = Comparable.compare]) {}
+''');
+    checkElementText(
+        library,
+        r'''
+void f([int* Function(dynamic, dynamic)* compare]) {}
+  compare
+    PrefixedIdentifier
+      identifier: SimpleIdentifier
+        staticElement: MethodMember
+          base: dart:core::@class::Comparable::@method::compare
+          substitution: {}
+        staticType: int* Function(Comparable<dynamic>*, Comparable<dynamic>*)*
+        token: compare
+      period: .
+      prefix: SimpleIdentifier
+        staticElement: dart:core::@class::Comparable
+        staticType: null
+        token: Comparable
+      staticElement: MethodMember
+        base: dart:core::@class::Comparable::@method::compare
+        substitution: {}
+      staticType: int* Function(Comparable<dynamic>*, Comparable<dynamic>*)*
+''',
+        withFullyResolvedAst: true);
+  }
+
   test_defaultValue_refersToExtension_method_inside() async {
     var library = await checkLibrary('''
 class A {}
@@ -6437,7 +6471,7 @@
   A: foo.dart;A
 ''',
         withExportScope: true);
-    expect(library.exports[0].exportedLibrary.source.shortName, 'foo.dart');
+    expect(library.exports[0].exportedLibrary!.source.shortName, 'foo.dart');
   }
 
   test_export_configurations_useFirst() async {
@@ -6463,7 +6497,7 @@
   A: foo_io.dart;A
 ''',
         withExportScope: true);
-    expect(library.exports[0].exportedLibrary.source.shortName, 'foo_io.dart');
+    expect(library.exports[0].exportedLibrary!.source.shortName, 'foo_io.dart');
   }
 
   test_export_configurations_useSecond() async {
@@ -6490,7 +6524,7 @@
 ''',
         withExportScope: true);
     ExportElement export = library.exports[0];
-    expect(export.exportedLibrary.source.shortName, 'foo_html.dart');
+    expect(export.exportedLibrary!.source.shortName, 'foo_html.dart');
   }
 
   test_export_function() async {
@@ -6693,7 +6727,7 @@
 class B extends A {
 }
 ''');
-    var typeA = library.definingCompilationUnit.getType('B').supertype;
+    var typeA = library.definingCompilationUnit.getType('B')!.supertype!;
     expect(typeA.element.source.shortName, 'foo.dart');
   }
 
@@ -6719,7 +6753,7 @@
 class B extends A {
 }
 ''');
-    var typeA = library.definingCompilationUnit.getType('B').supertype;
+    var typeA = library.definingCompilationUnit.getType('B')!.supertype!;
     expect(typeA.element.source.shortName, 'foo_io.dart');
   }
 
@@ -6745,7 +6779,7 @@
 class B extends A {
 }
 ''');
-    var typeA = library.definingCompilationUnit.getType('B').supertype;
+    var typeA = library.definingCompilationUnit.getType('B')!.supertype!;
     expect(typeA.element.source.shortName, 'foo_html.dart');
   }
 
@@ -7411,10 +7445,10 @@
     var type = unit.topLevelVariables[0].type as FunctionType;
 
     expect(type.aliasElement, same(unit.typeAliases[0]));
-    _assertTypeStrings(type.aliasArguments, ['int']);
+    _assertTypeStrings(type.aliasArguments!, ['int']);
 
     // TODO(scheglov) https://github.com/dart-lang/sdk/issues/44629
-    expect(type.element.enclosingElement, same(unit.typeAliases[0]));
+    expect(type.element!.enclosingElement, same(unit.typeAliases[0]));
     _assertTypeStrings(type.typeArguments, ['int']);
   }
 
@@ -7843,7 +7877,7 @@
 class B extends A {
 }
 ''');
-    var typeA = library.definingCompilationUnit.getType('B').supertype;
+    var typeA = library.definingCompilationUnit.getType('B')!.supertype!;
     expect(typeA.element.source.shortName, 'foo.dart');
   }
 
@@ -7867,7 +7901,7 @@
 class B extends A {
 }
 ''');
-    var typeA = library.definingCompilationUnit.getType('B').supertype;
+    var typeA = library.definingCompilationUnit.getType('B')!.supertype!;
     expect(typeA.element.source.shortName, 'foo_io.dart');
   }
 
@@ -7891,7 +7925,7 @@
 class B extends A {
 }
 ''');
-    var typeA = library.definingCompilationUnit.getType('B').supertype;
+    var typeA = library.definingCompilationUnit.getType('B')!.supertype!;
     expect(typeA.element.source.shortName, 'foo_io.dart');
   }
 
@@ -7915,7 +7949,7 @@
 class B extends A {
 }
 ''');
-    var typeA = library.definingCompilationUnit.getType('B').supertype;
+    var typeA = library.definingCompilationUnit.getType('B')!.supertype!;
     expect(typeA.element.source.shortName, 'foo_html.dart');
   }
 
@@ -7939,7 +7973,7 @@
 class B extends A {
 }
 ''');
-    var typeA = library.definingCompilationUnit.getType('B').supertype;
+    var typeA = library.definingCompilationUnit.getType('B')!.supertype!;
     expect(typeA.element.source.shortName, 'foo_html.dart');
   }
 
@@ -8025,8 +8059,8 @@
     addLibrarySource('/a.dart', 'library a; class C {}');
     var library = await checkLibrary('import "a.dart" as a; a.C c;');
 
-    expect(library.imports[0].prefix.nameOffset, 19);
-    expect(library.imports[0].prefix.nameLength, 1);
+    expect(library.imports[0].prefix!.nameOffset, 19);
+    expect(library.imports[0].prefix!.nameLength, 1);
 
     checkElementText(library, r'''
 import 'a.dart' as a;
@@ -8041,8 +8075,8 @@
 class D extends p.C {} // Prevent "unused import" warning
 ''');
     expect(library.imports, hasLength(2));
-    expect(library.imports[0].importedLibrary.location, library.location);
-    expect(library.imports[1].importedLibrary.isDartCore, true);
+    expect(library.imports[0].importedLibrary!.location, library.location);
+    expect(library.imports[1].importedLibrary!.isDartCore, true);
     checkElementText(library, r'''
 import 'test.dart' as p;
 class C {
@@ -8591,7 +8625,7 @@
     // This test should verify that we correctly record inferred types,
     // when the type is defined in a part of an SDK library. So, test that
     // the type is actually in a part.
-    Element streamElement = p.type.element;
+    Element streamElement = p.type.element!;
     if (streamElement is ClassElement) {
       expect(streamElement.source, isNot(streamElement.library.source));
     }
@@ -9200,18 +9234,10 @@
 export 'a2.dart';
 export '<unresolved>';
 export '<unresolved>';
-part '<unresolved>';
 part 'a3.dart';
-part '<unresolved>';
---------------------
-unit: null
-
 --------------------
 unit: a3.dart
 
---------------------
-unit: null
-
 ''');
   }
 
@@ -11305,10 +11331,6 @@
 ''');
     checkElementText(library, r'''
 library my.lib;
-part '<unresolved>';
---------------------
-unit: null
-
 ''');
   }
 
@@ -13311,7 +13333,7 @@
 
   test_unresolved_import() async {
     var library = await checkLibrary("import 'foo.dart';", allowErrors: true);
-    LibraryElement importedLibrary = library.imports[0].importedLibrary;
+    var importedLibrary = library.imports[0].importedLibrary!;
     expect(importedLibrary.loadLibraryFunction, isNotNull);
     expect(importedLibrary.publicNamespace, isNotNull);
     expect(importedLibrary.exportNamespace, isNotNull);
@@ -13462,14 +13484,14 @@
 
     // We intentionally don't check the text, because we want to test
     // requesting individual elements, not all accessors/variables at once.
-    var getter = _elementOfDefiningUnit(library, '@getter', 'x')
+    var getter = _elementOfDefiningUnit(library, ['@getter', 'x'])
         as PropertyAccessorElementImpl;
     var variable = getter.variable as TopLevelVariableElementImpl;
     expect(variable, isNotNull);
     expect(variable.isFinal, isTrue);
     expect(variable.getter, same(getter));
     expect('${variable.type}', 'int');
-    expect(variable, same(_elementOfDefiningUnit(library, '@field', 'x')));
+    expect(variable, same(_elementOfDefiningUnit(library, ['@field', 'x'])));
   }
 
   test_variable_implicit_type() async {
@@ -13729,16 +13751,13 @@
     expect(typeStringList, expected);
   }
 
-  Element _elementOfDefiningUnit(LibraryElementImpl library,
-      [String name1, String name2, String name3]) {
+  Element _elementOfDefiningUnit(
+      LibraryElementImpl library, List<String> names) {
     var unit = library.definingCompilationUnit as CompilationUnitElementImpl;
-    var reference = unit.reference;
+    var reference = unit.reference!;
+    names.forEach((name) => reference = reference.getChild(name));
 
-    [name1, name2, name3].takeWhile((e) => e != null).forEach((name) {
-      reference = reference.getChild(name);
-    });
-
-    var elementFactory = unit.linkedContext.elementFactory;
-    return elementFactory.elementOfReference(reference);
+    var elementFactory = unit.linkedContext!.elementFactory;
+    return elementFactory.elementOfReference(reference)!;
   }
 }
diff --git a/pkg/analyzer/test/src/summary/test_strategies.dart b/pkg/analyzer/test/src/summary/test_strategies.dart
index a503d24..5cd4d74 100644
--- a/pkg/analyzer/test/src/summary/test_strategies.dart
+++ b/pkg/analyzer/test/src/summary/test_strategies.dart
@@ -18,13 +18,13 @@
   String text,
   FeatureSet featureSet,
 ) {
-  featureSet ??= FeatureSet.forTesting(sdkVersion: '2.3.0');
   CharSequenceReader reader = CharSequenceReader(text);
-  Scanner scanner = Scanner(null, reader, AnalysisErrorListener.NULL_LISTENER)
-    ..configureFeatures(
-      featureSetForOverriding: featureSet,
-      featureSet: featureSet,
-    );
+  Scanner scanner =
+      Scanner(_SourceMock.instance, reader, AnalysisErrorListener.NULL_LISTENER)
+        ..configureFeatures(
+          featureSetForOverriding: featureSet,
+          featureSet: featureSet,
+        );
   Token token = scanner.tokenize();
   // Pass the feature set from the scanner to the parser
   // because the scanner may have detected a language version comment
@@ -45,3 +45,10 @@
 
   return unit;
 }
+
+class _SourceMock implements Source {
+  static final Source instance = _SourceMock();
+
+  @override
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
diff --git a/pkg/analyzer/test/src/summary/top_level_inference_test.dart b/pkg/analyzer/test/src/summary/top_level_inference_test.dart
index 9fbb5f4..9fbcbd1 100644
--- a/pkg/analyzer/test/src/summary/top_level_inference_test.dart
+++ b/pkg/analyzer/test/src/summary/top_level_inference_test.dart
@@ -2714,7 +2714,7 @@
 
     var path = convertPath(testFilePath);
     var analysisSession = contextFor(path).currentSession;
-    var result = await analysisSession.getUnitElement(path);
-    return result.element.library /*!*/;
+    var result = (await analysisSession.getUnitElement(path))!;
+    return result.element.library;
   }
 }
diff --git a/pkg/analyzer/test/src/task/options_test.dart b/pkg/analyzer/test/src/task/options_test.dart
index 73d9ac2..c855dc4 100644
--- a/pkg/analyzer/test/src/task/options_test.dart
+++ b/pkg/analyzer/test/src/task/options_test.dart
@@ -36,7 +36,7 @@
 
 @reflectiveTest
 class ContextConfigurationTest {
-  final AnalysisOptions analysisOptions = AnalysisOptionsImpl();
+  final AnalysisOptionsImpl analysisOptions = AnalysisOptionsImpl();
 
   final AnalysisOptionsProvider optionsProvider = AnalysisOptionsProvider();
 
@@ -400,10 +400,10 @@
 
 @reflectiveTest
 class OptionsProviderTest {
-  TestPathTranslator pathTranslator;
-  ResourceProvider resourceProvider;
+  late final TestPathTranslator pathTranslator;
+  late final ResourceProvider resourceProvider;
 
-  AnalysisOptionsProvider provider;
+  late final AnalysisOptionsProvider provider;
 
   String get optionsFilePath => '/analysis_options.yaml';
 
@@ -468,7 +468,7 @@
   }
 
   YamlMap _getOptions(String posixPath, {bool crawlUp = false}) {
-    Resource resource = pathTranslator.getResource(posixPath);
+    var resource = pathTranslator.getResource(posixPath) as Folder;
     return provider.getOptions(resource, crawlUp: crawlUp);
   }
 
@@ -481,7 +481,19 @@
 }
 
 class TestRule extends LintRule {
-  TestRule() : super(name: 'fantastic_test_rule', description: '');
+  TestRule()
+      : super(
+          name: 'fantastic_test_rule',
+          description: '',
+          details: '',
+          group: Group.style,
+        );
 
-  TestRule.withName(String name) : super(name: name, description: '');
+  TestRule.withName(String name)
+      : super(
+          name: name,
+          description: '',
+          details: '',
+          group: Group.style,
+        );
 }
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 c67500c..378090b 100644
--- a/pkg/analyzer/test/src/task/strong/dart2_inference_test.dart
+++ b/pkg/analyzer/test/src/task/strong/dart2_inference_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/error/codes.dart';
@@ -730,7 +729,7 @@
     await resolveTestCode(code);
     {
       var node = findNode.simple('w in');
-      VariableElement element = node.staticElement;
+      var element = node.staticElement as VariableElement;
       expect(node.staticType, isNull);
       expect(element.type, typeProvider.dynamicType);
 
@@ -740,14 +739,14 @@
 
     {
       var node = findNode.simple('x in');
-      VariableElement element = node.staticElement;
+      var element = node.staticElement as VariableElement;
       expect(node.staticType, isNull);
       expect(element.type, typeProvider.numType);
     }
 
     {
       var node = findNode.simple('y in');
-      VariableElement element = node.staticElement;
+      var element = node.staticElement as VariableElement;
 
       expect(node.staticType, isNull);
       expect(element.type, typeProvider.numType);
@@ -918,8 +917,8 @@
   }
 
   void _assertTypeAnnotations() {
-    var code = result.content;
-    var unit = result.unit;
+    var code = result.content!;
+    var unit = result.unit!;
 
     var types = <int, String>{};
     {
@@ -940,11 +939,11 @@
 
     unit.accept(FunctionAstVisitor(
       simpleIdentifier: (node) {
-        Token comment = node.token.precedingComments;
+        var comment = node.token.precedingComments;
         if (comment != null) {
-          String expectedType = types[comment.offset];
+          var expectedType = types[comment.offset];
           if (expectedType != null) {
-            VariableElement element = node.staticElement;
+            var element = node.staticElement as VariableElement;
             String actualType = typeString(element.type);
             expect(actualType, expectedType, reason: '@${comment.offset}');
           }
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 7e41586..f10a523 100644
--- a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
+++ b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
@@ -19,7 +19,7 @@
 @reflectiveTest
 class InferredTypeTest extends PubPackageResolutionTest {
   CompilationUnitElement get _resultUnitElement {
-    return result.unit.declaredElement;
+    return result.unit!.declaredElement!;
   }
 
   test_asyncClosureReturnType_flatten() async {
@@ -1688,7 +1688,11 @@
   }
 
   test_futureThen() async {
-    String build({String declared, String downwards, String upwards}) => '''
+    String build(
+            {required String declared,
+            required String downwards,
+            required String upwards}) =>
+        '''
 import 'dart:async';
 
 class MyFuture<T> implements Future<T> {
@@ -1729,7 +1733,11 @@
   }
 
   test_futureThen_conditional() async {
-    String build({String declared, String downwards, String upwards}) => '''
+    String build(
+            {required String declared,
+            required String downwards,
+            required String upwards}) =>
+        '''
 import 'dart:async';
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
@@ -1812,7 +1820,11 @@
 
   test_futureThen_upwards() async {
     // Regression test for https://github.com/dart-lang/sdk/issues/27088.
-    String build({String declared, String downwards, String upwards}) => '''
+    String build(
+            {required String declared,
+            required String downwards,
+            required String upwards}) =>
+        '''
 import 'dart:async';
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
@@ -1884,9 +1896,8 @@
 
   test_futureUnion_asyncConditional() async {
     String build(
-            {String declared,
-            String downwards,
-            String upwards,
+            {required String downwards,
+            required String upwards,
             String expectedInfo = ''}) =>
         '''
 import 'dart:async';
@@ -1920,9 +1931,9 @@
 
   test_futureUnion_downwards() async {
     String build(
-        {String declared,
-        String downwards,
-        String upwards,
+        {required String declared,
+        required String downwards,
+        required String upwards,
         String expectedError = ''}) {
       return '''
 import 'dart:async';
@@ -2213,7 +2224,7 @@
 }
 typedef void F<V>(V v);
 ''');
-    var f = _resultUnitElement.getType('C').methods[0];
+    var f = _resultUnitElement.getType('C')!.methods[0];
     _assertTypeStr(f.type, 'void Function(U) Function<U>(U)');
   }
 
@@ -2227,7 +2238,7 @@
 }
 typedef List<V> G<V>();
 ''');
-    var f = _resultUnitElement.getType('C').methods[0];
+    var f = _resultUnitElement.getType('C')!.methods[0];
     _assertTypeStr(f.type, 'void Function<U>(List<U> Function())');
   }
 
@@ -2241,7 +2252,7 @@
 }
 typedef V F<V>();
 ''');
-    var f = _resultUnitElement.getType('C').methods[0];
+    var f = _resultUnitElement.getType('C')!.methods[0];
     _assertTypeStr(f.type, 'U Function() Function<U>(U)');
   }
 
@@ -2955,7 +2966,7 @@
   int foo;
 }
 ''');
-    var f = _resultUnitElement.getType('C').accessors[0];
+    var f = _resultUnitElement.getType('C')!.accessors[0];
     _assertTypeStr(f.type, 'void Function(int)');
   }
 
@@ -2968,7 +2979,7 @@
   set foo(int x) {}
 }
 ''');
-    var f = _resultUnitElement.getType('C').accessors[0];
+    var f = _resultUnitElement.getType('C')!.accessors[0];
     _assertTypeStr(f.type, 'void Function(int)');
   }
 
@@ -2982,10 +2993,10 @@
   };
 }
 ''');
-    var x = _resultUnitElement.getType('C').fields[0];
+    var x = _resultUnitElement.getType('C')!.fields[0];
     expect(x.name, 'x');
     _assertTypeStr(x.type, 'String');
-    var y = _resultUnitElement.getType('C').fields[1];
+    var y = _resultUnitElement.getType('C')!.fields[1];
     expect(y.name, 'y');
     _assertTypeStr(y.type, 'Map<String, Map<String, String>>');
   }
@@ -3000,7 +3011,7 @@
     var x = _resultUnitElement.topLevelVariables[0];
     expect(x.name, 'x');
     _assertTypeStr(x.type, 'String');
-    var y = _resultUnitElement.getType('C').fields[0];
+    var y = _resultUnitElement.getType('C')!.fields[0];
     expect(y.name, 'y');
     _assertTypeStr(y.type, 'String');
   }
@@ -3288,7 +3299,7 @@
       (int i) => {i: b};
 }
 ''');
-    var f = _resultUnitElement.getType('C').fields[0];
+    var f = _resultUnitElement.getType('C')!.fields[0];
     _assertTypeStr(f.type, 'Map<int, bool> Function(int) Function(bool)');
   }
 
@@ -3298,7 +3309,7 @@
   static final f = (bool b) => b;
 }
 ''');
-    var f = _resultUnitElement.getType('C').fields[0];
+    var f = _resultUnitElement.getType('C')!.fields[0];
     _assertTypeStr(f.type, 'bool Function(bool)');
   }
 
@@ -3308,7 +3319,7 @@
   static final f = (bool b) => 1;
 }
 ''');
-    var f = _resultUnitElement.getType('C').fields[0];
+    var f = _resultUnitElement.getType('C')!.fields[0];
     _assertTypeStr(f.type, 'int Function(bool)');
   }
 
diff --git a/pkg/analyzer/test/src/util/yaml_test.dart b/pkg/analyzer/test/src/util/yaml_test.dart
index fec42e0..3877098 100644
--- a/pkg/analyzer/test/src/util/yaml_test.dart
+++ b/pkg/analyzer/test/src/util/yaml_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/src/util/yaml.dart';
+import 'package:source_span/source_span.dart';
 import 'package:test/test.dart';
 import 'package:yaml/src/event.dart';
 import 'package:yaml/yaml.dart';
@@ -102,8 +103,9 @@
 bool containsKey(Map<dynamic, YamlNode> map, dynamic key) =>
     _getValue(map, key) != null;
 
-void expectEquals(YamlNode actual, YamlNode expected) {
+void expectEquals(YamlNode? actual, YamlNode? expected) {
   if (expected is YamlScalar) {
+    actual!;
     expect(actual, TypeMatcher<YamlScalar>());
     expect(expected.value, actual.value);
   } else if (expected is YamlList) {
@@ -150,20 +152,23 @@
 
 YamlNode wrap(Object value) {
   if (value is List) {
-    List wrappedElements = value.map((e) => wrap(e)).toList();
-    return YamlList.internal(wrappedElements, null, CollectionStyle.BLOCK);
+    var wrappedElements = value.map((e) => wrap(e)).toList();
+    return YamlList.internal(
+        wrappedElements, _FileSpanMock.instance, CollectionStyle.BLOCK);
   } else if (value is Map) {
     Map<dynamic, YamlNode> wrappedEntries = <dynamic, YamlNode>{};
     value.forEach((k, v) {
       wrappedEntries[wrap(k)] = wrap(v);
     });
-    return YamlMap.internal(wrappedEntries, null, CollectionStyle.BLOCK);
+    return YamlMap.internal(
+        wrappedEntries, _FileSpanMock.instance, CollectionStyle.BLOCK);
   } else {
-    return YamlScalar.internal(value, ScalarEvent(null, '', ScalarStyle.PLAIN));
+    return YamlScalar.internal(
+        value, ScalarEvent(_FileSpanMock.instance, '', ScalarStyle.PLAIN));
   }
 }
 
-YamlNode _getValue(Map map, Object key) {
+YamlNode? _getValue(Map map, Object key) {
   Object keyValue = valueOf(key);
   for (var existingKey in map.keys) {
     if (valueOf(existingKey) == keyValue) {
@@ -172,3 +177,10 @@
   }
   return null;
 }
+
+class _FileSpanMock implements FileSpan {
+  static final FileSpan instance = _FileSpanMock();
+
+  @override
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
diff --git a/pkg/analyzer/test/src/workspace/basic_test.dart b/pkg/analyzer/test/src/workspace/basic_test.dart
index 2ed06b8..2d08778 100644
--- a/pkg/analyzer/test/src/workspace/basic_test.dart
+++ b/pkg/analyzer/test/src/workspace/basic_test.dart
@@ -34,7 +34,7 @@
   void test_contains_differentWorkspace() {
     newFile('/workspace2/project/lib/file.dart');
 
-    var package = findPackage('/workspace/project/lib/code.dart');
+    var package = findPackage('/workspace/project/lib/code.dart')!;
     expect(
         package.contains(
             TestSource(convertPath('/workspace2/project/lib/file.dart'))),
@@ -44,7 +44,7 @@
   void test_contains_sameWorkspace() {
     newFile('/workspace/project/lib/file2.dart');
 
-    var package = findPackage('/workspace/project/lib/code.dart');
+    var package = findPackage('/workspace/project/lib/code.dart')!;
     expect(
         package.contains(
             TestSource(convertPath('/workspace/project/lib/file2.dart'))),
@@ -62,7 +62,7 @@
   void test_findPackageFor_includedFile() {
     newFile('/workspace/project/lib/file.dart');
 
-    var package = findPackage('/workspace/project/lib/file.dart');
+    var package = findPackage('/workspace/project/lib/file.dart')!;
     expect(package, isNotNull);
     expect(package.root, convertPath('/workspace'));
     expect(package.workspace, equals(workspace));
@@ -77,7 +77,7 @@
 
   void test_packagesAvailableTo() {
     var libraryPath = convertPath('/workspace/lib/test.dart');
-    var package = findPackage(libraryPath);
+    var package = findPackage(libraryPath)!;
     var packageMap = package.packagesAvailableTo(libraryPath);
     expect(packageMap.keys, unorderedEquals(['p1', 'workspace']));
   }
diff --git a/pkg/analyzer/test/src/workspace/bazel_test.dart b/pkg/analyzer/test/src/workspace/bazel_test.dart
index 9d7cd6e..00f80db 100644
--- a/pkg/analyzer/test/src/workspace/bazel_test.dart
+++ b/pkg/analyzer/test/src/workspace/bazel_test.dart
@@ -9,7 +9,6 @@
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer/src/workspace/bazel.dart';
 import 'package:async/async.dart';
-import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:watcher/watcher.dart';
@@ -27,14 +26,14 @@
 
 @reflectiveTest
 class BazelFileUriResolverTest with ResourceProviderMixin {
-  BazelWorkspace workspace;
-  BazelFileUriResolver resolver;
+  late final BazelWorkspace workspace;
+  late final BazelFileUriResolver resolver;
 
   void setUp() {
     newFile('/workspace/WORKSPACE');
     newFolder('/workspace/bazel-genfiles');
     workspace =
-        BazelWorkspace.find(resourceProvider, convertPath('/workspace'));
+        BazelWorkspace.find(resourceProvider, convertPath('/workspace'))!;
     resolver = BazelFileUriResolver(workspace);
     newFile('/workspace/test.dart');
     newFile('/workspace/bazel-bin/gen1.dart');
@@ -43,63 +42,58 @@
   }
 
   void test_resolveAbsolute_doesNotExist() {
-    Source source = _resolvePath('/workspace/foo.dart');
-    expect(source, isNotNull);
+    var source = _resolvePath('/workspace/foo.dart')!;
     expect(source.exists(), isFalse);
     expect(source.fullName, convertPath('/workspace/foo.dart'));
   }
 
   void test_resolveAbsolute_file() {
-    Source source = _resolvePath('/workspace/test.dart');
-    expect(source, isNotNull);
+    var source = _resolvePath('/workspace/test.dart')!;
     expect(source.exists(), isTrue);
     expect(source.fullName, convertPath('/workspace/test.dart'));
   }
 
   void test_resolveAbsolute_folder() {
-    Source source = _resolvePath('/workspace');
+    var source = _resolvePath('/workspace');
     expect(source, isNull);
   }
 
   void test_resolveAbsolute_generated_file_exists_one() {
-    Source source = _resolvePath('/workspace/gen1.dart');
-    expect(source, isNotNull);
+    var source = _resolvePath('/workspace/gen1.dart')!;
     expect(source.exists(), isTrue);
     expect(source.fullName, convertPath('/workspace/bazel-bin/gen1.dart'));
   }
 
   void test_resolveAbsolute_generated_file_exists_two() {
-    Source source = _resolvePath('/workspace/gen2.dart');
-    expect(source, isNotNull);
+    var source = _resolvePath('/workspace/gen2.dart')!;
     expect(source.exists(), isTrue);
     expect(source.fullName, convertPath('/workspace/bazel-genfiles/gen2.dart'));
   }
 
   void test_resolveAbsolute_notFile_dartUri() {
     Uri uri = Uri(scheme: 'dart', path: 'core');
-    Source source = resolver.resolveAbsolute(uri);
+    var source = resolver.resolveAbsolute(uri);
     expect(source, isNull);
   }
 
   void test_resolveAbsolute_notFile_httpsUri() {
     Uri uri = Uri(scheme: 'https', path: '127.0.0.1/test.dart');
-    Source source = resolver.resolveAbsolute(uri);
+    var source = resolver.resolveAbsolute(uri);
     expect(source, isNull);
   }
 
   void test_restoreAbsolute() {
     Uri uri =
         resourceProvider.pathContext.toUri(convertPath('/workspace/test.dart'));
-    Source source = resolver.resolveAbsolute(uri);
-    expect(source, isNotNull);
+    var source = resolver.resolveAbsolute(uri)!;
     expect(resolver.restoreAbsolute(source), uri);
     expect(
-        resolver
-            .restoreAbsolute(NonExistingSource(source.fullName, null, null)),
+        resolver.restoreAbsolute(NonExistingSource(source.fullName,
+            Uri.parse('package:test/test.dart'), UriKind.PACKAGE_URI)),
         uri);
   }
 
-  Source _resolvePath(String absolutePosixPath) {
+  Source? _resolvePath(String absolutePosixPath) {
     String absolutePath = convertPath(absolutePosixPath);
     Uri uri = resourceProvider.pathContext.toUri(absolutePath);
     return resolver.resolveAbsolute(uri);
@@ -108,8 +102,8 @@
 
 @reflectiveTest
 class BazelPackageUriResolverTest with ResourceProviderMixin {
-  BazelWorkspace workspace;
-  BazelPackageUriResolver resolver;
+  late final BazelWorkspace workspace;
+  late final BazelPackageUriResolver resolver;
 
   void test_resolveAbsolute_bin() {
     _addResources([
@@ -225,7 +219,7 @@
       '/workspace/bazel-genfiles/',
     ]);
     var uri = Uri.parse('package:foo..bar/baz.dart');
-    Source source = resolver.resolveAbsolute(uri);
+    var source = resolver.resolveAbsolute(uri);
     expect(source, isNull);
   }
 
@@ -235,7 +229,7 @@
       '/workspace/bazel-genfiles/',
     ]);
     var uri = Uri.parse('package:foo//bar/baz.dart');
-    Source source = resolver.resolveAbsolute(uri);
+    var source = resolver.resolveAbsolute(uri);
     expect(source, isNull);
   }
 
@@ -244,7 +238,7 @@
       '/workspace/WORKSPACE',
       '/workspace/bazel-genfiles/',
     ]);
-    Source source = resolver.resolveAbsolute(Uri.parse('package:foo'));
+    var source = resolver.resolveAbsolute(Uri.parse('package:foo'));
     expect(source, isNull);
   }
 
@@ -253,7 +247,7 @@
       '/workspace/WORKSPACE',
       '/workspace/bazel-genfiles/',
     ]);
-    Source source = resolver.resolveAbsolute(Uri.parse('dart:async'));
+    var source = resolver.resolveAbsolute(Uri.parse('dart:async'));
     expect(source, isNull);
   }
 
@@ -263,8 +257,7 @@
       '/workspace/bazel-genfiles/',
       '/workspace/my/foo/lib/bar.dart',
     ]);
-    Source source =
-        resolver.resolveAbsolute(Uri.parse('package:/foo/bar.dart'));
+    var source = resolver.resolveAbsolute(Uri.parse('package:/foo/bar.dart'));
     expect(source, isNull);
   }
 
@@ -547,7 +540,7 @@
       }
     }
     workspace =
-        BazelWorkspace.find(resourceProvider, convertPath(workspacePath));
+        BazelWorkspace.find(resourceProvider, convertPath(workspacePath))!;
     resolver = BazelPackageUriResolver(workspace);
   }
 
@@ -559,35 +552,34 @@
   void _assertResolve(String uriStr, String posixPath,
       {bool exists = true, bool restore = true}) {
     Uri uri = Uri.parse(uriStr);
-    Source source = resolver.resolveAbsolute(uri);
-    expect(source, isNotNull);
+    var source = resolver.resolveAbsolute(uri)!;
     expect(source.fullName, convertPath(posixPath));
     expect(source.uri, uri);
     expect(source.exists(), exists);
     // If enabled, test also "restoreAbsolute".
     if (restore) {
-      Uri uri = resolver.restoreAbsolute(source);
+      var uri = resolver.restoreAbsolute(source);
       expect(uri.toString(), uriStr);
     }
   }
 
-  void _assertRestore(String posixPath, String expectedUri) {
+  void _assertRestore(String posixPath, String? expectedUri) {
     String path = convertPath(posixPath);
     _MockSource source = _MockSource(path);
-    Uri uri = resolver.restoreAbsolute(source);
+    var uri = resolver.restoreAbsolute(source);
     expect(uri?.toString(), expectedUri);
   }
 }
 
 @reflectiveTest
 class BazelWorkspacePackageTest with ResourceProviderMixin {
-  BazelWorkspace workspace;
-  BazelWorkspacePackage package;
+  late final BazelWorkspace workspace;
+  BazelWorkspacePackage? package;
 
   void test_contains_differentPackage_summarySource() {
     _setUpPackage();
     var source = _inSummarySource('package:some.other.code/file.dart');
-    expect(package.contains(source), isFalse);
+    expect(package!.contains(source), isFalse);
   }
 
   void test_contains_differentPackageInWorkspace() {
@@ -596,7 +588,7 @@
     // A file that is _not_ in this package is not required to have a BUILD
     // file above it, for simplicity and reduced I/O.
     expect(
-      package.contains(
+      package!.contains(
         _testSource('/ws/some/other/code/file.dart'),
       ),
       isFalse,
@@ -606,7 +598,7 @@
   void test_contains_differentWorkspace() {
     _setUpPackage();
     expect(
-      package.contains(
+      package!.contains(
         _testSource('/ws2/some/file.dart'),
       ),
       isFalse,
@@ -620,10 +612,10 @@
     final targetBinFile = newFile('/ws/some/code/bin/code.dart');
     final targetTestFile = newFile('/ws/some/code/test/code_test.dart');
 
-    expect(package.contains(_testSource(targetFile.path)), isTrue);
-    expect(package.contains(_testSource(targetFile2.path)), isTrue);
-    expect(package.contains(_testSource(targetBinFile.path)), isTrue);
-    expect(package.contains(_testSource(targetTestFile.path)), isTrue);
+    expect(package!.contains(_testSource(targetFile.path)), isTrue);
+    expect(package!.contains(_testSource(targetFile2.path)), isTrue);
+    expect(package!.contains(_testSource(targetBinFile.path)), isTrue);
+    expect(package!.contains(_testSource(targetTestFile.path)), isTrue);
   }
 
   void test_contains_samePackage_summarySource() {
@@ -633,8 +625,8 @@
     final file2Source = _inSummarySource('package:some.code/code2.dart');
     final file3Source = _inSummarySource('package:some.code/src/code2.dart');
 
-    expect(package.contains(file2Source), isTrue);
-    expect(package.contains(file3Source), isTrue);
+    expect(package!.contains(file2Source), isTrue);
+    expect(package!.contains(file3Source), isTrue);
   }
 
   void test_contains_subPackage() {
@@ -643,7 +635,7 @@
     newFile('/ws/some/code/testing/lib/testing.dart');
 
     expect(
-      package.contains(
+      package!.contains(
         _testSource('/ws/some/code/testing/lib/testing.dart'),
       ),
       isFalse,
@@ -654,8 +646,19 @@
     _setUpPackage();
 
     expect(package, isNotNull);
-    expect(package.root, convertPath('/ws/some/code'));
-    expect(package.workspace, equals(workspace));
+    expect(package?.root, convertPath('/ws/some/code'));
+    expect(package?.workspace, equals(workspace));
+  }
+
+  void test_findPackageFor_inBlazeOut_notPackage() {
+    var path =
+        convertPath('/ws/blaze-out/k8-opt/bin/news/lib/news_base.pb.dart');
+    newFile('/ws/news/BUILD', content: '');
+    newFile(path, content: '');
+    workspace = BazelWorkspace.find(resourceProvider, path)!;
+
+    var package = workspace.findPackageFor(path);
+    expect(package, isNull);
   }
 
   void test_findPackageFor_missingMarkerFiles() {
@@ -666,7 +669,7 @@
     workspace = BazelWorkspace.find(
       resourceProvider,
       convertPath('/ws/some/code'),
-    );
+    )!;
     final targetFile = newFile('/ws/some/code/lib/code.dart');
 
     package = workspace.findPackageFor(targetFile.path);
@@ -682,14 +685,14 @@
     workspace = BazelWorkspace.find(
       resourceProvider,
       convertPath('/ws/some/code'),
-    );
+    )!;
 
     package = workspace.findPackageFor(
       convertPath('/ws/some/code/lib/code.dart'),
     );
     expect(package, isNotNull);
-    expect(package.root, convertPath('/ws/some/code'));
-    expect(package.workspace, equals(workspace));
+    expect(package?.root, convertPath('/ws/some/code'));
+    expect(package?.workspace, equals(workspace));
   }
 
   void test_findPackageFor_packagesFileExistsInOnlyBinPath() {
@@ -700,14 +703,14 @@
     workspace = BazelWorkspace.find(
       resourceProvider,
       convertPath('/ws/some/code'),
-    );
+    )!;
 
     package = workspace.findPackageFor(
       convertPath('/ws/some/code/lib/code.dart'),
     );
     expect(package, isNotNull);
-    expect(package.root, convertPath('/ws/some/code'));
-    expect(package.workspace, equals(workspace));
+    expect(package?.root, convertPath('/ws/some/code'));
+    expect(package?.workspace, equals(workspace));
   }
 
   void test_findPackageFor_packagesFileInBinExists_subPackage() {
@@ -720,20 +723,20 @@
     workspace = BazelWorkspace.find(
       resourceProvider,
       convertPath('/ws/some/code/testing'),
-    );
+    )!;
 
     package = workspace.findPackageFor(
       convertPath('/ws/some/code/testing/lib/testing.dart'),
     );
     expect(package, isNotNull);
-    expect(package.root, convertPath('/ws/some/code/testing'));
-    expect(package.workspace, equals(workspace));
+    expect(package?.root, convertPath('/ws/some/code/testing'));
+    expect(package?.workspace, equals(workspace));
   }
 
   void test_packagesAvailableTo() {
     _setUpPackage();
-    var packageMap =
-        package.packagesAvailableTo(convertPath('/ws/some/code/lib/code.dart'));
+    var packageMap = package
+        ?.packagesAvailableTo(convertPath('/ws/some/code/lib/code.dart'));
     expect(packageMap, isEmpty);
   }
 
@@ -764,7 +767,7 @@
     workspace = BazelWorkspace.find(
       resourceProvider,
       convertPath('/ws/some/code'),
-    );
+    )!;
     package = workspace.findPackageFor(
       convertPath('/ws/some/code/lib/code.dart'),
     );
@@ -778,13 +781,13 @@
 
 @reflectiveTest
 class BazelWorkspaceTest with ResourceProviderMixin {
-  BazelWorkspace workspace;
+  late final BazelWorkspace workspace;
 
   void test_bazelFileWatcher() async {
     _addResources([
       '/workspace/WORKSPACE',
     ]);
-    _MockTimer timer;
+    late _MockTimer timer;
     var timerFactory = (Duration _, void Function(Timer) callback) {
       timer = _MockTimer(callback);
       return timer;
@@ -838,9 +841,9 @@
       '/workspace/WORKSPACE',
       '/workspace/bazel-bin/my/module/test1.dart',
     ]);
-    BazelWorkspace workspace = BazelWorkspace.find(
-        resourceProvider, convertPath('/workspace/my/module'));
-    _MockTimer timer;
+    var workspace = BazelWorkspace.find(
+        resourceProvider, convertPath('/workspace/my/module'))!;
+    late _MockTimer timer;
     var timerFactory = (Duration _, void Function(Timer) callback) {
       timer = _MockTimer(callback);
       return timer;
@@ -853,7 +856,7 @@
             timerFactory: timerFactory)));
 
     var file1 =
-        workspace.findFile(convertPath('/workspace/my/module/test1.dart'));
+        workspace.findFile(convertPath('/workspace/my/module/test1.dart'))!;
     expect(file1.exists, true);
     var watcher = await watcherCompleter.future;
     var events = StreamQueue(watcher.events);
@@ -899,12 +902,12 @@
       '/workspace/WORKSPACE',
       '/workspace/bazel-bin/my/module/test1.dart',
     ]);
-    BazelWorkspace workspace = BazelWorkspace.find(
-        resourceProvider, convertPath('/workspace/my/module'));
+    var workspace = BazelWorkspace.find(
+        resourceProvider, convertPath('/workspace/my/module'))!;
     var notifications = StreamQueue(workspace.bazelCandidateFiles);
 
     var file1 =
-        workspace.findFile(convertPath('/workspace/my/module/test1.dart'));
+        workspace.findFile(convertPath('/workspace/my/module/test1.dart'))!;
     expect(file1.exists, true);
     var notification = await notifications.next;
     expect(notification.requested, convertPath('my/module/test1.dart'));
@@ -914,7 +917,7 @@
             [convertPath('/workspace/bazel-bin/my/module/test1.dart')]));
 
     var file2 =
-        workspace.findFile(convertPath('/workspace/my/module/test2.dart'));
+        workspace.findFile(convertPath('/workspace/my/module/test2.dart'))!;
     expect(file2.exists, false);
     notification = await notifications.next;
     expect(notification.requested, convertPath('my/module/test2.dart'));
@@ -938,8 +941,8 @@
       '/workspace/blaze-out/host/bin/',
       '/workspace/my/module/BUILD',
     ]);
-    BazelWorkspace workspace = BazelWorkspace.find(
-        resourceProvider, convertPath('/workspace/my/module'));
+    var workspace = BazelWorkspace.find(
+        resourceProvider, convertPath('/workspace/my/module'))!;
     expect(workspace.root, convertPath('/workspace'));
     expect(workspace.readonly, isNull);
     expect(workspace.binPaths.single,
@@ -948,7 +951,7 @@
     expect(
         workspace
             .findPackageFor(convertPath(
-                '/workspace/blaze-out/host/bin/my/module/lib/foo.dart'))
+                '/workspace/blaze-out/host/bin/my/module/lib/foo.dart'))!
             .root,
         convertPath('/workspace/my/module'));
   }
@@ -959,8 +962,8 @@
       '/workspace/blaze-out/',
       '/workspace/my/module/',
     ]);
-    BazelWorkspace workspace = BazelWorkspace.find(
-        resourceProvider, convertPath('/workspace/my/module'));
+    var workspace = BazelWorkspace.find(
+        resourceProvider, convertPath('/workspace/my/module'))!;
     expect(workspace.root, convertPath('/workspace'));
     expect(workspace.readonly, isNull);
     expect(workspace.binPaths.single, convertPath('/workspace/blaze-bin'));
@@ -973,8 +976,8 @@
       '/workspace/blaze-out/k8-fastbuild/bin/',
       '/workspace/my/module/',
     ]);
-    BazelWorkspace workspace = BazelWorkspace.find(
-        resourceProvider, convertPath('/workspace/my/module'));
+    var workspace = BazelWorkspace.find(
+        resourceProvider, convertPath('/workspace/my/module'))!;
     expect(workspace.root, convertPath('/workspace'));
     expect(workspace.readonly, isNull);
     expect(workspace.binPaths, hasLength(2));
@@ -991,8 +994,8 @@
       '/Users/user/test/prime/',
       '/Users/user/test/prime/bazel-genfiles/',
     ]);
-    BazelWorkspace workspace = BazelWorkspace.find(
-        resourceProvider, convertPath('/Users/user/test/prime/my/module'));
+    var workspace = BazelWorkspace.find(
+        resourceProvider, convertPath('/Users/user/test/prime/my/module'))!;
     expect(workspace.root, convertPath('/Users/user/test/prime'));
     expect(workspace.readonly, convertPath('/Users/user/test/READONLY/prime'));
     expect(workspace.binPaths.single,
@@ -1007,8 +1010,8 @@
       '/Users/user/test/prime/WORKSPACE',
       '/Users/user/test/prime/bazel-genfiles/',
     ]);
-    BazelWorkspace workspace = BazelWorkspace.find(
-        resourceProvider, convertPath('/Users/user/test/prime/my/module'));
+    var workspace = BazelWorkspace.find(
+        resourceProvider, convertPath('/Users/user/test/prime/my/module'))!;
     expect(workspace.root, convertPath('/Users/user/test/prime'));
     expect(workspace.readonly, isNull);
     expect(workspace.binPaths.single,
@@ -1023,8 +1026,8 @@
       '/Users/user/test/prime/',
       '/Users/user/test/prime/blaze-genfiles/',
     ]);
-    BazelWorkspace workspace = BazelWorkspace.find(
-        resourceProvider, convertPath('/Users/user/test/prime/my/module'));
+    var workspace = BazelWorkspace.find(
+        resourceProvider, convertPath('/Users/user/test/prime/my/module'))!;
     expect(workspace.root, convertPath('/Users/user/test/prime'));
     expect(workspace.readonly, convertPath('/Users/user/test/READONLY/prime'));
     expect(workspace.binPaths.single,
@@ -1038,8 +1041,8 @@
       '/workspace/WORKSPACE',
       '/workspace/bazel-genfiles/',
     ]);
-    BazelWorkspace workspace = BazelWorkspace.find(
-        resourceProvider, convertPath('/workspace/my/module'));
+    var workspace = BazelWorkspace.find(
+        resourceProvider, convertPath('/workspace/my/module'))!;
     expect(workspace.root, convertPath('/workspace'));
     expect(workspace.readonly, isNull);
     expect(workspace.binPaths.single, convertPath('/workspace/bazel-bin'));
@@ -1051,8 +1054,8 @@
       '/workspace/WORKSPACE',
       '/workspace/bazel-genfiles/',
     ]);
-    BazelWorkspace workspace = BazelWorkspace.find(
-        resourceProvider, convertPath('/workspace/my/module'));
+    var workspace = BazelWorkspace.find(
+        resourceProvider, convertPath('/workspace/my/module'))!;
     expect(workspace.root, convertPath('/workspace'));
     expect(workspace.readonly, isNull);
     expect(workspace.binPaths.single, convertPath('/workspace/bazel-bin'));
@@ -1064,8 +1067,8 @@
       '/workspace/WORKSPACE',
       '/workspace/bazel-genfiles/',
     ]);
-    BazelWorkspace workspace =
-        BazelWorkspace.find(resourceProvider, convertPath('/workspace'));
+    var workspace =
+        BazelWorkspace.find(resourceProvider, convertPath('/workspace'))!;
     expect(workspace.root, convertPath('/workspace'));
     expect(workspace.readonly, isNull);
     expect(workspace.binPaths.single, convertPath('/workspace/bazel-bin'));
@@ -1077,8 +1080,8 @@
       '/workspace/WORKSPACE',
       '/workspace/blaze-genfiles/',
     ]);
-    BazelWorkspace workspace =
-        BazelWorkspace.find(resourceProvider, convertPath('/workspace'));
+    var workspace =
+        BazelWorkspace.find(resourceProvider, convertPath('/workspace'))!;
     expect(workspace.root, convertPath('/workspace'));
     expect(workspace.readonly, isNull);
     expect(workspace.binPaths.single, convertPath('/workspace/blaze-bin'));
@@ -1086,22 +1089,21 @@
   }
 
   void test_find_null_noWorkspaceMarkers() {
-    BazelWorkspace workspace = BazelWorkspace.find(
+    var workspace = BazelWorkspace.find(
         resourceProvider, convertPath('/workspace/my/module'));
     expect(workspace, isNull);
   }
 
   void test_find_null_noWorkspaceMarkers_inRoot() {
-    BazelWorkspace workspace =
-        BazelWorkspace.find(resourceProvider, convertPath('/'));
+    var workspace = BazelWorkspace.find(resourceProvider, convertPath('/'));
     expect(workspace, isNull);
   }
 
   void test_find_null_symlinkPrefix() {
     String prefix = BazelWorkspace.defaultSymlinkPrefix;
     newFile('/workspace/WORKSPACE');
-    BazelWorkspace workspace = BazelWorkspace.find(
-        resourceProvider, convertPath('/workspace/my/module'));
+    var workspace = BazelWorkspace.find(
+        resourceProvider, convertPath('/workspace/my/module'))!;
     expect(workspace.root, convertPath('/workspace'));
     expect(workspace.readonly, isNull);
     expect(workspace.binPaths.single, convertPath('/workspace/$prefix-bin'));
@@ -1120,7 +1122,7 @@
       '/Users/user/test/READONLY/prime/other/module/test4.dart',
     ]);
     workspace = BazelWorkspace.find(
-        resourceProvider, convertPath('/Users/user/test/prime/my/module'));
+        resourceProvider, convertPath('/Users/user/test/prime/my/module'))!;
     _expectFindFile('/Users/user/test/prime/my/module/test1.dart',
         equals: '/Users/user/test/prime/my/module/test1.dart');
     _expectFindFile('/Users/user/test/prime/my/module/test2.dart',
@@ -1140,7 +1142,7 @@
       '/Users/user/test/READONLY/prime/my/module/test.dart',
     ]);
     workspace = BazelWorkspace.find(
-        resourceProvider, convertPath('/Users/user/test/prime/my/module'));
+        resourceProvider, convertPath('/Users/user/test/prime/my/module'))!;
     _expectFindFile('/Users/user/test/prime/my/module/test.dart',
         equals: '/Users/user/test/prime/my/module/test.dart');
   }
@@ -1155,7 +1157,7 @@
       '/workspace/bazel-genfiles/my/module/test3.dart',
     ]);
     workspace = BazelWorkspace.find(
-        resourceProvider, convertPath('/workspace/my/module'));
+        resourceProvider, convertPath('/workspace/my/module'))!;
     _expectFindFile('/workspace/my/module/test1.dart',
         equals: '/workspace/my/module/test1.dart');
     _expectFindFile('/workspace/my/module/test2.dart',
@@ -1187,8 +1189,8 @@
   }
 
   /// Expect that [BazelWorkspace.findFile], given [path], returns [equals].
-  void _expectFindFile(String path, {@required String equals}) =>
-      expect(workspace.findFile(convertPath(path)).path, convertPath(equals));
+  void _expectFindFile(String path, {required String equals}) =>
+      expect(workspace.findFile(convertPath(path))!.path, convertPath(equals));
 }
 
 class _MockSource implements Source {
diff --git a/pkg/analyzer/test/src/workspace/gn_test.dart b/pkg/analyzer/test/src/workspace/gn_test.dart
index 122391c..9441a01 100644
--- a/pkg/analyzer/test/src/workspace/gn_test.dart
+++ b/pkg/analyzer/test/src/workspace/gn_test.dart
@@ -23,7 +23,7 @@
     newFile('/ws/some/code/BUILD.gn');
     var targetFile = newFile('/ws/some/code/lib/code.dart');
 
-    var package = workspace.findPackageFor(targetFile.path);
+    var package = workspace.findPackageFor(targetFile.path)!;
     // A file that is _not_ in this package is not required to have a BUILD.gn
     // file above it, for simplicity and reduced I/O.
     expect(
@@ -37,7 +37,7 @@
     newFile('/ws/some/code/BUILD.gn');
     var targetFile = newFile('/ws/some/code/lib/code.dart');
 
-    var package = workspace.findPackageFor(targetFile.path);
+    var package = workspace.findPackageFor(targetFile.path)!;
     expect(package.contains(TestSource(convertPath('/ws2/some/file.dart'))),
         isFalse);
   }
@@ -51,7 +51,7 @@
     var targetBinFile = newFile('/ws/some/code/bin/code.dart');
     var targetTestFile = newFile('/ws/some/code/test/code_test.dart');
 
-    var package = workspace.findPackageFor(targetFile.path);
+    var package = workspace.findPackageFor(targetFile.path)!;
     expect(package.contains(TestSource(targetFile2.path)), isTrue);
     expect(package.contains(TestSource(targetFile3.path)), isTrue);
     expect(package.contains(TestSource(targetBinFile.path)), isTrue);
@@ -66,7 +66,7 @@
     newFile('/ws/some/code/testing/lib/testing.dart');
 
     var package =
-        workspace.findPackageFor(convertPath('/ws/some/code/lib/code.dart'));
+        workspace.findPackageFor(convertPath('/ws/some/code/lib/code.dart'))!;
     expect(
         package.contains(
             TestSource(convertPath('/ws/some/code/testing/lib/testing.dart'))),
@@ -78,8 +78,7 @@
     newFile('/ws/some/code/BUILD.gn');
     var targetFile = newFile('/ws/some/code/lib/code.dart');
 
-    var package = workspace.findPackageFor(targetFile.path);
-    expect(package, isNotNull);
+    var package = workspace.findPackageFor(targetFile.path)!;
     expect(package.root, convertPath('/ws/some/code'));
     expect(package.workspace, equals(workspace));
   }
@@ -97,7 +96,7 @@
     GnWorkspace workspace = _buildStandardGnWorkspace();
     newFile('/ws/some/code/BUILD.gn');
     var libraryPath = newFile('/ws/some/code/lib/code.dart').path;
-    var package = workspace.findPackageFor(libraryPath);
+    var package = workspace.findPackageFor(libraryPath)!;
     var packageMap = package.packagesAvailableTo(libraryPath);
     expect(packageMap.keys, unorderedEquals(['p1', 'workspace']));
   }
@@ -127,7 +126,7 @@
 }''');
     newFolder('/ws/some/code');
     var gnWorkspace =
-        GnWorkspace.find(resourceProvider, convertPath('/ws/some/code'));
+        GnWorkspace.find(resourceProvider, convertPath('/ws/some/code'))!;
     expect(gnWorkspace.isBazel, isFalse);
     return gnWorkspace;
   }
@@ -137,7 +136,7 @@
 class GnWorkspaceTest with ResourceProviderMixin {
   void test_find_noJiriRoot() {
     newFolder('/workspace');
-    GnWorkspace workspace =
+    var workspace =
         GnWorkspace.find(resourceProvider, convertPath('/workspace'));
     expect(workspace, isNull);
   }
@@ -145,7 +144,7 @@
   void test_find_noPackagesFiles() {
     newFolder('/workspace/.jiri_root');
     newFolder('/workspace/some/code');
-    GnWorkspace workspace =
+    var workspace =
         GnWorkspace.find(resourceProvider, convertPath('/workspace'));
     expect(workspace, isNull);
   }
@@ -164,9 +163,8 @@
     newFile('/workspace/.fx-build-dir', content: '$buildDir\n');
     newFile(
         '/workspace/out/debug-x87_128/dartlang/gen/some/code/foo_package_config.json');
-    GnWorkspace workspace =
-        GnWorkspace.find(resourceProvider, convertPath('/workspace/some/code'));
-    expect(workspace, isNotNull);
+    var workspace =
+        GnWorkspace.find(resourceProvider, convertPath('/workspace/some/code'))!;
     expect(workspace.root, convertPath('/workspace'));
   }
 
@@ -191,12 +189,11 @@
     }
   ]
 }''');
-    GnWorkspace workspace =
-        GnWorkspace.find(resourceProvider, convertPath('/workspace/some/code'));
-    expect(workspace, isNotNull);
+    var workspace =
+        GnWorkspace.find(resourceProvider, convertPath('/workspace/some/code'))!;
     expect(workspace.root, convertPath('/workspace'));
     expect(workspace.packageMap.length, 1);
-    expect(workspace.packageMap['flutter'][0].path,
+    expect(workspace.packageMap['flutter']![0].path,
         convertPath("$packageLocation/lib"));
   }
 
@@ -221,12 +218,11 @@
     }
   ]
 }''');
-    GnWorkspace workspace =
-        GnWorkspace.find(resourceProvider, convertPath('/workspace/some/code'));
-    expect(workspace, isNotNull);
+    var workspace =
+        GnWorkspace.find(resourceProvider, convertPath('/workspace/some/code'))!;
     expect(workspace.root, convertPath('/workspace'));
     expect(workspace.packageMap.length, 1);
-    expect(workspace.packageMap['flutter'][0].path,
+    expect(workspace.packageMap['flutter']![0].path,
         convertPath("$packageLocation/lib"));
   }
 
@@ -249,12 +245,11 @@
     }
   ]
 }''');
-    GnWorkspace workspace =
-        GnWorkspace.find(resourceProvider, convertPath('/workspace/some/code'));
-    expect(workspace, isNotNull);
+    var workspace =
+        GnWorkspace.find(resourceProvider, convertPath('/workspace/some/code'))!;
     expect(workspace.root, convertPath('/workspace'));
     expect(workspace.packageMap.length, 1);
-    expect(workspace.packageMap['flutter'][0].path,
+    expect(workspace.packageMap['flutter']![0].path,
         convertPath("$packageLocation/lib"));
   }
 
@@ -278,12 +273,11 @@
     }
   ]
 }''');
-    GnWorkspace workspace =
-        GnWorkspace.find(resourceProvider, convertPath('/workspace/some/code'));
-    expect(workspace, isNotNull);
+    var workspace =
+        GnWorkspace.find(resourceProvider, convertPath('/workspace/some/code'))!;
     expect(workspace.root, convertPath('/workspace'));
     expect(workspace.packageMap.length, 1);
-    expect(workspace.packageMap['flutter'][0].path,
+    expect(workspace.packageMap['flutter']![0].path,
         convertPath("$packageLocation/lib"));
   }
 
@@ -324,12 +318,11 @@
     }
   ]
 }''');
-    GnWorkspace workspace =
-        GnWorkspace.find(resourceProvider, convertPath('/workspace/some/code'));
-    expect(workspace, isNotNull);
+    var workspace =
+        GnWorkspace.find(resourceProvider, convertPath('/workspace/some/code'))!;
     expect(workspace.root, convertPath('/workspace'));
     expect(workspace.packageMap.length, 1);
-    expect(workspace.packageMap['rettulf'][0].path,
+    expect(workspace.packageMap['rettulf']![0].path,
         convertPath("$otherPackageLocation/lib2"));
   }
 
@@ -370,14 +363,13 @@
     }
   ]
 }''');
-    GnWorkspace workspace =
-        GnWorkspace.find(resourceProvider, convertPath('/workspace/some/code'));
-    expect(workspace, isNotNull);
+    var workspace =
+        GnWorkspace.find(resourceProvider, convertPath('/workspace/some/code'))!;
     expect(workspace.root, convertPath('/workspace'));
     expect(workspace.packageMap.length, 2);
-    expect(workspace.packageMap['flutter'][0].path,
+    expect(workspace.packageMap['flutter']![0].path,
         convertPath("$packageOneLocation/one/lib"));
-    expect(workspace.packageMap['rettulf'][0].path,
+    expect(workspace.packageMap['rettulf']![0].path,
         convertPath("$packageTwoLocation/two/lib"));
   }
 }
diff --git a/pkg/analyzer/test/src/workspace/package_build_test.dart b/pkg/analyzer/test/src/workspace/package_build_test.dart
index 2a9000a..dbc0e58 100644
--- a/pkg/analyzer/test/src/workspace/package_build_test.dart
+++ b/pkg/analyzer/test/src/workspace/package_build_test.dart
@@ -6,7 +6,6 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer/src/workspace/package_build.dart';
-import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -32,18 +31,18 @@
   noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 
   @override
-  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
+  Source? resolveAbsolute(Uri uri, [Uri? actualUri]) {
     return uriToFile[uri]?.createSource(uri);
   }
 
   @override
-  Uri restoreAbsolute(Source source) => pathToUri[source.fullName];
+  Uri? restoreAbsolute(Source source) => pathToUri[source.fullName];
 }
 
 @reflectiveTest
 class PackageBuildFileUriResolverTest with ResourceProviderMixin {
-  PackageBuildWorkspace workspace;
-  PackageBuildFileUriResolver resolver;
+  late final PackageBuildWorkspace workspace;
+  late final PackageBuildFileUriResolver resolver;
 
   void setUp() {
     newFolder('/workspace/.dart_tool/build/generated/project/lib');
@@ -55,7 +54,7 @@
         'project': [getFolder('/workspace')]
       },
       convertPath('/workspace'),
-    );
+    )!;
     resolver = PackageBuildFileUriResolver(workspace);
     newFile('/workspace/test.dart');
     newFile('/workspace/.dart_tool/build/generated/project/gen.dart');
@@ -63,27 +62,25 @@
   }
 
   void test_resolveAbsolute_doesNotExist() {
-    Source source = _resolvePath('/workspace/foo.dart');
+    var source = _resolvePath('/workspace/foo.dart')!;
     expect(source, isNotNull);
     expect(source.exists(), isFalse);
     expect(source.fullName, convertPath('/workspace/foo.dart'));
   }
 
   void test_resolveAbsolute_file() {
-    Source source = _resolvePath('/workspace/test.dart');
-    expect(source, isNotNull);
+    var source = _resolvePath('/workspace/test.dart')!;
     expect(source.exists(), isTrue);
     expect(source.fullName, convertPath('/workspace/test.dart'));
   }
 
   void test_resolveAbsolute_folder() {
-    Source source = _resolvePath('/workspace');
+    var source = _resolvePath('/workspace');
     expect(source, isNull);
   }
 
   void test_resolveAbsolute_generated_file_exists_one() {
-    Source source = _resolvePath('/workspace/gen.dart');
-    expect(source, isNotNull);
+    var source = _resolvePath('/workspace/gen.dart')!;
     expect(source.exists(), isTrue);
     expect(source.fullName,
         convertPath('/workspace/.dart_tool/build/generated/project/gen.dart'));
@@ -91,29 +88,29 @@
 
   void test_resolveAbsolute_notFile_dartUri() {
     Uri uri = Uri(scheme: 'dart', path: 'core');
-    Source source = resolver.resolveAbsolute(uri);
+    var source = resolver.resolveAbsolute(uri);
     expect(source, isNull);
   }
 
   void test_resolveAbsolute_notFile_httpsUri() {
     Uri uri = Uri(scheme: 'https', path: '127.0.0.1/test.dart');
-    Source source = resolver.resolveAbsolute(uri);
+    var source = resolver.resolveAbsolute(uri);
     expect(source, isNull);
   }
 
   void test_restoreAbsolute() {
     Uri uri =
         resourceProvider.pathContext.toUri(convertPath('/workspace/test.dart'));
-    Source source = resolver.resolveAbsolute(uri);
+    var source = resolver.resolveAbsolute(uri)!;
     expect(source, isNotNull);
     expect(resolver.restoreAbsolute(source), uri);
     expect(
-        resolver
-            .restoreAbsolute(NonExistingSource(source.fullName, null, null)),
+        resolver.restoreAbsolute(NonExistingSource(source.fullName,
+            Uri.parse('package:test/test.dart'), UriKind.PACKAGE_URI)),
         uri);
   }
 
-  Source _resolvePath(String path) {
+  Source? _resolvePath(String path) {
     Uri uri = toUri(path);
     return resolver.resolveAbsolute(uri);
   }
@@ -121,15 +118,15 @@
 
 @reflectiveTest
 class PackageBuildPackageUriResolverTest with ResourceProviderMixin {
-  PackageBuildWorkspace workspace;
-  PackageBuildPackageUriResolver resolver;
-  MockUriResolver packageUriResolver;
+  late final PackageBuildWorkspace workspace;
+  late final PackageBuildPackageUriResolver resolver;
+  late final MockUriResolver packageUriResolver;
 
   Uri addPackageSource(String path, String uriStr, {bool create = true}) {
     Uri uri = Uri.parse(uriStr);
-    final File file = create
+    final file = create
         ? newFile(path)
-        : resourceProvider.getResource(convertPath(path));
+        : resourceProvider.getResource(convertPath(path)) as File;
     packageUriResolver.add(uri, file);
     return uri;
   }
@@ -154,7 +151,7 @@
     _addResources([
       '/workspace/.dart_tool/build/generated',
     ]);
-    Source source = resolver.resolveAbsolute(Uri.parse('dart:async'));
+    var source = resolver.resolveAbsolute(Uri.parse('dart:async'));
     expect(source, isNull);
   }
 
@@ -162,8 +159,7 @@
     _addResources([
       '/workspace/.dart_tool/build/generated',
     ]);
-    Source source =
-        resolver.resolveAbsolute(Uri.parse('package:/foo/bar.dart'));
+    var source = resolver.resolveAbsolute(Uri.parse('package:/foo/bar.dart'));
     expect(source, isNull);
   }
 
@@ -203,21 +199,20 @@
         'project': [getFolder('/workspace')]
       },
       convertPath(workspacePath),
-    );
+    )!;
     packageUriResolver = MockUriResolver();
     resolver = PackageBuildPackageUriResolver(workspace, packageUriResolver);
   }
 
   Source _assertResolveUri(Uri uri, String posixPath,
       {bool exists = true, bool restore = true}) {
-    Source source = resolver.resolveAbsolute(uri);
-    expect(source, isNotNull);
+    var source = resolver.resolveAbsolute(uri)!;
     expect(source.fullName, convertPath(posixPath));
     expect(source.uri, uri);
     expect(source.exists(), exists);
     // If enabled, test also "restoreAbsolute".
     if (restore) {
-      Uri restoredUri = resolver.restoreAbsolute(source);
+      var restoredUri = resolver.restoreAbsolute(source);
       expect(restoredUri.toString(), uri.toString());
     }
     return source;
@@ -226,8 +221,8 @@
 
 @reflectiveTest
 class PackageBuildWorkspacePackageTest with ResourceProviderMixin {
-  PackageBuildWorkspace myWorkspace;
-  PackageBuildWorkspacePackage myPackage;
+  late final PackageBuildWorkspace myWorkspace;
+  late final PackageBuildWorkspacePackage myPackage;
 
   String get fooPackageLibPath => '$fooPackageRootPath/lib';
 
@@ -254,9 +249,9 @@
         'foo': [getFolder(fooPackageLibPath)],
       },
       convertPath(myPackageRootPath),
-    );
+    )!;
 
-    myPackage = myWorkspace.findPackageFor('$myPackageLibPath/fake.dart');
+    myPackage = myWorkspace.findPackageFor('$myPackageLibPath/fake.dart')!;
   }
 
   test_contains_fileUri() {
@@ -316,8 +311,7 @@
   test_findPackageFor_my_generated_libFile() {
     var package = myWorkspace.findPackageFor(
       convertPath('$myPackageGeneratedPath/my/lib/a.dart'),
-    );
-    expect(package, isNotNull);
+    )!;
     expect(package.root, convertPath(myPackageRootPath));
     expect(package.workspace, myWorkspace);
   }
@@ -341,8 +335,7 @@
   test_findPackageFor_my_generated_testFile() {
     var package = myWorkspace.findPackageFor(
       convertPath('$myPackageGeneratedPath/my/test/a.dart'),
-    );
-    expect(package, isNotNull);
+    )!;
     expect(package.root, convertPath(myPackageRootPath));
     expect(package.workspace, myWorkspace);
   }
@@ -350,8 +343,7 @@
   test_findPackageFor_my_libFile() {
     var package = myWorkspace.findPackageFor(
       convertPath('$myPackageLibPath/a.dart'),
-    );
-    expect(package, isNotNull);
+    )!;
     expect(package.root, convertPath(myPackageRootPath));
     expect(package.workspace, myWorkspace);
   }
@@ -359,8 +351,7 @@
   test_findPackageFor_my_testFile() {
     var package = myWorkspace.findPackageFor(
       convertPath('$myPackageRootPath/test/a.dart'),
-    );
-    expect(package, isNotNull);
+    )!;
     expect(package.root, convertPath(myPackageRootPath));
     expect(package.workspace, myWorkspace);
   }
@@ -387,7 +378,7 @@
 
   Source _sourceWithPackageUriWithoutPath(String uriStr) {
     var uri = Uri.parse(uriStr);
-    return _MockSource(path: null, uri: uri);
+    return _MockSource(path: convertPath('/test/lib/test.dart'), uri: uri);
   }
 }
 
@@ -451,7 +442,7 @@
     newFolder('/workspace/aaa/.dart_tool/build/generated');
     newFile('/workspace/aaa/pubspec.yaml', content: '*');
 
-    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
+    var workspace = PackageBuildWorkspace.find(
       resourceProvider,
       {},
       convertPath('/workspace/aaa/lib'),
@@ -462,11 +453,11 @@
   void test_find_hasDartToolAndPubspec() {
     newFolder('/workspace/.dart_tool/build/generated/project/lib');
     newFile('/workspace/pubspec.yaml', content: 'name: project');
-    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
+    var workspace = PackageBuildWorkspace.find(
       resourceProvider,
       {},
       convertPath('/workspace'),
-    );
+    )!;
     expect(workspace.root, convertPath('/workspace'));
     expect(workspace.projectPackageName, 'project');
   }
@@ -477,11 +468,11 @@
     newFile('/workspace/opened/up/a/child/dir/pubspec.yaml',
         content: 'name: subproject');
     newFile('/workspace/pubspec.yaml', content: 'name: project');
-    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
+    var workspace = PackageBuildWorkspace.find(
       resourceProvider,
       {},
       convertPath('/workspace/opened/up/a/child/dir'),
-    );
+    )!;
     expect(workspace.root, convertPath('/workspace/opened/up/a/child/dir'));
     expect(workspace.projectPackageName, 'subproject');
   }
@@ -491,11 +482,11 @@
     newFolder('/workspace/opened/up/a/child/dir');
     newFolder('/workspace/opened/up/a/child/dir/.dart_tool/build');
     newFile('/workspace/pubspec.yaml', content: 'name: project');
-    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
+    var workspace = PackageBuildWorkspace.find(
       resourceProvider,
       {},
       convertPath('/workspace/opened/up/a/child/dir'),
-    );
+    )!;
     expect(workspace.root, convertPath('/workspace'));
     expect(workspace.projectPackageName, 'project');
   }
@@ -504,7 +495,7 @@
     // Edge case: an empty .dart_tool directory. Don't assume package:build.
     newFolder('/workspace/.dart_tool');
     newFile('/workspace/pubspec.yaml', content: 'name: project');
-    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
+    var workspace = PackageBuildWorkspace.find(
       resourceProvider,
       {},
       convertPath('/workspace'),
@@ -514,7 +505,7 @@
 
   void test_find_hasDartToolNoPubspec() {
     newFolder('/workspace/.dart_tool/build/generated/project/lib');
-    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
+    var workspace = PackageBuildWorkspace.find(
       resourceProvider,
       {},
       convertPath('/workspace'),
@@ -526,7 +517,7 @@
     // Dart projects will have this directory, that don't use package:build.
     newFolder('/workspace/.dart_tool/pub');
     newFile('/workspace/pubspec.yaml', content: 'name: project');
-    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
+    var workspace = PackageBuildWorkspace.find(
       resourceProvider,
       {},
       convertPath('/workspace'),
@@ -537,7 +528,7 @@
   void test_find_hasMalformedPubspec() {
     newFolder('/workspace/.dart_tool/build/generated/project/lib');
     newFile('/workspace/pubspec.yaml', content: 'not: yaml: here! 1111');
-    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
+    var workspace = PackageBuildWorkspace.find(
       resourceProvider,
       {},
       convertPath('/workspace'),
@@ -551,7 +542,7 @@
 
     newFile('/workspace/aaa/pubspec.yaml', content: '*');
 
-    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
+    var workspace = PackageBuildWorkspace.find(
       resourceProvider,
       {},
       convertPath('/workspace/aaa/lib'),
@@ -561,7 +552,7 @@
 
   void test_find_hasPubspecNoDartTool() {
     newFile('/workspace/pubspec.yaml', content: 'name: project');
-    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
+    var workspace = PackageBuildWorkspace.find(
       resourceProvider,
       {},
       convertPath('/workspace'),
@@ -661,7 +652,7 @@
         ),
       ),
       convertPath(root),
-    );
+    )!;
   }
 }
 
@@ -671,14 +662,10 @@
   @override
   final Uri uri;
 
-  _MockSource({@required this.path, @required this.uri});
+  _MockSource({required this.path, required this.uri});
 
   @override
   String get fullName {
-    if (path == null) {
-      throw StateError('This source has no path, '
-          'and we do not expect that it will be accessed.');
-    }
     return path;
   }
 
diff --git a/pkg/analyzer/test/src/workspace/pub_test.dart b/pkg/analyzer/test/src/workspace/pub_test.dart
index 399300f..12ab9c6 100644
--- a/pkg/analyzer/test/src/workspace/pub_test.dart
+++ b/pkg/analyzer/test/src/workspace/pub_test.dart
@@ -27,14 +27,14 @@
           'p1': [getFolder('/.pubcache/p1/lib')],
           'workspace': [getFolder('/workspace/lib')]
         },
-        convertPath('/workspace'));
+        convertPath('/workspace'))!;
     expect(workspace.isBazel, isFalse);
   }
 
   void test_contains_differentWorkspace() {
     newFile('/workspace2/project/lib/file.dart');
 
-    var package = findPackage('/workspace/project/lib/code.dart');
+    var package = findPackage('/workspace/project/lib/code.dart')!;
     expect(
         package.contains(
             TestSource(convertPath('/workspace2/project/lib/file.dart'))),
@@ -44,7 +44,7 @@
   void test_contains_sameWorkspace() {
     newFile('/workspace/project/lib/file2.dart');
 
-    var package = findPackage('/workspace/project/lib/code.dart');
+    var package = findPackage('/workspace/project/lib/code.dart')!;
     expect(
         package.contains(
             TestSource(convertPath('/workspace/project/lib/file2.dart'))),
@@ -62,8 +62,7 @@
   void test_findPackageFor_includedFile() {
     newFile('/workspace/project/lib/file.dart');
 
-    var package = findPackage('/workspace/project/lib/file.dart');
-    expect(package, isNotNull);
+    var package = findPackage('/workspace/project/lib/file.dart')!;
     expect(package.root, convertPath('/workspace'));
     expect(package.workspace, equals(workspace));
   }
@@ -77,7 +76,7 @@
 
   void test_packagesAvailableTo() {
     var libraryPath = convertPath('/workspace/lib/test.dart');
-    var package = findPackage(libraryPath);
+    var package = findPackage(libraryPath)!;
     var packageMap = package.packagesAvailableTo(libraryPath);
     expect(packageMap.keys, unorderedEquals(['p1', 'workspace']));
   }
@@ -87,8 +86,8 @@
 class PubWorkspaceTest with ResourceProviderMixin {
   void test_find_directory() {
     newFile('/workspace/pubspec.yaml', content: 'name: project');
-    PubWorkspace workspace =
-        PubWorkspace.find(resourceProvider, {}, convertPath('/workspace'));
+    var workspace =
+        PubWorkspace.find(resourceProvider, {}, convertPath('/workspace'))!;
     expect(workspace.isBazel, isFalse);
     expect(workspace.root, convertPath('/workspace'));
   }
@@ -102,13 +101,13 @@
 
   void test_find_file() {
     newFile('/workspace/pubspec.yaml', content: 'name: project');
-    PubWorkspace workspace = PubWorkspace.find(
-        resourceProvider, {}, convertPath('/workspace/lib/lib1.dart'));
+    var workspace = PubWorkspace.find(
+        resourceProvider, {}, convertPath('/workspace/lib/lib1.dart'))!;
     expect(workspace.root, convertPath('/workspace'));
   }
 
   void test_find_missingPubspec() {
-    PubWorkspace workspace = PubWorkspace.find(
+    var workspace = PubWorkspace.find(
         resourceProvider, {}, convertPath('/workspace/lib/lib1.dart'));
     expect(workspace, isNull);
   }
diff --git a/pkg/analyzer/test/src/workspace/workspace_test_support.dart b/pkg/analyzer/test/src/workspace/workspace_test_support.dart
index 164e1e4..30d4fbc 100644
--- a/pkg/analyzer/test/src/workspace/workspace_test_support.dart
+++ b/pkg/analyzer/test/src/workspace/workspace_test_support.dart
@@ -8,10 +8,10 @@
 /// Utilities for tests of subclasses of [WorkspacePackage].
 abstract class WorkspacePackageTest with ResourceProviderMixin {
   /// The workspace containing the packages.
-  Workspace workspace;
+  late final Workspace workspace;
 
   /// Return the package containing the given [path], or `null` if there is no
   /// such package in the [workspace].
-  WorkspacePackage findPackage(String path) =>
+  WorkspacePackage? findPackage(String path) =>
       workspace.findPackageFor(convertPath(path));
 }
diff --git a/pkg/analyzer/test/util/id_testing_helper.dart b/pkg/analyzer/test/util/id_testing_helper.dart
index 76658f3..08e94dd 100644
--- a/pkg/analyzer/test/util/id_testing_helper.dart
+++ b/pkg/analyzer/test/util/id_testing_helper.dart
@@ -62,7 +62,8 @@
       memorySourceFiles, codeMap, expectedMaps);
   var config =
       TestConfig(marker, 'provisional test config', featureSet: featureSet);
-  return runTestForConfig<T>(testData, dataComputer, config);
+  return runTestForConfig<T>(testData, dataComputer, config,
+      onFailure: onFailure);
 }
 
 /// Creates the testing URI used for [fileName] in annotated tests.
@@ -77,11 +78,11 @@
 /// Returns `true` if an error was encountered.
 Future<Map<String, TestResult<T>>> runTest<T>(TestData testData,
     DataComputer<T> dataComputer, List<TestConfig> testedConfigs,
-    {bool testAfterFailures,
+    {required bool testAfterFailures,
     bool forUserLibrariesOnly = true,
     Iterable<Id> globalIds = const <Id>[],
-    void Function(String message) onFailure,
-    Map<String, List<String>> skipMap}) async {
+    required void Function(String message) onFailure,
+    Map<String, List<String>>? skipMap}) async {
   for (TestConfig config in testedConfigs) {
     if (!testData.expectedMaps.containsKey(config.marker)) {
       throw ArgumentError("Unexpected test marker '${config.marker}'. "
@@ -105,12 +106,12 @@
 RunTestFunction<T> runTestFor<T>(
     DataComputer<T> dataComputer, List<TestConfig> testedConfigs) {
   return (TestData testData,
-      {bool testAfterFailures,
-      bool verbose,
-      bool succinct,
-      bool printCode,
-      Map<String, List<String>> skipMap,
-      Uri nullUri}) {
+      {required bool testAfterFailures,
+      bool? verbose,
+      bool? succinct,
+      bool? printCode,
+      Map<String, List<String>>? skipMap,
+      Uri? nullUri}) {
     return runTest(testData, dataComputer, testedConfigs,
         testAfterFailures: testAfterFailures,
         onFailure: onFailure,
@@ -123,11 +124,11 @@
 /// Returns `true` if an error was encountered.
 Future<TestResult<T>> runTestForConfig<T>(
     TestData testData, DataComputer<T> dataComputer, TestConfig config,
-    {bool fatalErrors,
-    void Function(String message) onFailure,
-    Map<String, List<String>> skipMap}) async {
+    {bool fatalErrors = true,
+    required void Function(String message) onFailure,
+    Map<String, List<String>>? skipMap}) async {
   MemberAnnotations<IdValue> memberAnnotations =
-      testData.expectedMaps[config.marker];
+      testData.expectedMaps[config.marker]!;
   var resourceProvider = MemoryResourceProvider();
   var testUris = <Uri>[];
   for (var entry in testData.memorySourceFiles.entries) {
@@ -171,8 +172,8 @@
 
   var results = <Uri, ResolvedUnitResult>{};
   for (var testUri in testUris) {
-    var result =
-        await driver.getResult(resourceProvider.convertPath(testUri.path));
+    var path = resourceProvider.convertPath(testUri.path);
+    var result = (await driver.getResult(path))!;
     var errors =
         result.errors.where((e) => e.severity == Severity.error).toList();
     if (errors.isNotEmpty) {
@@ -189,7 +190,7 @@
         errorMap.forEach((offset, errors) {
           var id = NodeId(offset, IdKind.error);
           var data = dataComputer.computeErrorData(
-              config, driver.testingData, id, errors);
+              config, driver.testingData!, id, errors);
           if (data != null) {
             Map<Id, ActualData<T>> actualMap = actualMapFor(testUri);
             actualMap[id] = ActualData<T>(id, data, testUri, offset, errors);
@@ -197,7 +198,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}';
         }
 
@@ -210,7 +211,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);
@@ -243,7 +244,7 @@
       var className = id.className;
       var name = id.memberName;
       var unit =
-          parseString(content: code[uri].sourceCode, throwIfDiagnostics: false)
+          parseString(content: code[uri]!.sourceCode, throwIfDiagnostics: false)
               .unit;
       if (className != null) {
         for (var declaration in unit.declarations) {
@@ -251,7 +252,7 @@
               declaration.name.name == className) {
             for (var member in declaration.members) {
               if (member is ConstructorDeclaration) {
-                if (member.name.name == name) {
+                if (member.name!.name == name) {
                   return member.offset;
                 }
               } else if (member is FieldDeclaration) {
@@ -289,7 +290,7 @@
     } else if (id is ClassId) {
       var className = id.className;
       var unit =
-          parseString(content: code[uri].sourceCode, throwIfDiagnostics: false)
+          parseString(content: code[uri]!.sourceCode, throwIfDiagnostics: false)
               .unit;
       for (var declaration in unit.declarations) {
         if (declaration is ClassDeclaration &&
@@ -300,9 +301,9 @@
       return 0;
     } else if (id is LibraryId) {
       var unit =
-          parseString(content: code[uri].sourceCode, throwIfDiagnostics: false)
+          parseString(content: code[uri]!.sourceCode, throwIfDiagnostics: false)
               .unit;
-      var offset = unit?.declaredElement?.library?.nameOffset ?? -1;
+      var offset = unit.declaredElement?.library.nameOffset ?? -1;
       return offset >= 0 ? offset : 0;
     } else {
       throw StateError('Unexpected id ${id.runtimeType}');
@@ -329,7 +330,7 @@
   bool get supportsErrors => false;
 
   /// Returns data corresponding to [error].
-  T computeErrorData(TestConfig config, TestingData testingData, Id id,
+  T? computeErrorData(TestConfig config, TestingData testingData, Id id,
           List<AnalysisError> errors) =>
       null;
 
@@ -346,6 +347,6 @@
   final String name;
   final FeatureSet featureSet;
 
-  TestConfig(this.marker, this.name, {FeatureSet featureSet})
+  TestConfig(this.marker, this.name, {FeatureSet? featureSet})
       : featureSet = featureSet ?? FeatureSet.latestLanguageVersion();
 }
diff --git a/pkg/analyzer/test/utils.dart b/pkg/analyzer/test/utils.dart
index 64b63f6..082f929 100644
--- a/pkg/analyzer/test/utils.dart
+++ b/pkg/analyzer/test/utils.dart
@@ -34,7 +34,7 @@
         return unitMember;
       }
     }
-    Source source = unit.declaredElement.source;
+    Source source = unit.declaredElement!.source;
     fail('No class named $className in $source');
   }
 
@@ -42,7 +42,7 @@
   /// in the class with the given [className] in the given compilation [unit].
   /// If constructorName is null, return the default constructor;
   static ConstructorDeclaration getConstructorInClass(
-      CompilationUnit unit, String className, String constructorName) {
+      CompilationUnit unit, String className, String? constructorName) {
     ClassDeclaration unitMember = getClass(unit, className);
     NodeList<ClassMember> classMembers = unitMember.members;
     for (ClassMember classMember in classMembers) {
@@ -76,9 +76,10 @@
 
   /// Return the element of the field with the given [fieldName] in the class
   /// with the given [className] in the given compilation [unit].
-  static FieldElement getFieldInClassElement(
+  static FieldElement? getFieldInClassElement(
       CompilationUnit unit, String className, String fieldName) {
-    return getFieldInClass(unit, className, fieldName)?.name?.staticElement;
+    return getFieldInClass(unit, className, fieldName).name.staticElement
+        as FieldElement;
   }
 
   /// Return the declaration of the method with the given [methodName] in the
@@ -103,7 +104,7 @@
   static List<Statement> getStatementsInMethod(
       CompilationUnit unit, String className, String methodName) {
     MethodDeclaration method = getMethodInClass(unit, className, methodName);
-    BlockFunctionBody body = method.body;
+    var body = method.body as BlockFunctionBody;
     return body.block.statements;
   }
 
@@ -112,7 +113,7 @@
   static List<Statement> getStatementsInTopLevelFunction(
       CompilationUnit unit, String functionName) {
     FunctionDeclaration function = getTopLevelFunction(unit, functionName);
-    BlockFunctionBody body = function.functionExpression.body;
+    var body = function.functionExpression.body as BlockFunctionBody;
     return body.block.statements;
   }
 
@@ -153,7 +154,8 @@
   /// Return the top-level variable element with the given [name].
   static TopLevelVariableElement getTopLevelVariableElement(
       CompilationUnit unit, String name) {
-    return getTopLevelVariable(unit, name)?.name?.staticElement;
+    return getTopLevelVariable(unit, name).name.staticElement
+        as TopLevelVariableElement;
   }
 }
 
diff --git a/pkg/analyzer/test/verify_diagnostics_test.dart b/pkg/analyzer/test/verify_diagnostics_test.dart
index 96d7c2b..34f18aa 100644
--- a/pkg/analyzer/test/verify_diagnostics_test.dart
+++ b/pkg/analyzer/test/verify_diagnostics_test.dart
@@ -6,9 +6,9 @@
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
+import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:path/path.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -87,17 +87,17 @@
   final StringBuffer buffer = StringBuffer();
 
   /// The path to the file currently being verified.
-  String filePath;
+  late String filePath;
 
   /// A flag indicating whether the [filePath] has already been written to the
   /// buffer.
   bool hasWrittenFilePath = false;
 
   /// The name of the variable currently being verified.
-  String variableName;
+  late String variableName;
 
   /// The name of the error code currently being verified.
-  String codeName;
+  late String codeName;
 
   /// A flag indicating whether the [variableName] has already been written to
   /// the buffer.
@@ -122,17 +122,17 @@
 
   /// Return the name of the code as defined in the [initializer].
   String _extractCodeName(VariableDeclaration variable) {
-    Expression initializer = variable.initializer;
+    var initializer = variable.initializer;
     if (initializer is MethodInvocation) {
       var firstArgument = initializer.argumentList.arguments[0];
-      return (firstArgument as StringLiteral).stringValue;
+      return (firstArgument as StringLiteral).stringValue!;
     }
     return variable.name.name;
   }
 
   /// Extract documentation from the given [field] declaration.
-  List<String> _extractDoc(FieldDeclaration field) {
-    Token comments = field.firstTokenAfterCommentAndMetadata.precedingComments;
+  List<String>? _extractDoc(FieldDeclaration field) {
+    var comments = field.firstTokenAfterCommentAndMetadata.precedingComments;
     if (comments == null) {
       return null;
     }
@@ -146,7 +146,7 @@
       } else if (lexeme == '//') {
         docs.add('');
       }
-      comments = comments.next;
+      comments = comments.next as CommentToken?;
     }
     if (docs.isEmpty) {
       return null;
@@ -159,7 +159,7 @@
     bool errorRequired,
     Map<String, String> auxiliaryFiles,
     List<String> experiments,
-    String languageVersion,
+    String? languageVersion,
   ) {
     int rangeStart = snippet.indexOf(errorRangeStart);
     if (rangeStart < 0) {
@@ -194,8 +194,8 @@
       List<String> lines, int start, int end, bool errorRequired) {
     var snippets = <_SnippetData>[];
     var auxiliaryFiles = <String, String>{};
-    List<String> experiments;
-    String languageVersion;
+    List<String>? experiments;
+    String? languageVersion;
     var currentStart = -1;
     for (var i = start; i < end; i++) {
       var line = lines[i];
@@ -224,7 +224,7 @@
           }
           var content = lines.sublist(currentStart + 1, i).join('\n');
           snippets.add(_extractSnippetData(content, errorRequired,
-              auxiliaryFiles, experiments, languageVersion));
+              auxiliaryFiles, experiments ?? [], languageVersion));
           auxiliaryFiles = <String, String>{};
         }
         currentStart = -1;
@@ -243,9 +243,6 @@
   /// [path] and return the result.
   ParsedUnitResult _parse(AnalysisContextCollection collection, String path) {
     AnalysisSession session = collection.contextFor(path).currentSession;
-    if (session == null) {
-      throw StateError('No session for "$path"');
-    }
     ParsedUnitResult result = session.getParsedUnit(path);
     if (result.state != ResultState.VALID) {
       throw StateError('Unable to parse "$path"');
@@ -280,7 +277,7 @@
   /// Extract documentation from the file that was parsed to produce the given
   /// [result].
   Future<void> _validateFile(ParsedUnitResult result) async {
-    filePath = result.path;
+    filePath = result.path!;
     hasWrittenFilePath = false;
     CompilationUnit unit = result.unit;
     for (CompilationUnitMember declaration in unit.declarations) {
@@ -288,7 +285,7 @@
         String className = declaration.name.name;
         for (ClassMember member in declaration.members) {
           if (member is FieldDeclaration) {
-            List<String> docs = _extractDoc(member);
+            var docs = _extractDoc(member);
             if (docs != null) {
               VariableDeclaration variable = member.fields.variables[0];
               codeName = _extractCodeName(variable);
@@ -306,7 +303,7 @@
 
               List<_SnippetData> exampleSnippets =
                   _extractSnippets(docs, exampleStart + 1, fixesStart, true);
-              _SnippetData firstExample;
+              _SnippetData? firstExample;
               if (exampleSnippets.isEmpty) {
                 _reportProblem('No example.');
               } else {
@@ -416,7 +413,7 @@
   final int length;
   final Map<String, String> auxiliaryFiles;
   final List<String> experiments;
-  final String languageVersion;
+  final String? languageVersion;
 
   _SnippetData(this.content, this.offset, this.length, this.auxiliaryFiles,
       this.experiments, this.languageVersion);
@@ -438,7 +435,7 @@
   }
 
   @override
-  String get testPackageLanguageVersion {
+  String? get testPackageLanguageVersion {
     return snippet.languageVersion;
   }
 
@@ -462,12 +459,12 @@
         String pathInLib = uri.pathSegments.skip(1).join('/');
         newFile(
           '$packageRootPath/lib/$pathInLib',
-          content: auxiliaryFiles[uriStr],
+          content: auxiliaryFiles[uriStr]!,
         );
       } else {
         newFile(
           '$testPackageRootPath/$uriStr',
-          content: auxiliaryFiles[uriStr],
+          content: auxiliaryFiles[uriStr]!,
         );
       }
     }
diff --git a/pkg/analyzer/test/verify_docs_test.dart b/pkg/analyzer/test/verify_docs_test.dart
index 32e6bc1..76acfa9 100644
--- a/pkg/analyzer/test/verify_docs_test.dart
+++ b/pkg/analyzer/test/verify_docs_test.dart
@@ -92,6 +92,7 @@
     //  API, write code to compute the list of imports so that new public API
     //  will automatically be allowed.
     String imports = '''
+// @dart = 2.9
 import 'dart:math' as math;
 
 import 'package:analyzer/dart/analysis/analysis_context.dart';
@@ -118,7 +119,7 @@
         fail('The snippets directory contains multiple analysis contexts.');
       }
       ErrorsResult results =
-          await contexts[0].currentSession.getErrors(snippetPath);
+          (await contexts[0].currentSession.getErrors(snippetPath))!;
       Iterable<AnalysisError> errors = results.errors.where((error) {
         ErrorCode errorCode = error.errorCode;
         return errorCode != HintCode.UNUSED_IMPORT &&
diff --git a/pkg/analyzer/test/verify_tests_test.dart b/pkg/analyzer/test/verify_tests_test.dart
index 3db4bb7..fd16bb7 100644
--- a/pkg/analyzer/test/verify_tests_test.dart
+++ b/pkg/analyzer/test/verify_tests_test.dart
@@ -16,7 +16,7 @@
 }
 
 class _VerifyTests extends VerifyTests {
-  _VerifyTests(String testDirPath, {List<String> excludedPaths})
+  _VerifyTests(String testDirPath, {List<String>? excludedPaths})
       : super(testDirPath, excludedPaths: excludedPaths);
 
   @override
diff --git a/pkg/analyzer/tool/diagnostics/generate.dart b/pkg/analyzer/tool/diagnostics/generate.dart
index 7571b56..1680135 100644
--- a/pkg/analyzer/tool/diagnostics/generate.dart
+++ b/pkg/analyzer/tool/diagnostics/generate.dart
@@ -8,8 +8,8 @@
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
+import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer_utilities/package_root.dart' as package_root;
 import 'package:path/src/context.dart';
 
@@ -58,7 +58,7 @@
 
   /// The path to the file containing the generated definition of the diagnostic
   /// codes that include the message, or `null` if the
-  final String declarationPath;
+  final String? declarationPath;
 
   /// Initialize a newly created code path from the [documentationPath] and
   /// [declarationPath].
@@ -67,14 +67,16 @@
   /// Return a list of code paths computed by joining the path segments in the
   /// corresponding lists from [documentationPaths] and [declarationPaths].
   static List<CodePath> from(List<List<String>> documentationPaths,
-      List<List<String>> declarationPaths) {
+      List<List<String>?> declarationPaths) {
     Context pathContext = PhysicalResourceProvider.INSTANCE.pathContext;
     List<CodePath> paths = [];
     for (int i = 0; i < documentationPaths.length; i++) {
       String docPath = pathContext.joinAll(documentationPaths[i]);
-      String declPath;
-      if (declarationPaths[i] != null) {
-        declPath = pathContext.joinAll(declarationPaths[i]);
+
+      String? declPath;
+      var declarationPath = declarationPaths[i];
+      if (declarationPath != null) {
+        declPath = pathContext.joinAll(declarationPath);
       }
       paths.add(CodePath(docPath, declPath));
     }
@@ -92,7 +94,7 @@
   List<String> messages;
 
   /// The lines of documentation associated with the diagnostic.
-  List<String> documentation;
+  List<String>? documentation;
 
   /// Initialize a newly created information holder with the given [name] and
   /// [message].
@@ -119,7 +121,7 @@
       }
     }
     sink.writeln();
-    for (String line in documentation) {
+    for (String line in documentation!) {
       sink.writeln(line);
     }
   }
@@ -186,7 +188,7 @@
         resourceProvider: PhysicalResourceProvider.INSTANCE);
     for (CodePath codePath in codePaths) {
       String docPath = codePath.documentationPath;
-      String declPath = codePath.declarationPath;
+      var declPath = codePath.declarationPath;
       if (declPath == null) {
         _extractDocs(_parse(collection, docPath), null);
       } else {
@@ -205,9 +207,9 @@
   /// the expression does not appear to be creating an error code. If the
   /// expression is the name of a generated code, then the [generatedResult]
   /// should have the unit in which the information can be found.
-  DiagnosticInformation _extractDiagnosticInformation(
-      Expression expression, ParsedUnitResult generatedResult) {
-    List<Expression> arguments;
+  DiagnosticInformation? _extractDiagnosticInformation(
+      Expression expression, ParsedUnitResult? generatedResult) {
+    List<Expression>? arguments;
     if (expression is InstanceCreationExpression) {
       arguments = expression.argumentList.arguments;
     } else if (expression is MethodInvocation) {
@@ -219,7 +221,7 @@
     if (arguments != null) {
       String name = _extractName(arguments);
       String message = _extractMessage(arguments);
-      DiagnosticInformation info = infoByName[name];
+      var info = infoByName[name];
       if (info == null) {
         info = DiagnosticInformation(name, message);
         infoByName[name] = info;
@@ -230,10 +232,9 @@
     }
 
     if (expression is SimpleIdentifier && generatedResult != null) {
-      VariableDeclaration variable =
-          _findVariable(expression.name, generatedResult.unit);
+      var variable = _findVariable(expression.name, generatedResult.unit);
       if (variable != null) {
-        return _extractDiagnosticInformation(variable.initializer, null);
+        return _extractDiagnosticInformation(variable.initializer!, null);
       }
     }
 
@@ -241,8 +242,8 @@
   }
 
   /// Extract documentation from the given [field] declaration.
-  List<String> _extractDoc(FieldDeclaration field) {
-    Token comments = field.firstTokenAfterCommentAndMetadata.precedingComments;
+  List<String>? _extractDoc(FieldDeclaration field) {
+    var comments = field.firstTokenAfterCommentAndMetadata.precedingComments;
     if (comments == null) {
       return null;
     }
@@ -272,7 +273,7 @@
       } else if (lexeme == '//') {
         docs.add('');
       }
-      comments = comments.next;
+      comments = comments.next as CommentToken?;
     }
     if (docs.isEmpty) {
       return null;
@@ -283,7 +284,8 @@
   /// Extract documentation from the file that was parsed to produce the given
   /// [result]. If a [generatedResult] is provided, then the messages might be
   /// in the file parsed to produce the result.
-  void _extractDocs(ParsedUnitResult result, ParsedUnitResult generatedResult) {
+  void _extractDocs(
+      ParsedUnitResult result, ParsedUnitResult? generatedResult) {
     CompilationUnit unit = result.unit;
     for (CompilationUnitMember declaration in unit.declarations) {
       if (declaration is ClassDeclaration &&
@@ -293,10 +295,10 @@
               member.isStatic &&
               !_isDeprecated(member)) {
             VariableDeclaration variable = member.fields.variables[0];
-            DiagnosticInformation info = _extractDiagnosticInformation(
-                variable.initializer, generatedResult);
+            var info = _extractDiagnosticInformation(
+                variable.initializer!, generatedResult);
             if (info != null) {
-              List<String> docs = _extractDoc(member);
+              var docs = _extractDoc(member);
               if (docs != null) {
                 if (info.documentation != null) {
                   throw StateError(
@@ -312,7 +314,7 @@
   }
 
   /// Return the message extracted from the list of [arguments].
-  String _extractMessage(NodeList<Expression> arguments) {
+  String _extractMessage(List<Expression> arguments) {
     int positionalCount =
         arguments.where((expression) => expression is! NamedExpression).length;
     if (positionalCount == 2) {
@@ -326,19 +328,19 @@
   }
 
   /// Return the name extracted from the list of [arguments].
-  String _extractName(NodeList<Expression> arguments) =>
+  String _extractName(List<Expression> arguments) =>
       _extractString(arguments[0]);
 
   String _extractString(Expression expression) {
     if (expression is StringLiteral) {
-      return expression.stringValue;
+      return expression.stringValue!;
     }
     throw StateError('Cannot extract string from $expression');
   }
 
   /// Return the declaration of the top-level variable with the [name] in the
   /// compilation unit, or `null` if there is no such variable.
-  VariableDeclaration _findVariable(String name, CompilationUnit unit) {
+  VariableDeclaration? _findVariable(String name, CompilationUnit unit) {
     for (CompilationUnitMember member in unit.declarations) {
       if (member is TopLevelVariableDeclaration) {
         for (VariableDeclaration variable in member.variables.variables) {
@@ -359,9 +361,6 @@
   /// [path] and return the result.
   ParsedUnitResult _parse(AnalysisContextCollection collection, String path) {
     AnalysisSession session = collection.contextFor(path).currentSession;
-    if (session == null) {
-      throw StateError('No session for "$path"');
-    }
     ParsedUnitResult result = session.getParsedUnit(path);
     if (result.state != ResultState.VALID) {
       throw StateError('Unable to parse "$path"');
@@ -382,7 +381,7 @@
     List<String> errorCodes = infoByName.keys.toList();
     errorCodes.sort();
     for (String errorCode in errorCodes) {
-      DiagnosticInformation info = infoByName[errorCode];
+      DiagnosticInformation info = infoByName[errorCode]!;
       if (info.hasDocumentation) {
         sink.writeln();
         info.writeOn(sink);
diff --git a/pkg/analyzer/tool/experiments/experiments_test.dart b/pkg/analyzer/tool/experiments/experiments_test.dart
index 575c084..1b0e8ec 100644
--- a/pkg/analyzer/tool/experiments/experiments_test.dart
+++ b/pkg/analyzer/tool/experiments/experiments_test.dart
@@ -1,3 +1,4 @@
+// @dart = 2.9
 // Copyright (c) 2019, 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.
diff --git a/pkg/analyzer/tool/experiments/generate.dart b/pkg/analyzer/tool/experiments/generate.dart
index 6e28018..5fc75f1 100644
--- a/pkg/analyzer/tool/experiments/generate.dart
+++ b/pkg/analyzer/tool/experiments/generate.dart
@@ -45,7 +45,7 @@
 class _ExperimentsGenerator {
   final Map experimentsYaml;
 
-  List<String> keysSorted;
+  late List<String> keysSorted;
 
   final out = StringBuffer('''
 //
@@ -57,13 +57,15 @@
 part of 'experiments.dart';
 ''');
 
-  Map<String, dynamic> _features;
+  Map<String, dynamic>? _features;
 
   _ExperimentsGenerator(this.experimentsYaml);
 
   Map<String, dynamic> get features {
-    if (_features != null) return _features;
-    _features = {};
+    var features = _features;
+    if (features != null) return features;
+
+    features = <String, dynamic>{};
     Map yamlFeatures = experimentsYaml['features'];
     for (MapEntry entry in yamlFeatures.entries) {
       String category = entry.value['category'] ?? 'language';
@@ -72,10 +74,10 @@
         // possibly allow e.g. 'analyzer' etc.
         continue;
       }
-      _features[entry.key] = entry.value;
+      features[entry.key] = entry.value;
     }
 
-    return _features;
+    return _features = features;
   }
 
   void generateFormatCode() {
diff --git a/pkg/analyzer/tool/messages/generate.dart b/pkg/analyzer/tool/messages/generate.dart
index fb3bfe7..80b9579 100644
--- a/pkg/analyzer/tool/messages/generate.dart
+++ b/pkg/analyzer/tool/messages/generate.dart
@@ -1,3 +1,4 @@
+// @dart = 2.9
 /// This file contains code to generate scanner and parser message
 /// based on the information in pkg/front_end/messages.yaml.
 ///
diff --git a/pkg/analyzer/tool/summary/build_sdk_summaries.dart b/pkg/analyzer/tool/summary/build_sdk_summaries.dart
index 9d76bc7..746feb2 100644
--- a/pkg/analyzer/tool/summary/build_sdk_summaries.dart
+++ b/pkg/analyzer/tool/summary/build_sdk_summaries.dart
@@ -11,7 +11,7 @@
 void main(List<String> args) {
   String command;
   String outFilePath;
-  String sdkPath;
+  String? sdkPath;
   if (args.length == 2) {
     command = args[0];
     outFilePath = args[1];
diff --git a/pkg/analyzer/tool/summary/check_test.dart b/pkg/analyzer/tool/summary/check_test.dart
index a5d0473..24ca23e 100644
--- a/pkg/analyzer/tool/summary/check_test.dart
+++ b/pkg/analyzer/tool/summary/check_test.dart
@@ -1,3 +1,4 @@
+// @dart = 2.9
 // Copyright (c) 2015, 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.
diff --git a/pkg/analyzer/tool/summary/generate.dart b/pkg/analyzer/tool/summary/generate.dart
index 3bba6a2..cb5beab 100644
--- a/pkg/analyzer/tool/summary/generate.dart
+++ b/pkg/analyzer/tool/summary/generate.dart
@@ -1,3 +1,4 @@
+// @dart = 2.9
 // Copyright (c) 2015, 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.
@@ -114,6 +115,11 @@
     }
   }
 
+  /// Return the nullable [encodedType] of the [type].
+  String encodedType2(idl_model.FieldType type) {
+    return encodedType(type) + '?';
+  }
+
   /// Add the prefix `idl.` to a type name, unless that type name is the name of
   /// a built-in type.
   String idlPrefix(String s) {
@@ -173,6 +179,10 @@
     return allVariants.toList()..sort();
   }
 
+  bool _isNullable(idl_model.FieldType type) {
+    return !type.isList && _idl.classes.containsKey(type.typeName);
+  }
+
   String _variantAssertStatement(
     idl_model.ClassDeclaration class_,
     idl_model.LogicalProperty property,
@@ -229,8 +239,8 @@
         });
         out('} else {');
         indent(() {
-          out('signature.addInt($ref.length);');
-          out('for (var x in $ref) {');
+          out('signature.addInt($ref!.length);');
+          out('for (var x in $ref!) {');
           indent(() {
             _generateSignatureCall(type.typeName, 'x', false);
           });
@@ -297,7 +307,7 @@
             for (var logicalName in field.logicalProperties.keys) {
               var logicalProperty = field.logicalProperties[logicalName];
               if (logicalProperty.variants.contains(variant)) {
-                out('${encodedType(field.type)} $logicalName,');
+                out('${encodedType2(field.type)} $logicalName,');
               }
             }
           }
@@ -339,7 +349,7 @@
     for (idl_model.FieldDeclaration field in cls.fields) {
       String fieldName = field.name;
       idl_model.FieldType type = field.type;
-      String typeStr = encodedType(type);
+      String typeStr = encodedType2(type);
       out('$typeStr _$fieldName;');
     }
   }
@@ -355,7 +365,7 @@
         if (fieldType.isList ||
             fieldType.typeName == 'String' ||
             _idl.classes.containsKey(fieldType.typeName)) {
-          out('fb.Offset $offsetName;');
+          out('fb.Offset? $offsetName;');
         }
       }
 
@@ -366,31 +376,32 @@
         String condition;
         String writeCode;
         if (fieldType.isList) {
-          condition = ' || $valueName.isEmpty';
+          condition = ' || $valueName!.isEmpty';
           if (_idl.classes.containsKey(fieldType.typeName)) {
             String itemCode = 'b.finish(fbBuilder)';
-            String listCode = '$valueName.map((b) => $itemCode).toList()';
+            String listCode = '$valueName!.map((b) => $itemCode).toList()';
             writeCode = '$offsetName = fbBuilder.writeList($listCode);';
           } else if (_idl.enums.containsKey(fieldType.typeName)) {
             String itemCode = 'b.index';
-            String listCode = '$valueName.map((b) => $itemCode).toList()';
+            String listCode = '$valueName!.map((b) => $itemCode).toList()';
             writeCode = '$offsetName = fbBuilder.writeListUint8($listCode);';
           } else if (fieldType.typeName == 'bool') {
-            writeCode = '$offsetName = fbBuilder.writeListBool($valueName);';
+            writeCode = '$offsetName = fbBuilder.writeListBool($valueName!);';
           } else if (fieldType.typeName == 'int') {
-            writeCode = '$offsetName = fbBuilder.writeListUint32($valueName);';
+            writeCode = '$offsetName = fbBuilder.writeListUint32($valueName!);';
           } else if (fieldType.typeName == 'double') {
-            writeCode = '$offsetName = fbBuilder.writeListFloat64($valueName);';
+            writeCode =
+                '$offsetName = fbBuilder.writeListFloat64($valueName!);';
           } else {
             assert(fieldType.typeName == 'String');
             String itemCode = 'fbBuilder.writeString(b)';
-            String listCode = '$valueName.map((b) => $itemCode).toList()';
+            String listCode = '$valueName!.map((b) => $itemCode).toList()';
             writeCode = '$offsetName = fbBuilder.writeList($listCode);';
           }
         } else if (fieldType.typeName == 'String') {
-          writeCode = '$offsetName = fbBuilder.writeString($valueName);';
+          writeCode = '$offsetName = fbBuilder.writeString($valueName!);';
         } else if (_idl.classes.containsKey(fieldType.typeName)) {
-          writeCode = '$offsetName = $valueName.finish(fbBuilder);';
+          writeCode = '$offsetName = $valueName!.finish(fbBuilder);';
         }
         if (writeCode != null) {
           if (condition == null) {
@@ -430,7 +441,7 @@
           writeCode = 'fbBuilder.addUint32($index, $valueName);';
         } else if (_idl.enums.containsKey(fieldType.typeName)) {
           condition += ' && $valueName != ${defaultValue(fieldType, true)}';
-          writeCode = 'fbBuilder.addUint8($index, $valueName.index);';
+          writeCode = 'fbBuilder.addUint8($index, $valueName!.index);';
         }
         if (writeCode == null) {
           throw UnimplementedError('Writing type ${fieldType.typeName}');
@@ -529,11 +540,12 @@
           }
         } else {
           out('@override');
-          out('$typeStr get $fieldName => _$fieldName$defSuffix;');
+          var nn = _isNullable(field.type) ? '?' : '';
+          out('$typeStr$nn get $fieldName => _$fieldName$defSuffix;');
         }
         out();
 
-        constructorParams.add('$typeStr $fieldName');
+        constructorParams.add('$typeStr? $fieldName');
 
         outDoc(field.documentation);
 
@@ -550,7 +562,8 @@
             out();
           }
         } else {
-          out('set $fieldName($typeStr value) {');
+          var nn = _isNullable(field.type) ? '?' : '';
+          out('set $fieldName($typeStr$nn value) {');
           indent(() {
             _generateNonNegativeInt(fieldType);
             out('this._$fieldName = value;');
@@ -564,9 +577,9 @@
   void _generateNonNegativeInt(idl_model.FieldType fieldType) {
     if (fieldType.typeName == 'int') {
       if (!fieldType.isList) {
-        out('assert(value == null || value >= 0);');
+        out('assert(value >= 0);');
       } else {
-        out('assert(value == null || value.every((e) => e >= 0));');
+        out('assert(value.every((e) => e >= 0));');
       }
     }
   }
@@ -578,15 +591,17 @@
   void _generateSignatureCall(String typeName, String ref, bool couldBeNull) {
     if (_idl.enums.containsKey(typeName)) {
       if (couldBeNull) {
-        out('signature.addInt($ref == null ? 0 : $ref.index);');
+        out('signature.addInt($ref == null ? 0 : $ref!.index);');
       } else {
         out('signature.addInt($ref.index);');
       }
     } else if (_idl.classes.containsKey(typeName)) {
       if (couldBeNull) {
         out('signature.addBool($ref != null);');
+        out('$ref?.collectApiSignature(signature);');
+      } else {
+        out('$ref.collectApiSignature(signature);');
       }
-      out('$ref?.collectApiSignature(signature);');
     } else {
       switch (typeName) {
         case 'String':
@@ -1196,7 +1211,7 @@
       for (idl_model.FieldDeclaration field in cls.fields) {
         String returnType = _dartType(field.type);
         String fieldName = field.name;
-        out('$returnType _$fieldName;');
+        out('$returnType? _$fieldName;');
       }
       // Write getters.
       for (idl_model.FieldDeclaration field in cls.allFields) {
@@ -1255,20 +1270,26 @@
                 out(_variantAssertStatement(cls, logicalProperty));
                 String readExpr =
                     '$readCode.vTableGet(_bc, _bcOffset, $index, $def)';
-                out('_$fieldName ??= $readExpr;');
-                out('return _$fieldName;');
+                out('return _$fieldName ??= $readExpr;');
               });
               out('}');
               out();
             }
           } else {
             out('@override');
-            out('$returnType get $fieldName {');
+            if (_isNullable(type)) {
+              out('$returnType? get $fieldName {');
+            } else {
+              out('$returnType get $fieldName {');
+            }
             indent(() {
-              String readExpr =
-                  '$readCode.vTableGet(_bc, _bcOffset, $index, $def)';
-              out('_$fieldName ??= $readExpr;');
-              out('return _$fieldName;');
+              String readExpr;
+              if (_isNullable(type)) {
+                readExpr = '$readCode.vTableGetOrNull(_bc, _bcOffset, $index)';
+              } else {
+                readExpr = '$readCode.vTableGet(_bc, _bcOffset, $index, $def)';
+              }
+              out('return _$fieldName ??= $readExpr;');
             });
             out('}');
           }
@@ -1309,7 +1330,8 @@
         }
       }
 
-      String jsonStore(idl_model.FieldType type, String name) {
+      String jsonStore(
+          idl_model.FieldType type, String name, String localName) {
         _StringToString convertItem;
         if (_idl.classes.containsKey(type.typeName)) {
           convertItem = (String name) => '$name.toJson()';
@@ -1323,12 +1345,12 @@
         }
         String convertField;
         if (convertItem == null) {
-          convertField = name;
+          convertField = localName;
         } else if (type.isList) {
-          convertField = '$name.map((_value) =>'
+          convertField = '$localName.map((_value) =>'
               ' ${convertItem('_value')}).toList()';
         } else {
-          convertField = convertItem(name);
+          convertField = convertItem(localName);
         }
         return '_result[${quoted(name)}] = $convertField';
       }
@@ -1349,8 +1371,10 @@
           indent(() {
             for (idl_model.FieldDeclaration field in cls.fields) {
               if (field.logicalProperties == null) {
-                var condition = jsonCondition(field.type, field.name);
-                var storeField = jsonStore(field.type, field.name);
+                var localName = 'local_${field.name}';
+                out('var $localName = ${field.name};');
+                var condition = jsonCondition(field.type, localName);
+                var storeField = jsonStore(field.type, field.name, localName);
                 writeConditionalStatement(condition, storeField);
               }
             }
@@ -1363,8 +1387,11 @@
                     for (var logicalName in logicalProperties.keys) {
                       var logicalProperty = logicalProperties[logicalName];
                       if (logicalProperty.variants.contains(variant)) {
-                        var condition = jsonCondition(field.type, logicalName);
-                        var storeField = jsonStore(field.type, logicalName);
+                        var localName = 'local_${field.name}';
+                        out('var $localName = ${field.name};');
+                        var condition = jsonCondition(field.type, localName);
+                        var storeField =
+                            jsonStore(field.type, logicalName, localName);
                         writeConditionalStatement(condition, storeField);
                       }
                     }
@@ -1377,8 +1404,10 @@
         } else {
           indent(() {
             for (idl_model.FieldDeclaration field in cls.fields) {
-              String condition = jsonCondition(field.type, field.name);
-              String storeField = jsonStore(field.type, field.name);
+              var localName = 'local_${field.name}';
+              out('var $localName = ${field.name};');
+              String condition = jsonCondition(field.type, localName);
+              String storeField = jsonStore(field.type, field.name, localName);
               writeConditionalStatement(condition, storeField);
             }
           });
@@ -1417,7 +1446,7 @@
         out('throw StateError("Unexpected \$${cls.variantField}");');
         out('}');
       } else {
-        out('Map<String, Object> toMap() => {');
+        out('Map<String, Object?> toMap() => {');
         indent(() {
           for (idl_model.FieldDeclaration field in cls.fields) {
             String fieldName = field.name;
diff --git a/pkg/analyzer/tool/summary/idl_model.dart b/pkg/analyzer/tool/summary/idl_model.dart
index 9680760..0b78425 100644
--- a/pkg/analyzer/tool/summary/idl_model.dart
+++ b/pkg/analyzer/tool/summary/idl_model.dart
@@ -5,7 +5,6 @@
 /// This file contains a set of concrete classes representing an in-memory
 /// semantic model of the IDL used to code generate summary serialization and
 /// deserialization code.
-import 'package:meta/meta.dart';
 
 /// Information about a single class defined in the IDL.
 class ClassDeclaration extends Declaration {
@@ -17,20 +16,20 @@
 
   /// If [isTopLevel] is `true` and a file identifier was specified for this
   /// class, the file identifier string.  Otherwise `null`.
-  final String fileIdentifier;
+  final String? fileIdentifier;
 
   /// Indicates whether the class has the `deprecated` annotation.
   final bool isDeprecated;
 
-  final String variantField;
+  final String? variantField;
 
   ClassDeclaration({
-    @required String documentation,
-    @required this.fileIdentifier,
-    @required String name,
-    @required this.isDeprecated,
-    @required this.isTopLevel,
-    @required this.variantField,
+    required String? documentation,
+    required this.fileIdentifier,
+    required String name,
+    required this.isDeprecated,
+    required this.isTopLevel,
+    required this.variantField,
   }) : super(documentation, name);
 
   /// Get the non-deprecated fields defined in the class.
@@ -41,7 +40,7 @@
 /// Information about a declaration in the IDL.
 class Declaration {
   /// The optional documentation, may be `null`.
-  final String documentation;
+  final String? documentation;
 
   /// The name of the declaration.
   final String name;
@@ -54,13 +53,13 @@
   /// List of enumerated values.
   final List<EnumValueDeclaration> values = <EnumValueDeclaration>[];
 
-  EnumDeclaration(String documentation, String name)
+  EnumDeclaration(String? documentation, String name)
       : super(documentation, name);
 }
 
 /// Information about a single enum value defined in the IDL.
 class EnumValueDeclaration extends Declaration {
-  EnumValueDeclaration(String documentation, String name)
+  EnumValueDeclaration(String? documentation, String name)
       : super(documentation, name);
 }
 
@@ -79,16 +78,16 @@
   final bool isInformative;
 
   /// Maps logical property names to logical property.
-  final Map<String, LogicalProperty> logicalProperties;
+  final Map<String, LogicalProperty>? logicalProperties;
 
   FieldDeclaration({
-    @required String documentation,
-    @required String name,
-    @required this.type,
-    @required this.id,
-    @required this.isDeprecated,
-    @required this.isInformative,
-    @required this.logicalProperties,
+    required String? documentation,
+    required String name,
+    required this.type,
+    required this.id,
+    required this.isDeprecated,
+    required this.isInformative,
+    required this.logicalProperties,
   }) : super(documentation, name);
 }
 
@@ -143,8 +142,8 @@
   final List<String> variants;
 
   LogicalProperty({
-    @required this.isDeprecated,
-    @required this.isInformative,
-    @required this.variants,
+    required this.isDeprecated,
+    required this.isInformative,
+    required this.variants,
   });
 }
diff --git a/pkg/analyzer/tool/summary/mini_ast.dart b/pkg/analyzer/tool/summary/mini_ast.dart
index 356e81f..a81c33c 100644
--- a/pkg/analyzer/tool/summary/mini_ast.dart
+++ b/pkg/analyzer/tool/summary/mini_ast.dart
@@ -12,15 +12,16 @@
 import 'package:_fe_analyzer_shared/src/parser/stack_listener.dart';
 import 'package:_fe_analyzer_shared/src/scanner/token.dart';
 import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:collection/collection.dart';
 import 'package:pub_semver/pub_semver.dart';
 
 /// "Mini AST" representation of a declaration which can accept annotations.
 class AnnotatedNode {
-  final Comment documentationComment;
+  final Comment? documentationComment;
 
   final List<Annotation> metadata;
 
-  AnnotatedNode(this.documentationComment, List<Annotation> metadata)
+  AnnotatedNode(this.documentationComment, List<Annotation>? metadata)
       : metadata = metadata ?? const [];
 }
 
@@ -28,9 +29,9 @@
 class Annotation {
   final String name;
 
-  final String constructorName;
+  final String? constructorName;
 
-  final List<Expression> arguments;
+  final List<Expression>? arguments;
 
   Annotation(this.name, this.constructorName, this.arguments);
 }
@@ -43,14 +44,14 @@
 
   final List<ClassMember> members;
 
-  ClassDeclaration(Comment documentationComment, List<Annotation> metadata,
+  ClassDeclaration(Comment? documentationComment, List<Annotation>? metadata,
       this.name, this.superclass, this.members)
       : super(documentationComment, metadata);
 }
 
 /// "Mini AST" representation of a class member.
 class ClassMember extends AnnotatedNode {
-  ClassMember(Comment documentationComment, List<Annotation> metadata)
+  ClassMember(Comment? documentationComment, List<Annotation>? metadata)
       : super(documentationComment, metadata);
 }
 
@@ -63,13 +64,14 @@
   factory Comment(Token commentToken) {
     var tokens = <Token>[];
     bool isDocumentation = false;
-    while (commentToken != null) {
-      if (commentToken.lexeme.startsWith('/**') ||
-          commentToken.lexeme.startsWith('///')) {
+
+    Token? token = commentToken;
+    while (token != null) {
+      if (token.lexeme.startsWith('/**') || token.lexeme.startsWith('///')) {
         isDocumentation = true;
       }
-      tokens.add(commentToken);
-      commentToken = commentToken.next;
+      tokens.add(token);
+      token = token.next;
     }
     return Comment._(isDocumentation, tokens);
   }
@@ -84,7 +86,8 @@
 
 /// "Mini AST" representation of a top level member of a compilation unit.
 class CompilationUnitMember extends AnnotatedNode {
-  CompilationUnitMember(Comment documentationComment, List<Annotation> metadata)
+  CompilationUnitMember(
+      Comment? documentationComment, List<Annotation>? metadata)
       : super(documentationComment, metadata);
 }
 
@@ -93,7 +96,7 @@
   final String name;
 
   ConstructorDeclaration(
-      Comment documentationComment, List<Annotation> metadata, this.name)
+      Comment? documentationComment, List<Annotation>? metadata, this.name)
       : super(documentationComment, metadata);
 }
 
@@ -103,7 +106,7 @@
   final String name;
 
   EnumConstantDeclaration(
-      Comment documentationComment, List<Annotation> metadata, this.name)
+      Comment? documentationComment, List<Annotation> metadata, this.name)
       : super(documentationComment, metadata);
 }
 
@@ -113,7 +116,7 @@
 
   final List<EnumConstantDeclaration> constants;
 
-  EnumDeclaration(Comment documentationComment, List<Annotation> metadata,
+  EnumDeclaration(Comment? documentationComment, List<Annotation>? metadata,
       this.name, this.constants)
       : super(documentationComment, metadata);
 }
@@ -154,7 +157,7 @@
 
   final TypeName returnType;
 
-  MethodDeclaration(Comment documentationComment, List<Annotation> metadata,
+  MethodDeclaration(Comment? documentationComment, List<Annotation>? metadata,
       this.isGetter, this.name, this.returnType)
       : super(documentationComment, metadata);
 }
@@ -167,11 +170,11 @@
   final compilationUnit = CompilationUnit();
 
   @override
-  Uri get uri => null;
+  Uri get uri => throw UnimplementedError();
 
   @override
   void addProblem(Message message, int charOffset, int length,
-      {bool wasHandled = false, List<LocatedMessage> context}) {
+      {bool wasHandled = false, List<LocatedMessage>? context}) {
     internalProblem(message, charOffset, uri);
   }
 
@@ -183,8 +186,9 @@
   @override
   void beginMetadataStar(Token token) {
     debugEvent("beginMetadataStar");
-    if (token.precedingComments != null) {
-      push(Comment(token.precedingComments));
+    var precedingComments = token.precedingComments;
+    if (precedingComments != null) {
+      push(Comment(precedingComments));
     } else {
       push(NullValue.Comments);
     }
@@ -201,7 +205,7 @@
     debugEvent("BinaryExpression");
 
     if (identical('.', token.stringValue)) {
-      var rightOperand = pop();
+      var rightOperand = pop() as String;
       var leftOperand = pop();
       if (leftOperand is String && !leftOperand.contains('.')) {
         push(PrefixedIdentifier(leftOperand, token, rightOperand));
@@ -218,12 +222,12 @@
   @override
   void endClassDeclaration(Token beginToken, Token endToken) {
     debugEvent("ClassDeclaration");
-    List<ClassMember> members = popTypedList();
-    TypeName superclass = pop();
+    var members = popTypedList<ClassMember>() ?? [];
+    var superclass = pop() as TypeName;
     pop(); // Type variables
-    String name = pop();
-    List<Annotation> metadata = popTypedList();
-    Comment comment = pop();
+    var name = pop() as String;
+    var metadata = popTypedList<Annotation>();
+    var comment = pop() as Comment?;
     compilationUnit.declarations
         .add(ClassDeclaration(comment, metadata, name, superclass, members));
   }
@@ -234,24 +238,24 @@
     debugEvent("ClassFactoryMethod");
     pop(); // Body
     pop(); // Type variables
-    String name = pop();
-    List<Annotation> metadata = popTypedList();
-    Comment comment = pop();
+    var name = pop() as String;
+    var metadata = popTypedList() as List<Annotation>?;
+    var comment = pop() as Comment?;
     push(ConstructorDeclaration(comment, metadata, name));
   }
 
   @override
-  void endClassMethod(Token getOrSet, Token beginToken, Token beginParam,
-      Token beginInitializers, Token endToken) {
+  void endClassMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
     debugEvent("Method");
     pop(); // Body
     pop(); // Initializers
     pop(); // Formal parameters
     pop(); // Type variables
-    String name = pop();
-    TypeName returnType = pop();
-    List<Annotation> metadata = popTypedList();
-    Comment comment = pop();
+    var name = pop() as String;
+    var returnType = pop() as TypeName;
+    var metadata = popTypedList<Annotation>();
+    var comment = pop() as Comment?;
     push(MethodDeclaration(
         comment, metadata, getOrSet?.lexeme == 'get', name, returnType));
   }
@@ -261,7 +265,7 @@
       DeclarationKind kind, int memberCount, Token beginToken, Token endToken) {
     debugEvent("ClassOrMixinBody");
     push(popList(memberCount,
-        List<ClassMember>.filled(memberCount, null, growable: true)));
+        List<ClassMember?>.filled(memberCount, null, growable: true)));
   }
 
   @override
@@ -283,14 +287,14 @@
   @override
   void endEnum(Token enumKeyword, Token leftBrace, int count) {
     debugEvent("Enum");
-    List<EnumConstantDeclaration> constants =
-        List.filled(count, null, growable: true);
+    var constants =
+        List<EnumConstantDeclaration?>.filled(count, null, growable: true);
     popList(count, constants);
-    String name = pop();
-    List<Annotation> metadata = popTypedList();
-    Comment comment = pop();
-    compilationUnit.declarations
-        .add(EnumDeclaration(comment, metadata, name, constants));
+    var name = pop() as String;
+    var metadata = popTypedList<Annotation>();
+    var comment = pop() as Comment?;
+    compilationUnit.declarations.add(EnumDeclaration(
+        comment, metadata, name, constants.whereNotNull().toList()));
   }
 
   @override
@@ -301,11 +305,11 @@
 
   @override
   void endFormalParameter(
-      Token thisKeyword,
-      Token periodAfterThis,
+      Token? thisKeyword,
+      Token? periodAfterThis,
       Token nameToken,
-      Token initializerStart,
-      Token initializerEnd,
+      Token? initializerStart,
+      Token? initializerEnd,
       FormalParameterKind kind,
       MemberKind memberKind) {
     debugEvent("FormalParameter");
@@ -322,7 +326,7 @@
   }
 
   @override
-  void endImport(Token importKeyword, Token semicolon) {
+  void endImport(Token importKeyword, Token? semicolon) {
     debugEvent("Import");
     pop(NullValue.Prefix); // Prefix identifier
     pop(); // URI
@@ -341,7 +345,7 @@
   @override
   void endLiteralString(int interpolationCount, Token endToken) {
     super.endLiteralString(interpolationCount, endToken);
-    String value = pop();
+    var value = pop() as String;
     push(StringLiteral(value));
   }
 
@@ -351,13 +355,13 @@
   }
 
   @override
-  void endMetadata(Token beginToken, Token periodBeforeName, Token endToken) {
+  void endMetadata(Token beginToken, Token? periodBeforeName, Token endToken) {
     debugEvent("Metadata");
     inMetadata = false;
-    List arguments = pop();
-    String constructorName = popIfNotNull(periodBeforeName);
+    var arguments = pop() as List?;
+    var constructorName = popIfNotNull(periodBeforeName) as String;
     pop(); // Type arguments
-    String name = pop();
+    var name = pop() as String;
     push(Annotation(name, constructorName,
         arguments == null ? null : arguments.cast<Expression>()));
   }
@@ -365,8 +369,9 @@
   @override
   void endMetadataStar(int count) {
     debugEvent("MetadataStar");
-    push(popList(count, List<Annotation>.filled(count, null, growable: true)) ??
-        NullValue.Metadata);
+    push(
+        popList(count, List<Annotation?>.filled(count, null, growable: true)) ??
+            NullValue.Metadata);
   }
 
   @override
@@ -377,11 +382,11 @@
 
   @override
   void endTopLevelFields(
-      Token externalToken,
-      Token staticToken,
-      Token covariantToken,
-      Token lateToken,
-      Token varFinalOrConst,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
       int count,
       Token beginToken,
       Token endToken) {
@@ -397,11 +402,11 @@
   @override
   void endTypeArguments(int count, Token beginToken, Token endToken) {
     debugEvent("TypeArguments");
-    push(popList(count, List<TypeName>.filled(count, null, growable: true)));
+    push(popList(count, List<TypeName?>.filled(count, null, growable: true)));
   }
 
   @override
-  void handleAsyncModifier(Token asyncToken, Token starToken) {
+  void handleAsyncModifier(Token? asyncToken, Token? starToken) {
     debugEvent("AsyncModifier");
   }
 
@@ -429,8 +434,8 @@
   @override
   void handleIdentifier(Token token, IdentifierContext context) {
     if (context == IdentifierContext.enumValueDeclaration) {
-      List<Annotation> metadata = popTypedList();
-      Comment comment = pop();
+      var metadata = popTypedList() as List<Annotation>;
+      var comment = pop() as Comment?;
       push(EnumConstantDeclaration(comment, metadata, token.lexeme));
     } else {
       push(token.lexeme);
@@ -444,7 +449,7 @@
   }
 
   @override
-  void handleImportPrefix(Token deferredKeyword, Token asKeyword) {
+  void handleImportPrefix(Token? deferredKeyword, Token? asKeyword) {
     debugEvent("ImportPrefix");
     pushIfNull(asKeyword, NullValue.Prefix);
   }
@@ -475,10 +480,10 @@
 
   @override
   void handleLiteralList(
-      int count, Token leftBracket, Token constKeyword, Token rightBracket) {
+      int count, Token leftBracket, Token? constKeyword, Token rightBracket) {
     debugEvent("LiteralList");
 
-    var elements = List<Object>.filled(count, null);
+    var elements = List<Object?>.filled(count, null);
     popList(count, elements);
     pop(); // type arguments
 
@@ -499,8 +504,8 @@
 
   @override
   void handleNamedArgument(Token colon) {
-    var expression = pop();
-    var name = pop();
+    var expression = pop() as Expression;
+    var name = pop() as String;
     push(NamedExpression(name, colon, expression));
   }
 
@@ -536,8 +541,8 @@
   @override
   void handleQualified(Token period) {
     debugEvent("Qualified");
-    String suffix = pop();
-    String prefix = pop();
+    var suffix = pop() as String;
+    var prefix = pop() as String;
     push('$prefix.$suffix');
   }
 
@@ -547,7 +552,7 @@
   }
 
   @override
-  void handleRecoverImport(Token semicolon) {
+  void handleRecoverImport(Token? semicolon) {
     debugEvent("RecoverImport");
     pop(NullValue.Prefix); // Prefix identifier
   }
@@ -567,32 +572,32 @@
   }
 
   @override
-  void handleType(Token beginToken, Token questionMark) {
+  void handleType(Token beginToken, Token? questionMark) {
     debugEvent("Type");
-    reportErrorIfNullableType(questionMark);
-    List<TypeName> typeArguments = popTypedList();
-    String name = pop();
+    // reportErrorIfNullableType(questionMark);
+    var typeArguments = popTypedList<TypeName>();
+    var name = pop() as String;
     push(TypeName(name, typeArguments));
   }
 
   @override
-  internalProblem(Message message, int charOffset, Uri uri) {
+  internalProblem(Message message, int charOffset, Uri? uri) {
     throw UnsupportedError(message.message);
   }
 
-  List popList(int n, List list) {
+  List? popList(int n, List list) {
     if (n == 0) return null;
     return stack.popList(n, list, null);
   }
 
   /// Calls [pop] and creates a list with the appropriate type parameter `T`
   /// from the resulting `List<dynamic>`.
-  List<T> popTypedList<T>() {
-    List list = pop();
+  List<T>? popTypedList<T>() {
+    var list = pop() as List?;
     return list != null ? List<T>.from(list) : null;
   }
 
-  void reportErrorIfNullableType(Token questionMark) {
+  void reportErrorIfNullableType(Token? questionMark) {
     if (questionMark != null) {
       assert(optional('?', questionMark));
       var feature = ExperimentalFeatures.non_nullable;
@@ -630,7 +635,7 @@
 
   @override
   Token parseArgumentsOpt(Token token) {
-    MiniAstBuilder listener = this.listener;
+    var listener = this.listener as MiniAstBuilder;
     if (listener.inMetadata) {
       return super.parseArgumentsOpt(token);
     } else {
@@ -681,7 +686,7 @@
 class TypeName {
   final String name;
 
-  final List<TypeName> typeArguments;
+  final List<TypeName>? typeArguments;
 
   TypeName(this.name, this.typeArguments);
 }
diff --git a/pkg/analyzer/tool/summary/stats.dart b/pkg/analyzer/tool/summary/stats.dart
index 47f58b4..86c0677 100644
--- a/pkg/analyzer/tool/summary/stats.dart
+++ b/pkg/analyzer/tool/summary/stats.dart
@@ -48,7 +48,7 @@
     counts.forEach((Type type, Map<String, int> typeCounts) {
       print(type);
       List<String> keys = typeCounts.keys.toList();
-      keys.sort((String a, String b) => typeCounts[b].compareTo(typeCounts[a]));
+      keys.sort((a, b) => typeCounts[b]!.compareTo(typeCounts[a]!));
       for (String key in keys) {
         print('  $key: ${typeCounts[key]}');
       }
@@ -60,7 +60,7 @@
   void record(SummaryClass obj) {
     Map<String, int> typeCounts =
         counts.putIfAbsent(obj.runtimeType, () => <String, int>{});
-    obj.toMap().forEach((String key, Object value) {
+    obj.toMap().forEach((key, value) {
       if (value == null ||
           value == 0 ||
           value == false ||
@@ -69,14 +69,11 @@
           reflect(value).type.isEnum && (value as dynamic).index == 0) {
         return;
       }
-      if (!typeCounts.containsKey(key)) {
-        typeCounts[key] = 0;
-      }
-      typeCounts[key]++;
+      typeCounts.update(key, (value) => value + 1, ifAbsent: () => 0);
       if (value is SummaryClass) {
         record(value);
       } else if (value is List) {
-        value.forEach((Object element) {
+        value.forEach((element) {
           if (element is SummaryClass) {
             record(element);
           }
diff --git a/pkg/analyzer/tool/test_log_parser/test_log_parser.dart b/pkg/analyzer/tool/test_log_parser/test_log_parser.dart
index bebd6c5..38ddab0 100644
--- a/pkg/analyzer/tool/test_log_parser/test_log_parser.dart
+++ b/pkg/analyzer/tool/test_log_parser/test_log_parser.dart
@@ -1,3 +1,4 @@
+// @dart = 2.9
 // Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
diff --git a/pkg/analyzer_cli/lib/src/analyzer_impl.dart b/pkg/analyzer_cli/lib/src/analyzer_impl.dart
index 4294f1c..20931be 100644
--- a/pkg/analyzer_cli/lib/src/analyzer_impl.dart
+++ b/pkg/analyzer_cli/lib/src/analyzer_impl.dart
@@ -245,7 +245,7 @@
   @override
   void logException(dynamic exception,
       [StackTrace stackTrace,
-      List<InstrumentationServiceAttachment> attachments]) {
+      List<InstrumentationServiceAttachment> attachments = const []]) {
     errorSink.writeln(exception);
     errorSink.writeln(stackTrace);
   }
diff --git a/pkg/analyzer_cli/lib/src/context_cache.dart b/pkg/analyzer_cli/lib/src/context_cache.dart
index 6c0bb25..ee33541 100644
--- a/pkg/analyzer_cli/lib/src/context_cache.dart
+++ b/pkg/analyzer_cli/lib/src/context_cache.dart
@@ -108,8 +108,7 @@
   /// automatically.
   AnalysisOptionsImpl _getAnalysisOptions() {
     var contextOptions = builder.getAnalysisOptions(requestedSourceDirectory,
-            verbosePrint: clOptions.verbose ? verbosePrint : null)
-        as AnalysisOptionsImpl;
+        verbosePrint: clOptions.verbose ? verbosePrint : null);
 
     _buildContextFeatureSet(contextOptions);
     contextOptions.hint = !clOptions.disableHints;
diff --git a/pkg/analyzer_plugin/lib/utilities/completion/relevance.dart b/pkg/analyzer_plugin/lib/utilities/completion/relevance.dart
index 33fc86ea..96f4683 100644
--- a/pkg/analyzer_plugin/lib/utilities/completion/relevance.dart
+++ b/pkg/analyzer_plugin/lib/utilities/completion/relevance.dart
@@ -41,10 +41,6 @@
   /// deferred imported library.
   static const int loadLibrary = 200;
 
-  /// The relevance used when suggesting a member of a class or extension and
-  /// there are no features that can be used to provide a relevance score.
-  static const int member = 500;
-
   /// The relevance used when suggesting a named argument corresponding to a
   /// named parameter that is not required.
   static const int namedArgument = 900;
@@ -55,15 +51,9 @@
   /// The relevance used when suggesting an override of an inherited member.
   static const int override = 750;
 
-  /// The relevance used when suggesting a prefix from an import directive.
-  static const int prefix = 50;
-
   /// The relevance used when suggesting a named argument corresponding to a
   /// named parameter that is required.
   static const int requiredNamedArgument = 950;
-
-  /// The relevance used when suggesting a type parameter.
-  static const int typeParameter = 500;
 }
 
 /// A name scope for constants that are related to the relevance of completion
diff --git a/pkg/analyzer_plugin/test/support/abstract_single_unit.dart b/pkg/analyzer_plugin/test/support/abstract_single_unit.dart
index ca144aa..c46632a 100644
--- a/pkg/analyzer_plugin/test/support/abstract_single_unit.dart
+++ b/pkg/analyzer_plugin/test/support/abstract_single_unit.dart
@@ -93,7 +93,7 @@
     await resolveTestFile();
   }
 
-  Future resolveTestFile() async {
+  Future<void> resolveTestFile() async {
     var result = await resolveFile(testFile);
     testCode = result.content;
     testUnit = result.unit;
diff --git a/pkg/analyzer_plugin/test/utilities/range_factory_test.dart b/pkg/analyzer_plugin/test/utilities/range_factory_test.dart
index 0250c35..3813dd0 100644
--- a/pkg/analyzer_plugin/test/utilities/range_factory_test.dart
+++ b/pkg/analyzer_plugin/test/utilities/range_factory_test.dart
@@ -3,9 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/error/error.dart';
 import 'package:analyzer/source/source_range.dart';
-import 'package:analyzer/src/generated/parser.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
 import 'package:test/test.dart';
@@ -200,9 +198,14 @@
     expect(range.endStart(mainName, mainBody), SourceRange(4, 3));
   }
 
-  void test_error() {
-    var error = AnalysisError(null, 10, 5, ParserErrorCode.CONST_CLASS, []);
-    expect(range.error(error), SourceRange(10, 5));
+  Future<void> test_error() async {
+    addTestSource('''
+class A {}
+const class B {}
+''');
+    var result = await resolveFile(testFile);
+    var error = result.errors.single;
+    expect(range.error(error), SourceRange(11, 5));
   }
 
   Future<void> test_node() async {
diff --git a/pkg/analyzer_utilities/lib/verify_tests.dart b/pkg/analyzer_utilities/lib/verify_tests.dart
index bfe5f35..d6fad18 100644
--- a/pkg/analyzer_utilities/lib/verify_tests.dart
+++ b/pkg/analyzer_utilities/lib/verify_tests.dart
@@ -110,7 +110,11 @@
       var importedFiles = <String>[];
       for (var directive in result.unit.directives) {
         if (directive is ImportDirective) {
-          importedFiles.add(directive.uri.stringValue);
+          var uri = directive.uri.stringValue;
+          if (uri == null) {
+            fail('Invalid URI: $directive');
+          }
+          importedFiles.add(uri);
         }
       }
       var missingFiles = <String>[];
diff --git a/pkg/dev_compiler/lib/js/legacy/dart_library.js b/pkg/dev_compiler/lib/js/legacy/dart_library.js
index ac7b2b2..feb748c 100644
--- a/pkg/dev_compiler/lib/js/legacy/dart_library.js
+++ b/pkg/dev_compiler/lib/js/legacy/dart_library.js
@@ -5,9 +5,9 @@
 // This file defines the module loader for the dart runtime.
 var dart_library;
 if (!dart_library) {
-  dart_library = typeof module != "undefined" && module.exports || {};
+  dart_library = typeof module != 'undefined' && module.exports || {};
 
-  (function (dart_library) {
+  (function(dart_library) {
     'use strict';
 
     // Throws an error related to module loading.
@@ -19,7 +19,7 @@
       // capturing the exception.
       if (!!self.dispatchEvent) {
         self.dispatchEvent(
-          new CustomEvent('dartLoadException', {detail: message}));
+            new CustomEvent('dartLoadException', {detail: message}));
       }
       throw Error(message);
     }
@@ -27,6 +27,48 @@
     const libraryImports = Symbol('libraryImports');
     dart_library.libraryImports = libraryImports;
 
+    const _metrics = Symbol('metrics');
+    const _logMetrics = false;
+
+    // Returns a map from module name to various metrics for module.
+    function metrics() {
+      const map = {};
+      const keys = Array.from(_libraries.keys());
+      for (const key of keys) {
+        const lib = _libraries.get(key);
+        map[lib._name] = lib._library[_metrics];
+      }
+      return map;
+    }
+    dart_library.metrics = metrics;
+
+    function _sortFn(key1, key2) {
+      const t1 = _libraries.get(key1)._library[_metrics].loadTime;
+      const t2 = _libraries.get(key2)._library[_metrics].loadTime;
+      return t1 - t2;
+    }
+
+    // Convenience method to print the metrics in the browser console
+    // in CSV format.
+    function metricsCsv() {
+      let buffer =
+          'Module, JS Size, Dart Size, Load Time, Cumulative JS Size\n';
+      const keys = Array.from(_libraries.keys());
+      keys.sort(_sortFn);
+      let cumulativeJsSize = 0;
+      for (const key of keys) {
+        const lib = _libraries.get(key);
+        const jsSize = lib._library[_metrics].jsSize;
+        cumulativeJsSize += jsSize;
+        const dartSize = lib._library[_metrics].dartSize;
+        const loadTime = lib._library[_metrics].loadTime;
+        buffer += '"' + lib._name + '", ' + jsSize + ', ' + dartSize + ', ' +
+            loadTime + ', ' + cumulativeJsSize + '\n';
+      }
+      return buffer;
+    }
+    dart_library.metricsCsv = metricsCsv;
+
     // Module support.  This is a simplified module system for Dart.
     // Longer term, we can easily migrate to an existing JS module system:
     // ES6, AMD, RequireJS, ....
@@ -34,7 +76,7 @@
     // Returns a proxy that delegates to the underlying loader.
     // This defers loading of a module until a library is actually used.
     const loadedModule = Symbol('loadedModule');
-    dart_library.defer = function (module, name, patch) {
+    dart_library.defer = function(module, name, patch) {
       let done = false;
       function loadDeferred() {
         done = true;
@@ -47,11 +89,11 @@
       // library object should be get (to read a top-level variable, method, or
       // Class) or set (to write a top-level variable).
       return new Proxy({}, {
-        get: function (o, p) {
+        get: function(o, p) {
           if (!done) loadDeferred();
           return module[name][p];
         },
-        set: function (o, p, value) {
+        set: function(o, p, value) {
           if (!done) loadDeferred();
           module[name][p] = value;
           return true;
@@ -60,10 +102,13 @@
     };
 
     let _reverseImports = new Map();
-    class LibraryLoader {
 
-      constructor(name, defaultValue, imports, loader) {
-        imports.forEach(function (i) {
+    // Set of libraries that were not only loaded on the page but also executed.
+    let _executedLibraries = new Set();
+
+    class LibraryLoader {
+      constructor(name, defaultValue, imports, loader, data) {
+        imports.forEach(function(i) {
           let deps = _reverseImports.get(i);
           if (!deps) {
             deps = new Set();
@@ -75,6 +120,9 @@
         this._library = defaultValue ? defaultValue : {};
         this._imports = imports;
         this._loader = loader;
+        data.jsSize = loader.toString().length;
+        data.loadTime = Infinity;
+        this._metrics = data;
 
         // Cyclic import detection
         this._state = LibraryLoader.NOT_LOADED;
@@ -95,6 +143,7 @@
         } else if (this._state >= LibraryLoader.READY) {
           return this._library;
         }
+        _executedLibraries.add(this._name);
         this._state = LibraryLoader.LOADING;
 
         // Handle imports
@@ -106,19 +155,33 @@
 
         library[libraryImports] = this._imports;
         library[loadedModule] = library;
+        library[_metrics] = this._metrics;
         args.unshift(library);
 
         if (this._name == 'dart_sdk') {
           // Eagerly load the SDK.
+          if (!!self.performance) {
+            library[_metrics].loadTime = self.performance.now();
+          }
+          if (_logMetrics) console.time('Load ' + this._name);
           this._loader.apply(null, args);
+          if (_logMetrics) console.timeEnd('Load ' + this._name);
         } else {
           // Load / parse other modules on demand.
           let done = false;
           this._library = new Proxy(library, {
-            get: function (o, name) {
+            get: function(o, name) {
+              if (name == _metrics) {
+                return o[name];
+              }
               if (!done) {
                 done = true;
+                if (!!self.performance) {
+                  library[_metrics].loadTime = self.performance.now();
+                }
+                if (_logMetrics) console.time('Load ' + loader._name);
                 loader._loader.apply(null, args);
+                if (_logMetrics) console.timeEnd('Load ' + loader._name);
               }
               return o[name];
             }
@@ -139,12 +202,12 @@
 
     // Map from name to LibraryLoader
     let _libraries = new Map();
-    dart_library.libraries = function () {
+    dart_library.libraries = function() {
       return _libraries.keys();
     };
-    dart_library.debuggerLibraries = function () {
+    dart_library.debuggerLibraries = function() {
       let debuggerLibraries = [];
-      _libraries.forEach(function (value, key, map) {
+      _libraries.forEach(function(value, key, map) {
         debuggerLibraries.push(value.load());
       });
       debuggerLibraries.__proto__ = null;
@@ -162,42 +225,76 @@
       deps.forEach(_invalidateLibrary);
     }
 
-    function library(name, defaultValue, imports, loader) {
+    function library(name, defaultValue, imports, loader, data = {}) {
       let result = _libraries.get(name);
       if (result) {
         console.log('Re-loading ' + name);
         _invalidateLibrary(name);
       }
-      result = new LibraryLoader(name, defaultValue, imports, loader);
+      result = new LibraryLoader(name, defaultValue, imports, loader, data);
       _libraries.set(name, result);
       return result;
     }
     dart_library.library = library;
 
-    // Maintain a stack of active imports.  If a requested library/module is not
-    // available, print the stack to show where/how it was requested.
-    let _stack = [];
+    // Store executed modules upon reload.
+    if (!!self.addEventListener && !!self.localStorage) {
+      self.addEventListener('beforeunload', function(event) {
+        let libraryCache = {
+          'time': new Date().getTime(),
+          'modules': Array.from(_executedLibraries.keys())
+        };
+        self.localStorage.setItem(
+            'dartLibraryCache', JSON.stringify(libraryCache));
+      });
+    }
+
+    // Map from module name to corresponding proxy library.
+    let _proxyLibs = new Map();
+
     function import_(name) {
-      let lib = _libraries.get(name);
-      if (!lib) {
-        let message = 'Module ' + name + ' not loaded in the browser.';
-        if (_stack != []) {
-          message += '\nDependency via:';
-          let indent = '';
-          for (let last = _stack.length - 1; last >= 0; last--) {
-            indent += ' ';
-            message += '\n' + indent + '- ' + _stack[last];
+      let proxy = _proxyLibs.get(name);
+      if (proxy) return proxy;
+      let proxyLib = new Proxy({}, {
+        get: function(o, p) {
+          let lib = _libraries.get(name);
+          if (self.$dartJITModules) {
+            // The backing module changed so update the reference
+            if (!lib) {
+              let xhr = new XMLHttpRequest();
+              let sourceURL = $dartLoader.moduleIdToUrl.get(name);
+              xhr.open('GET', sourceURL, false);
+              xhr.withCredentials = true;
+              xhr.send();
+              // Append sourceUrl so the resource shows up in the Chrome
+              // console.
+              eval(xhr.responseText + '//@ sourceURL=' + sourceURL);
+              lib = _libraries.get(name);
+            }
           }
+          if (!lib) {
+            throwLibraryError('Module ' + name + ' not loaded in the browser.');
+          }
+          // Always load the library before accessing a property as it may have
+          // been invalidated.
+          return lib.load()[p];
         }
-        throwLibraryError(message);
-      }
-      _stack.push(name);
-      let result = lib.load();
-      _stack.pop();
-      return result;
+      });
+      _proxyLibs.set(name, proxyLib);
+      return proxyLib;
     }
     dart_library.import = import_;
 
+    // Removes the corresponding library and invalidates all things that
+    // depend on it.
+    function _invalidateImport(name) {
+      let lib = _libraries.get(name);
+      if (!lib) return;
+      _invalidateLibrary(name);
+      _libraries.delete(name);
+    }
+    dart_library.invalidateImport = _invalidateImport;
+
     let _debuggerInitialized = false;
 
     // Called to initiate a hot restart of the application.
@@ -224,8 +321,8 @@
     // 5. `$dartWarmReload` calls the callback to rerun main.
     //
     function reload(clearState) {
-      // TODO(jmesserly): once we've rolled out `clearState` make it the default,
-      // and eventually remove the parameter.
+      // TODO(jmesserly): once we've rolled out `clearState` make it the
+      // default, and eventually remove the parameter.
       if (clearState == null) clearState = true;
 
 
@@ -234,7 +331,8 @@
       // "hot reload" refers to keeping the application state and attempting to
       // patch the code for the application while it is executing
       // (https://flutter.io/hot-reload/), whereas "hot restart" refers to what
-      // dartdevc supports: tear down the app, update the code, and rerun the app.
+      // dartdevc supports: tear down the app, update the code, and rerun the
+      // app.
       if (!self || !self.$dartWarmReload) {
         console.warn('Hot restart not supported in this environment.');
         return;
@@ -246,7 +344,7 @@
         result = _lastLibrary.onReloadStart();
       }
 
-      let sdk = _libraries.get("dart_sdk");
+      let sdk = _libraries.get('dart_sdk');
 
       /// Once the `onReloadStart()` completes, this finishes the restart.
       function finishHotRestart() {
@@ -254,7 +352,7 @@
         if (clearState) {
           // This resets all initialized fields and clears type caches and other
           // temporary data structures used by the compiler/SDK.
-          sdk.dart.hotRestart();
+          sdk._library.dart.hotRestart();
         }
         // Call the module loader to reload the necessary modules.
         self.$dartWarmReload(() => {
@@ -317,6 +415,5 @@
       library.main([]);
     }
     dart_library.start = start;
-
   })(dart_library);
 }
diff --git a/pkg/dev_compiler/tool/ddb b/pkg/dev_compiler/tool/ddb
index a87d416..56321d5 100755
--- a/pkg/dev_compiler/tool/ddb
+++ b/pkg/dev_compiler/tool/ddb
@@ -336,12 +336,20 @@
 sdk.dart.weakNullSafetyErrors($weakNullSafetyErrors);
 sdk.dart.nonNullAsserts($nonNullAsserts);
 sdk.dart.nativeNonNullAsserts($nativeNonNullAsserts);
-dart_library.start('$basename', '$libname');
+
+// Invoke main through the d8 preamble to ensure the code is running
+// within the fake event loop.
+self.dartMainRunner(function () {
+  dart_library.start("$basename", "$libname");
+});
 ''';
+      var dart2jsD8Preamble =
+          '$sdkRoot/sdk/lib/_internal/js_runtime/lib/preambles/d8.js';
       var d8File = p.setExtension(out, '.d8.js');
       File(d8File).writeAsStringSync(runjs);
       var d8Binary = binary ?? p.join(dartCheckoutPath, _d8executable);
-      var process = await startProcess('D8', d8Binary, [d8File]);
+      var process =
+          await startProcess('D8', d8Binary, [dart2jsD8Preamble, d8File]);
       if (await process.exitCode != 0) exit(await process.exitCode);
     }
   }
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
index 8b6464e..64ce647 100644
--- a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
@@ -989,9 +989,21 @@
         findGenericFunctionTypes(formal.type, result: result);
       }
     }
-  } else if (type is NamedTypeBuilder && type.arguments != null) {
-    for (TypeBuilder argument in type.arguments) {
-      findGenericFunctionTypes(argument, result: result);
+  } else if (type is NamedTypeBuilder) {
+    if (type.arguments != null) {
+      for (TypeBuilder argument in type.arguments) {
+        findGenericFunctionTypes(argument, result: result);
+      }
+    }
+
+    TypeDeclarationBuilder declaration = type.declaration;
+    if (declaration is TypeAliasBuilder) {
+      TypeBuilder rhsType = declaration.type;
+      if (rhsType is FunctionTypeBuilder &&
+          rhsType.typeVariables != null &&
+          rhsType.typeVariables.isNotEmpty) {
+        result.add(type);
+      }
     }
   }
 }
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 39531a8..23d1fea 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -18,45 +18,7 @@
 import 'package:front_end/src/fasta/dill/dill_library_builder.dart'
     show DillLibraryBuilder;
 
-import 'package:kernel/ast.dart'
-    show
-        Arguments,
-        AsyncMarker,
-        Class,
-        Constructor,
-        ConstructorInvocation,
-        DartType,
-        DynamicType,
-        Expression,
-        Extension,
-        Field,
-        FunctionNode,
-        InterfaceType,
-        InvalidType,
-        Library,
-        LibraryDependency,
-        LibraryPart,
-        ListLiteral,
-        MapLiteral,
-        Member,
-        Name,
-        NeverType,
-        NonNullableByDefaultCompiledMode,
-        NullType,
-        Nullability,
-        Procedure,
-        ProcedureKind,
-        Reference,
-        SetLiteral,
-        StaticInvocation,
-        StringLiteral,
-        Supertype,
-        TypeParameter,
-        TypeParameterType,
-        Typedef,
-        VariableDeclaration,
-        Version,
-        VoidType;
+import 'package:kernel/ast.dart' hide Combinator, MapEntry;
 
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 
@@ -2956,7 +2918,10 @@
 
   int finishTypeVariables(ClassBuilder object, TypeBuilder dynamicType) {
     int count = boundlessTypeVariables.length;
-    for (TypeVariableBuilder builder in boundlessTypeVariables) {
+    // Ensure that type parameters are built after their dependencies by sorting
+    // them topologically using references in bounds.
+    for (TypeVariableBuilder builder
+        in _sortTypeVariablesTopologically(boundlessTypeVariables)) {
       builder.finish(this, object, dynamicType);
     }
     boundlessTypeVariables.clear();
@@ -3734,8 +3699,13 @@
         declaration.checkTypesInOutline(typeEnvironment);
       } else if (declaration is SourceExtensionBuilder) {
         declaration.checkTypesInOutline(typeEnvironment);
+      } else if (declaration is SourceTypeAliasBuilder) {
+        declaration.checkTypesInOutline(typeEnvironment);
       } else {
-        //assert(false, "Unexpected declaration ${declaration.runtimeType}");
+        assert(
+            declaration is! TypeDeclarationBuilder ||
+                declaration is BuiltinTypeDeclarationBuilder,
+            "Unexpected declaration ${declaration.runtimeType}");
       }
     }
     inferredTypes.clear();
@@ -4176,3 +4146,77 @@
     return 'ImplicitLanguageVersion(version=$version)';
   }
 }
+
+List<TypeVariableBuilder> _sortTypeVariablesTopologically(
+    List<TypeVariableBuilder> typeVariables) {
+  Set<TypeVariableBuilder> unhandled = new Set<TypeVariableBuilder>.identity()
+    ..addAll(typeVariables);
+  List<TypeVariableBuilder> result = <TypeVariableBuilder>[];
+  while (unhandled.isNotEmpty) {
+    TypeVariableBuilder rootVariable = unhandled.first;
+    unhandled.remove(rootVariable);
+    if (rootVariable.bound != null) {
+      _sortTypeVariablesTopologicallyFromRoot(
+          rootVariable.bound, unhandled, result);
+    }
+    result.add(rootVariable);
+  }
+  return result;
+}
+
+void _sortTypeVariablesTopologicallyFromRoot(TypeBuilder root,
+    Set<TypeVariableBuilder> unhandled, List<TypeVariableBuilder> result) {
+  assert(root != null);
+
+  List<TypeVariableBuilder> typeVariables;
+  List<TypeBuilder> internalDependents;
+
+  if (root is NamedTypeBuilder) {
+    TypeDeclarationBuilder declaration = root.declaration;
+    if (declaration is ClassBuilder) {
+      if (declaration.typeVariables != null &&
+          declaration.typeVariables.isNotEmpty) {
+        typeVariables = declaration.typeVariables;
+      }
+    } else if (declaration is TypeAliasBuilder) {
+      if (declaration.typeVariables != null &&
+          declaration.typeVariables.isNotEmpty) {
+        typeVariables = declaration.typeVariables;
+      }
+      internalDependents = <TypeBuilder>[declaration.type];
+    } else if (declaration is TypeVariableBuilder) {
+      typeVariables = <TypeVariableBuilder>[declaration];
+    }
+  } else if (root is FunctionTypeBuilder) {
+    if (root.typeVariables != null && root.typeVariables.isNotEmpty) {
+      typeVariables = root.typeVariables;
+    }
+    if (root.formals != null && root.formals.isNotEmpty) {
+      internalDependents = <TypeBuilder>[];
+      for (FormalParameterBuilder formal in root.formals) {
+        internalDependents.add(formal.type);
+      }
+    }
+    if (root.returnType != null) {
+      (internalDependents ??= <TypeBuilder>[]).add(root.returnType);
+    }
+  }
+
+  if (typeVariables != null && typeVariables.isNotEmpty) {
+    for (TypeVariableBuilder variable in typeVariables) {
+      if (unhandled.contains(variable)) {
+        unhandled.remove(variable);
+        if (variable.bound != null) {
+          _sortTypeVariablesTopologicallyFromRoot(
+              variable.bound, unhandled, result);
+        }
+        result.add(variable);
+      }
+    }
+  }
+  if (internalDependents != null && internalDependents.isNotEmpty) {
+    for (TypeBuilder type in internalDependents) {
+      _sortTypeVariablesTopologicallyFromRoot(type, unhandled, result);
+    }
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart b/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart
index dc61bf9..5f1a2d2 100644
--- a/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart
@@ -20,6 +20,8 @@
 import 'package:kernel/type_algebra.dart'
     show FreshTypeParameters, getFreshTypeParameters;
 
+import 'package:kernel/type_environment.dart';
+
 import '../fasta_codes.dart'
     show noLength, templateCyclicTypedef, templateTypeArgumentMismatch;
 
@@ -62,6 +64,9 @@
         super(metadata, name, parent, charOffset);
 
   @override
+  SourceLibraryBuilder get library => super.library;
+
+  @override
   List<TypeVariableBuilder> get typeVariables => _typeVariables;
 
   @override
@@ -224,4 +229,11 @@
     }
     return result;
   }
+
+  void checkTypesInOutline(TypeEnvironment typeEnvironment) {
+    library.checkBoundsInTypeParameters(
+        typeEnvironment, typedef.typeParameters, fileUri);
+    library.checkBoundsInType(
+        typedef.type, typeEnvironment, fileUri, type?.charOffset ?? charOffset);
+  }
 }
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_26810_and.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_26810_and.dart.intertwined.expect
index 9abec744..ddb9ae4 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_26810_and.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_26810_and.dart.intertwined.expect
@@ -402,6 +402,7 @@
                                 listener: handleSend(hashCode, and)
                           listener: handleEndingBinaryExpression(.)
                           rewriter()
+                          rewriter()
                         listener: endBinaryExpression(+)
                         rewriter()
                         parsePrecedenceExpression(&, 12, true)
@@ -593,6 +594,7 @@
                                     listener: handleSend(hashCode, and)
                               listener: handleEndingBinaryExpression(.)
                               rewriter()
+                              rewriter()
                             listener: endBinaryExpression(+)
                             rewriter()
                             parsePrecedenceExpression(&, 12, true)
@@ -1432,6 +1434,7 @@
                                     listener: handleNoArguments(and)
                                   listener: handleSend(x, and)
                           rewriter()
+                          rewriter()
                         listener: endBinaryExpression(+)
                         rewriter()
                         parsePrecedenceExpression(&, 12, true)
@@ -1647,6 +1650,7 @@
                                         listener: handleNoArguments(and)
                                       listener: handleSend(x, and)
                               rewriter()
+                              rewriter()
                             listener: endBinaryExpression(+)
                             rewriter()
                             parsePrecedenceExpression(&, 12, true)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_26810_or.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_26810_or.dart.intertwined.expect
index 60507f0..38f516b 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_26810_or.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_26810_or.dart.intertwined.expect
@@ -402,6 +402,7 @@
                                 listener: handleSend(hashCode, or)
                           listener: handleEndingBinaryExpression(.)
                           rewriter()
+                          rewriter()
                         listener: endBinaryExpression(+)
                         rewriter()
                         parsePrecedenceExpression(|, 10, true)
@@ -593,6 +594,7 @@
                                     listener: handleSend(hashCode, or)
                               listener: handleEndingBinaryExpression(.)
                               rewriter()
+                              rewriter()
                             listener: endBinaryExpression(+)
                             rewriter()
                             parsePrecedenceExpression(|, 10, true)
@@ -1432,6 +1434,7 @@
                                     listener: handleNoArguments(or)
                                   listener: handleSend(x, or)
                           rewriter()
+                          rewriter()
                         listener: endBinaryExpression(+)
                         rewriter()
                         parsePrecedenceExpression(|, 10, true)
@@ -1647,6 +1650,7 @@
                                         listener: handleNoArguments(or)
                                       listener: handleSend(x, or)
                               rewriter()
+                              rewriter()
                             listener: endBinaryExpression(+)
                             rewriter()
                             parsePrecedenceExpression(|, 10, true)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_44785.crash_dart b/pkg/front_end/parser_testcases/error_recovery/issue_44785.crash_dart
new file mode 100644
index 0000000..5ba8b65
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_44785.crash_dart
@@ -0,0 +1,11 @@
+foo(int a, int b){
+  if (a == null or b == null){
+    return null
+  }
+}
+
+bar(int a, int b){
+  if (a == null and b == null){
+    return null
+  }
+}
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_44785.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_44785.crash_dart.expect
new file mode 100644
index 0000000..10ad30c
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_44785.crash_dart.expect
@@ -0,0 +1,140 @@
+Problems reported:
+
+parser/error_recovery/issue_44785.crash:2:17: Binary operator 'or' is written as '||' instead of the written out word.
+  if (a == null or b == null){
+                ^^
+
+parser/error_recovery/issue_44785.crash:3:12: Expected ';' after this.
+    return null
+           ^^^^
+
+parser/error_recovery/issue_44785.crash:8:17: Binary operator 'and' is written as '&&' instead of the written out word.
+  if (a == null and b == null){
+                ^^^
+
+parser/error_recovery/issue_44785.crash:9:12: Expected ';' after this.
+    return null
+           ^^^^
+
+beginCompilationUnit(foo)
+  beginMetadataStar(foo)
+  endMetadataStar(0)
+  beginTopLevelMember(foo)
+    beginTopLevelMethod(, null)
+      handleNoType()
+      handleIdentifier(foo, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+        beginMetadataStar(int)
+        endMetadataStar(0)
+        beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(a)
+          handleType(int, null)
+          handleIdentifier(a, formalParameterDeclaration)
+          handleFormalParameterWithoutValue(,)
+        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        beginMetadataStar(int)
+        endMetadataStar(0)
+        beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(b)
+          handleType(int, null)
+          handleIdentifier(b, formalParameterDeclaration)
+          handleFormalParameterWithoutValue())
+        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+      endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+        beginIfStatement(if)
+          handleIdentifier(a, expression)
+          handleNoTypeArguments(==)
+          handleNoArguments(==)
+          handleSend(a, ==)
+          beginBinaryExpression(==)
+            handleLiteralNull(null)
+          endBinaryExpression(==)
+          handleRecoverableError(Message[BinaryOperatorWrittenOut, Binary operator 'or' is written as '||' instead of the written out word., Try replacing 'or' with '||'., {string: or, string2: ||}], or, or)
+          beginBinaryExpression(||)
+            handleIdentifier(b, expression)
+            handleNoTypeArguments(==)
+            handleNoArguments(==)
+            handleSend(b, ==)
+            beginBinaryExpression(==)
+              handleLiteralNull(null)
+            endBinaryExpression(==)
+          endBinaryExpression(||)
+          handleParenthesizedCondition(()
+          beginThenStatement({)
+            beginBlock({, BlockKind(statement))
+              beginReturnStatement(return)
+                handleLiteralNull(null)
+                handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], null, null)
+              endReturnStatement(true, return, ;)
+            endBlock(1, {, }, BlockKind(statement))
+          endThenStatement(})
+        endIfStatement(if, null)
+      endBlockFunctionBody(1, {, })
+    endTopLevelMethod(foo, null, })
+  endTopLevelDeclaration(bar)
+  beginMetadataStar(bar)
+  endMetadataStar(0)
+  beginTopLevelMember(bar)
+    beginTopLevelMethod(}, null)
+      handleNoType(})
+      handleIdentifier(bar, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+        beginMetadataStar(int)
+        endMetadataStar(0)
+        beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(a)
+          handleType(int, null)
+          handleIdentifier(a, formalParameterDeclaration)
+          handleFormalParameterWithoutValue(,)
+        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        beginMetadataStar(int)
+        endMetadataStar(0)
+        beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(b)
+          handleType(int, null)
+          handleIdentifier(b, formalParameterDeclaration)
+          handleFormalParameterWithoutValue())
+        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+      endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+        beginIfStatement(if)
+          handleIdentifier(a, expression)
+          handleNoTypeArguments(==)
+          handleNoArguments(==)
+          handleSend(a, ==)
+          beginBinaryExpression(==)
+            handleLiteralNull(null)
+          endBinaryExpression(==)
+          handleRecoverableError(Message[BinaryOperatorWrittenOut, Binary operator 'and' is written as '&&' instead of the written out word., Try replacing 'and' with '&&'., {string: and, string2: &&}], and, and)
+          beginBinaryExpression(&&)
+            handleIdentifier(b, expression)
+            handleNoTypeArguments(==)
+            handleNoArguments(==)
+            handleSend(b, ==)
+            beginBinaryExpression(==)
+              handleLiteralNull(null)
+            endBinaryExpression(==)
+          endBinaryExpression(&&)
+          handleParenthesizedCondition(()
+          beginThenStatement({)
+            beginBlock({, BlockKind(statement))
+              beginReturnStatement(return)
+                handleLiteralNull(null)
+                handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], null, null)
+              endReturnStatement(true, return, ;)
+            endBlock(1, {, }, BlockKind(statement))
+          endThenStatement(})
+        endIfStatement(if, null)
+      endBlockFunctionBody(1, {, })
+    endTopLevelMethod(bar, null, })
+  endTopLevelDeclaration()
+endCompilationUnit(2, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_44785.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_44785.crash_dart.intertwined.expect
new file mode 100644
index 0000000..cc1365f
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_44785.crash_dart.intertwined.expect
@@ -0,0 +1,308 @@
+parseUnit(foo)
+  skipErrorTokens(foo)
+  listener: beginCompilationUnit(foo)
+  syntheticPreviousToken(foo)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(foo)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl()
+      listener: beginTopLevelMember(foo)
+      isReservedKeyword(()
+      parseTopLevelMethod(, null, , Instance of 'NoType', null, foo, false)
+        listener: beginTopLevelMethod(, null)
+        listener: handleNoType()
+        ensureIdentifierPotentiallyRecovered(, topLevelFunctionDeclaration, false)
+          listener: handleIdentifier(foo, topLevelFunctionDeclaration)
+        parseMethodTypeVar(foo)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(foo, foo, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(foo, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                parseMetadataStar(()
+                  listener: beginMetadataStar(int)
+                  listener: endMetadataStar(0)
+                listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+                listener: handleIdentifier(int, typeReference)
+                listener: handleNoTypeArguments(a)
+                listener: handleType(int, null)
+                ensureIdentifier(int, formalParameterDeclaration)
+                  listener: handleIdentifier(a, formalParameterDeclaration)
+                listener: handleFormalParameterWithoutValue(,)
+                listener: endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+              parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                parseMetadataStar(,)
+                  listener: beginMetadataStar(int)
+                  listener: endMetadataStar(0)
+                listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+                listener: handleIdentifier(int, typeReference)
+                listener: handleNoTypeArguments(b)
+                listener: handleType(int, null)
+                ensureIdentifier(int, formalParameterDeclaration)
+                  listener: handleIdentifier(b, formalParameterDeclaration)
+                listener: handleFormalParameterWithoutValue())
+                listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, if)
+          parseStatement({)
+            parseStatementX({)
+              parseIfStatement({)
+                listener: beginIfStatement(if)
+                ensureParenthesizedCondition(if)
+                  parseExpressionInParenthesisRest(()
+                    parseExpression(()
+                      parsePrecedenceExpression((, 1, true)
+                        parseUnaryExpression((, true)
+                          parsePrimary((, expression)
+                            parseSendOrFunctionLiteral((, expression)
+                              parseSend((, expression)
+                                ensureIdentifier((, expression)
+                                  listener: handleIdentifier(a, expression)
+                                listener: handleNoTypeArguments(==)
+                                parseArgumentsOpt(a)
+                                  listener: handleNoArguments(==)
+                                listener: handleSend(a, ==)
+                        listener: beginBinaryExpression(==)
+                        parsePrecedenceExpression(==, 8, true)
+                          parseUnaryExpression(==, true)
+                            parsePrimary(==, expression)
+                              parseLiteralNull(==)
+                                listener: handleLiteralNull(null)
+                          rewriter()
+                          parsePrecedenceExpression(|, 10, true)
+                            parseUnaryExpression(|, true)
+                              parsePrimary(|, expression)
+                                parseSendOrFunctionLiteral(|, expression)
+                                  parseSend(|, expression)
+                                    ensureIdentifier(|, expression)
+                                    parseArgumentsOpt(b)
+                          rewriter()
+                        listener: endBinaryExpression(==)
+                        rewriter()
+                        parsePrecedenceExpression(||, 6, true)
+                          parseUnaryExpression(||, true)
+                            parsePrimary(||, expression)
+                              parseSendOrFunctionLiteral(||, expression)
+                                parseSend(||, expression)
+                                  ensureIdentifier(||, expression)
+                                  parseArgumentsOpt(b)
+                          parsePrecedenceExpression(==, 8, true)
+                            parseUnaryExpression(==, true)
+                              parsePrimary(==, expression)
+                                parseLiteralNull(==)
+                        reportRecoverableError(or, Message[BinaryOperatorWrittenOut, Binary operator 'or' is written as '||' instead of the written out word., Try replacing 'or' with '||'., {string: or, string2: ||}])
+                          listener: handleRecoverableError(Message[BinaryOperatorWrittenOut, Binary operator 'or' is written as '||' instead of the written out word., Try replacing 'or' with '||'., {string: or, string2: ||}], or, or)
+                        rewriter()
+                        listener: beginBinaryExpression(||)
+                        parsePrecedenceExpression(||, 6, true)
+                          parseUnaryExpression(||, true)
+                            parsePrimary(||, expression)
+                              parseSendOrFunctionLiteral(||, expression)
+                                parseSend(||, expression)
+                                  ensureIdentifier(||, expression)
+                                    listener: handleIdentifier(b, expression)
+                                  listener: handleNoTypeArguments(==)
+                                  parseArgumentsOpt(b)
+                                    listener: handleNoArguments(==)
+                                  listener: handleSend(b, ==)
+                          listener: beginBinaryExpression(==)
+                          parsePrecedenceExpression(==, 8, true)
+                            parseUnaryExpression(==, true)
+                              parsePrimary(==, expression)
+                                parseLiteralNull(==)
+                                  listener: handleLiteralNull(null)
+                          listener: endBinaryExpression(==)
+                        listener: endBinaryExpression(||)
+                    ensureCloseParen(null, ()
+                  listener: handleParenthesizedCondition(()
+                listener: beginThenStatement({)
+                parseStatement())
+                  parseStatementX())
+                    parseBlock(), BlockKind(statement))
+                      ensureBlock(), null, null)
+                      listener: beginBlock({, BlockKind(statement))
+                      notEofOrValue(}, return)
+                      parseStatement({)
+                        parseStatementX({)
+                          parseReturnStatement({)
+                            listener: beginReturnStatement(return)
+                            parseExpression(return)
+                              parsePrecedenceExpression(return, 1, true)
+                                parseUnaryExpression(return, true)
+                                  parsePrimary(return, expression)
+                                    parseLiteralNull(return)
+                                      listener: handleLiteralNull(null)
+                            ensureSemicolon(null)
+                              reportRecoverableError(null, Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}])
+                                listener: handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], null, null)
+                              rewriter()
+                            listener: endReturnStatement(true, return, ;)
+                            inGenerator()
+                      notEofOrValue(}, })
+                      listener: endBlock(1, {, }, BlockKind(statement))
+                listener: endThenStatement(})
+                listener: endIfStatement(if, null)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(1, {, })
+        listener: endTopLevelMethod(foo, null, })
+  listener: endTopLevelDeclaration(bar)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(bar)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(})
+      listener: beginTopLevelMember(bar)
+      isReservedKeyword(()
+      parseTopLevelMethod(}, null, }, Instance of 'NoType', null, bar, false)
+        listener: beginTopLevelMethod(}, null)
+        listener: handleNoType(})
+        ensureIdentifierPotentiallyRecovered(}, topLevelFunctionDeclaration, false)
+          listener: handleIdentifier(bar, topLevelFunctionDeclaration)
+        parseMethodTypeVar(bar)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(bar, bar, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(bar, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                parseMetadataStar(()
+                  listener: beginMetadataStar(int)
+                  listener: endMetadataStar(0)
+                listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+                listener: handleIdentifier(int, typeReference)
+                listener: handleNoTypeArguments(a)
+                listener: handleType(int, null)
+                ensureIdentifier(int, formalParameterDeclaration)
+                  listener: handleIdentifier(a, formalParameterDeclaration)
+                listener: handleFormalParameterWithoutValue(,)
+                listener: endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+              parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                parseMetadataStar(,)
+                  listener: beginMetadataStar(int)
+                  listener: endMetadataStar(0)
+                listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+                listener: handleIdentifier(int, typeReference)
+                listener: handleNoTypeArguments(b)
+                listener: handleType(int, null)
+                ensureIdentifier(int, formalParameterDeclaration)
+                  listener: handleIdentifier(b, formalParameterDeclaration)
+                listener: handleFormalParameterWithoutValue())
+                listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, if)
+          parseStatement({)
+            parseStatementX({)
+              parseIfStatement({)
+                listener: beginIfStatement(if)
+                ensureParenthesizedCondition(if)
+                  parseExpressionInParenthesisRest(()
+                    parseExpression(()
+                      parsePrecedenceExpression((, 1, true)
+                        parseUnaryExpression((, true)
+                          parsePrimary((, expression)
+                            parseSendOrFunctionLiteral((, expression)
+                              parseSend((, expression)
+                                ensureIdentifier((, expression)
+                                  listener: handleIdentifier(a, expression)
+                                listener: handleNoTypeArguments(==)
+                                parseArgumentsOpt(a)
+                                  listener: handleNoArguments(==)
+                                listener: handleSend(a, ==)
+                        listener: beginBinaryExpression(==)
+                        parsePrecedenceExpression(==, 8, true)
+                          parseUnaryExpression(==, true)
+                            parsePrimary(==, expression)
+                              parseLiteralNull(==)
+                                listener: handleLiteralNull(null)
+                          rewriter()
+                          parsePrecedenceExpression(&, 12, true)
+                            parseUnaryExpression(&, true)
+                              parsePrimary(&, expression)
+                                parseSendOrFunctionLiteral(&, expression)
+                                  parseSend(&, expression)
+                                    ensureIdentifier(&, expression)
+                                    parseArgumentsOpt(b)
+                          rewriter()
+                        listener: endBinaryExpression(==)
+                        rewriter()
+                        parsePrecedenceExpression(&&, 7, true)
+                          parseUnaryExpression(&&, true)
+                            parsePrimary(&&, expression)
+                              parseSendOrFunctionLiteral(&&, expression)
+                                parseSend(&&, expression)
+                                  ensureIdentifier(&&, expression)
+                                  parseArgumentsOpt(b)
+                          parsePrecedenceExpression(==, 8, true)
+                            parseUnaryExpression(==, true)
+                              parsePrimary(==, expression)
+                                parseLiteralNull(==)
+                        reportRecoverableError(and, Message[BinaryOperatorWrittenOut, Binary operator 'and' is written as '&&' instead of the written out word., Try replacing 'and' with '&&'., {string: and, string2: &&}])
+                          listener: handleRecoverableError(Message[BinaryOperatorWrittenOut, Binary operator 'and' is written as '&&' instead of the written out word., Try replacing 'and' with '&&'., {string: and, string2: &&}], and, and)
+                        rewriter()
+                        listener: beginBinaryExpression(&&)
+                        parsePrecedenceExpression(&&, 7, true)
+                          parseUnaryExpression(&&, true)
+                            parsePrimary(&&, expression)
+                              parseSendOrFunctionLiteral(&&, expression)
+                                parseSend(&&, expression)
+                                  ensureIdentifier(&&, expression)
+                                    listener: handleIdentifier(b, expression)
+                                  listener: handleNoTypeArguments(==)
+                                  parseArgumentsOpt(b)
+                                    listener: handleNoArguments(==)
+                                  listener: handleSend(b, ==)
+                          listener: beginBinaryExpression(==)
+                          parsePrecedenceExpression(==, 8, true)
+                            parseUnaryExpression(==, true)
+                              parsePrimary(==, expression)
+                                parseLiteralNull(==)
+                                  listener: handleLiteralNull(null)
+                          listener: endBinaryExpression(==)
+                        listener: endBinaryExpression(&&)
+                    ensureCloseParen(null, ()
+                  listener: handleParenthesizedCondition(()
+                listener: beginThenStatement({)
+                parseStatement())
+                  parseStatementX())
+                    parseBlock(), BlockKind(statement))
+                      ensureBlock(), null, null)
+                      listener: beginBlock({, BlockKind(statement))
+                      notEofOrValue(}, return)
+                      parseStatement({)
+                        parseStatementX({)
+                          parseReturnStatement({)
+                            listener: beginReturnStatement(return)
+                            parseExpression(return)
+                              parsePrecedenceExpression(return, 1, true)
+                                parseUnaryExpression(return, true)
+                                  parsePrimary(return, expression)
+                                    parseLiteralNull(return)
+                                      listener: handleLiteralNull(null)
+                            ensureSemicolon(null)
+                              reportRecoverableError(null, Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}])
+                                listener: handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], null, null)
+                              rewriter()
+                            listener: endReturnStatement(true, return, ;)
+                            inGenerator()
+                      notEofOrValue(}, })
+                      listener: endBlock(1, {, }, BlockKind(statement))
+                listener: endThenStatement(})
+                listener: endIfStatement(if, null)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(1, {, })
+        listener: endTopLevelMethod(bar, null, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(foo)
+  listener: endCompilationUnit(2, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_44785.crash_dart.parser.expect b/pkg/front_end/parser_testcases/error_recovery/issue_44785.crash_dart.parser.expect
new file mode 100644
index 0000000..d576386
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_44785.crash_dart.parser.expect
@@ -0,0 +1,27 @@
+NOTICE: Stream was rewritten by parser!
+
+foo(int a, int b){
+if (a == null || b == null){
+return null
+;}
+}
+
+bar(int a, int b){
+if (a == null && b == null){
+return null
+;}
+}
+
+
+foo[StringToken]([BeginToken]int[StringToken] a[StringToken],[SimpleToken] int[StringToken] b[StringToken])[SimpleToken]{[BeginToken]
+if[KeywordToken] ([BeginToken]a[StringToken] ==[SimpleToken] null[KeywordToken] ||[ReplacementToken] b[StringToken] ==[SimpleToken] null[KeywordToken])[SimpleToken]{[BeginToken]
+return[KeywordToken] null[KeywordToken]
+;[SyntheticToken]}[SimpleToken]
+}[SimpleToken]
+
+bar[StringToken]([BeginToken]int[StringToken] a[StringToken],[SimpleToken] int[StringToken] b[StringToken])[SimpleToken]{[BeginToken]
+if[KeywordToken] ([BeginToken]a[StringToken] ==[SimpleToken] null[KeywordToken] &&[ReplacementToken] b[StringToken] ==[SimpleToken] null[KeywordToken])[SimpleToken]{[BeginToken]
+return[KeywordToken] null[KeywordToken]
+;[SyntheticToken]}[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_44785.crash_dart.scanner.expect b/pkg/front_end/parser_testcases/error_recovery/issue_44785.crash_dart.scanner.expect
new file mode 100644
index 0000000..8dd39ac
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_44785.crash_dart.scanner.expect
@@ -0,0 +1,25 @@
+foo(int a, int b){
+if (a == null or b == null){
+return null
+}
+}
+
+bar(int a, int b){
+if (a == null and b == null){
+return null
+}
+}
+
+
+foo[StringToken]([BeginToken]int[StringToken] a[StringToken],[SimpleToken] int[StringToken] b[StringToken])[SimpleToken]{[BeginToken]
+if[KeywordToken] ([BeginToken]a[StringToken] ==[SimpleToken] null[KeywordToken] or[StringToken] b[StringToken] ==[SimpleToken] null[KeywordToken])[SimpleToken]{[BeginToken]
+return[KeywordToken] null[KeywordToken]
+}[SimpleToken]
+}[SimpleToken]
+
+bar[StringToken]([BeginToken]int[StringToken] a[StringToken],[SimpleToken] int[StringToken] b[StringToken])[SimpleToken]{[BeginToken]
+if[KeywordToken] ([BeginToken]a[StringToken] ==[SimpleToken] null[KeywordToken] and[StringToken] b[StringToken] ==[SimpleToken] null[KeywordToken])[SimpleToken]{[BeginToken]
+return[KeywordToken] null[KeywordToken]
+}[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_1.crash_dart b/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_1.crash_dart
new file mode 100644
index 0000000..66fa775
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_1.crash_dart
@@ -0,0 +1,23 @@
+foo(int a, int b){
+  if (a == null or b == null){
+    return null;
+  }
+}
+
+foo2(int a, int b, int c){
+  if (a == null or b == null or c == null){
+    return null;
+  }
+}
+
+bar(int a, int b){
+  if (a == null and b == null){
+    return null;
+  }
+}
+
+bar2(int a, int b, int c){
+  if (a == null and b == null and c == null){
+    return null;
+  }
+}
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_1.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_1.crash_dart.expect
new file mode 100644
index 0000000..52d75b5
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_1.crash_dart.expect
@@ -0,0 +1,302 @@
+Problems reported:
+
+parser/error_recovery/issue_44785_prime_1.crash:2:17: Binary operator 'or' is written as '||' instead of the written out word.
+  if (a == null or b == null){
+                ^^
+
+parser/error_recovery/issue_44785_prime_1.crash:8:17: Binary operator 'or' is written as '||' instead of the written out word.
+  if (a == null or b == null or c == null){
+                ^^
+
+parser/error_recovery/issue_44785_prime_1.crash:8:30: Binary operator 'or' is written as '||' instead of the written out word.
+  if (a == null or b == null or c == null){
+                             ^^
+
+parser/error_recovery/issue_44785_prime_1.crash:14:17: Binary operator 'and' is written as '&&' instead of the written out word.
+  if (a == null and b == null){
+                ^^^
+
+parser/error_recovery/issue_44785_prime_1.crash:20:17: Binary operator 'and' is written as '&&' instead of the written out word.
+  if (a == null and b == null and c == null){
+                ^^^
+
+parser/error_recovery/issue_44785_prime_1.crash:20:31: Binary operator 'and' is written as '&&' instead of the written out word.
+  if (a == null and b == null and c == null){
+                              ^^^
+
+beginCompilationUnit(foo)
+  beginMetadataStar(foo)
+  endMetadataStar(0)
+  beginTopLevelMember(foo)
+    beginTopLevelMethod(, null)
+      handleNoType()
+      handleIdentifier(foo, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+        beginMetadataStar(int)
+        endMetadataStar(0)
+        beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(a)
+          handleType(int, null)
+          handleIdentifier(a, formalParameterDeclaration)
+          handleFormalParameterWithoutValue(,)
+        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        beginMetadataStar(int)
+        endMetadataStar(0)
+        beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(b)
+          handleType(int, null)
+          handleIdentifier(b, formalParameterDeclaration)
+          handleFormalParameterWithoutValue())
+        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+      endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+        beginIfStatement(if)
+          handleIdentifier(a, expression)
+          handleNoTypeArguments(==)
+          handleNoArguments(==)
+          handleSend(a, ==)
+          beginBinaryExpression(==)
+            handleLiteralNull(null)
+          endBinaryExpression(==)
+          handleRecoverableError(Message[BinaryOperatorWrittenOut, Binary operator 'or' is written as '||' instead of the written out word., Try replacing 'or' with '||'., {string: or, string2: ||}], or, or)
+          beginBinaryExpression(||)
+            handleIdentifier(b, expression)
+            handleNoTypeArguments(==)
+            handleNoArguments(==)
+            handleSend(b, ==)
+            beginBinaryExpression(==)
+              handleLiteralNull(null)
+            endBinaryExpression(==)
+          endBinaryExpression(||)
+          handleParenthesizedCondition(()
+          beginThenStatement({)
+            beginBlock({, BlockKind(statement))
+              beginReturnStatement(return)
+                handleLiteralNull(null)
+              endReturnStatement(true, return, ;)
+            endBlock(1, {, }, BlockKind(statement))
+          endThenStatement(})
+        endIfStatement(if, null)
+      endBlockFunctionBody(1, {, })
+    endTopLevelMethod(foo, null, })
+  endTopLevelDeclaration(foo2)
+  beginMetadataStar(foo2)
+  endMetadataStar(0)
+  beginTopLevelMember(foo2)
+    beginTopLevelMethod(}, null)
+      handleNoType(})
+      handleIdentifier(foo2, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+        beginMetadataStar(int)
+        endMetadataStar(0)
+        beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(a)
+          handleType(int, null)
+          handleIdentifier(a, formalParameterDeclaration)
+          handleFormalParameterWithoutValue(,)
+        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        beginMetadataStar(int)
+        endMetadataStar(0)
+        beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(b)
+          handleType(int, null)
+          handleIdentifier(b, formalParameterDeclaration)
+          handleFormalParameterWithoutValue(,)
+        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        beginMetadataStar(int)
+        endMetadataStar(0)
+        beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(c)
+          handleType(int, null)
+          handleIdentifier(c, formalParameterDeclaration)
+          handleFormalParameterWithoutValue())
+        endFormalParameter(null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+      endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+        beginIfStatement(if)
+          handleIdentifier(a, expression)
+          handleNoTypeArguments(==)
+          handleNoArguments(==)
+          handleSend(a, ==)
+          beginBinaryExpression(==)
+            handleLiteralNull(null)
+          endBinaryExpression(==)
+          handleRecoverableError(Message[BinaryOperatorWrittenOut, Binary operator 'or' is written as '||' instead of the written out word., Try replacing 'or' with '||'., {string: or, string2: ||}], or, or)
+          beginBinaryExpression(||)
+            handleIdentifier(b, expression)
+            handleNoTypeArguments(==)
+            handleNoArguments(==)
+            handleSend(b, ==)
+            beginBinaryExpression(==)
+              handleLiteralNull(null)
+            endBinaryExpression(==)
+          endBinaryExpression(||)
+          handleRecoverableError(Message[BinaryOperatorWrittenOut, Binary operator 'or' is written as '||' instead of the written out word., Try replacing 'or' with '||'., {string: or, string2: ||}], or, or)
+          beginBinaryExpression(||)
+            handleIdentifier(c, expression)
+            handleNoTypeArguments(==)
+            handleNoArguments(==)
+            handleSend(c, ==)
+            beginBinaryExpression(==)
+              handleLiteralNull(null)
+            endBinaryExpression(==)
+          endBinaryExpression(||)
+          handleParenthesizedCondition(()
+          beginThenStatement({)
+            beginBlock({, BlockKind(statement))
+              beginReturnStatement(return)
+                handleLiteralNull(null)
+              endReturnStatement(true, return, ;)
+            endBlock(1, {, }, BlockKind(statement))
+          endThenStatement(})
+        endIfStatement(if, null)
+      endBlockFunctionBody(1, {, })
+    endTopLevelMethod(foo2, null, })
+  endTopLevelDeclaration(bar)
+  beginMetadataStar(bar)
+  endMetadataStar(0)
+  beginTopLevelMember(bar)
+    beginTopLevelMethod(}, null)
+      handleNoType(})
+      handleIdentifier(bar, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+        beginMetadataStar(int)
+        endMetadataStar(0)
+        beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(a)
+          handleType(int, null)
+          handleIdentifier(a, formalParameterDeclaration)
+          handleFormalParameterWithoutValue(,)
+        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        beginMetadataStar(int)
+        endMetadataStar(0)
+        beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(b)
+          handleType(int, null)
+          handleIdentifier(b, formalParameterDeclaration)
+          handleFormalParameterWithoutValue())
+        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+      endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+        beginIfStatement(if)
+          handleIdentifier(a, expression)
+          handleNoTypeArguments(==)
+          handleNoArguments(==)
+          handleSend(a, ==)
+          beginBinaryExpression(==)
+            handleLiteralNull(null)
+          endBinaryExpression(==)
+          handleRecoverableError(Message[BinaryOperatorWrittenOut, Binary operator 'and' is written as '&&' instead of the written out word., Try replacing 'and' with '&&'., {string: and, string2: &&}], and, and)
+          beginBinaryExpression(&&)
+            handleIdentifier(b, expression)
+            handleNoTypeArguments(==)
+            handleNoArguments(==)
+            handleSend(b, ==)
+            beginBinaryExpression(==)
+              handleLiteralNull(null)
+            endBinaryExpression(==)
+          endBinaryExpression(&&)
+          handleParenthesizedCondition(()
+          beginThenStatement({)
+            beginBlock({, BlockKind(statement))
+              beginReturnStatement(return)
+                handleLiteralNull(null)
+              endReturnStatement(true, return, ;)
+            endBlock(1, {, }, BlockKind(statement))
+          endThenStatement(})
+        endIfStatement(if, null)
+      endBlockFunctionBody(1, {, })
+    endTopLevelMethod(bar, null, })
+  endTopLevelDeclaration(bar2)
+  beginMetadataStar(bar2)
+  endMetadataStar(0)
+  beginTopLevelMember(bar2)
+    beginTopLevelMethod(}, null)
+      handleNoType(})
+      handleIdentifier(bar2, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+        beginMetadataStar(int)
+        endMetadataStar(0)
+        beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(a)
+          handleType(int, null)
+          handleIdentifier(a, formalParameterDeclaration)
+          handleFormalParameterWithoutValue(,)
+        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        beginMetadataStar(int)
+        endMetadataStar(0)
+        beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(b)
+          handleType(int, null)
+          handleIdentifier(b, formalParameterDeclaration)
+          handleFormalParameterWithoutValue(,)
+        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        beginMetadataStar(int)
+        endMetadataStar(0)
+        beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(c)
+          handleType(int, null)
+          handleIdentifier(c, formalParameterDeclaration)
+          handleFormalParameterWithoutValue())
+        endFormalParameter(null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+      endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+        beginIfStatement(if)
+          handleIdentifier(a, expression)
+          handleNoTypeArguments(==)
+          handleNoArguments(==)
+          handleSend(a, ==)
+          beginBinaryExpression(==)
+            handleLiteralNull(null)
+          endBinaryExpression(==)
+          handleRecoverableError(Message[BinaryOperatorWrittenOut, Binary operator 'and' is written as '&&' instead of the written out word., Try replacing 'and' with '&&'., {string: and, string2: &&}], and, and)
+          beginBinaryExpression(&&)
+            handleIdentifier(b, expression)
+            handleNoTypeArguments(==)
+            handleNoArguments(==)
+            handleSend(b, ==)
+            beginBinaryExpression(==)
+              handleLiteralNull(null)
+            endBinaryExpression(==)
+          endBinaryExpression(&&)
+          handleRecoverableError(Message[BinaryOperatorWrittenOut, Binary operator 'and' is written as '&&' instead of the written out word., Try replacing 'and' with '&&'., {string: and, string2: &&}], and, and)
+          beginBinaryExpression(&&)
+            handleIdentifier(c, expression)
+            handleNoTypeArguments(==)
+            handleNoArguments(==)
+            handleSend(c, ==)
+            beginBinaryExpression(==)
+              handleLiteralNull(null)
+            endBinaryExpression(==)
+          endBinaryExpression(&&)
+          handleParenthesizedCondition(()
+          beginThenStatement({)
+            beginBlock({, BlockKind(statement))
+              beginReturnStatement(return)
+                handleLiteralNull(null)
+              endReturnStatement(true, return, ;)
+            endBlock(1, {, }, BlockKind(statement))
+          endThenStatement(})
+        endIfStatement(if, null)
+      endBlockFunctionBody(1, {, })
+    endTopLevelMethod(bar2, null, })
+  endTopLevelDeclaration()
+endCompilationUnit(4, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_1.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_1.crash_dart.intertwined.expect
new file mode 100644
index 0000000..778aa02
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_1.crash_dart.intertwined.expect
@@ -0,0 +1,712 @@
+parseUnit(foo)
+  skipErrorTokens(foo)
+  listener: beginCompilationUnit(foo)
+  syntheticPreviousToken(foo)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(foo)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl()
+      listener: beginTopLevelMember(foo)
+      isReservedKeyword(()
+      parseTopLevelMethod(, null, , Instance of 'NoType', null, foo, false)
+        listener: beginTopLevelMethod(, null)
+        listener: handleNoType()
+        ensureIdentifierPotentiallyRecovered(, topLevelFunctionDeclaration, false)
+          listener: handleIdentifier(foo, topLevelFunctionDeclaration)
+        parseMethodTypeVar(foo)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(foo, foo, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(foo, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                parseMetadataStar(()
+                  listener: beginMetadataStar(int)
+                  listener: endMetadataStar(0)
+                listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+                listener: handleIdentifier(int, typeReference)
+                listener: handleNoTypeArguments(a)
+                listener: handleType(int, null)
+                ensureIdentifier(int, formalParameterDeclaration)
+                  listener: handleIdentifier(a, formalParameterDeclaration)
+                listener: handleFormalParameterWithoutValue(,)
+                listener: endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+              parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                parseMetadataStar(,)
+                  listener: beginMetadataStar(int)
+                  listener: endMetadataStar(0)
+                listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+                listener: handleIdentifier(int, typeReference)
+                listener: handleNoTypeArguments(b)
+                listener: handleType(int, null)
+                ensureIdentifier(int, formalParameterDeclaration)
+                  listener: handleIdentifier(b, formalParameterDeclaration)
+                listener: handleFormalParameterWithoutValue())
+                listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, if)
+          parseStatement({)
+            parseStatementX({)
+              parseIfStatement({)
+                listener: beginIfStatement(if)
+                ensureParenthesizedCondition(if)
+                  parseExpressionInParenthesisRest(()
+                    parseExpression(()
+                      parsePrecedenceExpression((, 1, true)
+                        parseUnaryExpression((, true)
+                          parsePrimary((, expression)
+                            parseSendOrFunctionLiteral((, expression)
+                              parseSend((, expression)
+                                ensureIdentifier((, expression)
+                                  listener: handleIdentifier(a, expression)
+                                listener: handleNoTypeArguments(==)
+                                parseArgumentsOpt(a)
+                                  listener: handleNoArguments(==)
+                                listener: handleSend(a, ==)
+                        listener: beginBinaryExpression(==)
+                        parsePrecedenceExpression(==, 8, true)
+                          parseUnaryExpression(==, true)
+                            parsePrimary(==, expression)
+                              parseLiteralNull(==)
+                                listener: handleLiteralNull(null)
+                          rewriter()
+                          parsePrecedenceExpression(|, 10, true)
+                            parseUnaryExpression(|, true)
+                              parsePrimary(|, expression)
+                                parseSendOrFunctionLiteral(|, expression)
+                                  parseSend(|, expression)
+                                    ensureIdentifier(|, expression)
+                                    parseArgumentsOpt(b)
+                          rewriter()
+                        listener: endBinaryExpression(==)
+                        rewriter()
+                        parsePrecedenceExpression(||, 6, true)
+                          parseUnaryExpression(||, true)
+                            parsePrimary(||, expression)
+                              parseSendOrFunctionLiteral(||, expression)
+                                parseSend(||, expression)
+                                  ensureIdentifier(||, expression)
+                                  parseArgumentsOpt(b)
+                          parsePrecedenceExpression(==, 8, true)
+                            parseUnaryExpression(==, true)
+                              parsePrimary(==, expression)
+                                parseLiteralNull(==)
+                        reportRecoverableError(or, Message[BinaryOperatorWrittenOut, Binary operator 'or' is written as '||' instead of the written out word., Try replacing 'or' with '||'., {string: or, string2: ||}])
+                          listener: handleRecoverableError(Message[BinaryOperatorWrittenOut, Binary operator 'or' is written as '||' instead of the written out word., Try replacing 'or' with '||'., {string: or, string2: ||}], or, or)
+                        rewriter()
+                        listener: beginBinaryExpression(||)
+                        parsePrecedenceExpression(||, 6, true)
+                          parseUnaryExpression(||, true)
+                            parsePrimary(||, expression)
+                              parseSendOrFunctionLiteral(||, expression)
+                                parseSend(||, expression)
+                                  ensureIdentifier(||, expression)
+                                    listener: handleIdentifier(b, expression)
+                                  listener: handleNoTypeArguments(==)
+                                  parseArgumentsOpt(b)
+                                    listener: handleNoArguments(==)
+                                  listener: handleSend(b, ==)
+                          listener: beginBinaryExpression(==)
+                          parsePrecedenceExpression(==, 8, true)
+                            parseUnaryExpression(==, true)
+                              parsePrimary(==, expression)
+                                parseLiteralNull(==)
+                                  listener: handleLiteralNull(null)
+                          listener: endBinaryExpression(==)
+                        listener: endBinaryExpression(||)
+                    ensureCloseParen(null, ()
+                  listener: handleParenthesizedCondition(()
+                listener: beginThenStatement({)
+                parseStatement())
+                  parseStatementX())
+                    parseBlock(), BlockKind(statement))
+                      ensureBlock(), null, null)
+                      listener: beginBlock({, BlockKind(statement))
+                      notEofOrValue(}, return)
+                      parseStatement({)
+                        parseStatementX({)
+                          parseReturnStatement({)
+                            listener: beginReturnStatement(return)
+                            parseExpression(return)
+                              parsePrecedenceExpression(return, 1, true)
+                                parseUnaryExpression(return, true)
+                                  parsePrimary(return, expression)
+                                    parseLiteralNull(return)
+                                      listener: handleLiteralNull(null)
+                            ensureSemicolon(null)
+                            listener: endReturnStatement(true, return, ;)
+                            inGenerator()
+                      notEofOrValue(}, })
+                      listener: endBlock(1, {, }, BlockKind(statement))
+                listener: endThenStatement(})
+                listener: endIfStatement(if, null)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(1, {, })
+        listener: endTopLevelMethod(foo, null, })
+  listener: endTopLevelDeclaration(foo2)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(foo2)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(})
+      listener: beginTopLevelMember(foo2)
+      isReservedKeyword(()
+      parseTopLevelMethod(}, null, }, Instance of 'NoType', null, foo2, false)
+        listener: beginTopLevelMethod(}, null)
+        listener: handleNoType(})
+        ensureIdentifierPotentiallyRecovered(}, topLevelFunctionDeclaration, false)
+          listener: handleIdentifier(foo2, topLevelFunctionDeclaration)
+        parseMethodTypeVar(foo2)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(foo2, foo2, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(foo2, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                parseMetadataStar(()
+                  listener: beginMetadataStar(int)
+                  listener: endMetadataStar(0)
+                listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+                listener: handleIdentifier(int, typeReference)
+                listener: handleNoTypeArguments(a)
+                listener: handleType(int, null)
+                ensureIdentifier(int, formalParameterDeclaration)
+                  listener: handleIdentifier(a, formalParameterDeclaration)
+                listener: handleFormalParameterWithoutValue(,)
+                listener: endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+              parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                parseMetadataStar(,)
+                  listener: beginMetadataStar(int)
+                  listener: endMetadataStar(0)
+                listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+                listener: handleIdentifier(int, typeReference)
+                listener: handleNoTypeArguments(b)
+                listener: handleType(int, null)
+                ensureIdentifier(int, formalParameterDeclaration)
+                  listener: handleIdentifier(b, formalParameterDeclaration)
+                listener: handleFormalParameterWithoutValue(,)
+                listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+              parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                parseMetadataStar(,)
+                  listener: beginMetadataStar(int)
+                  listener: endMetadataStar(0)
+                listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+                listener: handleIdentifier(int, typeReference)
+                listener: handleNoTypeArguments(c)
+                listener: handleType(int, null)
+                ensureIdentifier(int, formalParameterDeclaration)
+                  listener: handleIdentifier(c, formalParameterDeclaration)
+                listener: handleFormalParameterWithoutValue())
+                listener: endFormalParameter(null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, if)
+          parseStatement({)
+            parseStatementX({)
+              parseIfStatement({)
+                listener: beginIfStatement(if)
+                ensureParenthesizedCondition(if)
+                  parseExpressionInParenthesisRest(()
+                    parseExpression(()
+                      parsePrecedenceExpression((, 1, true)
+                        parseUnaryExpression((, true)
+                          parsePrimary((, expression)
+                            parseSendOrFunctionLiteral((, expression)
+                              parseSend((, expression)
+                                ensureIdentifier((, expression)
+                                  listener: handleIdentifier(a, expression)
+                                listener: handleNoTypeArguments(==)
+                                parseArgumentsOpt(a)
+                                  listener: handleNoArguments(==)
+                                listener: handleSend(a, ==)
+                        listener: beginBinaryExpression(==)
+                        parsePrecedenceExpression(==, 8, true)
+                          parseUnaryExpression(==, true)
+                            parsePrimary(==, expression)
+                              parseLiteralNull(==)
+                                listener: handleLiteralNull(null)
+                          rewriter()
+                          parsePrecedenceExpression(|, 10, true)
+                            parseUnaryExpression(|, true)
+                              parsePrimary(|, expression)
+                                parseSendOrFunctionLiteral(|, expression)
+                                  parseSend(|, expression)
+                                    ensureIdentifier(|, expression)
+                                    parseArgumentsOpt(b)
+                          rewriter()
+                        listener: endBinaryExpression(==)
+                        rewriter()
+                        parsePrecedenceExpression(||, 6, true)
+                          parseUnaryExpression(||, true)
+                            parsePrimary(||, expression)
+                              parseSendOrFunctionLiteral(||, expression)
+                                parseSend(||, expression)
+                                  ensureIdentifier(||, expression)
+                                  parseArgumentsOpt(b)
+                          parsePrecedenceExpression(==, 8, true)
+                            parseUnaryExpression(==, true)
+                              parsePrimary(==, expression)
+                                parseLiteralNull(==)
+                        reportRecoverableError(or, Message[BinaryOperatorWrittenOut, Binary operator 'or' is written as '||' instead of the written out word., Try replacing 'or' with '||'., {string: or, string2: ||}])
+                          listener: handleRecoverableError(Message[BinaryOperatorWrittenOut, Binary operator 'or' is written as '||' instead of the written out word., Try replacing 'or' with '||'., {string: or, string2: ||}], or, or)
+                        rewriter()
+                        listener: beginBinaryExpression(||)
+                        parsePrecedenceExpression(||, 6, true)
+                          parseUnaryExpression(||, true)
+                            parsePrimary(||, expression)
+                              parseSendOrFunctionLiteral(||, expression)
+                                parseSend(||, expression)
+                                  ensureIdentifier(||, expression)
+                                    listener: handleIdentifier(b, expression)
+                                  listener: handleNoTypeArguments(==)
+                                  parseArgumentsOpt(b)
+                                    listener: handleNoArguments(==)
+                                  listener: handleSend(b, ==)
+                          listener: beginBinaryExpression(==)
+                          parsePrecedenceExpression(==, 8, true)
+                            parseUnaryExpression(==, true)
+                              parsePrimary(==, expression)
+                                parseLiteralNull(==)
+                                  listener: handleLiteralNull(null)
+                            rewriter()
+                            parsePrecedenceExpression(|, 10, true)
+                              parseUnaryExpression(|, true)
+                                parsePrimary(|, expression)
+                                  parseSendOrFunctionLiteral(|, expression)
+                                    parseSend(|, expression)
+                                      ensureIdentifier(|, expression)
+                                      parseArgumentsOpt(c)
+                            rewriter()
+                          listener: endBinaryExpression(==)
+                          rewriter()
+                        listener: endBinaryExpression(||)
+                        rewriter()
+                        parsePrecedenceExpression(||, 6, true)
+                          parseUnaryExpression(||, true)
+                            parsePrimary(||, expression)
+                              parseSendOrFunctionLiteral(||, expression)
+                                parseSend(||, expression)
+                                  ensureIdentifier(||, expression)
+                                  parseArgumentsOpt(c)
+                          parsePrecedenceExpression(==, 8, true)
+                            parseUnaryExpression(==, true)
+                              parsePrimary(==, expression)
+                                parseLiteralNull(==)
+                        reportRecoverableError(or, Message[BinaryOperatorWrittenOut, Binary operator 'or' is written as '||' instead of the written out word., Try replacing 'or' with '||'., {string: or, string2: ||}])
+                          listener: handleRecoverableError(Message[BinaryOperatorWrittenOut, Binary operator 'or' is written as '||' instead of the written out word., Try replacing 'or' with '||'., {string: or, string2: ||}], or, or)
+                        rewriter()
+                        listener: beginBinaryExpression(||)
+                        parsePrecedenceExpression(||, 6, true)
+                          parseUnaryExpression(||, true)
+                            parsePrimary(||, expression)
+                              parseSendOrFunctionLiteral(||, expression)
+                                parseSend(||, expression)
+                                  ensureIdentifier(||, expression)
+                                    listener: handleIdentifier(c, expression)
+                                  listener: handleNoTypeArguments(==)
+                                  parseArgumentsOpt(c)
+                                    listener: handleNoArguments(==)
+                                  listener: handleSend(c, ==)
+                          listener: beginBinaryExpression(==)
+                          parsePrecedenceExpression(==, 8, true)
+                            parseUnaryExpression(==, true)
+                              parsePrimary(==, expression)
+                                parseLiteralNull(==)
+                                  listener: handleLiteralNull(null)
+                          listener: endBinaryExpression(==)
+                        listener: endBinaryExpression(||)
+                    ensureCloseParen(null, ()
+                  listener: handleParenthesizedCondition(()
+                listener: beginThenStatement({)
+                parseStatement())
+                  parseStatementX())
+                    parseBlock(), BlockKind(statement))
+                      ensureBlock(), null, null)
+                      listener: beginBlock({, BlockKind(statement))
+                      notEofOrValue(}, return)
+                      parseStatement({)
+                        parseStatementX({)
+                          parseReturnStatement({)
+                            listener: beginReturnStatement(return)
+                            parseExpression(return)
+                              parsePrecedenceExpression(return, 1, true)
+                                parseUnaryExpression(return, true)
+                                  parsePrimary(return, expression)
+                                    parseLiteralNull(return)
+                                      listener: handleLiteralNull(null)
+                            ensureSemicolon(null)
+                            listener: endReturnStatement(true, return, ;)
+                            inGenerator()
+                      notEofOrValue(}, })
+                      listener: endBlock(1, {, }, BlockKind(statement))
+                listener: endThenStatement(})
+                listener: endIfStatement(if, null)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(1, {, })
+        listener: endTopLevelMethod(foo2, null, })
+  listener: endTopLevelDeclaration(bar)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(bar)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(})
+      listener: beginTopLevelMember(bar)
+      isReservedKeyword(()
+      parseTopLevelMethod(}, null, }, Instance of 'NoType', null, bar, false)
+        listener: beginTopLevelMethod(}, null)
+        listener: handleNoType(})
+        ensureIdentifierPotentiallyRecovered(}, topLevelFunctionDeclaration, false)
+          listener: handleIdentifier(bar, topLevelFunctionDeclaration)
+        parseMethodTypeVar(bar)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(bar, bar, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(bar, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                parseMetadataStar(()
+                  listener: beginMetadataStar(int)
+                  listener: endMetadataStar(0)
+                listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+                listener: handleIdentifier(int, typeReference)
+                listener: handleNoTypeArguments(a)
+                listener: handleType(int, null)
+                ensureIdentifier(int, formalParameterDeclaration)
+                  listener: handleIdentifier(a, formalParameterDeclaration)
+                listener: handleFormalParameterWithoutValue(,)
+                listener: endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+              parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                parseMetadataStar(,)
+                  listener: beginMetadataStar(int)
+                  listener: endMetadataStar(0)
+                listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+                listener: handleIdentifier(int, typeReference)
+                listener: handleNoTypeArguments(b)
+                listener: handleType(int, null)
+                ensureIdentifier(int, formalParameterDeclaration)
+                  listener: handleIdentifier(b, formalParameterDeclaration)
+                listener: handleFormalParameterWithoutValue())
+                listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, if)
+          parseStatement({)
+            parseStatementX({)
+              parseIfStatement({)
+                listener: beginIfStatement(if)
+                ensureParenthesizedCondition(if)
+                  parseExpressionInParenthesisRest(()
+                    parseExpression(()
+                      parsePrecedenceExpression((, 1, true)
+                        parseUnaryExpression((, true)
+                          parsePrimary((, expression)
+                            parseSendOrFunctionLiteral((, expression)
+                              parseSend((, expression)
+                                ensureIdentifier((, expression)
+                                  listener: handleIdentifier(a, expression)
+                                listener: handleNoTypeArguments(==)
+                                parseArgumentsOpt(a)
+                                  listener: handleNoArguments(==)
+                                listener: handleSend(a, ==)
+                        listener: beginBinaryExpression(==)
+                        parsePrecedenceExpression(==, 8, true)
+                          parseUnaryExpression(==, true)
+                            parsePrimary(==, expression)
+                              parseLiteralNull(==)
+                                listener: handleLiteralNull(null)
+                          rewriter()
+                          parsePrecedenceExpression(&, 12, true)
+                            parseUnaryExpression(&, true)
+                              parsePrimary(&, expression)
+                                parseSendOrFunctionLiteral(&, expression)
+                                  parseSend(&, expression)
+                                    ensureIdentifier(&, expression)
+                                    parseArgumentsOpt(b)
+                          rewriter()
+                        listener: endBinaryExpression(==)
+                        rewriter()
+                        parsePrecedenceExpression(&&, 7, true)
+                          parseUnaryExpression(&&, true)
+                            parsePrimary(&&, expression)
+                              parseSendOrFunctionLiteral(&&, expression)
+                                parseSend(&&, expression)
+                                  ensureIdentifier(&&, expression)
+                                  parseArgumentsOpt(b)
+                          parsePrecedenceExpression(==, 8, true)
+                            parseUnaryExpression(==, true)
+                              parsePrimary(==, expression)
+                                parseLiteralNull(==)
+                        reportRecoverableError(and, Message[BinaryOperatorWrittenOut, Binary operator 'and' is written as '&&' instead of the written out word., Try replacing 'and' with '&&'., {string: and, string2: &&}])
+                          listener: handleRecoverableError(Message[BinaryOperatorWrittenOut, Binary operator 'and' is written as '&&' instead of the written out word., Try replacing 'and' with '&&'., {string: and, string2: &&}], and, and)
+                        rewriter()
+                        listener: beginBinaryExpression(&&)
+                        parsePrecedenceExpression(&&, 7, true)
+                          parseUnaryExpression(&&, true)
+                            parsePrimary(&&, expression)
+                              parseSendOrFunctionLiteral(&&, expression)
+                                parseSend(&&, expression)
+                                  ensureIdentifier(&&, expression)
+                                    listener: handleIdentifier(b, expression)
+                                  listener: handleNoTypeArguments(==)
+                                  parseArgumentsOpt(b)
+                                    listener: handleNoArguments(==)
+                                  listener: handleSend(b, ==)
+                          listener: beginBinaryExpression(==)
+                          parsePrecedenceExpression(==, 8, true)
+                            parseUnaryExpression(==, true)
+                              parsePrimary(==, expression)
+                                parseLiteralNull(==)
+                                  listener: handleLiteralNull(null)
+                          listener: endBinaryExpression(==)
+                        listener: endBinaryExpression(&&)
+                    ensureCloseParen(null, ()
+                  listener: handleParenthesizedCondition(()
+                listener: beginThenStatement({)
+                parseStatement())
+                  parseStatementX())
+                    parseBlock(), BlockKind(statement))
+                      ensureBlock(), null, null)
+                      listener: beginBlock({, BlockKind(statement))
+                      notEofOrValue(}, return)
+                      parseStatement({)
+                        parseStatementX({)
+                          parseReturnStatement({)
+                            listener: beginReturnStatement(return)
+                            parseExpression(return)
+                              parsePrecedenceExpression(return, 1, true)
+                                parseUnaryExpression(return, true)
+                                  parsePrimary(return, expression)
+                                    parseLiteralNull(return)
+                                      listener: handleLiteralNull(null)
+                            ensureSemicolon(null)
+                            listener: endReturnStatement(true, return, ;)
+                            inGenerator()
+                      notEofOrValue(}, })
+                      listener: endBlock(1, {, }, BlockKind(statement))
+                listener: endThenStatement(})
+                listener: endIfStatement(if, null)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(1, {, })
+        listener: endTopLevelMethod(bar, null, })
+  listener: endTopLevelDeclaration(bar2)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(bar2)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(})
+      listener: beginTopLevelMember(bar2)
+      isReservedKeyword(()
+      parseTopLevelMethod(}, null, }, Instance of 'NoType', null, bar2, false)
+        listener: beginTopLevelMethod(}, null)
+        listener: handleNoType(})
+        ensureIdentifierPotentiallyRecovered(}, topLevelFunctionDeclaration, false)
+          listener: handleIdentifier(bar2, topLevelFunctionDeclaration)
+        parseMethodTypeVar(bar2)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(bar2, bar2, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(bar2, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                parseMetadataStar(()
+                  listener: beginMetadataStar(int)
+                  listener: endMetadataStar(0)
+                listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+                listener: handleIdentifier(int, typeReference)
+                listener: handleNoTypeArguments(a)
+                listener: handleType(int, null)
+                ensureIdentifier(int, formalParameterDeclaration)
+                  listener: handleIdentifier(a, formalParameterDeclaration)
+                listener: handleFormalParameterWithoutValue(,)
+                listener: endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+              parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                parseMetadataStar(,)
+                  listener: beginMetadataStar(int)
+                  listener: endMetadataStar(0)
+                listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+                listener: handleIdentifier(int, typeReference)
+                listener: handleNoTypeArguments(b)
+                listener: handleType(int, null)
+                ensureIdentifier(int, formalParameterDeclaration)
+                  listener: handleIdentifier(b, formalParameterDeclaration)
+                listener: handleFormalParameterWithoutValue(,)
+                listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+              parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                parseMetadataStar(,)
+                  listener: beginMetadataStar(int)
+                  listener: endMetadataStar(0)
+                listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+                listener: handleIdentifier(int, typeReference)
+                listener: handleNoTypeArguments(c)
+                listener: handleType(int, null)
+                ensureIdentifier(int, formalParameterDeclaration)
+                  listener: handleIdentifier(c, formalParameterDeclaration)
+                listener: handleFormalParameterWithoutValue())
+                listener: endFormalParameter(null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, if)
+          parseStatement({)
+            parseStatementX({)
+              parseIfStatement({)
+                listener: beginIfStatement(if)
+                ensureParenthesizedCondition(if)
+                  parseExpressionInParenthesisRest(()
+                    parseExpression(()
+                      parsePrecedenceExpression((, 1, true)
+                        parseUnaryExpression((, true)
+                          parsePrimary((, expression)
+                            parseSendOrFunctionLiteral((, expression)
+                              parseSend((, expression)
+                                ensureIdentifier((, expression)
+                                  listener: handleIdentifier(a, expression)
+                                listener: handleNoTypeArguments(==)
+                                parseArgumentsOpt(a)
+                                  listener: handleNoArguments(==)
+                                listener: handleSend(a, ==)
+                        listener: beginBinaryExpression(==)
+                        parsePrecedenceExpression(==, 8, true)
+                          parseUnaryExpression(==, true)
+                            parsePrimary(==, expression)
+                              parseLiteralNull(==)
+                                listener: handleLiteralNull(null)
+                          rewriter()
+                          parsePrecedenceExpression(&, 12, true)
+                            parseUnaryExpression(&, true)
+                              parsePrimary(&, expression)
+                                parseSendOrFunctionLiteral(&, expression)
+                                  parseSend(&, expression)
+                                    ensureIdentifier(&, expression)
+                                    parseArgumentsOpt(b)
+                          rewriter()
+                        listener: endBinaryExpression(==)
+                        rewriter()
+                        parsePrecedenceExpression(&&, 7, true)
+                          parseUnaryExpression(&&, true)
+                            parsePrimary(&&, expression)
+                              parseSendOrFunctionLiteral(&&, expression)
+                                parseSend(&&, expression)
+                                  ensureIdentifier(&&, expression)
+                                  parseArgumentsOpt(b)
+                          parsePrecedenceExpression(==, 8, true)
+                            parseUnaryExpression(==, true)
+                              parsePrimary(==, expression)
+                                parseLiteralNull(==)
+                        reportRecoverableError(and, Message[BinaryOperatorWrittenOut, Binary operator 'and' is written as '&&' instead of the written out word., Try replacing 'and' with '&&'., {string: and, string2: &&}])
+                          listener: handleRecoverableError(Message[BinaryOperatorWrittenOut, Binary operator 'and' is written as '&&' instead of the written out word., Try replacing 'and' with '&&'., {string: and, string2: &&}], and, and)
+                        rewriter()
+                        listener: beginBinaryExpression(&&)
+                        parsePrecedenceExpression(&&, 7, true)
+                          parseUnaryExpression(&&, true)
+                            parsePrimary(&&, expression)
+                              parseSendOrFunctionLiteral(&&, expression)
+                                parseSend(&&, expression)
+                                  ensureIdentifier(&&, expression)
+                                    listener: handleIdentifier(b, expression)
+                                  listener: handleNoTypeArguments(==)
+                                  parseArgumentsOpt(b)
+                                    listener: handleNoArguments(==)
+                                  listener: handleSend(b, ==)
+                          listener: beginBinaryExpression(==)
+                          parsePrecedenceExpression(==, 8, true)
+                            parseUnaryExpression(==, true)
+                              parsePrimary(==, expression)
+                                parseLiteralNull(==)
+                                  listener: handleLiteralNull(null)
+                            rewriter()
+                            parsePrecedenceExpression(&, 12, true)
+                              parseUnaryExpression(&, true)
+                                parsePrimary(&, expression)
+                                  parseSendOrFunctionLiteral(&, expression)
+                                    parseSend(&, expression)
+                                      ensureIdentifier(&, expression)
+                                      parseArgumentsOpt(c)
+                            rewriter()
+                          listener: endBinaryExpression(==)
+                          rewriter()
+                        listener: endBinaryExpression(&&)
+                        rewriter()
+                        parsePrecedenceExpression(&&, 7, true)
+                          parseUnaryExpression(&&, true)
+                            parsePrimary(&&, expression)
+                              parseSendOrFunctionLiteral(&&, expression)
+                                parseSend(&&, expression)
+                                  ensureIdentifier(&&, expression)
+                                  parseArgumentsOpt(c)
+                          parsePrecedenceExpression(==, 8, true)
+                            parseUnaryExpression(==, true)
+                              parsePrimary(==, expression)
+                                parseLiteralNull(==)
+                        reportRecoverableError(and, Message[BinaryOperatorWrittenOut, Binary operator 'and' is written as '&&' instead of the written out word., Try replacing 'and' with '&&'., {string: and, string2: &&}])
+                          listener: handleRecoverableError(Message[BinaryOperatorWrittenOut, Binary operator 'and' is written as '&&' instead of the written out word., Try replacing 'and' with '&&'., {string: and, string2: &&}], and, and)
+                        rewriter()
+                        listener: beginBinaryExpression(&&)
+                        parsePrecedenceExpression(&&, 7, true)
+                          parseUnaryExpression(&&, true)
+                            parsePrimary(&&, expression)
+                              parseSendOrFunctionLiteral(&&, expression)
+                                parseSend(&&, expression)
+                                  ensureIdentifier(&&, expression)
+                                    listener: handleIdentifier(c, expression)
+                                  listener: handleNoTypeArguments(==)
+                                  parseArgumentsOpt(c)
+                                    listener: handleNoArguments(==)
+                                  listener: handleSend(c, ==)
+                          listener: beginBinaryExpression(==)
+                          parsePrecedenceExpression(==, 8, true)
+                            parseUnaryExpression(==, true)
+                              parsePrimary(==, expression)
+                                parseLiteralNull(==)
+                                  listener: handleLiteralNull(null)
+                          listener: endBinaryExpression(==)
+                        listener: endBinaryExpression(&&)
+                    ensureCloseParen(null, ()
+                  listener: handleParenthesizedCondition(()
+                listener: beginThenStatement({)
+                parseStatement())
+                  parseStatementX())
+                    parseBlock(), BlockKind(statement))
+                      ensureBlock(), null, null)
+                      listener: beginBlock({, BlockKind(statement))
+                      notEofOrValue(}, return)
+                      parseStatement({)
+                        parseStatementX({)
+                          parseReturnStatement({)
+                            listener: beginReturnStatement(return)
+                            parseExpression(return)
+                              parsePrecedenceExpression(return, 1, true)
+                                parseUnaryExpression(return, true)
+                                  parsePrimary(return, expression)
+                                    parseLiteralNull(return)
+                                      listener: handleLiteralNull(null)
+                            ensureSemicolon(null)
+                            listener: endReturnStatement(true, return, ;)
+                            inGenerator()
+                      notEofOrValue(}, })
+                      listener: endBlock(1, {, }, BlockKind(statement))
+                listener: endThenStatement(})
+                listener: endIfStatement(if, null)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(1, {, })
+        listener: endTopLevelMethod(bar2, null, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(foo)
+  listener: endCompilationUnit(4, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_1.crash_dart.parser.expect b/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_1.crash_dart.parser.expect
new file mode 100644
index 0000000..735b62c
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_1.crash_dart.parser.expect
@@ -0,0 +1,51 @@
+NOTICE: Stream was rewritten by parser!
+
+foo(int a, int b){
+if (a == null || b == null){
+return null;
+}
+}
+
+foo2(int a, int b, int c){
+if (a == null || b == null || c == null){
+return null;
+}
+}
+
+bar(int a, int b){
+if (a == null && b == null){
+return null;
+}
+}
+
+bar2(int a, int b, int c){
+if (a == null && b == null && c == null){
+return null;
+}
+}
+
+
+foo[StringToken]([BeginToken]int[StringToken] a[StringToken],[SimpleToken] int[StringToken] b[StringToken])[SimpleToken]{[BeginToken]
+if[KeywordToken] ([BeginToken]a[StringToken] ==[SimpleToken] null[KeywordToken] ||[ReplacementToken] b[StringToken] ==[SimpleToken] null[KeywordToken])[SimpleToken]{[BeginToken]
+return[KeywordToken] null[KeywordToken];[SimpleToken]
+}[SimpleToken]
+}[SimpleToken]
+
+foo2[StringToken]([BeginToken]int[StringToken] a[StringToken],[SimpleToken] int[StringToken] b[StringToken],[SimpleToken] int[StringToken] c[StringToken])[SimpleToken]{[BeginToken]
+if[KeywordToken] ([BeginToken]a[StringToken] ==[SimpleToken] null[KeywordToken] ||[ReplacementToken] b[StringToken] ==[SimpleToken] null[KeywordToken] ||[ReplacementToken] c[StringToken] ==[SimpleToken] null[KeywordToken])[SimpleToken]{[BeginToken]
+return[KeywordToken] null[KeywordToken];[SimpleToken]
+}[SimpleToken]
+}[SimpleToken]
+
+bar[StringToken]([BeginToken]int[StringToken] a[StringToken],[SimpleToken] int[StringToken] b[StringToken])[SimpleToken]{[BeginToken]
+if[KeywordToken] ([BeginToken]a[StringToken] ==[SimpleToken] null[KeywordToken] &&[ReplacementToken] b[StringToken] ==[SimpleToken] null[KeywordToken])[SimpleToken]{[BeginToken]
+return[KeywordToken] null[KeywordToken];[SimpleToken]
+}[SimpleToken]
+}[SimpleToken]
+
+bar2[StringToken]([BeginToken]int[StringToken] a[StringToken],[SimpleToken] int[StringToken] b[StringToken],[SimpleToken] int[StringToken] c[StringToken])[SimpleToken]{[BeginToken]
+if[KeywordToken] ([BeginToken]a[StringToken] ==[SimpleToken] null[KeywordToken] &&[ReplacementToken] b[StringToken] ==[SimpleToken] null[KeywordToken] &&[ReplacementToken] c[StringToken] ==[SimpleToken] null[KeywordToken])[SimpleToken]{[BeginToken]
+return[KeywordToken] null[KeywordToken];[SimpleToken]
+}[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_1.crash_dart.scanner.expect b/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_1.crash_dart.scanner.expect
new file mode 100644
index 0000000..ac1419c
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_1.crash_dart.scanner.expect
@@ -0,0 +1,49 @@
+foo(int a, int b){
+if (a == null or b == null){
+return null;
+}
+}
+
+foo2(int a, int b, int c){
+if (a == null or b == null or c == null){
+return null;
+}
+}
+
+bar(int a, int b){
+if (a == null and b == null){
+return null;
+}
+}
+
+bar2(int a, int b, int c){
+if (a == null and b == null and c == null){
+return null;
+}
+}
+
+
+foo[StringToken]([BeginToken]int[StringToken] a[StringToken],[SimpleToken] int[StringToken] b[StringToken])[SimpleToken]{[BeginToken]
+if[KeywordToken] ([BeginToken]a[StringToken] ==[SimpleToken] null[KeywordToken] or[StringToken] b[StringToken] ==[SimpleToken] null[KeywordToken])[SimpleToken]{[BeginToken]
+return[KeywordToken] null[KeywordToken];[SimpleToken]
+}[SimpleToken]
+}[SimpleToken]
+
+foo2[StringToken]([BeginToken]int[StringToken] a[StringToken],[SimpleToken] int[StringToken] b[StringToken],[SimpleToken] int[StringToken] c[StringToken])[SimpleToken]{[BeginToken]
+if[KeywordToken] ([BeginToken]a[StringToken] ==[SimpleToken] null[KeywordToken] or[StringToken] b[StringToken] ==[SimpleToken] null[KeywordToken] or[StringToken] c[StringToken] ==[SimpleToken] null[KeywordToken])[SimpleToken]{[BeginToken]
+return[KeywordToken] null[KeywordToken];[SimpleToken]
+}[SimpleToken]
+}[SimpleToken]
+
+bar[StringToken]([BeginToken]int[StringToken] a[StringToken],[SimpleToken] int[StringToken] b[StringToken])[SimpleToken]{[BeginToken]
+if[KeywordToken] ([BeginToken]a[StringToken] ==[SimpleToken] null[KeywordToken] and[StringToken] b[StringToken] ==[SimpleToken] null[KeywordToken])[SimpleToken]{[BeginToken]
+return[KeywordToken] null[KeywordToken];[SimpleToken]
+}[SimpleToken]
+}[SimpleToken]
+
+bar2[StringToken]([BeginToken]int[StringToken] a[StringToken],[SimpleToken] int[StringToken] b[StringToken],[SimpleToken] int[StringToken] c[StringToken])[SimpleToken]{[BeginToken]
+if[KeywordToken] ([BeginToken]a[StringToken] ==[SimpleToken] null[KeywordToken] and[StringToken] b[StringToken] ==[SimpleToken] null[KeywordToken] and[StringToken] c[StringToken] ==[SimpleToken] null[KeywordToken])[SimpleToken]{[BeginToken]
+return[KeywordToken] null[KeywordToken];[SimpleToken]
+}[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_2.crash_dart b/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_2.crash_dart
new file mode 100644
index 0000000..7f0c579
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_2.crash_dart
@@ -0,0 +1,23 @@
+foo(int a, int b){
+  if (a == null || b == null){
+    return null;
+  }
+}
+
+foo2(int a, int b, int c){
+  if (a == null || b == null || c == null){
+    return null;
+  }
+}
+
+bar(int a, int b){
+  if (a == null && b == null){
+    return null;
+  }
+}
+
+bar2(int a, int b, int c){
+  if (a == null && b == null && c == null){
+    return null;
+  }
+}
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_2.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_2.crash_dart.expect
new file mode 100644
index 0000000..cd1beba
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_2.crash_dart.expect
@@ -0,0 +1,270 @@
+beginCompilationUnit(foo)
+  beginMetadataStar(foo)
+  endMetadataStar(0)
+  beginTopLevelMember(foo)
+    beginTopLevelMethod(, null)
+      handleNoType()
+      handleIdentifier(foo, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+        beginMetadataStar(int)
+        endMetadataStar(0)
+        beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(a)
+          handleType(int, null)
+          handleIdentifier(a, formalParameterDeclaration)
+          handleFormalParameterWithoutValue(,)
+        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        beginMetadataStar(int)
+        endMetadataStar(0)
+        beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(b)
+          handleType(int, null)
+          handleIdentifier(b, formalParameterDeclaration)
+          handleFormalParameterWithoutValue())
+        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+      endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+        beginIfStatement(if)
+          handleIdentifier(a, expression)
+          handleNoTypeArguments(==)
+          handleNoArguments(==)
+          handleSend(a, ==)
+          beginBinaryExpression(==)
+            handleLiteralNull(null)
+          endBinaryExpression(==)
+          beginBinaryExpression(||)
+            handleIdentifier(b, expression)
+            handleNoTypeArguments(==)
+            handleNoArguments(==)
+            handleSend(b, ==)
+            beginBinaryExpression(==)
+              handleLiteralNull(null)
+            endBinaryExpression(==)
+          endBinaryExpression(||)
+          handleParenthesizedCondition(()
+          beginThenStatement({)
+            beginBlock({, BlockKind(statement))
+              beginReturnStatement(return)
+                handleLiteralNull(null)
+              endReturnStatement(true, return, ;)
+            endBlock(1, {, }, BlockKind(statement))
+          endThenStatement(})
+        endIfStatement(if, null)
+      endBlockFunctionBody(1, {, })
+    endTopLevelMethod(foo, null, })
+  endTopLevelDeclaration(foo2)
+  beginMetadataStar(foo2)
+  endMetadataStar(0)
+  beginTopLevelMember(foo2)
+    beginTopLevelMethod(}, null)
+      handleNoType(})
+      handleIdentifier(foo2, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+        beginMetadataStar(int)
+        endMetadataStar(0)
+        beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(a)
+          handleType(int, null)
+          handleIdentifier(a, formalParameterDeclaration)
+          handleFormalParameterWithoutValue(,)
+        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        beginMetadataStar(int)
+        endMetadataStar(0)
+        beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(b)
+          handleType(int, null)
+          handleIdentifier(b, formalParameterDeclaration)
+          handleFormalParameterWithoutValue(,)
+        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        beginMetadataStar(int)
+        endMetadataStar(0)
+        beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(c)
+          handleType(int, null)
+          handleIdentifier(c, formalParameterDeclaration)
+          handleFormalParameterWithoutValue())
+        endFormalParameter(null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+      endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+        beginIfStatement(if)
+          handleIdentifier(a, expression)
+          handleNoTypeArguments(==)
+          handleNoArguments(==)
+          handleSend(a, ==)
+          beginBinaryExpression(==)
+            handleLiteralNull(null)
+          endBinaryExpression(==)
+          beginBinaryExpression(||)
+            handleIdentifier(b, expression)
+            handleNoTypeArguments(==)
+            handleNoArguments(==)
+            handleSend(b, ==)
+            beginBinaryExpression(==)
+              handleLiteralNull(null)
+            endBinaryExpression(==)
+          endBinaryExpression(||)
+          beginBinaryExpression(||)
+            handleIdentifier(c, expression)
+            handleNoTypeArguments(==)
+            handleNoArguments(==)
+            handleSend(c, ==)
+            beginBinaryExpression(==)
+              handleLiteralNull(null)
+            endBinaryExpression(==)
+          endBinaryExpression(||)
+          handleParenthesizedCondition(()
+          beginThenStatement({)
+            beginBlock({, BlockKind(statement))
+              beginReturnStatement(return)
+                handleLiteralNull(null)
+              endReturnStatement(true, return, ;)
+            endBlock(1, {, }, BlockKind(statement))
+          endThenStatement(})
+        endIfStatement(if, null)
+      endBlockFunctionBody(1, {, })
+    endTopLevelMethod(foo2, null, })
+  endTopLevelDeclaration(bar)
+  beginMetadataStar(bar)
+  endMetadataStar(0)
+  beginTopLevelMember(bar)
+    beginTopLevelMethod(}, null)
+      handleNoType(})
+      handleIdentifier(bar, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+        beginMetadataStar(int)
+        endMetadataStar(0)
+        beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(a)
+          handleType(int, null)
+          handleIdentifier(a, formalParameterDeclaration)
+          handleFormalParameterWithoutValue(,)
+        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        beginMetadataStar(int)
+        endMetadataStar(0)
+        beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(b)
+          handleType(int, null)
+          handleIdentifier(b, formalParameterDeclaration)
+          handleFormalParameterWithoutValue())
+        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+      endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+        beginIfStatement(if)
+          handleIdentifier(a, expression)
+          handleNoTypeArguments(==)
+          handleNoArguments(==)
+          handleSend(a, ==)
+          beginBinaryExpression(==)
+            handleLiteralNull(null)
+          endBinaryExpression(==)
+          beginBinaryExpression(&&)
+            handleIdentifier(b, expression)
+            handleNoTypeArguments(==)
+            handleNoArguments(==)
+            handleSend(b, ==)
+            beginBinaryExpression(==)
+              handleLiteralNull(null)
+            endBinaryExpression(==)
+          endBinaryExpression(&&)
+          handleParenthesizedCondition(()
+          beginThenStatement({)
+            beginBlock({, BlockKind(statement))
+              beginReturnStatement(return)
+                handleLiteralNull(null)
+              endReturnStatement(true, return, ;)
+            endBlock(1, {, }, BlockKind(statement))
+          endThenStatement(})
+        endIfStatement(if, null)
+      endBlockFunctionBody(1, {, })
+    endTopLevelMethod(bar, null, })
+  endTopLevelDeclaration(bar2)
+  beginMetadataStar(bar2)
+  endMetadataStar(0)
+  beginTopLevelMember(bar2)
+    beginTopLevelMethod(}, null)
+      handleNoType(})
+      handleIdentifier(bar2, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+        beginMetadataStar(int)
+        endMetadataStar(0)
+        beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(a)
+          handleType(int, null)
+          handleIdentifier(a, formalParameterDeclaration)
+          handleFormalParameterWithoutValue(,)
+        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        beginMetadataStar(int)
+        endMetadataStar(0)
+        beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(b)
+          handleType(int, null)
+          handleIdentifier(b, formalParameterDeclaration)
+          handleFormalParameterWithoutValue(,)
+        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        beginMetadataStar(int)
+        endMetadataStar(0)
+        beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(c)
+          handleType(int, null)
+          handleIdentifier(c, formalParameterDeclaration)
+          handleFormalParameterWithoutValue())
+        endFormalParameter(null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+      endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+        beginIfStatement(if)
+          handleIdentifier(a, expression)
+          handleNoTypeArguments(==)
+          handleNoArguments(==)
+          handleSend(a, ==)
+          beginBinaryExpression(==)
+            handleLiteralNull(null)
+          endBinaryExpression(==)
+          beginBinaryExpression(&&)
+            handleIdentifier(b, expression)
+            handleNoTypeArguments(==)
+            handleNoArguments(==)
+            handleSend(b, ==)
+            beginBinaryExpression(==)
+              handleLiteralNull(null)
+            endBinaryExpression(==)
+          endBinaryExpression(&&)
+          beginBinaryExpression(&&)
+            handleIdentifier(c, expression)
+            handleNoTypeArguments(==)
+            handleNoArguments(==)
+            handleSend(c, ==)
+            beginBinaryExpression(==)
+              handleLiteralNull(null)
+            endBinaryExpression(==)
+          endBinaryExpression(&&)
+          handleParenthesizedCondition(()
+          beginThenStatement({)
+            beginBlock({, BlockKind(statement))
+              beginReturnStatement(return)
+                handleLiteralNull(null)
+              endReturnStatement(true, return, ;)
+            endBlock(1, {, }, BlockKind(statement))
+          endThenStatement(})
+        endIfStatement(if, null)
+      endBlockFunctionBody(1, {, })
+    endTopLevelMethod(bar2, null, })
+  endTopLevelDeclaration()
+endCompilationUnit(4, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_2.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_2.crash_dart.intertwined.expect
new file mode 100644
index 0000000..9a82acc
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_2.crash_dart.intertwined.expect
@@ -0,0 +1,566 @@
+parseUnit(foo)
+  skipErrorTokens(foo)
+  listener: beginCompilationUnit(foo)
+  syntheticPreviousToken(foo)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(foo)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl()
+      listener: beginTopLevelMember(foo)
+      isReservedKeyword(()
+      parseTopLevelMethod(, null, , Instance of 'NoType', null, foo, false)
+        listener: beginTopLevelMethod(, null)
+        listener: handleNoType()
+        ensureIdentifierPotentiallyRecovered(, topLevelFunctionDeclaration, false)
+          listener: handleIdentifier(foo, topLevelFunctionDeclaration)
+        parseMethodTypeVar(foo)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(foo, foo, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(foo, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                parseMetadataStar(()
+                  listener: beginMetadataStar(int)
+                  listener: endMetadataStar(0)
+                listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+                listener: handleIdentifier(int, typeReference)
+                listener: handleNoTypeArguments(a)
+                listener: handleType(int, null)
+                ensureIdentifier(int, formalParameterDeclaration)
+                  listener: handleIdentifier(a, formalParameterDeclaration)
+                listener: handleFormalParameterWithoutValue(,)
+                listener: endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+              parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                parseMetadataStar(,)
+                  listener: beginMetadataStar(int)
+                  listener: endMetadataStar(0)
+                listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+                listener: handleIdentifier(int, typeReference)
+                listener: handleNoTypeArguments(b)
+                listener: handleType(int, null)
+                ensureIdentifier(int, formalParameterDeclaration)
+                  listener: handleIdentifier(b, formalParameterDeclaration)
+                listener: handleFormalParameterWithoutValue())
+                listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, if)
+          parseStatement({)
+            parseStatementX({)
+              parseIfStatement({)
+                listener: beginIfStatement(if)
+                ensureParenthesizedCondition(if)
+                  parseExpressionInParenthesisRest(()
+                    parseExpression(()
+                      parsePrecedenceExpression((, 1, true)
+                        parseUnaryExpression((, true)
+                          parsePrimary((, expression)
+                            parseSendOrFunctionLiteral((, expression)
+                              parseSend((, expression)
+                                ensureIdentifier((, expression)
+                                  listener: handleIdentifier(a, expression)
+                                listener: handleNoTypeArguments(==)
+                                parseArgumentsOpt(a)
+                                  listener: handleNoArguments(==)
+                                listener: handleSend(a, ==)
+                        listener: beginBinaryExpression(==)
+                        parsePrecedenceExpression(==, 8, true)
+                          parseUnaryExpression(==, true)
+                            parsePrimary(==, expression)
+                              parseLiteralNull(==)
+                                listener: handleLiteralNull(null)
+                        listener: endBinaryExpression(==)
+                        listener: beginBinaryExpression(||)
+                        parsePrecedenceExpression(||, 6, true)
+                          parseUnaryExpression(||, true)
+                            parsePrimary(||, expression)
+                              parseSendOrFunctionLiteral(||, expression)
+                                parseSend(||, expression)
+                                  ensureIdentifier(||, expression)
+                                    listener: handleIdentifier(b, expression)
+                                  listener: handleNoTypeArguments(==)
+                                  parseArgumentsOpt(b)
+                                    listener: handleNoArguments(==)
+                                  listener: handleSend(b, ==)
+                          listener: beginBinaryExpression(==)
+                          parsePrecedenceExpression(==, 8, true)
+                            parseUnaryExpression(==, true)
+                              parsePrimary(==, expression)
+                                parseLiteralNull(==)
+                                  listener: handleLiteralNull(null)
+                          listener: endBinaryExpression(==)
+                        listener: endBinaryExpression(||)
+                    ensureCloseParen(null, ()
+                  listener: handleParenthesizedCondition(()
+                listener: beginThenStatement({)
+                parseStatement())
+                  parseStatementX())
+                    parseBlock(), BlockKind(statement))
+                      ensureBlock(), null, null)
+                      listener: beginBlock({, BlockKind(statement))
+                      notEofOrValue(}, return)
+                      parseStatement({)
+                        parseStatementX({)
+                          parseReturnStatement({)
+                            listener: beginReturnStatement(return)
+                            parseExpression(return)
+                              parsePrecedenceExpression(return, 1, true)
+                                parseUnaryExpression(return, true)
+                                  parsePrimary(return, expression)
+                                    parseLiteralNull(return)
+                                      listener: handleLiteralNull(null)
+                            ensureSemicolon(null)
+                            listener: endReturnStatement(true, return, ;)
+                            inGenerator()
+                      notEofOrValue(}, })
+                      listener: endBlock(1, {, }, BlockKind(statement))
+                listener: endThenStatement(})
+                listener: endIfStatement(if, null)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(1, {, })
+        listener: endTopLevelMethod(foo, null, })
+  listener: endTopLevelDeclaration(foo2)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(foo2)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(})
+      listener: beginTopLevelMember(foo2)
+      isReservedKeyword(()
+      parseTopLevelMethod(}, null, }, Instance of 'NoType', null, foo2, false)
+        listener: beginTopLevelMethod(}, null)
+        listener: handleNoType(})
+        ensureIdentifierPotentiallyRecovered(}, topLevelFunctionDeclaration, false)
+          listener: handleIdentifier(foo2, topLevelFunctionDeclaration)
+        parseMethodTypeVar(foo2)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(foo2, foo2, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(foo2, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                parseMetadataStar(()
+                  listener: beginMetadataStar(int)
+                  listener: endMetadataStar(0)
+                listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+                listener: handleIdentifier(int, typeReference)
+                listener: handleNoTypeArguments(a)
+                listener: handleType(int, null)
+                ensureIdentifier(int, formalParameterDeclaration)
+                  listener: handleIdentifier(a, formalParameterDeclaration)
+                listener: handleFormalParameterWithoutValue(,)
+                listener: endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+              parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                parseMetadataStar(,)
+                  listener: beginMetadataStar(int)
+                  listener: endMetadataStar(0)
+                listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+                listener: handleIdentifier(int, typeReference)
+                listener: handleNoTypeArguments(b)
+                listener: handleType(int, null)
+                ensureIdentifier(int, formalParameterDeclaration)
+                  listener: handleIdentifier(b, formalParameterDeclaration)
+                listener: handleFormalParameterWithoutValue(,)
+                listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+              parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                parseMetadataStar(,)
+                  listener: beginMetadataStar(int)
+                  listener: endMetadataStar(0)
+                listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+                listener: handleIdentifier(int, typeReference)
+                listener: handleNoTypeArguments(c)
+                listener: handleType(int, null)
+                ensureIdentifier(int, formalParameterDeclaration)
+                  listener: handleIdentifier(c, formalParameterDeclaration)
+                listener: handleFormalParameterWithoutValue())
+                listener: endFormalParameter(null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, if)
+          parseStatement({)
+            parseStatementX({)
+              parseIfStatement({)
+                listener: beginIfStatement(if)
+                ensureParenthesizedCondition(if)
+                  parseExpressionInParenthesisRest(()
+                    parseExpression(()
+                      parsePrecedenceExpression((, 1, true)
+                        parseUnaryExpression((, true)
+                          parsePrimary((, expression)
+                            parseSendOrFunctionLiteral((, expression)
+                              parseSend((, expression)
+                                ensureIdentifier((, expression)
+                                  listener: handleIdentifier(a, expression)
+                                listener: handleNoTypeArguments(==)
+                                parseArgumentsOpt(a)
+                                  listener: handleNoArguments(==)
+                                listener: handleSend(a, ==)
+                        listener: beginBinaryExpression(==)
+                        parsePrecedenceExpression(==, 8, true)
+                          parseUnaryExpression(==, true)
+                            parsePrimary(==, expression)
+                              parseLiteralNull(==)
+                                listener: handleLiteralNull(null)
+                        listener: endBinaryExpression(==)
+                        listener: beginBinaryExpression(||)
+                        parsePrecedenceExpression(||, 6, true)
+                          parseUnaryExpression(||, true)
+                            parsePrimary(||, expression)
+                              parseSendOrFunctionLiteral(||, expression)
+                                parseSend(||, expression)
+                                  ensureIdentifier(||, expression)
+                                    listener: handleIdentifier(b, expression)
+                                  listener: handleNoTypeArguments(==)
+                                  parseArgumentsOpt(b)
+                                    listener: handleNoArguments(==)
+                                  listener: handleSend(b, ==)
+                          listener: beginBinaryExpression(==)
+                          parsePrecedenceExpression(==, 8, true)
+                            parseUnaryExpression(==, true)
+                              parsePrimary(==, expression)
+                                parseLiteralNull(==)
+                                  listener: handleLiteralNull(null)
+                          listener: endBinaryExpression(==)
+                        listener: endBinaryExpression(||)
+                        listener: beginBinaryExpression(||)
+                        parsePrecedenceExpression(||, 6, true)
+                          parseUnaryExpression(||, true)
+                            parsePrimary(||, expression)
+                              parseSendOrFunctionLiteral(||, expression)
+                                parseSend(||, expression)
+                                  ensureIdentifier(||, expression)
+                                    listener: handleIdentifier(c, expression)
+                                  listener: handleNoTypeArguments(==)
+                                  parseArgumentsOpt(c)
+                                    listener: handleNoArguments(==)
+                                  listener: handleSend(c, ==)
+                          listener: beginBinaryExpression(==)
+                          parsePrecedenceExpression(==, 8, true)
+                            parseUnaryExpression(==, true)
+                              parsePrimary(==, expression)
+                                parseLiteralNull(==)
+                                  listener: handleLiteralNull(null)
+                          listener: endBinaryExpression(==)
+                        listener: endBinaryExpression(||)
+                    ensureCloseParen(null, ()
+                  listener: handleParenthesizedCondition(()
+                listener: beginThenStatement({)
+                parseStatement())
+                  parseStatementX())
+                    parseBlock(), BlockKind(statement))
+                      ensureBlock(), null, null)
+                      listener: beginBlock({, BlockKind(statement))
+                      notEofOrValue(}, return)
+                      parseStatement({)
+                        parseStatementX({)
+                          parseReturnStatement({)
+                            listener: beginReturnStatement(return)
+                            parseExpression(return)
+                              parsePrecedenceExpression(return, 1, true)
+                                parseUnaryExpression(return, true)
+                                  parsePrimary(return, expression)
+                                    parseLiteralNull(return)
+                                      listener: handleLiteralNull(null)
+                            ensureSemicolon(null)
+                            listener: endReturnStatement(true, return, ;)
+                            inGenerator()
+                      notEofOrValue(}, })
+                      listener: endBlock(1, {, }, BlockKind(statement))
+                listener: endThenStatement(})
+                listener: endIfStatement(if, null)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(1, {, })
+        listener: endTopLevelMethod(foo2, null, })
+  listener: endTopLevelDeclaration(bar)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(bar)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(})
+      listener: beginTopLevelMember(bar)
+      isReservedKeyword(()
+      parseTopLevelMethod(}, null, }, Instance of 'NoType', null, bar, false)
+        listener: beginTopLevelMethod(}, null)
+        listener: handleNoType(})
+        ensureIdentifierPotentiallyRecovered(}, topLevelFunctionDeclaration, false)
+          listener: handleIdentifier(bar, topLevelFunctionDeclaration)
+        parseMethodTypeVar(bar)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(bar, bar, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(bar, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                parseMetadataStar(()
+                  listener: beginMetadataStar(int)
+                  listener: endMetadataStar(0)
+                listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+                listener: handleIdentifier(int, typeReference)
+                listener: handleNoTypeArguments(a)
+                listener: handleType(int, null)
+                ensureIdentifier(int, formalParameterDeclaration)
+                  listener: handleIdentifier(a, formalParameterDeclaration)
+                listener: handleFormalParameterWithoutValue(,)
+                listener: endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+              parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                parseMetadataStar(,)
+                  listener: beginMetadataStar(int)
+                  listener: endMetadataStar(0)
+                listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+                listener: handleIdentifier(int, typeReference)
+                listener: handleNoTypeArguments(b)
+                listener: handleType(int, null)
+                ensureIdentifier(int, formalParameterDeclaration)
+                  listener: handleIdentifier(b, formalParameterDeclaration)
+                listener: handleFormalParameterWithoutValue())
+                listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, if)
+          parseStatement({)
+            parseStatementX({)
+              parseIfStatement({)
+                listener: beginIfStatement(if)
+                ensureParenthesizedCondition(if)
+                  parseExpressionInParenthesisRest(()
+                    parseExpression(()
+                      parsePrecedenceExpression((, 1, true)
+                        parseUnaryExpression((, true)
+                          parsePrimary((, expression)
+                            parseSendOrFunctionLiteral((, expression)
+                              parseSend((, expression)
+                                ensureIdentifier((, expression)
+                                  listener: handleIdentifier(a, expression)
+                                listener: handleNoTypeArguments(==)
+                                parseArgumentsOpt(a)
+                                  listener: handleNoArguments(==)
+                                listener: handleSend(a, ==)
+                        listener: beginBinaryExpression(==)
+                        parsePrecedenceExpression(==, 8, true)
+                          parseUnaryExpression(==, true)
+                            parsePrimary(==, expression)
+                              parseLiteralNull(==)
+                                listener: handleLiteralNull(null)
+                        listener: endBinaryExpression(==)
+                        listener: beginBinaryExpression(&&)
+                        parsePrecedenceExpression(&&, 7, true)
+                          parseUnaryExpression(&&, true)
+                            parsePrimary(&&, expression)
+                              parseSendOrFunctionLiteral(&&, expression)
+                                parseSend(&&, expression)
+                                  ensureIdentifier(&&, expression)
+                                    listener: handleIdentifier(b, expression)
+                                  listener: handleNoTypeArguments(==)
+                                  parseArgumentsOpt(b)
+                                    listener: handleNoArguments(==)
+                                  listener: handleSend(b, ==)
+                          listener: beginBinaryExpression(==)
+                          parsePrecedenceExpression(==, 8, true)
+                            parseUnaryExpression(==, true)
+                              parsePrimary(==, expression)
+                                parseLiteralNull(==)
+                                  listener: handleLiteralNull(null)
+                          listener: endBinaryExpression(==)
+                        listener: endBinaryExpression(&&)
+                    ensureCloseParen(null, ()
+                  listener: handleParenthesizedCondition(()
+                listener: beginThenStatement({)
+                parseStatement())
+                  parseStatementX())
+                    parseBlock(), BlockKind(statement))
+                      ensureBlock(), null, null)
+                      listener: beginBlock({, BlockKind(statement))
+                      notEofOrValue(}, return)
+                      parseStatement({)
+                        parseStatementX({)
+                          parseReturnStatement({)
+                            listener: beginReturnStatement(return)
+                            parseExpression(return)
+                              parsePrecedenceExpression(return, 1, true)
+                                parseUnaryExpression(return, true)
+                                  parsePrimary(return, expression)
+                                    parseLiteralNull(return)
+                                      listener: handleLiteralNull(null)
+                            ensureSemicolon(null)
+                            listener: endReturnStatement(true, return, ;)
+                            inGenerator()
+                      notEofOrValue(}, })
+                      listener: endBlock(1, {, }, BlockKind(statement))
+                listener: endThenStatement(})
+                listener: endIfStatement(if, null)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(1, {, })
+        listener: endTopLevelMethod(bar, null, })
+  listener: endTopLevelDeclaration(bar2)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(bar2)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(})
+      listener: beginTopLevelMember(bar2)
+      isReservedKeyword(()
+      parseTopLevelMethod(}, null, }, Instance of 'NoType', null, bar2, false)
+        listener: beginTopLevelMethod(}, null)
+        listener: handleNoType(})
+        ensureIdentifierPotentiallyRecovered(}, topLevelFunctionDeclaration, false)
+          listener: handleIdentifier(bar2, topLevelFunctionDeclaration)
+        parseMethodTypeVar(bar2)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(bar2, bar2, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(bar2, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                parseMetadataStar(()
+                  listener: beginMetadataStar(int)
+                  listener: endMetadataStar(0)
+                listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+                listener: handleIdentifier(int, typeReference)
+                listener: handleNoTypeArguments(a)
+                listener: handleType(int, null)
+                ensureIdentifier(int, formalParameterDeclaration)
+                  listener: handleIdentifier(a, formalParameterDeclaration)
+                listener: handleFormalParameterWithoutValue(,)
+                listener: endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+              parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                parseMetadataStar(,)
+                  listener: beginMetadataStar(int)
+                  listener: endMetadataStar(0)
+                listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+                listener: handleIdentifier(int, typeReference)
+                listener: handleNoTypeArguments(b)
+                listener: handleType(int, null)
+                ensureIdentifier(int, formalParameterDeclaration)
+                  listener: handleIdentifier(b, formalParameterDeclaration)
+                listener: handleFormalParameterWithoutValue(,)
+                listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+              parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                parseMetadataStar(,)
+                  listener: beginMetadataStar(int)
+                  listener: endMetadataStar(0)
+                listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+                listener: handleIdentifier(int, typeReference)
+                listener: handleNoTypeArguments(c)
+                listener: handleType(int, null)
+                ensureIdentifier(int, formalParameterDeclaration)
+                  listener: handleIdentifier(c, formalParameterDeclaration)
+                listener: handleFormalParameterWithoutValue())
+                listener: endFormalParameter(null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, if)
+          parseStatement({)
+            parseStatementX({)
+              parseIfStatement({)
+                listener: beginIfStatement(if)
+                ensureParenthesizedCondition(if)
+                  parseExpressionInParenthesisRest(()
+                    parseExpression(()
+                      parsePrecedenceExpression((, 1, true)
+                        parseUnaryExpression((, true)
+                          parsePrimary((, expression)
+                            parseSendOrFunctionLiteral((, expression)
+                              parseSend((, expression)
+                                ensureIdentifier((, expression)
+                                  listener: handleIdentifier(a, expression)
+                                listener: handleNoTypeArguments(==)
+                                parseArgumentsOpt(a)
+                                  listener: handleNoArguments(==)
+                                listener: handleSend(a, ==)
+                        listener: beginBinaryExpression(==)
+                        parsePrecedenceExpression(==, 8, true)
+                          parseUnaryExpression(==, true)
+                            parsePrimary(==, expression)
+                              parseLiteralNull(==)
+                                listener: handleLiteralNull(null)
+                        listener: endBinaryExpression(==)
+                        listener: beginBinaryExpression(&&)
+                        parsePrecedenceExpression(&&, 7, true)
+                          parseUnaryExpression(&&, true)
+                            parsePrimary(&&, expression)
+                              parseSendOrFunctionLiteral(&&, expression)
+                                parseSend(&&, expression)
+                                  ensureIdentifier(&&, expression)
+                                    listener: handleIdentifier(b, expression)
+                                  listener: handleNoTypeArguments(==)
+                                  parseArgumentsOpt(b)
+                                    listener: handleNoArguments(==)
+                                  listener: handleSend(b, ==)
+                          listener: beginBinaryExpression(==)
+                          parsePrecedenceExpression(==, 8, true)
+                            parseUnaryExpression(==, true)
+                              parsePrimary(==, expression)
+                                parseLiteralNull(==)
+                                  listener: handleLiteralNull(null)
+                          listener: endBinaryExpression(==)
+                        listener: endBinaryExpression(&&)
+                        listener: beginBinaryExpression(&&)
+                        parsePrecedenceExpression(&&, 7, true)
+                          parseUnaryExpression(&&, true)
+                            parsePrimary(&&, expression)
+                              parseSendOrFunctionLiteral(&&, expression)
+                                parseSend(&&, expression)
+                                  ensureIdentifier(&&, expression)
+                                    listener: handleIdentifier(c, expression)
+                                  listener: handleNoTypeArguments(==)
+                                  parseArgumentsOpt(c)
+                                    listener: handleNoArguments(==)
+                                  listener: handleSend(c, ==)
+                          listener: beginBinaryExpression(==)
+                          parsePrecedenceExpression(==, 8, true)
+                            parseUnaryExpression(==, true)
+                              parsePrimary(==, expression)
+                                parseLiteralNull(==)
+                                  listener: handleLiteralNull(null)
+                          listener: endBinaryExpression(==)
+                        listener: endBinaryExpression(&&)
+                    ensureCloseParen(null, ()
+                  listener: handleParenthesizedCondition(()
+                listener: beginThenStatement({)
+                parseStatement())
+                  parseStatementX())
+                    parseBlock(), BlockKind(statement))
+                      ensureBlock(), null, null)
+                      listener: beginBlock({, BlockKind(statement))
+                      notEofOrValue(}, return)
+                      parseStatement({)
+                        parseStatementX({)
+                          parseReturnStatement({)
+                            listener: beginReturnStatement(return)
+                            parseExpression(return)
+                              parsePrecedenceExpression(return, 1, true)
+                                parseUnaryExpression(return, true)
+                                  parsePrimary(return, expression)
+                                    parseLiteralNull(return)
+                                      listener: handleLiteralNull(null)
+                            ensureSemicolon(null)
+                            listener: endReturnStatement(true, return, ;)
+                            inGenerator()
+                      notEofOrValue(}, })
+                      listener: endBlock(1, {, }, BlockKind(statement))
+                listener: endThenStatement(})
+                listener: endIfStatement(if, null)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(1, {, })
+        listener: endTopLevelMethod(bar2, null, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(foo)
+  listener: endCompilationUnit(4, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_2.crash_dart.parser.expect b/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_2.crash_dart.parser.expect
new file mode 100644
index 0000000..3dea4b2
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_2.crash_dart.parser.expect
@@ -0,0 +1,49 @@
+foo(int a, int b){
+if (a == null || b == null){
+return null;
+}
+}
+
+foo2(int a, int b, int c){
+if (a == null || b == null || c == null){
+return null;
+}
+}
+
+bar(int a, int b){
+if (a == null && b == null){
+return null;
+}
+}
+
+bar2(int a, int b, int c){
+if (a == null && b == null && c == null){
+return null;
+}
+}
+
+
+foo[StringToken]([BeginToken]int[StringToken] a[StringToken],[SimpleToken] int[StringToken] b[StringToken])[SimpleToken]{[BeginToken]
+if[KeywordToken] ([BeginToken]a[StringToken] ==[SimpleToken] null[KeywordToken] ||[SimpleToken] b[StringToken] ==[SimpleToken] null[KeywordToken])[SimpleToken]{[BeginToken]
+return[KeywordToken] null[KeywordToken];[SimpleToken]
+}[SimpleToken]
+}[SimpleToken]
+
+foo2[StringToken]([BeginToken]int[StringToken] a[StringToken],[SimpleToken] int[StringToken] b[StringToken],[SimpleToken] int[StringToken] c[StringToken])[SimpleToken]{[BeginToken]
+if[KeywordToken] ([BeginToken]a[StringToken] ==[SimpleToken] null[KeywordToken] ||[SimpleToken] b[StringToken] ==[SimpleToken] null[KeywordToken] ||[SimpleToken] c[StringToken] ==[SimpleToken] null[KeywordToken])[SimpleToken]{[BeginToken]
+return[KeywordToken] null[KeywordToken];[SimpleToken]
+}[SimpleToken]
+}[SimpleToken]
+
+bar[StringToken]([BeginToken]int[StringToken] a[StringToken],[SimpleToken] int[StringToken] b[StringToken])[SimpleToken]{[BeginToken]
+if[KeywordToken] ([BeginToken]a[StringToken] ==[SimpleToken] null[KeywordToken] &&[SimpleToken] b[StringToken] ==[SimpleToken] null[KeywordToken])[SimpleToken]{[BeginToken]
+return[KeywordToken] null[KeywordToken];[SimpleToken]
+}[SimpleToken]
+}[SimpleToken]
+
+bar2[StringToken]([BeginToken]int[StringToken] a[StringToken],[SimpleToken] int[StringToken] b[StringToken],[SimpleToken] int[StringToken] c[StringToken])[SimpleToken]{[BeginToken]
+if[KeywordToken] ([BeginToken]a[StringToken] ==[SimpleToken] null[KeywordToken] &&[SimpleToken] b[StringToken] ==[SimpleToken] null[KeywordToken] &&[SimpleToken] c[StringToken] ==[SimpleToken] null[KeywordToken])[SimpleToken]{[BeginToken]
+return[KeywordToken] null[KeywordToken];[SimpleToken]
+}[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_2.crash_dart.scanner.expect b/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_2.crash_dart.scanner.expect
new file mode 100644
index 0000000..3dea4b2
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_2.crash_dart.scanner.expect
@@ -0,0 +1,49 @@
+foo(int a, int b){
+if (a == null || b == null){
+return null;
+}
+}
+
+foo2(int a, int b, int c){
+if (a == null || b == null || c == null){
+return null;
+}
+}
+
+bar(int a, int b){
+if (a == null && b == null){
+return null;
+}
+}
+
+bar2(int a, int b, int c){
+if (a == null && b == null && c == null){
+return null;
+}
+}
+
+
+foo[StringToken]([BeginToken]int[StringToken] a[StringToken],[SimpleToken] int[StringToken] b[StringToken])[SimpleToken]{[BeginToken]
+if[KeywordToken] ([BeginToken]a[StringToken] ==[SimpleToken] null[KeywordToken] ||[SimpleToken] b[StringToken] ==[SimpleToken] null[KeywordToken])[SimpleToken]{[BeginToken]
+return[KeywordToken] null[KeywordToken];[SimpleToken]
+}[SimpleToken]
+}[SimpleToken]
+
+foo2[StringToken]([BeginToken]int[StringToken] a[StringToken],[SimpleToken] int[StringToken] b[StringToken],[SimpleToken] int[StringToken] c[StringToken])[SimpleToken]{[BeginToken]
+if[KeywordToken] ([BeginToken]a[StringToken] ==[SimpleToken] null[KeywordToken] ||[SimpleToken] b[StringToken] ==[SimpleToken] null[KeywordToken] ||[SimpleToken] c[StringToken] ==[SimpleToken] null[KeywordToken])[SimpleToken]{[BeginToken]
+return[KeywordToken] null[KeywordToken];[SimpleToken]
+}[SimpleToken]
+}[SimpleToken]
+
+bar[StringToken]([BeginToken]int[StringToken] a[StringToken],[SimpleToken] int[StringToken] b[StringToken])[SimpleToken]{[BeginToken]
+if[KeywordToken] ([BeginToken]a[StringToken] ==[SimpleToken] null[KeywordToken] &&[SimpleToken] b[StringToken] ==[SimpleToken] null[KeywordToken])[SimpleToken]{[BeginToken]
+return[KeywordToken] null[KeywordToken];[SimpleToken]
+}[SimpleToken]
+}[SimpleToken]
+
+bar2[StringToken]([BeginToken]int[StringToken] a[StringToken],[SimpleToken] int[StringToken] b[StringToken],[SimpleToken] int[StringToken] c[StringToken])[SimpleToken]{[BeginToken]
+if[KeywordToken] ([BeginToken]a[StringToken] ==[SimpleToken] null[KeywordToken] &&[SimpleToken] b[StringToken] ==[SimpleToken] null[KeywordToken] &&[SimpleToken] c[StringToken] ==[SimpleToken] null[KeywordToken])[SimpleToken]{[BeginToken]
+return[KeywordToken] null[KeywordToken];[SimpleToken]
+}[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/test/spell_checking_list_common.txt b/pkg/front_end/test/spell_checking_list_common.txt
index f92c75c..9601042 100644
--- a/pkg/front_end/test/spell_checking_list_common.txt
+++ b/pkg/front_end/test/spell_checking_list_common.txt
@@ -794,6 +794,7 @@
 dependencies
 dependency
 dependent
+dependents
 depending
 depends
 deprecate
@@ -3126,6 +3127,7 @@
 type
 typed
 typedef
+typedef's
 typedefs
 types
 typically
diff --git a/pkg/front_end/testcases/general/bounds_check_in_typedef.dart b/pkg/front_end/testcases/general/bounds_check_in_typedef.dart
new file mode 100644
index 0000000..955eb3d
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_check_in_typedef.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A<X extends String> {}
+
+typedef F = Function<Z extends A<Y>>() Function<Y extends num>();
+typedef G = void Function<Y extends num>(Function<Z extends A<Y>>());
+
+main() {}
diff --git a/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.outline.expect b/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.outline.expect
new file mode 100644
index 0000000..cdad149
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.outline.expect
@@ -0,0 +1,41 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_check_in_typedef.dart:7:40: Error: Type argument 'Y' doesn't conform to the bound 'String' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef F = Function<Z extends A<Y>>() Function<Y extends num>();
+//                                        ^
+// pkg/front_end/testcases/general/bounds_check_in_typedef.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends String> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_check_in_typedef.dart:8:18: Error: Type argument 'Y' doesn't conform to the bound 'String' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef G = void Function<Y extends num>(Function<Z extends A<Y>>());
+//                  ^
+// pkg/front_end/testcases/general/bounds_check_in_typedef.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends String> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F = <Y extends core::num* = dynamic>() →* <Z extends self::A<Y*>* = dynamic>() →* dynamic;
+typedef G = <Y extends core::num* = dynamic>(<Z extends self::A<Y*>* = dynamic>() →* dynamic) →* void;
+class A<X extends core::String* = core::String*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.strong.expect b/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.strong.expect
new file mode 100644
index 0000000..1bf550a
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.strong.expect
@@ -0,0 +1,41 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_check_in_typedef.dart:7:40: Error: Type argument 'Y' doesn't conform to the bound 'String' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef F = Function<Z extends A<Y>>() Function<Y extends num>();
+//                                        ^
+// pkg/front_end/testcases/general/bounds_check_in_typedef.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends String> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_check_in_typedef.dart:8:18: Error: Type argument 'Y' doesn't conform to the bound 'String' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef G = void Function<Y extends num>(Function<Z extends A<Y>>());
+//                  ^
+// pkg/front_end/testcases/general/bounds_check_in_typedef.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends String> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F = <Y extends core::num* = dynamic>() →* <Z extends self::A<Y*>* = dynamic>() →* dynamic;
+typedef G = <Y extends core::num* = dynamic>(<Z extends self::A<Y*>* = dynamic>() →* dynamic) →* void;
+class A<X extends core::String* = core::String*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.strong.transformed.expect b/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.strong.transformed.expect
new file mode 100644
index 0000000..1bf550a
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.strong.transformed.expect
@@ -0,0 +1,41 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_check_in_typedef.dart:7:40: Error: Type argument 'Y' doesn't conform to the bound 'String' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef F = Function<Z extends A<Y>>() Function<Y extends num>();
+//                                        ^
+// pkg/front_end/testcases/general/bounds_check_in_typedef.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends String> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_check_in_typedef.dart:8:18: Error: Type argument 'Y' doesn't conform to the bound 'String' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef G = void Function<Y extends num>(Function<Z extends A<Y>>());
+//                  ^
+// pkg/front_end/testcases/general/bounds_check_in_typedef.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends String> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F = <Y extends core::num* = dynamic>() →* <Z extends self::A<Y*>* = dynamic>() →* dynamic;
+typedef G = <Y extends core::num* = dynamic>(<Z extends self::A<Y*>* = dynamic>() →* dynamic) →* void;
+class A<X extends core::String* = core::String*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.textual_outline.expect b/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.textual_outline.expect
new file mode 100644
index 0000000..0005089
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.textual_outline.expect
@@ -0,0 +1,5 @@
+class A<X extends String> {}
+
+typedef F = Function<Z extends A<Y>>() Function<Y extends num>();
+typedef G = void Function<Y extends num>(Function<Z extends A<Y>>());
+main() {}
diff --git a/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..66a369f
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.textual_outline_modelled.expect
@@ -0,0 +1,5 @@
+class A<X extends String> {}
+
+main() {}
+typedef F = Function<Z extends A<Y>>() Function<Y extends num>();
+typedef G = void Function<Y extends num>(Function<Z extends A<Y>>());
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.outline.expect
index 1686062..6f257ee 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.outline.expect
@@ -2,6 +2,10 @@
 //
 // Problems in library:
 //
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart:9:12: Error: Type variables can't have generic function types in their bounds.
+// class Hest<TypeX extends Fisk> {}
+//            ^^^^^
+//
 // pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart:11:9: Error: Generic type 'Fisk' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Hest'.
 // Try providing type arguments to 'Hest' here or to some other raw types in the bounds along the reference chain.
 // typedef Fisk = void Function<TypeY extends Hest>();
@@ -17,7 +21,7 @@
 import "dart:core" as core;
 
 typedef Fisk = <TypeY extends core::Object* = dynamic>() →* void;
-class Hest<TypeX extends <TypeY extends core::Object* = dynamic>() →* void = <TypeY extends core::Object* = dynamic>() →* void> extends core::Object {
+class Hest<TypeX extends <TypeY extends core::Object* = dynamic>() →* void = dynamic> extends core::Object {
   synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.strong.expect
index 7203cff..a8be06f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.strong.expect
@@ -2,6 +2,10 @@
 //
 // Problems in library:
 //
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart:9:12: Error: Type variables can't have generic function types in their bounds.
+// class Hest<TypeX extends Fisk> {}
+//            ^^^^^
+//
 // pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart:11:9: Error: Generic type 'Fisk' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Hest'.
 // Try providing type arguments to 'Hest' here or to some other raw types in the bounds along the reference chain.
 // typedef Fisk = void Function<TypeY extends Hest>();
@@ -17,7 +21,7 @@
 import "dart:core" as core;
 
 typedef Fisk = <TypeY extends core::Object* = dynamic>() →* void;
-class Hest<TypeX extends <TypeY extends core::Object* = dynamic>() →* void = <TypeY extends core::Object* = dynamic>() →* void> extends core::Object {
+class Hest<TypeX extends <TypeY extends core::Object* = dynamic>() →* void = dynamic> extends core::Object {
   synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.strong.transformed.expect
index 7203cff..a8be06f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.strong.transformed.expect
@@ -2,6 +2,10 @@
 //
 // Problems in library:
 //
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart:9:12: Error: Type variables can't have generic function types in their bounds.
+// class Hest<TypeX extends Fisk> {}
+//            ^^^^^
+//
 // pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart:11:9: Error: Generic type 'Fisk' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Hest'.
 // Try providing type arguments to 'Hest' here or to some other raw types in the bounds along the reference chain.
 // typedef Fisk = void Function<TypeY extends Hest>();
@@ -17,7 +21,7 @@
 import "dart:core" as core;
 
 typedef Fisk = <TypeY extends core::Object* = dynamic>() →* void;
-class Hest<TypeX extends <TypeY extends core::Object* = dynamic>() →* void = <TypeY extends core::Object* = dynamic>() →* void> extends core::Object {
+class Hest<TypeX extends <TypeY extends core::Object* = dynamic>() →* void = dynamic> extends core::Object {
   synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.outline.expect
index f759e2b..c9e1d02 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.outline.expect
@@ -16,7 +16,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Fisk<unrelated TypeY extends dynamic = dynamic> = () →* void;
+typedef Fisk<unrelated TypeY extends core::Object* = dynamic> = () →* void;
 class Hest<TypeX extends () →* void = () →* void> extends core::Object {
   synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.strong.expect
index 8ccdcd1..165ac5e 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.strong.expect
@@ -16,7 +16,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Fisk<unrelated TypeY extends dynamic = dynamic> = () →* void;
+typedef Fisk<unrelated TypeY extends core::Object* = dynamic> = () →* void;
 class Hest<TypeX extends () →* void = () →* void> extends core::Object {
   synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.strong.transformed.expect
index 8ccdcd1..165ac5e 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.strong.transformed.expect
@@ -16,7 +16,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Fisk<unrelated TypeY extends dynamic = dynamic> = () →* void;
+typedef Fisk<unrelated TypeY extends core::Object* = dynamic> = () →* void;
 class Hest<TypeX extends () →* void = () →* void> extends core::Object {
   synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/nnbd/issue34803.dart b/pkg/front_end/testcases/nnbd/issue34803.dart
new file mode 100644
index 0000000..ec6eda3
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue34803.dart
@@ -0,0 +1,8 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A<X extends G<num>> {}
+typedef G<X> = void Function<Y extends X>();
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue34803.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue34803.dart.outline.expect
new file mode 100644
index 0000000..81ae317
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue34803.dart.outline.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue34803.dart:5:9: Error: Type variables can't have generic function types in their bounds.
+// class A<X extends G<num>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef G<invariant X extends core::Object? = dynamic> = <Y extends X% = dynamic>() → void;
+class A<X extends <Y extends core::num = dynamic>() → void = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/issue34803.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue34803.dart.strong.expect
new file mode 100644
index 0000000..7cf7baa
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue34803.dart.strong.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue34803.dart:5:9: Error: Type variables can't have generic function types in their bounds.
+// class A<X extends G<num>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef G<invariant X extends core::Object? = dynamic> = <Y extends X% = dynamic>() → void;
+class A<X extends <Y extends core::num = dynamic>() → void = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue34803.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue34803.dart.strong.transformed.expect
new file mode 100644
index 0000000..7cf7baa
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue34803.dart.strong.transformed.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue34803.dart:5:9: Error: Type variables can't have generic function types in their bounds.
+// class A<X extends G<num>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef G<invariant X extends core::Object? = dynamic> = <Y extends X% = dynamic>() → void;
+class A<X extends <Y extends core::num = dynamic>() → void = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue34803.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue34803.dart.textual_outline.expect
new file mode 100644
index 0000000..3d362ac
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue34803.dart.textual_outline.expect
@@ -0,0 +1,4 @@
+class A<X extends G<num>> {}
+
+typedef G<X> = void Function<Y extends X>();
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue34803.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/issue34803.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..92dc404
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue34803.dart.textual_outline_modelled.expect
@@ -0,0 +1,4 @@
+class A<X extends G<num>> {}
+
+main() {}
+typedef G<X> = void Function<Y extends X>();
diff --git a/pkg/front_end/testcases/nnbd/issue34803.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue34803.dart.weak.expect
new file mode 100644
index 0000000..7cf7baa
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue34803.dart.weak.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue34803.dart:5:9: Error: Type variables can't have generic function types in their bounds.
+// class A<X extends G<num>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef G<invariant X extends core::Object? = dynamic> = <Y extends X% = dynamic>() → void;
+class A<X extends <Y extends core::num = dynamic>() → void = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue34803.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue34803.dart.weak.transformed.expect
new file mode 100644
index 0000000..7cf7baa
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue34803.dart.weak.transformed.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue34803.dart:5:9: Error: Type variables can't have generic function types in their bounds.
+// class A<X extends G<num>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef G<invariant X extends core::Object? = dynamic> = <Y extends X% = dynamic>() → void;
+class A<X extends <Y extends core::num = dynamic>() → void = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42434.dart b/pkg/front_end/testcases/nnbd/issue42434.dart
new file mode 100644
index 0000000..8616955
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42434.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A<X extends A<X>> {}
+
+typedef AAlias<X> = Function<X1 extends A<X>> ();
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue42434.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue42434.dart.outline.expect
new file mode 100644
index 0000000..46e4efc
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42434.dart.outline.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42434.dart:7:21: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>' of the type variable 'X' on 'A'.
+//  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue42434.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue42434.dart'.
+//  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue42434.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef AAlias<X> = Function<X1 extends A<X>> ();
+//                     ^
+// pkg/front_end/testcases/nnbd/issue42434.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef AAlias<invariant X extends core::Object? = dynamic> = <X1 extends self::A<X%> = dynamic>() → dynamic;
+class A<X extends self::A<self::A::X> = self::A<dynamic>> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/issue42434.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42434.dart.strong.expect
new file mode 100644
index 0000000..e263ad8
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42434.dart.strong.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42434.dart:7:21: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>' of the type variable 'X' on 'A'.
+//  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue42434.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue42434.dart'.
+//  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue42434.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef AAlias<X> = Function<X1 extends A<X>> ();
+//                     ^
+// pkg/front_end/testcases/nnbd/issue42434.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef AAlias<invariant X extends core::Object? = dynamic> = <X1 extends self::A<X%> = dynamic>() → dynamic;
+class A<X extends self::A<self::A::X> = self::A<dynamic>> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42434.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42434.dart.strong.transformed.expect
new file mode 100644
index 0000000..e263ad8
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42434.dart.strong.transformed.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42434.dart:7:21: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>' of the type variable 'X' on 'A'.
+//  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue42434.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue42434.dart'.
+//  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue42434.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef AAlias<X> = Function<X1 extends A<X>> ();
+//                     ^
+// pkg/front_end/testcases/nnbd/issue42434.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef AAlias<invariant X extends core::Object? = dynamic> = <X1 extends self::A<X%> = dynamic>() → dynamic;
+class A<X extends self::A<self::A::X> = self::A<dynamic>> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42434.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue42434.dart.textual_outline.expect
new file mode 100644
index 0000000..388a33b
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42434.dart.textual_outline.expect
@@ -0,0 +1,4 @@
+class A<X extends A<X>> {}
+
+typedef AAlias<X> = Function<X1 extends A<X>>();
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue42434.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/issue42434.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..58c739f
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42434.dart.textual_outline_modelled.expect
@@ -0,0 +1,4 @@
+class A<X extends A<X>> {}
+
+main() {}
+typedef AAlias<X> = Function<X1 extends A<X>>();
diff --git a/pkg/front_end/testcases/nnbd/issue42434.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42434.dart.weak.expect
new file mode 100644
index 0000000..e263ad8
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42434.dart.weak.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42434.dart:7:21: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>' of the type variable 'X' on 'A'.
+//  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue42434.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue42434.dart'.
+//  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue42434.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef AAlias<X> = Function<X1 extends A<X>> ();
+//                     ^
+// pkg/front_end/testcases/nnbd/issue42434.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef AAlias<invariant X extends core::Object? = dynamic> = <X1 extends self::A<X%> = dynamic>() → dynamic;
+class A<X extends self::A<self::A::X> = self::A<dynamic>> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42434.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42434.dart.weak.transformed.expect
new file mode 100644
index 0000000..e263ad8
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42434.dart.weak.transformed.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42434.dart:7:21: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>' of the type variable 'X' on 'A'.
+//  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue42434.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue42434.dart'.
+//  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue42434.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef AAlias<X> = Function<X1 extends A<X>> ();
+//                     ^
+// pkg/front_end/testcases/nnbd/issue42434.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef AAlias<invariant X extends core::Object? = dynamic> = <X1 extends self::A<X%> = dynamic>() → dynamic;
+class A<X extends self::A<self::A::X> = self::A<dynamic>> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42434_2.dart b/pkg/front_end/testcases/nnbd/issue42434_2.dart
new file mode 100644
index 0000000..614b86d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42434_2.dart
@@ -0,0 +1,11 @@
+// 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.
+
+typedef AAlias<X> = Function<X1 extends A<X>> ();
+
+typedef A<X extends B<X>> = Function();
+
+class B<X> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue42434_2.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue42434_2.dart.outline.expect
new file mode 100644
index 0000000..d314070
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42434_2.dart.outline.expect
@@ -0,0 +1,26 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42434_2.dart:5:21: Error: Type argument 'X/*1*/' doesn't conform to the bound 'B<X/*2*/>' of the type variable 'X' on 'A'.
+//  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue42434_2.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/issue42434_2.dart'.
+//  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue42434_2.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef AAlias<X> = Function<X1 extends A<X>> ();
+//                     ^
+// pkg/front_end/testcases/nnbd/issue42434_2.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef A<X extends B<X>> = Function();
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef AAlias<unrelated X extends core::Object? = dynamic> = <X1 extends () → dynamic = dynamic>() → dynamic;
+typedef A<unrelated X extends self::B<X> = self::B<dynamic>> = () → dynamic;
+class B<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::X%>
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/issue42434_2.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42434_2.dart.strong.expect
new file mode 100644
index 0000000..88588f6
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42434_2.dart.strong.expect
@@ -0,0 +1,26 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42434_2.dart:5:21: Error: Type argument 'X/*1*/' doesn't conform to the bound 'B<X/*2*/>' of the type variable 'X' on 'A'.
+//  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue42434_2.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/issue42434_2.dart'.
+//  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue42434_2.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef AAlias<X> = Function<X1 extends A<X>> ();
+//                     ^
+// pkg/front_end/testcases/nnbd/issue42434_2.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef A<X extends B<X>> = Function();
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef AAlias<unrelated X extends core::Object? = dynamic> = <X1 extends () → dynamic = dynamic>() → dynamic;
+typedef A<unrelated X extends self::B<X> = self::B<dynamic>> = () → dynamic;
+class B<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::X%>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42434_2.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42434_2.dart.strong.transformed.expect
new file mode 100644
index 0000000..88588f6
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42434_2.dart.strong.transformed.expect
@@ -0,0 +1,26 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42434_2.dart:5:21: Error: Type argument 'X/*1*/' doesn't conform to the bound 'B<X/*2*/>' of the type variable 'X' on 'A'.
+//  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue42434_2.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/issue42434_2.dart'.
+//  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue42434_2.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef AAlias<X> = Function<X1 extends A<X>> ();
+//                     ^
+// pkg/front_end/testcases/nnbd/issue42434_2.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef A<X extends B<X>> = Function();
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef AAlias<unrelated X extends core::Object? = dynamic> = <X1 extends () → dynamic = dynamic>() → dynamic;
+typedef A<unrelated X extends self::B<X> = self::B<dynamic>> = () → dynamic;
+class B<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::X%>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42434_2.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue42434_2.dart.textual_outline.expect
new file mode 100644
index 0000000..608b52e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42434_2.dart.textual_outline.expect
@@ -0,0 +1,6 @@
+typedef AAlias<X> = Function<X1 extends A<X>>();
+typedef A<X extends B<X>> = Function();
+
+class B<X> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue42434_2.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/issue42434_2.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..3b7a00b
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42434_2.dart.textual_outline_modelled.expect
@@ -0,0 +1,5 @@
+class B<X> {}
+
+main() {}
+typedef A<X extends B<X>> = Function();
+typedef AAlias<X> = Function<X1 extends A<X>>();
diff --git a/pkg/front_end/testcases/nnbd/issue42434_2.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42434_2.dart.weak.expect
new file mode 100644
index 0000000..88588f6
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42434_2.dart.weak.expect
@@ -0,0 +1,26 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42434_2.dart:5:21: Error: Type argument 'X/*1*/' doesn't conform to the bound 'B<X/*2*/>' of the type variable 'X' on 'A'.
+//  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue42434_2.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/issue42434_2.dart'.
+//  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue42434_2.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef AAlias<X> = Function<X1 extends A<X>> ();
+//                     ^
+// pkg/front_end/testcases/nnbd/issue42434_2.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef A<X extends B<X>> = Function();
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef AAlias<unrelated X extends core::Object? = dynamic> = <X1 extends () → dynamic = dynamic>() → dynamic;
+typedef A<unrelated X extends self::B<X> = self::B<dynamic>> = () → dynamic;
+class B<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::X%>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42434_2.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42434_2.dart.weak.transformed.expect
new file mode 100644
index 0000000..88588f6
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42434_2.dart.weak.transformed.expect
@@ -0,0 +1,26 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42434_2.dart:5:21: Error: Type argument 'X/*1*/' doesn't conform to the bound 'B<X/*2*/>' of the type variable 'X' on 'A'.
+//  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue42434_2.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/issue42434_2.dart'.
+//  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue42434_2.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef AAlias<X> = Function<X1 extends A<X>> ();
+//                     ^
+// pkg/front_end/testcases/nnbd/issue42434_2.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef A<X extends B<X>> = Function();
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef AAlias<unrelated X extends core::Object? = dynamic> = <X1 extends () → dynamic = dynamic>() → dynamic;
+typedef A<unrelated X extends self::B<X> = self::B<dynamic>> = () → dynamic;
+class B<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::X%>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue44455.dart b/pkg/front_end/testcases/nnbd/issue44455.dart
new file mode 100644
index 0000000..20797b94
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue44455.dart
@@ -0,0 +1,11 @@
+// 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.
+
+typedef F<Y extends num> = Y Function();
+class A<X extends F<X>> {}
+
+class A2<X extends F2<X>> {}
+typedef F2<Y extends num> = Y Function();
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue44455.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue44455.dart.outline.expect
new file mode 100644
index 0000000..6628b32
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue44455.dart.outline.expect
@@ -0,0 +1,35 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue44455.dart:6:9: Error: Type argument 'X' doesn't conform to the bound 'num' of the type variable 'Y' on 'F'.
+// Try changing type arguments so that they conform to the bounds.
+// class A<X extends F<X>> {}
+//         ^
+// pkg/front_end/testcases/nnbd/issue44455.dart:5:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<Y extends num> = Y Function();
+//           ^
+//
+// pkg/front_end/testcases/nnbd/issue44455.dart:8:10: Error: Type argument 'X' doesn't conform to the bound 'num' of the type variable 'Y' on 'F2'.
+// Try changing type arguments so that they conform to the bounds.
+// class A2<X extends F2<X>> {}
+//          ^
+// pkg/front_end/testcases/nnbd/issue44455.dart:9:12: Context: This is the type variable whose bound isn't conformed to.
+// typedef F2<Y extends num> = Y Function();
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<Y extends core::num = core::num> = () → Y;
+typedef F2<Y extends core::num = core::num> = () → Y;
+class A<X extends () → self::A::X = () → dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    ;
+}
+class A2<X extends () → self::A2::X = () → dynamic> extends core::Object {
+  synthetic constructor •() → self::A2<self::A2::X>
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/issue44455.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue44455.dart.strong.expect
new file mode 100644
index 0000000..2d1e9e6
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue44455.dart.strong.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue44455.dart:6:9: Error: Type argument 'X' doesn't conform to the bound 'num' of the type variable 'Y' on 'F'.
+// Try changing type arguments so that they conform to the bounds.
+// class A<X extends F<X>> {}
+//         ^
+// pkg/front_end/testcases/nnbd/issue44455.dart:5:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<Y extends num> = Y Function();
+//           ^
+//
+// pkg/front_end/testcases/nnbd/issue44455.dart:8:10: Error: Type argument 'X' doesn't conform to the bound 'num' of the type variable 'Y' on 'F2'.
+// Try changing type arguments so that they conform to the bounds.
+// class A2<X extends F2<X>> {}
+//          ^
+// pkg/front_end/testcases/nnbd/issue44455.dart:9:12: Context: This is the type variable whose bound isn't conformed to.
+// typedef F2<Y extends num> = Y Function();
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<Y extends core::num = core::num> = () → Y;
+typedef F2<Y extends core::num = core::num> = () → Y;
+class A<X extends () → self::A::X = () → dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    : super core::Object::•()
+    ;
+}
+class A2<X extends () → self::A2::X = () → dynamic> extends core::Object {
+  synthetic constructor •() → self::A2<self::A2::X>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue44455.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue44455.dart.strong.transformed.expect
new file mode 100644
index 0000000..2d1e9e6
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue44455.dart.strong.transformed.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue44455.dart:6:9: Error: Type argument 'X' doesn't conform to the bound 'num' of the type variable 'Y' on 'F'.
+// Try changing type arguments so that they conform to the bounds.
+// class A<X extends F<X>> {}
+//         ^
+// pkg/front_end/testcases/nnbd/issue44455.dart:5:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<Y extends num> = Y Function();
+//           ^
+//
+// pkg/front_end/testcases/nnbd/issue44455.dart:8:10: Error: Type argument 'X' doesn't conform to the bound 'num' of the type variable 'Y' on 'F2'.
+// Try changing type arguments so that they conform to the bounds.
+// class A2<X extends F2<X>> {}
+//          ^
+// pkg/front_end/testcases/nnbd/issue44455.dart:9:12: Context: This is the type variable whose bound isn't conformed to.
+// typedef F2<Y extends num> = Y Function();
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<Y extends core::num = core::num> = () → Y;
+typedef F2<Y extends core::num = core::num> = () → Y;
+class A<X extends () → self::A::X = () → dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    : super core::Object::•()
+    ;
+}
+class A2<X extends () → self::A2::X = () → dynamic> extends core::Object {
+  synthetic constructor •() → self::A2<self::A2::X>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue44455.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue44455.dart.textual_outline.expect
new file mode 100644
index 0000000..ff5016e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue44455.dart.textual_outline.expect
@@ -0,0 +1,8 @@
+typedef F<Y extends num> = Y Function();
+
+class A<X extends F<X>> {}
+
+class A2<X extends F2<X>> {}
+
+typedef F2<Y extends num> = Y Function();
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue44455.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/issue44455.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..101871b
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue44455.dart.textual_outline_modelled.expect
@@ -0,0 +1,7 @@
+class A<X extends F<X>> {}
+
+class A2<X extends F2<X>> {}
+
+main() {}
+typedef F<Y extends num> = Y Function();
+typedef F2<Y extends num> = Y Function();
diff --git a/pkg/front_end/testcases/nnbd/issue44455.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue44455.dart.weak.expect
new file mode 100644
index 0000000..2d1e9e6
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue44455.dart.weak.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue44455.dart:6:9: Error: Type argument 'X' doesn't conform to the bound 'num' of the type variable 'Y' on 'F'.
+// Try changing type arguments so that they conform to the bounds.
+// class A<X extends F<X>> {}
+//         ^
+// pkg/front_end/testcases/nnbd/issue44455.dart:5:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<Y extends num> = Y Function();
+//           ^
+//
+// pkg/front_end/testcases/nnbd/issue44455.dart:8:10: Error: Type argument 'X' doesn't conform to the bound 'num' of the type variable 'Y' on 'F2'.
+// Try changing type arguments so that they conform to the bounds.
+// class A2<X extends F2<X>> {}
+//          ^
+// pkg/front_end/testcases/nnbd/issue44455.dart:9:12: Context: This is the type variable whose bound isn't conformed to.
+// typedef F2<Y extends num> = Y Function();
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<Y extends core::num = core::num> = () → Y;
+typedef F2<Y extends core::num = core::num> = () → Y;
+class A<X extends () → self::A::X = () → dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    : super core::Object::•()
+    ;
+}
+class A2<X extends () → self::A2::X = () → dynamic> extends core::Object {
+  synthetic constructor •() → self::A2<self::A2::X>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue44455.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue44455.dart.weak.transformed.expect
new file mode 100644
index 0000000..2d1e9e6
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue44455.dart.weak.transformed.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue44455.dart:6:9: Error: Type argument 'X' doesn't conform to the bound 'num' of the type variable 'Y' on 'F'.
+// Try changing type arguments so that they conform to the bounds.
+// class A<X extends F<X>> {}
+//         ^
+// pkg/front_end/testcases/nnbd/issue44455.dart:5:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<Y extends num> = Y Function();
+//           ^
+//
+// pkg/front_end/testcases/nnbd/issue44455.dart:8:10: Error: Type argument 'X' doesn't conform to the bound 'num' of the type variable 'Y' on 'F2'.
+// Try changing type arguments so that they conform to the bounds.
+// class A2<X extends F2<X>> {}
+//          ^
+// pkg/front_end/testcases/nnbd/issue44455.dart:9:12: Context: This is the type variable whose bound isn't conformed to.
+// typedef F2<Y extends num> = Y Function();
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<Y extends core::num = core::num> = () → Y;
+typedef F2<Y extends core::num = core::num> = () → Y;
+class A<X extends () → self::A::X = () → dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    : super core::Object::•()
+    ;
+}
+class A2<X extends () → self::A2::X = () → dynamic> extends core::Object {
+  synthetic constructor •() → self::A2<self::A2::X>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue44595.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue44595.dart.outline.expect
index 59b9de9..d770a61 100644
--- a/pkg/front_end/testcases/nnbd/issue44595.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue44595.dart.outline.expect
@@ -4,7 +4,7 @@
 
 import "dart:async";
 
-typedef Exactly<invariant T extends dynamic = dynamic> = (T%) → T%;
+typedef Exactly<invariant T extends core::Object? = dynamic> = (T%) → T%;
 extension _extension#0<T extends core::Object? = dynamic> on T% {
   method checkStaticType = self::_extension#0|checkStaticType;
   tearoff checkStaticType = self::_extension#0|get#checkStaticType;
diff --git a/pkg/front_end/testcases/nnbd/issue44595.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue44595.dart.strong.expect
index 2c6d5bc..e9cfab0 100644
--- a/pkg/front_end/testcases/nnbd/issue44595.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue44595.dart.strong.expect
@@ -4,7 +4,7 @@
 
 import "dart:async";
 
-typedef Exactly<invariant T extends dynamic = dynamic> = (T%) → T%;
+typedef Exactly<invariant T extends core::Object? = dynamic> = (T%) → T%;
 extension _extension#0<T extends core::Object? = dynamic> on T% {
   method checkStaticType = self::_extension#0|checkStaticType;
   tearoff checkStaticType = self::_extension#0|get#checkStaticType;
diff --git a/pkg/front_end/testcases/nnbd/issue44595.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue44595.dart.strong.transformed.expect
index 5861f8c..ef34905 100644
--- a/pkg/front_end/testcases/nnbd/issue44595.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue44595.dart.strong.transformed.expect
@@ -5,7 +5,7 @@
 
 import "dart:async";
 
-typedef Exactly<invariant T extends dynamic = dynamic> = (T%) → T%;
+typedef Exactly<invariant T extends core::Object? = dynamic> = (T%) → T%;
 extension _extension#0<T extends core::Object? = dynamic> on T% {
   method checkStaticType = self::_extension#0|checkStaticType;
   tearoff checkStaticType = self::_extension#0|get#checkStaticType;
diff --git a/pkg/front_end/testcases/nnbd/issue44595.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue44595.dart.weak.expect
index 2c6d5bc..e9cfab0 100644
--- a/pkg/front_end/testcases/nnbd/issue44595.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue44595.dart.weak.expect
@@ -4,7 +4,7 @@
 
 import "dart:async";
 
-typedef Exactly<invariant T extends dynamic = dynamic> = (T%) → T%;
+typedef Exactly<invariant T extends core::Object? = dynamic> = (T%) → T%;
 extension _extension#0<T extends core::Object? = dynamic> on T% {
   method checkStaticType = self::_extension#0|checkStaticType;
   tearoff checkStaticType = self::_extension#0|get#checkStaticType;
diff --git a/pkg/front_end/testcases/nnbd/issue44595.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue44595.dart.weak.transformed.expect
index 5861f8c..ef34905 100644
--- a/pkg/front_end/testcases/nnbd/issue44595.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue44595.dart.weak.transformed.expect
@@ -5,7 +5,7 @@
 
 import "dart:async";
 
-typedef Exactly<invariant T extends dynamic = dynamic> = (T%) → T%;
+typedef Exactly<invariant T extends core::Object? = dynamic> = (T%) → T%;
 extension _extension#0<T extends core::Object? = dynamic> on T% {
   method checkStaticType = self::_extension#0|checkStaticType;
   tearoff checkStaticType = self::_extension#0|get#checkStaticType;
diff --git a/pkg/front_end/testcases/nnbd_mixed/cyclic_typedef.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/cyclic_typedef.dart.weak.expect
index 6fb923f..c05d772 100644
--- a/pkg/front_end/testcases/nnbd_mixed/cyclic_typedef.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/cyclic_typedef.dart.weak.expect
@@ -38,6 +38,13 @@
 static method main() → dynamic {}
 
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/cyclic_typedef_lib.dart:10:13: Error: Type variables can't have generic function types in their bounds.
+// class Hest1<TypeX extends Fisk1> {}
+//             ^^^^^
+//
 import self as self2;
 import "cyclic_typedef.dart" as self;
 import "dart:core" as core;
@@ -45,7 +52,7 @@
 import "org-dartlang-testcase:///cyclic_typedef.dart";
 
 typedef Fisk2 = <TypeY extends self::Hest2<dynamic> = dynamic>() → void;
-class Hest1<TypeX extends <TypeY extends core::Object? = dynamic>() → void = <TypeY extends core::Object? = dynamic>() → void> extends core::Object {
+class Hest1<TypeX extends <TypeY extends core::Object? = dynamic>() → void = dynamic> extends core::Object {
   synthetic constructor •() → self2::Hest1<self2::Hest1::TypeX>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd_mixed/cyclic_typedef.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/cyclic_typedef.dart.weak.transformed.expect
index 6fb923f..c05d772 100644
--- a/pkg/front_end/testcases/nnbd_mixed/cyclic_typedef.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/cyclic_typedef.dart.weak.transformed.expect
@@ -38,6 +38,13 @@
 static method main() → dynamic {}
 
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/cyclic_typedef_lib.dart:10:13: Error: Type variables can't have generic function types in their bounds.
+// class Hest1<TypeX extends Fisk1> {}
+//             ^^^^^
+//
 import self as self2;
 import "cyclic_typedef.dart" as self;
 import "dart:core" as core;
@@ -45,7 +52,7 @@
 import "org-dartlang-testcase:///cyclic_typedef.dart";
 
 typedef Fisk2 = <TypeY extends self::Hest2<dynamic> = dynamic>() → void;
-class Hest1<TypeX extends <TypeY extends core::Object? = dynamic>() → void = <TypeY extends core::Object? = dynamic>() → void> extends core::Object {
+class Hest1<TypeX extends <TypeY extends core::Object? = dynamic>() → void = dynamic> extends core::Object {
   synthetic constructor •() → self2::Hest1<self2::Hest1::TypeX>
     : super core::Object::•()
     ;
diff --git a/pkg/kernel/lib/src/bounds_checks.dart b/pkg/kernel/lib/src/bounds_checks.dart
index dcbb5d9..4aa0115 100644
--- a/pkg/kernel/lib/src/bounds_checks.dart
+++ b/pkg/kernel/lib/src/bounds_checks.dart
@@ -350,7 +350,11 @@
     return const <TypeArgumentIssue>[];
   }
 
-  if (variables.isEmpty) return const <TypeArgumentIssue>[];
+  if (variables.isEmpty) {
+    return typedefRhsResult.isNotEmpty
+        ? typedefRhsResult
+        : const <TypeArgumentIssue>[];
+  }
 
   List<TypeArgumentIssue> result = <TypeArgumentIssue>[];
   List<TypeArgumentIssue> argumentsResult = <TypeArgumentIssue>[];
diff --git a/pkg/nnbd_migration/test/already_migrated_code_decorator_test.dart b/pkg/nnbd_migration/test/already_migrated_code_decorator_test.dart
index fdc03f1..b4d8508 100644
--- a/pkg/nnbd_migration/test/already_migrated_code_decorator_test.dart
+++ b/pkg/nnbd_migration/test/already_migrated_code_decorator_test.dart
@@ -9,6 +9,7 @@
 import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/testing/element_factory.dart';
 import 'package:analyzer/src/generated/testing/test_type_provider.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
@@ -412,6 +413,7 @@
   }
 
   void test_getImmediateSupertypes_generic() {
+    var library = _LibraryElementMock();
     var t = ElementFactory.typeParameterElement('T');
     var class_ = element = ElementFactory.classElement3(
       name: 'C',
@@ -420,7 +422,7 @@
         t.instantiate(nullabilitySuffix: suffix),
       ),
     );
-    class_.enclosingElement = ElementFactory.compilationUnit('test.dart');
+    class_.enclosingElement = library.definingCompilationUnit;
     var decoratedSupertypes = decorator.getImmediateSupertypes(class_).toList();
     expect(decoratedSupertypes, hasLength(1));
     checkIterable(
@@ -432,10 +434,11 @@
   }
 
   void test_getImmediateSupertypes_interface() {
+    var library = _LibraryElementMock();
     var class_ =
         element = ElementFactory.classElement('C', typeProvider.objectType);
     class_.interfaces = [typeProvider.numType];
-    class_.enclosingElement = ElementFactory.compilationUnit('test.dart');
+    class_.enclosingElement = library.definingCompilationUnit;
     var decoratedSupertypes = decorator.getImmediateSupertypes(class_).toList();
     expect(decoratedSupertypes, hasLength(2));
     checkObject(decoratedSupertypes[0], checkExplicitlyNonNullable,
@@ -445,10 +448,11 @@
   }
 
   void test_getImmediateSupertypes_mixin() {
+    var library = _LibraryElementMock();
     var class_ =
         element = ElementFactory.classElement('C', typeProvider.objectType);
     class_.mixins = [typeProvider.numType];
-    class_.enclosingElement = ElementFactory.compilationUnit('test.dart');
+    class_.enclosingElement = library.definingCompilationUnit;
     var decoratedSupertypes = decorator.getImmediateSupertypes(class_).toList();
     expect(decoratedSupertypes, hasLength(2));
     checkObject(decoratedSupertypes[0], checkExplicitlyNonNullable,
@@ -458,9 +462,10 @@
   }
 
   void test_getImmediateSupertypes_superclassConstraint() {
+    var library = _LibraryElementMock();
     var class_ = element = ElementFactory.mixinElement(
         name: 'C', constraints: [typeProvider.numType]);
-    class_.enclosingElement = ElementFactory.compilationUnit('test.dart');
+    class_.enclosingElement = library.definingCompilationUnit;
     var decoratedSupertypes = decorator.getImmediateSupertypes(class_).toList();
     expect(decoratedSupertypes, hasLength(1));
     checkNum(decoratedSupertypes[0], checkExplicitlyNonNullable,
@@ -468,9 +473,10 @@
   }
 
   void test_getImmediateSupertypes_supertype() {
+    var library = _LibraryElementMock();
     var class_ =
         element = ElementFactory.classElement('C', typeProvider.objectType);
-    class_.enclosingElement = ElementFactory.compilationUnit('test.dart');
+    class_.enclosingElement = library.definingCompilationUnit;
     var decoratedSupertypes = decorator.getImmediateSupertypes(class_).toList();
     expect(decoratedSupertypes, hasLength(1));
     // TODO(paulberry): displayName should be 'Object supertype of C'
@@ -505,6 +511,47 @@
       : super(NullabilitySuffix.star);
 }
 
+class _CompilationUnitElementMock implements CompilationUnitElementImpl {
+  @override
+  final LibraryElement enclosingElement;
+
+  @override
+  final Source source;
+
+  _CompilationUnitElementMock(this.enclosingElement, this.source);
+
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+class _LibraryElementMock implements LibraryElementImpl {
+  @override
+  CompilationUnitElement definingCompilationUnit;
+
+  @override
+  Source source;
+
+  _LibraryElementMock() {
+    source = _SourceMock();
+    definingCompilationUnit = _CompilationUnitElementMock(this, source);
+  }
+
+  @override
+  Element get enclosingElement => null;
+
+  @override
+  bool get isNonNullableByDefault => false;
+
+  @override
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
 class _MockElement implements Element {
   noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 }
+
+class _SourceMock implements Source {
+  String get fullName => '/test.dart';
+
+  @override
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
diff --git a/pkg/vm_service/CHANGELOG.md b/pkg/vm_service/CHANGELOG.md
index a9229ae..f6a97c1 100644
--- a/pkg/vm_service/CHANGELOG.md
+++ b/pkg/vm_service/CHANGELOG.md
@@ -1,5 +1,12 @@
 # Changelog
 
+## 6.1.0-nullsafety.0
+- Added `identityHashCode` property to `HeapSnapshotObject`, which can be used to compare
+  objects across heap snapshots.
+- Added `successors` iterable to `HeapSnapshotObject`, which provides a convenient way to
+  access children of a given object.
+- Added `klass` getter to `HeapSnapshotObject`.
+
 ## 6.0.1-nullsafety.1
 - Fix issue where some `Instance` properties were not being populated correctly.
 
diff --git a/pkg/vm_service/lib/src/snapshot_graph.dart b/pkg/vm_service/lib/src/snapshot_graph.dart
index 7e93eed..4db040a 100644
--- a/pkg/vm_service/lib/src/snapshot_graph.dart
+++ b/pkg/vm_service/lib/src/snapshot_graph.dart
@@ -15,6 +15,9 @@
 
   _ReadStream(this._chunks);
 
+  bool get atEnd => ((_byteIndex >= _chunks[_chunkIndex].lengthInBytes) &&
+      (_chunkIndex + 1 >= _chunks.length));
+
   int readByte() {
     while (_byteIndex >= _chunks[_chunkIndex].lengthInBytes) {
       _chunkIndex++;
@@ -117,6 +120,9 @@
 
 /// A representation of a class type captured in a memory snapshot.
 class HeapSnapshotClass {
+  /// The class ID representing this type.
+  int get classId => _classId;
+
   /// The simple (not qualified) name of the class.
   String get name => _name;
 
@@ -129,12 +135,13 @@
   /// The list of fields in the class.
   List<HeapSnapshotField> get fields => _fields;
 
+  final int _classId;
   String _name = '';
   String _libraryName = '';
   late final Uri _libraryUri;
   final List<HeapSnapshotField> _fields = <HeapSnapshotField>[];
 
-  HeapSnapshotClass._read(_ReadStream reader) {
+  HeapSnapshotClass._read(this._classId, _ReadStream reader) {
     // flags (reserved).
     reader.readUnsigned();
 
@@ -148,6 +155,18 @@
     _populateFields(reader);
   }
 
+  HeapSnapshotClass._root()
+      : _classId = 0,
+        _name = 'Root',
+        _libraryName = '',
+        _libraryUri = Uri();
+
+  HeapSnapshotClass._sentinel()
+      : _classId = 0,
+        _name = 'Sentinel',
+        _libraryName = '',
+        _libraryUri = Uri();
+
   void _populateFields(_ReadStream reader) {
     final fieldCount = reader.readUnsigned();
     for (int i = 0; i < fieldCount; ++i) {
@@ -161,6 +180,14 @@
   /// The class ID representing the type of this object.
   int get classId => _classId;
 
+  /// The class representing the type of this object.
+  HeapSnapshotClass get klass {
+    if (_classId <= 0) {
+      return HeapSnapshotClass._sentinel();
+    }
+    return _graph._classes[_classId];
+  }
+
   /// The space used by this object in bytes.
   int get shallowSize => _shallowSize;
 
@@ -170,22 +197,54 @@
   /// A list of 1-origin indicies into [HeapSnapshotGraph.objects].
   List<int> get references => _references;
 
+  /// The identity hash code of this object.
+  ///
+  /// If `identityHashCode` is 0, either the snapshot did not contain the list
+  /// of identity hash codes or this object cannot be compared across
+  /// snapshots.
+  int get identityHashCode => _identityHashCode;
+
+  Iterable<HeapSnapshotObject> get successors sync* {
+    final startSuccessorIndex = _graph._firstSuccessors[_oid];
+    final limitSuccessorIndex = _graph._firstSuccessors[_oid + 1];
+
+    for (int nextSuccessorIndex = startSuccessorIndex;
+        nextSuccessorIndex < limitSuccessorIndex;
+        ++nextSuccessorIndex) {
+      final successorId = _graph._successors[nextSuccessorIndex];
+      yield _graph.objects[successorId];
+    }
+  }
+
+  final HeapSnapshotGraph _graph;
+  final int _oid;
   int _classId = -1;
   int _shallowSize = -1;
+  int _identityHashCode = 0;
   late final dynamic _data;
   final List<int> _references = <int>[];
 
-  HeapSnapshotObject._read(_ReadStream reader) {
+  HeapSnapshotObject._sentinel(this._graph)
+      : _oid = 0,
+        _data = HeapSnapshotObjectNoData() {
+    _graph._firstSuccessors[_oid] = _graph._eid;
+  }
+
+  HeapSnapshotObject._read(this._graph, this._oid, _ReadStream reader) {
     _classId = reader.readUnsigned();
     _shallowSize = reader.readUnsigned();
     _data = _getNonReferenceData(reader);
+    _graph._firstSuccessors[_oid] = _graph._eid;
     _populateReferences(reader);
   }
 
   void _populateReferences(_ReadStream reader) {
     final referencesCount = reader.readUnsigned();
     for (int i = 0; i < referencesCount; ++i) {
-      _references.add(reader.readUnsigned());
+      int childOid = reader.readUnsigned();
+      _references.add(childOid);
+      _graph._successors[_graph._eid] = childOid;
+      _graph._eid++;
     }
   }
 }
@@ -249,6 +308,10 @@
   final List<HeapSnapshotExternalProperty> _externalProperties =
       <HeapSnapshotExternalProperty>[];
 
+  late Uint32List _firstSuccessors;
+  late Uint32List _successors;
+  int _eid = 0;
+
   /// Requests a heap snapshot for a given isolate and builds a
   /// [HeapSnapshotGraph].
   ///
@@ -290,23 +353,31 @@
     _capacity = reader.readUnsigned();
     _externalSize = reader.readUnsigned();
     _populateClasses(reader);
-    _referenceCount = reader.readUnsigned();
     _populateObjects(reader);
     _populateExternalProperties(reader);
+    _populateIdentityHashCodes(reader);
   }
 
   void _populateClasses(_ReadStream reader) {
     final classCount = reader.readUnsigned();
-    for (int i = 0; i < classCount; ++i) {
-      _classes.add(HeapSnapshotClass._read(reader));
+    _classes.add(HeapSnapshotClass._root());
+    for (int i = 1; i <= classCount; ++i) {
+      final klass = HeapSnapshotClass._read(i, reader);
+      _classes.add(klass);
     }
   }
 
   void _populateObjects(_ReadStream reader) {
+    _referenceCount = reader.readUnsigned();
     final objectCount = reader.readUnsigned();
-    for (int i = 0; i < objectCount; ++i) {
-      _objects.add(HeapSnapshotObject._read(reader));
+    _firstSuccessors = _newUint32Array(objectCount + 2);
+    _successors = _newUint32Array(_referenceCount);
+
+    _objects.add(HeapSnapshotObject._sentinel(this));
+    for (int i = 1; i <= objectCount; ++i) {
+      _objects.add(HeapSnapshotObject._read(this, i, reader));
     }
+    _firstSuccessors[objectCount + 1] = _eid;
   }
 
   void _populateExternalProperties(_ReadStream reader) {
@@ -315,6 +386,29 @@
       _externalProperties.add(HeapSnapshotExternalProperty._read(reader));
     }
   }
+
+  void _populateIdentityHashCodes(_ReadStream reader) {
+    if (reader.atEnd) {
+      // Older VMs don't include identity hash codes.
+      return;
+    }
+    final objectCount = _objects.length;
+    for (int i = 1; i < objectCount; ++i) {
+      _objects[i]._identityHashCode = reader.readUnsigned();
+    }
+  }
+
+  Uint32List _newUint32Array(int size) {
+    try {
+      return Uint32List(size);
+    } on ArgumentError {
+      // JS throws a misleading invalid argument error. Convert to a more
+      // user-friendly message.
+      throw Exception(
+        'OutOfMemoryError: Not enough memory available to analyze the snapshot.',
+      );
+    }
+  }
 }
 
 const _kNoData = 0;
diff --git a/pkg/vm_service/pubspec.yaml b/pkg/vm_service/pubspec.yaml
index 7bd051f..3e87a37 100644
--- a/pkg/vm_service/pubspec.yaml
+++ b/pkg/vm_service/pubspec.yaml
@@ -3,7 +3,7 @@
   A library to communicate with a service implementing the Dart VM
   service protocol.
 
-version: 6.0.1-nullsafety.1
+version: 6.1.0-nullsafety.0
 
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/vm_service
 
diff --git a/pkg/vm_service/test/common/test_helper.dart b/pkg/vm_service/test/common/test_helper.dart
index 634ec64..cd6a983 100644
--- a/pkg/vm_service/test/common/test_helper.dart
+++ b/pkg/vm_service/test/common/test_helper.dart
@@ -133,7 +133,7 @@
       fullArgs.add('--pause-isolates-on-start');
     }
     if (pause_on_exit) {
-      fullArgs.add('--pause-isolates-on-io.exit');
+      fullArgs.add('--pause-isolates-on-exit');
     }
     if (!useAuthToken) {
       fullArgs.add('--disable-service-auth-codes');
diff --git a/pkg/vm_service/test/heap_snapshot_graph_test.dart b/pkg/vm_service/test/heap_snapshot_graph_test.dart
index b9fbe10..51490ec 100644
--- a/pkg/vm_service/test/heap_snapshot_graph_test.dart
+++ b/pkg/vm_service/test/heap_snapshot_graph_test.dart
@@ -44,7 +44,8 @@
     int actualShallowSize = 0;
     int actualRefCount = 0;
     snapshotGraph.objects.forEach((HeapSnapshotObject o) {
-      expect(o.classId >= 0, isTrue);
+      // -1 is the CID used by the sentinel.
+      expect(o.classId >= -1, isTrue);
       expect(o.data, isNotNull);
       expect(o.references, isNotNull);
       actualShallowSize += o.shallowSize;
@@ -91,7 +92,7 @@
     foosFound = 0;
     snapshotGraph.objects.forEach((HeapSnapshotObject o) {
       if (o.classId == 0) return;
-      if (o.classId - 1 == fooClassId) {
+      if (o.classId == fooClassId) {
         foosFound++;
       }
     });
diff --git a/pkg/vm_service/test/object_graph_identity_hash_test.dart b/pkg/vm_service/test/object_graph_identity_hash_test.dart
new file mode 100644
index 0000000..da61a9d
--- /dev/null
+++ b/pkg/vm_service/test/object_graph_identity_hash_test.dart
@@ -0,0 +1,159 @@
+// 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.
+
+import 'dart:collection';
+
+import 'package:vm_service/vm_service.dart';
+import 'package:test/test.dart';
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+class Foo {}
+
+class Bar {}
+
+class Container1 {
+  @pragma("vm:entry-point")
+  Foo foo = Foo();
+  @pragma("vm:entry-point")
+  Bar bar = Bar();
+}
+
+class Container2 {
+  Container2(this.foo);
+
+  @pragma("vm:entry-point")
+  Foo foo;
+  @pragma("vm:entry-point")
+  Bar bar = Bar();
+}
+
+class Container3 {
+  @pragma("vm:entry-point")
+  int number = 42;
+  @pragma("vm:entry-point")
+  double doub = 3.14;
+  @pragma("vm:entry-point")
+  String foo = 'foobar';
+  @pragma("vm:entry-point")
+  bool bar = false;
+  @pragma("vm:entry-point")
+  late Map baz;
+  @pragma("vm:entry-point")
+  late LinkedHashMap linkedBaz;
+  @pragma("vm:entry-point")
+  late List list;
+  @pragma("vm:entry-point")
+  late List unmodifiableList;
+
+  Container3() {
+    baz = {
+      'a': 'b',
+    };
+    linkedBaz = LinkedHashMap.from(baz);
+    list = [1, 2, 3];
+    unmodifiableList = List.empty();
+  }
+}
+
+late Container1 c1;
+late Container2 c2;
+late Container3 c3;
+
+void script() {
+  c1 = Container1();
+  c2 = Container2(c1.foo);
+  c3 = Container3();
+}
+
+late HeapSnapshotGraph snapshot1;
+late HeapSnapshotObject snapshot1Foo;
+late HeapSnapshotObject snapshot1Bar;
+
+late HeapSnapshotGraph snapshot2;
+late HeapSnapshotObject snapshot2Foo;
+late HeapSnapshotObject snapshot2Bar;
+
+late HeapSnapshotGraph snapshot3;
+
+final tests = <IsolateTest>[
+  (VmService service, IsolateRef isolate) async {
+    snapshot1 = await HeapSnapshotGraph.getSnapshot(service, isolate);
+
+    Iterable<HeapSnapshotObject> container1s = snapshot1.objects.where(
+      (HeapSnapshotObject obj) => obj.klass.name == 'Container1',
+    );
+    expect(container1s.length, 1);
+
+    final c1Obj = container1s.first;
+
+    snapshot1Foo = c1Obj.successors.firstWhere(
+      (element) => element.klass.name == 'Foo',
+    );
+    expect(
+      snapshot1Foo.identityHashCode != 0,
+      true,
+    );
+
+    snapshot1Bar = c1Obj.successors.firstWhere(
+      (element) => element.klass.name == 'Bar',
+    );
+    expect(
+      snapshot1Bar.identityHashCode != 0,
+      true,
+    );
+  },
+  (VmService service, IsolateRef isolate) async {
+    snapshot2 = await HeapSnapshotGraph.getSnapshot(service, isolate);
+    ;
+    Iterable<HeapSnapshotObject> container2s = snapshot2.objects.where(
+      (HeapSnapshotObject obj) => obj.klass.name == 'Container2',
+    );
+    expect(container2s.length, 1);
+
+    final c2Obj = container2s.first;
+
+    snapshot2Foo = c2Obj.successors.firstWhere(
+      (element) => element.klass.name == 'Foo',
+    );
+    expect(
+      snapshot2Foo.identityHashCode != 0,
+      true,
+    );
+    expect(
+      snapshot1Foo.identityHashCode == snapshot2Foo.identityHashCode,
+      true,
+    );
+
+    snapshot2Bar = c2Obj.successors.firstWhere(
+      (element) => element.klass.name == 'Bar',
+    );
+    expect(
+      snapshot2Bar.identityHashCode != 0,
+      true,
+    );
+    expect(
+      snapshot1Bar.identityHashCode != snapshot2Bar.identityHashCode,
+      true,
+    );
+  },
+  (VmService service, IsolateRef isolate) async {
+    snapshot3 = await HeapSnapshotGraph.getSnapshot(service, isolate);
+    Iterable<HeapSnapshotObject> container3s = snapshot3.objects.where(
+      (HeapSnapshotObject obj) => obj.klass.name == 'Container3',
+    );
+    expect(container3s.length, 1);
+    final c3Obj = container3s.first;
+    for (final successor in c3Obj.successors) {
+      expect(successor.identityHashCode, 0);
+    }
+  },
+];
+
+main(args) => runIsolateTests(
+      args,
+      tests,
+      testeeBefore: script,
+      pause_on_exit: true,
+    );
diff --git a/runtime/observatory/lib/object_graph.dart b/runtime/observatory/lib/object_graph.dart
index f0adee0..85f64df 100644
--- a/runtime/observatory/lib/object_graph.dart
+++ b/runtime/observatory/lib/object_graph.dart
@@ -202,11 +202,16 @@
 
 /// An object in a heap snapshot.
 abstract class SnapshotObject {
-  // If this object has been obtained from [successors] or [predecessors], the
-  // name of slot. Otherwise, the empty string.
+  /// The identity hash code of this object, used to compare objects across
+  /// snapshots. If [identityHashCode] is 0, this object cannot be compared to
+  /// other objects.
+  int get identityHashCode;
+
+  /// If this object has been obtained from [successors] or [predecessors], the
+  /// name of slot. Otherwise, the empty string.
   String get label;
 
-  // The value for primitives. Otherwise, the class name.
+  /// The value for primitives. Otherwise, the class name.
   String get description;
 
   /// [internalSize] + [externalSize].
@@ -255,10 +260,12 @@
 
 class _SnapshotObject implements SnapshotObject {
   final int _id;
+  final int identityHashCode;
   final _SnapshotGraph _graph;
   final String label;
 
-  _SnapshotObject._new(this._id, this._graph, this.label);
+  _SnapshotObject._new(this._id, this._graph, this.label)
+      : identityHashCode = _graph._identityHashes![_id];
 
   bool operator ==(Object other) {
     if (other is _SnapshotObject) {
@@ -344,6 +351,7 @@
   late SnapshotObject _parent;
   late List<SnapshotObject> _children;
 
+  int get identityHashCode => 0;
   String get label => "";
   String get description => _description;
   SnapshotClass get klass => _klass;
@@ -805,6 +813,9 @@
     onProgress.add("Loading external properties...");
     await new Future(() => _readExternalProperties(stream!));
 
+    onProgress.add("Loading object identity hash codes...");
+    await new Future(() => _readObjectIdentityHashes(stream!));
+
     stream = null;
 
     onProgress.add("Compute class table...");
@@ -877,6 +888,7 @@
   Uint32List? _externalSizes;
   Uint32List? _firstSuccs;
   Uint32List? _succs;
+  Uint32List? _identityHashes;
 
   // Intermediates.
   Uint32List? _vertex;
@@ -1036,6 +1048,15 @@
     _externalSizes = externalSizes;
   }
 
+  void _readObjectIdentityHashes(_ReadStream stream) {
+    final N = _N!;
+    final identityHashes = _newUint32Array(N + 1);
+    for (int oid = 1; oid <= N; ++oid) {
+      identityHashes[oid] = stream.readUnsigned();
+    }
+    _identityHashes = identityHashes;
+  }
+
   void _computeClassTable() {
     final N = _N!;
     final classes = _classes!;
diff --git a/runtime/observatory/tests/service/object_graph_identity_hash_test.dart b/runtime/observatory/tests/service/object_graph_identity_hash_test.dart
new file mode 100644
index 0000000..eb7c109
--- /dev/null
+++ b/runtime/observatory/tests/service/object_graph_identity_hash_test.dart
@@ -0,0 +1,160 @@
+// 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.
+
+import 'package:observatory/object_graph.dart';
+import 'package:observatory/service_io.dart';
+import 'package:test/test.dart';
+import 'service_test_common.dart';
+import 'test_helper.dart';
+
+class Foo {}
+
+class Bar {}
+
+class Container1 {
+  @pragma("vm:entry-point")
+  Foo foo = Foo();
+  @pragma("vm:entry-point")
+  Bar bar = Bar();
+}
+
+class Container2 {
+  Container2(this.foo);
+
+  @pragma("vm:entry-point")
+  Foo foo;
+  @pragma("vm:entry-point")
+  Bar bar = Bar();
+}
+
+class Container3 {
+  @pragma("vm:entry-point")
+  int number = 42;
+  @pragma("vm:entry-point")
+  double doub = 3.14;
+  @pragma("vm:entry-point")
+  String foo = 'foobar';
+  @pragma("vm:entry-point")
+  bool bar = false;
+  @pragma("vm:entry-point")
+  late Map baz;
+  @pragma("vm:entry-point")
+  late List list;
+  @pragma("vm:entry-point")
+  late List unmodifiableList;
+
+  Container3() {
+    baz = {
+      'a': 'b',
+    };
+    list = [1, 2, 3];
+    unmodifiableList = List.empty();
+  }
+}
+
+@pragma("vm:entry-point")
+late Container1 c1;
+@pragma("vm:entry-point")
+late Container2 c2;
+@pragma("vm:entry-point")
+late Container3 c3;
+
+void script() {
+  c1 = Container1();
+  c2 = Container2(c1.foo);
+  c3 = Container3();
+}
+
+late SnapshotGraph snapshot1;
+late SnapshotObject snapshot1Foo;
+late SnapshotObject snapshot1Bar;
+
+late SnapshotGraph snapshot2;
+late SnapshotObject snapshot2Foo;
+late SnapshotObject snapshot2Bar;
+
+late SnapshotGraph snapshot3;
+
+final tests = <IsolateTest>[
+  (Isolate isolate) async {
+    snapshot1 = await isolate.fetchHeapSnapshot().done;
+
+    Iterable<SnapshotObject> container1s = snapshot1.objects.where(
+      (SnapshotObject obj) => obj.klass.name == 'Container1',
+    );
+    expect(container1s.length, 1);
+
+    final c1Obj = container1s.first;
+
+    c1Obj.successors.forEach((element) {
+      print(element.klass.name);
+    });
+    snapshot1Foo = c1Obj.successors.firstWhere(
+      (element) => element.klass.name == 'Foo',
+    );
+    expect(
+      snapshot1Foo.identityHashCode != 0,
+      true,
+    );
+
+    snapshot1Bar = c1Obj.successors.firstWhere(
+      (element) => element.klass.name == 'Bar',
+    );
+    expect(
+      snapshot1Bar.identityHashCode != 0,
+      true,
+    );
+  },
+  (Isolate isolate) async {
+    snapshot2 = await isolate.fetchHeapSnapshot().done;
+    Iterable<SnapshotObject> container2s = snapshot2.objects.where(
+      (SnapshotObject obj) => obj.klass.name == 'Container2',
+    );
+    expect(container2s.length, 1);
+
+    final c2Obj = container2s.first;
+
+    snapshot2Foo = c2Obj.successors.firstWhere(
+      (element) => element.klass.name == 'Foo',
+    );
+    expect(
+      snapshot2Foo.identityHashCode != 0,
+      true,
+    );
+    expect(
+      snapshot1Foo.identityHashCode == snapshot2Foo.identityHashCode,
+      true,
+    );
+
+    snapshot2Bar = c2Obj.successors.firstWhere(
+      (element) => element.klass.name == 'Bar',
+    );
+    expect(
+      snapshot2Bar.identityHashCode != 0,
+      true,
+    );
+    expect(
+      snapshot1Bar.identityHashCode != snapshot2Bar.identityHashCode,
+      true,
+    );
+  },
+  (Isolate isolate) async {
+    snapshot3 = await isolate.fetchHeapSnapshot().done;
+    Iterable<SnapshotObject> container3s = snapshot3.objects.where(
+      (SnapshotObject obj) => obj.klass.name == 'Container3',
+    );
+    expect(container3s.length, 1);
+    final c3Obj = container3s.first;
+    for (final successor in c3Obj.successors) {
+      expect(successor.identityHashCode, 0);
+    }
+  },
+];
+
+main(args) => runIsolateTests(
+      args,
+      tests,
+      testeeBefore: script,
+      pause_on_exit: true,
+    );
diff --git a/runtime/observatory_2/lib/object_graph.dart b/runtime/observatory_2/lib/object_graph.dart
index 0e891ce..21b426a 100644
--- a/runtime/observatory_2/lib/object_graph.dart
+++ b/runtime/observatory_2/lib/object_graph.dart
@@ -202,11 +202,16 @@
 
 /// An object in a heap snapshot.
 abstract class SnapshotObject {
-  // If this object has been obtained from [successors] or [predecessors], the
-  // name of slot. Otherwise, the empty string.
+  /// The identity hash code of this object, used to compare objects across
+  /// snapshots. If [identityHashCode] is 0, this object cannot be compared to
+  /// other objects.
+  int get identityHashCode;
+
+  /// If this object has been obtained from [successors] or [predecessors], the
+  /// name of slot. Otherwise, the empty string.
   String get label;
 
-  // The value for primitives. Otherwise, the class name.
+  /// The value for primitives. Otherwise, the class name.
   String get description;
 
   /// [internalSize] + [externalSize].
@@ -255,10 +260,12 @@
 
 class _SnapshotObject implements SnapshotObject {
   final int _id;
+  final int identityHashCode;
   final _SnapshotGraph _graph;
   final String label;
 
-  _SnapshotObject._new(this._id, this._graph, this.label);
+  _SnapshotObject._new(this._id, this._graph, this.label)
+      : identityHashCode = _graph._identityHashes[_id];
 
   bool operator ==(Object other) {
     if (other is _SnapshotObject) {
@@ -344,6 +351,7 @@
   SnapshotObject _parent;
   List<SnapshotObject> _children;
 
+  int get identityHashCode => 0;
   String get label => null;
   String get description => _description;
   SnapshotClass get klass => _klass;
@@ -794,6 +802,9 @@
     onProgress.add("Loading external properties...");
     await new Future(() => _readExternalProperties(stream));
 
+    onProgress.add("Loading object identity hash codes...");
+    await new Future(() => _readObjectIdentityHashes(stream));
+
     stream = null;
 
     onProgress.add("Compute class table...");
@@ -866,6 +877,7 @@
   Uint32List _externalSizes;
   Uint32List _firstSuccs;
   Uint32List _succs;
+  Uint32List _identityHashes;
 
   // Intermediates.
   Uint32List _vertex;
@@ -1025,6 +1037,15 @@
     _externalSizes = externalSizes;
   }
 
+  void _readObjectIdentityHashes(_ReadStream stream) {
+    final N = _N;
+    final identityHashes = _newUint32Array(N + 1);
+    for (int oid = 1; oid <= N; ++oid) {
+      identityHashes[oid] = stream.readUnsigned();
+    }
+    _identityHashes = identityHashes;
+  }
+
   void _computeClassTable() {
     final N = _N;
     final classes = _classes;
diff --git a/runtime/observatory_2/tests/service_2/object_graph_identity_hash_test.dart b/runtime/observatory_2/tests/service_2/object_graph_identity_hash_test.dart
new file mode 100644
index 0000000..ed5c71b
--- /dev/null
+++ b/runtime/observatory_2/tests/service_2/object_graph_identity_hash_test.dart
@@ -0,0 +1,160 @@
+// 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.
+
+import 'package:observatory_2/object_graph.dart';
+import 'package:observatory_2/service_io.dart';
+import 'package:test/test.dart';
+import 'service_test_common.dart';
+import 'test_helper.dart';
+
+class Foo {}
+
+class Bar {}
+
+class Container1 {
+  @pragma("vm:entry-point")
+  Foo foo = Foo();
+  @pragma("vm:entry-point")
+  Bar bar = Bar();
+}
+
+class Container2 {
+  Container2(this.foo);
+
+  @pragma("vm:entry-point")
+  Foo foo;
+  @pragma("vm:entry-point")
+  Bar bar = Bar();
+}
+
+class Container3 {
+  @pragma("vm:entry-point")
+  int number = 42;
+  @pragma("vm:entry-point")
+  double doub = 3.14;
+  @pragma("vm:entry-point")
+  String foo = 'foobar';
+  @pragma("vm:entry-point")
+  bool bar = false;
+  @pragma("vm:entry-point")
+  Map baz;
+  @pragma("vm:entry-point")
+  List list;
+  @pragma("vm:entry-point")
+  List unmodifiableList;
+
+  Container3() {
+    baz = {
+      'a': 'b',
+    };
+    list = [1, 2, 3];
+    unmodifiableList = List.empty();
+  }
+}
+
+@pragma("vm:entry-point")
+Container1 c1;
+@pragma("vm:entry-point")
+Container2 c2;
+@pragma("vm:entry-point")
+Container3 c3;
+
+void script() {
+  c1 = Container1();
+  c2 = Container2(c1.foo);
+  c3 = Container3();
+}
+
+SnapshotGraph snapshot1;
+SnapshotObject snapshot1Foo;
+SnapshotObject snapshot1Bar;
+
+SnapshotGraph snapshot2;
+SnapshotObject snapshot2Foo;
+SnapshotObject snapshot2Bar;
+
+SnapshotGraph snapshot3;
+
+final tests = <IsolateTest>[
+  (Isolate isolate) async {
+    snapshot1 = await isolate.fetchHeapSnapshot().done;
+
+    Iterable<SnapshotObject> container1s = snapshot1.objects.where(
+      (SnapshotObject obj) => obj.klass.name == 'Container1',
+    );
+    expect(container1s.length, 1);
+
+    final c1Obj = container1s.first;
+
+    c1Obj.successors.forEach((element) {
+      print(element.klass.name);
+    });
+    snapshot1Foo = c1Obj.successors.firstWhere(
+      (element) => element.klass.name == 'Foo',
+    );
+    expect(
+      snapshot1Foo.identityHashCode != 0,
+      true,
+    );
+
+    snapshot1Bar = c1Obj.successors.firstWhere(
+      (element) => element.klass.name == 'Bar',
+    );
+    expect(
+      snapshot1Bar.identityHashCode != 0,
+      true,
+    );
+  },
+  (Isolate isolate) async {
+    snapshot2 = await isolate.fetchHeapSnapshot().done;
+    Iterable<SnapshotObject> container2s = snapshot2.objects.where(
+      (SnapshotObject obj) => obj.klass.name == 'Container2',
+    );
+    expect(container2s.length, 1);
+
+    final c2Obj = container2s.first;
+
+    snapshot2Foo = c2Obj.successors.firstWhere(
+      (element) => element.klass.name == 'Foo',
+    );
+    expect(
+      snapshot2Foo.identityHashCode != 0,
+      true,
+    );
+    expect(
+      snapshot1Foo.identityHashCode == snapshot2Foo.identityHashCode,
+      true,
+    );
+
+    snapshot2Bar = c2Obj.successors.firstWhere(
+      (element) => element.klass.name == 'Bar',
+    );
+    expect(
+      snapshot2Bar.identityHashCode != 0,
+      true,
+    );
+    expect(
+      snapshot1Bar.identityHashCode != snapshot2Bar.identityHashCode,
+      true,
+    );
+  },
+  (Isolate isolate) async {
+    snapshot3 = await isolate.fetchHeapSnapshot().done;
+    Iterable<SnapshotObject> container3s = snapshot3.objects.where(
+      (SnapshotObject obj) => obj.klass.name == 'Container3',
+    );
+    expect(container3s.length, 1);
+    final c3Obj = container3s.first;
+    for (final successor in c3Obj.successors) {
+      expect(successor.identityHashCode, 0);
+    }
+  },
+];
+
+main(args) => runIsolateTests(
+      args,
+      tests,
+      testeeBefore: script,
+      pause_on_exit: true,
+    );
diff --git a/runtime/vm/class_table.cc b/runtime/vm/class_table.cc
index ac501cf..248cf45 100644
--- a/runtime/vm/class_table.cc
+++ b/runtime/vm/class_table.cc
@@ -482,7 +482,14 @@
     if (HasValidClassAt(cid)) {
       cls = At(cid);
       ASSERT(cls.IsClass());
+#if defined(DART_PRECOMPILER)
+      // Precompiler can drop classes and set their id() to kIllegalCid.
+      // It still leaves them in the class table so dropped program
+      // structure could still be accessed while writing debug info.
+      ASSERT((cls.id() == cid) || (cls.id() == kIllegalCid));
+#else
       ASSERT(cls.id() == cid);
+#endif  // defined(DART_PRECOMPILER)
     }
   }
 }
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index 28b5d0f..392fd84 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -715,11 +715,13 @@
     }
   }
 
-  const Array& inlined_functions =
-      Array::Handle(Z, code.inlined_id_to_function());
-  for (intptr_t i = 0; i < inlined_functions.Length(); i++) {
-    target ^= inlined_functions.At(i);
-    AddTypesOf(target);
+  if (!FLAG_dwarf_stack_traces_mode) {
+    const Array& inlined_functions =
+        Array::Handle(Z, code.inlined_id_to_function());
+    for (intptr_t i = 0; i < inlined_functions.Length(); i++) {
+      target ^= inlined_functions.At(i);
+      AddTypesOf(target);
+    }
   }
 }
 
@@ -2313,7 +2315,6 @@
       THR_Print("Dropping class %" Pd " %s\n", cid, cls.ToCString());
     }
 
-    class_table->Unregister(cid);
     cls.set_id(kIllegalCid);  // We check this when serializing.
   }
 }
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index a276c17..f7cae12 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -3244,10 +3244,10 @@
     UnboxedConstantInstr* uc = NULL;
 
     const Object& val = value()->BoundConstant();
-    if (val.IsSmi()) {
+    if (val.IsInteger()) {
       const Double& double_val = Double::ZoneHandle(
           flow_graph->zone(),
-          Double::NewCanonical(Smi::Cast(val).AsDoubleValue()));
+          Double::NewCanonical(Integer::Cast(val).AsDoubleValue()));
       uc = new UnboxedConstantInstr(double_val, kUnboxedDouble);
     } else if (val.IsDouble()) {
       uc = new UnboxedConstantInstr(val, kUnboxedDouble);
@@ -3308,10 +3308,10 @@
   }
 
   ConstantInstr* c = value()->definition()->AsConstant();
-  if ((c != NULL) && c->value().IsSmi()) {
+  if ((c != NULL) && c->value().IsInteger()) {
     if (!is_truncating()) {
       // Check that constant fits into 32-bit integer.
-      const int64_t value = static_cast<int64_t>(Smi::Cast(c->value()).Value());
+      const int64_t value = Integer::Cast(c->value()).AsInt64Value();
       if (!Utils::IsInt(32, value)) {
         return this;
       }
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index 0d89c3f..d4b806d 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -4154,10 +4154,6 @@
   compiler::Label done;
   __ SmiUntag(result, value);
   __ BranchIfSmi(value, &done);
-  __ ldr(
-      result,
-      compiler::FieldAddress(value, Mint::value_offset(), compiler::kFourBytes),
-      compiler::kFourBytes);
   __ LoadFieldFromOffset(result, value, Mint::value_offset());
   __ Bind(&done);
 }
@@ -4190,11 +4186,8 @@
   const Register out = locs()->out(0).reg();
   ASSERT(value != out);
 
-  ASSERT(kSmiTagSize == 1);
-  const intptr_t shift = kBitsPerWord - kBitsPerByte;
-  // TODO(vegorov) implement and use UBFM/SBFM for this.
-  __ LslImmediate(out, value, shift);
-  __ LsrImmediate(out, out, shift - kSmiTagSize);
+  ASSERT(compiler::target::kSmiBits >= 8);
+  __ ubfiz(out, value, kSmiTagSize, 8);
 }
 
 LocationSummary* BoxInteger32Instr::MakeLocationSummary(Zone* zone,
@@ -4215,14 +4208,12 @@
   Register out = locs()->out(0).reg();
   ASSERT(value != out);
 
-  ASSERT(kSmiTagSize == 1);
-  // TODO(vegorov) implement and use UBFM/SBFM for this.
-  __ LslImmediate(out, value, 32);
+  ASSERT(compiler::target::kSmiBits >= 32);
   if (from_representation() == kUnboxedInt32) {
-    __ AsrImmediate(out, out, 32 - kSmiTagSize);
+    __ sbfiz(out, value, kSmiTagSize, 32);
   } else {
     ASSERT(from_representation() == kUnboxedUint32);
-    __ LsrImmediate(out, out, 32 - kSmiTagSize);
+    __ ubfiz(out, value, kSmiTagSize, 32);
   }
 }
 
diff --git a/runtime/vm/flags.cc b/runtime/vm/flags.cc
index 3d78c39..d082e9dc 100644
--- a/runtime/vm/flags.cc
+++ b/runtime/vm/flags.cc
@@ -478,11 +478,6 @@
     // compile-time, since that compiled code might be re-used in another
     // isolate that has not yet initialized the global field.
     FLAG_fields_may_be_reset = true;
-
-    // To eliminate potential flakiness, we will start by disabling field guards
-    // and CHA-based compilations.
-    FLAG_use_field_guards = false;
-    FLAG_use_cha_deopt = false;
   }
 #endif  // !defined(DART_PRCOMPILED_RUNTIME)
 
diff --git a/runtime/vm/heap/weak_code.cc b/runtime/vm/heap/weak_code.cc
index a50936a..85bf634 100644
--- a/runtime/vm/heap/weak_code.cc
+++ b/runtime/vm/heap/weak_code.cc
@@ -10,6 +10,7 @@
 #include "vm/object.h"
 #include "vm/runtime_entry.h"
 #include "vm/stack_frame.h"
+#include "vm/thread_registry.h"
 
 namespace dart {
 
@@ -64,78 +65,88 @@
   ASSERT(code_objects.IsNull());
   return;
 #else
+  // Ensure mutators see empty code_objects only after code was deoptimized.
+  SafepointWriteRwLocker ml(thread, thread->isolate_group()->program_lock());
+
   if (code_objects.IsNull()) {
     return;
   }
 
-  UpdateArrayTo(Object::null_array());
-
-  // TODO(dartbug.com/36097): This has to walk all mutator threads when
-  // disabling code.
-  // Disable all code on stack.
-  Code& code = Code::Handle();
-  {
-    DartFrameIterator iterator(thread,
-                               StackFrameIterator::kNoCrossThreadIteration);
-    StackFrame* frame = iterator.NextFrame();
-    while (frame != NULL) {
-      code = frame->LookupDartCode();
-      if (IsOptimizedCode(code_objects, code)) {
-        ReportDeoptimization(code);
-        DeoptimizeAt(code, frame);
+  auto isolate_group = IsolateGroup::Current();
+  // Deoptimize stacks and disable code with mutators stopped.
+  isolate_group->RunWithStoppedMutators([&]() {
+    Code& code = Code::Handle();
+    Thread* current = isolate_group->thread_registry()->active_list();
+    while (current != NULL) {
+      // Disable all code on stack.
+      {
+        DartFrameIterator iterator(
+            current, StackFrameIterator::kAllowCrossThreadIteration);
+        StackFrame* frame = iterator.NextFrame();
+        while (frame != NULL) {
+          code = frame->LookupDartCode();
+          if (IsOptimizedCode(code_objects, code)) {
+            ReportDeoptimization(code);
+            DeoptimizeAt(code, frame);
+          }
+          frame = iterator.NextFrame();
+        }
       }
-      frame = iterator.NextFrame();
-    }
-  }
-
-  // Switch functions that use dependent code to unoptimized code.
-  WeakProperty& weak_property = WeakProperty::Handle();
-  Object& owner = Object::Handle();
-  Function& function = Function::Handle();
-  for (intptr_t i = 0; i < code_objects.Length(); i++) {
-    weak_property ^= code_objects.At(i);
-    code ^= weak_property.key();
-    if (code.IsNull()) {
-      // Code was garbage collected already.
-      continue;
-    }
-    owner = code.owner();
-    if (owner.IsFunction()) {
-      function ^= owner.ptr();
-    } else if (owner.IsClass()) {
-      Class& cls = Class::Handle();
-      cls ^= owner.ptr();
-      cls.DisableAllocationStub();
-      continue;
-    } else if (owner.IsNull()) {
-      code.Print();
-      continue;
+      current = current->next();
     }
 
-    // If function uses dependent code switch it to unoptimized.
-    if (code.is_optimized() && (function.CurrentCode() == code.ptr())) {
-      ReportSwitchingCode(code);
-      function.SwitchToUnoptimizedCode();
-    } else if (function.unoptimized_code() == code.ptr()) {
-      ReportSwitchingCode(code);
-      function.SetWasCompiled(false);
-      function.ClearICDataArray();
-      // Remove the code object from the function. The next time the
-      // function is invoked, it will be compiled again.
-      function.ClearCode();
-      // Invalidate the old code object so existing references to it
-      // (from optimized code) will be patched when invoked.
-      if (!code.IsDisabled()) {
-        code.DisableDartCode();
+    // Switch functions that use dependent code to unoptimized code.
+    WeakProperty& weak_property = WeakProperty::Handle();
+    Object& owner = Object::Handle();
+    Function& function = Function::Handle();
+    for (intptr_t i = 0; i < code_objects.Length(); i++) {
+      weak_property ^= code_objects.At(i);
+      code ^= weak_property.key();
+      if (code.IsNull()) {
+        // Code was garbage collected already.
+        continue;
       }
-    } else {
-      // Make non-OSR code non-entrant.
-      if (!code.IsDisabled()) {
+      owner = code.owner();
+      if (owner.IsFunction()) {
+        function ^= owner.ptr();
+      } else if (owner.IsClass()) {
+        Class& cls = Class::Handle();
+        cls ^= owner.ptr();
+        cls.DisableAllocationStub();
+        continue;
+      } else if (owner.IsNull()) {
+        code.Print();
+        continue;
+      }
+
+      // If function uses dependent code switch it to unoptimized.
+      if (code.is_optimized() && (function.CurrentCode() == code.ptr())) {
         ReportSwitchingCode(code);
-        code.DisableDartCode();
+        function.SwitchToUnoptimizedCode();
+      } else if (function.unoptimized_code() == code.ptr()) {
+        ReportSwitchingCode(code);
+        function.SetWasCompiled(false);
+        function.ClearICDataArray();
+        // Remove the code object from the function. The next time the
+        // function is invoked, it will be compiled again.
+        function.ClearCode();
+        // Invalidate the old code object so existing references to it
+        // (from optimized code) will be patched when invoked.
+        if (!code.IsDisabled()) {
+          code.DisableDartCode();
+        }
+      } else {
+        // Make non-OSR code non-entrant.
+        if (!code.IsDisabled()) {
+          ReportSwitchingCode(code);
+          code.DisableDartCode();
+        }
       }
     }
-  }
+
+    UpdateArrayTo(Object::null_array());
+  });
+
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 }
 
diff --git a/runtime/vm/object_graph.cc b/runtime/vm/object_graph.cc
index 489b5e1..f71a174 100644
--- a/runtime/vm/object_graph.cc
+++ b/runtime/vm/object_graph.cc
@@ -1013,6 +1013,90 @@
 
   DISALLOW_COPY_AND_ASSIGN(Pass2Visitor);
 };
+class Pass3Visitor : public ObjectVisitor {
+ public:
+  explicit Pass3Visitor(HeapSnapshotWriter* writer)
+      : ObjectVisitor(), isolate_(Isolate::Current()), writer_(writer) {}
+
+  void VisitObject(ObjectPtr obj) {
+    if (obj->IsPseudoObject()) {
+      return;
+    }
+    writer_->WriteUnsigned(GetHash(obj));
+  }
+
+ private:
+  uint32_t GetHash(ObjectPtr obj) {
+    if (!obj->IsHeapObject()) return 0;
+    intptr_t cid = obj->GetClassId();
+    uint32_t hash = 0;
+    switch (cid) {
+      case kForwardingCorpse:
+      case kFreeListElement:
+      case kSmiCid:
+        UNREACHABLE();
+      case kArrayCid:
+      case kBoolCid:
+      case kCodeSourceMapCid:
+      case kCompressedStackMapsCid:
+      case kDoubleCid:
+      case kExternalOneByteStringCid:
+      case kExternalTwoByteStringCid:
+      case kGrowableObjectArrayCid:
+      case kImmutableArrayCid:
+      case kInstructionsCid:
+      case kInstructionsSectionCid:
+      case kLinkedHashMapCid:
+      case kMintCid:
+      case kNeverCid:
+      case kNullCid:
+      case kObjectPoolCid:
+      case kOneByteStringCid:
+      case kPcDescriptorsCid:
+      case kTwoByteStringCid:
+      case kVoidCid:
+        // Don't provide hash codes for objects with the above CIDs in order
+        // to try and avoid having to initialize identity hash codes for common
+        // primitives and types that don't have hash codes.
+        break;
+      default: {
+        hash = GetHashHelper(obj);
+      }
+    }
+    return hash;
+  }
+
+  uint32_t GetHashHelper(ObjectPtr obj) {
+    uint32_t hash;
+#if defined(HASH_IN_OBJECT_HEADER)
+    hash = Object::GetCachedHash(obj);
+    if (hash == 0) {
+      ASSERT(
+          !isolate_->group()->heap()->old_space()->IsObjectFromImagePages(obj));
+      hash = isolate_->random()->NextUInt32();
+      Object::SetCachedHash(obj, hash);
+      hash = Object::GetCachedHash(obj);
+    }
+#else
+    Heap* heap = isolate_->group()->heap();
+    hash = heap->GetHash(obj);
+    if (hash == 0) {
+      ASSERT(!heap->old_space()->IsObjectFromImagePages(obj));
+      heap->SetHash(obj, isolate_->random()->NextUInt32());
+      hash = heap->GetHash(obj);
+    }
+#endif
+    return hash;
+  }
+
+  // TODO(dartbug.com/36097): Once the shared class table contains more
+  // information than just the size (i.e. includes an immutable class
+  // descriptor), we can remove this dependency on the current isolate.
+  Isolate* isolate_;
+  HeapSnapshotWriter* const writer_;
+
+  DISALLOW_COPY_AND_ASSIGN(Pass3Visitor);
+};
 
 void HeapSnapshotWriter::Write() {
   HeapIterationScope iteration(thread());
@@ -1181,6 +1265,18 @@
     isolate()->group()->VisitWeakPersistentHandles(&visitor);
   }
 
+  {
+    // Identity hash codes
+    Pass3Visitor visitor(this);
+
+    // Handle root object.
+    WriteUnsigned(0);
+
+    // Handle visit rest of the objects.
+    iteration.IterateVMIsolateObjects(&visitor);
+    iteration.IterateObjects(&visitor);
+  }
+
   ClearObjectIds();
   Flush(true);
 }
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index d209ad2..21f3aaa 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -1461,7 +1461,22 @@
   POINTER_FIELD(ArrayPtr, hide_names)  // list of names that are hidden.
   POINTER_FIELD(LibraryPtr, owner)
   VISIT_TO(ObjectPtr, owner)
-  ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
+  ObjectPtr* to_snapshot(Snapshot::Kind kind) {
+    switch (kind) {
+      case Snapshot::kFullAOT:
+        return reinterpret_cast<ObjectPtr*>(&target_);
+      case Snapshot::kFull:
+      case Snapshot::kFullCore:
+      case Snapshot::kFullJIT:
+        return reinterpret_cast<ObjectPtr*>(&owner_);
+      case Snapshot::kMessage:
+      case Snapshot::kNone:
+      case Snapshot::kInvalid:
+        break;
+    }
+    UNREACHABLE();
+    return NULL;
+  }
 };
 
 class UntaggedKernelProgramInfo : public UntaggedObject {
diff --git a/runtime/vm/service/heap_snapshot.md b/runtime/vm/service/heap_snapshot.md
index c32d562..b2c167f 100644
--- a/runtime/vm/service/heap_snapshot.md
+++ b/runtime/vm/service/heap_snapshot.md
@@ -41,7 +41,7 @@
   // The amount of memory reserved for this heap. At least as large as |shallowSize|.
   capacity : uleb128,
 
-  // The sum of sizes of all external properites in this graph.
+  // The sum of sizes of all external properties in this graph.
   externalSize : uleb128,
 
   classCount : uleb128,
@@ -54,6 +54,14 @@
 
   externalPropertyCount : uleb128,
   externalProperties : SnapshotExternalProperty[externalPropertyCount],
+
+  // The list of identity hash codes corresponding to each entry in objects.
+  // A hash code of zero is invalid and cannot be used to determine equality
+  // between objects. If the same object is included in multiple
+  // HeapSnapshots, it will report the same identityHashCode. The converse is
+  // not true: two different objects may report the same identityHashCode
+  // (with low probability).
+  identityHashCodes: uint32[objectCount],
 }
 ```
 
diff --git a/runtime/vm/thread_registry.h b/runtime/vm/thread_registry.h
index e0c80a3..c45103e 100644
--- a/runtime/vm/thread_registry.h
+++ b/runtime/vm/thread_registry.h
@@ -58,6 +58,7 @@
   friend class IsolateGroup;
   friend class SafepointHandler;
   friend class Scavenger;
+  friend class WeakCodeReferences;
   DISALLOW_COPY_AND_ASSIGN(ThreadRegistry);
 };
 
diff --git a/sdk/lib/_internal/fix_data.yaml b/sdk/lib/_internal/fix_data.yaml
new file mode 100644
index 0000000..2c6e8e9
--- /dev/null
+++ b/sdk/lib/_internal/fix_data.yaml
@@ -0,0 +1,61 @@
+# 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.
+
+# TODO(pq): Add link to public user guide when available.
+
+# Please add new fixes to the top of the file, separated by one blank line
+# from other fixes.  Add corresponding golden tests to 
+# `tests/lib/fix_data_tests` for each new fix.
+
+version: 1
+transforms:
+  - title: "Rename to 'read'"
+    date: 2021-01-25
+    element:
+      uris: [ 'dart:io' ]
+      field: 'READ'
+      inClass: 'FileMode'
+    changes:
+      - kind: 'rename'
+        newName: 'read'
+
+  - title: "Rename to 'write'"
+    date: 2021-01-25
+    element:
+      uris: [ 'dart:io' ]
+      field: 'WRITE'
+      inClass: 'FileMode'
+    changes:
+      - kind: 'rename'
+        newName: 'write'
+
+  - title: "Rename to 'append'"
+    date: 2021-01-25
+    element:
+      uris: [ 'dart:io' ]
+      field: 'APPEND'
+      inClass: 'FileMode'
+    changes:
+      - kind: 'rename'
+        newName: 'append'
+
+  - title: "Rename to 'writeOnly'"
+    date: 2021-01-25
+    element:
+      uris: [ 'dart:io' ]
+      field: 'WRITE_ONLY'
+      inClass: 'FileMode'
+    changes:
+      - kind: 'rename'
+        newName: 'writeOnly'
+
+  - title: "Rename to 'writeOnlyAppend'"
+    date: 2021-01-25
+    element:
+      uris: [ 'dart:io' ]
+      field: 'WRITE_ONLY_APPEND'
+      inClass: 'FileMode'
+    changes:
+      - kind: 'rename'
+        newName: 'writeOnlyAppend'
\ No newline at end of file
diff --git a/sdk/lib/async/zone.dart b/sdk/lib/async/zone.dart
index 5400814..a96cdfb 100644
--- a/sdk/lib/async/zone.dart
+++ b/sdk/lib/async/zone.dart
@@ -88,7 +88,7 @@
 typedef RegisterCallbackHandler = ZoneCallback<R> Function<R>(
     Zone self, ZoneDelegate parent, Zone zone, R Function() f);
 
-/// The type of a custom [Zone.registerUnary] implementation function.
+/// The type of a custom [Zone.registerUnaryCallback] implementation function.
 ///
 /// Receives the [Zone] that the handler was registered on as [self],
 /// a delegate forwarding to the handlers of [self]'s parent zone as [parent],
@@ -96,7 +96,7 @@
 /// which will have [self] as a parent zone.
 ///
 /// The function [f] is the function which was passed to the
-/// which was passed to the [Zone.registerUnary] of [zone].
+/// which was passed to the [Zone.registerUnaryCallback] of [zone].
 ///
 /// The handler should return either the function [f]
 /// or another function replacing [f],
@@ -105,7 +105,7 @@
 typedef RegisterUnaryCallbackHandler = ZoneUnaryCallback<R, T> Function<R, T>(
     Zone self, ZoneDelegate parent, Zone zone, R Function(T arg) f);
 
-/// The type of a custom [Zone.registerBinary] implementation function.
+/// The type of a custom [Zone.registerBinaryCallback] implementation function.
 ///
 /// Receives the [Zone] that the handler was registered on as [self],
 /// a delegate forwarding to the handlers of [self]'s parent zone as [parent],
@@ -113,7 +113,7 @@
 /// which will have [self] as a parent zone.
 ///
 /// The function [f] is the function which was passed to the
-/// which was passed to the [Zone.registerBinary] of [zone].
+/// which was passed to the [Zone.registerBinaryCallback] of [zone].
 ///
 /// The handler should return either the function [f]
 /// or another function replacing [f],
@@ -187,7 +187,7 @@
 /// and the current zone where the error was uncaught as [zone],
 /// which will have [self] as a parent zone.
 ///
-/// The callback function [f] and [duration] are the ones which were
+/// The callback function [f] and [period] are the ones which were
 /// passed to [Zone.createPeriodicTimer] of [zone]
 /// (possibly through the [Timer.periodic] constructor).
 ///
@@ -306,7 +306,7 @@
   ///
   /// If the [handleUncaughtError] is provided, the new zone will be a new
   /// "error zone" which will prevent errors from flowing into other
-  /// error zones (see [errorZone], [sameErrorZone]).
+  /// error zones (see [Zone.errorZone], [Zone.inSameErrorZone]).
   const factory ZoneSpecification(
       {HandleUncaughtErrorHandler? handleUncaughtError,
       RunHandler? run,
diff --git a/sdk/lib/core/errors.dart b/sdk/lib/core/errors.dart
index f0d6178..61aa5e3 100644
--- a/sdk/lib/core/errors.dart
+++ b/sdk/lib/core/errors.dart
@@ -42,7 +42,7 @@
 /// effectively making it an alternative result rather than an error.
 /// The thrown object can choose to implement [Exception]
 /// to document that it represents an exceptional, but not erroneous,
-/// occurrence, but being an [Excpetion] has no other effect
+/// occurrence, but being an [Exception] has no other effect
 /// than documentation.
 ///
 /// All non-`null` values can be thrown in Dart.
@@ -575,8 +575,8 @@
 
 /// Error thrown when a lazily initialized variable cannot be initialized.
 ///
-/// No longer used in null safe Dart code,
-/// replaced by late variables and [LateInitializationError].
+/// This is no longer used in null safe Dart code and is replaced by late
+/// variables and `LateInitializationError`.
 // TODO: Deprecate?
 class CyclicInitializationError extends Error {
   final String? variableName;
diff --git a/sdk/lib/core/list.dart b/sdk/lib/core/list.dart
index 347484e..2f7bec5 100644
--- a/sdk/lib/core/list.dart
+++ b/sdk/lib/core/list.dart
@@ -645,7 +645,7 @@
   /// must be non-`null`.
   void fillRange(int start, int end, [E? fillValue]);
 
-  /// Replaces a range of elements with the elements of [replacement].
+  /// Replaces a range of elements with the elements of [replacements].
   ///
   /// Removes the objects in the range from [start] to [end],
   /// then inserts the elements of [replacements] at [start].
@@ -667,10 +667,10 @@
   /// but may be more efficient.
   ///
   /// The list must be growable.
-  /// This method does not work on fixed-length lists, even when [replacement]
+  /// This method does not work on fixed-length lists, even when [replacements]
   /// has the same number of elements as the replaced range. In that case use
   /// [setRange] instead.
-  void replaceRange(int start, int end, Iterable<E> replacement);
+  void replaceRange(int start, int end, Iterable<E> replacements);
 
   /// An unmodifiable [Map] view of this list.
   ///
diff --git a/sdk/lib/core/string_buffer.dart b/sdk/lib/core/string_buffer.dart
index 6826e06..b15cb77 100644
--- a/sdk/lib/core/string_buffer.dart
+++ b/sdk/lib/core/string_buffer.dart
@@ -35,7 +35,7 @@
   /// Writes all [objects] separated by [separator].
   ///
   /// Writes each individual object in [objects] in iteration order,
-  /// and writes [separtor] between any two objects.
+  /// and writes [separator] between any two objects.
   external void writeAll(Iterable<dynamic> objects, [String separator = ""]);
 
   external void writeln([Object? obj = ""]);
diff --git a/tests/language/regress/regress33479_test.dart b/tests/language/regress/regress33479_test.dart
index cb07911..568b6f8 100644
--- a/tests/language/regress/regress33479_test.dart
+++ b/tests/language/regress/regress33479_test.dart
@@ -1,7 +1,9 @@
 class Hest<TypeX extends Fisk> {}
+//         ^
+// [cfe] Type variables can't have generic function types in their bounds.
 
 typedef Fisk = void Function // don't merge lines
-// [error line 3, column 1, length 346]
+// [error line 5, column 1, length 346]
 // [analyzer] COMPILE_TIME_ERROR.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF
 //      ^
 // [cfe] Generic type 'Fisk' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Hest'.
@@ -9,8 +11,6 @@
 
 main() {
   Hest hest = new Hest();
-//     ^
-// [cfe] A generic function type can't be used as a type argument.
-//                ^^^^
+//                ^
 // [cfe] Generic function type 'void Function<TypeY>()' inferred as a type argument.
 }
diff --git a/tests/language_2/regress/regress33479_test.dart b/tests/language_2/regress/regress33479_test.dart
index cb07911..568b6f8 100644
--- a/tests/language_2/regress/regress33479_test.dart
+++ b/tests/language_2/regress/regress33479_test.dart
@@ -1,7 +1,9 @@
 class Hest<TypeX extends Fisk> {}
+//         ^
+// [cfe] Type variables can't have generic function types in their bounds.
 
 typedef Fisk = void Function // don't merge lines
-// [error line 3, column 1, length 346]
+// [error line 5, column 1, length 346]
 // [analyzer] COMPILE_TIME_ERROR.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF
 //      ^
 // [cfe] Generic type 'Fisk' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Hest'.
@@ -9,8 +11,6 @@
 
 main() {
   Hest hest = new Hest();
-//     ^
-// [cfe] A generic function type can't be used as a type argument.
-//                ^^^^
+//                ^
 // [cfe] Generic function type 'void Function<TypeY>()' inferred as a type argument.
 }
diff --git a/tests/lib/fix_data_tests/README.md b/tests/lib/fix_data_tests/README.md
new file mode 100644
index 0000000..09ff06f
--- /dev/null
+++ b/tests/lib/fix_data_tests/README.md
@@ -0,0 +1,9 @@
+## Directory contents
+
+The Dart files and golden master `.expect` files in this directory are used to
+test the `dart fix` API refactorings used by the SDK.
+
+<!-- TODO(pq): Add link to public user guide when available. -->
+
+See the `sdk/lib/_internal/fix_data.yaml` file for the current Dart SDK API
+refactorings.
diff --git a/tests/lib/fix_data_tests/analysis_options.yaml b/tests/lib/fix_data_tests/analysis_options.yaml
new file mode 100644
index 0000000..7cca7b1
--- /dev/null
+++ b/tests/lib/fix_data_tests/analysis_options.yaml
@@ -0,0 +1 @@
+# This ensures that parent analysis options do not accidentally break the fix tests.
diff --git a/tests/lib/fix_data_tests/file.dart b/tests/lib/fix_data_tests/file.dart
new file mode 100644
index 0000000..0e5435d
--- /dev/null
+++ b/tests/lib/fix_data_tests/file.dart
@@ -0,0 +1,13 @@
+// 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.
+
+import 'dart:io';
+
+void main() {
+  print(FileMode.APPEND);
+  print(FileMode.READ);
+  print(FileMode.WRITE);
+  print(FileMode.WRITE_ONLY);
+  print(FileMode.WRITE_ONLY_APPEND);
+}
diff --git a/tests/lib/fix_data_tests/file.dart.expect b/tests/lib/fix_data_tests/file.dart.expect
new file mode 100644
index 0000000..aafbba6
--- /dev/null
+++ b/tests/lib/fix_data_tests/file.dart.expect
@@ -0,0 +1,13 @@
+// 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.
+
+import 'dart:io';
+
+void main() {
+  print(FileMode.append);
+  print(FileMode.read);
+  print(FileMode.write);
+  print(FileMode.writeOnly);
+  print(FileMode.writeOnlyAppend);
+}
diff --git a/tools/VERSION b/tools/VERSION
index 0b7de8c..7f25062 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 12
 PATCH 0
-PRERELEASE 279
+PRERELEASE 280
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 3d7a822..4093a81 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -3246,6 +3246,27 @@
           ]
         },
         {
+          "name": "validate SDK API docs",
+          "script": "out/ReleaseX64/dart-sdk/bin/dartdoc",
+          "arguments": [
+            "--exclude",
+            "dart:ffi,dart:html,dart:web_sql,dart:web_audio,dart:svg,dart:indexed_db,dart:io",
+            "--sdk-docs",
+            "--no-generate-docs"
+          ],
+          "comments1": "TODO(devoncarew): add --errors=unresolved-doc-reference above to fail on unresolved doc references",
+          "comments2": "ambiguous-doc-reference, ambiguous-reexport, broken-link, deprecated, no-library-level-docs, unknown-directive, unknown-macro"
+        },
+        {
+          "name": "validate SDK API data-driven fixes",
+          "script": "out/ReleaseX64/dart-sdk/bin/dart",
+          "arguments": [
+            "fix",
+            "--compare-to-golden",
+            "tests/lib/fix_data_tests"
+          ]
+        },
+        {
           "name": "package unit tests",
           "arguments": [
             "-nunittest-asserts-${mode}-${system}",