diff --git a/CHANGELOG.md b/CHANGELOG.md
index d9b7267..d627fa9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -96,8 +96,6 @@
 
 #### dart format
 
-*   Flatten indentation on nested chains of conditional (`?:`) operators.
-
 *   Correct constructor initializer indentation after `required` named
     parameters.
 
diff --git a/DEPS b/DEPS
index b63cd01..6327f7e 100644
--- a/DEPS
+++ b/DEPS
@@ -98,7 +98,7 @@
   #     and land the review.
   #
   # For more details, see https://github.com/dart-lang/sdk/issues/30164
-  "dart_style_rev": "0067cfcc5bfa64cf59888c3fed34c71d1272555a",
+  "dart_style_rev": "f17c23e0eea9a870601c19d904e2a9c1a7c81470",
 
   "chromedriver_tag": "83.0.4103.39",
   "browser_launcher_rev": "12ab9f351a44ac803de9bc17bb2180bb312a9dd7",
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart b/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
index 578501a..7c20027 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
@@ -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';
 import 'package:analysis_server/src/provisional/completion/completion_core.dart';
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
@@ -50,27 +48,27 @@
 /// and forwards those requests to all [DartCompletionContributor]s.
 class DartCompletionManager {
   /// The object used to resolve macros in Dartdoc comments.
-  final DartdocDirectiveInfo dartdocDirectiveInfo;
+  final DartdocDirectiveInfo? dartdocDirectiveInfo;
 
   /// If not `null`, then instead of using [ImportedReferenceContributor],
   /// fill this set with kinds of elements that are applicable at the
   /// completion location, so should be suggested from available suggestion
   /// sets.
-  final Set<protocol.ElementKind> includedElementKinds;
+  final Set<protocol.ElementKind>? includedElementKinds;
 
   /// If [includedElementKinds] is not null, must be also not `null`, and
   /// will be filled with names of all top-level declarations from all
   /// included suggestion sets.
-  final Set<String> includedElementNames;
+  final Set<String>? includedElementNames;
 
   /// If [includedElementKinds] is not null, must be also not `null`, and
   /// will be filled with tags for suggestions that should be given higher
   /// relevance than other included suggestions.
-  final List<IncludedSuggestionRelevanceTag> includedSuggestionRelevanceTags;
+  final List<IncludedSuggestionRelevanceTag>? includedSuggestionRelevanceTags;
 
   /// 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;
 
   /// Initialize a newly created completion manager. The parameters
   /// [includedElementKinds], [includedElementNames], and
@@ -94,11 +92,11 @@
     CompletionRequest request, {
     bool enableOverrideContributor = true,
     bool enableUriContributor = true,
-    CompletionPreference completionPreference,
+    CompletionPreference? completionPreference,
   }) async {
     request.checkAborted();
     var pathContext = request.resourceProvider.pathContext;
-    if (!file_paths.isDart(pathContext, request.result.path)) {
+    if (!file_paths.isDart(pathContext, request.result.path!)) {
       return const <CompletionSuggestion>[];
     }
 
@@ -201,6 +199,7 @@
   }
 
   void _addIncludedSuggestionRelevanceTags(DartCompletionRequestImpl request) {
+    var includedSuggestionRelevanceTags = this.includedSuggestionRelevanceTags!;
     var location = request.opType.completionLocation;
     if (location != null) {
       var locationTable = elementKindRelevance[location];
@@ -266,15 +265,15 @@
   final int offset;
 
   @override
-  Expression dotTarget;
+  Expression? dotTarget;
 
   @override
   final Source librarySource;
 
   @override
-  CompletionTarget target;
+  late CompletionTarget target;
 
-  OpType _opType;
+  OpType? _opType;
 
   @override
   final FeatureComputer featureComputer;
@@ -286,13 +285,13 @@
   bool _hasComputedContextType = false;
 
   /// The context type associated with the target's `containingNode`.
-  DartType _contextType;
+  DartType? _contextType;
 
   final CompletionRequest _originalRequest;
 
   final CompletionPerformance performance;
 
-  SourceRange _replacementRange;
+  SourceRange? _replacementRange;
 
   @override
   final CompletionPreference completionPreference;
@@ -308,7 +307,7 @@
       this.dartdocDirectiveInfo,
       this._originalRequest,
       this.performance,
-      {CompletionPreference completionPreference})
+      {CompletionPreference? completionPreference})
       : featureComputer =
             FeatureComputer(result.typeSystem, result.typeProvider),
         completionPreference =
@@ -317,7 +316,7 @@
   }
 
   @override
