Version 2.13.0-178.0.dev

Merge commit 'ed7dd1eda64fdd48c79bf8ad28e0cce400d82a48' into 'dev'
diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json
index 8a5f7e9..056b654 100644
--- a/.dart_tool/package_config.json
+++ b/.dart_tool/package_config.json
@@ -11,7 +11,7 @@
     "constraint, update this by running tools/generate_package_config.dart."
   ],
   "configVersion": 2,
-  "generated": "2021-03-24T13:42:28.071470",
+  "generated": "2021-03-29T21:48:35.411283",
   "generator": "tools/generate_package_config.dart",
   "packages": [
     {
@@ -94,7 +94,7 @@
       "name": "analyzer_plugin",
       "rootUri": "../pkg/analyzer_plugin",
       "packageUri": "lib/",
-      "languageVersion": "2.9"
+      "languageVersion": "2.12"
     },
     {
       "name": "analyzer_utilities",
@@ -734,12 +734,6 @@
       "languageVersion": "2.12"
     },
     {
-      "name": "uuid",
-      "rootUri": "../third_party/pkg/uuid",
-      "packageUri": "lib/",
-      "languageVersion": "2.0"
-    },
-    {
       "name": "vector_math",
       "rootUri": "../third_party/pkg/vector_math",
       "packageUri": "lib/",
diff --git a/DEPS b/DEPS
index 4ecf65b..8c93fae 100644
--- a/DEPS
+++ b/DEPS
@@ -102,7 +102,7 @@
 
   "chromedriver_tag": "83.0.4103.39",
   "browser_launcher_rev": "12ab9f351a44ac803de9bc17bb2180bb312a9dd7",
-  "dartdoc_rev" : "174021f3d76c2a8500b54977c80f32c5bbc099f1",
+  "dartdoc_rev" : "e2d010ed74059be942a78ced5f35f1b8d667ed16",
   "ffi_rev": "f3346299c55669cc0db48afae85b8110088bf8da",
   "fixnum_rev": "16d3890c6dc82ca629659da1934e412292508bba",
   "file_rev": "0e09370f581ab6388d46fda4cdab66638c0171a1",
diff --git a/pkg/analysis_server/lib/src/plugin/plugin_manager.dart b/pkg/analysis_server/lib/src/plugin/plugin_manager.dart
index ccb5df1..40d94a7 100644
--- a/pkg/analysis_server/lib/src/plugin/plugin_manager.dart
+++ b/pkg/analysis_server/lib/src/plugin/plugin_manager.dart
@@ -565,7 +565,7 @@
     }
     var files = params.files;
     for (var file in files.keys) {
-      Object overlay = files[file];
+      var overlay = files[file];
       if (overlay is RemoveContentOverlay) {
         _overlayState.remove(file);
       } else if (overlay is AddContentOverlay) {
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/analysis_options/fix_generator.dart b/pkg/analysis_server/lib/src/services/correction/fix/analysis_options/fix_generator.dart
index c435c38..241673e 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/analysis_options/fix_generator.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/analysis_options/fix_generator.dart
@@ -8,6 +8,7 @@
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/utilities/strings.dart';
 import 'package:analysis_server/src/utilities/yaml_node_locator.dart';
+import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/src/analysis_options/error/option_codes.dart';
@@ -15,6 +16,7 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/lint/options_rule_validator.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:yaml/yaml.dart';
 
@@ -169,7 +171,9 @@
     var nodeToDelete = coveringNodePath[index - 1];
     deletionRange ??=
         _lines(nodeToDelete.span.start.offset, nodeToDelete.span.end.offset);
-    var builder = ChangeBuilder();
+    var builder = ChangeBuilder(
+      workspace: _NonDartChangeWorkspace(),
+    );
     await builder.addGenericFileEdit(file, (builder) {
       builder.addDeletion(deletionRange);
     });
@@ -192,3 +196,15 @@
     return SourceRange(startOffset, endOffset - startOffset);
   }
 }
+
+class _NonDartChangeWorkspace implements ChangeWorkspace {
+  @override
+  bool containsFile(String path) {
+    return true;
+  }
+
+  @override
+  AnalysisSession getSession(String path) {
+    throw UnimplementedError('Attempt to work a Dart file.');
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/accessor.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/accessor.dart
index 0d17244..765e120 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/accessor.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/accessor.dart
@@ -49,6 +49,9 @@
     return const InvalidResult();
   }
 
+  @override
+  String toString() => 'arguments[$parameter]';
+
   /// Return the argument list associated with the [node].
   ArgumentList _getArgumentList(AstNode node) {
     if (node is Annotation) {
@@ -106,6 +109,9 @@
     return const InvalidResult();
   }
 
+  @override
+  String toString() => 'typeArguments[$index]';
+
   /// Return the type argument list associated with the [node].
   TypeArgumentList _getTypeArgumentList(AstNode node) {
     if (node is ExtensionOverride) {
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/expression.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/expression.dart
index 96651b9..9f56ae1 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/expression.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/expression.dart
@@ -41,6 +41,9 @@
     }
     return null;
   }
+
+  @override
+  String toString() => '$leftOperand ${operator.displayName} $rightOperand';
 }
 
 /// An expression.
@@ -61,6 +64,9 @@
   String evaluateIn(TemplateContext context) {
     return value;
   }
+
+  @override
+  String toString() => '"$value"';
 }
 
 /// An operator used in a binary expression.
@@ -83,4 +89,21 @@
   String evaluateIn(TemplateContext context) {
     return generator.evaluateIn(context);
   }
+
+  @override
+  String toString() => '{$generator}';
+}
+
+extension on Operator {
+  String get displayName {
+    switch (this) {
+      case Operator.and:
+        return '&&';
+      case Operator.equal:
+        return '==';
+      case Operator.notEqual:
+        return '!=';
+    }
+    return 'impossible';
+  }
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/modify_parameters.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/modify_parameters.dart
index c472d13..04c7d6e 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/modify_parameters.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/modify_parameters.dart
@@ -92,6 +92,7 @@
       }
     }
     argumentsToInsert.sort();
+    argumentsToDelete.sort();
 
     /// Write to the [builder] the argument associated with a single
     /// [parameter].
@@ -202,8 +203,20 @@
     // The remaining deletion ranges are now ready to be removed.
     //
     for (var subRange in deletionRanges) {
-      builder.addDeletion(range.argumentRange(
-          argumentList, subRange.lower, subRange.upper, true));
+      var lower = subRange.lower;
+      var upper = subRange.upper;
+      if (lower == 0 &&
+          upper == arguments.length - 1 &&
+          insertionRanges.isNotEmpty) {
+        // We're removing all of the existing arguments but we've already
+        // inserted new arguments between the parentheses. We need to handle
+        // this case specially because the default code would cause a
+        // `ConflictingEditException`.
+        builder.addDeletion(range.startEnd(arguments[lower], arguments[upper]));
+      } else {
+        builder
+            .addDeletion(range.argumentRange(argumentList, lower, upper, true));
+      }
     }
   }
 
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/parameter_reference.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/parameter_reference.dart
index e67f425..d2fc364 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/parameter_reference.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/parameter_reference.dart
@@ -22,6 +22,9 @@
     }
     return null;
   }
+
+  @override
+  String toString() => name;
 }
 
 /// A reference to a formal parameter.
@@ -54,4 +57,7 @@
     }
     return argument;
   }
+
+  @override
+  String toString() => '$index';
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/value_generator.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/value_generator.dart
index 527669f..16c8388 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/value_generator.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/value_generator.dart
@@ -40,6 +40,9 @@
   }
 
   @override
+  String toString() => accessors.join('.');
+
+  @override
   bool validate(TemplateContext context) {
     Object target = context.node;
     for (var accessor in accessors) {
diff --git a/pkg/analysis_server/test/analysis/update_content_test.dart b/pkg/analysis_server/test/analysis/update_content_test.dart
index d8ee8ac..b817956 100644
--- a/pkg/analysis_server/test/analysis/update_content_test.dart
+++ b/pkg/analysis_server/test/analysis/update_content_test.dart
@@ -233,7 +233,7 @@
     expect(params, isNotNull);
     var files = params.files;
     expect(files, hasLength(1));
-    Object overlay = files[filePath];
+    var overlay = files[filePath];
     expect(overlay, const TypeMatcher<AddContentOverlay>());
     AddContentOverlay addOverlay = overlay;
     expect(addOverlay.content, fileContent);
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/modify_parameters_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/modify_parameters_test.dart
index 77e7e1f..5791e25 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/modify_parameters_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/modify_parameters_test.dart
@@ -384,12 +384,44 @@
 ''');
   }
 
+  Future<void> test_mixed_overlap_addBetweenRemoved_deprecated() async {
+    setPackageContent('''
+class C {
+  @deprecated
+  void m1({int a, int b,        int d, int e}) {}
+  void m2({int a,        int c,        int e}) {}
+}
+''');
+    setPackageData(_modify([
+      'm1',
+      'C'
+    ], [
+      AddParameter(1, 'c', true, false, codeTemplate('3')),
+      RemoveParameter(NamedParameterReference('b')),
+      RemoveParameter(NamedParameterReference('d')),
+    ], newName: 'm2'));
+    await resolveTestCode('''
+import '$importUri';
+
+void f(C c) {
+  c.m1(a: 1, b: 2, d: 4, e: 5);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(C c) {
+  c.m2(a: 1, c: 3, e: 5);
+}
+''');
+  }
+
   Future<void> test_mixed_overlap_first_deprecated() async {
     setPackageContent('''
 class C {
   @deprecated
-  void m1(int a, int b, int d) {}
-  void m2(       int c, int d) {}
+  void m1(int a, int b,        int d) {}
+  void m2(              int c, int d) {}
 }
 ''');
     setPackageData(_modify([
@@ -420,8 +452,8 @@
     setPackageContent('''
 class C {
   @deprecated
-  void m1(int a, int b, int c) {}
-  void m2(int a,        int d) {}
+  void m1(int a, int b, int c       ) {}
+  void m2(int a,               int d) {}
 }
 ''');
     setPackageData(_modify([
@@ -452,8 +484,8 @@
     setPackageContent('''
 class C {
   @deprecated
-  void m1(       int b, int c, int e, int f, int g) {}
-  void m2(int a, int b, int d, int e,        int g) {}
+  void m1(       int b, int c,        int e, int f, int g) {}
+  void m2(int a, int b,        int d, int e,        int g) {}
 }
 ''');
     setPackageData(_modify([
@@ -481,7 +513,7 @@
 ''');
   }
 
-  Future<void> test_mixed_replaced_deprecated() async {
+  Future<void> test_mixed_replaceAll_deprecated() async {
     setPackageContent('''
 class C {
   @deprecated
@@ -512,6 +544,41 @@
 ''');
   }
 
+  Future<void> test_mixed_replaceAll_trailingComma_deprecated() async {
+    setPackageContent('''
+class C {
+  @deprecated
+  void m1({int a       }) {}
+  void m2({       int b}) {}
+}
+''');
+    setPackageData(_modify([
+      'm1',
+      'C'
+    ], [
+      AddParameter(0, 'b', true, false, codeTemplate('0')),
+      RemoveParameter(NamedParameterReference('a')),
+    ], newName: 'm2'));
+    await resolveTestCode('''
+import '$importUri';
+
+void f(C c) {
+  c.m1(
+    a: 1,
+  );
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(C c) {
+  c.m2(
+    b: 0,
+  );
+}
+''');
+  }
+
   Future<void> test_remove_first_optionalNamed_deprecated() async {
     setPackageContent('''
 class C {
diff --git a/pkg/analyzer/lib/src/generated/ffi_verifier.dart b/pkg/analyzer/lib/src/generated/ffi_verifier.dart
index f22e8c1..694d0ad 100644
--- a/pkg/analyzer/lib/src/generated/ffi_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/ffi_verifier.dart
@@ -269,13 +269,13 @@
         return false;
       }
       if (!_isValidFfiNativeType(nativeType.returnType,
-          allowVoid: true, allowEmptyStruct: false)) {
+          allowVoid: true, allowEmptyStruct: false, allowHandle: true)) {
         return false;
       }
 
       for (final DartType typeArg in nativeType.normalParameterTypes) {
         if (!_isValidFfiNativeType(typeArg,
-            allowVoid: false, allowEmptyStruct: false)) {
+            allowVoid: false, allowEmptyStruct: false, allowHandle: true)) {
           return false;
         }
       }
@@ -288,13 +288,21 @@
   bool _isValidFfiNativeType(DartType? nativeType,
       {bool allowVoid = false,
       bool allowEmptyStruct = false,
-      bool allowArray = false}) {
+      bool allowArray = false,
+      bool allowHandle = false}) {
     if (nativeType is InterfaceType) {
-      // Is it a primitive integer/double type (or ffi.Void if we allow it).
       final primitiveType = _primitiveNativeType(nativeType);
-      if (primitiveType != _PrimitiveDartType.none &&
-          (primitiveType != _PrimitiveDartType.void_ || allowVoid)) {
-        return true;
+      switch (primitiveType) {
+        case _PrimitiveDartType.void_:
+          return allowVoid;
+        case _PrimitiveDartType.handle:
+          return allowHandle;
+        case _PrimitiveDartType.double:
+        case _PrimitiveDartType.int:
+          return true;
+        case _PrimitiveDartType.none:
+          // These are the cases below.
+          break;
       }
       if (nativeType.isNativeFunction) {
         return _isValidFfiNativeFunctionType(nativeType.typeArguments.single);
@@ -302,7 +310,7 @@
       if (nativeType.isPointer) {
         final nativeArgumentType = nativeType.typeArguments.single;
         return _isValidFfiNativeType(nativeArgumentType,
-                allowVoid: true, allowEmptyStruct: true) ||
+                allowVoid: true, allowEmptyStruct: true, allowHandle: true) ||
             nativeArgumentType.isStructSubtype ||
             nativeArgumentType.isNativeType;
       }
@@ -776,12 +784,8 @@
   /// associate it with the [errorNode].
   void _validateSizeOfAnnotation(AstNode errorNode,
       NodeList<Annotation> annotations, int arrayDimensions) {
-    final ffiSizeAnnotations = annotations.where((annotation) {
-      final element = annotation.element;
-      return element is ConstructorElement &&
-          element.ffiClass != null &&
-          element.enclosingElement.name == 'Array';
-    }).toList();
+    final ffiSizeAnnotations =
+        annotations.where((annotation) => annotation.isArray).toList();
 
     if (ffiSizeAnnotations.isEmpty) {
       _errorReporter.reportErrorForNode(
@@ -799,17 +803,8 @@
 
     // Check number of dimensions.
     final annotation = ffiSizeAnnotations.first;
-    final expressions = annotation.arguments!.arguments;
-    int annotationDimensions = 0;
-    for (var expression in expressions) {
-      if (expression is IntegerLiteral) {
-        // Element of `@Array(1, 2, 3)`.
-        annotationDimensions++;
-      } else if (expression is ListLiteral) {
-        // Element of `@Array.multi([1, 2, 3])`.
-        annotationDimensions += expression.elements.length;
-      }
-    }
+    final dimensions = annotation.elementAnnotation?.arraySizeDimensions ?? [];
+    final annotationDimensions = dimensions.length;
     if (annotationDimensions != arrayDimensions) {
       _errorReporter.reportErrorForNode(
           FfiCode.SIZE_ANNOTATION_DIMENSIONS, annotation);
@@ -837,6 +832,13 @@
 }
 
 extension on Annotation {
+  bool get isArray {
+    final element = this.element;
+    return element is ConstructorElement &&
+        element.ffiClass != null &&
+        element.enclosingElement.name == 'Array';
+  }
+
   bool get isPacked {
     final element = this.element;
     return element is ConstructorElement &&
@@ -846,6 +848,15 @@
 }
 
 extension on ElementAnnotation {
+  bool get isArray {
+    final element = this.element;
+    return element is ConstructorElement &&
+        element.ffiClass != null &&
+        element.enclosingElement.name == 'Array';
+    // Note: this is 'Array' instead of '_ArraySize' because it finds the
+    // forwarding factory instead of the forwarded constructor.
+  }
+
   bool get isPacked {
     final element = this.element;
     return element is ConstructorElement &&
@@ -853,6 +864,41 @@
         element.enclosingElement.name == 'Packed';
   }
 
+  List<int> get arraySizeDimensions {
+    assert(isArray);
+    final value = computeConstantValue();
+
+    // Element of `@Array.multi([1, 2, 3])`.
+    final listField = value?.getField('dimensions');
+    if (listField != null) {
+      final listValues = listField
+          .toListValue()
+          ?.map((dartValue) => dartValue.toIntValue())
+          .whereType<int>()
+          .toList();
+      if (listValues != null) {
+        return listValues;
+      }
+    }
+
+    // Element of `@Array(1, 2, 3)`.
+    const dimensionFieldNames = [
+      'dimension1',
+      'dimension2',
+      'dimension3',
+      'dimension4',
+      'dimension5',
+    ];
+    var result = <int>[];
+    for (final dimensionFieldName in dimensionFieldNames) {
+      final dimensionValue = value?.getField(dimensionFieldName)?.toIntValue();
+      if (dimensionValue != null) {
+        result.add(dimensionValue);
+      }
+    }
+    return result;
+  }
+
   int? get packedMemberAlignment {
     assert(isPacked);
     final value = computeConstantValue();
diff --git a/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart b/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
index a0ea939..a9f8b0f 100644
--- a/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
+++ b/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
@@ -697,10 +697,34 @@
 }
 
 class Array<T extends NativeType> extends NativeType {
-  external const factory Array(int dimension1,
-      [int dimension2, int dimension3, int dimension4, int dimension5]);
+  const factory Array(int dimension1,
+      [int dimension2,
+      int dimension3,
+      int dimension4,
+      int dimension5]) = _ArraySize<T>;
 
-  external const factory Array.multi(List<int> dimensions);
+  const factory Array.multi(List<int> dimensions) = _ArraySize<T>.multi;
+}
+
+class _ArraySize<T extends NativeType> implements Array<T> {
+  final int? dimension1;
+  final int? dimension2;
+  final int? dimension3;
+  final int? dimension4;
+  final int? dimension5;
+
+  final List<int>? dimensions;
+
+  const _ArraySize(this.dimension1,
+      [this.dimension2, this.dimension3, this.dimension4, this.dimension5])
+      : dimensions = null;
+
+  const _ArraySize.multi(this.dimensions)
+      : dimension1 = null,
+        dimension2 = null,
+        dimension3 = null,
+        dimension4 = null,
+        dimension5 = null;
 }
 
 extension StructPointer<T extends Struct> on Pointer<T> {
diff --git a/pkg/analyzer/test/src/diagnostics/extra_size_annotation_carray_test.dart b/pkg/analyzer/test/src/diagnostics/extra_size_annotation_carray_test.dart
index b3058ba..e0fd420 100644
--- a/pkg/analyzer/test/src/diagnostics/extra_size_annotation_carray_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/extra_size_annotation_carray_test.dart
@@ -15,6 +15,19 @@
 
 @reflectiveTest
 class ExtraSizeAnnotationArray extends PubPackageResolutionTest {
+  test_const() async {
+    await assertNoErrorsInCode(r'''
+import 'dart:ffi';
+
+const EIGHT = 8;
+
+class Struct8BytesInlineArrayInt extends Struct {
+  @Array(EIGHT)
+  Array<Uint8> a0;
+}
+''');
+  }
+
   test_one() async {
     await assertNoErrorsInCode(r'''
 import 'dart:ffi';
diff --git a/pkg/analyzer_plugin/CHANGELOG.md b/pkg/analyzer_plugin/CHANGELOG.md
index 8215421..62081ae 100644
--- a/pkg/analyzer_plugin/CHANGELOG.md
+++ b/pkg/analyzer_plugin/CHANGELOG.md
@@ -1,7 +1,11 @@
 ## 0.5.0-dev
-- Changed the support version range of the analyzer to `>=0.42.0 <0.43.0`.
+- Changed the support version range of the analyzer to `^1.3.0`.
 - Removed `Plugin.fileContentOverlay`, instead `Plugin.resourceProvider` is
   now `OverlayResourceProvider`, and `analysis.updateContent` updates it.
+- Removed deprecated `DartChangeBuilder` and `DartChangeBuilderImpl`.
+- Removed deprecated `ChangeBuilder.addFileEdit()`.
+- Stable null safety release.
+- Updated dependencies to null safe releases.
 
 ## 0.4.0
 - Deprecated the class `DartChangeBuilder` and enhanced `ChangeBuilder` to be
diff --git a/pkg/analyzer_plugin/lib/channel/channel.dart b/pkg/analyzer_plugin/lib/channel/channel.dart
index d2479e0..36ae448 100644
--- a/pkg/analyzer_plugin/lib/channel/channel.dart
+++ b/pkg/analyzer_plugin/lib/channel/channel.dart
@@ -19,7 +19,7 @@
   /// client, invoke the [onDone] function. Only one listener is allowed per
   /// channel.
   void listen(void Function(Request request) onRequest,
-      {Function onError, void Function() onDone});
+      {Function? onError, void Function()? onDone});
 
   /// Send the given [notification] to the server.
   void sendNotification(Notification notification);
@@ -49,7 +49,7 @@
   /// listener is allowed per channel.
   void listen(void Function(Response response) onResponse,
       void Function(Notification notification) onNotification,
-      {void Function(dynamic error) onError, void Function() onDone});
+      {void Function(dynamic error)? onError, void Function()? onDone});
 
   /// Send the given [request] to the plugin.
   void sendRequest(Request request);
diff --git a/pkg/analyzer_plugin/lib/plugin/completion_mixin.dart b/pkg/analyzer_plugin/lib/plugin/completion_mixin.dart
index 4bbf59a..f208d20 100644
--- a/pkg/analyzer_plugin/lib/plugin/completion_mixin.dart
+++ b/pkg/analyzer_plugin/lib/plugin/completion_mixin.dart
@@ -34,7 +34,7 @@
     var generator = CompletionGenerator(getCompletionContributors(path));
     var result = await generator.generateCompletionResponse(request);
     result.sendNotifications(channel);
-    return result.result;
+    return result.result!;
   }
 }
 
diff --git a/pkg/analyzer_plugin/lib/plugin/navigation_mixin.dart b/pkg/analyzer_plugin/lib/plugin/navigation_mixin.dart
index 07dbddb..de11deb 100644
--- a/pkg/analyzer_plugin/lib/plugin/navigation_mixin.dart
+++ b/pkg/analyzer_plugin/lib/plugin/navigation_mixin.dart
@@ -27,7 +27,7 @@
     var length = parameters.length;
     if (offset < 0 && length < 0) {
       offset = 0;
-      length = result.content.length;
+      length = result.content?.length ?? 0;
     }
     return DartNavigationRequestImpl(resourceProvider, offset, length, result);
   }
diff --git a/pkg/analyzer_plugin/lib/plugin/plugin.dart b/pkg/analyzer_plugin/lib/plugin/plugin.dart
index 9fb108f..0a5fa70 100644
--- a/pkg/analyzer_plugin/lib/plugin/plugin.dart
+++ b/pkg/analyzer_plugin/lib/plugin/plugin.dart
@@ -33,7 +33,7 @@
 
   /// The communication channel being used to communicate with the analysis
   /// server.
-  PluginCommunicationChannel _channel;
+  late PluginCommunicationChannel _channel;
 
   /// The resource provider used to access the file system.
   final OverlayResourceProvider resourceProvider;
@@ -45,7 +45,7 @@
   final SubscriptionManager subscriptionManager = SubscriptionManager();
 
   /// The scheduler used by any analysis drivers that are created.
-  AnalysisDriverScheduler analysisDriverScheduler;
+  late AnalysisDriverScheduler analysisDriverScheduler;
 
   /// A table mapping the current context roots to the analysis driver created
   /// for that root.
@@ -58,15 +58,15 @@
   /// The byte store used by any analysis drivers that are created, or `null` if
   /// the cache location isn't known because the 'plugin.version' request has not
   /// yet been received.
-  ByteStore _byteStore;
+  late ByteStore _byteStore;
 
   /// The SDK manager used to manage SDKs.
-  DartSdkManager _sdkManager;
+  late DartSdkManager _sdkManager;
 
   /// Initialize a newly created analysis server plugin. If a resource [provider]
   /// is given, then it will be used to access the file system. Otherwise a
   /// resource provider that accesses the physical file system will be used.
-  ServerPlugin(ResourceProvider provider)
+  ServerPlugin(ResourceProvider? provider)
       : resourceProvider = OverlayResourceProvider(
             provider ?? PhysicalResourceProvider.INSTANCE) {
     analysisDriverScheduler = AnalysisDriverScheduler(performanceLog);
@@ -84,7 +84,7 @@
 
   /// Return the user visible information about how to contact the plugin authors
   /// with any problems that are found, or `null` if there is no contact info.
-  String get contactInfo => null;
+  String? get contactInfo => null;
 
   /// Return a list of glob patterns selecting the files that this plugin is
   /// interested in analyzing.
@@ -106,7 +106,7 @@
   }
 
   /// Return the context root containing the file at the given [filePath].
-  ContextRoot contextRootContaining(String filePath) {
+  ContextRoot? contextRootContaining(String filePath) {
     var pathContext = resourceProvider.pathContext;
 
     /// Return `true` if the given [child] is either the same as or within the
@@ -142,7 +142,7 @@
   AnalysisDriverGeneric createAnalysisDriver(ContextRoot contextRoot);
 
   /// Return the driver being used to analyze the file with the given [path].
-  AnalysisDriverGeneric driverForPath(String path) {
+  AnalysisDriverGeneric? driverForPath(String path) {
     var contextRoot = contextRootContaining(path);
     if (contextRoot == null) {
       return null;
@@ -161,7 +161,7 @@
       throw RequestFailure(
           RequestErrorFactory.pluginError('Failed to analyze $path', null));
     }
-    var result = await (driver as AnalysisDriver).getResult(path);
+    var result = await driver.getResult(path);
     var state = result.state;
     if (state != ResultState.VALID) {
       // Return an error from the request.
@@ -228,7 +228,7 @@
       var driver = driverMap.remove(contextRoot);
       // The `dispose` method has the side-effect of removing the driver from
       // the analysis driver scheduler.
-      driver.dispose();
+      driver?.dispose();
     }
     return AnalysisSetContextRootsResult();
   }
@@ -244,7 +244,7 @@
       var contextRoot = contextRootContaining(file);
       if (contextRoot != null) {
         // TODO(brianwilkerson) Which driver should we use if there is no context root?
-        var driver = driverMap[contextRoot];
+        var driver = driverMap[contextRoot]!;
         filesByDriver.putIfAbsent(driver, () => <String>[]).add(file);
       }
     }
@@ -274,10 +274,10 @@
   /// Throw a [RequestFailure] if the request could not be handled.
   Future<AnalysisUpdateContentResult> handleAnalysisUpdateContent(
       AnalysisUpdateContentParams parameters) async {
-    Map<String, Object> files = parameters.files;
-    files.forEach((String filePath, Object overlay) {
+    var files = parameters.files;
+    files.forEach((String filePath, Object? overlay) {
       // Prepare the old overlay contents.
-      String oldContents;
+      String? oldContents;
       try {
         if (resourceProvider.hasOverlay(filePath)) {
           var file = resourceProvider.getFile(filePath);
@@ -286,7 +286,7 @@
       } catch (_) {}
 
       // Prepare the new contents.
-      String newContents;
+      String? newContents;
       if (overlay is AddContentOverlay) {
         newContents = overlay.content;
       } else if (overlay is ChangeContentOverlay) {
@@ -359,7 +359,7 @@
   /// Handle an 'edit.getRefactoring' request.
   ///
   /// Throw a [RequestFailure] if the request could not be handled.
-  Future<EditGetRefactoringResult> handleEditGetRefactoring(
+  Future<EditGetRefactoringResult?> handleEditGetRefactoring(
       EditGetRefactoringParams parameters) async {
     return null;
   }
@@ -367,7 +367,7 @@
   /// Handle a 'kythe.getKytheEntries' request.
   ///
   /// Throw a [RequestFailure] if the request could not be handled.
-  Future<KytheGetKytheEntriesResult> handleKytheGetKytheEntries(
+  Future<KytheGetKytheEntriesResult?> handleKytheGetKytheEntries(
       KytheGetKytheEntriesParams parameters) async {
     return null;
   }
@@ -503,8 +503,8 @@
 
   /// Compute the response that should be returned for the given [request], or
   /// `null` if the response has already been sent.
-  Future<Response> _getResponse(Request request, int requestTime) async {
-    ResponseResult result;
+  Future<Response?> _getResponse(Request request, int requestTime) async {
+    ResponseResult? result;
     switch (request.method) {
       case ANALYSIS_REQUEST_GET_NAVIGATION:
         var params = AnalysisGetNavigationParams.fromRequest(request);
@@ -577,7 +577,7 @@
   Future<void> _onRequest(Request request) async {
     var requestTime = DateTime.now().millisecondsSinceEpoch;
     var id = request.id;
-    Response response;
+    Response? response;
     try {
       response = await _getResponse(request, requestTime);
     } on RequestFailure catch (exception) {
diff --git a/pkg/analyzer_plugin/lib/protocol/protocol.dart b/pkg/analyzer_plugin/lib/protocol/protocol.dart
index e661567..25684ff 100644
--- a/pkg/analyzer_plugin/lib/protocol/protocol.dart
+++ b/pkg/analyzer_plugin/lib/protocol/protocol.dart
@@ -30,7 +30,7 @@
 
   /// A table mapping the names of notification parameters to their values, or
   /// `null` if there are no notification parameters.
-  final Map<String, Object> params;
+  final Map<String, Object>? params;
 
   /// Initialize a newly created [Notification] to have the given [event] name.
   /// If [params] is provided, it will be used as the params; otherwise no
@@ -48,6 +48,7 @@
   Map<String, Object> toJson() {
     var jsonObject = <String, Object>{};
     jsonObject[EVENT] = event;
+    var params = this.params;
     if (params != null) {
       jsonObject[PARAMS] = params;
     }
@@ -83,13 +84,13 @@
 
   /// The time (milliseconds since epoch) at which the server made the request,
   /// or `null` if this information is not provided by the server.
-  final int serverRequestTime;
+  final int? serverRequestTime;
 
   /// Initialize a newly created [Request] to have the given [id] and [method]
   /// name. If [params] is supplied, it is used as the "params" map for the
   /// request. Otherwise an empty "params" map is allocated.
   Request(this.id, this.method,
-      [Map<String, Object> params, this.serverRequestTime])
+      [Map<String, Object>? params, this.serverRequestTime])
       : params = params ?? <String, Object>{};
 
   /// Return a request parsed from the given json, or `null` if the [data] is
@@ -114,18 +115,17 @@
     var id = result[Request.ID];
     var method = result[Request.METHOD];
     if (id is! String || method is! String) {
-      return null;
+      throw StateError('Unexpected type for id or method');
     }
     var time = result[Request.SERVER_REQUEST_TIME];
     if (time != null && time is! int) {
-      return null;
+      throw StateError('Unexpected type for server request time');
     }
     var params = result[Request.PARAMS];
     if (params is Map || params == null) {
-      return Request(id as String, method as String,
-          params as Map<String, Object>, time as int);
+      return Request(id, method, params as Map<String, Object>?, time as int?);
     } else {
-      return null;
+      throw StateError('Unexpected type for params');
     }
   }
 
@@ -152,13 +152,14 @@
     if (params.isNotEmpty) {
       jsonObject[PARAMS] = params;
     }
+    var serverRequestTime = this.serverRequestTime;
     if (serverRequestTime != null) {
       jsonObject[SERVER_REQUEST_TIME] = serverRequestTime;
     }
     return jsonObject;
   }
 
-  bool _equalLists(List first, List second) {
+  bool _equalLists(List? first, List? second) {
     if (first == null) {
       return second == null;
     }
@@ -177,7 +178,7 @@
     return true;
   }
 
-  bool _equalMaps(Map first, Map second) {
+  bool _equalMaps(Map? first, Map? second) {
     if (first == null) {
       return second == null;
     }
@@ -198,7 +199,7 @@
     return true;
   }
 
-  bool _equalObjects(Object first, Object second) {
+  bool _equalObjects(Object? first, Object? second) {
     if (first == null) {
       return second == null;
     }
@@ -249,7 +250,7 @@
           "Invalid parameter '$path'. $expectation.");
 
   /// Return a request error representing an error that occurred in the plugin.
-  static RequestError pluginError(dynamic exception, String stackTrace) =>
+  static RequestError pluginError(dynamic exception, String? stackTrace) =>
       RequestError(RequestErrorCode.PLUGIN_ERROR, exception.toString(),
           stackTrace: stackTrace);
 
@@ -296,49 +297,45 @@
 
   /// The error that was caused by attempting to handle the request, or `null` if
   /// there was no error.
-  final RequestError error;
+  final RequestError? error;
 
   /// The time at which the request was handled by the plugin.
   final int requestTime;
 
   /// A table mapping the names of result fields to their values. Should be
   /// `null` if there is no result to send.
-  Map<String, Object> result;
+  Map<String, Object>? result;
 
   /// Initialize a newly created instance to represent a response to a request
   /// with the given [id]. If [_result] is provided, it will be used as the
   /// result; otherwise an empty result will be used. If an [error] is provided
   /// then the response will represent an error condition.
-  Response(this.id, this.requestTime, {this.error, Map<String, Object> result})
+  Response(this.id, this.requestTime, {this.error, Map<String, Object>? result})
       : result = result;
 
   /// Initialize a newly created instance based on the given JSON data.
   factory Response.fromJson(Map json) {
-    try {
-      Object id = json[ID];
-      if (id is! String) {
-        return null;
-      }
-      Object error = json[ERROR];
-      RequestError decodedError;
-      if (error is Map) {
-        decodedError =
-            RequestError.fromJson(ResponseDecoder(null), '.error', error);
-      }
-      Object requestTime = json[REQUEST_TIME];
-      if (requestTime is! int) {
-        return null;
-      }
-      Object result = json[RESULT];
-      Map<String, Object> decodedResult;
-      if (result is Map) {
-        decodedResult = result as Map<String, Object>;
-      }
-      return Response(id as String, requestTime as int,
-          error: decodedError, result: decodedResult);
-    } catch (exception) {
-      return null;
+    var id = json[ID];
+    if (id is! String) {
+      throw StateError('Unexpected type for id');
     }
+    var error = json[ERROR];
+    RequestError? decodedError;
+    if (error is Map) {
+      decodedError =
+          RequestError.fromJson(ResponseDecoder(null), '.error', error);
+    }
+    var requestTime = json[REQUEST_TIME];
+    if (requestTime is! int) {
+      throw StateError('Unexpected type for requestTime');
+    }
+    var result = json[RESULT];
+    Map<String, Object>? decodedResult;
+    if (result is Map) {
+      decodedResult = result as Map<String, Object>;
+    }
+    return Response(id, requestTime,
+        error: decodedError, result: decodedResult);
   }
 
   /// Return a table representing the structure of the Json object that will be
@@ -346,10 +343,12 @@
   Map<String, Object> toJson() {
     var jsonObject = <String, Object>{};
     jsonObject[ID] = id;
+    var error = this.error;
     if (error != null) {
       jsonObject[ERROR] = error.toJson();
     }
     jsonObject[REQUEST_TIME] = requestTime;
+    var result = this.result;
     if (result != null) {
       jsonObject[RESULT] = result;
     }
diff --git a/pkg/analyzer_plugin/lib/protocol/protocol_common.dart b/pkg/analyzer_plugin/lib/protocol/protocol_common.dart
index 78e0b32..b22d06a 100644
--- a/pkg/analyzer_plugin/lib/protocol/protocol_common.dart
+++ b/pkg/analyzer_plugin/lib/protocol/protocol_common.dart
@@ -21,14 +21,13 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class AddContentOverlay implements HasToJson {
-  String _content;
+  late String _content;
 
   /// The new content of the file.
   String get content => _content;
 
   /// The new content of the file.
   set content(String value) {
-    assert(value != null);
     _content = value;
   }
 
@@ -37,7 +36,7 @@
   }
 
   factory AddContentOverlay.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       if (json['type'] != 'add') {
@@ -57,8 +56,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['type'] = 'add';
     result['content'] = content;
     return result;
@@ -100,30 +99,29 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class AnalysisError implements HasToJson {
-  AnalysisErrorSeverity _severity;
+  late AnalysisErrorSeverity _severity;
 
-  AnalysisErrorType _type;
+  late AnalysisErrorType _type;
 
-  Location _location;
+  late Location _location;
 
-  String _message;
+  late String _message;
 
-  String _correction;
+  String? _correction;
 
-  String _code;
+  late String _code;
 
-  String _url;
+  String? _url;
 
-  List<DiagnosticMessage> _contextMessages;
+  List<DiagnosticMessage>? _contextMessages;
 
-  bool _hasFix;
+  bool? _hasFix;
 
   /// The severity of the error.
   AnalysisErrorSeverity get severity => _severity;
 
   /// The severity of the error.
   set severity(AnalysisErrorSeverity value) {
-    assert(value != null);
     _severity = value;
   }
 
@@ -132,7 +130,6 @@
 
   /// The type of the error.
   set type(AnalysisErrorType value) {
-    assert(value != null);
     _type = value;
   }
 
@@ -141,7 +138,6 @@
 
   /// The location associated with the error.
   set location(Location value) {
-    assert(value != null);
     _location = value;
   }
 
@@ -152,19 +148,18 @@
   /// The message to be displayed for this error. The message should indicate
   /// what is wrong with the code and why it is wrong.
   set message(String value) {
-    assert(value != null);
     _message = value;
   }
 
   /// The correction message to be displayed for this error. The correction
   /// message should indicate how the user can fix the error. The field is
   /// omitted if there is no correction message associated with the error code.
-  String get correction => _correction;
+  String? get correction => _correction;
 
   /// The correction message to be displayed for this error. The correction
   /// message should indicate how the user can fix the error. The field is
   /// omitted if there is no correction message associated with the error code.
-  set correction(String value) {
+  set correction(String? value) {
     _correction = value;
   }
 
@@ -173,25 +168,24 @@
 
   /// The name, as a string, of the error code associated with this error.
   set code(String value) {
-    assert(value != null);
     _code = value;
   }
 
   /// The URL of a page containing documentation associated with this error.
-  String get url => _url;
+  String? get url => _url;
 
   /// The URL of a page containing documentation associated with this error.
-  set url(String value) {
+  set url(String? value) {
     _url = value;
   }
 
   /// Additional messages associated with this diagnostic that provide context
   /// to help the user understand the diagnostic.
-  List<DiagnosticMessage> get contextMessages => _contextMessages;
+  List<DiagnosticMessage>? get contextMessages => _contextMessages;
 
   /// Additional messages associated with this diagnostic that provide context
   /// to help the user understand the diagnostic.
-  set contextMessages(List<DiagnosticMessage> value) {
+  set contextMessages(List<DiagnosticMessage>? value) {
     _contextMessages = value;
   }
 
@@ -204,7 +198,7 @@
   /// negatives, no false positives should be returned. If a client sees this
   /// flag set they can proceed with the confidence that there are in fact
   /// associated fixes.
-  bool get hasFix => _hasFix;
+  bool? get hasFix => _hasFix;
 
   /// A hint to indicate to interested clients that this error has an
   /// associated fix (or fixes). The absence of this field implies there are
@@ -215,16 +209,16 @@
   /// negatives, no false positives should be returned. If a client sees this
   /// flag set they can proceed with the confidence that there are in fact
   /// associated fixes.
-  set hasFix(bool value) {
+  set hasFix(bool? value) {
     _hasFix = value;
   }
 
   AnalysisError(AnalysisErrorSeverity severity, AnalysisErrorType type,
       Location location, String message, String code,
-      {String correction,
-      String url,
-      List<DiagnosticMessage> contextMessages,
-      bool hasFix}) {
+      {String? correction,
+      String? url,
+      List<DiagnosticMessage>? contextMessages,
+      bool? hasFix}) {
     this.severity = severity;
     this.type = type;
     this.location = location;
@@ -237,7 +231,7 @@
   }
 
   factory AnalysisError.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       AnalysisErrorSeverity severity;
@@ -268,7 +262,7 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'message');
       }
-      String correction;
+      String? correction;
       if (json.containsKey('correction')) {
         correction = jsonDecoder.decodeString(
             jsonPath + '.correction', json['correction']);
@@ -279,19 +273,19 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'code');
       }
-      String url;
+      String? url;
       if (json.containsKey('url')) {
         url = jsonDecoder.decodeString(jsonPath + '.url', json['url']);
       }
-      List<DiagnosticMessage> contextMessages;
+      List<DiagnosticMessage>? contextMessages;
       if (json.containsKey('contextMessages')) {
         contextMessages = jsonDecoder.decodeList(
             jsonPath + '.contextMessages',
             json['contextMessages'],
-            (String jsonPath, Object json) =>
+            (String jsonPath, Object? json) =>
                 DiagnosticMessage.fromJson(jsonDecoder, jsonPath, json));
       }
-      bool hasFix;
+      bool? hasFix;
       if (json.containsKey('hasFix')) {
         hasFix = jsonDecoder.decodeBool(jsonPath + '.hasFix', json['hasFix']);
       }
@@ -306,24 +300,28 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['severity'] = severity.toJson();
     result['type'] = type.toJson();
     result['location'] = location.toJson();
     result['message'] = message;
+    var correction = this.correction;
     if (correction != null) {
       result['correction'] = correction;
     }
     result['code'] = code;
+    var url = this.url;
     if (url != null) {
       result['url'] = url;
     }
+    var contextMessages = this.contextMessages;
     if (contextMessages != null) {
       result['contextMessages'] = contextMessages
           .map((DiagnosticMessage value) => value.toJson())
           .toList();
     }
+    var hasFix = this.hasFix;
     if (hasFix != null) {
       result['hasFix'] = hasFix;
     }
@@ -408,7 +406,7 @@
   }
 
   factory AnalysisErrorSeverity.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     if (json is String) {
       try {
         return AnalysisErrorSeverity(json);
@@ -501,7 +499,7 @@
   }
 
   factory AnalysisErrorType.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     if (json is String) {
       try {
         return AnalysisErrorType(json);
@@ -527,14 +525,13 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class ChangeContentOverlay implements HasToJson {
-  List<SourceEdit> _edits;
+  late List<SourceEdit> _edits;
 
   /// The edits to be applied to the file.
   List<SourceEdit> get edits => _edits;
 
   /// The edits to be applied to the file.
   set edits(List<SourceEdit> value) {
-    assert(value != null);
     _edits = value;
   }
 
@@ -543,7 +540,7 @@
   }
 
   factory ChangeContentOverlay.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       if (json['type'] != 'change') {
@@ -554,7 +551,7 @@
         edits = jsonDecoder.decodeList(
             jsonPath + '.edits',
             json['edits'],
-            (String jsonPath, Object json) =>
+            (String jsonPath, Object? json) =>
                 SourceEdit.fromJson(jsonDecoder, jsonPath, json));
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'edits');
@@ -566,8 +563,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['type'] = 'change';
     result['edits'] = edits.map((SourceEdit value) => value.toJson()).toList();
     return result;
@@ -624,58 +621,57 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class CompletionSuggestion implements HasToJson {
-  CompletionSuggestionKind _kind;
+  late CompletionSuggestionKind _kind;
 
-  int _relevance;
+  late int _relevance;
 
-  String _completion;
+  late String _completion;
 
-  String _displayText;
+  String? _displayText;
 
-  int _replacementOffset;
+  int? _replacementOffset;
 
-  int _replacementLength;
+  int? _replacementLength;
 
-  int _selectionOffset;
+  late int _selectionOffset;
 
-  int _selectionLength;
+  late int _selectionLength;
 
-  bool _isDeprecated;
+  late bool _isDeprecated;
 
-  bool _isPotential;
+  late bool _isPotential;
 
-  String _docSummary;
+  String? _docSummary;
 
-  String _docComplete;
+  String? _docComplete;
 
-  String _declaringType;
+  String? _declaringType;
 
-  String _defaultArgumentListString;
+  String? _defaultArgumentListString;
 
-  List<int> _defaultArgumentListTextRanges;
+  List<int>? _defaultArgumentListTextRanges;
 
-  Element _element;
+  Element? _element;
 
-  String _returnType;
+  String? _returnType;
 
-  List<String> _parameterNames;
+  List<String>? _parameterNames;
 
-  List<String> _parameterTypes;
+  List<String>? _parameterTypes;
 
-  int _requiredParameterCount;
+  int? _requiredParameterCount;
 
-  bool _hasNamedParameters;
+  bool? _hasNamedParameters;
 
-  String _parameterName;
+  String? _parameterName;
 
-  String _parameterType;
+  String? _parameterType;
 
   /// The kind of element being suggested.
   CompletionSuggestionKind get kind => _kind;
 
   /// The kind of element being suggested.
   set kind(CompletionSuggestionKind value) {
-    assert(value != null);
     _kind = value;
   }
 
@@ -686,7 +682,6 @@
   /// The relevance of this completion suggestion where a higher number
   /// indicates a higher relevance.
   set relevance(int value) {
-    assert(value != null);
     _relevance = value;
   }
 
@@ -701,19 +696,18 @@
   /// additionally insert a template for the parameters. The information
   /// required in order to do so is contained in other fields.
   set completion(String value) {
-    assert(value != null);
     _completion = value;
   }
 
   /// Text to be displayed in, for example, a completion pop-up. This field is
   /// only defined if the displayed text should be different than the
   /// completion. Otherwise it is omitted.
-  String get displayText => _displayText;
+  String? get displayText => _displayText;
 
   /// Text to be displayed in, for example, a completion pop-up. This field is
   /// only defined if the displayed text should be different than the
   /// completion. Otherwise it is omitted.
-  set displayText(String value) {
+  set displayText(String? value) {
     _displayText = value;
   }
 
@@ -722,14 +716,14 @@
   /// completion results. This value may be provided independently of
   /// replacementLength (for example if only one differs from the completion
   /// result value).
-  int get replacementOffset => _replacementOffset;
+  int? get replacementOffset => _replacementOffset;
 
   /// The offset of the start of the text to be replaced. If supplied, this
   /// should be used in preference to the offset provided on the containing
   /// completion results. This value may be provided independently of
   /// replacementLength (for example if only one differs from the completion
   /// result value).
-  set replacementOffset(int value) {
+  set replacementOffset(int? value) {
     _replacementOffset = value;
   }
 
@@ -737,13 +731,13 @@
   /// in preference to the offset provided on the containing completion
   /// results. This value may be provided independently of replacementOffset
   /// (for example if only one differs from the completion result value).
-  int get replacementLength => _replacementLength;
+  int? get replacementLength => _replacementLength;
 
   /// The length of the text to be replaced. If supplied, this should be used
   /// in preference to the offset provided on the containing completion
   /// results. This value may be provided independently of replacementOffset
   /// (for example if only one differs from the completion result value).
-  set replacementLength(int value) {
+  set replacementLength(int? value) {
     _replacementLength = value;
   }
 
@@ -754,7 +748,6 @@
   /// The offset, relative to the beginning of the completion, of where the
   /// selection should be placed after insertion.
   set selectionOffset(int value) {
-    assert(value != null);
     _selectionOffset = value;
   }
 
@@ -763,7 +756,6 @@
 
   /// The number of characters that should be selected after insertion.
   set selectionLength(int value) {
-    assert(value != null);
     _selectionLength = value;
   }
 
@@ -772,7 +764,6 @@
 
   /// True if the suggested element is deprecated.
   set isDeprecated(bool value) {
-    assert(value != null);
     _isDeprecated = value;
   }
 
@@ -783,49 +774,48 @@
   /// True if the element is not known to be valid for the target. This happens
   /// if the type of the target is dynamic.
   set isPotential(bool value) {
-    assert(value != null);
     _isPotential = value;
   }
 
   /// An abbreviated version of the Dartdoc associated with the element being
   /// suggested. This field is omitted if there is no Dartdoc associated with
   /// the element.
-  String get docSummary => _docSummary;
+  String? get docSummary => _docSummary;
 
   /// An abbreviated version of the Dartdoc associated with the element being
   /// suggested. This field is omitted if there is no Dartdoc associated with
   /// the element.
-  set docSummary(String value) {
+  set docSummary(String? value) {
     _docSummary = value;
   }
 
   /// The Dartdoc associated with the element being suggested. This field is
   /// omitted if there is no Dartdoc associated with the element.
-  String get docComplete => _docComplete;
+  String? get docComplete => _docComplete;
 
   /// The Dartdoc associated with the element being suggested. This field is
   /// omitted if there is no Dartdoc associated with the element.
-  set docComplete(String value) {
+  set docComplete(String? value) {
     _docComplete = value;
   }
 
   /// The class that declares the element being suggested. This field is
   /// omitted if the suggested element is not a member of a class.
-  String get declaringType => _declaringType;
+  String? get declaringType => _declaringType;
 
   /// The class that declares the element being suggested. This field is
   /// omitted if the suggested element is not a member of a class.
-  set declaringType(String value) {
+  set declaringType(String? value) {
     _declaringType = value;
   }
 
   /// A default String for use in generating argument list source contents on
   /// the client side.
-  String get defaultArgumentListString => _defaultArgumentListString;
+  String? get defaultArgumentListString => _defaultArgumentListString;
 
   /// A default String for use in generating argument list source contents on
   /// the client side.
-  set defaultArgumentListString(String value) {
+  set defaultArgumentListString(String? value) {
     _defaultArgumentListString = value;
   }
 
@@ -835,7 +825,8 @@
   /// y', the corresponding text range [0, 1, 3, 1], indicates two text ranges
   /// of length 1, starting at offsets 0 and 3. Clients can use these ranges to
   /// treat the 'x' and 'y' values specially for linked edits.
-  List<int> get defaultArgumentListTextRanges => _defaultArgumentListTextRanges;
+  List<int>? get defaultArgumentListTextRanges =>
+      _defaultArgumentListTextRanges;
 
   /// Pairs of offsets and lengths describing 'defaultArgumentListString' text
   /// ranges suitable for use by clients to set up linked edits of default
@@ -843,91 +834,91 @@
   /// y', the corresponding text range [0, 1, 3, 1], indicates two text ranges
   /// of length 1, starting at offsets 0 and 3. Clients can use these ranges to
   /// treat the 'x' and 'y' values specially for linked edits.
-  set defaultArgumentListTextRanges(List<int> value) {
+  set defaultArgumentListTextRanges(List<int>? value) {
     _defaultArgumentListTextRanges = value;
   }
 
   /// Information about the element reference being suggested.
-  Element get element => _element;
+  Element? get element => _element;
 
   /// Information about the element reference being suggested.
-  set element(Element value) {
+  set element(Element? value) {
     _element = value;
   }
 
   /// The return type of the getter, function or method or the type of the
   /// field being suggested. This field is omitted if the suggested element is
   /// not a getter, function or method.
-  String get returnType => _returnType;
+  String? get returnType => _returnType;
 
   /// The return type of the getter, function or method or the type of the
   /// field being suggested. This field is omitted if the suggested element is
   /// not a getter, function or method.
-  set returnType(String value) {
+  set returnType(String? value) {
     _returnType = value;
   }
 
   /// The names of the parameters of the function or method being suggested.
   /// This field is omitted if the suggested element is not a setter, function
   /// or method.
-  List<String> get parameterNames => _parameterNames;
+  List<String>? get parameterNames => _parameterNames;
 
   /// The names of the parameters of the function or method being suggested.
   /// This field is omitted if the suggested element is not a setter, function
   /// or method.
-  set parameterNames(List<String> value) {
+  set parameterNames(List<String>? value) {
     _parameterNames = value;
   }
 
   /// The types of the parameters of the function or method being suggested.
   /// This field is omitted if the parameterNames field is omitted.
-  List<String> get parameterTypes => _parameterTypes;
+  List<String>? get parameterTypes => _parameterTypes;
 
   /// The types of the parameters of the function or method being suggested.
   /// This field is omitted if the parameterNames field is omitted.
-  set parameterTypes(List<String> value) {
+  set parameterTypes(List<String>? value) {
     _parameterTypes = value;
   }
 
   /// The number of required parameters for the function or method being
   /// suggested. This field is omitted if the parameterNames field is omitted.
-  int get requiredParameterCount => _requiredParameterCount;
+  int? get requiredParameterCount => _requiredParameterCount;
 
   /// The number of required parameters for the function or method being
   /// suggested. This field is omitted if the parameterNames field is omitted.
-  set requiredParameterCount(int value) {
+  set requiredParameterCount(int? value) {
     _requiredParameterCount = value;
   }
 
   /// True if the function or method being suggested has at least one named
   /// parameter. This field is omitted if the parameterNames field is omitted.
-  bool get hasNamedParameters => _hasNamedParameters;
+  bool? get hasNamedParameters => _hasNamedParameters;
 
   /// True if the function or method being suggested has at least one named
   /// parameter. This field is omitted if the parameterNames field is omitted.
-  set hasNamedParameters(bool value) {
+  set hasNamedParameters(bool? value) {
     _hasNamedParameters = value;
   }
 
   /// The name of the optional parameter being suggested. This field is omitted
   /// if the suggestion is not the addition of an optional argument within an
   /// argument list.
-  String get parameterName => _parameterName;
+  String? get parameterName => _parameterName;
 
   /// The name of the optional parameter being suggested. This field is omitted
   /// if the suggestion is not the addition of an optional argument within an
   /// argument list.
-  set parameterName(String value) {
+  set parameterName(String? value) {
     _parameterName = value;
   }
 
   /// The type of the options parameter being suggested. This field is omitted
   /// if the parameterName field is omitted.
-  String get parameterType => _parameterType;
+  String? get parameterType => _parameterType;
 
   /// The type of the options parameter being suggested. This field is omitted
   /// if the parameterName field is omitted.
-  set parameterType(String value) {
+  set parameterType(String? value) {
     _parameterType = value;
   }
 
@@ -939,22 +930,22 @@
       int selectionLength,
       bool isDeprecated,
       bool isPotential,
-      {String displayText,
-      int replacementOffset,
-      int replacementLength,
-      String docSummary,
-      String docComplete,
-      String declaringType,
-      String defaultArgumentListString,
-      List<int> defaultArgumentListTextRanges,
-      Element element,
-      String returnType,
-      List<String> parameterNames,
-      List<String> parameterTypes,
-      int requiredParameterCount,
-      bool hasNamedParameters,
-      String parameterName,
-      String parameterType}) {
+      {String? displayText,
+      int? replacementOffset,
+      int? replacementLength,
+      String? docSummary,
+      String? docComplete,
+      String? declaringType,
+      String? defaultArgumentListString,
+      List<int>? defaultArgumentListTextRanges,
+      Element? element,
+      String? returnType,
+      List<String>? parameterNames,
+      List<String>? parameterTypes,
+      int? requiredParameterCount,
+      bool? hasNamedParameters,
+      String? parameterName,
+      String? parameterType}) {
     this.kind = kind;
     this.relevance = relevance;
     this.completion = completion;
@@ -981,7 +972,7 @@
   }
 
   factory CompletionSuggestion.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       CompletionSuggestionKind kind;
@@ -1005,17 +996,17 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'completion');
       }
-      String displayText;
+      String? displayText;
       if (json.containsKey('displayText')) {
         displayText = jsonDecoder.decodeString(
             jsonPath + '.displayText', json['displayText']);
       }
-      int replacementOffset;
+      int? replacementOffset;
       if (json.containsKey('replacementOffset')) {
         replacementOffset = jsonDecoder.decodeInt(
             jsonPath + '.replacementOffset', json['replacementOffset']);
       }
-      int replacementLength;
+      int? replacementLength;
       if (json.containsKey('replacementLength')) {
         replacementLength = jsonDecoder.decodeInt(
             jsonPath + '.replacementLength', json['replacementLength']);
@@ -1048,71 +1039,71 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'isPotential');
       }
-      String docSummary;
+      String? docSummary;
       if (json.containsKey('docSummary')) {
         docSummary = jsonDecoder.decodeString(
             jsonPath + '.docSummary', json['docSummary']);
       }
-      String docComplete;
+      String? docComplete;
       if (json.containsKey('docComplete')) {
         docComplete = jsonDecoder.decodeString(
             jsonPath + '.docComplete', json['docComplete']);
       }
-      String declaringType;
+      String? declaringType;
       if (json.containsKey('declaringType')) {
         declaringType = jsonDecoder.decodeString(
             jsonPath + '.declaringType', json['declaringType']);
       }
-      String defaultArgumentListString;
+      String? defaultArgumentListString;
       if (json.containsKey('defaultArgumentListString')) {
         defaultArgumentListString = jsonDecoder.decodeString(
             jsonPath + '.defaultArgumentListString',
             json['defaultArgumentListString']);
       }
-      List<int> defaultArgumentListTextRanges;
+      List<int>? defaultArgumentListTextRanges;
       if (json.containsKey('defaultArgumentListTextRanges')) {
         defaultArgumentListTextRanges = jsonDecoder.decodeList(
             jsonPath + '.defaultArgumentListTextRanges',
             json['defaultArgumentListTextRanges'],
             jsonDecoder.decodeInt);
       }
-      Element element;
+      Element? element;
       if (json.containsKey('element')) {
         element = Element.fromJson(
             jsonDecoder, jsonPath + '.element', json['element']);
       }
-      String returnType;
+      String? returnType;
       if (json.containsKey('returnType')) {
         returnType = jsonDecoder.decodeString(
             jsonPath + '.returnType', json['returnType']);
       }
-      List<String> parameterNames;
+      List<String>? parameterNames;
       if (json.containsKey('parameterNames')) {
         parameterNames = jsonDecoder.decodeList(jsonPath + '.parameterNames',
             json['parameterNames'], jsonDecoder.decodeString);
       }
-      List<String> parameterTypes;
+      List<String>? parameterTypes;
       if (json.containsKey('parameterTypes')) {
         parameterTypes = jsonDecoder.decodeList(jsonPath + '.parameterTypes',
             json['parameterTypes'], jsonDecoder.decodeString);
       }
-      int requiredParameterCount;
+      int? requiredParameterCount;
       if (json.containsKey('requiredParameterCount')) {
         requiredParameterCount = jsonDecoder.decodeInt(
             jsonPath + '.requiredParameterCount',
             json['requiredParameterCount']);
       }
-      bool hasNamedParameters;
+      bool? hasNamedParameters;
       if (json.containsKey('hasNamedParameters')) {
         hasNamedParameters = jsonDecoder.decodeBool(
             jsonPath + '.hasNamedParameters', json['hasNamedParameters']);
       }
-      String parameterName;
+      String? parameterName;
       if (json.containsKey('parameterName')) {
         parameterName = jsonDecoder.decodeString(
             jsonPath + '.parameterName', json['parameterName']);
       }
-      String parameterType;
+      String? parameterType;
       if (json.containsKey('parameterType')) {
         parameterType = jsonDecoder.decodeString(
             jsonPath + '.parameterType', json['parameterType']);
@@ -1141,17 +1132,20 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['kind'] = kind.toJson();
     result['relevance'] = relevance;
     result['completion'] = completion;
+    var displayText = this.displayText;
     if (displayText != null) {
       result['displayText'] = displayText;
     }
+    var replacementOffset = this.replacementOffset;
     if (replacementOffset != null) {
       result['replacementOffset'] = replacementOffset;
     }
+    var replacementLength = this.replacementLength;
     if (replacementLength != null) {
       result['replacementLength'] = replacementLength;
     }
@@ -1159,42 +1153,55 @@
     result['selectionLength'] = selectionLength;
     result['isDeprecated'] = isDeprecated;
     result['isPotential'] = isPotential;
+    var docSummary = this.docSummary;
     if (docSummary != null) {
       result['docSummary'] = docSummary;
     }
+    var docComplete = this.docComplete;
     if (docComplete != null) {
       result['docComplete'] = docComplete;
     }
+    var declaringType = this.declaringType;
     if (declaringType != null) {
       result['declaringType'] = declaringType;
     }
+    var defaultArgumentListString = this.defaultArgumentListString;
     if (defaultArgumentListString != null) {
       result['defaultArgumentListString'] = defaultArgumentListString;
     }
+    var defaultArgumentListTextRanges = this.defaultArgumentListTextRanges;
     if (defaultArgumentListTextRanges != null) {
       result['defaultArgumentListTextRanges'] = defaultArgumentListTextRanges;
     }
+    var element = this.element;
     if (element != null) {
       result['element'] = element.toJson();
     }
+    var returnType = this.returnType;
     if (returnType != null) {
       result['returnType'] = returnType;
     }
+    var parameterNames = this.parameterNames;
     if (parameterNames != null) {
       result['parameterNames'] = parameterNames;
     }
+    var parameterTypes = this.parameterTypes;
     if (parameterTypes != null) {
       result['parameterTypes'] = parameterTypes;
     }
+    var requiredParameterCount = this.requiredParameterCount;
     if (requiredParameterCount != null) {
       result['requiredParameterCount'] = requiredParameterCount;
     }
+    var hasNamedParameters = this.hasNamedParameters;
     if (hasNamedParameters != null) {
       result['hasNamedParameters'] = hasNamedParameters;
     }
+    var parameterName = this.parameterName;
     if (parameterName != null) {
       result['parameterName'] = parameterName;
     }
+    var parameterType = this.parameterType;
     if (parameterType != null) {
       result['parameterType'] = parameterType;
     }
@@ -1380,7 +1387,7 @@
   }
 
   factory CompletionSuggestionKind.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     if (json is String) {
       try {
         return CompletionSuggestionKind(json);
@@ -1406,16 +1413,15 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class DiagnosticMessage implements HasToJson {
-  String _message;
+  late String _message;
 
-  Location _location;
+  late Location _location;
 
   /// The message to be displayed to the user.
   String get message => _message;
 
   /// The message to be displayed to the user.
   set message(String value) {
-    assert(value != null);
     _message = value;
   }
 
@@ -1426,7 +1432,6 @@
   /// The location associated with or referenced by the message. Clients should
   /// provide the ability to navigate to the location.
   set location(Location value) {
-    assert(value != null);
     _location = value;
   }
 
@@ -1436,7 +1441,7 @@
   }
 
   factory DiagnosticMessage.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       String message;
@@ -1460,8 +1465,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['message'] = message;
     result['location'] = location.toJson();
     return result;
@@ -1526,28 +1531,27 @@
     return flags;
   }
 
-  ElementKind _kind;
+  late ElementKind _kind;
 
-  String _name;
+  late String _name;
 
-  Location _location;
+  Location? _location;
 
-  int _flags;
+  late int _flags;
 
-  String _parameters;
+  String? _parameters;
 
-  String _returnType;
+  String? _returnType;
 
-  String _typeParameters;
+  String? _typeParameters;
 
-  String _aliasedType;
+  String? _aliasedType;
 
   /// The kind of the element.
   ElementKind get kind => _kind;
 
   /// The kind of the element.
   set kind(ElementKind value) {
-    assert(value != null);
     _kind = value;
   }
 
@@ -1558,15 +1562,14 @@
   /// The name of the element. This is typically used as the label in the
   /// outline.
   set name(String value) {
-    assert(value != null);
     _name = value;
   }
 
   /// The location of the name in the declaration of the element.
-  Location get location => _location;
+  Location? get location => _location;
 
   /// The location of the name in the declaration of the element.
-  set location(Location value) {
+  set location(Location? value) {
     _location = value;
   }
 
@@ -1591,7 +1594,6 @@
   /// - 0x10 - set if the element is private
   /// - 0x20 - set if the element is deprecated
   set flags(int value) {
-    assert(value != null);
     _flags = value;
   }
 
@@ -1599,54 +1601,54 @@
   /// function this field will not be defined. If the element doesn't have
   /// parameters (e.g. getter), this field will not be defined. If the element
   /// has zero parameters, this field will have a value of "()".
-  String get parameters => _parameters;
+  String? get parameters => _parameters;
 
   /// The parameter list for the element. If the element is not a method or
   /// function this field will not be defined. If the element doesn't have
   /// parameters (e.g. getter), this field will not be defined. If the element
   /// has zero parameters, this field will have a value of "()".
-  set parameters(String value) {
+  set parameters(String? value) {
     _parameters = value;
   }
 
   /// The return type of the element. If the element is not a method or
   /// function this field will not be defined. If the element does not have a
   /// declared return type, this field will contain an empty string.
-  String get returnType => _returnType;
+  String? get returnType => _returnType;
 
   /// The return type of the element. If the element is not a method or
   /// function this field will not be defined. If the element does not have a
   /// declared return type, this field will contain an empty string.
-  set returnType(String value) {
+  set returnType(String? value) {
     _returnType = value;
   }
 
   /// The type parameter list for the element. If the element doesn't have type
   /// parameters, this field will not be defined.
-  String get typeParameters => _typeParameters;
+  String? get typeParameters => _typeParameters;
 
   /// The type parameter list for the element. If the element doesn't have type
   /// parameters, this field will not be defined.
-  set typeParameters(String value) {
+  set typeParameters(String? value) {
     _typeParameters = value;
   }
 
   /// If the element is a type alias, this field is the aliased type. Otherwise
   /// this field will not be defined.
-  String get aliasedType => _aliasedType;
+  String? get aliasedType => _aliasedType;
 
   /// If the element is a type alias, this field is the aliased type. Otherwise
   /// this field will not be defined.
-  set aliasedType(String value) {
+  set aliasedType(String? value) {
     _aliasedType = value;
   }
 
   Element(ElementKind kind, String name, int flags,
-      {Location location,
-      String parameters,
-      String returnType,
-      String typeParameters,
-      String aliasedType}) {
+      {Location? location,
+      String? parameters,
+      String? returnType,
+      String? typeParameters,
+      String? aliasedType}) {
     this.kind = kind;
     this.name = name;
     this.location = location;
@@ -1658,7 +1660,7 @@
   }
 
   factory Element.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       ElementKind kind;
@@ -1674,7 +1676,7 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'name');
       }
-      Location location;
+      Location? location;
       if (json.containsKey('location')) {
         location = Location.fromJson(
             jsonDecoder, jsonPath + '.location', json['location']);
@@ -1685,22 +1687,22 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'flags');
       }
-      String parameters;
+      String? parameters;
       if (json.containsKey('parameters')) {
         parameters = jsonDecoder.decodeString(
             jsonPath + '.parameters', json['parameters']);
       }
-      String returnType;
+      String? returnType;
       if (json.containsKey('returnType')) {
         returnType = jsonDecoder.decodeString(
             jsonPath + '.returnType', json['returnType']);
       }
-      String typeParameters;
+      String? typeParameters;
       if (json.containsKey('typeParameters')) {
         typeParameters = jsonDecoder.decodeString(
             jsonPath + '.typeParameters', json['typeParameters']);
       }
-      String aliasedType;
+      String? aliasedType;
       if (json.containsKey('aliasedType')) {
         aliasedType = jsonDecoder.decodeString(
             jsonPath + '.aliasedType', json['aliasedType']);
@@ -1724,23 +1726,28 @@
   bool get isDeprecated => (flags & FLAG_DEPRECATED) != 0;
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['kind'] = kind.toJson();
     result['name'] = name;
+    var location = this.location;
     if (location != null) {
       result['location'] = location.toJson();
     }
     result['flags'] = flags;
+    var parameters = this.parameters;
     if (parameters != null) {
       result['parameters'] = parameters;
     }
+    var returnType = this.returnType;
     if (returnType != null) {
       result['returnType'] = returnType;
     }
+    var typeParameters = this.typeParameters;
     if (typeParameters != null) {
       result['typeParameters'] = typeParameters;
     }
+    var aliasedType = this.aliasedType;
     if (aliasedType != null) {
       result['aliasedType'] = aliasedType;
     }
@@ -1975,7 +1982,7 @@
   }
 
   factory ElementKind.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     if (json is String) {
       try {
         return ElementKind(json);
@@ -2076,7 +2083,7 @@
   }
 
   factory FoldingKind.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     if (json is String) {
       try {
         return FoldingKind(json);
@@ -2103,18 +2110,17 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class FoldingRegion implements HasToJson {
-  FoldingKind _kind;
+  late FoldingKind _kind;
 
-  int _offset;
+  late int _offset;
 
-  int _length;
+  late int _length;
 
   /// The kind of the region.
   FoldingKind get kind => _kind;
 
   /// The kind of the region.
   set kind(FoldingKind value) {
-    assert(value != null);
     _kind = value;
   }
 
@@ -2123,7 +2129,6 @@
 
   /// The offset of the region to be folded.
   set offset(int value) {
-    assert(value != null);
     _offset = value;
   }
 
@@ -2132,7 +2137,6 @@
 
   /// The length of the region to be folded.
   set length(int value) {
-    assert(value != null);
     _length = value;
   }
 
@@ -2143,7 +2147,7 @@
   }
 
   factory FoldingRegion.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       FoldingKind kind;
@@ -2172,8 +2176,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['kind'] = kind.toJson();
     result['offset'] = offset;
     result['length'] = length;
@@ -2213,18 +2217,17 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class HighlightRegion implements HasToJson {
-  HighlightRegionType _type;
+  late HighlightRegionType _type;
 
-  int _offset;
+  late int _offset;
 
-  int _length;
+  late int _length;
 
   /// The type of highlight associated with the region.
   HighlightRegionType get type => _type;
 
   /// The type of highlight associated with the region.
   set type(HighlightRegionType value) {
-    assert(value != null);
     _type = value;
   }
 
@@ -2233,7 +2236,6 @@
 
   /// The offset of the region to be highlighted.
   set offset(int value) {
-    assert(value != null);
     _offset = value;
   }
 
@@ -2242,7 +2244,6 @@
 
   /// The length of the region to be highlighted.
   set length(int value) {
-    assert(value != null);
     _length = value;
   }
 
@@ -2253,7 +2254,7 @@
   }
 
   factory HighlightRegion.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       HighlightRegionType type;
@@ -2282,8 +2283,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['type'] = type.toJson();
     result['offset'] = offset;
     result['length'] = length;
@@ -2860,7 +2861,7 @@
   }
 
   factory HighlightRegionType.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     if (json is String) {
       try {
         return HighlightRegionType(json);
@@ -2889,38 +2890,37 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class KytheEntry implements HasToJson {
-  KytheVName _source;
+  late KytheVName _source;
 
-  String _kind;
+  String? _kind;
 
-  KytheVName _target;
+  KytheVName? _target;
 
-  String _fact;
+  late String _fact;
 
-  List<int> _value;
+  List<int>? _value;
 
   /// The ticket of the source node.
   KytheVName get source => _source;
 
   /// The ticket of the source node.
   set source(KytheVName value) {
-    assert(value != null);
     _source = value;
   }
 
   /// An edge label. The schema defines which labels are meaningful.
-  String get kind => _kind;
+  String? get kind => _kind;
 
   /// An edge label. The schema defines which labels are meaningful.
-  set kind(String value) {
+  set kind(String? value) {
     _kind = value;
   }
 
   /// The ticket of the target node.
-  KytheVName get target => _target;
+  KytheVName? get target => _target;
 
   /// The ticket of the target node.
-  set target(KytheVName value) {
+  set target(KytheVName? value) {
     _target = value;
   }
 
@@ -2929,20 +2929,19 @@
 
   /// A fact label. The schema defines which fact labels are meaningful.
   set fact(String value) {
-    assert(value != null);
     _fact = value;
   }
 
   /// The String value of the fact.
-  List<int> get value => _value;
+  List<int>? get value => _value;
 
   /// The String value of the fact.
-  set value(List<int> value) {
+  set value(List<int>? value) {
     _value = value;
   }
 
   KytheEntry(KytheVName source, String fact,
-      {String kind, KytheVName target, List<int> value}) {
+      {String? kind, KytheVName? target, List<int>? value}) {
     this.source = source;
     this.kind = kind;
     this.target = target;
@@ -2951,7 +2950,7 @@
   }
 
   factory KytheEntry.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       KytheVName source;
@@ -2961,11 +2960,11 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'source');
       }
-      String kind;
+      String? kind;
       if (json.containsKey('kind')) {
         kind = jsonDecoder.decodeString(jsonPath + '.kind', json['kind']);
       }
-      KytheVName target;
+      KytheVName? target;
       if (json.containsKey('target')) {
         target = KytheVName.fromJson(
             jsonDecoder, jsonPath + '.target', json['target']);
@@ -2976,7 +2975,7 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'fact');
       }
-      List<int> value;
+      List<int>? value;
       if (json.containsKey('value')) {
         value = jsonDecoder.decodeList(
             jsonPath + '.value', json['value'], jsonDecoder.decodeInt);
@@ -2988,16 +2987,19 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['source'] = source.toJson();
+    var kind = this.kind;
     if (kind != null) {
       result['kind'] = kind;
     }
+    var target = this.target;
     if (target != null) {
       result['target'] = target.toJson();
     }
     result['fact'] = fact;
+    var value = this.value;
     if (value != null) {
       result['value'] = value;
     }
@@ -3043,22 +3045,21 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class KytheVName implements HasToJson {
-  String _signature;
+  late String _signature;
 
-  String _corpus;
+  late String _corpus;
 
-  String _root;
+  late String _root;
 
-  String _path;
+  late String _path;
 
-  String _language;
+  late String _language;
 
   /// An opaque signature generated by the analyzer.
   String get signature => _signature;
 
   /// An opaque signature generated by the analyzer.
   set signature(String value) {
-    assert(value != null);
     _signature = value;
   }
 
@@ -3071,7 +3072,6 @@
   /// is a collection of related files, such as the contents of a given source
   /// repository.
   set corpus(String value) {
-    assert(value != null);
     _corpus = value;
   }
 
@@ -3084,7 +3084,6 @@
   /// identifier, denoting a distinct subset of the corpus. This may also be
   /// used to designate virtual collections like generated files.
   set root(String value) {
-    assert(value != null);
     _root = value;
   }
 
@@ -3095,7 +3094,6 @@
   /// A path-structured label describing the “location” of the named object
   /// relative to the corpus and the root.
   set path(String value) {
-    assert(value != null);
     _path = value;
   }
 
@@ -3104,7 +3102,6 @@
 
   /// The language this name belongs to.
   set language(String value) {
-    assert(value != null);
     _language = value;
   }
 
@@ -3118,7 +3115,7 @@
   }
 
   factory KytheVName.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       String signature;
@@ -3160,8 +3157,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['signature'] = signature;
     result['corpus'] = corpus;
     result['root'] = root;
@@ -3207,18 +3204,17 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class LinkedEditGroup implements HasToJson {
-  List<Position> _positions;
+  late List<Position> _positions;
 
-  int _length;
+  late int _length;
 
-  List<LinkedEditSuggestion> _suggestions;
+  late List<LinkedEditSuggestion> _suggestions;
 
   /// The positions of the regions that should be edited simultaneously.
   List<Position> get positions => _positions;
 
   /// The positions of the regions that should be edited simultaneously.
   set positions(List<Position> value) {
-    assert(value != null);
     _positions = value;
   }
 
@@ -3227,7 +3223,6 @@
 
   /// The length of the regions that should be edited simultaneously.
   set length(int value) {
-    assert(value != null);
     _length = value;
   }
 
@@ -3238,7 +3233,6 @@
   /// Pre-computed suggestions for what every region might want to be changed
   /// to.
   set suggestions(List<LinkedEditSuggestion> value) {
-    assert(value != null);
     _suggestions = value;
   }
 
@@ -3250,7 +3244,7 @@
   }
 
   factory LinkedEditGroup.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       List<Position> positions;
@@ -3258,7 +3252,7 @@
         positions = jsonDecoder.decodeList(
             jsonPath + '.positions',
             json['positions'],
-            (String jsonPath, Object json) =>
+            (String jsonPath, Object? json) =>
                 Position.fromJson(jsonDecoder, jsonPath, json));
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'positions');
@@ -3274,7 +3268,7 @@
         suggestions = jsonDecoder.decodeList(
             jsonPath + '.suggestions',
             json['suggestions'],
-            (String jsonPath, Object json) =>
+            (String jsonPath, Object? json) =>
                 LinkedEditSuggestion.fromJson(jsonDecoder, jsonPath, json));
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'suggestions');
@@ -3289,8 +3283,8 @@
   LinkedEditGroup.empty() : this(<Position>[], 0, <LinkedEditSuggestion>[]);
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['positions'] =
         positions.map((Position value) => value.toJson()).toList();
     result['length'] = length;
@@ -3345,16 +3339,15 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class LinkedEditSuggestion implements HasToJson {
-  String _value;
+  late String _value;
 
-  LinkedEditSuggestionKind _kind;
+  late LinkedEditSuggestionKind _kind;
 
   /// The value that could be used to replace all of the linked edit regions.
   String get value => _value;
 
   /// The value that could be used to replace all of the linked edit regions.
   set value(String value) {
-    assert(value != null);
     _value = value;
   }
 
@@ -3363,7 +3356,6 @@
 
   /// The kind of value being proposed.
   set kind(LinkedEditSuggestionKind value) {
-    assert(value != null);
     _kind = value;
   }
 
@@ -3373,7 +3365,7 @@
   }
 
   factory LinkedEditSuggestion.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       String value;
@@ -3396,8 +3388,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['value'] = value;
     result['kind'] = kind.toJson();
     return result;
@@ -3470,7 +3462,7 @@
   }
 
   factory LinkedEditSuggestionKind.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     if (json is String) {
       try {
         return LinkedEditSuggestionKind(json);
@@ -3501,26 +3493,25 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class Location implements HasToJson {
-  String _file;
+  late String _file;
 
-  int _offset;
+  late int _offset;
 
-  int _length;
+  late int _length;
 
-  int _startLine;
+  late int _startLine;
 
-  int _startColumn;
+  late int _startColumn;
 
-  int _endLine;
+  late int _endLine;
 
-  int _endColumn;
+  late int _endColumn;
 
   /// The file containing the range.
   String get file => _file;
 
   /// The file containing the range.
   set file(String value) {
-    assert(value != null);
     _file = value;
   }
 
@@ -3529,7 +3520,6 @@
 
   /// The offset of the range.
   set offset(int value) {
-    assert(value != null);
     _offset = value;
   }
 
@@ -3538,7 +3528,6 @@
 
   /// The length of the range.
   set length(int value) {
-    assert(value != null);
     _length = value;
   }
 
@@ -3549,7 +3538,6 @@
   /// The one-based index of the line containing the first character of the
   /// range.
   set startLine(int value) {
-    assert(value != null);
     _startLine = value;
   }
 
@@ -3560,7 +3548,6 @@
   /// The one-based index of the column containing the first character of the
   /// range.
   set startColumn(int value) {
-    assert(value != null);
     _startColumn = value;
   }
 
@@ -3571,7 +3558,6 @@
   /// The one-based index of the line containing the character immediately
   /// following the range.
   set endLine(int value) {
-    assert(value != null);
     _endLine = value;
   }
 
@@ -3582,7 +3568,6 @@
   /// The one-based index of the column containing the character immediately
   /// following the range.
   set endColumn(int value) {
-    assert(value != null);
     _endColumn = value;
   }
 
@@ -3598,7 +3583,7 @@
   }
 
   factory Location.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       String file;
@@ -3654,8 +3639,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['file'] = file;
     result['offset'] = offset;
     result['length'] = length;
@@ -3707,18 +3692,17 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class NavigationRegion implements HasToJson {
-  int _offset;
+  late int _offset;
 
-  int _length;
+  late int _length;
 
-  List<int> _targets;
+  late List<int> _targets;
 
   /// The offset of the region from which the user can navigate.
   int get offset => _offset;
 
   /// The offset of the region from which the user can navigate.
   set offset(int value) {
-    assert(value != null);
     _offset = value;
   }
 
@@ -3727,7 +3711,6 @@
 
   /// The length of the region from which the user can navigate.
   set length(int value) {
-    assert(value != null);
     _length = value;
   }
 
@@ -3740,7 +3723,6 @@
   /// which the given region is bound. By opening the target, clients can
   /// implement one form of navigation. This list cannot be empty.
   set targets(List<int> value) {
-    assert(value != null);
     _targets = value;
   }
 
@@ -3751,7 +3733,7 @@
   }
 
   factory NavigationRegion.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       int offset;
@@ -3780,8 +3762,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['offset'] = offset;
     result['length'] = length;
     result['targets'] = targets;
@@ -3826,28 +3808,27 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class NavigationTarget implements HasToJson {
-  ElementKind _kind;
+  late ElementKind _kind;
 
-  int _fileIndex;
+  late int _fileIndex;
 
-  int _offset;
+  late int _offset;
 
-  int _length;
+  late int _length;
 
-  int _startLine;
+  late int _startLine;
 
-  int _startColumn;
+  late int _startColumn;
 
-  int _codeOffset;
+  int? _codeOffset;
 
-  int _codeLength;
+  int? _codeLength;
 
   /// The kind of the element.
   ElementKind get kind => _kind;
 
   /// The kind of the element.
   set kind(ElementKind value) {
-    assert(value != null);
     _kind = value;
   }
 
@@ -3858,7 +3839,6 @@
   /// The index of the file (in the enclosing navigation response) to navigate
   /// to.
   set fileIndex(int value) {
-    assert(value != null);
     _fileIndex = value;
   }
 
@@ -3867,7 +3847,6 @@
 
   /// The offset of the name of the target to which the user can navigate.
   set offset(int value) {
-    assert(value != null);
     _offset = value;
   }
 
@@ -3876,7 +3855,6 @@
 
   /// The length of the name of the target to which the user can navigate.
   set length(int value) {
-    assert(value != null);
     _length = value;
   }
 
@@ -3887,7 +3865,6 @@
   /// The one-based index of the line containing the first character of the
   /// name of the target.
   set startLine(int value) {
-    assert(value != null);
     _startLine = value;
   }
 
@@ -3898,29 +3875,28 @@
   /// The one-based index of the column containing the first character of the
   /// name of the target.
   set startColumn(int value) {
-    assert(value != null);
     _startColumn = value;
   }
 
   /// The offset of the target code to which the user can navigate.
-  int get codeOffset => _codeOffset;
+  int? get codeOffset => _codeOffset;
 
   /// The offset of the target code to which the user can navigate.
-  set codeOffset(int value) {
+  set codeOffset(int? value) {
     _codeOffset = value;
   }
 
   /// The length of the target code to which the user can navigate.
-  int get codeLength => _codeLength;
+  int? get codeLength => _codeLength;
 
   /// The length of the target code to which the user can navigate.
-  set codeLength(int value) {
+  set codeLength(int? value) {
     _codeLength = value;
   }
 
   NavigationTarget(ElementKind kind, int fileIndex, int offset, int length,
       int startLine, int startColumn,
-      {int codeOffset, int codeLength}) {
+      {int? codeOffset, int? codeLength}) {
     this.kind = kind;
     this.fileIndex = fileIndex;
     this.offset = offset;
@@ -3932,7 +3908,7 @@
   }
 
   factory NavigationTarget.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       ElementKind kind;
@@ -3975,12 +3951,12 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'startColumn');
       }
-      int codeOffset;
+      int? codeOffset;
       if (json.containsKey('codeOffset')) {
         codeOffset =
             jsonDecoder.decodeInt(jsonPath + '.codeOffset', json['codeOffset']);
       }
-      int codeLength;
+      int? codeLength;
       if (json.containsKey('codeLength')) {
         codeLength =
             jsonDecoder.decodeInt(jsonPath + '.codeLength', json['codeLength']);
@@ -3994,17 +3970,19 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['kind'] = kind.toJson();
     result['fileIndex'] = fileIndex;
     result['offset'] = offset;
     result['length'] = length;
     result['startLine'] = startLine;
     result['startColumn'] = startColumn;
+    var codeOffset = this.codeOffset;
     if (codeOffset != null) {
       result['codeOffset'] = codeOffset;
     }
+    var codeLength = this.codeLength;
     if (codeLength != null) {
       result['codeLength'] = codeLength;
     }
@@ -4054,18 +4032,17 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class Occurrences implements HasToJson {
-  Element _element;
+  late Element _element;
 
-  List<int> _offsets;
+  late List<int> _offsets;
 
-  int _length;
+  late int _length;
 
   /// The element that was referenced.
   Element get element => _element;
 
   /// The element that was referenced.
   set element(Element value) {
-    assert(value != null);
     _element = value;
   }
 
@@ -4074,7 +4051,6 @@
 
   /// The offsets of the name of the referenced element within the file.
   set offsets(List<int> value) {
-    assert(value != null);
     _offsets = value;
   }
 
@@ -4083,7 +4059,6 @@
 
   /// The length of the name of the referenced element.
   set length(int value) {
-    assert(value != null);
     _length = value;
   }
 
@@ -4094,7 +4069,7 @@
   }
 
   factory Occurrences.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       Element element;
@@ -4124,8 +4099,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['element'] = element.toJson();
     result['offsets'] = offsets;
     result['length'] = length;
@@ -4168,24 +4143,23 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class Outline implements HasToJson {
-  Element _element;
+  late Element _element;
 
-  int _offset;
+  late int _offset;
 
-  int _length;
+  late int _length;
 
-  int _codeOffset;
+  late int _codeOffset;
 
-  int _codeLength;
+  late int _codeLength;
 
-  List<Outline> _children;
+  List<Outline>? _children;
 
   /// A description of the element represented by this node.
   Element get element => _element;
 
   /// A description of the element represented by this node.
   set element(Element value) {
-    assert(value != null);
     _element = value;
   }
 
@@ -4200,7 +4174,6 @@
   /// element. It can be used, for example, to map locations in the file back
   /// to an outline.
   set offset(int value) {
-    assert(value != null);
     _offset = value;
   }
 
@@ -4209,7 +4182,6 @@
 
   /// The length of the element.
   set length(int value) {
-    assert(value != null);
     _length = value;
   }
 
@@ -4220,7 +4192,6 @@
   /// The offset of the first character of the element code, which is neither
   /// documentation, nor annotation.
   set codeOffset(int value) {
-    assert(value != null);
     _codeOffset = value;
   }
 
@@ -4229,23 +4200,22 @@
 
   /// The length of the element code.
   set codeLength(int value) {
-    assert(value != null);
     _codeLength = value;
   }
 
   /// The children of the node. The field will be omitted if the node has no
   /// children. Children are sorted by offset.
-  List<Outline> get children => _children;
+  List<Outline>? get children => _children;
 
   /// The children of the node. The field will be omitted if the node has no
   /// children. Children are sorted by offset.
-  set children(List<Outline> value) {
+  set children(List<Outline>? value) {
     _children = value;
   }
 
   Outline(
       Element element, int offset, int length, int codeOffset, int codeLength,
-      {List<Outline> children}) {
+      {List<Outline>? children}) {
     this.element = element;
     this.offset = offset;
     this.length = length;
@@ -4255,7 +4225,7 @@
   }
 
   factory Outline.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       Element element;
@@ -4291,12 +4261,12 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'codeLength');
       }
-      List<Outline> children;
+      List<Outline>? children;
       if (json.containsKey('children')) {
         children = jsonDecoder.decodeList(
             jsonPath + '.children',
             json['children'],
-            (String jsonPath, Object json) =>
+            (String jsonPath, Object? json) =>
                 Outline.fromJson(jsonDecoder, jsonPath, json));
       }
       return Outline(element, offset, length, codeOffset, codeLength,
@@ -4307,13 +4277,14 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['element'] = element.toJson();
     result['offset'] = offset;
     result['length'] = length;
     result['codeOffset'] = codeOffset;
     result['codeLength'] = codeLength;
+    var children = this.children;
     if (children != null) {
       result['children'] =
           children.map((Outline value) => value.toJson()).toList();
@@ -4361,20 +4332,19 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class ParameterInfo implements HasToJson {
-  ParameterKind _kind;
+  late ParameterKind _kind;
 
-  String _name;
+  late String _name;
 
-  String _type;
+  late String _type;
 
-  String _defaultValue;
+  String? _defaultValue;
 
   /// The kind of the parameter.
   ParameterKind get kind => _kind;
 
   /// The kind of the parameter.
   set kind(ParameterKind value) {
-    assert(value != null);
     _kind = value;
   }
 
@@ -4383,7 +4353,6 @@
 
   /// The name of the parameter.
   set name(String value) {
-    assert(value != null);
     _name = value;
   }
 
@@ -4392,22 +4361,21 @@
 
   /// The type of the parameter.
   set type(String value) {
-    assert(value != null);
     _type = value;
   }
 
   /// The default value for this parameter. This value will be omitted if the
   /// parameter does not have a default value.
-  String get defaultValue => _defaultValue;
+  String? get defaultValue => _defaultValue;
 
   /// The default value for this parameter. This value will be omitted if the
   /// parameter does not have a default value.
-  set defaultValue(String value) {
+  set defaultValue(String? value) {
     _defaultValue = value;
   }
 
   ParameterInfo(ParameterKind kind, String name, String type,
-      {String defaultValue}) {
+      {String? defaultValue}) {
     this.kind = kind;
     this.name = name;
     this.type = type;
@@ -4415,7 +4383,7 @@
   }
 
   factory ParameterInfo.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       ParameterKind kind;
@@ -4437,7 +4405,7 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'type');
       }
-      String defaultValue;
+      String? defaultValue;
       if (json.containsKey('defaultValue')) {
         defaultValue = jsonDecoder.decodeString(
             jsonPath + '.defaultValue', json['defaultValue']);
@@ -4449,11 +4417,12 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['kind'] = kind.toJson();
     result['name'] = name;
     result['type'] = type;
+    var defaultValue = this.defaultValue;
     if (defaultValue != null) {
       result['defaultValue'] = defaultValue;
     }
@@ -4538,7 +4507,7 @@
   }
 
   factory ParameterKind.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     if (json is String) {
       try {
         return ParameterKind(json);
@@ -4564,16 +4533,15 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class Position implements HasToJson {
-  String _file;
+  late String _file;
 
-  int _offset;
+  late int _offset;
 
   /// The file containing the position.
   String get file => _file;
 
   /// The file containing the position.
   set file(String value) {
-    assert(value != null);
     _file = value;
   }
 
@@ -4582,7 +4550,6 @@
 
   /// The offset of the position.
   set offset(int value) {
-    assert(value != null);
     _offset = value;
   }
 
@@ -4592,7 +4559,7 @@
   }
 
   factory Position.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       String file;
@@ -4614,8 +4581,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['file'] = file;
     result['offset'] = offset;
     return result;
@@ -4725,7 +4692,7 @@
   }
 
   factory RefactoringKind.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     if (json is String) {
       try {
         return RefactoringKind(json);
@@ -4754,23 +4721,23 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class RefactoringMethodParameter implements HasToJson {
-  String _id;
+  String? _id;
 
-  RefactoringMethodParameterKind _kind;
+  late RefactoringMethodParameterKind _kind;
 
-  String _type;
+  late String _type;
 
-  String _name;
+  late String _name;
 
-  String _parameters;
+  String? _parameters;
 
   /// The unique identifier of the parameter. Clients may omit this field for
   /// the parameters they want to add.
-  String get id => _id;
+  String? get id => _id;
 
   /// The unique identifier of the parameter. Clients may omit this field for
   /// the parameters they want to add.
-  set id(String value) {
+  set id(String? value) {
     _id = value;
   }
 
@@ -4779,7 +4746,6 @@
 
   /// The kind of the parameter.
   set kind(RefactoringMethodParameterKind value) {
-    assert(value != null);
     _kind = value;
   }
 
@@ -4790,7 +4756,6 @@
   /// The type that should be given to the parameter, or the return type of the
   /// parameter's function type.
   set type(String value) {
-    assert(value != null);
     _type = value;
   }
 
@@ -4799,25 +4764,24 @@
 
   /// The name that should be given to the parameter.
   set name(String value) {
-    assert(value != null);
     _name = value;
   }
 
   /// The parameter list of the parameter's function type. If the parameter is
   /// not of a function type, this field will not be defined. If the function
   /// type has zero parameters, this field will have a value of '()'.
-  String get parameters => _parameters;
+  String? get parameters => _parameters;
 
   /// The parameter list of the parameter's function type. If the parameter is
   /// not of a function type, this field will not be defined. If the function
   /// type has zero parameters, this field will have a value of '()'.
-  set parameters(String value) {
+  set parameters(String? value) {
     _parameters = value;
   }
 
   RefactoringMethodParameter(
       RefactoringMethodParameterKind kind, String type, String name,
-      {String id, String parameters}) {
+      {String? id, String? parameters}) {
     this.id = id;
     this.kind = kind;
     this.type = type;
@@ -4826,10 +4790,10 @@
   }
 
   factory RefactoringMethodParameter.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
-      String id;
+      String? id;
       if (json.containsKey('id')) {
         id = jsonDecoder.decodeString(jsonPath + '.id', json['id']);
       }
@@ -4852,7 +4816,7 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'name');
       }
-      String parameters;
+      String? parameters;
       if (json.containsKey('parameters')) {
         parameters = jsonDecoder.decodeString(
             jsonPath + '.parameters', json['parameters']);
@@ -4865,14 +4829,16 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
+    var id = this.id;
     if (id != null) {
       result['id'] = id;
     }
     result['kind'] = kind.toJson();
     result['type'] = type;
     result['name'] = name;
+    var parameters = this.parameters;
     if (parameters != null) {
       result['parameters'] = parameters;
     }
@@ -4947,7 +4913,7 @@
   }
 
   factory RefactoringMethodParameterKind.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     if (json is String) {
       try {
         return RefactoringMethodParameterKind(json);
@@ -4975,18 +4941,17 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class RefactoringProblem implements HasToJson {
-  RefactoringProblemSeverity _severity;
+  late RefactoringProblemSeverity _severity;
 
-  String _message;
+  late String _message;
 
-  Location _location;
+  Location? _location;
 
   /// The severity of the problem being represented.
   RefactoringProblemSeverity get severity => _severity;
 
   /// The severity of the problem being represented.
   set severity(RefactoringProblemSeverity value) {
-    assert(value != null);
     _severity = value;
   }
 
@@ -4995,31 +4960,30 @@
 
   /// A human-readable description of the problem being represented.
   set message(String value) {
-    assert(value != null);
     _message = value;
   }
 
   /// The location of the problem being represented. This field is omitted
   /// unless there is a specific location associated with the problem (such as
   /// a location where an element being renamed will be shadowed).
-  Location get location => _location;
+  Location? get location => _location;
 
   /// The location of the problem being represented. This field is omitted
   /// unless there is a specific location associated with the problem (such as
   /// a location where an element being renamed will be shadowed).
-  set location(Location value) {
+  set location(Location? value) {
     _location = value;
   }
 
   RefactoringProblem(RefactoringProblemSeverity severity, String message,
-      {Location location}) {
+      {Location? location}) {
     this.severity = severity;
     this.message = message;
     this.location = location;
   }
 
   factory RefactoringProblem.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       RefactoringProblemSeverity severity;
@@ -5036,7 +5000,7 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'message');
       }
-      Location location;
+      Location? location;
       if (json.containsKey('location')) {
         location = Location.fromJson(
             jsonDecoder, jsonPath + '.location', json['location']);
@@ -5048,10 +5012,11 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['severity'] = severity.toJson();
     result['message'] = message;
+    var location = this.location;
     if (location != null) {
       result['location'] = location.toJson();
     }
@@ -5145,7 +5110,7 @@
   }
 
   factory RefactoringProblemSeverity.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     if (json is String) {
       try {
         return RefactoringProblemSeverity(json);
@@ -5157,8 +5122,8 @@
   }
 
   /// Returns the [RefactoringProblemSeverity] with the maximal severity.
-  static RefactoringProblemSeverity max(
-          RefactoringProblemSeverity a, RefactoringProblemSeverity b) =>
+  static RefactoringProblemSeverity? max(
+          RefactoringProblemSeverity? a, RefactoringProblemSeverity? b) =>
       maxRefactoringProblemSeverity(a, b);
 
   @override
@@ -5178,7 +5143,7 @@
   RemoveContentOverlay();
 
   factory RemoveContentOverlay.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       if (json['type'] != 'remove') {
@@ -5191,8 +5156,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['type'] = 'remove';
     return result;
   }
@@ -5228,22 +5193,21 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class SourceChange implements HasToJson {
-  String _message;
+  late String _message;
 
-  List<SourceFileEdit> _edits;
+  late List<SourceFileEdit> _edits;
 
-  List<LinkedEditGroup> _linkedEditGroups;
+  late List<LinkedEditGroup> _linkedEditGroups;
 
-  Position _selection;
+  Position? _selection;
 
-  String _id;
+  String? _id;
 
   /// A human-readable description of the change to be applied.
   String get message => _message;
 
   /// A human-readable description of the change to be applied.
   set message(String value) {
-    assert(value != null);
     _message = value;
   }
 
@@ -5252,7 +5216,6 @@
 
   /// A list of the edits used to effect the change, grouped by file.
   set edits(List<SourceFileEdit> value) {
-    assert(value != null);
     _edits = value;
   }
 
@@ -5263,33 +5226,32 @@
   /// A list of the linked editing groups used to customize the changes that
   /// were made.
   set linkedEditGroups(List<LinkedEditGroup> value) {
-    assert(value != null);
     _linkedEditGroups = value;
   }
 
   /// The position that should be selected after the edits have been applied.
-  Position get selection => _selection;
+  Position? get selection => _selection;
 
   /// The position that should be selected after the edits have been applied.
-  set selection(Position value) {
+  set selection(Position? value) {
     _selection = value;
   }
 
   /// The optional identifier of the change kind. The identifier remains stable
   /// even if the message changes, or is parameterized.
-  String get id => _id;
+  String? get id => _id;
 
   /// The optional identifier of the change kind. The identifier remains stable
   /// even if the message changes, or is parameterized.
-  set id(String value) {
+  set id(String? value) {
     _id = value;
   }
 
   SourceChange(String message,
-      {List<SourceFileEdit> edits,
-      List<LinkedEditGroup> linkedEditGroups,
-      Position selection,
-      String id}) {
+      {List<SourceFileEdit>? edits,
+      List<LinkedEditGroup>? linkedEditGroups,
+      Position? selection,
+      String? id}) {
     this.message = message;
     if (edits == null) {
       this.edits = <SourceFileEdit>[];
@@ -5306,7 +5268,7 @@
   }
 
   factory SourceChange.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       String message;
@@ -5321,7 +5283,7 @@
         edits = jsonDecoder.decodeList(
             jsonPath + '.edits',
             json['edits'],
-            (String jsonPath, Object json) =>
+            (String jsonPath, Object? json) =>
                 SourceFileEdit.fromJson(jsonDecoder, jsonPath, json));
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'edits');
@@ -5331,17 +5293,17 @@
         linkedEditGroups = jsonDecoder.decodeList(
             jsonPath + '.linkedEditGroups',
             json['linkedEditGroups'],
-            (String jsonPath, Object json) =>
+            (String jsonPath, Object? json) =>
                 LinkedEditGroup.fromJson(jsonDecoder, jsonPath, json));
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'linkedEditGroups');
       }
-      Position selection;
+      Position? selection;
       if (json.containsKey('selection')) {
         selection = Position.fromJson(
             jsonDecoder, jsonPath + '.selection', json['selection']);
       }
-      String id;
+      String? id;
       if (json.containsKey('id')) {
         id = jsonDecoder.decodeString(jsonPath + '.id', json['id']);
       }
@@ -5356,17 +5318,19 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['message'] = message;
     result['edits'] =
         edits.map((SourceFileEdit value) => value.toJson()).toList();
     result['linkedEditGroups'] = linkedEditGroups
         .map((LinkedEditGroup value) => value.toJson())
         .toList();
+    var selection = this.selection;
     if (selection != null) {
       result['selection'] = selection.toJson();
     }
+    var id = this.id;
     if (id != null) {
       result['id'] = id;
     }
@@ -5388,7 +5352,7 @@
   }
 
   /// Returns the [FileEdit] for the given [file], maybe `null`.
-  SourceFileEdit getFileEdit(String file) => getChangeFileEdit(this, file);
+  SourceFileEdit? getFileEdit(String file) => getChangeFileEdit(this, file);
 
   @override
   String toString() => json.encode(toJson());
@@ -5435,20 +5399,19 @@
   static String applySequence(String code, Iterable<SourceEdit> edits) =>
       applySequenceOfEdits(code, edits);
 
-  int _offset;
+  late int _offset;
 
-  int _length;
+  late int _length;
 
-  String _replacement;
+  late String _replacement;
 
-  String _id;
+  String? _id;
 
   /// The offset of the region to be modified.
   int get offset => _offset;
 
   /// The offset of the region to be modified.
   set offset(int value) {
-    assert(value != null);
     _offset = value;
   }
 
@@ -5457,7 +5420,6 @@
 
   /// The length of the region to be modified.
   set length(int value) {
-    assert(value != null);
     _length = value;
   }
 
@@ -5466,7 +5428,6 @@
 
   /// The code that is to replace the specified region in the original code.
   set replacement(String value) {
-    assert(value != null);
     _replacement = value;
   }
 
@@ -5478,7 +5439,7 @@
   /// be appropriate (referred to as potential edits). Such edits will have an
   /// id so that they can be referenced. Edits in the same response that do not
   /// need to be referenced will not have an id.
-  String get id => _id;
+  String? get id => _id;
 
   /// An identifier that uniquely identifies this source edit from other edits
   /// in the same response. This field is omitted unless a containing structure
@@ -5488,11 +5449,11 @@
   /// be appropriate (referred to as potential edits). Such edits will have an
   /// id so that they can be referenced. Edits in the same response that do not
   /// need to be referenced will not have an id.
-  set id(String value) {
+  set id(String? value) {
     _id = value;
   }
 
-  SourceEdit(int offset, int length, String replacement, {String id}) {
+  SourceEdit(int offset, int length, String replacement, {String? id}) {
     this.offset = offset;
     this.length = length;
     this.replacement = replacement;
@@ -5500,7 +5461,7 @@
   }
 
   factory SourceEdit.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       int offset;
@@ -5522,7 +5483,7 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'replacement');
       }
-      String id;
+      String? id;
       if (json.containsKey('id')) {
         id = jsonDecoder.decodeString(jsonPath + '.id', json['id']);
       }
@@ -5536,11 +5497,12 @@
   int get end => offset + length;
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['offset'] = offset;
     result['length'] = length;
     result['replacement'] = replacement;
+    var id = this.id;
     if (id != null) {
       result['id'] = id;
     }
@@ -5585,18 +5547,17 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class SourceFileEdit implements HasToJson {
-  String _file;
+  late String _file;
 
-  int _fileStamp;
+  late int _fileStamp;
 
-  List<SourceEdit> _edits;
+  late List<SourceEdit> _edits;
 
   /// The file containing the code to be modified.
   String get file => _file;
 
   /// The file containing the code to be modified.
   set file(String value) {
-    assert(value != null);
     _file = value;
   }
 
@@ -5613,7 +5574,6 @@
   /// make sure that the file was not changed since then, so it is safe to
   /// apply the change.
   set fileStamp(int value) {
-    assert(value != null);
     _fileStamp = value;
   }
 
@@ -5622,11 +5582,10 @@
 
   /// A list of the edits used to effect the change.
   set edits(List<SourceEdit> value) {
-    assert(value != null);
     _edits = value;
   }
 
-  SourceFileEdit(String file, int fileStamp, {List<SourceEdit> edits}) {
+  SourceFileEdit(String file, int fileStamp, {List<SourceEdit>? edits}) {
     this.file = file;
     this.fileStamp = fileStamp;
     if (edits == null) {
@@ -5637,7 +5596,7 @@
   }
 
   factory SourceFileEdit.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       String file;
@@ -5658,7 +5617,7 @@
         edits = jsonDecoder.decodeList(
             jsonPath + '.edits',
             json['edits'],
-            (String jsonPath, Object json) =>
+            (String jsonPath, Object? json) =>
                 SourceEdit.fromJson(jsonDecoder, jsonPath, json));
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'edits');
@@ -5670,8 +5629,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['file'] = file;
     result['fileStamp'] = fileStamp;
     result['edits'] = edits.map((SourceEdit value) => value.toJson()).toList();
diff --git a/pkg/analyzer_plugin/lib/protocol/protocol_generated.dart b/pkg/analyzer_plugin/lib/protocol/protocol_generated.dart
index 22b7fc2..8573286 100644
--- a/pkg/analyzer_plugin/lib/protocol/protocol_generated.dart
+++ b/pkg/analyzer_plugin/lib/protocol/protocol_generated.dart
@@ -22,16 +22,15 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class AnalysisErrorFixes implements HasToJson {
-  AnalysisError _error;
+  late AnalysisError _error;
 
-  List<PrioritizedSourceChange> _fixes;
+  late List<PrioritizedSourceChange> _fixes;
 
   /// The error with which the fixes are associated.
   AnalysisError get error => _error;
 
   /// The error with which the fixes are associated.
   set error(AnalysisError value) {
-    assert(value != null);
     _error = value;
   }
 
@@ -40,12 +39,11 @@
 
   /// The fixes associated with the error.
   set fixes(List<PrioritizedSourceChange> value) {
-    assert(value != null);
     _fixes = value;
   }
 
   AnalysisErrorFixes(AnalysisError error,
-      {List<PrioritizedSourceChange> fixes}) {
+      {List<PrioritizedSourceChange>? fixes}) {
     this.error = error;
     if (fixes == null) {
       this.fixes = <PrioritizedSourceChange>[];
@@ -55,7 +53,7 @@
   }
 
   factory AnalysisErrorFixes.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       AnalysisError error;
@@ -70,7 +68,7 @@
         fixes = jsonDecoder.decodeList(
             jsonPath + '.fixes',
             json['fixes'],
-            (String jsonPath, Object json) =>
+            (String jsonPath, Object? json) =>
                 PrioritizedSourceChange.fromJson(jsonDecoder, jsonPath, json));
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'fixes');
@@ -82,8 +80,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['error'] = error.toJson();
     result['fixes'] =
         fixes.map((PrioritizedSourceChange value) => value.toJson()).toList();
@@ -121,16 +119,15 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class AnalysisErrorsParams implements HasToJson {
-  String _file;
+  late String _file;
 
-  List<AnalysisError> _errors;
+  late List<AnalysisError> _errors;
 
   /// The file containing the errors.
   String get file => _file;
 
   /// The file containing the errors.
   set file(String value) {
-    assert(value != null);
     _file = value;
   }
 
@@ -139,7 +136,6 @@
 
   /// The errors contained in the file.
   set errors(List<AnalysisError> value) {
-    assert(value != null);
     _errors = value;
   }
 
@@ -149,7 +145,7 @@
   }
 
   factory AnalysisErrorsParams.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       String file;
@@ -163,7 +159,7 @@
         errors = jsonDecoder.decodeList(
             jsonPath + '.errors',
             json['errors'],
-            (String jsonPath, Object json) =>
+            (String jsonPath, Object? json) =>
                 AnalysisError.fromJson(jsonDecoder, jsonPath, json));
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'errors');
@@ -180,8 +176,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['file'] = file;
     result['errors'] =
         errors.map((AnalysisError value) => value.toJson()).toList();
@@ -223,16 +219,15 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class AnalysisFoldingParams implements HasToJson {
-  String _file;
+  late String _file;
 
-  List<FoldingRegion> _regions;
+  late List<FoldingRegion> _regions;
 
   /// The file containing the folding regions.
   String get file => _file;
 
   /// The file containing the folding regions.
   set file(String value) {
-    assert(value != null);
     _file = value;
   }
 
@@ -241,7 +236,6 @@
 
   /// The folding regions contained in the file.
   set regions(List<FoldingRegion> value) {
-    assert(value != null);
     _regions = value;
   }
 
@@ -251,7 +245,7 @@
   }
 
   factory AnalysisFoldingParams.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       String file;
@@ -265,7 +259,7 @@
         regions = jsonDecoder.decodeList(
             jsonPath + '.regions',
             json['regions'],
-            (String jsonPath, Object json) =>
+            (String jsonPath, Object? json) =>
                 FoldingRegion.fromJson(jsonDecoder, jsonPath, json));
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'regions');
@@ -282,8 +276,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['file'] = file;
     result['regions'] =
         regions.map((FoldingRegion value) => value.toJson()).toList();
@@ -326,18 +320,17 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class AnalysisGetNavigationParams implements RequestParams {
-  String _file;
+  late String _file;
 
-  int _offset;
+  late int _offset;
 
-  int _length;
+  late int _length;
 
   /// The file in which navigation information is being requested.
   String get file => _file;
 
   /// The file in which navigation information is being requested.
   set file(String value) {
-    assert(value != null);
     _file = value;
   }
 
@@ -348,7 +341,6 @@
   /// The offset of the region for which navigation information is being
   /// requested.
   set offset(int value) {
-    assert(value != null);
     _offset = value;
   }
 
@@ -359,7 +351,6 @@
   /// The length of the region for which navigation information is being
   /// requested.
   set length(int value) {
-    assert(value != null);
     _length = value;
   }
 
@@ -370,7 +361,7 @@
   }
 
   factory AnalysisGetNavigationParams.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       String file;
@@ -404,8 +395,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['file'] = file;
     result['offset'] = offset;
     result['length'] = length;
@@ -450,11 +441,11 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class AnalysisGetNavigationResult implements ResponseResult {
-  List<String> _files;
+  late List<String> _files;
 
-  List<NavigationTarget> _targets;
+  late List<NavigationTarget> _targets;
 
-  List<NavigationRegion> _regions;
+  late List<NavigationRegion> _regions;
 
   /// A list of the paths of files that are referenced by the navigation
   /// targets.
@@ -463,7 +454,6 @@
   /// A list of the paths of files that are referenced by the navigation
   /// targets.
   set files(List<String> value) {
-    assert(value != null);
     _files = value;
   }
 
@@ -474,7 +464,6 @@
   /// A list of the navigation targets that are referenced by the navigation
   /// regions.
   set targets(List<NavigationTarget> value) {
-    assert(value != null);
     _targets = value;
   }
 
@@ -483,7 +472,6 @@
 
   /// A list of the navigation regions within the requested region of the file.
   set regions(List<NavigationRegion> value) {
-    assert(value != null);
     _regions = value;
   }
 
@@ -495,7 +483,7 @@
   }
 
   factory AnalysisGetNavigationResult.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       List<String> files;
@@ -510,7 +498,7 @@
         targets = jsonDecoder.decodeList(
             jsonPath + '.targets',
             json['targets'],
-            (String jsonPath, Object json) =>
+            (String jsonPath, Object? json) =>
                 NavigationTarget.fromJson(jsonDecoder, jsonPath, json));
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'targets');
@@ -520,7 +508,7 @@
         regions = jsonDecoder.decodeList(
             jsonPath + '.regions',
             json['regions'],
-            (String jsonPath, Object json) =>
+            (String jsonPath, Object? json) =>
                 NavigationRegion.fromJson(jsonDecoder, jsonPath, json));
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'regions');
@@ -540,8 +528,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['files'] = files;
     result['targets'] =
         targets.map((NavigationTarget value) => value.toJson()).toList();
@@ -588,14 +576,13 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class AnalysisHandleWatchEventsParams implements RequestParams {
-  List<WatchEvent> _events;
+  late List<WatchEvent> _events;
 
   /// The watch events that the plugin should handle.
   List<WatchEvent> get events => _events;
 
   /// The watch events that the plugin should handle.
   set events(List<WatchEvent> value) {
-    assert(value != null);
     _events = value;
   }
 
@@ -604,7 +591,7 @@
   }
 
   factory AnalysisHandleWatchEventsParams.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       List<WatchEvent> events;
@@ -612,7 +599,7 @@
         events = jsonDecoder.decodeList(
             jsonPath + '.events',
             json['events'],
-            (String jsonPath, Object json) =>
+            (String jsonPath, Object? json) =>
                 WatchEvent.fromJson(jsonDecoder, jsonPath, json));
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'events');
@@ -630,8 +617,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['events'] =
         events.map((WatchEvent value) => value.toJson()).toList();
     return result;
@@ -667,7 +654,7 @@
 /// Clients may not extend, implement or mix-in this class.
 class AnalysisHandleWatchEventsResult implements ResponseResult {
   @override
-  Map<String, dynamic> toJson() => <String, dynamic>{};
+  Map<String, Object> toJson() => <String, Object>{};
 
   @override
   Response toResponse(String id, int requestTime) {
@@ -697,16 +684,15 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class AnalysisHighlightsParams implements HasToJson {
-  String _file;
+  late String _file;
 
-  List<HighlightRegion> _regions;
+  late List<HighlightRegion> _regions;
 
   /// The file containing the highlight regions.
   String get file => _file;
 
   /// The file containing the highlight regions.
   set file(String value) {
-    assert(value != null);
     _file = value;
   }
 
@@ -715,7 +701,6 @@
 
   /// The highlight regions contained in the file.
   set regions(List<HighlightRegion> value) {
-    assert(value != null);
     _regions = value;
   }
 
@@ -725,7 +710,7 @@
   }
 
   factory AnalysisHighlightsParams.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       String file;
@@ -739,7 +724,7 @@
         regions = jsonDecoder.decodeList(
             jsonPath + '.regions',
             json['regions'],
-            (String jsonPath, Object json) =>
+            (String jsonPath, Object? json) =>
                 HighlightRegion.fromJson(jsonDecoder, jsonPath, json));
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'regions');
@@ -756,8 +741,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['file'] = file;
     result['regions'] =
         regions.map((HighlightRegion value) => value.toJson()).toList();
@@ -801,20 +786,19 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class AnalysisNavigationParams implements HasToJson {
-  String _file;
+  late String _file;
 
-  List<NavigationRegion> _regions;
+  late List<NavigationRegion> _regions;
 
-  List<NavigationTarget> _targets;
+  late List<NavigationTarget> _targets;
 
-  List<String> _files;
+  late List<String> _files;
 
   /// The file containing the navigation regions.
   String get file => _file;
 
   /// The file containing the navigation regions.
   set file(String value) {
-    assert(value != null);
     _file = value;
   }
 
@@ -823,7 +807,6 @@
 
   /// The navigation regions contained in the file.
   set regions(List<NavigationRegion> value) {
-    assert(value != null);
     _regions = value;
   }
 
@@ -834,7 +817,6 @@
   /// The navigation targets referenced in the file. They are referenced by
   /// NavigationRegions by their index in this array.
   set targets(List<NavigationTarget> value) {
-    assert(value != null);
     _targets = value;
   }
 
@@ -845,7 +827,6 @@
   /// The files containing navigation targets referenced in the file. They are
   /// referenced by NavigationTargets by their index in this array.
   set files(List<String> value) {
-    assert(value != null);
     _files = value;
   }
 
@@ -858,7 +839,7 @@
   }
 
   factory AnalysisNavigationParams.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       String file;
@@ -872,7 +853,7 @@
         regions = jsonDecoder.decodeList(
             jsonPath + '.regions',
             json['regions'],
-            (String jsonPath, Object json) =>
+            (String jsonPath, Object? json) =>
                 NavigationRegion.fromJson(jsonDecoder, jsonPath, json));
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'regions');
@@ -882,7 +863,7 @@
         targets = jsonDecoder.decodeList(
             jsonPath + '.targets',
             json['targets'],
-            (String jsonPath, Object json) =>
+            (String jsonPath, Object? json) =>
                 NavigationTarget.fromJson(jsonDecoder, jsonPath, json));
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'targets');
@@ -906,8 +887,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['file'] = file;
     result['regions'] =
         regions.map((NavigationRegion value) => value.toJson()).toList();
@@ -957,16 +938,15 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class AnalysisOccurrencesParams implements HasToJson {
-  String _file;
+  late String _file;
 
-  List<Occurrences> _occurrences;
+  late List<Occurrences> _occurrences;
 
   /// The file in which the references occur.
   String get file => _file;
 
   /// The file in which the references occur.
   set file(String value) {
-    assert(value != null);
     _file = value;
   }
 
@@ -975,7 +955,6 @@
 
   /// The occurrences of references to elements within the file.
   set occurrences(List<Occurrences> value) {
-    assert(value != null);
     _occurrences = value;
   }
 
@@ -985,7 +964,7 @@
   }
 
   factory AnalysisOccurrencesParams.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       String file;
@@ -999,7 +978,7 @@
         occurrences = jsonDecoder.decodeList(
             jsonPath + '.occurrences',
             json['occurrences'],
-            (String jsonPath, Object json) =>
+            (String jsonPath, Object? json) =>
                 Occurrences.fromJson(jsonDecoder, jsonPath, json));
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'occurrences');
@@ -1017,8 +996,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['file'] = file;
     result['occurrences'] =
         occurrences.map((Occurrences value) => value.toJson()).toList();
@@ -1060,16 +1039,15 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class AnalysisOutlineParams implements HasToJson {
-  String _file;
+  late String _file;
 
-  List<Outline> _outline;
+  late List<Outline> _outline;
 
   /// The file with which the outline is associated.
   String get file => _file;
 
   /// The file with which the outline is associated.
   set file(String value) {
-    assert(value != null);
     _file = value;
   }
 
@@ -1078,7 +1056,6 @@
 
   /// The outline fragments associated with the file.
   set outline(List<Outline> value) {
-    assert(value != null);
     _outline = value;
   }
 
@@ -1088,7 +1065,7 @@
   }
 
   factory AnalysisOutlineParams.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       String file;
@@ -1102,7 +1079,7 @@
         outline = jsonDecoder.decodeList(
             jsonPath + '.outline',
             json['outline'],
-            (String jsonPath, Object json) =>
+            (String jsonPath, Object? json) =>
                 Outline.fromJson(jsonDecoder, jsonPath, json));
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'outline');
@@ -1119,8 +1096,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['file'] = file;
     result['outline'] = outline.map((Outline value) => value.toJson()).toList();
     return result;
@@ -1204,7 +1181,7 @@
   }
 
   factory AnalysisService.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     if (json is String) {
       try {
         return AnalysisService(json);
@@ -1229,14 +1206,13 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class AnalysisSetContextRootsParams implements RequestParams {
-  List<ContextRoot> _roots;
+  late List<ContextRoot> _roots;
 
   /// A list of the context roots that should be analyzed.
   List<ContextRoot> get roots => _roots;
 
   /// A list of the context roots that should be analyzed.
   set roots(List<ContextRoot> value) {
-    assert(value != null);
     _roots = value;
   }
 
@@ -1245,7 +1221,7 @@
   }
 
   factory AnalysisSetContextRootsParams.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       List<ContextRoot> roots;
@@ -1253,7 +1229,7 @@
         roots = jsonDecoder.decodeList(
             jsonPath + '.roots',
             json['roots'],
-            (String jsonPath, Object json) =>
+            (String jsonPath, Object? json) =>
                 ContextRoot.fromJson(jsonDecoder, jsonPath, json));
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'roots');
@@ -1271,8 +1247,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['roots'] = roots.map((ContextRoot value) => value.toJson()).toList();
     return result;
   }
@@ -1307,7 +1283,7 @@
 /// Clients may not extend, implement or mix-in this class.
 class AnalysisSetContextRootsResult implements ResponseResult {
   @override
-  Map<String, dynamic> toJson() => <String, dynamic>{};
+  Map<String, Object> toJson() => <String, Object>{};
 
   @override
   Response toResponse(String id, int requestTime) {
@@ -1336,14 +1312,13 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class AnalysisSetPriorityFilesParams implements RequestParams {
-  List<String> _files;
+  late List<String> _files;
 
   /// The files that are to be a priority for analysis.
   List<String> get files => _files;
 
   /// The files that are to be a priority for analysis.
   set files(List<String> value) {
-    assert(value != null);
     _files = value;
   }
 
@@ -1352,7 +1327,7 @@
   }
 
   factory AnalysisSetPriorityFilesParams.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       List<String> files;
@@ -1375,8 +1350,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['files'] = files;
     return result;
   }
@@ -1410,7 +1385,7 @@
 /// Clients may not extend, implement or mix-in this class.
 class AnalysisSetPriorityFilesResult implements ResponseResult {
   @override
-  Map<String, dynamic> toJson() => <String, dynamic>{};
+  Map<String, Object> toJson() => <String, Object>{};
 
   @override
   Response toResponse(String id, int requestTime) {
@@ -1439,7 +1414,7 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class AnalysisSetSubscriptionsParams implements RequestParams {
-  Map<AnalysisService, List<String>> _subscriptions;
+  late Map<AnalysisService, List<String>> _subscriptions;
 
   /// A table mapping services to a list of the files being subscribed to the
   /// service.
@@ -1448,7 +1423,6 @@
   /// A table mapping services to a list of the files being subscribed to the
   /// service.
   set subscriptions(Map<AnalysisService, List<String>> value) {
-    assert(value != null);
     _subscriptions = value;
   }
 
@@ -1458,16 +1432,16 @@
   }
 
   factory AnalysisSetSubscriptionsParams.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       Map<AnalysisService, List<String>> subscriptions;
       if (json.containsKey('subscriptions')) {
         subscriptions = jsonDecoder.decodeMap(
             jsonPath + '.subscriptions', json['subscriptions'],
-            keyDecoder: (String jsonPath, Object json) =>
+            keyDecoder: (String jsonPath, Object? json) =>
                 AnalysisService.fromJson(jsonDecoder, jsonPath, json),
-            valueDecoder: (String jsonPath, Object json) => jsonDecoder
+            valueDecoder: (String jsonPath, Object? json) => jsonDecoder
                 .decodeList(jsonPath, json, jsonDecoder.decodeString));
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'subscriptions');
@@ -1485,8 +1459,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['subscriptions'] = mapMap(subscriptions,
         keyCallback: (AnalysisService value) => value.toJson());
     return result;
@@ -1525,7 +1499,7 @@
 /// Clients may not extend, implement or mix-in this class.
 class AnalysisSetSubscriptionsResult implements ResponseResult {
   @override
-  Map<String, dynamic> toJson() => <String, dynamic>{};
+  Map<String, Object> toJson() => <String, Object>{};
 
   @override
   Response toResponse(String id, int requestTime) {
@@ -1554,38 +1528,37 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class AnalysisUpdateContentParams implements RequestParams {
-  Map<String, dynamic> _files;
+  late Map<String, Object> _files;
 
   /// A table mapping the files whose content has changed to a description of
   /// the content change.
-  Map<String, dynamic> get files => _files;
+  Map<String, Object> get files => _files;
 
   /// A table mapping the files whose content has changed to a description of
   /// the content change.
-  set files(Map<String, dynamic> value) {
-    assert(value != null);
+  set files(Map<String, Object> value) {
     _files = value;
   }
 
-  AnalysisUpdateContentParams(Map<String, dynamic> files) {
+  AnalysisUpdateContentParams(Map<String, Object> files) {
     this.files = files;
   }
 
   factory AnalysisUpdateContentParams.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
-      Map<String, dynamic> files;
+      Map<String, Object> files;
       if (json.containsKey('files')) {
         files = jsonDecoder.decodeMap(jsonPath + '.files', json['files'],
-            valueDecoder: (String jsonPath, Object json) =>
+            valueDecoder: (String jsonPath, Object? json) =>
                 jsonDecoder.decodeUnion(jsonPath, json as Map, 'type', {
-                  'add': (String jsonPath, Object json) =>
+                  'add': (String jsonPath, Object? json) =>
                       AddContentOverlay.fromJson(jsonDecoder, jsonPath, json),
-                  'change': (String jsonPath, Object json) =>
+                  'change': (String jsonPath, Object? json) =>
                       ChangeContentOverlay.fromJson(
                           jsonDecoder, jsonPath, json),
-                  'remove': (String jsonPath, Object json) =>
+                  'remove': (String jsonPath, Object? json) =>
                       RemoveContentOverlay.fromJson(jsonDecoder, jsonPath, json)
                 }));
       } else {
@@ -1604,10 +1577,10 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
-    result['files'] =
-        mapMap(files, valueCallback: (dynamic value) => value.toJson());
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
+    result['files'] = mapMap(files,
+        valueCallback: (Object value) => (value as dynamic).toJson());
     return result;
   }
 
@@ -1622,7 +1595,7 @@
   @override
   bool operator ==(other) {
     if (other is AnalysisUpdateContentParams) {
-      return mapEqual(files, other.files, (dynamic a, dynamic b) => a == b);
+      return mapEqual(files, other.files, (Object a, Object b) => a == b);
     }
     return false;
   }
@@ -1640,7 +1613,7 @@
 /// Clients may not extend, implement or mix-in this class.
 class AnalysisUpdateContentResult implements ResponseResult {
   @override
-  Map<String, dynamic> toJson() => <String, dynamic>{};
+  Map<String, Object> toJson() => <String, Object>{};
 
   @override
   Response toResponse(String id, int requestTime) {
@@ -1670,16 +1643,15 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class CompletionGetSuggestionsParams implements RequestParams {
-  String _file;
+  late String _file;
 
-  int _offset;
+  late int _offset;
 
   /// The file containing the point at which suggestions are to be made.
   String get file => _file;
 
   /// The file containing the point at which suggestions are to be made.
   set file(String value) {
-    assert(value != null);
     _file = value;
   }
 
@@ -1688,7 +1660,6 @@
 
   /// The offset within the file at which suggestions are to be made.
   set offset(int value) {
-    assert(value != null);
     _offset = value;
   }
 
@@ -1698,7 +1669,7 @@
   }
 
   factory CompletionGetSuggestionsParams.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       String file;
@@ -1726,8 +1697,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['file'] = file;
     result['offset'] = offset;
     return result;
@@ -1768,11 +1739,11 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class CompletionGetSuggestionsResult implements ResponseResult {
-  int _replacementOffset;
+  late int _replacementOffset;
 
-  int _replacementLength;
+  late int _replacementLength;
 
-  List<CompletionSuggestion> _results;
+  late List<CompletionSuggestion> _results;
 
   /// The offset of the start of the text to be replaced. This will be
   /// different than the offset used to request the completion suggestions if
@@ -1787,7 +1758,6 @@
   /// particular, the replacementOffset will be the offset of the beginning of
   /// said identifier.
   set replacementOffset(int value) {
-    assert(value != null);
     _replacementOffset = value;
   }
 
@@ -1800,7 +1770,6 @@
   /// containing the cursor is to be replaced when the suggestion is applied
   /// (that is, the number of characters in the existing identifier).
   set replacementLength(int value) {
-    assert(value != null);
     _replacementLength = value;
   }
 
@@ -1817,7 +1786,6 @@
   /// client to respond to further keystrokes from the user without having to
   /// make additional requests.
   set results(List<CompletionSuggestion> value) {
-    assert(value != null);
     _results = value;
   }
 
@@ -1829,7 +1797,7 @@
   }
 
   factory CompletionGetSuggestionsResult.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       int replacementOffset;
@@ -1851,7 +1819,7 @@
         results = jsonDecoder.decodeList(
             jsonPath + '.results',
             json['results'],
-            (String jsonPath, Object json) =>
+            (String jsonPath, Object? json) =>
                 CompletionSuggestion.fromJson(jsonDecoder, jsonPath, json));
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'results');
@@ -1872,8 +1840,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['replacementOffset'] = replacementOffset;
     result['replacementLength'] = replacementLength;
     result['results'] =
@@ -1920,11 +1888,11 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class ContextRoot implements HasToJson {
-  String _root;
+  late String _root;
 
-  List<String> _exclude;
+  late List<String> _exclude;
 
-  String _optionsFile;
+  String? _optionsFile;
 
   /// The absolute path of the root directory containing the files to be
   /// analyzed.
@@ -1933,7 +1901,6 @@
   /// The absolute path of the root directory containing the files to be
   /// analyzed.
   set root(String value) {
-    assert(value != null);
     _root = value;
   }
 
@@ -1944,28 +1911,27 @@
   /// A list of the absolute paths of files and directories within the root
   /// directory that should not be analyzed.
   set exclude(List<String> value) {
-    assert(value != null);
     _exclude = value;
   }
 
   /// The absolute path of the analysis options file that should be used to
   /// control the analysis of the files in the context.
-  String get optionsFile => _optionsFile;
+  String? get optionsFile => _optionsFile;
 
   /// The absolute path of the analysis options file that should be used to
   /// control the analysis of the files in the context.
-  set optionsFile(String value) {
+  set optionsFile(String? value) {
     _optionsFile = value;
   }
 
-  ContextRoot(String root, List<String> exclude, {String optionsFile}) {
+  ContextRoot(String root, List<String> exclude, {String? optionsFile}) {
     this.root = root;
     this.exclude = exclude;
     this.optionsFile = optionsFile;
   }
 
   factory ContextRoot.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       String root;
@@ -1981,7 +1947,7 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'exclude');
       }
-      String optionsFile;
+      String? optionsFile;
       if (json.containsKey('optionsFile')) {
         optionsFile = jsonDecoder.decodeString(
             jsonPath + '.optionsFile', json['optionsFile']);
@@ -1993,10 +1959,11 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['root'] = root;
     result['exclude'] = exclude;
+    var optionsFile = this.optionsFile;
     if (optionsFile != null) {
       result['optionsFile'] = optionsFile;
     }
@@ -2112,18 +2079,17 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class EditGetAssistsParams implements RequestParams {
-  String _file;
+  late String _file;
 
-  int _offset;
+  late int _offset;
 
-  int _length;
+  late int _length;
 
   /// The file containing the code for which assists are being requested.
   String get file => _file;
 
   /// The file containing the code for which assists are being requested.
   set file(String value) {
-    assert(value != null);
     _file = value;
   }
 
@@ -2132,7 +2098,6 @@
 
   /// The offset of the code for which assists are being requested.
   set offset(int value) {
-    assert(value != null);
     _offset = value;
   }
 
@@ -2141,7 +2106,6 @@
 
   /// The length of the code for which assists are being requested.
   set length(int value) {
-    assert(value != null);
     _length = value;
   }
 
@@ -2152,7 +2116,7 @@
   }
 
   factory EditGetAssistsParams.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       String file;
@@ -2185,8 +2149,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['file'] = file;
     result['offset'] = offset;
     result['length'] = length;
@@ -2229,14 +2193,13 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class EditGetAssistsResult implements ResponseResult {
-  List<PrioritizedSourceChange> _assists;
+  late List<PrioritizedSourceChange> _assists;
 
   /// The assists that are available at the given location.
   List<PrioritizedSourceChange> get assists => _assists;
 
   /// The assists that are available at the given location.
   set assists(List<PrioritizedSourceChange> value) {
-    assert(value != null);
     _assists = value;
   }
 
@@ -2245,7 +2208,7 @@
   }
 
   factory EditGetAssistsResult.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       List<PrioritizedSourceChange> assists;
@@ -2253,7 +2216,7 @@
         assists = jsonDecoder.decodeList(
             jsonPath + '.assists',
             json['assists'],
-            (String jsonPath, Object json) =>
+            (String jsonPath, Object? json) =>
                 PrioritizedSourceChange.fromJson(jsonDecoder, jsonPath, json));
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'assists');
@@ -2272,8 +2235,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['assists'] =
         assists.map((PrioritizedSourceChange value) => value.toJson()).toList();
     return result;
@@ -2314,18 +2277,17 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class EditGetAvailableRefactoringsParams implements RequestParams {
-  String _file;
+  late String _file;
 
-  int _offset;
+  late int _offset;
 
-  int _length;
+  late int _length;
 
   /// The file containing the code on which the refactoring would be based.
   String get file => _file;
 
   /// The file containing the code on which the refactoring would be based.
   set file(String value) {
-    assert(value != null);
     _file = value;
   }
 
@@ -2334,7 +2296,6 @@
 
   /// The offset of the code on which the refactoring would be based.
   set offset(int value) {
-    assert(value != null);
     _offset = value;
   }
 
@@ -2343,7 +2304,6 @@
 
   /// The length of the code on which the refactoring would be based.
   set length(int value) {
-    assert(value != null);
     _length = value;
   }
 
@@ -2354,7 +2314,7 @@
   }
 
   factory EditGetAvailableRefactoringsParams.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       String file;
@@ -2388,8 +2348,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['file'] = file;
     result['offset'] = offset;
     result['length'] = length;
@@ -2432,7 +2392,7 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class EditGetAvailableRefactoringsResult implements ResponseResult {
-  List<RefactoringKind> _kinds;
+  late List<RefactoringKind> _kinds;
 
   /// The kinds of refactorings that are valid for the given selection.
   ///
@@ -2449,7 +2409,6 @@
   /// However, plugins can support pre-defined refactorings, such as a rename
   /// refactoring, at locations not supported by server.
   set kinds(List<RefactoringKind> value) {
-    assert(value != null);
     _kinds = value;
   }
 
@@ -2458,7 +2417,7 @@
   }
 
   factory EditGetAvailableRefactoringsResult.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       List<RefactoringKind> kinds;
@@ -2466,7 +2425,7 @@
         kinds = jsonDecoder.decodeList(
             jsonPath + '.kinds',
             json['kinds'],
-            (String jsonPath, Object json) =>
+            (String jsonPath, Object? json) =>
                 RefactoringKind.fromJson(jsonDecoder, jsonPath, json));
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'kinds');
@@ -2486,8 +2445,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['kinds'] =
         kinds.map((RefactoringKind value) => value.toJson()).toList();
     return result;
@@ -2527,16 +2486,15 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class EditGetFixesParams implements RequestParams {
-  String _file;
+  late String _file;
 
-  int _offset;
+  late int _offset;
 
   /// The file containing the errors for which fixes are being requested.
   String get file => _file;
 
   /// The file containing the errors for which fixes are being requested.
   set file(String value) {
-    assert(value != null);
     _file = value;
   }
 
@@ -2545,7 +2503,6 @@
 
   /// The offset used to select the errors for which fixes will be returned.
   set offset(int value) {
-    assert(value != null);
     _offset = value;
   }
 
@@ -2555,7 +2512,7 @@
   }
 
   factory EditGetFixesParams.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       String file;
@@ -2582,8 +2539,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['file'] = file;
     result['offset'] = offset;
     return result;
@@ -2622,14 +2579,13 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class EditGetFixesResult implements ResponseResult {
-  List<AnalysisErrorFixes> _fixes;
+  late List<AnalysisErrorFixes> _fixes;
 
   /// The fixes that are available for the errors at the given offset.
   List<AnalysisErrorFixes> get fixes => _fixes;
 
   /// The fixes that are available for the errors at the given offset.
   set fixes(List<AnalysisErrorFixes> value) {
-    assert(value != null);
     _fixes = value;
   }
 
@@ -2638,7 +2594,7 @@
   }
 
   factory EditGetFixesResult.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       List<AnalysisErrorFixes> fixes;
@@ -2646,7 +2602,7 @@
         fixes = jsonDecoder.decodeList(
             jsonPath + '.fixes',
             json['fixes'],
-            (String jsonPath, Object json) =>
+            (String jsonPath, Object? json) =>
                 AnalysisErrorFixes.fromJson(jsonDecoder, jsonPath, json));
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'fixes');
@@ -2665,8 +2621,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['fixes'] =
         fixes.map((AnalysisErrorFixes value) => value.toJson()).toList();
     return result;
@@ -2710,24 +2666,23 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class EditGetRefactoringParams implements RequestParams {
-  RefactoringKind _kind;
+  late RefactoringKind _kind;
 
-  String _file;
+  late String _file;
 
-  int _offset;
+  late int _offset;
 
-  int _length;
+  late int _length;
 
-  bool _validateOnly;
+  late bool _validateOnly;
 
-  RefactoringOptions _options;
+  RefactoringOptions? _options;
 
   /// The kind of refactoring to be performed.
   RefactoringKind get kind => _kind;
 
   /// The kind of refactoring to be performed.
   set kind(RefactoringKind value) {
-    assert(value != null);
     _kind = value;
   }
 
@@ -2736,7 +2691,6 @@
 
   /// The file containing the code involved in the refactoring.
   set file(String value) {
-    assert(value != null);
     _file = value;
   }
 
@@ -2745,7 +2699,6 @@
 
   /// The offset of the region involved in the refactoring.
   set offset(int value) {
-    assert(value != null);
     _offset = value;
   }
 
@@ -2754,7 +2707,6 @@
 
   /// The length of the region involved in the refactoring.
   set length(int value) {
-    assert(value != null);
     _length = value;
   }
 
@@ -2765,7 +2717,6 @@
   /// True if the client is only requesting that the values of the options be
   /// validated and no change be generated.
   set validateOnly(bool value) {
-    assert(value != null);
     _validateOnly = value;
   }
 
@@ -2774,20 +2725,20 @@
   /// that is expected is documented in the section titled Refactorings,
   /// labeled as "Options". This field can be omitted if the refactoring does
   /// not require any options or if the values of those options are not known.
-  RefactoringOptions get options => _options;
+  RefactoringOptions? get options => _options;
 
   /// Data used to provide values provided by the user. The structure of the
   /// data is dependent on the kind of refactoring being performed. The data
   /// that is expected is documented in the section titled Refactorings,
   /// labeled as "Options". This field can be omitted if the refactoring does
   /// not require any options or if the values of those options are not known.
-  set options(RefactoringOptions value) {
+  set options(RefactoringOptions? value) {
     _options = value;
   }
 
   EditGetRefactoringParams(RefactoringKind kind, String file, int offset,
       int length, bool validateOnly,
-      {RefactoringOptions options}) {
+      {RefactoringOptions? options}) {
     this.kind = kind;
     this.file = file;
     this.offset = offset;
@@ -2797,7 +2748,7 @@
   }
 
   factory EditGetRefactoringParams.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       RefactoringKind kind;
@@ -2832,7 +2783,7 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'validateOnly');
       }
-      RefactoringOptions options;
+      RefactoringOptions? options;
       if (json.containsKey('options')) {
         options = RefactoringOptions.fromJson(
             jsonDecoder, jsonPath + '.options', json['options'], kind);
@@ -2852,13 +2803,14 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['kind'] = kind.toJson();
     result['file'] = file;
     result['offset'] = offset;
     result['length'] = length;
     result['validateOnly'] = validateOnly;
+    var options = this.options;
     if (options != null) {
       result['options'] = options.toJson();
     }
@@ -2912,17 +2864,17 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class EditGetRefactoringResult implements ResponseResult {
-  List<RefactoringProblem> _initialProblems;
+  late List<RefactoringProblem> _initialProblems;
 
-  List<RefactoringProblem> _optionsProblems;
+  late List<RefactoringProblem> _optionsProblems;
 
-  List<RefactoringProblem> _finalProblems;
+  late List<RefactoringProblem> _finalProblems;
 
-  RefactoringFeedback _feedback;
+  RefactoringFeedback? _feedback;
 
-  SourceChange _change;
+  SourceChange? _change;
 
-  List<String> _potentialEdits;
+  List<String>? _potentialEdits;
 
   /// The initial status of the refactoring, that is, problems related to the
   /// context in which the refactoring is requested. The list should be empty
@@ -2933,7 +2885,6 @@
   /// context in which the refactoring is requested. The list should be empty
   /// if there are no known problems.
   set initialProblems(List<RefactoringProblem> value) {
-    assert(value != null);
     _initialProblems = value;
   }
 
@@ -2946,7 +2897,6 @@
   /// such as light-weight validation of a new name, flags compatibility, etc.
   /// The list should be empty if there are no known problems.
   set optionsProblems(List<RefactoringProblem> value) {
-    assert(value != null);
     _optionsProblems = value;
   }
 
@@ -2959,7 +2909,6 @@
   /// result of a full, potentially expensive validation and / or change
   /// creation. The list should be empty if there are no known problems.
   set finalProblems(List<RefactoringProblem> value) {
-    assert(value != null);
     _finalProblems = value;
   }
 
@@ -2967,13 +2916,13 @@
   /// dependent on the kind of refactoring being created. The data that is
   /// returned is documented in the section titled Refactorings, labeled as
   /// "Feedback".
-  RefactoringFeedback get feedback => _feedback;
+  RefactoringFeedback? get feedback => _feedback;
 
   /// Data used to provide feedback to the user. The structure of the data is
   /// dependent on the kind of refactoring being created. The data that is
   /// returned is documented in the section titled Refactorings, labeled as
   /// "Feedback".
-  set feedback(RefactoringFeedback value) {
+  set feedback(RefactoringFeedback? value) {
     _feedback = value;
   }
 
@@ -2981,13 +2930,13 @@
   /// can be omitted if there are problems that prevent a set of changes from
   /// being computed, such as having no options specified for a refactoring
   /// that requires them, or if only validation was requested.
-  SourceChange get change => _change;
+  SourceChange? get change => _change;
 
   /// The changes that are to be applied to affect the refactoring. This field
   /// can be omitted if there are problems that prevent a set of changes from
   /// being computed, such as having no options specified for a refactoring
   /// that requires them, or if only validation was requested.
-  set change(SourceChange value) {
+  set change(SourceChange? value) {
     _change = value;
   }
 
@@ -2997,7 +2946,7 @@
   /// modified, such as when a member is being renamed and there is a reference
   /// to a member from an unknown type. This field can be omitted if the change
   /// field is omitted or if there are no potential edits for the refactoring.
-  List<String> get potentialEdits => _potentialEdits;
+  List<String>? get potentialEdits => _potentialEdits;
 
   /// The ids of source edits that are not known to be valid. An edit is not
   /// known to be valid if there was insufficient type information for the
@@ -3005,7 +2954,7 @@
   /// modified, such as when a member is being renamed and there is a reference
   /// to a member from an unknown type. This field can be omitted if the change
   /// field is omitted or if there are no potential edits for the refactoring.
-  set potentialEdits(List<String> value) {
+  set potentialEdits(List<String>? value) {
     _potentialEdits = value;
   }
 
@@ -3013,9 +2962,9 @@
       List<RefactoringProblem> initialProblems,
       List<RefactoringProblem> optionsProblems,
       List<RefactoringProblem> finalProblems,
-      {RefactoringFeedback feedback,
-      SourceChange change,
-      List<String> potentialEdits}) {
+      {RefactoringFeedback? feedback,
+      SourceChange? change,
+      List<String>? potentialEdits}) {
     this.initialProblems = initialProblems;
     this.optionsProblems = optionsProblems;
     this.finalProblems = finalProblems;
@@ -3025,7 +2974,7 @@
   }
 
   factory EditGetRefactoringResult.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       List<RefactoringProblem> initialProblems;
@@ -3033,7 +2982,7 @@
         initialProblems = jsonDecoder.decodeList(
             jsonPath + '.initialProblems',
             json['initialProblems'],
-            (String jsonPath, Object json) =>
+            (String jsonPath, Object? json) =>
                 RefactoringProblem.fromJson(jsonDecoder, jsonPath, json));
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'initialProblems');
@@ -3043,7 +2992,7 @@
         optionsProblems = jsonDecoder.decodeList(
             jsonPath + '.optionsProblems',
             json['optionsProblems'],
-            (String jsonPath, Object json) =>
+            (String jsonPath, Object? json) =>
                 RefactoringProblem.fromJson(jsonDecoder, jsonPath, json));
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'optionsProblems');
@@ -3053,22 +3002,22 @@
         finalProblems = jsonDecoder.decodeList(
             jsonPath + '.finalProblems',
             json['finalProblems'],
-            (String jsonPath, Object json) =>
+            (String jsonPath, Object? json) =>
                 RefactoringProblem.fromJson(jsonDecoder, jsonPath, json));
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'finalProblems');
       }
-      RefactoringFeedback feedback;
+      RefactoringFeedback? feedback;
       if (json.containsKey('feedback')) {
         feedback = RefactoringFeedback.fromJson(
             jsonDecoder, jsonPath + '.feedback', json['feedback'], json);
       }
-      SourceChange change;
+      SourceChange? change;
       if (json.containsKey('change')) {
         change = SourceChange.fromJson(
             jsonDecoder, jsonPath + '.change', json['change']);
       }
-      List<String> potentialEdits;
+      List<String>? potentialEdits;
       if (json.containsKey('potentialEdits')) {
         potentialEdits = jsonDecoder.decodeList(jsonPath + '.potentialEdits',
             json['potentialEdits'], jsonDecoder.decodeString);
@@ -3089,8 +3038,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['initialProblems'] = initialProblems
         .map((RefactoringProblem value) => value.toJson())
         .toList();
@@ -3100,12 +3049,15 @@
     result['finalProblems'] = finalProblems
         .map((RefactoringProblem value) => value.toJson())
         .toList();
+    var feedback = this.feedback;
     if (feedback != null) {
       result['feedback'] = feedback.toJson();
     }
+    var change = this.change;
     if (change != null) {
       result['change'] = change.toJson();
     }
+    var potentialEdits = this.potentialEdits;
     if (potentialEdits != null) {
       result['potentialEdits'] = potentialEdits;
     }
@@ -3162,33 +3114,33 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class ExtractLocalVariableFeedback extends RefactoringFeedback {
-  List<int> _coveringExpressionOffsets;
+  List<int>? _coveringExpressionOffsets;
 
-  List<int> _coveringExpressionLengths;
+  List<int>? _coveringExpressionLengths;
 
-  List<String> _names;
+  late List<String> _names;
 
-  List<int> _offsets;
+  late List<int> _offsets;
 
-  List<int> _lengths;
+  late List<int> _lengths;
 
   /// The offsets of the expressions that cover the specified selection, from
   /// the down most to the up most.
-  List<int> get coveringExpressionOffsets => _coveringExpressionOffsets;
+  List<int>? get coveringExpressionOffsets => _coveringExpressionOffsets;
 
   /// The offsets of the expressions that cover the specified selection, from
   /// the down most to the up most.
-  set coveringExpressionOffsets(List<int> value) {
+  set coveringExpressionOffsets(List<int>? value) {
     _coveringExpressionOffsets = value;
   }
 
   /// The lengths of the expressions that cover the specified selection, from
   /// the down most to the up most.
-  List<int> get coveringExpressionLengths => _coveringExpressionLengths;
+  List<int>? get coveringExpressionLengths => _coveringExpressionLengths;
 
   /// The lengths of the expressions that cover the specified selection, from
   /// the down most to the up most.
-  set coveringExpressionLengths(List<int> value) {
+  set coveringExpressionLengths(List<int>? value) {
     _coveringExpressionLengths = value;
   }
 
@@ -3197,7 +3149,6 @@
 
   /// The proposed names for the local variable.
   set names(List<String> value) {
-    assert(value != null);
     _names = value;
   }
 
@@ -3208,7 +3159,6 @@
   /// The offsets of the expressions that would be replaced by a reference to
   /// the variable.
   set offsets(List<int> value) {
-    assert(value != null);
     _offsets = value;
   }
 
@@ -3223,14 +3173,13 @@
   /// a given expression, if the offset of that expression is offsets[i], then
   /// the length of that expression is lengths[i].
   set lengths(List<int> value) {
-    assert(value != null);
     _lengths = value;
   }
 
   ExtractLocalVariableFeedback(
       List<String> names, List<int> offsets, List<int> lengths,
-      {List<int> coveringExpressionOffsets,
-      List<int> coveringExpressionLengths}) {
+      {List<int>? coveringExpressionOffsets,
+      List<int>? coveringExpressionLengths}) {
     this.coveringExpressionOffsets = coveringExpressionOffsets;
     this.coveringExpressionLengths = coveringExpressionLengths;
     this.names = names;
@@ -3239,17 +3188,17 @@
   }
 
   factory ExtractLocalVariableFeedback.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
-      List<int> coveringExpressionOffsets;
+      List<int>? coveringExpressionOffsets;
       if (json.containsKey('coveringExpressionOffsets')) {
         coveringExpressionOffsets = jsonDecoder.decodeList(
             jsonPath + '.coveringExpressionOffsets',
             json['coveringExpressionOffsets'],
             jsonDecoder.decodeInt);
       }
-      List<int> coveringExpressionLengths;
+      List<int>? coveringExpressionLengths;
       if (json.containsKey('coveringExpressionLengths')) {
         coveringExpressionLengths = jsonDecoder.decodeList(
             jsonPath + '.coveringExpressionLengths',
@@ -3287,11 +3236,13 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
+    var coveringExpressionOffsets = this.coveringExpressionOffsets;
     if (coveringExpressionOffsets != null) {
       result['coveringExpressionOffsets'] = coveringExpressionOffsets;
     }
+    var coveringExpressionLengths = this.coveringExpressionLengths;
     if (coveringExpressionLengths != null) {
       result['coveringExpressionLengths'] = coveringExpressionLengths;
     }
@@ -3339,16 +3290,15 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class ExtractLocalVariableOptions extends RefactoringOptions {
-  String _name;
+  late String _name;
 
-  bool _extractAll;
+  late bool _extractAll;
 
   /// The name that the local variable should be given.
   String get name => _name;
 
   /// The name that the local variable should be given.
   set name(String value) {
-    assert(value != null);
     _name = value;
   }
 
@@ -3363,7 +3313,6 @@
   /// variable. The expression used to initiate the refactoring will always be
   /// replaced.
   set extractAll(bool value) {
-    assert(value != null);
     _extractAll = value;
   }
 
@@ -3373,7 +3322,7 @@
   }
 
   factory ExtractLocalVariableOptions.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       String name;
@@ -3403,8 +3352,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['name'] = name;
     result['extractAll'] = extractAll;
     return result;
@@ -3445,21 +3394,21 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class ExtractMethodFeedback extends RefactoringFeedback {
-  int _offset;
+  late int _offset;
 
-  int _length;
+  late int _length;
 
-  String _returnType;
+  late String _returnType;
 
-  List<String> _names;
+  late List<String> _names;
 
-  bool _canCreateGetter;
+  late bool _canCreateGetter;
 
-  List<RefactoringMethodParameter> _parameters;
+  late List<RefactoringMethodParameter> _parameters;
 
-  List<int> _offsets;
+  late List<int> _offsets;
 
-  List<int> _lengths;
+  late List<int> _lengths;
 
   /// The offset to the beginning of the expression or statements that will be
   /// extracted.
@@ -3468,7 +3417,6 @@
   /// The offset to the beginning of the expression or statements that will be
   /// extracted.
   set offset(int value) {
-    assert(value != null);
     _offset = value;
   }
 
@@ -3477,7 +3425,6 @@
 
   /// The length of the expression or statements that will be extracted.
   set length(int value) {
-    assert(value != null);
     _length = value;
   }
 
@@ -3488,7 +3435,6 @@
   /// The proposed return type for the method. If the returned element does not
   /// have a declared return type, this field will contain an empty string.
   set returnType(String value) {
-    assert(value != null);
     _returnType = value;
   }
 
@@ -3497,7 +3443,6 @@
 
   /// The proposed names for the method.
   set names(List<String> value) {
-    assert(value != null);
     _names = value;
   }
 
@@ -3506,7 +3451,6 @@
 
   /// True if a getter could be created rather than a method.
   set canCreateGetter(bool value) {
-    assert(value != null);
     _canCreateGetter = value;
   }
 
@@ -3515,7 +3459,6 @@
 
   /// The proposed parameters for the method.
   set parameters(List<RefactoringMethodParameter> value) {
-    assert(value != null);
     _parameters = value;
   }
 
@@ -3526,7 +3469,6 @@
   /// The offsets of the expressions or statements that would be replaced by an
   /// invocation of the method.
   set offsets(List<int> value) {
-    assert(value != null);
     _offsets = value;
   }
 
@@ -3543,7 +3485,6 @@
   /// that expression is offsets[i], then the length of that expression is
   /// lengths[i].
   set lengths(List<int> value) {
-    assert(value != null);
     _lengths = value;
   }
 
@@ -3567,7 +3508,7 @@
   }
 
   factory ExtractMethodFeedback.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       int offset;
@@ -3608,7 +3549,7 @@
         parameters = jsonDecoder.decodeList(
             jsonPath + '.parameters',
             json['parameters'],
-            (String jsonPath, Object json) =>
+            (String jsonPath, Object? json) =>
                 RefactoringMethodParameter.fromJson(
                     jsonDecoder, jsonPath, json));
       } else {
@@ -3636,8 +3577,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['offset'] = offset;
     result['length'] = length;
     result['returnType'] = returnType;
@@ -3700,22 +3641,21 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class ExtractMethodOptions extends RefactoringOptions {
-  String _returnType;
+  late String _returnType;
 
-  bool _createGetter;
+  late bool _createGetter;
 
-  String _name;
+  late String _name;
 
-  List<RefactoringMethodParameter> _parameters;
+  late List<RefactoringMethodParameter> _parameters;
 
-  bool _extractAll;
+  late bool _extractAll;
 
   /// The return type that should be defined for the method.
   String get returnType => _returnType;
 
   /// The return type that should be defined for the method.
   set returnType(String value) {
-    assert(value != null);
     _returnType = value;
   }
 
@@ -3726,7 +3666,6 @@
   /// True if a getter should be created rather than a method. It is an error
   /// if this field is true and the list of parameters is non-empty.
   set createGetter(bool value) {
-    assert(value != null);
     _createGetter = value;
   }
 
@@ -3735,7 +3674,6 @@
 
   /// The name that the method should be given.
   set name(String value) {
-    assert(value != null);
     _name = value;
   }
 
@@ -3762,7 +3700,6 @@
   /// - To add new parameters, omit their identifier.
   /// - To remove some parameters, omit them in this list.
   set parameters(List<RefactoringMethodParameter> value) {
-    assert(value != null);
     _parameters = value;
   }
 
@@ -3775,7 +3712,6 @@
   /// replaced by an invocation of the method. The expression or statements
   /// used to initiate the refactoring will always be replaced.
   set extractAll(bool value) {
-    assert(value != null);
     _extractAll = value;
   }
 
@@ -3789,7 +3725,7 @@
   }
 
   factory ExtractMethodOptions.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       String returnType;
@@ -3817,7 +3753,7 @@
         parameters = jsonDecoder.decodeList(
             jsonPath + '.parameters',
             json['parameters'],
-            (String jsonPath, Object json) =>
+            (String jsonPath, Object? json) =>
                 RefactoringMethodParameter.fromJson(
                     jsonDecoder, jsonPath, json));
       } else {
@@ -3844,8 +3780,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['returnType'] = returnType;
     result['createGetter'] = createGetter;
     result['name'] = name;
@@ -3896,16 +3832,15 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class InlineLocalVariableFeedback extends RefactoringFeedback {
-  String _name;
+  late String _name;
 
-  int _occurrences;
+  late int _occurrences;
 
   /// The name of the variable being inlined.
   String get name => _name;
 
   /// The name of the variable being inlined.
   set name(String value) {
-    assert(value != null);
     _name = value;
   }
 
@@ -3914,7 +3849,6 @@
 
   /// The number of times the variable occurs.
   set occurrences(int value) {
-    assert(value != null);
     _occurrences = value;
   }
 
@@ -3924,7 +3858,7 @@
   }
 
   factory InlineLocalVariableFeedback.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       String name;
@@ -3948,8 +3882,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['name'] = name;
     result['occurrences'] = occurrences;
     return result;
@@ -4004,19 +3938,19 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class InlineMethodFeedback extends RefactoringFeedback {
-  String _className;
+  String? _className;
 
-  String _methodName;
+  late String _methodName;
 
-  bool _isDeclaration;
+  late bool _isDeclaration;
 
   /// The name of the class enclosing the method being inlined. If not a class
   /// member is being inlined, this field will be absent.
-  String get className => _className;
+  String? get className => _className;
 
   /// The name of the class enclosing the method being inlined. If not a class
   /// member is being inlined, this field will be absent.
-  set className(String value) {
+  set className(String? value) {
     _className = value;
   }
 
@@ -4025,7 +3959,6 @@
 
   /// The name of the method (or function) being inlined.
   set methodName(String value) {
-    assert(value != null);
     _methodName = value;
   }
 
@@ -4036,22 +3969,21 @@
   /// True if the declaration of the method is selected and all references
   /// should be inlined.
   set isDeclaration(bool value) {
-    assert(value != null);
     _isDeclaration = value;
   }
 
   InlineMethodFeedback(String methodName, bool isDeclaration,
-      {String className}) {
+      {String? className}) {
     this.className = className;
     this.methodName = methodName;
     this.isDeclaration = isDeclaration;
   }
 
   factory InlineMethodFeedback.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
-      String className;
+      String? className;
       if (json.containsKey('className')) {
         className = jsonDecoder.decodeString(
             jsonPath + '.className', json['className']);
@@ -4078,8 +4010,9 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
+    var className = this.className;
     if (className != null) {
       result['className'] = className;
     }
@@ -4120,9 +4053,9 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class InlineMethodOptions extends RefactoringOptions {
-  bool _deleteSource;
+  late bool _deleteSource;
 
-  bool _inlineAll;
+  late bool _inlineAll;
 
   /// True if the method being inlined should be removed. It is an error if
   /// this field is true and inlineAll is false.
@@ -4131,7 +4064,6 @@
   /// True if the method being inlined should be removed. It is an error if
   /// this field is true and inlineAll is false.
   set deleteSource(bool value) {
-    assert(value != null);
     _deleteSource = value;
   }
 
@@ -4142,7 +4074,6 @@
   /// True if all invocations of the method should be inlined, or false if only
   /// the invocation site used to create this refactoring should be inlined.
   set inlineAll(bool value) {
-    assert(value != null);
     _inlineAll = value;
   }
 
@@ -4152,7 +4083,7 @@
   }
 
   factory InlineMethodOptions.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       bool deleteSource;
@@ -4182,8 +4113,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['deleteSource'] = deleteSource;
     result['inlineAll'] = inlineAll;
     return result;
@@ -4217,7 +4148,7 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class KytheGetKytheEntriesParams implements RequestParams {
-  String _file;
+  late String _file;
 
   /// The file containing the code for which the Kythe Entry objects are being
   /// requested.
@@ -4226,7 +4157,6 @@
   /// The file containing the code for which the Kythe Entry objects are being
   /// requested.
   set file(String value) {
-    assert(value != null);
     _file = value;
   }
 
@@ -4235,7 +4165,7 @@
   }
 
   factory KytheGetKytheEntriesParams.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       String file;
@@ -4257,8 +4187,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['file'] = file;
     return result;
   }
@@ -4296,16 +4226,15 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class KytheGetKytheEntriesResult implements ResponseResult {
-  List<KytheEntry> _entries;
+  late List<KytheEntry> _entries;
 
-  List<String> _files;
+  late List<String> _files;
 
   /// The list of KytheEntry objects for the queried file.
   List<KytheEntry> get entries => _entries;
 
   /// The list of KytheEntry objects for the queried file.
   set entries(List<KytheEntry> value) {
-    assert(value != null);
     _entries = value;
   }
 
@@ -4320,7 +4249,6 @@
   /// to a referenced file that does not exist or generated files not being
   /// generated or passed before the call to "getKytheEntries".
   set files(List<String> value) {
-    assert(value != null);
     _files = value;
   }
 
@@ -4330,7 +4258,7 @@
   }
 
   factory KytheGetKytheEntriesResult.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       List<KytheEntry> entries;
@@ -4338,7 +4266,7 @@
         entries = jsonDecoder.decodeList(
             jsonPath + '.entries',
             json['entries'],
-            (String jsonPath, Object json) =>
+            (String jsonPath, Object? json) =>
                 KytheEntry.fromJson(jsonDecoder, jsonPath, json));
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'entries');
@@ -4365,8 +4293,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['entries'] =
         entries.map((KytheEntry value) => value.toJson()).toList();
     result['files'] = files;
@@ -4426,14 +4354,13 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class MoveFileOptions extends RefactoringOptions {
-  String _newFile;
+  late String _newFile;
 
   /// The new file path to which the given file is being moved.
   String get newFile => _newFile;
 
   /// The new file path to which the given file is being moved.
   set newFile(String value) {
-    assert(value != null);
     _newFile = value;
   }
 
@@ -4442,7 +4369,7 @@
   }
 
   factory MoveFileOptions.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       String newFile;
@@ -4465,8 +4392,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['newFile'] = newFile;
     return result;
   }
@@ -4500,11 +4427,11 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class PluginErrorParams implements HasToJson {
-  bool _isFatal;
+  late bool _isFatal;
 
-  String _message;
+  late String _message;
 
-  String _stackTrace;
+  late String _stackTrace;
 
   /// A flag indicating whether the error is a fatal error, meaning that the
   /// plugin will shutdown automatically after sending this notification. If
@@ -4517,7 +4444,6 @@
   /// true, the server will not expect any other responses or notifications
   /// from the plugin.
   set isFatal(bool value) {
-    assert(value != null);
     _isFatal = value;
   }
 
@@ -4526,7 +4452,6 @@
 
   /// The error message indicating what kind of error was encountered.
   set message(String value) {
-    assert(value != null);
     _message = value;
   }
 
@@ -4537,7 +4462,6 @@
   /// The stack trace associated with the generation of the error, used for
   /// debugging the plugin.
   set stackTrace(String value) {
-    assert(value != null);
     _stackTrace = value;
   }
 
@@ -4548,7 +4472,7 @@
   }
 
   factory PluginErrorParams.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       bool isFatal;
@@ -4584,8 +4508,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['isFatal'] = isFatal;
     result['message'] = message;
     result['stackTrace'] = stackTrace;
@@ -4624,7 +4548,7 @@
 /// Clients may not extend, implement or mix-in this class.
 class PluginShutdownParams implements RequestParams {
   @override
-  Map<String, dynamic> toJson() => <String, dynamic>{};
+  Map<String, Object> toJson() => <String, Object>{};
 
   @override
   Request toRequest(String id) {
@@ -4650,7 +4574,7 @@
 /// Clients may not extend, implement or mix-in this class.
 class PluginShutdownResult implements ResponseResult {
   @override
-  Map<String, dynamic> toJson() => <String, dynamic>{};
+  Map<String, Object> toJson() => <String, Object>{};
 
   @override
   Response toResponse(String id, int requestTime) {
@@ -4681,11 +4605,11 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class PluginVersionCheckParams implements RequestParams {
-  String _byteStorePath;
+  late String _byteStorePath;
 
-  String _sdkPath;
+  late String _sdkPath;
 
-  String _version;
+  late String _version;
 
   /// The path to the directory containing the on-disk byte store that is to be
   /// used by any analysis drivers that are created.
@@ -4694,7 +4618,6 @@
   /// The path to the directory containing the on-disk byte store that is to be
   /// used by any analysis drivers that are created.
   set byteStorePath(String value) {
-    assert(value != null);
     _byteStorePath = value;
   }
 
@@ -4705,7 +4628,6 @@
   /// The path to the directory containing the SDK that is to be used by any
   /// analysis drivers that are created.
   set sdkPath(String value) {
-    assert(value != null);
     _sdkPath = value;
   }
 
@@ -4716,7 +4638,6 @@
   /// The version number of the plugin spec supported by the analysis server
   /// that is executing the plugin.
   set version(String value) {
-    assert(value != null);
     _version = value;
   }
 
@@ -4728,7 +4649,7 @@
   }
 
   factory PluginVersionCheckParams.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       String byteStorePath;
@@ -4764,8 +4685,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['byteStorePath'] = byteStorePath;
     result['sdkPath'] = sdkPath;
     result['version'] = version;
@@ -4812,15 +4733,15 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class PluginVersionCheckResult implements ResponseResult {
-  bool _isCompatible;
+  late bool _isCompatible;
 
-  String _name;
+  late String _name;
 
-  String _version;
+  late String _version;
 
-  String _contactInfo;
+  String? _contactInfo;
 
-  List<String> _interestingFiles;
+  late List<String> _interestingFiles;
 
   /// A flag indicating whether the plugin supports the same version of the
   /// plugin spec as the analysis server. If the value is false, then the
@@ -4831,7 +4752,6 @@
   /// plugin spec as the analysis server. If the value is false, then the
   /// plugin is expected to shutdown after returning the response.
   set isCompatible(bool value) {
-    assert(value != null);
     _isCompatible = value;
   }
 
@@ -4842,7 +4762,6 @@
   /// The name of the plugin. This value is only used when the server needs to
   /// identify the plugin, either to the user or for debugging purposes.
   set name(String value) {
-    assert(value != null);
     _name = value;
   }
 
@@ -4853,17 +4772,16 @@
   /// The version of the plugin. This value is only used when the server needs
   /// to identify the plugin, either to the user or for debugging purposes.
   set version(String value) {
-    assert(value != null);
     _version = value;
   }
 
   /// Information that the user can use to use to contact the maintainers of
   /// the plugin when there is a problem.
-  String get contactInfo => _contactInfo;
+  String? get contactInfo => _contactInfo;
 
   /// Information that the user can use to use to contact the maintainers of
   /// the plugin when there is a problem.
-  set contactInfo(String value) {
+  set contactInfo(String? value) {
     _contactInfo = value;
   }
 
@@ -4878,13 +4796,12 @@
   /// Otherwise, it will be used to identify the files for which the plugin
   /// should be notified of changes.
   set interestingFiles(List<String> value) {
-    assert(value != null);
     _interestingFiles = value;
   }
 
   PluginVersionCheckResult(bool isCompatible, String name, String version,
       List<String> interestingFiles,
-      {String contactInfo}) {
+      {String? contactInfo}) {
     this.isCompatible = isCompatible;
     this.name = name;
     this.version = version;
@@ -4893,7 +4810,7 @@
   }
 
   factory PluginVersionCheckResult.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       bool isCompatible;
@@ -4916,7 +4833,7 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'version');
       }
-      String contactInfo;
+      String? contactInfo;
       if (json.containsKey('contactInfo')) {
         contactInfo = jsonDecoder.decodeString(
             jsonPath + '.contactInfo', json['contactInfo']);
@@ -4946,11 +4863,12 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['isCompatible'] = isCompatible;
     result['name'] = name;
     result['version'] = version;
+    var contactInfo = this.contactInfo;
     if (contactInfo != null) {
       result['contactInfo'] = contactInfo;
     }
@@ -5000,9 +4918,9 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class PrioritizedSourceChange implements HasToJson {
-  int _priority;
+  late int _priority;
 
-  SourceChange _change;
+  late SourceChange _change;
 
   /// The priority of the change. The value is expected to be non-negative, and
   /// zero (0) is the lowest priority.
@@ -5011,7 +4929,6 @@
   /// The priority of the change. The value is expected to be non-negative, and
   /// zero (0) is the lowest priority.
   set priority(int value) {
-    assert(value != null);
     _priority = value;
   }
 
@@ -5020,7 +4937,6 @@
 
   /// The change with which the relevance is associated.
   set change(SourceChange value) {
-    assert(value != null);
     _change = value;
   }
 
@@ -5030,7 +4946,7 @@
   }
 
   factory PrioritizedSourceChange.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       int priority;
@@ -5054,8 +4970,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['priority'] = priority;
     result['change'] = change.toJson();
     return result;
@@ -5090,15 +5006,15 @@
 class RefactoringFeedback implements HasToJson {
   RefactoringFeedback();
 
-  factory RefactoringFeedback.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json, Map responseJson) {
+  factory RefactoringFeedback.fromJson(JsonDecoder jsonDecoder, String jsonPath,
+      Object? json, Map responseJson) {
     return refactoringFeedbackFromJson(
         jsonDecoder, jsonPath, json, responseJson);
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     return result;
   }
 
@@ -5130,13 +5046,13 @@
   RefactoringOptions();
 
   factory RefactoringOptions.fromJson(JsonDecoder jsonDecoder, String jsonPath,
-      Object json, RefactoringKind kind) {
+      Object? json, RefactoringKind kind) {
     return refactoringOptionsFromJson(jsonDecoder, jsonPath, json, kind);
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     return result;
   }
 
@@ -5169,20 +5085,19 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class RenameFeedback extends RefactoringFeedback {
-  int _offset;
+  late int _offset;
 
-  int _length;
+  late int _length;
 
-  String _elementKindName;
+  late String _elementKindName;
 
-  String _oldName;
+  late String _oldName;
 
   /// The offset to the beginning of the name selected to be renamed.
   int get offset => _offset;
 
   /// The offset to the beginning of the name selected to be renamed.
   set offset(int value) {
-    assert(value != null);
     _offset = value;
   }
 
@@ -5191,7 +5106,6 @@
 
   /// The length of the name selected to be renamed.
   set length(int value) {
-    assert(value != null);
     _length = value;
   }
 
@@ -5202,7 +5116,6 @@
   /// The human-readable description of the kind of element being renamed (such
   /// as “class” or “function type alias”).
   set elementKindName(String value) {
-    assert(value != null);
     _elementKindName = value;
   }
 
@@ -5211,7 +5124,6 @@
 
   /// The old name of the element before the refactoring.
   set oldName(String value) {
-    assert(value != null);
     _oldName = value;
   }
 
@@ -5224,7 +5136,7 @@
   }
 
   factory RenameFeedback.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       int offset;
@@ -5260,8 +5172,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['offset'] = offset;
     result['length'] = length;
     result['elementKindName'] = elementKindName;
@@ -5302,14 +5214,13 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class RenameOptions extends RefactoringOptions {
-  String _newName;
+  late String _newName;
 
   /// The name that the element should have after the refactoring.
   String get newName => _newName;
 
   /// The name that the element should have after the refactoring.
   set newName(String value) {
-    assert(value != null);
     _newName = value;
   }
 
@@ -5318,7 +5229,7 @@
   }
 
   factory RenameOptions.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       String newName;
@@ -5341,8 +5252,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['newName'] = newName;
     return result;
   }
@@ -5376,18 +5287,17 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class RequestError implements HasToJson {
-  RequestErrorCode _code;
+  late RequestErrorCode _code;
 
-  String _message;
+  late String _message;
 
-  String _stackTrace;
+  String? _stackTrace;
 
   /// A code that uniquely identifies the error that occurred.
   RequestErrorCode get code => _code;
 
   /// A code that uniquely identifies the error that occurred.
   set code(RequestErrorCode value) {
-    assert(value != null);
     _code = value;
   }
 
@@ -5396,28 +5306,27 @@
 
   /// A short description of the error.
   set message(String value) {
-    assert(value != null);
     _message = value;
   }
 
   /// The stack trace associated with processing the request, used for
   /// debugging the plugin.
-  String get stackTrace => _stackTrace;
+  String? get stackTrace => _stackTrace;
 
   /// The stack trace associated with processing the request, used for
   /// debugging the plugin.
-  set stackTrace(String value) {
+  set stackTrace(String? value) {
     _stackTrace = value;
   }
 
-  RequestError(RequestErrorCode code, String message, {String stackTrace}) {
+  RequestError(RequestErrorCode code, String message, {String? stackTrace}) {
     this.code = code;
     this.message = message;
     this.stackTrace = stackTrace;
   }
 
   factory RequestError.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       RequestErrorCode code;
@@ -5434,7 +5343,7 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'message');
       }
-      String stackTrace;
+      String? stackTrace;
       if (json.containsKey('stackTrace')) {
         stackTrace = jsonDecoder.decodeString(
             jsonPath + '.stackTrace', json['stackTrace']);
@@ -5446,10 +5355,11 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['code'] = code.toJson();
     result['message'] = message;
+    var stackTrace = this.stackTrace;
     if (stackTrace != null) {
       result['stackTrace'] = stackTrace;
     }
@@ -5543,7 +5453,7 @@
   }
 
   factory RequestErrorCode.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     if (json is String) {
       try {
         return RequestErrorCode(json);
@@ -5569,16 +5479,15 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class WatchEvent implements HasToJson {
-  WatchEventType _type;
+  late WatchEventType _type;
 
-  String _path;
+  late String _path;
 
   /// The type of change represented by this event.
   WatchEventType get type => _type;
 
   /// The type of change represented by this event.
   set type(WatchEventType value) {
-    assert(value != null);
     _type = value;
   }
 
@@ -5587,7 +5496,6 @@
 
   /// The absolute path of the file or directory that changed.
   set path(String value) {
-    assert(value != null);
     _path = value;
   }
 
@@ -5597,7 +5505,7 @@
   }
 
   factory WatchEvent.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     json ??= {};
     if (json is Map) {
       WatchEventType type;
@@ -5620,8 +5528,8 @@
   }
 
   @override
-  Map<String, dynamic> toJson() {
-    var result = <String, dynamic>{};
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
     result['type'] = type.toJson();
     result['path'] = path;
     return result;
@@ -5691,7 +5599,7 @@
   }
 
   factory WatchEventType.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
     if (json is String) {
       try {
         return WatchEventType(json);
diff --git a/pkg/analyzer_plugin/lib/src/channel/isolate_channel.dart b/pkg/analyzer_plugin/lib/src/channel/isolate_channel.dart
index 2b35cc7..279e58f 100644
--- a/pkg/analyzer_plugin/lib/src/channel/isolate_channel.dart
+++ b/pkg/analyzer_plugin/lib/src/channel/isolate_channel.dart
@@ -31,7 +31,7 @@
   @override
   Future<Isolate> _spawnIsolate() {
     return Isolate.spawn(
-        (message) => entryPoint(message as SendPort), _receivePort.sendPort,
+        (message) => entryPoint(message as SendPort), _receivePort?.sendPort,
         onError: _errorPort?.sendPort, onExit: _exitPort?.sendPort);
   }
 }
@@ -57,7 +57,7 @@
 
   @override
   Future<Isolate> _spawnIsolate() {
-    return Isolate.spawnUri(pluginUri, <String>[], _receivePort.sendPort,
+    return Isolate.spawnUri(pluginUri, <String>[], _receivePort?.sendPort,
         onError: _errorPort?.sendPort,
         onExit: _exitPort?.sendPort,
         packageConfig: packagesUri);
@@ -72,10 +72,10 @@
   final SendPort _sendPort;
 
   /// The port used to receive requests from the server.
-  ReceivePort _receivePort;
+  late final ReceivePort _receivePort;
 
   /// The subscription that needs to be cancelled when the channel is closed.
-  StreamSubscription _subscription;
+  StreamSubscription? _subscription;
 
   /// Initialize a newly created channel to communicate with the server.
   PluginIsolateChannel(this._sendPort) {
@@ -85,21 +85,17 @@
 
   @override
   void close() {
-    if (_subscription != null) {
-      _subscription.cancel();
-      _subscription = null;
-    }
+    _subscription?.cancel();
+    _subscription = null;
   }
 
   @override
   void listen(void Function(Request request) onRequest,
-      {Function onError, void Function() onDone}) {
+      {Function? onError, void Function()? onDone}) {
     void onData(data) {
       var requestMap = data as Map<String, Object>;
       var request = Request.fromJson(requestMap);
-      if (request != null) {
-        onRequest(request);
-      }
+      onRequest(request);
     }
 
     if (_subscription != null) {
@@ -130,20 +126,20 @@
 
   /// The isolate in which the plugin is running, or `null` if the plugin has
   /// not yet been started by invoking [listen].
-  Isolate _isolate;
+  Isolate? _isolate;
 
   /// The port used to send requests to the plugin, or `null` if the plugin has
   /// not yet been started by invoking [listen].
-  SendPort _sendPort;
+  SendPort? _sendPort;
 
   /// The port used to receive responses and notifications from the plugin.
-  ReceivePort _receivePort;
+  ReceivePort? _receivePort;
 
   /// The port used to receive unhandled exceptions thrown in the plugin.
-  ReceivePort _errorPort;
+  ReceivePort? _errorPort;
 
   /// The port used to receive notification when the plugin isolate has exited.
-  ReceivePort _exitPort;
+  ReceivePort? _exitPort;
 
   /// Return a communication channel appropriate for communicating with a
   /// built-in plugin.
@@ -180,23 +176,30 @@
   @override
   Future<void> listen(void Function(Response response) onResponse,
       void Function(Notification notification) onNotification,
-      {void Function(dynamic error) onError, void Function() onDone}) async {
+      {void Function(dynamic error)? onError, void Function()? onDone}) async {
     if (_isolate != null) {
       throw StateError('Cannot listen to the same channel more than once.');
     }
-    _receivePort = ReceivePort();
+
+    var receivePort = ReceivePort();
+    _receivePort = receivePort;
+
     if (onError != null) {
-      _errorPort = ReceivePort();
-      _errorPort.listen((error) {
+      var errorPort = ReceivePort();
+      _errorPort = errorPort;
+      errorPort.listen((error) {
         onError(error);
       });
     }
+
     if (onDone != null) {
-      _exitPort = ReceivePort();
-      _exitPort.listen((_) {
+      var exitPort = ReceivePort();
+      _exitPort = exitPort;
+      exitPort.listen((_) {
         onDone();
       });
     }
+
     try {
       _isolate = await _spawnIsolate();
     } catch (exception, stackTrace) {
@@ -214,8 +217,9 @@
       close();
       return null;
     }
+
     var channelReady = Completer<void>();
-    _receivePort.listen((dynamic input) {
+    receivePort.listen((dynamic input) {
       if (input is SendPort) {
         _sendPort = input;
         channelReady.complete(null);
@@ -231,16 +235,18 @@
         }
       }
     });
+
     return channelReady.future;
   }
 
   @override
   void sendRequest(Request request) {
-    if (_sendPort != null) {
+    var sendPort = _sendPort;
+    if (sendPort != null) {
       var jsonData = request.toJson();
       var encodedRequest = json.encode(jsonData);
       instrumentationService.logPluginRequest(pluginId, encodedRequest);
-      _sendPort.send(jsonData);
+      sendPort.send(jsonData);
     }
   }
 
diff --git a/pkg/analyzer_plugin/lib/src/protocol/protocol_internal.dart b/pkg/analyzer_plugin/lib/src/protocol/protocol_internal.dart
index 5615b1b..bc7322c 100644
--- a/pkg/analyzer_plugin/lib/src/protocol/protocol_internal.dart
+++ b/pkg/analyzer_plugin/lib/src/protocol/protocol_internal.dart
@@ -93,7 +93,7 @@
 }
 
 /// Returns the [FileEdit] for the given [file], maybe `null`.
-SourceFileEdit getChangeFileEdit(SourceChange change, String file) {
+SourceFileEdit? getChangeFileEdit(SourceChange change, String file) {
   for (var fileEdit in change.edits) {
     if (fileEdit.file == file) {
       return fileEdit;
@@ -105,7 +105,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;
   }
@@ -126,7 +126,7 @@
 /// Compare the maps [mapA] and [mapB], using [valueEqual] to compare map
 /// values.
 bool mapEqual<K, V>(
-    Map<K, V> mapA, Map<K, V> mapB, bool Function(V a, V b) valueEqual) {
+    Map<K, V>? mapA, Map<K, V>? mapB, bool Function(V a, V b) valueEqual) {
   if (mapA == null) {
     return mapB == null;
   }
@@ -140,7 +140,7 @@
     if (!mapB.containsKey(key)) {
       return false;
     }
-    if (!valueEqual(mapA[key], mapB[key])) {
+    if (!valueEqual(mapA[key]!, mapB[key]!)) {
       return false;
     }
   }
@@ -150,7 +150,7 @@
 /// Translate the input [map], applying [keyCallback] to all its keys, and
 /// [valueCallback] to all its values.
 Map<KR, VR> mapMap<KP, VP, KR, VR>(Map<KP, VP> map,
-    {KR Function(KP key) keyCallback, VR Function(VP value) valueCallback}) {
+    {KR Function(KP key)? keyCallback, VR Function(VP value)? valueCallback}) {
   Map<KR, VR> result = HashMap<KR, VR>();
   map.forEach((key, value) {
     KR resultKey;
@@ -170,8 +170,8 @@
   return result;
 }
 
-RefactoringProblemSeverity maxRefactoringProblemSeverity(
-    RefactoringProblemSeverity a, RefactoringProblemSeverity b) {
+RefactoringProblemSeverity? maxRefactoringProblemSeverity(
+    RefactoringProblemSeverity? a, RefactoringProblemSeverity? b) {
   if (b == null) {
     return a;
   }
@@ -194,7 +194,7 @@
 
 /// Create a [RefactoringFeedback] corresponding the given [kind].
 RefactoringFeedback refactoringFeedbackFromJson(
-    JsonDecoder jsonDecoder, String jsonPath, Object json, Map feedbackJson) {
+    JsonDecoder jsonDecoder, String jsonPath, Object? json, Map feedbackJson) {
   var kind = jsonDecoder.refactoringKind;
   if (kind == RefactoringKind.EXTRACT_LOCAL_VARIABLE) {
     return ExtractLocalVariableFeedback.fromJson(jsonDecoder, jsonPath, json);
@@ -211,12 +211,12 @@
   if (kind == RefactoringKind.RENAME) {
     return RenameFeedback.fromJson(jsonDecoder, jsonPath, json);
   }
-  return null;
+  throw StateError('Unexpected refactoring kind');
 }
 
 /// Create a [RefactoringOptions] corresponding the given [kind].
 RefactoringOptions refactoringOptionsFromJson(JsonDecoder jsonDecoder,
-    String jsonPath, Object json, RefactoringKind kind) {
+    String jsonPath, Object? json, RefactoringKind kind) {
   if (kind == RefactoringKind.EXTRACT_LOCAL_VARIABLE) {
     return ExtractLocalVariableOptions.fromJson(jsonDecoder, jsonPath, json);
   }
@@ -232,13 +232,14 @@
   if (kind == RefactoringKind.RENAME) {
     return RenameOptions.fromJson(jsonDecoder, jsonPath, json);
   }
-  return null;
+  throw StateError('Unexpected refactoring kind');
 }
 
 /// 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, dynamic value);
+typedef JsonDecoderCallback<E extends Object> = E Function(
+    String jsonPath, dynamic value);
 
 /// Instances of the class [HasToJson] implement [toJson] method that returns
 /// a JSON presentation.
@@ -253,11 +254,11 @@
   /// Retrieve the RefactoringKind that should be assumed when decoding
   /// refactoring feedback objects, or null if no refactoring feedback object is
   /// expected to be encountered.
-  RefactoringKind get refactoringKind;
+  RefactoringKind? get refactoringKind;
 
   /// Decode a JSON object that is expected to be a boolean. The strings "true"
   /// and "false" are also accepted.
-  bool decodeBool(String jsonPath, Object json) {
+  bool decodeBool(String jsonPath, Object? json) {
     if (json is bool) {
       return json;
     } else if (json == 'true') {
@@ -287,7 +288,7 @@
 
   /// Decode a JSON object that is expected to be an integer. A string
   /// representation of an integer is also accepted.
-  int decodeInt(String jsonPath, Object json) {
+  int decodeInt(String jsonPath, Object? json) {
     if (json is int) {
       return json;
     } else if (json is String) {
@@ -304,11 +305,11 @@
   /// to decode the items in the list.
   ///
   /// The type parameter [E] is the expected type of the elements in the list.
-  List<E> decodeList<E>(String jsonPath, Object json,
-      [JsonDecoderCallback<E> decoder]) {
+  List<E> decodeList<E extends Object>(String jsonPath, Object? json,
+      [JsonDecoderCallback<E>? decoder]) {
     if (json == null) {
       return <E>[];
-    } else if (json is List) {
+    } else if (json is List && decoder != null) {
       var result = <E>[];
       for (var i = 0; i < json.length; i++) {
         result.add(decoder('$jsonPath[$i]', json[i]));
@@ -321,9 +322,10 @@
 
   /// Decode a JSON object that is expected to be a Map. [keyDecoder] is used
   /// to decode the keys, and [valueDecoder] is used to decode the values.
-  Map<K, V> decodeMap<K, V>(String jsonPath, Object jsonData,
-      {JsonDecoderCallback<K> keyDecoder,
-      JsonDecoderCallback<V> valueDecoder}) {
+  Map<K, V> decodeMap<K extends Object, V extends Object>(
+      String jsonPath, Object? jsonData,
+      {JsonDecoderCallback<K>? keyDecoder,
+      JsonDecoderCallback<V>? valueDecoder}) {
     if (jsonData == null) {
       return {};
     } else if (jsonData is Map) {
@@ -347,7 +349,7 @@
   }
 
   /// Decode a JSON object that is expected to be a string.
-  String decodeString(String jsonPath, Object json) {
+  String decodeString(String jsonPath, Object? json) {
     if (json is String) {
       return json;
     } else {
@@ -371,7 +373,11 @@
         throw mismatch(
             disambiguatorPath, 'One of: ${decoders.keys.toList()}', jsonData);
       }
-      return decoders[disambiguator](jsonPath, jsonData);
+      var decoder = decoders[disambiguator];
+      if (decoder == null) {
+        throw mismatch(disambiguatorPath, 'Non-null decoder', jsonData);
+      }
+      return decoder(jsonPath, jsonData);
     } else {
       throw mismatch(jsonPath, 'Map', jsonData);
     }
@@ -379,11 +385,11 @@
 
   /// Create an exception to throw if the JSON object at [jsonPath] fails to
   /// match the API definition of [expected].
-  dynamic mismatch(String jsonPath, String expected, [Object actual]);
+  Object mismatch(String jsonPath, String expected, [Object? actual]);
 
   /// Create an exception to throw if the JSON object at [jsonPath] is missing
   /// the key [key].
-  dynamic missingKey(String jsonPath, String key);
+  Object missingKey(String jsonPath, String key);
 }
 
 /// JsonDecoder for decoding requests. Errors are reporting by throwing a
@@ -395,13 +401,13 @@
   RequestDecoder(this.request);
 
   @override
-  RefactoringKind get refactoringKind {
+  RefactoringKind? get refactoringKind {
     // Refactoring feedback objects should never appear in requests.
     return null;
   }
 
   @override
-  dynamic mismatch(String jsonPath, String expected, [Object actual]) {
+  Object mismatch(String jsonPath, String expected, [Object? actual]) {
     var buffer = StringBuffer();
     buffer.write('Expected to be ');
     buffer.write(expected);
@@ -415,7 +421,7 @@
   }
 
   @override
-  dynamic missingKey(String jsonPath, String key) {
+  Object missingKey(String jsonPath, String key) {
     return RequestFailure(RequestErrorFactory.invalidParameter(
         jsonPath, 'Expected to contain key ${json.encode(key)}'));
   }
@@ -431,12 +437,12 @@
 /// used only for testing. Errors are reported using bare [Exception] objects.
 class ResponseDecoder extends JsonDecoder {
   @override
-  final RefactoringKind refactoringKind;
+  final RefactoringKind? refactoringKind;
 
   ResponseDecoder(this.refactoringKind);
 
   @override
-  dynamic mismatch(String jsonPath, String expected, [Object actual]) {
+  Object mismatch(String jsonPath, String expected, [Object? actual]) {
     var buffer = StringBuffer();
     buffer.write('Expected ');
     buffer.write(expected);
@@ -451,7 +457,7 @@
   }
 
   @override
-  dynamic missingKey(String jsonPath, String key) {
+  Object missingKey(String jsonPath, String key) {
     return Exception('Missing key $key at $jsonPath');
   }
 }
diff --git a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart
index 58d3a20..eb1cded 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart
@@ -17,24 +17,23 @@
 
 /// A builder used to build a [SourceChange].
 class ChangeBuilderImpl implements ChangeBuilder {
-  /// The workspace in which the change builder should operate, or `null` if no
-  /// Dart files will be changed.
+  /// The workspace in which the change builder should operate.
   final ChangeWorkspace workspace;
 
   /// The end-of-line marker used in the file being edited, or `null` if the
   /// default marker should be used.
-  final String eol;
+  final String? eol;
 
   /// A table mapping group ids to the associated linked edit groups.
   final Map<String, LinkedEditGroup> _linkedEditGroups =
       <String, LinkedEditGroup>{};
 
   /// The source change selection or `null` if none.
-  Position _selection;
+  Position? _selection;
 
   /// The range of the selection for the change being built, or `null` if there
   /// is no selection.
-  SourceRange _selectionRange;
+  SourceRange? _selectionRange;
 
   /// The set of [Position]s that belong to the current [EditBuilderImpl] and
   /// should not be updated in result of inserting this builder.
@@ -50,12 +49,12 @@
   /// create changes for Dart files, then either a [session] or a [workspace]
   /// must be provided (but not both).
   ChangeBuilderImpl(
-      {AnalysisSession session, ChangeWorkspace workspace, this.eol})
+      {AnalysisSession? session, ChangeWorkspace? workspace, this.eol})
       : assert(session == null || workspace == null),
-        workspace = workspace ?? _SingleSessionWorkspace(session);
+        workspace = workspace ?? _SingleSessionWorkspace(session!);
 
   @override
-  SourceRange get selectionRange => _selectionRange;
+  SourceRange? get selectionRange => _selectionRange;
 
   @override
   SourceChange get sourceChange {
@@ -75,8 +74,9 @@
     _linkedEditGroups.forEach((String name, LinkedEditGroup group) {
       change.addLinkedEditGroup(group);
     });
-    if (_selection != null) {
-      change.selection = _selection;
+    var selection = _selection;
+    if (selection != null) {
+      change.selection = selection;
     }
     return change;
   }
@@ -84,14 +84,14 @@
   @override
   Future<void> addDartFileEdit(
       String path, void Function(DartFileEditBuilder builder) buildFileEdit,
-      {ImportPrefixGenerator importPrefixGenerator}) async {
+      {ImportPrefixGenerator? importPrefixGenerator}) async {
     if (_genericFileEditBuilders.containsKey(path)) {
       throw StateError("Can't create both a generic file edit and a dart file "
           'edit for the same file');
     }
     var builder = _dartFileEditBuilders[path];
     if (builder == null) {
-      builder = await createDartFileEditBuilder(path);
+      builder = await _createDartFileEditBuilder(path);
       if (builder != null) {
         _dartFileEditBuilders[path] = builder;
       }
@@ -102,13 +102,6 @@
     }
   }
 
-  @Deprecated('Use either addDartFileEdit or addGenericFileEdit')
-  @override
-  Future<void> addFileEdit(
-      String path, void Function(FileEditBuilder builder) buildFileEdit) async {
-    return addGenericFileEdit(path, buildFileEdit);
-  }
-
   @override
   Future<void> addGenericFileEdit(
       String path, void Function(FileEditBuilder builder) buildFileEdit) async {
@@ -118,14 +111,10 @@
     }
     var builder = _genericFileEditBuilders[path];
     if (builder == null) {
-      builder = await createGenericFileEditBuilder(path);
-      if (builder != null) {
-        _genericFileEditBuilders[path] = builder;
-      }
+      builder = FileEditBuilderImpl(this, path, 0);
+      _genericFileEditBuilders[path] = builder;
     }
-    if (builder != null) {
-      buildFileEdit(builder);
-    }
+    buildFileEdit(builder);
   }
 
   @override
@@ -134,7 +123,10 @@
     for (var entry in _linkedEditGroups.entries) {
       copy._linkedEditGroups[entry.key] = _copyLinkedEditGroup(entry.value);
     }
-    copy._selection = _copyPosition(_selection);
+    var selection = _selection;
+    if (selection != null) {
+      copy._selection = _copyPosition(selection);
+    }
     copy._selectionRange = _selectionRange;
     copy._lockedPositions.addAll(_lockedPositions);
     for (var entry in _genericFileEditBuilders.entries) {
@@ -165,50 +157,6 @@
     return copy;
   }
 
-  /// Create and return a [DartFileEditBuilder] that can be used to build edits
-  /// to the Dart file with the given [path].
-  Future<DartFileEditBuilderImpl> createDartFileEditBuilder(String path) async {
-    // TODO(brianwilkerson) Make this method private when
-    //  `DartChangeBuilderImpl` is removed.
-    if (workspace == null) {
-      throw StateError("Can't create a DartFileEditBuilder without providing "
-          'either a session or a workspace');
-    }
-    if (!workspace.containsFile(path)) {
-      return null;
-    }
-
-    var session = workspace.getSession(path);
-    var result = await session.getResolvedUnit(path);
-    var state = result?.state ?? ResultState.INVALID_FILE_TYPE;
-    if (state == ResultState.INVALID_FILE_TYPE) {
-      throw AnalysisException('Cannot analyze "$path"');
-    }
-    var timeStamp = state == ResultState.VALID ? 0 : -1;
-
-    var declaredUnit = result.unit.declaredElement;
-    var libraryUnit = declaredUnit.library.definingCompilationUnit;
-
-    DartFileEditBuilderImpl libraryEditBuilder;
-    if (libraryUnit != declaredUnit) {
-      // If the receiver is a part file builder, then proactively cache the
-      // library file builder so that imports can be finalized synchronously.
-      await addDartFileEdit(libraryUnit.source.fullName, (builder) {
-        libraryEditBuilder = builder as DartFileEditBuilderImpl;
-      });
-    }
-
-    return DartFileEditBuilderImpl(this, result, timeStamp, libraryEditBuilder);
-  }
-
-  /// Create and return a [FileEditBuilder] that can be used to build edits to
-  /// the file with the given [path].
-  Future<FileEditBuilderImpl> createGenericFileEditBuilder(String path) async {
-    // TODO(brianwilkerson) Make this method private when
-    //  `DartChangeBuilderImpl` is removed.
-    return FileEditBuilderImpl(this, path, 0);
-  }
-
   /// Return the linked edit group with the given [groupName], creating it if it
   /// did not already exist.
   LinkedEditGroup getLinkedEditGroup(String groupName) {
@@ -233,7 +181,38 @@
 
   /// Return a copy of the [position].
   Position _copyPosition(Position position) {
-    return position == null ? null : Position(position.file, position.offset);
+    return Position(position.file, position.offset);
+  }
+
+  /// Create and return a [DartFileEditBuilder] that can be used to build edits
+  /// to the Dart file with the given [path].
+  Future<DartFileEditBuilderImpl?> _createDartFileEditBuilder(
+      String? path) async {
+    if (path == null || !(workspace.containsFile(path) ?? false)) {
+      return null;
+    }
+
+    var session = workspace.getSession(path);
+    var result = await session?.getResolvedUnit(path);
+    var state = result?.state ?? ResultState.INVALID_FILE_TYPE;
+    if (state == ResultState.INVALID_FILE_TYPE) {
+      throw AnalysisException('Cannot analyze "$path"');
+    }
+    var timeStamp = state == ResultState.VALID ? 0 : -1;
+
+    var declaredUnit = result!.unit?.declaredElement;
+    var libraryUnit = declaredUnit?.library.definingCompilationUnit;
+
+    DartFileEditBuilderImpl? libraryEditBuilder;
+    if (libraryUnit != null && libraryUnit != declaredUnit) {
+      // If the receiver is a part file builder, then proactively cache the
+      // library file builder so that imports can be finalized synchronously.
+      await addDartFileEdit(libraryUnit.source.fullName, (builder) {
+        libraryEditBuilder = builder as DartFileEditBuilderImpl;
+      });
+    }
+
+    return DartFileEditBuilderImpl(this, result, timeStamp, libraryEditBuilder);
   }
 
   void _setSelectionRange(SourceRange range) {
@@ -255,8 +234,9 @@
         _updatePosition(position);
       }
     }
-    if (_selection != null) {
-      _updatePosition(_selection);
+    var selection = _selection;
+    if (selection != null) {
+      _updatePosition(selection);
     }
   }
 }
@@ -275,11 +255,11 @@
 
   /// The range of the selection for the change being built, or `null` if the
   /// selection is not inside the change being built.
-  SourceRange _selectionRange;
+  SourceRange? _selectionRange;
 
   /// The end-of-line marker used in the file being edited, or `null` if the
   /// default marker should be used.
-  String _eol;
+  String? _eol;
 
   /// The buffer in which the content of the edit is being composed.
   final StringBuffer _buffer = StringBuffer();
@@ -317,7 +297,7 @@
 
   @override
   void addSimpleLinkedEdit(String groupName, String text,
-      {LinkedEditSuggestionKind kind, List<String> suggestions}) {
+      {LinkedEditSuggestionKind? kind, List<String>? suggestions}) {
     addLinkedEdit(groupName, (LinkedEditBuilder builder) {
       builder.write(text);
       if (kind != null && suggestions != null) {
@@ -354,7 +334,7 @@
   }
 
   @override
-  void writeln([String string]) {
+  void writeln([String? string]) {
     if (string != null) {
       _buffer.write(string);
     }
@@ -561,7 +541,7 @@
   }
 
   @override
-  void writeln([String string]) {
+  void writeln([String? string]) {
     editBuilder.writeln(string);
   }
 }
@@ -573,14 +553,14 @@
   _SingleSessionWorkspace(this.session);
 
   @override
-  bool containsFile(String path) {
+  bool? containsFile(String path) {
     var analysisContext = session.analysisContext;
     return analysisContext.contextRoot.isAnalyzed(path);
   }
 
   @override
-  AnalysisSession getSession(String path) {
-    if (containsFile(path)) {
+  AnalysisSession? getSession(String path) {
+    if (containsFile(path) ?? false) {
       return session;
     }
     throw StateError('Not in a context root: $path');
diff --git a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
index 6f0ab75..443c711 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
@@ -4,7 +4,6 @@
 
 import 'package:analyzer/dart/analysis/features.dart';
 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/dart/element/element.dart';
@@ -21,38 +20,8 @@
 import 'package:analyzer_plugin/src/utilities/string_utilities.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
-import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
 import 'package:dart_style/dart_style.dart';
-import 'package:meta/meta.dart';
-
-/// A [ChangeBuilder] used to build changes in Dart files.
-@Deprecated('Use ChangeBuilder')
-class DartChangeBuilderImpl extends ChangeBuilderImpl
-    implements DartChangeBuilder {
-  /// Initialize a newly created change builder.
-  @Deprecated('Use ChangeBuilder(session: session)')
-  DartChangeBuilderImpl(AnalysisSession session) : super(session: session);
-
-  @Deprecated('Use ChangeBuilder(workspace: workspace)')
-  DartChangeBuilderImpl.forWorkspace(ChangeWorkspace workspace)
-      : super(workspace: workspace);
-
-  @Deprecated('Use ChangeBuilder.addDartFileEdit')
-  @override
-  Future<void> addFileEdit(
-      String path, void Function(DartFileEditBuilder builder) buildFileEdit,
-      {ImportPrefixGenerator importPrefixGenerator}) {
-    return super.addDartFileEdit(path, buildFileEdit,
-        importPrefixGenerator: importPrefixGenerator);
-  }
-
-  @override
-  Future<DartFileEditBuilderImpl> createGenericFileEditBuilder(
-      String path) async {
-    return super.createDartFileEditBuilder(path);
-  }
-}
 
 /// An [EditBuilder] used to build edits in Dart files.
 class DartEditBuilderImpl extends EditBuilderImpl implements DartEditBuilder {
@@ -64,14 +33,14 @@
 
   /// The enclosing class element, possibly `null`.
   /// This field is lazily initialized in [_initializeEnclosingElements].
-  ClassElement _enclosingClass;
+  ClassElement? _enclosingClass;
 
   /// The enclosing executable element, possibly `null`.
   /// This field is lazily initialized in [_initializeEnclosingElements].
-  ExecutableElement _enclosingExecutable;
+  ExecutableElement? _enclosingExecutable;
 
   /// If not `null`, [write] will copy everything into this buffer.
-  StringBuffer _carbonCopyBuffer;
+  StringBuffer? _carbonCopyBuffer;
 
   /// Initialize a newly created builder to build a source edit.
   DartEditBuilderImpl(
@@ -103,13 +72,13 @@
 
   @override
   void writeClassDeclaration(String name,
-      {Iterable<DartType> interfaces,
+      {Iterable<DartType>? interfaces,
       bool isAbstract = false,
-      void Function() membersWriter,
-      Iterable<DartType> mixins,
-      String nameGroupName,
-      DartType superclass,
-      String superclassGroupName}) {
+      void Function()? membersWriter,
+      Iterable<DartType>? mixins,
+      String? nameGroupName,
+      DartType? superclass,
+      String? superclassGroupName}) {
     // TODO(brianwilkerson) Add support for type parameters, probably as a
     // parameterWriter parameter.
     if (isAbstract) {
@@ -141,15 +110,15 @@
 
   @override
   void writeConstructorDeclaration(String className,
-      {ArgumentList argumentList,
-      void Function() bodyWriter,
-      String classNameGroupName,
-      SimpleIdentifier constructorName,
-      String constructorNameGroupName,
-      List<String> fieldNames,
-      void Function() initializerWriter,
+      {ArgumentList? argumentList,
+      void Function()? bodyWriter,
+      String? classNameGroupName,
+      SimpleIdentifier? constructorName,
+      String? constructorNameGroupName,
+      List<String>? fieldNames,
+      void Function()? initializerWriter,
       bool isConst = false,
-      void Function() parameterWriter}) {
+      void Function()? parameterWriter}) {
     if (isConst) {
       write(Keyword.CONST.lexeme);
       write(' ');
@@ -197,13 +166,13 @@
 
   @override
   void writeFieldDeclaration(String name,
-      {void Function() initializerWriter,
+      {void Function()? initializerWriter,
       bool isConst = false,
       bool isFinal = false,
       bool isStatic = false,
-      String nameGroupName,
-      DartType type,
-      String typeGroupName}) {
+      String? nameGroupName,
+      DartType? type,
+      String? typeGroupName}) {
     if (isStatic) {
       write(Keyword.STATIC.lexeme);
       write(' ');
@@ -239,12 +208,12 @@
 
   @override
   void writeFunctionDeclaration(String name,
-      {void Function() bodyWriter,
+      {void Function()? bodyWriter,
       bool isStatic = false,
-      String nameGroupName,
-      void Function() parameterWriter,
-      DartType returnType,
-      String returnTypeGroupName}) {
+      String? nameGroupName,
+      void Function()? parameterWriter,
+      DartType? returnType,
+      String? returnTypeGroupName}) {
     if (isStatic) {
       write(Keyword.STATIC.lexeme);
       write(' ');
@@ -278,11 +247,11 @@
 
   @override
   void writeGetterDeclaration(String name,
-      {void Function() bodyWriter,
+      {void Function()? bodyWriter,
       bool isStatic = false,
-      String nameGroupName,
-      DartType returnType,
-      String returnTypeGroupName}) {
+      String? nameGroupName,
+      DartType? returnType,
+      String? returnTypeGroupName}) {
     if (isStatic) {
       write(Keyword.STATIC.lexeme);
       write(' ');
@@ -317,13 +286,15 @@
     var import = _getBestImportForName(imports, name);
     if (import == null) {
       var library = dartFileEditBuilder._importLibrary(uris[0]);
-      if (library.prefix != null) {
-        write(library.prefix);
+      var prefix = library.prefix;
+      if (prefix != null) {
+        write(prefix);
         write('.');
       }
     } else {
-      if (import.prefix != null) {
-        write(import.prefix.displayName);
+      var prefix = import.prefix;
+      if (prefix != null) {
+        write(prefix.displayName);
         write('.');
       }
     }
@@ -332,12 +303,12 @@
 
   @override
   void writeLocalVariableDeclaration(String name,
-      {void Function() initializerWriter,
+      {void Function()? initializerWriter,
       bool isConst = false,
       bool isFinal = false,
-      String nameGroupName,
-      DartType type,
-      String typeGroupName}) {
+      String? nameGroupName,
+      DartType? type,
+      String? typeGroupName}) {
     var typeRequired = true;
     if (isConst) {
       write(Keyword.CONST.lexeme);
@@ -370,10 +341,10 @@
 
   @override
   void writeMixinDeclaration(String name,
-      {Iterable<DartType> interfaces,
-      void Function() membersWriter,
-      String nameGroupName,
-      Iterable<DartType> superclassConstraints}) {
+      {Iterable<DartType>? interfaces,
+      void Function()? membersWriter,
+      String? nameGroupName,
+      Iterable<DartType>? superclassConstraints}) {
     // TODO(brianwilkerson) Add support for type parameters, probably as a
     // parameterWriter parameter.
     write('mixin ');
@@ -394,8 +365,8 @@
   @override
   void writeOverride(
     ExecutableElement element, {
-    StringBuffer displayTextBuffer,
-    String returnTypeGroupName,
+    StringBuffer? displayTextBuffer,
+    String? returnTypeGroupName,
     bool invokeSuper = false,
   }) {
     void withCarbonCopyBuffer(Function() f) {
@@ -536,13 +507,13 @@
   void writeParameter(String name,
       {bool isCovariant = false,
       bool isRequiredNamed = false,
-      ExecutableElement methodBeingCopied,
-      String nameGroupName,
-      DartType type,
-      String typeGroupName}) {
+      ExecutableElement? methodBeingCopied,
+      String? nameGroupName,
+      DartType? type,
+      String? typeGroupName}) {
     bool writeType() {
       if (typeGroupName != null) {
-        bool hasType;
+        late bool hasType;
         addLinkedEdit(typeGroupName, (DartLinkedEditBuilder builder) {
           hasType = _writeType(type, methodBeingCopied: methodBeingCopied);
           builder.addSuperTypesAsSuggestions(type);
@@ -619,7 +590,7 @@
 
   @override
   void writeParameters(Iterable<ParameterElement> parameters,
-      {ExecutableElement methodBeingCopied}) {
+      {ExecutableElement? methodBeingCopied}) {
     var parameterNames = <String>{};
     for (var i = 0; i < parameters.length; i++) {
       var name = parameters.elementAt(i).name;
@@ -713,11 +684,11 @@
 
   @override
   void writeSetterDeclaration(String name,
-      {void Function() bodyWriter,
+      {void Function()? bodyWriter,
       bool isStatic = false,
-      String nameGroupName,
-      DartType parameterType,
-      String parameterTypeGroupName}) {
+      String? nameGroupName,
+      DartType? parameterType,
+      String? parameterTypeGroupName}) {
     if (isStatic) {
       write(Keyword.STATIC.lexeme);
       write(' ');
@@ -747,10 +718,10 @@
   }
 
   @override
-  bool writeType(DartType type,
+  bool writeType(DartType? type,
       {bool addSupertypeProposals = false,
-      String groupName,
-      ExecutableElement methodBeingCopied,
+      String? groupName,
+      ExecutableElement? methodBeingCopied,
       bool required = false}) {
     var wroteType = false;
     if (type != null && !type.isDynamic) {
@@ -774,7 +745,7 @@
 
   @override
   void writeTypeParameter(TypeParameterElement typeParameter,
-      {ExecutableElement methodBeingCopied}) {
+      {ExecutableElement? methodBeingCopied}) {
     write(typeParameter.name);
     if (typeParameter.bound != null) {
       write(' extends ');
@@ -784,7 +755,7 @@
 
   @override
   void writeTypeParameters(List<TypeParameterElement> typeParameters,
-      {ExecutableElement methodBeingCopied}) {
+      {ExecutableElement? methodBeingCopied}) {
     if (typeParameters.isNotEmpty) {
       write('<');
       var isFirst = true;
@@ -800,7 +771,7 @@
   }
 
   @override
-  void writeTypes(Iterable<DartType> types, {String prefix}) {
+  void writeTypes(Iterable<DartType>? types, {String? prefix}) {
     if (types == null || types.isEmpty) {
       return;
     }
@@ -854,7 +825,7 @@
   }
 
   void _addSuperTypeProposals(
-      LinkedEditBuilder builder, DartType type, Set<DartType> alreadyAdded) {
+      LinkedEditBuilder builder, DartType? type, Set<DartType> alreadyAdded) {
     if (type is InterfaceType && alreadyAdded.add(type)) {
       builder.addSuggestion(
         LinkedEditSuggestionKind.TYPE,
@@ -879,7 +850,7 @@
     return name;
   }
 
-  String _getBaseNameFromExpression(Expression expression) {
+  String? _getBaseNameFromExpression(Expression expression) {
     if (expression is AsExpression) {
       return _getBaseNameFromExpression(expression.expression);
     } else if (expression is ParenthesizedExpression) {
@@ -888,7 +859,7 @@
     return _getBaseNameFromUnwrappedExpression(expression);
   }
 
-  String _getBaseNameFromLocationInParent(Expression expression) {
+  String? _getBaseNameFromLocationInParent(Expression expression) {
     // value in named expression
     if (expression.parent is NamedExpression) {
       var namedExpression = expression.parent as NamedExpression;
@@ -906,8 +877,8 @@
     return null;
   }
 
-  String _getBaseNameFromUnwrappedExpression(Expression expression) {
-    String name;
+  String? _getBaseNameFromUnwrappedExpression(Expression expression) {
+    String? name;
     // analyze expressions
     if (expression is SimpleIdentifier) {
       return expression.name;
@@ -920,22 +891,20 @@
     } else if (expression is InstanceCreationExpression) {
       var constructorName = expression.constructorName;
       var typeName = constructorName.type;
-      if (typeName != null) {
-        var typeNameIdentifier = typeName.name;
-        // new ClassName()
-        if (typeNameIdentifier is SimpleIdentifier) {
-          return typeNameIdentifier.name;
+      var typeNameIdentifier = typeName.name;
+      // new ClassName()
+      if (typeNameIdentifier is SimpleIdentifier) {
+        return typeNameIdentifier.name;
+      }
+      // new prefix.name();
+      if (typeNameIdentifier is PrefixedIdentifier) {
+        var prefixed = typeNameIdentifier;
+        // new prefix.ClassName()
+        if (prefixed.prefix.staticElement is PrefixElement) {
+          return prefixed.identifier.name;
         }
-        // new prefix.name();
-        if (typeNameIdentifier is PrefixedIdentifier) {
-          var prefixed = typeNameIdentifier;
-          // new prefix.ClassName()
-          if (prefixed.prefix.staticElement is PrefixElement) {
-            return prefixed.identifier.name;
-          }
-          // new ClassName.constructorName()
-          return prefixed.prefix.name;
-        }
+        // new ClassName.constructorName()
+        return prefixed.prefix.name;
       }
     } else if (expression is IndexExpression) {
       name = _getBaseNameFromExpression(expression.realTarget);
@@ -966,7 +935,7 @@
 
   /// Given a list of [imports] that do, or can, make the [name] visible in
   /// scope, return the one that will lead to the cleanest code.
-  ImportElement _getBestImportForName(
+  ImportElement? _getBestImportForName(
       List<ImportElement> imports, String name) {
     if (imports.isEmpty) {
       return null;
@@ -992,7 +961,7 @@
   }
 
   /// Returns all variants of names by removing leading words one by one.
-  List<String> _getCamelWordCombinations(String name) {
+  List<String> _getCamelWordCombinations(String? name) {
     var result = <String>[];
     var parts = getCamelWords(name);
     for (var i = 0; i < parts.length; i++) {
@@ -1023,8 +992,8 @@
 
   /// Returns possible names for a variable with the given expected type and
   /// expression assigned.
-  List<String> _getVariableNameSuggestionsForExpression(DartType expectedType,
-      Expression assignedExpression, Set<String> excluded) {
+  List<String> _getVariableNameSuggestionsForExpression(DartType? expectedType,
+      Expression? assignedExpression, Set<String> excluded) {
     var res = <String>{};
     // use expression
     if (assignedExpression != null) {
@@ -1059,8 +1028,8 @@
   /// [_enclosingClass], or if there is a local equivalent to the type (such as
   /// in the case of a type parameter from a superclass), then return the type
   /// that is locally visible. Otherwise, return `null`.
-  DartType _getVisibleType(DartType type,
-      {ExecutableElement methodBeingCopied}) {
+  DartType? _getVisibleType(DartType? type,
+      {ExecutableElement? methodBeingCopied}) {
     if (type is InterfaceType) {
       var element = type.element;
       if (element.isPrivate &&
@@ -1075,7 +1044,7 @@
       var enclosing = element.enclosingElement;
       while (enclosing is GenericFunctionTypeElement ||
           enclosing is ParameterElement) {
-        enclosing = enclosing.enclosingElement;
+        enclosing = enclosing!.enclosingElement;
       }
       if (enclosing == _enclosingExecutable ||
           enclosing == _enclosingClass ||
@@ -1119,16 +1088,20 @@
 
     var import = dartFileEditBuilder._getImportElement(element);
     if (import != null) {
-      if (import.prefix != null) {
-        write(import.prefix.displayName);
+      var prefix = import.prefix;
+      if (prefix != null) {
+        write(prefix.displayName);
         write('.');
       }
     } else {
-      var library = element.library.source.uri;
-      var import = dartFileEditBuilder._importLibrary(library);
-      if (import.prefix != null) {
-        write(import.prefix);
-        write('.');
+      var library = element.library?.source.uri;
+      if (library != null) {
+        var import = dartFileEditBuilder._importLibrary(library);
+        var prefix = import.prefix;
+        if (prefix != null) {
+          write(prefix);
+          write('.');
+        }
       }
     }
   }
@@ -1158,8 +1131,8 @@
   ///
   /// Causes any libraries whose elements are used by the generated code, to be
   /// imported.
-  bool _writeType(DartType type,
-      {ExecutableElement methodBeingCopied, bool required = false}) {
+  bool _writeType(DartType? type,
+      {ExecutableElement? methodBeingCopied, bool required = false}) {
     type = _getVisibleType(type, methodBeingCopied: methodBeingCopied);
 
     // If not a useful type, don't write it.
@@ -1183,10 +1156,11 @@
     }
 
     var aliasElement = type.aliasElement;
-    if (aliasElement != null) {
+    var aliasArguments = type.aliasArguments;
+    if (aliasElement != null && aliasArguments != null) {
       _writeTypeElementArguments(
         element: aliasElement,
-        typeArguments: type.aliasArguments,
+        typeArguments: aliasArguments,
         methodBeingCopied: methodBeingCopied,
       );
       _writeTypeNullability(type);
@@ -1235,9 +1209,9 @@
   }
 
   void _writeTypeElementArguments({
-    @required Element element,
-    @required List<DartType> typeArguments,
-    @required ExecutableElement methodBeingCopied,
+    required Element element,
+    required List<DartType> typeArguments,
+    required ExecutableElement? methodBeingCopied,
   }) {
     // Ensure that the element is imported.
     _writeLibraryReference(element);
@@ -1288,10 +1262,10 @@
 
   /// The change builder for the library
   /// or `null` if the receiver is the builder for the library.
-  final DartFileEditBuilderImpl libraryChangeBuilder;
+  final DartFileEditBuilderImpl? libraryChangeBuilder;
 
   /// The optional generator of prefixes for new imports.
-  ImportPrefixGenerator importPrefixGenerator;
+  ImportPrefixGenerator? importPrefixGenerator;
 
   /// A mapping from libraries that need to be imported in order to make visible
   /// the names used in generated code, to information about these imports.
@@ -1307,7 +1281,7 @@
   /// the given [resolvedUnit] and [timeStamp].
   DartFileEditBuilderImpl(ChangeBuilderImpl changeBuilder, this.resolvedUnit,
       int timeStamp, this.libraryChangeBuilder)
-      : super(changeBuilder, resolvedUnit.path, timeStamp);
+      : super(changeBuilder, resolvedUnit.path!, timeStamp);
 
   @override
   bool get hasEdits =>
@@ -1329,8 +1303,8 @@
 
   @override
   void convertFunctionFromSyncToAsync(
-      FunctionBody body, TypeProvider typeProvider) {
-    if (body == null && body.keyword != null) {
+      FunctionBody? body, TypeProvider typeProvider) {
+    if (body == null || body.keyword != null) {
       throw ArgumentError(
           'The function must have a synchronous, non-generator body.');
     }
@@ -1379,7 +1353,7 @@
 
   @override
   void format(SourceRange range) {
-    var newContent = resolvedUnit.content;
+    var newContent = resolvedUnit.content!;
     var newRangeOffset = range.offset;
     var newRangeLength = range.length;
     for (var edit in fileEdit.edits) {
@@ -1434,13 +1408,13 @@
     return ImportLibraryElementResultImpl(null);
   }
 
-  String importLibraryWithRelativeUri(String uriText, [String prefix]) {
+  String importLibraryWithRelativeUri(String uriText, [String? prefix]) {
     return _importLibraryWithRelativeUri(uriText, prefix).uriText;
   }
 
   @override
   void replaceTypeWithFuture(
-      TypeAnnotation typeAnnotation, TypeProvider typeProvider) {
+      TypeAnnotation? typeAnnotation, TypeProvider typeProvider) {
     //
     // Check whether the type needs to be replaced.
     //
@@ -1449,7 +1423,7 @@
       return;
     }
 
-    addReplacement(range.node(typeAnnotation), (EditBuilder builder) {
+    addReplacement(range.node(typeAnnotation!), (EditBuilder builder) {
       var futureType = typeProvider.futureType(type);
       if (!(builder as DartEditBuilder).writeType(futureType)) {
         builder.write('void');
@@ -1460,10 +1434,11 @@
   /// Adds edits ensure that all the [imports] are imported into the library.
   void _addLibraryImports(Iterable<_LibraryToImport> imports) {
     // Prepare information about existing imports.
-    LibraryDirective libraryDirective;
+    LibraryDirective? libraryDirective;
     var importDirectives = <ImportDirective>[];
-    PartDirective partDirective;
-    for (var directive in resolvedUnit.unit.directives) {
+    PartDirective? partDirective;
+    var unit = resolvedUnit.unit!;
+    for (var directive in unit.directives) {
       if (directive is LibraryDirective) {
         libraryDirective = directive;
       } else if (directive is ImportDirective) {
@@ -1481,9 +1456,10 @@
       builder.write("import '");
       builder.write(import.uriText);
       builder.write("'");
-      if (import.prefix != null) {
+      var prefix = import.prefix;
+      if (prefix != null) {
         builder.write(' as ');
-        builder.write(import.prefix);
+        builder.write(prefix);
       }
       builder.write(';');
     }
@@ -1496,14 +1472,14 @@
         var inserted = false;
 
         void insert(
-            {ImportDirective prev,
-            ImportDirective next,
+            {ImportDirective? prev,
+            required ImportDirective next,
             bool trailingNewLine = false}) {
           var lineInfo = resolvedUnit.lineInfo;
           if (prev != null) {
             var offset = prev.end;
             var line = lineInfo.getLocation(offset).lineNumber;
-            Token comment = prev.endToken.next.precedingComments;
+            Token? comment = prev.endToken.next?.precedingComments;
             while (comment != null) {
               if (lineInfo.getLocation(comment.offset).lineNumber == line) {
                 offset = comment.end;
@@ -1534,9 +1510,9 @@
           inserted = true;
         }
 
-        ImportDirective lastExisting;
-        ImportDirective lastExistingDart;
-        ImportDirective lastExistingPackage;
+        ImportDirective? lastExisting;
+        ImportDirective? lastExistingDart;
+        ImportDirective? lastExistingPackage;
         var isLastExistingDart = false;
         var isLastExistingPackage = false;
         for (var existingImport in importDirectives) {
@@ -1581,7 +1557,7 @@
           isLastExistingPackage = isExistingPackage;
         }
         if (!inserted) {
-          addInsertion(lastExisting.end, (EditBuilder builder) {
+          addInsertion(lastExisting!.end, (EditBuilder builder) {
             if (isPackage) {
               if (isLastExistingDart) {
                 builder.writeln();
@@ -1631,11 +1607,11 @@
     // If still at the beginning of the file, add before the first declaration.
     int offset;
     var insertEmptyLineAfter = false;
-    if (resolvedUnit.unit.declarations.isNotEmpty) {
-      offset = resolvedUnit.unit.declarations.first.offset;
+    if (unit.declarations.isNotEmpty) {
+      offset = unit.declarations.first.offset;
       insertEmptyLineAfter = true;
     } else {
-      offset = resolvedUnit.unit.end;
+      offset = unit.end;
     }
     addInsertion(offset, (EditBuilder builder) {
       for (var i = 0; i < importList.length; i++) {
@@ -1652,7 +1628,7 @@
   /// Return the import element used to import the given [element] into the
   /// target library, or `null` if the element was not imported, such as when
   /// the element is declared in the same library.
-  ImportElement _getImportElement(Element element) {
+  ImportElement? _getImportElement(Element element) {
     for (var import in resolvedUnit.libraryElement.imports) {
       var definedNames = import.namespace.definedNames;
       if (definedNames.containsValue(element)) {
@@ -1664,7 +1640,7 @@
 
   Iterable<ImportElement> _getImportsForUri(Uri uri) sync* {
     for (var import in resolvedUnit.libraryElement.imports) {
-      var importUri = import.importedLibrary.source.uri;
+      var importUri = import.importedLibrary?.source.uri;
       if (importUri == uri) {
         yield import;
       }
@@ -1690,7 +1666,7 @@
     if (import == null) {
       var uriText = _getLibraryUriText(uri);
       var prefix =
-          importPrefixGenerator != null ? importPrefixGenerator(uri) : null;
+          importPrefixGenerator != null ? importPrefixGenerator!(uri) : null;
       import = _LibraryToImport(uriText, prefix);
       (libraryChangeBuilder ?? this).librariesToImport[uri] = import;
     }
@@ -1700,7 +1676,7 @@
   /// Arrange to have an import added for the library with the given relative
   /// [uriText].
   _LibraryToImport _importLibraryWithRelativeUri(String uriText,
-      [String prefix]) {
+      [String? prefix]) {
     var import = librariesToRelativelyImport[uriText];
     if (import == null) {
       import = _LibraryToImport(uriText, prefix);
@@ -1718,7 +1694,7 @@
   /// containing the given [node] with the type `Future`. The [typeProvider] is
   /// used to check the current return type, because if it is already `Future`
   /// no edit will be added.
-  void _replaceReturnTypeWithFuture(AstNode node, TypeProvider typeProvider) {
+  void _replaceReturnTypeWithFuture(AstNode? node, TypeProvider typeProvider) {
     while (node != null) {
       node = node.parent;
       if (node is FunctionDeclaration) {
@@ -1736,7 +1712,7 @@
   }
 
   static bool _isFusedWithPreviousToken(Token token) {
-    return token.previous.end == token.offset;
+    return token.previous?.end == token.offset;
   }
 }
 
@@ -1749,13 +1725,13 @@
   DartLinkedEditBuilderImpl(EditBuilderImpl editBuilder) : super(editBuilder);
 
   @override
-  void addSuperTypesAsSuggestions(DartType type) {
+  void addSuperTypesAsSuggestions(DartType? type) {
     _addSuperTypesAsSuggestions(type, <DartType>{});
   }
 
   /// Safely implement [addSuperTypesAsSuggestions] by using the set of
   /// [alreadyAdded] types to prevent infinite loops.
-  void _addSuperTypesAsSuggestions(DartType type, Set<DartType> alreadyAdded) {
+  void _addSuperTypesAsSuggestions(DartType? type, Set<DartType> alreadyAdded) {
     if (type is InterfaceType && alreadyAdded.add(type)) {
       addSuggestion(
         LinkedEditSuggestionKind.TYPE,
@@ -1772,18 +1748,18 @@
 /// Information about a library to import.
 class ImportLibraryElementResultImpl implements ImportLibraryElementResult {
   @override
-  final String prefix;
+  final String? prefix;
 
   ImportLibraryElementResultImpl(this.prefix);
 }
 
 class _EnclosingElementFinder {
-  ClassElement enclosingClass;
-  ExecutableElement enclosingExecutable;
+  ClassElement? enclosingClass;
+  ExecutableElement? enclosingExecutable;
 
   _EnclosingElementFinder();
 
-  void find(AstNode target, int offset) {
+  void find(AstNode? target, int offset) {
     var node = NodeLocator2(offset).searchWithin(target);
     while (node != null) {
       if (node is ClassDeclaration) {
@@ -1803,7 +1779,7 @@
 /// Information about a new library to import.
 class _LibraryToImport {
   final String uriText;
-  final String prefix;
+  final String? prefix;
 
   _LibraryToImport(this.uriText, this.prefix);
 
diff --git a/pkg/analyzer_plugin/lib/src/utilities/completion/completion_core.dart b/pkg/analyzer_plugin/lib/src/utilities/completion/completion_core.dart
index a2e052a..b0e6bdc 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/completion/completion_core.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/completion/completion_core.dart
@@ -11,11 +11,11 @@
 class CompletionCollectorImpl implements CompletionCollector {
   /// The length of the region of text that should be replaced by the selected
   /// completion suggestion.
-  int _length;
+  int? _length;
 
   /// The offset of the region of text that should be replaced by the selected
   /// completion suggestion.
-  int _offset;
+  int? _offset;
 
   /// A list of the completion suggestions that have been collected.
   List<CompletionSuggestion> suggestions = <CompletionSuggestion>[];
@@ -25,10 +25,10 @@
 
   /// Return the length of the region of text that should be replaced by the
   /// selected completion suggestion, or `null` if the length has not been set.
-  int get length => _length;
+  int? get length => _length;
 
   @override
-  set length(int length) {
+  set length(int? length) {
     if (_length != null) {
       throw StateError('The length can only be set once');
     }
@@ -37,10 +37,10 @@
 
   /// Return the offset of the region of text that should be replaced by the
   /// selected completion suggestion, or `null` if the offset has not been set.
-  int get offset => _offset;
+  int? get offset => _offset;
 
   @override
-  set offset(int length) {
+  set offset(int? length) {
     if (_offset != null) {
       throw StateError('The offset can only be set once');
     }
diff --git a/pkg/analyzer_plugin/lib/src/utilities/completion/completion_target.dart b/pkg/analyzer_plugin/lib/src/utilities/completion/completion_target.dart
index 0b47a56..4781140 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/completion/completion_target.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/completion/completion_target.dart
@@ -86,7 +86,7 @@
   /// or keyword that is part of the token stream, but that the parser has
   /// skipped and not reported in to the parser listeners, meaning that it is
   /// not part of the AST.
-  Token droppedToken;
+  Token? droppedToken;
 
   /// The entity which the completed text will replace (or which will be
   /// displaced once the completed text is inserted). This may be an AstNode or
@@ -97,7 +97,7 @@
   /// possible). However, there is one exception: when the cursor is inside of
   /// a multi-character token which is not a keyword or identifier (e.g. a
   /// comment, or a token like "+=", the entity will be always be the token.
-  final SyntacticEntity entity;
+  final SyntacticEntity? entity;
 
   /// The [entity] is a comment token, which is either not a documentation
   /// comment or the position is not in a [CommentReference].
@@ -105,21 +105,21 @@
 
   /// If the target is an argument in an [ArgumentList], then this is the index
   /// of the argument in the list, otherwise this is `null`.
-  final int argIndex;
+  final int? argIndex;
 
   /// If the target is an argument in an [ArgumentList], then this is the
   /// invoked [ExecutableElement], otherwise this is `null`.
-  ExecutableElement _executableElement;
+  ExecutableElement? _executableElement;
 
   /// If the target is in an argument list of a [FunctionExpressionInvocation],
   /// then this is the static type of the function being invoked, otherwise this
   /// is `null`.
-  FunctionType _functionType;
+  FunctionType? _functionType;
 
   /// If the target is an argument in an [ArgumentList], then this is the
   /// corresponding [ParameterElement] in the invoked [ExecutableElement],
   /// otherwise this is `null`.
-  ParameterElement _parameterElement;
+  ParameterElement? _parameterElement;
 
   /// Compute the appropriate [CompletionTarget] for the given [offset] within
   /// the [compilationUnit].
@@ -129,7 +129,7 @@
   /// [compilationUnit] such as dart expressions within angular templates.
   factory CompletionTarget.forOffset(
       CompilationUnit compilationUnit, int offset,
-      {AstNode entryPoint}) {
+      {AstNode? entryPoint}) {
     // The precise algorithm is as follows. We perform a depth-first search of
     // all edges in the parse tree (both those that point to AST nodes and
     // those that point to tokens), visiting parents before children. The
@@ -151,7 +151,7 @@
       if (containingNode is Comment) {
         // Comments are handled specially: we descend into any CommentReference
         // child node that contains the cursor offset.
-        var comment = containingNode as Comment;
+        var comment = containingNode;
         for (var commentReference in comment.references) {
           if (commentReference.offset <= offset &&
               offset <= commentReference.end) {
@@ -245,7 +245,7 @@
   /// Create a [CompletionTarget] holding the given [containingNode] and
   /// [entity].
   CompletionTarget._(this.unit, this.offset, AstNode containingNode,
-      SyntacticEntity entity, this.isCommentText)
+      SyntacticEntity? entity, this.isCommentText)
       : containingNode = containingNode,
         entity = entity,
         argIndex = _computeArgIndex(containingNode, entity),
@@ -253,9 +253,9 @@
 
   /// If the target is an argument in an argument list, and the invocation is
   /// resolved, return the invoked [ExecutableElement].
-  ExecutableElement get executableElement {
+  ExecutableElement? get executableElement {
     if (_executableElement == null) {
-      var argumentList = containingNode;
+      AstNode? argumentList = containingNode;
       if (argumentList is NamedExpression) {
         argumentList = argumentList.parent;
       }
@@ -265,7 +265,7 @@
 
       var invocation = argumentList.parent;
 
-      Element executable;
+      Element? executable;
       if (invocation is Annotation) {
         executable = invocation.element;
       } else if (invocation is InstanceCreationExpression) {
@@ -286,9 +286,9 @@
   /// If the target is in an argument list of a [FunctionExpressionInvocation],
   /// then this is the static type of the function being invoked, otherwise this
   /// is `null`.
-  FunctionType get functionType {
+  FunctionType? get functionType {
     if (_functionType == null) {
-      var argumentList = containingNode;
+      AstNode? argumentList = containingNode;
       if (argumentList is NamedExpression) {
         argumentList = argumentList.parent;
       }
@@ -319,14 +319,17 @@
       return node.isCascaded && offset > node.operator.offset + 1;
     }
     if (node is MethodInvocation) {
-      return node.isCascaded && offset > node.operator.offset + 1;
+      var operator = node.operator;
+      if (operator != null) {
+        return node.isCascaded && offset > operator.offset + 1;
+      }
     }
     return false;
   }
 
   /// If the target is an argument in an argument list, and the invocation is
   /// resolved, return the corresponding [ParameterElement].
-  ParameterElement get parameterElement {
+  ParameterElement? get parameterElement {
     if (_parameterElement == null) {
       var executable = executableElement;
       if (executable != null) {
@@ -345,7 +348,7 @@
         token.type.isKeyword || token.type == TokenType.IDENTIFIER;
 
     var token = droppedToken ??
-        (entity is AstNode ? (entity as AstNode).beginToken : entity as Token);
+        (entity is AstNode ? (entity as AstNode).beginToken : entity as Token?);
     if (token != null && requestOffset < token.offset) {
       token = containingNode.findPrevious(token);
     }
@@ -399,7 +402,7 @@
 
   /// Given that the [node] contains the [offset], return the [FormalParameter]
   /// that encloses the [offset], or `null`.
-  static FormalParameter findFormalParameter(
+  static FormalParameter? findFormalParameter(
     FormalParameterList node,
     int offset,
   ) {
@@ -423,8 +426,8 @@
     return null;
   }
 
-  static int _computeArgIndex(AstNode containingNode, Object entity) {
-    var argList = containingNode;
+  static int? _computeArgIndex(AstNode containingNode, Object? entity) {
+    AstNode? argList = containingNode;
     if (argList is NamedExpression) {
       entity = argList;
       argList = argList.parent;
@@ -451,8 +454,8 @@
     return null;
   }
 
-  static Token _computeDroppedToken(
-      AstNode containingNode, Object entity, int offset) {
+  static Token? _computeDroppedToken(
+      AstNode containingNode, Object? entity, int offset) {
     // Find the last token of the member before the entity.
     var previousMember;
     for (var member in containingNode.childEntities) {
@@ -463,7 +466,7 @@
         previousMember = member;
       }
     }
-    Token token;
+    Token? token;
     if (previousMember is AstNode) {
       token = previousMember.endToken;
     } else if (previousMember is Token) {
@@ -474,7 +477,7 @@
     }
 
     // Find the first token of the entity (which may be the entity itself).
-    Token endSearch;
+    Token? endSearch;
     if (entity is AstNode) {
       endSearch = entity.beginToken;
     } else if (entity is Token) {
@@ -486,7 +489,7 @@
 
     // Find a dropped token that overlaps the offset.
     token = token.next;
-    while (token != endSearch && !token.isEof) {
+    while (token != endSearch && !token!.isEof) {
       if (token.isKeywordOrIdentifier &&
           token.offset <= offset &&
           offset <= token.end) {
@@ -499,7 +502,7 @@
 
   /// Determine if the offset is contained in a preceding comment token
   /// and return that token, otherwise return `null`.
-  static Token _getContainingCommentToken(Token token, int offset) {
+  static Token? _getContainingCommentToken(Token? token, int offset) {
     if (token == null) {
       return null;
     }
@@ -522,7 +525,7 @@
   }
 
   /// Determine if the given token is part of the given node's dart doc.
-  static Comment _getContainingDocComment(AstNode node, Token token) {
+  static Comment? _getContainingDocComment(AstNode node, Token token) {
     if (node is AnnotatedNode) {
       var docComment = node.documentationComment;
       if (docComment != null && docComment.tokens.contains(token)) {
@@ -534,13 +537,13 @@
 
   /// Return the [ParameterElement] that corresponds to the given [argumentNode]
   /// at the given [argumentIndex].
-  static ParameterElement _getParameterElement(
+  static ParameterElement? _getParameterElement(
     List<ParameterElement> parameters,
     AstNode argumentNode,
-    int argumentIndex,
+    int? argumentIndex,
   ) {
     if (argumentNode is NamedExpression) {
-      var name = argumentNode.name?.label?.name;
+      var name = argumentNode.name.label.name;
       for (var parameter in parameters) {
         if (parameter.name == name) {
           return parameter;
@@ -549,7 +552,7 @@
       return null;
     }
 
-    if (argumentIndex < parameters.length) {
+    if (argumentIndex != null && argumentIndex < parameters.length) {
       return parameters[argumentIndex];
     }
 
@@ -575,7 +578,7 @@
 
   /// Determine whether [token] could possibly be the [entity] for a
   /// [CompletionTarget] associated with the given [offset].
-  static bool _isCandidateToken(AstNode node, Token token, int offset) {
+  static bool _isCandidateToken(AstNode node, Token? token, int offset) {
     if (token == null) {
       return false;
     }
diff --git a/pkg/analyzer_plugin/lib/src/utilities/completion/element_suggestion_builder.dart b/pkg/analyzer_plugin/lib/src/utilities/completion/element_suggestion_builder.dart
index 298c5b5..127cb49 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/completion/element_suggestion_builder.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/completion/element_suggestion_builder.dart
@@ -24,17 +24,17 @@
       <String, CompletionSuggestion>{};
 
   /// Return the library in which the completion is requested.
-  LibraryElement get containingLibrary;
+  LibraryElement? get containingLibrary;
 
   /// Return the kind of suggestions that should be built.
-  CompletionSuggestionKind get kind;
+  CompletionSuggestionKind? get kind;
 
   /// Return the resource provider used to access the file system.
-  ResourceProvider get resourceProvider;
+  ResourceProvider? get resourceProvider;
 
   /// Add a suggestion based upon the given element.
   void addSuggestion(Element element,
-      {String prefix, int relevance = DART_RELEVANCE_DEFAULT}) {
+      {String? prefix, int relevance = DART_RELEVANCE_DEFAULT}) {
     if (element.isPrivate) {
       if (element.library != containingLibrary) {
         return;
@@ -42,13 +42,13 @@
     }
     var completion = element.displayName;
     if (prefix != null && prefix.isNotEmpty) {
-      if (completion == null || completion.isEmpty) {
+      if (completion.isEmpty) {
         completion = prefix;
       } else {
         completion = '$prefix.$completion';
       }
     }
-    if (completion == null || completion.isEmpty) {
+    if (completion.isEmpty) {
       return;
     }
     var builder = SuggestionBuilderImpl(resourceProvider);
@@ -56,7 +56,7 @@
         completion: completion, kind: kind, relevance: relevance);
     if (suggestion != null) {
       if (element.isSynthetic && element is PropertyAccessorElement) {
-        String cacheKey;
+        String? cacheKey;
         if (element.isGetter) {
           cacheKey = element.name;
         }
@@ -75,10 +75,10 @@
                 : protocol.ElementKind.TOP_LEVEL_VARIABLE;
             existingSuggestion.element = protocol.Element(
                 elemKind,
-                existingSuggestion.element.name,
-                existingSuggestion.element.flags,
-                location: getter.element.location,
-                typeParameters: getter.element.typeParameters,
+                existingSuggestion.element!.name,
+                existingSuggestion.element!.flags,
+                location: getter.element?.location,
+                typeParameters: getter.element?.typeParameters,
                 parameters: null,
                 returnType: getter.returnType);
             return;
diff --git a/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart b/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
index ae49588..7148d29 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
@@ -1,7 +1,6 @@
 // Copyright (c) 2017, 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:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/syntactic_entity.dart';
 import 'package:analyzer/dart/ast/token.dart';
@@ -13,15 +12,16 @@
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' hide Element;
 import 'package:analyzer_plugin/src/utilities/completion/completion_target.dart';
+import 'package:collection/collection.dart';
 
-typedef SuggestionsFilter = int Function(DartType dartType, int relevance);
+typedef SuggestionsFilter = int? Function(DartType dartType, int relevance);
 
 /// An [AstVisitor] for determining whether top level suggestions or invocation
 /// suggestions should be made based upon the type of node in which the
 /// suggestions were requested.
 class OpType {
   /// The [TypeSystem] used during resolution of the current unit.
-  TypeSystem _typeSystem;
+  TypeSystem? _typeSystem;
 
   /// Indicates whether constructor suggestions should be included.
   bool includeConstructorSuggestions = false;
@@ -74,11 +74,11 @@
   CompletionSuggestionKind suggestKind = CompletionSuggestionKind.INVOCATION;
 
   /// An representation of the location at which completion was requested.
-  String completionLocation;
+  String? completionLocation;
 
   /// The type that is required by the context in which the completion was
   /// activated, or `null` if there is no such type, or it cannot be determined.
-  DartType _requiredType;
+  DartType? _requiredType;
 
   /// Determine the suggestions that should be made based upon the given
   /// [CompletionTarget] and [offset].
@@ -90,7 +90,7 @@
       return optype;
     }
 
-    optype._typeSystem = target.unit?.declaredElement?.library?.typeSystem;
+    optype._typeSystem = target.unit.declaredElement?.library.typeSystem;
 
     var targetNode = target.containingNode;
     targetNode.accept(_OpTypeAstVisitor(optype, target.entity, offset));
@@ -112,7 +112,7 @@
     // If a value should be suggested, suggest also constructors.
     if (optype.includeReturnValueSuggestions) {
       // Careful: in angular plugin, `target.unit` may be null!
-      var unitElement = target.unit?.declaredElement;
+      var unitElement = target.unit.declaredElement;
       if (unitElement != null) {
         optype.includeConstructorSuggestions = true;
       }
@@ -145,7 +145,7 @@
   /// Try to determine the required context type, and configure filters.
   void _computeRequiredTypeAndFilters(CompletionTarget target) {
     var entity = target.entity;
-    var node = target.containingNode;
+    AstNode? node = target.containingNode;
 
     if (node is InstanceCreationExpression &&
         node.keyword != null &&
@@ -157,28 +157,29 @@
     if (node is AssignmentExpression &&
         node.operator.type == TokenType.EQ &&
         node.rightHandSide == entity) {
-      _requiredType = node.leftHandSide?.staticType;
+      _requiredType = node.leftHandSide.staticType;
     } else if (node is BinaryExpression &&
         node.operator.type == TokenType.EQ_EQ &&
         node.rightOperand == entity) {
-      _requiredType = node.leftOperand?.staticType;
+      _requiredType = node.leftOperand.staticType;
     } else if (node is NamedExpression && node.expression == entity) {
       _requiredType = node.staticParameterElement?.type;
     } else if (node is SwitchCase && node.expression == entity) {
       var parent = node.parent;
       if (parent is SwitchStatement) {
-        _requiredType = parent.expression?.staticType;
+        _requiredType = parent.expression.staticType;
       }
     } else if (node is VariableDeclaration && node.initializer == entity) {
       _requiredType = node.declaredElement?.type;
     } else if (entity is Expression && entity.staticParameterElement != null) {
-      _requiredType = entity.staticParameterElement.type;
+      _requiredType = entity.staticParameterElement?.type;
     }
 
-    if (_requiredType == null) {
+    var requiredType = _requiredType;
+    if (requiredType == null) {
       return;
     }
-    if (_requiredType.isDynamic || _requiredType.isDartCoreObject) {
+    if (requiredType.isDynamic || requiredType.isDartCoreObject) {
       _requiredType = null;
       return;
     }
@@ -186,16 +187,17 @@
 
   /// Return `true` if the [leftType] is a subtype of the [rightType].
   bool _isSubtypeOf(DartType leftType, DartType rightType) {
-    if (_typeSystem == null) {
+    var typeSystem = _typeSystem;
+    if (typeSystem == null) {
       return false;
     }
 
-    return _typeSystem.isSubtypeOf(leftType, rightType);
+    return typeSystem.isSubtypeOf(leftType, rightType);
   }
 
   /// Return the statement before [entity]
   /// where [entity] can be a statement or the `}` closing the given block.
-  static Statement getPreviousStatement(Block node, Object entity) {
+  static Statement? getPreviousStatement(Block node, Object? entity) {
     if (entity == node.rightBracket) {
       return node.statements.isNotEmpty ? node.statements.last : null;
     }
@@ -213,7 +215,7 @@
 class _OpTypeAstVisitor extends GeneralizingAstVisitor<void> {
   /// The entity (AstNode or Token) that will be replaced or displaced by the
   /// added text.
-  final SyntacticEntity entity;
+  final SyntacticEntity? entity;
 
   /// The offset within the source at which the completion is requested.
   final int offset;
@@ -245,14 +247,14 @@
   @override
   void visitArgumentList(ArgumentList node) {
     var parent = node.parent;
-    List<ParameterElement> parameters;
+    List<ParameterElement>? parameters;
     if (parent is InstanceCreationExpression) {
-      Element constructor;
-      var name = parent.constructorName?.name;
+      Element? constructor;
+      var name = parent.constructorName.name;
       if (name != null) {
         constructor = name.staticElement;
       } else {
-        var classElem = parent.constructorName?.type?.name?.staticElement;
+        var classElem = parent.constructorName.type.name.staticElement;
         if (classElem is ClassElement) {
           constructor = classElem.unnamedConstructor;
         }
@@ -306,7 +308,7 @@
       }
       if (0 <= index && index < parameters.length) {
         var param = parameters[index];
-        if (param?.isNamed == true) {
+        if (param.isNamed == true) {
           var context = _argumentListContext(node);
           optype.completionLocation = 'ArgumentList_${context}_named';
           optype.includeNamedArgumentSuggestions = true;
@@ -476,6 +478,7 @@
         return node.end;
       }
 
+      var entity = this.entity;
       if (entity != null) {
         if (entity.offset <= declarationStart()) {
           optype.completionLocation = 'CompilationUnit_declaration';
@@ -522,14 +525,8 @@
     // some PrefixedIdentifier nodes are transformed into
     // ConstructorName nodes during the resolution process.
     if (identical(entity, node.name)) {
-      var type = node.type;
-      if (type != null) {
-        var prefix = type.name;
-        if (prefix != null) {
-          optype.includeConstructorSuggestions = true;
-          optype.isPrefixed = true;
-        }
-      }
+      optype.includeConstructorSuggestions = true;
+      optype.isPrefixed = true;
     }
   }
 
@@ -659,8 +656,8 @@
   @override
   void visitForEachParts(ForEachParts node) {
     if (identical(entity, node.inKeyword) && offset <= node.inKeyword.offset) {
-      if (!(node is ForEachPartsWithIdentifier && node.identifier != null ||
-          node is ForEachPartsWithDeclaration && node.loopVariable != null)) {
+      if (!(node is ForEachPartsWithIdentifier ||
+          node is ForEachPartsWithDeclaration)) {
         optype.includeTypeNameSuggestions = true;
       }
     }
@@ -728,7 +725,7 @@
 
     // Handle default normal parameter just as a normal parameter.
     if (parameter is DefaultFormalParameter) {
-      parameter = (parameter as DefaultFormalParameter).parameter;
+      parameter = parameter.parameter;
     }
 
     // "(^ this.field)"
@@ -955,7 +952,10 @@
   @override
   void visitMethodInvocation(MethodInvocation node) {
     var isThis = node.target is ThisExpression;
-    if (identical(entity, node.operator) && offset > node.operator.offset) {
+    var operator = node.operator;
+    if (operator != null &&
+        identical(entity, operator) &&
+        offset > operator.offset) {
       // The cursor is between the two dots of a ".." token, so we need to
       // generate the completions we would generate after a "." token.
       optype.includeReturnValueSuggestions = true;
@@ -1004,17 +1004,17 @@
       optype.includeTypeNameSuggestions = true;
 
       // Check for named parameters in constructor calls.
-      var grandparent = node.parent.parent;
+      var grandparent = node.parent?.parent;
       if (grandparent is ConstructorReferenceNode) {
         var element = grandparent.staticElement;
         if (element != null) {
           var parameters = element.parameters;
-          var parameterElement = parameters.firstWhere((e) {
+          var parameterElement = parameters.firstWhereOrNull((e) {
             if (e is DefaultFieldFormalParameterElementImpl) {
-              return e.field?.name == node.name.label?.name;
+              return e.field?.name == node.name.label.name;
             }
-            return e.isNamed && e.name == node.name.label?.name;
-          }, orElse: () => null);
+            return e.isNamed && e.name == node.name.label.name;
+          });
           // Suggest tear-offs.
           if (parameterElement?.type is FunctionType) {
             optype.includeVoidReturnSuggestions = true;
@@ -1064,8 +1064,7 @@
         // In addition to the standard case,
         // handle the exceptional case where the parser considers the would-be
         // identifier to be a keyword and inserts a synthetic identifier
-        (node.identifier != null &&
-            node.identifier.isSynthetic &&
+        (node.identifier.isSynthetic &&
             identical(entity, node.findPrevious(node.identifier.beginToken)))) {
       if (node.prefix.isSynthetic) {
         // If the access has no target (empty string)
@@ -1073,7 +1072,7 @@
         return;
       }
       optype.isPrefixed = true;
-      if (node.parent is TypeName && node.parent.parent is ConstructorName) {
+      if (node.parent is TypeName && node.parent?.parent is ConstructorName) {
         optype.includeConstructorSuggestions = true;
       } else if (node.parent is Annotation) {
         optype.includeConstructorSuggestions = true;
@@ -1162,15 +1161,18 @@
     }
 
     // If "(^ Type)", then include types.
-    if (type == null && offset < name.offset) {
+    if (type == null && name != null && offset < name.offset) {
       optype.includeTypeNameSuggestions = true;
       return;
     }
 
     // If "(Type ^)", then include parameter names.
-    if (type == null && name.end < offset && offset <= name.token.next.offset) {
-      optype.includeVarNameSuggestions = true;
-      return;
+    if (type == null && name != null && name.end < offset) {
+      var nextToken = name.token.next;
+      if (nextToken != null && offset <= nextToken.offset) {
+        optype.includeVarNameSuggestions = true;
+        return;
+      }
     }
 
     // If inside of "Type" in "(Type^ name)", then include types.
@@ -1332,7 +1334,7 @@
 
   @override
   void visitVariableDeclarationList(VariableDeclarationList node) {
-    if (node.keyword == null || node.keyword.lexeme != 'var') {
+    if (node.keyword == null || node.keyword?.lexeme != 'var') {
       if (node.type == null || identical(entity, node.type)) {
         optype.completionLocation = 'VariableDeclarationList_type';
         optype.includeTypeNameSuggestions = true;
@@ -1375,7 +1377,7 @@
 
   /// Return the context in which the [node] occurs. The [node] is expected to
   /// be the parent of the argument expression.
-  String _argumentListContext(AstNode node) {
+  String _argumentListContext(AstNode? node) {
     if (node is ArgumentList) {
       var parent = node.parent;
       if (parent is Annotation) {
@@ -1406,7 +1408,7 @@
       return 'index';
     }
     throw ArgumentError(
-        'Unknown parent of ${node.runtimeType}: ${node.parent.runtimeType}');
+        'Unknown parent of ${node.runtimeType}: ${node?.parent.runtimeType}');
   }
 
   bool _isEntityPrevTokenSynthetic() {
@@ -1422,7 +1424,7 @@
 
   /// A filter used to disable everything except classes (such as functions and
   /// mixins).
-  int _nonMixinClasses(DartType type, int relevance) {
+  int? _nonMixinClasses(DartType type, int relevance) {
     if (type is InterfaceType) {
       if (type.element.isMixin) {
         return null;
diff --git a/pkg/analyzer_plugin/lib/src/utilities/completion/suggestion_builder.dart b/pkg/analyzer_plugin/lib/src/utilities/completion/suggestion_builder.dart
index 946ad5b..e452d3d 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/completion/suggestion_builder.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/completion/suggestion_builder.dart
@@ -14,7 +14,7 @@
 /// An object used to build code completion suggestions for Dart code.
 class SuggestionBuilderImpl implements SuggestionBuilder {
   /// The resource provider used to access the file system.
-  final ResourceProvider resourceProvider;
+  final ResourceProvider? resourceProvider;
 
   /// The converter used to convert analyzer objects to protocol objects.
   final AnalyzerConverter converter = AnalyzerConverter();
@@ -65,9 +65,9 @@
   }
 
   @override
-  CompletionSuggestion forElement(Element element,
-      {String completion,
-      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
+  CompletionSuggestion? forElement(Element? element,
+      {String? completion,
+      CompletionSuggestionKind? kind,
       int relevance = DART_RELEVANCE_DEFAULT}) {
     // Copied from analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
     if (element == null) {
@@ -80,7 +80,7 @@
     completion ??= element.displayName;
     var isDeprecated = element.hasDeprecated;
     var suggestion = CompletionSuggestion(
-        kind,
+        kind ?? CompletionSuggestionKind.INVOCATION,
         isDeprecated ? DART_RELEVANCE_LOW : relevance,
         completion,
         completion.length,
@@ -105,11 +105,7 @@
           .toList();
       suggestion.parameterTypes =
           element.parameters.map((ParameterElement parameter) {
-        var paramType = parameter.type;
-        // Gracefully degrade if type not resolved yet
-        return paramType != null
-            ? paramType.getDisplayString(withNullability: false)
-            : 'var';
+        return parameter.type.getDisplayString(withNullability: false);
       }).toList();
 
       var requiredParameters = element.parameters
@@ -126,19 +122,17 @@
     return suggestion;
   }
 
-  String getReturnTypeString(Element element) {
+  String? getReturnTypeString(Element element) {
     // Copied from analysis_server/lib/src/protocol_server.dart
     if (element is ExecutableElement) {
       if (element.kind == ElementKind.SETTER) {
         return null;
       } else {
-        return element.returnType?.getDisplayString(withNullability: false);
+        return element.returnType.getDisplayString(withNullability: false);
       }
     } else if (element is VariableElement) {
       var type = element.type;
-      return type != null
-          ? type.getDisplayString(withNullability: false)
-          : 'dynamic';
+      return type.getDisplayString(withNullability: false);
     } else if (element is TypeAliasElement) {
       var aliasedElement = element.aliasedElement;
       if (aliasedElement is GenericFunctionTypeElement) {
diff --git a/pkg/analyzer_plugin/lib/src/utilities/documentation.dart b/pkg/analyzer_plugin/lib/src/utilities/documentation.dart
index 50299be..69dcb9b 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/documentation.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/documentation.dart
@@ -4,7 +4,7 @@
 
 /// Return the summary of the given DartDoc [string], which is the content of
 /// the lines before the first blank line.
-String getDartDocSummary(String string) {
+String? getDartDocSummary(String? string) {
   if (string == null) {
     return null;
   }
@@ -26,7 +26,7 @@
 
 /// Converts [string] from a DartDoc comment with slashes and stars to a plain
 /// text representation of the comment.
-String removeDartDocDelimiters(String string) {
+String? removeDartDocDelimiters(String? string) {
   if (string == null) {
     return null;
   }
diff --git a/pkg/analyzer_plugin/lib/src/utilities/folding/folding.dart b/pkg/analyzer_plugin/lib/src/utilities/folding/folding.dart
index d424abf..a302a76 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/folding/folding.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/folding/folding.dart
@@ -21,7 +21,7 @@
   DartFoldingRequestImpl(this.resourceProvider, this.result);
 
   @override
-  String get path => result.path;
+  String get path => result.path!;
 }
 
 /// A concrete implementation of [FoldingCollector].
diff --git a/pkg/analyzer_plugin/lib/src/utilities/highlights/highlights.dart b/pkg/analyzer_plugin/lib/src/utilities/highlights/highlights.dart
index 95bd889..5e55b48 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/highlights/highlights.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/highlights/highlights.dart
@@ -21,7 +21,7 @@
   DartHighlightsRequestImpl(this.resourceProvider, this.result);
 
   @override
-  String get path => result.path;
+  String get path => result.path!;
 }
 
 /// A concrete implementation of [HighlightsCollector].
diff --git a/pkg/analyzer_plugin/lib/src/utilities/kythe/entries.dart b/pkg/analyzer_plugin/lib/src/utilities/kythe/entries.dart
index 684e9e7..191101c 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/kythe/entries.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/kythe/entries.dart
@@ -19,7 +19,7 @@
   DartEntryRequestImpl(this.resourceProvider, this.result);
 
   @override
-  String get path => result.path;
+  String get path => result.path!;
 }
 
 /// A concrete implementation of [EntryCollector].
diff --git a/pkg/analyzer_plugin/lib/src/utilities/navigation/navigation.dart b/pkg/analyzer_plugin/lib/src/utilities/navigation/navigation.dart
index c660f85..4e1850c 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/navigation/navigation.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/navigation/navigation.dart
@@ -28,7 +28,7 @@
       this.resourceProvider, this.offset, this.length, this.result);
 
   @override
-  String get path => result.path;
+  String get path => result.path!;
 }
 
 /// A concrete implementation of [NavigationCollector].
@@ -59,7 +59,7 @@
   @override
   void addRange(
       SourceRange range, ElementKind targetKind, Location targetLocation,
-      {Location targetCodeLocation}) {
+      {Location? targetCodeLocation}) {
     addRegion(range.offset, range.length, targetKind, targetLocation,
         targetCodeLocation: targetCodeLocation);
   }
@@ -67,7 +67,7 @@
   @override
   void addRegion(
       int offset, int length, ElementKind targetKind, Location targetLocation,
-      {Location targetCodeLocation}) {
+      {Location? targetCodeLocation}) {
     var range = SourceRange(offset, length);
     // add new target
     var targets = regionMap.putIfAbsent(range, () => <int>[]);
@@ -96,7 +96,7 @@
     return index;
   }
 
-  int _addTarget(ElementKind kind, Location location, Location codeLocation) {
+  int _addTarget(ElementKind kind, Location location, Location? codeLocation) {
     var pair = Pair<ElementKind, Location>(kind, location);
     var index = targetMap[pair];
     if (index == null) {
diff --git a/pkg/analyzer_plugin/lib/src/utilities/null_string_sink.dart b/pkg/analyzer_plugin/lib/src/utilities/null_string_sink.dart
index ec2cc26..012bb11 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/null_string_sink.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/null_string_sink.dart
@@ -5,7 +5,7 @@
 /// A string sink that ignores everything written to it.
 class NullStringSink implements StringSink {
   @override
-  void write(Object obj) {}
+  void write(Object? obj) {}
 
   @override
   void writeAll(Iterable objects, [String separator = '']) {}
@@ -14,5 +14,5 @@
   void writeCharCode(int charCode) {}
 
   @override
-  void writeln([Object obj = '']) {}
+  void writeln([Object? obj = '']) {}
 }
diff --git a/pkg/analyzer_plugin/lib/src/utilities/occurrences/occurrences.dart b/pkg/analyzer_plugin/lib/src/utilities/occurrences/occurrences.dart
index f436774..6bd0592 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/occurrences/occurrences.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/occurrences/occurrences.dart
@@ -20,7 +20,7 @@
   DartOccurrencesRequestImpl(this.resourceProvider, this.result);
 
   @override
-  String get path => result.path;
+  String get path => result.path!;
 }
 
 /// A concrete implementation of [OccurrencesCollector].
diff --git a/pkg/analyzer_plugin/lib/src/utilities/outline/outline.dart b/pkg/analyzer_plugin/lib/src/utilities/outline/outline.dart
index 284f140..44d4dd9 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/outline/outline.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/outline/outline.dart
@@ -20,7 +20,7 @@
   DartOutlineRequestImpl(this.resourceProvider, this.result);
 
   @override
-  String get path => result.path;
+  String get path => result.path!;
 }
 
 /// A concrete implementation of [OutlineCollector].
diff --git a/pkg/analyzer_plugin/lib/src/utilities/string_utilities.dart b/pkg/analyzer_plugin/lib/src/utilities/string_utilities.dart
index 9575749..7c8d1be 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/string_utilities.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/string_utilities.dart
@@ -9,7 +9,7 @@
 ///
 /// 'getCamelWords' => ['get', 'Camel', 'Words']
 /// 'getHTMLText' => ['get', 'HTML', 'Text']
-List<String> getCamelWords(String string) {
+List<String> getCamelWords(String? string) {
   if (string == null || string.isEmpty) {
     return const <String>[];
   }
@@ -44,7 +44,7 @@
 }
 
 /// Return `true` if the given [string] is either `null` or empty.
-bool isEmpty(String string) => string == null || string.isEmpty;
+bool isEmpty(String? string) => string == null || string.isEmpty;
 
 /// Return `true` if the given [character] is a lowercase ASCII character.
 bool isLowerCase(int character) => character >= $a && character <= $z;
@@ -55,8 +55,11 @@
 /// If the given [string] starts with the text to [remove], then return the
 /// portion of the string after the text to remove. Otherwise, return the
 /// original string unmodified.
-String removeStart(String string, String remove) {
-  if (isEmpty(string) || isEmpty(remove)) {
+String? removeStart(String? string, String? remove) {
+  if (string == null || string.isEmpty) {
+    return string;
+  }
+  if (remove == null || remove.isEmpty) {
     return string;
   }
   if (string.startsWith(remove)) {
diff --git a/pkg/analyzer_plugin/lib/src/utilities/visitors/local_declaration_visitor.dart b/pkg/analyzer_plugin/lib/src/utilities/visitors/local_declaration_visitor.dart
index c561be1..a7ea9aa 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/visitors/local_declaration_visitor.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/visitors/local_declaration_visitor.dart
@@ -41,13 +41,13 @@
 
   void declaredLabel(Label label, bool isCaseLabel) {}
 
-  void declaredLocalVar(SimpleIdentifier name, TypeAnnotation type) {}
+  void declaredLocalVar(SimpleIdentifier name, TypeAnnotation? type) {}
 
   void declaredMethod(MethodDeclaration declaration) {}
 
   void declaredMixin(MixinDeclaration declaration) {}
 
-  void declaredParam(SimpleIdentifier name, TypeAnnotation type) {}
+  void declaredParam(SimpleIdentifier name, TypeAnnotation? type) {}
 
   void declaredTopLevelVar(
       VariableDeclarationList varList, VariableDeclaration varDecl) {}
@@ -116,11 +116,9 @@
       declaredLocalVar(loopVariable.identifier, loopVariable.type);
     } else if (forLoopParts is ForPartsWithDeclarations) {
       var varList = forLoopParts.variables;
-      if (varList != null) {
-        varList.variables.forEach((VariableDeclaration varDecl) {
-          declaredLocalVar(varDecl.name, varList.type);
-        });
-      }
+      varList.variables.forEach((VariableDeclaration varDecl) {
+        declaredLocalVar(varDecl.name, varList.type);
+      });
     }
     visitNode(node);
   }
@@ -133,11 +131,9 @@
       declaredLocalVar(loopVariable.identifier, loopVariable.type);
     } else if (forLoopParts is ForPartsWithDeclarations) {
       var varList = forLoopParts.variables;
-      if (varList != null) {
-        varList.variables.forEach((VariableDeclaration varDecl) {
-          declaredLocalVar(varDecl.name, varList.type);
-        });
-      }
+      varList.variables.forEach((VariableDeclaration varDecl) {
+        declaredLocalVar(varDecl.name, varList.type);
+      });
     }
     visitNode(node);
   }
@@ -255,11 +251,9 @@
         );
       } else if (declaration is TopLevelVariableDeclaration) {
         var varList = declaration.variables;
-        if (varList != null) {
-          varList.variables.forEach((VariableDeclaration varDecl) {
-            declaredTopLevelVar(varList, varDecl);
-          });
-        }
+        varList.variables.forEach((VariableDeclaration varDecl) {
+          declaredTopLevelVar(varList, varDecl);
+        });
       } else if (declaration is ClassTypeAlias) {
         declaredClassTypeAlias(declaration);
         _visitTypeParameters(declaration, declaration.typeParameters);
@@ -269,10 +263,11 @@
       } else if (declaration is GenericTypeAlias) {
         declaredGenericTypeAlias(declaration);
         _visitTypeParameters(declaration, declaration.typeParameters);
-        _visitTypeParameters(
-          declaration.functionType,
-          declaration.functionType?.typeParameters,
-        );
+
+        var type = declaration.type;
+        if (type is GenericFunctionType) {
+          _visitTypeParameters(type, type.typeParameters);
+        }
       } else if (declaration is MixinDeclaration) {
         declaredMixin(declaration);
         _visitTypeParameters(declaration, declaration.typeParameters);
@@ -280,16 +275,16 @@
     });
   }
 
-  void _visitParamList(FormalParameterList paramList) {
+  void _visitParamList(FormalParameterList? paramList) {
     if (paramList != null) {
       paramList.parameters.forEach((FormalParameter param) {
-        NormalFormalParameter normalParam;
+        NormalFormalParameter? normalParam;
         if (param is DefaultFormalParameter) {
           normalParam = param.parameter;
         } else if (param is NormalFormalParameter) {
           normalParam = param;
         }
-        TypeAnnotation type;
+        TypeAnnotation? type;
         if (normalParam is FieldFormalParameter) {
           type = normalParam.type;
         } else if (normalParam is FunctionTypedFormalParameter) {
@@ -298,7 +293,7 @@
           type = normalParam.type;
         }
         var name = param.identifier;
-        declaredParam(name, type);
+        declaredParam(name!, type);
       });
     }
   }
@@ -308,26 +303,21 @@
       if (stmt.offset < offset) {
         if (stmt is VariableDeclarationStatement) {
           var varList = stmt.variables;
-          if (varList != null) {
-            for (var varDecl in varList.variables) {
-              if (varDecl.end < offset) {
-                declaredLocalVar(varDecl.name, varList.type);
-              }
+          for (var varDecl in varList.variables) {
+            if (varDecl.end < offset) {
+              declaredLocalVar(varDecl.name, varList.type);
             }
           }
         } else if (stmt is FunctionDeclarationStatement) {
           var declaration = stmt.functionDeclaration;
-          if (declaration != null && declaration.offset < offset) {
-            var id = declaration.name;
-            if (id != null) {
-              var name = id.name;
-              if (name != null && name.isNotEmpty) {
-                declaredFunction(declaration);
-                _visitTypeParameters(
-                  declaration,
-                  declaration.functionExpression.typeParameters,
-                );
-              }
+          if (declaration.offset < offset) {
+            var name = declaration.name.name;
+            if (name.isNotEmpty) {
+              declaredFunction(declaration);
+              _visitTypeParameters(
+                declaration,
+                declaration.functionExpression.typeParameters,
+              );
             }
           }
         }
@@ -335,7 +325,7 @@
     }
   }
 
-  void _visitTypeParameters(AstNode node, TypeParameterList typeParameters) {
+  void _visitTypeParameters(AstNode node, TypeParameterList? typeParameters) {
     if (typeParameters == null) return;
 
     if (node.offset < offset && offset < node.end) {
diff --git a/pkg/analyzer_plugin/lib/utilities/analyzer_converter.dart b/pkg/analyzer_plugin/lib/utilities/analyzer_converter.dart
index 03e3ac4..40f3d2e 100644
--- a/pkg/analyzer_plugin/lib/utilities/analyzer_converter.dart
+++ b/pkg/analyzer_plugin/lib/utilities/analyzer_converter.dart
@@ -23,7 +23,7 @@
   /// error's location will have a start line and start column. If a [severity]
   /// is provided, then it will override the severity defined by the error.
   plugin.AnalysisError convertAnalysisError(analyzer.AnalysisError error,
-      {analyzer.LineInfo lineInfo, analyzer.ErrorSeverity severity}) {
+      {analyzer.LineInfo? lineInfo, analyzer.ErrorSeverity? severity}) {
     var errorCode = error.errorCode;
     severity ??= errorCode.errorSeverity;
     var offset = error.offset;
@@ -33,17 +33,13 @@
     var endColumn = -1;
     if (lineInfo != null) {
       var startLocation = lineInfo.getLocation(offset);
-      if (startLocation != null) {
-        startLine = startLocation.lineNumber;
-        startColumn = startLocation.columnNumber;
-      }
+      startLine = startLocation.lineNumber;
+      startColumn = startLocation.columnNumber;
       var endLocation = lineInfo.getLocation(offset + error.length);
-      if (endLocation != null) {
-        endLine = endLocation.lineNumber;
-        endColumn = endLocation.columnNumber;
-      }
+      endLine = endLocation.lineNumber;
+      endColumn = endLocation.columnNumber;
     }
-    List<plugin.DiagnosticMessage> contextMessages;
+    List<plugin.DiagnosticMessage>? contextMessages;
     if (error.contextMessages.isNotEmpty) {
       contextMessages = error.contextMessages
           .map((message) =>
@@ -69,8 +65,8 @@
   /// the errors will be altered based on those options.
   List<plugin.AnalysisError> convertAnalysisErrors(
       List<analyzer.AnalysisError> errors,
-      {analyzer.LineInfo lineInfo,
-      analyzer.AnalysisOptions options}) {
+      {analyzer.LineInfo? lineInfo,
+      analyzer.AnalysisOptions? options}) {
     var serverErrors = <plugin.AnalysisError>[];
     for (var error in errors) {
       var processor = analyzer.ErrorProcessor.getProcessor(options, error);
@@ -94,7 +90,7 @@
   /// the error's location will have a start line and start column.
   plugin.DiagnosticMessage convertDiagnosticMessage(
       analyzer.DiagnosticMessage message,
-      {analyzer.LineInfo lineInfo}) {
+      {analyzer.LineInfo? lineInfo}) {
     var file = message.filePath;
     var offset = message.offset;
     var length = message.length;
@@ -104,15 +100,11 @@
     var endColumn = -1;
     if (lineInfo != null) {
       var lineLocation = lineInfo.getLocation(offset);
-      if (lineLocation != null) {
-        startLine = lineLocation.lineNumber;
-        startColumn = lineLocation.columnNumber;
-      }
+      startLine = lineLocation.lineNumber;
+      startColumn = lineLocation.columnNumber;
       var endLocation = lineInfo.getLocation(offset + length);
-      if (endLocation != null) {
-        endLine = endLocation.lineNumber;
-        endColumn = endLocation.columnNumber;
-      }
+      endLine = endLocation.lineNumber;
+      endColumn = endLocation.columnNumber;
     }
     return plugin.DiagnosticMessage(
         message.message,
@@ -202,8 +194,8 @@
       plugin.AnalysisErrorType(type.name);
 
   /// Create a location based on an the given [element].
-  plugin.Location locationFromElement(analyzer.Element element,
-      {int offset, int length}) {
+  plugin.Location? locationFromElement(analyzer.Element? element,
+      {int? offset, int? length}) {
     if (element == null || element.source == null) {
       return null;
     }
@@ -234,14 +226,13 @@
         // so should it return isEnumConstant = true?
         // Or should we return ElementKind.ENUM_CONSTANT here
         // in either or both of these cases?
-        element.type != null &&
         element.type.element == element.enclosingElement) {
       return plugin.ElementKind.ENUM_CONSTANT;
     }
     return convertElementKind(element.kind);
   }
 
-  String _getAliasedTypeString(analyzer.Element element) {
+  String? _getAliasedTypeString(analyzer.Element element) {
     if (element is analyzer.TypeAliasElement) {
       var aliasedType = element.aliasedType;
       return aliasedType.getDisplayString(withNullability: false);
@@ -251,7 +242,7 @@
 
   /// Return a textual representation of the parameters of the given [element],
   /// or `null` if the element does not have any parameters.
-  String _getParametersString(analyzer.Element element) {
+  String? _getParametersString(analyzer.Element element) {
     // TODO(scheglov) expose the corresponding feature from ExecutableElement
     List<analyzer.ParameterElement> parameters;
     if (element is analyzer.ExecutableElement) {
@@ -297,17 +288,14 @@
 
   /// Return a textual representation of the return type of the given [element],
   /// or `null` if the element does not have a return type.
-  String _getReturnTypeString(analyzer.Element element) {
+  String? _getReturnTypeString(analyzer.Element element) {
     if (element is analyzer.ExecutableElement) {
       if (element.kind == analyzer.ElementKind.SETTER) {
         return null;
       }
-      return element.returnType?.getDisplayString(withNullability: false);
+      return element.returnType.getDisplayString(withNullability: false);
     } else if (element is analyzer.VariableElement) {
-      var type = element.type;
-      return type != null
-          ? type.getDisplayString(withNullability: false)
-          : 'dynamic';
+      return element.type.getDisplayString(withNullability: false);
     } else if (element is analyzer.TypeAliasElement) {
       var aliasedType = element.aliasedType;
       if (aliasedType is FunctionType) {
@@ -320,10 +308,10 @@
 
   /// Return a textual representation of the type parameters of the given
   /// [element], or `null` if the element does not have type parameters.
-  String _getTypeParametersString(analyzer.Element element) {
+  String? _getTypeParametersString(analyzer.Element element) {
     if (element is analyzer.TypeParameterizedElement) {
       var typeParameters = element.typeParameters;
-      if (typeParameters == null || typeParameters.isEmpty) {
+      if (typeParameters.isEmpty) {
         return null;
       }
       return '<${typeParameters.join(', ')}>';
@@ -332,19 +320,22 @@
   }
 
   /// Return the compilation unit containing the given [element].
-  analyzer.CompilationUnitElement _getUnitElement(analyzer.Element element) {
-    if (element is analyzer.CompilationUnitElement) {
-      return element;
+  analyzer.CompilationUnitElement? _getUnitElement(analyzer.Element element) {
+    analyzer.Element? currentElement = element;
+    if (currentElement is analyzer.CompilationUnitElement) {
+      return currentElement;
     }
-    if (element?.enclosingElement is analyzer.LibraryElement) {
-      element = element.enclosingElement;
+    if (currentElement.enclosingElement is analyzer.LibraryElement) {
+      currentElement = currentElement.enclosingElement;
     }
-    if (element is analyzer.LibraryElement) {
-      return element.definingCompilationUnit;
+    if (currentElement is analyzer.LibraryElement) {
+      return currentElement.definingCompilationUnit;
     }
-    for (; element != null; element = element.enclosingElement) {
-      if (element is analyzer.CompilationUnitElement) {
-        return element;
+    for (;
+        currentElement != null;
+        currentElement = currentElement.enclosingElement) {
+      if (currentElement is analyzer.CompilationUnitElement) {
+        return currentElement;
       }
     }
     return null;
@@ -392,21 +383,24 @@
 
   /// Create and return a location within the given [unitElement] at the given
   /// [range].
-  plugin.Location _locationForArgs(
-      analyzer.CompilationUnitElement unitElement, analyzer.SourceRange range) {
+  plugin.Location? _locationForArgs(
+      analyzer.CompilationUnitElement? unitElement,
+      analyzer.SourceRange range) {
     var startLine = 0;
     var startColumn = 0;
     var endLine = 0;
     var endColumn = 0;
+
+    if (unitElement == null) {
+      return null;
+    }
     try {
       var lineInfo = unitElement.lineInfo;
       if (lineInfo != null) {
         var offsetLocation = lineInfo.getLocation(range.offset);
         startLine = offsetLocation.lineNumber;
         startColumn = offsetLocation.columnNumber;
-      }
-      var endLocation = lineInfo.getLocation(range.offset + range.length);
-      if (endLocation != null) {
+        var endLocation = lineInfo.getLocation(range.offset + range.length);
         endLine = endLocation.lineNumber;
         endColumn = endLocation.columnNumber;
       }
diff --git a/pkg/analyzer_plugin/lib/utilities/assist/assist_contributor_mixin.dart b/pkg/analyzer_plugin/lib/utilities/assist/assist_contributor_mixin.dart
index 1546f14..811a510 100644
--- a/pkg/analyzer_plugin/lib/utilities/assist/assist_contributor_mixin.dart
+++ b/pkg/analyzer_plugin/lib/utilities/assist/assist_contributor_mixin.dart
@@ -20,14 +20,13 @@
   /// priority, and use the change [builder] to get the edits that comprise the
   /// assist. If the message has parameters, then use the list of [args] to
   /// populate the message.
-  void addAssist(AssistKind kind, ChangeBuilder builder, {List<Object> args}) {
+  void addAssist(AssistKind kind, ChangeBuilder builder, {List<Object>? args}) {
     var change = builder.sourceChange;
     if (change.edits.isEmpty) {
       return;
     }
     change.id = kind.id;
     change.message = formatList(kind.message, args);
-    collector.addAssist(
-        PrioritizedSourceChange(kind.priority, change));
+    collector.addAssist(PrioritizedSourceChange(kind.priority, change));
   }
 }
diff --git a/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_core.dart b/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_core.dart
index d4e9f29..d64f540 100644
--- a/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_core.dart
+++ b/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_core.dart
@@ -23,7 +23,7 @@
 
   /// Return the range of the selection for the change being built, or `null` if
   /// there is no selection.
-  SourceRange get selectionRange;
+  SourceRange? get selectionRange;
 
   /// Return the source change that was built. The source change will not be
   /// complete until all of the futures returned by the add*FileEdit methods
@@ -43,13 +43,6 @@
   /// Use the [buildFileEdit] function to create a collection of edits to the
   /// file with the given [path]. The edits will be added to the source change
   /// that is being built.
-  @Deprecated('Use either addDartFileEdit or addGenericFileEdit')
-  Future<void> addFileEdit(
-      String path, void Function(FileEditBuilder builder) buildFileEdit);
-
-  /// Use the [buildFileEdit] function to create a collection of edits to the
-  /// file with the given [path]. The edits will be added to the source change
-  /// that is being built.
   ///
   /// The builder passed to the [buildFileEdit] function has no special support
   /// for any particular kind of file.
diff --git a/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart b/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart
index 1b513a2..af9b40a 100644
--- a/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart
+++ b/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart
@@ -2,40 +2,16 @@
 // 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/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer_plugin/src/utilities/change_builder/change_builder_dart.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 
 /// The optional generator for prefix that should be used for new imports.
 typedef ImportPrefixGenerator = String Function(Uri);
 
-/// A [ChangeBuilder] used to build changes in Dart files.
-///
-/// Clients may not extend, implement or mix-in this class.
-@Deprecated('Use ChangeBuilder')
-abstract class DartChangeBuilder implements ChangeBuilder {
-  /// Initialize a newly created change builder.
-  @Deprecated('Use ChangeBuilder(session: session)')
-  factory DartChangeBuilder(AnalysisSession session) = DartChangeBuilderImpl;
-
-  /// Use the [buildFileEdit] function to create a collection of edits to the
-  /// file with the given [path]. The edits will be added to the source change
-  /// that is being built.
-  ///
-  /// If [importPrefixGenerator] is provided, it will be asked to generate an
-  /// import prefix for every newly imported library.
-  @Deprecated('Use ChangeBuilder.addDartFileEdit')
-  @override
-  Future<void> addFileEdit(
-      String path, void Function(DartFileEditBuilder builder) buildFileEdit,
-      {ImportPrefixGenerator importPrefixGenerator});
-}
-
 /// An [EditBuilder] used to build edits in Dart files.
 ///
 /// Clients may not extend, implement or mix-in this class.
@@ -55,13 +31,13 @@
   /// list of [mixins] is provided but no [superclass] is given then the class
   /// will extend `Object`.)
   void writeClassDeclaration(String name,
-      {Iterable<DartType> interfaces,
+      {Iterable<DartType>? interfaces,
       bool isAbstract = false,
-      void Function() membersWriter,
-      Iterable<DartType> mixins,
-      String nameGroupName,
-      DartType superclass,
-      String superclassGroupName});
+      void Function()? membersWriter,
+      Iterable<DartType>? mixins,
+      String? nameGroupName,
+      DartType? superclass,
+      String? superclassGroupName});
 
   /// Write the code for a constructor declaration in the class with the given
   /// [className]. If [isConst] is `true`, then the constructor will be marked
@@ -79,15 +55,15 @@
   /// for you). If a [bodyWriter] is provided then it is used to write the
   /// constructor body, otherwise an empty body is written.
   void writeConstructorDeclaration(String className,
-      {ArgumentList argumentList,
-      void Function() bodyWriter,
-      String classNameGroupName,
-      SimpleIdentifier constructorName,
-      String constructorNameGroupName,
-      List<String> fieldNames,
-      void Function() initializerWriter,
+      {ArgumentList? argumentList,
+      void Function()? bodyWriter,
+      String? classNameGroupName,
+      SimpleIdentifier? constructorName,
+      String? constructorNameGroupName,
+      List<String>? fieldNames,
+      void Function()? initializerWriter,
       bool isConst = false,
-      void Function() parameterWriter});
+      void Function()? parameterWriter});
 
   /// Write the code for a declaration of a field with the given [name]. If an
   /// [initializerWriter] is provided, it will be invoked to write the content
@@ -104,13 +80,13 @@
   /// required.) If a [typeGroupName] is provided, then if a type was written
   /// it will be in the linked edit group with that name.
   void writeFieldDeclaration(String name,
-      {void Function() initializerWriter,
+      {void Function()? initializerWriter,
       bool isConst = false,
       bool isFinal = false,
       bool isStatic = false,
-      String nameGroupName,
-      DartType type,
-      String typeGroupName});
+      String? nameGroupName,
+      DartType? type,
+      String? typeGroupName});
 
   /// Write the code for a declaration of a function with the given [name]. If a
   /// [bodyWriter] is provided, it will be invoked to write the body of the
@@ -125,12 +101,12 @@
   /// declarations of the parameters to the function. (The parentheses around
   /// the parameters will automatically be written.)
   void writeFunctionDeclaration(String name,
-      {void Function() bodyWriter,
+      {void Function()? bodyWriter,
       bool isStatic = false,
-      String nameGroupName,
-      void Function() parameterWriter,
-      DartType returnType,
-      String returnTypeGroupName});
+      String? nameGroupName,
+      void Function()? parameterWriter,
+      DartType? returnType,
+      String? returnTypeGroupName});
 
   /// Write the code for a declaration of a getter with the given [name]. If a
   /// [bodyWriter] is provided, it will be invoked to write the body of the
@@ -166,12 +142,12 @@
   /// when required.) If a [typeGroupName] is provided, then if a type was
   /// written it will be in the linked edit group with that name.
   void writeLocalVariableDeclaration(String name,
-      {void Function() initializerWriter,
+      {void Function()? initializerWriter,
       bool isConst = false,
       bool isFinal = false,
-      String nameGroupName,
-      DartType type,
-      String typeGroupName});
+      String? nameGroupName,
+      DartType? type,
+      String? typeGroupName});
 
   /// Write the code for a declaration of a mixin with the given [name]. If a
   /// list of [interfaces] is provided, then the mixin will implement those
@@ -180,10 +156,10 @@
   /// name of the class will be included in the linked edit group with that
   /// name.
   void writeMixinDeclaration(String name,
-      {Iterable<DartType> interfaces,
-      void Function() membersWriter,
-      String nameGroupName,
-      Iterable<DartType> superclassConstraints});
+      {Iterable<DartType>? interfaces,
+      void Function()? membersWriter,
+      String? nameGroupName,
+      Iterable<DartType>? superclassConstraints});
 
   /// Append a placeholder for an override of the specified inherited [element].
   /// If provided, write a string value suitable for display (e.g., in a
@@ -191,7 +167,7 @@
   /// `true`, then the corresponding `super.name()` will be added in the body.
   void writeOverride(
     ExecutableElement element, {
-    StringBuffer displayTextBuffer,
+    StringBuffer? displayTextBuffer,
     bool invokeSuper = false,
   });
 
@@ -218,10 +194,10 @@
   void writeParameter(String name,
       {bool isCovariant,
       bool isRequiredNamed,
-      ExecutableElement methodBeingCopied,
-      String nameGroupName,
-      DartType type,
-      String typeGroupName});
+      ExecutableElement? methodBeingCopied,
+      String? nameGroupName,
+      DartType? type,
+      String? typeGroupName});
 
   /// Write the code for a parameter that would match the given [argument]. The
   /// name of the parameter will be generated based on the type of the argument,
@@ -238,7 +214,7 @@
   /// method are assumed to be part of what is being written and hence valid
   /// types.
   void writeParameters(Iterable<ParameterElement> parameters,
-      {ExecutableElement methodBeingCopied});
+      {ExecutableElement? methodBeingCopied});
 
   /// Write the code for a list of parameters that would match the given list of
   /// [arguments]. The surrounding parentheses are *not* written.
@@ -259,11 +235,11 @@
   /// parameter. If a [parameterTypeGroupName] is provided, then if a parameter
   /// type was written it will be in the linked edit group with that name.
   void writeSetterDeclaration(String name,
-      {void Function() bodyWriter,
+      {void Function()? bodyWriter,
       bool isStatic = false,
-      String nameGroupName,
-      DartType parameterType,
-      String parameterTypeGroupName});
+      String? nameGroupName,
+      DartType? parameterType,
+      String? parameterTypeGroupName});
 
   /// Write the code for a type annotation for the given [type]. If the [type]
   /// is either `null` or represents the type 'dynamic', then the behavior
@@ -281,10 +257,10 @@
   /// types.
   ///
   /// Return `true` if some text was written.
-  bool writeType(DartType type,
+  bool writeType(DartType? type,
       {bool addSupertypeProposals = false,
-      String groupName,
-      ExecutableElement methodBeingCopied,
+      String? groupName,
+      ExecutableElement? methodBeingCopied,
       bool required = false});
 
   /// Write the code to declare the given [typeParameter]. The enclosing angle
@@ -294,7 +270,7 @@
   /// method are assumed to be part of what is being written and hence valid
   /// types.
   void writeTypeParameter(TypeParameterElement typeParameter,
-      {ExecutableElement methodBeingCopied});
+      {ExecutableElement? methodBeingCopied});
 
   /// Write the code to declare the given list of [typeParameters]. The
   /// enclosing angle brackets are automatically written.
@@ -303,12 +279,12 @@
   /// method are assumed to be part of what is being written and hence valid
   /// types.
   void writeTypeParameters(List<TypeParameterElement> typeParameters,
-      {ExecutableElement methodBeingCopied});
+      {ExecutableElement? methodBeingCopied});
 
   /// Write the code for a comma-separated list of [types], optionally prefixed
   /// by a [prefix]. If the list of [types] is `null` or does not contain any
   /// types, then nothing will be written.
-  void writeTypes(Iterable<DartType> types, {String prefix});
+  void writeTypes(Iterable<DartType>? types, {String? prefix});
 }
 
 /// A [FileEditBuilder] used to build edits for Dart files.
@@ -371,12 +347,12 @@
 abstract class DartLinkedEditBuilder implements LinkedEditBuilder {
   /// Add the given [type] and all of its supertypes (other than mixins) as
   /// suggestions for the current linked edit group.
-  void addSuperTypesAsSuggestions(DartType type);
+  void addSuperTypesAsSuggestions(DartType? type);
 }
 
 /// Information about a library to import.
 abstract class ImportLibraryElementResult {
   /// If the library is already imported with a prefix, or should be imported
   /// with a prefix, the prefix name (without `.`). Otherwise `null`.
-  String get prefix;
+  String? get prefix;
 }
diff --git a/pkg/analyzer_plugin/lib/utilities/change_builder/change_workspace.dart b/pkg/analyzer_plugin/lib/utilities/change_builder/change_workspace.dart
index a0f4469..c89a52c 100644
--- a/pkg/analyzer_plugin/lib/utilities/change_builder/change_workspace.dart
+++ b/pkg/analyzer_plugin/lib/utilities/change_builder/change_workspace.dart
@@ -7,9 +7,9 @@
 /// Information about the workspace in which change builders operate.
 abstract class ChangeWorkspace {
   /// Return `true` if the file with the given [path] is in a context root.
-  bool containsFile(String path);
+  bool? containsFile(String path);
 
   /// Return the session that should analyze the given [path], or throw
   /// [StateError] if the [path] does not belong to a context root.
-  AnalysisSession getSession(String path);
+  AnalysisSession? getSession(String path);
 }
diff --git a/pkg/analyzer_plugin/lib/utilities/change_builder/conflicting_edit_exception.dart b/pkg/analyzer_plugin/lib/utilities/change_builder/conflicting_edit_exception.dart
index db5a55f..624a43f 100644
--- a/pkg/analyzer_plugin/lib/utilities/change_builder/conflicting_edit_exception.dart
+++ b/pkg/analyzer_plugin/lib/utilities/change_builder/conflicting_edit_exception.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
-import 'package:meta/meta.dart';
 
 /// An exception that is thrown when a change builder is asked to include an
 /// edit that conflicts with a previous edit.
@@ -15,8 +14,7 @@
   final SourceEdit existingEdit;
 
   /// Initialize a newly created exception indicating that the [newEdit].
-  ConflictingEditException(
-      {@required this.newEdit, @required this.existingEdit});
+  ConflictingEditException({required this.newEdit, required this.existingEdit});
 
   @override
   String toString() =>
diff --git a/pkg/analyzer_plugin/lib/utilities/completion/completion_core.dart b/pkg/analyzer_plugin/lib/utilities/completion/completion_core.dart
index 4c225fe..f12f931 100644
--- a/pkg/analyzer_plugin/lib/utilities/completion/completion_core.dart
+++ b/pkg/analyzer_plugin/lib/utilities/completion/completion_core.dart
@@ -70,7 +70,7 @@
   /// Create a 'completion.getSuggestions' response for the file with the given
   /// [path]. If any of the contributors throws an exception, also create a
   /// non-fatal 'plugin.error' notification.
-  Future<GeneratorResult<CompletionGetSuggestionsResult>>
+  Future<GeneratorResult<CompletionGetSuggestionsResult?>>
       generateCompletionResponse(CompletionRequest request) async {
     var notifications = <Notification>[];
     var collector = CompletionCollectorImpl();
@@ -92,7 +92,7 @@
     collector.length ??= 0;
 
     var result = CompletionGetSuggestionsResult(
-        collector.offset, collector.length, collector.suggestions);
+        collector.offset!, collector.length!, collector.suggestions);
     return GeneratorResult(result, notifications);
   }
 }
diff --git a/pkg/analyzer_plugin/lib/utilities/completion/inherited_reference_contributor.dart b/pkg/analyzer_plugin/lib/utilities/completion/inherited_reference_contributor.dart
index bac46ee..a605f4e 100644
--- a/pkg/analyzer_plugin/lib/utilities/completion/inherited_reference_contributor.dart
+++ b/pkg/analyzer_plugin/lib/utilities/completion/inherited_reference_contributor.dart
@@ -20,13 +20,13 @@
     with ElementSuggestionBuilder
     implements CompletionContributor {
   @override
-  LibraryElement containingLibrary;
+  LibraryElement? containingLibrary;
 
   @override
-  CompletionSuggestionKind kind;
+  CompletionSuggestionKind? kind;
 
   @override
-  ResourceProvider resourceProvider;
+  ResourceProvider? resourceProvider;
 
   /// Plugin contributors should primarily overload this function. Should more
   /// parameters be needed for autocompletion needs, the overloaded function
@@ -35,7 +35,7 @@
   Future<void> computeSuggestions(
       DartCompletionRequest request, CompletionCollector collector) async {
     var target =
-        CompletionTarget.forOffset(request.result.unit, request.offset);
+        CompletionTarget.forOffset(request.result.unit!, request.offset);
     var optype = OpType.forCompletion(target, request.offset);
     if (!optype.includeIdentifiers) {
       return;
@@ -46,20 +46,20 @@
     }
     containingLibrary = request.result.libraryElement;
     _computeSuggestionsForClass2(
-        collector, target, classDecl.declaredElement, optype);
+        collector, target, classDecl.declaredElement!, optype);
   }
 
   /// Clients should not overload this function.
   Future<void> computeSuggestionsForClass(
     DartCompletionRequest request,
     CompletionCollector collector,
-    ClassElement classElement, {
-    AstNode entryPoint,
-    bool skipChildClass,
-    CompletionTarget target,
-    OpType optype,
+    ClassElement? classElement, {
+    AstNode? entryPoint,
+    bool skipChildClass = true,
+    CompletionTarget? target,
+    OpType? optype,
   }) async {
-    target ??= CompletionTarget.forOffset(request.result.unit, request.offset,
+    target ??= CompletionTarget.forOffset(request.result.unit!, request.offset,
         entryPoint: entryPoint);
     optype ??= OpType.forCompletion(target, request.offset);
     if (!optype.includeIdentifiers) {
@@ -73,7 +73,7 @@
       classElement = classDecl.declaredElement;
     }
     containingLibrary = request.result.libraryElement;
-    _computeSuggestionsForClass2(collector, target, classElement, optype,
+    _computeSuggestionsForClass2(collector, target, classElement!, optype,
         skipChildClass: skipChildClass);
   }
 
@@ -93,9 +93,7 @@
       }
     }
     for (var elem in type.methods) {
-      if (elem.returnType == null) {
-        addSuggestion(elem);
-      } else if (!elem.returnType.isVoid) {
+      if (!elem.returnType.isVoid) {
         if (optype.includeReturnValueSuggestions) {
           addSuggestion(elem);
         }
@@ -131,8 +129,8 @@
 
   /// Return the class containing the target or `null` if the target is in a
   /// static method or field or not in a class.
-  ClassDeclaration _enclosingClass(CompletionTarget target) {
-    var node = target.containingNode;
+  ClassDeclaration? _enclosingClass(CompletionTarget? target) {
+    var node = target?.containingNode;
     while (node != null) {
       if (node is ClassDeclaration) {
         return node;
diff --git a/pkg/analyzer_plugin/lib/utilities/completion/suggestion_builder.dart b/pkg/analyzer_plugin/lib/utilities/completion/suggestion_builder.dart
index a386ba7..2c8531c 100644
--- a/pkg/analyzer_plugin/lib/utilities/completion/suggestion_builder.dart
+++ b/pkg/analyzer_plugin/lib/utilities/completion/suggestion_builder.dart
@@ -10,8 +10,8 @@
 abstract class SuggestionBuilder {
   /// Return a suggestion based on the given [element], or `null` if a
   /// suggestion is not appropriate for the given element.
-  CompletionSuggestion forElement(Element element,
-      {String completion,
+  CompletionSuggestion? forElement(Element element,
+      {String? completion,
       CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
       int relevance = DART_RELEVANCE_DEFAULT});
 }
diff --git a/pkg/analyzer_plugin/lib/utilities/completion/type_member_contributor.dart b/pkg/analyzer_plugin/lib/utilities/completion/type_member_contributor.dart
index 19b3cb0..1009c12 100644
--- a/pkg/analyzer_plugin/lib/utilities/completion/type_member_contributor.dart
+++ b/pkg/analyzer_plugin/lib/utilities/completion/type_member_contributor.dart
@@ -27,11 +27,6 @@
   Future<void> computeSuggestions(
       DartCompletionRequest request, CompletionCollector collector) async {
     var containingLibrary = request.result.libraryElement;
-    // Gracefully degrade if the library element is not resolved
-    // e.g. detached part file or source change
-    if (containingLibrary == null) {
-      return;
-    }
 
     // Recompute the target since resolution may have changed it
     var expression = _computeDotTarget(request, null);
@@ -45,11 +40,6 @@
   Future<void> computeSuggestionsWithEntryPoint(DartCompletionRequest request,
       CompletionCollector collector, AstNode entryPoint) async {
     var containingLibrary = request.result.libraryElement;
-    // Gracefully degrade if the library element is not resolved
-    // e.g. detached part file or source change
-    if (containingLibrary == null) {
-      return;
-    }
 
     // Recompute the target since resolution may have changed it
     var expression = _computeDotTarget(request, entryPoint);
@@ -60,16 +50,20 @@
   }
 
   /// Update the completion [target] and [dotTarget] based on the given [unit].
-  Expression _computeDotTarget(
-      DartCompletionRequest request, AstNode entryPoint) {
-    var target = CompletionTarget.forOffset(request.result.unit, request.offset,
+  Expression? _computeDotTarget(
+      DartCompletionRequest request, AstNode? entryPoint) {
+    var target = CompletionTarget.forOffset(
+        request.result.unit!, request.offset,
         entryPoint: entryPoint);
     var node = target.containingNode;
     if (node is MethodInvocation) {
       if (identical(node.methodName, target.entity)) {
         return node.realTarget;
-      } else if (node.isCascaded && node.operator.offset + 1 == target.offset) {
-        return node.realTarget;
+      } else if (node.isCascaded) {
+        var operator = node.operator;
+        if (operator != null && operator.offset + 1 == target.offset) {
+          return node.realTarget;
+        }
       }
     }
     if (node is PropertyAccess) {
@@ -129,19 +123,17 @@
         }
       }
     }
-    String containingMethodName;
+    String? containingMethodName;
     if (expression is SuperExpression && type is InterfaceType) {
       // Suggest members from superclass if target is "super"
-      type = (type as InterfaceType).superclass;
+      type = type.superclass;
       // Determine the name of the containing method because
       // the most likely completion is a super expression with same name
       var containingMethod =
           expression.thisOrAncestorOfType<MethodDeclaration>();
-      if (containingMethod != null) {
-        var id = containingMethod.name;
-        if (id != null) {
-          containingMethodName = id.name;
-        }
+      var id = containingMethod?.name;
+      if (id != null) {
+        containingMethodName = id.name;
       }
     }
     if (type == null || type.isDynamic) {
@@ -166,7 +158,7 @@
 
   /// The best type for the found declaration,
   /// or `null` if no declaration found or failed to determine a type.
-  DartType typeFound;
+  DartType? typeFound;
 
   /// Construct a new instance to search for a declaration
   _LocalBestTypeVisitor(this.targetName, int offset) : super(offset);
@@ -240,7 +232,7 @@
   }
 
   @override
-  void declaredLocalVar(SimpleIdentifier name, TypeAnnotation type) {
+  void declaredLocalVar(SimpleIdentifier name, TypeAnnotation? type) {
     if (name.name == targetName) {
       var element = name.staticElement as VariableElement;
       typeFound = element.type;
@@ -260,7 +252,7 @@
   }
 
   @override
-  void declaredParam(SimpleIdentifier name, TypeAnnotation type) {
+  void declaredParam(SimpleIdentifier name, TypeAnnotation? type) {
     if (name.name == targetName) {
       // Type provided by the element in computeFull above
       finished();
@@ -330,7 +322,7 @@
   /// Create completion suggestions for 'dot' completions on the given [type].
   /// If the 'dot' completion is a super expression, then [containingMethodName]
   /// is the name of the method in which the completion is requested.
-  void buildSuggestions(InterfaceType type, String containingMethodName) {
+  void buildSuggestions(InterfaceType type, String? containingMethodName) {
     // Visit all of the types in the class hierarchy, collecting possible
     // completions. If multiple elements are found that complete to the same
     // identifier, addSuggestion will discard all but the first (with a few
@@ -368,7 +360,7 @@
 
   /// Add a suggestion based upon the given element, provided that it is not
   /// shadowed by a previously added suggestion.
-  void _addSuggestion(Element element, {int relevance}) {
+  void _addSuggestion(Element element, {int? relevance}) {
     if (element.isPrivate) {
       if (element.library != containingLibrary) {
         // Do not suggest private members for imported libraries
@@ -380,7 +372,7 @@
     if (relevance == null) {
       // Decrease relevance of suggestions starting with $
       // https://github.com/dart-lang/sdk/issues/27303
-      if (identifier != null && identifier.startsWith(r'$')) {
+      if (identifier.startsWith(r'$')) {
         relevance = DART_RELEVANCE_LOW;
       } else {
         relevance = DART_RELEVANCE_DEFAULT;
@@ -402,13 +394,15 @@
         if ((alreadyGenerated & _COMPLETION_TYPE_GETTER) != 0) {
           return;
         }
-        _completionTypesGenerated[identifier] |= _COMPLETION_TYPE_GETTER;
+        _completionTypesGenerated[identifier] =
+            _completionTypesGenerated[identifier]! | _COMPLETION_TYPE_GETTER;
       } else {
         // Setters, fields, and methods shadow a setter.
         if ((alreadyGenerated & _COMPLETION_TYPE_SETTER) != 0) {
           return;
         }
-        _completionTypesGenerated[identifier] |= _COMPLETION_TYPE_SETTER;
+        _completionTypesGenerated[identifier] =
+            _completionTypesGenerated[identifier]! | _COMPLETION_TYPE_SETTER;
       }
     } else if (element is FieldElement) {
       // Fields and methods shadow a field. A getter/setter pair shadows a
@@ -457,7 +451,7 @@
       // in the reverse order.
       typesToVisit.addAll(nextType.interfaces);
       if (nextType.superclass != null) {
-        typesToVisit.add(nextType.superclass);
+        typesToVisit.add(nextType.superclass!);
       }
       typesToVisit.addAll(nextType.mixins);
     }
diff --git a/pkg/analyzer_plugin/lib/utilities/fixes/fix_contributor_mixin.dart b/pkg/analyzer_plugin/lib/utilities/fixes/fix_contributor_mixin.dart
index b4be5b0..2edbd4c 100644
--- a/pkg/analyzer_plugin/lib/utilities/fixes/fix_contributor_mixin.dart
+++ b/pkg/analyzer_plugin/lib/utilities/fixes/fix_contributor_mixin.dart
@@ -15,29 +15,29 @@
 /// a mix-in when creating a subclass of [FixContributor].
 abstract class FixContributorMixin implements FixContributor {
   /// The request that specifies the fixes that are to be built.
-  DartFixesRequest request;
+  DartFixesRequest? request;
 
   /// The collector to which fixes should be added.
-  FixCollector collector;
+  FixCollector? collector;
 
   /// Add a fix for the given [error]. Use the [kind] of the fix to get the
   /// message and priority, and use the change [builder] to get the edits that
   /// comprise the fix. If the message has parameters, then use the list of
   /// [args] to populate the message.
   void addFix(AnalysisError error, FixKind kind, ChangeBuilder builder,
-      {List<Object> args}) {
+      {List<Object>? args}) {
     var change = builder.sourceChange;
     if (change.edits.isEmpty) {
       return;
     }
     change.id = kind.id;
     change.message = formatList(kind.message, args);
-    collector.addFix(
-        error, PrioritizedSourceChange(kind.priority, change));
+    collector?.addFix(error, PrioritizedSourceChange(kind.priority, change));
   }
 
   @override
-  Future<void> computeFixes(DartFixesRequest request, FixCollector collector) async {
+  Future<void> computeFixes(
+      DartFixesRequest request, FixCollector collector) async {
     this.request = request;
     this.collector = collector;
     try {
diff --git a/pkg/analyzer_plugin/lib/utilities/generator.dart b/pkg/analyzer_plugin/lib/utilities/generator.dart
index 4012c9a..80fabb9 100644
--- a/pkg/analyzer_plugin/lib/utilities/generator.dart
+++ b/pkg/analyzer_plugin/lib/utilities/generator.dart
@@ -9,7 +9,7 @@
 /// The result produced by a generator.
 ///
 /// Clients may not extend, implement or mix-in this class.
-class GeneratorResult<T extends ResponseResult> {
+class GeneratorResult<T extends ResponseResult?> {
   /// The result to be sent to the server, or `null` if there is no response, as
   /// when the generator is generating a notification.
   final T result;
diff --git a/pkg/analyzer_plugin/lib/utilities/navigation/navigation.dart b/pkg/analyzer_plugin/lib/utilities/navigation/navigation.dart
index 74d0821..9e02f7a4f 100644
--- a/pkg/analyzer_plugin/lib/utilities/navigation/navigation.dart
+++ b/pkg/analyzer_plugin/lib/utilities/navigation/navigation.dart
@@ -40,7 +40,7 @@
   /// should navigate to the given [targetNameLocation].
   void addRegion(int offset, int length, ElementKind targetKind,
       Location targetNameLocation,
-      {Location targetCodeLocation});
+      {Location? targetCodeLocation});
 }
 
 /// An object used to produce navigation regions.
@@ -115,7 +115,7 @@
 abstract class NavigationRequest {
   /// Return the length of the region within the source for which navigation
   /// regions are being requested.
-  int get length;
+  int? get length;
 
   /// Return the offset of the region within the source for which navigation
   /// regions are being requested.
diff --git a/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart b/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart
index 4134ed6..dde44ba 100644
--- a/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart
+++ b/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart
@@ -18,8 +18,8 @@
     ResourceProvider resourceProvider,
     NavigationCollector collector,
     CompilationUnit unit,
-    int offset,
-    int length) {
+    int? offset,
+    int? length) {
   var dartCollector = _DartNavigationCollector(collector, offset, length);
   var visitor = _DartNavigationComputerVisitor(resourceProvider, dartCollector);
   if (offset == null || length == null) {
@@ -31,7 +31,7 @@
   return collector;
 }
 
-AstNode _getNodeForRange(CompilationUnit unit, int offset, int length) {
+AstNode? _getNodeForRange(CompilationUnit unit, int offset, int length) {
   var node = NodeLocator(offset, offset + length).searchWithin(unit);
   for (var n = node; n != null; n = n.parent) {
     if (n is Directive) {
@@ -44,15 +44,15 @@
 /// A Dart specific wrapper around [NavigationCollector].
 class _DartNavigationCollector {
   final NavigationCollector collector;
-  final int requestedOffset;
-  final int requestedLength;
+  final int? requestedOffset;
+  final int? requestedLength;
 
   _DartNavigationCollector(
       this.collector, this.requestedOffset, this.requestedLength);
 
-  void _addRegion(int offset, int length, Element element) {
+  void _addRegion(int offset, int length, Element? element) {
     if (element is FieldFormalParameterElement) {
-      element = (element as FieldFormalParameterElement).field;
+      element = element.field;
     }
     if (element == null || element == DynamicElementImpl.instance) {
       return;
@@ -62,8 +62,8 @@
     }
     // Discard elements that don't span the offset/range given (if provided).
     if (requestedOffset != null &&
-        (offset > requestedOffset + (requestedLength ?? 0) ||
-            offset + length < requestedOffset)) {
+        (offset > requestedOffset! + (requestedLength ?? 0) ||
+            offset + length < requestedOffset!)) {
       return;
     }
     var converter = AnalyzerConverter();
@@ -81,13 +81,13 @@
         targetCodeLocation: codeLocation);
   }
 
-  void _addRegion_nodeStart_nodeEnd(AstNode a, AstNode b, Element element) {
+  void _addRegion_nodeStart_nodeEnd(AstNode a, AstNode b, Element? element) {
     var offset = a.offset;
     var length = b.end - offset;
     _addRegion(offset, length, element);
   }
 
-  void _addRegionForNode(AstNode node, Element element) {
+  void _addRegionForNode(AstNode? node, Element? element) {
     if (node == null) {
       return;
     }
@@ -96,20 +96,20 @@
     _addRegion(offset, length, element);
   }
 
-  void _addRegionForToken(Token token, Element element) {
+  void _addRegionForToken(Token token, Element? element) {
     var offset = token.offset;
     var length = token.length;
     _addRegion(offset, length, element);
   }
 
   /// Get the location of the code (excluding leading doc comments) for this element.
-  protocol.Location _getCodeLocation(Element element,
+  protocol.Location? _getCodeLocation(Element element,
       protocol.Location location, AnalyzerConverter converter) {
     var codeElement = element;
     // For synthetic getters created for fields, we need to access the associated
     // variable to get the codeOffset/codeLength.
     if (codeElement.isSynthetic && codeElement is PropertyAccessorElementImpl) {
-      final variable = (codeElement as PropertyAccessorElementImpl).variable;
+      final variable = codeElement.variable;
       if (variable is ElementImpl) {
         codeElement = variable as ElementImpl;
       }
@@ -117,7 +117,7 @@
 
     // Read the main codeOffset from the element. This may include doc comments
     // but will give the correct end position.
-    int codeOffset, codeLength;
+    int? codeOffset, codeLength;
     if (codeElement is ElementImpl) {
       codeOffset = codeElement.codeOffset;
       codeLength = codeElement.codeLength;
@@ -130,11 +130,13 @@
     // Read the declaration so we can get the offset after the doc comments.
     // TODO(dantup): Skip this for parts (getParsedLibrary will throw), but find
     // a better solution.
-    final declaration = !codeElement.session.getFile(location.file).isPart
-        ? codeElement.session
-            .getParsedLibrary(location.file)
-            .getElementDeclaration(codeElement)
-        : null;
+    var session = codeElement.session;
+    final declaration =
+        session != null && !session.getFile(location.file).isPart
+            ? session
+                .getParsedLibrary(location.file)
+                .getElementDeclaration(codeElement)
+            : null;
     var node = declaration?.node;
     if (node is VariableDeclaration) {
       node = node.parent;
@@ -147,10 +149,6 @@
       codeOffset = offsetAfterDocs;
     }
 
-    if (codeOffset == null || codeLength == null) {
-      return null;
-    }
-
     return converter.locationFromElement(element,
         offset: codeOffset, length: codeLength);
   }
@@ -190,16 +188,16 @@
 
   @override
   void visitAssignmentExpression(AssignmentExpression node) {
-    node.leftHandSide?.accept(this);
+    node.leftHandSide.accept(this);
     computer._addRegionForToken(node.operator, node.staticElement);
-    node.rightHandSide?.accept(this);
+    node.rightHandSide.accept(this);
   }
 
   @override
   void visitBinaryExpression(BinaryExpression node) {
-    node.leftOperand?.accept(this);
+    node.leftOperand.accept(this);
     computer._addRegionForToken(node.operator, node.staticElement);
-    node.rightOperand?.accept(this);
+    node.rightOperand.accept(this);
   }
 
   @override
@@ -240,12 +238,10 @@
     // associate constructor with "T" or "T.name"
     {
       AstNode firstNode = node.returnType;
-      AstNode lastNode = node.name;
+      AstNode? lastNode = node.name;
       lastNode ??= firstNode;
-      if (firstNode != null && lastNode != null) {
-        computer._addRegion_nodeStart_nodeEnd(
-            firstNode, lastNode, node.declaredElement);
-      }
+      computer._addRegion_nodeStart_nodeEnd(
+          firstNode, lastNode, node.declaredElement);
     }
     super.visitConstructorDeclaration(node);
   }
@@ -266,7 +262,7 @@
   void visitDeclaredIdentifier(DeclaredIdentifier node) {
     if (node.type == null) {
       var token = node.keyword;
-      if (token?.keyword == Keyword.VAR) {
+      if (token != null && token.keyword == Keyword.VAR) {
         var inferredType = node.declaredElement?.type;
         var element = inferredType?.element;
         if (element != null) {
@@ -281,7 +277,7 @@
   void visitExportDirective(ExportDirective node) {
     var exportElement = node.element;
     if (exportElement != null) {
-      Element libraryElement = exportElement.exportedLibrary;
+      Element? libraryElement = exportElement.exportedLibrary;
       _addUriDirectiveRegion(node, libraryElement);
     }
     super.visitExportDirective(node);
@@ -291,7 +287,7 @@
   void visitImportDirective(ImportDirective node) {
     var importElement = node.element;
     if (importElement != null) {
-      Element libraryElement = importElement.importedLibrary;
+      Element? libraryElement = importElement.importedLibrary;
       _addUriDirectiveRegion(node, libraryElement);
     }
     super.visitImportDirective(node);
@@ -337,7 +333,7 @@
   @override
   void visitRedirectingConstructorInvocation(
       RedirectingConstructorInvocation node) {
-    Element element = node.staticElement;
+    Element? element = node.staticElement;
     if (element != null && element.isSynthetic) {
       element = element.enclosingElement;
     }
@@ -345,7 +341,7 @@
     computer._addRegionForToken(node.thisKeyword, element);
     computer._addRegionForNode(node.constructorName, element);
     // process arguments
-    node.argumentList?.accept(this);
+    node.argumentList.accept(this);
   }
 
   @override
@@ -359,7 +355,7 @@
 
   @override
   void visitSuperConstructorInvocation(SuperConstructorInvocation node) {
-    Element element = node.staticElement;
+    Element? element = node.staticElement;
     if (element != null && element.isSynthetic) {
       element = element.enclosingElement;
     }
@@ -367,7 +363,7 @@
     computer._addRegionForToken(node.superKeyword, element);
     computer._addRegionForNode(node.constructorName, element);
     // process arguments
-    node.argumentList?.accept(this);
+    node.argumentList.accept(this);
   }
 
   @override
@@ -375,13 +371,13 @@
     /// Return the element for the type inferred for each of the variables in
     /// the given list of [variables], or `null` if not all variable have the
     /// same inferred type.
-    Element getCommonElement(List<VariableDeclaration> variables) {
-      var firstElement = variables[0].declaredElement.type?.element;
+    Element? getCommonElement(List<VariableDeclaration> variables) {
+      var firstElement = variables[0].declaredElement?.type.element;
       if (firstElement == null) {
         return null;
       }
       for (var i = 1; i < variables.length; i++) {
-        var element = variables[1].declaredElement.type?.element;
+        var element = variables[1].declaredElement?.type.element;
         if (element != firstElement) {
           return null;
         }
@@ -394,7 +390,7 @@
       if (token?.keyword == Keyword.VAR) {
         var element = getCommonElement(node.variables);
         if (element != null) {
-          computer._addRegionForToken(token, element);
+          computer._addRegionForToken(token!, element);
         }
       }
     }
@@ -402,7 +398,7 @@
   }
 
   void _addConstructorName(AstNode parent, ConstructorName node) {
-    Element element = node.staticElement;
+    Element? element = node.staticElement;
     if (element == null) {
       return;
     }
@@ -435,7 +431,7 @@
 
   /// If the source of the given [element] (referenced by the [node]) exists,
   /// then add the navigation region from the [node] to the [element].
-  void _addUriDirectiveRegion(UriBasedDirective node, Element element) {
+  void _addUriDirectiveRegion(UriBasedDirective node, Element? element) {
     var source = element?.source;
     if (source != null) {
       if (resourceProvider.getResource(source.fullName).exists) {
diff --git a/pkg/analyzer_plugin/lib/utilities/range_factory.dart b/pkg/analyzer_plugin/lib/utilities/range_factory.dart
index fbcbaa3..b967af5 100644
--- a/pkg/analyzer_plugin/lib/utilities/range_factory.dart
+++ b/pkg/analyzer_plugin/lib/utilities/range_factory.dart
@@ -103,8 +103,8 @@
   SourceRange nodeInList<T extends AstNode>(NodeList<T> list, T item) {
     if (list.length == 1) {
       var nextToken = item.endToken.next;
-      if (nextToken.type == TokenType.COMMA) {
-        return startEnd(item, nextToken);
+      if (nextToken?.type == TokenType.COMMA) {
+        return startEnd(item, nextToken!);
       }
       return node(item);
     }
diff --git a/pkg/analyzer_plugin/lib/utilities/subscriptions/subscription_manager.dart b/pkg/analyzer_plugin/lib/utilities/subscriptions/subscription_manager.dart
index 22b0fec..5022374 100644
--- a/pkg/analyzer_plugin/lib/utilities/subscriptions/subscription_manager.dart
+++ b/pkg/analyzer_plugin/lib/utilities/subscriptions/subscription_manager.dart
@@ -9,7 +9,7 @@
 /// Clients may not extend, implement or mix-in this class.
 class SubscriptionManager {
   /// The current set of subscriptions.
-  Map<AnalysisService, List<String>> _subscriptions;
+  Map<AnalysisService, List<String>>? _subscriptions;
 
   /// Initialize a newly created subscription manager to have no subscriptions.
   SubscriptionManager();
@@ -17,10 +17,11 @@
   /// Return `true` if the file with the given [filePath] has a subscription for
   /// the given [service].
   bool hasSubscriptionForFile(String filePath, AnalysisService service) {
-    if (_subscriptions == null) {
+    var subscriptions = _subscriptions;
+    if (subscriptions == null) {
       return false;
     }
-    var files = _subscriptions[service];
+    var files = subscriptions[service];
     return files != null && files.contains(filePath);
   }
 
@@ -28,8 +29,9 @@
   /// has been subscribed.
   List<AnalysisService> servicesForFile(String filePath) {
     var services = <AnalysisService>[];
-    if (_subscriptions != null) {
-      _subscriptions.forEach((AnalysisService service, List<String> files) {
+    var subscriptions = _subscriptions;
+    if (subscriptions != null) {
+      subscriptions.forEach((AnalysisService service, List<String> files) {
         if (files.contains(filePath)) {
           services.add(service);
         }
@@ -47,7 +49,8 @@
   Map<String, List<AnalysisService>> setSubscriptions(
       Map<AnalysisService, List<String>> subscriptions) {
     var newSubscriptions = <String, List<AnalysisService>>{};
-    if (_subscriptions == null) {
+    var currentSubscriptions = _subscriptions;
+    if (currentSubscriptions == null) {
       // This is the first time subscriptions have been set, so all of the
       // subscriptions are new.
       subscriptions.forEach((AnalysisService service, List<String> paths) {
@@ -61,9 +64,9 @@
       // The subscriptions have been changed, to we need to compute the
       // difference.
       subscriptions.forEach((AnalysisService service, List<String> paths) {
-        var oldPaths = _subscriptions[service];
+        var oldPaths = currentSubscriptions[service];
         for (var path in paths) {
-          if (!oldPaths.contains(path)) {
+          if (oldPaths == null || !oldPaths.contains(path)) {
             newSubscriptions
                 .putIfAbsent(path, () => <AnalysisService>[])
                 .add(service);
diff --git a/pkg/analyzer_plugin/pubspec.yaml b/pkg/analyzer_plugin/pubspec.yaml
index 2a91465..d2aed48 100644
--- a/pkg/analyzer_plugin/pubspec.yaml
+++ b/pkg/analyzer_plugin/pubspec.yaml
@@ -5,18 +5,18 @@
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/analyzer_plugin
 
 environment:
-  sdk: '>=2.9.0 <3.0.0'
+  sdk: '>=2.12.0 <3.0.0'
 
 dependencies:
-  analyzer: '>=0.42.0 <0.43.0'
-  dart_style: '^1.2.0'
-  meta: ^1.2.3
-  pub_semver: '^1.3.2'
+  analyzer: ^1.3.0
+  collection: ^1.15.0
+  dart_style: ^2.0.0
+  pub_semver: ^2.0.0
 
 dev_dependencies:
   analyzer_utilities:
     path: ../analyzer_utilities
-  html: '>=0.13.1 <0.15.0'
-  path: '^1.4.1'
-  test_reflective_loader: ^0.1.8
-  test: ^1.0.0
+  html: ^0.15.0
+  path: ^1.8.0
+  test_reflective_loader: ^0.2.0
+  test: ^1.16.6
diff --git a/pkg/analyzer_plugin/test/integration/support/integration_test_methods.dart b/pkg/analyzer_plugin/test/integration/support/integration_test_methods.dart
index 7bc81f3..79c042c 100644
--- a/pkg/analyzer_plugin/test/integration/support/integration_test_methods.dart
+++ b/pkg/analyzer_plugin/test/integration/support/integration_test_methods.dart
@@ -112,10 +112,10 @@
   ///
   ///   The stack trace associated with the generation of the error, used for
   ///   debugging the plugin.
-  Stream<PluginErrorParams> onPluginError;
+  late Stream<PluginErrorParams> onPluginError;
 
   /// Stream controller for [onPluginError].
-  StreamController<PluginErrorParams> _onPluginError;
+  late StreamController<PluginErrorParams> _onPluginError;
 
   /// Return the navigation information associated with the given region of the
   /// given file. If the navigation information for the given file has not yet
@@ -257,7 +257,7 @@
   ///
   ///   A table mapping the files whose content has changed to a description of
   ///   the content change.
-  Future sendAnalysisUpdateContent(Map<String, dynamic> files) async {
+  Future sendAnalysisUpdateContent(Map<String, Object> files) async {
     var params = AnalysisUpdateContentParams(files).toJson();
     var result = await server.send('analysis.updateContent', params);
     outOfTestExpect(result, isNull);
@@ -277,10 +277,10 @@
   /// errors: List<AnalysisError>
   ///
   ///   The errors contained in the file.
-  Stream<AnalysisErrorsParams> onAnalysisErrors;
+  late Stream<AnalysisErrorsParams> onAnalysisErrors;
 
   /// Stream controller for [onAnalysisErrors].
-  StreamController<AnalysisErrorsParams> _onAnalysisErrors;
+  late StreamController<AnalysisErrorsParams> _onAnalysisErrors;
 
   /// Used to report the folding regions associated with a given file. Folding
   /// regions can be nested, but cannot be overlapping. Nesting occurs when a
@@ -304,10 +304,10 @@
   /// regions: List<FoldingRegion>
   ///
   ///   The folding regions contained in the file.
-  Stream<AnalysisFoldingParams> onAnalysisFolding;
+  late Stream<AnalysisFoldingParams> onAnalysisFolding;
 
   /// Stream controller for [onAnalysisFolding].
-  StreamController<AnalysisFoldingParams> _onAnalysisFolding;
+  late StreamController<AnalysisFoldingParams> _onAnalysisFolding;
 
   /// Used to report the highlight regions associated with a given file. Each
   /// highlight region represents a particular syntactic or semantic meaning
@@ -328,10 +328,10 @@
   /// regions: List<HighlightRegion>
   ///
   ///   The highlight regions contained in the file.
-  Stream<AnalysisHighlightsParams> onAnalysisHighlights;
+  late Stream<AnalysisHighlightsParams> onAnalysisHighlights;
 
   /// Stream controller for [onAnalysisHighlights].
-  StreamController<AnalysisHighlightsParams> _onAnalysisHighlights;
+  late StreamController<AnalysisHighlightsParams> _onAnalysisHighlights;
 
   /// Used to report the navigation regions associated with a given file. Each
   /// navigation region represents a list of targets associated with some
@@ -369,10 +369,10 @@
   ///
   ///   The files containing navigation targets referenced in the file. They
   ///   are referenced by NavigationTargets by their index in this array.
-  Stream<AnalysisNavigationParams> onAnalysisNavigation;
+  late Stream<AnalysisNavigationParams> onAnalysisNavigation;
 
   /// Stream controller for [onAnalysisNavigation].
-  StreamController<AnalysisNavigationParams> _onAnalysisNavigation;
+  late StreamController<AnalysisNavigationParams> _onAnalysisNavigation;
 
   /// Used to report the occurrences of references to elements within a single
   /// file. None of the occurrence regions should overlap.
@@ -395,10 +395,10 @@
   /// occurrences: List<Occurrences>
   ///
   ///   The occurrences of references to elements within the file.
-  Stream<AnalysisOccurrencesParams> onAnalysisOccurrences;
+  late Stream<AnalysisOccurrencesParams> onAnalysisOccurrences;
 
   /// Stream controller for [onAnalysisOccurrences].
-  StreamController<AnalysisOccurrencesParams> _onAnalysisOccurrences;
+  late StreamController<AnalysisOccurrencesParams> _onAnalysisOccurrences;
 
   /// Used to report the outline fragments associated with a single file.
   ///
@@ -419,10 +419,10 @@
   /// outline: List<Outline>
   ///
   ///   The outline fragments associated with the file.
-  Stream<AnalysisOutlineParams> onAnalysisOutline;
+  late Stream<AnalysisOutlineParams> onAnalysisOutline;
 
   /// Stream controller for [onAnalysisOutline].
-  StreamController<AnalysisOutlineParams> _onAnalysisOutline;
+  late StreamController<AnalysisOutlineParams> _onAnalysisOutline;
 
   /// Used to request that completion suggestions for the given offset in the
   /// given file be returned.
@@ -642,7 +642,7 @@
   ///   the refactoring.
   Future<EditGetRefactoringResult> sendEditGetRefactoring(RefactoringKind kind,
       String file, int offset, int length, bool validateOnly,
-      {RefactoringOptions options}) async {
+      {RefactoringOptions? options}) async {
     var params = EditGetRefactoringParams(
             kind, file, offset, length, validateOnly,
             options: options)
@@ -746,7 +746,6 @@
         break;
       default:
         fail('Unexpected notification: $event');
-        break;
     }
   }
 }
diff --git a/pkg/analyzer_plugin/test/integration/support/integration_tests.dart b/pkg/analyzer_plugin/test/integration/support/integration_tests.dart
index 3d3391c..0fe14b2 100644
--- a/pkg/analyzer_plugin/test/integration/support/integration_tests.dart
+++ b/pkg/analyzer_plugin/test/integration/support/integration_tests.dart
@@ -39,7 +39,7 @@
 
 /// Assert that [actual] matches [matcher].
 void outOfTestExpect(actual, Matcher matcher,
-    {String reason, skip, bool verbose = false}) {
+    {String? reason, skip, bool verbose = false}) {
   var matchState = {};
   try {
     if (matcher.matches(actual, matchState)) return;
@@ -50,7 +50,7 @@
 }
 
 String _defaultFailFormatter(
-    actual, Matcher matcher, String reason, Map matchState, bool verbose) {
+    actual, Matcher matcher, String? reason, Map matchState, bool verbose) {
   var description = StringDescription();
   description.add('Expected: ').addDescriptionOf(matcher).add('\n');
   description.add('  Actual: ').addDescriptionOf(actual).add('\n');
@@ -87,7 +87,7 @@
   final Server server = Server();
 
   /// Temporary directory in which source files can be stored.
-  Directory sourceDirectory;
+  Directory? sourceDirectory;
 
   /// Map from file path to the list of analysis errors which have most recently
   /// been received for the file.
@@ -176,7 +176,7 @@
   /// relative to [sourceDirectory]. On Windows any forward slashes in
   /// [relativePath] are converted to backslashes.
   String sourcePath(String relativePath) {
-    return join(sourceDirectory.path, relativePath.replaceAll('/', separator));
+    return join(sourceDirectory!.path, relativePath.replaceAll('/', separator));
   }
 
   /// Send the server an 'analysis.setAnalysisRoots' command directing it to
@@ -195,7 +195,7 @@
 
   /// Start [server].
   Future startServer(
-          {bool checked = true, int diagnosticPort, int servicesPort}) =>
+          {bool checked = true, int? diagnosticPort, int? servicesPort}) =>
       server.start(
           checked: checked,
           diagnosticPort: diagnosticPort,
@@ -204,7 +204,7 @@
   /// After every test, the server is stopped and [sourceDirectory] is deleted.
   Future tearDown() {
     return shutdownIfNeeded().then((_) {
-      sourceDirectory.deleteSync(recursive: true);
+      sourceDirectory!.deleteSync(recursive: true);
     });
   }
 
@@ -234,28 +234,28 @@
 
   /// The matcher returned by [_creator], if it has already been called.
   /// Otherwise null.
-  Matcher _wrappedMatcher;
+  Matcher? _wrappedMatcher;
 
   LazyMatcher(this._creator);
 
   @override
   Description describe(Description description) {
     _createMatcher();
-    return _wrappedMatcher.describe(description);
+    return _wrappedMatcher!.describe(description);
   }
 
   @override
   Description describeMismatch(
       item, Description mismatchDescription, Map matchState, bool verbose) {
     _createMatcher();
-    return _wrappedMatcher.describeMismatch(
-        item, mismatchDescription, matchState, verbose);
+    return _wrappedMatcher!
+        .describeMismatch(item, mismatchDescription, matchState, verbose);
   }
 
   @override
   bool matches(item, Map matchState) {
     _createMatcher();
-    return _wrappedMatcher.matches(item, matchState);
+    return _wrappedMatcher!.matches(item, matchState);
   }
 
   /// Create the wrapped matcher object, if it hasn't been created already.
@@ -292,11 +292,11 @@
 
   /// Fields that are required to be in the JSON object, and [Matcher]s describing
   /// their expected types.
-  final Map<String, Matcher> requiredFields;
+  final Map<String, Matcher>? requiredFields;
 
   /// Fields that are optional in the JSON object, and [Matcher]s describing
   /// their expected types.
-  final Map<String, Matcher> optionalFields;
+  final Map<String, Matcher>? optionalFields;
 
   const MatchesJsonObject(this.description, this.requiredFields,
       {this.optionalFields});
@@ -311,9 +311,10 @@
       mismatches.add(simpleDescription('is not a map'));
       return;
     }
+    var requiredFields = this.requiredFields;
     if (requiredFields != null) {
       requiredFields.forEach((String key, Matcher valueMatcher) {
-        if (!(item as Map).containsKey(key)) {
+        if (!item.containsKey(key)) {
           mismatches.add((Description mismatchDescription) =>
               mismatchDescription
                   .add('is missing field ')
@@ -326,11 +327,12 @@
         }
       });
     }
+    var optionalFields = this.optionalFields;
     item.forEach((key, value) {
       if (requiredFields != null && requiredFields.containsKey(key)) {
         // Already checked this field
       } else if (optionalFields != null && optionalFields.containsKey(key)) {
-        _checkField(key as String, value, optionalFields[key], mismatches);
+        _checkField(key as String, value, optionalFields[key]!, mismatches);
       } else {
         mismatches.add((Description mismatchDescription) => mismatchDescription
             .add('has unexpected field ')
@@ -357,7 +359,7 @@
 /// facilitate communication to and from the server.
 class Server {
   /// Server process object, or null if server hasn't been started yet.
-  Process _process;
+  Process? _process;
 
   /// Commands that have been sent to the server but not yet acknowledged, and
   /// the [Completer] objects which should be completed when acknowledgement is
@@ -385,13 +387,13 @@
 
   /// The [currentElapseTime] at which the last communication was received from the server
   /// or `null` if no communication has been received.
-  double lastCommunicationTime;
+  double? lastCommunicationTime;
 
   /// The current elapse time (seconds) since the server was started.
   double get currentElapseTime => _time.elapsedTicks / _time.frequency;
 
   /// Future that completes when the server process exits.
-  Future<int> get exitCode => _process.exitCode;
+  Future<int> get exitCode => _process!.exitCode;
 
   /// Print out any messages exchanged with the server. If some messages have
   /// already been exchanged with the server, they are printed out immediately.
@@ -421,21 +423,21 @@
   /// Return a future that will complete when all commands that have been sent
   /// to the server so far have been flushed to the OS buffer.
   Future flushCommands() {
-    return _process.stdin.flush();
+    return _process!.stdin.flush();
   }
 
   /// Stop the server.
   Future<int> kill(String reason) {
     debugStdio();
     _recordStdio('FORCIBLY TERMINATING PROCESS: $reason');
-    _process.kill();
-    return _process.exitCode;
+    _process!.kill();
+    return _process!.exitCode;
   }
 
   /// Start listening to output from the server, and deliver notifications to
   /// [notificationProcessor].
   void listenToOutput(NotificationProcessor notificationProcessor) {
-    _process.stdout
+    _process!.stdout
         .transform((Utf8Codec()).decoder)
         .transform(LineSplitter())
         .listen((String line) {
@@ -485,7 +487,7 @@
         outOfTestExpect(message, isNotification);
       }
     });
-    _process.stderr
+    _process!.stderr
         .transform((Utf8Codec()).decoder)
         .transform(LineSplitter())
         .listen((String line) {
@@ -501,7 +503,7 @@
   /// normal (non-error) response, the future will be completed with the 'result'
   /// field from the response. If the server acknowledges the command with an
   /// error response, the future will be completed with an error.
-  Future send(String method, Map<String, dynamic> params) {
+  Future send(String method, Map<String, dynamic>? params) {
     var id = '${_nextId++}';
     var command = <String, dynamic>{'id': id, 'method': method};
     if (params != null) {
@@ -511,7 +513,7 @@
     _pendingCommands[id] = completer;
     var line = json.encode(command);
     _recordStdio('SEND: $line');
-    _process.stdin.add(utf8.encoder.convert('$line\n'));
+    _process!.stdin.add(utf8.encoder.convert('$line\n'));
     return completer.future;
   }
 
@@ -522,10 +524,10 @@
   Future start(
       {bool checked = true,
       bool debugServer = false,
-      int diagnosticPort,
+      int? diagnosticPort,
       bool profileServer = false,
-      String sdkPath,
-      int servicesPort,
+      String? sdkPath,
+      int? servicesPort,
       bool useAnalysisHighlight2 = false}) {
     if (_process != null) {
       throw Exception('Process already started');
@@ -782,7 +784,7 @@
   @override
   Description describeMismatch(
       item, Description mismatchDescription, Map matchState, bool verbose) {
-    var mismatches = matchState['mismatches'] as List<MismatchDescriber>;
+    var mismatches = matchState['mismatches'] as List<MismatchDescriber>?;
     if (mismatches != null) {
       for (var i = 0; i < mismatches.length; i++) {
         var mismatch = mismatches[i];
diff --git a/pkg/analyzer_plugin/test/plugin/assist_mixin_test.dart b/pkg/analyzer_plugin/test/plugin/assist_mixin_test.dart
index 955290a..4a5899e 100644
--- a/pkg/analyzer_plugin/test/plugin/assist_mixin_test.dart
+++ b/pkg/analyzer_plugin/test/plugin/assist_mixin_test.dart
@@ -20,12 +20,12 @@
 
 @reflectiveTest
 class AssistsMixinTest with ResourceProviderMixin {
-  String packagePath1;
-  String filePath1;
-  ContextRoot contextRoot1;
+  late String packagePath1;
+  late String filePath1;
+  late ContextRoot contextRoot1;
 
-  MockChannel channel;
-  _TestServerPlugin plugin;
+  late MockChannel channel;
+  late _TestServerPlugin plugin;
 
   void setUp() {
     packagePath1 = convertPath('/package1');
@@ -55,7 +55,8 @@
   _TestAssistContributor(this.changes);
 
   @override
-  Future<void> computeAssists(AssistRequest request, AssistCollector collector) async {
+  Future<void> computeAssists(
+      AssistRequest request, AssistCollector collector) async {
     for (var change in changes) {
       collector.addAssist(change);
     }
diff --git a/pkg/analyzer_plugin/test/plugin/completion_mixin_test.dart b/pkg/analyzer_plugin/test/plugin/completion_mixin_test.dart
index 36ce569..35ecf19 100644
--- a/pkg/analyzer_plugin/test/plugin/completion_mixin_test.dart
+++ b/pkg/analyzer_plugin/test/plugin/completion_mixin_test.dart
@@ -20,12 +20,12 @@
 
 @reflectiveTest
 class CompletionMixinTest with ResourceProviderMixin {
-  String packagePath1;
-  String filePath1;
-  ContextRoot contextRoot1;
+  late String packagePath1;
+  late String filePath1;
+  late ContextRoot contextRoot1;
 
-  MockChannel channel;
-  _TestServerPlugin plugin;
+  late MockChannel channel;
+  late _TestServerPlugin plugin;
 
   void setUp() {
     packagePath1 = convertPath('/package1');
diff --git a/pkg/analyzer_plugin/test/plugin/fix_mixin_test.dart b/pkg/analyzer_plugin/test/plugin/fix_mixin_test.dart
index 06a1c7f..edb6601 100644
--- a/pkg/analyzer_plugin/test/plugin/fix_mixin_test.dart
+++ b/pkg/analyzer_plugin/test/plugin/fix_mixin_test.dart
@@ -24,12 +24,12 @@
 
 @reflectiveTest
 class FixesMixinTest with ResourceProviderMixin {
-  String packagePath1;
-  String filePath1;
-  ContextRoot contextRoot1;
+  late String packagePath1;
+  late String filePath1;
+  late ContextRoot contextRoot1;
 
-  MockChannel channel;
-  _TestServerPlugin plugin;
+  late MockChannel channel;
+  late _TestServerPlugin plugin;
 
   void setUp() {
     packagePath1 = convertPath('/package1');
@@ -61,7 +61,8 @@
   _TestFixContributor(this.changes);
 
   @override
-  Future<void> computeFixes(FixesRequest request, FixCollector collector) async {
+  Future<void> computeFixes(
+      FixesRequest request, FixCollector collector) async {
     for (var change in changes) {
       collector.addFix(request.errorsToFix[0], change);
     }
diff --git a/pkg/analyzer_plugin/test/plugin/folding_mixin_test.dart b/pkg/analyzer_plugin/test/plugin/folding_mixin_test.dart
index 0b2f063..ef7d1cd0 100644
--- a/pkg/analyzer_plugin/test/plugin/folding_mixin_test.dart
+++ b/pkg/analyzer_plugin/test/plugin/folding_mixin_test.dart
@@ -23,12 +23,12 @@
 
 @reflectiveTest
 class FoldingMixinTest with ResourceProviderMixin {
-  String packagePath1;
-  String filePath1;
-  ContextRoot contextRoot1;
+  late String packagePath1;
+  late String filePath1;
+  late ContextRoot contextRoot1;
 
-  MockChannel channel;
-  _TestServerPlugin plugin;
+  late MockChannel channel;
+  late _TestServerPlugin plugin;
 
   void setUp() {
     packagePath1 = convertPath('/package1');
diff --git a/pkg/analyzer_plugin/test/plugin/highlights_mixin_test.dart b/pkg/analyzer_plugin/test/plugin/highlights_mixin_test.dart
index 98e39d5..bbf3d1a 100644
--- a/pkg/analyzer_plugin/test/plugin/highlights_mixin_test.dart
+++ b/pkg/analyzer_plugin/test/plugin/highlights_mixin_test.dart
@@ -23,12 +23,12 @@
 
 @reflectiveTest
 class HighlightsMixinTest with ResourceProviderMixin {
-  String packagePath1;
-  String filePath1;
-  ContextRoot contextRoot1;
+  late String packagePath1;
+  late String filePath1;
+  late ContextRoot contextRoot1;
 
-  MockChannel channel;
-  _TestServerPlugin plugin;
+  late MockChannel channel;
+  late _TestServerPlugin plugin;
 
   void setUp() {
     packagePath1 = convertPath('/package1');
diff --git a/pkg/analyzer_plugin/test/plugin/kythe_mixin_test.dart b/pkg/analyzer_plugin/test/plugin/kythe_mixin_test.dart
index 45588b4..c1df465 100644
--- a/pkg/analyzer_plugin/test/plugin/kythe_mixin_test.dart
+++ b/pkg/analyzer_plugin/test/plugin/kythe_mixin_test.dart
@@ -20,12 +20,12 @@
 
 @reflectiveTest
 class KytheMixinTest with ResourceProviderMixin {
-  String packagePath1;
-  String filePath1;
-  ContextRoot contextRoot1;
+  late String packagePath1;
+  late String filePath1;
+  late ContextRoot contextRoot1;
 
-  MockChannel channel;
-  _TestServerPlugin plugin;
+  late MockChannel channel;
+  late _TestServerPlugin plugin;
 
   void setUp() {
     packagePath1 = convertPath('/package1');
diff --git a/pkg/analyzer_plugin/test/plugin/mocks.dart b/pkg/analyzer_plugin/test/plugin/mocks.dart
index 6d466d2..338593b 100644
--- a/pkg/analyzer_plugin/test/plugin/mocks.dart
+++ b/pkg/analyzer_plugin/test/plugin/mocks.dart
@@ -39,10 +39,10 @@
 class MockChannel implements PluginCommunicationChannel {
   bool _closed = false;
 
-  void Function() _onDone;
-  Function _onError;
-  void Function(Notification) _onNotification;
-  void Function(Request) _onRequest;
+  void Function()? _onDone;
+  Function? _onError;
+  void Function(Notification)? _onNotification;
+  void Function(Request)? _onRequest;
 
   List<Notification> sentNotifications = <Notification>[];
 
@@ -56,10 +56,10 @@
   }
 
   @override
-  void listen(void Function(Request request) onRequest,
-      {void Function() onDone,
-      Function onError,
-      Function(Notification) onNotification}) {
+  void listen(void Function(Request request)? onRequest,
+      {void Function()? onDone,
+      Function? onError,
+      Function(Notification)? onNotification}) {
     _onDone = onDone;
     _onError = onError;
     _onNotification = onNotification;
@@ -67,11 +67,15 @@
   }
 
   void sendDone() {
-    _onDone();
+    if (_onDone != null) {
+      _onDone!();
+    }
   }
 
   void sendError(Object exception, StackTrace stackTrace) {
-    _onError(exception, stackTrace);
+    if (_onError != null) {
+      _onError!(exception, stackTrace);
+    }
   }
 
   @override
@@ -82,7 +86,7 @@
     if (_onNotification == null) {
       fail('Unexpected invocation of sendNotification');
     }
-    _onNotification(notification);
+    _onNotification!(notification);
   }
 
   Future<Response> sendRequest(RequestParams params) {
@@ -93,7 +97,7 @@
     var request = params.toRequest(id);
     var completer = Completer<Response>();
     completers[request.id] = completer;
-    _onRequest(request);
+    _onRequest!(request);
     return completer.future;
   }
 
@@ -103,7 +107,7 @@
       throw StateError('Sent a response to a closed channel');
     }
     var completer = completers.remove(response.id);
-    completer.complete(response);
+    completer?.complete(response);
   }
 }
 
@@ -117,7 +121,11 @@
   @override
   final String path;
 
-  MockResolvedUnitResult({this.errors, this.lineInfo, this.path});
+  MockResolvedUnitResult(
+      {List<AnalysisError>? errors, LineInfo? lineInfo, String? path})
+      : errors = errors ?? [],
+        lineInfo = lineInfo ?? LineInfo([0]),
+        path = path ?? '';
 
   @override
   dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
@@ -149,10 +157,10 @@
 
 class MockSource implements Source {
   @override
-  TimestampedData<String> get contents => null;
+  TimestampedData<String> get contents => TimestampedData(0, '');
 
   @override
-  String get encoding => null;
+  String get encoding => '';
 
   @override
   String get fullName => '/pkg/lib/test.dart';
diff --git a/pkg/analyzer_plugin/test/plugin/navigation_mixin_test.dart b/pkg/analyzer_plugin/test/plugin/navigation_mixin_test.dart
index 0fde341..2c3dcfd 100644
--- a/pkg/analyzer_plugin/test/plugin/navigation_mixin_test.dart
+++ b/pkg/analyzer_plugin/test/plugin/navigation_mixin_test.dart
@@ -23,12 +23,12 @@
 
 @reflectiveTest
 class NavigationMixinTest with ResourceProviderMixin {
-  String packagePath1;
-  String filePath1;
-  ContextRoot contextRoot1;
+  late String packagePath1;
+  late String filePath1;
+  late ContextRoot contextRoot1;
 
-  MockChannel channel;
-  _TestServerPlugin plugin;
+  late MockChannel channel;
+  late _TestServerPlugin plugin;
 
   void setUp() {
     packagePath1 = convertPath('/package1');
diff --git a/pkg/analyzer_plugin/test/plugin/occurrences_mixin_test.dart b/pkg/analyzer_plugin/test/plugin/occurrences_mixin_test.dart
index e0159c1..319e1bd 100644
--- a/pkg/analyzer_plugin/test/plugin/occurrences_mixin_test.dart
+++ b/pkg/analyzer_plugin/test/plugin/occurrences_mixin_test.dart
@@ -23,12 +23,12 @@
 
 @reflectiveTest
 class OccurrencesMixinTest with ResourceProviderMixin {
-  String packagePath1;
-  String filePath1;
-  ContextRoot contextRoot1;
+  late String packagePath1;
+  late String filePath1;
+  late ContextRoot contextRoot1;
 
-  MockChannel channel;
-  _TestServerPlugin plugin;
+  late MockChannel channel;
+  late _TestServerPlugin plugin;
 
   void setUp() {
     packagePath1 = convertPath('/package1');
diff --git a/pkg/analyzer_plugin/test/plugin/outline_mixin_test.dart b/pkg/analyzer_plugin/test/plugin/outline_mixin_test.dart
index f3510165..5844fde 100644
--- a/pkg/analyzer_plugin/test/plugin/outline_mixin_test.dart
+++ b/pkg/analyzer_plugin/test/plugin/outline_mixin_test.dart
@@ -23,12 +23,12 @@
 
 @reflectiveTest
 class OutlineMixinTest with ResourceProviderMixin {
-  String packagePath1;
-  String filePath1;
-  ContextRoot contextRoot1;
+  late String packagePath1;
+  late String filePath1;
+  late ContextRoot contextRoot1;
 
-  MockChannel channel;
-  _TestServerPlugin plugin;
+  late MockChannel channel;
+  late _TestServerPlugin plugin;
 
   void setUp() {
     packagePath1 = convertPath('/package1');
diff --git a/pkg/analyzer_plugin/test/plugin/plugin_test.dart b/pkg/analyzer_plugin/test/plugin/plugin_test.dart
index 92d227b..18d77ba 100644
--- a/pkg/analyzer_plugin/test/plugin/plugin_test.dart
+++ b/pkg/analyzer_plugin/test/plugin/plugin_test.dart
@@ -19,16 +19,16 @@
 
 @reflectiveTest
 class ServerPluginTest with ResourceProviderMixin {
-  MockChannel channel;
-  _TestServerPlugin plugin;
+  late MockChannel channel;
+  late _TestServerPlugin plugin;
 
-  String packagePath1;
-  String filePath1;
-  ContextRoot contextRoot1;
+  late String packagePath1;
+  late String filePath1;
+  late ContextRoot contextRoot1;
 
-  String packagePath2;
-  String filePath2;
-  ContextRoot contextRoot2;
+  late String packagePath2;
+  late String filePath2;
+  late ContextRoot contextRoot2;
 
   void setUp() {
     packagePath1 = convertPath('/package1');
@@ -363,12 +363,12 @@
       var notifiedServices = notifications[path];
       expect(notifiedServices, isNotNull,
           reason: 'Not notified for file $path');
-      expect(notifiedServices, unorderedEquals(subscribedServices),
+      expect(notifiedServices, unorderedEquals(subscribedServices!),
           reason: 'Wrong notifications for file $path');
     }
   }
 
-  AnalysisDriverGeneric _getDriver(ContextRoot targetRoot) {
+  AnalysisDriverGeneric? _getDriver(ContextRoot targetRoot) {
     for (var root in plugin.driverMap.keys) {
       if (root.root == targetRoot.root) {
         return plugin.driverMap[root];
diff --git a/pkg/analyzer_plugin/test/src/channel/isolate_channel_test.dart b/pkg/analyzer_plugin/test/src/channel/isolate_channel_test.dart
index 05b5876..d4399d9 100644
--- a/pkg/analyzer_plugin/test/src/channel/isolate_channel_test.dart
+++ b/pkg/analyzer_plugin/test/src/channel/isolate_channel_test.dart
@@ -16,8 +16,8 @@
 
 @reflectiveTest
 class PluginIsolateChannelTest {
-  TestSendPort sendPort;
-  PluginIsolateChannel channel;
+  late TestSendPort sendPort;
+  late PluginIsolateChannel channel;
 
   void setUp() {
     sendPort = TestSendPort();
@@ -50,11 +50,11 @@
 
   Future<void> test_listen() async {
     var sentRequest = PluginShutdownParams().toRequest('5');
-    Request receivedRequest;
+    Request? receivedRequest;
     channel.listen((Request request) {
       receivedRequest = request;
     });
-    sendPort.receivePort.send(sentRequest.toJson());
+    sendPort.receivePort?.send(sentRequest.toJson());
     await _pumpEventQueue(1);
     expect(receivedRequest, sentRequest);
   }
@@ -89,7 +89,7 @@
 /// A send port used in tests.
 class TestSendPort implements SendPort {
   /// The receive port used to receive messages from the server.
-  SendPort receivePort;
+  SendPort? receivePort;
 
   /// The messages sent to the server.
   List<Object> sentMessages = <Object>[];
@@ -103,7 +103,7 @@
         fail('Did not receive a receive port as the first communication.');
       }
     } else {
-      sentMessages.add(message);
+      sentMessages.add(message!);
     }
   }
 }
diff --git a/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_core_test.dart b/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_core_test.dart
index 0e27f7f..4d1c17e 100644
--- a/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_core_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_core_test.dart
@@ -10,6 +10,8 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import 'mocks.dart';
+
 void main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ChangeBuilderImplTest);
@@ -22,7 +24,7 @@
 @reflectiveTest
 class ChangeBuilderImplTest {
   void test_copy_empty() {
-    var builder = ChangeBuilderImpl();
+    var builder = ChangeBuilderImpl(session: MockAnalysisSession());
     var copy = builder.copy() as ChangeBuilderImpl;
     expect(identical(copy, builder), isFalse);
     expect(copy.workspace, builder.workspace);
@@ -30,7 +32,7 @@
   }
 
   Future<void> test_copy_newEdit() async {
-    var builder = ChangeBuilderImpl();
+    var builder = ChangeBuilderImpl(session: MockAnalysisSession());
     await builder.addGenericFileEdit('/test.dart', (builder) {
       builder.addSimpleInsertion(0, 'x');
     });
@@ -43,7 +45,7 @@
   }
 
   Future<void> test_copy_newFile() async {
-    var builder = ChangeBuilderImpl();
+    var builder = ChangeBuilderImpl(session: MockAnalysisSession());
     await builder.addGenericFileEdit('/test1.dart', (builder) {
       builder.addSimpleInsertion(0, 'x');
     });
@@ -56,7 +58,7 @@
   }
 
   Future<void> test_copy_newLinkedEditGroup() async {
-    var builder = ChangeBuilderImpl();
+    var builder = ChangeBuilderImpl(session: MockAnalysisSession());
     await builder.addGenericFileEdit('/test.dart', (builder) {
       builder.addLinkedPosition(SourceRange(1, 2), 'a');
     });
@@ -69,7 +71,7 @@
   }
 
   Future<void> test_copy_newLinkedPosition() async {
-    var builder = ChangeBuilderImpl();
+    var builder = ChangeBuilderImpl(session: MockAnalysisSession());
     await builder.addGenericFileEdit('/test.dart', (builder) {
       builder.addLinkedPosition(SourceRange(1, 2), 'a');
     });
@@ -82,25 +84,16 @@
   }
 
   Future<void> test_copy_selection() async {
-    var builder = ChangeBuilderImpl();
+    var builder = ChangeBuilderImpl(session: MockAnalysisSession());
     builder.setSelection(Position('/test.dart', 5));
     var copy = builder.copy() as ChangeBuilderImpl;
     copy.setSelection(Position('/test.dart', 10));
     var change = builder.sourceChange;
-    expect(change.selection.offset, 5);
-  }
-
-  Future<void> test_createFileEditBuilder() async {
-    var builder = ChangeBuilderImpl();
-    var path = '/test.dart';
-    var fileEditBuilder = await builder.createGenericFileEditBuilder(path);
-    expect(fileEditBuilder, const TypeMatcher<FileEditBuilder>());
-    var fileEdit = fileEditBuilder.fileEdit;
-    expect(fileEdit.file, path);
+    expect(change.selection!.offset, 5);
   }
 
   void test_getLinkedEditGroup() {
-    var builder = ChangeBuilderImpl();
+    var builder = ChangeBuilderImpl(session: MockAnalysisSession());
     var group = builder.getLinkedEditGroup('a');
     expect(identical(builder.getLinkedEditGroup('b'), group), isFalse);
     expect(identical(builder.getLinkedEditGroup('a'), group), isTrue);
@@ -108,13 +101,13 @@
 
   void test_setSelection() {
     var position = Position('test.dart', 3);
-    var builder = ChangeBuilderImpl();
+    var builder = ChangeBuilderImpl(session: MockAnalysisSession());
     builder.setSelection(position);
     expect(builder.sourceChange.selection, position);
   }
 
   void test_sourceChange_emptyEdit() async {
-    var builder = ChangeBuilderImpl();
+    var builder = ChangeBuilderImpl(session: MockAnalysisSession());
     var path = '/test.dart';
     await builder.addGenericFileEdit(path, (builder) {});
     var sourceChange = builder.sourceChange;
@@ -126,7 +119,7 @@
   }
 
   void test_sourceChange_noEdits() {
-    var builder = ChangeBuilderImpl();
+    var builder = ChangeBuilderImpl(session: MockAnalysisSession());
     var sourceChange = builder.sourceChange;
     expect(sourceChange, isNotNull);
     expect(sourceChange.edits, isEmpty);
@@ -136,7 +129,7 @@
   }
 
   Future<void> test_sourceChange_oneChange() async {
-    var builder = ChangeBuilderImpl();
+    var builder = ChangeBuilderImpl(session: MockAnalysisSession());
     var path = '/test.dart';
     await builder.addGenericFileEdit(path, (builder) {
       builder.addSimpleInsertion(0, '_');
@@ -156,7 +149,7 @@
   String path = '/test.dart';
 
   Future<void> test_addLinkedEdit() async {
-    var builder = ChangeBuilderImpl();
+    var builder = ChangeBuilderImpl(session: MockAnalysisSession());
     var offset = 10;
     var text = 'content';
     await builder.addGenericFileEdit(path, (builder) {
@@ -181,7 +174,7 @@
   }
 
   Future<void> test_addSimpleLinkedEdit() async {
-    var builder = ChangeBuilderImpl();
+    var builder = ChangeBuilderImpl(session: MockAnalysisSession());
     var offset = 10;
     var text = 'content';
     await builder.addGenericFileEdit(path, (builder) {
@@ -204,7 +197,7 @@
   }
 
   Future<void> test_createLinkedEditBuilder() async {
-    var builder = ChangeBuilderImpl();
+    var builder = ChangeBuilderImpl(session: MockAnalysisSession());
     await builder.addGenericFileEdit(path, (builder) {
       builder.addInsertion(10, (builder) {
         var linkBuilder =
@@ -215,17 +208,17 @@
   }
 
   Future<void> test_selectHere() async {
-    var builder = ChangeBuilderImpl();
+    var builder = ChangeBuilderImpl(session: MockAnalysisSession());
     await builder.addGenericFileEdit(path, (builder) {
       builder.addInsertion(10, (EditBuilder builder) {
         builder.selectHere();
       });
     });
-    expect(builder.sourceChange.selection.offset, 10);
+    expect(builder.sourceChange.selection!.offset, 10);
   }
 
   Future<void> test_write() async {
-    var builder = ChangeBuilderImpl();
+    var builder = ChangeBuilderImpl(session: MockAnalysisSession());
     var offset = 10;
     var text = 'write';
     await builder.addGenericFileEdit(path, (builder) {
@@ -253,7 +246,7 @@
   }
 
   Future<void> test_writeln_withoutText() async {
-    var builder = ChangeBuilderImpl();
+    var builder = ChangeBuilderImpl(session: MockAnalysisSession());
     var offset = 52;
     var length = 12;
     await builder.addGenericFileEdit(path, (builder) {
@@ -281,7 +274,7 @@
   }
 
   Future<void> test_writeln_withText() async {
-    var builder = ChangeBuilderImpl();
+    var builder = ChangeBuilderImpl(session: MockAnalysisSession());
     var offset = 52;
     var length = 12;
     var text = 'writeln';
@@ -318,7 +311,7 @@
   Future<void> test_addDeletion() async {
     var offset = 23;
     var length = 7;
-    var builder = ChangeBuilderImpl();
+    var builder = ChangeBuilderImpl(session: MockAnalysisSession());
     await builder.addGenericFileEdit(path, (builder) {
       builder.addDeletion(SourceRange(offset, length));
     });
@@ -337,7 +330,7 @@
     var firstLength = 7;
     var secondOffset = 30;
     var secondLength = 5;
-    var builder = ChangeBuilderImpl();
+    var builder = ChangeBuilderImpl(session: MockAnalysisSession());
     await builder.addGenericFileEdit(path, (builder) {
       builder.addDeletion(SourceRange(firstOffset, firstLength));
       builder.addDeletion(SourceRange(secondOffset, secondLength));
@@ -360,7 +353,7 @@
     var firstLength = 7;
     var secondOffset = 30;
     var secondLength = 5;
-    var builder = ChangeBuilderImpl();
+    var builder = ChangeBuilderImpl(session: MockAnalysisSession());
     await builder.addGenericFileEdit(path, (builder) {
       builder.addDeletion(SourceRange(secondOffset, secondLength));
       builder.addDeletion(SourceRange(firstOffset, firstLength));
@@ -382,7 +375,7 @@
     var firstLength = 7;
     var secondOffset = 27;
     var secondLength = 8;
-    var builder = ChangeBuilderImpl();
+    var builder = ChangeBuilderImpl(session: MockAnalysisSession());
     await builder.addGenericFileEdit(path, (builder) {
       builder.addDeletion(SourceRange(firstOffset, firstLength));
       builder.addDeletion(SourceRange(secondOffset, secondLength));
@@ -395,7 +388,7 @@
   }
 
   Future<void> test_addInsertion() async {
-    var builder = ChangeBuilderImpl();
+    var builder = ChangeBuilderImpl(session: MockAnalysisSession());
     await builder.addGenericFileEdit(path, (builder) {
       builder.addInsertion(10, (builder) {
         expect(builder, isNotNull);
@@ -404,7 +397,7 @@
   }
 
   Future<void> test_addLinkedPosition() async {
-    var builder = ChangeBuilderImpl();
+    var builder = ChangeBuilderImpl(session: MockAnalysisSession());
     var groupName = 'a';
     await builder.addGenericFileEdit(path, (builder) {
       builder.addLinkedPosition(SourceRange(3, 6), groupName);
@@ -420,7 +413,7 @@
   }
 
   Future<void> test_addReplacement() async {
-    var builder = ChangeBuilderImpl();
+    var builder = ChangeBuilderImpl(session: MockAnalysisSession());
     await builder.addGenericFileEdit(path, (builder) {
       builder.addReplacement(SourceRange(4, 5), (builder) {
         expect(builder, isNotNull);
@@ -431,7 +424,7 @@
   Future<void> test_addSimpleInsertion() async {
     var offset = 23;
     var text = 'xyz';
-    var builder = ChangeBuilderImpl();
+    var builder = ChangeBuilderImpl(session: MockAnalysisSession());
     await builder.addGenericFileEdit(path, (builder) {
       builder.addSimpleInsertion(offset, text);
     });
@@ -445,7 +438,7 @@
   Future<void> test_addSimpleInsertion_sameOffset() async {
     var offset = 23;
     var text = 'xyz';
-    var builder = ChangeBuilderImpl();
+    var builder = ChangeBuilderImpl(session: MockAnalysisSession());
     await builder.addGenericFileEdit(path, (builder) {
       builder.addSimpleInsertion(offset, text);
       builder.addSimpleInsertion(offset, 'abc');
@@ -464,7 +457,7 @@
     var offset = 23;
     var length = 7;
     var text = 'xyz';
-    var builder = ChangeBuilderImpl();
+    var builder = ChangeBuilderImpl(session: MockAnalysisSession());
     await builder.addGenericFileEdit(path, (builder) {
       builder.addSimpleReplacement(SourceRange(offset, length), text);
     });
@@ -481,7 +474,7 @@
     var secondOffset = firstOffset + firstLength;
     var secondLength = 5;
     var text = 'xyz';
-    var builder = ChangeBuilderImpl();
+    var builder = ChangeBuilderImpl(session: MockAnalysisSession());
     await builder.addGenericFileEdit(path, (builder) {
       builder.addSimpleReplacement(SourceRange(firstOffset, firstLength), text);
       builder.addSimpleReplacement(
@@ -501,7 +494,7 @@
     var offset = 23;
     var length = 7;
     var text = 'xyz';
-    var builder = ChangeBuilderImpl();
+    var builder = ChangeBuilderImpl(session: MockAnalysisSession());
     await builder.addGenericFileEdit(path, (builder) {
       builder.addSimpleReplacement(SourceRange(offset, length), text);
       expect(() {
@@ -519,7 +512,7 @@
     var offset = 23;
     var length = 7;
     var text = 'xyz';
-    var builder = ChangeBuilderImpl();
+    var builder = ChangeBuilderImpl(session: MockAnalysisSession());
     await builder.addGenericFileEdit(path, (builder) {
       builder.addSimpleReplacement(SourceRange(offset, length), text);
       expect(() {
@@ -534,7 +527,7 @@
   }
 
   Future<void> test_createEditBuilder() async {
-    var builder = ChangeBuilderImpl();
+    var builder = ChangeBuilderImpl(session: MockAnalysisSession());
     await builder.addGenericFileEdit(path, (builder) {
       var offset = 4;
       var length = 5;
@@ -555,7 +548,7 @@
 
   Future<void> test_addSuggestion() async {
     var groupName = 'a';
-    var builder = ChangeBuilderImpl();
+    var builder = ChangeBuilderImpl(session: MockAnalysisSession());
     await builder.addGenericFileEdit(path, (builder) {
       builder.addInsertion(10, (builder) {
         builder.addLinkedEdit(groupName, (builder) {
@@ -571,7 +564,7 @@
 
   Future<void> test_addSuggestion_zeroLength() async {
     var groupName = 'a';
-    var builder = ChangeBuilderImpl();
+    var builder = ChangeBuilderImpl(session: MockAnalysisSession());
     await builder.addGenericFileEdit(path, (builder) {
       builder.addInsertion(10, (builder) {
         builder.addLinkedEdit(groupName, (builder) {
@@ -585,7 +578,7 @@
 
   Future<void> test_addSuggestions() async {
     var groupName = 'a';
-    var builder = ChangeBuilderImpl();
+    var builder = ChangeBuilderImpl(session: MockAnalysisSession());
     await builder.addGenericFileEdit(path, (builder) {
       builder.addInsertion(10, (builder) {
         builder.addLinkedEdit(groupName, (builder) {
diff --git a/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart b/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
index 430be10..c1f201f 100644
--- a/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
@@ -18,6 +18,7 @@
 
 import '../../../support/abstract_context.dart';
 import 'dart/dart_change_builder_mixin.dart';
+import 'mocks.dart';
 
 void main() {
   defineReflectiveSuite(() {
@@ -787,9 +788,9 @@
 }
 class MyClass {}''';
     addSource(path, content);
-    var unit = (await resolveFile(path))?.unit;
+    var unit = (await resolveFile(path)).unit;
 
-    var A = unit.declarations[1] as ClassDeclaration;
+    var A = unit?.declarations[1] as ClassDeclaration;
 
     var builder = newBuilder();
     await builder.addDartFileEdit(path, (builder) {
@@ -799,7 +800,7 @@
           initializerWriter: () {
             builder.write('null');
           },
-          type: A.declaredElement.instantiate(
+          type: A.declaredElement?.instantiate(
             typeArguments: [],
             nullabilitySuffix: NullabilitySuffix.star,
           ),
@@ -818,16 +819,16 @@
 }
 class MyClass {}''';
     addSource(path, content);
-    var unit = (await resolveFile(path))?.unit;
+    var unit = (await resolveFile(path)).unit;
 
-    var A = unit.declarations[1] as ClassDeclaration;
+    var A = unit?.declarations[1] as ClassDeclaration;
 
     var builder = newBuilder();
     await builder.addDartFileEdit(path, (builder) {
       builder.addInsertion(11, (builder) {
         builder.writeLocalVariableDeclaration(
           'foo',
-          type: A.declaredElement.instantiate(
+          type: A.declaredElement?.instantiate(
             typeArguments: [],
             nullabilitySuffix: NullabilitySuffix.star,
           ),
@@ -854,9 +855,9 @@
 }
 class MyClass {}''';
     addSource(path, content);
-    var unit = (await resolveFile(path))?.unit;
+    var unit = (await resolveFile(path)).unit;
 
-    var A = unit.declarations[1] as ClassDeclaration;
+    var A = unit?.declarations[1] as ClassDeclaration;
 
     var builder = newBuilder();
     await builder.addDartFileEdit(path, (builder) {
@@ -864,7 +865,7 @@
         builder.writeLocalVariableDeclaration(
           'foo',
           isFinal: true,
-          type: A.declaredElement.instantiate(
+          type: A.declaredElement?.instantiate(
             typeArguments: [],
             nullabilitySuffix: NullabilitySuffix.star,
           ),
@@ -1024,8 +1025,8 @@
 class A {}
 ''';
     addSource(path, content);
-    var unit = (await resolveFile(path))?.unit;
-    var g = unit.declarations[1] as FunctionDeclaration;
+    var unit = (await resolveFile(path)).unit;
+    var g = unit?.declarations[1] as FunctionDeclaration;
     var body = g.functionExpression.body as BlockFunctionBody;
     var statement = body.block.statements[0] as ExpressionStatement;
     var invocation = statement.expression as MethodInvocation;
@@ -1046,15 +1047,15 @@
     var content = 'f(int a, {bool b = false, String c}) {}';
     addSource(path, content);
 
-    var unit = (await resolveFile(path))?.unit;
-    var f = unit.declarations[0] as FunctionDeclaration;
+    var unit = (await resolveFile(path)).unit;
+    var f = unit?.declarations[0] as FunctionDeclaration;
     var parameters = f.functionExpression.parameters;
-    var elements = parameters.parameters.map((p) => p.declaredElement);
+    var elements = parameters?.parameters.map((p) => p.declaredElement!);
 
     var builder = newBuilder();
     await builder.addDartFileEdit(path, (builder) {
       builder.addInsertion(content.length - 1, (builder) {
-        builder.writeParameters(elements);
+        builder.writeParameters(elements!);
       });
     });
     var edit = getEdit(builder);
@@ -1066,15 +1067,15 @@
     var path = convertPath('/home/test/lib/test.dart');
     var content = 'f(int a, [bool b = false, String c]) {}';
     addSource(path, content);
-    var unit = (await resolveFile(path))?.unit;
-    var f = unit.declarations[0] as FunctionDeclaration;
+    var unit = (await resolveFile(path)).unit;
+    var f = unit?.declarations[0] as FunctionDeclaration;
     var parameters = f.functionExpression.parameters;
-    var elements = parameters.parameters.map((p) => p.declaredElement);
+    var elements = parameters?.parameters.map((p) => p.declaredElement!);
 
     var builder = newBuilder();
     await builder.addDartFileEdit(path, (builder) {
       builder.addInsertion(content.length - 1, (builder) {
-        builder.writeParameters(elements);
+        builder.writeParameters(elements!);
       });
     });
     var edit = getEdit(builder);
@@ -1086,15 +1087,15 @@
     var path = convertPath('/home/test/lib/test.dart');
     var content = 'f(int i, String s) {}';
     addSource(path, content);
-    var unit = (await resolveFile(path))?.unit;
-    var f = unit.declarations[0] as FunctionDeclaration;
+    var unit = (await resolveFile(path)).unit;
+    var f = unit?.declarations[0] as FunctionDeclaration;
     var parameters = f.functionExpression.parameters;
-    var elements = parameters.parameters.map((p) => p.declaredElement);
+    var elements = parameters?.parameters.map((p) => p.declaredElement!);
 
     var builder = newBuilder();
     await builder.addDartFileEdit(path, (builder) {
       builder.addInsertion(content.length - 1, (builder) {
-        builder.writeParameters(elements);
+        builder.writeParameters(elements!);
       });
     });
     var edit = getEdit(builder);
@@ -1108,8 +1109,8 @@
   g(s, index: i);
 }''';
     addSource(path, content);
-    var unit = (await resolveFile(path))?.unit;
-    var f = unit.declarations[0] as FunctionDeclaration;
+    var unit = (await resolveFile(path)).unit;
+    var f = unit?.declarations[0] as FunctionDeclaration;
     var body = f.functionExpression.body as BlockFunctionBody;
     var statement = body.block.statements[0] as ExpressionStatement;
     var invocation = statement.expression as MethodInvocation;
@@ -1131,8 +1132,8 @@
   g(s, i);
 }''';
     addSource(path, content);
-    var unit = (await resolveFile(path))?.unit;
-    var f = unit.declarations[0] as FunctionDeclaration;
+    var unit = (await resolveFile(path)).unit;
+    var f = unit?.declarations[0] as FunctionDeclaration;
     var body = f.functionExpression.body as BlockFunctionBody;
     var statement = body.block.statements[0] as ExpressionStatement;
     var invocation = statement.expression as MethodInvocation;
@@ -1324,12 +1325,12 @@
     var path = convertPath('/home/test/lib/test.dart');
     var content = 'class A {}';
     addSource(path, content);
-    var unit = (await resolveFile(path))?.unit;
+    var unit = (await resolveFile(path)).unit;
 
     var builder = newBuilder();
     await builder.addDartFileEdit(path, (builder) {
       builder.addInsertion(content.length - 1, (builder) {
-        var typeProvider = unit.declaredElement.library.typeProvider;
+        var typeProvider = unit!.declaredElement!.library.typeProvider;
         builder.writeType(typeProvider.dynamicType);
       });
     });
@@ -1537,12 +1538,12 @@
     var path = convertPath('/home/test/lib/test.dart');
     var content = 'class A {}';
     addSource(path, content);
-    var unit = (await resolveFile(path))?.unit;
+    var unit = (await resolveFile(path)).unit;
 
     var builder = newBuilder();
     await builder.addDartFileEdit(path, (builder) {
       builder.addInsertion(content.length - 1, (builder) {
-        var typeProvider = unit.declaredElement.library.typeProvider;
+        var typeProvider = unit!.declaredElement!.library.typeProvider;
         builder.writeType(typeProvider.dynamicType, required: true);
       });
     });
@@ -1670,7 +1671,7 @@
     expect(edit.replacement, equalsIgnoringWhitespace('implements A, B'));
   }
 
-  Future<void> _assertWriteType(String typeCode, {String declarations}) async {
+  Future<void> _assertWriteType(String typeCode, {String? declarations}) async {
     var path = convertPath('/home/test/lib/test.dart');
     var content = (declarations ?? '') + '$typeCode v;';
     addSource(path, content);
@@ -1688,14 +1689,14 @@
   }
 
   Future<ClassElement> _getClassElement(String path, String name) async {
-    var result = (await resolveFile(path))?.unit;
-    return result.declaredElement.getType(name);
+    var result = (await resolveFile(path)).unit;
+    return result!.declaredElement!.getType(name)!;
   }
 
   Future<PropertyAccessorElement> _getTopLevelAccessorElement(
       String path, String name) async {
-    var result = (await resolveFile(path))?.unit;
-    return result.declaredElement.accessors.firstWhere((v) => v.name == name);
+    var result = (await resolveFile(path)).unit;
+    return result!.declaredElement!.accessors.firstWhere((v) => v.name == name);
   }
 
   Future<InterfaceType> _getType(
@@ -1719,7 +1720,7 @@
     addSource(path, '''var f = () {}''');
 
     var resolvedUnit = await resolveFile(path);
-    var findNode = FindNode(resolvedUnit.content, resolvedUnit.unit);
+    var findNode = FindNode(resolvedUnit.content!, resolvedUnit.unit!);
     var body = findNode.functionBody('{}');
 
     var builder = newBuilder();
@@ -1736,7 +1737,7 @@
     addSource(path, 'String f() {}');
 
     var resolvedUnit = await resolveFile(path);
-    var findNode = FindNode(resolvedUnit.content, resolvedUnit.unit);
+    var findNode = FindNode(resolvedUnit.content!, resolvedUnit.unit!);
     var body = findNode.functionBody('{}');
 
     var builder = newBuilder();
@@ -1849,7 +1850,7 @@
     addSource(path, 'String f() {}');
 
     var resolvedUnit = await resolveFile(path);
-    var findNode = FindNode(resolvedUnit.content, resolvedUnit.unit);
+    var findNode = FindNode(resolvedUnit.content!, resolvedUnit.unit!);
     var type = findNode.typeAnnotation('String');
 
     var builder = newBuilder();
@@ -1871,11 +1872,11 @@
 class B extends A {}
 class C extends B {}
 ''');
-    var unit = (await resolveFile(path))?.unit;
-    var classC = unit.declarations[2] as ClassDeclaration;
-    var builder = DartLinkedEditBuilderImpl(null);
+    var unit = (await resolveFile(path)).unit;
+    var classC = unit?.declarations[2] as ClassDeclaration;
+    var builder = DartLinkedEditBuilderImpl(MockEditBuilderImpl());
     builder.addSuperTypesAsSuggestions(
-      classC.declaredElement.instantiate(
+      classC.declaredElement?.instantiate(
         typeArguments: [],
         nullabilitySuffix: NullabilitySuffix.star,
       ),
@@ -2328,9 +2329,9 @@
   }
 
   Future<void> _assertImportLibrary({
-    String initialCode,
-    List<String> uriList,
-    String expectedCode,
+    required String initialCode,
+    required List<String> uriList,
+    required String expectedCode,
   }) async {
     var path = convertPath('/home/test/lib/test.dart');
     addSource(path, initialCode);
@@ -2878,26 +2879,26 @@
   /// given [displayText]. If a [selection] is provided, assert that the
   /// generated selection range matches it.
   Future<void> _assertWriteOverride({
-    String content,
-    String nameToOverride,
-    String expected,
-    String displayText,
-    SourceRange selection,
+    required String content,
+    required String nameToOverride,
+    required String expected,
+    String? displayText,
+    SourceRange? selection,
     String targetClassName = 'B',
-    String targetMixinName,
+    String? targetMixinName,
     bool invokeSuper = false,
   }) async {
     var path = convertPath('/home/test/lib/test.dart');
     addSource(path, content);
 
-    ClassElement targetElement;
+    ClassElement? targetElement;
     {
-      var unitResult = (await resolveFile(path))?.unit;
+      var unitResult = (await resolveFile(path)).unit;
       if (targetMixinName != null) {
-        targetElement = unitResult.declaredElement.mixins
+        targetElement = unitResult!.declaredElement!.mixins
             .firstWhere((e) => e.name == targetMixinName);
       } else {
-        targetElement = unitResult.declaredElement.types
+        targetElement = unitResult!.declaredElement!.types
             .firstWhere((e) => e.name == targetClassName);
       }
     }
@@ -2913,7 +2914,7 @@
     await builder.addDartFileEdit(path, (builder) {
       builder.addInsertion(content.length - 2, (builder) {
         builder.writeOverride(
-          inherited,
+          inherited!,
           displayTextBuffer: displayBuffer,
           invokeSuper: invokeSuper,
         );
diff --git a/pkg/analyzer_plugin/test/src/utilities/change_builder/dart/import_library_element_test.dart b/pkg/analyzer_plugin/test/src/utilities/change_builder/dart/import_library_element_test.dart
index 341d53a..84f4e90 100644
--- a/pkg/analyzer_plugin/test/src/utilities/change_builder/dart/import_library_element_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/change_builder/dart/import_library_element_test.dart
@@ -451,11 +451,11 @@
   }
 
   Future<void> _assertImportLibraryElement(
-      {String initialCode,
-      String uriStr,
-      String name,
-      String expectedPrefix,
-      String expectedCode}) async {
+      {required String initialCode,
+      required String uriStr,
+      required String name,
+      String? expectedPrefix,
+      String? expectedCode}) async {
     var offset = initialCode.indexOf('^');
     if (offset > 0) {
       initialCode =
diff --git a/pkg/analyzer_plugin/test/src/utilities/change_builder/mocks.dart b/pkg/analyzer_plugin/test/src/utilities/change_builder/mocks.dart
new file mode 100644
index 0000000..5d31e68
--- /dev/null
+++ b/pkg/analyzer_plugin/test/src/utilities/change_builder/mocks.dart
@@ -0,0 +1,16 @@
+import 'package:analyzer/dart/analysis/session.dart';
+import 'package:analyzer_plugin/src/utilities/change_builder/change_builder_core.dart';
+
+class MockAnalysisSession implements AnalysisSession {
+  @override
+  dynamic noSuchMethod(Invocation invocation) {
+    return super.noSuchMethod(invocation);
+  }
+}
+
+class MockEditBuilderImpl implements EditBuilderImpl {
+  @override
+  dynamic noSuchMethod(Invocation invocation) {
+    return super.noSuchMethod(invocation);
+  }
+}
diff --git a/pkg/analyzer_plugin/test/src/utilities/completion/completion_target_test.dart b/pkg/analyzer_plugin/test/src/utilities/completion/completion_target_test.dart
index 7a0c3d4..71b649d 100644
--- a/pkg/analyzer_plugin/test/src/utilities/completion/completion_target_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/completion/completion_target_test.dart
@@ -531,7 +531,7 @@
       zoo(z) { } String name;''');
     assertTarget('/// some dartdoc ', '');
     expect(target.containingNode is Comment, isTrue);
-    expect(target.containingNode.parent.toSource(), 'zoo(z) {}');
+    expect(target.containingNode.parent!.toSource(), 'zoo(z) {}');
   }
 
   Future<void> test_FunctionDeclaration_inLineDocComment2() async {
@@ -541,7 +541,7 @@
       zoo(z) { } String name;''');
     assertTarget('/// some dartdoc', '');
     expect(target.containingNode is Comment, isTrue);
-    expect(target.containingNode.parent.toSource(), 'zoo(z) {}');
+    expect(target.containingNode.parent!.toSource(), 'zoo(z) {}');
   }
 
   Future<void> test_FunctionDeclaration_inStarComment() async {
@@ -561,7 +561,7 @@
     await createTarget('/** ^ */ zoo(z) { } String name;');
     assertTarget('/**  */', '');
     expect(target.containingNode is Comment, isTrue);
-    expect(target.containingNode.parent.toSource(), 'zoo(z) {}');
+    expect(target.containingNode.parent!.toSource(), 'zoo(z) {}');
   }
 
   Future<void> test_FunctionDeclaration_inStarDocComment2() async {
@@ -569,7 +569,7 @@
     await createTarget('/**  *^/ zoo(z) { } String name;');
     assertTarget('/**  */', '');
     expect(target.containingNode is Comment, isTrue);
-    expect(target.containingNode.parent.toSource(), 'zoo(z) {}');
+    expect(target.containingNode.parent!.toSource(), 'zoo(z) {}');
   }
 
   Future<void> test_FunctionDeclaration_returnType() async {
@@ -726,7 +726,7 @@
         zoo(z) { } String name; }''');
     assertTarget('/// some dartdoc ', '');
     expect(target.containingNode is Comment, isTrue);
-    expect(target.containingNode.parent.toSource(), 'zoo(z) {}');
+    expect(target.containingNode.parent!.toSource(), 'zoo(z) {}');
   }
 
   Future<void> test_MethodDeclaration_inLineDocComment2() async {
@@ -737,7 +737,7 @@
         zoo(z) { } String name; }''');
     assertTarget('/// some dartdoc', '');
     expect(target.containingNode is Comment, isTrue);
-    expect(target.containingNode.parent.toSource(), 'zoo(z) {}');
+    expect(target.containingNode.parent!.toSource(), 'zoo(z) {}');
   }
 
   Future<void> test_MethodDeclaration_inStarComment() async {
@@ -757,7 +757,7 @@
     await createTarget('class C2 {/** ^ */ zoo(z) { } String name; }');
     assertTarget('/**  */', '');
     expect(target.containingNode is Comment, isTrue);
-    expect(target.containingNode.parent.toSource(), 'zoo(z) {}');
+    expect(target.containingNode.parent!.toSource(), 'zoo(z) {}');
   }
 
   Future<void> test_MethodDeclaration_inStarDocComment2() async {
@@ -765,7 +765,7 @@
     await createTarget('class C2 {/**  *^/ zoo(z) { } String name; }');
     assertTarget('/**  */', '');
     expect(target.containingNode is Comment, isTrue);
-    expect(target.containingNode.parent.toSource(), 'zoo(z) {}');
+    expect(target.containingNode.parent!.toSource(), 'zoo(z) {}');
   }
 
   Future<void> test_MethodDeclaration_returnType() async {
@@ -885,18 +885,18 @@
 }
 
 class _Base extends AbstractContextTest {
-  int offset;
-  CompletionTarget target;
-  FindElement findElement;
+  int? offset;
+  late CompletionTarget target;
+  late FindElement findElement;
 
   void assertTarget(
     String entityText,
     String nodeText, {
-    int argIndex,
-    String droppedToken,
+    int? argIndex,
+    String? droppedToken,
     bool isFunctionalArgument = false,
-    String expectedExecutable,
-    String expectedParameter,
+    String? expectedExecutable,
+    String? expectedParameter,
   }) {
     expect(
       target.entity.toString(),
@@ -926,14 +926,14 @@
     if (expectedExecutable == null) {
       expect(actualExecutable, isNull);
     } else {
-      expect(_executableStr(actualExecutable), expectedExecutable);
+      expect(_executableStr(actualExecutable!), expectedExecutable);
     }
 
     var actualParameter = target.parameterElement;
     if (expectedParameter == null) {
       expect(actualParameter, isNull);
     } else {
-      expect(_parameterStr(actualParameter), expectedParameter);
+      expect(_parameterStr(actualParameter!), expectedParameter);
     }
 
     expect(target.isFunctionalArgument(), isFunctionalArgument);
@@ -945,18 +945,18 @@
     offset = content.indexOf('^');
     expect(offset, isNot(equals(-1)), reason: 'missing ^');
 
-    var nextOffset = content.indexOf('^', offset + 1);
+    var nextOffset = content.indexOf('^', offset! + 1);
     expect(nextOffset, equals(-1), reason: 'too many ^');
 
-    content = content.substring(0, offset) + content.substring(offset + 1);
+    content = content.substring(0, offset) + content.substring(offset! + 1);
 
     var path = convertPath('/home/test/lib/test.dart');
     newFile(path, content: content);
 
     var result = await resolveFile(path);
-    findElement = FindElement(result.unit);
+    findElement = FindElement(result.unit!);
 
-    target = CompletionTarget.forOffset(result.unit, offset);
+    target = CompletionTarget.forOffset(result.unit!, offset!);
   }
 
   static String _executableNameStr(ExecutableElement executable) {
diff --git a/pkg/analyzer_plugin/test/src/utilities/completion/optype_test.dart b/pkg/analyzer_plugin/test/src/utilities/completion/optype_test.dart
index 57a6f59..66c0b73 100644
--- a/pkg/analyzer_plugin/test/src/utilities/completion/optype_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/completion/optype_test.dart
@@ -18,8 +18,8 @@
 
 /// Common test methods to Dart1/Dart2 versions of OpType tests.
 abstract class AbstractOpTypeTest extends AbstractContextTest {
-  String testPath;
-  int completionOffset;
+  late String testPath;
+  late int completionOffset;
 
   void addTestSource(String content) {
     completionOffset = content.indexOf('^');
@@ -33,7 +33,7 @@
 
   Future<void> assertOpType(
       {bool caseLabel = false,
-      String completionLocation,
+      String? completionLocation,
       bool constructors = false,
       bool namedArgs = false,
       bool prefixed = false,
@@ -50,7 +50,7 @@
     //
     var resolvedUnit = await resolveFile(testPath);
     var completionTarget =
-        CompletionTarget.forOffset(resolvedUnit.unit, completionOffset);
+        CompletionTarget.forOffset(resolvedUnit.unit!, completionOffset);
     var opType = OpType.forCompletion(completionTarget, completionOffset);
     //
     // Validate the OpType.
diff --git a/pkg/analyzer_plugin/test/src/utilities/visitors/local_declaration_visitor_test.dart b/pkg/analyzer_plugin/test/src/utilities/visitors/local_declaration_visitor_test.dart
index bf85a20..f06dbb2 100644
--- a/pkg/analyzer_plugin/test/src/utilities/visitors/local_declaration_visitor_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/visitors/local_declaration_visitor_test.dart
@@ -42,7 +42,7 @@
   TestVisitor(int offset) : super(offset);
 
   @override
-  void declaredLocalVar(SimpleIdentifier name, TypeAnnotation type) {
+  void declaredLocalVar(SimpleIdentifier name, TypeAnnotation? type) {
     expect(name, isNotNull);
   }
 }
diff --git a/pkg/analyzer_plugin/test/support/abstract_context.dart b/pkg/analyzer_plugin/test/support/abstract_context.dart
index d9f4ca7..e0776c3 100644
--- a/pkg/analyzer_plugin/test/support/abstract_context.dart
+++ b/pkg/analyzer_plugin/test/support/abstract_context.dart
@@ -19,8 +19,8 @@
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 
 /// Finds an [Element] with the given [name].
-Element findChildElement(Element root, String name, [ElementKind kind]) {
-  Element result;
+Element? findChildElement(Element root, String name, [ElementKind? kind]) {
+  Element? result;
   root.accept(_ElementVisitorFunctionWrapper((Element element) {
     if (element.name != name) {
       return;
@@ -41,7 +41,7 @@
 
   final Map<String, String> _declaredVariables = {};
 
-  AnalysisContextCollection _analysisContextCollection;
+  AnalysisContextCollection? _analysisContextCollection;
 
   List<String> get collectionIncludedPaths => [workspaceRootPath];
 
@@ -51,7 +51,7 @@
   String get testPackageAnalysisOptionsPath =>
       convertPath('$testPackageRootPath/analysis_options.yaml');
 
-  String get testPackageLanguageVersion => '2.9';
+  String? get testPackageLanguageVersion => '2.9';
 
   /// The file system-specific `pubspec.yaml` path.
   String get testPackagePubspecPath =>
@@ -69,11 +69,11 @@
     _createAnalysisContexts();
 
     path = convertPath(path);
-    return _analysisContextCollection.contextFor(path);
+    return _analysisContextCollection!.contextFor(path);
   }
 
   /// Create an analysis options file based on the given arguments.
-  void createAnalysisOptionsFile({List<String> experiments}) {
+  void createAnalysisOptionsFile({List<String>? experiments}) {
     var buffer = StringBuffer();
     buffer.writeln('analyzer:');
 
@@ -116,8 +116,8 @@
   }
 
   void writeTestPackageConfig({
-    PackageConfigFileBuilder config,
-    String languageVersion,
+    PackageConfigFileBuilder? config,
+    String? languageVersion,
     bool meta = false,
   }) {
     if (config == null) {
@@ -163,7 +163,7 @@
 
 mixin WithNonFunctionTypeAliasesMixin on AbstractContextTest {
   @override
-  String get testPackageLanguageVersion => null;
+  String? get testPackageLanguageVersion => null;
 
   @override
   void setUp() {
@@ -179,7 +179,7 @@
 
 mixin WithNullSafetyMixin on AbstractContextTest {
   @override
-  String get testPackageLanguageVersion => null;
+  String? get testPackageLanguageVersion => null;
 }
 
 /// Wraps the given [_ElementVisitorFunction] into an instance of
diff --git a/pkg/analyzer_plugin/test/support/abstract_single_unit.dart b/pkg/analyzer_plugin/test/support/abstract_single_unit.dart
index c46632a..afa5699 100644
--- a/pkg/analyzer_plugin/test/support/abstract_single_unit.dart
+++ b/pkg/analyzer_plugin/test/support/abstract_single_unit.dart
@@ -18,11 +18,11 @@
 class AbstractSingleUnitTest extends AbstractContextTest {
   bool verifyNoTestUnitErrors = true;
 
-  String testCode;
-  String testFile;
-  CompilationUnit testUnit;
-  FindNode findNode;
-  FindElement findElement;
+  late String testCode;
+  late String testFile;
+  late CompilationUnit testUnit;
+  late FindNode findNode;
+  late FindElement findElement;
 
   void addTestSource(String code) {
     testCode = code;
@@ -39,7 +39,7 @@
         as SimpleIdentifier;
   }
 
-  AstNode findNodeAtOffset(int offset, [Predicate<AstNode> predicate]) {
+  AstNode? findNodeAtOffset(int offset, [Predicate<AstNode>? predicate]) {
     var result = NodeLocator(offset).searchWithin(testUnit);
     if (result != null && predicate != null) {
       result = result.thisOrAncestorMatching(predicate);
@@ -47,13 +47,13 @@
     return result;
   }
 
-  AstNode findNodeAtString(String search, [Predicate<AstNode> predicate]) {
+  AstNode? findNodeAtString(String search, [Predicate<AstNode>? predicate]) {
     var offset = findOffset(search);
     return findNodeAtOffset(offset, predicate);
   }
 
-  Element findNodeElementAtString(String search,
-      [Predicate<AstNode> predicate]) {
+  Element? findNodeElementAtString(String search,
+      [Predicate<AstNode>? predicate]) {
     var node = findNodeAtString(search, predicate);
     if (node == null) {
       return null;
@@ -95,8 +95,8 @@
 
   Future<void> resolveTestFile() async {
     var result = await resolveFile(testFile);
-    testCode = result.content;
-    testUnit = result.unit;
+    testCode = result.content!;
+    testUnit = result.unit!;
     if (verifyNoTestUnitErrors) {
       expect(result.errors.where((AnalysisError error) {
         return error.errorCode != HintCode.DEAD_CODE &&
diff --git a/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart b/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart
index 7acc4203..18c6333 100644
--- a/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart
+++ b/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart
@@ -38,7 +38,7 @@
     expect(element.kind, plugin.ElementKind.METHOD);
     expect(element.name, 'myMethod');
     {
-      var location = element.location;
+      var location = element.location!;
       expect(location.file, testFile);
       expect(location.offset, 32);
       expect(location.length, 'myGetter'.length);
@@ -57,7 +57,7 @@
   /// Assert that the given [pluginError] matches the given [analyzerError].
   void assertError(
       plugin.AnalysisError pluginError, analyzer.AnalysisError analyzerError,
-      {analyzer.ErrorSeverity severity,
+      {analyzer.ErrorSeverity? severity,
       int startColumn = -1,
       int startLine = -1}) {
     var errorCode = analyzerError.errorCode;
@@ -77,7 +77,7 @@
     expect(pluginError.type, converter.convertErrorType(errorCode.type));
   }
 
-  analyzer.AnalysisError createError(int offset, {String contextMessage}) {
+  analyzer.AnalysisError createError(int offset, {String? contextMessage}) {
     var contextMessages = <analyzer.DiagnosticMessageImpl>[];
     if (contextMessage != null) {
       contextMessages.add(analyzer.DiagnosticMessageImpl(
@@ -105,7 +105,7 @@
     assertError(pluginError, analyzerError,
         startColumn: 4, startLine: 2, severity: severity);
     expect(pluginError.contextMessages, hasLength(1));
-    var message = pluginError.contextMessages[0];
+    var message = pluginError.contextMessages![0];
     expect(message.message, 'here');
     expect(message.location.offset, 53);
     expect(message.location.length, 7);
@@ -232,7 +232,7 @@
       expect(element.name, '_A');
       expect(element.typeParameters, isNull);
       {
-        var location = element.location;
+        var location = element.location!;
         expect(location.file, testFile);
         expect(location.offset, 27);
         expect(location.length, '_A'.length);
@@ -269,7 +269,7 @@
     expect(element.name, 'myConstructor');
     expect(element.typeParameters, isNull);
     {
-      var location = element.location;
+      var location = element.location!;
       expect(location.file, testFile);
       expect(location.offset, 20);
       expect(location.length, 'myConstructor'.length);
@@ -307,7 +307,7 @@
       expect(element.name, '_E1');
       expect(element.typeParameters, isNull);
       {
-        var location = element.location;
+        var location = element.location!;
         expect(location.file, testFile);
         expect(location.offset, 17);
         expect(location.length, '_E1'.length);
@@ -343,7 +343,7 @@
       expect(element.kind, plugin.ElementKind.ENUM_CONSTANT);
       expect(element.name, 'one');
       {
-        var location = element.location;
+        var location = element.location!;
         expect(location.file, testFile);
         expect(location.offset, 23);
         expect(location.length, 'one'.length);
@@ -367,7 +367,7 @@
       expect(element.kind, plugin.ElementKind.ENUM_CONSTANT);
       expect(element.name, 'three');
       {
-        var location = element.location;
+        var location = element.location!;
         expect(location.file, testFile);
         expect(location.offset, 44);
         expect(location.length, 'three'.length);
@@ -386,7 +386,7 @@
       expect(element.kind, plugin.ElementKind.FIELD);
       expect(element.name, 'index');
       {
-        var location = element.location;
+        var location = element.location!;
         expect(location.file, testFile);
         expect(location.offset, -1);
         expect(location.length, 'index'.length);
@@ -405,7 +405,7 @@
       expect(element.kind, plugin.ElementKind.FIELD);
       expect(element.name, 'values');
       {
-        var location = element.location;
+        var location = element.location!;
         expect(location.file, testFile);
         expect(location.offset, -1);
         expect(location.length, 'values'.length);
@@ -430,7 +430,7 @@
     expect(element.kind, plugin.ElementKind.FIELD);
     expect(element.name, 'myField');
     {
-      var location = element.location;
+      var location = element.location!;
       expect(location.file, testFile);
       expect(location.offset, 25);
       expect(location.length, 'myField'.length);
@@ -454,7 +454,7 @@
     expect(element.name, 'F');
     expect(element.typeParameters, '<T>');
     {
-      var location = element.location;
+      var location = element.location!;
       expect(location.file, testFile);
       expect(location.offset, 12);
       expect(location.length, 'F'.length);
@@ -477,7 +477,7 @@
     expect(element.kind, plugin.ElementKind.GETTER);
     expect(element.name, 'myGetter');
     {
-      var location = element.location;
+      var location = element.location!;
       expect(location.file, testFile);
       expect(location.offset, 20);
       expect(location.length, 'myGetter'.length);
@@ -503,7 +503,7 @@
     expect(element.kind, plugin.ElementKind.LABEL);
     expect(element.name, 'myLabel');
     {
-      var location = element.location;
+      var location = element.location!;
       expect(location.file, testFile);
       expect(location.offset, 9);
       expect(location.length, 'myLabel'.length);
@@ -528,7 +528,7 @@
     expect(element.kind, plugin.ElementKind.METHOD);
     expect(element.name, 'myMethod');
     {
-      var location = element.location;
+      var location = element.location!;
       expect(location.file, testFile);
       expect(location.offset, 32);
       expect(location.length, 'myGetter'.length);
@@ -551,7 +551,7 @@
     expect(element.kind, plugin.ElementKind.SETTER);
     expect(element.name, 'mySetter');
     {
-      var location = element.location;
+      var location = element.location!;
       expect(location.file, testFile);
       expect(location.offset, 16);
       expect(location.length, 'mySetter'.length);
@@ -574,7 +574,7 @@
     expect(element.name, 'F');
     expect(element.typeParameters, '<T>');
     {
-      var location = element.location;
+      var location = element.location!;
       expect(location.file, testFile);
       expect(location.offset, 8);
       expect(location.length, 'F'.length);
@@ -597,7 +597,7 @@
     expect(element.name, 'A');
     expect(element.typeParameters, '<out T>');
     {
-      var location = element.location;
+      var location = element.location!;
       expect(location.file, testFile);
       expect(location.offset, 8);
       expect(location.length, 'A'.length);
@@ -665,7 +665,7 @@
 
 class _AnalyzerConverterTest extends AbstractSingleUnitTest {
   AnalyzerConverter converter = AnalyzerConverter();
-  analyzer.Source source;
+  late analyzer.Source source;
 
   @override
   void setUp() {
diff --git a/pkg/analyzer_plugin/test/utilities/completion/completion_contributor_util.dart b/pkg/analyzer_plugin/test/utilities/completion/completion_contributor_util.dart
index 2697933..a7899a0 100644
--- a/pkg/analyzer_plugin/test/utilities/completion/completion_contributor_util.dart
+++ b/pkg/analyzer_plugin/test/utilities/completion/completion_contributor_util.dart
@@ -9,6 +9,7 @@
 import 'package:analyzer_plugin/src/utilities/completion/completion_target.dart';
 import 'package:analyzer_plugin/utilities/completion/completion_core.dart';
 import 'package:analyzer_plugin/utilities/completion/relevance.dart';
+import 'package:collection/collection.dart';
 import 'package:test/test.dart';
 
 import '../../support/abstract_context.dart';
@@ -21,13 +22,13 @@
 
 abstract class DartCompletionContributorTest extends AbstractContextTest {
   static const String _UNCHECKED = '__UNCHECKED__';
-  String testFile;
-  int completionOffset;
-  int replacementOffset;
-  int replacementLength;
-  CompletionContributor contributor;
-  DartCompletionRequest request;
-  List<CompletionSuggestion> suggestions;
+  late String testFile;
+  int? completionOffset;
+  int? replacementOffset;
+  int? replacementLength;
+  late CompletionContributor contributor;
+  DartCompletionRequest? request;
+  List<CompletionSuggestion>? suggestions;
 
   /// If `true` and `null` is specified as the suggestion's expected returnType
   /// then the actual suggestion is expected to have a `dynamic` returnType.
@@ -40,10 +41,10 @@
     expect(completionOffset, isNull, reason: 'Call addTestUnit exactly once');
     completionOffset = content.indexOf('^');
     expect(completionOffset, isNot(equals(-1)), reason: 'missing ^');
-    var nextOffset = content.indexOf('^', completionOffset + 1);
+    var nextOffset = content.indexOf('^', completionOffset! + 1);
     expect(nextOffset, equals(-1), reason: 'too many ^');
     content = content.substring(0, completionOffset) +
-        content.substring(completionOffset + 1);
+        content.substring(completionOffset! + 1);
     addSource(testFile, content);
   }
 
@@ -57,31 +58,31 @@
   void assertHasParameterInfo(CompletionSuggestion suggestion) {
     expect(suggestion.parameterNames, isNotNull);
     expect(suggestion.parameterTypes, isNotNull);
-    expect(suggestion.parameterNames.length, suggestion.parameterTypes.length);
+    expect(
+        suggestion.parameterNames!.length, suggestion.parameterTypes!.length);
     expect(suggestion.requiredParameterCount,
-        lessThanOrEqualTo(suggestion.parameterNames.length));
+        lessThanOrEqualTo(suggestion.parameterNames!.length));
     expect(suggestion.hasNamedParameters, isNotNull);
   }
 
-  void assertNoSuggestions({CompletionSuggestionKind kind}) {
+  void assertNoSuggestions({CompletionSuggestionKind? kind}) {
     if (kind == null) {
-      if (suggestions.isNotEmpty) {
+      var suggestions = this.suggestions;
+      if (suggestions != null && suggestions.isNotEmpty) {
         failedCompletion('Expected no suggestions', suggestions);
       }
       return;
     }
-    var suggestion = suggestions.firstWhere(
-        (CompletionSuggestion cs) => cs.kind == kind,
-        orElse: () => null);
+    var suggestion = suggestions
+        ?.firstWhereOrNull((CompletionSuggestion cs) => cs.kind == kind);
     if (suggestion != null) {
       failedCompletion('did not expect completion: $completion\n  $suggestion');
     }
   }
 
   void assertNotSuggested(String completion) {
-    var suggestion = suggestions.firstWhere(
-        (CompletionSuggestion cs) => cs.completion == completion,
-        orElse: () => null);
+    var suggestion = suggestions?.firstWhereOrNull(
+        (CompletionSuggestion cs) => cs.completion == completion);
     if (suggestion != null) {
       failedCompletion('did not expect completion: $completion\n  $suggestion');
     }
@@ -90,22 +91,22 @@
   CompletionSuggestion assertSuggest(String completion,
       {CompletionSuggestionKind csKind = CompletionSuggestionKind.INVOCATION,
       int relevance = DART_RELEVANCE_DEFAULT,
-      ElementKind elemKind,
+      ElementKind? elemKind,
       bool isDeprecated = false,
       bool isPotential = false,
-      String elemFile,
-      int elemOffset,
-      int selectionOffset,
-      String paramName,
-      String paramType,
-      String defaultArgListString = _UNCHECKED,
-      List<int> defaultArgumentListTextRanges}) {
+      String? elemFile,
+      int? elemOffset,
+      int? selectionOffset,
+      String? paramName,
+      String? paramType,
+      String? defaultArgListString = _UNCHECKED,
+      List<int>? defaultArgumentListTextRanges}) {
     var cs =
         getSuggest(completion: completion, csKind: csKind, elemKind: elemKind);
     if (cs == null) {
       failedCompletion('expected $completion $csKind $elemKind', suggestions);
     }
-    expect(cs.kind, equals(csKind));
+    expect(cs!.kind, equals(csKind));
     if (isDeprecated) {
       expect(cs.relevance, equals(DART_RELEVANCE_LOW));
     } else {
@@ -115,19 +116,20 @@
     expect(cs.selectionLength, equals(0));
     expect(cs.isDeprecated, equals(isDeprecated));
     expect(cs.isPotential, equals(isPotential));
-    if (cs.element != null) {
-      expect(cs.element.location, isNotNull);
-      expect(cs.element.location.file, isNotNull);
-      expect(cs.element.location.offset, isNotNull);
-      expect(cs.element.location.length, isNotNull);
-      expect(cs.element.location.startColumn, isNotNull);
-      expect(cs.element.location.startLine, isNotNull);
+    var element = cs.element;
+    if (element != null) {
+      expect(element.location, isNotNull);
+      expect(element.location!.file, isNotNull);
+      expect(element.location!.offset, isNotNull);
+      expect(element.location!.length, isNotNull);
+      expect(element.location!.startColumn, isNotNull);
+      expect(element.location!.startLine, isNotNull);
     }
-    if (elemFile != null) {
-      expect(cs.element.location.file, elemFile);
+    if (element != null && elemFile != null) {
+      expect(element.location!.file, elemFile);
     }
-    if (elemOffset != null) {
-      expect(cs.element.location.offset, elemOffset);
+    if (element != null && elemOffset != null) {
+      expect(element.location!.offset, elemOffset);
     }
     if (paramName != null) {
       expect(cs.parameterName, paramName);
@@ -148,16 +150,16 @@
       {int relevance = DART_RELEVANCE_DEFAULT,
       CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
       bool isDeprecated = false,
-      String elemFile,
-      String elemName,
-      int elemOffset}) {
+      String? elemFile,
+      String? elemName,
+      int? elemOffset}) {
     var cs = assertSuggest(name,
         csKind: kind,
         relevance: relevance,
         isDeprecated: isDeprecated,
         elemFile: elemFile,
         elemOffset: elemOffset);
-    var element = cs.element;
+    var element = cs.element!;
     expect(element, isNotNull);
     expect(element.kind, equals(ElementKind.CLASS));
     expect(element.name, equals(elemName ?? name));
@@ -171,7 +173,7 @@
       {int relevance = DART_RELEVANCE_DEFAULT,
       CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION}) {
     var cs = assertSuggest(name, csKind: kind, relevance: relevance);
-    var element = cs.element;
+    var element = cs.element!;
     expect(element, isNotNull);
     expect(element.kind, equals(ElementKind.CLASS_TYPE_ALIAS));
     expect(element.name, equals(name));
@@ -183,9 +185,9 @@
 
   CompletionSuggestion assertSuggestConstructor(String name,
       {int relevance = DART_RELEVANCE_DEFAULT,
-      int elemOffset,
+      int? elemOffset,
       String defaultArgListString = _UNCHECKED,
-      List<int> defaultArgumentListTextRanges}) {
+      List<int>? defaultArgumentListTextRanges}) {
     var cs = assertSuggest(name,
         relevance: relevance,
         elemOffset: elemOffset,
@@ -193,7 +195,7 @@
         defaultArgumentListTextRanges: defaultArgumentListTextRanges);
     var element = cs.element;
     expect(element, isNotNull);
-    expect(element.kind, equals(ElementKind.CONSTRUCTOR));
+    expect(element!.kind, equals(ElementKind.CONSTRUCTOR));
     var index = name.indexOf('.');
     expect(element.name, index >= 0 ? name.substring(index + 1) : '');
     return cs;
@@ -203,7 +205,7 @@
       {bool isDeprecated = false}) {
     var suggestion = assertSuggest(completion, isDeprecated: isDeprecated);
     expect(suggestion.isDeprecated, isDeprecated);
-    expect(suggestion.element.kind, ElementKind.ENUM);
+    expect(suggestion.element!.kind, ElementKind.ENUM);
     return suggestion;
   }
 
@@ -213,11 +215,11 @@
         relevance: relevance, isDeprecated: isDeprecated);
     expect(suggestion.completion, completion);
     expect(suggestion.isDeprecated, isDeprecated);
-    expect(suggestion.element.kind, ElementKind.ENUM_CONSTANT);
+    expect(suggestion.element!.kind, ElementKind.ENUM_CONSTANT);
     return suggestion;
   }
 
-  CompletionSuggestion assertSuggestField(String name, String type,
+  CompletionSuggestion assertSuggestField(String name, String? type,
       {int relevance = DART_RELEVANCE_DEFAULT,
       CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
       bool isDeprecated = false}) {
@@ -228,7 +230,7 @@
         isDeprecated: isDeprecated);
     // The returnType represents the type of a field
     expect(cs.returnType, type ?? 'dynamic');
-    var element = cs.element;
+    var element = cs.element!;
     expect(element, isNotNull);
     expect(element.kind, equals(ElementKind.FIELD));
     expect(element.name, equals(name));
@@ -239,12 +241,12 @@
     return cs;
   }
 
-  CompletionSuggestion assertSuggestFunction(String name, String returnType,
+  CompletionSuggestion assertSuggestFunction(String name, String? returnType,
       {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
       bool isDeprecated = false,
       int relevance = DART_RELEVANCE_DEFAULT,
       String defaultArgListString = _UNCHECKED,
-      List<int> defaultArgumentListTextRanges}) {
+      List<int>? defaultArgumentListTextRanges}) {
     var cs = assertSuggest(name,
         csKind: kind,
         relevance: relevance,
@@ -256,12 +258,12 @@
     } else if (isNullExpectedReturnTypeConsideredDynamic) {
       expect(cs.returnType, 'dynamic');
     }
-    var element = cs.element;
+    var element = cs.element!;
     expect(element, isNotNull);
     expect(element.kind, equals(ElementKind.FUNCTION));
     expect(element.name, equals(name));
     expect(element.isDeprecated, equals(isDeprecated));
-    var param = element.parameters;
+    var param = element.parameters!;
     expect(param, isNotNull);
     expect(param[0], equals('('));
     expect(param[param.length - 1], equals(')'));
@@ -275,7 +277,7 @@
   }
 
   CompletionSuggestion assertSuggestFunctionTypeAlias(
-      String name, String returnType,
+      String name, String? returnType,
       {bool isDeprecated = false,
       int relevance = DART_RELEVANCE_DEFAULT,
       CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION}) {
@@ -288,7 +290,7 @@
     } else {
       expect(cs.returnType, isNull);
     }
-    var element = cs.element;
+    var element = cs.element!;
     expect(element, isNotNull);
     expect(element.kind, equals(ElementKind.FUNCTION_TYPE_ALIAS));
     expect(element.name, equals(name));
@@ -304,7 +306,7 @@
     return cs;
   }
 
-  CompletionSuggestion assertSuggestGetter(String name, String returnType,
+  CompletionSuggestion assertSuggestGetter(String name, String? returnType,
       {int relevance = DART_RELEVANCE_DEFAULT,
       CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
       bool isDeprecated = false}) {
@@ -314,7 +316,7 @@
         elemKind: ElementKind.GETTER,
         isDeprecated: isDeprecated);
     expect(cs.returnType, returnType ?? 'dynamic');
-    var element = cs.element;
+    var element = cs.element!;
     expect(element, isNotNull);
     expect(element.kind, equals(ElementKind.GETTER));
     expect(element.name, equals(name));
@@ -325,12 +327,12 @@
   }
 
   CompletionSuggestion assertSuggestMethod(
-      String name, String declaringType, String returnType,
+      String name, String declaringType, String? returnType,
       {int relevance = DART_RELEVANCE_DEFAULT,
       CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
       bool isDeprecated = false,
-      String defaultArgListString = _UNCHECKED,
-      List<int> defaultArgumentListTextRanges}) {
+      String? defaultArgListString = _UNCHECKED,
+      List<int>? defaultArgumentListTextRanges}) {
     var cs = assertSuggest(name,
         csKind: kind,
         relevance: relevance,
@@ -339,11 +341,11 @@
         defaultArgumentListTextRanges: defaultArgumentListTextRanges);
     expect(cs.declaringType, equals(declaringType));
     expect(cs.returnType, returnType ?? 'dynamic');
-    var element = cs.element;
+    var element = cs.element!;
     expect(element, isNotNull);
     expect(element.kind, equals(ElementKind.METHOD));
     expect(element.name, equals(name));
-    var param = element.parameters;
+    var param = element.parameters!;
     expect(param, isNotNull);
     expect(param[0], equals('('));
     expect(param[param.length - 1], equals(')'));
@@ -369,7 +371,7 @@
       CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION}) {
     var cs = assertSuggest(name,
         csKind: kind, relevance: relevance, elemKind: ElementKind.SETTER);
-    var element = cs.element;
+    var element = cs.element!;
     expect(element, isNotNull);
     expect(element.kind, equals(ElementKind.SETTER));
     expect(element.name, equals(name));
@@ -383,7 +385,7 @@
     return cs;
   }
 
-  CompletionSuggestion assertSuggestTopLevelVar(String name, String returnType,
+  CompletionSuggestion assertSuggestTopLevelVar(String name, String? returnType,
       {int relevance = DART_RELEVANCE_DEFAULT,
       CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION}) {
     var cs = assertSuggest(name, csKind: kind, relevance: relevance);
@@ -392,7 +394,7 @@
     } else if (isNullExpectedReturnTypeConsideredDynamic) {
       expect(cs.returnType, 'dynamic');
     }
-    var element = cs.element;
+    var element = cs.element!;
     expect(element, isNotNull);
     expect(element.kind, equals(ElementKind.TOP_LEVEL_VARIABLE));
     expect(element.name, equals(name));
@@ -413,17 +415,17 @@
   Future computeSuggestions() async {
     var result = await resolveFile(testFile);
     request =
-        DartCompletionRequestImpl(resourceProvider, completionOffset, result);
+        DartCompletionRequestImpl(resourceProvider, completionOffset!, result);
 
     var target =
-        CompletionTarget.forOffset(request.result.unit, request.offset);
-    var range = target.computeReplacementRange(request.offset);
+        CompletionTarget.forOffset(request!.result.unit!, request!.offset);
+    var range = target.computeReplacementRange(request!.offset);
     replacementOffset = range.offset;
     replacementLength = range.length;
 
     // Request completions
     var collector = CompletionCollectorImpl();
-    await contributor.computeSuggestions(request, collector);
+    await contributor.computeSuggestions(request!, collector);
     suggestions = collector.suggestions;
     expect(suggestions, isNotNull, reason: 'expected suggestions');
   }
@@ -431,7 +433,7 @@
   CompletionContributor createContributor();
 
   void failedCompletion(String message,
-      [Iterable<CompletionSuggestion> completions]) {
+      [Iterable<CompletionSuggestion>? completions]) {
     var sb = StringBuffer(message);
     if (completions != null) {
       sb.write('\n  found');
@@ -444,13 +446,13 @@
     fail(sb.toString());
   }
 
-  CompletionSuggestion getSuggest(
-      {String completion,
-      CompletionSuggestionKind csKind,
-      ElementKind elemKind}) {
-    CompletionSuggestion cs;
+  CompletionSuggestion? getSuggest(
+      {String? completion,
+      CompletionSuggestionKind? csKind,
+      ElementKind? elemKind}) {
+    CompletionSuggestion? cs;
     if (suggestions != null) {
-      suggestions.forEach((CompletionSuggestion s) {
+      suggestions?.forEach((CompletionSuggestion s) {
         if (completion != null && completion != s.completion) {
           return;
         }
@@ -467,7 +469,7 @@
           cs = s;
         } else {
           failedCompletion('expected exactly one $cs',
-              suggestions.where((s) => s.completion == completion));
+              suggestions!.where((s) => s.completion == completion));
         }
       });
     }
diff --git a/pkg/analyzer_plugin/test/utilities/completion/inherited_reference_contributor_test.dart b/pkg/analyzer_plugin/test/utilities/completion/inherited_reference_contributor_test.dart
index 2b63605..9ee63f3 100644
--- a/pkg/analyzer_plugin/test/utilities/completion/inherited_reference_contributor_test.dart
+++ b/pkg/analyzer_plugin/test/utilities/completion/inherited_reference_contributor_test.dart
@@ -200,10 +200,10 @@
     await computeSuggestions();
     var suggestion = assertSuggestMethod('m', 'A', 'void');
     expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.parameterNames![0], 'x');
+    expect(suggestion.parameterTypes![0], 'dynamic');
+    expect(suggestion.parameterNames![1], 'y');
+    expect(suggestion.parameterTypes![1], 'int');
     expect(suggestion.requiredParameterCount, 1);
     expect(suggestion.hasNamedParameters, true);
   }
@@ -220,10 +220,10 @@
     await computeSuggestions();
     var suggestion = assertSuggestMethod('m', 'A', 'void');
     expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.parameterNames![0], 'x');
+    expect(suggestion.parameterTypes![0], 'dynamic');
+    expect(suggestion.parameterNames![1], 'y');
+    expect(suggestion.parameterTypes![1], 'int');
     expect(suggestion.requiredParameterCount, 1);
     expect(suggestion.hasNamedParameters, true);
   }
@@ -243,10 +243,10 @@
     await computeSuggestions();
     var suggestion = assertSuggestMethod('m', 'A', 'void');
     expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.parameterNames![0], 'x');
+    expect(suggestion.parameterTypes![0], 'dynamic');
+    expect(suggestion.parameterNames![1], 'y');
+    expect(suggestion.parameterTypes![1], 'int');
     expect(suggestion.requiredParameterCount, 1);
     expect(suggestion.hasNamedParameters, false);
   }
@@ -264,10 +264,10 @@
     await computeSuggestions();
     var suggestion = assertSuggestMethod('m', 'A', 'void');
     expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.parameterNames![0], 'x');
+    expect(suggestion.parameterTypes![0], 'dynamic');
+    expect(suggestion.parameterNames![1], 'y');
+    expect(suggestion.parameterTypes![1], 'int');
     expect(suggestion.requiredParameterCount, 1);
     expect(suggestion.hasNamedParameters, false);
   }
@@ -287,10 +287,10 @@
     await computeSuggestions();
     var suggestion = assertSuggestMethod('m', 'A', 'void');
     expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.parameterNames![0], 'x');
+    expect(suggestion.parameterTypes![0], 'dynamic');
+    expect(suggestion.parameterNames![1], 'y');
+    expect(suggestion.parameterTypes![1], 'int');
     expect(suggestion.requiredParameterCount, 0);
     expect(suggestion.hasNamedParameters, true);
   }
@@ -307,10 +307,10 @@
     await computeSuggestions();
     var suggestion = assertSuggestMethod('m', 'A', 'void');
     expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.parameterNames![0], 'x');
+    expect(suggestion.parameterTypes![0], 'dynamic');
+    expect(suggestion.parameterNames![1], 'y');
+    expect(suggestion.parameterTypes![1], 'int');
     expect(suggestion.requiredParameterCount, 0);
     expect(suggestion.hasNamedParameters, true);
   }
@@ -367,10 +367,10 @@
     await computeSuggestions();
     var suggestion = assertSuggestMethod('m', 'A', 'void');
     expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.parameterNames![0], 'x');
+    expect(suggestion.parameterTypes![0], 'dynamic');
+    expect(suggestion.parameterNames![1], 'y');
+    expect(suggestion.parameterTypes![1], 'int');
     expect(suggestion.requiredParameterCount, 0);
     expect(suggestion.hasNamedParameters, false);
   }
@@ -387,10 +387,10 @@
     await computeSuggestions();
     var suggestion = assertSuggestMethod('m', 'A', 'void');
     expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.parameterNames![0], 'x');
+    expect(suggestion.parameterTypes![0], 'dynamic');
+    expect(suggestion.parameterNames![1], 'y');
+    expect(suggestion.parameterTypes![1], 'int');
     expect(suggestion.requiredParameterCount, 0);
     expect(suggestion.hasNamedParameters, false);
   }
@@ -410,10 +410,10 @@
     await computeSuggestions();
     var suggestion = assertSuggestMethod('m', 'A', 'void');
     expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.parameterNames![0], 'x');
+    expect(suggestion.parameterTypes![0], 'dynamic');
+    expect(suggestion.parameterNames![1], 'y');
+    expect(suggestion.parameterTypes![1], 'int');
     expect(suggestion.requiredParameterCount, 2);
     expect(suggestion.hasNamedParameters, false);
   }
diff --git a/pkg/analyzer_plugin/test/utilities/completion/type_member_contributor_test.dart b/pkg/analyzer_plugin/test/utilities/completion/type_member_contributor_test.dart
index 59a19c1..4f20366 100644
--- a/pkg/analyzer_plugin/test/utilities/completion/type_member_contributor_test.dart
+++ b/pkg/analyzer_plugin/test/utilities/completion/type_member_contributor_test.dart
@@ -39,13 +39,13 @@
 ''');
     await computeSuggestions();
     var suggestionsForX = suggestions
-        .where((CompletionSuggestion s) => s.completion == 'x')
+        ?.where((CompletionSuggestion s) => s.completion == 'x')
         .toList();
     expect(suggestionsForX, hasLength(1));
     if (shouldBeShadowed) {
-      expect(suggestionsForX[0].declaringType, 'Derived');
+      expect(suggestionsForX![0].declaringType, 'Derived');
     } else {
-      expect(suggestionsForX[0].declaringType, 'Base');
+      expect(suggestionsForX![0].declaringType, 'Base');
     }
   }
 
@@ -428,7 +428,7 @@
           int a;
           int^ b = 1;}''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 3);
+    expect(replacementOffset, completionOffset! - 3);
     expect(replacementLength, 3);
     assertNotSuggested('A');
     assertNotSuggested('int');
@@ -451,7 +451,7 @@
           i^
           b = 1;}''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('A');
     assertNotSuggested('int');
@@ -934,7 +934,7 @@
         class Z { }''');
     await computeSuggestions();
 
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
 
     assertNotSuggested('X');
@@ -1075,7 +1075,7 @@
           void b() { }}
         class Z { }''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('partT8');
     assertNotSuggested('partBoo');
@@ -1090,7 +1090,7 @@
         '/proj/testAB.dart', 'import "package:myBar/bar.dart"; class Foo { }');
     addTestSource('class C {foo(){F^}}');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('Foo');
     // TODO(danrubel) implement
@@ -1197,7 +1197,7 @@
         class X{}
         main() {A a; a^..b}''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('b');
     assertNotSuggested('_c');
@@ -1324,7 +1324,7 @@
         class _B {}
         A Sew;''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('A');
     assertNotSuggested('_B');
@@ -1580,7 +1580,7 @@
     addTestSource('''
         main() {new String.fr^omCharCodes([]);}''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 2);
+    expect(replacementOffset, completionOffset! - 2);
     expect(replacementLength, 13);
     // Suggested by NamedConstructorContributor
     assertNotSuggested('fromCharCodes');
@@ -1837,7 +1837,7 @@
     // DeclaredIdentifier  ForEachStatement  Block
     addTestSource('main(args) {for (S^ foo in args) {}}');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('args');
     assertNotSuggested('foo');
@@ -1875,7 +1875,7 @@
     // SimpleIdentifier  ForStatement
     addTestSource('main() {for (int index = 0; i^)}');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('index');
   }
@@ -1895,7 +1895,7 @@
     // SimpleIdentifier  ForStatement
     addTestSource('main() {for (int index = 0; index < 10; i^)}');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('index');
   }
@@ -1906,7 +1906,7 @@
         void bar() { }
         main() {for (int index = 0; index < 10; ++i^)}''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('index');
     assertNotSuggested('main');
@@ -2054,9 +2054,9 @@
 ''');
     await computeSuggestions();
     var suggestion = assertSuggestMethod('m', 'C', 'int');
-    expect(suggestion.parameterTypes[0], 'int');
-    expect(suggestion.element.returnType, 'int');
-    expect(suggestion.element.parameters, '(int t)');
+    expect(suggestion.parameterTypes![0], 'int');
+    expect(suggestion.element!.returnType, 'int');
+    expect(suggestion.element!.parameters, '(int t)');
   }
 
   Future<void> test_generic_setter() async {
@@ -2073,7 +2073,7 @@
     // as a parmeter to it, and it will check the appropriate field in
     // the suggestion object.
     var suggestion = assertSuggestSetter('t');
-    expect(suggestion.element.parameters, '(int value)');
+    expect(suggestion.element!.parameters, '(int value)');
   }
 
   Future<void> test_genericTypeAlias_noFunctionType() async {
@@ -2227,7 +2227,7 @@
     addSource('/testAB.dart', 'class Foo { }');
     addTestSource('class C {foo(){new F^}}');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('Future');
     assertNotSuggested('Foo');
@@ -2386,7 +2386,7 @@
         class A {int x; int y() => 0;}
         main(){var a; if (a is Obj^)}''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 3);
+    expect(replacementOffset, completionOffset! - 3);
     expect(replacementLength, 3);
     assertNotSuggested('a');
     assertNotSuggested('main');
@@ -2414,7 +2414,7 @@
         var m;
         main() {new^ X.c();}''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 3);
+    expect(replacementOffset, completionOffset! - 3);
     expect(replacementLength, 3);
     assertNotSuggested('c');
     assertNotSuggested('_d');
@@ -2561,7 +2561,7 @@
         class C2 { }
         foo = {T^''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('T2');
   }
@@ -2581,7 +2581,7 @@
         class C2 { }
         foo = {7:T^};''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('T2');
   }
@@ -2595,10 +2595,10 @@
     await computeSuggestions();
     var suggestion = assertSuggestMethod('m', 'C', 'void');
     expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.parameterNames![0], 'x');
+    expect(suggestion.parameterTypes![0], 'dynamic');
+    expect(suggestion.parameterNames![1], 'y');
+    expect(suggestion.parameterTypes![1], 'int');
     expect(suggestion.requiredParameterCount, 1);
     expect(suggestion.hasNamedParameters, true);
   }
@@ -2612,10 +2612,10 @@
     await computeSuggestions();
     var suggestion = assertSuggestMethod('m', 'C', 'void');
     expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.parameterNames![0], 'x');
+    expect(suggestion.parameterTypes![0], 'dynamic');
+    expect(suggestion.parameterNames![1], 'y');
+    expect(suggestion.parameterTypes![1], 'int');
     expect(suggestion.requiredParameterCount, 1);
     expect(suggestion.hasNamedParameters, false);
   }
@@ -2629,10 +2629,10 @@
     await computeSuggestions();
     var suggestion = assertSuggestMethod('m', 'C', 'void');
     expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.parameterNames![0], 'x');
+    expect(suggestion.parameterTypes![0], 'dynamic');
+    expect(suggestion.parameterNames![1], 'y');
+    expect(suggestion.parameterTypes![1], 'int');
     expect(suggestion.requiredParameterCount, 0);
     expect(suggestion.hasNamedParameters, true);
   }
@@ -2660,10 +2660,10 @@
     await computeSuggestions();
     var suggestion = assertSuggestMethod('m', 'C', 'void');
     expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.parameterNames![0], 'x');
+    expect(suggestion.parameterTypes![0], 'dynamic');
+    expect(suggestion.parameterNames![1], 'y');
+    expect(suggestion.parameterTypes![1], 'int');
     expect(suggestion.requiredParameterCount, 0);
     expect(suggestion.hasNamedParameters, false);
   }
@@ -2677,10 +2677,10 @@
     await computeSuggestions();
     var suggestion = assertSuggestMethod('m', 'C', 'void');
     expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.parameterNames![0], 'x');
+    expect(suggestion.parameterTypes![0], 'dynamic');
+    expect(suggestion.parameterNames![1], 'y');
+    expect(suggestion.parameterTypes![1], 'int');
     expect(suggestion.requiredParameterCount, 2);
     expect(suggestion.hasNamedParameters, false);
   }
@@ -3347,7 +3347,7 @@
         import "a.dart";
         class X {foo(){A^.bar}}''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('A');
     assertNotSuggested('X');
@@ -3465,7 +3465,7 @@
     // SimpleIdentifier  MethodInvocation  PropertyAccess  ExpressionStatement
     addTestSource('class A {a() {"hello".to^String().length}}');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 2);
+    expect(replacementOffset, completionOffset! - 2);
     expect(replacementLength, 8);
     assertSuggestGetter('length', 'int');
     assertNotSuggested('A');
@@ -3798,7 +3798,7 @@
           m(X x) {} I _n(X x) {}}
         class X{}''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     // Contributed by FieldFormalConstructorContributor
     assertNotSuggested('b');
@@ -3946,7 +3946,7 @@
         class C<E> {}
         main() { C<C^> c; }''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('C1');
     assertNotSuggested('C2');
diff --git a/pkg/analyzer_plugin/test/verify_tests_test.dart b/pkg/analyzer_plugin/test/verify_tests_test.dart
index 48657ce..f7414bb 100644
--- a/pkg/analyzer_plugin/test/verify_tests_test.dart
+++ b/pkg/analyzer_plugin/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_plugin/tool/spec/api.dart b/pkg/analyzer_plugin/tool/spec/api.dart
index 6b4508a..04ef8d8 100644
--- a/pkg/analyzer_plugin/tool/spec/api.dart
+++ b/pkg/analyzer_plugin/tool/spec/api.dart
@@ -13,11 +13,11 @@
   final String version;
   final List<Domain> domains;
   final Types types;
-  final Refactorings refactorings;
+  final Refactorings? refactorings;
 
   Api(this.version, this.domains, this.types, this.refactorings,
       dom.Element html,
-      {bool experimental})
+      {bool? experimental})
       : super(html, experimental, false);
 }
 
@@ -30,9 +30,9 @@
   final bool deprecated;
 
   /// Html element representing this part of the API.
-  final dom.Element html;
+  final dom.Element? html;
 
-  ApiNode(this.html, bool experimental, bool deprecated)
+  ApiNode(this.html, bool? experimental, bool? deprecated)
       : experimental = experimental ?? false,
         deprecated = deprecated ?? false;
 }
@@ -57,7 +57,7 @@
   final List<Notification> notifications;
 
   Domain(this.name, this.requests, this.notifications, dom.Element html,
-      {bool experimental, bool deprecated})
+      {bool? experimental, bool? deprecated})
       : super(html, experimental, deprecated);
 }
 
@@ -73,9 +73,9 @@
   ///
   /// If it is not possible (because the chain ends with a [TypeReference] that
   /// is not defined in the API), then that final [TypeReference] is returned.
-  TypeDecl resolveTypeReferenceChain(TypeDecl type) {
+  TypeDecl? resolveTypeReferenceChain(TypeDecl? type) {
     while (type is TypeReference && api.types.containsKey(type.typeName)) {
-      type = api.types[(type as TypeReference).typeName].type;
+      type = api.types[type.typeName]?.type;
     }
     return type;
   }
@@ -93,29 +93,29 @@
 
   void visitNotification(Notification notification) {
     if (notification.params != null) {
-      visitTypeDecl(notification.params);
+      visitTypeDecl(notification.params!);
     }
   }
 
   void visitRefactoring(Refactoring refactoring) {
     if (refactoring.feedback != null) {
-      visitTypeDecl(refactoring.feedback);
+      visitTypeDecl(refactoring.feedback!);
     }
     if (refactoring.options != null) {
-      visitTypeDecl(refactoring.options);
+      visitTypeDecl(refactoring.options!);
     }
   }
 
-  void visitRefactorings(Refactorings refactorings) {
+  void visitRefactorings(Refactorings? refactorings) {
     refactorings?.forEach(visitRefactoring);
   }
 
   void visitRequest(Request request) {
     if (request.params != null) {
-      visitTypeDecl(request.params);
+      visitTypeDecl(request.params!);
     }
     if (request.result != null) {
-      visitTypeDecl(request.result);
+      visitTypeDecl(request.result!);
     }
   }
 
@@ -173,10 +173,10 @@
 
   /// Type of the object associated with the "params" key in the notification
   /// object, or null if the notification has no parameters.
-  final TypeObject params;
+  final TypeObject? params;
 
   Notification(this.domainName, this.event, this.params, dom.Element html,
-      {bool experimental})
+      {bool? experimental})
       : super(html, experimental, false);
 
   /// Get the name of the notification, including the domain prefix.
@@ -190,7 +190,7 @@
           value: '$domainName.$event')
     ];
     if (params != null) {
-      fields.add(TypeObjectField('params', params, null));
+      fields.add(TypeObjectField('params', params!, null));
     }
     return TypeObject(fields, null);
   }
@@ -204,14 +204,14 @@
 
   /// Type of the refactoring feedback, or null if the refactoring has no
   /// feedback.
-  final TypeObject feedback;
+  final TypeObject? feedback;
 
   /// Type of the refactoring options, or null if the refactoring has no
   /// options.
-  final TypeObject options;
+  final TypeObject? options;
 
   Refactoring(this.kind, this.feedback, this.options, dom.Element html,
-      {bool experimental})
+      {bool? experimental})
       : super(html, experimental, false);
 }
 
@@ -219,7 +219,7 @@
 class Refactorings extends ApiNode with IterableMixin<Refactoring> {
   final List<Refactoring> refactorings;
 
-  Refactorings(this.refactorings, dom.Element html, {bool experimental})
+  Refactorings(this.refactorings, dom.Element html, {bool? experimental})
       : super(html, experimental, false);
 
   @override
@@ -236,15 +236,15 @@
 
   /// Type of the object associated with the "params" key in the request object,
   /// or null if the request has no parameters.
-  final TypeObject params;
+  final TypeObject? params;
 
   /// Type of the object associated with the "result" key in the response
   /// object, or null if the response has no results.
-  final TypeObject result;
+  final TypeObject? result;
 
   Request(
       this.domainName, this.method, this.params, this.result, dom.Element html,
-      {bool experimental, bool deprecated})
+      {bool? experimental, bool? deprecated})
       : super(html, experimental, deprecated);
 
   /// Get the name of the request, including the domain prefix.
@@ -259,7 +259,7 @@
           value: '$domainName.$method')
     ];
     if (params != null) {
-      fields.add(TypeObjectField('params', params, null));
+      fields.add(TypeObjectField('params', params!, null));
     }
     return TypeObject(fields, null);
   }
@@ -273,7 +273,7 @@
           optional: true)
     ];
     if (result != null) {
-      fields.add(TypeObjectField('result', result, null));
+      fields.add(TypeObjectField('result', result!, null));
     }
     return TypeObject(fields, null);
   }
@@ -281,7 +281,7 @@
 
 /// Base class for all possible types.
 abstract class TypeDecl extends ApiNode {
-  TypeDecl(dom.Element html, bool experimental, bool deprecated)
+  TypeDecl(dom.Element? html, bool? experimental, bool? deprecated)
       : super(html, experimental, deprecated);
 
   T accept<T>(ApiVisitor<T> visitor);
@@ -295,7 +295,7 @@
   bool isExternal = false;
 
   TypeDefinition(this.name, this.type, dom.Element html,
-      {bool experimental, bool deprecated})
+      {bool? experimental, bool? deprecated})
       : super(html, experimental, deprecated);
 }
 
@@ -304,7 +304,8 @@
 class TypeEnum extends TypeDecl {
   final List<TypeEnumValue> values;
 
-  TypeEnum(this.values, dom.Element html, {bool experimental, bool deprecated})
+  TypeEnum(this.values, dom.Element html,
+      {bool? experimental, bool? deprecated})
       : super(html, experimental, deprecated);
 
   @override
@@ -316,7 +317,7 @@
   final String value;
 
   TypeEnumValue(this.value, dom.Element html,
-      {bool experimental, bool deprecated})
+      {bool? experimental, bool? deprecated})
       : super(html, experimental, deprecated);
 }
 
@@ -324,7 +325,7 @@
 class TypeList extends TypeDecl {
   final TypeDecl itemType;
 
-  TypeList(this.itemType, dom.Element html, {bool experimental})
+  TypeList(this.itemType, dom.Element html, {bool? experimental})
       : super(html, experimental, false);
 
   @override
@@ -342,7 +343,7 @@
   /// Type of map values.
   final TypeDecl valueType;
 
-  TypeMap(this.keyType, this.valueType, dom.Element html, {bool experimental})
+  TypeMap(this.keyType, this.valueType, dom.Element html, {bool? experimental})
       : super(html, experimental, false);
 
   @override
@@ -353,15 +354,15 @@
 class TypeObject extends TypeDecl {
   final List<TypeObjectField> fields;
 
-  TypeObject(this.fields, dom.Element html,
-      {bool experimental, bool deprecated})
+  TypeObject(this.fields, dom.Element? html,
+      {bool? experimental, bool? deprecated})
       : super(html, experimental, deprecated);
 
   @override
   T accept<T>(ApiVisitor<T> visitor) => visitor.visitTypeObject(this);
 
   /// Return the field with the given [name], or null if there is no such field.
-  TypeObjectField getField(String name) {
+  TypeObjectField? getField(String name) {
     for (var field in fields) {
       if (field.name == name) {
         return field;
@@ -378,10 +379,10 @@
   final bool optional;
 
   /// Value that the field is required to contain, or null if it may vary.
-  final Object value;
+  final Object? value;
 
-  TypeObjectField(this.name, this.type, dom.Element html,
-      {this.optional = false, this.value, bool experimental, bool deprecated})
+  TypeObjectField(this.name, this.type, dom.Element? html,
+      {this.optional = false, this.value, bool? experimental, bool? deprecated})
       : super(html, experimental, deprecated);
 }
 
@@ -390,7 +391,7 @@
 class TypeReference extends TypeDecl {
   final String typeName;
 
-  TypeReference(this.typeName, dom.Element html, {bool experimental})
+  TypeReference(this.typeName, dom.Element? html, {bool? experimental})
       : super(html, experimental, false) {
     if (typeName.isEmpty) {
       throw Exception('Empty type name');
@@ -407,7 +408,7 @@
 
   List<String> importUris = <String>[];
 
-  Types(this.types, dom.Element html, {bool experimental})
+  Types(this.types, dom.Element html, {bool? experimental})
       : super(html, experimental, false);
 
   @override
@@ -415,7 +416,7 @@
 
   Iterable<String> get keys => types.keys;
 
-  TypeDefinition operator [](String typeName) => types[typeName];
+  TypeDefinition? operator [](String typeName) => types[typeName];
 
   bool containsKey(String typeName) => types.containsKey(typeName);
 }
@@ -427,7 +428,7 @@
   /// The field that is used to disambiguate this union
   final String field;
 
-  TypeUnion(this.choices, this.field, dom.Element html, {bool experimental})
+  TypeUnion(this.choices, this.field, dom.Element html, {bool? experimental})
       : super(html, experimental, false);
 
   @override
diff --git a/pkg/analyzer_plugin/tool/spec/codegen_dart.dart b/pkg/analyzer_plugin/tool/spec/codegen_dart.dart
index 9dacf99..d0d03f1 100644
--- a/pkg/analyzer_plugin/tool/spec/codegen_dart.dart
+++ b/pkg/analyzer_plugin/tool/spec/codegen_dart.dart
@@ -20,7 +20,7 @@
       var typeName = type.typeName;
       var referencedDefinition = api.types[typeName];
       if (_typeRenames.containsKey(typeName)) {
-        return _typeRenames[typeName];
+        return _typeRenames[typeName]!;
       }
       if (referencedDefinition == null) {
         return typeName;
@@ -35,9 +35,15 @@
     } else if (type is TypeMap) {
       return 'Map<${dartType(type.keyType)}, ${dartType(type.valueType)}>';
     } else if (type is TypeUnion) {
-      return 'dynamic';
+      return 'Object';
     } else {
       throw Exception("Can't convert to a dart type");
     }
   }
+
+  /// Return the Dart type for [field], nullable if the field is optional.
+  String fieldDartType(TypeObjectField field) {
+    var typeStr = dartType(field.type);
+    return field.optional ? '$typeStr?' : typeStr;
+  }
 }
diff --git a/pkg/analyzer_plugin/tool/spec/codegen_dart_protocol.dart b/pkg/analyzer_plugin/tool/spec/codegen_dart_protocol.dart
index 6497fe8..99ab0c3 100644
--- a/pkg/analyzer_plugin/tool/spec/codegen_dart_protocol.dart
+++ b/pkg/analyzer_plugin/tool/spec/codegen_dart_protocol.dart
@@ -243,7 +243,7 @@
   /// Emit the toJson() code for an empty class.
   void emitEmptyToJsonMember() {
     writeln('@override');
-    writeln('Map<String, dynamic> toJson() => <String, dynamic>{};');
+    writeln('Map<String, Object> toJson() => <String, Object>{};');
   }
 
   /// Emit a class to encapsulate an enum.
@@ -253,7 +253,7 @@
         toHtmlVisitor.write(impliedType.humanReadableName);
       });
       if (impliedType.type != null) {
-        toHtmlVisitor.showType(null, impliedType.type);
+        toHtmlVisitor.showType(null, impliedType.type!);
       }
       toHtmlVisitor.p(() {
         toHtmlVisitor.write(disclaimer);
@@ -342,7 +342,7 @@
   void emitEnumFromJsonConstructor(
       String className, TypeEnum type, ImpliedType impliedType) {
     writeln(
-        'factory $className.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {');
+        'factory $className.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object? json) {');
     indent(() {
       writeln('if (json is String) {');
       indent(() {
@@ -387,7 +387,7 @@
         toHtmlVisitor.write(impliedType.humanReadableName);
       });
       if (impliedType.type != null) {
-        toHtmlVisitor.showType(null, impliedType.type);
+        toHtmlVisitor.showType(null, impliedType.type!);
       }
       toHtmlVisitor.p(() {
         toHtmlVisitor.write(disclaimer);
@@ -413,7 +413,20 @@
         if (field.value != null) {
           continue;
         }
-        writeln('${dartType(field.type)} _${field.name};');
+
+        // if (!field.optional) {
+        //   write('late ');
+        // }
+        // write(dartType(field.type));
+        // if (field.optional) {
+        //   write('?');
+        // }
+        // write(' _${field.name};');
+
+        var lateStr = field.optional ? '' : 'late';
+        var questionStr = field.optional ? '?' : '';
+        writeln('$lateStr ${dartType(field.type)}$questionStr _${field.name};');
+
         writeln();
       }
       for (var field in type.fields) {
@@ -423,16 +436,13 @@
         docComment(toHtmlVisitor.collectHtml(() {
           toHtmlVisitor.translateHtml(field.html);
         }));
-        writeln('${dartType(field.type)} get ${field.name} => _${field.name};');
+        writeln('${fieldDartType(field)} get ${field.name} => _${field.name};');
         writeln();
         docComment(toHtmlVisitor.collectHtml(() {
           toHtmlVisitor.translateHtml(field.html);
         }));
-        writeln('set ${field.name}(${dartType(field.type)} value) {');
+        writeln('set ${field.name}(${fieldDartType(field)} value) {');
         indent(() {
-          if (!field.optional) {
-            writeln('assert(value != null);');
-          }
           writeln('_${field.name} = value;');
         });
         writeln('}');
@@ -484,9 +494,9 @@
       if (field.value != null) {
         continue;
       }
-      var arg = '${dartType(field.type)} ${field.name}';
       var setValueFromArg = 'this.${field.name} = ${field.name};';
       if (isOptionalConstructorArg(className, field)) {
+        var arg = '${dartType(field.type)}? ${field.name}';
         optionalArgs.add(arg);
         if (!field.optional) {
           // Optional constructor arg, but non-optional field. If no arg is
@@ -514,6 +524,7 @@
           });
         }
       } else {
+        var arg = '${dartType(field.type)} ${field.name}';
         args.add(arg);
         extraInitCode.add(() {
           writeln(setValueFromArg);
@@ -538,7 +549,7 @@
   }
 
   /// Emit the operator== code for an object class.
-  void emitObjectEqualsMember(TypeObject type, String className) {
+  void emitObjectEqualsMember(TypeObject? type, String className) {
     writeln('@override');
     writeln('bool operator ==(other) {');
     indent(() {
@@ -573,7 +584,7 @@
     var humanReadableNameString = literalString(impliedType.humanReadableName);
     if (className == 'RefactoringFeedback') {
       writeln('factory RefactoringFeedback.fromJson(JsonDecoder jsonDecoder, '
-          'String jsonPath, Object json, Map responseJson) {');
+          'String jsonPath, Object? json, Map responseJson) {');
       indent(() {
         writeln('return refactoringFeedbackFromJson(jsonDecoder, jsonPath, '
             'json, responseJson);');
@@ -583,7 +594,7 @@
     }
     if (className == 'RefactoringOptions') {
       writeln('factory RefactoringOptions.fromJson(JsonDecoder jsonDecoder, '
-          'String jsonPath, Object json, RefactoringKind kind) {');
+          'String jsonPath, Object? json, RefactoringKind kind) {');
       indent(() {
         writeln('return refactoringOptionsFromJson(jsonDecoder, jsonPath, '
             'json, kind);');
@@ -592,7 +603,7 @@
       return;
     }
     writeln(
-        'factory $className.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {');
+        'factory $className.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object? json) {');
     indent(() {
       writeln('json ??= {};');
       writeln('if (json is Map) {');
@@ -618,11 +629,11 @@
           } else {
             args.add(field.name);
           }
-          var fieldType = field.type;
-          var fieldDartType = dartType(fieldType);
-          writeln('$fieldDartType ${field.name};');
+          var typeStr = fieldDartType(field);
+          writeln('$typeStr ${field.name};');
           writeln('if (json.containsKey($fieldNameString)) {');
           indent(() {
+            var fieldType = field.type;
             var fromJson =
                 fromJsonCode(fieldType).asSnippet(jsonPath, fieldAccessor);
             writeln('${field.name} = $fromJson;');
@@ -653,7 +664,7 @@
   }
 
   /// Emit the hashCode getter for an object class.
-  void emitObjectHashCode(TypeObject type, String className) {
+  void emitObjectHashCode(TypeObject? type, String className) {
     writeln('@override');
     writeln('int get hashCode {');
     indent(() {
@@ -691,7 +702,7 @@
               'Returns the [RefactoringProblemSeverity] with the maximal severity.')
         ]);
         writeln(
-            'static RefactoringProblemSeverity max(RefactoringProblemSeverity a, RefactoringProblemSeverity b) =>');
+            'static RefactoringProblemSeverity? max(RefactoringProblemSeverity? a, RefactoringProblemSeverity? b) =>');
         writeln('    maxRefactoringProblemSeverity(a, b);');
         return true;
       default:
@@ -762,7 +773,7 @@
         docComment([
           dom.Text('Returns the [FileEdit] for the given [file], maybe `null`.')
         ]);
-        writeln('SourceFileEdit getFileEdit(String file) =>');
+        writeln('SourceFileEdit? getFileEdit(String file) =>');
         writeln('    getChangeFileEdit(this, file);');
         return true;
       case 'SourceEdit':
@@ -826,9 +837,9 @@
   /// Emit the toJson() code for an object class.
   void emitToJsonMember(TypeObject type) {
     writeln('@override');
-    writeln('Map<String, dynamic> toJson() {');
+    writeln('Map<String, Object> toJson() {');
     indent(() {
-      writeln('var result = <String, dynamic>{};');
+      writeln('var result = <String, Object>{};');
       for (var field in type.fields) {
         var fieldNameString = literalString(field.name);
         if (field.value != null) {
@@ -839,7 +850,9 @@
         var fieldToJson = toJsonCode(field.type).asSnippet(field.name);
         var populateField = 'result[$fieldNameString] = $fieldToJson;';
         if (field.optional) {
-          writeln('if (${field.name} != null) {');
+          var name = field.name;
+          writeln('var $name = this.$name;');
+          writeln('if ($name != null) {');
           indent(() {
             writeln(populateField);
           });
@@ -1083,7 +1096,10 @@
           throw Exception('Union types must be unions of objects');
         }
       }
-      return ToJsonSnippet(dartType(type), (String value) => '$value.toJson()');
+      return ToJsonSnippet(
+        dartType(type),
+        (String value) => '($value as dynamic).toJson()',
+      );
     } else if (resolvedType is TypeObject || resolvedType is TypeEnum) {
       return ToJsonSnippet(dartType(type), (String value) => '$value.toJson()');
     } else {
@@ -1148,7 +1164,7 @@
 
   @override
   String get asClosure =>
-      '(String jsonPath, Object json) => ${callback('jsonPath', 'json')}';
+      '(String jsonPath, Object? json) => ${callback('jsonPath', 'json')}';
 
   @override
   bool get isIdentity => false;
diff --git a/pkg/analyzer_plugin/tool/spec/codegen_inttest_methods.dart b/pkg/analyzer_plugin/tool/spec/codegen_inttest_methods.dart
index fe65490..0a44cfc 100644
--- a/pkg/analyzer_plugin/tool/spec/codegen_inttest_methods.dart
+++ b/pkg/analyzer_plugin/tool/spec/codegen_inttest_methods.dart
@@ -47,11 +47,11 @@
 
   /// Generate a function argument for the given parameter field.
   String formatArgument(TypeObjectField field) =>
-      '${dartType(field.type)} ${field.name}';
+      '${fieldDartType(field)} ${field.name}';
 
   /// Figure out the appropriate Dart type for data having the given API
   /// protocol [type].
-  String jsonType(TypeDecl type) {
+  String jsonType(TypeDecl? type) {
     type = resolveTypeReferenceChain(type);
     if (type is TypeEnum) {
       return 'String';
@@ -130,7 +130,6 @@
           writeln('default:');
           indent(() {
             writeln("fail('Unexpected notification: \$event');");
-            writeln('break;');
           });
         });
         writeln('}');
@@ -152,12 +151,12 @@
       toHtmlVisitor.translateHtml(notification.html);
       toHtmlVisitor.describePayload(notification.params, 'Parameters');
     }));
-    writeln('Stream<$className> $streamName;');
+    writeln('late Stream<$className> $streamName;');
     writeln();
     docComment(toHtmlVisitor.collectHtml(() {
       toHtmlVisitor.write('Stream controller for [$streamName].');
     }));
-    writeln('StreamController<$className> _$streamName;');
+    writeln('late StreamController<$className> _$streamName;');
     fieldInitializationCode.add(collectCode(() {
       writeln('_$streamName = StreamController<$className>(sync: true);');
       writeln('$streamName = _$streamName.stream.asBroadcastStream();');
@@ -185,8 +184,9 @@
     var methodName = camelJoin(['send', request.domainName, request.method]);
     var args = <String>[];
     var optionalArgs = <String>[];
-    if (request.params != null) {
-      for (var field in request.params.fields) {
+    var params = request.params;
+    if (params != null) {
+      for (var field in params.fields) {
         if (field.optional) {
           optionalArgs.add(formatArgument(field));
         } else {
@@ -206,8 +206,8 @@
     if (request.deprecated) {
       writeln('@deprecated');
     }
-    String resultClass;
-    String futureClass;
+    String? resultClass;
+    String? futureClass;
     if (request.result == null) {
       futureClass = 'Future';
     } else {
@@ -221,11 +221,12 @@
           [request.domainName, request.method, 'params'],
           doCapitalize: true);
       var paramsVar = 'null';
-      if (request.params != null) {
+      var params = request.params;
+      if (params != null) {
         paramsVar = 'params';
         var args = <String>[];
         var optionalArgs = <String>[];
-        for (var field in request.params.fields) {
+        for (var field in params.fields) {
           if (field.optional) {
             optionalArgs.add('${field.name}: ${field.name}');
           } else {
diff --git a/pkg/analyzer_plugin/tool/spec/codegen_matchers.dart b/pkg/analyzer_plugin/tool/spec/codegen_matchers.dart
index 9e3e2fd..f9a7d27 100644
--- a/pkg/analyzer_plugin/tool/spec/codegen_matchers.dart
+++ b/pkg/analyzer_plugin/tool/spec/codegen_matchers.dart
@@ -22,7 +22,7 @@
 
   /// Short human-readable string describing the context of the matcher being
   /// created.
-  String context;
+  String? context;
 
   CodegenMatchersVisitor(Api api)
       : toHtmlVisitor = ToHtmlVisitor(api),
@@ -41,17 +41,19 @@
     context = impliedType.humanReadableName;
     docComment(toHtmlVisitor.collectHtml(() {
       toHtmlVisitor.p(() {
-        toHtmlVisitor.write(context);
+        toHtmlVisitor.write(context!);
       });
-      if (impliedType.type != null) {
-        toHtmlVisitor.showType(null, impliedType.type);
+      var type = impliedType.type;
+      if (type != null) {
+        toHtmlVisitor.showType(null, type);
       }
     }));
     write('final Matcher ${camelJoin(['is', impliedType.camelName])} = ');
-    if (impliedType.type == null) {
+    var type = impliedType.type;
+    if (type == null) {
       write('isNull');
     } else {
-      visitTypeDecl(impliedType.type);
+      visitTypeDecl(type);
     }
     writeln(';');
     writeln();
diff --git a/pkg/analyzer_plugin/tool/spec/codegen_protocol_constants.dart b/pkg/analyzer_plugin/tool/spec/codegen_protocol_constants.dart
index 52618ac..648859a 100644
--- a/pkg/analyzer_plugin/tool/spec/codegen_protocol_constants.dart
+++ b/pkg/analyzer_plugin/tool/spec/codegen_protocol_constants.dart
@@ -99,7 +99,7 @@
   /// Generate a constant for each of the fields in the given [type], where the
   /// name of each constant will be composed from the [parentName] and the name
   /// of the field.
-  void _addFieldConstants(String parentName, TypeObject type) {
+  void _addFieldConstants(String parentName, TypeObject? type) {
     if (type == null) {
       return;
     }
diff --git a/pkg/analyzer_plugin/tool/spec/from_html.dart b/pkg/analyzer_plugin/tool/spec/from_html.dart
index 977737b..cd144a9 100644
--- a/pkg/analyzer_plugin/tool/spec/from_html.dart
+++ b/pkg/analyzer_plugin/tool/spec/from_html.dart
@@ -75,8 +75,8 @@
     Api api;
     var versions = <String>[];
     var domains = <Domain>[];
-    Types types;
-    Refactorings refactorings;
+    Types? types;
+    Refactorings? refactorings;
     recurse(html, 'api', {
       'domain': (dom.Element element) {
         domains.add(domainFromHtml(element));
@@ -97,7 +97,7 @@
     if (versions.length != 1) {
       throw Exception('The API must contain exactly one <version> element');
     }
-    api = Api(versions[0], domains, types, refactorings, html);
+    api = Api(versions[0], domains, types!, refactorings, html);
     return api;
   }
 
@@ -125,7 +125,7 @@
   }
 
   /// Check that the given [element] has the given [expectedName].
-  void checkName(dom.Element element, String expectedName, [String context]) {
+  void checkName(dom.Element element, String expectedName, [String? context]) {
     if (element.localName != expectedName) {
       context ??= element.localName;
       throw Exception(
@@ -158,7 +158,7 @@
         notifications.add(notificationFromHtml(child, context));
       }
     });
-    return Domain(name, requests, notifications, html,
+    return Domain(name!, requests, notifications, html,
         experimental: experimental);
   }
 
@@ -186,18 +186,18 @@
   ///
   /// Child elements can occur in any order.
   Notification notificationFromHtml(dom.Element html, String context) {
-    var domainName = getAncestor(html, 'domain', context).attributes['name'];
+    var domainName = getAncestor(html, 'domain', context).attributes['name']!;
     checkName(html, 'notification', context);
     var event = html.attributes['event'];
     context = '$context.${event ?? 'event'}';
     checkAttributes(html, ['event'], context);
-    TypeObject params;
+    late TypeObject params;
     recurse(html, context, {
       'params': (dom.Element child) {
         params = typeObjectFromHtml(child, '$context.params');
       }
     });
-    return Notification(domainName, event, params, html);
+    return Notification(domainName, event!, params, html);
   }
 
   /// Create a single of [TypeDecl] corresponding to the type defined inside the
@@ -249,8 +249,8 @@
       },
       'map': (dom.Element child) {
         checkAttributes(child, [], context);
-        TypeDecl keyType;
-        TypeDecl valueType;
+        TypeDecl? keyType;
+        TypeDecl? valueType;
         recurse(child, context, {
           'key': (dom.Element child) {
             if (keyType != null) {
@@ -271,7 +271,7 @@
         if (valueType == null) {
           throw Exception('$context: Value type not specified');
         }
-        types.add(TypeMap(keyType as TypeReference, valueType, child));
+        types.add(TypeMap(keyType as TypeReference, valueType!, child));
       },
       'enum': (dom.Element child) {
         types.add(typeEnumFromHtml(child, context));
@@ -284,7 +284,7 @@
         checkAttributes(child, ['field'], context);
         var field = child.attributes['field'];
         types.add(
-            TypeUnion(processContentsAsTypes(child, context), field, child));
+            TypeUnion(processContentsAsTypes(child, context), field!, child));
       }
     });
     return types;
@@ -295,7 +295,7 @@
     var htmlContents = File(filePath).readAsStringSync();
     var document = parser.parse(htmlContents);
     var htmlElement = document.children
-        .singleWhere((element) => element.localName.toLowerCase() == 'html');
+        .singleWhere((element) => element.localName?.toLowerCase() == 'html');
     return apiFromHtml(htmlElement);
   }
 
@@ -309,7 +309,7 @@
     for (var node in parent.nodes) {
       if (node is dom.Element) {
         if (elementProcessors.containsKey(node.localName)) {
-          elementProcessors[node.localName](node);
+          elementProcessors[node.localName]!(node);
         } else if (specialElements.contains(node.localName)) {
           throw Exception('$context: Unexpected use of <${node.localName}>');
         } else {
@@ -335,8 +335,8 @@
     var kind = html.attributes['kind'];
     var context = kind ?? 'refactoring';
     checkAttributes(html, ['kind'], context);
-    TypeObject feedback;
-    TypeObject options;
+    TypeObject? feedback;
+    TypeObject? options;
     recurse(html, context, {
       'feedback': (dom.Element child) {
         feedback = typeObjectFromHtml(child, '$context.feedback');
@@ -345,7 +345,7 @@
         options = typeObjectFromHtml(child, '$context.options');
       }
     });
-    return Refactoring(kind, feedback, options, html);
+    return Refactoring(kind!, feedback, options, html);
   }
 
   /// Create a [Refactorings] object from an HTML representation such as:
@@ -380,7 +380,7 @@
   ///
   /// Child elements can occur in any order.
   Request requestFromHtml(dom.Element html, String context) {
-    var domainName = getAncestor(html, 'domain', context).attributes['name'];
+    var domainName = getAncestor(html, 'domain', context).attributes['name']!;
     checkName(html, 'request', context);
     var method = html.attributes['method'];
     context = '$context.${method ?? 'method'}';
@@ -388,8 +388,8 @@
         optionalAttributes: ['experimental', 'deprecated']);
     var experimental = html.attributes['experimental'] == 'true';
     var deprecated = html.attributes['deprecated'] == 'true';
-    TypeObject params;
-    TypeObject result;
+    TypeObject? params;
+    TypeObject? result;
     recurse(html, context, {
       'params': (dom.Element child) {
         params = typeObjectFromHtml(child, '$context.params');
@@ -398,7 +398,7 @@
         result = typeObjectFromHtml(child, '$context.result');
       }
     });
-    return Request(domainName, method, params, result, html,
+    return Request(domainName, method!, params, result, html,
         experimental: experimental, deprecated: deprecated);
   }
 
@@ -420,7 +420,7 @@
     var type = processContentsAsType(html, context);
     var experimental = html.attributes['experimental'] == 'true';
     var deprecated = html.attributes['deprecated'] == 'true';
-    return TypeDefinition(name, type, html,
+    return TypeDefinition(name!, type, html,
         experimental: experimental, deprecated: deprecated);
   }
 
@@ -500,7 +500,7 @@
     }
     var value = html.attributes['value'];
     var type = processContentsAsType(html, context);
-    return TypeObjectField(name, type, html,
+    return TypeObjectField(name!, type, html,
         optional: optional, value: value, deprecated: deprecated);
   }
 
@@ -541,7 +541,7 @@
         var api = reader.readApi();
         for (var typeDefinition in api.types) {
           typeDefinition.isExternal = true;
-          childElements.add(typeDefinition.html);
+          childElements.add(typeDefinition.html!);
           typeMap[typeDefinition.name] = typeDefinition;
         }
       },
diff --git a/pkg/analyzer_plugin/tool/spec/generate_all.dart b/pkg/analyzer_plugin/tool/spec/generate_all.dart
index 6507475..3ce0b3c 100644
--- a/pkg/analyzer_plugin/tool/spec/generate_all.dart
+++ b/pkg/analyzer_plugin/tool/spec/generate_all.dart
@@ -28,7 +28,9 @@
   targets.add(codegen_inttest_methods.target);
   targets.add(codegen_matchers.target);
   targets.add(codegen_protocol_common.pluginTarget(true));
-  targets.add(codegen_protocol_common.clientTarget(true));
+  // TODO(scheglov) Migrate analysis_server_client
+  // https://github.com/dart-lang/sdk/issues/45500
+  // targets.add(codegen_protocol_common.clientTarget(true));
   targets.add(codegen_protocol_constants.target);
   targets.add(to_html.target);
   return targets;
diff --git a/pkg/analyzer_plugin/tool/spec/implied_types.dart b/pkg/analyzer_plugin/tool/spec/implied_types.dart
index 04f217c..21e2639 100644
--- a/pkg/analyzer_plugin/tool/spec/implied_types.dart
+++ b/pkg/analyzer_plugin/tool/spec/implied_types.dart
@@ -16,7 +16,7 @@
 class ImpliedType {
   final String camelName;
   final String humanReadableName;
-  final TypeDecl type;
+  final TypeDecl? type;
 
   /// Kind of implied type this is. One of:
   /// - 'requestParams'
@@ -39,7 +39,7 @@
 
   _ImpliedTypesVisitor(Api api) : super(api);
 
-  void storeType(String name, String nameSuffix, TypeDecl type, String kind,
+  void storeType(String name, String? nameSuffix, TypeDecl? type, String kind,
       ApiNode apiNode) {
     var humanReadableName = name;
     var camelNameParts = name.split('.');
diff --git a/pkg/analyzer_plugin/tool/spec/to_html.dart b/pkg/analyzer_plugin/tool/spec/to_html.dart
index 8c9ea33..b2d4d67 100644
--- a/pkg/analyzer_plugin/tool/spec/to_html.dart
+++ b/pkg/analyzer_plugin/tool/spec/to_html.dart
@@ -148,7 +148,7 @@
 
   @override
   void visitDomain(Domain domain) {
-    domains[domain.html] = domain;
+    domains[domain.html!] = domain;
   }
 }
 
@@ -170,11 +170,11 @@
   void dt(String cls, void Function() callback) =>
       element('dt', {'class': cls}, callback);
   void element(String name, Map<Object, String> attributes,
-      [void Function() callback]);
+      [void Function()? callback]);
   void gray(void Function() callback) =>
       element('span', {'style': 'color:#999999'}, callback);
   void h1(void Function() callback) => element('h1', {}, callback);
-  void h2(String cls, void Function() callback) {
+  void h2(String? cls, void Function() callback) {
     if (cls == null) {
       return element('h2', {}, callback);
     }
@@ -191,7 +191,7 @@
   void i(void Function() callback) => element('i', {}, callback);
   void li(void Function() callback) => element('li', {}, callback);
   void link(String id, void Function() callback,
-      [Map<dynamic, String> attributes]) {
+      [Map<Object, String>? attributes]) {
     attributes ??= {};
     attributes['href'] = '#$id';
     element('a', attributes, callback);
@@ -226,7 +226,7 @@
   ///
   /// If [force] is true, then a section is inserted even if the payload is
   /// null.
-  void describePayload(TypeObject subType, String name, {bool force = false}) {
+  void describePayload(TypeObject? subType, String name, {bool force = false}) {
     if (force || subType != null) {
       h4(() {
         write(name);
@@ -279,7 +279,7 @@
     }
 
     generateTypesIndex(definedTypes);
-    generateRefactoringsIndex(api.refactorings);
+    generateRefactoringsIndex(api.refactorings!);
   }
 
   void generateNotificationsIndex(Iterable<Notification> notifications) {
@@ -298,9 +298,6 @@
   }
 
   void generateRefactoringsIndex(Iterable<Refactoring> refactorings) {
-    if (refactorings == null) {
-      return;
-    }
     h3(() {
       write('Refactorings');
       write(' (');
@@ -384,13 +381,11 @@
   }
 
   void javadocParams(TypeObject typeObject) {
-    if (typeObject != null) {
-      for (var field in typeObject.fields) {
-        hangingIndent(() {
-          write('@param ${field.name} ');
-          translateHtml(field.html, squashParagraphs: true);
-        });
-      }
+    for (var field in typeObject.fields) {
+      hangingIndent(() {
+        write('@param ${field.name} ');
+        translateHtml(field.html, squashParagraphs: true);
+      });
     }
   }
 
@@ -401,7 +396,8 @@
   ///
   /// If [typeForBolding] is supplied, then fields in this type are shown in
   /// boldface.
-  void showType(String shortDesc, TypeDecl type, [TypeObject typeForBolding]) {
+  void showType(String? shortDesc, TypeDecl type,
+      [TypeObject? typeForBolding]) {
     var fieldsToBold = <String>{};
     if (typeForBolding != null) {
       for (var field in typeForBolding.fields) {
@@ -421,7 +417,10 @@
 
   /// Copy the contents of the given HTML element, translating the special
   /// elements that define the API appropriately.
-  void translateHtml(dom.Element html, {bool squashParagraphs = false}) {
+  void translateHtml(dom.Element? html, {bool squashParagraphs = false}) {
+    if (html == null) {
+      return;
+    }
     for (var node in html.nodes) {
       if (node is dom.Element) {
         if (squashParagraphs && node.localName == 'p') {
@@ -433,7 +432,7 @@
             generateDomainsHeader();
             break;
           case 'domain':
-            visitDomain(apiMappings.domains[node]);
+            visitDomain(apiMappings.domains[node]!);
             break;
           case 'head':
             head(() {
@@ -466,7 +465,7 @@
             break;
           default:
             if (!ApiReader.specialElements.contains(node.localName)) {
-              element(node.localName, node.attributes, () {
+              element(node.localName!, node.attributes, () {
                 translateHtml(node, squashParagraphs: squashParagraphs);
               });
             }
@@ -547,8 +546,8 @@
   }
 
   @override
-  void visitRefactorings(Refactorings refactorings) {
-    translateHtml(refactorings.html);
+  void visitRefactorings(Refactorings? refactorings) {
+    translateHtml(refactorings?.html);
     dl(() {
       super.visitRefactorings(refactorings);
     });
@@ -609,7 +608,7 @@
   @override
   void visitTypeEnumValue(TypeEnumValue typeEnumValue) {
     var isDocumented = false;
-    for (var node in typeEnumValue.html.nodes) {
+    for (var node in typeEnumValue.html?.nodes ?? []) {
       if ((node is dom.Element && node.localName != 'code') ||
           (node is dom.Text && node.text.trim().isNotEmpty)) {
         isDocumented = true;
@@ -701,7 +700,7 @@
     with HtmlMixin, HtmlCodeGenerator {
   /// Set of fields which should be shown in boldface, or null if no field
   /// should be shown in boldface.
-  final Set<String> fieldsToBold;
+  final Set<String>? fieldsToBold;
 
   /// True if a short description should be generated. In a short description,
   /// objects are shown as simply "object", and enums are shown as "String".
@@ -750,6 +749,7 @@
     indent(() {
       for (var field in typeObject.fields) {
         write('"');
+        var fieldsToBold = this.fieldsToBold;
         if (fieldsToBold != null && fieldsToBold.contains(field.name)) {
           b(() {
             write(field.name);
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
index 8041794..645bbd9 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -3373,6 +3373,10 @@
       new BreakStatus(node.target);
 
   @override
+  ExecutionStatus visitContinueSwitchStatement(ContinueSwitchStatement node) =>
+      node.target.body.accept(this);
+
+  @override
   ExecutionStatus visitDoStatement(DoStatement node) {
     Constant condition;
     do {
@@ -3454,6 +3458,21 @@
       new ReturnStatus(evaluate(node.expression));
 
   @override
+  ExecutionStatus visitSwitchStatement(SwitchStatement node) {
+    final Constant value = evaluate(node.expression);
+    if (value is AbortConstant) return new AbortStatus(value);
+
+    for (SwitchCase switchCase in node.cases) {
+      if (switchCase.isDefault) return switchCase.body.accept(this);
+      for (Expression expr in switchCase.expressions) {
+        final Constant caseValue = evaluate(expr);
+        if (value == caseValue) return switchCase.body.accept(this);
+      }
+    }
+    return const ProceedStatus();
+  }
+
+  @override
   ExecutionStatus visitVariableDeclaration(VariableDeclaration node) {
     Constant value = evaluate(node.initializer);
     if (value is AbortConstant) return new AbortStatus(value);
diff --git a/pkg/front_end/testcases/const_functions/const_functions_switch_statements.dart b/pkg/front_end/testcases/const_functions/const_functions_switch_statements.dart
new file mode 100644
index 0000000..c192041
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_switch_statements.dart
@@ -0,0 +1,65 @@
+// 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.
+
+// Tests switch statements for const functions.
+
+import "package:expect/expect.dart";
+
+const var1 = basicSwitch(1);
+const var2 = basicSwitch(2);
+int basicSwitch(int x) {
+  switch (x) {
+    case 1:
+      return 100;
+    default:
+      x++;
+      break;
+  }
+  return x;
+}
+
+const var3 = multipleCaseSwitch(1);
+const var4 = multipleCaseSwitch(2);
+const var5 = multipleCaseSwitch(3);
+int multipleCaseSwitch(int x) {
+  switch (x) {
+    case 1:
+    case 2:
+      return 100;
+    default:
+      break;
+  }
+  return 0;
+}
+
+const var6 = continueLabelSwitch(1);
+const var7 = continueLabelSwitch(2);
+const var8 = continueLabelSwitch(3);
+const var9 = continueLabelSwitch(4);
+int continueLabelSwitch(int x) {
+  switch (x) {
+    label1:
+    case 1:
+      x = x + 100;
+      continue label3;
+    case 2:
+      continue label1;
+    label3:
+    case 3:
+      return x + 3;
+  }
+  return 0;
+}
+
+void main() {
+  Expect.equals(var1, 100);
+  Expect.equals(var2, 3);
+  Expect.equals(var3, 100);
+  Expect.equals(var4, 100);
+  Expect.equals(var5, 0);
+  Expect.equals(var6, 104);
+  Expect.equals(var7, 105);
+  Expect.equals(var8, 6);
+  Expect.equals(var9, 0);
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_switch_statements.dart.strong.expect b/pkg/front_end/testcases/const_functions/const_functions_switch_statements.dart.strong.expect
new file mode 100644
index 0000000..76efdb8
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_switch_statements.dart.strong.expect
@@ -0,0 +1,93 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+static const field core::int var1 = #C1;
+static const field core::int var2 = #C2;
+static const field core::int var3 = #C1;
+static const field core::int var4 = #C1;
+static const field core::int var5 = #C3;
+static const field core::int var6 = #C4;
+static const field core::int var7 = #C5;
+static const field core::int var8 = #C6;
+static const field core::int var9 = #C3;
+static method basicSwitch(core::int x) → core::int {
+  #L1:
+  switch(x) {
+    #L2:
+    case #C7:
+      {
+        return 100;
+      }
+    #L3:
+    default:
+      {
+        x = x.{core::num::+}(1);
+        break #L1;
+      }
+  }
+  return x;
+}
+static method multipleCaseSwitch(core::int x) → core::int {
+  #L4:
+  switch(x) {
+    #L5:
+    case #C7:
+    case #C8:
+      {
+        return 100;
+      }
+    #L6:
+    default:
+      {
+        break #L4;
+      }
+  }
+  return 0;
+}
+static method continueLabelSwitch(core::int x) → core::int {
+  switch(x) {
+    #L7:
+    case #C7:
+      {
+        x = x.{core::num::+}(100);
+        continue #L8;
+      }
+    #L9:
+    case #C8:
+      {
+        continue #L7;
+      }
+    #L8:
+    case #C2:
+      {
+        return x.{core::num::+}(3);
+      }
+  }
+  return 0;
+}
+static method main() → void {
+  exp::Expect::equals(#C1, 100);
+  exp::Expect::equals(#C2, 3);
+  exp::Expect::equals(#C1, 100);
+  exp::Expect::equals(#C1, 100);
+  exp::Expect::equals(#C3, 0);
+  exp::Expect::equals(#C4, 104);
+  exp::Expect::equals(#C5, 105);
+  exp::Expect::equals(#C6, 6);
+  exp::Expect::equals(#C3, 0);
+}
+
+constants  {
+  #C1 = 100
+  #C2 = 3
+  #C3 = 0
+  #C4 = 104
+  #C5 = 105
+  #C6 = 6
+  #C7 = 1
+  #C8 = 2
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_switch_statements.dart.strong.transformed.expect b/pkg/front_end/testcases/const_functions/const_functions_switch_statements.dart.strong.transformed.expect
new file mode 100644
index 0000000..76efdb8
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_switch_statements.dart.strong.transformed.expect
@@ -0,0 +1,93 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+static const field core::int var1 = #C1;
+static const field core::int var2 = #C2;
+static const field core::int var3 = #C1;
+static const field core::int var4 = #C1;
+static const field core::int var5 = #C3;
+static const field core::int var6 = #C4;
+static const field core::int var7 = #C5;
+static const field core::int var8 = #C6;
+static const field core::int var9 = #C3;
+static method basicSwitch(core::int x) → core::int {
+  #L1:
+  switch(x) {
+    #L2:
+    case #C7:
+      {
+        return 100;
+      }
+    #L3:
+    default:
+      {
+        x = x.{core::num::+}(1);
+        break #L1;
+      }
+  }
+  return x;
+}
+static method multipleCaseSwitch(core::int x) → core::int {
+  #L4:
+  switch(x) {
+    #L5:
+    case #C7:
+    case #C8:
+      {
+        return 100;
+      }
+    #L6:
+    default:
+      {
+        break #L4;
+      }
+  }
+  return 0;
+}
+static method continueLabelSwitch(core::int x) → core::int {
+  switch(x) {
+    #L7:
+    case #C7:
+      {
+        x = x.{core::num::+}(100);
+        continue #L8;
+      }
+    #L9:
+    case #C8:
+      {
+        continue #L7;
+      }
+    #L8:
+    case #C2:
+      {
+        return x.{core::num::+}(3);
+      }
+  }
+  return 0;
+}
+static method main() → void {
+  exp::Expect::equals(#C1, 100);
+  exp::Expect::equals(#C2, 3);
+  exp::Expect::equals(#C1, 100);
+  exp::Expect::equals(#C1, 100);
+  exp::Expect::equals(#C3, 0);
+  exp::Expect::equals(#C4, 104);
+  exp::Expect::equals(#C5, 105);
+  exp::Expect::equals(#C6, 6);
+  exp::Expect::equals(#C3, 0);
+}
+
+constants  {
+  #C1 = 100
+  #C2 = 3
+  #C3 = 0
+  #C4 = 104
+  #C5 = 105
+  #C6 = 6
+  #C7 = 1
+  #C8 = 2
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_switch_statements.dart.textual_outline.expect b/pkg/front_end/testcases/const_functions/const_functions_switch_statements.dart.textual_outline.expect
new file mode 100644
index 0000000..5d539a6
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_switch_statements.dart.textual_outline.expect
@@ -0,0 +1,15 @@
+import "package:expect/expect.dart";
+
+const var1 = basicSwitch(1);
+const var2 = basicSwitch(2);
+int basicSwitch(int x) {}
+const var3 = multipleCaseSwitch(1);
+const var4 = multipleCaseSwitch(2);
+const var5 = multipleCaseSwitch(3);
+int multipleCaseSwitch(int x) {}
+const var6 = continueLabelSwitch(1);
+const var7 = continueLabelSwitch(2);
+const var8 = continueLabelSwitch(3);
+const var9 = continueLabelSwitch(4);
+int continueLabelSwitch(int x) {}
+void main() {}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_switch_statements.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/const_functions/const_functions_switch_statements.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..f57dab8
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_switch_statements.dart.textual_outline_modelled.expect
@@ -0,0 +1,15 @@
+import "package:expect/expect.dart";
+
+const var1 = basicSwitch(1);
+const var2 = basicSwitch(2);
+const var3 = multipleCaseSwitch(1);
+const var4 = multipleCaseSwitch(2);
+const var5 = multipleCaseSwitch(3);
+const var6 = continueLabelSwitch(1);
+const var7 = continueLabelSwitch(2);
+const var8 = continueLabelSwitch(3);
+const var9 = continueLabelSwitch(4);
+int basicSwitch(int x) {}
+int continueLabelSwitch(int x) {}
+int multipleCaseSwitch(int x) {}
+void main() {}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_switch_statements.dart.weak.expect b/pkg/front_end/testcases/const_functions/const_functions_switch_statements.dart.weak.expect
new file mode 100644
index 0000000..76efdb8
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_switch_statements.dart.weak.expect
@@ -0,0 +1,93 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+static const field core::int var1 = #C1;
+static const field core::int var2 = #C2;
+static const field core::int var3 = #C1;
+static const field core::int var4 = #C1;
+static const field core::int var5 = #C3;
+static const field core::int var6 = #C4;
+static const field core::int var7 = #C5;
+static const field core::int var8 = #C6;
+static const field core::int var9 = #C3;
+static method basicSwitch(core::int x) → core::int {
+  #L1:
+  switch(x) {
+    #L2:
+    case #C7:
+      {
+        return 100;
+      }
+    #L3:
+    default:
+      {
+        x = x.{core::num::+}(1);
+        break #L1;
+      }
+  }
+  return x;
+}
+static method multipleCaseSwitch(core::int x) → core::int {
+  #L4:
+  switch(x) {
+    #L5:
+    case #C7:
+    case #C8:
+      {
+        return 100;
+      }
+    #L6:
+    default:
+      {
+        break #L4;
+      }
+  }
+  return 0;
+}
+static method continueLabelSwitch(core::int x) → core::int {
+  switch(x) {
+    #L7:
+    case #C7:
+      {
+        x = x.{core::num::+}(100);
+        continue #L8;
+      }
+    #L9:
+    case #C8:
+      {
+        continue #L7;
+      }
+    #L8: