diff --git a/DEPS b/DEPS
index 4ca4eda..b63cd01 100644
--- a/DEPS
+++ b/DEPS
@@ -45,7 +45,7 @@
   # hashes. It requires access to the dart-build-access group, which EngProd
   # has.
   "co19_rev": "812ab751c41fe8d706fd1e4aae62d2dea2887ac2",
-  "co19_2_rev": "3642f24e2e6273c6fb65a8f60cd0edc95153942e",
+  "co19_2_rev": "f7f583366396cb1457e58c9bfb6d6e53dc21d741",
 
   # The internal benchmarks to use. See go/dart-benchmarks-internal
   "benchmarks_internal_rev": "076df10d9b77af337f2d8029725787155eb1cd52",
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart
index 76c3ebc..31f5089 100644
--- a/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart
@@ -576,7 +576,7 @@
       });
 
       test('on implicit this/super', () {
-        var h = Harness();
+        var h = Harness(thisType: 'C')..addMember('C', 'f', 'Object?');
         h.run([
           if_(thisOrSuperPropertyGet('f').is_('Null'), [
             if_(thisOrSuperPropertyGet('f').eq(nullLiteral), [
@@ -1511,7 +1511,7 @@
       });
 
       test('on implicit this/super', () {
-        var h = Harness();
+        var h = Harness(thisType: 'C')..addMember('C', 'f', 'Object?');
         h.run([
           if_(thisOrSuperPropertyGet('f').is_('Never'), [
             checkReachable(true),
@@ -5613,7 +5613,7 @@
       });
 
       test('via implicit this/super', () {
-        var h = Harness();
+        var h = Harness(thisType: 'C')..addMember('C', 'field', 'Object?');
         h.run([
           if_(thisOrSuperPropertyGet('field').eq(nullLiteral), [
             return_(),
diff --git a/pkg/_fe_analyzer_shared/test/mini_ast.dart b/pkg/_fe_analyzer_shared/test/mini_ast.dart
index a43f4ac..a7f5ac3 100644
--- a/pkg/_fe_analyzer_shared/test/mini_ast.dart
+++ b/pkg/_fe_analyzer_shared/test/mini_ast.dart
@@ -149,8 +149,8 @@
         {required bool isExhaustive}) =>
     new _Switch(expression, cases, isExhaustive);
 
-Expression thisOrSuperPropertyGet(String name, {String type = 'Object?'}) =>
-    new _ThisOrSuperPropertyGet(name, Type(type));
+Expression thisOrSuperPropertyGet(String name) =>
+    new _ThisOrSuperPropertyGet(name);
 
 Expression throw_(Expression operand) => new _Throw(operand);
 
@@ -1575,15 +1575,14 @@
 class _ThisOrSuperPropertyGet extends Expression {
   final String propertyName;
 
-  final Type type;
-
-  _ThisOrSuperPropertyGet(this.propertyName, this.type);
+  _ThisOrSuperPropertyGet(this.propertyName);
 
   @override
   void _preVisit(AssignedVariables<Node, Var> assignedVariables) {}
 
   @override
   Type _visit(Harness h) {
+    var type = h.getMember(h.thisType!, propertyName);
     h._flow.thisOrSuperPropertyGet(this, propertyName, propertyName, type);
     return type;
   }
@@ -1614,7 +1613,6 @@
   final Statement _body;
   final List<_CatchClause> _catches;
   final Statement? _finally;
-  final _bodyNode = Node._();
 
   _TryStatement(this._body, this._catches, this._finally) : super._();
 
@@ -1641,7 +1639,7 @@
       assignedVariables.beginNode();
     }
     _body._preVisit(assignedVariables);
-    assignedVariables.endNode(_bodyNode);
+    assignedVariables.endNode(_body);
     for (var catch_ in _catches) {
       catch_._preVisit(assignedVariables);
     }
@@ -1663,15 +1661,15 @@
     }
     _body._visit(h);
     if (_catches.isNotEmpty) {
-      h._flow.tryCatchStatement_bodyEnd(_bodyNode);
+      h._flow.tryCatchStatement_bodyEnd(_body);
       for (var catch_ in _catches) {
         catch_._visit(h);
       }
       h._flow.tryCatchStatement_end();
     }
     if (_finally != null) {
-      h._flow.tryFinallyStatement_finallyBegin(
-          _catches.isNotEmpty ? this : _bodyNode);
+      h._flow
+          .tryFinallyStatement_finallyBegin(_catches.isNotEmpty ? this : _body);
       _finally!._visit(h);
       h._flow.tryFinallyStatement_end();
     }
diff --git a/pkg/analysis_server/lib/src/provisional/completion/dart/completion_dart.dart b/pkg/analysis_server/lib/src/provisional/completion/dart/completion_dart.dart
index de9c92b..cf8cad0 100644
--- a/pkg/analysis_server/lib/src/provisional/completion/dart/completion_dart.dart
+++ b/pkg/analysis_server/lib/src/provisional/completion/dart/completion_dart.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/provisional/completion/completion_core.dart';
 import 'package:analysis_server/src/services/completion/dart/feature_computer.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
@@ -35,14 +33,14 @@
 
   /// Return the type imposed on the target's `containingNode` based on its
   /// context, or `null` if the context does not impose any type.
-  DartType get contextType;
+  DartType? get contextType;
 
   /// Return the object used to resolve macros in Dartdoc comments.
   DartdocDirectiveInfo get dartdocDirectiveInfo;
 
   /// Return the expression to the right of the "dot" or "dot dot",
   /// or `null` if this is not a "dot" completion (e.g. `foo.b`).
-  Expression get dotTarget;
+  Expression? get dotTarget;
 
   /// Return the object used to compute the values of the features used to
   /// compute relevance scores for suggestions.
@@ -61,13 +59,13 @@
   /// Return the library element which contains the unit in which the completion
   /// is occurring. This may return `null` if the library cannot be determined
   /// (e.g. unlinked part file).
-  LibraryElement get libraryElement;
+  LibraryElement? get libraryElement;
 
   /// The source for the library containing the completion request.
   /// This may be different from the source in which the completion is requested
   /// if the completion is being requested in a part file.
   /// This may be `null` if the library for a part file cannot be determined.
-  Source get librarySource;
+  Source? get librarySource;
 
   /// Answer the [DartType] for Object in dart:core
   DartType get objectType;
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart
index 5274710..e47f4f0 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.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/provisional/completion/completion_core.dart';
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
@@ -17,15 +15,15 @@
 /// correspond to named parameters when completing in argument lists.
 class ArgListContributor extends DartCompletionContributor {
   /// The request that is currently being handled.
-  DartCompletionRequest request;
+  late DartCompletionRequest request;
 
   /// The suggestion builder used to build suggestions.
-  SuggestionBuilder builder;
+  late SuggestionBuilder builder;
 
   /// The argument list that is the containing node of the target, or `null` if
   /// the containing node of the target is not an argument list (such as when
   /// it's a named expression).
-  ArgumentList argumentList;
+  ArgumentList? argumentList;
 
   @override
   Future<void> computeSuggestions(
@@ -47,7 +45,7 @@
   }
 
   void _addDefaultParamSuggestions(Iterable<ParameterElement> parameters,
-      {bool appendComma = false, int replacementLength}) {
+      {bool appendComma = false, int? replacementLength}) {
     var appendColon = !_isInNamedExpression();
     var namedArgs = _namedArgs();
     for (var parameter in parameters) {
@@ -61,7 +59,7 @@
 
   void _addNamedParameterSuggestion(List<String> namedArgs,
       ParameterElement parameter, bool appendColon, bool appendComma,
-      {int replacementLength}) {
+      {int? replacementLength}) {
     var name = parameter.name;
 
     // Check whether anything after the caret is being replaced. If so, we will
@@ -74,7 +72,7 @@
         request.completionPreference == CompletionPreference.replace &&
             replacementEnd > request.offset;
 
-    if (name != null && name.isNotEmpty && !namedArgs.contains(name)) {
+    if (name.isNotEmpty && !namedArgs.contains(name)) {
       builder.suggestNamedArgument(parameter,
           // If there's a replacement length and the preference is to replace,
           // we should not include colons/commas.
@@ -85,7 +83,7 @@
   }
 
   void _addSuggestions(Iterable<ParameterElement> parameters) {
-    if (parameters == null || parameters.isEmpty) {
+    if (parameters.isEmpty) {
       return;
     }
     var requiredParam =
@@ -110,7 +108,7 @@
         // for an identifier that is not the named label and therefore it should
         // not be replaced.
         var replacementLength =
-            request.offset == request.target.entity.offset &&
+            request.offset == request.target.entity?.offset &&
                     request.replacementRange.length != 0
                 ? 0
                 : null;
@@ -135,6 +133,7 @@
 
   /// Return the number of arguments in the argument list.
   int _argCount() {
+    var argumentList = this.argumentList;
     if (argumentList != null) {
       var paren = argumentList.rightParenthesis;
       if (request.target.entity == paren) {
@@ -157,11 +156,15 @@
     }
   }
 
-  /// Return `true` if the caret is preceeding an arg where a name could be added
+  /// Return `true` if the caret is preceding an arg where a name could be added
   /// (turning a positional arg into a named arg).
   bool _isAddingLabelToPositional() {
+    var argumentList = this.argumentList;
     if (argumentList != null) {
       var entity = request.target.entity;
+      if (entity is! Expression) {
+        return false;
+      }
       if (entity is! NamedExpression) {
         // Caret is in front of a value
         //     f(one: 1, ^2);
@@ -191,6 +194,7 @@
   /// Return `true` if the completion target is at the end of the list of
   /// arguments.
   bool _isAppendingToArgList() {
+    var argumentList = this.argumentList;
     if (argumentList != null) {
       var entity = request.target.entity;
       if (entity == argumentList.rightParenthesis) {
@@ -231,17 +235,16 @@
         : entity is Token
             ? entity
             : null;
-    return (token != containingNode?.endToken) &&
+    return (token != containingNode.endToken) &&
         token?.next?.type == TokenType.COMMA &&
-        !token.next.isSynthetic;
+        !(token?.next?.isSynthetic ?? false);
   }
 
   bool _isInFlutterCreation() {
     var flutter = Flutter.instance;
-    var containingNode = request.target?.containingNode;
-    var newExpr = containingNode != null
-        ? flutter.identifyNewExpression(containingNode.parent)
-        : null;
+    var containingNode = request.target.containingNode;
+    var parent = containingNode.parent;
+    var newExpr = parent != null ? flutter.identifyNewExpression(parent) : null;
     return newExpr != null && flutter.isWidgetCreation(newExpr);
   }
 
@@ -272,10 +275,11 @@
   /// [_isInsertingToArgListWithNoSynthetic] have been called and both returned
   /// `false`.
   bool _isInsertingToArgListWithSynthetic() {
+    var argumentList = this.argumentList;
     if (argumentList != null) {
       var entity = request.target.entity;
       if (entity is SimpleIdentifier) {
-        var argIndex = request.target.argIndex;
+        var argIndex = request.target.argIndex!;
         // if the next argument is a NamedExpression, then we are in the named
         // parameter list, guard first against end of list
         if (argumentList.arguments.length == argIndex + 1 ||
@@ -291,6 +295,7 @@
   /// Return a list containing the currently specified named arguments.
   List<String> _namedArgs() {
     var namedArgs = <String>[];
+    var argumentList = this.argumentList;
     if (argumentList != null) {
       for (var arg in argumentList.arguments) {
         if (arg is NamedExpression) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/combinator_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/combinator_contributor.dart
index c774a4e..3f08723 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/combinator_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/combinator_contributor.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/protocol_server.dart'
     hide Element, ElementKind;
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
@@ -24,7 +22,7 @@
     // Build the list of suggestions.
     var directive = node.thisOrAncestorOfType<NamespaceDirective>();
     if (directive is NamespaceDirective) {
-      var library = directive.uriElement as LibraryElement;
+      var library = directive.uriElement as LibraryElement?;
       if (library != null) {
         var existingNames = _getCombinatorNames(directive);
         for (var element in library.exportNamespace.definedNames.values) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart
index e0232fb..b9f376a 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart
@@ -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/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -12,12 +10,13 @@
 import 'package:analyzer/src/dart/element/generic_inferrer.dart'
     show GenericInferrer;
 import 'package:analyzer/src/dart/element/type_algebra.dart';
+import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/dart/resolver/scope.dart';
 
 /// A contributor that produces suggestions based on the members of an
 /// extension.
 class ExtensionMemberContributor extends DartCompletionContributor {
-  MemberSuggestionBuilder memberBuilder;
+  late MemberSuggestionBuilder memberBuilder;
 
   @override
   Future<void> computeSuggestions(
@@ -38,8 +37,10 @@
       var classOrMixin = request.target.containingNode
           .thisOrAncestorOfType<ClassOrMixinDeclaration>();
       if (classOrMixin != null) {
-        var type = classOrMixin.declaredElement.thisType;
-        _addExtensionMembers(containingLibrary, type);
+        var type = classOrMixin.declaredElement?.thisType;
+        if (type != null) {
+          _addExtensionMembers(containingLibrary, type);
+        }
       } else {
         var extension = request.target.containingNode
             .thisOrAncestorOfType<ExtensionDeclaration>();
@@ -76,7 +77,10 @@
       }
     }
     if (expression is ExtensionOverride) {
-      _addInstanceMembers(expression.staticElement, 0.0);
+      var staticElement = expression.staticElement;
+      if (staticElement != null) {
+        _addInstanceMembers(staticElement, 0.0);
+      }
     } else {
       var type = expression.staticType;
       if (type == null) {
@@ -140,13 +144,14 @@
   /// Use the [type] of the object being extended in the [library] to compute
   /// the actual type extended by the [extension]. Return the computed type,
   /// or `null` if the type cannot be computed.
-  DartType _resolveExtendedType(
+  DartType? _resolveExtendedType(
     LibraryElement library,
     ExtensionElement extension,
     DartType type,
   ) {
     var typeParameters = extension.typeParameters;
-    var inferrer = GenericInferrer(library.typeSystem, typeParameters);
+    var inferrer =
+        GenericInferrer(library.typeSystem as TypeSystemImpl, typeParameters);
     inferrer.constrainArgument(
       type,
       extension.extendedType,
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart b/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart
index 9fd0c36..f6d2263 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart
@@ -314,7 +314,7 @@
 
   /// Return the value of the _is noSuchMethod_ feature.
   double isNoSuchMethodFeature(
-      String containingMethodName, String proposedMemberName) {
+      String? containingMethodName, String proposedMemberName) {
     if (proposedMemberName == containingMethodName) {
       // Don't penalize `noSuchMethod` when completing after `super` in an
       // override of `noSuchMethod`.
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/field_formal_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/field_formal_contributor.dart
index b322111..e722f99 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/field_formal_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/field_formal_contributor.dart
@@ -2,11 +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 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
 
 /// A contributor that produces suggestions for field formal parameters that are
 /// based on the fields declared directly by the enclosing class that are not
@@ -35,13 +34,13 @@
     var referencedFields = <String>[];
     for (var param in constructor.parameters.parameters) {
       if (param is DefaultFormalParameter) {
-        param = (param as DefaultFormalParameter).parameter;
+        param = param.parameter;
       }
       if (param is FieldFormalParameter) {
         var fieldId = param.identifier;
-        if (fieldId != null && fieldId != request.target.entity) {
+        if (fieldId != request.target.entity) {
           var fieldName = fieldId.name;
-          if (fieldName != null && fieldName.isNotEmpty) {
+          if (fieldName.isNotEmpty) {
             referencedFields.add(fieldName);
           }
         }
@@ -58,9 +57,9 @@
       if (member is FieldDeclaration && !member.isStatic) {
         for (var variable in member.fields.variables) {
           var field = variable.name.staticElement;
-          if (field != null) {
+          if (field is FieldElement) {
             var fieldName = field.name;
-            if (fieldName != null && fieldName.isNotEmpty) {
+            if (fieldName.isNotEmpty) {
               if (!referencedFields.contains(fieldName)) {
                 builder.suggestFieldFormalParameter(field);
               }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/imported_reference_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/imported_reference_contributor.dart
index dd993ba..deb2cb7 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/imported_reference_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/imported_reference_contributor.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/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/local_library_contributor.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart'
@@ -19,7 +17,7 @@
       return;
     }
 
-    var imports = request.libraryElement.imports;
+    var imports = request.libraryElement?.imports;
     if (imports == null) {
       return;
     }
@@ -36,7 +34,7 @@
 
   void _buildSuggestions(DartCompletionRequest request,
       SuggestionBuilder builder, Namespace namespace,
-      {String prefix}) {
+      {String? prefix}) {
     var visitor = LibraryElementSuggestionBuilder(request, builder, prefix);
     for (var elem in namespace.definedNames.values) {
       elem.accept(visitor);
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/library_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/library_member_contributor.dart
index 634cae3..18ebdde 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/library_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/library_member_contributor.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/protocol_server.dart'
     show CompletionSuggestionKind;
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
@@ -29,10 +27,7 @@
         // determined (e.g. detached part file or source change).
         if (containingLibrary != null) {
           var imports = containingLibrary.imports;
-          if (imports != null) {
-            _buildSuggestions(request, builder, elem, imports);
-            return;
-          }
+          _buildSuggestions(request, builder, elem, imports);
         }
       }
     }
@@ -45,7 +40,7 @@
       List<ImportElement> imports) {
     var parent = request.target.containingNode.parent;
     var typesOnly = parent is TypeName;
-    var isConstructor = parent.parent is ConstructorName;
+    var isConstructor = parent?.parent is ConstructorName;
     for (var importElem in imports) {
       if (importElem.prefix?.name == elem.name) {
         var library = importElem.importedLibrary;
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/library_prefix_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/library_prefix_contributor.dart
index 2ec7b23..d8a09fb 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/library_prefix_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/library_prefix_contributor.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/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 
@@ -17,7 +15,7 @@
       return;
     }
 
-    var imports = request.libraryElement.imports;
+    var imports = request.libraryElement?.imports;
     if (imports == null) {
       return;
     }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart
index 279f4fb..c767698 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart
@@ -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/protocol_server.dart'
     show CompletionSuggestionKind;
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
@@ -25,18 +23,25 @@
 
   CompletionSuggestionKind kind;
 
-  final String prefix;
+  final String? prefix;
 
   /// The set of libraries that have been, or are currently being, visited.
   final Set<LibraryElement> visitedLibraries = <LibraryElement>{};
 
-  LibraryElementSuggestionBuilder(this.request, this.builder, [this.prefix])
-      : opType = request.opType {
-    kind = request.target.isFunctionalArgument()
+  factory LibraryElementSuggestionBuilder(
+      DartCompletionRequest request, SuggestionBuilder builder,
+      [String? prefix]) {
+    var opType = request.opType;
+    var kind = request.target.isFunctionalArgument()
         ? CompletionSuggestionKind.IDENTIFIER
         : opType.suggestKind;
+    return LibraryElementSuggestionBuilder._(
+        request, builder, opType, kind, prefix);
   }
 
+  LibraryElementSuggestionBuilder._(
+      this.request, this.builder, this.opType, this.kind, this.prefix);
+
   @override
   void visitClassElement(ClassElement element) {
     if (opType.includeTypeNameSuggestions) {
@@ -84,7 +89,7 @@
       return;
     }
     var returnType = element.returnType;
-    if (returnType != null && returnType.isVoid) {
+    if (returnType.isVoid) {
       if (opType.includeVoidReturnSuggestions) {
         builder.suggestTopLevelFunction(element, kind: kind, prefix: prefix);
       }
@@ -153,14 +158,14 @@
       return;
     }
 
-    var libraryUnits = request.result.unit.declaredElement.library.units;
+    var libraryUnits = request.result.unit?.declaredElement?.library.units;
     if (libraryUnits == null) {
       return;
     }
 
     var visitor = LibraryElementSuggestionBuilder(request, builder);
     for (var unit in libraryUnits) {
-      if (unit != null && unit.source != request.source) {
+      if (unit.source != request.source) {
         unit.accept(visitor);
       }
     }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
index 546c236..728ea51 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
@@ -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/protocol_server.dart'
     show CompletionSuggestionKind;
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
@@ -15,7 +13,6 @@
 import 'package:analyzer_plugin/src/utilities/completion/optype.dart';
 import 'package:analyzer_plugin/src/utilities/visitors/local_declaration_visitor.dart'
     show LocalDeclarationVisitor;
-import 'package:meta/meta.dart';
 
 /// A contributor that produces suggestions based on the declarations in the
 /// local file and containing library.  This contributor also produces
@@ -24,10 +21,10 @@
 /// inherited instance member might be invoked via an implicit target of `this`.
 class LocalReferenceContributor extends DartCompletionContributor {
   /// The builder used to build some suggestions.
-  MemberSuggestionBuilder memberBuilder;
+  late MemberSuggestionBuilder memberBuilder;
 
   /// The kind of suggestion to make.
-  CompletionSuggestionKind classMemberSuggestionKind;
+  CompletionSuggestionKind? classMemberSuggestionKind;
 
   /// The [_VisibilityTracker] tracks the set of elements already added in the
   /// completion list, this object helps prevents suggesting elements that have
@@ -38,7 +35,7 @@
   Future<void> computeSuggestions(
       DartCompletionRequest request, SuggestionBuilder builder) async {
     var opType = request.opType;
-    var node = request.target.containingNode;
+    AstNode? node = request.target.containingNode;
 
     // Suggest local fields for constructor initializers.
     var suggestLocalFields = node is ConstructorDeclaration &&
@@ -62,16 +59,19 @@
         if (node is ForStatement && node.forLoopParts is ForEachParts) {
           node = node.parent;
         } else if (node is ForEachParts) {
-          node = node.parent.parent;
+          node = node.parent?.parent;
         }
 
-        try {
-          builder.laterReplacesEarlier = false;
-          var localVisitor = _LocalVisitor(request, builder, visibilityTracker,
-              suggestLocalFields: suggestLocalFields);
-          localVisitor.visit(node);
-        } finally {
-          builder.laterReplacesEarlier = true;
+        if (node != null) {
+          try {
+            builder.laterReplacesEarlier = false;
+            var localVisitor = _LocalVisitor(
+                request, builder, visibilityTracker,
+                suggestLocalFields: suggestLocalFields);
+            localVisitor.visit(node);
+          } finally {
+            builder.laterReplacesEarlier = true;
+          }
         }
       }
     }
@@ -81,10 +81,12 @@
       var member = _enclosingMember(request.target);
       if (member != null) {
         var classOrMixin = member.parent;
-        if (classOrMixin is ClassOrMixinDeclaration &&
-            classOrMixin.declaredElement != null) {
-          memberBuilder = MemberSuggestionBuilder(request, builder);
-          _computeSuggestionsForClass(classOrMixin.declaredElement, request);
+        if (classOrMixin is ClassOrMixinDeclaration) {
+          var declaredElement = classOrMixin.declaredElement;
+          if (declaredElement != null) {
+            memberBuilder = MemberSuggestionBuilder(request, builder);
+            _computeSuggestionsForClass(declaredElement, request);
+          }
         }
       }
     }
@@ -113,12 +115,7 @@
     }
     for (var method in type.methods) {
       if (visibilityTracker._isVisible(method.declaration)) {
-        if (method.returnType == null) {
-          memberBuilder.addSuggestionForMethod(
-              method: method,
-              inheritanceDistance: inheritanceDistance,
-              kind: classMemberSuggestionKind);
-        } else if (!method.returnType.isVoid) {
+        if (!method.returnType.isVoid) {
           if (opType.includeReturnValueSuggestions) {
             memberBuilder.addSuggestionForMethod(
                 method: method,
@@ -153,8 +150,8 @@
 
   /// Return the class member containing the target or `null` if the target is
   /// in a static method or static field or not in a class member.
-  ClassMember _enclosingMember(CompletionTarget target) {
-    var node = target.containingNode;
+  ClassMember? _enclosingMember(CompletionTarget target) {
+    AstNode? node = target.containingNode;
     while (node != null) {
       if (node is MethodDeclaration) {
         if (!node.isStatic) {
@@ -199,9 +196,8 @@
   _VisibilityTracker visibilityTracker;
 
   _LocalVisitor(this.request, this.builder, this.visibilityTracker,
-      {@required this.suggestLocalFields})
-      : assert(visibilityTracker != null),
-        opType = request.opType,
+      {required this.suggestLocalFields})
+      : opType = request.opType,
         targetIsFunctionalArgument = request.target.isFunctionalArgument(),
         super(request.offset);
 
@@ -212,7 +208,7 @@
   @override
   void declaredClass(ClassDeclaration declaration) {
     var classElt = declaration.declaredElement;
-    if (visibilityTracker._isVisible(classElt)) {
+    if (classElt != null && visibilityTracker._isVisible(classElt)) {
       if (opType.includeTypeNameSuggestions) {
         builder.suggestClass(classElt, kind: _defaultKind);
       }
@@ -233,8 +229,9 @@
 
   @override
   void declaredClassTypeAlias(ClassTypeAlias declaration) {
-    if (opType.includeTypeNameSuggestions) {
-      builder.suggestClass(declaration.declaredElement, kind: _defaultKind);
+    var declaredElement = declaration.declaredElement;
+    if (declaredElement != null && opType.includeTypeNameSuggestions) {
+      builder.suggestClass(declaredElement, kind: _defaultKind);
     }
   }
 
@@ -245,12 +242,17 @@
 
   @override
   void declaredEnum(EnumDeclaration declaration) {
-    if (visibilityTracker._isVisible(declaration.declaredElement) &&
+    var declaredElement = declaration.declaredElement;
+    if (declaredElement != null &&
+        visibilityTracker._isVisible(declaredElement) &&
         opType.includeTypeNameSuggestions) {
-      builder.suggestClass(declaration.declaredElement, kind: _defaultKind);
+      builder.suggestClass(declaredElement, kind: _defaultKind);
       for (var enumConstant in declaration.constants) {
         if (!enumConstant.isSynthetic) {
-          builder.suggestEnumConstant(enumConstant.declaredElement);
+          var constantElement = enumConstant.declaredElement;
+          if (constantElement is FieldElement) {
+            builder.suggestEnumConstant(constantElement);
+          }
         }
       }
     }
@@ -258,27 +260,33 @@
 
   @override
   void declaredExtension(ExtensionDeclaration declaration) {
-    if (visibilityTracker._isVisible(declaration.declaredElement) &&
+    var declaredElement = declaration.declaredElement;
+    if (declaredElement != null &&
+        visibilityTracker._isVisible(declaredElement) &&
         opType.includeReturnValueSuggestions &&
         declaration.name != null) {
-      builder.suggestExtension(declaration.declaredElement, kind: _defaultKind);
+      builder.suggestExtension(declaredElement, kind: _defaultKind);
     }
   }
 
   @override
   void declaredField(FieldDeclaration fieldDecl, VariableDeclaration varDecl) {
     var field = varDecl.declaredElement;
-    if ((visibilityTracker._isVisible(field) &&
-            opType.includeReturnValueSuggestions &&
-            (!opType.inStaticMethodBody || fieldDecl.isStatic)) ||
-        suggestLocalFields) {
+    if (field is FieldElement &&
+        ((visibilityTracker._isVisible(field) &&
+                opType.includeReturnValueSuggestions &&
+                (!opType.inStaticMethodBody || fieldDecl.isStatic)) ||
+            suggestLocalFields)) {
       var inheritanceDistance = 0.0;
       var enclosingClass = request.target.containingNode
           .thisOrAncestorOfType<ClassDeclaration>();
-      if (enclosingClass != null) {
-        inheritanceDistance = request.featureComputer
-            .inheritanceDistanceFeature(
-                enclosingClass.declaredElement, field.enclosingElement);
+      var enclosingElement = enclosingClass?.declaredElement;
+      if (enclosingElement != null) {
+        var enclosingElement = field.enclosingElement;
+        if (enclosingElement is ClassElement) {
+          inheritanceDistance = request.featureComputer
+              .inheritanceDistanceFeature(enclosingElement, enclosingElement);
+        }
       }
       builder.suggestField(field, inheritanceDistance: inheritanceDistance);
     }
@@ -311,15 +319,18 @@
 
   @override
   void declaredFunctionTypeAlias(FunctionTypeAlias declaration) {
-    if (opType.includeTypeNameSuggestions) {
-      builder.suggestTypeAlias(declaration.declaredElement, kind: _defaultKind);
+    var declaredElement = declaration.declaredElement;
+    if (declaredElement != null && opType.includeTypeNameSuggestions) {
+      builder.suggestTypeAlias(declaredElement, kind: _defaultKind);
     }
   }
 
   @override
   void declaredGenericTypeAlias(GenericTypeAlias declaration) {
-    if (opType.includeTypeNameSuggestions) {
-      builder.suggestTypeAlias(declaration.declaredElement, kind: _defaultKind);
+    var declaredElement = declaration.declaredElement;
+    if (declaredElement is TypeAliasElement &&
+        opType.includeTypeNameSuggestions) {
+      builder.suggestTypeAlias(declaredElement, kind: _defaultKind);
     }
   }
 
@@ -329,10 +340,10 @@
   }
 
   @override
-  void declaredLocalVar(SimpleIdentifier id, TypeAnnotation typeName) {
-    if (visibilityTracker._isVisible(id.staticElement) &&
+  void declaredLocalVar(SimpleIdentifier name, TypeAnnotation? type) {
+    if (visibilityTracker._isVisible(name.staticElement) &&
         opType.includeReturnValueSuggestions) {
-      builder.suggestLocalVariable(id.staticElement as LocalVariableElement);
+      builder.suggestLocalVariable(name.staticElement as LocalVariableElement);
     }
   }
 
@@ -347,9 +358,12 @@
       var enclosingClass = request.target.containingNode
           .thisOrAncestorOfType<ClassDeclaration>();
       if (enclosingClass != null) {
-        inheritanceDistance = request.featureComputer
-            .inheritanceDistanceFeature(
-                enclosingClass.declaredElement, element.enclosingElement);
+        var enclosingElement = element?.enclosingElement;
+        if (enclosingElement is ClassElement) {
+          inheritanceDistance = request.featureComputer
+              .inheritanceDistanceFeature(
+                  enclosingClass.declaredElement!, enclosingElement);
+        }
       }
       if (element is MethodElement) {
         builder.suggestMethod(element,
@@ -363,19 +377,21 @@
 
   @override
   void declaredMixin(MixinDeclaration declaration) {
+    var declaredElement = declaration.declaredElement;
     if (!inExtendsClause &&
-        visibilityTracker._isVisible(declaration.declaredElement) &&
+        declaredElement != null &&
+        visibilityTracker._isVisible(declaredElement) &&
         opType.includeTypeNameSuggestions) {
-      builder.suggestClass(declaration.declaredElement, kind: _defaultKind);
+      builder.suggestClass(declaredElement, kind: _defaultKind);
     }
   }
 
   @override
-  void declaredParam(SimpleIdentifier id, TypeAnnotation typeName) {
-    var element = id.staticElement;
+  void declaredParam(SimpleIdentifier name, TypeAnnotation? type) {
+    var element = name.staticElement;
     if (visibilityTracker._isVisible(element) &&
         opType.includeReturnValueSuggestions) {
-      if (_isUnused(id.name)) {
+      if (_isUnused(name.name)) {
         return;
       }
       if (element is ParameterElement) {
@@ -390,18 +406,23 @@
   void declaredTopLevelVar(
       VariableDeclarationList varList, VariableDeclaration varDecl) {
     var variableElement = varDecl.declaredElement;
-    if (visibilityTracker._isVisible(variableElement) &&
+    if (variableElement is TopLevelVariableElement &&
+        visibilityTracker._isVisible(variableElement) &&
         opType.includeReturnValueSuggestions) {
-      builder.suggestTopLevelPropertyAccessor(
-          (variableElement as TopLevelVariableElement).getter);
+      var getter = variableElement.getter;
+      if (getter != null) {
+        builder.suggestTopLevelPropertyAccessor(getter);
+      }
     }
   }
 
   @override
   void declaredTypeParameter(TypeParameter node) {
-    if (visibilityTracker._isVisible(node.declaredElement) &&
+    var declaredElement = node.declaredElement;
+    if (declaredElement != null &&
+        visibilityTracker._isVisible(declaredElement) &&
         opType.includeTypeNameSuggestions) {
-      builder.suggestTypeParameter(node.declaredElement);
+      builder.suggestTypeParameter(declaredElement);
     }
   }
 
@@ -415,10 +436,10 @@
   /// characters and nothing else.
   bool _isUnused(String identifier) => RegExp(r'^_+$').hasMatch(identifier);
 
-  bool _isVoid(TypeAnnotation returnType) {
+  bool _isVoid(TypeAnnotation? returnType) {
     if (returnType is TypeName) {
       var id = returnType.name;
-      if (id != null && id.name == 'void') {
+      if (id.name == 'void') {
         return true;
       }
     }
@@ -436,6 +457,8 @@
   /// Before completions are added by this contributor, we verify with this
   /// method if the element has already been added, this prevents suggesting
   /// [Element]s that are shadowed.
-  bool _isVisible(Element element) =>
-      element != null && declaredNames.add(element.name);
+  bool _isVisible(Element? element) {
+    var name = element?.name;
+    return name != null && declaredNames.add(name);
+  }
 }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart
index b31253f..a0cec5d 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.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/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -24,13 +22,11 @@
         return;
       }
       var typeName = node.type;
-      if (typeName != null) {
-        var type = typeName.type;
-        if (type != null) {
-          var element = type.element;
-          if (element is ClassElement) {
-            _buildSuggestions(request, builder, libraryElement, element);
-          }
+      var type = typeName.type;
+      if (type != null) {
+        var element = type.element;
+        if (element is ClassElement) {
+          _buildSuggestions(request, builder, libraryElement, element);
         }
       }
     }
@@ -45,10 +41,7 @@
     for (var constructor in classElem.constructors) {
       if (isLocalClassDecl || !constructor.isPrivate) {
         if (!classElem.isAbstract || constructor.isFactory) {
-          var name = constructor.name;
-          if (name != null) {
-            builder.suggestConstructor(constructor, hasClassName: true);
-          }
+          builder.suggestConstructor(constructor, hasClassName: true);
         }
       }
     }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart
index c18f91d..1cccc64 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.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/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -29,6 +27,9 @@
 
     // Generate a collection of inherited members
     var classElem = classDecl.declaredElement;
+    if (classElem == null) {
+      return;
+    }
     var interface = inheritance.getInterface(classElem);
     var interfaceMap = interface.map;
     var namesToOverride =
@@ -38,7 +39,7 @@
     for (var name in namesToOverride) {
       var element = interfaceMap[name];
       // Gracefully degrade if the overridden element has not been resolved.
-      if (element.returnType != null) {
+      if (element != null) {
         var invokeSuper = interface.isSuperImplemented(name);
         await builder.suggestOverride(targetId, element, invokeSuper);
       }
@@ -47,7 +48,7 @@
 
   /// If the target looks like a partial identifier inside a class declaration
   /// then return that identifier, otherwise return `null`.
-  SimpleIdentifier _getTargetId(CompletionTarget target) {
+  SimpleIdentifier? _getTargetId(CompletionTarget target) {
     var node = target.containingNode;
     if (node is ClassOrMixinDeclaration) {
       var entity = target.entity;
@@ -63,7 +64,7 @@
     return null;
   }
 
-  SimpleIdentifier _getTargetIdFromVarList(VariableDeclarationList fields) {
+  SimpleIdentifier? _getTargetIdFromVarList(VariableDeclarationList fields) {
     var variables = fields.variables;
     if (variables.length == 1) {
       var variable = variables[0];
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart
index cfd2a34..08bf0df 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart
@@ -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/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -30,7 +28,7 @@
     if (targetId is Identifier && !request.target.isCascade) {
       var element = targetId.staticElement;
       if (element is TypeAliasElement) {
-        var aliasedType = (element as TypeAliasElement).aliasedType;
+        var aliasedType = element.aliasedType;
         element = aliasedType.element;
       }
       if (element is ClassElement) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
index 43af352..d2ce0e3 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
@@ -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:collection';
 
 import 'package:_fe_analyzer_shared/src/base/syntactic_entity.dart';
@@ -25,7 +23,6 @@
 import 'package:analyzer/src/util/comment.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
-import 'package:meta/meta.dart';
 
 /// This class provides suggestions based upon the visible instance members in
 /// an interface type.
@@ -65,8 +62,8 @@
 
   /// Add a suggestion for the given [accessor].
   void addSuggestionForAccessor(
-      {@required PropertyAccessorElement accessor,
-      @required double inheritanceDistance}) {
+      {required PropertyAccessorElement accessor,
+      required double inheritanceDistance}) {
     if (accessor.isAccessibleIn(request.libraryElement)) {
       var member = accessor.isSynthetic ? accessor.variable : accessor;
       if (_shouldAddSuggestion(member)) {
@@ -78,9 +75,9 @@
 
   /// Add a suggestion for the given [method].
   void addSuggestionForMethod(
-      {@required MethodElement method,
-      CompletionSuggestionKind kind,
-      @required double inheritanceDistance}) {
+      {required MethodElement method,
+      CompletionSuggestionKind? kind,
+      required double inheritanceDistance}) {
     if (method.isAccessibleIn(request.libraryElement) &&
         _shouldAddSuggestion(method)) {
       builder.suggestMethod(method,
@@ -108,7 +105,8 @@
         if ((alreadyGenerated & _COMPLETION_TYPE_GETTER) != 0) {
           return false;
         }
-        _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) {
@@ -119,7 +117,8 @@
           // getter.
           return false;
         }
-        _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
@@ -146,7 +145,7 @@
 
   /// The listener to be notified at certain points in the process of building
   /// suggestions, or `null` if no notification should occur.
-  final SuggestionListener listener;
+  final SuggestionListener? listener;
 
   /// A map from a completion identifier to a completion suggestion.
   final Map<String, CompletionSuggestion> _suggestionMap =
@@ -167,7 +166,7 @@
   /// either the completion location isn't within a member, the target of the
   /// completion isn't `super`, or the name of the member hasn't yet been
   /// computed. In the latter case, [_hasContainingMemberName] will be `false`.
-  String _cachedContainingMemberName;
+  String? _cachedContainingMemberName;
 
   /// Initialize a newly created suggestion builder to build suggestions for the
   /// given [request].
@@ -183,17 +182,14 @@
   /// Return the name of the member containing the completion location, or
   /// `null` if the completion location isn't within a member or if the target
   /// of the completion isn't `super`.
-  String get _containingMemberName {
+  String? get _containingMemberName {
     if (!_hasContainingMemberName) {
       _hasContainingMemberName = true;
       if (request.dotTarget is SuperExpression) {
         var containingMethod = request.target.containingNode
             .thisOrAncestorOfType<MethodDeclaration>();
         if (containingMethod != null) {
-          var id = containingMethod.name;
-          if (id != null) {
-            _cachedContainingMemberName = id.name;
-          }
+          _cachedContainingMemberName = containingMethod.name.name;
         }
       }
     }
@@ -207,7 +203,7 @@
   /// distance feature computed for the accessor or `-1.0` if the accessor is a
   /// static accessor.
   void suggestAccessor(PropertyAccessorElement accessor,
-      {@required double inheritanceDistance}) {
+      {required double inheritanceDistance}) {
     assert(accessor.enclosingElement is ClassElement ||
         accessor.enclosingElement is ExtensionElement);
     if (accessor.isSynthetic) {
@@ -271,7 +267,7 @@
   /// referenced using a prefix, then the [prefix] should be provided.
   void suggestClass(ClassElement classElement,
       {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
-      String prefix}) {
+      String? prefix}) {
     var relevance = _computeTopLevelRelevance(classElement,
         elementType: _instantiateClassElement(classElement));
     _add(_createSuggestion(classElement,
@@ -302,9 +298,9 @@
     }
 
     CompletionSuggestion createSuggestion({
-      @required String completion,
-      @required String displayText,
-      @required int selectionOffset,
+      required String completion,
+      required String displayText,
+      required int selectionOffset,
     }) {
       return CompletionSuggestion(
         CompletionSuggestionKind.INVOCATION,
@@ -339,25 +335,25 @@
   void suggestConstructor(ConstructorElement constructor,
       {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
       bool hasClassName = false,
-      String prefix}) {
+      String? prefix}) {
     // If the class name is already in the text, then we don't support
     // prepending a prefix.
     assert(!hasClassName || prefix == null);
     var enclosingClass = constructor.enclosingElement;
-    var className = enclosingClass?.name;
-    if (className == null || className.isEmpty) {
+    var className = enclosingClass.name;
+    if (className.isEmpty) {
       return;
     }
 
     var completion = constructor.displayName;
-    if (!hasClassName && className != null && className.isNotEmpty) {
-      if (completion == null || completion.isEmpty) {
+    if (!hasClassName && className.isNotEmpty) {
+      if (completion.isEmpty) {
         completion = className;
       } else {
         completion = '$className.$completion';
       }
     }
-    if (completion == null || completion.isEmpty) {
+    if (completion.isEmpty) {
       return;
     }
 
@@ -396,7 +392,7 @@
 
   /// Add a suggestion for an enum [constant]. If the enum can only be
   /// referenced using a prefix, then the [prefix] should be provided.
-  void suggestEnumConstant(FieldElement constant, {String prefix}) {
+  void suggestEnumConstant(FieldElement constant, {String? prefix}) {
     var constantName = constant.name;
     var enumElement = constant.enclosingElement;
     var enumName = enumElement.name;
@@ -412,7 +408,7 @@
   /// referenced using a prefix, then the [prefix] should be provided.
   void suggestExtension(ExtensionElement extension,
       {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
-      String prefix}) {
+      String? prefix}) {
     var relevance = _computeTopLevelRelevance(extension,
         elementType: extension.extendedType);
     _add(_createSuggestion(extension,
@@ -424,8 +420,7 @@
   /// the member containing the reference. The [inheritanceDistance] is the
   /// value of the inheritance distance feature computed for the field (or
   /// `-1.0` if the field is a static field).
-  void suggestField(FieldElement field,
-      {@required double inheritanceDistance}) {
+  void suggestField(FieldElement field, {required double inheritanceDistance}) {
     var featureComputer = request.featureComputer;
     var contextType =
         featureComputer.contextTypeFeature(request.contextType, field.type);
@@ -485,8 +480,8 @@
 
   /// Add a suggestion for a [keyword]. The [offset] is the offset from the
   /// beginning of the keyword where the cursor will be left.
-  void suggestKeyword(String keyword, {int offset}) {
-    DartType elementType;
+  void suggestKeyword(String keyword, {int? offset}) {
+    DartType? elementType;
     if (keyword == 'null') {
       elementType = request.featureComputer.typeProvider.nullType;
     } else if (keyword == 'false' || keyword == 'true') {
@@ -506,10 +501,10 @@
 
   /// Add a suggestion for a [label].
   void suggestLabel(Label label) {
-    var completion = label.label?.name;
+    var completion = label.label.name;
     // TODO(brianwilkerson) Figure out why we're excluding labels consisting of
     //  a single underscore.
-    if (completion != null && completion.isNotEmpty && completion != '_') {
+    if (completion.isNotEmpty && completion != '_') {
       var suggestion = CompletionSuggestion(CompletionSuggestionKind.IDENTIFIER,
           Relevance.label, completion, completion.length, 0, false, false);
       suggestion.element = createLocalElement(
@@ -558,7 +553,7 @@
   /// used as the kind for the suggestion. The [inheritanceDistance] is the
   /// value of the inheritance distance feature computed for the method.
   void suggestMethod(MethodElement method,
-      {CompletionSuggestionKind kind, @required double inheritanceDistance}) {
+      {CompletionSuggestionKind? kind, required double inheritanceDistance}) {
     // TODO(brianwilkerson) Refactor callers so that we're passing in the type
     //  of the target (assuming we don't already have that type available via
     //  the [request]) and compute the [inheritanceDistance] in this method.
@@ -590,8 +585,10 @@
     var suggestion =
         _createSuggestion(method, kind: kind, relevance: relevance);
     if (suggestion != null) {
+      var enclosingElement = method.enclosingElement;
       if (method.name == 'setState' &&
-          flutter.isExactState(method.enclosingElement)) {
+          enclosingElement is ClassElement &&
+          flutter.isExactState(enclosingElement)) {
         // TODO(brianwilkerson) Make this more efficient by creating the correct
         //  suggestion in the first place.
         // Find the line indentation.
@@ -632,12 +629,13 @@
   /// [appendComma] is `true` then a comma will be included at the end of the
   /// completion text.
   void suggestNamedArgument(ParameterElement parameter,
-      {@required bool appendColon,
-      @required bool appendComma,
-      int replacementLength}) {
+      {required bool appendColon,
+      required bool appendComma,
+      int? replacementLength}) {
     var name = parameter.name;
-    var type = parameter.type?.getDisplayString(
-        withNullability: request.libraryElement.isNonNullableByDefault);
+    var type = parameter.type.getDisplayString(
+        withNullability:
+            request.libraryElement?.isNonNullableByDefault ?? false);
 
     var completion = name;
     if (appendColon) {
@@ -658,8 +656,9 @@
         if (defaultValue != null && defaultValue.text == '[]') {
           var completionLength = completion.length;
           completion += defaultValue.text;
-          if (defaultValue.cursorPosition != null) {
-            selectionOffset = completionLength + defaultValue.cursorPosition;
+          var cursorPosition = defaultValue.cursorPosition;
+          if (cursorPosition != null) {
+            selectionOffset = completionLength + cursorPosition;
           }
         }
       }
@@ -701,7 +700,7 @@
       ExecutableElement element, bool invokeSuper) async {
     var displayTextBuffer = StringBuffer();
     var builder = ChangeBuilder(session: request.result.session);
-    await builder.addDartFileEdit(request.result.path, (builder) {
+    await builder.addDartFileEdit(request.result.path!, (builder) {
       builder.addReplacement(range.node(targetId), (builder) {
         builder.writeOverride(
           element,
@@ -791,7 +790,7 @@
   /// referenced using a prefix, then the [prefix] should be provided.
   void suggestTopLevelFunction(FunctionElement function,
       {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
-      String prefix}) {
+      String? prefix}) {
     var relevance =
         _computeTopLevelRelevance(function, elementType: function.returnType);
     _add(_createSuggestion(function,
@@ -804,7 +803,7 @@
   /// provided.
   void suggestTopLevelPropertyAccessor(PropertyAccessorElement accessor,
       {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
-      String prefix}) {
+      String? prefix}) {
     assert(
         accessor.enclosingElement is CompilationUnitElement,
         'Enclosing element of ${accessor.runtimeType} is '
@@ -849,7 +848,7 @@
   /// referenced using a prefix, then the [prefix] should be provided.
   void suggestTopLevelVariable(TopLevelVariableElement variable,
       {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
-      String prefix}) {
+      String? prefix}) {
     assert(variable.enclosingElement is CompilationUnitElement);
     var relevance =
         _computeTopLevelRelevance(variable, elementType: variable.type);
@@ -862,7 +861,7 @@
   /// referenced using a prefix, then the [prefix] should be provided.
   void suggestTypeAlias(TypeAliasElement typeAlias,
       {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
-      String prefix}) {
+      String? prefix}) {
     var relevance = _computeTopLevelRelevance(typeAlias,
         elementType: _instantiateTypeAlias(typeAlias));
     _add(_createSuggestion(typeAlias,
@@ -893,7 +892,7 @@
 
   /// Add the given [suggestion] if it isn't `null` and if it isn't shadowed by
   /// a previously added suggestion.
-  void _add(protocol.CompletionSuggestion suggestion) {
+  void _add(protocol.CompletionSuggestion? suggestion) {
     if (suggestion != null) {
       var key = suggestion.completion;
       if (suggestion.element?.kind == protocol.ElementKind.CONSTRUCTOR) {
@@ -910,14 +909,14 @@
 
   /// Compute the value of the _element kind_ feature for the given [element] in
   /// the completion context.
-  double _computeElementKind(Element element, {double distance}) {
+  double _computeElementKind(Element element, {double? distance}) {
     var location = request.opType.completionLocation;
     var elementKind = request.featureComputer
         .elementKindFeature(element, location, distance: distance);
     if (elementKind < 0.0) {
       if (location == null) {
         listener?.missingCompletionLocationAt(
-            request.target.containingNode, request.target.entity);
+            request.target.containingNode, request.target.entity!);
       } else {
         listener?.missingElementKindTableFor(location);
       }
@@ -967,7 +966,7 @@
 
   /// Return the relevance score for a top-level [element].
   int _computeTopLevelRelevance(Element element,
-      {@required DartType elementType}) {
+      {required DartType elementType}) {
     // TODO(brianwilkerson) The old relevance computation used a signal based
     //  on whether the element being suggested was from the same library in
     //  which completion is being performed. Explore whether that's a useful
@@ -995,18 +994,18 @@
   /// than the kind normally used for the element. If a [prefix] is provided,
   /// then the element name (or completion) will be prefixed. The [relevance] is
   /// the relevance of the suggestion.
-  CompletionSuggestion _createSuggestion(Element element,
-      {String completion,
-      protocol.ElementKind elementKind,
-      CompletionSuggestionKind kind,
-      String prefix,
-      @required int relevance}) {
+  CompletionSuggestion? _createSuggestion(Element element,
+      {String? completion,
+      protocol.ElementKind? elementKind,
+      CompletionSuggestionKind? kind,
+      String? prefix,
+      required int relevance}) {
     if (element is ExecutableElement && element.isOperator) {
       // Do not include operators in suggestions
       return null;
     }
     completion ??= element.displayName;
-    if (completion == null || completion.isEmpty) {
+    if (completion.isEmpty) {
       return null;
     }
     if (prefix != null && prefix.isNotEmpty) {
@@ -1018,9 +1017,10 @@
 
     _setDocumentation(suggestion, element);
 
-    suggestion.element = protocol.convertElement(element);
+    var suggestedElement =
+        suggestion.element = protocol.convertElement(element);
     if (elementKind != null) {
-      suggestion.element.kind = elementKind;
+      suggestedElement.kind = elementKind;
     }
     var enclosingElement = element.enclosingElement;
     if (enclosingElement is ClassElement) {
@@ -1034,11 +1034,9 @@
       suggestion.parameterTypes =
           element.parameters.map((ParameterElement parameter) {
         var paramType = parameter.type;
-        // Gracefully degrade if type not resolved yet
-        return paramType != null
-            ? paramType.getDisplayString(
-                withNullability: request.libraryElement.isNonNullableByDefault)
-            : 'var';
+        return paramType.getDisplayString(
+            withNullability:
+                request.libraryElement?.isNonNullableByDefault ?? false);
       }).toList();
 
       var requiredParameters = element.parameters
@@ -1057,7 +1055,7 @@
 
   /// Return the type associated with the [accessor], maybe `null` if an
   /// invalid setter with no parameters at all.
-  DartType _getPropertyAccessorType(PropertyAccessorElement accessor) {
+  DartType? _getPropertyAccessorType(PropertyAccessorElement accessor) {
     if (accessor.isGetter) {
       return accessor.returnType;
     } else {
@@ -1074,7 +1072,7 @@
     var typeParameters = element.typeParameters;
     var typeArguments = const <DartType>[];
     if (typeParameters.isNotEmpty) {
-      var neverType = request.libraryElement.typeProvider.neverType;
+      var neverType = request.libraryElement!.typeProvider.neverType;
       typeArguments = List.filled(typeParameters.length, neverType);
     }
 
@@ -1092,7 +1090,7 @@
     var typeParameters = element.typeParameters;
     var typeArguments = const <DartType>[];
     if (typeParameters.isNotEmpty) {
-      var neverType = request.libraryElement.typeProvider.neverType;
+      var neverType = request.libraryElement!.typeProvider.neverType;
       typeArguments = List.filled(typeParameters.length, neverType);
     }
 
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart
index 19510c7..6b96dcf 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.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:collection';
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
@@ -22,13 +20,6 @@
   @override
   Future<void> computeSuggestions(
       DartCompletionRequest request, SuggestionBuilder builder) async {
-    var containingLibrary = request.libraryElement;
-    // Gracefully degrade if the library could not be determined, such as with a
-    // detached part file or source change.
-    if (containingLibrary == null) {
-      return;
-    }
-
     // Recompute the target because resolution might have changed it.
     var expression = request.dotTarget;
     if (expression == null ||
@@ -73,13 +64,13 @@
         }
       }
     }
-    List<InterfaceType> mixins;
-    List<InterfaceType> superclassConstraints;
+    List<InterfaceType>? mixins;
+    List<InterfaceType>? superclassConstraints;
     if (expression is SuperExpression && type is InterfaceType) {
       // Suggest members from superclass if target is "super".
-      mixins = (type as InterfaceType).mixins;
-      superclassConstraints = (type as InterfaceType).superclassConstraints;
-      type = (type as InterfaceType).superclass;
+      mixins = type.mixins;
+      superclassConstraints = type.superclassConstraints;
+      type = type.superclass;
     }
     if (type is FunctionType) {
       builder.suggestFunctionCall();
@@ -106,7 +97,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);
@@ -140,7 +131,10 @@
     if (declaration.name.name == targetName) {
       var typeName = declaration.returnType;
       if (typeName != null) {
-        typeFound = typeName.type;
+        var type = typeName.type;
+        if (type != null) {
+          typeFound = type;
+        }
       }
       finished();
     }
@@ -151,7 +145,10 @@
     if (declaration.name.name == targetName) {
       var typeName = declaration.returnType;
       if (typeName != null) {
-        typeFound = typeName.type;
+        var type = typeName.type;
+        if (type != null) {
+          typeFound = type;
+        }
       }
       finished();
     }
@@ -162,7 +159,10 @@
     if (declaration.name.name == targetName) {
       var typeName = declaration.functionType?.returnType;
       if (typeName != null) {
-        typeFound = typeName.type;
+        var type = typeName.type;
+        if (type != null) {
+          typeFound = type;
+        }
       }
       finished();
     }
@@ -177,7 +177,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;
@@ -190,14 +190,17 @@
     if (declaration.name.name == targetName) {
       var typeName = declaration.returnType;
       if (typeName != null) {
-        typeFound = typeName.type;
+        var type = typeName.type;
+        if (type != null) {
+          typeFound = type;
+        }
       }
       finished();
     }
   }
 
   @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();
@@ -225,7 +228,8 @@
   /// 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,
-      {List<InterfaceType> mixins, List<InterfaceType> superclassConstraints}) {
+      {List<InterfaceType>? mixins,
+      List<InterfaceType>? superclassConstraints}) {
     // 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
@@ -286,8 +290,9 @@
       // superclass, then the mixins.  This will ensure that they are visited
       // in the reverse order.
       typesToVisit.addAll(nextType.interfaces);
-      if (nextType.superclass != null) {
-        typesToVisit.add(nextType.superclass);
+      var superclass = nextType.superclass;
+      if (superclass != null) {
+        typesToVisit.add(superclass);
       }
       typesToVisit.addAll(nextType.superclassConstraints);
       typesToVisit.addAll(nextType.mixins);
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/uri_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/uri_contributor.dart
index 33dbf47..14fac8f 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/uri_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/uri_contributor.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:analysis_server/src/provisional/completion/dart/completion_dart.dart';
@@ -56,7 +54,7 @@
             // Quoted empty string
             visitSimpleStringLiteral(uri);
           } else {
-            var data = request.sourceContents;
+            var data = request.sourceContents!;
             if (end == data.length) {
               var ch = data[end - 1];
               if (ch != '"' && ch != "'") {
@@ -68,7 +66,7 @@
           }
         }
       } else if (offset == start && offset == end) {
-        var data = request.sourceContents;
+        var data = request.sourceContents!;
         if (end == data.length) {
           var ch = data[end - 1];
           if (ch == '"' || ch == "'") {
@@ -102,7 +100,7 @@
   void _addDartSuggestions() {
     builder.suggestUri('dart:');
     var factory = request.sourceFactory;
-    for (var lib in factory.dartSdk.sdkLibraries) {
+    for (var lib in factory.dartSdk!.sdkLibraries) {
       if (!lib.isInternal && !lib.isImplementation) {
         if (!lib.shortName.startsWith('dart:_')) {
           builder.suggestUri(lib.shortName);
@@ -158,7 +156,7 @@
     if (dir is Folder) {
       try {
         for (var child in dir.getChildren()) {
-          String completion;
+          String? completion;
           if (child is Folder) {
             if (!child.shortName.startsWith('.')) {
               completion = '$uriPrefix${child.shortName}/';
@@ -215,7 +213,7 @@
     }
   }
 
-  String _extractPartialUri(SimpleStringLiteral node) {
+  String? _extractPartialUri(SimpleStringLiteral node) {
     if (request.offset < node.contentsOffset) {
       return null;
     }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart b/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
index 75b43b9..466fc48 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/utilities.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 collection of utility methods used by completion contributors.
 import 'package:analysis_server/src/protocol_server.dart'
     show CompletionSuggestion, Location;
@@ -17,7 +15,6 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' as protocol
     show Element, ElementKind;
-import 'package:meta/meta.dart';
 
 /// The name of the type `dynamic`;
 const DYNAMIC = 'dynamic';
@@ -54,23 +51,22 @@
     }
     offset = sb.length;
 
-    if (param.type is FunctionType) {
-      FunctionType type = param.type;
-
+    var parameterType = param.type;
+    if (parameterType is FunctionType) {
       var rangeStart = offset;
       int rangeLength;
 
       // todo (pq): consider adding ranges for params
       // pending: https://github.com/dart-lang/sdk/issues/40207
       // (types in closure param completions make this UX awkward)
-      final parametersString = buildClosureParameters(type);
+      final parametersString = buildClosureParameters(parameterType);
       final blockBuffer = StringBuffer(parametersString);
 
       blockBuffer.write(' ');
 
       // todo (pq): consider refactoring to share common logic w/
       //  ArgListContributor.buildClosureSuggestions
-      final returnType = type.returnType;
+      final returnType = parameterType.returnType;
       if (returnType.isVoid) {
         blockBuffer.write('{');
         rangeStart = sb.length + blockBuffer.length;
@@ -147,20 +143,13 @@
 /// Create a new protocol Element for inclusion in a completion suggestion.
 protocol.Element createLocalElement(
     Source source, protocol.ElementKind kind, SimpleIdentifier id,
-    {String parameters,
-    TypeAnnotation returnType,
+    {String? parameters,
+    TypeAnnotation? returnType,
     bool isAbstract = false,
     bool isDeprecated = false}) {
-  String name;
-  Location location;
-  if (id != null) {
-    name = id.name;
-    // TODO(danrubel) use lineInfo to determine startLine and startColumn
-    location = Location(source.fullName, id.offset, id.length, 0, 0, 0, 0);
-  } else {
-    name = '';
-    location = Location(source.fullName, -1, 0, 1, 0, 1, 0);
-  }
+  var name = id.name;
+  // TODO(danrubel) use lineInfo to determine startLine and startColumn
+  var location = Location(source.fullName, id.offset, id.length, 0, 0, 0, 0);
   var flags = protocol.Element.makeFlags(
       isAbstract: isAbstract,
       isDeprecated: isDeprecated,
@@ -172,34 +161,31 @@
 }
 
 /// Return a default argument value for the given [parameter].
-DefaultArgument getDefaultStringParameterValue(ParameterElement parameter,
-    {@required bool withNullability}) {
-  if (parameter != null) {
-    var type = parameter.type;
-    if (type is InterfaceType) {
-      if (type.isDartCoreList) {
-        return DefaultArgument('[]', cursorPosition: 1);
-      } else if (type.isDartCoreMap) {
-        return DefaultArgument('{}', cursorPosition: 1);
-      } else if (type.isDartCoreString) {
-        return DefaultArgument("''", cursorPosition: 1);
-      }
-    } else if (type is FunctionType) {
-      var params = type.parameters
-          .map((p) =>
-              '${getTypeString(p.type, withNullability: withNullability)}${p.name}')
-          .join(', ');
-      // TODO(devoncarew): Support having this method return text with newlines.
-      var text = '($params) {  }';
-      return DefaultArgument(text, cursorPosition: text.length - 2);
+DefaultArgument? getDefaultStringParameterValue(ParameterElement parameter,
+    {required bool withNullability}) {
+  var type = parameter.type;
+  if (type is InterfaceType) {
+    if (type.isDartCoreList) {
+      return DefaultArgument('[]', cursorPosition: 1);
+    } else if (type.isDartCoreMap) {
+      return DefaultArgument('{}', cursorPosition: 1);
+    } else if (type.isDartCoreString) {
+      return DefaultArgument("''", cursorPosition: 1);
     }
+  } else if (type is FunctionType) {
+    var params = type.parameters
+        .map((p) =>
+            '${getTypeString(p.type, withNullability: withNullability)}${p.name}')
+        .join(', ');
+    // TODO(devoncarew): Support having this method return text with newlines.
+    var text = '($params) {  }';
+    return DefaultArgument(text, cursorPosition: text.length - 2);
   }
-
   return null;
 }
 
 String getRequestLineIndent(DartCompletionRequest request) {
-  var content = request.result.content;
+  var content = request.result.content!;
   var lineStartOffset = request.offset;
   var notWhitespaceOffset = request.offset;
   for (; lineStartOffset > 0; lineStartOffset--) {
@@ -214,7 +200,7 @@
   return content.substring(lineStartOffset, notWhitespaceOffset);
 }
 
-String getTypeString(DartType type, {@required bool withNullability}) {
+String getTypeString(DartType type, {required bool withNullability}) {
   if (type.isDynamic) {
     return '';
   } else {
@@ -224,11 +210,7 @@
 
 /// Return name of the type of the given [identifier], or, if it unresolved, the
 /// name of its declared [declaredType].
-String nameForType(SimpleIdentifier identifier, TypeAnnotation declaredType) {
-  if (identifier == null) {
-    return null;
-  }
-
+String? nameForType(SimpleIdentifier identifier, TypeAnnotation? declaredType) {
   // Get the type from the identifier element.
   DartType type;
   var element = identifier.staticElement;
@@ -253,19 +235,12 @@
   }
 
   // If the type is unresolved, use the declared type.
-  if (type != null && type.isDynamic) {
+  if (type.isDynamic) {
     if (declaredType is TypeName) {
-      var id = declaredType.name;
-      if (id != null) {
-        return id.name;
-      }
+      return declaredType.name.name;
     }
     return DYNAMIC;
   }
-
-  if (type == null) {
-    return DYNAMIC;
-  }
   return type.getDisplayString(withNullability: false);
 }
 
@@ -276,7 +251,7 @@
 
   /// An optional location for the cursor, relative to the text's start. This
   /// field can be null.
-  final int cursorPosition;
+  final int? cursorPosition;
 
   DefaultArgument(this.text, {this.cursorPosition});
 }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/variable_name_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/variable_name_contributor.dart
index 50e0fd16..e2b1b0b 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/variable_name_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/variable_name_contributor.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/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analysis_server/src/services/correction/name_suggestion.dart';
@@ -23,7 +21,7 @@
     if (opType.includeVarNameSuggestions) {
       // Resolution not needed for this completion.
 
-      var node = request.target.containingNode;
+      AstNode? node = request.target.containingNode;
       var offset = request.target.offset;
 
       // Use the refined node.
@@ -31,7 +29,7 @@
         node = CompletionTarget.findFormalParameter(node, offset);
       }
 
-      String strName;
+      String? strName;
       if (node is ExpressionStatement) {
         var expression = node.expression;
         if (expression is Identifier) {
@@ -83,13 +81,13 @@
   /// Given some [name], add a suggestion with the name (unless the name is
   /// `null` or empty).
   void _createNameSuggestion(SuggestionBuilder builder, String name) {
-    if (name != null && name.isNotEmpty) {
+    if (name.isNotEmpty) {
       builder.suggestName(name);
     }
   }
 
   /// Convert some [Identifier] to its [String] name.
-  String _getStringName(Identifier id) {
+  String? _getStringName(Identifier? id) {
     if (id == null) {
       return null;
     }
@@ -101,7 +99,7 @@
     return id.name;
   }
 
-  static Identifier _formalParameterTypeIdentifier(FormalParameter node) {
+  static Identifier? _formalParameterTypeIdentifier(FormalParameter node) {
     if (node is SimpleFormalParameter) {
       var type = node.type;
       if (type != null) {
@@ -112,7 +110,7 @@
     return null;
   }
 
-  static Identifier _typeAnnotationIdentifier(TypeAnnotation type) {
+  static Identifier? _typeAnnotationIdentifier(TypeAnnotation? type) {
     if (type is TypeName) {
       return type.name;
     }
diff --git a/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart b/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
index 7a9229d..39ef023 100644
--- a/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
@@ -12,6 +12,7 @@
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/generated/testing/token_factory.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
+import 'package:meta/meta.dart';
 
 /// The class `AstTestFactory` defines utility methods that can be used to
 /// create AST nodes. The nodes that are created are complete in the sense that
@@ -26,6 +27,7 @@
 /// second is places where a shorter name seemed unambiguous and easier to read,
 /// such as using 'identifier' rather than 'prefixedIdentifier', or 'integer'
 /// rather than 'integerLiteral'.
+@internal
 class AstTestFactory {
   static AdjacentStringsImpl adjacentStrings(List<StringLiteral> strings) =>
       astFactory.adjacentStrings(strings);
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 11692c2..50db82b 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -5912,10 +5912,26 @@
   @override
   void beginTypeVariable(Token token) {
     debugEvent("beginTypeVariable");
-    Identifier name = pop();
+    assert(checkState(token, [
+      unionOfKinds([ValueKinds.Identifier, ValueKinds.ParserRecovery]),
+      ValueKinds.AnnotationListOrNull,
+    ]));
+    Object name = pop();
     List<Expression> annotations = pop();
+    String typeVariableName;
+    int typeVariableCharOffset;
+    if (name is Identifier) {
+      typeVariableName = name.name;
+      typeVariableCharOffset = name.charOffset;
+    } else if (name is ParserRecovery) {
+      typeVariableName = null;
+      typeVariableCharOffset = name.charOffset;
+    } else {
+      return unhandled("${name.runtimeType}", "beginTypeVariable.name",
+          token.charOffset, uri);
+    }
     TypeVariableBuilder variable = new TypeVariableBuilder(
-        name.name, libraryBuilder, name.charOffset, uri);
+        typeVariableName, libraryBuilder, typeVariableCharOffset, uri);
     if (annotations != null) {
       inferAnnotations(variable.parameter, annotations);
       for (Expression annotation in annotations) {
diff --git a/pkg/front_end/lib/src/fasta/source/value_kinds.dart b/pkg/front_end/lib/src/fasta/source/value_kinds.dart
index 3fc36cc..1f59675 100644
--- a/pkg/front_end/lib/src/fasta/source/value_kinds.dart
+++ b/pkg/front_end/lib/src/fasta/source/value_kinds.dart
@@ -35,6 +35,8 @@
 import '../source/outline_builder.dart' as type;
 
 class ValueKinds {
+  static const ValueKind AnnotationListOrNull =
+      const SingleValueKind<List<type.Expression>>(NullValue.Metadata);
   static const ValueKind Arguments = const SingleValueKind<type.Arguments>();
   static const ValueKind ArgumentsOrNull =
       const SingleValueKind<type.Arguments>(NullValue.Arguments);
diff --git a/pkg/front_end/testcases/generic_metadata/issue45329.dart b/pkg/front_end/testcases/generic_metadata/issue45329.dart
new file mode 100644
index 0000000..bfd08bb
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/issue45329.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+test() {
+  local<void Function()>() {}
+}
+
+main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/generic_metadata/issue45329.dart.strong.expect b/pkg/front_end/testcases/generic_metadata/issue45329.dart.strong.expect
new file mode 100644
index 0000000..3dbf472
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/issue45329.dart.strong.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/generic_metadata/issue45329.dart:6:9: Error: Expected an identifier, but got 'void'.
+// Try inserting an identifier before 'void'.
+//   local<void Function()>() {}
+//         ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  function local<#T1 extends core::Object? = dynamic>() → Null {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/generic_metadata/issue45329.dart.strong.transformed.expect b/pkg/front_end/testcases/generic_metadata/issue45329.dart.strong.transformed.expect
new file mode 100644
index 0000000..3dbf472
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/issue45329.dart.strong.transformed.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/generic_metadata/issue45329.dart:6:9: Error: Expected an identifier, but got 'void'.
+// Try inserting an identifier before 'void'.
+//   local<void Function()>() {}
+//         ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  function local<#T1 extends core::Object? = dynamic>() → Null {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/generic_metadata/issue45329.dart.textual_outline.expect b/pkg/front_end/testcases/generic_metadata/issue45329.dart.textual_outline.expect
new file mode 100644
index 0000000..ec6b9e0
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/issue45329.dart.textual_outline.expect
@@ -0,0 +1,2 @@
+test() {}
+main() {}
diff --git a/pkg/front_end/testcases/generic_metadata/issue45329.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/generic_metadata/issue45329.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..f67dbb0
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/issue45329.dart.textual_outline_modelled.expect
@@ -0,0 +1,2 @@
+main() {}
+test() {}
diff --git a/pkg/front_end/testcases/generic_metadata/issue45329.dart.weak.expect b/pkg/front_end/testcases/generic_metadata/issue45329.dart.weak.expect
new file mode 100644
index 0000000..3dbf472
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/issue45329.dart.weak.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/generic_metadata/issue45329.dart:6:9: Error: Expected an identifier, but got 'void'.
+// Try inserting an identifier before 'void'.
+//   local<void Function()>() {}
+//         ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  function local<#T1 extends core::Object? = dynamic>() → Null {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/generic_metadata/issue45329.dart.weak.outline.expect b/pkg/front_end/testcases/generic_metadata/issue45329.dart.weak.outline.expect
new file mode 100644
index 0000000..64923de
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/issue45329.dart.weak.outline.expect
@@ -0,0 +1,7 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/generic_metadata/issue45329.dart.weak.transformed.expect b/pkg/front_end/testcases/generic_metadata/issue45329.dart.weak.transformed.expect
new file mode 100644
index 0000000..3dbf472
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/issue45329.dart.weak.transformed.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/generic_metadata/issue45329.dart:6:9: Error: Expected an identifier, but got 'void'.
+// Try inserting an identifier before 'void'.
+//   local<void Function()>() {}
+//         ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  function local<#T1 extends core::Object? = dynamic>() → Null {}
+}
+static method main() → dynamic {}
diff --git a/runtime/observatory/tests/service/service_kernel.status b/runtime/observatory/tests/service/service_kernel.status
index 291688c..a3f002c 100644
--- a/runtime/observatory/tests/service/service_kernel.status
+++ b/runtime/observatory/tests/service/service_kernel.status
@@ -15,17 +15,7 @@
 eval_internal_class_test: SkipByDesign # No incremental compiler available.
 eval_regression_flutter20255_test: SkipByDesign # No incremental compiler available.
 eval_test: SkipByDesign # No incremental compiler available.
-evaluate_activation_test: SkipByDesign # No incremental compiler available.
-evaluate_async_closure_test: SkipByDesign # No incremental compiler available.
-evaluate_class_type_parameters_test: SkipByDesign # No incremental compiler available.
-evaluate_function_type_parameters_test: SkipByDesign # No incremental compiler available.
-evaluate_in_async_activation_test: SkipByDesign # No incremental compiler available.
-evaluate_in_async_star_activation_test: SkipByDesign # No incremental compiler available.
-evaluate_in_frame_rpc_test: SkipByDesign # No incremental compiler available.
-evaluate_in_frame_with_scope_test: SkipByDesign # No incremental compiler available.
-evaluate_in_sync_star_activation_test: SkipByDesign # No incremental compiler available.
-evaluate_with_escaping_closure_test: SkipByDesign # No incremental compiler available.
-evaluate_with_scope_test: SkipByDesign # No incremental compiler available.
+evaluate_*: SkipByDesign # No incremental compiler available.
 get_allocation_traces_test: SkipByDesign # Allocation traces aren't consistent when running from snapshot.
 get_object_rpc_test: SkipByDesign # App-JIT snapshots don't contain script sources.
 pause_on_exceptions_test: SkipByDesign # No incremental compiler available.
@@ -172,7 +162,7 @@
 regress_28443_test: SkipByDesign # Debugger is disabled in AOT mode.
 regress_28980_test: SkipByDesign # Debugger is disabled in AOT mode.
 regress_34841_test: SkipByDesign # Debugger is disabled in AOT mode.
-reload_sources_test: SkipByDesign #  Hot reload is disabled in AOT mode.
+reload_sources_test: SkipByDesign # Hot reload is disabled in AOT mode.
 rewind_optimized_out_test: SkipByDesign # Debugger is disabled in AOT mode.
 rewind_test: SkipByDesign # Debugger is disabled in AOT mode.
 set_breakpoint_state_test: SkipByDesign # Debugger is disabled in AOT mode.
@@ -298,7 +288,7 @@
 evaluate_in_frame_with_scope_test: RuntimeError # Issue #34736
 evaluate_in_sync_star_activation_test: SkipByDesign # No incremental compiler available.
 evaluate_with_scope_test: RuntimeError # Issue #34736
-get_allocation_traces_test: SkipByDesign # Stack traces are different running from snapshot.
+get_allocation_traces_test: SkipByDesign # Allocation traces aren't consistent when running from snapshot.
 pause_on_exceptions_test: RuntimeError, Timeout # Issue #34736
 reload_sources_test: Skip # Times out.
 rewind_optimized_out_test: RuntimeError # Issue #34736
diff --git a/runtime/observatory_2/tests/service_2/service_2_kernel.status b/runtime/observatory_2/tests/service_2/service_2_kernel.status
index 717b43e..a3f002c 100644
--- a/runtime/observatory_2/tests/service_2/service_2_kernel.status
+++ b/runtime/observatory_2/tests/service_2/service_2_kernel.status
@@ -15,17 +15,7 @@
 eval_internal_class_test: SkipByDesign # No incremental compiler available.
 eval_regression_flutter20255_test: SkipByDesign # No incremental compiler available.
 eval_test: SkipByDesign # No incremental compiler available.
-evaluate_activation_test: SkipByDesign # No incremental compiler available.
-evaluate_async_closure_test: SkipByDesign # No incremental compiler available.
-evaluate_class_type_parameters_test: SkipByDesign # No incremental compiler available.
-evaluate_function_type_parameters_test: SkipByDesign # No incremental compiler available.
-evaluate_in_async_activation_test: SkipByDesign # No incremental compiler available.
-evaluate_in_async_star_activation_test: SkipByDesign # No incremental compiler available.
-evaluate_in_frame_rpc_test: SkipByDesign # No incremental compiler available.
-evaluate_in_frame_with_scope_test: SkipByDesign # No incremental compiler available.
-evaluate_in_sync_star_activation_test: SkipByDesign # No incremental compiler available.
-evaluate_with_escaping_closure_test: SkipByDesign # No incremental compiler available.
-evaluate_with_scope_test: SkipByDesign # No incremental compiler available.
+evaluate_*: SkipByDesign # No incremental compiler available.
 get_allocation_traces_test: SkipByDesign # Allocation traces aren't consistent when running from snapshot.
 get_object_rpc_test: SkipByDesign # App-JIT snapshots don't contain script sources.
 pause_on_exceptions_test: SkipByDesign # No incremental compiler available.
@@ -161,6 +151,7 @@
 notify_debugger_on_exception_test: SkipByDesign # Debugger is disabled in AOT mode.
 parameters_in_scope_at_entry_test: SkipByDesign # Debugger is disabled in AOT mode.
 pause_idle_isolate_test: SkipByDesign # Debugger is disabled in AOT mode.
+pause_on_exception_from_slow_path_test: SkipByDesign # Debugger is disabled in AOT mode.
 pause_on_exceptions_test: SkipByDesign # Debugger is disabled in AOT mode.
 pause_on_start_then_step_test: SkipByDesign # Debugger is disabled in AOT mode.
 pause_on_unhandled_async_exceptions2_test: SkipByDesign # Debugger is disabled in AOT mode.
diff --git a/tests/ffi/ffi.status b/tests/ffi/ffi.status
index f728d98..f157962 100644
--- a/tests/ffi/ffi.status
+++ b/tests/ffi/ffi.status
@@ -5,6 +5,9 @@
 [ $builder_tag == msan ]
 vmspecific_handle_test: Skip # https://dartbug.com/42314
 
+[ $mode == debug ]
+function_callbacks_structs_by_value_generated_test: Pass, Slow
+
 [ $system == android ]
 *: Pass, Slow # https://github.com/dart-lang/sdk/issues/38489
 
diff --git a/tests/ffi_2/ffi_2.status b/tests/ffi_2/ffi_2.status
index f728d98..f157962 100644
--- a/tests/ffi_2/ffi_2.status
+++ b/tests/ffi_2/ffi_2.status
@@ -5,6 +5,9 @@
 [ $builder_tag == msan ]
 vmspecific_handle_test: Skip # https://dartbug.com/42314
 
+[ $mode == debug ]
+function_callbacks_structs_by_value_generated_test: Pass, Slow
+
 [ $system == android ]
 *: Pass, Slow # https://github.com/dart-lang/sdk/issues/38489
 
diff --git a/tools/VERSION b/tools/VERSION
index 9472fdb..798da76 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 13
 PATCH 0
-PRERELEASE 220
+PRERELEASE 221
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/bots/lib/src/firestore.dart b/tools/bots/lib/src/firestore.dart
index 80b2315..c1d602a 100644
--- a/tools/bots/lib/src/firestore.dart
+++ b/tools/bots/lib/src/firestore.dart
@@ -41,12 +41,13 @@
       this._beginTransactionUrl, this._commitUrl);
 
   factory FirestoreDatabase(String project, String authToken) {
-    var databaseUrl = _apiUrl.resolve('projects/$project/databases/(default)/');
+    var databasePath = 'projects/$project/databases/(default)';
+    var databaseUrl = _apiUrl.resolve('$databasePath/');
     var documentsUrl = databaseUrl.resolve('documents/');
-    var queryUrl = databaseUrl.resolveUri(Uri(path: 'documents:runQuery'));
+    var queryUrl = _apiUrl.resolve('$databasePath/documents:runQuery');
     var beginTransactionUrl =
-        databaseUrl.resolveUri(Uri(path: 'documents:beginTransaction'));
-    var commitUrl = databaseUrl.resolveUri(Uri(path: 'documents:commit'));
+        _apiUrl.resolve('$databasePath/documents:beginTransaction');
+    var commitUrl = _apiUrl.resolve('$databasePath/documents:commit');
     var headers = {
       'Authorization': 'Bearer $authToken',
       'Accept': 'application/json',
@@ -56,7 +57,7 @@
         headers, documentsUrl, queryUrl, beginTransactionUrl, commitUrl);
   }
 
-  static final _apiUrl = Uri.https('firestore.googleapis.com', 'v1beta1/');
+  static final _apiUrl = Uri.https('firestore.googleapis.com', 'v1/');
 
   Future<List /*!*/ > runQuery(Query query) async {
     var body = jsonEncode(query.data);
