Version 2.13.0-224.0.dev

Merge commit '7367c980a7225d223154f6d3f323ed0727acfa7b' into 'dev'
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);
   }
 
   /**