-  DartType get contextType {
+  DartType? get contextType {
     if (!_hasComputedContextType) {
       _contextType = featureComputer.computeContextType(
           target.containingNode, target.offset);
@@ -345,24 +344,22 @@
 
   @override
   OpType get opType {
-    _opType ??= OpType.forCompletion(target, offset);
-    return _opType;
+    return _opType ??= OpType.forCompletion(target, offset);
   }
 
   /// The source range that represents the region of text that should be
   /// replaced when a suggestion is selected.
   @override
   SourceRange get replacementRange {
-    _replacementRange ??= target.computeReplacementRange(offset);
-    return _replacementRange;
+    return _replacementRange ??= target.computeReplacementRange(offset);
   }
 
   @override
-  String get sourceContents => result.content;
+  String? get sourceContents => result.content;
 
   @override
   SourceFactory get sourceFactory {
-    DriverBasedAnalysisContext context = result.session.analysisContext;
+    var context = result.session.analysisContext as DriverBasedAnalysisContext;
     return context.driver.sourceFactory;
   }
 
@@ -371,8 +368,8 @@
     var entity = target.entity;
 
     if (entity is Token) {
-      var prev = entity.previous;
-      if (prev?.end == offset && prev.isKeywordOrIdentifier) {
+      var prev = entity.previous!;
+      if (prev.end == offset && prev.isKeywordOrIdentifier) {
         return prev.lexeme;
       }
     }
@@ -386,7 +383,7 @@
           return identifier;
         }
       }
-      var children = (entity as AstNode).childEntities;
+      var children = entity.childEntities;
       entity = children.isEmpty ? null : children.first;
     }
     return '';
@@ -407,7 +404,8 @@
     if (node is MethodInvocation) {
       if (identical(node.methodName, target.entity)) {
         dotTarget = node.realTarget;
-      } else if (node.isCascaded && node.operator.offset + 1 == target.offset) {
+      } else if (node.isCascaded &&
+          node.operator!.offset + 1 == target.offset) {
         dotTarget = node.realTarget;
       }
     }
@@ -428,18 +426,18 @@
   /// Return a [Future] that completes with a newly created completion request
   /// based on the given [request]. This method will throw [AbortCompletion]
   /// if the completion request has been aborted.
-  static Future<DartCompletionRequest> from(
+  static Future<DartCompletionRequestImpl> from(
       OperationPerformanceImpl performance,
       CompletionRequest request,
-      DartdocDirectiveInfo dartdocDirectiveInfo,
-      {CompletionPreference completionPreference}) async {
+      DartdocDirectiveInfo? dartdocDirectiveInfo,
+      {CompletionPreference? completionPreference}) async {
     request.checkAborted();
 
     return performance.run(
       'build DartCompletionRequest',
       (_) {
-        var unit = request.result.unit;
-        var libSource = unit.declaredElement.library.source;
+        var unit = request.result.unit!;
+        var libSource = unit.declaredElement!.library.source;
         var objectType = request.result.typeProvider.objectType;
 
         return DartCompletionRequestImpl._(
@@ -450,7 +448,7 @@
           request.source,
           request.offset,
           unit,
-          dartdocDirectiveInfo,
+          dartdocDirectiveInfo ?? DartdocDirectiveInfo(),
           request,
           (request as CompletionRequestImpl).performance,
           completionPreference: completionPreference,
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
index 4b48766..dafe115 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/keyword_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/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
@@ -45,11 +43,11 @@
 
   final SuggestionBuilder builder;
 
-  final Object entity;
+  final SyntacticEntity? entity;
 
   _KeywordVisitor(this.request, this.builder) : entity = request.target.entity;
 
-  Token get droppedToken => request.target.droppedToken;
+  Token? get droppedToken => request.target.droppedToken;
 
   @override
   void visitArgumentList(ArgumentList node) {
@@ -58,6 +56,7 @@
         return;
       }
     }
+    var entity = this.entity;
     if (entity == node.rightParenthesis) {
       _addExpressionKeywords(node);
       var previous = node.findPrevious(entity as Token);
@@ -75,10 +74,11 @@
       var index = node.arguments.indexOf(entity);
       if (index > 0) {
         var previousArgument = node.arguments[index - 1];
-        var endToken = previousArgument?.endToken;
-        if (endToken?.lexeme == ')' &&
-            endToken.next?.lexeme == ',' &&
-            endToken.next.isSynthetic) {
+        var endToken = previousArgument.endToken;
+        var tokenAfterEnd = endToken.next!;
+        if (endToken.lexeme == ')' &&
+            tokenAfterEnd.lexeme == ',' &&
+            tokenAfterEnd.isSynthetic) {
           _addSuggestion(Keyword.ASYNC);
           _addSuggestion2(ASYNC_STAR);
           _addSuggestion2(SYNC_STAR);
@@ -121,9 +121,9 @@
         if (previous != null && previous.isSynthetic) {
           previous = node.findPrevious(previous);
         }
-        var next = token.next;
+        var next = token.next!;
         if (next.isSynthetic) {
-          next = next.next;
+          next = next.next!;
         }
         if (previous != null &&
             previous.type == TokenType.CLOSE_PAREN &&
@@ -142,6 +142,7 @@
 
   @override
   void visitClassDeclaration(ClassDeclaration node) {
+    var entity = this.entity;
     // Don't suggest class name
     if (entity == node.name) {
       return;
@@ -164,7 +165,7 @@
 
   @override
   void visitCompilationUnit(CompilationUnit node) {
-    SyntacticEntity previousMember;
+    SyntacticEntity? previousMember;
     for (var member in node.childEntities) {
       if (entity == member) {
         break;
@@ -172,8 +173,7 @@
       previousMember = member;
     }
     if (previousMember is ClassDeclaration) {
-      if (previousMember.leftBracket == null ||
-          previousMember.leftBracket.isSynthetic) {
+      if (previousMember.leftBracket.isSynthetic) {
         // If the prior member is an unfinished class declaration
         // then the user is probably finishing that.
         _addClassDeclarationKeywords(previousMember);
@@ -181,8 +181,7 @@
       }
     }
     if (previousMember is ExtensionDeclaration) {
-      if (previousMember.leftBracket == null ||
-          previousMember.leftBracket.isSynthetic) {
+      if (previousMember.leftBracket.isSynthetic) {
         // If the prior member is an unfinished extension declaration then the
         // user is probably finishing that.
         _addExtensionDeclarationKeywords(previousMember);
@@ -190,8 +189,7 @@
       }
     }
     if (previousMember is MixinDeclaration) {
-      if (previousMember.leftBracket == null ||
-          previousMember.leftBracket.isSynthetic) {
+      if (previousMember.leftBracket.isSynthetic) {
         // If the prior member is an unfinished mixin declaration
         // then the user is probably finishing that.
         _addMixinDeclarationKeywords(previousMember);
@@ -199,8 +197,7 @@
       }
     }
     if (previousMember is ImportDirective) {
-      if (previousMember.semicolon == null ||
-          previousMember.semicolon.isSynthetic) {
+      if (previousMember.semicolon.isSynthetic) {
         // If the prior member is an unfinished import directive
         // then the user is probably finishing that
         _addImportDirectiveKeywords(previousMember);
@@ -246,7 +243,7 @@
       var separator = node.separator;
       if (separator != null) {
         var offset = request.offset;
-        if (separator.end <= offset && offset <= separator.next.offset) {
+        if (separator.end <= offset && offset <= separator.next!.offset) {
           _addSuggestion(Keyword.ASSERT);
           _addSuggestion(Keyword.SUPER);
           _addSuggestion(Keyword.THIS);
@@ -362,7 +359,7 @@
       }
     } else if (entity is FormalParameter) {
       var beginToken = (entity as FormalParameter).beginToken;
-      if (beginToken != null && request.target.offset == beginToken.end) {
+      if (request.target.offset == beginToken.end) {
         _addSuggestion(Keyword.COVARIANT);
         _addSuggestion(Keyword.DYNAMIC);
         _addSuggestion(Keyword.VOID);
@@ -387,8 +384,7 @@
     // Handle the degenerate case while typing - for (int x i^)
     if (node.condition == entity &&
         entity is SimpleIdentifier &&
-        node is ForPartsWithDeclarations &&
-        node.variables != null) {
+        node is ForPartsWithDeclarations) {
       if (_isPreviousTokenSynthetic(entity, TokenType.SEMICOLON)) {
         _addSuggestion(Keyword.IN);
       }
@@ -425,9 +421,10 @@
           _addSuggestion2(SYNC_STAR);
         }
       }
+      var grandParent = node.parent;
       if (body is EmptyFunctionBody &&
-          node.parent is FunctionDeclaration &&
-          node.parent.parent is CompilationUnit) {
+          grandParent is FunctionDeclaration &&
+          grandParent.parent is CompilationUnit) {
         _addCompilationUnitKeywords();
       }
     }
@@ -471,9 +468,7 @@
     }
     // Handle degenerate case where import statement does not have a semicolon
     // and the cursor is in the uri string
-    if ((entity == node.semicolon &&
-            node.uri != null &&
-            node.uri.offset + 1 != request.offset) ||
+    if ((entity == node.semicolon && node.uri.offset + 1 != request.offset) ||
         node.combinators.contains(entity)) {
       _addImportDirectiveKeywords(node);
     }
@@ -549,6 +544,7 @@
 
   @override
   void visitMixinDeclaration(MixinDeclaration node) {
+    var entity = this.entity;
     // Don't suggest mixin name
     if (entity == node.name) {
       return;
@@ -699,7 +695,7 @@
         (obj is KeywordToken && obj.value() == Keyword.FINALLY)) {
       _addSuggestion(Keyword.ON);
       _addSuggestion(Keyword.CATCH);
-      return null;
+      return;
     }
     return visitStatement(node);
   }
@@ -813,7 +809,7 @@
   }
 
   void _addExtensionDeclarationKeywords(ExtensionDeclaration node) {
-    if (node.onKeyword == null || node.onKeyword.isSynthetic) {
+    if (node.onKeyword.isSynthetic) {
       _addSuggestion(Keyword.ON);
     }
   }
@@ -895,7 +891,7 @@
     _addSuggestion2(keyword.lexeme);
   }
 
-  void _addSuggestion2(String keyword, {int offset}) {
+  void _addSuggestion2(String keyword, {int? offset}) {
     builder.suggestKeyword(keyword, offset: offset);
   }
 
@@ -906,7 +902,7 @@
   }
 
   bool _isEntityAfterIfWithoutElse(AstNode node) {
-    var block = node?.thisOrAncestorOfType<Block>();
+    var block = node.thisOrAncestorOfType<Block>();
     if (block == null) {
       return false;
     }
@@ -929,7 +925,7 @@
     return false;
   }
 
-  static bool _isPreviousTokenSynthetic(Object entity, TokenType type) {
+  static bool _isPreviousTokenSynthetic(Object? entity, TokenType type) {
     if (entity is AstNode) {
       var token = entity.beginToken;
       var previousToken = entity.findPrevious(token);
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/label_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/label_contributor.dart
index e333940..9434271 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/label_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/label_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/completion_manager.dart'
     show DartCompletionRequestImpl;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.dart
index d95722a..6da748e 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.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:_fe_analyzer_shared/src/scanner/token.dart';
 import 'package:analysis_server/src/services/completion/dart/utilities.dart';
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
@@ -12,10 +10,11 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:collection/collection.dart';
 
 class AddMissingRequiredArgument extends CorrectionProducer {
   /// The name of the parameter that was missing.
-  String _missingParameterName;
+  String _missingParameterName = '';
 
   @override
   List<Object> get fixArguments => [_missingParameterName];
@@ -25,9 +24,9 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
-    InstanceCreationExpression creation;
-    Element targetElement;
-    ArgumentList argumentList;
+    InstanceCreationExpression? creation;
+    Element? targetElement;
+    ArgumentList? argumentList;
 
     if (node is SimpleIdentifier || node is ConstructorName) {
       var invocation = node.parent;
@@ -35,8 +34,7 @@
         targetElement = invocation.methodName.staticElement;
         argumentList = invocation.argumentList;
       } else {
-        creation =
-            invocation.thisOrAncestorOfType<InstanceCreationExpression>();
+        creation = invocation?.thisOrAncestorOfType();
         if (creation != null) {
           targetElement = creation.constructorName.staticElement;
           argumentList = creation.argumentList;
@@ -44,7 +42,12 @@
       }
     }
 
-    if (targetElement is ExecutableElement) {
+    var diagnostic = this.diagnostic;
+    if (diagnostic == null) {
+      return;
+    }
+
+    if (targetElement is ExecutableElement && argumentList != null) {
       // Format: "Missing required argument 'foo'."
       var messageParts = diagnostic.problemMessage.message.split("'");
       if (messageParts.length < 2) {
@@ -52,9 +55,9 @@
       }
       _missingParameterName = messageParts[1];
 
-      var missingParameter = targetElement.parameters.firstWhere(
-          (p) => p.name == _missingParameterName,
-          orElse: () => null);
+      var missingParameter = targetElement.parameters.firstWhereOrNull(
+        (p) => p.name == _missingParameterName,
+      );
       if (missingParameter == null) {
         return;
       }
@@ -68,7 +71,7 @@
       } else {
         var lastArgument = arguments.last;
         offset = lastArgument.end;
-        hasTrailingComma = lastArgument.endToken.next.type == TokenType.COMMA;
+        hasTrailingComma = lastArgument.endToken.next!.type == TokenType.COMMA;
 
         if (lastArgument is NamedExpression &&
             flutter.isWidgetExpression(creation)) {
@@ -80,9 +83,10 @@
           }
         }
       }
+
       var defaultValue = getDefaultStringParameterValue(missingParameter,
           withNullability: libraryElement.isNonNullableByDefault &&
-              missingParameter.library.isNonNullableByDefault);
+              (missingParameter.library?.isNonNullableByDefault ?? false));
 
       await builder.addDartFileEdit(file, (builder) {
         builder.addInsertion(offset, (builder) {
@@ -93,14 +97,17 @@
           builder.write('$_missingParameterName: ');
 
           // Use defaultValue.cursorPosition if it's not null.
-          if (defaultValue?.cursorPosition != null) {
-            builder.write(
-                defaultValue.text.substring(0, defaultValue.cursorPosition));
-            builder.selectHere();
-            builder.write(
-                defaultValue.text.substring(defaultValue.cursorPosition));
+          if (defaultValue != null) {
+            var cursorPosition = defaultValue.cursorPosition;
+            if (cursorPosition != null) {
+              builder.write(defaultValue.text.substring(0, cursorPosition));
+              builder.selectHere();
+              builder.write(defaultValue.text.substring(cursorPosition));
+            } else {
+              builder.addSimpleLinkedEdit('VALUE', defaultValue.text);
+            }
           } else {
-            builder.addSimpleLinkedEdit('VALUE', defaultValue?.text);
+            builder.addSimpleLinkedEdit('VALUE', 'null');
           }
 
           if (flutter.isWidgetExpression(creation)) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_on_type.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_on_type.dart
index ead067d..a47567a 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_on_type.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_on_type.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -23,30 +21,30 @@
     var exceptionParameter = node;
     if (exceptionParameter is SimpleIdentifier) {
       var catchClause = exceptionParameter.parent;
-      if (catchClause is CatchClause &&
-          catchClause.exceptionType == null &&
-          catchClause.exceptionParameter == exceptionParameter) {
-        var exceptionTypeName = exceptionParameter.name;
-        fixArguments.add(exceptionTypeName);
-        await builder.addDartFileEdit(file, (builder) {
-          if (catchClause.stackTraceParameter != null) {
-            builder.addSimpleReplacement(
-              range.startStart(
-                catchClause.catchKeyword,
-                catchClause.stackTraceParameter,
-              ),
-              'on $exceptionTypeName catch (_, ',
-            );
-          } else {
-            builder.addSimpleReplacement(
-              range.startEnd(
-                catchClause.catchKeyword,
-                catchClause.rightParenthesis,
-              ),
-              'on $exceptionTypeName',
-            );
-          }
-        });
+      if (catchClause is CatchClause) {
+        var catchKeyword = catchClause.catchKeyword;
+        var rightParenthesis = catchClause.rightParenthesis;
+        if (catchKeyword != null &&
+            catchClause.exceptionType == null &&
+            catchClause.exceptionParameter == exceptionParameter &&
+            rightParenthesis != null) {
+          var exceptionTypeName = exceptionParameter.name;
+          fixArguments.add(exceptionTypeName);
+          await builder.addDartFileEdit(file, (builder) {
+            var stackTraceParameter = catchClause.stackTraceParameter;
+            if (stackTraceParameter != null) {
+              builder.addSimpleReplacement(
+                range.startStart(catchKeyword, stackTraceParameter),
+                'on $exceptionTypeName catch (_, ',
+              );
+            } else {
+              builder.addSimpleReplacement(
+                range.startEnd(catchKeyword, rightParenthesis),
+                'on $exceptionTypeName',
+              );
+            }
+          });
+        }
       }
     }
   }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_constructor_for_final_fields.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_constructor_for_final_fields.dart
index 62a920e..f8788d4 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_constructor_for_final_fields.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_constructor_for_final_fields.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/analysis/features.dart';
@@ -28,8 +26,12 @@
     if (classDeclaration == null) {
       return;
     }
+
     var className = classDeclaration.name.name;
-    var superType = classDeclaration.declaredElement.supertype;
+    var superType = classDeclaration.declaredElement?.supertype;
+    if (superType == null) {
+      return;
+    }
 
     // prepare names of uninitialized final fields
     var fieldNames = <String>[];
@@ -45,11 +47,17 @@
     }
     // prepare location for a new constructor
     var targetLocation = utils.prepareNewConstructorLocation(classDeclaration);
+    if (targetLocation == null) {
+      return;
+    }
 
     if (flutter.isExactlyStatelessWidgetType(superType) ||
         flutter.isExactlyStatefulWidgetType(superType)) {
       // Specialize for Flutter widgets.
       var keyClass = await sessionHelper.getClass(flutter.widgetsUri, 'Key');
+      if (keyClass == null) {
+        return;
+      }
       await builder.addDartFileEdit(file, (builder) {
         builder.addInsertion(targetLocation.offset, (builder) {
           builder.write(targetLocation.prefix);
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_constructor_super.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_constructor_super.dart
index 212261b..e4acc52 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_constructor_super.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_constructor_super.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/correction/util.dart';
@@ -16,16 +14,26 @@
   @override
   Iterable<CorrectionProducer> get producers sync* {
     var targetClassNode = node.thisOrAncestorOfType<ClassDeclaration>();
-    var targetClassElement = targetClassNode.declaredElement;
+    if (targetClassNode == null) {
+      return;
+    }
+
+    var targetClassElement = targetClassNode.declaredElement!;
     var superType = targetClassElement.supertype;
+    if (superType == null) {
+      return;
+    }
+
     // add proposals for all super constructors
     for (var constructor in superType.constructors) {
       // Only propose public constructors.
       if (!Identifier.isPrivateName(constructor.name)) {
         var targetLocation =
             utils.prepareNewConstructorLocation(targetClassNode);
-        yield _CreateConstructor(
-            constructor, targetLocation, targetClassElement.name);
+        if (targetLocation != null) {
+          yield _CreateConstructor(
+              constructor, targetLocation, targetClassElement.name);
+        }
       }
     }
   }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_field.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_field.dart
index fa00de2..ec42942 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_field.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_field.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/correction/util.dart';
@@ -14,7 +12,7 @@
 
 class CreateField extends CorrectionProducer {
   /// The name of the field to be created.
-  String _fieldName;
+  String _fieldName = '';
 
   @override
   List<Object> get fixArguments => [_fieldName];
@@ -38,9 +36,15 @@
     if (targetClassNode == null) {
       return;
     }
+
     var nameNode = parameter.identifier;
     _fieldName = nameNode.name;
+
     var targetLocation = utils.prepareNewFieldLocation(targetClassNode);
+    if (targetLocation == null) {
+      return;
+    }
+
     //
     // Add proposal.
     //
@@ -56,13 +60,13 @@
   }
 
   Future<void> _proposeFromIdentifier(ChangeBuilder builder) async {
-    if (node is! SimpleIdentifier) {
+    var nameNode = node;
+    if (nameNode is! SimpleIdentifier) {
       return;
     }
-    SimpleIdentifier nameNode = node;
     _fieldName = nameNode.name;
     // prepare target Expression
-    Expression target;
+    Expression? target;
     {
       var nameParent = nameNode.parent;
       if (nameParent is PrefixedIdentifier) {
@@ -73,7 +77,7 @@
     }
     // prepare target ClassElement
     var staticModifier = false;
-    ClassElement targetClassElement;
+    ClassElement? targetClassElement;
     if (target != null) {
       targetClassElement = getTargetClassElement(target);
       // maybe static
@@ -102,13 +106,20 @@
     if (targetDeclarationResult == null) {
       return;
     }
-    if (targetDeclarationResult.node is! ClassOrMixinDeclaration) {
+    var targetNode = targetDeclarationResult.node;
+    if (targetNode is! ClassOrMixinDeclaration) {
       return;
     }
-    ClassOrMixinDeclaration targetNode = targetDeclarationResult.node;
     // prepare location
-    var targetLocation = CorrectionUtils(targetDeclarationResult.resolvedUnit)
-        .prepareNewFieldLocation(targetNode);
+    var targetUnit = targetDeclarationResult.resolvedUnit;
+    if (targetUnit == null) {
+      return;
+    }
+    var targetLocation =
+        CorrectionUtils(targetUnit).prepareNewFieldLocation(targetNode);
+    if (targetLocation == null) {
+      return;
+    }
     // build field source
     var targetSource = targetClassElement.source;
     var targetFile = targetSource.fullName;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_file.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_file.dart
index 6dd55bf..455c0c8 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_file.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_file.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -12,7 +10,7 @@
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 
 class CreateFile extends CorrectionProducer {
-  String _fileName;
+  String _fileName = '';
 
   @override
   List<Object> get fixArguments => [_fileName];
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_function.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_function.dart
index 2351d57..1a8aaf4 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_function.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_function.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -12,7 +10,7 @@
 import 'package:analyzer_plugin/utilities/range_factory.dart';
 
 class CreateFunction extends CorrectionProducer {
-  String _functionName;
+  String _functionName = '';
 
   @override
   List<Object> get fixArguments => [_functionName];
@@ -37,8 +35,10 @@
     // prepare environment
     int insertOffset;
     String sourcePrefix;
-    AstNode enclosingMember =
-        node.thisOrAncestorOfType<CompilationUnitMember>();
+    var enclosingMember = node.thisOrAncestorOfType<CompilationUnitMember>();
+    if (enclosingMember == null) {
+      return;
+    }
     insertOffset = enclosingMember.end;
     sourcePrefix = '$eol$eol';
     utils.targetClassElement = null;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_getter.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_getter.dart
index 3ca2941..3c9c661 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_getter.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_getter.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/correction/util.dart';
@@ -14,7 +12,7 @@
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 
 class CreateGetter extends CorrectionProducer {
-  String _getterName;
+  String _getterName = '';
 
   @override
   List<Object> get fixArguments => [_getterName];
@@ -24,16 +22,16 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
-    if (node is! SimpleIdentifier) {
+    var nameNode = node;
+    if (nameNode is! SimpleIdentifier) {
       return;
     }
-    SimpleIdentifier nameNode = node;
     _getterName = nameNode.name;
     if (!nameNode.inGetterContext()) {
       return;
     }
     // prepare target
-    Expression target;
+    Expression? target;
     {
       var nameParent = nameNode.parent;
       if (nameParent is PrefixedIdentifier) {
@@ -44,7 +42,7 @@
     }
     // prepare target element
     var staticModifier = false;
-    Element targetElement;
+    Element? targetElement;
     if (target is ExtensionOverride) {
       targetElement = target.staticElement;
     } else if (target is Identifier &&
@@ -72,7 +70,11 @@
       }
       staticModifier = inStaticContext;
     }
-    if (targetElement.librarySource.isInSystemLibrary) {
+    if (targetElement == null) {
+      return;
+    }
+    var targetSource = targetElement.source;
+    if (targetSource == null || targetSource.isInSystemLibrary) {
       return;
     }
     // prepare target declaration
@@ -81,16 +83,26 @@
     if (targetDeclarationResult == null) {
       return;
     }
-    if (targetDeclarationResult.node is! ClassOrMixinDeclaration &&
-        targetDeclarationResult.node is! ExtensionDeclaration) {
+    var targetNode = targetDeclarationResult.node;
+    if (targetNode is CompilationUnitMember) {
+      if (targetDeclarationResult.node is! ClassOrMixinDeclaration &&
+          targetDeclarationResult.node is! ExtensionDeclaration) {
+        return;
+      }
+    } else {
       return;
     }
-    CompilationUnitMember targetNode = targetDeclarationResult.node;
     // prepare location
-    var targetLocation = CorrectionUtils(targetDeclarationResult.resolvedUnit)
-        .prepareNewGetterLocation(targetNode);
+    var resolvedUnit = targetDeclarationResult.resolvedUnit;
+    if (resolvedUnit == null) {
+      return;
+    }
+    var targetLocation =
+        CorrectionUtils(resolvedUnit).prepareNewGetterLocation(targetNode);
+    if (targetLocation == null) {
+      return;
+    }
     // build method source
-    var targetSource = targetElement.source;
     var targetFile = targetSource.fullName;
     await builder.addDartFileEdit(targetFile, (builder) {
       builder.addInsertion(targetLocation.offset, (builder) {
@@ -100,7 +112,7 @@
         builder.writeGetterDeclaration(_getterName,
             isStatic: staticModifier,
             nameGroupName: 'NAME',
-            returnType: fieldType,
+            returnType: fieldType ?? typeProvider.dynamicType,
             returnTypeGroupName: 'TYPE');
         builder.write(targetLocation.suffix);
       });
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_local_variable.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_local_variable.dart
index 42ba1d7..22b464e 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_local_variable.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_local_variable.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:_fe_analyzer_shared/src/scanner/token.dart';
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
@@ -14,7 +12,7 @@
 import 'package:analyzer_plugin/utilities/range_factory.dart';
 
 class CreateLocalVariable extends CorrectionProducer {
-  String _variableName;
+  String _variableName = '';
 
   @override
   List<Object> get fixArguments => [_variableName];
@@ -24,14 +22,14 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
-    if (node is! SimpleIdentifier) {
+    var nameNode = node;
+    if (nameNode is! SimpleIdentifier) {
       return;
     }
-    SimpleIdentifier nameNode = node;
     _variableName = nameNode.name;
     // if variable is assigned, convert assignment into declaration
-    if (node.parent is AssignmentExpression) {
-      AssignmentExpression assignment = node.parent;
+    var assignment = node.parent;
+    if (assignment is AssignmentExpression) {
       if (assignment.leftHandSide == node &&
           assignment.operator.type == TokenType.EQ &&
           assignment.parent is ExpressionStatement) {
@@ -48,7 +46,7 @@
     }
     var prefix = utils.getNodePrefix(target);
     // compute type
-    var type = inferUndefinedExpressionType(node);
+    var type = inferUndefinedExpressionType(nameNode);
     if (!(type == null || type is InterfaceType || type is FunctionType)) {
       return;
     }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_method.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_method.dart
index 66397fc..a697fff 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_method.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_method.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/correction/util.dart';
@@ -18,7 +16,7 @@
   /// The kind of method to be created.
   final _MethodKind _kind;
 
-  String _memberName;
+  String _memberName = '';
 
   CreateMethod(this._kind);
 
@@ -47,11 +45,11 @@
     }
     final classDecl = memberDecl.thisOrAncestorOfType<ClassDeclaration>();
     if (classDecl != null) {
-      final classElement = classDecl.declaredElement;
+      final classElement = classDecl.declaredElement!;
 
       var missingEquals = memberDecl is FieldDeclaration ||
           (memberDecl as MethodDeclaration).name.name == 'hashCode';
-      ExecutableElement element;
+      ExecutableElement? element;
       if (missingEquals) {
         _memberName = '==';
         element = classElement.lookUpInheritedMethod(
@@ -61,14 +59,21 @@
         element = classElement.lookUpInheritedConcreteGetter(
             _memberName, classElement.library);
       }
+      if (element == null) {
+        return;
+      }
 
       final location =
           utils.prepareNewClassMemberLocation(classDecl, (_) => true);
+      if (location == null) {
+        return;
+      }
 
+      final element_final = element;
       await builder.addDartFileEdit(file, (fileBuilder) {
         fileBuilder.addInsertion(location.offset, (builder) {
           builder.write(location.prefix);
-          builder.writeOverride(element, invokeSuper: true);
+          builder.writeOverride(element_final, invokeSuper: true);
           builder.write(location.suffix);
         });
       });
@@ -84,24 +89,28 @@
     _memberName = (node as SimpleIdentifier).name;
     var invocation = node.parent as MethodInvocation;
     // prepare environment
-    Element targetElement;
+    Element? targetElement;
     var staticModifier = false;
 
-    CompilationUnitMember targetNode;
+    CompilationUnitMember? targetNode;
     var target = invocation.realTarget;
     var utils = this.utils;
     if (target is ExtensionOverride) {
       targetElement = target.staticElement;
-      targetNode = await getExtensionDeclaration(targetElement);
-      if (targetNode == null) {
-        return;
+      if (targetElement is ExtensionElement) {
+        targetNode = await getExtensionDeclaration(targetElement);
+        if (targetNode == null) {
+          return;
+        }
       }
     } else if (target is Identifier &&
         target.staticElement is ExtensionElement) {
       targetElement = target.staticElement;
-      targetNode = await getExtensionDeclaration(targetElement);
-      if (targetNode == null) {
-        return;
+      if (targetElement is ExtensionElement) {
+        targetNode = await getExtensionDeclaration(targetElement);
+        if (targetNode == null) {
+          return;
+        }
       }
       staticModifier = true;
     } else if (target == null) {
@@ -112,8 +121,11 @@
         // doesn't make sense to create a method.
         return;
       }
-      targetNode = enclosingMember.parent;
-      staticModifier = inStaticContext;
+      var enclosingMemberParent = enclosingMember.parent;
+      if (enclosingMemberParent is CompilationUnitMember) {
+        targetNode = enclosingMemberParent;
+        staticModifier = inStaticContext;
+      }
     } else {
       var targetClassElement = getTargetClassElement(target);
       if (targetClassElement == null) {
@@ -130,7 +142,7 @@
       }
       // maybe static
       if (target is Identifier) {
-        staticModifier = target.staticElement.kind == ElementKind.CLASS;
+        staticModifier = target.staticElement?.kind == ElementKind.CLASS;
       }
       // use different utils
       var targetPath = targetClassElement.source.fullName;
@@ -138,8 +150,18 @@
           await resolvedResult.session.getResolvedUnit(targetPath);
       utils = CorrectionUtils(targetResolveResult);
     }
+    if (targetElement == null || targetNode == null) {
+      return;
+    }
     var targetLocation = utils.prepareNewMethodLocation(targetNode);
-    var targetFile = targetElement.source.fullName;
+    if (targetLocation == null) {
+      return;
+    }
+    var targetSource = targetElement.source;
+    if (targetSource == null) {
+      return;
+    }
+    var targetFile = targetSource.fullName;
     // build method source
     await builder.addDartFileEdit(targetFile, (builder) {
       builder.addInsertion(targetLocation.offset, (builder) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_method_or_function.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_method_or_function.dart
index c831928..3695dfa 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_method_or_function.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_method_or_function.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/correction/util.dart';
@@ -17,9 +15,9 @@
 import 'package:analyzer_plugin/utilities/range_factory.dart';
 
 class CreateMethodOrFunction extends CorrectionProducer {
-  FixKind _fixKind;
+  FixKind _fixKind = DartFixKind.CREATE_METHOD;
 
-  String _functionName;
+  String _functionName = '';
 
   @override
   List<Object> get fixArguments => [_functionName];
@@ -29,10 +27,10 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
-    if (node is SimpleIdentifier) {
-      var nameNode = node as SimpleIdentifier;
+    var nameNode = node;
+    if (nameNode is SimpleIdentifier) {
       // prepare argument expression (to get parameter)
-      ClassElement targetElement;
+      ClassElement? targetElement;
       Expression argument;
       {
         var target = getQualifiedPropertyTarget(node);
@@ -70,12 +68,11 @@
       if (parameterType is! FunctionType) {
         return;
       }
-      var functionType = parameterType as FunctionType;
       // add proposal
       if (targetElement != null) {
-        await _createMethod(builder, targetElement, functionType);
+        await _createMethod(builder, targetElement, parameterType);
       } else {
-        await _createFunction(builder, functionType);
+        await _createFunction(builder, parameterType);
       }
     }
   }
@@ -135,7 +132,7 @@
     var sourcePrefix = '$eol';
     var sourceSuffix = eol;
     await _createExecutable(builder, functionType, name, file, insertOffset,
-        false, prefix, sourcePrefix, sourceSuffix, unit.declaredElement);
+        false, prefix, sourcePrefix, sourceSuffix, unit.declaredElement!);
     _fixKind = DartFixKind.CREATE_FUNCTION;
     _functionName = name;
   }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_missing_overrides.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_missing_overrides.dart
index a1e5881..e6e0c70 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_missing_overrides.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_missing_overrides.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/utilities/strings.dart';
@@ -15,7 +13,7 @@
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 
 class CreateMissingOverrides extends CorrectionProducer {
-  int _numElements;
+  int _numElements = 0;
 
   @override
   List<Object> get fixArguments => [_numElements];
@@ -48,6 +46,9 @@
 
     var location =
         utils.prepareNewClassMemberLocation(targetClass, (_) => true);
+    if (location == null) {
+      return;
+    }
 
     var prefix = utils.getIndent(1);
     await builder.addDartFileEdit(file, (builder) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_mixin.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_mixin.dart
index 6f783b2..14c4598 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_mixin.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_mixin.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -14,7 +12,7 @@
 import 'package:analyzer_plugin/utilities/range_factory.dart';
 
 class CreateMixin extends CorrectionProducer {
-  String _mixinName;
+  String _mixinName = '';
 
   @override
   List<Object> get fixArguments => [_mixinName];
@@ -24,13 +22,15 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
-    Element prefixElement;
+    Element? prefixElement;
     SimpleIdentifier nameNode;
+    var node = this.node;
     if (node is SimpleIdentifier) {
       var parent = node.parent;
+      var grandParent = parent?.parent;
       if (parent is TypeName &&
-          parent.parent is ConstructorName &&
-          parent.parent.parent is InstanceCreationExpression) {
+          grandParent is ConstructorName &&
+          grandParent.parent is InstanceCreationExpression) {
         return;
       } else {
         nameNode = node;
@@ -40,13 +40,12 @@
       if (node.parent is InstanceCreationExpression) {
         return;
       }
-      PrefixedIdentifier prefixedIdentifier = node;
-      prefixElement = prefixedIdentifier.prefix.staticElement;
+      prefixElement = node.prefix.staticElement;
       if (prefixElement == null) {
         return;
       }
-      nameNode = prefixedIdentifier.identifier;
-      _mixinName = prefixedIdentifier.identifier.name;
+      nameNode = node.identifier;
+      _mixinName = node.identifier.name;
     } else {
       return;
     }
@@ -58,9 +57,9 @@
     var prefix = '';
     var suffix = '';
     var offset = -1;
-    String filePath;
+    String? filePath;
     if (prefixElement == null) {
-      targetUnit = unit.declaredElement;
+      targetUnit = unit.declaredElement!;
       var enclosingMember = node.thisOrAncestorMatching((node) =>
           node is CompilationUnitMember && node.parent is CompilationUnit);
       if (enclosingMember == null) {
@@ -77,8 +76,10 @@
             targetUnit = library.definingCompilationUnit;
             var targetSource = targetUnit.source;
             try {
-              offset = targetSource.contents.data.length;
-              filePath = targetSource.fullName;
+              if (targetSource != null) {
+                offset = targetSource.contents.data.length;
+                filePath = targetSource.fullName;
+              }
               prefix = '$eol';
               suffix = '$eol';
             } on FileSystemException {
@@ -90,7 +91,7 @@
         }
       }
     }
-    if (offset < 0) {
+    if (filePath == null || offset < 0) {
       return;
     }
     await builder.addDartFileEdit(filePath, (builder) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_no_such_method.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_no_such_method.dart
index 92af6ca..aa62503 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_no_such_method.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_no_such_method.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_setter.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_setter.dart
index c6c7fc5..8958731 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_setter.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_setter.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/correction/util.dart';
@@ -14,7 +12,7 @@
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 
 class CreateSetter extends CorrectionProducer {
-  String _setterName;
+  String _setterName = '';
 
   @override
   List<Object> get fixArguments => [_setterName];
@@ -24,15 +22,15 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
-    if (node is! SimpleIdentifier) {
+    var nameNode = node;
+    if (nameNode is! SimpleIdentifier) {
       return;
     }
-    SimpleIdentifier nameNode = node;
     if (!nameNode.inSetterContext()) {
       return;
     }
     // prepare target
-    Expression target;
+    Expression? target;
     {
       var nameParent = nameNode.parent;
       if (nameParent is PrefixedIdentifier) {
@@ -43,7 +41,7 @@
     }
     // prepare target element
     var staticModifier = false;
-    Element targetElement;
+    Element? targetElement;
     if (target is ExtensionOverride) {
       targetElement = target.staticElement;
     } else if (target is Identifier &&
@@ -71,7 +69,11 @@
       }
       staticModifier = inStaticContext;
     }
-    if (targetElement.librarySource.isInSystemLibrary) {
+    if (targetElement == null) {
+      return;
+    }
+    var targetSource = targetElement.source;
+    if (targetSource == null || targetSource.isInSystemLibrary) {
       return;
     }
     // prepare target declaration
@@ -80,16 +82,26 @@
     if (targetDeclarationResult == null) {
       return;
     }
-    if (targetDeclarationResult.node is! ClassOrMixinDeclaration &&
-        targetDeclarationResult.node is! ExtensionDeclaration) {
+    var targetNode = targetDeclarationResult.node;
+    if (targetNode is CompilationUnitMember) {
+      if (targetDeclarationResult.node is! ClassOrMixinDeclaration &&
+          targetDeclarationResult.node is! ExtensionDeclaration) {
+        return;
+      }
+    } else {
       return;
     }
-    CompilationUnitMember targetNode = targetDeclarationResult.node;
     // prepare location
-    var targetLocation = CorrectionUtils(targetDeclarationResult.resolvedUnit)
+    var targetUnit = targetDeclarationResult.resolvedUnit;
+    if (targetUnit == null) {
+      return;
+    }
+    var targetLocation = CorrectionUtils(targetUnit)
         .prepareNewGetterLocation(targetNode); // Rename to "AccessorLocation"
+    if (targetLocation == null) {
+      return;
+    }
     // build method source
-    var targetSource = targetElement.source;
     var targetFile = targetSource.fullName;
     _setterName = nameNode.name;
     await builder.addDartFileEdit(targetFile, (builder) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/encapsulate_field.dart b/pkg/analysis_server/lib/src/services/correction/dart/encapsulate_field.dart
index d5aa8b9..9bbf4d8 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/encapsulate_field.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/encapsulate_field.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -43,7 +41,7 @@
     }
     var field = fields.first;
     var nameNode = field.name;
-    FieldElement fieldElement = nameNode.staticElement;
+    var fieldElement = field.declaredElement as FieldElement;
     // should have a public name
     var name = nameNode.name;
     if (Identifier.isPrivateName(name)) {
@@ -67,10 +65,11 @@
       for (var member in classDeclaration.members) {
         if (member is ConstructorDeclaration) {
           for (var parameter in member.parameters.parameters) {
+            var identifier = parameter.identifier;
             var parameterElement = parameter.declaredElement;
-            if (parameterElement is FieldFormalParameterElement &&
+            if (identifier != null &&
+                parameterElement is FieldFormalParameterElement &&
                 parameterElement.field == fieldElement) {
-              var identifier = parameter.identifier;
               builder.addSimpleReplacement(range.node(identifier), '_$name');
             }
           }
@@ -79,14 +78,16 @@
 
       // Write getter and setter.
       builder.addInsertion(fieldDeclaration.end, (builder) {
-        String docCode;
-        if (fieldDeclaration.documentationComment != null) {
-          docCode = utils.getNodeText(fieldDeclaration.documentationComment);
+        String? docCode;
+        var documentationComment = fieldDeclaration.documentationComment;
+        if (documentationComment != null) {
+          docCode = utils.getNodeText(documentationComment);
         }
 
         var typeCode = '';
-        if (variableList.type != null) {
-          typeCode = utils.getNodeText(variableList.type) + ' ';
+        var typeAnnotation = variableList.type;
+        if (typeAnnotation != null) {
+          typeCode = utils.getNodeText(typeAnnotation) + ' ';
         }
 
         // Write getter.
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/exchange_operands.dart b/pkg/analysis_server/lib/src/services/correction/dart/exchange_operands.dart
index bb6b9de..9d1f05d 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/exchange_operands.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/exchange_operands.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -44,7 +42,7 @@
     // maybe replace the operator
     var operator = binaryExpression.operator;
     // prepare a new operator
-    String newOperator;
+    String? newOperator;
     var operatorType = operator.type;
     if (operatorType == TokenType.LT) {
       newOperator = '>';
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/extend_class_for_mixin.dart b/pkg/analysis_server/lib/src/services/correction/dart/extend_class_for_mixin.dart
index e9eab92..10dbaad 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/extend_class_for_mixin.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/extend_class_for_mixin.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -11,7 +9,7 @@
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 
 class ExtendClassForMixin extends CorrectionProducer {
-  String _typeName;
+  String _typeName = '';
 
   @override
   List<Object> get fixArguments => [_typeName];
@@ -21,6 +19,11 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
+    var diagnostic = this.diagnostic;
+    if (diagnostic == null) {
+      return;
+    }
+
     var declaration = node.thisOrAncestorOfType<ClassDeclaration>();
     if (declaration != null && declaration.extendsClause == null) {
       // TODO(brianwilkerson) Find a way to pass in the name of the class
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_children.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_children.dart
index 01cc86a..1c0f0ca 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_children.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_children.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -21,7 +19,7 @@
     NamedExpression namedExp;
     {
       var node = this.node;
-      var parent = node?.parent;
+      var parent = node.parent;
       var parent2 = parent?.parent;
       if (node is SimpleIdentifier &&
           parent is Label &&
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_stateful_widget.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_stateful_widget.dart
index 48cf327..a386080 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_stateful_widget.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_stateful_widget.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:_fe_analyzer_shared/src/scanner/token.dart';
 import 'package:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
@@ -37,14 +35,14 @@
     }
 
     // Find the build() method.
-    MethodDeclaration buildMethod;
+    MethodDeclaration? buildMethod;
     for (var member in widgetClass.members) {
-      if (member is MethodDeclaration &&
-          member.name.name == 'build' &&
-          member.parameters != null &&
-          member.parameters.parameters.length == 1) {
-        buildMethod = member;
-        break;
+      if (member is MethodDeclaration && member.name.name == 'build') {
+        var parameters = member.parameters;
+        if (parameters != null && parameters.parameters.length == 1) {
+          buildMethod = member;
+          break;
+        }
       }
     }
     if (buildMethod == null) {
@@ -52,8 +50,9 @@
     }
 
     // Must be a StatelessWidget subclasses.
-    var widgetClassElement = widgetClass.declaredElement;
-    if (!flutter.isExactlyStatelessWidgetType(widgetClassElement.supertype)) {
+    var widgetClassElement = widgetClass.declaredElement!;
+    var superType = widgetClassElement.supertype;
+    if (superType == null || !flutter.isExactlyStatelessWidgetType(superType)) {
       return;
     }
 
@@ -75,20 +74,26 @@
     for (var member in widgetClass.members) {
       if (member is FieldDeclaration && !member.isStatic) {
         for (var fieldNode in member.fields.variables) {
-          FieldElement fieldElement = fieldNode.declaredElement;
+          var fieldElement = fieldNode.declaredElement as FieldElement;
           if (!fieldsAssignedInConstructors.contains(fieldElement)) {
             nodesToMove.add(member);
             elementsToMove.add(fieldElement);
-            elementsToMove.add(fieldElement.getter);
-            if (fieldElement.setter != null) {
-              elementsToMove.add(fieldElement.setter);
+
+            var getter = fieldElement.getter;
+            if (getter != null) {
+              elementsToMove.add(getter);
+            }
+
+            var setter = fieldElement.setter;
+            if (setter != null) {
+              elementsToMove.add(setter);
             }
           }
         }
       }
       if (member is MethodDeclaration && !member.isStatic) {
         nodesToMove.add(member);
-        elementsToMove.add(member.declaredElement);
+        elementsToMove.add(member.declaredElement!);
       }
     }
 
@@ -128,8 +133,9 @@
       var hasBuildMethod = false;
 
       var typeParams = '';
-      if (widgetClass.typeParameters != null) {
-        typeParams = utils.getNodeText(widgetClass.typeParameters);
+      var typeParameters = widgetClass.typeParameters;
+      if (typeParameters != null) {
+        typeParams = utils.getNodeText(typeParameters);
       }
 
       /// Replace code between [replaceOffset] and [replaceEnd] with
@@ -206,10 +212,10 @@
 
         // Write just param names (and not bounds, metadata and docs).
         builder.write('<${widgetClass.name}');
-        if (widgetClass.typeParameters != null) {
+        if (typeParameters != null) {
           builder.write('<');
           var first = true;
-          for (var param in widgetClass.typeParameters.typeParameters) {
+          for (var param in typeParameters.typeParameters) {
             if (!first) {
               builder.write(', ');
               first = false;
@@ -250,7 +256,10 @@
     if (node.parent is FieldFormalParameter) {
       var element = node.staticElement;
       if (element is FieldFormalParameterElement) {
-        fieldsAssignedInConstructors.add(element.field);
+        var field = element.field;
+        if (field != null) {
+          fieldsAssignedInConstructors.add(field);
+        }
       }
     }
     if (node.parent is ConstructorFieldInitializer) {
@@ -290,7 +299,7 @@
     }
     var element = node.staticElement;
     if (element is ExecutableElement &&
-        element?.enclosingElement == widgetClassElement &&
+        element.enclosingElement == widgetClassElement &&
         !elementsToMove.contains(element)) {
       var offset = node.offset - linesRange.offset;
       var qualifier =
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_move_down.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_move_down.dart
index 740afed..1e2fa0f 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_move_down.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_move_down.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analyzer/dart/ast/ast.dart';
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_move_up.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_move_up.dart
index ec29164..8513af7 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_move_up.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_move_up.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analyzer/dart/ast/ast.dart';
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_remove_widget.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_remove_widget.dart
index 0158fbc..9818245 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_remove_widget.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_remove_widget.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -25,7 +23,7 @@
     // Prepare the list of our children.
     var childrenArgument = flutter.findChildrenArgument(widgetCreation);
     if (childrenArgument != null) {
-      var childrenExpression = childrenArgument?.expression;
+      var childrenExpression = childrenArgument.expression;
       if (childrenExpression is ListLiteral &&
           childrenExpression.elements.isNotEmpty) {
         await _removeChildren(
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_swap_with_child.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_swap_with_child.dart
index c1c46e5..c254da0 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_swap_with_child.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_swap_with_child.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -17,7 +15,8 @@
       InstanceCreationExpression parent,
       InstanceCreationExpression child) async {
     // The child must have its own child.
-    if (flutter.findChildArgument(child) == null) {
+    var stableChild = flutter.findChildArgument(child);
+    if (stableChild == null) {
       return;
     }
 
@@ -38,11 +37,8 @@
 
         // Write all the arguments of the parent.
         // Don't write the "child".
-        Expression stableChild;
         for (var argument in childArgs.arguments) {
-          if (flutter.isChildArgument(argument)) {
-            stableChild = argument;
-          } else {
+          if (argument != stableChild) {
             var text = utils.getNodeText(argument);
             text = replaceSourceIndent(text, childIndent, parentIndent);
             builder.write(parentIndent);
@@ -100,16 +96,16 @@
   @override
   Future<void> compute(ChangeBuilder builder) async {
     var parent = flutter.identifyNewExpression(node);
-    if (!flutter.isWidgetCreation(parent)) {
+    if (parent == null || !flutter.isWidgetCreation(parent)) {
       return;
     }
 
     var childArgument = flutter.findChildArgument(parent);
-    if (childArgument?.expression is! InstanceCreationExpression ||
-        !flutter.isWidgetCreation(childArgument.expression)) {
+    var child = childArgument?.expression;
+    if (child is! InstanceCreationExpression ||
+        !flutter.isWidgetCreation(child)) {
       return;
     }
-    InstanceCreationExpression child = childArgument.expression;
 
     await swapParentAndChild(builder, parent, child);
   }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_swap_with_parent.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_swap_with_parent.dart
index a8b9f8b..701c73e 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_swap_with_parent.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_swap_with_parent.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/dart/flutter_swap_with_child.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -17,7 +15,7 @@
   @override
   Future<void> compute(ChangeBuilder builder) async {
     var child = flutter.identifyNewExpression(node);
-    if (!flutter.isWidgetCreation(child)) {
+    if (child == null || !flutter.isWidgetCreation(child)) {
       return;
     }
 
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_generic.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_generic.dart
index 4938af4..5fcd235 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_generic.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_generic.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analyzer/dart/ast/ast.dart';
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_stream_builder.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_stream_builder.dart
index 50f11bb..ce2f849 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_stream_builder.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_stream_builder.dart
@@ -2,10 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
@@ -20,7 +19,7 @@
     if (widgetExpr == null) {
       return;
     }
-    if (flutter.isExactWidgetTypeStreamBuilder(widgetExpr.staticType)) {
+    if (flutter.isExactWidgetTypeStreamBuilder(widgetExpr.typeOrThrow)) {
       return;
     }
     var widgetSrc = utils.getNodeText(widgetExpr);
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/import_add_show.dart b/pkg/analysis_server/lib/src/services/correction/dart/import_add_show.dart
index 19ee675..4b923a3 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/import_add_show.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/import_add_show.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/services/correction/assist.dart';
@@ -39,7 +37,7 @@
     var namespace = getImportNamespace(importElement);
     // prepare names of referenced elements (from this import)
     var visitor = _ReferenceFinder(namespace);
-    resolvedResult.unit.accept(visitor);
+    unit.accept(visitor);
     var referencedNames = visitor.referencedNames;
     // ignore if unused
     if (referencedNames.isEmpty) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/import_library.dart b/pkg/analysis_server/lib/src/services/correction/dart/import_library.dart
index 872fd34..2274c6e 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/import_library.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/import_library.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/services/correction/dart/abstract_producer.dart';
@@ -56,10 +54,9 @@
     } else if (_importKind == _ImportKind.forTopLevelVariable) {
       var node = this.node;
       if (node is Annotation) {
-        Annotation annotation = node;
-        var name = annotation.name;
-        if (name != null && name.staticElement == null) {
-          if (annotation.arguments != null) {
+        var name = node.name;
+        if (name.staticElement == null) {
+          if (node.arguments != null) {
             return;
           }
           node = name;
@@ -75,10 +72,9 @@
     } else if (_importKind == _ImportKind.forType) {
       var node = this.node;
       if (node is Annotation) {
-        Annotation annotation = node;
-        var name = annotation.name;
-        if (name != null && name.staticElement == null) {
-          if (annotation.arguments == null) {
+        var name = node.name;
+        if (name.staticElement == null) {
+          if (node.arguments == null) {
             return;
           }
           node = name;
@@ -116,11 +112,8 @@
 
   /// Return the relative uri from the passed [library] to the given [path].
   /// If the [path] is not in the LibraryElement, `null` is returned.
-  String _getRelativeURIFromLibrary(LibraryElement library, String path) {
-    var librarySource = library?.librarySource;
-    if (librarySource == null) {
-      return null;
-    }
+  String? _getRelativeURIFromLibrary(LibraryElement library, String path) {
+    var librarySource = library.librarySource;
     var pathCtx = resourceProvider.pathContext;
     var libraryDirectory = pathCtx.dirname(librarySource.fullName);
     var sourceDirectory = pathCtx.dirname(path);
@@ -133,7 +126,7 @@
   }
 
   Iterable<CorrectionProducer> _importLibrary(FixKind fixKind, Uri library,
-      [String relativeURI]) sync* {
+      [String? relativeURI]) sync* {
     yield _ImportAbsoluteLibrary(fixKind, library);
     if (relativeURI != null && relativeURI.isNotEmpty) {
       yield _ImportRelativeLibrary(fixKind, relativeURI);
@@ -154,12 +147,15 @@
     for (var imp in libraryElement.imports) {
       // prepare element
       var libraryElement = imp.importedLibrary;
+      if (libraryElement == null) {
+        continue;
+      }
       var element = getExportedElement(libraryElement, name);
       if (element == null) {
         continue;
       }
       if (element is PropertyAccessorElement) {
-        element = (element as PropertyAccessorElement).variable;
+        element = element.variable;
       }
       if (!elementKinds.contains(element.kind)) {
         continue;
@@ -167,7 +163,7 @@
       // may be apply prefix
       var prefix = imp.prefix;
       if (prefix != null) {
-        yield _ImportLibraryPrefix(imp);
+        yield _ImportLibraryPrefix(libraryElement, prefix);
         continue;
       }
       // may be update "show" directive
@@ -265,7 +261,7 @@
 
   final Uri _library;
 
-  String _uriText;
+  String _uriText = '';
 
   _ImportAbsoluteLibrary(this._fixKind, this._library);
 
@@ -294,13 +290,14 @@
 /// A correction processor that can make one of the possible change computed by
 /// the [ImportLibrary] producer.
 class _ImportLibraryPrefix extends CorrectionProducer {
-  final ImportElement _importElement;
+  final LibraryElement _importedLibrary;
+  final PrefixElement _importPrefix;
 
-  String _libraryName;
+  String _libraryName = '';
 
-  String _prefixName;
+  String _prefixName = '';
 
-  _ImportLibraryPrefix(this._importElement);
+  _ImportLibraryPrefix(this._importedLibrary, this._importPrefix);
 
   @override
   List<Object> get fixArguments => [_libraryName, _prefixName];
@@ -310,10 +307,8 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
-    var libraryElement = _importElement.importedLibrary;
-    var prefix = _importElement.prefix;
-    _libraryName = libraryElement.displayName;
-    _prefixName = prefix.displayName;
+    _libraryName = _importedLibrary.displayName;
+    _prefixName = _importPrefix.displayName;
     await builder.addDartFileEdit(file, (builder) {
       builder.addSimpleReplacement(range.startLength(node, 0), '$_prefixName.');
     });
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/inline_invocation.dart b/pkg/analysis_server/lib/src/services/correction/dart/inline_invocation.dart
index eb35756..c2e0711 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/inline_invocation.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/inline_invocation.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
@@ -32,35 +30,42 @@
   @override
   Future<void> compute(ChangeBuilder builder) async {
     var node = this.node;
-    if (node is! SimpleIdentifier || node.parent is! MethodInvocation) {
+    if (node is! SimpleIdentifier || node.name != 'add') {
       return;
     }
-    SimpleIdentifier name = node;
-    MethodInvocation invocation = node.parent;
-    if (name != invocation.methodName ||
-        name.name != 'add' ||
+
+    var invocation = node.parent;
+    if (invocation is! MethodInvocation) {
+      return;
+    }
+
+    if (node != invocation.methodName ||
         !invocation.isCascaded ||
         invocation.argumentList.arguments.length != 1) {
       return;
     }
-    var cascade = invocation.thisOrAncestorOfType<CascadeExpression>();
+
+    var cascade = invocation.parent;
+    if (cascade is! CascadeExpression) {
+      return;
+    }
+
     var sections = cascade.cascadeSections;
     var target = cascade.target;
     if (target is! ListLiteral || sections[0] != invocation) {
       // TODO(brianwilkerson) Consider extending this to handle set literals.
       return;
     }
-    ListLiteral list = target;
     var argument = invocation.argumentList.arguments[0];
     var elementText = utils.getNodeText(argument);
 
     await builder.addDartFileEdit(file, (builder) {
-      if (list.elements.isNotEmpty) {
+      if (target.elements.isNotEmpty) {
         // ['a']..add(e);
-        builder.addSimpleInsertion(list.elements.last.end, ', $elementText');
+        builder.addSimpleInsertion(target.elements.last.end, ', $elementText');
       } else {
         // []..add(e);
-        builder.addSimpleInsertion(list.leftBracket.end, elementText);
+        builder.addSimpleInsertion(target.leftBracket.end, elementText);
       }
       builder.addDeletion(range.node(invocation));
     });
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/inline_typedef.dart b/pkg/analysis_server/lib/src/services/correction/dart/inline_typedef.dart
index 6790500..6272326 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/inline_typedef.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/inline_typedef.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:_fe_analyzer_shared/src/scanner/token.dart';
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
@@ -14,7 +12,7 @@
 import 'package:analyzer_plugin/utilities/range_factory.dart';
 
 class InlineTypedef extends CorrectionProducer {
-  String _name;
+  String _name = '';
 
   @override
   List<Object> get fixArguments => [_name];
@@ -27,13 +25,17 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
+    var parent = node.parent;
+    if (parent == null) {
+      return;
+    }
+
     //
     // Extract the information needed to build the edit.
     //
-    TypeAnnotation returnType;
-    TypeParameterList typeParameters;
+    TypeAnnotation? returnType;
+    TypeParameterList? typeParameters;
     List<FormalParameter> parameters;
-    var parent = node.parent;
     if (parent is FunctionTypeAlias) {
       returnType = parent.returnType;
       _name = parent.name.name;
@@ -44,6 +46,9 @@
         return;
       }
       var functionType = parent.functionType;
+      if (functionType == null) {
+        return;
+      }
       returnType = functionType.returnType;
       _name = parent.name.name;
       typeParameters = functionType.typeParameters;
@@ -53,8 +58,9 @@
     }
     // TODO(brianwilkerson) Handle parts.
     var finder = _ReferenceFinder(_name);
-    resolvedResult.unit.accept(finder);
-    if (finder.count != 1) {
+    unit.accept(finder);
+    var reference = finder.reference;
+    if (reference == null || finder.count != 1) {
       return;
     }
     //
@@ -62,7 +68,7 @@
     //
     await builder.addDartFileEdit(file, (builder) {
       builder.addDeletion(utils.getLinesRange(range.node(parent)));
-      builder.addReplacement(range.node(finder.reference), (builder) {
+      builder.addReplacement(range.node(reference), (builder) {
         if (returnType != null) {
           builder.write(utils.getNodeText(returnType));
           builder.write(' ');
@@ -71,7 +77,7 @@
         if (typeParameters != null) {
           builder.write(utils.getNodeText(typeParameters));
         }
-        String groupEnd;
+        String? groupEnd;
         builder.write('(');
         for (var i = 0; i < parameters.length; i++) {
           var parameter = parameters[i];
@@ -90,7 +96,7 @@
                 builder.write('[');
               }
             }
-            parameter = (parameter as DefaultFormalParameter).parameter;
+            parameter = parameter.parameter;
           }
           if (parameter is FunctionTypedFormalParameter) {
             builder.write(utils.getNodeText(parameter));
@@ -109,14 +115,18 @@
             if (keyword != null && keyword.type != Keyword.VAR) {
               builder.write(keyword.lexeme);
             }
-            if (parameter.type == null) {
+            var typeAnnotation = parameter.type;
+            if (typeAnnotation == null) {
               builder.write('dynamic');
             } else {
-              builder.write(utils.getNodeText(parameter.type));
+              builder.write(utils.getNodeText(typeAnnotation));
             }
             if (parameter.isNamed) {
-              builder.write(' ');
-              builder.write(parameter.identifier.name);
+              var identifier = parameter.identifier;
+              if (identifier != null) {
+                builder.write(' ');
+                builder.write(identifier.name);
+              }
             }
           }
         }
@@ -135,7 +145,7 @@
 class _ReferenceFinder extends RecursiveAstVisitor {
   final String typeName;
 
-  TypeName reference;
+  TypeName? reference;
 
   int count = 0;
 
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/insert_semicolon.dart b/pkg/analysis_server/lib/src/services/correction/dart/insert_semicolon.dart
index 8c837c1..60ad47b 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/insert_semicolon.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/insert_semicolon.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -16,6 +14,11 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
+    var diagnostic = this.diagnostic;
+    if (diagnostic == null) {
+      return;
+    }
+
     var message = diagnostic.problemMessage;
     if (message.message.contains("';'")) {
       if (_isAwaitNode()) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/introduce_local_cast_type.dart b/pkg/analysis_server/lib/src/services/correction/dart/introduce_local_cast_type.dart
index c696b43..e3c3b29 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/introduce_local_cast_type.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/introduce_local_cast_type.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/name_suggestion.dart';
@@ -19,42 +17,25 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
-    var node = this.node;
-    if (node is IfStatement) {
-      node = (node as IfStatement).condition;
-    } else if (node is WhileStatement) {
-      node = (node as WhileStatement).condition;
-    }
-    // prepare IsExpression
-    if (node is! IsExpression) {
+    var isExpression = _getCondition(node);
+    if (isExpression is! IsExpression) {
       return;
     }
-    IsExpression isExpression = node;
     var castType = isExpression.type.type;
     var castTypeCode = utils.getNodeText(isExpression.type);
     // prepare environment
-    var indent = utils.getIndent(1);
-    String prefix;
-    Block targetBlock;
-    {
-      var statement = node.thisOrAncestorOfType<Statement>();
-      if (statement is IfStatement && statement.thenStatement is Block) {
-        targetBlock = statement.thenStatement;
-      } else if (statement is WhileStatement && statement.body is Block) {
-        targetBlock = statement.body;
-      } else {
-        return;
-      }
-      prefix = utils.getNodePrefix(statement);
+    var enclosingStatement = _enclosingStatement(isExpression);
+    if (enclosingStatement == null) {
+      return;
     }
     // prepare location
     int offset;
     String statementPrefix;
     if (isExpression.notOperator == null) {
-      offset = targetBlock.leftBracket.end;
-      statementPrefix = indent;
+      offset = enclosingStatement.block.leftBracket.end;
+      statementPrefix = utils.getIndent(1);
     } else {
-      offset = targetBlock.rightBracket.end;
+      offset = enclosingStatement.block.rightBracket.end;
       statementPrefix = '';
     }
     // prepare excluded names
@@ -69,7 +50,7 @@
     if (suggestions.isNotEmpty) {
       await builder.addDartFileEdit(file, (builder) {
         builder.addInsertion(offset, (builder) {
-          builder.write(eol + prefix + statementPrefix);
+          builder.write(eol + enclosingStatement.prefix + statementPrefix);
           builder.write(castTypeCode);
           builder.write(' ');
           builder.addSimpleLinkedEdit('NAME', suggestions[0],
@@ -84,6 +65,54 @@
     }
   }
 
+  _EnclosingStatement? _enclosingStatement(IsExpression condition) {
+    var statement = condition.thisOrAncestorOfType<Statement>();
+    if (statement is IfStatement) {
+      var thenStatement = statement.thenStatement;
+      if (thenStatement is Block) {
+        return _EnclosingStatement(
+          utils.getNodePrefix(statement),
+          thenStatement,
+        );
+      }
+    } else if (statement is WhileStatement) {
+      var body = statement.body;
+      if (body is Block) {
+        return _EnclosingStatement(
+          utils.getNodePrefix(statement),
+          body,
+        );
+      }
+    }
+    return null;
+  }
+
   /// Return an instance of this class. Used as a tear-off in `AssistProcessor`.
   static IntroduceLocalCastType newInstance() => IntroduceLocalCastType();
+
+  static Expression? _getCondition(AstNode node) {
+    if (node is IfStatement) {
+      return node.condition;
+    } else if (node is WhileStatement) {
+      return node.condition;
+    }
+
+    if (node is Expression) {
+      var parent = node.parent;
+      if (parent is IfStatement && parent.condition == node) {
+        return node;
+      } else if (parent is WhileStatement && parent.condition == node) {
+        return node;
+      }
+    }
+
+    return null;
+  }
+}
+
+class _EnclosingStatement {
+  final String prefix;
+  final Block block;
+
+  _EnclosingStatement(this.prefix, this.block);
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/invert_if_statement.dart b/pkg/analysis_server/lib/src/services/correction/dart/invert_if_statement.dart
index 2fa703ac..20e22c9 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/invert_if_statement.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/invert_if_statement.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -17,15 +15,15 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
-    if (node is! IfStatement) {
+    var ifStatement = node;
+    if (ifStatement is! IfStatement) {
       return;
     }
-    var ifStatement = node as IfStatement;
     var condition = ifStatement.condition;
     // should have both "then" and "else"
     var thenStatement = ifStatement.thenStatement;
     var elseStatement = ifStatement.elseStatement;
-    if (thenStatement == null || elseStatement == null) {
+    if (elseStatement == null) {
       return;
     }
     // prepare source
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/join_if_with_inner.dart b/pkg/analysis_server/lib/src/services/correction/dart/join_if_with_inner.dart
index 00337c6..9b123a07 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/join_if_with_inner.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/join_if_with_inner.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/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/util.dart';
+import 'package:analysis_server/src/utilities/extensions/ast.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
@@ -19,25 +18,20 @@
   @override
   Future<void> compute(ChangeBuilder builder) async {
     // climb up condition to the (supposedly) "if" statement
-    var node = this.node;
-    while (node is Expression) {
-      node = node.parent;
-    }
+    var targetIfStatement = node.enclosingIfStatement;
     // prepare target "if" statement
-    if (node is! IfStatement) {
+    if (targetIfStatement == null) {
       return;
     }
-    var targetIfStatement = node as IfStatement;
     if (targetIfStatement.elseStatement != null) {
       return;
     }
     // prepare inner "if" statement
     var targetThenStatement = targetIfStatement.thenStatement;
-    var innerStatement = getSingleStatement(targetThenStatement);
-    if (innerStatement is! IfStatement) {
+    var innerIfStatement = getSingleStatement(targetThenStatement);
+    if (innerIfStatement is! IfStatement) {
       return;
     }
-    var innerIfStatement = innerStatement as IfStatement;
     if (innerIfStatement.elseStatement != null) {
       return;
     }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/join_if_with_outer.dart b/pkg/analysis_server/lib/src/services/correction/dart/join_if_with_outer.dart
index 22761fe..5d17b46 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/join_if_with_outer.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/join_if_with_outer.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/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/util.dart';
+import 'package:analysis_server/src/utilities/extensions/ast.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
@@ -19,22 +18,18 @@
   @override
   Future<void> compute(ChangeBuilder builder) async {
     // climb up condition to the (supposedly) "if" statement
-    var node = this.node;
-    while (node is Expression) {
-      node = node.parent;
-    }
+    var targetIfStatement = node.enclosingIfStatement;
     // prepare target "if" statement
-    if (node is! IfStatement) {
+    if (targetIfStatement == null) {
       return;
     }
-    var targetIfStatement = node as IfStatement;
     if (targetIfStatement.elseStatement != null) {
       return;
     }
     // prepare outer "if" statement
     var parent = targetIfStatement.parent;
     if (parent is Block) {
-      if ((parent as Block).statements.length != 1) {
+      if (parent.statements.length != 1) {
         return;
       }
       parent = parent.parent;
@@ -42,7 +37,7 @@
     if (parent is! IfStatement) {
       return;
     }
-    var outerIfStatement = parent as IfStatement;
+    var outerIfStatement = parent;
     if (outerIfStatement.elseStatement != null) {
       return;
     }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/join_variable_declaration.dart b/pkg/analysis_server/lib/src/services/correction/dart/join_variable_declaration.dart
index c7713a2..015acb8 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/join_variable_declaration.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/join_variable_declaration.dart
@@ -2,13 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:_fe_analyzer_shared/src/scanner/token.dart';
 import 'package:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
@@ -19,12 +16,13 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
+    var node = this.node;
     if (node is SimpleIdentifier) {
       var parent = node.parent;
       if (parent is AssignmentExpression &&
           parent.leftHandSide == node &&
           parent.parent is ExpressionStatement) {
-        await _joinOnAssignment(builder, parent);
+        await _joinOnAssignment(builder, node, parent);
         return;
       }
     }
@@ -36,58 +34,57 @@
 
   /// Join the declaration when the variable is on the left-hand side of an
   /// assignment.
-  Future<void> _joinOnAssignment(
-      ChangeBuilder builder, AssignmentExpression assignExpression) async {
+  Future<void> _joinOnAssignment(ChangeBuilder builder, SimpleIdentifier left,
+      AssignmentExpression assignment) async {
     // Check that assignment is not a compound assignment.
-    if (assignExpression.operator.type != TokenType.EQ) {
+    if (assignment.operator.type != TokenType.EQ) {
       return;
     }
-    // prepare "declaration" statement
-    var element = (node as SimpleIdentifier).staticElement;
-    if (element == null) {
+
+    // The assignment must be a separate statement.
+    var assignmentStatement = assignment.parent;
+    if (assignmentStatement is! ExpressionStatement) {
       return;
     }
-    var declOffset = element.nameOffset;
-    var unit = resolvedResult.unit;
-    var declNode = NodeLocator(declOffset).searchWithin(unit);
-    if (declNode != null &&
-        declNode.parent is VariableDeclaration &&
-        (declNode.parent as VariableDeclaration).name == declNode &&
-        declNode.parent.parent is VariableDeclarationList &&
-        declNode.parent.parent.parent is VariableDeclarationStatement) {
-    } else {
+
+    // ...in a Block.
+    var block = assignmentStatement.parent;
+    if (block is! Block) {
       return;
     }
-    var decl = declNode.parent as VariableDeclaration;
-    var declStatement = decl.parent.parent as VariableDeclarationStatement;
-    // may be has initializer
-    if (decl.initializer != null) {
+
+    // Prepare the index in the enclosing Block.
+    var statements = block.statements;
+    var assignmentStatementIndex = statements.indexOf(assignmentStatement);
+    if (assignmentStatementIndex < 1) {
       return;
     }
-    // check that "declaration" statement declared only one variable
-    if (declStatement.variables.variables.length != 1) {
+
+    // The immediately previous statement must be a declaration.
+    var declarationStatement = statements[assignmentStatementIndex - 1];
+    if (declarationStatement is! VariableDeclarationStatement) {
       return;
     }
-    // check that the "declaration" and "assignment" statements are
-    // parts of the same Block
-    var assignStatement = node.parent.parent as ExpressionStatement;
-    if (assignStatement.parent is Block &&
-        assignStatement.parent == declStatement.parent) {
-    } else {
+
+    // Only one variable must be declared.
+    var declaredVariables = declarationStatement.variables.variables;
+    if (declaredVariables.length != 1) {
       return;
     }
-    var block = assignStatement.parent as Block;
-    // check that "declaration" and "assignment" statements are adjacent
-    List<Statement> statements = block.statements;
-    if (statements.indexOf(assignStatement) ==
-        statements.indexOf(declStatement) + 1) {
-    } else {
+
+    // The declared variable must be the one that is assigned.
+    // There must be no initializer.
+    var declaredVariable = declaredVariables.single;
+    if (declaredVariable.declaredElement != left.staticElement ||
+        declaredVariable.initializer != null) {
       return;
     }
 
     await builder.addDartFileEdit(file, (builder) {
       builder.addSimpleReplacement(
-          range.endStart(declNode, assignExpression.operator), ' ');
+        range.endStart(declaredVariable, assignment.operator),
+        ' ',
+      );
     });
   }
 
@@ -95,50 +92,65 @@
   /// assignment.
   Future<void> _joinOnDeclaration(
       ChangeBuilder builder, VariableDeclarationList declList) async {
-    // prepare enclosing VariableDeclarationList
-    var decl = declList.variables[0];
-    // already initialized
-    if (decl.initializer != null) {
+    // Only one variable must be declared.
+    var declaredVariables = declList.variables;
+    if (declaredVariables.length != 1) {
       return;
     }
-    // prepare VariableDeclarationStatement in Block
-    if (declList.parent is VariableDeclarationStatement &&
-        declList.parent.parent is Block) {
-    } else {
+
+    // The declared variable must not be initialized.
+    var declaredVariable = declaredVariables.single;
+    if (declaredVariable.initializer != null) {
       return;
     }
-    var declStatement = declList.parent as VariableDeclarationStatement;
-    var block = declStatement.parent as Block;
-    List<Statement> statements = block.statements;
-    // prepare assignment
-    // declaration should not be last Statement
-    var declIndex = statements.indexOf(declStatement);
-    if (declIndex < statements.length - 1) {
-    } else {
+
+    // The declaration must be a separate statement.
+    var declarationStatement = declList.parent;
+    if (declarationStatement is! VariableDeclarationStatement) {
       return;
     }
-    // next Statement should be assignment
-    var assignStatement = statements[declIndex + 1];
-    if (assignStatement is ExpressionStatement) {
-    } else {
+
+    // ...in a Block.
+    var block = declarationStatement.parent;
+    if (block is! Block) {
       return;
     }
-    var expressionStatement = assignStatement as ExpressionStatement;
-    // expression should be assignment
-    if (expressionStatement.expression is AssignmentExpression) {
-    } else {
+
+    // The declaration statement must not be the last in the block.
+    var statements = block.statements;
+    var declarationStatementIndex = statements.indexOf(declarationStatement);
+    if (declarationStatementIndex < 0 ||
+        declarationStatementIndex >= statements.length - 1) {
       return;
     }
-    var assignExpression =
-        expressionStatement.expression as AssignmentExpression;
-    // check that pure assignment
-    if (assignExpression.operator.type != TokenType.EQ) {
+
+    // The immediately following statement must be an assignment statement.
+    var assignmentStatement = statements[declarationStatementIndex + 1];
+    if (assignmentStatement is! ExpressionStatement) {
+      return;
+    }
+
+    // Really an assignment.
+    var assignment = assignmentStatement.expression;
+    if (assignment is! AssignmentExpression) {
+      return;
+    }
+
+    // The assignment should write into the declared variable.
+    if (assignment.writeElement != declaredVariable.declaredElement) {
+      return;
+    }
+
+    // The assignment must be pure.
+    if (assignment.operator.type != TokenType.EQ) {
       return;
     }
 
     await builder.addDartFileEdit(file, (builder) {
       builder.addSimpleReplacement(
-          range.endStart(decl.name, assignExpression.operator), ' ');
+        range.endStart(declaredVariable.name, assignment.operator),
+        ' ',
+      );
     });
   }
 
diff --git a/pkg/analysis_server/lib/src/services/correction/util.dart b/pkg/analysis_server/lib/src/services/correction/util.dart
index 7480d17..c61a3fd 100644
--- a/pkg/analysis_server/lib/src/services/correction/util.dart
+++ b/pkg/analysis_server/lib/src/services/correction/util.dart
@@ -482,14 +482,9 @@
 /// If the given [expression] is the `expression` property of a
 /// [NamedExpression] then returns this [NamedExpression], otherwise returns
 /// [expression].
-Expression? stepUpNamedExpression(Expression? expression) {
-  if (expression != null) {
-    var parent = expression.parent;
-    if (parent is NamedExpression && parent.expression == expression) {
-      return parent;
-    }
-  }
-  return expression;
+Expression stepUpNamedExpression(Expression expression) {
+  var parent = expression.parent;
+  return parent is NamedExpression ? parent : expression;
 }
 
 /// Return `true` if the given [lists] are identical at the given [position].
diff --git a/pkg/analysis_server/lib/src/utilities/extensions/ast.dart b/pkg/analysis_server/lib/src/utilities/extensions/ast.dart
index 3448861..92403c0 100644
--- a/pkg/analysis_server/lib/src/utilities/extensions/ast.dart
+++ b/pkg/analysis_server/lib/src/utilities/extensions/ast.dart
@@ -62,6 +62,17 @@
 
   bool get inWhileLoop => thisOrAncestorOfType<WhileStatement>() != null;
 
+  /// Return the [IfStatement] associated with `this`.
+  IfStatement? get enclosingIfStatement {
+    for (var node in withParents) {
+      if (node is IfStatement) {
+        return node;
+      } else if (node is! Expression) {
+        return null;
+      }
+    }
+  }
+
   /// Return this node and all its parents.
   Iterable<AstNode> get withParents sync* {
     var current = this;
diff --git a/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
index dc5be49..a9f5b6a 100644
--- a/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/arglist_contributor.dart';
 import 'package:analyzer/src/dart/analysis/experiments.dart';
@@ -34,7 +32,9 @@
   /// Assert that there is a suggestion with the given parameter [name] that has
   /// the given [completion], [selectionOffset] and [selectionLength].
   void assertSuggestArgumentAndCompletion(String name,
-      {String completion, int selectionOffset, int selectionLength = 0}) {
+      {required String completion,
+      required int selectionOffset,
+      int selectionLength = 0}) {
     var suggestion = suggestions.firstWhere((s) => s.parameterName == name);
     expect(suggestion, isNotNull);
     expect(suggestion.completion, completion);
@@ -45,8 +45,8 @@
   void assertSuggestArgumentList_params(
       List<String> expectedNames,
       List<String> expectedTypes,
-      List<String> actualNames,
-      List<String> actualTypes) {
+      List<String>? actualNames,
+      List<String>? actualTypes) {
     if (actualNames != null &&
         actualNames.length == expectedNames.length &&
         actualTypes != null &&
@@ -75,7 +75,7 @@
   /// Assert that the specified named argument suggestions with their types are
   /// the only suggestions.
   void assertSuggestArgumentsAndTypes(
-      {Map<String, String> namedArgumentsWithTypes,
+      {required Map<String, String> namedArgumentsWithTypes,
       List<int> requiredParamIndices = const <int>[],
       bool includeColon = true,
       bool includeComma = false}) {
@@ -797,11 +797,10 @@
     expect(suggestion.docSummary, 'aaa');
     expect(suggestion.docComplete, 'aaa\n\nbbb\nccc');
 
-    var element = suggestion.element;
-    expect(element, isNotNull);
+    var element = suggestion.element!;
     expect(element.kind, ElementKind.PARAMETER);
     expect(element.name, 'fff');
-    expect(element.location.offset, content.indexOf('fff})'));
+    expect(element.location!.offset, content.indexOf('fff})'));
   }
 
   Future<void>
@@ -823,11 +822,10 @@
     expect(suggestion.docSummary, isNull);
     expect(suggestion.docComplete, isNull);
 
-    var element = suggestion.element;
-    expect(element, isNotNull);
+    var element = suggestion.element!;
     expect(element.kind, ElementKind.PARAMETER);
     expect(element.name, 'fff');
-    expect(element.location.offset, content.indexOf('fff})'));
+    expect(element.location!.offset, content.indexOf('fff})'));
   }
 
   Future<void> test_ArgumentList_local_constructor_named_param() async {
diff --git a/pkg/analysis_server/test/services/completion/dart/combinator_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/combinator_contributor_test.dart
index 952c66a..ea96470 100644
--- a/pkg/analysis_server/test/services/completion/dart/combinator_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/combinator_contributor_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/combinator_contributor.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
index d0bb800..d0cff3d 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.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:async';
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
@@ -16,15 +14,16 @@
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/src/dartdoc/dartdoc_directive_info.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
+import 'package:collection/collection.dart';
 import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 
 import '../../../abstract_context.dart';
 
 SuggestionMatcher suggestionHas(
-        {@required String completion,
-        ElementKind element,
-        CompletionSuggestionKind kind}) =>
+        {required String completion,
+        ElementKind? element,
+        CompletionSuggestionKind? kind}) =>
     (CompletionSuggestion s) {
       if (s.completion == completion) {
         if (element != null && s.element?.kind != element) {
@@ -44,7 +43,7 @@
 /// suggestions.
 abstract class DartCompletionContributorTest
     extends _BaseDartCompletionContributorTest {
-  DartCompletionContributor contributor;
+  late DartCompletionContributor contributor;
 
   @nonVirtual
   @override
@@ -67,19 +66,19 @@
 abstract class _BaseDartCompletionContributorTest extends AbstractContextTest
     with WithNonFunctionTypeAliasesMixin {
   static const String _UNCHECKED = '__UNCHECKED__';
-  String testFile;
-  int completionOffset;
-  int replacementOffset;
-  int replacementLength;
+  late String testFile;
+  int? completionOffset;
+  late int replacementOffset;
+  late int replacementLength;
 
-  ResolvedUnitResult result;
+  late ResolvedUnitResult result;
 
   /// The Dartdoc information passed to requests.
   final DartdocDirectiveInfo dartdocInfo = DartdocDirectiveInfo();
 
-  DartCompletionRequest request;
+  late DartCompletionRequest request;
 
-  List<CompletionSuggestion> suggestions;
+  late List<CompletionSuggestion> suggestions;
 
   /// If `true` and `null` is specified as the suggestion's expected returnType
   /// then the actual suggestion is expected to have a `dynamic` returnType.
@@ -95,11 +94,11 @@
   void addTestSource(String content) {
     expect(completionOffset, isNull, reason: 'Call addTestUnit exactly once');
     completionOffset = content.indexOf('^');
-    expect(completionOffset, isNot(equals(-1)), reason: 'missing ^');
-    var nextOffset = content.indexOf('^', completionOffset + 1);
+    expect(completionOffset, greaterThanOrEqualTo(0), reason: 'missing ^');
+    var nextOffset = content.indexOf('^', completionOffset! + 1);
     expect(nextOffset, equals(-1), reason: 'too many ^');
     content = content.substring(0, completionOffset) +
-        content.substring(completionOffset + 1);
+        content.substring(completionOffset! + 1);
     addSource(testFile, content);
   }
 
@@ -138,37 +137,36 @@
   }
 
   void assertHasParameterInfo(CompletionSuggestion suggestion) {
-    expect(suggestion.parameterNames, isNotNull);
-    expect(suggestion.parameterTypes, isNotNull);
-    expect(suggestion.parameterNames.length, suggestion.parameterTypes.length);
+    var parameterNames = suggestion.parameterNames!;
+    var parameterTypes = suggestion.parameterTypes!;
+    expect(parameterNames.length, parameterTypes.length);
     expect(suggestion.requiredParameterCount,
-        lessThanOrEqualTo(suggestion.parameterNames.length));
+        lessThanOrEqualTo(parameterNames.length));
     expect(suggestion.hasNamedParameters, isNotNull);
   }
 
-  void assertNoSuggestions({CompletionSuggestionKind kind}) {
+  void assertNoSuggestions({CompletionSuggestionKind? kind}) {
     if (kind == null) {
       if (suggestions.isNotEmpty) {
         failedCompletion('Expected no suggestions', suggestions);
       }
       return;
     }
-    var suggestion = suggestions.firstWhere(
-        (CompletionSuggestion cs) => cs.kind == kind,
-        orElse: () => null);
+    var suggestion = suggestions
+        .firstWhereOrNull((CompletionSuggestion cs) => cs.kind == kind);
     if (suggestion != null) {
       failedCompletion('did not expect completion: $completion\n  $suggestion');
     }
   }
 
-  void assertNotSuggested(String completion, {ElementKind elemKind}) {
-    var suggestion = suggestions.firstWhere((CompletionSuggestion cs) {
+  void assertNotSuggested(String completion, {ElementKind? elemKind}) {
+    var suggestion = suggestions.firstWhereOrNull((CompletionSuggestion cs) {
       if (elemKind == null) {
         return cs.completion == completion;
       } else {
-        return cs.completion == completion && cs.element.kind == elemKind;
+        return cs.completion == completion && cs.element!.kind == elemKind;
       }
-    }, orElse: () => null);
+    });
     if (suggestion != null) {
       failedCompletion('did not expect completion: $completion\n  $suggestion');
     }
@@ -176,16 +174,16 @@
 
   CompletionSuggestion assertSuggest(String completion,
       {CompletionSuggestionKind csKind = CompletionSuggestionKind.INVOCATION,
-      ElementKind elemKind,
+      ElementKind? elemKind,
       bool isDeprecated = false,
       bool isPotential = false,
-      String elemFile,
-      int elemOffset,
-      int selectionOffset,
-      String paramName,
-      String paramType,
-      String defaultArgListString = _UNCHECKED,
-      List<int> defaultArgumentListTextRanges,
+      String? elemFile,
+      int? elemOffset,
+      int? selectionOffset,
+      String? paramName,
+      String? paramType,
+      String? defaultArgListString = _UNCHECKED,
+      List<int>? defaultArgumentListTextRanges,
       bool isSynthetic = false,
       bool skipLocationCheck = false}) {
     var cs =
@@ -198,19 +196,20 @@
     expect(cs.selectionLength, equals(0));
     expect(cs.isDeprecated, equals(isDeprecated));
     expect(cs.isPotential, equals(isPotential));
-    if (!isSynthetic && cs.element != null && !skipLocationCheck) {
-      expect(cs.element.location, isNotNull);
-      expect(cs.element.location.file, isNotNull);
-      expect(cs.element.location.offset, isNotNull);
-      expect(cs.element.location.length, isNotNull);
-      expect(cs.element.location.startColumn, isNotNull);
-      expect(cs.element.location.startLine, isNotNull);
+    var element = cs.element;
+    if (!isSynthetic && element != null && !skipLocationCheck) {
+      var location = element.location!;
+      expect(location.file, isNotNull);
+      expect(location.offset, isNotNull);
+      expect(location.length, isNotNull);
+      expect(location.startColumn, isNotNull);
+      expect(location.startLine, isNotNull);
     }
     if (elemFile != null) {
-      expect(cs.element.location.file, convertPath(elemFile));
+      expect(element!.location!.file, convertPath(elemFile));
     }
     if (elemOffset != null) {
-      expect(cs.element.location.offset, elemOffset);
+      expect(element!.location!.offset, elemOffset);
     }
     if (paramName != null) {
       expect(cs.parameterName, paramName);
@@ -230,17 +229,16 @@
   CompletionSuggestion assertSuggestClass(String name,
       {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
       bool isDeprecated = false,
-      String elemFile,
-      String elemName,
-      int elemOffset}) {
+      String? elemFile,
+      String? elemName,
+      int? elemOffset}) {
     var cs = assertSuggest(name,
         csKind: kind,
         isDeprecated: isDeprecated,
         elemFile: elemFile,
         elemKind: ElementKind.CLASS,
         elemOffset: elemOffset);
-    var element = cs.element;
-    expect(element, isNotNull);
+    var element = cs.element!;
     expect(element.kind, equals(ElementKind.CLASS));
     expect(element.name, equals(elemName ?? name));
     expect(element.parameters, isNull);
@@ -252,8 +250,7 @@
   CompletionSuggestion assertSuggestClassTypeAlias(String name,
       {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION}) {
     var cs = assertSuggest(name, csKind: kind);
-    var element = cs.element;
-    expect(element, isNotNull);
+    var element = cs.element!;
     expect(element.kind, equals(ElementKind.CLASS_TYPE_ALIAS));
     expect(element.name, equals(name));
     expect(element.parameters, isNull);
@@ -263,17 +260,16 @@
   }
 
   CompletionSuggestion assertSuggestConstructor(String name,
-      {String elementName,
-      int elemOffset,
+      {String? elementName,
+      int? elemOffset,
       String defaultArgListString = _UNCHECKED,
-      List<int> defaultArgumentListTextRanges}) {
+      List<int>? defaultArgumentListTextRanges}) {
     var cs = assertSuggest(name,
         elemKind: ElementKind.CONSTRUCTOR,
         elemOffset: elemOffset,
         defaultArgListString: defaultArgListString,
         defaultArgumentListTextRanges: defaultArgumentListTextRanges);
-    var element = cs.element;
-    expect(element, isNotNull);
+    var element = cs.element!;
     expect(element.kind, equals(ElementKind.CONSTRUCTOR));
     var index = name.indexOf('.');
     elementName ??= index >= 0 ? name.substring(index + 1) : '';
@@ -285,7 +281,7 @@
       {bool isDeprecated = false}) {
     var suggestion = assertSuggest(completion, isDeprecated: isDeprecated);
     expect(suggestion.isDeprecated, isDeprecated);
-    expect(suggestion.element.kind, ElementKind.ENUM);
+    expect(suggestion.element!.kind, ElementKind.ENUM);
     return suggestion;
   }
 
@@ -294,19 +290,18 @@
     var suggestion = assertSuggest(completion, isDeprecated: isDeprecated);
     expect(suggestion.completion, completion);
     expect(suggestion.isDeprecated, isDeprecated);
-    expect(suggestion.element.kind, ElementKind.ENUM_CONSTANT);
+    expect(suggestion.element!.kind, ElementKind.ENUM_CONSTANT);
     return suggestion;
   }
 
-  CompletionSuggestion assertSuggestField(String name, String type,
+  CompletionSuggestion assertSuggestField(String name, String? type,
       {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
       bool isDeprecated = false}) {
     var cs = assertSuggest(name,
         csKind: kind, elemKind: ElementKind.FIELD, isDeprecated: isDeprecated);
     // The returnType represents the type of a field
     expect(cs.returnType, type ?? 'dynamic');
-    var element = cs.element;
-    expect(element, isNotNull);
+    var element = cs.element!;
     expect(element.kind, equals(ElementKind.FIELD));
     expect(element.name, equals(name));
     expect(element.parameters, isNull);
@@ -316,11 +311,11 @@
     return cs;
   }
 
-  CompletionSuggestion assertSuggestFunction(String name, String returnType,
+  CompletionSuggestion assertSuggestFunction(String name, String? returnType,
       {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
       bool isDeprecated = false,
-      String defaultArgListString = _UNCHECKED,
-      List<int> defaultArgumentListTextRanges}) {
+      String? defaultArgListString = _UNCHECKED,
+      List<int>? defaultArgumentListTextRanges}) {
     var cs = assertSuggest(name,
         csKind: kind,
         isDeprecated: isDeprecated,
@@ -331,13 +326,11 @@
     } else if (isNullExpectedReturnTypeConsideredDynamic) {
       expect(cs.returnType, 'dynamic');
     }
-    var element = cs.element;
-    expect(element, isNotNull);
+    var element = cs.element!;
     expect(element.kind, equals(ElementKind.FUNCTION));
     expect(element.name, equals(name));
     expect(element.isDeprecated, equals(isDeprecated));
-    var param = element.parameters;
-    expect(param, isNotNull);
+    var param = element.parameters!;
     expect(param[0], equals('('));
     expect(param[param.length - 1], equals(')'));
     if (returnType != null) {
@@ -349,14 +342,13 @@
     return cs;
   }
 
-  CompletionSuggestion assertSuggestGetter(String name, String returnType,
+  CompletionSuggestion assertSuggestGetter(String name, String? returnType,
       {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
       bool isDeprecated = false}) {
     var cs = assertSuggest(name,
         csKind: kind, elemKind: ElementKind.GETTER, isDeprecated: isDeprecated);
     expect(cs.returnType, returnType ?? 'dynamic');
-    var element = cs.element;
-    expect(element, isNotNull);
+    var element = cs.element!;
     expect(element.kind, equals(ElementKind.GETTER));
     expect(element.name, equals(name));
     expect(element.parameters, isNull);
@@ -366,12 +358,11 @@
   }
 
   CompletionSuggestion assertSuggestLocalVariable(
-      String name, String returnType) {
+      String name, String? returnType) {
     // Local variables should only be suggested by LocalReferenceContributor
     var cs = assertSuggest(name, csKind: CompletionSuggestionKind.INVOCATION);
     expect(cs.returnType, returnType ?? 'dynamic');
-    var element = cs.element;
-    expect(element, isNotNull);
+    var element = cs.element!;
     expect(element.kind, equals(ElementKind.LOCAL_VARIABLE));
     expect(element.name, equals(name));
     expect(element.parameters, isNull);
@@ -381,11 +372,11 @@
   }
 
   CompletionSuggestion assertSuggestMethod(
-      String name, String declaringType, String returnType,
+      String name, String? declaringType, String? returnType,
       {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
       bool isDeprecated = false,
-      String defaultArgListString = _UNCHECKED,
-      List<int> defaultArgumentListTextRanges,
+      String? defaultArgListString = _UNCHECKED,
+      List<int>? defaultArgumentListTextRanges,
       bool skipLocationCheck = false}) {
     var cs = assertSuggest(name,
         csKind: kind,
@@ -395,12 +386,10 @@
         skipLocationCheck: skipLocationCheck);
     expect(cs.declaringType, equals(declaringType));
     expect(cs.returnType, returnType ?? 'dynamic');
-    var element = cs.element;
-    expect(element, isNotNull);
+    var element = cs.element!;
     expect(element.kind, equals(ElementKind.METHOD));
     expect(element.name, equals(name));
-    var param = element.parameters;
-    expect(param, isNotNull);
+    var param = element.parameters!;
     expect(param[0], equals('('));
     expect(param[param.length - 1], equals(')'));
     expect(element.returnType, returnType ?? 'dynamic');
@@ -411,17 +400,16 @@
   CompletionSuggestion assertSuggestMixin(String name,
       {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
       bool isDeprecated = false,
-      String elemFile,
-      String elemName,
-      int elemOffset}) {
+      String? elemFile,
+      String? elemName,
+      int? elemOffset}) {
     var cs = assertSuggest(name,
         csKind: kind,
         isDeprecated: isDeprecated,
         elemFile: elemFile,
         elemKind: ElementKind.MIXIN,
         elemOffset: elemOffset);
-    var element = cs.element;
-    expect(element, isNotNull);
+    var element = cs.element!;
     expect(element.kind, equals(ElementKind.MIXIN));
     expect(element.name, equals(elemName ?? name));
     expect(element.parameters, isNull);
@@ -440,11 +428,10 @@
     return cs;
   }
 
-  CompletionSuggestion assertSuggestParameter(String name, String returnType) {
+  CompletionSuggestion assertSuggestParameter(String name, String? returnType) {
     var cs = assertSuggest(name, csKind: CompletionSuggestionKind.INVOCATION);
     expect(cs.returnType, returnType ?? 'dynamic');
-    var element = cs.element;
-    expect(element, isNotNull);
+    var element = cs.element!;
     expect(element.kind, equals(ElementKind.PARAMETER));
     expect(element.name, equals(name));
     expect(element.parameters, isNull);
@@ -455,8 +442,7 @@
   CompletionSuggestion assertSuggestSetter(String name,
       {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION}) {
     var cs = assertSuggest(name, csKind: kind, elemKind: ElementKind.SETTER);
-    var element = cs.element;
-    expect(element, isNotNull);
+    var element = cs.element!;
     expect(element.kind, equals(ElementKind.SETTER));
     expect(element.name, equals(name));
     // TODO (danrubel) assert setter param
@@ -471,7 +457,7 @@
 
   CompletionSuggestion assertSuggestTopLevelVar(
     String name,
-    String returnType, {
+    String? returnType, {
     CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
   }) {
     var cs = assertSuggest(name, csKind: kind);
@@ -480,8 +466,7 @@
     } else if (isNullExpectedReturnTypeConsideredDynamic) {
       expect(cs.returnType, 'dynamic');
     }
-    var element = cs.element;
-    expect(element, isNotNull);
+    var element = cs.element!;
     expect(element.kind, equals(ElementKind.TOP_LEVEL_VARIABLE));
     expect(element.name, equals(name));
     expect(element.parameters, isNull);
@@ -496,8 +481,8 @@
 
   CompletionSuggestion assertSuggestTypeAlias(
     String name, {
-    String aliasedType,
-    String returnType,
+    String? aliasedType,
+    String? returnType,
     bool isDeprecated = false,
     CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
   }) {
@@ -511,8 +496,7 @@
     } else {
       expect(cs.returnType, isNull);
     }
-    var element = cs.element;
-    expect(element, isNotNull);
+    var element = cs.element!;
     expect(element.kind, equals(ElementKind.TYPE_ALIAS));
     expect(element.name, equals(name));
     expect(element.isDeprecated, equals(isDeprecated));
@@ -531,8 +515,7 @@
   CompletionSuggestion assertSuggestTypeParameter(String name) {
     var cs = assertSuggest(name, csKind: CompletionSuggestionKind.IDENTIFIER);
     expect(cs.returnType, isNull);
-    var element = cs.element;
-    expect(element, isNotNull);
+    var element = cs.element!;
     expect(element.kind, equals(ElementKind.TYPE_PARAMETER));
     expect(element.name, equals(name));
     expect(element.parameters, isNull);
@@ -546,7 +529,7 @@
   Future computeSuggestions({int times = 200}) async {
     result = await session.getResolvedUnit(testFile);
     var baseRequest = CompletionRequestImpl(
-        result, completionOffset, CompletionPerformance());
+        result, completionOffset!, CompletionPerformance());
 
     return await baseRequest.performance.runRequestOperation(
       (performance) async {
@@ -565,8 +548,8 @@
     );
   }
 
-  void failedCompletion(String message,
-      [Iterable<CompletionSuggestion> completions]) {
+  Never failedCompletion(String message,
+      [Iterable<CompletionSuggestion>? completions]) {
     var sb = StringBuffer(message);
     if (completions != null) {
       sb.write('\n  found');
@@ -579,33 +562,31 @@
     fail(sb.toString());
   }
 
-  CompletionSuggestion getSuggest(
-      {String completion,
-      CompletionSuggestionKind csKind,
-      ElementKind elemKind}) {
-    CompletionSuggestion cs;
-    if (suggestions != null) {
-      suggestions.forEach((CompletionSuggestion s) {
-        if (completion != null && completion != s.completion) {
+  CompletionSuggestion? getSuggest(
+      {String? completion,
+      CompletionSuggestionKind? csKind,
+      ElementKind? elemKind}) {
+    CompletionSuggestion? cs;
+    suggestions.forEach((CompletionSuggestion s) {
+      if (completion != null && completion != s.completion) {
+        return;
+      }
+      if (csKind != null && csKind != s.kind) {
+        return;
+      }
+      if (elemKind != null) {
+        var element = s.element;
+        if (element == null || elemKind != element.kind) {
           return;
         }
-        if (csKind != null && csKind != s.kind) {
-          return;
-        }
-        if (elemKind != null) {
-          var element = s.element;
-          if (element == null || elemKind != element.kind) {
-            return;
-          }
-        }
-        if (cs == null) {
-          cs = s;
-        } else {
-          failedCompletion('expected exactly one $cs',
-              suggestions.where((s) => s.completion == completion));
-        }
-      });
-    }
+      }
+      if (cs == null) {
+        cs = s;
+      } else {
+        failedCompletion('expected exactly one $cs',
+            suggestions.where((s) => s.completion == completion));
+      }
+    });
     return cs;
   }
 
@@ -634,9 +615,9 @@
   }
 
   CompletionSuggestion suggestionWith(
-      {@required String completion,
-      ElementKind element,
-      CompletionSuggestionKind kind}) {
+      {required String completion,
+      ElementKind? element,
+      CompletionSuggestionKind? kind}) {
     final matches = suggestions.where(
         suggestionHas(completion: completion, element: element, kind: kind));
     expect(matches, hasLength(1));
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_manager_test.dart b/pkg/analysis_server/test/services/completion/dart/completion_manager_test.dart
index ab89e1b..5a236f2 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_manager_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_manager_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'dart:async';
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
@@ -52,7 +50,7 @@
     // Build the request
     var baseRequest = CompletionRequestImpl(
         await session.getResolvedUnit(testFile),
-        completionOffset,
+        completionOffset!,
         CompletionPerformance());
     await baseRequest.performance.runRequestOperation((performance) async {
       var requestCompleter = Completer<DartCompletionRequest>();
@@ -66,13 +64,13 @@
 
     var directives = request.target.unit.directives;
 
-    var imports = request.libraryElement.imports;
+    var imports = request.libraryElement!.imports;
     expect(imports, hasLength(directives.length + 1));
 
     ImportElement importNamed(String expectedUri) {
       var uriList = <String>[];
       for (var importElement in imports) {
-        var uri = importElement.importedLibrary.source.uri.toString();
+        var uri = importElement.importedLibrary!.source.uri.toString();
         uriList.add(uri);
         if (uri.endsWith(expectedUri)) {
           return importElement;
@@ -83,7 +81,7 @@
 
     void assertImportedLib(String expectedUri) {
       var importElem = importNamed(expectedUri);
-      expect(importElem.importedLibrary.exportNamespace, isNotNull);
+      expect(importElem.importedLibrary!.exportNamespace, isNotNull);
     }
 
     // Assert that the new imports each have an export namespace
diff --git a/pkg/analysis_server/test/services/completion/dart/extension_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/extension_member_contributor_test.dart
index 2d51dba..12a2cad 100644
--- a/pkg/analysis_server/test/services/completion/dart/extension_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/extension_member_contributor_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/extension_member_contributor.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/field_formal_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/field_formal_contributor_test.dart
index 58ed66b..fcc96d2 100644
--- a/pkg/analysis_server/test/services/completion/dart/field_formal_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/field_formal_contributor_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/field_formal_contributor.dart';
 import 'package:test/test.dart';
@@ -86,7 +84,7 @@
           m(X x) {} I _n(X x) {}}
         class X{}''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertSuggestField('b', null);
     assertSuggestField('_c', 'X');
diff --git a/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
index c1e03c4..f56d0b2 100644
--- a/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/imported_reference_contributor.dart';
@@ -475,7 +473,7 @@
           int^ b = 1;}''');
 
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 3);
+    expect(replacementOffset, completionOffset! - 3);
     expect(replacementLength, 3);
     assertNotSuggested('A');
     assertSuggestClass('int');
@@ -499,7 +497,7 @@
           b = 1;}''');
 
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('A');
     assertSuggestClass('int');
@@ -1046,7 +1044,7 @@
         class X {a() {var f; {var x;} D^ var r;} void b() { }}
         class Z { }''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
 
     assertNotSuggested('X');
@@ -1188,7 +1186,7 @@
         class Z { }''');
 
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
 
     assertNotSuggested('partT8');
@@ -1328,7 +1326,7 @@
         main() {A a; a^..b}''');
 
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('b');
     assertNotSuggested('_c');
@@ -1407,10 +1405,10 @@
     expect(replacementLength, 0);
     assertNotSuggested('A');
     assertNotSuggested('_B');
-    var suggestionO = assertSuggestClass('Object');
+    var suggestionO = assertSuggestClass('Object').element;
     if (suggestionO != null) {
-      expect(suggestionO.element.isDeprecated, isFalse);
-      expect(suggestionO.element.isPrivate, isFalse);
+      expect(suggestionO.isDeprecated, isFalse);
+      expect(suggestionO.isPrivate, isFalse);
     }
     assertNotSuggested('T');
     // Suggested by LibraryPrefixContributor
@@ -1470,7 +1468,7 @@
         A Sew;''');
 
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('A');
     assertNotSuggested('_B');
@@ -1747,7 +1745,7 @@
         main() {new String.fr^omCharCodes([]);}''');
 
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 2);
+    expect(replacementOffset, completionOffset! - 2);
     expect(replacementLength, 13);
     // Suggested by NamedConstructorContributor
     assertNotSuggested('fromCharCodes');
@@ -2185,7 +2183,7 @@
     addTestSource('main(args) {for (S^ foo in args) {}}');
 
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('args');
     assertNotSuggested('foo');
@@ -2226,7 +2224,7 @@
     addTestSource('main() {for (int index = 0; i^)}');
 
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('index');
   }
@@ -2266,7 +2264,7 @@
     addTestSource('main() {for (int index = 0; index < 10; i^)}');
 
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('index');
   }
@@ -2278,7 +2276,7 @@
         main() {for (int index = 0; index < 10; ++i^)}''');
 
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('index');
     assertNotSuggested('main');
@@ -2297,11 +2295,13 @@
 ''');
     await computeSuggestions();
     var suggestion = assertSuggestFunction('m', 'int');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    var parameterNames = suggestion.parameterNames!;
+    var parameterTypes = suggestion.parameterTypes!;
+    expect(parameterNames, hasLength(2));
+    expect(parameterNames[0], 'x');
+    expect(parameterTypes[0], 'dynamic');
+    expect(parameterNames[1], 'y');
+    expect(parameterTypes[1], 'int');
     expect(suggestion.requiredParameterCount, 1);
     expect(suggestion.hasNamedParameters, true);
   }
@@ -2318,11 +2318,13 @@
 ''');
     await computeSuggestions();
     var suggestion = assertSuggestFunction('m', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    var parameterNames = suggestion.parameterNames!;
+    var parameterTypes = suggestion.parameterTypes!;
+    expect(parameterNames, hasLength(2));
+    expect(parameterNames[0], 'x');
+    expect(parameterTypes[0], 'dynamic');
+    expect(parameterNames[1], 'y');
+    expect(parameterTypes[1], 'int');
     expect(suggestion.requiredParameterCount, 1);
     expect(suggestion.hasNamedParameters, false);
   }
@@ -2339,11 +2341,13 @@
 ''');
     await computeSuggestions();
     var suggestion = assertSuggestFunction('m', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    var parameterNames = suggestion.parameterNames!;
+    var parameterTypes = suggestion.parameterTypes!;
+    expect(parameterNames, hasLength(2));
+    expect(parameterNames[0], 'x');
+    expect(parameterTypes[0], 'dynamic');
+    expect(parameterNames[1], 'y');
+    expect(parameterTypes[1], 'int');
     expect(suggestion.requiredParameterCount, 0);
     expect(suggestion.hasNamedParameters, true);
   }
@@ -2379,11 +2383,13 @@
 ''');
     await computeSuggestions();
     var suggestion = assertSuggestFunction('m', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    var parameterNames = suggestion.parameterNames!;
+    var parameterTypes = suggestion.parameterTypes!;
+    expect(parameterNames, hasLength(2));
+    expect(parameterNames[0], 'x');
+    expect(parameterTypes[0], 'dynamic');
+    expect(parameterNames[1], 'y');
+    expect(parameterTypes[1], 'int');
     expect(suggestion.requiredParameterCount, 0);
     expect(suggestion.hasNamedParameters, false);
   }
@@ -2400,11 +2406,13 @@
 ''');
     await computeSuggestions();
     var suggestion = assertSuggestFunction('m', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    var parameterNames = suggestion.parameterNames!;
+    var parameterTypes = suggestion.parameterTypes!;
+    expect(parameterNames, hasLength(2));
+    expect(parameterNames[0], 'x');
+    expect(parameterTypes[0], 'dynamic');
+    expect(parameterNames[1], 'y');
+    expect(parameterTypes[1], 'int');
     expect(suggestion.requiredParameterCount, 2);
     expect(suggestion.hasNamedParameters, false);
   }
@@ -2729,34 +2737,39 @@
     CompletionSuggestion suggestion;
 
     suggestion = assertSuggestConstructor('Object');
-    expect(suggestion.element.parameters, '()');
+    expect(suggestion.element!.parameters, '()');
     expect(suggestion.parameterNames, hasLength(0));
     expect(suggestion.requiredParameterCount, 0);
     expect(suggestion.hasNamedParameters, false);
 
     suggestion = assertSuggestConstructor('A');
-    expect(suggestion.element.parameters, '()');
+    expect(suggestion.element!.parameters, '()');
     expect(suggestion.parameterNames, hasLength(0));
     expect(suggestion.requiredParameterCount, 0);
     expect(suggestion.hasNamedParameters, false);
 
     suggestion = assertSuggestConstructor('B');
-    expect(suggestion.element.parameters, '(int x, [String boo])');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'int');
-    expect(suggestion.parameterNames[1], 'boo');
-    expect(suggestion.parameterTypes[1], 'String');
+    var parameterNames = suggestion.parameterNames!;
+    var parameterTypes = suggestion.parameterTypes!;
+    expect(suggestion.element!.parameters, '(int x, [String boo])');
+    expect(parameterNames, hasLength(2));
+    expect(parameterNames[0], 'x');
+    expect(parameterTypes[0], 'int');
+    expect(parameterNames[1], 'boo');
+    expect(parameterTypes[1], 'String');
     expect(suggestion.requiredParameterCount, 1);
     expect(suggestion.hasNamedParameters, false);
 
     suggestion = assertSuggestConstructor('C.bar');
-    expect(suggestion.element.parameters, "({dynamic boo = 'hoo', int z = 0})");
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'boo');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'z');
-    expect(suggestion.parameterTypes[1], 'int');
+    parameterNames = suggestion.parameterNames!;
+    parameterTypes = suggestion.parameterTypes!;
+    expect(
+        suggestion.element!.parameters, "({dynamic boo = 'hoo', int z = 0})");
+    expect(parameterNames, hasLength(2));
+    expect(parameterNames[0], 'boo');
+    expect(parameterTypes[0], 'dynamic');
+    expect(parameterNames[1], 'z');
+    expect(parameterTypes[1], 'int');
     expect(suggestion.requiredParameterCount, 0);
     expect(suggestion.hasNamedParameters, true);
 
@@ -2874,7 +2887,7 @@
     addTestSource('class A {foo(){new C^}}');
 
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     // Not imported, so not suggested
     assertNotSuggested('Completer');
@@ -3063,7 +3076,7 @@
         main(){var a; if (a is Obj^)}''');
 
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 3);
+    expect(replacementOffset, completionOffset! - 3);
     expect(replacementLength, 3);
     assertNotSuggested('a');
     assertNotSuggested('main');
@@ -3139,7 +3152,7 @@
         main() {new^ X.c();}''');
 
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 3);
+    expect(replacementOffset, completionOffset! - 3);
     expect(replacementLength, 3);
     assertNotSuggested('c');
     assertNotSuggested('_d');
@@ -3239,7 +3252,7 @@
         foo = {T^''');
 
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     // Simulate unresolved imported library,
     // in which case suggestions will have null return types (unresolved)
@@ -3266,7 +3279,7 @@
         foo = {7:T^};''');
 
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertSuggestTopLevelVar('T1', 'int');
     assertNotSuggested('T2');
@@ -3284,11 +3297,13 @@
 ''');
     await computeSuggestions();
     var suggestion = assertSuggestFunction('m', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    var parameterNames = suggestion.parameterNames!;
+    var parameterTypes = suggestion.parameterTypes!;
+    expect(parameterNames, hasLength(2));
+    expect(parameterNames[0], 'x');
+    expect(parameterTypes[0], 'dynamic');
+    expect(parameterNames[1], 'y');
+    expect(parameterTypes[1], 'int');
     expect(suggestion.requiredParameterCount, 1);
     expect(suggestion.hasNamedParameters, true);
   }
@@ -3305,11 +3320,13 @@
 ''');
     await computeSuggestions();
     var suggestion = assertSuggestFunction('m', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    var parameterNames = suggestion.parameterNames!;
+    var parameterTypes = suggestion.parameterTypes!;
+    expect(parameterNames, hasLength(2));
+    expect(parameterNames[0], 'x');
+    expect(parameterTypes[0], 'dynamic');
+    expect(parameterNames[1], 'y');
+    expect(parameterTypes[1], 'int');
     expect(suggestion.requiredParameterCount, 1);
     expect(suggestion.hasNamedParameters, false);
   }
@@ -3326,11 +3343,13 @@
 ''');
     await computeSuggestions();
     var suggestion = assertSuggestFunction('m', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    var parameterNames = suggestion.parameterNames!;
+    var parameterTypes = suggestion.parameterTypes!;
+    expect(parameterNames, hasLength(2));
+    expect(parameterNames[0], 'x');
+    expect(parameterTypes[0], 'dynamic');
+    expect(parameterNames[1], 'y');
+    expect(parameterTypes[1], 'int');
     expect(suggestion.requiredParameterCount, 0);
     expect(suggestion.hasNamedParameters, true);
   }
@@ -3366,11 +3385,13 @@
 ''');
     await computeSuggestions();
     var suggestion = assertSuggestFunction('m', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    var parameterNames = suggestion.parameterNames!;
+    var parameterTypes = suggestion.parameterTypes!;
+    expect(parameterNames, hasLength(2));
+    expect(parameterNames[0], 'x');
+    expect(parameterTypes[0], 'dynamic');
+    expect(parameterNames[1], 'y');
+    expect(parameterTypes[1], 'int');
     expect(suggestion.requiredParameterCount, 0);
     expect(suggestion.hasNamedParameters, false);
   }
@@ -3387,11 +3408,13 @@
 ''');
     await computeSuggestions();
     var suggestion = assertSuggestFunction('m', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    var parameterNames = suggestion.parameterNames!;
+    var parameterTypes = suggestion.parameterTypes!;
+    expect(parameterNames, hasLength(2));
+    expect(parameterNames[0], 'x');
+    expect(parameterTypes[0], 'dynamic');
+    expect(parameterNames[1], 'y');
+    expect(parameterTypes[1], 'int');
     expect(suggestion.requiredParameterCount, 2);
     expect(suggestion.hasNamedParameters, false);
   }
@@ -4084,7 +4107,7 @@
         class X {foo(){A^.bar}}''');
 
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertSuggestClass('A');
     if (suggestConstructorsWithoutNew) {
@@ -4211,7 +4234,7 @@
     addTestSource('class A {a() {"hello".to^String().length}}');
 
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 2);
+    expect(replacementOffset, completionOffset! - 2);
     expect(replacementLength, 8);
     assertNotSuggested('length');
     assertNotSuggested('A');
@@ -4405,7 +4428,7 @@
         class X{}''');
 
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     // Contributed by FieldFormalConstructorContributor
     assertNotSuggested('b');
@@ -4675,7 +4698,7 @@
         main() { C<C^> c; }''');
 
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertSuggestClass('C1');
     assertNotSuggested('C2');
@@ -4824,11 +4847,13 @@
 ''');
     await computeSuggestions();
     var suggestion = assertSuggestFunction('m', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'nullable');
-    expect(suggestion.parameterTypes[0], 'int?');
-    expect(suggestion.parameterNames[1], 'nonNullable');
-    expect(suggestion.parameterTypes[1], 'int');
+    var parameterNames = suggestion.parameterNames!;
+    var parameterTypes = suggestion.parameterTypes!;
+    expect(parameterNames, hasLength(2));
+    expect(parameterNames[0], 'nullable');
+    expect(parameterTypes[0], 'int?');
+    expect(parameterNames[1], 'nonNullable');
+    expect(parameterTypes[1], 'int');
     expect(suggestion.requiredParameterCount, 2);
     expect(suggestion.hasNamedParameters, false);
   }
@@ -4846,11 +4871,13 @@
 ''');
     await computeSuggestions();
     var suggestion = assertSuggestFunction('m', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'nullable');
-    expect(suggestion.parameterTypes[0], 'int');
-    expect(suggestion.parameterNames[1], 'nonNullable');
-    expect(suggestion.parameterTypes[1], 'int');
+    var parameterNames = suggestion.parameterNames!;
+    var parameterTypes = suggestion.parameterTypes!;
+    expect(parameterNames, hasLength(2));
+    expect(parameterNames[0], 'nullable');
+    expect(parameterTypes[0], 'int');
+    expect(parameterNames[1], 'nonNullable');
+    expect(parameterTypes[1], 'int');
     expect(suggestion.requiredParameterCount, 2);
     expect(suggestion.hasNamedParameters, false);
   }
@@ -4868,9 +4895,11 @@
 ''');
     await computeSuggestions();
     var suggestion = assertSuggestFunction('m', 'void');
-    expect(suggestion.parameterNames, hasLength(1));
-    expect(suggestion.parameterNames[0], 'param');
-    expect(suggestion.parameterTypes[0], 'int*');
+    var parameterNames = suggestion.parameterNames!;
+    var parameterTypes = suggestion.parameterTypes!;
+    expect(parameterNames, hasLength(1));
+    expect(parameterNames[0], 'param');
+    expect(parameterTypes[0], 'int*');
     expect(suggestion.requiredParameterCount, 1);
     expect(suggestion.hasNamedParameters, false);
   }
diff --git a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
index 4abe258..84b0ba8 100644
--- a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/keyword_contributor.dart';
 import 'package:analyzer/dart/analysis/features.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/label_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/label_contributor_test.dart
index b4223ba..9204f6d 100644
--- a/pkg/analysis_server/test/services/completion/dart/label_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/label_contributor_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/label_contributor.dart';
@@ -24,8 +22,7 @@
       {CompletionSuggestionKind kind = CompletionSuggestionKind.IDENTIFIER}) {
     var cs = assertSuggest(name, csKind: kind);
     expect(cs.returnType, isNull);
-    var element = cs.element;
-    expect(element, isNotNull);
+    var element = cs.element!;
     expect(element.flags, 0);
     expect(element.kind, equals(ElementKind.LABEL));
     expect(element.name, equals(name));
diff --git a/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart
index 3ed1036..023cef5 100644
--- a/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/library_member_contributor.dart';
 import 'package:test/test.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/library_prefix_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/library_prefix_contributor_test.dart
index e717c1d..64d0df1 100644
--- a/pkg/analysis_server/test/services/completion/dart/library_prefix_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/library_prefix_contributor_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/library_prefix_contributor.dart';
@@ -24,8 +22,7 @@
     for (var prefix in expectedPrefixes) {
       var cs =
           assertSuggest(prefix, csKind: CompletionSuggestionKind.IDENTIFIER);
-      var element = cs.element;
-      expect(element, isNotNull);
+      var element = cs.element!;
       expect(element.kind, equals(ElementKind.LIBRARY));
       expect(element.parameters, isNull);
       expect(element.returnType, isNull);
@@ -237,7 +234,7 @@
 class _B {}
 A Sew;''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertSuggestLibraryPrefixes(['Soo']);
   }
diff --git a/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart
index 3cabd97..6417557 100644
--- a/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/local_library_contributor.dart';
 import 'package:test/test.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
index 4f97ee4..16d784d 100644
--- a/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/local_reference_contributor.dart';
@@ -682,7 +680,7 @@
 }''');
     await computeSuggestions();
 
-    expect(replacementOffset, completionOffset - 3);
+    expect(replacementOffset, completionOffset! - 3);
     expect(replacementLength, 3);
     assertSuggestClass('A');
     assertNotSuggested('int');
@@ -707,7 +705,7 @@
 }''');
     await computeSuggestions();
 
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertSuggestClass('A');
     assertNotSuggested('int');
@@ -1244,7 +1242,7 @@
 class Z { }''');
     await computeSuggestions();
 
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
 
     assertSuggestClass('X');
@@ -1487,7 +1485,7 @@
 class Z { }''');
     await computeSuggestions();
 
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
 
     assertNotSuggested('partT8');
@@ -1601,7 +1599,7 @@
 main() {A a; a^..b}''');
     await computeSuggestions();
 
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('b');
     assertNotSuggested('_c');
@@ -1689,15 +1687,15 @@
 
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    var suggestionA = assertSuggestClass('A', isDeprecated: true);
+    var suggestionA = assertSuggestClass('A', isDeprecated: true).element;
     if (suggestionA != null) {
-      expect(suggestionA.element.isDeprecated, isTrue);
-      expect(suggestionA.element.isPrivate, isFalse);
+      expect(suggestionA.isDeprecated, isTrue);
+      expect(suggestionA.isPrivate, isFalse);
     }
-    var suggestionB = assertSuggestClass('_B');
+    var suggestionB = assertSuggestClass('_B').element;
     if (suggestionB != null) {
-      expect(suggestionB.element.isDeprecated, isFalse);
-      expect(suggestionB.element.isPrivate, isTrue);
+      expect(suggestionB.isDeprecated, isFalse);
+      expect(suggestionB.isPrivate, isTrue);
     }
     assertNotSuggested('Object');
     assertNotSuggested('T');
@@ -1758,7 +1756,7 @@
 A Sew;''');
     await computeSuggestions();
 
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertSuggestClass('A');
     assertSuggestClass('_B');
@@ -2120,7 +2118,7 @@
         main() {new String.fr^omCharCodes([]);}''');
     await computeSuggestions();
 
-    expect(replacementOffset, completionOffset - 2);
+    expect(replacementOffset, completionOffset! - 2);
     expect(replacementLength, 13);
     // Suggested by NamedConstructorContributor
     assertNotSuggested('fromCharCodes');
@@ -2679,10 +2677,10 @@
 
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    var suggestionB = assertSuggestClass('_B');
+    var suggestionB = assertSuggestClass('_B').element;
     if (suggestionB != null) {
-      expect(suggestionB.element.isDeprecated, isFalse);
-      expect(suggestionB.element.isPrivate, isTrue);
+      expect(suggestionB.isDeprecated, isFalse);
+      expect(suggestionB.isPrivate, isTrue);
     }
     assertNotSuggested('Object');
     assertNotSuggested('T');
@@ -2865,7 +2863,7 @@
     addTestSource('main() {List<int> values; for (int index in i^)}');
     await computeSuggestions();
 
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertSuggestLocalVariable('values', 'List<int>');
     assertNotSuggested('index');
@@ -2876,7 +2874,7 @@
     addTestSource('main() {List<int> values; for (int index in (i^))}');
     await computeSuggestions();
 
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertSuggestLocalVariable('values', 'List<int>');
     assertNotSuggested('index');
@@ -2945,7 +2943,7 @@
     addTestSource('main(args) {for (S^ foo in args) {}}');
     await computeSuggestions();
 
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('args');
     assertNotSuggested('foo');
@@ -2992,7 +2990,7 @@
     addTestSource('var x = [for (int index = 0; i^)];');
     await computeSuggestions();
 
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertSuggestLocalVariable('index', 'int');
   }
@@ -3011,7 +3009,7 @@
     addTestSource('var x = [for (int index = 0; index < 10; i^)];');
     await computeSuggestions();
 
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertSuggestLocalVariable('index', 'int');
   }
@@ -3022,7 +3020,7 @@
 ''');
     await computeSuggestions();
 
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertSuggestLocalVariable('index', 'int');
   }
@@ -3061,7 +3059,7 @@
     addTestSource('main() {for (int index = 0; i^)}');
     await computeSuggestions();
 
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertSuggestLocalVariable('index', 'int');
   }
@@ -3083,7 +3081,7 @@
     addTestSource('main() {for (int index = 0; index < 10; i^)}');
     await computeSuggestions();
 
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertSuggestLocalVariable('index', 'int');
   }
@@ -3095,7 +3093,7 @@
 main() {for (int index = 0; index < 10; ++i^)}''');
     await computeSuggestions();
 
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertSuggestLocalVariable('index', 'int');
     assertSuggestFunction('main', null);
@@ -3111,11 +3109,13 @@
 ''');
     await computeSuggestions();
     var suggestion = assertSuggestFunction('m', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    var parameterNames = suggestion.parameterNames!;
+    var parameterTypes = suggestion.parameterTypes!;
+    expect(parameterNames, hasLength(2));
+    expect(parameterNames[0], 'x');
+    expect(parameterTypes[0], 'dynamic');
+    expect(parameterNames[1], 'y');
+    expect(parameterTypes[1], 'int');
     expect(suggestion.requiredParameterCount, 1);
     expect(suggestion.hasNamedParameters, true);
   }
@@ -3129,11 +3129,13 @@
 ''');
     await computeSuggestions();
     var suggestion = assertSuggestFunction('m', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    var parameterNames = suggestion.parameterNames!;
+    var parameterTypes = suggestion.parameterTypes!;
+    expect(parameterNames, hasLength(2));
+    expect(parameterNames[0], 'x');
+    expect(parameterTypes[0], 'dynamic');
+    expect(parameterNames[1], 'y');
+    expect(parameterTypes[1], 'int');
     expect(suggestion.requiredParameterCount, 1);
     expect(suggestion.hasNamedParameters, false);
   }
@@ -3147,11 +3149,13 @@
 ''');
     await computeSuggestions();
     var suggestion = assertSuggestFunction('m', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    var parameterNames = suggestion.parameterNames!;
+    var parameterTypes = suggestion.parameterTypes!;
+    expect(parameterNames, hasLength(2));
+    expect(parameterNames[0], 'x');
+    expect(parameterTypes[0], 'dynamic');
+    expect(parameterNames[1], 'y');
+    expect(parameterTypes[1], 'int');
     expect(suggestion.requiredParameterCount, 0);
     expect(suggestion.hasNamedParameters, true);
   }
@@ -3180,11 +3184,13 @@
 ''');
     await computeSuggestions();
     var suggestion = assertSuggestFunction('m', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    var parameterNames = suggestion.parameterNames!;
+    var parameterTypes = suggestion.parameterTypes!;
+    expect(parameterNames, hasLength(2));
+    expect(parameterNames[0], 'x');
+    expect(parameterTypes[0], 'dynamic');
+    expect(parameterNames[1], 'y');
+    expect(parameterTypes[1], 'int');
     expect(suggestion.requiredParameterCount, 0);
     expect(suggestion.hasNamedParameters, false);
   }
@@ -3198,11 +3204,13 @@
 ''');
     await computeSuggestions();
     var suggestion = assertSuggestFunction('m', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    var parameterNames = suggestion.parameterNames!;
+    var parameterTypes = suggestion.parameterTypes!;
+    expect(parameterNames, hasLength(2));
+    expect(parameterNames[0], 'x');
+    expect(parameterTypes[0], 'dynamic');
+    expect(parameterNames[1], 'y');
+    expect(parameterTypes[1], 'int');
     expect(suggestion.requiredParameterCount, 2);
     expect(suggestion.hasNamedParameters, false);
   }
@@ -3351,9 +3359,9 @@
 
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    var f = assertSuggestFunction('foo', 'String', isDeprecated: false);
+    var f = assertSuggestFunction('foo', 'String', isDeprecated: false).element;
     if (f != null) {
-      expect(f.element.isPrivate, isFalse);
+      expect(f.isPrivate, isFalse);
     }
     assertSuggestFunction('bar', 'void');
     assertSuggestParameter('args', 'List<dynamic>');
@@ -3479,7 +3487,7 @@
 ''');
     await computeSuggestions();
 
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertSuggestField('b', null);
     assertSuggestField('_c', 'X');
@@ -3651,35 +3659,39 @@
     CompletionSuggestion suggestion;
 
     suggestion = assertSuggestConstructor('A', elemOffset: -1);
-    expect(suggestion.element.parameters, '()');
-    expect(suggestion.element.returnType, 'A');
+    expect(suggestion.element!.parameters, '()');
+    expect(suggestion.element!.returnType, 'A');
     expect(suggestion.declaringType, 'A');
     expect(suggestion.parameterNames, hasLength(0));
     expect(suggestion.requiredParameterCount, 0);
     expect(suggestion.hasNamedParameters, false);
 
     suggestion = assertSuggestConstructor('B');
-    expect(suggestion.element.parameters, '(int x, [String boo])');
-    expect(suggestion.element.returnType, 'B');
+    var parameterNames = suggestion.parameterNames!;
+    var parameterTypes = suggestion.parameterTypes!;
+    expect(suggestion.element!.parameters, '(int x, [String boo])');
+    expect(suggestion.element!.returnType, 'B');
     expect(suggestion.declaringType, 'B');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'int');
-    expect(suggestion.parameterNames[1], 'boo');
-    expect(suggestion.parameterTypes[1], 'String');
+    expect(parameterNames, hasLength(2));
+    expect(parameterNames[0], 'x');
+    expect(parameterTypes[0], 'int');
+    expect(parameterNames[1], 'boo');
+    expect(parameterTypes[1], 'String');
     expect(suggestion.requiredParameterCount, 1);
     expect(suggestion.hasNamedParameters, false);
 
     suggestion = assertSuggestConstructor('C.bar');
     expect(
-        suggestion.element.parameters, '({dynamic boo = \'hoo\', int z = 0})');
-    expect(suggestion.element.returnType, 'C');
+        suggestion.element!.parameters, '({dynamic boo = \'hoo\', int z = 0})');
+    parameterNames = suggestion.parameterNames!;
+    parameterTypes = suggestion.parameterTypes!;
+    expect(suggestion.element!.returnType, 'C');
     expect(suggestion.declaringType, 'C');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'boo');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'z');
-    expect(suggestion.parameterTypes[1], 'int');
+    expect(parameterNames, hasLength(2));
+    expect(parameterNames[0], 'boo');
+    expect(parameterTypes[0], 'dynamic');
+    expect(parameterNames[1], 'z');
+    expect(parameterTypes[1], 'int');
     expect(suggestion.requiredParameterCount, 0);
     expect(suggestion.hasNamedParameters, true);
   }
@@ -3813,7 +3825,7 @@
     addTestSource('class C {foo(){new F^}}');
     await computeSuggestions();
 
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('Future');
     assertNotSuggested('Foo');
@@ -4038,7 +4050,7 @@
 main(){var a; if (a is Obj^)}''');
     await computeSuggestions();
 
-    expect(replacementOffset, completionOffset - 3);
+    expect(replacementOffset, completionOffset! - 3);
     expect(replacementLength, 3);
     assertNotSuggested('a');
     assertNotSuggested('main');
@@ -4060,7 +4072,7 @@
 main() {new^ X.c();}''');
     await computeSuggestions();
 
-    expect(replacementOffset, completionOffset - 3);
+    expect(replacementOffset, completionOffset! - 3);
     expect(replacementLength, 3);
     assertNotSuggested('c');
     assertNotSuggested('_d');
@@ -4244,7 +4256,7 @@
 foo = {T^''');
     await computeSuggestions();
 
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('T1');
     assertSuggestTopLevelVar('T2', 'int');
@@ -4266,7 +4278,7 @@
 foo = {7:T^};''');
     await computeSuggestions();
 
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('T1');
     assertSuggestTopLevelVar('T2', 'int');
@@ -4321,11 +4333,13 @@
 ''');
     await computeSuggestions();
     var suggestion = assertSuggestMethod('m', 'A', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    var parameterNames = suggestion.parameterNames!;
+    var parameterTypes = suggestion.parameterTypes!;
+    expect(parameterNames, hasLength(2));
+    expect(parameterNames[0], 'x');
+    expect(parameterTypes[0], 'dynamic');
+    expect(parameterNames[1], 'y');
+    expect(parameterTypes[1], 'int');
     expect(suggestion.requiredParameterCount, 1);
     expect(suggestion.hasNamedParameters, true);
   }
@@ -4341,11 +4355,13 @@
 ''');
     await computeSuggestions();
     var suggestion = assertSuggestMethod('m', 'A', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    var parameterNames = suggestion.parameterNames!;
+    var parameterTypes = suggestion.parameterTypes!;
+    expect(parameterNames, hasLength(2));
+    expect(parameterNames[0], 'x');
+    expect(parameterTypes[0], 'dynamic');
+    expect(parameterNames[1], 'y');
+    expect(parameterTypes[1], 'int');
     expect(suggestion.requiredParameterCount, 1);
     expect(suggestion.hasNamedParameters, true);
   }
@@ -4364,11 +4380,13 @@
 ''');
     await computeSuggestions();
     var suggestion = assertSuggestMethod('m', 'A', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    var parameterNames = suggestion.parameterNames!;
+    var parameterTypes = suggestion.parameterTypes!;
+    expect(parameterNames, hasLength(2));
+    expect(parameterNames[0], 'x');
+    expect(parameterTypes[0], 'dynamic');
+    expect(parameterNames[1], 'y');
+    expect(parameterTypes[1], 'int');
     expect(suggestion.requiredParameterCount, 1);
     expect(suggestion.hasNamedParameters, false);
   }
@@ -4385,11 +4403,13 @@
 ''');
     await computeSuggestions();
     var suggestion = assertSuggestMethod('m', 'A', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    var parameterNames = suggestion.parameterNames!;
+    var parameterTypes = suggestion.parameterTypes!;
+    expect(parameterNames, hasLength(2));
+    expect(parameterNames[0], 'x');
+    expect(parameterTypes[0], 'dynamic');
+    expect(parameterNames[1], 'y');
+    expect(parameterTypes[1], 'int');
     expect(suggestion.requiredParameterCount, 1);
     expect(suggestion.hasNamedParameters, false);
   }
@@ -4408,11 +4428,13 @@
 ''');
     await computeSuggestions();
     var suggestion = assertSuggestMethod('m', 'A', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    var parameterNames = suggestion.parameterNames!;
+    var parameterTypes = suggestion.parameterTypes!;
+    expect(parameterNames, hasLength(2));
+    expect(parameterNames[0], 'x');
+    expect(parameterTypes[0], 'dynamic');
+    expect(parameterNames[1], 'y');
+    expect(parameterTypes[1], 'int');
     expect(suggestion.requiredParameterCount, 0);
     expect(suggestion.hasNamedParameters, true);
   }
@@ -4428,11 +4450,13 @@
 ''');
     await computeSuggestions();
     var suggestion = assertSuggestMethod('m', 'A', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    var parameterNames = suggestion.parameterNames!;
+    var parameterTypes = suggestion.parameterTypes!;
+    expect(parameterNames, hasLength(2));
+    expect(parameterNames[0], 'x');
+    expect(parameterTypes[0], 'dynamic');
+    expect(parameterNames[1], 'y');
+    expect(parameterTypes[1], 'int');
     expect(suggestion.requiredParameterCount, 0);
     expect(suggestion.hasNamedParameters, true);
   }
@@ -4488,11 +4512,13 @@
 ''');
     await computeSuggestions();
     var suggestion = assertSuggestMethod('m', 'A', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    var parameterNames = suggestion.parameterNames!;
+    var parameterTypes = suggestion.parameterTypes!;
+    expect(parameterNames, hasLength(2));
+    expect(parameterNames[0], 'x');
+    expect(parameterTypes[0], 'dynamic');
+    expect(parameterNames[1], 'y');
+    expect(parameterTypes[1], 'int');
     expect(suggestion.requiredParameterCount, 0);
     expect(suggestion.hasNamedParameters, false);
   }
@@ -4508,11 +4534,13 @@
 ''');
     await computeSuggestions();
     var suggestion = assertSuggestMethod('m', 'A', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    var parameterNames = suggestion.parameterNames!;
+    var parameterTypes = suggestion.parameterTypes!;
+    expect(parameterNames, hasLength(2));
+    expect(parameterNames[0], 'x');
+    expect(parameterTypes[0], 'dynamic');
+    expect(parameterNames[1], 'y');
+    expect(parameterTypes[1], 'int');
     expect(suggestion.requiredParameterCount, 0);
     expect(suggestion.hasNamedParameters, false);
   }
@@ -4531,11 +4559,13 @@
 ''');
     await computeSuggestions();
     var suggestion = assertSuggestMethod('m', 'A', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    var parameterNames = suggestion.parameterNames!;
+    var parameterTypes = suggestion.parameterTypes!;
+    expect(parameterNames, hasLength(2));
+    expect(parameterNames[0], 'x');
+    expect(parameterTypes[0], 'dynamic');
+    expect(parameterNames[1], 'y');
+    expect(parameterTypes[1], 'int');
     expect(suggestion.requiredParameterCount, 2);
     expect(suggestion.hasNamedParameters, false);
   }
@@ -4556,20 +4586,20 @@
 
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    var methodA = assertSuggestMethod('a', 'A', 'Z');
+    var methodA = assertSuggestMethod('a', 'A', 'Z').element;
     if (methodA != null) {
-      expect(methodA.element.isDeprecated, isFalse);
-      expect(methodA.element.isPrivate, isFalse);
+      expect(methodA.isDeprecated, isFalse);
+      expect(methodA.isPrivate, isFalse);
     }
-    var getterF = assertSuggestGetter('f', 'X', isDeprecated: true);
+    var getterF = assertSuggestGetter('f', 'X', isDeprecated: true).element;
     if (getterF != null) {
-      expect(getterF.element.isDeprecated, isTrue);
-      expect(getterF.element.isPrivate, isFalse);
+      expect(getterF.isDeprecated, isTrue);
+      expect(getterF.isPrivate, isFalse);
     }
-    var getterG = assertSuggestGetter('_g', null);
+    var getterG = assertSuggestGetter('_g', null).element;
     if (getterG != null) {
-      expect(getterG.element.isDeprecated, isFalse);
-      expect(getterG.element.isPrivate, isTrue);
+      expect(getterG.isDeprecated, isFalse);
+      expect(getterG.isPrivate, isTrue);
     }
   }
 
@@ -4625,23 +4655,23 @@
 
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    var methodA = assertSuggestMethod('_a', 'A', 'Z');
+    var methodA = assertSuggestMethod('_a', 'A', 'Z').element;
     if (methodA != null) {
-      expect(methodA.element.isDeprecated, isFalse);
-      expect(methodA.element.isPrivate, isTrue);
+      expect(methodA.isDeprecated, isFalse);
+      expect(methodA.isPrivate, isTrue);
     }
-    var getterF = assertSuggestField('f', 'X', isDeprecated: true);
+    var getterF = assertSuggestField('f', 'X', isDeprecated: true).element;
     if (getterF != null) {
-      expect(getterF.element.isDeprecated, isTrue);
-      expect(getterF.element.isPrivate, isFalse);
-      expect(getterF.element.parameters, isNull);
+      expect(getterF.isDeprecated, isTrue);
+      expect(getterF.isPrivate, isFalse);
+      expect(getterF.parameters, isNull);
     }
     // If user did not type '_' then relevance of private members is not raised
-    var getterG = assertSuggestField('_g', null);
+    var getterG = assertSuggestField('_g', null).element;
     if (getterG != null) {
-      expect(getterG.element.isDeprecated, isFalse);
-      expect(getterG.element.isPrivate, isTrue);
-      expect(getterF.element.parameters, isNull);
+      expect(getterG.isDeprecated, isFalse);
+      expect(getterG.isPrivate, isTrue);
+      expect(getterG.parameters, isNull);
     }
     assertNotSuggested('bool');
   }
@@ -4660,26 +4690,26 @@
 ''');
     await computeSuggestions();
 
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
-    var methodA = assertSuggestMethod('_a', 'A', 'Z');
+    var methodA = assertSuggestMethod('_a', 'A', 'Z').element;
     if (methodA != null) {
-      expect(methodA.element.isDeprecated, isFalse);
-      expect(methodA.element.isPrivate, isTrue);
+      expect(methodA.isDeprecated, isFalse);
+      expect(methodA.isPrivate, isTrue);
     }
-    var getterF = assertSuggestField('f', 'X', isDeprecated: true);
+    var getterF = assertSuggestField('f', 'X', isDeprecated: true).element;
     if (getterF != null) {
-      expect(getterF.element.isDeprecated, isTrue);
-      expect(getterF.element.isPrivate, isFalse);
-      expect(getterF.element.parameters, isNull);
+      expect(getterF.isDeprecated, isTrue);
+      expect(getterF.isPrivate, isFalse);
+      expect(getterF.parameters, isNull);
     }
     // If user prefixed completion with '_' then suggestion of private members
     // should be the same as public members
-    var getterG = assertSuggestField('_g', null);
+    var getterG = assertSuggestField('_g', null).element;
     if (getterG != null) {
-      expect(getterG.element.isDeprecated, isFalse);
-      expect(getterG.element.isPrivate, isTrue);
-      expect(getterF.element.parameters, isNull);
+      expect(getterG.isDeprecated, isFalse);
+      expect(getterG.isPrivate, isTrue);
+      expect(getterG.parameters, isNull);
     }
     assertNotSuggested('bool');
   }
@@ -4714,10 +4744,11 @@
 
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    var methodA = assertSuggestMethod('a', 'A', 'Z', isDeprecated: true);
+    var methodA =
+        assertSuggestMethod('a', 'A', 'Z', isDeprecated: true).element;
     if (methodA != null) {
-      expect(methodA.element.isDeprecated, isTrue);
-      expect(methodA.element.isPrivate, isFalse);
+      expect(methodA.isDeprecated, isTrue);
+      expect(methodA.isPrivate, isFalse);
     }
     assertSuggestParameter('x', 'X');
     assertSuggestParameter('y', null);
@@ -5009,15 +5040,15 @@
 
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    var suggestionM = assertSuggestMixin('M');
+    var suggestionM = assertSuggestMixin('M').element;
     if (suggestionM != null) {
-      expect(suggestionM.element.isDeprecated, isFalse);
-      expect(suggestionM.element.isPrivate, isFalse);
+      expect(suggestionM.isDeprecated, isFalse);
+      expect(suggestionM.isPrivate, isFalse);
     }
-    var suggestionB = assertSuggestClass('_B');
+    var suggestionB = assertSuggestClass('_B').element;
     if (suggestionB != null) {
-      expect(suggestionB.element.isDeprecated, isFalse);
-      expect(suggestionB.element.isPrivate, isTrue);
+      expect(suggestionB.isDeprecated, isFalse);
+      expect(suggestionB.isPrivate, isTrue);
     }
     assertNotSuggested('Object');
     assertNotSuggested('T');
@@ -5454,7 +5485,7 @@
 class X {foo(){A^.bar}}''');
     await computeSuggestions();
 
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('A');
     assertSuggestClass('X');
@@ -5599,7 +5630,7 @@
     addTestSource('class A {a() {"hello".to^String().length}}');
     await computeSuggestions();
 
-    expect(replacementOffset, completionOffset - 2);
+    expect(replacementOffset, completionOffset! - 2);
     expect(replacementLength, 8);
     assertNotSuggested('length');
     assertNotSuggested('A');
@@ -5908,7 +5939,7 @@
 class X{}''');
     await computeSuggestions();
 
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     // Contributed by FieldFormalContributor
     assertNotSuggested('b');
@@ -6114,7 +6145,7 @@
 main() { C<C^> c; }''');
     await computeSuggestions();
 
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('C1');
     assertSuggestClass('C2');
diff --git a/pkg/analysis_server/test/services/completion/dart/named_constructor_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/named_constructor_contributor_test.dart
index c058de6..9fcdd82 100644
--- a/pkg/analysis_server/test/services/completion/dart/named_constructor_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/named_constructor_contributor_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/named_constructor_contributor.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
@@ -24,12 +22,10 @@
       String name, String returnType,
       [CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION]) {
     var cs = assertSuggest(name, csKind: kind);
-    var element = cs.element;
-    expect(element, isNotNull);
+    var element = cs.element!;
     expect(element.kind, equals(ElementKind.CONSTRUCTOR));
     expect(element.name, equals(name));
-    var param = element.parameters;
-    expect(param, isNotNull);
+    var param = element.parameters!;
     expect(param[0], equals('('));
     expect(param[param.length - 1], equals(')'));
     expect(element.returnType, equals(returnType));
@@ -121,7 +117,7 @@
     addTestSource('''
         main() {new String.fr^omCharCodes([]);}''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 2);
+    expect(replacementOffset, completionOffset! - 2);
     expect(replacementLength, 13);
     assertSuggestNamedConstructor('fromCharCodes', 'String');
     assertNotSuggested('isEmpty');
diff --git a/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart
index 55cad3f..7b27e88 100644
--- a/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/override_contributor.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
@@ -519,7 +517,7 @@
   }
 
   CompletionSuggestion _assertOverride(String completion,
-      {String displayText, int selectionOffset, int selectionLength}) {
+      {String? displayText, int? selectionOffset, int? selectionLength}) {
     var cs = getSuggest(
         completion: completion,
         csKind: CompletionSuggestionKind.OVERRIDE,
diff --git a/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart
index 72f6bb8..7253f49 100644
--- a/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/static_member_contributor.dart';
 import 'package:test/test.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
index 9ff66d1..0cc4eba 100644
--- a/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/type_member_contributor.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
@@ -420,7 +418,7 @@
           int a;
           int^ b = 1;}''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 3);
+    expect(replacementOffset, completionOffset! - 3);
     expect(replacementLength, 3);
     assertNotSuggested('A');
     assertNotSuggested('int');
@@ -443,7 +441,7 @@
           i^
           b = 1;}''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('A');
     assertNotSuggested('int');
@@ -926,7 +924,7 @@
         class Z { }''');
     await computeSuggestions();
 
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
 
     assertNotSuggested('X');
@@ -1067,7 +1065,7 @@
           void b() { }}
         class Z { }''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('partT8');
     assertNotSuggested('partBoo');
@@ -1187,7 +1185,7 @@
         class X{}
         main() {A a; a^..b}''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('b');
     assertNotSuggested('_c');
@@ -1314,7 +1312,7 @@
         class _B {}
         A Sew;''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('A');
     assertNotSuggested('_B');
@@ -1570,7 +1568,7 @@
     addTestSource('''
         main() {new String.fr^omCharCodes([]);}''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 2);
+    expect(replacementOffset, completionOffset! - 2);
     expect(replacementLength, 13);
     // Suggested by NamedConstructorContributor
     assertNotSuggested('fromCharCodes');
@@ -1841,7 +1839,7 @@
     // DeclaredIdentifier  ForEachStatement  Block
     addTestSource('main(args) {for (S^ foo in args) {}}');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('args');
     assertNotSuggested('foo');
@@ -1879,7 +1877,7 @@
     // SimpleIdentifier  ForStatement
     addTestSource('main() {for (int index = 0; i^)}');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('index');
   }
@@ -1899,7 +1897,7 @@
     // SimpleIdentifier  ForStatement
     addTestSource('main() {for (int index = 0; index < 10; i^)}');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('index');
   }
@@ -1910,7 +1908,7 @@
         void bar() { }
         main() {for (int index = 0; index < 10; ++i^)}''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('index');
     assertNotSuggested('main');
@@ -2075,9 +2073,9 @@
 ''');
     await computeSuggestions();
     var suggestion = assertSuggestMethod('m', 'C', 'int');
-    expect(suggestion.parameterTypes[0], 'int');
-    expect(suggestion.element.returnType, 'int');
-    expect(suggestion.element.parameters, '(int t)');
+    expect(suggestion.parameterTypes![0], 'int');
+    expect(suggestion.element!.returnType, 'int');
+    expect(suggestion.element!.parameters, '(int t)');
   }
 
   Future<void> test_generic_setter() async {
@@ -2094,7 +2092,7 @@
     // as a parmeter to it, and it will check the appropriate field in
     // the suggestion object.
     var suggestion = assertSuggestSetter('t');
-    expect(suggestion.element.parameters, '(int value)');
+    expect(suggestion.element!.parameters, '(int value)');
   }
 
   Future<void> test_genericTypeAlias_noFunctionType() async {
@@ -2248,7 +2246,7 @@
     addSource('/testAB.dart', 'class Foo { }');
     addTestSource('class C {foo(){new F^}}');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('Future');
     assertNotSuggested('Foo');
@@ -2452,7 +2450,7 @@
         class A {int x; int y() => 0;}
         main(){var a; if (a is Obj^)}''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 3);
+    expect(replacementOffset, completionOffset! - 3);
     expect(replacementLength, 3);
     assertNotSuggested('a');
     assertNotSuggested('main');
@@ -2480,7 +2478,7 @@
         var m;
         main() {new^ X.c();}''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 3);
+    expect(replacementOffset, completionOffset! - 3);
     expect(replacementLength, 3);
     assertNotSuggested('c');
     assertNotSuggested('_d');
@@ -2627,7 +2625,7 @@
         class C2 { }
         foo = {T^''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('T2');
   }
@@ -2647,7 +2645,7 @@
         class C2 { }
         foo = {7:T^};''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('T2');
   }
@@ -2740,11 +2738,13 @@
 void main() {new C().^}''');
     await computeSuggestions();
     var suggestion = assertSuggestMethod('m', 'C', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    var parameterNames = suggestion.parameterNames!;
+    var parameterTypes = suggestion.parameterTypes!;
+    expect(parameterNames, hasLength(2));
+    expect(parameterNames[0], 'x');
+    expect(parameterTypes[0], 'dynamic');
+    expect(parameterNames[1], 'y');
+    expect(parameterTypes[1], 'int');
     expect(suggestion.requiredParameterCount, 1);
     expect(suggestion.hasNamedParameters, true);
   }
@@ -2757,11 +2757,13 @@
 void main() {new C().^}''');
     await computeSuggestions();
     var suggestion = assertSuggestMethod('m', 'C', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    var parameterNames = suggestion.parameterNames!;
+    var parameterTypes = suggestion.parameterTypes!;
+    expect(parameterNames, hasLength(2));
+    expect(parameterNames[0], 'x');
+    expect(parameterTypes[0], 'dynamic');
+    expect(parameterNames[1], 'y');
+    expect(parameterTypes[1], 'int');
     expect(suggestion.requiredParameterCount, 1);
     expect(suggestion.hasNamedParameters, false);
   }
@@ -2774,11 +2776,13 @@
 void main() {new C().^}''');
     await computeSuggestions();
     var suggestion = assertSuggestMethod('m', 'C', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    var parameterNames = suggestion.parameterNames!;
+    var parameterTypes = suggestion.parameterTypes!;
+    expect(parameterNames, hasLength(2));
+    expect(parameterNames[0], 'x');
+    expect(parameterTypes[0], 'dynamic');
+    expect(parameterNames[1], 'y');
+    expect(parameterTypes[1], 'int');
     expect(suggestion.requiredParameterCount, 0);
     expect(suggestion.hasNamedParameters, true);
   }
@@ -2805,11 +2809,13 @@
 void main() {new C().^}''');
     await computeSuggestions();
     var suggestion = assertSuggestMethod('m', 'C', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    var parameterNames = suggestion.parameterNames!;
+    var parameterTypes = suggestion.parameterTypes!;
+    expect(parameterNames, hasLength(2));
+    expect(parameterNames[0], 'x');
+    expect(parameterTypes[0], 'dynamic');
+    expect(parameterNames[1], 'y');
+    expect(parameterTypes[1], 'int');
     expect(suggestion.requiredParameterCount, 0);
     expect(suggestion.hasNamedParameters, false);
   }
@@ -2822,11 +2828,13 @@
 void main() {new C().^}''');
     await computeSuggestions();
     var suggestion = assertSuggestMethod('m', 'C', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
+    var parameterNames = suggestion.parameterNames!;
+    var parameterTypes = suggestion.parameterTypes!;
+    expect(parameterNames, hasLength(2));
+    expect(parameterNames[0], 'x');
+    expect(parameterTypes[0], 'dynamic');
+    expect(parameterNames[1], 'y');
+    expect(parameterTypes[1], 'int');
     expect(suggestion.requiredParameterCount, 2);
     expect(suggestion.hasNamedParameters, false);
   }
@@ -3543,7 +3551,7 @@
         import "a.dart";
         class X {foo(){A^.bar}}''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('A');
     assertNotSuggested('X');
@@ -3661,7 +3669,7 @@
     // SimpleIdentifier  MethodInvocation  PropertyAccess  ExpressionStatement
     addTestSource('class A {a() {"hello".to^String().length}}');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 2);
+    expect(replacementOffset, completionOffset! - 2);
     expect(replacementLength, 8);
     assertSuggestGetter('length', 'int');
     assertNotSuggested('A');
@@ -4024,7 +4032,7 @@
           m(X x) {} I _n(X x) {}}
         class X{}''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     // Contributed by FieldFormalConstructorContributor
     assertNotSuggested('b');
@@ -4172,7 +4180,7 @@
         class C<E> {}
         main() { C<C^> c; }''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertNotSuggested('C1');
     assertNotSuggested('C2');
diff --git a/pkg/analysis_server/test/services/completion/dart/uri_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/uri_contributor_test.dart
index ab0b151..513eb6d 100644
--- a/pkg/analysis_server/test/services/completion/dart/uri_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/uri_contributor_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/uri_contributor.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
@@ -120,7 +118,7 @@
   Future<void> test_import_dart() async {
     addTestSource('import "d^" import');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertSuggest('dart:', csKind: CompletionSuggestionKind.IMPORT);
     assertSuggest('dart:core', csKind: CompletionSuggestionKind.IMPORT);
@@ -132,7 +130,7 @@
   Future<void> test_import_dart2() async {
     addTestSource('import "dart:async"; import "d^"');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertSuggest('dart:', csKind: CompletionSuggestionKind.IMPORT);
     assertSuggest('dart:core', csKind: CompletionSuggestionKind.IMPORT);
@@ -167,7 +165,7 @@
 
     addTestSource('import "..^" import');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 2);
+    expect(replacementOffset, completionOffset! - 2);
     expect(replacementLength, 2);
     assertNotSuggested('completion.dart');
     assertSuggest('other.dart', csKind: CompletionSuggestionKind.IMPORT);
@@ -185,7 +183,7 @@
 
     addTestSource('import "foo/^" import');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 4);
+    expect(replacementOffset, completionOffset! - 4);
     expect(replacementLength, 4);
     assertNotSuggested('completion.dart');
     assertNotSuggested('other.dart');
@@ -203,7 +201,7 @@
 
     addTestSource('import "../^" import');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 3);
+    expect(replacementOffset, completionOffset! - 3);
     expect(replacementLength, 3);
     assertNotSuggested('completion.dart');
     assertNotSuggested('other.dart');
@@ -224,7 +222,7 @@
 
     addTestSource('import "../^" import');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 3);
+    expect(replacementOffset, completionOffset! - 3);
     expect(replacementLength, 3);
     assertNotSuggested('completion.dart');
     assertNotSuggested('other.dart');
@@ -243,7 +241,7 @@
 
     addTestSource('import "../b^" import');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 4);
+    expect(replacementOffset, completionOffset! - 4);
     expect(replacementLength, 4);
     assertNotSuggested('completion.dart');
     assertNotSuggested('other.dart');
@@ -287,7 +285,7 @@
 
     addTestSource('import "p^" import');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertSuggest('package:', csKind: CompletionSuggestionKind.IMPORT);
     assertSuggest('package:foo/', csKind: CompletionSuggestionKind.IMPORT);
@@ -355,7 +353,7 @@
     await computeSuggestions();
     assertSuggest('package:foo/baz/too.dart',
         csKind: CompletionSuggestionKind.IMPORT);
-    expect(replacementOffset, completionOffset - 16);
+    expect(replacementOffset, completionOffset! - 16);
     expect(replacementLength, 5 + 16);
   }
 
@@ -368,7 +366,7 @@
 
     addTestSource('import "p^" class');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertSuggest('package:', csKind: CompletionSuggestionKind.IMPORT);
     assertSuggest('package:bar/', csKind: CompletionSuggestionKind.IMPORT);
@@ -390,7 +388,7 @@
 
     addTestSource('import r"p^" import');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertSuggest('package:', csKind: CompletionSuggestionKind.IMPORT);
     assertSuggest('package:foo/', csKind: CompletionSuggestionKind.IMPORT);
@@ -449,7 +447,7 @@
   Future<void> test_import_without_closing_quote_eof3() async {
     addTestSource('import "d^');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertSuggest('dart:', csKind: CompletionSuggestionKind.IMPORT);
     assertSuggest('package:', csKind: CompletionSuggestionKind.IMPORT);
@@ -458,7 +456,7 @@
   Future<void> test_import_without_closing_quote_eof4() async {
     addTestSource('import "d^"');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertSuggest('dart:', csKind: CompletionSuggestionKind.IMPORT);
     assertSuggest('package:', csKind: CompletionSuggestionKind.IMPORT);
@@ -502,7 +500,7 @@
 
     addTestSource('library x; part "..^" import');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 2);
+    expect(replacementOffset, completionOffset! - 2);
     expect(replacementLength, 2);
     assertNotSuggested('completion.dart');
     assertSuggest('other.dart', csKind: CompletionSuggestionKind.IMPORT);
@@ -520,7 +518,7 @@
 
     addTestSource('library x; part "foo/^" import');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 4);
+    expect(replacementOffset, completionOffset! - 4);
     expect(replacementLength, 4);
     assertNotSuggested('completion.dart');
     assertNotSuggested('other.dart');
@@ -538,7 +536,7 @@
 
     addTestSource('library x; part "../^" import');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 3);
+    expect(replacementOffset, completionOffset! - 3);
     expect(replacementLength, 3);
     assertNotSuggested('completion.dart');
     assertNotSuggested('other.dart');
@@ -587,7 +585,7 @@
 
     addTestSource('import "..^" import');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 2);
+    expect(replacementOffset, completionOffset! - 2);
     expect(replacementLength, 2);
     assertNotSuggested('completion.dart');
     assertSuggest('other.dart', csKind: CompletionSuggestionKind.IMPORT);
@@ -605,7 +603,7 @@
 
     addTestSource('import "foo/^" import');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 4);
+    expect(replacementOffset, completionOffset! - 4);
     expect(replacementLength, 4);
     assertNotSuggested('completion.dart');
     assertNotSuggested('other.dart');
@@ -623,7 +621,7 @@
 
     addTestSource('import "../^" import');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 3);
+    expect(replacementOffset, completionOffset! - 3);
     expect(replacementLength, 3);
     assertNotSuggested('completion.dart');
     assertNotSuggested('other.dart');
@@ -641,7 +639,7 @@
 
     addTestSource('import "../b^" import');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 4);
+    expect(replacementOffset, completionOffset! - 4);
     expect(replacementLength, 4);
     assertNotSuggested('completion.dart');
     assertNotSuggested('other.dart');
@@ -677,7 +675,7 @@
 
     addTestSource('library x; part "..^" import');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 2);
+    expect(replacementOffset, completionOffset! - 2);
     expect(replacementLength, 2);
     assertNotSuggested('completion.dart');
     assertSuggest('other.dart', csKind: CompletionSuggestionKind.IMPORT);
@@ -695,7 +693,7 @@
 
     addTestSource('library x; part "foo/^" import');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 4);
+    expect(replacementOffset, completionOffset! - 4);
     expect(replacementLength, 4);
     assertNotSuggested('completion.dart');
     assertNotSuggested('other.dart');
@@ -713,7 +711,7 @@
 
     addTestSource('library x; part "../^" import');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 3);
+    expect(replacementOffset, completionOffset! - 3);
     expect(replacementLength, 3);
     assertNotSuggested('completion.dart');
     assertNotSuggested('other.dart');
diff --git a/pkg/analysis_server/test/services/completion/dart/variable_name_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/variable_name_contributor_test.dart
index 5f252da..09ab271 100644
--- a/pkg/analysis_server/test/services/completion/dart/variable_name_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/variable_name_contributor_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/variable_name_contributor.dart';
 import 'package:test/test.dart';
@@ -215,7 +213,7 @@
     f() { for(AbstractCrazyNonsenseClassName a^) {} }
     ''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertSuggestName('abstractCrazyNonsenseClassName');
     assertSuggestName('crazyNonsenseClassName');
@@ -236,7 +234,7 @@
     f() { for(prefix.AbstractCrazyNonsenseClassName ^) {} }
     ''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertSuggestName('abstractCrazyNonsenseClassName');
     assertSuggestName('crazyNonsenseClassName');
@@ -256,7 +254,7 @@
     f() { for(prefix.AbstractCrazyNonsenseClassName a^) {} }
     ''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
+    expect(replacementOffset, completionOffset! - 1);
     expect(replacementLength, 1);
     assertSuggestName('abstractCrazyNonsenseClassName');
     assertSuggestName('crazyNonsenseClassName');
@@ -365,7 +363,7 @@
     AbstractCrazyNonsenseClassName abs^
     ''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 3);
+    expect(replacementOffset, completionOffset! - 3);
     expect(replacementLength, 3);
     assertSuggestName('abstractCrazyNonsenseClassName');
     assertSuggestName('crazyNonsenseClassName');
@@ -385,7 +383,7 @@
     AbstractCrazyNonsenseClassName abs^
     ''');
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 3);
+    expect(replacementOffset, completionOffset! - 3);
     expect(replacementLength, 3);
     assertSuggestName('abstractCrazyNonsenseClassName');
     assertSuggestName('crazyNonsenseClassName');
diff --git a/pkg/analysis_server/test/stress/completion/completion.dart b/pkg/analysis_server/test/stress/completion/completion.dart
index 2f5fee0..41fc4ef 100644
--- a/pkg/analysis_server/test/stress/completion/completion.dart
+++ b/pkg/analysis_server/test/stress/completion/completion.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:io';
 
 import 'package:args/args.dart';
@@ -63,7 +61,7 @@
 }
 
 /// Print usage information for this tool.
-void printUsage(ArgParser parser, {String error}) {
+void printUsage(ArgParser parser, {String? error}) {
   if (error != null) {
     print(error);
     print('');
diff --git a/pkg/analysis_server/test/stress/completion/completion_runner.dart b/pkg/analysis_server/test/stress/completion/completion_runner.dart
index 0de5088..4a5cf3b 100644
--- a/pkg/analysis_server/test/stress/completion/completion_runner.dart
+++ b/pkg/analysis_server/test/stress/completion/completion_runner.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/services/completion/completion_core.dart';
 import 'package:analysis_server/src/services/completion/completion_performance.dart';
 import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
@@ -13,7 +11,6 @@
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/file_system/overlay_file_system.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
-import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 
 /// A runner that can request code completion at the location of each identifier
@@ -41,11 +38,11 @@
 
   /// Initialize a newly created completion runner.
   CompletionRunner(
-      {StringSink output,
-      bool printMissing,
-      bool printQuality,
-      bool timing,
-      bool verbose})
+      {StringSink? output,
+      bool? printMissing,
+      bool? printQuality,
+      bool? timing,
+      bool? verbose})
       : output = output ?? NullStringSink(),
         printMissing = printMissing ?? false,
         printQuality = printQuality ?? false,
@@ -83,9 +80,9 @@
         fileCount++;
         output.write('.');
         var result = await context.currentSession.getResolvedUnit(path);
-        var content = result.content;
+        var content = result.content!;
         var lineInfo = result.lineInfo;
-        var identifiers = _identifiersIn(result.unit);
+        var identifiers = _identifiersIn(result.unit!);
 
         for (var identifier in identifiers) {
           identifierCount++;
@@ -118,7 +115,7 @@
             if (index < 0) {
               missingCount++;
               if (printMissing) {
-                CharacterLocation location = lineInfo.getLocation(offset);
+                var location = lineInfo.getLocation(offset);
                 output.writeln('Missing suggestion of "${identifier.name}" at '
                     '$path:${location.lineNumber}:${location.columnNumber}');
                 if (verbose) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
index 1a2a02f..daf190f 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -1050,6 +1050,27 @@
         'No valid constant returned from the execution of $statement.');
   }
 
+  /// Returns [null] on success and an error-"constant" on failure, as such the
+  /// return value should be checked.
+  AbortConstant executeConstructorBody(Constructor constructor) {
+    final Statement body = constructor.function.body;
+    StatementConstantEvaluator statementEvaluator =
+        new StatementConstantEvaluator(this);
+    ExecutionStatus status = body.accept(statementEvaluator);
+    if (status is AbortStatus) {
+      return status.error;
+    } else if (status is ReturnStatus) {
+      if (status.value == null) return null;
+      // Should not be reachable.
+      return createInvalidExpressionConstant(
+          constructor, "Constructors can't have a return value.");
+    } else if (status is! ProceedStatus) {
+      return createInvalidExpressionConstant(
+          constructor, "Invalid execution status of constructor body.");
+    }
+    return null;
+  }
+
   /// Create an error-constant indicating that an error has been detected during
   /// constant evaluation.
   AbortConstant createErrorConstant(TreeNode node, Message message,
@@ -1508,7 +1529,8 @@
           node, 'Non-const constructor invocation.');
     }
     if (constructor.function.body != null &&
-        constructor.function.body is! EmptyStatement) {
+        constructor.function.body is! EmptyStatement &&
+        !enableConstFunctions) {
       // Probably unreachable.
       return createInvalidExpressionConstant(
           node,
@@ -1822,6 +1844,12 @@
       for (UnevaluatedConstant constant in env.unevaluatedUnreadConstants) {
         instanceBuilder.unusedArguments.add(extract(constant));
       }
+
+      if (enableConstFunctions && constructor.function != null) {
+        AbortConstant error = executeConstructorBody(constructor);
+        if (error != null) return error;
+      }
+
       return null;
     });
   }
@@ -3442,6 +3470,10 @@
   }
 
   @override
+  ExecutionStatus visitEmptyStatement(EmptyStatement node) =>
+      const ProceedStatus();
+
+  @override
   ExecutionStatus visitFunctionDeclaration(FunctionDeclaration node) {
     final EvaluationEnvironment newEnv =
         new EvaluationEnvironment.withParent(exprEvaluator.env);
@@ -3514,8 +3546,13 @@
   }
 
   @override
-  ExecutionStatus visitReturnStatement(ReturnStatement node) =>
-      new ReturnStatus(evaluate(node.expression));
+  ExecutionStatus visitReturnStatement(ReturnStatement node) {
+    Constant result;
+    if (node.expression != null) {
+      result = evaluate(node.expression);
+    }
+    return new ReturnStatus(result);
+  }
 
   @override
   ExecutionStatus visitSwitchStatement(SwitchStatement node) {
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index 6e7b86a..da66b2a 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -1176,7 +1176,9 @@
 
     declarationBuilder.resolveTypes(typeVariables, libraryBuilder);
     if (constructorName != null) {
-      if (isConst && bodyKind != MethodBody.Abstract) {
+      if (isConst &&
+          bodyKind != MethodBody.Abstract &&
+          !libraryBuilder.enableConstFunctionsInLibrary) {
         addProblem(messageConstConstructorWithBody, varFinalOrConstOffset, 5);
         modifiers &= ~constMask;
       }
diff --git a/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart b/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart
new file mode 100644
index 0000000..775b623
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Tests const constructors with a body which are enabled with const functions.
+
+import "package:expect/expect.dart";
+
+const printString = "print";
+const var1 = Simple(printString);
+class Simple {
+  final String name;
+
+  const Simple(this.name) {
+    assert(this.name == printString);
+  }
+}
+
+const var2 = A();
+class A {
+  const A() {
+    return;
+  }
+}
+
+void main() {
+  Expect.equals(var1.name, printString);
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.strong.expect b/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.strong.expect
new file mode 100644
index 0000000..3ad815a
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.strong.expect
@@ -0,0 +1,39 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+class Simple extends core::Object /*hasConstConstructor*/  {
+  final field core::String name;
+  const constructor •(core::String name) → self::Simple
+    : self::Simple::name = name, super core::Object::•() {
+    assert(this.{self::Simple::name}.{core::String::==}(#C1));
+  }
+}
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•() {
+    return;
+  }
+}
+static const field core::String printString = #C1;
+static const field self::Simple var1 = #C2;
+static const field self::A var2 = #C3;
+static method main() → void {
+  exp::Expect::equals((#C2).{self::Simple::name}, #C1);
+}
+
+constants  {
+  #C1 = "print"
+  #C2 = self::Simple {name:#C1}
+  #C3 = self::A {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///const_functions_const_ctor.dart:
+- Simple. (from org-dartlang-testcase:///const_functions_const_ctor.dart:14:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- A. (from org-dartlang-testcase:///const_functions_const_ctor.dart:21:9)
diff --git a/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.strong.transformed.expect b/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.strong.transformed.expect
new file mode 100644
index 0000000..3ad815a
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.strong.transformed.expect
@@ -0,0 +1,39 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+class Simple extends core::Object /*hasConstConstructor*/  {
+  final field core::String name;
+  const constructor •(core::String name) → self::Simple
+    : self::Simple::name = name, super core::Object::•() {
+    assert(this.{self::Simple::name}.{core::String::==}(#C1));
+  }
+}
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•() {
+    return;
+  }
+}
+static const field core::String printString = #C1;
+static const field self::Simple var1 = #C2;
+static const field self::A var2 = #C3;
+static method main() → void {
+  exp::Expect::equals((#C2).{self::Simple::name}, #C1);
+}
+
+constants  {
+  #C1 = "print"
+  #C2 = self::Simple {name:#C1}
+  #C3 = self::A {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///const_functions_const_ctor.dart:
+- Simple. (from org-dartlang-testcase:///const_functions_const_ctor.dart:14:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- A. (from org-dartlang-testcase:///const_functions_const_ctor.dart:21:9)
diff --git a/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.textual_outline.expect b/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.textual_outline.expect
new file mode 100644
index 0000000..bbb2129
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.textual_outline.expect
@@ -0,0 +1,12 @@
+import "package:expect/expect.dart";
+const printString = "print";
+const var1 = Simple(printString);
+class Simple {
+  final String name;
+  const Simple(this.name) {}
+}
+const var2 = A();
+class A {
+  const A() {}
+}
+void main() {}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.weak.expect b/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.weak.expect
new file mode 100644
index 0000000..3ad815a
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.weak.expect
@@ -0,0 +1,39 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+class Simple extends core::Object /*hasConstConstructor*/  {
+  final field core::String name;
+  const constructor •(core::String name) → self::Simple
+    : self::Simple::name = name, super core::Object::•() {
+    assert(this.{self::Simple::name}.{core::String::==}(#C1));
+  }
+}
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•() {
+    return;
+  }
+}
+static const field core::String printString = #C1;
+static const field self::Simple var1 = #C2;
+static const field self::A var2 = #C3;
+static method main() → void {
+  exp::Expect::equals((#C2).{self::Simple::name}, #C1);
+}
+
+constants  {
+  #C1 = "print"
+  #C2 = self::Simple {name:#C1}
+  #C3 = self::A {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///const_functions_const_ctor.dart:
+- Simple. (from org-dartlang-testcase:///const_functions_const_ctor.dart:14:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- A. (from org-dartlang-testcase:///const_functions_const_ctor.dart:21:9)
diff --git a/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.weak.outline.expect b/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.weak.outline.expect
new file mode 100644
index 0000000..7c13957
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.weak.outline.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+class Simple extends core::Object /*hasConstConstructor*/  {
+  final field core::String name;
+  const constructor •(core::String name) → self::Simple
+    : self::Simple::name = name, super core::Object::•()
+    ;
+}
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+static const field core::String printString = "print";
+static const field self::Simple var1 = const self::Simple::•(self::printString);
+static const field self::A var2 = const self::A::•();
+static method main() → void
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_functions_const_ctor.dart:10:14 -> InstanceConstant(const Simple{Simple.name: "print"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_functions_const_ctor.dart:19:14 -> InstanceConstant(const A{})
+Extra constant evaluation: evaluated: 3, effectively constant: 2
diff --git a/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.weak.transformed.expect b/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.weak.transformed.expect
new file mode 100644
index 0000000..3ad815a
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.weak.transformed.expect
@@ -0,0 +1,39 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+class Simple extends core::Object /*hasConstConstructor*/  {
+  final field core::String name;
+  const constructor •(core::String name) → self::Simple
+    : self::Simple::name = name, super core::Object::•() {
+    assert(this.{self::Simple::name}.{core::String::==}(#C1));
+  }
+}
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•() {
+    return;
+  }
+}
+static const field core::String printString = #C1;
+static const field self::Simple var1 = #C2;
+static const field self::A var2 = #C3;
+static method main() → void {
+  exp::Expect::equals((#C2).{self::Simple::name}, #C1);
+}
+
+constants  {
+  #C1 = "print"
+  #C2 = self::Simple {name:#C1}
+  #C3 = self::A {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///const_functions_const_ctor.dart:
+- Simple. (from org-dartlang-testcase:///const_functions_const_ctor.dart:14:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- A. (from org-dartlang-testcase:///const_functions_const_ctor.dart:21:9)
diff --git a/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart b/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart
new file mode 100644
index 0000000..642c066
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Tests erroneous const constructors with a body which are enabled with const
+// functions.
+
+import "package:expect/expect.dart";
+
+const printString = "print";
+
+const var1 = Simple(printString);
+class Simple {
+  final String name;
+
+  const Simple(this.name) {
+    assert(this.name != printString);
+  }
+}
+
+const var2 = Simple2(printString);
+class Simple2 {
+  final String name;
+
+  const Simple2(this.name) {
+    return Simple2(this.name);
+  }
+}
+
+const var3 = B();
+class A {
+  const A() {
+    assert(1 == 2);
+  }
+}
+
+class B extends A {
+  const B() : super();
+}
+
+void main() {}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.strong.expect b/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.strong.expect
new file mode 100644
index 0000000..fde5c0dd
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.strong.expect
@@ -0,0 +1,83 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:26:5: Error: Constructors can't have a return type.
+// Try removing the return type.
+//     return Simple2(this.name);
+//     ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:12:14: Error: Constant evaluation error:
+// const var1 = Simple(printString);
+//              ^
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:17:22: Context: This assertion failed.
+//     assert(this.name != printString);
+//                      ^
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:12:7: Context: While analyzing:
+// const var1 = Simple(printString);
+//       ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:30:14: Error: Constant evaluation error:
+// const var3 = B();
+//              ^
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:33:14: Context: This assertion failed.
+//     assert(1 == 2);
+//              ^
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:30:7: Context: While analyzing:
+// const var3 = B();
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+class Simple extends core::Object /*hasConstConstructor*/  {
+  final field core::String name;
+  const constructor •(core::String name) → self::Simple
+    : self::Simple::name = name, super core::Object::•() {
+    assert(!this.{self::Simple::name}.{core::String::==}(#C1));
+  }
+}
+class Simple2 extends core::Object /*hasConstConstructor*/  {
+  final field core::String name;
+  const constructor •(core::String name) → self::Simple2
+    : self::Simple2::name = name, super core::Object::•() {
+    invalid-expression "pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:26:5: Error: Constructors can't have a return type.
+Try removing the return type.
+    return Simple2(this.name);
+    ^";
+  }
+}
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•() {
+    assert(1.{core::num::==}(2));
+  }
+}
+class B extends self::A /*hasConstConstructor*/  {
+  const constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+static const field core::String printString = #C1;
+static const field self::Simple var1 = invalid-expression "This assertion failed.";
+static const field self::Simple2 var2 = invalid-expression "pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:26:5: Error: Constructors can't have a return type.
+Try removing the return type.
+    return Simple2(this.name);
+    ^";
+static const field self::B var3 = invalid-expression "This assertion failed.";
+static method main() → void {}
+
+constants  {
+  #C1 = "print"
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///const_functions_const_ctor_error.dart:
+- Simple. (from org-dartlang-testcase:///const_functions_const_ctor_error.dart:16:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- Simple2. (from org-dartlang-testcase:///const_functions_const_ctor_error.dart:25:9)
+- B. (from org-dartlang-testcase:///const_functions_const_ctor_error.dart:38:9)
+- A. (from org-dartlang-testcase:///const_functions_const_ctor_error.dart:32:9)
diff --git a/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.strong.transformed.expect b/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.strong.transformed.expect
new file mode 100644
index 0000000..aac0f05
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.strong.transformed.expect
@@ -0,0 +1,87 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:26:5: Error: Constructors can't have a return type.
+// Try removing the return type.
+//     return Simple2(this.name);
+//     ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:12:14: Error: Constant evaluation error:
+// const var1 = Simple(printString);
+//              ^
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:17:22: Context: This assertion failed.
+//     assert(this.name != printString);
+//                      ^
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:12:7: Context: While analyzing:
+// const var1 = Simple(printString);
+//       ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:30:14: Error: Constant evaluation error:
+// const var3 = B();
+//              ^
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:33:14: Context: This assertion failed.
+//     assert(1 == 2);
+//              ^
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:30:7: Context: While analyzing:
+// const var3 = B();
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+class Simple extends core::Object /*hasConstConstructor*/  {
+  final field core::String name;
+  const constructor •(core::String name) → self::Simple
+    : self::Simple::name = name, super core::Object::•() {
+    assert(!this.{self::Simple::name}.{core::String::==}(#C1));
+  }
+}
+class Simple2 extends core::Object /*hasConstConstructor*/  {
+  final field core::String name;
+  const constructor •(core::String name) → self::Simple2
+    : self::Simple2::name = name, super core::Object::•() {
+    invalid-expression "pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:26:5: Error: Constructors can't have a return type.
+Try removing the return type.
+    return Simple2(this.name);
+    ^";
+  }
+}
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•() {
+    assert(1.{core::num::==}(2));
+  }
+}
+class B extends self::A /*hasConstConstructor*/  {
+  const constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+static const field core::String printString = #C1;
+static const field self::Simple var1 = invalid-expression "This assertion failed.";
+static const field self::Simple2 var2 = invalid-expression "pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:26:5: Error: Constructors can't have a return type.
+Try removing the return type.
+    return Simple2(this.name);
+    ^";
+static const field self::B var3 = invalid-expression "This assertion failed.";
+static method main() → void {}
+
+constants  {
+  #C1 = "print"
+}
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///const_functions_const_ctor_error.dart:33:14 -> BoolConstant(false)
+Extra constant evaluation: evaluated: 7, effectively constant: 1
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///const_functions_const_ctor_error.dart:
+- Simple. (from org-dartlang-testcase:///const_functions_const_ctor_error.dart:16:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- Simple2. (from org-dartlang-testcase:///const_functions_const_ctor_error.dart:25:9)
+- B. (from org-dartlang-testcase:///const_functions_const_ctor_error.dart:38:9)
+- A. (from org-dartlang-testcase:///const_functions_const_ctor_error.dart:32:9)
diff --git a/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.textual_outline.expect b/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.textual_outline.expect
new file mode 100644
index 0000000..86a66c8
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.textual_outline.expect
@@ -0,0 +1,20 @@
+import "package:expect/expect.dart";
+const printString = "print";
+const var1 = Simple(printString);
+class Simple {
+  final String name;
+  const Simple(this.name) {}
+}
+const var2 = Simple2(printString);
+class Simple2 {
+  final String name;
+  const Simple2(this.name) {}
+}
+const var3 = B();
+class A {
+  const A() {}
+}
+class B extends A {
+  const B() : super();
+}
+void main() {}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.weak.expect b/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.weak.expect
new file mode 100644
index 0000000..fde5c0dd
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.weak.expect
@@ -0,0 +1,83 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:26:5: Error: Constructors can't have a return type.
+// Try removing the return type.
+//     return Simple2(this.name);
+//     ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:12:14: Error: Constant evaluation error:
+// const var1 = Simple(printString);
+//              ^
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:17:22: Context: This assertion failed.
+//     assert(this.name != printString);
+//                      ^
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:12:7: Context: While analyzing:
+// const var1 = Simple(printString);
+//       ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:30:14: Error: Constant evaluation error:
+// const var3 = B();
+//              ^
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:33:14: Context: This assertion failed.
+//     assert(1 == 2);
+//              ^
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:30:7: Context: While analyzing:
+// const var3 = B();
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+class Simple extends core::Object /*hasConstConstructor*/  {
+  final field core::String name;
+  const constructor •(core::String name) → self::Simple
+    : self::Simple::name = name, super core::Object::•() {
+    assert(!this.{self::Simple::name}.{core::String::==}(#C1));
+  }
+}
+class Simple2 extends core::Object /*hasConstConstructor*/  {
+  final field core::String name;
+  const constructor •(core::String name) → self::Simple2
+    : self::Simple2::name = name, super core::Object::•() {
+    invalid-expression "pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:26:5: Error: Constructors can't have a return type.
+Try removing the return type.
+    return Simple2(this.name);
+    ^";
+  }
+}
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•() {
+    assert(1.{core::num::==}(2));
+  }
+}
+class B extends self::A /*hasConstConstructor*/  {
+  const constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+static const field core::String printString = #C1;
+static const field self::Simple var1 = invalid-expression "This assertion failed.";
+static const field self::Simple2 var2 = invalid-expression "pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:26:5: Error: Constructors can't have a return type.
+Try removing the return type.
+    return Simple2(this.name);
+    ^";
+static const field self::B var3 = invalid-expression "This assertion failed.";
+static method main() → void {}
+
+constants  {
+  #C1 = "print"
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///const_functions_const_ctor_error.dart:
+- Simple. (from org-dartlang-testcase:///const_functions_const_ctor_error.dart:16:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- Simple2. (from org-dartlang-testcase:///const_functions_const_ctor_error.dart:25:9)
+- B. (from org-dartlang-testcase:///const_functions_const_ctor_error.dart:38:9)
+- A. (from org-dartlang-testcase:///const_functions_const_ctor_error.dart:32:9)
diff --git a/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.weak.outline.expect b/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.weak.outline.expect
new file mode 100644
index 0000000..2c363dd
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.weak.outline.expect
@@ -0,0 +1,41 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+class Simple extends core::Object /*hasConstConstructor*/  {
+  final field core::String name;
+  const constructor •(core::String name) → self::Simple
+    : self::Simple::name = name, super core::Object::•()
+    ;
+}
+class Simple2 extends core::Object /*hasConstConstructor*/  {
+  final field core::String name;
+  const constructor •(core::String name) → self::Simple2
+    : self::Simple2::name = name, super core::Object::•()
+    ;
+}
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A /*hasConstConstructor*/  {
+  const constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+static const field core::String printString = "print";
+static const field self::Simple var1 = const self::Simple::•(self::printString);
+static const field self::Simple2 var2 = const self::Simple2::•(self::printString);
+static const field self::B var3 = const self::B::•();
+static method main() → void
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_functions_const_ctor_error.dart:12:14 -> InstanceConstant(const Simple{Simple.name: "print"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_functions_const_ctor_error.dart:21:14 -> InstanceConstant(const Simple2{Simple2.name: "print"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_functions_const_ctor_error.dart:30:14 -> InstanceConstant(const B{})
+Extra constant evaluation: evaluated: 5, effectively constant: 3
diff --git a/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.weak.transformed.expect b/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.weak.transformed.expect
new file mode 100644
index 0000000..aac0f05
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.weak.transformed.expect
@@ -0,0 +1,87 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:26:5: Error: Constructors can't have a return type.
+// Try removing the return type.
+//     return Simple2(this.name);
+//     ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:12:14: Error: Constant evaluation error:
+// const var1 = Simple(printString);
+//              ^
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:17:22: Context: This assertion failed.
+//     assert(this.name != printString);
+//                      ^
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:12:7: Context: While analyzing:
+// const var1 = Simple(printString);
+//       ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:30:14: Error: Constant evaluation error:
+// const var3 = B();
+//              ^
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:33:14: Context: This assertion failed.
+//     assert(1 == 2);
+//              ^
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:30:7: Context: While analyzing:
+// const var3 = B();
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+class Simple extends core::Object /*hasConstConstructor*/  {
+  final field core::String name;
+  const constructor •(core::String name) → self::Simple
+    : self::Simple::name = name, super core::Object::•() {
+    assert(!this.{self::Simple::name}.{core::String::==}(#C1));
+  }
+}
+class Simple2 extends core::Object /*hasConstConstructor*/  {
+  final field core::String name;
+  const constructor •(core::String name) → self::Simple2
+    : self::Simple2::name = name, super core::Object::•() {
+    invalid-expression "pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:26:5: Error: Constructors can't have a return type.
+Try removing the return type.
+    return Simple2(this.name);
+    ^";
+  }
+}
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•() {
+    assert(1.{core::num::==}(2));
+  }
+}
+class B extends self::A /*hasConstConstructor*/  {
+  const constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+static const field core::String printString = #C1;
+static const field self::Simple var1 = invalid-expression "This assertion failed.";
+static const field self::Simple2 var2 = invalid-expression "pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:26:5: Error: Constructors can't have a return type.
+Try removing the return type.
+    return Simple2(this.name);
+    ^";
+static const field self::B var3 = invalid-expression "This assertion failed.";
+static method main() → void {}
+
+constants  {
+  #C1 = "print"
+}
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///const_functions_const_ctor_error.dart:33:14 -> BoolConstant(false)
+Extra constant evaluation: evaluated: 7, effectively constant: 1
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///const_functions_const_ctor_error.dart:
+- Simple. (from org-dartlang-testcase:///const_functions_const_ctor_error.dart:16:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- Simple2. (from org-dartlang-testcase:///const_functions_const_ctor_error.dart:25:9)
+- B. (from org-dartlang-testcase:///const_functions_const_ctor_error.dart:38:9)
+- A. (from org-dartlang-testcase:///const_functions_const_ctor_error.dart:32:9)
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index 7a46a53..12e2725 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -20,9 +20,11 @@
 regress/issue_39091_2: EmptyOutput
 regress/utf_16_le_content.crash: EmptyOutput
 
+const_functions/const_functions_const_ctor: FormatterCrash
+const_functions/const_functions_const_ctor_error: FormatterCrash
+const_functions/const_functions_const_factory: FormatterCrash
 dart2js/late_fields: FormatterCrash
 dart2js/late_statics: FormatterCrash
-const_functions/const_functions_const_factory: FormatterCrash
 extensions/extension_constructor: FormatterCrash
 extensions/extension_field_with_type_parameter_usage: FormatterCrash
 extensions/issue38600: FormatterCrash
diff --git a/runtime/vm/thread.h b/runtime/vm/thread.h
index 87b76c0..9b4dfe3 100644
--- a/runtime/vm/thread.h
+++ b/runtime/vm/thread.h
@@ -1159,8 +1159,7 @@
 
 class NoReloadScope : public ThreadStackResource {
  public:
-  explicit NoReloadScope(Thread* thread)
-      : ThreadStackResource(thread), thread_(thread) {
+  explicit NoReloadScope(Thread* thread) : ThreadStackResource(thread) {
 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
     thread->no_reload_scope_depth_++;
     ASSERT(thread->no_reload_scope_depth_ >= 0);
@@ -1169,20 +1168,18 @@
 
   ~NoReloadScope() {
 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
-    thread_->no_reload_scope_depth_ -= 1;
-    ASSERT(thread_->no_reload_scope_depth_ >= 0);
+    thread()->no_reload_scope_depth_ -= 1;
+    ASSERT(thread()->no_reload_scope_depth_ >= 0);
 #endif  // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
   }
 
  private:
-  Thread* thread_;
   DISALLOW_COPY_AND_ASSIGN(NoReloadScope);
 };
 
 class StoppedMutatorsScope : public ThreadStackResource {
  public:
-  explicit StoppedMutatorsScope(Thread* thread)
-      : ThreadStackResource(thread), thread_(thread) {
+  explicit StoppedMutatorsScope(Thread* thread) : ThreadStackResource(thread) {
 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
     thread->stopped_mutators_scope_depth_++;
     ASSERT(thread->stopped_mutators_scope_depth_ >= 0);
@@ -1191,13 +1188,12 @@
 
   ~StoppedMutatorsScope() {
 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
-    thread_->stopped_mutators_scope_depth_ -= 1;
-    ASSERT(thread_->stopped_mutators_scope_depth_ >= 0);
+    thread()->stopped_mutators_scope_depth_ -= 1;
+    ASSERT(thread()->stopped_mutators_scope_depth_ >= 0);
 #endif  // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
   }
 
  private:
-  Thread* thread_;
   DISALLOW_COPY_AND_ASSIGN(StoppedMutatorsScope);
 };
 
diff --git a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart
index 36ebdf8..b798adf 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart
@@ -102,8 +102,23 @@
   //     }
   //   }
   // }
-  return "Expected a value of type '${typeName(to)}', "
-      "but got one of type '${typeName(from)}'";
+  var fromName = "'${typeName(from)}'";
+  var toName = "'${typeName(to)}'";
+
+  var toType = to;
+  if (_jsInstanceOf(to, NullableType) || _jsInstanceOf(to, LegacyType)) {
+    toType = to.type;
+  }
+  var fromType = from;
+  if (_jsInstanceOf(from, NullableType) || _jsInstanceOf(from, LegacyType)) {
+    fromType = from.type;
+  }
+
+  if (typeName(fromType) == typeName(toType)) {
+    fromName += ' (in ${getLibraryUri(fromType)})';
+    toName += ' (in ${getLibraryUri(toType)})';
+  }
+  return 'Expected a value of type $toName, but got one of type $fromName';
 }
 
 /// The symbol that references the thrown Dart Object (typically but not
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index bc7bdfb..977a16c 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -2185,7 +2185,7 @@
    */
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
-  gl.RenderingContext getContext3d(
+  gl.RenderingContext? getContext3d(
       {alpha: true,
       depth: true,
       stencil: false,
@@ -2204,7 +2204,7 @@
     if (context == null) {
       context = getContext('experimental-webgl', options);
     }
-    return context as gl.RenderingContext;
+    return context as gl.RenderingContext?;
   }
 
   /**
diff --git a/tests/dartdevc/cast_error/lib_a.dart b/tests/dartdevc/cast_error/lib_a.dart
new file mode 100644
index 0000000..5c6dedf
--- /dev/null
+++ b/tests/dartdevc/cast_error/lib_a.dart
@@ -0,0 +1,5 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Animal {}
diff --git a/tests/dartdevc/cast_error/lib_b.dart b/tests/dartdevc/cast_error/lib_b.dart
new file mode 100644
index 0000000..5c6dedf
--- /dev/null
+++ b/tests/dartdevc/cast_error/lib_b.dart
@@ -0,0 +1,5 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Animal {}
diff --git a/tests/dartdevc/cast_error/library_uri_in_message_test.dart b/tests/dartdevc/cast_error/library_uri_in_message_test.dart
new file mode 100644
index 0000000..42d7b85
--- /dev/null
+++ b/tests/dartdevc/cast_error/library_uri_in_message_test.dart
@@ -0,0 +1,66 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "../utils.dart";
+import "lib_a.dart" as libA;
+import "lib_b.dart" as libB;
+
+void main() {
+  // When the name of the class is the same the error message should include
+  // library URIs for the two classes.
+  var a = libA.Animal();
+  try {
+    a as libB.Animal;
+  } on TypeError catch (error) {
+    var message = error.toString();
+    expectStringContains(
+        "Expected a value of type 'Animal' "
+        "(in org-dartlang-app:/tests/dartdevc/cast_error/lib_b.dart)",
+        message);
+    expectStringContains(
+        "but got one of type 'Animal' "
+        "(in org-dartlang-app:/tests/dartdevc/cast_error/lib_a.dart)",
+        message);
+  }
+  // Verify the libraries are properly ordered.
+  var b = libB.Animal();
+  try {
+    b as libA.Animal;
+  } on TypeError catch (error) {
+    var message = error.toString();
+    expectStringContains(
+        "Expected a value of type 'Animal' "
+        "(in org-dartlang-app:/tests/dartdevc/cast_error/lib_a.dart)",
+        message);
+    expectStringContains(
+        "but got one of type 'Animal' "
+        "(in org-dartlang-app:/tests/dartdevc/cast_error/lib_b.dart)",
+        message);
+  }
+
+  // Shows library URIs when one of the types is nullable.
+  try {
+    b as libA.Animal?;
+  } on TypeError catch (error) {
+    var message = error.toString();
+    expectStringContains(
+        "Expected a value of type 'Animal?' "
+        "(in org-dartlang-app:/tests/dartdevc/cast_error/lib_a.dart)",
+        message);
+    expectStringContains(
+        "but got one of type 'Animal' "
+        "(in org-dartlang-app:/tests/dartdevc/cast_error/lib_b.dart)",
+        message);
+  }
+
+  // URIs are not displayed when the class names are different.
+  try {
+    a as String;
+  } on TypeError catch (error) {
+    var message = error.toString();
+    expectStringContains(
+        "Expected a value of type 'String', but got one of type 'Animal'",
+        message);
+  }
+}
diff --git a/tests/dartdevc_2/cast_error/lib_a.dart b/tests/dartdevc_2/cast_error/lib_a.dart
new file mode 100644
index 0000000..5c6dedf
--- /dev/null
+++ b/tests/dartdevc_2/cast_error/lib_a.dart
@@ -0,0 +1,5 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Animal {}
diff --git a/tests/dartdevc_2/cast_error/lib_b.dart b/tests/dartdevc_2/cast_error/lib_b.dart
new file mode 100644
index 0000000..5c6dedf
--- /dev/null
+++ b/tests/dartdevc_2/cast_error/lib_b.dart
@@ -0,0 +1,5 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Animal {}
diff --git a/tests/dartdevc_2/cast_error/library_uri_in_message_test.dart b/tests/dartdevc_2/cast_error/library_uri_in_message_test.dart
new file mode 100644
index 0000000..c278d15
--- /dev/null
+++ b/tests/dartdevc_2/cast_error/library_uri_in_message_test.dart
@@ -0,0 +1,53 @@
+// 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.
+
+// @dart = 2.9
+
+import "../utils.dart";
+import "lib_a.dart" as libA;
+import "lib_b.dart" as libB;
+
+void main() {
+  // When the name of the class is the same the error message should include
+  // library URIs for the two classes.
+  var a = libA.Animal();
+  try {
+    a as libB.Animal;
+  } on TypeError catch (error) {
+    var message = error.toString();
+    expectStringContains(
+        "Expected a value of type 'Animal' "
+        "(in org-dartlang-app:/tests/dartdevc_2/cast_error/lib_b.dart)",
+        message);
+    expectStringContains(
+        "but got one of type 'Animal' "
+        "(in org-dartlang-app:/tests/dartdevc_2/cast_error/lib_a.dart)",
+        message);
+  }
+  // Verify the libraries are properly ordered.
+  var b = libB.Animal();
+  try {
+    b as libA.Animal;
+  } on TypeError catch (error) {
+    var message = error.toString();
+    expectStringContains(
+        "Expected a value of type 'Animal' "
+        "(in org-dartlang-app:/tests/dartdevc_2/cast_error/lib_a.dart)",
+        message);
+    expectStringContains(
+        "but got one of type 'Animal' "
+        "(in org-dartlang-app:/tests/dartdevc_2/cast_error/lib_b.dart)",
+        message);
+  }
+
+  // URIs are not displayed when the class names are different.
+  try {
+    a as String;
+  } on TypeError catch (error) {
+    var message = error.toString();
+    expectStringContains(
+        "Expected a value of type 'String', but got one of type 'Animal'",
+        message);
+  }
+}
diff --git a/tests/language/const_functions/const_functions_const_ctor_disabled_test.dart b/tests/language/const_functions/const_functions_const_ctor_disabled_test.dart
new file mode 100644
index 0000000..e30f991
--- /dev/null
+++ b/tests/language/const_functions/const_functions_const_ctor_disabled_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Tests const constructors with a body are disabled without const functions.
+
+import "package:expect/expect.dart";
+
+const printString = "print";
+const var1 = Simple(printString);
+//           ^
+// [cfe] Cannot invoke a non-'const' constructor where a const expression is expected.
+class Simple {
+  final String name;
+
+  const Simple(this.name) {
+//^
+// [cfe] A const constructor can't have a body.
+  //                      ^
+  // [analyzer] SYNTACTIC_ERROR.CONST_CONSTRUCTOR_WITH_BODY
+    assert(this.name == printString);
+  }
+}
diff --git a/tests/language/const_functions/const_functions_const_ctor_error_test.dart b/tests/language/const_functions/const_functions_const_ctor_error_test.dart
new file mode 100644
index 0000000..69fbe69
--- /dev/null
+++ b/tests/language/const_functions/const_functions_const_ctor_error_test.dart
@@ -0,0 +1,55 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Tests erroneous const constructors with a body which are enabled with const
+// functions.
+
+// SharedOptions=--enable-experiment=const-functions
+
+import "package:expect/expect.dart";
+
+const printString = "print";
+
+const var1 = Simple(printString);
+//           ^
+// [cfe] Constant evaluation error:
+class Simple {
+  final String name;
+
+  const Simple(this.name) {
+//                        ^
+// [analyzer] SYNTACTIC_ERROR.CONST_CONSTRUCTOR_WITH_BODY
+    assert(this.name != printString);
+  }
+}
+
+const var2 = Simple2(printString);
+class Simple2 {
+  final String name;
+
+  const Simple2(this.name) {
+//                         ^
+// [analyzer] SYNTACTIC_ERROR.CONST_CONSTRUCTOR_WITH_BODY
+    return Simple2(this.name);
+//  ^
+// [cfe] Constructors can't have a return type.
+//         ^^^^^^^^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.RETURN_IN_GENERATIVE_CONSTRUCTOR
+  }
+}
+
+const var3 = B();
+//           ^
+// [cfe] Constant evaluation error:
+class A {
+  const A() {
+  //        ^
+  // [analyzer] SYNTACTIC_ERROR.CONST_CONSTRUCTOR_WITH_BODY
+    assert(1 == 2);
+  }
+}
+
+class B extends A {
+  const B() : super();
+}
diff --git a/tests/language/const_functions/const_functions_const_ctor_test.dart b/tests/language/const_functions/const_functions_const_ctor_test.dart
new file mode 100644
index 0000000..0430cce
--- /dev/null
+++ b/tests/language/const_functions/const_functions_const_ctor_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Tests const constructors with a body which are enabled with const functions.
+
+// SharedOptions=--enable-experiment=const-functions
+
+import "package:expect/expect.dart";
+
+const printString = "print";
+const var1 = Simple(printString);
+class Simple {
+  final String name;
+
+  const Simple(this.name) {
+//                        ^
+// [analyzer] SYNTACTIC_ERROR.CONST_CONSTRUCTOR_WITH_BODY
+    assert(this.name == printString);
+  }
+}
+
+const var2 = A();
+class A {
+  const A() {
+  //        ^
+  // [analyzer] SYNTACTIC_ERROR.CONST_CONSTRUCTOR_WITH_BODY
+    return;
+  }
+}
+
+void main() {
+  Expect.equals(var1.name, printString);
+}
diff --git a/tests/lib/html/webgl_1_test.dart b/tests/lib/html/webgl_1_test.dart
index 9c3b420..3c72c3b 100644
--- a/tests/lib/html/webgl_1_test.dart
+++ b/tests/lib/html/webgl_1_test.dart
@@ -37,8 +37,9 @@
       test('simple', () {
         var canvas = new CanvasElement();
         var context =
-            canvas.getContext('experimental-webgl') as gl.RenderingContext;
-        var shader = context.createShader(gl.WebGL.VERTEX_SHADER);
+            canvas.getContext('experimental-webgl') as gl.RenderingContext?;
+        expect(context, isNotNull);
+        var shader = context!.createShader(gl.WebGL.VERTEX_SHADER);
         context.shaderSource(shader, 'void main() { }');
         context.compileShader(shader);
         var success =
@@ -59,7 +60,7 @@
 
       test('texImage2D', () {
         var canvas = new CanvasElement();
-        gl.RenderingContext context = canvas.getContext3d();
+        var context = canvas.getContext3d()!;
         var pixels = new Uint8List.fromList([0, 0, 3, 255, 0, 0, 0, 0, 0, 0]);
         context.texImage2D(1, 1, 1, 1, 10, 10, 1, 1, pixels);
 
@@ -77,7 +78,7 @@
 
       test('texSubImage2D', () {
         var canvas = new CanvasElement();
-        gl.RenderingContext context = canvas.getContext3d();
+        var context = canvas.getContext3d()!;
         var pixels = new Uint8List.fromList([0, 0, 3, 255, 0, 0, 0, 0, 0, 0]);
         context.texSubImage2D(1, 1, 1, 1, 1, 10, 10, 1, pixels);
 
@@ -95,7 +96,7 @@
 
       test('getContextAttributes', () {
         var canvas = new CanvasElement();
-        var context = canvas.getContext3d();
+        var context = canvas.getContext3d()!;
         var attributes = context.getContextAttributes();
 
         expect(attributes, isNotNull);
diff --git a/tests/lib/html/webgl_extensions_test.dart b/tests/lib/html/webgl_extensions_test.dart
index 133cc7f..fb3aab9 100644
--- a/tests/lib/html/webgl_extensions_test.dart
+++ b/tests/lib/html/webgl_extensions_test.dart
@@ -75,7 +75,8 @@
     expect(name, anyOf(allExtensions), reason: 'unknown extension');
     var canvas = new CanvasElement();
     var context = canvas.getContext3d();
-    var supportedExtensions = context.getSupportedExtensions()!;
+    expect(context, isNotNull);
+    var supportedExtensions = context!.getSupportedExtensions()!;
     if (supportedExtensions.contains(name)) {
       var extension = context.getExtension(name);
       expect(extension, isNotNull);
diff --git a/tests/lib_2/html/webgl_1_test.dart b/tests/lib_2/html/webgl_1_test.dart
index f156e2f..679d647 100644
--- a/tests/lib_2/html/webgl_1_test.dart
+++ b/tests/lib_2/html/webgl_1_test.dart
@@ -38,6 +38,7 @@
         var canvas = new CanvasElement();
         var context =
             canvas.getContext('experimental-webgl') as gl.RenderingContext;
+        expect(context, isNotNull);
         var shader = context.createShader(gl.WebGL.VERTEX_SHADER);
         context.shaderSource(shader, 'void main() { }');
         context.compileShader(shader);
@@ -59,7 +60,7 @@
 
       test('texImage2D', () {
         var canvas = new CanvasElement();
-        gl.RenderingContext context = canvas.getContext3d();
+        var context = canvas.getContext3d();
         var pixels = new Uint8List.fromList([0, 0, 3, 255, 0, 0, 0, 0, 0, 0]);
         context.texImage2D(1, 1, 1, 1, 10, 10, 1, 1, pixels);
 
@@ -76,7 +77,7 @@
 
       test('texSubImage2D', () {
         var canvas = new CanvasElement();
-        gl.RenderingContext context = canvas.getContext3d();
+        var context = canvas.getContext3d();
         var pixels = new Uint8List.fromList([0, 0, 3, 255, 0, 0, 0, 0, 0, 0]);
         context.texSubImage2D(1, 1, 1, 1, 1, 10, 10, 1, pixels);
 
diff --git a/tests/lib_2/html/webgl_extensions_test.dart b/tests/lib_2/html/webgl_extensions_test.dart
index 86e9a86..cd7d39c 100644
--- a/tests/lib_2/html/webgl_extensions_test.dart
+++ b/tests/lib_2/html/webgl_extensions_test.dart
@@ -75,6 +75,7 @@
     expect(name, anyOf(allExtensions), reason: 'unknown extension');
     var canvas = new CanvasElement();
     var context = canvas.getContext3d();
+    expect(context, isNotNull);
     var supportedExtensions = context.getSupportedExtensions();
     if (supportedExtensions.contains(name)) {
       var extension = context.getExtension(name);
diff --git a/tools/VERSION b/tools/VERSION
index 4df21bf..6bd9737 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 13
 PATCH 0
-PRERELEASE 223
+PRERELEASE 224
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/dom/templates/html/impl/impl_HTMLCanvasElement.darttemplate b/tools/dom/templates/html/impl/impl_HTMLCanvasElement.darttemplate
index 2f89be1..a3c87f0 100644
--- a/tools/dom/templates/html/impl/impl_HTMLCanvasElement.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLCanvasElement.darttemplate
@@ -21,7 +21,7 @@
    */
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
-  gl.RenderingContext getContext3d({alpha: true, depth: true, stencil: false,
+  gl.RenderingContext$NULLABLE getContext3d({alpha: true, depth: true, stencil: false,
     antialias: true, premultipliedAlpha: true, preserveDrawingBuffer: false}) {
 
     var options = {
@@ -36,7 +36,7 @@
     if (context == null) {
       context = getContext('experimental-webgl', options);
     }
-    return context $#NULLSAFECAST(as gl.RenderingContext);
+    return context $#NULLSAFECAST(as gl.RenderingContext$NULLABLE);
   }
 
   /**
