diff --git a/pkg/analysis_server/lib/src/computer/computer_closingLabels.dart b/pkg/analysis_server/lib/src/computer/computer_closingLabels.dart
index 6c4c5ed..856e20d 100644
--- a/pkg/analysis_server/lib/src/computer/computer_closingLabels.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_closingLabels.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
@@ -48,23 +46,21 @@
 
   _DartUnitClosingLabelsComputerVisitor(this.computer);
 
-  ClosingLabel get _currentLabel => labelStack.isEmpty ? null : labelStack.last;
+  ClosingLabel? get _currentLabel =>
+      labelStack.isEmpty ? null : labelStack.last;
 
   @override
   void visitInstanceCreationExpression(InstanceCreationExpression node) {
-    ClosingLabel label;
-
-    if (node.argumentList != null) {
-      var labelText = node.constructorName.type.name.name;
-      if (node.constructorName.name != null) {
-        labelText += '.${node.constructorName.name.name}';
-      }
-      // We override the node used for doing line calculations because otherwise
-      // constructors that split over multiple lines (but have parens on same
-      // line) would incorrectly get labels, because node.start on an instance
-      // creation expression starts at the start of the expression.
-      label = _addLabel(node, labelText, checkLinesUsing: node.argumentList);
+    var labelText = node.constructorName.type.name.name;
+    var name = node.constructorName.name;
+    if (name != null) {
+      labelText += '.${name.name}';
     }
+    // We override the node used for doing line calculations because otherwise
+    // constructors that split over multiple lines (but have parens on same
+    // line) would incorrectly get labels, because node.start on an instance
+    // creation expression starts at the start of the expression.
+    var label = _addLabel(node, labelText, checkLinesUsing: node.argumentList);
 
     if (label != null) _pushLabel(label);
 
@@ -78,9 +74,9 @@
   @override
   void visitListLiteral(ListLiteral node) {
     var args = node.typeArguments?.arguments;
-    var typeName = args != null ? args[0]?.toString() : null;
+    var typeName = args != null ? args[0].toString() : null;
 
-    ClosingLabel label;
+    ClosingLabel? label;
 
     if (typeName != null) {
       label = _addLabel(node, '<$typeName>[]');
@@ -105,8 +101,8 @@
     }
   }
 
-  ClosingLabel _addLabel(AstNode node, String label,
-      {AstNode checkLinesUsing}) {
+  ClosingLabel? _addLabel(AstNode node, String label,
+      {AstNode? checkLinesUsing}) {
     // Never add labels if we're inside strings.
     if (interpolatedStringsEntered > 0) {
       return null;
@@ -114,10 +110,8 @@
 
     checkLinesUsing = checkLinesUsing ?? node;
 
-    final CharacterLocation start =
-        computer._lineInfo.getLocation(checkLinesUsing.offset);
-    final CharacterLocation end =
-        computer._lineInfo.getLocation(checkLinesUsing.end - 1);
+    var start = computer._lineInfo.getLocation(checkLinesUsing.offset);
+    var end = computer._lineInfo.getLocation(checkLinesUsing.end - 1);
 
     var closingLabel = ClosingLabel(node.offset, node.length, label);
 
diff --git a/pkg/analysis_server/lib/src/computer/computer_outline.dart b/pkg/analysis_server/lib/src/computer/computer_outline.dart
index 20e3278..fedd848 100644
--- a/pkg/analysis_server/lib/src/computer/computer_outline.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_outline.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/collections.dart';
 import 'package:analysis_server/src/utilities/flutter.dart';
 import 'package:analyzer/dart/analysis/results.dart';
@@ -19,10 +17,19 @@
 
   DartUnitOutlineComputer(this.resolvedUnit, {this.withBasicFlutter = false});
 
+  CompilationUnit get _unit {
+    var unit = resolvedUnit.unit;
+    if (unit == null) {
+      throw StateError('DartUnitOutlineComputer created with invalid result');
+    }
+    return unit;
+  }
+
   /// Returns the computed outline, not `null`.
   Outline compute() {
+    var unit = _unit;
     var unitContents = <Outline>[];
-    for (var unitMember in resolvedUnit.unit.declarations) {
+    for (var unitMember in unit.declarations) {
       if (unitMember is ClassDeclaration) {
         unitContents.add(_newClassOutline(
             unitMember, _outlinesForMembers(unitMember.members)));
@@ -42,13 +49,11 @@
       } else if (unitMember is TopLevelVariableDeclaration) {
         var fieldDeclaration = unitMember;
         var fields = fieldDeclaration.variables;
-        if (fields != null) {
-          var fieldType = fields.type;
-          var fieldTypeName = _safeToSource(fieldType);
-          for (var field in fields.variables) {
-            unitContents.add(_newVariableOutline(
-                fieldTypeName, ElementKind.TOP_LEVEL_VARIABLE, field, false));
-          }
+        var fieldType = fields.type;
+        var fieldTypeName = _safeToSource(fieldType);
+        for (var field in fields.variables) {
+          unitContents.add(_newVariableOutline(
+              fieldTypeName, ElementKind.TOP_LEVEL_VARIABLE, field, false));
         }
       } else if (unitMember is FunctionDeclaration) {
         var functionDeclaration = unitMember;
@@ -81,14 +86,18 @@
   }
 
   Location _getLocationOffsetLength(int offset, int length) {
+    var path = resolvedUnit.path;
+    if (path == null) {
+      throw StateError('DartUnitOutlineComputer called with invalid result');
+    }
     var startLocation = resolvedUnit.lineInfo.getLocation(offset);
     var startLine = startLocation.lineNumber;
     var startColumn = startLocation.columnNumber;
     var endLocation = resolvedUnit.lineInfo.getLocation(offset + length);
     var endLine = endLocation.lineNumber;
     var endColumn = endLocation.columnNumber;
-    return Location(resolvedUnit.path, offset, length, startLine, startColumn,
-        endLine, endColumn);
+    return Location(
+        path, offset, length, startLine, startColumn, endLine, endColumn);
   }
 
   Outline _newClassOutline(ClassDeclaration node, List<Outline> classContents) {
@@ -319,10 +328,11 @@
   }
 
   Outline _newUnitOutline(List<Outline> unitContents) {
+    var unit = _unit;
     var element = Element(
         ElementKind.COMPILATION_UNIT, '<unit>', Element.makeFlags(),
-        location: _getLocationNode(resolvedUnit.unit));
-    return _nodeOutline(resolvedUnit.unit, element, unitContents);
+        location: _getLocationNode(unit));
+    return _nodeOutline(unit, element, unitContents);
   }
 
   Outline _newVariableOutline(String typeName, ElementKind kind,
@@ -344,17 +354,20 @@
   }
 
   Outline _nodeOutline(AstNode node, Element element,
-      [List<Outline> children]) {
+      [List<Outline>? children]) {
     var offset = node.offset;
     var end = node.end;
     if (node is VariableDeclaration) {
       var parent = node.parent;
-      if (parent is VariableDeclarationList && parent.variables.isNotEmpty) {
+      var grandParent = parent?.parent;
+      if (grandParent != null &&
+          parent is VariableDeclarationList &&
+          parent.variables.isNotEmpty) {
         if (parent.variables[0] == node) {
-          offset = parent.parent.offset;
+          offset = grandParent.offset;
         }
         if (parent.variables.last == node) {
-          end = parent.parent.end;
+          end = grandParent.end;
         }
       }
     }
@@ -380,13 +393,11 @@
       if (classMember is FieldDeclaration) {
         var fieldDeclaration = classMember;
         var fields = fieldDeclaration.fields;
-        if (fields != null) {
-          var fieldType = fields.type;
-          var fieldTypeName = _safeToSource(fieldType);
-          for (var field in fields.variables) {
-            memberOutlines.add(_newVariableOutline(fieldTypeName,
-                ElementKind.FIELD, field, fieldDeclaration.isStatic));
-          }
+        var fieldType = fields.type;
+        var fieldTypeName = _safeToSource(fieldType);
+        for (var field in fields.variables) {
+          memberOutlines.add(_newVariableOutline(fieldTypeName,
+              ElementKind.FIELD, field, fieldDeclaration.isStatic));
         }
       }
       if (classMember is MethodDeclaration) {
@@ -397,7 +408,7 @@
     return memberOutlines;
   }
 
-  static String _getTypeParametersStr(TypeParameterList parameters) {
+  static String? _getTypeParametersStr(TypeParameterList? parameters) {
     if (parameters == null) {
       return null;
     }
@@ -410,7 +421,7 @@
     return element != null && element.hasDeprecated;
   }
 
-  static String _safeToSource(AstNode node) =>
+  static String _safeToSource(AstNode? node) =>
       node == null ? '' : node.toSource();
 }
 
@@ -425,7 +436,7 @@
 
   /// Return `true` if the given [element] is the method 'group' defined in the
   /// test package.
-  bool isGroup(engine.ExecutableElement element) {
+  bool isGroup(engine.ExecutableElement? element) {
     if (element != null && element.hasIsTestGroup) {
       return true;
     }
@@ -436,7 +447,7 @@
 
   /// Return `true` if the given [element] is the method 'test' defined in the
   /// test package.
-  bool isTest(engine.ExecutableElement element) {
+  bool isTest(engine.ExecutableElement? element) {
     if (element != null && element.hasIsTest) {
       return true;
     }
@@ -457,7 +468,9 @@
       node.argumentList
           .accept(_FunctionBodyOutlinesVisitor(outlineComputer, children));
 
-      var text = _flutter.getWidgetPresentationText(node);
+      // The method `getWidgetPresentationText` should not return `null` when
+      // `isWidgetCreation` returns `true`.
+      var text = _flutter.getWidgetPresentationText(node) ?? '<unknown>';
       var element = Element(ElementKind.CONSTRUCTOR_INVOCATION, text, 0,
           location: outlineComputer._getLocationOffsetLength(node.offset, 0));
 
@@ -477,9 +490,8 @@
     if (nameElement is! engine.ExecutableElement) {
       return;
     }
-    engine.ExecutableElement executableElement = nameElement;
 
-    String extractString(NodeList<Expression> arguments) {
+    String extractString(NodeList<Expression>? arguments) {
       if (arguments != null && arguments.isNotEmpty) {
         var argument = arguments[0];
         if (argument is StringLiteral) {
@@ -493,9 +505,9 @@
       return 'unnamed';
     }
 
-    void addOutlineNode(ElementKind kind, [List<Outline> children]) {
+    void addOutlineNode(ElementKind kind, [List<Outline>? children]) {
       var executableName = nameNode.name;
-      var description = extractString(node.argumentList?.arguments);
+      var description = extractString(node.argumentList.arguments);
       var name = '$executableName("$description")';
       var element = Element(kind, name, 0,
           location: outlineComputer._getLocationNode(nameNode));
@@ -504,12 +516,12 @@
           children: nullIfEmpty(children)));
     }
 
-    if (isGroup(executableElement)) {
+    if (isGroup(nameElement)) {
       var groupContents = <Outline>[];
       node.argumentList
           .accept(_FunctionBodyOutlinesVisitor(outlineComputer, groupContents));
       addOutlineNode(ElementKind.UNIT_TEST_GROUP, groupContents);
-    } else if (isTest(executableElement)) {
+    } else if (isTest(nameElement)) {
       addOutlineNode(ElementKind.UNIT_TEST_TEST);
     } else {
       super.visitMethodInvocation(node);
diff --git a/pkg/analysis_server/lib/src/computer/import_elements_computer.dart b/pkg/analysis_server/lib/src/computer/import_elements_computer.dart
index 59a251a..3a2ec51 100644
--- a/pkg/analysis_server/lib/src/computer/import_elements_computer.dart
+++ b/pkg/analysis_server/lib/src/computer/import_elements_computer.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -33,19 +31,26 @@
   /// imported into the library at the given [path].
   Future<SourceChange> createEdits(
       List<ImportedElements> importedElementsList) async {
+    var unit = libraryResult.unit;
+    var path = libraryResult.path;
+    if (unit == null || path == null) {
+      // We should never reach this point because the libraryResult should be
+      // valid.
+      return SourceChange('');
+    }
     var filteredImportedElements =
         _filterImportedElements(importedElementsList);
     var libraryElement = libraryResult.libraryElement;
     var uriConverter = libraryResult.session.uriConverter;
     var existingImports = <ImportDirective>[];
-    for (var directive in libraryResult.unit.directives) {
+    for (var directive in unit.directives) {
       if (directive is ImportDirective) {
         existingImports.add(directive);
       }
     }
 
     var builder = ChangeBuilder(session: libraryResult.session);
-    await builder.addDartFileEdit(libraryResult.path, (builder) {
+    await builder.addDartFileEdit(path, (builder) {
       for (var importedElements in filteredImportedElements) {
         var matchingImports =
             _findMatchingImports(existingImports, importedElements);
@@ -90,8 +95,9 @@
           //
           // Apply the edits.
           //
-          for (var directive in updateMap.keys) {
-            var update = updateMap[directive];
+          for (var entry in updateMap.entries) {
+            var directive = entry.key;
+            var update = entry.value;
             var namesToUnhide = update.namesToUnhide;
             var namesToShow = update.namesToShow;
             namesToShow.sort();
@@ -129,12 +135,8 @@
                       var precedingNode = directive.prefix ??
                           directive.deferredKeyword ??
                           directive.uri;
-                      if (precedingNode == null) {
-                        builder.addDeletion(range.node(combinator));
-                      } else {
-                        builder.addDeletion(
-                            range.endEnd(precedingNode, combinator));
-                      }
+                      builder
+                          .addDeletion(range.endEnd(precedingNode, combinator));
                     }
                   } else {
                     builder.addDeletion(range.endEnd(
@@ -186,7 +188,7 @@
       return false;
     }
 
-    ImportDirective preferredDirective;
+    late ImportDirective preferredDirective;
     var bestEditCount = -1;
     var deleteHide = false;
     var addShow = false;
@@ -278,7 +280,12 @@
   /// Partially copied from DartFileEditBuilderImpl.
   _InsertionDescription _getInsertionDescription(String importUri) {
     var unit = libraryResult.unit;
-    LibraryDirective libraryDirective;
+    if (unit == null) {
+      // We should never reach this point because the libraryResult should be
+      // valid.
+      return _InsertionDescription(0, after: 2);
+    }
+    LibraryDirective? libraryDirective;
     var importDirectives = <ImportDirective>[];
     var otherDirectives = <Directive>[];
     for (var directive in unit.directives) {
@@ -343,7 +350,11 @@
   /// [importedElements]. They will match if they import the same library using
   /// the same prefix.
   bool _matches(ImportDirective import, ImportedElements importedElements) {
-    var library = import.element.importedLibrary;
+    var importElement = import.element;
+    if (importElement == null) {
+      return false;
+    }
+    var library = importElement.importedLibrary;
     return library != null &&
         library.source.fullName == importedElements.path &&
         (import.prefix?.name ?? '') == importedElements.prefix;
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/probability_range.dart b/pkg/analysis_server/lib/src/services/completion/dart/probability_range.dart
index 2c5de16..5b6d32e 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/probability_range.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/probability_range.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 /// A range of probabilities that a given event has occurred.
 class ProbabilityRange {
   /// The lower bound of the range.
@@ -14,7 +12,7 @@
 
   /// Initialize a newly created probability range to have the given [lower] and
   /// [upper] bounds.
-  const ProbabilityRange({this.lower, this.upper});
+  const ProbabilityRange({required this.lower, required this.upper});
 
   /// The middle of the range.
   double get middle => (upper + lower) / 2;
diff --git a/pkg/analysis_server/lib/src/services/correction/change_workspace.dart b/pkg/analysis_server/lib/src/services/correction/change_workspace.dart
index 579a614..c206924 100644
--- a/pkg/analysis_server/lib/src/services/correction/change_workspace.dart
+++ b/pkg/analysis_server/lib/src/services/correction/change_workspace.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
 
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_missing_parameter.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_missing_parameter.dart
index 0d40bea..4d7c4db 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_missing_parameter.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_missing_parameter.dart
@@ -18,7 +18,8 @@
     if (node.parent is! ArgumentList) {
       return;
     }
-    var context = ExecutableParameters(sessionHelper, node.parent.parent);
+    var context =
+        ExecutableParameters.forInvocation(sessionHelper, node.parent.parent);
     if (context == null) {
       return;
     }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_missing_parameter_named.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_missing_parameter_named.dart
index e06b063..cc53b3f 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_missing_parameter_named.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_missing_parameter_named.dart
@@ -42,7 +42,8 @@
     var argumentList = namedExpression.parent;
 
     // Prepare the invoked element.
-    var context = ExecutableParameters(sessionHelper, argumentList.parent);
+    var context =
+        ExecutableParameters.forInvocation(sessionHelper, argumentList.parent);
     if (context == null) {
       return;
     }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/change_argument_name.dart b/pkg/analysis_server/lib/src/services/correction/dart/change_argument_name.dart
index 32a7ec0..c7ff25f 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/change_argument_name.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/change_argument_name.dart
@@ -53,10 +53,8 @@
         namedExpression is NamedExpression &&
         namedExpression.name == node.parent &&
         namedExpression.parent is ArgumentList) {
-      var parameters = ExecutableParameters(
-        sessionHelper,
-        namedExpression.parent.parent,
-      );
+      var parameters = ExecutableParameters.forInvocation(
+          sessionHelper, namedExpression.parent.parent);
       return parameters?.namedNames;
     }
     return null;
diff --git a/pkg/analysis_server/lib/src/services/correction/executable_parameters.dart b/pkg/analysis_server/lib/src/services/correction/executable_parameters.dart
index 7fc7558..30c2497 100644
--- a/pkg/analysis_server/lib/src/services/correction/executable_parameters.dart
+++ b/pkg/analysis_server/lib/src/services/correction/executable_parameters.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'dart:core';
 
 import 'package:analyzer/dart/ast/ast.dart';
@@ -19,26 +17,6 @@
   final List<ParameterElement> optionalPositional = [];
   final List<ParameterElement> named = [];
 
-  factory ExecutableParameters(
-      AnalysisSessionHelper sessionHelper, AstNode invocation) {
-    Element element;
-    // This doesn't handle FunctionExpressionInvocation.
-    if (invocation is Annotation) {
-      element = invocation.element;
-    } else if (invocation is InstanceCreationExpression) {
-      element = invocation.constructorName.staticElement;
-    } else if (invocation is MethodInvocation) {
-      element = invocation.methodName.staticElement;
-    } else if (invocation is ConstructorReferenceNode) {
-      element = invocation.staticElement;
-    }
-    if (element is ExecutableElement && !element.isSynthetic) {
-      return ExecutableParameters._(sessionHelper, element);
-    } else {
-      return null;
-    }
-  }
-
   ExecutableParameters._(this.sessionHelper, this.executable) {
     for (var parameter in executable.parameters) {
       if (parameter.isRequiredPositional) {
@@ -61,7 +39,7 @@
 
   /// Return the [FormalParameterList] of the [executable], or `null` if it
   /// can't be found.
-  Future<FormalParameterList> getParameterList() async {
+  Future<FormalParameterList?> getParameterList() async {
     var result = await sessionHelper.getElementDeclaration(executable);
     var targetDeclaration = result?.node;
     if (targetDeclaration is ConstructorDeclaration) {
@@ -77,7 +55,7 @@
 
   /// Return the [FormalParameter] of the [element] in [FormalParameterList],
   /// or `null` if it can't be found.
-  Future<FormalParameter> getParameterNode(ParameterElement element) async {
+  Future<FormalParameter?> getParameterNode(ParameterElement element) async {
     var result = await sessionHelper.getElementDeclaration(element);
     var declaration = result?.node;
     for (var node = declaration; node != null; node = node.parent) {
@@ -87,4 +65,24 @@
     }
     return null;
   }
+
+  static ExecutableParameters? forInvocation(
+      AnalysisSessionHelper sessionHelper, AstNode invocation) {
+    Element? element;
+    // This doesn't handle FunctionExpressionInvocation.
+    if (invocation is Annotation) {
+      element = invocation.element;
+    } else if (invocation is InstanceCreationExpression) {
+      element = invocation.constructorName.staticElement;
+    } else if (invocation is MethodInvocation) {
+      element = invocation.methodName.staticElement;
+    } else if (invocation is ConstructorReferenceNode) {
+      element = invocation.staticElement;
+    }
+    if (element is ExecutableElement && !element.isSynthetic) {
+      return ExecutableParameters._(sessionHelper, element);
+    } else {
+      return null;
+    }
+  }
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/dart/top_level_declarations.dart b/pkg/analysis_server/lib/src/services/correction/fix/dart/top_level_declarations.dart
index ecfca96..e53d57d 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/dart/top_level_declarations.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/dart/top_level_declarations.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analyzer/dart/analysis/analysis_context.dart';
 import 'package:analyzer/src/services/available_declarations.dart';
 
@@ -87,7 +85,7 @@
     return declarations;
   }
 
-  TopLevelDeclarationKind _getTopKind(DeclarationKind kind) {
+  TopLevelDeclarationKind? _getTopKind(DeclarationKind kind) {
     switch (kind) {
       case DeclarationKind.CLASS:
       case DeclarationKind.CLASS_TYPE_ALIAS:
@@ -95,18 +93,14 @@
       case DeclarationKind.FUNCTION_TYPE_ALIAS:
       case DeclarationKind.MIXIN:
         return TopLevelDeclarationKind.type;
-        break;
       case DeclarationKind.EXTENSION:
         return TopLevelDeclarationKind.extension;
-        break;
       case DeclarationKind.FUNCTION:
         return TopLevelDeclarationKind.function;
-        break;
       case DeclarationKind.GETTER:
       case DeclarationKind.SETTER:
       case DeclarationKind.VARIABLE:
         return TopLevelDeclarationKind.variable;
-        break;
       default:
         return null;
     }
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/manifest/fix_generator.dart b/pkg/analysis_server/lib/src/services/correction/fix/manifest/fix_generator.dart
index b2d0854..1cc8e81 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/manifest/fix_generator.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/manifest/fix_generator.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'dart:math' as math;
 
 import 'package:analysis_server/plugin/edit/fix/fix_core.dart';
@@ -16,7 +14,6 @@
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:html/dom.dart';
-import 'package:meta/meta.dart';
 
 /// An object used to locate the HTML [Node] associated with a source range.
 /// More specifically, it will return the deepest HTML [Node] which completely
@@ -33,7 +30,7 @@
   ///
   /// If the [end] offset is not provided, then it is considered the same as the
   /// [start] offset.
-  HtmlNodeLocator({@required int start, int end})
+  HtmlNodeLocator({required int start, int? end})
       : _startOffset = start,
         _endOffset = end ?? start;
 
@@ -49,8 +46,10 @@
 
   void _searchWithin(List<Node> path, Node node) {
     var span = node.sourceSpan;
-    if (span.start.offset > _endOffset || span.end.offset < _startOffset) {
-      return;
+    if (span != null) {
+      if (span.start.offset > _endOffset || span.end.offset < _startOffset) {
+        return;
+      }
     }
     for (var element in node.children) {
       _searchWithin(path, element);
@@ -79,7 +78,7 @@
 
   final List<Fix> fixes = <Fix>[];
 
-  List<Node> coveringNodePath;
+  // List<Node> coveringNodePath;
 
   ManifestFixGenerator(this.error, this.content, this.document)
       : errorOffset = error.offset,
@@ -92,12 +91,12 @@
 
   /// Return the list of fixes that apply to the error being fixed.
   Future<List<Fix>> computeFixes() async {
-    var locator =
-        HtmlNodeLocator(start: errorOffset, end: errorOffset + errorLength - 1);
-    coveringNodePath = locator.searchWithin(document);
-    if (coveringNodePath.isEmpty) {
-      return fixes;
-    }
+    // var locator =
+    //     HtmlNodeLocator(start: errorOffset, end: errorOffset + errorLength - 1);
+    // coveringNodePath = locator.searchWithin(document);
+    // if (coveringNodePath.isEmpty) {
+    //   return fixes;
+    // }
 
     var errorCode = error.errorCode;
     if (errorCode == ManifestWarningCode.UNSUPPORTED_CHROME_OS_HARDWARE) {
@@ -112,7 +111,7 @@
   /// [kind]. If [args] are provided, they will be used to fill in the message
   /// for the fix.
   // ignore: unused_element
-  void _addFixFromBuilder(ChangeBuilder builder, FixKind kind, {List args}) {
+  void _addFixFromBuilder(ChangeBuilder builder, FixKind kind, {List? args}) {
     var change = builder.sourceChange;
     if (change.edits.isEmpty) {
       return;
@@ -131,9 +130,9 @@
 
   // ignore: unused_element
   SourceRange _lines(int start, int end) {
-    CharacterLocation startLocation = lineInfo.getLocation(start);
+    var startLocation = lineInfo.getLocation(start);
     var startOffset = lineInfo.getOffsetOfLine(startLocation.lineNumber - 1);
-    CharacterLocation endLocation = lineInfo.getLocation(end);
+    var endLocation = lineInfo.getLocation(end);
     var endOffset = lineInfo.getOffsetOfLine(
         math.min(endLocation.lineNumber, lineInfo.lineCount - 1));
     return SourceRange(startOffset, endOffset - startOffset);
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/pubspec/fix_generator.dart b/pkg/analysis_server/lib/src/services/correction/fix/pubspec/fix_generator.dart
index 62130a9..f21a745 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/pubspec/fix_generator.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/pubspec/fix_generator.dart
@@ -2,13 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'dart:math' as math;
 
 import 'package:analysis_server/plugin/edit/fix/fix_core.dart';
 import 'package:analysis_server/src/utilities/strings.dart';
-import 'package:analysis_server/src/utilities/yaml_node_locator.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/src/generated/java_core.dart';
@@ -34,7 +31,7 @@
 
   final List<Fix> fixes = <Fix>[];
 
-  List<YamlNode> coveringNodePath;
+  // List<YamlNode> coveringNodePath;
 
   PubspecFixGenerator(this.error, this.content, this.options)
       : errorOffset = error.offset,
@@ -47,12 +44,12 @@
 
   /// Return the list of fixes that apply to the error being fixed.
   Future<List<Fix>> computeFixes() async {
-    var locator =
-        YamlNodeLocator(start: errorOffset, end: errorOffset + errorLength - 1);
-    coveringNodePath = locator.searchWithin(options);
-    if (coveringNodePath.isEmpty) {
-      return fixes;
-    }
+    // var locator =
+    //     YamlNodeLocator(start: errorOffset, end: errorOffset + errorLength - 1);
+    // coveringNodePath = locator.searchWithin(options);
+    // if (coveringNodePath.isEmpty) {
+    //   return fixes;
+    // }
 
     var errorCode = error.errorCode;
     if (errorCode == PubspecWarningCode.ASSET_DOES_NOT_EXIST) {
@@ -71,7 +68,7 @@
   /// [kind]. If [args] are provided, they will be used to fill in the message
   /// for the fix.
   // ignore: unused_element
-  void _addFixFromBuilder(ChangeBuilder builder, FixKind kind, {List args}) {
+  void _addFixFromBuilder(ChangeBuilder builder, FixKind kind, {List? args}) {
     var change = builder.sourceChange;
     if (change.edits.isEmpty) {
       return;
@@ -90,9 +87,9 @@
 
   // ignore: unused_element
   SourceRange _lines(int start, int end) {
-    CharacterLocation startLocation = lineInfo.getLocation(start);
+    var startLocation = lineInfo.getLocation(start);
     var startOffset = lineInfo.getOffsetOfLine(startLocation.lineNumber - 1);
-    CharacterLocation endLocation = lineInfo.getLocation(end);
+    var endLocation = lineInfo.getLocation(end);
     var endOffset = lineInfo.getOffsetOfLine(
         math.min(endLocation.lineNumber, lineInfo.lineCount - 1));
     return SourceRange(startOffset, endOffset - startOffset);
diff --git a/pkg/analysis_server/lib/src/services/correction/levenshtein.dart b/pkg/analysis_server/lib/src/services/correction/levenshtein.dart
index 7146b2d..8f0e934 100644
--- a/pkg/analysis_server/lib/src/services/correction/levenshtein.dart
+++ b/pkg/analysis_server/lib/src/services/correction/levenshtein.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'dart:math' as math;
 
 /// The value returned by [levenshtein] if the distance is determined
@@ -24,9 +22,6 @@
 /// distance algorithm.
 int levenshtein(String s, String t, int threshold,
     {bool caseSensitive = true}) {
-  if (s == null || t == null) {
-    throw ArgumentError('Strings must not be null');
-  }
   if (threshold < 0) {
     throw ArgumentError('Threshold must not be negative');
   }
diff --git a/pkg/analysis_server/lib/src/services/correction/name_suggestion.dart b/pkg/analysis_server/lib/src/services/correction/name_suggestion.dart
index b52a410..f501ed0 100644
--- a/pkg/analysis_server/lib/src/services/correction/name_suggestion.dart
+++ b/pkg/analysis_server/lib/src/services/correction/name_suggestion.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/utilities/strings.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
@@ -27,17 +25,17 @@
 
 /// 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,
     {bool isMethod = false}) {
-  String prefix;
+  String? prefix;
 
   if (isMethod) {
     // If we're in a build() method, use 'build' as the name prefix.
-    var method = assignedExpression.thisOrAncestorOfType<MethodDeclaration>();
+    var method = assignedExpression?.thisOrAncestorOfType<MethodDeclaration>();
     if (method != null) {
-      var enclosingName = method.name?.name;
-      if (enclosingName != null && enclosingName.startsWith('build')) {
+      var enclosingName = method.name.name;
+      if (enclosingName.startsWith('build')) {
         prefix = 'build';
       }
     }
@@ -48,7 +46,9 @@
   if (assignedExpression != null) {
     var nameFromExpression = _getBaseNameFromExpression(assignedExpression);
     if (nameFromExpression != null) {
-      nameFromExpression = removeStart(nameFromExpression, '_');
+      if (nameFromExpression.startsWith('_')) {
+        nameFromExpression = nameFromExpression.substring(1);
+      }
       _addAll(excluded, res, getCamelWordCombinations(nameFromExpression),
           prefix: prefix);
     }
@@ -95,7 +95,8 @@
     for (var i = 0; i < words.length; i++) {
       var word = words[i];
       if (i > 0) {
-        word = capitalize(word);
+        // `capitalize` won't return `null` unless `null` is passed in.
+        word = capitalize(word)!;
       }
       sb.write(word);
     }
@@ -109,7 +110,7 @@
 
 /// Adds [toAdd] items which are not excluded.
 void _addAll(Set<String> excluded, Set<String> result, Iterable<String> toAdd,
-    {String prefix}) {
+    {String? prefix}) {
   for (var item in toAdd) {
     // add name based on "item", but not "excluded"
     for (var suffix = 1;; suffix++) {
@@ -141,7 +142,7 @@
   }
 }
 
-String _getBaseNameFromExpression(Expression expression) {
+String? _getBaseNameFromExpression(Expression expression) {
   if (expression is AsExpression) {
     return _getBaseNameFromExpression(expression.expression);
   } else if (expression is ParenthesizedExpression) {
@@ -150,7 +151,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;
@@ -167,8 +168,8 @@
   return null;
 }
 
-String _getBaseNameFromUnwrappedExpression(Expression expression) {
-  String name;
+String? _getBaseNameFromUnwrappedExpression(Expression expression) {
+  String? name;
   // analyze expressions
   if (expression is SimpleIdentifier) {
     return expression.name;
@@ -181,22 +182,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);
diff --git a/pkg/analysis_server/lib/src/services/correction/namespace.dart b/pkg/analysis_server/lib/src/services/correction/namespace.dart
index 98423a2..affc53d 100644
--- a/pkg/analysis_server/lib/src/services/correction/namespace.dart
+++ b/pkg/analysis_server/lib/src/services/correction/namespace.dart
@@ -2,35 +2,33 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/resolver/scope.dart';
 
 /// Returns the [Element] exported from the given [LibraryElement].
-Element getExportedElement(LibraryElement library, String name) {
+Element? getExportedElement(LibraryElement? library, String name) {
   if (library == null) {
     return null;
   }
-  return getExportNamespaceForLibrary(library)[name];
-}
-
-/// Returns the export namespace of the given [LibraryElement].
-Map<String, Element> getExportNamespaceForLibrary(LibraryElement library) {
-  var namespace = NamespaceBuilder().createExportNamespaceForLibrary(library);
-  return namespace.definedNames;
+  return _getExportNamespaceForLibrary(library)[name];
 }
 
 /// Return the [ImportElement] that is referenced by [prefixNode], or `null` if
 /// the node does not reference a prefix or if we cannot determine which import
 /// is being referenced.
-ImportElement getImportElement(SimpleIdentifier prefixNode) {
+ImportElement? getImportElement(SimpleIdentifier prefixNode) {
   var parent = prefixNode.parent;
   if (parent is ImportDirective) {
     return parent.element;
   }
-  return internal_getImportElementInfo(prefixNode);
+  return _getImportElementInfo(prefixNode);
+}
+
+/// Returns the export namespace of the given [LibraryElement].
+Map<String, Element> _getExportNamespaceForLibrary(LibraryElement library) {
+  var namespace = NamespaceBuilder().createExportNamespaceForLibrary(library);
+  return namespace.definedNames;
 }
 
 /// Return the [ImportElement] that declared [prefix] and imports [element].
@@ -39,21 +37,14 @@
 /// [prefix] - the import prefix, maybe `null`.
 /// [element] - the referenced element.
 /// [importElementsMap] - the cache of [Element]s imported by [ImportElement]s.
-ImportElement internal_getImportElement(
-    LibraryElement libraryElement,
-    String prefix,
-    Element element,
-    Map<ImportElement, Set<Element>> importElementsMap) {
-  // validate Element
-  if (element == null) {
-    return null;
-  }
+ImportElement? _getImportElement(LibraryElement libraryElement, String prefix,
+    Element element, Map<ImportElement, Set<Element>> importElementsMap) {
   if (element.enclosingElement is! CompilationUnitElement) {
     return null;
   }
   var usedLibrary = element.library;
   // find ImportElement that imports used library with used prefix
-  List<ImportElement> candidates;
+  List<ImportElement>? candidates;
   for (var importElement in libraryElement.imports) {
     // required library
     if (importElement.importedLibrary != usedLibrary) {
@@ -61,17 +52,11 @@
     }
     // required prefix
     var prefixElement = importElement.prefix;
-    if (prefix == null) {
-      if (prefixElement != null) {
-        continue;
-      }
-    } else {
-      if (prefixElement == null) {
-        continue;
-      }
-      if (prefix != prefixElement.name) {
-        continue;
-      }
+    if (prefixElement == null) {
+      continue;
+    }
+    if (prefix != prefixElement.name) {
+      continue;
     }
     // no combinators => only possible candidate
     if (importElement.combinators.isEmpty) {
@@ -99,8 +84,9 @@
     importElementsMap[importElement] = elements;
   }
   // use import namespace to choose correct one
-  for (var importElement in importElementsMap.keys) {
-    var elements = importElementsMap[importElement];
+  for (var entry in importElementsMap.entries) {
+    var importElement = entry.key;
+    var elements = entry.value;
     if (elements.contains(element)) {
       return importElement;
     }
@@ -111,20 +97,22 @@
 
 /// Returns the [ImportElement] that is referenced by [prefixNode] with a
 /// [PrefixElement], maybe `null`.
-ImportElement internal_getImportElementInfo(SimpleIdentifier prefixNode) {
+ImportElement? _getImportElementInfo(SimpleIdentifier prefixNode) {
   // prepare environment
   var parent = prefixNode.parent;
   var unit = prefixNode.thisOrAncestorOfType<CompilationUnit>();
-  var libraryElement = unit.declaredElement.library;
+  var libraryElement = unit?.declaredElement?.library;
+  if (libraryElement == null) {
+    return null;
+  }
   // prepare used element
-  Element usedElement;
+  Element? usedElement;
   if (parent is PrefixedIdentifier) {
     var prefixed = parent;
     if (prefixed.prefix == prefixNode) {
       usedElement = prefixed.staticElement;
     }
-  }
-  if (parent is MethodInvocation) {
+  } else if (parent is MethodInvocation) {
     var invocation = parent;
     if (invocation.target == prefixNode) {
       usedElement = invocation.methodName.staticElement;
@@ -137,6 +125,6 @@
   // find ImportElement
   var prefix = prefixNode.name;
   var importElementsMap = <ImportElement, Set<Element>>{};
-  return internal_getImportElement(
+  return _getImportElement(
       libraryElement, prefix, usedElement, importElementsMap);
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/source_buffer.dart b/pkg/analysis_server/lib/src/services/correction/source_buffer.dart
index 55dcdc00..488743e 100644
--- a/pkg/analysis_server/lib/src/services/correction/source_buffer.dart
+++ b/pkg/analysis_server/lib/src/services/correction/source_buffer.dart
@@ -2,24 +2,23 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 /// Helper for building Dart source with linked positions.
 class SourceBuilder {
   final String file;
   final int offset;
   final StringBuffer _buffer = StringBuffer();
 
-  int _exitOffset;
+  int? _exitOffset;
 
   SourceBuilder(this.file, this.offset);
 
   /// Returns the exit offset, maybe `null` if not set.
-  int get exitOffset {
-    if (_exitOffset == null) {
+  int? get exitOffset {
+    var exitOffset = _exitOffset;
+    if (exitOffset == null) {
       return null;
     }
-    return offset + _exitOffset;
+    return offset + exitOffset;
   }
 
   int get length => _buffer.length;
diff --git a/pkg/analysis_server/lib/src/services/kythe/schema.dart b/pkg/analysis_server/lib/src/services/kythe/schema.dart
index dfd091e..3016742 100644
--- a/pkg/analysis_server/lib/src/services/kythe/schema.dart
+++ b/pkg/analysis_server/lib/src/services/kythe/schema.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 /// This file gathers constant strings from the Kythe Schema:
 /// kythe.io/docs/schema/
 
diff --git a/pkg/analysis_server/lib/src/services/linter/lint_names.dart b/pkg/analysis_server/lib/src/services/linter/lint_names.dart
index cfaf553..cc4823f 100644
--- a/pkg/analysis_server/lib/src/services/linter/lint_names.dart
+++ b/pkg/analysis_server/lib/src/services/linter/lint_names.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 /// An enumeration of lint names.
 class LintNames {
   static const String always_declare_return_types =
diff --git a/pkg/analysis_server/test/services/correction/levenshtein_test.dart b/pkg/analysis_server/test/services/correction/levenshtein_test.dart
index 24826fd..fb1f656 100644
--- a/pkg/analysis_server/test/services/correction/levenshtein_test.dart
+++ b/pkg/analysis_server/test/services/correction/levenshtein_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/services/correction/levenshtein.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -48,15 +46,6 @@
     }, throwsArgumentError);
   }
 
-  void test_null() {
-    expect(() {
-      levenshtein('', null, 5);
-    }, throwsArgumentError);
-    expect(() {
-      levenshtein(null, '', 5);
-    }, throwsArgumentError);
-  }
-
   void test_same() {
     expect(levenshtein('', '', 5), 0);
     expect(levenshtein('test', 'test', 5), 0);
diff --git a/pkg/analysis_server/test/services/correction/name_suggestion_test.dart b/pkg/analysis_server/test/services/correction/name_suggestion_test.dart
index 7216dcd..243fd9b 100644
--- a/pkg/analysis_server/test/services/correction/name_suggestion_test.dart
+++ b/pkg/analysis_server/test/services/correction/name_suggestion_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/services/correction/name_suggestion.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/computer/closing_labels_computer_test.dart b/pkg/analysis_server/test/src/computer/closing_labels_computer_test.dart
index 47c1a01..c79006b 100644
--- a/pkg/analysis_server/test/src/computer/closing_labels_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/closing_labels_computer_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/computer/computer_closingLabels.dart';
 import 'package:test/test.dart';
@@ -19,7 +17,7 @@
 
 @reflectiveTest
 class ClosingLabelsComputerTest extends AbstractContextTest {
-  String sourcePath;
+  late String sourcePath;
 
   @override
   void setUp() {
@@ -366,7 +364,7 @@
   /// Compares provided closing labels with expected
   /// labels extracted from the comments in the provided content.
   void _compareLabels(List<ClosingLabel> labels, String content,
-      {int expectedLabelCount}) {
+      {int? expectedLabelCount}) {
     // Require the test pass us the expected count to guard
     // against expected annotations being mistyped and not
     // extracted by the regex.
@@ -385,11 +383,11 @@
     expectedLabels.forEach((m) {
       var i = m.group(1);
       // Find the end marker.
-      var endMatch = RegExp('/\\*$i:(.+?)\\*/').firstMatch(content);
+      var endMatch = RegExp('/\\*$i:(.+?)\\*/').firstMatch(content)!;
 
       var expectedStart = m.end;
       var expectedLength = endMatch.start - expectedStart;
-      var expectedLabel = endMatch.group(1);
+      var expectedLabel = endMatch.group(1)!;
 
       expect(labels,
           contains(ClosingLabel(expectedStart, expectedLength, expectedLabel)));
@@ -399,7 +397,7 @@
   Future<List<ClosingLabel>> _computeElements(String sourceContent) async {
     newFile(sourcePath, content: sourceContent);
     var result = await session.getResolvedUnit(sourcePath);
-    var computer = DartUnitClosingLabelsComputer(result.lineInfo, result.unit);
+    var computer = DartUnitClosingLabelsComputer(result.lineInfo, result.unit!);
     return computer.compute();
   }
 }
diff --git a/pkg/analysis_server/test/src/computer/import_elements_computer_test.dart b/pkg/analysis_server/test/src/computer/import_elements_computer_test.dart
index cc30a93..19bb89e 100644
--- a/pkg/analysis_server/test/src/computer/import_elements_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/import_elements_computer_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/computer/import_elements_computer.dart';
 import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
@@ -21,14 +19,14 @@
 
 @reflectiveTest
 class ImportElementsComputerTest extends AbstractContextTest {
-  String path;
-  String originalContent;
-  ImportElementsComputer computer;
-  SourceFileEdit sourceFileEdit;
+  late String path;
+  late String originalContent;
+  late ImportElementsComputer computer;
+  late SourceFileEdit? sourceFileEdit;
 
   void assertChanges(String expectedContent) {
     var resultCode =
-        SourceEdit.applySequence(originalContent, sourceFileEdit.edits);
+        SourceEdit.applySequence(originalContent, sourceFileEdit!.edits);
     expect(resultCode, expectedContent);
   }
 
diff --git a/pkg/analysis_server/test/src/computer/outline_computer_test.dart b/pkg/analysis_server/test/src/computer/outline_computer_test.dart
index 191bade..08abb6d 100644
--- a/pkg/analysis_server/test/src/computer/outline_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/outline_computer_test.dart
@@ -2,11 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/computer/computer_outline.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
-import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -21,8 +18,8 @@
 
 class AbstractOutlineComputerTest extends AbstractContextTest
     with WithNonFunctionTypeAliasesMixin {
-  String testPath;
-  String testCode;
+  late String testPath;
+  late String testCode;
 
   @override
   void setUp() {
@@ -70,10 +67,10 @@
       Text('aaa')
       Text('bbb')
 ''');
-    var myWidget = unitOutline.children[0];
-    var build = myWidget.children[0];
+    var myWidget = unitOutline.children![0];
+    var build = myWidget.children![0];
 
-    var columnOutline = build.children[0];
+    var columnOutline = build.children![0];
     {
       var offset = testCode.indexOf('new Column');
       var length = testCode.indexOf('; // Column') - offset;
@@ -85,7 +82,7 @@
     }
 
     {
-      var textOutline = columnOutline.children[0];
+      var textOutline = columnOutline.children![0];
       var text = "const Text('aaa')";
       var offset = testCode.indexOf(text);
       _expect(textOutline,
@@ -96,7 +93,7 @@
     }
 
     {
-      var textOutline = columnOutline.children[1];
+      var textOutline = columnOutline.children![1];
       var text = "const Text('bbb')";
       var offset = testCode.indexOf(text);
       _expect(textOutline,
@@ -108,13 +105,13 @@
   }
 
   void _expect(Outline outline,
-      {@required String name,
-      @required int elementOffset,
-      @required int offset,
-      @required int length}) {
+      {required String name,
+      required int elementOffset,
+      required int offset,
+      required int length}) {
     var element = outline.element;
     expect(element.name, name);
-    expect(element.location.offset, elementOffset);
+    expect(element.location!.offset, elementOffset);
     expect(outline.offset, offset);
     expect(outline.length, length);
   }
@@ -130,7 +127,7 @@
       }
     }
 
-    for (var child in outline.children) {
+    for (var child in outline.children!) {
       writeOutline(child, '');
     }
     return buffer.toString();
@@ -159,7 +156,7 @@
 String fa(int pa) => null;
 R fb<R, P>(P p) {}
 ''');
-    var topOutlines = unitOutline.children;
+    var topOutlines = unitOutline.children!;
     expect(topOutlines, hasLength(4));
     // A
     {
@@ -169,14 +166,14 @@
       expect(element_A.name, 'A');
       expect(element_A.typeParameters, '<K, V>');
       {
-        var location = element_A.location;
+        var location = element_A.location!;
         expect(location.offset, testCode.indexOf('A<K, V> {'));
         expect(location.length, 1);
       }
       expect(element_A.parameters, null);
       expect(element_A.returnType, null);
       // A children
-      var outlines_A = outline_A.children;
+      var outlines_A = outline_A.children!;
       expect(outlines_A, hasLength(11));
       {
         var outline = outlines_A[0];
@@ -208,7 +205,7 @@
         expect(element.kind, ElementKind.CONSTRUCTOR);
         expect(element.name, 'A');
         {
-          var location = element.location;
+          var location = element.location!;
           expect(location.offset, testCode.indexOf('A(int i, String s);'));
           expect(location.length, 'A'.length);
         }
@@ -223,7 +220,7 @@
         expect(element.kind, ElementKind.CONSTRUCTOR);
         expect(element.name, 'A.name');
         {
-          var location = element.location;
+          var location = element.location!;
           expect(location.offset, testCode.indexOf('name(num p);'));
           expect(location.length, 'name'.length);
         }
@@ -238,7 +235,7 @@
         expect(element.kind, ElementKind.CONSTRUCTOR);
         expect(element.name, 'A._privateName');
         {
-          var location = element.location;
+          var location = element.location!;
           expect(location.offset, testCode.indexOf('_privateName(num p);'));
           expect(location.length, '_privateName'.length);
         }
@@ -253,7 +250,7 @@
         expect(element.kind, ElementKind.METHOD);
         expect(element.name, 'ma');
         {
-          var location = element.location;
+          var location = element.location!;
           expect(location.offset, testCode.indexOf('ma(int pa) => null;'));
           expect(location.length, 'ma'.length);
         }
@@ -268,7 +265,7 @@
         expect(element.kind, ElementKind.METHOD);
         expect(element.name, '_mb');
         {
-          var location = element.location;
+          var location = element.location!;
           expect(location.offset, testCode.indexOf('_mb(int pb);'));
           expect(location.length, '_mb'.length);
         }
@@ -283,7 +280,7 @@
         expect(element.kind, ElementKind.METHOD);
         expect(element.name, 'mc');
         {
-          var location = element.location;
+          var location = element.location!;
           expect(location.offset, testCode.indexOf('mc<R, P>'));
           expect(location.length, 'mc'.length);
         }
@@ -299,7 +296,7 @@
         expect(element.kind, ElementKind.GETTER);
         expect(element.name, 'propA');
         {
-          var location = element.location;
+          var location = element.location!;
           expect(location.offset, testCode.indexOf('propA => null;'));
           expect(location.length, 'propA'.length);
         }
@@ -312,7 +309,7 @@
         expect(element.kind, ElementKind.SETTER);
         expect(element.name, 'propB');
         {
-          var location = element.location;
+          var location = element.location!;
           expect(location.offset, testCode.indexOf('propB(int v) {}'));
           expect(location.length, 'propB'.length);
         }
@@ -328,14 +325,14 @@
       expect(element_B.name, 'B');
       expect(element_B.typeParameters, isNull);
       {
-        var location = element_B.location;
+        var location = element_B.location!;
         expect(location.offset, testCode.indexOf('B {'));
         expect(location.length, 1);
       }
       expect(element_B.parameters, null);
       expect(element_B.returnType, null);
       // B children
-      var outlines_B = outline_B.children;
+      var outlines_B = outline_B.children!;
       expect(outlines_B, hasLength(1));
       {
         var outline = outlines_B[0];
@@ -343,7 +340,7 @@
         expect(element.kind, ElementKind.CONSTRUCTOR);
         expect(element.name, 'B');
         {
-          var location = element.location;
+          var location = element.location!;
           expect(location.offset, testCode.indexOf('B(int p);'));
           expect(location.length, 'B'.length);
         }
@@ -357,7 +354,7 @@
       expect(element.kind, ElementKind.FUNCTION);
       expect(element.name, 'fa');
       {
-        var location = element.location;
+        var location = element.location!;
         expect(location.offset, testCode.indexOf('fa(int pa)'));
         expect(location.length, 'ma'.length);
       }
@@ -372,7 +369,7 @@
       expect(element.kind, ElementKind.FUNCTION);
       expect(element.name, 'fb');
       {
-        var location = element.location;
+        var location = element.location!;
         expect(location.offset, testCode.indexOf('fb<R, P>'));
         expect(location.length, 'fb'.length);
       }
@@ -390,7 +387,7 @@
   A, B, C
 }
 ''');
-    var topOutlines = unitOutline.children;
+    var topOutlines = unitOutline.children!;
     expect(topOutlines, hasLength(1));
     // MyEnum
     {
@@ -399,14 +396,14 @@
       expect(element_MyEnum.kind, ElementKind.ENUM);
       expect(element_MyEnum.name, 'MyEnum');
       {
-        var location = element_MyEnum.location;
+        var location = element_MyEnum.location!;
         expect(location.offset, testCode.indexOf('MyEnum {'));
         expect(location.length, 'MyEnum'.length);
       }
       expect(element_MyEnum.parameters, null);
       expect(element_MyEnum.returnType, null);
       // MyEnum children
-      var outlines_MyEnum = outline_MyEnum.children;
+      var outlines_MyEnum = outline_MyEnum.children!;
       expect(outlines_MyEnum, hasLength(3));
       _isEnumConstant(outlines_MyEnum[0], 'A');
       _isEnumConstant(outlines_MyEnum[1], 'B');
@@ -423,7 +420,7 @@
   }
 }
 ''');
-    var topOutlines = unitOutline.children;
+    var topOutlines = unitOutline.children!;
     expect(topOutlines, hasLength(1));
     // MyExt
     {
@@ -432,7 +429,7 @@
       expect(element_MyExt.kind, ElementKind.EXTENSION);
       expect(element_MyExt.name, 'MyExt');
       {
-        var location = element_MyExt.location;
+        var location = element_MyExt.location!;
         expect(location.offset, testCode.indexOf('MyExt on'));
         expect(location.length, 'MyExt'.length);
       }
@@ -453,7 +450,7 @@
   }
 }
 ''');
-    var topOutlines = unitOutline.children;
+    var topOutlines = unitOutline.children!;
     expect(topOutlines, hasLength(1));
     // MyExt
     {
@@ -462,7 +459,7 @@
       expect(element_MyExt.kind, ElementKind.EXTENSION);
       expect(element_MyExt.name, '');
       {
-        var location = element_MyExt.location;
+        var location = element_MyExt.location!;
         expect(location.offset, testCode.indexOf('String'));
         expect(location.length, 'String'.length);
       }
@@ -478,7 +475,7 @@
     var unitOutline = await _computeOutline('''
 typedef F = void Function();
 ''');
-    var topOutlines = unitOutline.children;
+    var topOutlines = unitOutline.children!;
     expect(topOutlines, hasLength(1));
     // F
     var outline_F = topOutlines[0];
@@ -486,7 +483,7 @@
     expect(element_F.kind, ElementKind.FUNCTION_TYPE_ALIAS);
     expect(element_F.name, 'F');
     {
-      var location = element_F.location;
+      var location = element_F.location!;
       expect(location.offset, testCode.indexOf('F ='));
       expect(location.length, 'F'.length);
     }
@@ -500,7 +497,7 @@
     var unitOutline = await _computeOutline('''
 typedef F = Function();
 ''');
-    var topOutlines = unitOutline.children;
+    var topOutlines = unitOutline.children!;
     expect(topOutlines, hasLength(1));
     // F
     var outline_F = topOutlines[0];
@@ -508,7 +505,7 @@
     expect(element_F.kind, ElementKind.FUNCTION_TYPE_ALIAS);
     expect(element_F.name, 'F');
     {
-      var location = element_F.location;
+      var location = element_F.location!;
       expect(location.offset, testCode.indexOf('F ='));
       expect(location.length, 'F'.length);
     }
@@ -522,7 +519,7 @@
     var unitOutline = await _computeOutline('''
 typedef F<T> = Map<int, T>;
 ''');
-    var topOutlines = unitOutline.children;
+    var topOutlines = unitOutline.children!;
     expect(topOutlines, hasLength(1));
     // F
     var outline_F = topOutlines[0];
@@ -530,7 +527,7 @@
     expect(element_F.kind, ElementKind.TYPE_ALIAS);
     expect(element_F.name, 'F');
     {
-      var location = element_F.location;
+      var location = element_F.location!;
       expect(location.offset, testCode.indexOf('F<T> ='));
       expect(location.length, 'F'.length);
     }
@@ -561,7 +558,7 @@
 }
 ''');
     // unit
-    var unit_children = outline.children;
+    var unit_children = outline.children!;
     expect(unit_children, hasLength(3));
     // main
     var main_outline = unit_children[2];
@@ -571,7 +568,7 @@
         offset: testCode.indexOf('main() {'),
         parameters: '()',
         returnType: 'void');
-    var main_children = main_outline.children;
+    var main_children = main_outline.children!;
     expect(main_children, hasLength(2));
     // group1
     var group1_outline = main_children[0];
@@ -580,7 +577,7 @@
         length: 5,
         name: 'group("group1")',
         offset: testCode.indexOf("group('group1'"));
-    var group1_children = group1_outline.children;
+    var group1_children = group1_outline.children!;
     expect(group1_children, hasLength(2));
     // group1_1
     var group1_1_outline = group1_children[0];
@@ -589,7 +586,7 @@
         length: 5,
         name: 'group("group1_1")',
         offset: testCode.indexOf("group('group1_1'"));
-    var group1_1_children = group1_1_outline.children;
+    var group1_1_children = group1_1_outline.children!;
     expect(group1_1_children, hasLength(2));
     // test1_1_1
     var test1_1_1_outline = group1_1_children[0];
@@ -614,7 +611,7 @@
         length: 5,
         name: 'group("group1_2")',
         offset: testCode.indexOf("group('group1_2'"));
-    var group1_2_children = group1_2_outline.children;
+    var group1_2_children = group1_2_outline.children!;
     expect(group1_2_children, hasLength(1));
     // test2_1
     var test1_2_1_outline = group1_2_children[0];
@@ -631,7 +628,7 @@
         length: 5,
         name: 'group("group2")',
         offset: testCode.indexOf("group('group2'"));
-    var group2_children = group2_outline.children;
+    var group2_children = group2_outline.children!;
     expect(group2_children, hasLength(2));
     // test2_1
     var test2_1_outline = group2_children[0];
@@ -707,7 +704,7 @@
 }
 ''');
     // unit
-    var unit_children = outline.children;
+    var unit_children = outline.children!;
     expect(unit_children, hasLength(3));
     // main
     var main_outline = unit_children[2];
@@ -717,7 +714,7 @@
         offset: testCode.indexOf('main() {'),
         parameters: '()',
         returnType: 'void');
-    var main_children = main_outline.children;
+    var main_children = main_outline.children!;
     expect(main_children, hasLength(2));
     // group1
     var group1_outline = main_children[0];
@@ -726,7 +723,7 @@
         length: 7,
         name: 'myGroup("group1")',
         offset: testCode.indexOf("myGroup('group1'"));
-    var group1_children = group1_outline.children;
+    var group1_children = group1_outline.children!;
     expect(group1_children, hasLength(2));
     // group1_1
     var group1_1_outline = group1_children[0];
@@ -735,7 +732,7 @@
         length: 7,
         name: 'myGroup("group1_1")',
         offset: testCode.indexOf("myGroup('group1_1'"));
-    var group1_1_children = group1_1_outline.children;
+    var group1_1_children = group1_1_outline.children!;
     expect(group1_1_children, hasLength(2));
     // test1_1_1
     var test1_1_1_outline = group1_1_children[0];
@@ -760,7 +757,7 @@
         length: 7,
         name: 'myGroup("group1_2")',
         offset: testCode.indexOf("myGroup('group1_2'"));
-    var group1_2_children = group1_2_outline.children;
+    var group1_2_children = group1_2_outline.children!;
     expect(group1_2_children, hasLength(1));
     // test2_1
     var test1_2_1_outline = group1_2_children[0];
@@ -777,7 +774,7 @@
         length: 7,
         name: 'myGroup("group2")',
         offset: testCode.indexOf("myGroup('group2'"));
-    var group2_children = group2_outline.children;
+    var group2_children = group2_outline.children!;
     expect(group2_children, hasLength(2));
     // test2_1
     var test2_1_outline = group2_children[0];
@@ -814,7 +811,7 @@
   }
 }
 ''');
-    var topOutlines = unitOutline.children;
+    var topOutlines = unitOutline.children!;
     expect(topOutlines, hasLength(2));
     // A
     {
@@ -823,14 +820,14 @@
       expect(element_A.kind, ElementKind.CLASS);
       expect(element_A.name, 'A');
       {
-        var location = element_A.location;
+        var location = element_A.location!;
         expect(location.offset, testCode.indexOf('A {'));
         expect(location.length, 'A'.length);
       }
       expect(element_A.parameters, null);
       expect(element_A.returnType, null);
       // A children
-      var outlines_A = outline_A.children;
+      var outlines_A = outline_A.children!;
       expect(outlines_A, hasLength(2));
       {
         var constructorOutline = outlines_A[0];
@@ -838,14 +835,14 @@
         expect(constructorElement.kind, ElementKind.CONSTRUCTOR);
         expect(constructorElement.name, 'A');
         {
-          var location = constructorElement.location;
+          var location = constructorElement.location!;
           expect(location.offset, testCode.indexOf('A() {'));
           expect(location.length, 'A'.length);
         }
         expect(constructorElement.parameters, '()');
         expect(constructorElement.returnType, isNull);
         // local function
-        var outlines_constructor = constructorOutline.children;
+        var outlines_constructor = constructorOutline.children!;
         expect(outlines_constructor, hasLength(1));
         {
           var outline = outlines_constructor[0];
@@ -853,7 +850,7 @@
           expect(element.kind, ElementKind.FUNCTION);
           expect(element.name, 'local_A');
           {
-            var location = element.location;
+            var location = element.location!;
             expect(location.offset, testCode.indexOf('local_A() {}'));
             expect(location.length, 'local_A'.length);
           }
@@ -867,14 +864,14 @@
         expect(element_m.kind, ElementKind.METHOD);
         expect(element_m.name, 'm');
         {
-          var location = element_m.location;
+          var location = element_m.location!;
           expect(location.offset, testCode.indexOf('m() {'));
           expect(location.length, 'm'.length);
         }
         expect(element_m.parameters, '()');
         expect(element_m.returnType, '');
         // local function
-        var methodChildren = outline_m.children;
+        var methodChildren = outline_m.children!;
         expect(methodChildren, hasLength(1));
         {
           var outline = methodChildren[0];
@@ -882,7 +879,7 @@
           expect(element.kind, ElementKind.FUNCTION);
           expect(element.name, 'local_m');
           {
-            var location = element.location;
+            var location = element.location!;
             expect(location.offset, testCode.indexOf('local_m() {}'));
             expect(location.length, 'local_m'.length);
           }
@@ -898,14 +895,14 @@
       expect(element_f.kind, ElementKind.FUNCTION);
       expect(element_f.name, 'f');
       {
-        var location = element_f.location;
+        var location = element_f.location!;
         expect(location.offset, testCode.indexOf('f() {'));
         expect(location.length, 'f'.length);
       }
       expect(element_f.parameters, '()');
       expect(element_f.returnType, '');
       // f() children
-      var outlines_f = outline_f.children;
+      var outlines_f = outline_f.children!;
       expect(outlines_f, hasLength(2));
       {
         var outline_f1 = outlines_f[0];
@@ -913,7 +910,7 @@
         expect(element_f1.kind, ElementKind.FUNCTION);
         expect(element_f1.name, 'local_f1');
         {
-          var location = element_f1.location;
+          var location = element_f1.location!;
           expect(location.offset, testCode.indexOf('local_f1(int i) {}'));
           expect(location.length, 'local_f1'.length);
         }
@@ -926,14 +923,14 @@
         expect(element_f2.kind, ElementKind.FUNCTION);
         expect(element_f2.name, 'local_f2');
         {
-          var location = element_f2.location;
+          var location = element_f2.location!;
           expect(location.offset, testCode.indexOf('local_f2(String s) {'));
           expect(location.length, 'local_f2'.length);
         }
         expect(element_f2.parameters, '(String s)');
         expect(element_f2.returnType, '');
         // local_f2() local function
-        var outlines_f2 = outline_f2.children;
+        var outlines_f2 = outline_f2.children!;
         expect(outlines_f2, hasLength(1));
         {
           var outline_f21 = outlines_f2[0];
@@ -941,7 +938,7 @@
           expect(element_f21.kind, ElementKind.FUNCTION);
           expect(element_f21.name, 'local_f21');
           {
-            var location = element_f21.location;
+            var location = element_f21.location!;
             expect(location.offset, testCode.indexOf('local_f21(int p) {'));
             expect(location.length, 'local_f21'.length);
           }
@@ -960,7 +957,7 @@
   set f(int g) {}
 }
 ''');
-    var topOutlines = unitOutline.children;
+    var topOutlines = unitOutline.children!;
     expect(topOutlines, hasLength(1));
     // M
     {
@@ -970,14 +967,14 @@
       expect(element_M.name, 'M');
       expect(element_M.typeParameters, '<N>');
       {
-        var location = element_M.location;
+        var location = element_M.location!;
         expect(location.offset, testCode.indexOf('M<N>'));
         expect(location.length, 1);
       }
       expect(element_M.parameters, isNull);
       expect(element_M.returnType, isNull);
       // M children
-      var outlines_M = outline_M.children;
+      var outlines_M = outline_M.children!;
       expect(outlines_M, hasLength(3));
       {
         var outline = outlines_M[0];
@@ -985,7 +982,7 @@
         expect(element.kind, ElementKind.METHOD);
         expect(element.name, 'c');
         {
-          var location = element.location;
+          var location = element.location!;
           expect(location.offset, testCode.indexOf('c(int d)'));
           expect(location.length, 1);
         }
@@ -1000,7 +997,7 @@
         expect(element.kind, ElementKind.GETTER);
         expect(element.name, 'e');
         {
-          var location = element.location;
+          var location = element.location!;
           expect(location.offset, testCode.indexOf('e => null'));
           expect(location.length, 1);
         }
@@ -1013,7 +1010,7 @@
         expect(element.kind, ElementKind.SETTER);
         expect(element.name, 'f');
         {
-          var location = element.location;
+          var location = element.location!;
           expect(location.offset, testCode.indexOf('f(int g)'));
           expect(location.length, 1);
         }
@@ -1034,7 +1031,7 @@
   int fieldD;
 }
 ''');
-    var outlines = unitOutline.children[0].children;
+    var outlines = unitOutline.children![0].children!;
     expect(outlines, hasLength(4));
 
     // fieldA
@@ -1101,7 +1098,7 @@
 
 class B {}
 ''');
-    var topOutlines = unitOutline.children;
+    var topOutlines = unitOutline.children!;
     expect(topOutlines, hasLength(2));
 
     // A
@@ -1143,7 +1140,7 @@
   int methodB() {}
 }
 ''');
-    var outlines = unitOutline.children[0].children;
+    var outlines = unitOutline.children![0].children!;
     expect(outlines, hasLength(2));
 
     // methodA
@@ -1189,7 +1186,7 @@
 String get propA => null;
 set propB(int v) {}
 ''');
-    var topOutlines = unitOutline.children;
+    var topOutlines = unitOutline.children!;
     expect(topOutlines, hasLength(11));
     // FTA
     {
@@ -1199,7 +1196,7 @@
       expect(element.name, 'FTA');
       expect(element.typeParameters, '<K, V>');
       {
-        var location = element.location;
+        var location = element.location!;
         expect(location.offset, testCode.indexOf('FTA<K, V>('));
         expect(location.length, 'FTA'.length);
       }
@@ -1214,7 +1211,7 @@
       expect(element.name, 'FTB');
       expect(element.typeParameters, isNull);
       {
-        var location = element.location;
+        var location = element.location!;
         expect(location.offset, testCode.indexOf('FTB('));
         expect(location.length, 'FTB'.length);
       }
@@ -1229,7 +1226,7 @@
       expect(element.name, 'GTAF');
       expect(element.typeParameters, '<T>');
       {
-        var location = element.location;
+        var location = element.location!;
         expect(location.offset, testCode.indexOf('GTAF<T> ='));
         expect(location.length, 'GTAF'.length);
       }
@@ -1244,7 +1241,7 @@
       expect(element.name, 'CTA');
       expect(element.typeParameters, '<T>');
       {
-        var location = element.location;
+        var location = element.location!;
         expect(location.offset, testCode.indexOf('CTA<T> ='));
         expect(location.length, 'CTA'.length);
       }
@@ -1267,7 +1264,7 @@
       expect(element.kind, ElementKind.FUNCTION);
       expect(element.name, 'fA');
       {
-        var location = element.location;
+        var location = element.location!;
         expect(location.offset, testCode.indexOf('fA('));
         expect(location.length, 'fA'.length);
       }
@@ -1281,7 +1278,7 @@
       expect(element.kind, ElementKind.FUNCTION);
       expect(element.name, 'fB');
       {
-        var location = element.location;
+        var location = element.location!;
         expect(location.offset, testCode.indexOf('fB('));
         expect(location.length, 'fB'.length);
       }
@@ -1295,7 +1292,7 @@
       expect(element.kind, ElementKind.GETTER);
       expect(element.name, 'propA');
       {
-        var location = element.location;
+        var location = element.location!;
         expect(location.offset, testCode.indexOf('propA => null;'));
         expect(location.length, 'propA'.length);
       }
@@ -1309,7 +1306,7 @@
       expect(element.kind, ElementKind.SETTER);
       expect(element.name, 'propB');
       {
-        var location = element.location;
+        var location = element.location!;
         expect(location.offset, testCode.indexOf('propB(int v) {}'));
         expect(location.length, 'propB'.length);
       }
@@ -1319,15 +1316,15 @@
   }
 
   void _expect(Outline outline,
-      {ElementKind kind,
+      {ElementKind? kind,
       bool leaf = false,
-      int length,
-      String name,
-      int offset,
-      String parameters,
-      String returnType}) {
+      int? length,
+      String? name,
+      int? offset,
+      String? parameters,
+      String? returnType}) {
     var element = outline.element;
-    var location = element.location;
+    var location = element.location!;
 
     if (kind != null) {
       expect(element.kind, kind);
diff --git a/tools/VERSION b/tools/VERSION
index f94b5ca..5e77d8c 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 13
 PATCH 0
-PRERELEASE 199
+PRERELEASE 200
 PRERELEASE_PATCH 0
\ No newline at end of file
