Version 2.13.0-232.0.dev

Merge commit 'c1339411bb27a3538a1a28d62ba19f2ffce47d89' into 'dev'
diff --git a/pkg/analysis_server/lib/src/cider/completion.dart b/pkg/analysis_server/lib/src/cider/completion.dart
index 99eeec2..8591b99 100644
--- a/pkg/analysis_server/lib/src/cider/completion.dart
+++ b/pkg/analysis_server/lib/src/cider/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 'package:analysis_server/src/protocol_server.dart';
 import 'package:analysis_server/src/services/completion/completion_core.dart';
 import 'package:analysis_server/src/services/completion/completion_performance.dart';
@@ -35,7 +33,7 @@
   final OperationPerformanceImpl _performanceRoot =
       OperationPerformanceImpl('<root>');
 
-  DartCompletionRequestImpl _dartCompletionRequest;
+  late DartCompletionRequestImpl _dartCompletionRequest;
 
   /// Paths of imported libraries for which suggestions were (re)computed
   /// during processing of this request. Does not include libraries that were
@@ -53,10 +51,10 @@
   ///
   /// The [line] and [column] are zero based.
   Future<CiderCompletionResult> compute({
-    @required String path,
-    @required int line,
-    @required int column,
-    @visibleForTesting void Function(ResolvedUnitResult) testResolvedUnit,
+    required String path,
+    required int line,
+    required int column,
+    @visibleForTesting void Function(ResolvedUnitResult)? testResolvedUnit,
   }) async {
     return _performanceRoot.runAsync('completion', (performance) async {
       var resolvedUnit = performance.run('resolution', (performance) {
@@ -147,9 +145,9 @@
         suggestions: suggestions,
         performance: CiderCompletionPerformance._(
           file: Duration.zero,
-          imports: performance.getChild('imports').elapsed,
-          resolution: performance.getChild('resolution').elapsed,
-          suggestions: performance.getChild('suggestions').elapsed,
+          imports: performance.getChild('imports')!.elapsed,
+          resolution: performance.getChild('resolution')!.elapsed,
+          suggestions: performance.getChild('suggestions')!.elapsed,
           operations: _performanceRoot.children.first,
         ),
         prefixStart: CiderPosition(line, column - filter._pattern.length),
@@ -161,9 +159,9 @@
 
   @Deprecated('Use compute')
   Future<CiderCompletionResult> compute2({
-    @required String path,
-    @required int line,
-    @required int column,
+    required String path,
+    required int line,
+    required int column,
   }) async {
     return compute(path: path, line: line, column: column);
   }
@@ -184,8 +182,8 @@
   /// TODO(scheglov) Implement show / hide combinators.
   /// TODO(scheglov) Implement prefixes.
   List<CompletionSuggestion> _importedLibrariesSuggestions({
-    @required LibraryElement target,
-    @required OperationPerformanceImpl performance,
+    required LibraryElement target,
+    required OperationPerformanceImpl performance,
   }) {
     var suggestions = <CompletionSuggestion>[];
     for (var importedLibrary in target.importedLibraries) {
@@ -202,8 +200,8 @@
   /// Return cached, or compute unprefixed suggestions for all elements
   /// exported from the library.
   List<CompletionSuggestion> _importedLibrarySuggestions({
-    @required LibraryElement element,
-    @required OperationPerformanceImpl performance,
+    required LibraryElement element,
+    required OperationPerformanceImpl performance,
   }) {
     performance.getDataInt('libraryCount').increment();
 
@@ -262,11 +260,11 @@
   final OperationPerformance operations;
 
   CiderCompletionPerformance._({
-    @required this.file,
-    @required this.imports,
-    @required this.resolution,
-    @required this.suggestions,
-    @required this.operations,
+    required this.file,
+    required this.imports,
+    required this.resolution,
+    required this.suggestions,
+    required this.operations,
   });
 }
 
@@ -281,9 +279,9 @@
   final CiderPosition prefixStart;
 
   CiderCompletionResult._({
-    @required this.suggestions,
-    @required this.performance,
-    @required this.prefixStart,
+    required this.suggestions,
+    required this.performance,
+    required this.prefixStart,
   });
 }
 
@@ -305,8 +303,8 @@
   final DartCompletionRequestImpl _request;
   final List<CompletionSuggestion> _suggestions;
 
-  FuzzyMatcher _matcher;
-  String _pattern;
+  late FuzzyMatcher _matcher;
+  late String _pattern;
 
   _FilterSort(this._request, this._suggestions);
 
diff --git a/pkg/analysis_server/lib/src/domains/execution/completion.dart b/pkg/analysis_server/lib/src/domains/execution/completion.dart
index 26197cd..825dce0 100644
--- a/pkg/analysis_server/lib/src/domains/execution/completion.dart
+++ b/pkg/analysis_server/lib/src/domains/execution/completion.dart
@@ -2,18 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/protocol_server.dart'
-    show
-        CompletionSuggestion,
-        RuntimeCompletionExpression,
-        RuntimeCompletionVariable,
-        SourceEdit;
+    show CompletionSuggestion, RuntimeCompletionExpression, SourceEdit;
 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';
-import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/file_system/overlay_file_system.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
@@ -28,18 +21,8 @@
   final String contextPath;
   final int contextOffset;
 
-  final List<RuntimeCompletionVariable> variables;
-  final List<RuntimeCompletionExpression> expressions;
-
-  RuntimeCompletionComputer(
-      this.resourceProvider,
-      this.analysisDriver,
-      this.code,
-      this.offset,
-      this.contextPath,
-      this.contextOffset,
-      this.variables,
-      this.expressions);
+  RuntimeCompletionComputer(this.resourceProvider, this.analysisDriver,
+      this.code, this.offset, this.contextPath, this.contextOffset);
 
   Future<RuntimeCompletionResult> compute() async {
     var contextResult = await analysisDriver.getResult(contextPath);
@@ -65,7 +48,7 @@
 
     // Compute the patched context file content.
     var targetCode = SourceEdit.applySequence(
-      contextResult.content,
+      contextResult.content!,
       changeBuilder.sourceChange.edits[0].edits,
     );
 
@@ -75,9 +58,8 @@
 
     // Update the context file content to include the code being completed.
     // Then resolve it, and restore the file to its initial state.
-    ResolvedUnitResult targetResult;
-    await _withContextFileContent(targetCode, () async {
-      targetResult = await analysisDriver.getResult(contextPath);
+    var targetResult = await _withContextFileContent(targetCode, () async {
+      return await analysisDriver.getResult(contextPath);
     });
 
     var contributor = DartCompletionManager(
@@ -106,8 +88,8 @@
     return RuntimeCompletionResult(expressions, suggestions);
   }
 
-  Future<void> _withContextFileContent(
-      String newContent, Future<void> Function() f) async {
+  Future<R> _withContextFileContent<R>(
+      String newContent, Future<R> Function() f) async {
     if (resourceProvider.hasOverlay(contextPath)) {
       var contextFile = resourceProvider.getFile(contextPath);
       var prevOverlayContent = contextFile.readAsStringSync();
@@ -119,7 +101,7 @@
           modificationStamp: 0,
         );
         analysisDriver.changeFile(contextPath);
-        await f();
+        return await f();
       } finally {
         resourceProvider.setOverlay(
           contextPath,
@@ -136,7 +118,7 @@
           modificationStamp: 0,
         );
         analysisDriver.changeFile(contextPath);
-        await f();
+        return await f();
       } finally {
         resourceProvider.removeOverlay(contextPath);
         analysisDriver.changeFile(contextPath);
diff --git a/pkg/analysis_server/lib/src/services/completion/postfix/postfix_completion.dart b/pkg/analysis_server/lib/src/services/completion/postfix/postfix_completion.dart
index c88f85d..8aa88e2 100644
--- a/pkg/analysis_server/lib/src/services/completion/postfix/postfix_completion.dart
+++ b/pkg/analysis_server/lib/src/services/completion/postfix/postfix_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 'package:analysis_server/src/protocol_server.dart' hide Element;
 import 'package:analysis_server/src/services/correction/util.dart';
 import 'package:analyzer/dart/analysis/results.dart';
@@ -20,10 +18,12 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
+import 'package:collection/collection.dart';
 
 /// An enumeration of possible postfix completion kinds.
 class DartPostfixCompletion {
-  static const NO_TEMPLATE = PostfixCompletionKind('', 'no change', null, null);
+  static const NO_TEMPLATE =
+      PostfixCompletionKind('', 'no change', _false, _null);
 
   static const List<PostfixCompletionKind> ALL_TEMPLATES = [
     PostfixCompletionKind('assert', 'expr.assert -> assert(expr);',
@@ -67,20 +67,20 @@
         'while', 'expr.while -> while (expr) {}', isBoolContext, expandWhile),
   ];
 
-  static Future<PostfixCompletion> expandAssert(
+  static Future<PostfixCompletion?> expandAssert(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
     return processor.expand(kind, processor.findAssertExpression, (expr) {
       return 'assert(${processor.utils.getNodeText(expr)});';
     }, withBraces: false);
   }
 
-  static Future<PostfixCompletion> expandElse(
+  static Future<PostfixCompletion?> expandElse(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
     return processor.expand(kind, processor.findBoolExpression,
         (expr) => 'if (${processor.makeNegatedBoolExpr(expr)})');
   }
 
-  static Future<PostfixCompletion> expandFor(
+  static Future<PostfixCompletion?> expandFor(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
     return processor.expand(kind, processor.findIterableExpression, (expr) {
       var value = processor.newVariable('value');
@@ -88,7 +88,7 @@
     });
   }
 
-  static Future<PostfixCompletion> expandFori(
+  static Future<PostfixCompletion?> expandFori(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
     return processor.expand(kind, processor.findIntExpression, (expr) {
       var index = processor.newVariable('i');
@@ -96,20 +96,20 @@
     });
   }
 
-  static Future<PostfixCompletion> expandIf(
+  static Future<PostfixCompletion?> expandIf(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
     return processor.expand(kind, processor.findBoolExpression,
         (expr) => 'if (${processor.utils.getNodeText(expr)})');
   }
 
-  static Future<PostfixCompletion> expandNegate(
+  static Future<PostfixCompletion?> expandNegate(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
     return processor.expand(kind, processor.findBoolExpression,
         (expr) => processor.makeNegatedBoolExpr(expr),
         withBraces: false);
   }
 
-  static Future<PostfixCompletion> expandNotNull(
+  static Future<PostfixCompletion?> expandNotNull(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
     return processor.expand(kind, processor.findObjectExpression, (expr) {
       return expr is NullLiteral
@@ -118,7 +118,7 @@
     });
   }
 
-  static Future<PostfixCompletion> expandNull(
+  static Future<PostfixCompletion?> expandNull(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
     return processor.expand(kind, processor.findObjectExpression, (expr) {
       return expr is NullLiteral
@@ -127,44 +127,44 @@
     });
   }
 
-  static Future<PostfixCompletion> expandParen(
+  static Future<PostfixCompletion?> expandParen(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
     return processor.expand(kind, processor.findObjectExpression,
         (expr) => '(${processor.utils.getNodeText(expr)})',
         withBraces: false);
   }
 
-  static Future<PostfixCompletion> expandReturn(
+  static Future<PostfixCompletion?> expandReturn(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
     return processor.expand(kind, processor.findObjectExpression,
         (expr) => 'return ${processor.utils.getNodeText(expr)};',
         withBraces: false);
   }
 
-  static Future<PostfixCompletion> expandSwitch(
+  static Future<PostfixCompletion?> expandSwitch(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
     return processor.expand(kind, processor.findObjectExpression,
         (expr) => 'switch (${processor.utils.getNodeText(expr)})');
   }
 
-  static Future<PostfixCompletion> expandTry(
+  static Future<PostfixCompletion?> expandTry(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
     return processor.expandTry(kind, processor.findStatement, withOn: false);
   }
 
-  static Future<PostfixCompletion> expandTryon(
+  static Future<PostfixCompletion?> expandTryon(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
     return processor.expandTry(kind, processor.findStatement, withOn: true);
   }
 
-  static Future<PostfixCompletion> expandWhile(
+  static Future<PostfixCompletion?> expandWhile(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
     return processor.expand(kind, processor.findBoolExpression,
         (expr) => 'while (${processor.utils.getNodeText(expr)})');
   }
 
-  static PostfixCompletionKind forKey(String key) =>
-      ALL_TEMPLATES.firstWhere((kind) => kind.key == key, orElse: () => null);
+  static PostfixCompletionKind? forKey(String key) =>
+      ALL_TEMPLATES.firstWhereOrNull((kind) => kind.key == key);
 
   static bool isAssertContext(PostfixCompletionProcessor processor) {
     return processor.findAssertExpression() != null;
@@ -193,6 +193,10 @@
   static bool isSwitchContext(PostfixCompletionProcessor processor) {
     return processor.findObjectExpression() != null;
   }
+
+  static bool _false(_) => false;
+
+  static Future<PostfixCompletion?> _null(_, __) async => null;
 }
 
 /// A description of a postfix completion.
@@ -227,8 +231,9 @@
 /// Clients may not extend, implement or mix-in this class.
 class PostfixCompletionKind {
   final String name, example;
-  final Function selector;
-  final Function computer;
+  final bool Function(PostfixCompletionProcessor) selector;
+  final Future<PostfixCompletion?> Function(
+      PostfixCompletionProcessor, PostfixCompletionKind) computer;
 
   const PostfixCompletionKind(
       this.name, this.example, this.selector, this.computer);
@@ -248,18 +253,18 @@
 
   final PostfixCompletionContext completionContext;
   final CorrectionUtils utils;
-  AstNode node;
-  PostfixCompletion completion;
+  AstNode? node;
+  PostfixCompletion? completion;
   SourceChange change = SourceChange('postfix-completion');
   final Map<String, LinkedEditGroup> linkedPositionGroups = {};
-  Position exitPosition;
+  Position? exitPosition;
 
   PostfixCompletionProcessor(this.completionContext)
       : utils = CorrectionUtils(completionContext.resolveResult);
 
   String get eol => utils.endOfLine;
 
-  String get file => completionContext.resolveResult.path;
+  String get file => completionContext.resolveResult.path!;
 
   String get key => completionContext.key;
 
@@ -279,13 +284,16 @@
       return NO_COMPLETION;
     }
     var completer = DartPostfixCompletion.forKey(key);
-    return completer?.computer(this, completer) ?? NO_COMPLETION;
+    if (completer == null) {
+      return NO_COMPLETION;
+    }
+    return await completer.computer(this, completer) ?? NO_COMPLETION;
   }
 
-  Future<PostfixCompletion> expand(
-      PostfixCompletionKind kind, Function contexter, Function sourcer,
+  Future<PostfixCompletion?> expand(PostfixCompletionKind kind,
+      Expression? Function() contexter, String Function(Expression) sourcer,
       {bool withBraces = true}) async {
-    AstNode expr = contexter();
+    var expr = contexter();
     if (expr == null) {
       return null;
     }
@@ -293,10 +301,7 @@
     var changeBuilder = ChangeBuilder(session: session);
     await changeBuilder.addDartFileEdit(file, (builder) {
       builder.addReplacement(range.node(expr), (builder) {
-        String newSrc = sourcer(expr);
-        if (newSrc == null) {
-          return null;
-        }
+        var newSrc = sourcer(expr);
         builder.write(newSrc);
         if (withBraces) {
           builder.write(' {');
@@ -317,10 +322,10 @@
     return completion;
   }
 
-  Future<PostfixCompletion> expandTry(
-      PostfixCompletionKind kind, Function contexter,
+  Future<PostfixCompletion?> expandTry(
+      PostfixCompletionKind kind, Statement? Function() contexter,
       {bool withOn = false}) async {
-    AstNode stmt = contexter();
+    var stmt = contexter();
     if (stmt == null) {
       return null;
     }
@@ -329,8 +334,11 @@
       // Embed the full line(s) of the statement in the try block.
       var startLine = lineInfo.getLocation(stmt.offset).lineNumber - 1;
       var endLine = lineInfo.getLocation(stmt.end).lineNumber - 1;
-      if (stmt is ExpressionStatement && !stmt.semicolon.isSynthetic) {
-        endLine += 1;
+      if (stmt is ExpressionStatement) {
+        var semicolon = stmt.semicolon;
+        if (semicolon != null && !semicolon.isSynthetic) {
+          endLine += 1;
+        }
       }
       var startOffset = lineInfo.getOffsetOfLine(startLine);
       var endOffset = lineInfo.getOffsetOfLine(endLine);
@@ -365,22 +373,23 @@
     return completion;
   }
 
-  Expression findAssertExpression() {
+  Expression? findAssertExpression() {
+    final node = this.node;
     if (node is Expression) {
       var boolExpr = _findOuterExpression(node, typeProvider.boolType);
       if (boolExpr == null) {
         return null;
       }
-      if (boolExpr.parent is ExpressionFunctionBody &&
-          boolExpr.parent.parent is FunctionExpression) {
-        FunctionExpression fnExpr = boolExpr.parent.parent;
-        var type = fnExpr.staticType;
+      var parent = boolExpr.parent;
+      var grandParent = parent?.parent;
+      if (parent is ExpressionFunctionBody &&
+          grandParent is FunctionExpression) {
+        var type = grandParent.staticType;
         if (type is! FunctionType) {
           return boolExpr;
         }
-        FunctionType fnType = type;
-        if (fnType.returnType == typeProvider.boolType) {
-          return fnExpr;
+        if (type.returnType == typeProvider.boolType) {
+          return grandParent;
         }
       }
       if (boolExpr.staticType == typeProvider.boolType) {
@@ -390,19 +399,19 @@
     return null;
   }
 
-  Expression findBoolExpression() =>
+  Expression? findBoolExpression() =>
       _findOuterExpression(node, typeProvider.boolType);
 
-  Expression findIntExpression() =>
+  Expression? findIntExpression() =>
       _findOuterExpression(node, typeProvider.intType);
 
-  Expression findIterableExpression() =>
+  Expression? findIterableExpression() =>
       _findOuterExpression(node, typeProvider.iterableDynamicType);
 
-  Expression findObjectExpression() =>
+  Expression? findObjectExpression() =>
       _findOuterExpression(node, typeProvider.objectType);
 
-  AstNode findStatement() {
+  Statement? findStatement() {
     var astNode = node;
     while (astNode != null) {
       if (astNode is Statement && astNode is! Block) {
@@ -428,7 +437,10 @@
       return false;
     }
     var completer = DartPostfixCompletion.forKey(key);
-    return completer?.selector(this);
+    if (completer == null) {
+      return false;
+    }
+    return completer.selector(this);
   }
 
   String makeNegatedBoolExpr(Expression expr) {
@@ -443,21 +455,24 @@
 
   String nameOfExceptionThrownBy(AstNode astNode) {
     if (astNode is ExpressionStatement) {
-      astNode = (astNode as ExpressionStatement).expression;
+      astNode = astNode.expression;
     }
     if (astNode is ThrowExpression) {
       var expr = astNode;
       var type = expr.expression.staticType;
+      if (type is! TypeImpl) {
+        return 'Exception';
+      }
 
       // Only print nullability for non-legacy types in non-legacy libraries.
       var showNullability = type.nullabilitySuffix != NullabilitySuffix.star &&
           (astNode.root as CompilationUnit)
-              .declaredElement
+              .declaredElement!
               .library
               .isNonNullableByDefault;
 
       // Can't catch nullable types, strip `?`s now that we've checked for `*`s.
-      return (type as TypeImpl)
+      return type
           .withNullability(NullabilitySuffix.none)
           .getDisplayString(withNullability: showNullability);
     }
@@ -474,12 +489,12 @@
     return name;
   }
 
-  Expression _findOuterExpression(AstNode start, InterfaceType builtInType) {
+  Expression? _findOuterExpression(AstNode? start, InterfaceType builtInType) {
     if (start is SimpleIdentifier && start.staticElement is PrefixElement) {
       return null;
     }
 
-    AstNode parent;
+    AstNode? parent;
     if (start is Expression) {
       parent = start;
     } else if (start is ArgumentList) {
@@ -495,26 +510,27 @@
       parent = parent.parent;
     }
 
-    var expr = list.firstWhere((expr) {
+    var expr = list.firstWhereOrNull((expr) {
       var type = expr.staticType;
       if (type == null) return false;
       return typeSystem.isSubtypeOf(type, builtInType);
-    }, orElse: () => null);
-    if (expr is SimpleIdentifier && expr.parent is PropertyAccess) {
-      expr = expr.parent;
+    });
+    var exprParent = expr?.parent;
+    if (expr is SimpleIdentifier && exprParent is PropertyAccess) {
+      expr = exprParent;
     }
-    if (expr?.parent is CascadeExpression) {
-      expr = expr.parent;
+    if (exprParent is CascadeExpression) {
+      expr = exprParent;
     }
     return expr;
   }
 
-  AstNode _selectedNode({int at}) => NodeLocator(at ?? selectionOffset)
+  AstNode? _selectedNode({int? at}) => NodeLocator(at ?? selectionOffset)
       .searchWithin(completionContext.resolveResult.unit);
 
   void _setCompletionFromBuilder(
       ChangeBuilder builder, PostfixCompletionKind kind,
-      [List args]) {
+      [List? args]) {
     var change = builder.sourceChange;
     if (change.edits.isEmpty) {
       completion = null;
diff --git a/pkg/analysis_server/lib/src/services/correction/assist.dart b/pkg/analysis_server/lib/src/services/correction/assist.dart
index 2929cc2..b85a733 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist.dart
@@ -138,6 +138,8 @@
   static const FLUTTER_WRAP_GENERIC =
       AssistKind('dart.assist.flutter.wrap.generic', 31, 'Wrap with widget...');
 
+  static const FLUTTER_WRAP_BUILDER = AssistKind(
+      'dart.assist.flutter.wrap.builder', 32, 'Wrap with Builder');
   static const FLUTTER_WRAP_CENTER =
       AssistKind('dart.assist.flutter.wrap.center', 32, 'Wrap with Center');
   static const FLUTTER_WRAP_COLUMN =
diff --git a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
index ef6a1ef..68c3a9b 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
@@ -51,6 +51,7 @@
 import 'package:analysis_server/src/services/correction/dart/flutter_swap_with_child.dart';
 import 'package:analysis_server/src/services/correction/dart/flutter_swap_with_parent.dart';
 import 'package:analysis_server/src/services/correction/dart/flutter_wrap.dart';
+import 'package:analysis_server/src/services/correction/dart/flutter_wrap_builder.dart';
 import 'package:analysis_server/src/services/correction/dart/flutter_wrap_generic.dart';
 import 'package:analysis_server/src/services/correction/dart/flutter_wrap_stream_builder.dart';
 import 'package:analysis_server/src/services/correction/dart/import_add_show.dart';
@@ -128,6 +129,7 @@
     FlutterRemoveWidget.newInstance,
     FlutterSwapWithChild.newInstance,
     FlutterSwapWithParent.newInstance,
+    FlutterWrapBuilder.newInstance,
     FlutterWrapGeneric.newInstance,
     FlutterWrapStreamBuilder.newInstance,
     ImportAddShow.newInstance,
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_builder.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_builder.dart
new file mode 100644
index 0000000..a2b9351
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_builder.dart
@@ -0,0 +1,68 @@
+// 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 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analysis_server/src/services/correction/dart/abstract_producer.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';
+
+class FlutterWrapBuilder extends CorrectionProducer {
+  @override
+  AssistKind get assistKind => DartAssistKind.FLUTTER_WRAP_BUILDER;
+
+  @override
+  Future<void> compute(ChangeBuilder builder) async {
+    var widgetExpr = flutter.identifyWidgetExpression(node);
+    if (widgetExpr == null) {
+      return;
+    }
+    if (flutter.isExactWidgetTypeBuilder(widgetExpr.staticType)) {
+      return;
+    }
+    var widgetSrc = utils.getNodeText(widgetExpr);
+
+    var builderElement = await sessionHelper.getClass(
+      flutter.widgetsUri,
+      'Builder',
+    );
+    if (builderElement == null) {
+      return;
+    }
+
+    await builder.addDartFileEdit(file, (builder) {
+      builder.addReplacement(range.node(widgetExpr), (builder) {
+        builder.writeReference(builderElement);
+
+        builder.writeln('(');
+
+        var indentOld = utils.getLinePrefix(widgetExpr.offset);
+        var indentNew1 = indentOld + utils.getIndent(1);
+        var indentNew2 = indentOld + utils.getIndent(2);
+
+        builder.write(indentNew1);
+        builder.writeln('builder: (context) {');
+
+        widgetSrc = widgetSrc.replaceAll(
+          RegExp('^$indentOld', multiLine: true),
+          indentNew2,
+        );
+        builder.write(indentNew2);
+        builder.write('return $widgetSrc');
+        builder.writeln(';');
+
+        builder.write(indentNew1);
+        builder.writeln('}');
+
+        builder.write(indentOld);
+        builder.write(')');
+      });
+    });
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `AssistProcessor`.
+  static FlutterWrapBuilder newInstance() => FlutterWrapBuilder();
+}
diff --git a/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart b/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart
index b33557d..f38a7cc 100644
--- a/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart
+++ b/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.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' as protocol;
 import 'package:analysis_server/src/services/flutter/class_description.dart';
 import 'package:analysis_server/src/services/flutter/property.dart';
@@ -19,10 +17,10 @@
 /// The result of [WidgetDescriptions.setPropertyValue] invocation.
 class SetPropertyValueResult {
   /// The error to report to the client, or `null` if OK.
-  final protocol.RequestErrorCode errorCode;
+  final protocol.RequestErrorCode? errorCode;
 
   /// The change to apply, or `null` if [errorCode] is not `null`.
-  final protocol.SourceChange change;
+  final protocol.SourceChange? change;
 
   SetPropertyValueResult._({this.errorCode, this.change});
 }
@@ -42,7 +40,7 @@
   /// Return the description of the widget with [InstanceCreationExpression] in
   /// the [resolvedUnit] at the [offset], or `null` if the location does not
   /// correspond to a widget.
-  Future<protocol.FlutterGetWidgetDescriptionResult> getDescription(
+  Future<protocol.FlutterGetWidgetDescriptionResult?> getDescription(
     ResolvedUnitResult resolvedUnit,
     int offset,
   ) async {
@@ -65,7 +63,7 @@
 
   Future<SetPropertyValueResult> setPropertyValue(
     int id,
-    protocol.FlutterWidgetPropertyValue value,
+    protocol.FlutterWidgetPropertyValue? value,
   ) async {
     var property = _properties[id];
     if (property == null) {
@@ -132,10 +130,10 @@
   /// The offset of the widget expression.
   final int widgetOffset;
 
-  ClassElement _classAlignment;
-  ClassElement _classAlignmentDirectional;
-  ClassElement _classContainer;
-  ClassElement _classEdgeInsets;
+  ClassElement? _classAlignment;
+  ClassElement? _classAlignmentDirectional;
+  ClassElement? _classContainer;
+  ClassElement? _classEdgeInsets;
 
   _WidgetDescriptionComputer(
     this.classRegistry,
@@ -145,8 +143,11 @@
 
   Flutter get _flutter => Flutter.instance;
 
-  Future<_WidgetDescription> compute() async {
+  Future<_WidgetDescription?> compute() async {
     var node = NodeLocator2(widgetOffset).searchWithin(resolvedUnit.unit);
+    if (node == null) {
+      return null;
+    }
     var instanceCreation = _flutter.identifyNewExpression(node);
     if (instanceCreation == null) {
       return null;
@@ -177,12 +178,12 @@
       return;
     }
 
-    InstanceCreationExpression parentCreation;
+    InstanceCreationExpression? parentCreation;
     var childArgument = widgetCreation.parent;
     if (childArgument is NamedExpression &&
         childArgument.name.label.name == 'child') {
       var argumentList = childArgument.parent;
-      var argumentListParent = argumentList.parent;
+      var argumentListParent = argumentList?.parent;
       if (argumentList is ArgumentList &&
           argumentListParent is InstanceCreationExpression) {
         parentCreation = argumentListParent;
@@ -213,7 +214,11 @@
         (property) => property.name == 'child',
       );
     } else {
-      var containerDescription = classRegistry.get(_classContainer);
+      var classContainer = _classContainer;
+      if (classContainer == null) {
+        return;
+      }
+      var containerDescription = classRegistry.get(classContainer);
       containerProperty = PropertyDescription(
         resolvedUnit: resolvedUnit,
         classDescription: containerDescription,
@@ -224,7 +229,7 @@
           'Container',
         ),
         virtualContainer: VirtualContainerProperty(
-          _classContainer,
+          classContainer,
           widgetCreation,
         ),
       );
@@ -236,7 +241,8 @@
         classDescription: containerDescription,
       );
 
-      if (_flutter.isExactlyAlignCreation(parentCreation) &&
+      if (parentCreation != null &&
+          _flutter.isExactlyAlignCreation(parentCreation) &&
           _flutter.findNamedArgument(parentCreation, 'widthFactor') == null &&
           _flutter.findNamedArgument(parentCreation, 'heightFactor') == null) {
         _replaceNestedContainerProperty(
@@ -246,7 +252,8 @@
         );
       }
 
-      if (_flutter.isExactlyPaddingCreation(parentCreation)) {
+      if (parentCreation != null &&
+          _flutter.isExactlyPaddingCreation(parentCreation)) {
         _replaceNestedContainerProperty(
           containerProperty,
           parentCreation,
@@ -261,13 +268,13 @@
   }
 
   void _addProperties({
-    List<PropertyDescription> properties,
-    PropertyDescription parent,
-    ClassDescription classDescription,
-    InstanceCreationExpression instanceCreation,
-    ConstructorElement constructorElement,
+    required List<PropertyDescription> properties,
+    PropertyDescription? parent,
+    ClassDescription? classDescription,
+    InstanceCreationExpression? instanceCreation,
+    ConstructorElement? constructorElement,
   }) {
-    constructorElement ??= instanceCreation?.constructorName?.staticElement;
+    constructorElement ??= instanceCreation?.constructorName.staticElement;
     constructorElement ??= classDescription?.constructor;
     if (constructorElement == null) return;
 
@@ -317,26 +324,26 @@
   }
 
   void _addProperty({
-    List<PropertyDescription> properties,
-    PropertyDescription parent,
-    ParameterElement parameter,
-    ClassDescription classDescription,
-    InstanceCreationExpression instanceCreation,
-    Expression argumentExpression,
-    Expression valueExpression,
+    required List<PropertyDescription> properties,
+    PropertyDescription? parent,
+    required ParameterElement parameter,
+    ClassDescription? classDescription,
+    InstanceCreationExpression? instanceCreation,
+    Expression? argumentExpression,
+    Expression? valueExpression,
   }) {
     var documentation = getParameterDocumentation(parameter);
 
-    String valueExpressionCode;
+    String? valueExpressionCode;
     if (valueExpression != null) {
-      valueExpressionCode = resolvedUnit.content.substring(
+      valueExpressionCode = resolvedUnit.content!.substring(
         valueExpression.offset,
         valueExpression.end,
       );
     }
 
     var isSafeToUpdate = false;
-    protocol.FlutterWidgetPropertyValue value;
+    protocol.FlutterWidgetPropertyValue? value;
     if (valueExpression != null) {
       value = _toValue(valueExpression);
       isSafeToUpdate = value != null;
@@ -366,11 +373,13 @@
     );
     properties.add(propertyDescription);
 
-    if (_flutter.isExactEdgeInsetsGeometryType(parameter.type)) {
-      propertyDescription.addEdgeInsetsNestedProperties(_classEdgeInsets);
+    var classEdgeInsets = _classEdgeInsets;
+    if (classEdgeInsets != null &&
+        _flutter.isExactEdgeInsetsGeometryType(parameter.type)) {
+      propertyDescription.addEdgeInsetsNestedProperties(classEdgeInsets);
     } else if (valueExpression is InstanceCreationExpression) {
       var type = valueExpression.staticType;
-      if (classRegistry.hasNestedProperties(type)) {
+      if (type != null && classRegistry.hasNestedProperties(type)) {
         _addProperties(
           properties: propertyDescription.children,
           parent: propertyDescription,
@@ -431,7 +440,7 @@
     );
   }
 
-  protocol.FlutterWidgetPropertyEditor _getEditor(DartType type) {
+  protocol.FlutterWidgetPropertyEditor? _getEditor(DartType type) {
     if (type.isDartCoreBool) {
       return protocol.FlutterWidgetPropertyEditor(
         protocol.FlutterWidgetPropertyEditorKind.BOOL,
@@ -462,12 +471,14 @@
       }
       if (_flutter.isExactAlignmentGeometry(classElement)) {
         var items = <protocol.FlutterWidgetPropertyValueEnumItem>[];
-        items.addAll(
-          _enumItemsForStaticFields(_classAlignment),
-        );
-        items.addAll(
-          _enumItemsForStaticFields(_classAlignmentDirectional),
-        );
+        var classAlignment = _classAlignment;
+        if (classAlignment != null) {
+          items.addAll(_enumItemsForStaticFields(classAlignment));
+        }
+        var classAlignmentDirectional = _classAlignmentDirectional;
+        if (classAlignmentDirectional != null) {
+          items.addAll(_enumItemsForStaticFields(classAlignmentDirectional));
+        }
         return protocol.FlutterWidgetPropertyEditor(
           protocol.FlutterWidgetPropertyEditorKind.ENUM_LIKE,
           enumItems: items,
@@ -486,20 +497,21 @@
   ) {
     var argument = _flutter.findNamedArgument(parentCreation, name);
     if (argument != null) {
-      var replacements = <PropertyDescription>[];
-      _addProperty(
-        properties: replacements,
-        parent: containerProperty,
-        parameter: argument.staticParameterElement,
-        instanceCreation: parentCreation,
-        argumentExpression: argument,
-        valueExpression: argument.expression,
-      );
+      var staticParameterElement = argument.staticParameterElement;
+      if (staticParameterElement != null) {
+        var replacements = <PropertyDescription>[];
+        _addProperty(
+          properties: replacements,
+          parent: containerProperty,
+          parameter: staticParameterElement,
+          instanceCreation: parentCreation,
+          argumentExpression: argument,
+          valueExpression: argument.expression,
+        );
 
-      var replacement = replacements[0];
-      if (replacement != null) {
+        var replacement = replacements[0];
         containerProperty.replaceChild(name, replacement);
-        containerProperty.virtualContainer.setParentCreation(
+        containerProperty.virtualContainer?.setParentCreation(
           parentCreation,
           argument,
         );
@@ -520,7 +532,7 @@
     );
   }
 
-  protocol.FlutterWidgetPropertyValue _toValue(Expression valueExpression) {
+  protocol.FlutterWidgetPropertyValue? _toValue(Expression valueExpression) {
     if (valueExpression is BooleanLiteral) {
       return protocol.FlutterWidgetPropertyValue(
         boolValue: valueExpression.value,
diff --git a/pkg/analysis_server/lib/src/utilities/flutter.dart b/pkg/analysis_server/lib/src/utilities/flutter.dart
index 234b645..adaef36 100644
--- a/pkg/analysis_server/lib/src/utilities/flutter.dart
+++ b/pkg/analysis_server/lib/src/utilities/flutter.dart
@@ -13,6 +13,7 @@
   static final Flutter instance = Flutter();
 
   static const _nameAlign = 'Align';
+  static const _nameBuilder = 'Builder';
   static const _nameCenter = 'Center';
   static const _nameContainer = 'Container';
   static const _namePadding = 'Padding';
@@ -403,8 +404,8 @@
   }
 
   /// Return `true` if the [node] is creation of `Align`.
-  bool isExactlyAlignCreation(InstanceCreationExpression? node) {
-    var type = node?.staticType;
+  bool isExactlyAlignCreation(InstanceCreationExpression node) {
+    var type = node.staticType;
     return isExactWidgetTypeAlign(type);
   }
 
@@ -415,8 +416,8 @@
   }
 
   /// Return `true` if the [node] is creation of `Padding`.
-  bool isExactlyPaddingCreation(InstanceCreationExpression? node) {
-    var type = node?.staticType;
+  bool isExactlyPaddingCreation(InstanceCreationExpression node) {
+    var type = node.staticType;
     return isExactWidgetTypePadding(type);
   }
 
@@ -443,6 +444,12 @@
         _isExactWidget(type.element, _nameAlign, _uriBasic);
   }
 
+  /// Return `true` if the given [type] is the Flutter class `StreamBuilder`.
+  bool isExactWidgetTypeBuilder(DartType type) {
+    return type is InterfaceType &&
+        _isExactWidget(type.element, _nameBuilder, _uriBasic);
+  }
+
   /// Return `true` if the given [type] is the Flutter class `Center`.
   bool isExactWidgetTypeCenter(DartType type) {
     return type is InterfaceType &&
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/basic.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/basic.dart
index 68ecbc6..3a72bfd 100644
--- a/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/basic.dart
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/basic.dart
@@ -157,3 +157,11 @@
     Widget child,
   });
 }
+
+typedef WidgetBuilder = Widget Function(BuildContext context);
+
+class Builder {
+  final WidgetBuilder builder;
+  const Builder(
+      {Key key, @required this.builder});
+}
diff --git a/pkg/analysis_server/test/services/completion/postfix/postfix_completion_test.dart b/pkg/analysis_server/test/services/completion/postfix/postfix_completion_test.dart
index a88af5a..e4912a8 100644
--- a/pkg/analysis_server/test/services/completion/postfix/postfix_completion_test.dart
+++ b/pkg/analysis_server/test/services/completion/postfix/postfix_completion_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/services/completion/postfix/postfix_completion.dart';
 import 'package:test/test.dart';
@@ -28,10 +26,10 @@
 }
 
 class PostfixCompletionTest extends AbstractSingleUnitTest {
-  PostfixCompletionProcessor processor;
-  SourceChange change;
+  late PostfixCompletionProcessor processor;
+  late SourceChange change;
 
-  void _assertHasChange(String message, String expectedCode, [Function cmp]) {
+  void _assertHasChange(String message, String expectedCode, [Function? cmp]) {
     if (change.message == message) {
       if (change.edits.isNotEmpty) {
         var resultCode =
@@ -39,12 +37,12 @@
         expect(resultCode, expectedCode.replaceAll('/*caret*/', ''));
         if (cmp != null) {
           int offset = cmp(resultCode);
-          expect(change.selection.offset, offset);
+          expect(change.selection!.offset, offset);
         }
       } else {
         if (cmp != null) {
           int offset = cmp(testCode);
-          expect(change.selection.offset, offset);
+          expect(change.selection!.offset, offset);
         }
       }
       return;
diff --git a/pkg/analysis_server/test/services/completion/postfix/test_all.dart b/pkg/analysis_server/test/services/completion/postfix/test_all.dart
index 958d06b..36604fe 100644
--- a/pkg/analysis_server/test/services/completion/postfix/test_all.dart
+++ b/pkg/analysis_server/test/services/completion/postfix/test_all.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:test_reflective_loader/test_reflective_loader.dart';
 
 import 'postfix_completion_test.dart' as postfix_completion_test;
diff --git a/pkg/analysis_server/test/services/completion/statement/test_all.dart b/pkg/analysis_server/test/services/completion/statement/test_all.dart
index 8edd7fe..6d4d86e 100644
--- a/pkg/analysis_server/test/services/completion/statement/test_all.dart
+++ b/pkg/analysis_server/test/services/completion/statement/test_all.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:test_reflective_loader/test_reflective_loader.dart';
 
 import 'statement_completion_test.dart' as statement_completion_test;
diff --git a/pkg/analysis_server/test/src/cider/completion_test.dart b/pkg/analysis_server/test/src/cider/completion_test.dart
index b64e585..5e15e31 100644
--- a/pkg/analysis_server/test/src/cider/completion_test.dart
+++ b/pkg/analysis_server/test/src/cider/completion_test.dart
@@ -2,15 +2,12 @@
 // 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/cider/completion.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/src/test_utilities/function_ast_visitor.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart'
     show CompletionSuggestion, CompletionSuggestionKind, ElementKind;
-import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -26,11 +23,11 @@
 class CiderCompletionComputerTest extends CiderServiceTest {
   final CiderCompletionCache _completionCache = CiderCompletionCache();
 
-  CiderCompletionComputer _computer;
-  void Function(ResolvedUnitResult) _testResolvedUnit;
+  late CiderCompletionComputer _computer;
+  void Function(ResolvedUnitResult)? _testResolvedUnit;
 
-  CiderCompletionResult _completionResult;
-  List<CompletionSuggestion> _suggestions;
+  late CiderCompletionResult _completionResult;
+  late List<CompletionSuggestion> _suggestions;
 
   Future<void> test_compute() async {
     await _compute(r'''
@@ -642,7 +639,7 @@
     );
   }
 
-  CompletionSuggestion _assertHasClass({@required String text}) {
+  CompletionSuggestion _assertHasClass({required String text}) {
     var matching = _matchingCompletions(
       text: text,
       elementKind: ElementKind.CLASS,
@@ -651,12 +648,12 @@
     return matching.single;
   }
 
-  void _assertHasCompletion({@required String text}) {
+  void _assertHasCompletion({required String text}) {
     var matching = _matchingCompletions(text: text);
     expect(matching, hasLength(1), reason: 'Expected exactly one completion');
   }
 
-  CompletionSuggestion _assertHasConstructor({@required String text}) {
+  CompletionSuggestion _assertHasConstructor({required String text}) {
     var matching = _matchingCompletions(
       text: text,
       elementKind: ElementKind.CONSTRUCTOR,
@@ -665,7 +662,7 @@
     return matching.single;
   }
 
-  CompletionSuggestion _assertHasEnumConstant({@required String text}) {
+  CompletionSuggestion _assertHasEnumConstant({required String text}) {
     var matching = _matchingCompletions(
       text: text,
       elementKind: ElementKind.ENUM_CONSTANT,
@@ -674,7 +671,7 @@
     return matching.single;
   }
 
-  CompletionSuggestion _assertHasFunction({@required String text}) {
+  CompletionSuggestion _assertHasFunction({required String text}) {
     var matching = _matchingCompletions(
       text: text,
       elementKind: ElementKind.FUNCTION,
@@ -683,7 +680,7 @@
     return matching.single;
   }
 
-  CompletionSuggestion _assertHasGetter({@required String text}) {
+  CompletionSuggestion _assertHasGetter({required String text}) {
     var matching = _matchingCompletions(
       text: text,
       elementKind: ElementKind.GETTER,
@@ -692,13 +689,13 @@
     return matching.single;
   }
 
-  CompletionSuggestion _assertHasKeyword({@required String text}) {
+  CompletionSuggestion _assertHasKeyword({required String text}) {
     var matching = _matchingKeywordCompletions(text: text);
     expect(matching, hasLength(1), reason: 'Expected exactly one completion');
     return matching.single;
   }
 
-  CompletionSuggestion _assertHasLocalVariable({@required String text}) {
+  CompletionSuggestion _assertHasLocalVariable({required String text}) {
     var matching = _matchingCompletions(
       text: text,
       elementKind: ElementKind.LOCAL_VARIABLE,
@@ -711,7 +708,7 @@
     return matching.single;
   }
 
-  CompletionSuggestion _assertHasMethod({@required String text}) {
+  CompletionSuggestion _assertHasMethod({required String text}) {
     var matching = _matchingCompletions(
       text: text,
       elementKind: ElementKind.METHOD,
@@ -720,7 +717,7 @@
     return matching.single;
   }
 
-  CompletionSuggestion _assertHasNamedArgument({@required String name}) {
+  CompletionSuggestion _assertHasNamedArgument({required String name}) {
     var matching = _matchingNamedArgumentSuggestions(name: name);
     expect(matching, hasLength(1), reason: 'Expected exactly one completion');
     return matching.single;
@@ -731,11 +728,11 @@
     for (var name in path) {
       var child = current.getChild(name);
       expect(child, isNotNull, reason: "No '$name' in $current");
-      current = child;
+      current = child!;
     }
   }
 
-  CompletionSuggestion _assertHasParameter({@required String text}) {
+  CompletionSuggestion _assertHasParameter({required String text}) {
     var matching = _matchingCompletions(
       text: text,
       elementKind: ElementKind.PARAMETER,
@@ -744,7 +741,7 @@
     return matching.single;
   }
 
-  CompletionSuggestion _assertHasTopLevelVariable({@required String text}) {
+  CompletionSuggestion _assertHasTopLevelVariable({required String text}) {
     var matching = _matchingCompletions(
       text: text,
       elementKind: ElementKind.TOP_LEVEL_VARIABLE,
@@ -757,7 +754,7 @@
     return matching.single;
   }
 
-  CompletionSuggestion _assertHasTypeParameter({@required String text}) {
+  CompletionSuggestion _assertHasTypeParameter({required String text}) {
     var matching = _matchingCompletions(
       text: text,
       elementKind: ElementKind.TYPE_PARAMETER,
@@ -766,7 +763,7 @@
     return matching.single;
   }
 
-  void _assertNoClass({@required String text}) {
+  void _assertNoClass({required String text}) {
     var matching = _matchingCompletions(
       text: text,
       elementKind: ElementKind.CLASS,
@@ -774,12 +771,12 @@
     expect(matching, isEmpty, reason: 'Expected zero completions');
   }
 
-  void _assertNoKeyword({@required String text}) {
+  void _assertNoKeyword({required String text}) {
     var matching = _matchingKeywordCompletions(text: text);
     expect(matching, isEmpty, reason: 'Expected zero completions');
   }
 
-  void _assertNoNamedArgument({@required String name}) {
+  void _assertNoNamedArgument({required String name}) {
     var matching = _matchingNamedArgumentSuggestions(name: name);
     expect(matching, isEmpty, reason: 'Expected zero completions');
   }
@@ -808,9 +805,9 @@
 
   /// Configure the [CiderCompletionComputer] to check that when resolving
   /// for completion we don't resolve unnecessary node.
-  void _configureToCheckNotResolved({Set<String> identifiers}) {
+  void _configureToCheckNotResolved({required Set<String> identifiers}) {
     _testResolvedUnit = (resolvedUnitResult) {
-      var unit = resolvedUnitResult.unit;
+      var unit = resolvedUnitResult.unit!;
       unit.accept(
         FunctionAstVisitor(
           simpleIdentifier: (node) {
@@ -829,15 +826,15 @@
   }
 
   List<CompletionSuggestion> _matchingCompletions({
-    @required String text,
-    ElementKind elementKind,
+    required String text,
+    ElementKind? elementKind,
   }) {
     return _suggestions.where((e) {
       if (e.completion != text) {
         return false;
       }
 
-      if (elementKind != null && e.element.kind != elementKind) {
+      if (elementKind != null && e.element!.kind != elementKind) {
         return false;
       }
 
@@ -846,7 +843,7 @@
   }
 
   List<CompletionSuggestion> _matchingKeywordCompletions({
-    @required String text,
+    required String text,
   }) {
     return _suggestions.where((e) {
       if (e.completion != text) {
@@ -857,7 +854,7 @@
   }
 
   List<CompletionSuggestion> _matchingNamedArgumentSuggestions({
-    @required String name,
+    required String name,
   }) {
     return _suggestions.where((e) {
       if (e.kind != CompletionSuggestionKind.NAMED_ARGUMENT) {
diff --git a/pkg/analysis_server/test/src/domains/execution/completion_test.dart b/pkg/analysis_server/test/src/domains/execution/completion_test.dart
index 92e3282..8553bad 100644
--- a/pkg/analysis_server/test/src/domains/execution/completion_test.dart
+++ b/pkg/analysis_server/test/src/domains/execution/completion_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/domains/execution/completion.dart';
 import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analyzer/file_system/overlay_file_system.dart';
@@ -20,11 +18,11 @@
 
 @reflectiveTest
 class RuntimeCompletionComputerTest extends AbstractContextTest {
-  OverlayResourceProvider overlayResourceProvider;
-  String contextFile;
-  int contextOffset;
+  late OverlayResourceProvider overlayResourceProvider;
+  late String contextFile;
+  late int contextOffset;
 
-  RuntimeCompletionResult result;
+  late RuntimeCompletionResult result;
 
   void addContextFile(String content) {
     contextFile = convertPath('/home/test/lib/context.dart');
@@ -42,7 +40,7 @@
     }
   }
 
-  void assertSuggested(String completion, {String returnType}) {
+  void assertSuggested(String completion, {String? returnType}) {
     var suggestion = getSuggest(completion);
     if (suggestion == null) {
       failedCompletion('expected $completion');
@@ -52,41 +50,28 @@
     }
   }
 
-  Future<void> computeCompletion(
-    String code, {
-    List<RuntimeCompletionVariable> variables,
-    List<RuntimeCompletionExpression> expressions,
-  }) async {
+  Future<void> computeCompletion(String code) async {
     var codeOffset = code.indexOf('^');
     expect(codeOffset, isNonNegative);
     code = code.replaceAll('^', '');
 
-    var computer = RuntimeCompletionComputer(
-        overlayResourceProvider,
-        driverFor(contextFile),
-        code,
-        codeOffset,
-        contextFile,
-        contextOffset,
-        variables,
-        expressions);
+    var computer = RuntimeCompletionComputer(overlayResourceProvider,
+        driverFor(contextFile), code, codeOffset, contextFile, contextOffset);
     result = await computer.compute();
   }
 
-  void failedCompletion(String message) {
+  Never failedCompletion(String message) {
     var sb = StringBuffer(message);
-    if (result.suggestions != null) {
-      sb.write('\n  found');
-      result.suggestions.toList()
-        ..sort((a, b) => a.completion.compareTo(b.completion))
-        ..forEach((suggestion) {
-          sb.write('\n    ${suggestion.completion} -> $suggestion');
-        });
-    }
+    sb.write('\n  found');
+    result.suggestions.toList()
+      ..sort((a, b) => a.completion.compareTo(b.completion))
+      ..forEach((suggestion) {
+        sb.write('\n    ${suggestion.completion} -> $suggestion');
+      });
     fail(sb.toString());
   }
 
-  CompletionSuggestion getSuggest(String completion) {
+  CompletionSuggestion? getSuggest(String completion) {
     expect(result.suggestions, isNotNull);
     for (var suggestion in result.suggestions) {
       if (suggestion.completion == completion) {
diff --git a/pkg/analysis_server/test/src/domains/execution/test_all.dart b/pkg/analysis_server/test/src/domains/execution/test_all.dart
index 88b3d88..1cbd9d3 100644
--- a/pkg/analysis_server/test/src/domains/execution/test_all.dart
+++ b/pkg/analysis_server/test/src/domains/execution/test_all.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:test_reflective_loader/test_reflective_loader.dart';
 
 import 'completion_test.dart' as completion_test;
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_builder_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_builder_test.dart
new file mode 100644
index 0000000..1c8ecdc
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_builder_test.dart
@@ -0,0 +1,140 @@
+// 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 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FlutterWrapBuilderTest);
+  });
+}
+
+@reflectiveTest
+class FlutterWrapBuilderTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.FLUTTER_WRAP_BUILDER;
+
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
+  Future<void> test_aroundBuilder() async {
+    await resolveTestCode('''
+import 'package:flutter/widgets.dart';
+
+main() {
+  /*caret*/Builder(
+    builder: (context) => null,
+  );
+}
+''');
+    await assertNoAssist();
+  }
+
+  Future<void> test_aroundNamedConstructor() async {
+    await resolveTestCode('''
+import 'package:flutter/widgets.dart';
+
+class MyWidget extends StatelessWidget {
+  MyWidget.named();
+
+  Widget build(BuildContext context) => null;
+}
+
+main() {
+  return MyWidget./*caret*/named();
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/widgets.dart';
+
+class MyWidget extends StatelessWidget {
+  MyWidget.named();
+
+  Widget build(BuildContext context) => null;
+}
+
+main() {
+  return Builder(
+    builder: (context) {
+      return MyWidget.named();
+    }
+  );
+}
+''');
+  }
+
+  Future<void> test_aroundText() async {
+    await resolveTestCode('''
+import 'package:flutter/widgets.dart';
+
+main() {
+  /*caret*/Text('a');
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/widgets.dart';
+
+main() {
+  Builder(
+    builder: (context) {
+      return Text('a');
+    }
+  );
+}
+''');
+  }
+
+  Future<void> test_assignment() async {
+    await resolveTestCode('''
+import 'package:flutter/widgets.dart';
+
+main() {
+  Widget w;
+  w = /*caret*/Container();
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/widgets.dart';
+
+main() {
+  Widget w;
+  w = Builder(
+    builder: (context) {
+      return Container();
+    }
+  );
+}
+''');
+  }
+
+  Future<void> test_expressionFunctionBody() async {
+    await resolveTestCode('''
+import 'package:flutter/widgets.dart';
+class FakeFlutter {
+  main() => /*caret*/Container();
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/widgets.dart';
+class FakeFlutter {
+  main() => Builder(
+    builder: (context) {
+      return Container();
+    }
+  );
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/test_all.dart b/pkg/analysis_server/test/src/services/correction/assist/test_all.dart
index fef565f5..f39e638 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/test_all.dart
@@ -54,6 +54,7 @@
 import 'flutter_surround_with_set_state_test.dart' as surround_with_set_state;
 import 'flutter_swap_with_child_test.dart' as flutter_swap_with_child;
 import 'flutter_swap_with_parent_test.dart' as flutter_swap_with_parent;
+import 'flutter_wrap_builder_test.dart' as flutter_wrap_builder;
 import 'flutter_wrap_center_test.dart' as flutter_wrap_center;
 import 'flutter_wrap_column_test.dart' as flutter_wrap_column;
 import 'flutter_wrap_container_test.dart' as flutter_wrap_container;
@@ -139,6 +140,7 @@
     flutter_wrap_padding.main();
     flutter_wrap_row.main();
     flutter_wrap_sized_box.main();
+    flutter_wrap_builder.main();
     flutter_wrap_stream_builder.main();
     import_add_show.main();
     inline_invocation.main();
diff --git a/pkg/analysis_server/test/src/services/flutter/container_properties_test.dart b/pkg/analysis_server/test/src/services/flutter/container_properties_test.dart
index 28903bc..ed3ff69 100644
--- a/pkg/analysis_server/test/src/services/flutter/container_properties_test.dart
+++ b/pkg/analysis_server/test/src/services/flutter/container_properties_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/protocol/protocol_generated.dart' as protocol;
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -33,7 +31,7 @@
 }
 ''');
     var property = await getWidgetProperty('Text(', 'Container');
-    var childrenNames = property.children.map((p) => p.name).toList();
+    var childrenNames = property.children!.map((p) => p.name).toList();
 
     expect(
       childrenNames,
@@ -63,7 +61,7 @@
 }
 ''');
     var property = await getWidgetProperty('Text(', 'Container');
-    var childrenNames = property.children.map((p) => p.name).toList();
+    var childrenNames = property.children!.map((p) => p.name).toList();
 
     expect(
       childrenNames,
diff --git a/pkg/analysis_server/test/src/services/flutter/test_all.dart b/pkg/analysis_server/test/src/services/flutter/test_all.dart
index e45512e..c35d704 100644
--- a/pkg/analysis_server/test/src/services/flutter/test_all.dart
+++ b/pkg/analysis_server/test/src/services/flutter/test_all.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:test_reflective_loader/test_reflective_loader.dart';
 
 import 'container_properties_test.dart' as container_properties;
diff --git a/pkg/analysis_server/test/src/services/flutter/widget_description.dart b/pkg/analysis_server/test/src/services/flutter/widget_description.dart
index c4042ef..8cdbfff 100644
--- a/pkg/analysis_server/test/src/services/flutter/widget_description.dart
+++ b/pkg/analysis_server/test/src/services/flutter/widget_description.dart
@@ -2,33 +2,29 @@
 // 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:convert';
 
 import 'package:analysis_server/protocol/protocol_generated.dart' as protocol;
 import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analysis_server/src/services/flutter/widget_descriptions.dart';
 import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../../../abstract_single_unit.dart';
 
-@reflectiveTest
 class WidgetDescriptionBase extends AbstractSingleUnitTest {
   final descriptions = WidgetDescriptions();
 
   void assertExpectedChange(SetPropertyValueResult result, String expected) {
     expect(result.errorCode, isNull);
 
-    var change = result.change;
+    var change = result.change!;
 
     expect(change.edits, hasLength(1));
     var fileEdit = change.edits[0];
     expect(fileEdit.file, testAnalysisResult.path);
 
     var actual = SourceEdit.applySequence(
-      testAnalysisResult.content,
+      testAnalysisResult.content!,
       fileEdit.edits,
     );
     expect(actual, expected);
@@ -52,9 +48,9 @@
     expect(actual, expected);
   }
 
-  Future<protocol.FlutterGetWidgetDescriptionResult> getDescription(
+  Future<protocol.FlutterGetWidgetDescriptionResult?> getDescription(
       String search) async {
-    var content = testAnalysisResult.content;
+    var content = testAnalysisResult.content!;
 
     var offset = content.indexOf(search);
     if (offset == -1) {
@@ -70,7 +66,7 @@
 
   protocol.FlutterWidgetProperty getNestedProperty(
       protocol.FlutterWidgetProperty parentProperty, String name) {
-    var nestedProperties = parentProperty.children;
+    var nestedProperties = parentProperty.children!;
     return nestedProperties.singleWhere(
       (property) => property.name == name,
     );
@@ -78,8 +74,7 @@
 
   Future<protocol.FlutterWidgetProperty> getWidgetProperty(
       String widgetSearch, String name) async {
-    var widgetDescription = await getDescription(widgetSearch);
-    expect(widgetDescription, isNotNull);
+    var widgetDescription = (await getDescription(widgetSearch))!;
 
     var properties = widgetDescription.properties;
     return properties.singleWhere(
@@ -101,10 +96,10 @@
     var id = json.remove('id') as int;
     expect(id, isNotNull);
 
-    Object editor = json['editor'];
+    var editor = json['editor'];
     if (editor is Map<String, dynamic>) {
       if (editor['kind'] == 'ENUM' || editor['kind'] == 'ENUM_LIKE') {
-        Object items = editor['enumItems'];
+        var items = editor['enumItems'];
         if (items is List<Map<String, dynamic>>) {
           for (var item in items) {
             item.remove('documentation');
@@ -113,15 +108,15 @@
       }
     }
 
-    Object value = json['value'];
+    var value = json['value'];
     if (value is Map<String, dynamic>) {
-      Object enumItem = value['enumValue'];
+      var enumItem = value['enumValue'];
       if (enumItem is Map<String, dynamic>) {
         enumItem.remove('documentation');
       }
     }
 
-    Object children = json['children'];
+    var children = json['children'];
     if (children is List<Map<String, dynamic>>) {
       children.forEach(_removeNotInterestingElements);
     }
diff --git a/pkg/analysis_server/test/src/services/flutter/widget_descriptions_test.dart b/pkg/analysis_server/test/src/services/flutter/widget_descriptions_test.dart
index 0b80cad..4592d32 100644
--- a/pkg/analysis_server/test/src/services/flutter/widget_descriptions_test.dart
+++ b/pkg/analysis_server/test/src/services/flutter/widget_descriptions_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/protocol/protocol_generated.dart' as protocol;
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analyzer/lib/src/dart/error/ffi_code.dart b/pkg/analyzer/lib/src/dart/error/ffi_code.dart
index dc8e106..c015c40 100644
--- a/pkg/analyzer/lib/src/dart/error/ffi_code.dart
+++ b/pkg/analyzer/lib/src/dart/error/ffi_code.dart
@@ -52,7 +52,8 @@
    */
   static const FfiCode FIELD_IN_STRUCT_WITH_INITIALIZER = FfiCode(
       name: 'FIELD_IN_STRUCT_WITH_INITIALIZER',
-      message: "Fields in subclasses of 'Struct' can't have initializers.",
+      message:
+          "Fields in subclasses of 'Struct' and 'Union' can't have initializers.",
       correction:
           "Try removing the initializer and marking the field as external.");
 
@@ -61,7 +62,8 @@
    */
   static const FfiCode FIELD_INITIALIZER_IN_STRUCT = FfiCode(
       name: 'FIELD_INITIALIZER_IN_STRUCT',
-      message: "Constructors in subclasses of 'Struct' can't have field "
+      message:
+          "Constructors in subclasses of 'Struct' and 'Union' can't have field "
           "initializers.",
       correction: "Try removing the field initializer and marking the field as"
           " external.");
@@ -72,7 +74,8 @@
    */
   static const FfiCode GENERIC_STRUCT_SUBCLASS = FfiCode(
       name: 'GENERIC_STRUCT_SUBCLASS',
-      message: "The class '{0}' can't extend 'Struct' because it is generic.",
+      message:
+          "The class '{0}' can't extend 'Struct' or 'Union' because it is generic.",
       correction: "Try removing the type parameters from '{0}'.");
 
   /**
@@ -95,10 +98,10 @@
       message:
           "Fields in struct classes can't have the type '{0}'. They can only "
           "be declared as 'int', 'double', 'Array', 'Pointer', or subtype of "
-          "'Struct'.",
+          "'Struct' or 'Union'.",
       correction:
           "Try using 'int', 'double', 'Array', 'Pointer', or subtype of "
-          "'Struct'.");
+          "'Struct' or 'Union'.");
 
   /**
    * No parameters.
@@ -202,9 +205,9 @@
       message:
           "Type arguments to '{0}' can't have the type '{1}'. They can only "
           "be declared as native integer, 'Float', 'Double', 'Pointer', or "
-          "subtype of Struct'.",
+          "subtype of 'Struct' or 'Union'.",
       correction: "Try using a native integer, 'Float', 'Double', 'Pointer', "
-          "or subtype of 'Struct'.");
+          "or subtype of 'Struct' or 'Union'.");
 
   /**
    * No parameters.
@@ -252,7 +255,7 @@
   static const FfiCode SUBTYPE_OF_FFI_CLASS_IN_EXTENDS = FfiCode(
     name: 'SUBTYPE_OF_FFI_CLASS',
     message: "The class '{0}' can't extend '{1}'.",
-    correction: "Try extending 'Struct'.",
+    correction: "Try extending 'Struct' or 'Union'.",
     uniqueName: 'SUBTYPE_OF_FFI_CLASS_IN_EXTENDS',
   );
 
@@ -264,7 +267,7 @@
   static const FfiCode SUBTYPE_OF_FFI_CLASS_IN_IMPLEMENTS = FfiCode(
     name: 'SUBTYPE_OF_FFI_CLASS',
     message: "The class '{0}' can't implement '{1}'.",
-    correction: "Try extending 'Struct'.",
+    correction: "Try extending 'Struct' or 'Union'.",
     uniqueName: 'SUBTYPE_OF_FFI_CLASS_IN_IMPLEMENTS',
   );
 
@@ -276,7 +279,7 @@
   static const FfiCode SUBTYPE_OF_FFI_CLASS_IN_WITH = FfiCode(
     name: 'SUBTYPE_OF_FFI_CLASS',
     message: "The class '{0}' can't mix in '{1}'.",
-    correction: "Try extending 'Struct'.",
+    correction: "Try extending 'Struct' or 'Union'.",
     uniqueName: 'SUBTYPE_OF_FFI_CLASS_IN_WITH',
   );
 
@@ -288,8 +291,8 @@
   static const FfiCode SUBTYPE_OF_STRUCT_CLASS_IN_EXTENDS = FfiCode(
     name: 'SUBTYPE_OF_STRUCT_CLASS',
     message: "The class '{0}' can't extend '{1}' because '{1}' is a subtype of "
-        "'Struct'.",
-    correction: "Try extending 'Struct' directly.",
+        "'Struct' or 'Union'.",
+    correction: "Try extending 'Struct' or 'Union' directly.",
     uniqueName: 'SUBTYPE_OF_STRUCT_CLASS_IN_EXTENDS',
   );
 
@@ -302,8 +305,8 @@
     name: 'SUBTYPE_OF_STRUCT_CLASS',
     message:
         "The class '{0}' can't implement '{1}' because '{1}' is a subtype of "
-        "'Struct'.",
-    correction: "Try extending 'Struct' directly.",
+        "'Struct' or 'Union'.",
+    correction: "Try extending 'Struct' or 'Union' directly.",
     uniqueName: 'SUBTYPE_OF_STRUCT_CLASS_IN_IMPLEMENTS',
   );
 
@@ -315,8 +318,8 @@
   static const FfiCode SUBTYPE_OF_STRUCT_CLASS_IN_WITH = FfiCode(
     name: 'SUBTYPE_OF_STRUCT_CLASS',
     message: "The class '{0}' can't mix in '{1}' because '{1}' is a subtype of "
-        "'Struct'.",
-    correction: "Try extending 'Struct' directly.",
+        "'Struct' or 'Union'.",
+    correction: "Try extending 'Struct' or 'Union' directly.",
     uniqueName: 'SUBTYPE_OF_STRUCT_CLASS_IN_WITH',
   );
 
diff --git a/pkg/analyzer/lib/src/generated/ffi_verifier.dart b/pkg/analyzer/lib/src/generated/ffi_verifier.dart
index 694d0ad..f330413 100644
--- a/pkg/analyzer/lib/src/generated/ffi_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/ffi_verifier.dart
@@ -41,6 +41,8 @@
 
   static const _structClassName = 'Struct';
 
+  static const _unionClassName = 'Union';
+
   /// The type system used to check types.
   final TypeSystemImpl typeSystem;
 
@@ -49,18 +51,18 @@
 
   /// A flag indicating whether we are currently visiting inside a subclass of
   /// `Struct`.
-  bool inStruct = false;
+  bool inCompound = false;
 
-  /// Subclass of `Struct` we are currently visiting, or `null`.
-  ClassDeclaration? struct;
+  /// Subclass of `Struct` or `Union` we are currently visiting, or `null`.
+  ClassDeclaration? compound;
 
   /// Initialize a newly created verifier.
   FfiVerifier(this.typeSystem, this._errorReporter);
 
   @override
   void visitClassDeclaration(ClassDeclaration node) {
-    inStruct = false;
-    struct = null;
+    inCompound = false;
+    compound = null;
     // Only the Allocator, Opaque and Struct class may be extended.
     var extendsClause = node.extendsClause;
     if (extendsClause != null) {
@@ -68,14 +70,16 @@
       final ffiClass = superclass.ffiClass;
       if (ffiClass != null) {
         final className = ffiClass.name;
-        if (className == _structClassName) {
-          inStruct = true;
-          struct = node;
+        if (className == _structClassName || className == _unionClassName) {
+          inCompound = true;
+          compound = node;
           if (node.declaredElement!.isEmptyStruct) {
             _errorReporter
                 .reportErrorForNode(FfiCode.EMPTY_STRUCT, node, [node.name]);
           }
-          _validatePackedAnnotation(node.metadata);
+          if (className == _structClassName) {
+            _validatePackedAnnotation(node.metadata);
+          }
         } else if (className != _allocatorClassName &&
             className != _opaqueClassName) {
           _errorReporter.reportErrorForNode(
@@ -83,7 +87,7 @@
               superclass.name,
               [node.name.name, superclass.name.name]);
         }
-      } else if (superclass.isStructSubtype) {
+      } else if (superclass.isCompoundSubtype) {
         _errorReporter.reportErrorForNode(
             FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_EXTENDS,
             superclass,
@@ -101,7 +105,7 @@
       if (typename.ffiClass != null) {
         _errorReporter.reportErrorForNode(
             subtypeOfFfiCode, typename, [node.name, typename.name]);
-      } else if (typename.isStructSubtype) {
+      } else if (typename.isCompoundSubtype) {
         _errorReporter.reportErrorForNode(
             subtypeOfStructCode, typename, [node.name, typename.name]);
       }
@@ -122,7 +126,7 @@
       }
     }
 
-    if (inStruct && node.declaredElement!.typeParameters.isNotEmpty) {
+    if (inCompound && node.declaredElement!.typeParameters.isNotEmpty) {
       _errorReporter.reportErrorForNode(
           FfiCode.GENERIC_STRUCT_SUBCLASS, node.name, [node.name]);
     }
@@ -131,7 +135,7 @@
 
   @override
   void visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
-    if (inStruct) {
+    if (inCompound) {
       _errorReporter.reportErrorForNode(
           FfiCode.FIELD_INITIALIZER_IN_STRUCT, node);
     }
@@ -140,8 +144,8 @@
 
   @override
   void visitFieldDeclaration(FieldDeclaration node) {
-    if (inStruct) {
-      _validateFieldsInStruct(node);
+    if (inCompound) {
+      _validateFieldsInCompound(node);
     }
     super.visitFieldDeclaration(node);
   }
@@ -248,7 +252,7 @@
       case _PrimitiveDartType.none:
         break;
     }
-    if (nativeType.isStructSubtype) {
+    if (nativeType.isCompoundSubtype) {
       return true;
     }
     if (nativeType.isPointer) {
@@ -311,10 +315,10 @@
         final nativeArgumentType = nativeType.typeArguments.single;
         return _isValidFfiNativeType(nativeArgumentType,
                 allowVoid: true, allowEmptyStruct: true, allowHandle: true) ||
-            nativeArgumentType.isStructSubtype ||
+            nativeArgumentType.isCompoundSubtype ||
             nativeArgumentType.isNativeType;
       }
-      if (nativeType.isStructSubtype) {
+      if (nativeType.isCompoundSubtype) {
         if (!allowEmptyStruct) {
           if (nativeType.element.isEmptyStruct) {
             // TODO(dartbug.com/36780): This results in an error message not
@@ -548,8 +552,8 @@
   }
 
   /// Validate that the fields declared by the given [node] meet the
-  /// requirements for fields within a struct class.
-  void _validateFieldsInStruct(FieldDeclaration node) {
+  /// requirements for fields within a struct or union class.
+  void _validateFieldsInCompound(FieldDeclaration node) {
     if (node.isStatic) {
       return;
     }
@@ -576,18 +580,18 @@
         final arrayDimensions = declaredType.arrayDimensions;
         _validateSizeOfAnnotation(fieldType, annotations, arrayDimensions);
         final arrayElement = declaredType.arrayElementType;
-        if (arrayElement.isStructSubtype) {
+        if (arrayElement.isCompoundSubtype) {
           final elementClass = (arrayElement as InterfaceType).element;
-          _validatePackingNesting(struct!.declaredElement!, elementClass,
+          _validatePackingNesting(compound!.declaredElement!, elementClass,
               errorNode: fieldType);
         }
-      } else if (declaredType.isStructSubtype) {
+      } else if (declaredType.isCompoundSubtype) {
         final clazz = (declaredType as InterfaceType).element;
         if (clazz.isEmptyStruct) {
           _errorReporter
               .reportErrorForNode(FfiCode.EMPTY_STRUCT, node, [clazz.name]);
         }
-        _validatePackingNesting(struct!.declaredElement!, clazz,
+        _validatePackingNesting(compound!.declaredElement!, clazz,
             errorNode: fieldType);
       } else {
         _errorReporter.reportErrorForNode(FfiCode.INVALID_FIELD_TYPE_IN_STRUCT,
@@ -632,7 +636,7 @@
     if ((FT as FunctionType).returnType.isVoid ||
         R.isPointer ||
         R.isHandle ||
-        R.isStructSubtype) {
+        R.isCompoundSubtype) {
       if (argCount != 1) {
         _errorReporter.reportErrorForNode(
             FfiCode.INVALID_EXCEPTION_VALUE, node.argumentList.arguments[1]);
@@ -975,7 +979,7 @@
         return false;
       } else if (declaredType.isPointer) {
         return false;
-      } else if (declaredType.isStructSubtype) {
+      } else if (declaredType.isCompoundSubtype) {
         return false;
       } else if (declaredType.isArray) {
         return false;
@@ -1087,22 +1091,25 @@
     return false;
   }
 
-  bool get isStruct {
+  bool get isCompound {
     final self = this;
     if (self is InterfaceType) {
       final element = self.element;
-      return element.name == FfiVerifier._structClassName && element.isFfiClass;
+      final name = element.name;
+      return (name == FfiVerifier._structClassName ||
+              name == FfiVerifier._unionClassName) &&
+          element.isFfiClass;
     }
     return false;
   }
 
   /// Returns `true` if this is a struct type, i.e. a subtype of `Struct`.
-  bool get isStructSubtype {
+  bool get isCompoundSubtype {
     final self = this;
     if (self is InterfaceType) {
       final superType = self.element.supertype;
       if (superType != null) {
-        return superType.isStruct;
+        return superType.isCompound;
       }
     }
     return false;
@@ -1115,17 +1122,17 @@
     return name.staticElement.ffiClass;
   }
 
-  /// Return `true` if this represents a subtype of `Struct`.
-  bool get isStructSubtype {
+  /// Return `true` if this represents a subtype of `Struct` or `Union`.
+  bool get isCompoundSubtype {
     var element = name.staticElement;
     if (element is ClassElement) {
-      bool isStruct(InterfaceType? type) {
-        return type != null && type.isStruct;
+      bool isCompound(InterfaceType? type) {
+        return type != null && type.isCompound;
       }
 
-      return isStruct(element.supertype) ||
-          element.interfaces.any(isStruct) ||
-          element.mixins.any(isStruct);
+      return isCompound(element.supertype) ||
+          element.interfaces.any(isCompound) ||
+          element.mixins.any(isCompound);
     }
     return false;
   }
diff --git a/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart b/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
index 8c3a9a5..d2def94 100644
--- a/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
+++ b/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
@@ -670,12 +670,18 @@
       [Object exceptionalReturn]) {}
 }
 
+final Pointer<Never> nullptr = Pointer.fromAddress(0);
+
 extension NativeFunctionPointer<NF extends Function>
     on Pointer<NativeFunction<NF>> {
   external DF asFunction<DF extends Function>();
 }
 
-class Struct extends NativeType {}
+class _Compound extends NativeType {}
+
+class Struct extends _Compound {}
+
+class Union extends _Compound {}
 
 class Packed {
   final int memberAlignment;
diff --git a/pkg/analyzer/test/src/diagnostics/field_in_struct_with_initializer_test.dart b/pkg/analyzer/test/src/diagnostics/field_in_struct_with_initializer_test.dart
index 5a32780..426ff14 100644
--- a/pkg/analyzer/test/src/diagnostics/field_in_struct_with_initializer_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/field_in_struct_with_initializer_test.dart
@@ -19,10 +19,21 @@
     await assertErrorsInCode(r'''
 import 'dart:ffi';
 class C extends Struct {
-  Pointer? p = null;
+  Pointer p = nullptr;
 }
 ''', [
-      error(FfiCode.FIELD_IN_STRUCT_WITH_INITIALIZER, 55, 1),
+      error(FfiCode.FIELD_IN_STRUCT_WITH_INITIALIZER, 54, 1),
+    ]);
+  }
+
+  test_instance_withInitializer2() async {
+    await assertErrorsInCode(r'''
+import 'dart:ffi';
+class C extends Union {
+  Pointer p = nullptr;
+}
+''', [
+      error(FfiCode.FIELD_IN_STRUCT_WITH_INITIALIZER, 53, 1),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/field_initializer_in_struct_test.dart b/pkg/analyzer/test/src/diagnostics/field_initializer_in_struct_test.dart
index e687a98..dd2978f 100644
--- a/pkg/analyzer/test/src/diagnostics/field_initializer_in_struct_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/field_initializer_in_struct_test.dart
@@ -19,11 +19,23 @@
     await assertErrorsInCode('''
 import 'dart:ffi';
 class C extends Struct {
-  @Int32() int? f;
+  @Int32() int f;
   C() : f = 0;
 }
 ''', [
-      error(FfiCode.FIELD_INITIALIZER_IN_STRUCT, 71, 5),
+      error(FfiCode.FIELD_INITIALIZER_IN_STRUCT, 70, 5),
+    ]);
+  }
+
+  test_fieldInitializer2() async {
+    await assertErrorsInCode('''
+import 'dart:ffi';
+class C extends Union {
+  @Int32() int f;
+  C() : f = 0;
+}
+''', [
+      error(FfiCode.FIELD_INITIALIZER_IN_STRUCT, 69, 5),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/generic_struct_subclass_test.dart b/pkg/analyzer/test/src/diagnostics/generic_struct_subclass_test.dart
index 710a812..68e338d 100644
--- a/pkg/analyzer/test/src/diagnostics/generic_struct_subclass_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/generic_struct_subclass_test.dart
@@ -19,7 +19,18 @@
     await assertErrorsInCode(r'''
 import 'dart:ffi';
 class S<T> extends Struct {
-  Pointer notEmpty;
+  external Pointer notEmpty;
+}
+''', [
+      error(FfiCode.GENERIC_STRUCT_SUBCLASS, 25, 1),
+    ]);
+  }
+
+  test_genericUnion() async {
+    await assertErrorsInCode(r'''
+import 'dart:ffi';
+class S<T> extends Union {
+  external Pointer notEmpty;
 }
 ''', [
       error(FfiCode.GENERIC_STRUCT_SUBCLASS, 25, 1),
@@ -30,7 +41,7 @@
     await assertNoErrorsInCode(r'''
 import 'dart:ffi';
 class S extends Struct {
-  Pointer notEmpty;
+  external Pointer notEmpty;
 }
 ''');
   }
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_field_type_in_struct_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_field_type_in_struct_test.dart
index 4cdedd7..4343b90 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_field_type_in_struct_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_field_type_in_struct_test.dart
@@ -20,12 +20,26 @@
     await assertErrorsInCode(r'''
 import 'dart:ffi';
 class C extends Struct {
-  String? str;
+  external String str;
 
-  Pointer? notEmpty;
+  external Pointer notEmpty;
 }
 ''', [
-      error(FfiCode.INVALID_FIELD_TYPE_IN_STRUCT, 46, 7),
+      error(FfiCode.INVALID_FIELD_TYPE_IN_STRUCT, 55, 6),
+    ]);
+  }
+
+  // TODO(https://dartbug.com/44677): Remove Pointer notEmpty field.
+  test_instance_invalid2() async {
+    await assertErrorsInCode(r'''
+import 'dart:ffi';
+class C extends Union {
+  external String str;
+
+  external Pointer notEmpty;
+}
+''', [
+      error(FfiCode.INVALID_FIELD_TYPE_IN_STRUCT, 54, 6),
     ]);
   }
 
@@ -33,19 +47,18 @@
     await assertNoErrorsInCode(r'''
 import 'dart:ffi';
 class C extends Struct {
-  Pointer? p;
+  external Pointer p;
 }
 ''');
   }
 
-  // TODO(https://dartbug.com/44677): Remove Pointer notEmpty field.
   test_static() async {
     await assertNoErrorsInCode(r'''
 import 'dart:ffi';
 class C extends Struct {
   static String? str;
 
-  Pointer? notEmpty;
+  external Pointer notEmpty;
 }
 ''');
   }
diff --git a/pkg/analyzer/test/src/diagnostics/non_sized_type_argument_test.dart b/pkg/analyzer/test/src/diagnostics/non_sized_type_argument_test.dart
index ec3f26d..c06084a 100644
--- a/pkg/analyzer/test/src/diagnostics/non_sized_type_argument_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_sized_type_argument_test.dart
@@ -15,27 +15,40 @@
 
 @reflectiveTest
 class NonSizedTypeArgument extends PubPackageResolutionTest {
-  test_one() async {
-    await assertNoErrorsInCode(r'''
-import 'dart:ffi';
-
-class C extends Struct {
-  @Array(8)
-  Array<Uint8> a0;
-}
-''');
-  }
-
-  test_two() async {
+  test_invalid_struct() async {
     await assertErrorsInCode(r'''
 import 'dart:ffi';
 
 class C extends Struct {
   @Array(8)
-  Array<Void> a0;
+  external Array<Void> a0;
 }
 ''', [
-      error(FfiCode.NON_SIZED_TYPE_ARGUMENT, 59, 11),
+      error(FfiCode.NON_SIZED_TYPE_ARGUMENT, 68, 11),
     ]);
   }
+
+  test_invalid_union() async {
+    await assertErrorsInCode(r'''
+import 'dart:ffi';
+
+class C extends Union {
+  @Array(8)
+  external Array<Void> a0;
+}
+''', [
+      error(FfiCode.NON_SIZED_TYPE_ARGUMENT, 67, 11),
+    ]);
+  }
+
+  test_valid() async {
+    await assertNoErrorsInCode(r'''
+import 'dart:ffi';
+
+class C extends Struct {
+  @Array(8)
+  external Array<Uint8> a0;
+}
+''');
+  }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/packed_annotation_test.dart b/pkg/analyzer/test/src/diagnostics/packed_annotation_test.dart
index 21a5454..88a67db 100644
--- a/pkg/analyzer/test/src/diagnostics/packed_annotation_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/packed_annotation_test.dart
@@ -16,7 +16,7 @@
 
 @reflectiveTest
 class PackedAnnotation extends PubPackageResolutionTest {
-  test_error_1() async {
+  test_error_double() async {
     await assertErrorsInCode(r'''
 import 'dart:ffi';
 
@@ -31,7 +31,7 @@
   }
 
   /// Regress test for http://dartbug.com/45498.
-  test_error_2() async {
+  test_error_missing() async {
     await assertErrorsInCode(r'''
 import 'dart:ffi';
 
@@ -45,7 +45,7 @@
     ]);
   }
 
-  test_no_error_1() async {
+  test_no_error_struct_no_annotation() async {
     await assertNoErrorsInCode(r'''
 import 'dart:ffi';
 
@@ -55,7 +55,7 @@
 ''');
   }
 
-  test_no_error_2() async {
+  test_no_error_struct_one_annotation() async {
     await assertNoErrorsInCode(r'''
 import 'dart:ffi';
 
@@ -65,4 +65,40 @@
 }
 ''');
   }
+
+  /// Doesn't do anything on Unions.
+  test_no_error_union_no_annotation() async {
+    await assertNoErrorsInCode(r'''
+import 'dart:ffi';
+
+class C extends Union {
+  external Pointer<Uint8> notEmpty;
+}
+''');
+  }
+
+  /// Doesn't do anything on Unions.
+  test_no_error_union_one_annotation() async {
+    await assertNoErrorsInCode(r'''
+import 'dart:ffi';
+
+@Packed(1)
+class C extends Union {
+  external Pointer<Uint8> notEmpty;
+}
+''');
+  }
+
+  /// Doesn't do anything on Unions.
+  test_no_error_union_two_annotations() async {
+    await assertNoErrorsInCode(r'''
+import 'dart:ffi';
+
+@Packed(1)
+@Packed(1)
+class C extends Union {
+  external Pointer<Uint8> notEmpty;
+}
+''');
+  }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/subtype_of_ffi_class_test.dart b/pkg/analyzer/test/src/diagnostics/subtype_of_ffi_class_test.dart
index 85129db..6e19801 100644
--- a/pkg/analyzer/test/src/diagnostics/subtype_of_ffi_class_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/subtype_of_ffi_class_test.dart
@@ -87,7 +87,7 @@
     await assertNoErrorsInCode(r'''
 import 'dart:ffi';
 class C extends Struct {
-  Pointer notEmpty;
+  external Pointer notEmpty;
 }
 ''');
   }
@@ -128,6 +128,15 @@
     ]);
   }
 
+  test_Union() async {
+    await assertNoErrorsInCode(r'''
+import 'dart:ffi';
+class C extends Union {
+  external Pointer notEmpty;
+}
+''');
+  }
+
   test_Void() async {
     await assertErrorsInCode(r'''
 import 'dart:ffi';
@@ -248,6 +257,15 @@
     ]);
   }
 
+  test_Union() async {
+    await assertErrorsInCode(r'''
+import 'dart:ffi';
+class C implements Union {}
+''', [
+      error(FfiCode.SUBTYPE_OF_FFI_CLASS_IN_IMPLEMENTS, 38, 5),
+    ]);
+  }
+
   test_Void() async {
     await assertErrorsInCode(r'''
 import 'dart:ffi';
@@ -390,6 +408,16 @@
     ]);
   }
 
+  test_Union() async {
+    await assertErrorsInCode(r'''
+import 'dart:ffi';
+class C with Union {}
+''', [
+      error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 32, 5),
+      error(FfiCode.SUBTYPE_OF_FFI_CLASS_IN_WITH, 32, 5),
+    ]);
+  }
+
   test_Void() async {
     await assertErrorsInCode(r'''
 import 'dart:ffi';
diff --git a/pkg/analyzer/test/src/diagnostics/subtype_of_struct_class_test.dart b/pkg/analyzer/test/src/diagnostics/subtype_of_struct_class_test.dart
index 00380d1..ab9e982 100644
--- a/pkg/analyzer/test/src/diagnostics/subtype_of_struct_class_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/subtype_of_struct_class_test.dart
@@ -18,22 +18,34 @@
 
 @reflectiveTest
 class SubtypeOfStructClassInExtendsTest extends PubPackageResolutionTest {
-  test_extends() async {
+  test_extends_struct() async {
     await assertErrorsInCode(r'''
 import 'dart:ffi';
 class S extends Struct {
-  Pointer notEmpty;
+  external Pointer notEmpty;
 }
 class C extends S {}
 ''', [
-      error(FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_EXTENDS, 82, 1),
+      error(FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_EXTENDS, 91, 1),
+    ]);
+  }
+
+  test_extends_union() async {
+    await assertErrorsInCode(r'''
+import 'dart:ffi';
+class S extends Union {
+  external Pointer notEmpty;
+}
+class C extends S {}
+''', [
+      error(FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_EXTENDS, 90, 1),
     ]);
   }
 }
 
 @reflectiveTest
 class SubtypeOfStructClassInImplementsTest extends PubPackageResolutionTest {
-  test_implements() async {
+  test_implements_struct() async {
     await assertErrorsInCode(r'''
 import 'dart:ffi';
 class S extends Struct {}
@@ -43,11 +55,22 @@
       error(FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_IMPLEMENTS, 64, 1),
     ]);
   }
+
+  test_implements_union() async {
+    await assertErrorsInCode(r'''
+import 'dart:ffi';
+class S extends Union {}
+class C implements S {}
+''', [
+      error(FfiCode.EMPTY_STRUCT, 19, 24),
+      error(FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_IMPLEMENTS, 63, 1),
+    ]);
+  }
 }
 
 @reflectiveTest
 class SubtypeOfStructClassInWithTest extends PubPackageResolutionTest {
-  test_with() async {
+  test_with_struct() async {
     await assertErrorsInCode(r'''
 import 'dart:ffi';
 class S extends Struct {}
@@ -58,4 +81,16 @@
       error(FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_WITH, 58, 1),
     ]);
   }
+
+  test_with_union() async {
+    await assertErrorsInCode(r'''
+import 'dart:ffi';
+class S extends Union {}
+class C with S {}
+''', [
+      error(FfiCode.EMPTY_STRUCT, 19, 24),
+      error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 57, 1),
+      error(FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_WITH, 57, 1),
+    ]);
+  }
 }
diff --git a/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart b/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart
index 1b544eb..76c675b 100644
--- a/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart
@@ -142,6 +142,7 @@
       Member referenceFrom,
       [String nativeMethodName])
       : _constructor = new Constructor(null,
+            name: new Name(name, compilationUnit.library),
             fileUri: compilationUnit.fileUri,
             reference: referenceFrom?.reference)
           ..startFileOffset = startCharOffset
@@ -196,9 +197,11 @@
     f(member, BuiltMemberKind.Constructor);
   }
 
+  bool _hasBeenBuilt = false;
+
   @override
   Constructor build(SourceLibraryBuilder libraryBuilder) {
-    if (_constructor.name == null) {
+    if (!_hasBeenBuilt) {
       _constructor.function = buildFunction(libraryBuilder);
       _constructor.function.parent = _constructor;
       _constructor.function.fileOffset = charOpenParenOffset;
@@ -206,7 +209,8 @@
       _constructor.function.typeParameters = const <TypeParameter>[];
       _constructor.isConst = isConst;
       _constructor.isExternal = isExternal;
-      _constructor.name = new Name(name, libraryBuilder.library);
+      updatePrivateMemberName(_constructor, libraryBuilder);
+      _hasBeenBuilt = true;
     }
     if (formals != null) {
       bool needsInference = false;
diff --git a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
index ce76627..4742d6f 100644
--- a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
@@ -172,6 +172,33 @@
     ///   static const List<E> values = const <E>[id0, ..., idn-1];
     ///   String toString() => _name;
     /// }
+
+    FieldNameScheme instanceFieldNameScheme = new FieldNameScheme(
+        isInstanceMember: true,
+        className: name,
+        isExtensionMember: false,
+        extensionName: null,
+        libraryReference: referencesFrom != null
+            ? referencesFromIndexed.library.reference
+            : parent.library.reference);
+
+    FieldNameScheme staticFieldNameScheme = new FieldNameScheme(
+        isInstanceMember: false,
+        className: name,
+        isExtensionMember: false,
+        extensionName: null,
+        libraryReference: referencesFrom != null
+            ? referencesFromIndexed.library.reference
+            : parent.library.reference);
+
+    ProcedureNameScheme procedureNameScheme = new ProcedureNameScheme(
+        isStatic: false,
+        isExtensionMember: false,
+        extensionName: null,
+        libraryReference: referencesFrom != null
+            ? referencesFromIndexed.library.reference
+            : parent.library.reference);
+
     Constructor constructorReference;
     Reference toStringReference;
     Reference indexGetterReference;
@@ -210,6 +237,8 @@
         parent,
         charOffset,
         charOffset,
+        instanceFieldNameScheme,
+        isInstanceMember: true,
         fieldGetterReference: indexGetterReference,
         fieldSetterReference: indexSetterReference);
     members["_name"] = new SourceFieldBuilder(
@@ -221,6 +250,8 @@
         parent,
         charOffset,
         charOffset,
+        instanceFieldNameScheme,
+        isInstanceMember: true,
         fieldGetterReference: _nameGetterReference,
         fieldSetterReference: _nameSetterReference);
     ConstructorBuilder constructorBuilder = new ConstructorBuilderImpl(
@@ -251,6 +282,8 @@
         parent,
         charOffset,
         charOffset,
+        staticFieldNameScheme,
+        isInstanceMember: false,
         fieldGetterReference: valuesGetterReference,
         fieldSetterReference: valuesSetterReference);
     members["values"] = valuesBuilder;
@@ -263,8 +296,8 @@
         0,
         stringType,
         "toString",
-        null,
-        null,
+        /* typeVariables = */ null,
+        /* formals = */ null,
         ProcedureKind.Method,
         parent,
         charOffset,
@@ -272,9 +305,11 @@
         charOffset,
         charEndOffset,
         toStringReference,
-        null,
+        /* tearOffReference = */ null,
         AsyncMarker.Sync,
-        /* isExtensionInstanceMember = */ false);
+        procedureNameScheme,
+        isExtensionMember: false,
+        isInstanceMember: true);
     members["toString"] = toStringBuilder;
     String className = name;
     if (enumConstantInfos != null) {
@@ -329,6 +364,8 @@
             parent,
             enumConstantInfo.charOffset,
             enumConstantInfo.charOffset,
+            staticFieldNameScheme,
+            isInstanceMember: false,
             fieldGetterReference: getterReference,
             fieldSetterReference: setterReference);
         members[name] = fieldBuilder..next = existing;
diff --git a/pkg/front_end/lib/src/fasta/builder/field_builder.dart b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
index fd05495..f5974fb 100644
--- a/pkg/front_end/lib/src/fasta/builder/field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
@@ -38,7 +38,6 @@
 import '../util/helpers.dart' show DelayedActionPerformer;
 
 import 'class_builder.dart';
-import 'extension_builder.dart';
 import 'library_builder.dart';
 import 'member_builder.dart';
 import 'metadata_builder.dart';
@@ -121,25 +120,36 @@
       SourceLibraryBuilder libraryBuilder,
       int charOffset,
       int charEndOffset,
-      {Reference fieldGetterReference,
+      FieldNameScheme fieldNameScheme,
+      {bool isInstanceMember,
+      Reference fieldGetterReference,
       Reference fieldSetterReference,
       Reference lateIsSetGetterReference,
       Reference lateIsSetSetterReference,
       Reference lateGetterReference,
       Reference lateSetterReference})
       : super(libraryBuilder, charOffset) {
+    assert(isInstanceMember != null);
+
     Uri fileUri = libraryBuilder?.fileUri;
     // If in mixed mode, late lowerings cannot use `null` as a sentinel on
     // non-nullable fields since they can be assigned from legacy code.
     late_lowering.IsSetStrategy isSetStrategy =
         late_lowering.computeIsSetStrategy(libraryBuilder);
+
     if (isAbstract || isExternal) {
       assert(lateIsSetGetterReference == null);
       assert(lateIsSetSetterReference == null);
       assert(lateGetterReference == null);
       assert(lateSetterReference == null);
-      _fieldEncoding = new AbstractOrExternalFieldEncoding(fileUri, charOffset,
-          charEndOffset, fieldGetterReference, fieldSetterReference,
+      _fieldEncoding = new AbstractOrExternalFieldEncoding(
+          name,
+          fieldNameScheme,
+          fileUri,
+          charOffset,
+          charEndOffset,
+          fieldGetterReference,
+          fieldSetterReference,
           isAbstract: isAbstract,
           isExternal: isExternal,
           isFinal: isFinal,
@@ -149,11 +159,12 @@
         libraryBuilder.loader.target.backendTarget.isLateFieldLoweringEnabled(
             hasInitializer: hasInitializer,
             isFinal: isFinal,
-            isStatic: (isStatic || isTopLevel))) {
+            isStatic: !isInstanceMember)) {
       if (hasInitializer) {
         if (isFinal) {
           _fieldEncoding = new LateFinalFieldWithInitializerEncoding(
               name,
+              fieldNameScheme,
               fileUri,
               charOffset,
               charEndOffset,
@@ -168,6 +179,7 @@
         } else {
           _fieldEncoding = new LateFieldWithInitializerEncoding(
               name,
+              fieldNameScheme,
               fileUri,
               charOffset,
               charEndOffset,
@@ -184,6 +196,7 @@
         if (isFinal) {
           _fieldEncoding = new LateFinalFieldWithoutInitializerEncoding(
               name,
+              fieldNameScheme,
               fileUri,
               charOffset,
               charEndOffset,
@@ -198,6 +211,7 @@
         } else {
           _fieldEncoding = new LateFieldWithoutInitializerEncoding(
               name,
+              fieldNameScheme,
               fileUri,
               charOffset,
               charEndOffset,
@@ -213,12 +227,13 @@
       }
     } else if (libraryBuilder.isNonNullableByDefault &&
         libraryBuilder.loader.target.backendTarget.useStaticFieldLowering &&
-        (isStatic || isTopLevel) &&
+        !isInstanceMember &&
         !isConst &&
         hasInitializer) {
       if (isFinal) {
         _fieldEncoding = new LateFinalFieldWithInitializerEncoding(
             name,
+            fieldNameScheme,
             fileUri,
             charOffset,
             charEndOffset,
@@ -233,6 +248,7 @@
       } else {
         _fieldEncoding = new LateFieldWithInitializerEncoding(
             name,
+            fieldNameScheme,
             fileUri,
             charOffset,
             charEndOffset,
@@ -251,7 +267,7 @@
       assert(lateGetterReference == null);
       assert(lateSetterReference == null);
       _fieldEncoding = new RegularFieldEncoding(
-          fileUri, charOffset, charEndOffset,
+          name, fieldNameScheme, fileUri, charOffset, charEndOffset,
           isFinal: isFinal,
           isConst: isConst,
           isLate: isLate,
@@ -551,6 +567,36 @@
 
 enum FieldNameType { Field, Getter, Setter, IsSetField }
 
+class FieldNameScheme {
+  final bool isInstanceMember;
+  final String className;
+  final bool isExtensionMember;
+  final String extensionName;
+  final Reference libraryReference;
+
+  FieldNameScheme(
+      {this.isInstanceMember,
+      this.className,
+      this.isExtensionMember,
+      this.extensionName,
+      this.libraryReference})
+      : assert(isInstanceMember != null),
+        assert(isExtensionMember != null),
+        assert(!isExtensionMember || extensionName != null),
+        assert(libraryReference != null);
+
+  Name getName(FieldNameType type, String name, {bool isSynthesized}) {
+    assert(isSynthesized != null);
+    String text = SourceFieldBuilder.createFieldName(type, name,
+        isInstanceMember: isInstanceMember,
+        className: className,
+        isExtensionMethod: isExtensionMember,
+        extensionName: extensionName,
+        isSynthesized: isSynthesized);
+    return new Name.byReference(text, libraryReference);
+  }
+}
+
 /// Strategy pattern for creating different encodings of a declared field.
 ///
 /// This is used to provide lowerings for late fields using synthesized getters
@@ -621,7 +667,8 @@
 class RegularFieldEncoding implements FieldEncoding {
   Field _field;
 
-  RegularFieldEncoding(Uri fileUri, int charOffset, int charEndOffset,
+  RegularFieldEncoding(String name, FieldNameScheme fieldNameScheme,
+      Uri fileUri, int charOffset, int charEndOffset,
       {bool isFinal,
       bool isConst,
       bool isLate,
@@ -636,13 +683,17 @@
     bool isImmutable =
         isLate ? (isFinal && hasInitializer) : (isFinal || isConst);
     _field = isImmutable
-        ? new Field.immutable(null,
+        ? new Field.immutable(
+            fieldNameScheme.getName(FieldNameType.Field, name,
+                isSynthesized: false),
             isFinal: isFinal,
             isConst: isConst,
             isLate: isLate,
             fileUri: fileUri,
             getterReference: getterReference)
-        : new Field.mutable(null,
+        : new Field.mutable(
+            fieldNameScheme.getName(FieldNameType.Field, name,
+                isSynthesized: false),
             isFinal: isFinal,
             isLate: isLate,
             fileUri: fileUri,
@@ -687,30 +738,19 @@
   void build(
       SourceLibraryBuilder libraryBuilder, SourceFieldBuilder fieldBuilder) {
     _field..isCovariant = fieldBuilder.isCovariant;
-    String fieldName;
     if (fieldBuilder.isExtensionMember) {
-      ExtensionBuilder extension = fieldBuilder.parent;
-      fieldName = SourceFieldBuilder.createFieldName(
-          FieldNameType.Field, fieldBuilder.name,
-          isExtensionMethod: true, extensionName: extension.name);
       _field
         ..isStatic = true
         ..isExtensionMember = true;
     } else {
       bool isInstanceMember =
           !fieldBuilder.isStatic && !fieldBuilder.isTopLevel;
-      String className =
-          isInstanceMember ? fieldBuilder.classBuilder.name : null;
-      fieldName = SourceFieldBuilder.createFieldName(
-          FieldNameType.Field, fieldBuilder.name,
-          isInstanceMember: isInstanceMember, className: className);
       _field
         ..isStatic = !isInstanceMember
         ..isExtensionMember = false;
     }
-    // TODO(johnniwinther): How can the name already have been computed?
-    _field.name ??= new Name(fieldName, libraryBuilder.library);
     _field.isLate = fieldBuilder.isLate;
+    updatePrivateMemberName(_field, libraryBuilder);
   }
 
   @override
@@ -835,6 +875,7 @@
 
   AbstractLateFieldEncoding(
       this.name,
+      FieldNameScheme fieldNameScheme,
       Uri fileUri,
       int charOffset,
       int charEndOffset,
@@ -851,7 +892,8 @@
         _isSetStrategy = isSetStrategy,
         _forceIncludeIsSetField =
             isSetStrategy == late_lowering.IsSetStrategy.forceUseIsSetField {
-    _field = new Field.mutable(null,
+    _field = new Field.mutable(
+        fieldNameScheme.getName(FieldNameType.Field, name, isSynthesized: true),
         fileUri: fileUri,
         getterReference: fieldGetterReference,
         setterReference: fieldSetterReference)
@@ -866,7 +908,9 @@
         break;
       case late_lowering.IsSetStrategy.forceUseIsSetField:
       case late_lowering.IsSetStrategy.useIsSetFieldOrNull:
-        _lateIsSetField = new Field.mutable(null,
+        _lateIsSetField = new Field.mutable(
+            fieldNameScheme.getName(FieldNameType.IsSetField, name,
+                isSynthesized: true),
             fileUri: fileUri,
             getterReference: lateIsSetGetterReference,
             setterReference: lateIsSetSetterReference)
@@ -877,7 +921,8 @@
         break;
     }
     _lateGetter = new Procedure(
-        null,
+        fieldNameScheme.getName(FieldNameType.Getter, name,
+            isSynthesized: true),
         ProcedureKind.Getter,
         new FunctionNode(null)
           ..fileOffset = charOffset
@@ -887,7 +932,12 @@
       ..fileOffset = charOffset
       ..fileEndOffset = charEndOffset
       ..isNonNullableByDefault = true;
-    _lateSetter = _createSetter(name, fileUri, charOffset, lateSetterReference,
+    _lateSetter = _createSetter(
+        fieldNameScheme.getName(FieldNameType.Setter, name,
+            isSynthesized: true),
+        fileUri,
+        charOffset,
+        lateSetterReference,
         isCovariant: isCovariant);
   }
 
@@ -997,14 +1047,14 @@
       Expression initializer, bool useNewMethodInvocationEncoding);
 
   Procedure _createSetter(
-      String name, Uri fileUri, int charOffset, Reference reference,
+      Name name, Uri fileUri, int charOffset, Reference reference,
       {bool isCovariant}) {
     assert(isCovariant != null);
     VariableDeclaration parameter = new VariableDeclaration(null)
       ..isCovariant = isCovariant
       ..fileOffset = fileOffset;
     return new Procedure(
-        null,
+        name,
         ProcedureKind.Setter,
         new FunctionNode(null,
             positionalParameters: [parameter], returnType: const VoidType())
@@ -1081,12 +1131,8 @@
   void build(
       SourceLibraryBuilder libraryBuilder, SourceFieldBuilder fieldBuilder) {
     bool isInstanceMember;
-    String className;
     bool isExtensionMember = fieldBuilder.isExtensionMember;
-    String extensionName;
     if (isExtensionMember) {
-      ExtensionBuilder extension = fieldBuilder.parent;
-      extensionName = extension.name;
       _field
         ..isStatic = true
         ..isExtensionMember = isExtensionMember;
@@ -1096,59 +1142,24 @@
       _field
         ..isStatic = !isInstanceMember
         ..isExtensionMember = false;
-      if (isInstanceMember) {
-        className = fieldBuilder.classBuilder.name;
-      }
     }
-    _field.name ??= new Name(
-        SourceFieldBuilder.createFieldName(
-            FieldNameType.Field, fieldBuilder.name,
-            isInstanceMember: isInstanceMember,
-            className: className,
-            isExtensionMethod: isExtensionMember,
-            extensionName: extensionName,
-            isSynthesized: true),
-        libraryBuilder.library);
+    updatePrivateMemberName(_field, libraryBuilder);
     if (_lateIsSetField != null) {
       _lateIsSetField
-        ..name = new Name(
-            SourceFieldBuilder.createFieldName(
-                FieldNameType.IsSetField, fieldBuilder.name,
-                isInstanceMember: isInstanceMember,
-                className: className,
-                isExtensionMethod: isExtensionMember,
-                extensionName: extensionName,
-                isSynthesized: true),
-            libraryBuilder.library)
         ..isStatic = !isInstanceMember
         ..isStatic = _field.isStatic
         ..isExtensionMember = isExtensionMember;
+      updatePrivateMemberName(_lateIsSetField, libraryBuilder);
     }
     _lateGetter
-      ..name = new Name(
-          SourceFieldBuilder.createFieldName(
-              FieldNameType.Getter, fieldBuilder.name,
-              isInstanceMember: isInstanceMember,
-              className: className,
-              isExtensionMethod: isExtensionMember,
-              extensionName: extensionName,
-              isSynthesized: true),
-          libraryBuilder.library)
       ..isStatic = !isInstanceMember
       ..isExtensionMember = isExtensionMember;
+    updatePrivateMemberName(_lateGetter, libraryBuilder);
     if (_lateSetter != null) {
       _lateSetter
-        ..name = new Name(
-            SourceFieldBuilder.createFieldName(
-                FieldNameType.Setter, fieldBuilder.name,
-                isInstanceMember: isInstanceMember,
-                className: className,
-                isExtensionMethod: isExtensionMember,
-                extensionName: extensionName,
-                isSynthesized: true),
-            libraryBuilder.library)
         ..isStatic = !isInstanceMember
         ..isExtensionMember = isExtensionMember;
+      updatePrivateMemberName(_lateSetter, libraryBuilder);
     }
   }
 
@@ -1248,6 +1259,7 @@
     with NonFinalLate, LateWithoutInitializer {
   LateFieldWithoutInitializerEncoding(
       String name,
+      FieldNameScheme fieldNameScheme,
       Uri fileUri,
       int charOffset,
       int charEndOffset,
@@ -1261,6 +1273,7 @@
       late_lowering.IsSetStrategy isSetStrategy)
       : super(
             name,
+            fieldNameScheme,
             fileUri,
             charOffset,
             charEndOffset,
@@ -1278,6 +1291,7 @@
     with NonFinalLate {
   LateFieldWithInitializerEncoding(
       String name,
+      FieldNameScheme fieldNameScheme,
       Uri fileUri,
       int charOffset,
       int charEndOffset,
@@ -1291,6 +1305,7 @@
       late_lowering.IsSetStrategy isSetStrategy)
       : super(
             name,
+            fieldNameScheme,
             fileUri,
             charOffset,
             charEndOffset,
@@ -1323,6 +1338,7 @@
     with LateWithoutInitializer {
   LateFinalFieldWithoutInitializerEncoding(
       String name,
+      FieldNameScheme fieldNameScheme,
       Uri fileUri,
       int charOffset,
       int charEndOffset,
@@ -1336,6 +1352,7 @@
       late_lowering.IsSetStrategy isSetStrategy)
       : super(
             name,
+            fieldNameScheme,
             fileUri,
             charOffset,
             charEndOffset,
@@ -1369,6 +1386,7 @@
 class LateFinalFieldWithInitializerEncoding extends AbstractLateFieldEncoding {
   LateFinalFieldWithInitializerEncoding(
       String name,
+      FieldNameScheme fieldNameScheme,
       Uri fileUri,
       int charOffset,
       int charEndOffset,
@@ -1382,6 +1400,7 @@
       late_lowering.IsSetStrategy isSetStrategy)
       : super(
             name,
+            fieldNameScheme,
             fileUri,
             charOffset,
             charEndOffset,
@@ -1411,7 +1430,7 @@
 
   @override
   Procedure _createSetter(
-          String name, Uri fileUri, int charOffset, Reference reference,
+          Name name, Uri fileUri, int charOffset, Reference reference,
           {bool isCovariant}) =>
       null;
 
@@ -1570,8 +1589,14 @@
   Procedure _getter;
   Procedure _setter;
 
-  AbstractOrExternalFieldEncoding(Uri fileUri, int charOffset,
-      int charEndOffset, Reference getterReference, Reference setterReference,
+  AbstractOrExternalFieldEncoding(
+      String name,
+      FieldNameScheme fieldNameScheme,
+      Uri fileUri,
+      int charOffset,
+      int charEndOffset,
+      Reference getterReference,
+      Reference setterReference,
       {this.isAbstract,
       this.isExternal,
       bool isFinal,
@@ -1582,8 +1607,13 @@
         assert(isFinal != null),
         assert(isCovariant != null),
         assert(isNonNullableByDefault != null) {
-    _getter = new Procedure(null, ProcedureKind.Getter, new FunctionNode(null),
-        fileUri: fileUri, reference: getterReference)
+    _getter = new Procedure(
+        fieldNameScheme.getName(FieldNameType.Getter, name,
+            isSynthesized: true),
+        ProcedureKind.Getter,
+        new FunctionNode(null),
+        fileUri: fileUri,
+        reference: getterReference)
       ..fileOffset = charOffset
       ..fileEndOffset = charEndOffset
       ..isNonNullableByDefault = isNonNullableByDefault;
@@ -1593,7 +1623,8 @@
             ..isCovariant = isCovariant
             ..fileOffset = charOffset;
       _setter = new Procedure(
-          null,
+          fieldNameScheme.getName(FieldNameType.Setter, name,
+              isSynthesized: true),
           ProcedureKind.Setter,
           new FunctionNode(null,
               positionalParameters: [parameter], returnType: const VoidType())
@@ -1636,51 +1667,25 @@
   @override
   void build(
       SourceLibraryBuilder libraryBuilder, SourceFieldBuilder fieldBuilder) {
-    bool isExtensionMember = false;
-    String extensionName;
-    bool isInstanceMember = false;
-    String className;
-    if (fieldBuilder.isExtensionMember) {
-      isExtensionMember = true;
-      ExtensionBuilder extension = fieldBuilder.parent;
-      extensionName = extension.name;
-    } else {
-      isInstanceMember = !fieldBuilder.isStatic && !fieldBuilder.isTopLevel;
-      className = isInstanceMember ? fieldBuilder.classBuilder.name : null;
-    }
+    bool isExtensionMember = fieldBuilder.isExtensionMember;
+    bool isInstanceMember = !fieldBuilder.isExtensionMember &&
+        !fieldBuilder.isStatic &&
+        !fieldBuilder.isTopLevel;
     _getter..isConst = fieldBuilder.isConst;
-    String getterName = SourceFieldBuilder.createFieldName(
-        FieldNameType.Getter, fieldBuilder.name,
-        isInstanceMember: isInstanceMember,
-        className: className,
-        isExtensionMethod: isExtensionMember,
-        extensionName: extensionName,
-        isSynthesized: true);
     _getter
       ..isStatic = !isInstanceMember
       ..isExtensionMember = isExtensionMember
       ..isAbstract = isAbstract && !isExternal
       ..isExternal = isExternal;
-    // TODO(johnniwinther): How can the name already have been computed?
-    _getter.name ??= new Name(getterName, libraryBuilder.library);
+    updatePrivateMemberName(_getter, libraryBuilder);
 
     if (_setter != null) {
-      String setterName = SourceFieldBuilder.createFieldName(
-        FieldNameType.Setter,
-        fieldBuilder.name,
-        isInstanceMember: isInstanceMember,
-        className: className,
-        isExtensionMethod: isExtensionMember,
-        extensionName: extensionName,
-        isSynthesized: true,
-      );
       _setter
         ..isStatic = !isInstanceMember
         ..isExtensionMember = isExtensionMember
         ..isAbstract = isAbstract && !isExternal
         ..isExternal = isExternal;
-      // TODO(johnniwinther): How can the name already have been computed?
-      _setter?.name ??= new Name(setterName, libraryBuilder.library);
+      updatePrivateMemberName(_setter, libraryBuilder);
     }
   }
 
diff --git a/pkg/front_end/lib/src/fasta/builder/member_builder.dart b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
index 070d275..54f26f8 100644
--- a/pkg/front_end/lib/src/fasta/builder/member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
@@ -297,3 +297,13 @@
   @override
   String toString() => '$runtimeType($fullName,forSetter=${forSetter})';
 }
+
+/// If the name of [member] is private, update it to use the library reference
+/// of [libraryBuilder].
+// TODO(johnniwinther): Avoid having to update private names by setting
+// the correct library reference when creating parts.
+void updatePrivateMemberName(Member member, LibraryBuilder libraryBuilder) {
+  if (member.name.isPrivate) {
+    member.name = new Name(member.name.text, libraryBuilder.library);
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
index ecc024e..498826b 100644
--- a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
@@ -65,7 +65,7 @@
 
 abstract class ProcedureBuilderImpl extends FunctionBuilderImpl
     implements ProcedureBuilder {
-  final Procedure _procedure;
+  Procedure _procedure;
 
   @override
   final int charOpenParenOffset;
@@ -92,23 +92,29 @@
       List<TypeVariableBuilder> typeVariables,
       List<FormalParameterBuilder> formals,
       this.kind,
-      SourceLibraryBuilder compilationUnit,
+      SourceLibraryBuilder libraryBuilder,
       int startCharOffset,
       int charOffset,
       this.charOpenParenOffset,
       int charEndOffset,
       Reference procedureReference,
-      this.isExtensionInstanceMember,
-      [String nativeMethodName])
-      : _procedure = new Procedure(
-            null, isExtensionInstanceMember ? ProcedureKind.Method : kind, null,
-            fileUri: compilationUnit.fileUri, reference: procedureReference)
-          ..startFileOffset = startCharOffset
-          ..fileOffset = charOffset
-          ..fileEndOffset = charEndOffset
-          ..isNonNullableByDefault = compilationUnit.isNonNullableByDefault,
+      ProcedureNameScheme procedureNameScheme,
+      {bool isExtensionMember,
+      bool isInstanceMember,
+      String nativeMethodName})
+      : assert(isExtensionMember != null),
+        assert(isInstanceMember != null),
+        this.isExtensionInstanceMember = isInstanceMember && isExtensionMember,
         super(metadata, modifiers, returnType, name, typeVariables, formals,
-            compilationUnit, charOffset, nativeMethodName);
+            libraryBuilder, charOffset, nativeMethodName) {
+    _procedure = new Procedure(procedureNameScheme.getName(kind, name),
+        isExtensionInstanceMember ? ProcedureKind.Method : kind, null,
+        fileUri: libraryBuilder.fileUri, reference: procedureReference)
+      ..startFileOffset = startCharOffset
+      ..fileOffset = charOffset
+      ..fileEndOffset = charEndOffset
+      ..isNonNullableByDefault = libraryBuilder.isNonNullableByDefault;
+  }
 
   @override
   ProcedureBuilder get origin => actualOrigin ?? this;
@@ -225,7 +231,7 @@
       List<TypeVariableBuilder> typeVariables,
       List<FormalParameterBuilder> formals,
       ProcedureKind kind,
-      SourceLibraryBuilder compilationUnit,
+      SourceLibraryBuilder libraryBuilder,
       int startCharOffset,
       int charOffset,
       int charOpenParenOffset,
@@ -233,8 +239,10 @@
       Reference procedureReference,
       this._tearOffReference,
       AsyncMarker asyncModifier,
-      bool isExtensionInstanceMember,
-      [String nativeMethodName])
+      ProcedureNameScheme procedureNameScheme,
+      {bool isExtensionMember,
+      bool isInstanceMember,
+      String nativeMethodName})
       : super(
             metadata,
             modifiers,
@@ -243,15 +251,27 @@
             typeVariables,
             formals,
             kind,
-            compilationUnit,
+            libraryBuilder,
             startCharOffset,
             charOffset,
             charOpenParenOffset,
             charEndOffset,
             procedureReference,
-            isExtensionInstanceMember,
-            nativeMethodName) {
+            procedureNameScheme,
+            isExtensionMember: isExtensionMember,
+            isInstanceMember: isInstanceMember,
+            nativeMethodName: nativeMethodName) {
     this.asyncModifier = asyncModifier;
+    if (isExtensionMember && isInstanceMember && kind == ProcedureKind.Method) {
+      _extensionTearOff ??= new Procedure(
+          procedureNameScheme.getName(ProcedureKind.Getter, name),
+          ProcedureKind.Method,
+          null,
+          isStatic: true,
+          isExtensionMember: true,
+          reference: _tearOffReference)
+        ..isNonNullableByDefault = library.isNonNullableByDefault;
+    }
   }
 
   bool _typeEnsured = false;
@@ -359,33 +379,26 @@
 
   @override
   Procedure build(SourceLibraryBuilder libraryBuilder) {
-    // TODO(ahe): I think we may call this twice on parts. Investigate.
-    if (_procedure.name == null) {
-      _procedure.function = buildFunction(libraryBuilder);
-      _procedure.function.parent = _procedure;
-      _procedure.function.fileOffset = charOpenParenOffset;
-      _procedure.function.fileEndOffset = _procedure.fileEndOffset;
-      _procedure.isAbstract = isAbstract;
-      _procedure.isExternal = isExternal;
-      _procedure.isConst = isConst;
-      if (isExtensionMethod) {
-        ExtensionBuilder extensionBuilder = parent;
-        _procedure.isExtensionMember = true;
-        _procedure.isStatic = true;
-        if (isExtensionInstanceMember) {
-          assert(_procedure.kind == ProcedureKind.Method);
-        }
-        _procedure.name = new Name(
-            createProcedureName(true, !isExtensionInstanceMember, kind,
-                extensionBuilder.name, name),
-            libraryBuilder.library);
-      } else {
-        _procedure.isStatic = isStatic;
-        _procedure.name = new Name(name, libraryBuilder.library);
+    _procedure.function = buildFunction(libraryBuilder);
+    _procedure.function.parent = _procedure;
+    _procedure.function.fileOffset = charOpenParenOffset;
+    _procedure.function.fileEndOffset = _procedure.fileEndOffset;
+    _procedure.isAbstract = isAbstract;
+    _procedure.isExternal = isExternal;
+    _procedure.isConst = isConst;
+    updatePrivateMemberName(_procedure, libraryBuilder);
+    if (isExtensionMethod) {
+      _procedure.isExtensionMember = true;
+      _procedure.isStatic = true;
+      if (isExtensionInstanceMember) {
+        assert(_procedure.kind == ProcedureKind.Method);
       }
-      if (extensionTearOff != null) {
-        _buildExtensionTearOff(libraryBuilder, parent);
-      }
+    } else {
+      _procedure.isStatic = isStatic;
+    }
+    if (extensionTearOff != null) {
+      _buildExtensionTearOff(libraryBuilder, parent);
+      updatePrivateMemberName(extensionTearOff, libraryBuilder);
     }
     return _procedure;
   }
@@ -442,7 +455,6 @@
       SourceLibraryBuilder libraryBuilder, ExtensionBuilder extensionBuilder) {
     assert(
         _extensionTearOff != null, "No extension tear off created for $this.");
-    if (_extensionTearOff.name != null) return;
 
     _extensionTearOffParameterMap = {};
 
@@ -550,8 +562,6 @@
       ..fileOffset = fileOffset;
 
     _extensionTearOff
-      ..name = new Name(
-          '${extensionBuilder.name}|get#${name}', libraryBuilder.library)
       ..function = (new FunctionNode(
           new ReturnStatement(closure)..fileOffset = fileOffset,
           typeParameters: tearOffTypeParameters,
@@ -566,14 +576,7 @@
     _extensionTearOff.function.parent = _extensionTearOff;
   }
 
-  Procedure get extensionTearOff {
-    if (isExtensionInstanceMember && kind == ProcedureKind.Method) {
-      _extensionTearOff ??= new Procedure(null, ProcedureKind.Method, null,
-          isStatic: true, isExtensionMember: true, reference: _tearOffReference)
-        ..isNonNullableByDefault = library.isNonNullableByDefault;
-    }
-    return _extensionTearOff;
-  }
+  Procedure get extensionTearOff => _extensionTearOff;
 
   @override
   VariableDeclaration getExtensionTearOffParameter(int index) {
@@ -663,6 +666,7 @@
       int charOpenParenOffset,
       int charEndOffset,
       Reference reference,
+      ProcedureNameScheme procedureNameScheme,
       [String nativeMethodName,
       this.redirectionTarget])
       : super(
@@ -679,8 +683,10 @@
             charOpenParenOffset,
             charEndOffset,
             reference,
-            /* isExtensionInstanceMember = */ false,
-            nativeMethodName);
+            procedureNameScheme,
+            isExtensionMember: false,
+            isInstanceMember: false,
+            nativeMethodName: nativeMethodName);
 
   @override
   Member get readTarget => null;
@@ -741,18 +747,14 @@
 
   @override
   Procedure build(SourceLibraryBuilder libraryBuilder) {
-    // TODO(ahe): I think we may call this twice on parts. Investigate.
-    if (_procedure.name == null) {
-      _procedure.function = buildFunction(libraryBuilder);
-      _procedure.function.parent = _procedure;
-      _procedure.function.fileOffset = charOpenParenOffset;
-      _procedure.function.fileEndOffset = _procedure.fileEndOffset;
-      _procedure.isAbstract = isAbstract;
-      _procedure.isExternal = isExternal;
-      _procedure.isConst = isConst;
-      _procedure.isStatic = isStatic;
-      _procedure.name = new Name(name, libraryBuilder.library);
-    }
+    _procedure.function = buildFunction(libraryBuilder);
+    _procedure.function.parent = _procedure;
+    _procedure.function.fileOffset = charOpenParenOffset;
+    _procedure.function.fileEndOffset = _procedure.fileEndOffset;
+    _procedure.isAbstract = isAbstract;
+    _procedure.isExternal = isExternal;
+    _procedure.isConst = isConst;
+    _procedure.isStatic = isStatic;
     _procedure.isRedirectingFactoryConstructor = true;
     if (redirectionTarget.typeArguments != null) {
       typeArguments = new List<DartType>.filled(
@@ -761,6 +763,7 @@
         typeArguments[i] = redirectionTarget.typeArguments[i].build(library);
       }
     }
+    updatePrivateMemberName(_procedure, libraryBuilder);
     return _procedure;
   }
 
@@ -863,3 +866,28 @@
     return 1;
   }
 }
+
+class ProcedureNameScheme {
+  final bool isExtensionMember;
+  final bool isStatic;
+  final String extensionName;
+  final Reference libraryReference;
+
+  ProcedureNameScheme(
+      {this.isExtensionMember,
+      this.isStatic,
+      this.extensionName,
+      this.libraryReference})
+      : assert(isExtensionMember != null),
+        assert(isStatic != null),
+        assert(!isExtensionMember || extensionName != null),
+        assert(libraryReference != null);
+
+  Name getName(ProcedureKind kind, String name) {
+    assert(kind != null);
+    return new Name.byReference(
+        SourceProcedureBuilder.createProcedureName(
+            isExtensionMember, isStatic, kind, extensionName, name),
+        libraryReference);
+  }
+}
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 daf190f..bd6b554 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -3607,8 +3607,11 @@
 
   @override
   ExecutionStatus visitVariableDeclaration(VariableDeclaration node) {
-    Constant value = evaluate(node.initializer);
-    if (value is AbortConstant) return new AbortStatus(value);
+    Constant value;
+    if (node.initializer != null) {
+      value = evaluate(node.initializer);
+      if (value is AbortConstant) return new AbortStatus(value);
+    }
     exprEvaluator.env.addVariableValue(node, value);
     return const ProceedStatus();
   }
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 da66b2a..96450ad 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -859,8 +859,8 @@
         endToken.charOffset,
         nativeMethodName,
         asyncModifier,
-        isTopLevel: true,
-        isExtensionInstanceMember: false);
+        isInstanceMember: false,
+        isExtensionMember: false);
     nativeMethodName = null;
   }
 
@@ -1211,6 +1211,7 @@
       }
       final int startCharOffset =
           metadata == null ? beginToken.charOffset : metadata.first.charOffset;
+      bool isExtensionMember = methodKind == _MethodKind.extensionMethod;
       libraryBuilder.addProcedure(
           metadata,
           modifiers,
@@ -1225,9 +1226,8 @@
           endToken.charOffset,
           nativeMethodName,
           asyncModifier,
-          isTopLevel: false,
-          isExtensionInstanceMember:
-              methodKind == _MethodKind.extensionMethod && !isStatic);
+          isInstanceMember: !isStatic,
+          isExtensionMember: isExtensionMember);
     }
     nativeMethodName = null;
     inConstructor = false;
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 097bde3..94ed0ca 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -2152,17 +2152,17 @@
             hasInitializer: hasInitializer,
             isFinal: (modifiers & finalMask) != 0,
             isStatic: isTopLevel || (modifiers & staticMask) != 0);
-    final bool isInstanceMember = currentTypeParameterScopeBuilder.kind ==
-            TypeParameterScopeKind.classDeclaration &&
+    final bool isInstanceMember = currentTypeParameterScopeBuilder.kind !=
+            TypeParameterScopeKind.library &&
         (modifiers & staticMask) == 0;
     String className;
     if (isInstanceMember) {
       className = currentTypeParameterScopeBuilder.name;
     }
-    final bool isExtension = currentTypeParameterScopeBuilder.kind ==
+    final bool isExtensionMember = currentTypeParameterScopeBuilder.kind ==
         TypeParameterScopeKind.extensionDeclaration;
     String extensionName;
-    if (isExtension) {
+    if (isExtensionMember) {
       extensionName = currentTypeParameterScopeBuilder.name;
     }
 
@@ -2172,56 +2172,50 @@
     Reference lateIsSetSetterReference;
     Reference lateGetterReference;
     Reference lateSetterReference;
+
+    FieldNameScheme fieldNameScheme = new FieldNameScheme(
+        isInstanceMember: isInstanceMember,
+        className: className,
+        isExtensionMember: isExtensionMember,
+        extensionName: extensionName,
+        libraryReference: referencesFrom?.reference ?? library.reference);
     if (referencesFrom != null) {
-      String nameToLookup = SourceFieldBuilder.createFieldName(
-          FieldNameType.Field, name,
-          isInstanceMember: isInstanceMember,
-          className: className,
-          isExtensionMethod: isExtension,
-          extensionName: extensionName,
-          isSynthesized: fieldIsLateWithLowering);
       IndexedContainer indexedContainer =
           _currentClassReferencesFromIndexed ?? referencesFromIndexed;
-      Name nameToLookupName = new Name(nameToLookup, indexedContainer.library);
+      Name nameToLookupName = fieldNameScheme.getName(FieldNameType.Field, name,
+          isSynthesized: fieldIsLateWithLowering);
       fieldGetterReference =
           indexedContainer.lookupGetterReference(nameToLookupName);
       fieldSetterReference =
           indexedContainer.lookupSetterReference(nameToLookupName);
       if (fieldIsLateWithLowering) {
-        String lateIsSetName = SourceFieldBuilder.createFieldName(
+        Name lateIsSetNameName = fieldNameScheme.getName(
             FieldNameType.IsSetField, name,
-            isInstanceMember: isInstanceMember,
-            className: className,
-            isExtensionMethod: isExtension,
-            extensionName: extensionName,
             isSynthesized: fieldIsLateWithLowering);
-        Name lateIsSetNameName =
-            new Name(lateIsSetName, indexedContainer.library);
         lateIsSetGetterReference =
             indexedContainer.lookupGetterReference(lateIsSetNameName);
         lateIsSetSetterReference =
             indexedContainer.lookupSetterReference(lateIsSetNameName);
-        lateGetterReference = indexedContainer.lookupGetterReference(new Name(
-            SourceFieldBuilder.createFieldName(FieldNameType.Getter, name,
-                isInstanceMember: isInstanceMember,
-                className: className,
-                isExtensionMethod: isExtension,
-                extensionName: extensionName,
-                isSynthesized: fieldIsLateWithLowering),
-            indexedContainer.library));
-        lateSetterReference = indexedContainer.lookupSetterReference(new Name(
-            SourceFieldBuilder.createFieldName(FieldNameType.Setter, name,
-                isInstanceMember: isInstanceMember,
-                className: className,
-                isExtensionMethod: isExtension,
-                extensionName: extensionName,
-                isSynthesized: fieldIsLateWithLowering),
-            indexedContainer.library));
+        lateGetterReference = indexedContainer.lookupGetterReference(
+            fieldNameScheme.getName(FieldNameType.Getter, name,
+                isSynthesized: fieldIsLateWithLowering));
+        lateSetterReference = indexedContainer.lookupSetterReference(
+            fieldNameScheme.getName(FieldNameType.Setter, name,
+                isSynthesized: fieldIsLateWithLowering));
       }
     }
 
-    SourceFieldBuilder fieldBuilder = new SourceFieldBuilder(metadata, type,
-        name, modifiers, isTopLevel, this, charOffset, charEndOffset,
+    SourceFieldBuilder fieldBuilder = new SourceFieldBuilder(
+        metadata,
+        type,
+        name,
+        modifiers,
+        isTopLevel,
+        this,
+        charOffset,
+        charEndOffset,
+        fieldNameScheme,
+        isInstanceMember: isInstanceMember,
         fieldGetterReference: fieldGetterReference,
         fieldSetterReference: fieldSetterReference,
         lateIsSetGetterReference: lateIsSetGetterReference,
@@ -2312,10 +2306,20 @@
       int charEndOffset,
       String nativeMethodName,
       AsyncMarker asyncModifier,
-      {bool isTopLevel,
-      bool isExtensionInstanceMember}) {
-    assert(isTopLevel != null);
-    assert(isExtensionInstanceMember != null);
+      {bool isInstanceMember,
+      bool isExtensionMember}) {
+    assert(isInstanceMember != null);
+    assert(isExtensionMember != null);
+    assert(!isExtensionMember ||
+        currentTypeParameterScopeBuilder.kind ==
+            TypeParameterScopeKind.extensionDeclaration);
+    String extensionName =
+        isExtensionMember ? currentTypeParameterScopeBuilder.name : null;
+    ProcedureNameScheme procedureNameScheme = new ProcedureNameScheme(
+        isExtensionMember: isExtensionMember,
+        extensionName: extensionName,
+        isStatic: !isInstanceMember,
+        libraryReference: referencesFrom?.reference ?? library.reference);
 
     if (returnType == null) {
       if (kind == ProcedureKind.Operator &&
@@ -2328,52 +2332,28 @@
     Reference procedureReference;
     Reference tearOffReference;
     if (referencesFrom != null) {
+      Name nameToLookup = procedureNameScheme.getName(kind, name);
       if (_currentClassReferencesFromIndexed != null) {
         if (kind == ProcedureKind.Setter) {
-          procedureReference =
-              _currentClassReferencesFromIndexed.lookupSetterReference(
-                  new Name(name, _currentClassReferencesFromIndexed.library));
+          procedureReference = _currentClassReferencesFromIndexed
+              .lookupSetterReference(nameToLookup);
         } else {
-          procedureReference =
-              _currentClassReferencesFromIndexed.lookupGetterReference(
-                  new Name(name, _currentClassReferencesFromIndexed.library));
+          procedureReference = _currentClassReferencesFromIndexed
+              .lookupGetterReference(nameToLookup);
         }
       } else {
-        if (currentTypeParameterScopeBuilder.kind ==
-            TypeParameterScopeKind.extensionDeclaration) {
-          bool extensionIsStatic = (modifiers & staticMask) != 0;
-          String nameToLookup = SourceProcedureBuilder.createProcedureName(
-              true,
-              extensionIsStatic,
-              kind,
-              currentTypeParameterScopeBuilder.name,
-              name);
-          if (extensionIsStatic && kind == ProcedureKind.Setter) {
-            procedureReference = referencesFromIndexed.lookupSetterReference(
-                new Name(nameToLookup, referencesFromIndexed.library));
-          } else {
-            procedureReference = referencesFromIndexed.lookupGetterReference(
-                new Name(nameToLookup, referencesFromIndexed.library));
-          }
-          if (kind == ProcedureKind.Method) {
-            String tearOffNameToLookup =
-                SourceProcedureBuilder.createProcedureName(
-                    true,
-                    false,
-                    ProcedureKind.Getter,
-                    currentTypeParameterScopeBuilder.name,
-                    name);
-            tearOffReference = referencesFromIndexed.lookupGetterReference(
-                new Name(tearOffNameToLookup, referencesFromIndexed.library));
-          }
+        if (kind == ProcedureKind.Setter &&
+            // Extension instance setters are encoded as methods.
+            !(isExtensionMember && isInstanceMember)) {
+          procedureReference =
+              referencesFromIndexed.lookupSetterReference(nameToLookup);
         } else {
-          if (kind == ProcedureKind.Setter) {
-            procedureReference = referencesFromIndexed.lookupSetterReference(
-                new Name(name, referencesFromIndexed.library));
-          } else {
-            procedureReference = referencesFromIndexed.lookupGetterReference(
-                new Name(name, referencesFromIndexed.library));
-          }
+          procedureReference =
+              referencesFromIndexed.lookupGetterReference(nameToLookup);
+        }
+        if (isExtensionMember && kind == ProcedureKind.Method) {
+          tearOffReference = referencesFromIndexed.lookupGetterReference(
+              procedureNameScheme.getName(ProcedureKind.Getter, name));
         }
       }
     }
@@ -2393,8 +2373,10 @@
         procedureReference,
         tearOffReference,
         asyncModifier,
-        isExtensionInstanceMember,
-        nativeMethodName);
+        procedureNameScheme,
+        isExtensionMember: isExtensionMember,
+        isInstanceMember: isInstanceMember,
+        nativeMethodName: nativeMethodName);
     checkTypeVariables(typeVariables, procedureBuilder);
     addBuilder(name, procedureBuilder, charOffset,
         getterReference: procedureReference);
@@ -2434,6 +2416,16 @@
       procedureName = name;
     }
 
+    ProcedureNameScheme procedureNameScheme = new ProcedureNameScheme(
+        isExtensionMember: false,
+        extensionName: null,
+        isStatic: true,
+        libraryReference: referencesFrom != null
+            ? (_currentClassReferencesFromIndexed ?? referencesFromIndexed)
+                .library
+                .reference
+            : library.reference);
+
     Reference reference = _currentClassReferencesFromIndexed
         ?.lookupConstructor(
             new Name(procedureName, _currentClassReferencesFromIndexed.library))
@@ -2457,6 +2449,7 @@
           charOpenParenOffset,
           charEndOffset,
           reference,
+          procedureNameScheme,
           nativeMethodName,
           redirectionTarget);
     } else {
@@ -2479,8 +2472,10 @@
           reference,
           null,
           asyncModifier,
-          /* isExtensionInstanceMember = */ false,
-          nativeMethodName);
+          procedureNameScheme,
+          isExtensionMember: false,
+          isInstanceMember: false,
+          nativeMethodName: nativeMethodName);
     }
 
     TypeParameterScopeBuilder savedDeclaration =
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 29a3626..675dee4 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -494,15 +494,15 @@
 
   // TODO(johnniwinther,jensj): Handle expression in extensions?
   Future<Expression> buildExpression(
-      SourceLibraryBuilder library,
+      SourceLibraryBuilder libraryBuilder,
       String enclosingClass,
       bool isClassInstanceMember,
       FunctionNode parameters) async {
-    Token token = await tokenize(library, suppressLexicalErrors: false);
+    Token token = await tokenize(libraryBuilder, suppressLexicalErrors: false);
     if (token == null) return null;
-    DietListener dietListener = createDietListener(library);
+    DietListener dietListener = createDietListener(libraryBuilder);
 
-    Builder parent = library;
+    Builder parent = libraryBuilder;
     if (enclosingClass != null) {
       Builder cls = dietListener.memberScope.lookup(enclosingClass, -1, null);
       if (cls is ClassBuilder) {
@@ -522,7 +522,7 @@
         null,
         null,
         ProcedureKind.Method,
-        library,
+        libraryBuilder,
         0,
         0,
         -1,
@@ -530,7 +530,12 @@
         null,
         null,
         AsyncMarker.Sync,
-        /* isExtensionInstanceMember = */ false)
+        new ProcedureNameScheme(
+            isExtensionMember: false,
+            isStatic: true,
+            libraryReference: libraryBuilder.library.reference),
+        isInstanceMember: false,
+        isExtensionMember: false)
       ..parent = parent;
     BodyBuilder listener = dietListener.createListener(
         builder, dietListener.memberScope,
diff --git a/pkg/front_end/test/member_covariance_test.dart b/pkg/front_end/test/member_covariance_test.dart
index 62d44a3..fee063f 100644
--- a/pkg/front_end/test/member_covariance_test.dart
+++ b/pkg/front_end/test/member_covariance_test.dart
@@ -91,8 +91,8 @@
       'types:1)',
       covariance.toString());
 
-  Procedure noParameterProcedure =
-      new Procedure(null, ProcedureKind.Method, new FunctionNode(null));
+  Procedure noParameterProcedure = new Procedure(
+      new Name('foo'), ProcedureKind.Method, new FunctionNode(null));
   Covariance noParameterProcedureCovariance =
       new Covariance.fromMember(noParameterProcedure, forSetter: false);
   Expect.isTrue(noParameterProcedureCovariance.isEmpty);
@@ -103,7 +103,7 @@
   Expect.isTrue(noParameterProcedureCovariance.isEmpty);
 
   Procedure oneParameterProcedure = new Procedure(
-      null,
+      new Name('foo'),
       ProcedureKind.Method,
       new FunctionNode(null,
           positionalParameters: [new VariableDeclaration(null)]));
@@ -119,7 +119,7 @@
       oneParameterProcedureCovariance);
 
   Procedure positionalParametersProcedure = new Procedure(
-      null,
+      new Name('foo'),
       ProcedureKind.Method,
       new FunctionNode(null, positionalParameters: [
         new VariableDeclaration(null),
@@ -148,7 +148,7 @@
       positionalParametersProcedureCovariance);
 
   Procedure namedParametersProcedure = new Procedure(
-      null,
+      new Name('foo'),
       ProcedureKind.Method,
       new FunctionNode(null, namedParameters: [
         new VariableDeclaration('a'),
@@ -177,7 +177,7 @@
       namedParametersProcedureCovariance);
 
   Procedure typeParametersProcedure = new Procedure(
-      null,
+      new Name('foo'),
       ProcedureKind.Method,
       new FunctionNode(null, typeParameters: [
         new TypeParameter(null),
diff --git a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart
index 7c1c573..20071a4 100644
--- a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart
+++ b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart
@@ -39,6 +39,29 @@
   return constant;
 }
 
+const var6 = function6();
+int function6() {
+  var a;
+  a = 2;
+  return a;
+}
+
+const var7 = function7();
+int function7() {
+  var a;
+  var b;
+  a = 2;
+  return a;
+}
+
+const var8 = function8();
+int function8() {
+  var a;
+  int? b;
+  a = 2;
+  return a;
+}
+
 void main() {
   Expect.equals(var1, 4);
   Expect.equals(var1_1, 5);
@@ -46,4 +69,7 @@
   Expect.equals(var3, 6);
   Expect.equals(var4, 2);
   Expect.equals(var5, -2);
+  Expect.equals(var6, 2);
+  Expect.equals(var7, 2);
+  Expect.equals(var8, 2);
 }
diff --git a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.strong.expect b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.strong.expect
index 425972a..e424e71 100644
--- a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.strong.expect
+++ b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.strong.expect
@@ -11,6 +11,9 @@
 static const field core::int var3 = #C4;
 static const field core::int var4 = #C5;
 static const field core::int var5 = #C6;
+static const field core::int var6 = #C5;
+static const field core::int var7 = #C5;
+static const field core::int var8 = #C5;
 static method function1(core::int a, core::int b) → core::int {
   core::int x = 1.{core::num::+}(a).{core::num::+}(b);
   return x;
@@ -32,6 +35,23 @@
 static method function5() → core::int {
   return #C6;
 }
+static method function6() → core::int {
+  dynamic a;
+  a = 2;
+  return a as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
+static method function7() → core::int {
+  dynamic a;
+  dynamic b;
+  a = 2;
+  return a as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
+static method function8() → core::int {
+  dynamic a;
+  core::int? b;
+  a = 2;
+  return a as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
 static method main() → void {
   exp::Expect::equals(#C1, 4);
   exp::Expect::equals(#C2, 5);
@@ -39,6 +59,9 @@
   exp::Expect::equals(#C4, 6);
   exp::Expect::equals(#C5, 2);
   exp::Expect::equals(#C6, 2.{core::int::unary-}());
+  exp::Expect::equals(#C5, 2);
+  exp::Expect::equals(#C5, 2);
+  exp::Expect::equals(#C5, 2);
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.strong.transformed.expect b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.strong.transformed.expect
index 9ea2e2a..611523b 100644
--- a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.strong.transformed.expect
@@ -11,6 +11,9 @@
 static const field core::int var3 = #C4;
 static const field core::int var4 = #C5;
 static const field core::int var5 = #C6;
+static const field core::int var6 = #C5;
+static const field core::int var7 = #C5;
+static const field core::int var8 = #C5;
 static method function1(core::int a, core::int b) → core::int {
   core::int x = 1.{core::num::+}(a).{core::num::+}(b);
   return x;
@@ -32,6 +35,23 @@
 static method function5() → core::int {
   return #C6;
 }
+static method function6() → core::int {
+  dynamic a;
+  a = 2;
+  return a as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
+static method function7() → core::int {
+  dynamic a;
+  dynamic b;
+  a = 2;
+  return a as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
+static method function8() → core::int {
+  dynamic a;
+  core::int? b;
+  a = 2;
+  return a as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
 static method main() → void {
   exp::Expect::equals(#C1, 4);
   exp::Expect::equals(#C2, 5);
@@ -39,6 +59,9 @@
   exp::Expect::equals(#C4, 6);
   exp::Expect::equals(#C5, 2);
   exp::Expect::equals(#C6, 2.{core::int::unary-}());
+  exp::Expect::equals(#C5, 2);
+  exp::Expect::equals(#C5, 2);
+  exp::Expect::equals(#C5, 2);
 }
 
 constants  {
@@ -51,5 +74,5 @@
 }
 
 Extra constant evaluation status:
-Evaluated: MethodInvocation @ org-dartlang-testcase:///const_functions_variable_declarations.dart:48:23 -> IntConstant(-2)
-Extra constant evaluation: evaluated: 21, effectively constant: 1
+Evaluated: MethodInvocation @ org-dartlang-testcase:///const_functions_variable_declarations.dart:71:23 -> IntConstant(-2)
+Extra constant evaluation: evaluated: 33, effectively constant: 1
diff --git a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.textual_outline.expect b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.textual_outline.expect
index 1b140e3..1c817fd 100644
--- a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.textual_outline.expect
@@ -11,4 +11,10 @@
 int function4() {}
 const var5 = function5();
 int function5() {}
+const var6 = function6();
+int function6() {}
+const var7 = function7();
+int function7() {}
+const var8 = function8();
+int function8() {}
 void main() {}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.textual_outline_modelled.expect
index 7dcb573..2d98733 100644
--- a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.textual_outline_modelled.expect
@@ -7,8 +7,14 @@
 const var3 = function3();
 const var4 = function4();
 const var5 = function5();
+const var6 = function6();
+const var7 = function7();
+const var8 = function8();
 int function1(int a, int b) {}
 int function3() {}
 int function4() {}
 int function5() {}
+int function6() {}
+int function7() {}
+int function8() {}
 void main() {}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.weak.expect b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.weak.expect
index 425972a..e424e71 100644
--- a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.weak.expect
+++ b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.weak.expect
@@ -11,6 +11,9 @@
 static const field core::int var3 = #C4;
 static const field core::int var4 = #C5;
 static const field core::int var5 = #C6;
+static const field core::int var6 = #C5;
+static const field core::int var7 = #C5;
+static const field core::int var8 = #C5;
 static method function1(core::int a, core::int b) → core::int {
   core::int x = 1.{core::num::+}(a).{core::num::+}(b);
   return x;
@@ -32,6 +35,23 @@
 static method function5() → core::int {
   return #C6;
 }
+static method function6() → core::int {
+  dynamic a;
+  a = 2;
+  return a as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
+static method function7() → core::int {
+  dynamic a;
+  dynamic b;
+  a = 2;
+  return a as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
+static method function8() → core::int {
+  dynamic a;
+  core::int? b;
+  a = 2;
+  return a as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
 static method main() → void {
   exp::Expect::equals(#C1, 4);
   exp::Expect::equals(#C2, 5);
@@ -39,6 +59,9 @@
   exp::Expect::equals(#C4, 6);
   exp::Expect::equals(#C5, 2);
   exp::Expect::equals(#C6, 2.{core::int::unary-}());
+  exp::Expect::equals(#C5, 2);
+  exp::Expect::equals(#C5, 2);
+  exp::Expect::equals(#C5, 2);
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.weak.outline.expect b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.weak.outline.expect
index f119780..50fbc0f 100644
--- a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.weak.outline.expect
@@ -10,6 +10,9 @@
 static const field core::int var3 = self::function3();
 static const field core::int var4 = self::function4();
 static const field core::int var5 = self::function5();
+static const field core::int var6 = self::function6();
+static const field core::int var7 = self::function7();
+static const field core::int var8 = self::function8();
 static method function1(core::int a, core::int b) → core::int
   ;
 static method function2() → core::String
@@ -20,5 +23,11 @@
   ;
 static method function5() → core::int
   ;
+static method function6() → core::int
+  ;
+static method function7() → core::int
+  ;
+static method function8() → core::int
+  ;
 static method main() → void
   ;
diff --git a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.weak.transformed.expect b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.weak.transformed.expect
index 9ea2e2a..611523b 100644
--- a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.weak.transformed.expect
@@ -11,6 +11,9 @@
 static const field core::int var3 = #C4;
 static const field core::int var4 = #C5;
 static const field core::int var5 = #C6;
+static const field core::int var6 = #C5;
+static const field core::int var7 = #C5;
+static const field core::int var8 = #C5;
 static method function1(core::int a, core::int b) → core::int {
   core::int x = 1.{core::num::+}(a).{core::num::+}(b);
   return x;
@@ -32,6 +35,23 @@
 static method function5() → core::int {
   return #C6;
 }
+static method function6() → core::int {
+  dynamic a;
+  a = 2;
+  return a as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
+static method function7() → core::int {
+  dynamic a;
+  dynamic b;
+  a = 2;
+  return a as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
+static method function8() → core::int {
+  dynamic a;
+  core::int? b;
+  a = 2;
+  return a as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
 static method main() → void {
   exp::Expect::equals(#C1, 4);
   exp::Expect::equals(#C2, 5);
@@ -39,6 +59,9 @@
   exp::Expect::equals(#C4, 6);
   exp::Expect::equals(#C5, 2);
   exp::Expect::equals(#C6, 2.{core::int::unary-}());
+  exp::Expect::equals(#C5, 2);
+  exp::Expect::equals(#C5, 2);
+  exp::Expect::equals(#C5, 2);
 }
 
 constants  {
@@ -51,5 +74,5 @@
 }
 
 Extra constant evaluation status:
-Evaluated: MethodInvocation @ org-dartlang-testcase:///const_functions_variable_declarations.dart:48:23 -> IntConstant(-2)
-Extra constant evaluation: evaluated: 21, effectively constant: 1
+Evaluated: MethodInvocation @ org-dartlang-testcase:///const_functions_variable_declarations.dart:71:23 -> IntConstant(-2)
+Extra constant evaluation: evaluated: 33, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/private_members.dart b/pkg/front_end/testcases/general/private_members.dart
new file mode 100644
index 0000000..26b5c7d
--- /dev/null
+++ b/pkg/front_end/testcases/general/private_members.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.
+
+part 'private_members_part.dart';
+
+test(_AbstractClass c) {
+  c._privateAbstractField = c._privateAbstractField;
+}
+
+main() {
+  _Class c = new _Class._privateConstructor();
+  c = new _Class._privateRedirectingFactory();
+  c._privateMethod();
+  c._privateSetter = c._privateGetter;
+  c._privateField = c._privateField;
+  c._privateFinalField;
+  0._privateMethod();
+  (0._privateMethod)();
+  0._privateSetter = 0._privateGetter;
+  _Extension._privateField = _Extension._privateField;
+  _Extension._privateFinalField;
+}
diff --git a/pkg/front_end/testcases/general/private_members.dart.textual_outline.expect b/pkg/front_end/testcases/general/private_members.dart.textual_outline.expect
new file mode 100644
index 0000000..959cb66
--- /dev/null
+++ b/pkg/front_end/testcases/general/private_members.dart.textual_outline.expect
@@ -0,0 +1,4 @@
+part 'private_members_part.dart';
+
+test(_AbstractClass c) {}
+main() {}
diff --git a/pkg/front_end/testcases/general/private_members.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/private_members.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..8aeb6ed
--- /dev/null
+++ b/pkg/front_end/testcases/general/private_members.dart.textual_outline_modelled.expect
@@ -0,0 +1,4 @@
+part 'private_members_part.dart';
+
+main() {}
+test(_AbstractClass c) {}
diff --git a/pkg/front_end/testcases/general/private_members.dart.weak.expect b/pkg/front_end/testcases/general/private_members.dart.weak.expect
new file mode 100644
index 0000000..ce24406
--- /dev/null
+++ b/pkg/front_end/testcases/general/private_members.dart.weak.expect
@@ -0,0 +1,58 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+part private_members_part.dart;
+abstract class _AbstractClass extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
+  synthetic constructor •() → self::_AbstractClass
+    : super core::Object::•()
+    ;
+  abstract get _privateAbstractField() → core::int;
+  abstract set _privateAbstractField(core::int #externalFieldValue) → void;
+}
+class _Class extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
+  field core::int _privateField = 1;
+  field core::int _privateFinalField = 1;
+  static final field dynamic _redirecting# = <dynamic>[self::_Class::_privateRedirectingFactory]/*isLegacy*/;
+  constructor _privateConstructor() → self::_Class
+    : super core::Object::•()
+    ;
+  static factory _privateRedirectingFactory() → self::_Class
+    let dynamic #redirecting_factory = self::_Class::_privateConstructor in invalid-expression;
+  method _privateMethod() → void {}
+  get _privateGetter() → core::int
+    return 42;
+  set _privateSetter(core::int value) → void {}
+}
+extension _Extension on core::int { // from org-dartlang-testcase:///private_members_part.dart
+  method _privateMethod = self::_Extension|_privateMethod;
+  tearoff _privateMethod = self::_Extension|get#_privateMethod;
+  get _privateGetter = self::_Extension|get#_privateGetter;
+  static field _privateField = self::_Extension|_privateField;
+  static field _privateFinalField = self::_Extension|_privateFinalField;
+  set _privateSetter = self::_Extension|set#_privateSetter;
+}
+static field core::int _Extension|_privateField = 1 /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int _Extension|_privateFinalField = 1 /* from org-dartlang-testcase:///private_members_part.dart */;
+static method test(self::_AbstractClass c) → dynamic {
+  c.{self::_AbstractClass::_privateAbstractField} = c.{self::_AbstractClass::_privateAbstractField};
+}
+static method main() → dynamic {
+  self::_Class c = new self::_Class::_privateConstructor();
+  c = new self::_Class::_privateConstructor();
+  c.{self::_Class::_privateMethod}();
+  c.{self::_Class::_privateSetter} = c.{self::_Class::_privateGetter};
+  c.{self::_Class::_privateField} = c.{self::_Class::_privateField};
+  c.{self::_Class::_privateFinalField};
+  self::_Extension|_privateMethod(0);
+  self::_Extension|get#_privateMethod(0).call();
+  self::_Extension|set#_privateSetter(0, self::_Extension|get#_privateGetter(0));
+  self::_Extension|_privateField = self::_Extension|_privateField;
+  self::_Extension|_privateFinalField;
+}
+static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateMethod(lowered final core::int #this) → void {}
+static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|get#_privateMethod(lowered final core::int #this) → () → void
+  return () → void => self::_Extension|_privateMethod(#this);
+static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|get#_privateGetter(lowered final core::int #this) → core::int
+  return 42;
+static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|set#_privateSetter(lowered final core::int #this, core::int value) → void {}
diff --git a/pkg/front_end/testcases/general/private_members.dart.weak.outline.expect b/pkg/front_end/testcases/general/private_members.dart.weak.outline.expect
new file mode 100644
index 0000000..f9f6839
--- /dev/null
+++ b/pkg/front_end/testcases/general/private_members.dart.weak.outline.expect
@@ -0,0 +1,48 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+part private_members_part.dart;
+abstract class _AbstractClass extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
+  synthetic constructor •() → self::_AbstractClass
+    ;
+  abstract get _privateAbstractField() → core::int;
+  abstract set _privateAbstractField(core::int #externalFieldValue) → void;
+}
+class _Class extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
+  field core::int _privateField;
+  field core::int _privateFinalField;
+  static final field dynamic _redirecting# = <dynamic>[self::_Class::_privateRedirectingFactory]/*isLegacy*/;
+  constructor _privateConstructor() → self::_Class
+    ;
+  static factory _privateRedirectingFactory() → self::_Class
+    let dynamic #redirecting_factory = self::_Class::_privateConstructor in invalid-expression;
+  method _privateMethod() → void
+    ;
+  get _privateGetter() → core::int
+    ;
+  set _privateSetter(core::int value) → void
+    ;
+}
+extension _Extension on core::int { // from org-dartlang-testcase:///private_members_part.dart
+  method _privateMethod = self::_Extension|_privateMethod;
+  tearoff _privateMethod = self::_Extension|get#_privateMethod;
+  get _privateGetter = self::_Extension|get#_privateGetter;
+  static field _privateField = self::_Extension|_privateField;
+  static field _privateFinalField = self::_Extension|_privateFinalField;
+  set _privateSetter = self::_Extension|set#_privateSetter;
+}
+static field core::int _Extension|_privateField /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int _Extension|_privateFinalField /* from org-dartlang-testcase:///private_members_part.dart */;
+static method test(self::_AbstractClass c) → dynamic
+  ;
+static method main() → dynamic
+  ;
+static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateMethod(lowered final core::int #this) → void
+  ;
+static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|get#_privateMethod(lowered final core::int #this) → () → void
+  return () → void => self::_Extension|_privateMethod(#this);
+static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|get#_privateGetter(lowered final core::int #this) → core::int
+  ;
+static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|set#_privateSetter(lowered final core::int #this, core::int value) → void
+  ;
diff --git a/pkg/front_end/testcases/general/private_members.dart.weak.transformed.expect b/pkg/front_end/testcases/general/private_members.dart.weak.transformed.expect
new file mode 100644
index 0000000..920e92f
--- /dev/null
+++ b/pkg/front_end/testcases/general/private_members.dart.weak.transformed.expect
@@ -0,0 +1,58 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+part private_members_part.dart;
+abstract class _AbstractClass extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
+  synthetic constructor •() → self::_AbstractClass
+    : super core::Object::•()
+    ;
+  abstract get _privateAbstractField() → core::int;
+  abstract set _privateAbstractField(core::int #externalFieldValue) → void;
+}
+class _Class extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
+  field core::int _privateField = 1;
+  field core::int _privateFinalField = 1;
+  static final field dynamic _redirecting# = <dynamic>[self::_Class::_privateRedirectingFactory]/*isLegacy*/;
+  constructor _privateConstructor() → self::_Class
+    : super core::Object::•()
+    ;
+  static factory _privateRedirectingFactory() → self::_Class
+    let Never #redirecting_factory = self::_Class::_privateConstructor in invalid-expression;
+  method _privateMethod() → void {}
+  get _privateGetter() → core::int
+    return 42;
+  set _privateSetter(core::int value) → void {}
+}
+extension _Extension on core::int { // from org-dartlang-testcase:///private_members_part.dart
+  method _privateMethod = self::_Extension|_privateMethod;
+  tearoff _privateMethod = self::_Extension|get#_privateMethod;
+  get _privateGetter = self::_Extension|get#_privateGetter;
+  static field _privateField = self::_Extension|_privateField;
+  static field _privateFinalField = self::_Extension|_privateFinalField;
+  set _privateSetter = self::_Extension|set#_privateSetter;
+}
+static field core::int _Extension|_privateField = 1 /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int _Extension|_privateFinalField = 1 /* from org-dartlang-testcase:///private_members_part.dart */;
+static method test(self::_AbstractClass c) → dynamic {
+  c.{self::_AbstractClass::_privateAbstractField} = c.{self::_AbstractClass::_privateAbstractField};
+}
+static method main() → dynamic {
+  self::_Class c = new self::_Class::_privateConstructor();
+  c = new self::_Class::_privateConstructor();
+  c.{self::_Class::_privateMethod}();
+  c.{self::_Class::_privateSetter} = c.{self::_Class::_privateGetter};
+  c.{self::_Class::_privateField} = c.{self::_Class::_privateField};
+  c.{self::_Class::_privateFinalField};
+  self::_Extension|_privateMethod(0);
+  self::_Extension|get#_privateMethod(0).call();
+  self::_Extension|set#_privateSetter(0, self::_Extension|get#_privateGetter(0));
+  self::_Extension|_privateField = self::_Extension|_privateField;
+  self::_Extension|_privateFinalField;
+}
+static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateMethod(lowered final core::int #this) → void {}
+static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|get#_privateMethod(lowered final core::int #this) → () → void
+  return () → void => self::_Extension|_privateMethod(#this);
+static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|get#_privateGetter(lowered final core::int #this) → core::int
+  return 42;
+static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|set#_privateSetter(lowered final core::int #this, core::int value) → void {}
diff --git a/pkg/front_end/testcases/general/private_members_part.dart b/pkg/front_end/testcases/general/private_members_part.dart
new file mode 100644
index 0000000..0f172ed7
--- /dev/null
+++ b/pkg/front_end/testcases/general/private_members_part.dart
@@ -0,0 +1,37 @@
+// 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.
+
+part of 'private_members.dart';
+
+abstract class _AbstractClass {
+  abstract int _privateAbstractField;
+}
+
+class _Class {
+  _Class._privateConstructor();
+
+  factory _Class._privateRedirectingFactory() = _Class._privateConstructor;
+
+  void _privateMethod() {}
+
+  int get _privateGetter => 42;
+
+  void set _privateSetter(int value) {}
+
+  int _privateField = 1;
+
+  int _privateFinalField = 1;
+}
+
+extension _Extension on int {
+  void _privateMethod() {}
+
+  int get _privateGetter => 42;
+
+  void set _privateSetter(int value) {}
+
+  static int _privateField = 1;
+
+  static int _privateFinalField = 1;
+}
diff --git a/pkg/front_end/testcases/general/private_method_tearoff.dart b/pkg/front_end/testcases/general/private_method_tearoff.dart
index 2c953aa..4bf35bc 100644
--- a/pkg/front_end/testcases/general/private_method_tearoff.dart
+++ b/pkg/front_end/testcases/general/private_method_tearoff.dart
@@ -1,7 +1,9 @@
 // Copyright (c) 2018, 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 './private_method_tearoff_lib.dart';
 
 // `Bar' contains a private method `_f'. The function `baz' is declared in the
diff --git a/pkg/front_end/testcases/late_lowering/private_members.dart b/pkg/front_end/testcases/late_lowering/private_members.dart
new file mode 100644
index 0000000..066ec0e
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/private_members.dart
@@ -0,0 +1,17 @@
+// 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.
+
+part 'private_members_part.dart';
+
+main() {
+  _Class c = new _Class();
+  c._privateField1 = c._privateField1;
+  c._privateField2 = c._privateField2;
+  c._privateFinalField1;
+  c._privateFinalField2;
+  _Extension._privateField1 = _Extension._privateField1;
+  _Extension._privateField2 = _Extension._privateField2;
+  _Extension._privateFinalField1;
+  _Extension._privateFinalField2;
+}
diff --git a/pkg/front_end/testcases/late_lowering/private_members.dart.strong.expect b/pkg/front_end/testcases/late_lowering/private_members.dart.strong.expect
new file mode 100644
index 0000000..af828fe
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/private_members.dart.strong.expect
@@ -0,0 +1,109 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+part private_members_part.dart;
+class _Class extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
+  field core::int? _#_Class#_privateField1 = null;
+  field core::int? _#_Class#_privateField2 = null;
+  field core::bool _#_Class#_privateField2#isSet = false;
+  field core::int? _#_Class#_privateFinalField1 = null;
+  field core::int? _#_Class#_privateFinalField2 = null;
+  field core::bool _#_Class#_privateFinalField2#isSet = false;
+  synthetic constructor •() → self::_Class
+    : super core::Object::•()
+    ;
+  get _privateField1() → core::int
+    return let final core::int? #t1 = this.{self::_Class::_#_Class#_privateField1} in #t1.==(null) ?{core::int} this.{self::_Class::_#_Class#_privateField1} = 1 : #t1{core::int};
+  set _privateField1(core::int #t2) → void
+    this.{self::_Class::_#_Class#_privateField1} = #t2;
+  get _privateField2() → core::int? {
+    if(!this.{self::_Class::_#_Class#_privateField2#isSet}) {
+      this.{self::_Class::_#_Class#_privateField2} = 1;
+      this.{self::_Class::_#_Class#_privateField2#isSet} = true;
+    }
+    return this.{self::_Class::_#_Class#_privateField2};
+  }
+  set _privateField2(core::int? #t3) → void {
+    this.{self::_Class::_#_Class#_privateField2#isSet} = true;
+    this.{self::_Class::_#_Class#_privateField2} = #t3;
+  }
+  get _privateFinalField1() → core::int
+    return let final core::int? #t4 = this.{self::_Class::_#_Class#_privateFinalField1} in #t4.==(null) ?{core::int} this.{self::_Class::_#_Class#_privateFinalField1} = 1 : #t4{core::int};
+  set _privateFinalField1(core::int #t5) → void
+    this.{self::_Class::_#_Class#_privateFinalField1} = #t5;
+  get _privateFinalField2() → core::int? {
+    if(!this.{self::_Class::_#_Class#_privateFinalField2#isSet}) {
+      this.{self::_Class::_#_Class#_privateFinalField2} = 1;
+      this.{self::_Class::_#_Class#_privateFinalField2#isSet} = true;
+    }
+    return this.{self::_Class::_#_Class#_privateFinalField2};
+  }
+  set _privateFinalField2(core::int? #t6) → void {
+    this.{self::_Class::_#_Class#_privateFinalField2#isSet} = true;
+    this.{self::_Class::_#_Class#_privateFinalField2} = #t6;
+  }
+}
+extension _Extension on core::int { // from org-dartlang-testcase:///private_members_part.dart
+  static field _privateField1 = self::_#_Extension|_privateField1;
+  static get _privateField1 = get self::_Extension|_privateField1;
+  static set _privateField1 = set self::_Extension|_privateField1;
+  static field _privateField2 = self::_#_Extension|_privateField2;
+  static field _privateField2 = self::_#_Extension|_privateField2#isSet;
+  static get _privateField2 = get self::_Extension|_privateField2;
+  static set _privateField2 = set self::_Extension|_privateField2;
+  static field _privateFinalField1 = self::_#_Extension|_privateFinalField1;
+  static get _privateFinalField1 = get self::_Extension|_privateFinalField1;
+  static set _privateFinalField1 = set self::_Extension|_privateFinalField1;
+  static field _privateFinalField2 = self::_#_Extension|_privateFinalField2;
+  static field _privateFinalField2 = self::_#_Extension|_privateFinalField2#isSet;
+  static get _privateFinalField2 = get self::_Extension|_privateFinalField2;
+  static set _privateFinalField2 = set self::_Extension|_privateFinalField2;
+}
+static field core::int? _#_Extension|_privateField1 = null /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int? _#_Extension|_privateField2 = null /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::bool _#_Extension|_privateField2#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int? _#_Extension|_privateFinalField1 = null /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int? _#_Extension|_privateFinalField2 = null /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::bool _#_Extension|_privateFinalField2#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
+static method main() → dynamic {
+  self::_Class c = new self::_Class::•();
+  c.{self::_Class::_privateField1} = c.{self::_Class::_privateField1};
+  c.{self::_Class::_privateField2} = c.{self::_Class::_privateField2};
+  c.{self::_Class::_privateFinalField1};
+  c.{self::_Class::_privateFinalField2};
+  self::_Extension|_privateField1 = self::_Extension|_privateField1;
+  self::_Extension|_privateField2 = self::_Extension|_privateField2;
+  self::_Extension|_privateFinalField1;
+  self::_Extension|_privateFinalField2;
+}
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField1() → core::int
+  return let final core::int? #t7 = self::_#_Extension|_privateField1 in #t7.==(null) ?{core::int} self::_#_Extension|_privateField1 = 1 : #t7{core::int};
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField1(core::int #t8) → void
+  self::_#_Extension|_privateField1 = #t8;
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField2() → core::int? {
+  if(!self::_#_Extension|_privateField2#isSet) {
+    self::_#_Extension|_privateField2 = 1;
+    self::_#_Extension|_privateField2#isSet = true;
+  }
+  return self::_#_Extension|_privateField2;
+}
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField2(core::int? #t9) → void {
+  self::_#_Extension|_privateField2#isSet = true;
+  self::_#_Extension|_privateField2 = #t9;
+}
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField1() → core::int
+  return let final core::int? #t10 = self::_#_Extension|_privateFinalField1 in #t10.==(null) ?{core::int} self::_#_Extension|_privateFinalField1 = 1 : #t10{core::int};
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField1(core::int #t11) → void
+  self::_#_Extension|_privateFinalField1 = #t11;
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField2() → core::int? {
+  if(!self::_#_Extension|_privateFinalField2#isSet) {
+    self::_#_Extension|_privateFinalField2 = 1;
+    self::_#_Extension|_privateFinalField2#isSet = true;
+  }
+  return self::_#_Extension|_privateFinalField2;
+}
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField2(core::int? #t12) → void {
+  self::_#_Extension|_privateFinalField2#isSet = true;
+  self::_#_Extension|_privateFinalField2 = #t12;
+}
diff --git a/pkg/front_end/testcases/late_lowering/private_members.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/private_members.dart.strong.transformed.expect
new file mode 100644
index 0000000..af828fe
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/private_members.dart.strong.transformed.expect
@@ -0,0 +1,109 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+part private_members_part.dart;
+class _Class extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
+  field core::int? _#_Class#_privateField1 = null;
+  field core::int? _#_Class#_privateField2 = null;
+  field core::bool _#_Class#_privateField2#isSet = false;
+  field core::int? _#_Class#_privateFinalField1 = null;
+  field core::int? _#_Class#_privateFinalField2 = null;
+  field core::bool _#_Class#_privateFinalField2#isSet = false;
+  synthetic constructor •() → self::_Class
+    : super core::Object::•()
+    ;
+  get _privateField1() → core::int
+    return let final core::int? #t1 = this.{self::_Class::_#_Class#_privateField1} in #t1.==(null) ?{core::int} this.{self::_Class::_#_Class#_privateField1} = 1 : #t1{core::int};
+  set _privateField1(core::int #t2) → void
+    this.{self::_Class::_#_Class#_privateField1} = #t2;
+  get _privateField2() → core::int? {
+    if(!this.{self::_Class::_#_Class#_privateField2#isSet}) {
+      this.{self::_Class::_#_Class#_privateField2} = 1;
+      this.{self::_Class::_#_Class#_privateField2#isSet} = true;
+    }
+    return this.{self::_Class::_#_Class#_privateField2};
+  }
+  set _privateField2(core::int? #t3) → void {
+    this.{self::_Class::_#_Class#_privateField2#isSet} = true;
+    this.{self::_Class::_#_Class#_privateField2} = #t3;
+  }
+  get _privateFinalField1() → core::int
+    return let final core::int? #t4 = this.{self::_Class::_#_Class#_privateFinalField1} in #t4.==(null) ?{core::int} this.{self::_Class::_#_Class#_privateFinalField1} = 1 : #t4{core::int};
+  set _privateFinalField1(core::int #t5) → void
+    this.{self::_Class::_#_Class#_privateFinalField1} = #t5;
+  get _privateFinalField2() → core::int? {
+    if(!this.{self::_Class::_#_Class#_privateFinalField2#isSet}) {
+      this.{self::_Class::_#_Class#_privateFinalField2} = 1;
+      this.{self::_Class::_#_Class#_privateFinalField2#isSet} = true;
+    }
+    return this.{self::_Class::_#_Class#_privateFinalField2};
+  }
+  set _privateFinalField2(core::int? #t6) → void {
+    this.{self::_Class::_#_Class#_privateFinalField2#isSet} = true;
+    this.{self::_Class::_#_Class#_privateFinalField2} = #t6;
+  }
+}
+extension _Extension on core::int { // from org-dartlang-testcase:///private_members_part.dart
+  static field _privateField1 = self::_#_Extension|_privateField1;
+  static get _privateField1 = get self::_Extension|_privateField1;
+  static set _privateField1 = set self::_Extension|_privateField1;
+  static field _privateField2 = self::_#_Extension|_privateField2;
+  static field _privateField2 = self::_#_Extension|_privateField2#isSet;
+  static get _privateField2 = get self::_Extension|_privateField2;
+  static set _privateField2 = set self::_Extension|_privateField2;
+  static field _privateFinalField1 = self::_#_Extension|_privateFinalField1;
+  static get _privateFinalField1 = get self::_Extension|_privateFinalField1;
+  static set _privateFinalField1 = set self::_Extension|_privateFinalField1;
+  static field _privateFinalField2 = self::_#_Extension|_privateFinalField2;
+  static field _privateFinalField2 = self::_#_Extension|_privateFinalField2#isSet;
+  static get _privateFinalField2 = get self::_Extension|_privateFinalField2;
+  static set _privateFinalField2 = set self::_Extension|_privateFinalField2;
+}
+static field core::int? _#_Extension|_privateField1 = null /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int? _#_Extension|_privateField2 = null /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::bool _#_Extension|_privateField2#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int? _#_Extension|_privateFinalField1 = null /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int? _#_Extension|_privateFinalField2 = null /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::bool _#_Extension|_privateFinalField2#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
+static method main() → dynamic {
+  self::_Class c = new self::_Class::•();
+  c.{self::_Class::_privateField1} = c.{self::_Class::_privateField1};
+  c.{self::_Class::_privateField2} = c.{self::_Class::_privateField2};
+  c.{self::_Class::_privateFinalField1};
+  c.{self::_Class::_privateFinalField2};
+  self::_Extension|_privateField1 = self::_Extension|_privateField1;
+  self::_Extension|_privateField2 = self::_Extension|_privateField2;
+  self::_Extension|_privateFinalField1;
+  self::_Extension|_privateFinalField2;
+}
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField1() → core::int
+  return let final core::int? #t7 = self::_#_Extension|_privateField1 in #t7.==(null) ?{core::int} self::_#_Extension|_privateField1 = 1 : #t7{core::int};
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField1(core::int #t8) → void
+  self::_#_Extension|_privateField1 = #t8;
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField2() → core::int? {
+  if(!self::_#_Extension|_privateField2#isSet) {
+    self::_#_Extension|_privateField2 = 1;
+    self::_#_Extension|_privateField2#isSet = true;
+  }
+  return self::_#_Extension|_privateField2;
+}
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField2(core::int? #t9) → void {
+  self::_#_Extension|_privateField2#isSet = true;
+  self::_#_Extension|_privateField2 = #t9;
+}
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField1() → core::int
+  return let final core::int? #t10 = self::_#_Extension|_privateFinalField1 in #t10.==(null) ?{core::int} self::_#_Extension|_privateFinalField1 = 1 : #t10{core::int};
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField1(core::int #t11) → void
+  self::_#_Extension|_privateFinalField1 = #t11;
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField2() → core::int? {
+  if(!self::_#_Extension|_privateFinalField2#isSet) {
+    self::_#_Extension|_privateFinalField2 = 1;
+    self::_#_Extension|_privateFinalField2#isSet = true;
+  }
+  return self::_#_Extension|_privateFinalField2;
+}
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField2(core::int? #t12) → void {
+  self::_#_Extension|_privateFinalField2#isSet = true;
+  self::_#_Extension|_privateFinalField2 = #t12;
+}
diff --git a/pkg/front_end/testcases/late_lowering/private_members.dart.textual_outline.expect b/pkg/front_end/testcases/late_lowering/private_members.dart.textual_outline.expect
new file mode 100644
index 0000000..058437c
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/private_members.dart.textual_outline.expect
@@ -0,0 +1,3 @@
+part 'private_members_part.dart';
+
+main() {}
diff --git a/pkg/front_end/testcases/late_lowering/private_members.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/late_lowering/private_members.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..058437c
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/private_members.dart.textual_outline_modelled.expect
@@ -0,0 +1,3 @@
+part 'private_members_part.dart';
+
+main() {}
diff --git a/pkg/front_end/testcases/late_lowering/private_members.dart.weak.expect b/pkg/front_end/testcases/late_lowering/private_members.dart.weak.expect
new file mode 100644
index 0000000..91b12c0
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/private_members.dart.weak.expect
@@ -0,0 +1,143 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+part private_members_part.dart;
+class _Class extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
+  field core::int? _#_Class#_privateField1 = null;
+  field core::bool _#_Class#_privateField1#isSet = false;
+  field core::int? _#_Class#_privateField2 = null;
+  field core::bool _#_Class#_privateField2#isSet = false;
+  field core::int? _#_Class#_privateFinalField1 = null;
+  field core::bool _#_Class#_privateFinalField1#isSet = false;
+  field core::int? _#_Class#_privateFinalField2 = null;
+  field core::bool _#_Class#_privateFinalField2#isSet = false;
+  synthetic constructor •() → self::_Class
+    : super core::Object::•()
+    ;
+  get _privateField1() → core::int {
+    if(!this.{self::_Class::_#_Class#_privateField1#isSet}) {
+      this.{self::_Class::_#_Class#_privateField1} = 1;
+      this.{self::_Class::_#_Class#_privateField1#isSet} = true;
+    }
+    return let final core::int? #t1 = this.{self::_Class::_#_Class#_privateField1} in #t1{core::int};
+  }
+  set _privateField1(core::int #t2) → void {
+    this.{self::_Class::_#_Class#_privateField1#isSet} = true;
+    this.{self::_Class::_#_Class#_privateField1} = #t2;
+  }
+  get _privateField2() → core::int? {
+    if(!this.{self::_Class::_#_Class#_privateField2#isSet}) {
+      this.{self::_Class::_#_Class#_privateField2} = 1;
+      this.{self::_Class::_#_Class#_privateField2#isSet} = true;
+    }
+    return this.{self::_Class::_#_Class#_privateField2};
+  }
+  set _privateField2(core::int? #t3) → void {
+    this.{self::_Class::_#_Class#_privateField2#isSet} = true;
+    this.{self::_Class::_#_Class#_privateField2} = #t3;
+  }
+  get _privateFinalField1() → core::int {
+    if(!this.{self::_Class::_#_Class#_privateFinalField1#isSet}) {
+      this.{self::_Class::_#_Class#_privateFinalField1} = 1;
+      this.{self::_Class::_#_Class#_privateFinalField1#isSet} = true;
+    }
+    return let final core::int? #t4 = this.{self::_Class::_#_Class#_privateFinalField1} in #t4{core::int};
+  }
+  set _privateFinalField1(core::int #t5) → void {
+    this.{self::_Class::_#_Class#_privateFinalField1#isSet} = true;
+    this.{self::_Class::_#_Class#_privateFinalField1} = #t5;
+  }
+  get _privateFinalField2() → core::int? {
+    if(!this.{self::_Class::_#_Class#_privateFinalField2#isSet}) {
+      this.{self::_Class::_#_Class#_privateFinalField2} = 1;
+      this.{self::_Class::_#_Class#_privateFinalField2#isSet} = true;
+    }
+    return this.{self::_Class::_#_Class#_privateFinalField2};
+  }
+  set _privateFinalField2(core::int? #t6) → void {
+    this.{self::_Class::_#_Class#_privateFinalField2#isSet} = true;
+    this.{self::_Class::_#_Class#_privateFinalField2} = #t6;
+  }
+}
+extension _Extension on core::int { // from org-dartlang-testcase:///private_members_part.dart
+  static field _privateField1 = self::_#_Extension|_privateField1;
+  static field _privateField1 = self::_#_Extension|_privateField1#isSet;
+  static get _privateField1 = get self::_Extension|_privateField1;
+  static set _privateField1 = set self::_Extension|_privateField1;
+  static field _privateField2 = self::_#_Extension|_privateField2;
+  static field _privateField2 = self::_#_Extension|_privateField2#isSet;
+  static get _privateField2 = get self::_Extension|_privateField2;
+  static set _privateField2 = set self::_Extension|_privateField2;
+  static field _privateFinalField1 = self::_#_Extension|_privateFinalField1;
+  static field _privateFinalField1 = self::_#_Extension|_privateFinalField1#isSet;
+  static get _privateFinalField1 = get self::_Extension|_privateFinalField1;
+  static set _privateFinalField1 = set self::_Extension|_privateFinalField1;
+  static field _privateFinalField2 = self::_#_Extension|_privateFinalField2;
+  static field _privateFinalField2 = self::_#_Extension|_privateFinalField2#isSet;
+  static get _privateFinalField2 = get self::_Extension|_privateFinalField2;
+  static set _privateFinalField2 = set self::_Extension|_privateFinalField2;
+}
+static field core::int? _#_Extension|_privateField1 = null /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::bool _#_Extension|_privateField1#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int? _#_Extension|_privateField2 = null /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::bool _#_Extension|_privateField2#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int? _#_Extension|_privateFinalField1 = null /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::bool _#_Extension|_privateFinalField1#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int? _#_Extension|_privateFinalField2 = null /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::bool _#_Extension|_privateFinalField2#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
+static method main() → dynamic {
+  self::_Class c = new self::_Class::•();
+  c.{self::_Class::_privateField1} = c.{self::_Class::_privateField1};
+  c.{self::_Class::_privateField2} = c.{self::_Class::_privateField2};
+  c.{self::_Class::_privateFinalField1};
+  c.{self::_Class::_privateFinalField2};
+  self::_Extension|_privateField1 = self::_Extension|_privateField1;
+  self::_Extension|_privateField2 = self::_Extension|_privateField2;
+  self::_Extension|_privateFinalField1;
+  self::_Extension|_privateFinalField2;
+}
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField1() → core::int {
+  if(!self::_#_Extension|_privateField1#isSet) {
+    self::_#_Extension|_privateField1 = 1;
+    self::_#_Extension|_privateField1#isSet = true;
+  }
+  return let final core::int? #t7 = self::_#_Extension|_privateField1 in #t7{core::int};
+}
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField1(core::int #t8) → void {
+  self::_#_Extension|_privateField1#isSet = true;
+  self::_#_Extension|_privateField1 = #t8;
+}
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField2() → core::int? {
+  if(!self::_#_Extension|_privateField2#isSet) {
+    self::_#_Extension|_privateField2 = 1;
+    self::_#_Extension|_privateField2#isSet = true;
+  }
+  return self::_#_Extension|_privateField2;
+}
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField2(core::int? #t9) → void {
+  self::_#_Extension|_privateField2#isSet = true;
+  self::_#_Extension|_privateField2 = #t9;
+}
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField1() → core::int {
+  if(!self::_#_Extension|_privateFinalField1#isSet) {
+    self::_#_Extension|_privateFinalField1 = 1;
+    self::_#_Extension|_privateFinalField1#isSet = true;
+  }
+  return let final core::int? #t10 = self::_#_Extension|_privateFinalField1 in #t10{core::int};
+}
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField1(core::int #t11) → void {
+  self::_#_Extension|_privateFinalField1#isSet = true;
+  self::_#_Extension|_privateFinalField1 = #t11;
+}
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField2() → core::int? {
+  if(!self::_#_Extension|_privateFinalField2#isSet) {
+    self::_#_Extension|_privateFinalField2 = 1;
+    self::_#_Extension|_privateFinalField2#isSet = true;
+  }
+  return self::_#_Extension|_privateFinalField2;
+}
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField2(core::int? #t12) → void {
+  self::_#_Extension|_privateFinalField2#isSet = true;
+  self::_#_Extension|_privateFinalField2 = #t12;
+}
diff --git a/pkg/front_end/testcases/late_lowering/private_members.dart.weak.outline.expect b/pkg/front_end/testcases/late_lowering/private_members.dart.weak.outline.expect
new file mode 100644
index 0000000..88c4850ad
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/private_members.dart.weak.outline.expect
@@ -0,0 +1,61 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+part private_members_part.dart;
+class _Class extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
+  field core::int? _#_Class#_privateField1;
+  field core::bool _#_Class#_privateField1#isSet;
+  field core::int? _#_Class#_privateField2;
+  field core::bool _#_Class#_privateField2#isSet;
+  field core::int? _#_Class#_privateFinalField1;
+  field core::bool _#_Class#_privateFinalField1#isSet;
+  field core::int? _#_Class#_privateFinalField2;
+  field core::bool _#_Class#_privateFinalField2#isSet;
+  synthetic constructor •() → self::_Class
+    ;
+  get _privateField1() → core::int;
+  set _privateField1(core::int #t1) → void;
+  get _privateField2() → core::int?;
+  set _privateField2(core::int? #t2) → void;
+  get _privateFinalField1() → core::int;
+  set _privateFinalField1(core::int #t3) → void;
+  get _privateFinalField2() → core::int?;
+  set _privateFinalField2(core::int? #t4) → void;
+}
+extension _Extension on core::int { // from org-dartlang-testcase:///private_members_part.dart
+  static field _privateField1 = self::_#_Extension|_privateField1;
+  static field _privateField1 = self::_#_Extension|_privateField1#isSet;
+  static get _privateField1 = get self::_Extension|_privateField1;
+  static set _privateField1 = set self::_Extension|_privateField1;
+  static field _privateField2 = self::_#_Extension|_privateField2;
+  static field _privateField2 = self::_#_Extension|_privateField2#isSet;
+  static get _privateField2 = get self::_Extension|_privateField2;
+  static set _privateField2 = set self::_Extension|_privateField2;
+  static field _privateFinalField1 = self::_#_Extension|_privateFinalField1;
+  static field _privateFinalField1 = self::_#_Extension|_privateFinalField1#isSet;
+  static get _privateFinalField1 = get self::_Extension|_privateFinalField1;
+  static set _privateFinalField1 = set self::_Extension|_privateFinalField1;
+  static field _privateFinalField2 = self::_#_Extension|_privateFinalField2;
+  static field _privateFinalField2 = self::_#_Extension|_privateFinalField2#isSet;
+  static get _privateFinalField2 = get self::_Extension|_privateFinalField2;
+  static set _privateFinalField2 = set self::_Extension|_privateFinalField2;
+}
+static field core::int? _#_Extension|_privateField1 /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::bool _#_Extension|_privateField1#isSet /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int? _#_Extension|_privateField2 /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::bool _#_Extension|_privateField2#isSet /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int? _#_Extension|_privateFinalField1 /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::bool _#_Extension|_privateFinalField1#isSet /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int? _#_Extension|_privateFinalField2 /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::bool _#_Extension|_privateFinalField2#isSet /* from org-dartlang-testcase:///private_members_part.dart */;
+static method main() → dynamic
+  ;
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField1() → core::int;
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField1(core::int #t5) → void;
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField2() → core::int?;
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField2(core::int? #t6) → void;
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField1() → core::int;
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField1(core::int #t7) → void;
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField2() → core::int?;
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField2(core::int? #t8) → void;
diff --git a/pkg/front_end/testcases/late_lowering/private_members.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/private_members.dart.weak.transformed.expect
new file mode 100644
index 0000000..91b12c0
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/private_members.dart.weak.transformed.expect
@@ -0,0 +1,143 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+part private_members_part.dart;
+class _Class extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
+  field core::int? _#_Class#_privateField1 = null;
+  field core::bool _#_Class#_privateField1#isSet = false;
+  field core::int? _#_Class#_privateField2 = null;
+  field core::bool _#_Class#_privateField2#isSet = false;
+  field core::int? _#_Class#_privateFinalField1 = null;
+  field core::bool _#_Class#_privateFinalField1#isSet = false;
+  field core::int? _#_Class#_privateFinalField2 = null;
+  field core::bool _#_Class#_privateFinalField2#isSet = false;
+  synthetic constructor •() → self::_Class
+    : super core::Object::•()
+    ;
+  get _privateField1() → core::int {
+    if(!this.{self::_Class::_#_Class#_privateField1#isSet}) {
+      this.{self::_Class::_#_Class#_privateField1} = 1;
+      this.{self::_Class::_#_Class#_privateField1#isSet} = true;
+    }
+    return let final core::int? #t1 = this.{self::_Class::_#_Class#_privateField1} in #t1{core::int};
+  }
+  set _privateField1(core::int #t2) → void {
+    this.{self::_Class::_#_Class#_privateField1#isSet} = true;
+    this.{self::_Class::_#_Class#_privateField1} = #t2;
+  }
+  get _privateField2() → core::int? {
+    if(!this.{self::_Class::_#_Class#_privateField2#isSet}) {
+      this.{self::_Class::_#_Class#_privateField2} = 1;
+      this.{self::_Class::_#_Class#_privateField2#isSet} = true;
+    }
+    return this.{self::_Class::_#_Class#_privateField2};
+  }
+  set _privateField2(core::int? #t3) → void {
+    this.{self::_Class::_#_Class#_privateField2#isSet} = true;
+    this.{self::_Class::_#_Class#_privateField2} = #t3;
+  }
+  get _privateFinalField1() → core::int {
+    if(!this.{self::_Class::_#_Class#_privateFinalField1#isSet}) {
+      this.{self::_Class::_#_Class#_privateFinalField1} = 1;
+      this.{self::_Class::_#_Class#_privateFinalField1#isSet} = true;
+    }
+    return let final core::int? #t4 = this.{self::_Class::_#_Class#_privateFinalField1} in #t4{core::int};
+  }
+  set _privateFinalField1(core::int #t5) → void {
+    this.{self::_Class::_#_Class#_privateFinalField1#isSet} = true;
+    this.{self::_Class::_#_Class#_privateFinalField1} = #t5;
+  }
+  get _privateFinalField2() → core::int? {
+    if(!this.{self::_Class::_#_Class#_privateFinalField2#isSet}) {
+      this.{self::_Class::_#_Class#_privateFinalField2} = 1;
+      this.{self::_Class::_#_Class#_privateFinalField2#isSet} = true;
+    }
+    return this.{self::_Class::_#_Class#_privateFinalField2};
+  }
+  set _privateFinalField2(core::int? #t6) → void {
+    this.{self::_Class::_#_Class#_privateFinalField2#isSet} = true;
+    this.{self::_Class::_#_Class#_privateFinalField2} = #t6;
+  }
+}
+extension _Extension on core::int { // from org-dartlang-testcase:///private_members_part.dart
+  static field _privateField1 = self::_#_Extension|_privateField1;
+  static field _privateField1 = self::_#_Extension|_privateField1#isSet;
+  static get _privateField1 = get self::_Extension|_privateField1;
+  static set _privateField1 = set self::_Extension|_privateField1;
+  static field _privateField2 = self::_#_Extension|_privateField2;
+  static field _privateField2 = self::_#_Extension|_privateField2#isSet;
+  static get _privateField2 = get self::_Extension|_privateField2;
+  static set _privateField2 = set self::_Extension|_privateField2;
+  static field _privateFinalField1 = self::_#_Extension|_privateFinalField1;
+  static field _privateFinalField1 = self::_#_Extension|_privateFinalField1#isSet;
+  static get _privateFinalField1 = get self::_Extension|_privateFinalField1;
+  static set _privateFinalField1 = set self::_Extension|_privateFinalField1;
+  static field _privateFinalField2 = self::_#_Extension|_privateFinalField2;
+  static field _privateFinalField2 = self::_#_Extension|_privateFinalField2#isSet;
+  static get _privateFinalField2 = get self::_Extension|_privateFinalField2;
+  static set _privateFinalField2 = set self::_Extension|_privateFinalField2;
+}
+static field core::int? _#_Extension|_privateField1 = null /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::bool _#_Extension|_privateField1#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int? _#_Extension|_privateField2 = null /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::bool _#_Extension|_privateField2#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int? _#_Extension|_privateFinalField1 = null /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::bool _#_Extension|_privateFinalField1#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int? _#_Extension|_privateFinalField2 = null /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::bool _#_Extension|_privateFinalField2#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
+static method main() → dynamic {
+  self::_Class c = new self::_Class::•();
+  c.{self::_Class::_privateField1} = c.{self::_Class::_privateField1};
+  c.{self::_Class::_privateField2} = c.{self::_Class::_privateField2};
+  c.{self::_Class::_privateFinalField1};
+  c.{self::_Class::_privateFinalField2};
+  self::_Extension|_privateField1 = self::_Extension|_privateField1;
+  self::_Extension|_privateField2 = self::_Extension|_privateField2;
+  self::_Extension|_privateFinalField1;
+  self::_Extension|_privateFinalField2;
+}
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField1() → core::int {
+  if(!self::_#_Extension|_privateField1#isSet) {
+    self::_#_Extension|_privateField1 = 1;
+    self::_#_Extension|_privateField1#isSet = true;
+  }
+  return let final core::int? #t7 = self::_#_Extension|_privateField1 in #t7{core::int};
+}
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField1(core::int #t8) → void {
+  self::_#_Extension|_privateField1#isSet = true;
+  self::_#_Extension|_privateField1 = #t8;
+}
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField2() → core::int? {
+  if(!self::_#_Extension|_privateField2#isSet) {
+    self::_#_Extension|_privateField2 = 1;
+    self::_#_Extension|_privateField2#isSet = true;
+  }
+  return self::_#_Extension|_privateField2;
+}
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField2(core::int? #t9) → void {
+  self::_#_Extension|_privateField2#isSet = true;
+  self::_#_Extension|_privateField2 = #t9;
+}
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField1() → core::int {
+  if(!self::_#_Extension|_privateFinalField1#isSet) {
+    self::_#_Extension|_privateFinalField1 = 1;
+    self::_#_Extension|_privateFinalField1#isSet = true;
+  }
+  return let final core::int? #t10 = self::_#_Extension|_privateFinalField1 in #t10{core::int};
+}
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField1(core::int #t11) → void {
+  self::_#_Extension|_privateFinalField1#isSet = true;
+  self::_#_Extension|_privateFinalField1 = #t11;
+}
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField2() → core::int? {
+  if(!self::_#_Extension|_privateFinalField2#isSet) {
+    self::_#_Extension|_privateFinalField2 = 1;
+    self::_#_Extension|_privateFinalField2#isSet = true;
+  }
+  return self::_#_Extension|_privateFinalField2;
+}
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField2(core::int? #t12) → void {
+  self::_#_Extension|_privateFinalField2#isSet = true;
+  self::_#_Extension|_privateFinalField2 = #t12;
+}
diff --git a/pkg/front_end/testcases/late_lowering/private_members_part.dart b/pkg/front_end/testcases/late_lowering/private_members_part.dart
new file mode 100644
index 0000000..d94c0e6
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/private_members_part.dart
@@ -0,0 +1,25 @@
+// 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.
+
+part of 'private_members.dart';
+
+class _Class {
+  late int _privateField1 = 1;
+
+  late int? _privateField2 = 1;
+
+  late int _privateFinalField1 = 1;
+
+  late int? _privateFinalField2 = 1;
+}
+
+extension _Extension on int {
+  static late int _privateField1 = 1;
+
+  static late int? _privateField2 = 1;
+
+  static late int _privateFinalField1 = 1;
+
+  static late int? _privateFinalField2 = 1;
+}
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index fde2440..a81d28f 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -1617,8 +1617,7 @@
   @override
   List<Expression> annotations = const <Expression>[];
 
-  // TODO(johnniwinther): Make this non-nullable.
-  Name? name;
+  Name name;
 
   /// The URI of the source file this member was loaded from.
   @override
@@ -1641,7 +1640,10 @@
   // TODO(asgerf): It might be worthwhile to put this on classes as well.
   int transformerFlags = 0;
 
-  Member(this.name, this.fileUri, Reference? reference) : super(reference);
+  Member(this.name, this.fileUri, Reference? reference)
+      // ignore: unnecessary_null_comparison
+      : assert(name != null),
+        super(reference);
 
   Class? get enclosingClass => parent is Class ? parent as Class : null;
   Library get enclosingLibrary =>
@@ -1751,7 +1753,7 @@
 
   Reference get getterReference => super.reference;
 
-  Field.mutable(Name? name,
+  Field.mutable(Name name,
       {this.type: const DynamicType(),
       this.initializer,
       bool isCovariant: false,
@@ -1775,7 +1777,7 @@
     this.transformerFlags = transformerFlags;
   }
 
-  Field.immutable(Name? name,
+  Field.immutable(Name name,
       {this.type: const DynamicType(),
       this.initializer,
       bool isCovariant: false,
@@ -1925,7 +1927,7 @@
   void visitChildren(Visitor v) {
     visitList(annotations, v);
     type.accept(v);
-    name?.accept(v);
+    name.accept(v);
     initializer?.accept(v);
   }
 
@@ -1993,7 +1995,7 @@
   List<Initializer> initializers;
 
   Constructor(this.function,
-      {Name? name,
+      {required Name name,
       bool isConst: false,
       bool isExternal: false,
       bool isSynthetic: false,
@@ -2078,7 +2080,7 @@
   @override
   void visitChildren(Visitor v) {
     visitList(annotations, v);
-    name?.accept(v);
+    name.accept(v);
     visitList(initializers, v);
     function?.accept(v);
   }
@@ -2166,7 +2168,7 @@
   List<VariableDeclaration> namedParameters;
 
   RedirectingFactoryConstructor(this.targetReference,
-      {Name? name,
+      {required Name name,
       bool isConst: false,
       bool isExternal: false,
       int transformerFlags: 0,
@@ -2263,7 +2265,7 @@
     visitList(annotations, v);
     target?.acceptReference(v);
     visitList(typeArguments, v);
-    name?.accept(v);
+    name.accept(v);
   }
 
   @override
@@ -2534,7 +2536,7 @@
   ProcedureStubKind stubKind;
   Reference? stubTargetReference;
 
-  Procedure(Name? name, ProcedureKind kind, FunctionNode? function,
+  Procedure(Name name, ProcedureKind kind, FunctionNode? function,
       {bool isAbstract: false,
       bool isStatic: false,
       bool isExternal: false,
@@ -2560,7 +2562,7 @@
             stubTargetReference:
                 getMemberReferenceBasedOnProcedureKind(stubTarget, kind));
 
-  Procedure._byReferenceRenamed(Name? name, this.kind, this.function,
+  Procedure._byReferenceRenamed(Name name, this.kind, this.function,
       {bool isAbstract: false,
       bool isStatic: false,
       bool isExternal: false,
@@ -2750,7 +2752,7 @@
   @override
   void visitChildren(Visitor v) {
     visitList(annotations, v);
-    name?.accept(v);
+    name.accept(v);
     function?.accept(v);
   }
 
@@ -6088,7 +6090,7 @@
   bool isConst;
 
   @override
-  Name get name => target.name!;
+  Name get name => target.name;
 
   StaticInvocation(Procedure target, Arguments arguments, {bool isConst: false})
       : this.byReference(
@@ -6175,7 +6177,7 @@
   bool isConst;
 
   @override
-  Name get name => target.name!;
+  Name get name => target.name;
 
   ConstructorInvocation(Constructor target, Arguments arguments,
       {bool isConst: false})
@@ -6263,9 +6265,9 @@
     }
     printer.writeClassName(target.enclosingClass.reference);
     printer.writeTypeArguments(arguments.types);
-    if (target.name!.text.isNotEmpty) {
+    if (target.name.text.isNotEmpty) {
       printer.write('.');
-      printer.write(target.name!.text);
+      printer.write(target.name.text);
     }
     printer.writeArguments(arguments, includeTypeArguments: false);
   }
@@ -13613,7 +13615,8 @@
 /// This is used as the removal sentinel in [RemovingTransformer] and can be
 /// used for instance as a dummy initial value for the `List.filled`
 /// constructor.
-final Constructor dummyConstructor = new Constructor(dummyFunctionNode);
+final Constructor dummyConstructor =
+    new Constructor(dummyFunctionNode, name: dummyName);
 
 /// Non-nullable [Extension] dummy value.
 ///
@@ -13649,7 +13652,7 @@
 /// used for instance as a dummy initial value for the `List.filled`
 /// constructor.
 final RedirectingFactoryConstructor dummyRedirectingFactoryConstructor =
-    new RedirectingFactoryConstructor(null);
+    new RedirectingFactoryConstructor(null, name: dummyName);
 
 /// Non-nullable [Typedef] dummy value.
 ///
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index 2172314..7c1de52 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -1443,19 +1443,19 @@
     if (alwaysCreateNewNamedNodes) {
       node = null;
     }
-    if (node == null) {
-      if (setterReference != null) {
-        node = new Field.mutable(null,
-            getterReference: getterReference, setterReference: setterReference);
-      } else {
-        node = new Field.immutable(null, getterReference: getterReference);
-      }
-    }
     Uri? fileUri = readUriReference();
     int fileOffset = readOffset();
     int fileEndOffset = readOffset();
     int flags = readUInt30();
     Name name = readName();
+    if (node == null) {
+      if (setterReference != null) {
+        node = new Field.mutable(name,
+            getterReference: getterReference, setterReference: setterReference);
+      } else {
+        node = new Field.immutable(name, getterReference: getterReference);
+      }
+    }
     List<Expression> annotations = readAnnotationList(node);
     assert(() {
       debugPath.add(name.text);
@@ -1487,15 +1487,15 @@
     if (alwaysCreateNewNamedNodes) {
       node = null;
     }
-    if (node == null) {
-      node = new Constructor(null, reference: reference);
-    }
     Uri? fileUri = readUriReference();
     int startFileOffset = readOffset();
     int fileOffset = readOffset();
     int fileEndOffset = readOffset();
     int flags = readByte();
     Name name = readName();
+    if (node == null) {
+      node = new Constructor(null, reference: reference, name: name);
+    }
     List<Expression> annotations = readAnnotationList(node);
     assert(() {
       debugPath.add(name.text);
@@ -1536,13 +1536,13 @@
     int kindIndex = readByte();
     ProcedureKind kind = ProcedureKind.values[kindIndex];
     ProcedureStubKind stubKind = ProcedureStubKind.values[readByte()];
+    int flags = readUInt30();
+    Name name = readName();
     if (node == null) {
-      node = new Procedure(null, kind, null, reference: reference);
+      node = new Procedure(name, kind, null, reference: reference);
     } else {
       assert(node.kind == kind);
     }
-    int flags = readUInt30();
-    Name name = readName();
     List<Expression> annotations = readAnnotationList(node);
     assert(() {
       debugPath.add(name.text);
@@ -1589,14 +1589,15 @@
     if (alwaysCreateNewNamedNodes) {
       node = null;
     }
-    if (node == null) {
-      node = new RedirectingFactoryConstructor(null, reference: reference);
-    }
     Uri? fileUri = readUriReference();
     int fileOffset = readOffset();
     int fileEndOffset = readOffset();
     int flags = readByte();
     Name name = readName();
+    if (node == null) {
+      node = new RedirectingFactoryConstructor(null,
+          reference: reference, name: name);
+    }
     List<Expression> annotations = readAnnotationList(node);
     assert(() {
       debugPath.add(name.text);
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index 33f0f3e..5652534 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -1192,8 +1192,6 @@
     _currentlyInNonimplementation = false;
   }
 
-  static final Name _emptyName = new Name('');
-
   @override
   void visitConstructor(Constructor node) {
     if (node.reference.canonicalName == null) {
@@ -1208,7 +1206,7 @@
     writeOffset(node.fileEndOffset);
 
     writeByte(node.flags);
-    writeName(node.name ?? _emptyName);
+    writeName(node.name);
 
     writeAnnotationList(node.annotations);
     assert(node.function!.typeParameters.isEmpty);
@@ -1272,7 +1270,7 @@
     writeByte(node.kind.index);
     writeByte(node.stubKind.index);
     writeUInt30(node.flags);
-    writeName(node.name ?? _emptyName);
+    writeName(node.name);
     writeAnnotationList(node.annotations);
     writeNullAllowedReference(node.stubTargetReference);
     writeOptionalFunctionNode(node.function);
@@ -1334,7 +1332,7 @@
     writeOffset(node.fileOffset);
     writeOffset(node.fileEndOffset);
     writeUInt30(node.flags);
-    writeName(node.name!);
+    writeName(node.name);
     writeAnnotationList(node.annotations);
     writeNode(node.type);
     writeOptionalNode(node.initializer);
@@ -1356,7 +1354,7 @@
     writeOffset(node.fileOffset);
     writeOffset(node.fileEndOffset);
     writeByte(node.flags);
-    writeName(node.name!);
+    writeName(node.name);
 
     writeAnnotationList(node.annotations);
     writeNonNullReference(node.targetReference!);
diff --git a/pkg/kernel/lib/canonical_name.dart b/pkg/kernel/lib/canonical_name.dart
index 086aa2a..21eb6b3 100644
--- a/pkg/kernel/lib/canonical_name.dart
+++ b/pkg/kernel/lib/canonical_name.dart
@@ -133,26 +133,26 @@
 
   CanonicalName getChildFromProcedure(Procedure procedure) {
     return getChild(getProcedureQualifier(procedure))
-        .getChildFromQualifiedName(procedure.name!);
+        .getChildFromQualifiedName(procedure.name);
   }
 
   CanonicalName getChildFromField(Field field) {
-    return getChild('@getters').getChildFromQualifiedName(field.name!);
+    return getChild('@getters').getChildFromQualifiedName(field.name);
   }
 
   CanonicalName getChildFromFieldSetter(Field field) {
-    return getChild('@setters').getChildFromQualifiedName(field.name!);
+    return getChild('@setters').getChildFromQualifiedName(field.name);
   }
 
   CanonicalName getChildFromConstructor(Constructor constructor) {
     return getChild('@constructors')
-        .getChildFromQualifiedName(constructor.name!);
+        .getChildFromQualifiedName(constructor.name);
   }
 
   CanonicalName getChildFromRedirectingFactoryConstructor(
       RedirectingFactoryConstructor redirectingFactoryConstructor) {
     return getChild('@factories')
-        .getChildFromQualifiedName(redirectingFactoryConstructor.name!);
+        .getChildFromQualifiedName(redirectingFactoryConstructor.name);
   }
 
   CanonicalName getChildFromFieldWithName(Name name) {
diff --git a/pkg/kernel/lib/class_hierarchy.dart b/pkg/kernel/lib/class_hierarchy.dart
index 0c6e3f3..09d259d 100644
--- a/pkg/kernel/lib/class_hierarchy.dart
+++ b/pkg/kernel/lib/class_hierarchy.dart
@@ -282,7 +282,7 @@
   /// [getDeclaredMembers] and [getInterfaceMembers].
   static int compareMembers(Member first, Member second) {
     if (first == second) return 0;
-    return compareNames(first.name!, second.name!);
+    return compareNames(first.name, second.name);
   }
 
   /// Compares names, using the same sort order as [getDeclaredMembers] and
@@ -328,7 +328,7 @@
     while (low <= high) {
       int mid = low + ((high - low) >> 1);
       Member pivot = members[mid];
-      int comparison = compareNames(name, pivot.name!);
+      int comparison = compareNames(name, pivot.name);
       if (comparison < 0) {
         high = mid - 1;
       } else if (comparison > 0) {
@@ -417,7 +417,7 @@
   Member? getSingleTargetForInterfaceInvocation(Member interfaceTarget,
       {bool setter: false}) {
     if (invalidated) throw "This data structure has been invalidated";
-    Name name = interfaceTarget.name!;
+    Name name = interfaceTarget.name;
     Member? target = null;
     ClassSet subtypes = getSubtypesOf(interfaceTarget.enclosingClass!);
     for (Class c in subtypes) {
@@ -1218,7 +1218,7 @@
           setters: setters)) {
         if (mixinMember is! Procedure ||
             (mixinMember is Procedure && !mixinMember.isSynthetic)) {
-          memberMap[mixinMember.name!] = mixinMember;
+          memberMap[mixinMember.name] = mixinMember;
         }
       }
     }
@@ -1227,21 +1227,21 @@
       if (procedure.isStatic) continue;
       if (procedure.kind == ProcedureKind.Setter) {
         if (setters) {
-          memberMap[procedure.name!] = procedure;
+          memberMap[procedure.name] = procedure;
         }
       } else {
         if (!setters) {
-          memberMap[procedure.name!] = procedure;
+          memberMap[procedure.name] = procedure;
         }
       }
     }
     for (Field field in classNode.fields) {
       if (field.isStatic) continue;
       if (!setters) {
-        memberMap[field.name!] = field;
+        memberMap[field.name] = field;
       }
       if (setters && field.hasSetter) {
-        memberMap[field.name!] = field;
+        memberMap[field.name] = field;
       }
     }
 
diff --git a/pkg/kernel/lib/library_index.dart b/pkg/kernel/lib/library_index.dart
index 99ea796..6ee654d 100644
--- a/pkg/kernel/lib/library_index.dart
+++ b/pkg/kernel/lib/library_index.dart
@@ -221,14 +221,14 @@
 
   String getDisambiguatedName(Member member) {
     if (member is Procedure) {
-      if (member.isGetter) return LibraryIndex.getterPrefix + member.name!.text;
-      if (member.isSetter) return LibraryIndex.setterPrefix + member.name!.text;
+      if (member.isGetter) return LibraryIndex.getterPrefix + member.name.text;
+      if (member.isSetter) return LibraryIndex.setterPrefix + member.name.text;
     }
-    return member.name!.text;
+    return member.name.text;
   }
 
   void _addMember(Member member) {
-    if (member.name!.isPrivate && member.name!.library != library) {
+    if (member.name.isPrivate && member.name.library != library) {
       // Members whose name is private to other libraries cannot currently
       // be found with the LibraryIndex class.
       return;
@@ -254,7 +254,7 @@
     final NamedNode? replacement = extensionMember.member.node;
     if (replacement is! Member) return;
     Member member = replacement;
-    if (member.name!.isPrivate && member.name!.library != library) {
+    if (member.name.isPrivate && member.name.library != library) {
       // Members whose name is private to other libraries cannot currently
       // be found with the LibraryIndex class.
       return;
diff --git a/pkg/kernel/lib/reference_from_index.dart b/pkg/kernel/lib/reference_from_index.dart
index bf89186..202c28a 100644
--- a/pkg/kernel/lib/reference_from_index.dart
+++ b/pkg/kernel/lib/reference_from_index.dart
@@ -46,7 +46,7 @@
   }
 
   void _addProcedure(Procedure procedure) {
-    Name name = procedure.name!;
+    Name name = procedure.name;
     if (procedure.isSetter) {
       assert(_setterReferences[name] == null);
       _setterReferences[name] = procedure.reference;
@@ -62,7 +62,7 @@
   void _addFields(List<Field> fields) {
     for (int i = 0; i < fields.length; i++) {
       Field field = fields[i];
-      Name name = field.name!;
+      Name name = field.name;
       assert(_getterReferences[name] == null);
       _getterReferences[name] = field.getterReference;
       if (field.hasSetter) {
@@ -116,12 +116,12 @@
   IndexedClass._(Class c, this.library) {
     for (int i = 0; i < c.constructors.length; i++) {
       Constructor constructor = c.constructors[i];
-      _constructors[constructor.name!] = constructor;
+      _constructors[constructor.name] = constructor;
     }
     for (int i = 0; i < c.procedures.length; i++) {
       Procedure procedure = c.procedures[i];
       if (procedure.isFactory) {
-        _constructors[procedure.name!] = procedure;
+        _constructors[procedure.name] = procedure;
       } else {
         _addProcedure(procedure);
       }
diff --git a/pkg/kernel/lib/src/text_util.dart b/pkg/kernel/lib/src/text_util.dart
index 3c0f523f..5871066 100644
--- a/pkg/kernel/lib/src/text_util.dart
+++ b/pkg/kernel/lib/src/text_util.dart
@@ -201,8 +201,7 @@
 }
 
 String memberNameToString(Member node) {
-  return node.name?.text ??
-      "null-named member ${node.runtimeType} ${node.hashCode}";
+  return node.name.text;
 }
 
 String qualifiedTypeParameterNameToString(TypeParameter node,
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index 0718f76..3565196 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -120,7 +120,7 @@
 }
 
 String debugMemberName(Member node) {
-  return node.name?.text ?? globalDebuggingNames.nameMember(node);
+  return node.name.text;
 }
 
 String debugQualifiedMemberName(Member node) {
@@ -367,8 +367,9 @@
   static final Name emptyName = new Name(emptyNameString);
 
   Name getMemberName(Member node) {
-    if (node.name?.text == '') return emptyName;
-    if (node.name != null) return node.name!;
+    if (node.name.text == '') return emptyName;
+    // ignore: unnecessary_null_comparison
+    if (node.name != null) return node.name;
     return new Name(syntheticNames.nameMember(node));
   }
 
@@ -514,11 +515,11 @@
       } else if (node is Field) {
         Library nodeLibrary = node.enclosingLibrary;
         String prefix = syntheticNames.nameLibraryPrefix(nodeLibrary);
-        write(prefix + '::' + node.name!.text);
+        write(prefix + '::' + node.name.text);
       } else if (node is Procedure) {
         Library nodeLibrary = node.enclosingLibrary;
         String prefix = syntheticNames.nameLibraryPrefix(nodeLibrary);
-        write(prefix + '::' + node.name!.text);
+        write(prefix + '::' + node.name.text);
       } else if (node is Typedef) {
         Library nodeLibrary = node.enclosingLibrary;
         String prefix = syntheticNames.nameLibraryPrefix(nodeLibrary);
@@ -1251,8 +1252,9 @@
     writeModifier(node.isConst, 'const');
     writeWord('redirecting_factory');
 
+    // ignore: unnecessary_null_comparison
     if (node.name != null) {
-      writeName(node.name!);
+      writeName(node.name);
     }
     writeTypeParameterList(node.typeParameters);
     writeParameterList(node.positionalParameters, node.namedParameters,
@@ -1655,7 +1657,7 @@
       if (!first) {
         writeComma();
       }
-      writeWord('${fieldRef.asField.name!.text}');
+      writeWord('${fieldRef.asField.name.text}');
       writeSymbol(':');
       writeExpression(value);
       first = false;
@@ -2635,7 +2637,7 @@
     writeList(node.fieldValues.entries,
         (core.MapEntry<Reference, Constant> entry) {
       if (entry.key.node != null) {
-        writeWord('${entry.key.asField.name!.text}');
+        writeWord('${entry.key.asField.name.text}');
       } else {
         writeWord('${entry.key.canonicalName!.name}');
       }
diff --git a/pkg/kernel/lib/text/text_serializer.dart b/pkg/kernel/lib/text/text_serializer.dart
index 86e8127..0899fe8 100644
--- a/pkg/kernel/lib/text/text_serializer.dart
+++ b/pkg/kernel/lib/text/text_serializer.dart
@@ -1967,7 +1967,7 @@
 
 TextSerializer<Field> mutableFieldSerializer =
     Wrapped<Tuple4<Name, int, DartType, Expression?>, Field>(
-        (w) => Tuple4(w.name!, w.flags, w.type, w.initializer),
+        (w) => Tuple4(w.name, w.flags, w.type, w.initializer),
         (u) => Field.mutable(u.first, type: u.third, initializer: u.fourth)
           ..flags = u.second,
         Tuple4Serializer(nameSerializer, fieldFlagsSerializer,
@@ -1975,7 +1975,7 @@
 
 TextSerializer<Field> immutableFieldSerializer =
     Wrapped<Tuple4<Name, int, DartType, Expression?>, Field>(
-        (w) => Tuple4(w.name!, w.flags, w.type, w.initializer),
+        (w) => Tuple4(w.name, w.flags, w.type, w.initializer),
         (u) => Field.immutable(u.first, type: u.third, initializer: u.fourth)
           ..flags = u.second,
         Tuple4Serializer(nameSerializer, fieldFlagsSerializer,
@@ -1983,7 +1983,7 @@
 
 TextSerializer<Procedure> methodSerializer =
     Wrapped<Tuple3<Name, int, FunctionNode>, Procedure>(
-        (w) => Tuple3(w.name!, w.flags, w.function!),
+        (w) => Tuple3(w.name, w.flags, w.function!),
         (u) =>
             Procedure(u.first, ProcedureKind.Method, u.third)..flags = u.second,
         Tuple3Serializer(
@@ -1991,7 +1991,7 @@
 
 TextSerializer<Procedure> getterSerializer =
     Wrapped<Tuple3<Name, int, FunctionNode>, Procedure>(
-        (w) => Tuple3(w.name!, w.flags, w.function!),
+        (w) => Tuple3(w.name, w.flags, w.function!),
         (u) =>
             Procedure(u.first, ProcedureKind.Getter, u.third)..flags = u.second,
         Tuple3Serializer(
@@ -1999,7 +1999,7 @@
 
 TextSerializer<Procedure> setterSerializer =
     Wrapped<Tuple3<Name, int, FunctionNode>, Procedure>(
-        (w) => Tuple3(w.name!, w.flags, w.function!),
+        (w) => Tuple3(w.name, w.flags, w.function!),
         (u) =>
             Procedure(u.first, ProcedureKind.Setter, u.third)..flags = u.second,
         Tuple3Serializer(
@@ -2007,7 +2007,7 @@
 
 TextSerializer<Procedure> operatorSerializer =
     Wrapped<Tuple3<Name, int, FunctionNode>, Procedure>(
-        (w) => Tuple3(w.name!, w.flags, w.function!),
+        (w) => Tuple3(w.name, w.flags, w.function!),
         (u) => Procedure(u.first, ProcedureKind.Operator, u.third)
           ..flags = u.second,
         Tuple3Serializer(
@@ -2015,7 +2015,7 @@
 
 TextSerializer<Procedure> factorySerializer =
     Wrapped<Tuple3<Name, int, FunctionNode>, Procedure>(
-        (w) => Tuple3(w.name!, w.flags, w.function!),
+        (w) => Tuple3(w.name, w.flags, w.function!),
         (u) => Procedure(u.first, ProcedureKind.Factory, u.third)
           ..flags = u.second,
         Tuple3Serializer(
@@ -2024,7 +2024,7 @@
 TextSerializer<Constructor> constructorSerializer = Wrapped<
         Tuple3<Name, int, Tuple2<FunctionNode, List<Initializer>?>>,
         Constructor>(
-    (w) => Tuple3(w.name!, w.flags, Tuple2(w.function!, w.initializers)),
+    (w) => Tuple3(w.name, w.flags, Tuple2(w.function!, w.initializers)),
     (u) =>
         Constructor(u.third.first, name: u.first, initializers: u.third.second)
           ..flags = u.second,
@@ -2043,7 +2043,7 @@
                         List<VariableDeclaration>, List<DartType>>>>,
             RedirectingFactoryConstructor>(
         (w) => Tuple4(
-            w.name!,
+            w.name,
             w.flags,
             w.targetReference!.canonicalName!,
             Tuple2(
diff --git a/pkg/kernel/lib/transformations/mixin_full_resolution.dart b/pkg/kernel/lib/transformations/mixin_full_resolution.dart
index c808cf3..b1a72a8 100644
--- a/pkg/kernel/lib/transformations/mixin_full_resolution.dart
+++ b/pkg/kernel/lib/transformations/mixin_full_resolution.dart
@@ -113,17 +113,17 @@
       var setters = <Name, Procedure>{};
       for (var procedure in class_.procedures) {
         if (procedure.isSetter) {
-          setters[procedure.name!] = procedure;
+          setters[procedure.name] = procedure;
         } else {
-          nonSetters[procedure.name!] = procedure;
+          nonSetters[procedure.name] = procedure;
         }
       }
 
       for (var field in class_.mixin.fields) {
         Reference? getterReference =
-            indexedClass?.lookupGetterReference(field.name!);
+            indexedClass?.lookupGetterReference(field.name);
         Reference? setterReference =
-            indexedClass?.lookupSetterReference(field.name!);
+            indexedClass?.lookupSetterReference(field.name);
         if (getterReference == null) {
           getterReference = nonSetters[field.name]?.reference;
           getterReference?.canonicalName?.unbind();
@@ -134,7 +134,7 @@
         }
         Field clone =
             cloner.cloneField(field, getterReference, setterReference);
-        Procedure? setter = setters[field.name!];
+        Procedure? setter = setters[field.name];
         if (setter != null) {
           setters.remove(field.name);
           VariableDeclaration parameter =
@@ -169,9 +169,9 @@
 
       Reference? reference;
       if (procedure.isSetter) {
-        reference = indexedClass?.lookupSetterReference(procedure.name!);
+        reference = indexedClass?.lookupSetterReference(procedure.name);
       } else {
-        reference = indexedClass?.lookupGetterReference(procedure.name!);
+        reference = indexedClass?.lookupGetterReference(procedure.name);
       }
 
       // Linear search for a forwarding stub with the same name.
diff --git a/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart b/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart
index 2d301ed..7e81c8d 100644
--- a/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart
+++ b/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart
@@ -369,7 +369,7 @@
   void _transformClassImplementingWidget(
       Class clazz, ChangedStructureNotifier? changedStructureNotifier) {
     if (clazz.fields
-        .any((Field field) => field.name!.text == _locationFieldName)) {
+        .any((Field field) => field.name.text == _locationFieldName)) {
       // This class has already been transformed. Skip
       return;
     }
diff --git a/pkg/kernel/lib/type_environment.dart b/pkg/kernel/lib/type_environment.dart
index c8789ae..f0b4795 100644
--- a/pkg/kernel/lib/type_environment.dart
+++ b/pkg/kernel/lib/type_environment.dart
@@ -152,7 +152,7 @@
       if (class_ == coreTypes.intClass ||
           class_ == coreTypes.numClass ||
           class_ == coreTypes.doubleClass) {
-        String name = member.name!.text;
+        String name = member.name.text;
         return name == '+' ||
             name == '-' ||
             name == '*' ||
@@ -162,7 +162,7 @@
     } else {
       Class? class_ = member.enclosingClass;
       if (class_ == coreTypes.intClass || class_ == coreTypes.numClass) {
-        String name = member.name!.text;
+        String name = member.name.text;
         return name == '+' ||
             name == '-' ||
             name == '*' ||
@@ -180,7 +180,7 @@
     if (isNonNullableByDefault) {
       Class? class_ = member.enclosingClass;
       if (class_ == coreTypes.intClass || class_ == coreTypes.numClass) {
-        String name = member.name!.text;
+        String name = member.name.text;
         return name == 'clamp';
       }
     }
diff --git a/pkg/kernel/lib/verifier.dart b/pkg/kernel/lib/verifier.dart
index 4ecf6ce..a263a04 100644
--- a/pkg/kernel/lib/verifier.dart
+++ b/pkg/kernel/lib/verifier.dart
@@ -283,11 +283,11 @@
     TreeNode? oldParent = enterParent(node);
     bool isTopLevel = node.parent == currentLibrary;
     if (isTopLevel && !node.isStatic) {
-      problem(node, "The top-level field '${node.name!.text}' should be static",
+      problem(node, "The top-level field '${node.name.text}' should be static",
           context: node);
     }
     if (node.isConst && !node.isStatic) {
-      problem(node, "The const field '${node.name!.text}' should be static",
+      problem(node, "The const field '${node.name.text}' should be static",
           context: node);
     }
     bool isImmutable = node.isLate
@@ -296,7 +296,7 @@
     if (isImmutable == node.hasSetter) {
       if (node.hasSetter) {
         problem(node,
-            "The immutable field '${node.name!.text}' has a setter reference",
+            "The immutable field '${node.name.text}' has a setter reference",
             context: node);
       } else {
         if (isOutline && node.isLate) {
@@ -306,7 +306,7 @@
           // whether it has an initializer or not.
         } else {
           problem(node,
-              "The mutable field '${node.name!.text}' has no setter reference",
+              "The mutable field '${node.name.text}' has no setter reference",
               context: node);
         }
       }
diff --git a/tests/co19/co19-co19.status b/tests/co19/co19-co19.status
index d66d5fd..1bd0386 100644
--- a/tests/co19/co19-co19.status
+++ b/tests/co19/co19-co19.status
@@ -2,5 +2,4 @@
 # 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.
 
-LibTest/ffi/Array/PointerArray_A01_t01: Skip # https://github.com/dart-lang/co19/issues/1018
 LibTest/io/RawDatagramSocket/*: Skip # https://github.com/dart-lang/co19/issues/195
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index cab4c50..0097562 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -8,7 +8,7 @@
 Language/Expressions/Constants/literal_number_t01: SkipByDesign # uses integer literal not representable as JavaScript number
 Language/Expressions/Constants/math_operators_t01: SkipByDesign # uses integer literal not representable as JavaScript number
 Language/Expressions/Constants/math_operators_t06: SkipByDesign # uses integer literal not representable as JavaScript number
-Language/Expressions/Null/instance_of_class_null_t01: Skip # dart:mirrors not supported https://github.com/dart-lang/co19/issues/522.
+Language/Expressions/Null/instance_of_class_null_t01: SkipByDesign # dart:mirrors not supported https://github.com/dart-lang/co19/issues/522.
 Language/Expressions/Numbers/integer_size_t03: SkipByDesign # uses integer literal not representable as JavaScript number
 Language/Expressions/Numbers/static_type_of_int_t01: SkipByDesign # uses integer literal not representable as JavaScript number
 Language/Expressions/Numbers/syntax_t06: SkipByDesign # uses integer literal not representable as JavaScript number
@@ -16,13 +16,13 @@
 Language/Expressions/Object_Identity/object_t02: SkipByDesign # https://github.com/dart-lang/sdk/issues/42222#issuecomment-640431711
 Language/Expressions/Shift/integer_t06: SkipByDesign # uses integer literal not representable as JavaScript number
 Language/Expressions/Shift/integer_t07: SkipByDesign # uses integer literal not representable as JavaScript number
-Language/Expressions/Spawning_an_Isolate/new_isolate_t01: SkipByDesign
+Language/Expressions/Spawning_an_Isolate/new_isolate_t01: SkipByDesign # dart:isolate not supported.
 Language/Functions/External_Functions/not_connected_to_a_body_t01: SkipByDesign # Non-JS-interop external members are not supported
 Language/Libraries_and_Scripts/Scripts/main_optional_parameters_t01: SkipByDesign # https://github.com/dart-lang/co19/issues/952
 Language/Libraries_and_Scripts/Scripts/main_optional_parameters_t03: SkipByDesign # https://github.com/dart-lang/co19/issues/952
 Language/Libraries_and_Scripts/Scripts/top_level_syntax_t01: SkipByDesign # Non-JS-interop external members are not supported
 Language/Libraries_and_Scripts/top_level_syntax_t01: SkipByDesign # Non-JS-interop external members are not supported
-Language/Metadata/before*: Skip # dart:mirrors not supported https://github.com/dart-lang/co19/issues/523.
+Language/Metadata/before*: SkipByDesign # dart:mirrors not supported https://github.com/dart-lang/co19/issues/523.
 Language/Metadata/syntax_t10: SkipByDesign # dart:mirrors is not supported
 Language/Reference/Operator_Precedence/precedence_15_unary_prefix_t08: SkipByDesign # binary '~' produces different results in JavaScript and Dart
 LanguageFeatures/Abstract-external-fields/static_analysis_external_A01_t01: SkipByDesign # Non-JS-interop external members are not supported
@@ -51,7 +51,7 @@
 LibTest/core/DateTime/to8601String_A01_t03: SkipByDesign # microseconds are not supported in JavaScript
 LibTest/core/int/operator_remainder_A01_t03: SkipByDesign # Division by zero is not an error in JavaScript
 LibTest/core/int/operator_truncating_division_A01_t02: SkipByDesign # Division by zero is not an error in JavaScript
-LibTest/core/int/parse_A01_t02: SkipByDesign # big integers cannot be represented in JavaScript
+LibTest/core/int/parse_A01_t02: SkipByDesign # uses integer literal not representable as JavaScript number
 LibTest/core/int/remainder_A01_t03: SkipByDesign # Division by zero is not an error in JavaScript
 LibTest/ffi/*: SkipByDesign # dart:ffi is not supported
 LibTest/html/HttpRequest/responseText_A01_t02: Skip # https://github.com/dart-lang/co19/issues/932
@@ -60,21 +60,21 @@
 LibTest/isolate/*: SkipByDesign # dart:isolate not supported.
 LibTest/mirrors/*: SkipByDesign # dart:mirrors is not supported
 LibTest/typed_data/ByteBuffer/*: SkipByDesign # not supported on the web
-LibTest/typed_data/ByteData/getInt64_A01_t01: Skip # Big integers cannot be represented in JS
-LibTest/typed_data/ByteData/getInt64_A02_t01: Skip # Int64 accessor not supported by dart2js
-LibTest/typed_data/ByteData/getInt64_A02_t02: Skip # Int64 accessor not supported by dart2js
-LibTest/typed_data/ByteData/getUint64_A01_t01: Skip # Big integers cannot be represented in JS
-LibTest/typed_data/ByteData/getUint64_A02_t01: Skip # Int64 accessor not supported by dart2js
-LibTest/typed_data/ByteData/getUint64_A02_t02: Skip # Int64 accessor not supported by dart2js
-LibTest/typed_data/ByteData/setInt64_A01_t01: Skip # Big integers cannot be represented in JS
-LibTest/typed_data/ByteData/setInt64_A02_t01: Skip # Int64 accessor not supported by dart2js
-LibTest/typed_data/ByteData/setInt64_A02_t02: Skip # Int64 accessor not supported by dart2js
-LibTest/typed_data/ByteData/setUint64_A01_t01: Skip # Big integers cannot be represented in JS
-LibTest/typed_data/ByteData/setUint64_A02_t01: Skip # Uint64 accessor not supported by dart2js
-LibTest/typed_data/ByteData/setUint64_A02_t02: Skip # Uint64 accessor not supported by dart2js
-LibTest/typed_data/Int32x4/operator_OR_A01_t01: Skip # Bitwise operations in JS are unsigned.
-LibTest/typed_data/Int32x4List/join_A01_t01: Skip # Differen string represrntation on VM and in JS
-LibTest/typed_data/Int32x4List/join_A01_t02: Skip # Differen string represrntation on VM and in JS
+LibTest/typed_data/ByteData/getInt64_A01_t01: SkipByDesign # uses integer literal not representable as JavaScript number
+LibTest/typed_data/ByteData/getInt64_A02_t01: SkipByDesign # Int64 accessor not supported by dart2js
+LibTest/typed_data/ByteData/getInt64_A02_t02: SkipByDesign # Int64 accessor not supported by dart2js
+LibTest/typed_data/ByteData/getUint64_A01_t01: SkipByDesign # uses integer literal not representable as JavaScript number
+LibTest/typed_data/ByteData/getUint64_A02_t01: SkipByDesign # Int64 accessor not supported by dart2js
+LibTest/typed_data/ByteData/getUint64_A02_t02: SkipByDesign # Int64 accessor not supported by dart2js
+LibTest/typed_data/ByteData/setInt64_A01_t01: SkipByDesign # uses integer literal not representable as JavaScript number
+LibTest/typed_data/ByteData/setInt64_A02_t01: SkipByDesign # Int64 accessor not supported by dart2js
+LibTest/typed_data/ByteData/setInt64_A02_t02: SkipByDesign # Int64 accessor not supported by dart2js
+LibTest/typed_data/ByteData/setUint64_A01_t01: SkipByDesign # uses integer literal not representable as JavaScript number
+LibTest/typed_data/ByteData/setUint64_A02_t01: SkipByDesign # Uint64 accessor not supported by dart2js
+LibTest/typed_data/ByteData/setUint64_A02_t02: SkipByDesign # Uint64 accessor not supported by dart2js
+LibTest/typed_data/Int32x4/operator_OR_A01_t01: SkipByDesign # Bitwise operations in JS are unsigned.
+LibTest/typed_data/Int32x4List/join_A01_t01: SkipByDesign # Different string represrntation on VM and in JS
+LibTest/typed_data/Int32x4List/join_A01_t02: SkipByDesign # Different string represrntation on VM and in JS
 LibTest/typed_data/Int64List/*: SkipByDesign # Int64List not supported on the web
 LibTest/typed_data/Uint64List/*: SkipByDesign # Uint64List not supported on the web
 
diff --git a/tests/co19/co19-dartdevc.status b/tests/co19/co19-dartdevc.status
index f326b5f..d97af6e 100644
--- a/tests/co19/co19-dartdevc.status
+++ b/tests/co19/co19-dartdevc.status
@@ -3,63 +3,63 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $compiler == dartdevc || $compiler == dartdevk ]
-Language/Classes/Constructors/Generative_Constructors/formal_parameter_t07: Skip # Times out
-Language/Classes/Constructors/Generative_Constructors/fresh_instance_t01: Skip # Times out
-Language/Classes/Constructors/Generative_Constructors/implicit_superinitializer_t01: Skip # Times out
-Language/Classes/Constructors/Generative_Constructors/implicit_superinitializer_t02: Skip # Times out
-Language/Classes/Constructors/Generative_Constructors/initializers_t01: Skip # Times out
-Language/Classes/Constructors/Generative_Constructors/initializers_t15: Skip # Times out
-Language/Classes/Constructors/Generative_Constructors/initializing_formals_execution_t01: Skip # Times out
-Language/Classes/Constructors/Generative_Constructors/initializing_this_t01: Skip # Times out
-Language/Classes/Constructors/Generative_Constructors/redirection_t01: Skip # Times out
-Language/Classes/Constructors/Generative_Constructors/syntax_t01: Skip # Times out
-Language/Classes/Constructors/implicit_constructor_t01: Skip # Times out
-Language/Classes/Constructors/implicit_constructor_t02: Skip # Times out
-Language/Classes/Constructors/name_t01: Skip # Times out
-Language/Classes/Constructors/name_t02: Skip # Times out
-Language/Classes/Constructors/name_t03: Skip # Times out
-Language/Classes/Getters/instance_getter_t01: Skip # Times out
-Language/Classes/Getters/instance_getter_t02: Skip # Times out
-Language/Classes/Getters/instance_getter_t03: Skip # Times out
-Language/Classes/Getters/instance_getter_t04: Skip # Times out
-Language/Classes/Getters/instance_getter_t05: Skip # Times out
-Language/Classes/Getters/instance_getter_t06: Skip # Times out
-Language/Classes/Getters/override_t04: Skip # Times out
-Language/Classes/Getters/return_type_t01: Skip # Times out
-Language/Classes/Getters/static_t01/none: Skip # Times out
-Language/Classes/Getters/static_t02: Skip # Times out
-Language/Classes/Getters/syntax_t01: Skip # Times out
-Language/Classes/Getters/void_return_type_t01: Skip # Times out
-Language/Classes/Instance_Methods/Operators/allowed_names_t01: Skip # Times out
-Language/Classes/Instance_Methods/Operators/arity_0_or_1_t01: Skip # Times out
-Language/Classes/Instance_Methods/Operators/arity_0_t01: Skip # Times out
-Language/Classes/Instance_Methods/Operators/syntax_t01: Skip # Times out
-Language/Classes/Instance_Methods/Operators/syntax_t03: Skip # Times out
-Language/Classes/Instance_Methods/override_named_parameters_t03: Skip # Times out
-Language/Classes/Instance_Methods/override_named_parameters_t04: Skip # Times out
-Language/Classes/Instance_Methods/override_named_parameters_t06: Skip # Times out
-Language/Classes/Instance_Methods/override_subtype_t05: Skip # Times out
-Language/Classes/Instance_Methods/override_subtype_t06: Skip # Times out
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t01: Skip # Times out
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t02: Skip # Times out
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t04: Skip # Times out
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t05: Skip # Times out
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t06: Skip # Times out
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t07: Skip # Times out
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t08: Skip # Times out
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t09: Skip # Times out
-Language/Classes/Instance_Variables/definition_t01: Skip # Times out
-Language/Classes/Instance_Variables/definition_t02: Skip # Times out
-Language/Classes/Instance_Variables/definition_t04: Skip # Times out
-Language/Classes/Setters/instance_setter_t01: Skip # Times out
+Language/Classes/Constructors/Generative_Constructors/formal_parameter_t07: SkipSlow
+Language/Classes/Constructors/Generative_Constructors/fresh_instance_t01: SkipSlow
+Language/Classes/Constructors/Generative_Constructors/implicit_superinitializer_t01: SkipSlow
+Language/Classes/Constructors/Generative_Constructors/implicit_superinitializer_t02: SkipSlow
+Language/Classes/Constructors/Generative_Constructors/initializers_t01: SkipSlow
+Language/Classes/Constructors/Generative_Constructors/initializers_t15: SkipSlow
+Language/Classes/Constructors/Generative_Constructors/initializing_formals_execution_t01: SkipSlow
+Language/Classes/Constructors/Generative_Constructors/initializing_this_t01: SkipSlow
+Language/Classes/Constructors/Generative_Constructors/redirection_t01: SkipSlow
+Language/Classes/Constructors/Generative_Constructors/syntax_t01: SkipSlow
+Language/Classes/Constructors/implicit_constructor_t01: SkipSlow
+Language/Classes/Constructors/implicit_constructor_t02: SkipSlow
+Language/Classes/Constructors/name_t01: SkipSlow
+Language/Classes/Constructors/name_t02: SkipSlow
+Language/Classes/Constructors/name_t03: SkipSlow
+Language/Classes/Getters/instance_getter_t01: SkipSlow
+Language/Classes/Getters/instance_getter_t02: SkipSlow
+Language/Classes/Getters/instance_getter_t03: SkipSlow
+Language/Classes/Getters/instance_getter_t04: SkipSlow
+Language/Classes/Getters/instance_getter_t05: SkipSlow
+Language/Classes/Getters/instance_getter_t06: SkipSlow
+Language/Classes/Getters/override_t04: SkipSlow
+Language/Classes/Getters/return_type_t01: SkipSlow
+Language/Classes/Getters/static_t01/none: SkipSlow
+Language/Classes/Getters/static_t02: SkipSlow
+Language/Classes/Getters/syntax_t01: SkipSlow
+Language/Classes/Getters/void_return_type_t01: SkipSlow
+Language/Classes/Instance_Methods/Operators/allowed_names_t01: SkipSlow
+Language/Classes/Instance_Methods/Operators/arity_0_or_1_t01: SkipSlow
+Language/Classes/Instance_Methods/Operators/arity_0_t01: SkipSlow
+Language/Classes/Instance_Methods/Operators/syntax_t01: SkipSlow
+Language/Classes/Instance_Methods/Operators/syntax_t03: SkipSlow
+Language/Classes/Instance_Methods/override_named_parameters_t03: SkipSlow
+Language/Classes/Instance_Methods/override_named_parameters_t04: SkipSlow
+Language/Classes/Instance_Methods/override_named_parameters_t06: SkipSlow
+Language/Classes/Instance_Methods/override_subtype_t05: SkipSlow
+Language/Classes/Instance_Methods/override_subtype_t06: SkipSlow
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t01: SkipSlow
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t02: SkipSlow
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t04: SkipSlow
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t05: SkipSlow
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t06: SkipSlow
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t07: SkipSlow
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t08: SkipSlow
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t09: SkipSlow
+Language/Classes/Instance_Variables/definition_t01: SkipSlow
+Language/Classes/Instance_Variables/definition_t02: SkipSlow
+Language/Classes/Instance_Variables/definition_t04: SkipSlow
+Language/Classes/Setters/instance_setter_t01: SkipSlow
 Language/Expressions/Constants/integer_size_t03: SkipByDesign # uses integer literal not representable as JavaScript number
 Language/Expressions/Constants/integer_size_t04: SkipByDesign # uses integer literal not representable as JavaScript number
 Language/Expressions/Constants/literal_number_t01: SkipByDesign # uses integer literal not representable as JavaScript number
 Language/Expressions/Constants/math_operators_t01: SkipByDesign # uses integer literal not representable as JavaScript number
 Language/Expressions/Constants/math_operators_t06: SkipByDesign # uses integer literal not representable as JavaScript number
-Language/Expressions/Function_Invocation/async_generator_invokation_t08: Skip # Times out
-Language/Expressions/Function_Invocation/async_generator_invokation_t10: Skip # Times out
-Language/Expressions/Null/instance_of_class_null_t01: Skip # dart:mirrors not supported https://github.com/dart-lang/co19/issues/522.
+Language/Expressions/Function_Invocation/async_generator_invokation_t08: SkipSlow
+Language/Expressions/Function_Invocation/async_generator_invokation_t10: SkipSlow
+Language/Expressions/Null/instance_of_class_null_t01: SkipByDesign # dart:mirrors not supported https://github.com/dart-lang/co19/issues/522
 Language/Expressions/Numbers/integer_size_t03: SkipByDesign # uses integer literal not representable as JavaScript number
 Language/Expressions/Numbers/static_type_of_int_t01: SkipByDesign # uses integer literal not representable as JavaScript number
 Language/Expressions/Numbers/syntax_t06: SkipByDesign # uses integer literal not representable as JavaScript number
@@ -71,11 +71,11 @@
 Language/Functions/External_Functions/not_connected_to_a_body_t01: SkipByDesign # External variables are not supported
 Language/Libraries_and_Scripts/Scripts/top_level_syntax_t01: SkipByDesign # External variables are not supported
 Language/Libraries_and_Scripts/top_level_syntax_t01: SkipByDesign # External variables are not supported
-Language/Metadata/before*: Skip # dart:mirrors not supported https://github.com/dart-lang/co19/issues/523.
+Language/Metadata/before*: SkipByDesign # dart:mirrors not supported https://github.com/dart-lang/co19/issues/523
 Language/Metadata/syntax_t10: SkipByDesign # dart:mirrors is not supported
 Language/Reference/Operator_Precedence/precedence_15_unary_prefix_t08: SkipByDesign # binary '~' produces different results in JavaScript and Dart
-Language/Types/Interface_Types/subtype_t27: Skip # Times out
-Language/Types/Interface_Types/subtype_t28: Skip # Times out
+Language/Types/Interface_Types/subtype_t27: SkipSlow
+Language/Types/Interface_Types/subtype_t28: SkipSlow
 LanguageFeatures/Abstract-external-fields/static_analysis_external_A01_t01: SkipByDesign # External variables are not supported
 LanguageFeatures/Abstract-external-fields/static_analysis_external_A01_t02: SkipByDesign # External variables are not supported
 LanguageFeatures/Abstract-external-fields/static_analysis_external_A01_t03: SkipByDesign # External variables are not supported
@@ -105,30 +105,30 @@
 LibTest/core/int/parse_A01_t02: SkipByDesign # big integers cannot be represented in JavaScript
 LibTest/core/int/remainder_A01_t03: SkipByDesign # Division by zero is not an error in JavaScript
 LibTest/ffi/*: SkipByDesign # dart:ffi is not supported
-LibTest/html/Element/blur_A01_t01: Skip # Times out
-LibTest/html/Element/focus_A01_t01: Skip # Times out
+LibTest/html/Element/blur_A01_t01: SkipSlow
+LibTest/html/Element/focus_A01_t01: SkipSlow
 LibTest/html/HttpRequest/responseText_A01_t02: Skip # https://github.com/dart-lang/co19/issues/932
 LibTest/html/HttpRequestUpload/*: Skip # https://github.com/dart-lang/co19/issues/932
-LibTest/html/IFrameElement/blur_A01_t01: Skip # Times out
-LibTest/html/IFrameElement/focus_A01_t01: Skip # Times out
+LibTest/html/IFrameElement/blur_A01_t01: SkipSlow
+LibTest/html/IFrameElement/focus_A01_t01: SkipSlow
 LibTest/io/*: SkipByDesign # dart:io not supported.
 LibTest/isolate/*: SkipByDesign # dart:isolate not supported.
 LibTest/mirrors/*: SkipByDesign # dart:mirrors is not supported
 LibTest/typed_data/ByteBuffer/*: SkipByDesign # not supported on the web
-LibTest/typed_data/ByteData/getInt64_A01_t01: Skip # Big integers cannot be represented in JS
-LibTest/typed_data/ByteData/getInt64_A02_t01: Skip # Int64 accessor not supported by dart2js
-LibTest/typed_data/ByteData/getInt64_A02_t02: Skip # Int64 accessor not supported by dart2js
-LibTest/typed_data/ByteData/getUint64_A01_t01: Skip # Big integers cannot be represented in JS
-LibTest/typed_data/ByteData/getUint64_A02_t01: Skip # Int64 accessor not supported by dart2js
-LibTest/typed_data/ByteData/getUint64_A02_t02: Skip # Int64 accessor not supported by dart2js
-LibTest/typed_data/ByteData/setInt64_A01_t01: Skip # Big integers cannot be represented in JS
-LibTest/typed_data/ByteData/setInt64_A02_t01: Skip # Int64 accessor not supported by dart2js
-LibTest/typed_data/ByteData/setInt64_A02_t02: Skip # Int64 accessor not supported by dart2js
-LibTest/typed_data/ByteData/setUint64_A01_t01: Skip # Big integers cannot be represented in JS
-LibTest/typed_data/ByteData/setUint64_A02_t01: Skip # Uint64 accessor not supported by dart2js
-LibTest/typed_data/ByteData/setUint64_A02_t02: Skip # Uint64 accessor not supported by dart2js
-LibTest/typed_data/Int32x4/operator_OR_A01_t01: Skip # Bitwise operations in JS are unsigned.
-LibTest/typed_data/Int32x4List/join_A01_t01: Skip # Differen string represrntation on VM and in JS
-LibTest/typed_data/Int32x4List/join_A01_t02: Skip # Differen string represrntation on VM and in JS
+LibTest/typed_data/ByteData/getInt64_A01_t01: SkipByDesign # uses integer literal not representable as JavaScript number
+LibTest/typed_data/ByteData/getInt64_A02_t01: SkipByDesign # Int64 accessor not supported by dart2js
+LibTest/typed_data/ByteData/getInt64_A02_t02: SkipByDesign # Int64 accessor not supported by dart2js
+LibTest/typed_data/ByteData/getUint64_A01_t01: SkipByDesign # uses integer literal not representable as JavaScript number
+LibTest/typed_data/ByteData/getUint64_A02_t01: SkipByDesign # Int64 accessor not supported by dart2js
+LibTest/typed_data/ByteData/getUint64_A02_t02: SkipByDesign # Int64 accessor not supported by dart2js
+LibTest/typed_data/ByteData/setInt64_A01_t01: SkipByDesign # Buses integer literal not representable as JavaScript number
+LibTest/typed_data/ByteData/setInt64_A02_t01: SkipByDesign # Int64 accessor not supported by dart2js
+LibTest/typed_data/ByteData/setInt64_A02_t02: SkipByDesign # Int64 accessor not supported by dart2js
+LibTest/typed_data/ByteData/setUint64_A01_t01: SkipByDesign # uses integer literal not representable as JavaScript number
+LibTest/typed_data/ByteData/setUint64_A02_t01: SkipByDesign # Uint64 accessor not supported by dart2js
+LibTest/typed_data/ByteData/setUint64_A02_t02: SkipByDesign # Uint64 accessor not supported by dart2js
+LibTest/typed_data/Int32x4/operator_OR_A01_t01: SkipByDesign # Bitwise operations in JS are unsigned.
+LibTest/typed_data/Int32x4List/join_A01_t01: SkipByDesign # Different string represrntation on VM and in JS
+LibTest/typed_data/Int32x4List/join_A01_t02: SkipByDesign # Different string represrntation on VM and in JS
 LibTest/typed_data/Int64List/*: SkipByDesign # Int64List not supported on the web
 LibTest/typed_data/Uint64List/*: SkipByDesign # Uint64List not supported on the web
diff --git a/tests/co19/co19-kernel.status b/tests/co19/co19-kernel.status
index 21682f1..088865a 100644
--- a/tests/co19/co19-kernel.status
+++ b/tests/co19/co19-kernel.status
@@ -28,7 +28,7 @@
 LibTest/collection/ListBase/ListBase_class_A01_t02: Slow, Pass # Does many calls
 LibTest/collection/ListMixin/ListMixin_class_A01_t02: Slow, Pass # Does many calls
 LibTest/core/List/List_class_A01_t02: Slow, Pass # Does many calls
-LibTest/io/RawDatagramSocket/*: Skip # RawDatagramSocket are flacky. Skip them all until rewritten
+LibTest/io/RawDatagramSocket/*: Skip # RawDatagramSocket are flaky. https://github.com/dart-lang/co19/issues/195
 
 [ $compiler == dartk && $runtime == vm && $system == linux ]
 LibTest/isolate/Isolate/spawn_A06_t03: Crash
@@ -45,8 +45,8 @@
 Language/Classes/Constructors/Constant_Constructors/potentially_constant_expression_t01: Crash
 
 [ $runtime == dart_precompiled && ($arch == simarm64 || $arch == simarm64c) ]
-LibTest/collection/ListBase/ListBase_class_A01_t01: Skip # Issue 43036
-LibTest/collection/ListMixin/ListMixin_class_A01_t01: Skip # Issue 43036
+LibTest/collection/ListBase/ListBase_class_A01_t01: SkipSlow # Issue 43036
+LibTest/collection/ListMixin/ListMixin_class_A01_t01: SkipSlow # Issue 43036
 
 # It makes no sense to run any test that uses spawnURI under the simulator
 # as that would involve running CFE (the front end) in simulator mode
diff --git a/tests/co19_2/co19_2-dart2js.status b/tests/co19_2/co19_2-dart2js.status
index 63158f2..5ba60fe 100644
--- a/tests/co19_2/co19_2-dart2js.status
+++ b/tests/co19_2/co19_2-dart2js.status
@@ -3,14 +3,14 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $compiler == dart2js ]
-Language/Expressions/Null/instance_of_class_null_t01: Skip # dart:mirrors not supported https://github.com/dart-lang/co19/issues/522.
+Language/Expressions/Null/instance_of_class_null_t01: SkipByDesign # dart:mirrors not supported https://github.com/dart-lang/co19/issues/522.
 Language/Expressions/Numbers/syntax_t06: SkipByDesign # uses integer literal not representable as JavaScript number
 Language/Expressions/Numbers/syntax_t09: SkipByDesign # uses integer literal not representable as JavaScript number
 Language/Expressions/Spawning_an_Isolate/new_isolate_t01: SkipByDesign
 Language/Functions/External_Functions/not_connected_to_a_body_t01: SkipByDesign # Non-JS-interop external members are not supported
 Language/Libraries_and_Scripts/Scripts/top_level_syntax_t01: SkipByDesign # Non-JS-interop external members are not supported
 Language/Libraries_and_Scripts/top_level_syntax_t01: SkipByDesign # Non-JS-interop external members are not supported
-Language/Metadata/before*: Skip # dart:mirrors not supported https://github.com/dart-lang/co19/issues/523.
+Language/Metadata/before*: SkipByDesign # dart:mirrors not supported https://github.com/dart-lang/co19/issues/523.
 LibTest/io/*: SkipByDesign # dart:io not supported.
 LibTest/isolate/*: SkipByDesign # dart:isolate not supported.
 
diff --git a/tests/co19_2/co19_2-dartdevc.status b/tests/co19_2/co19_2-dartdevc.status
index 4ce31b8..9e86a17 100644
--- a/tests/co19_2/co19_2-dartdevc.status
+++ b/tests/co19_2/co19_2-dartdevc.status
@@ -3,86 +3,86 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $compiler == dartdevc || $compiler == dartdevk ]
-Language/Classes/Constructors/Generative_Constructors/formal_parameter_t07: Skip # Times out
-Language/Classes/Constructors/Generative_Constructors/fresh_instance_t01: Skip # Times out
-Language/Classes/Constructors/Generative_Constructors/implicit_superinitializer_t01: Skip # Times out
-Language/Classes/Constructors/Generative_Constructors/implicit_superinitializer_t02: Skip # Times out
-Language/Classes/Constructors/Generative_Constructors/initializers_t01: Skip # Times out
-Language/Classes/Constructors/Generative_Constructors/initializers_t15: Skip # Times out
-Language/Classes/Constructors/Generative_Constructors/initializing_formals_execution_t01: Skip # Times out
-Language/Classes/Constructors/Generative_Constructors/initializing_this_t01: Skip # Times out
-Language/Classes/Constructors/Generative_Constructors/redirection_t01: Skip # Times out
-Language/Classes/Constructors/Generative_Constructors/syntax_t01: Skip # Times out
-Language/Classes/Constructors/implicit_constructor_t01: Skip # Times out
-Language/Classes/Constructors/implicit_constructor_t02: Skip # Times out
-Language/Classes/Constructors/name_t01: Skip # Times out
-Language/Classes/Constructors/name_t02: Skip # Times out
-Language/Classes/Constructors/name_t03: Skip # Times out
-Language/Classes/Getters/instance_getter_t01: Skip # Times out
-Language/Classes/Getters/instance_getter_t02: Skip # Times out
-Language/Classes/Getters/instance_getter_t03: Skip # Times out
-Language/Classes/Getters/instance_getter_t04: Skip # Times out
-Language/Classes/Getters/instance_getter_t05: Skip # Times out
-Language/Classes/Getters/instance_getter_t06: Skip # Times out
-Language/Classes/Getters/override_t04: Skip # Times out
-Language/Classes/Getters/return_type_t01: Skip # Times out
-Language/Classes/Getters/static_t01/none: Skip # Times out
-Language/Classes/Getters/static_t02: Skip # Times out
-Language/Classes/Getters/syntax_t01: Skip # Times out
-Language/Classes/Getters/void_return_type_t01: Skip # Times out
-Language/Classes/Instance_Methods/Operators/allowed_names_t01: Skip # Times out
-Language/Classes/Instance_Methods/Operators/arity_0_or_1_t01: Skip # Times out
-Language/Classes/Instance_Methods/Operators/arity_0_t01: Skip # Times out
-Language/Classes/Instance_Methods/Operators/syntax_t01: Skip # Times out
-Language/Classes/Instance_Methods/Operators/syntax_t03: Skip # Times out
-Language/Classes/Instance_Methods/override_named_parameters_t03: Skip # Times out
-Language/Classes/Instance_Methods/override_named_parameters_t04: Skip # Times out
-Language/Classes/Instance_Methods/override_named_parameters_t06: Skip # Times out
-Language/Classes/Instance_Methods/override_subtype_t05: Skip # Times out
-Language/Classes/Instance_Methods/override_subtype_t06: Skip # Times out
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t01: Skip # Times out
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t02: Skip # Times out
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t04: Skip # Times out
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t05: Skip # Times out
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t06: Skip # Times out
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t07: Skip # Times out
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t08: Skip # Times out
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t09: Skip # Times out
-Language/Classes/Instance_Variables/definition_t01: Skip # Times out
-Language/Classes/Instance_Variables/definition_t02: Skip # Times out
-Language/Classes/Instance_Variables/definition_t04: Skip # Times out
-Language/Classes/Setters/instance_setter_t01: Skip # Times out
-Language/Expressions/Function_Invocation/async_generator_invokation_t08: Skip # Times out
-Language/Expressions/Function_Invocation/async_generator_invokation_t10: Skip # Times out
-Language/Expressions/Null/instance_of_class_null_t01: Skip # dart:mirrors not supported https://github.com/dart-lang/co19/issues/522.
+Language/Classes/Constructors/Generative_Constructors/formal_parameter_t07: SkipSlow
+Language/Classes/Constructors/Generative_Constructors/fresh_instance_t01: SkipSlow
+Language/Classes/Constructors/Generative_Constructors/implicit_superinitializer_t01: SkipSlow
+Language/Classes/Constructors/Generative_Constructors/implicit_superinitializer_t02: SkipSlow
+Language/Classes/Constructors/Generative_Constructors/initializers_t01: SkipSlow
+Language/Classes/Constructors/Generative_Constructors/initializers_t15: SkipSlow
+Language/Classes/Constructors/Generative_Constructors/initializing_formals_execution_t01: SkipSlow
+Language/Classes/Constructors/Generative_Constructors/initializing_this_t01: SkipSlow
+Language/Classes/Constructors/Generative_Constructors/redirection_t01: SkipSlow
+Language/Classes/Constructors/Generative_Constructors/syntax_t01: SkipSlow
+Language/Classes/Constructors/implicit_constructor_t01: SkipSlow
+Language/Classes/Constructors/implicit_constructor_t02: SkipSlow
+Language/Classes/Constructors/name_t01: SkipSlow
+Language/Classes/Constructors/name_t02: SkipSlow
+Language/Classes/Constructors/name_t03: SkipSlow
+Language/Classes/Getters/instance_getter_t01: SkipSlow
+Language/Classes/Getters/instance_getter_t02: SkipSlow
+Language/Classes/Getters/instance_getter_t03: SkipSlow
+Language/Classes/Getters/instance_getter_t04: SkipSlow
+Language/Classes/Getters/instance_getter_t05: SkipSlow
+Language/Classes/Getters/instance_getter_t06: SkipSlow
+Language/Classes/Getters/override_t04: SkipSlow
+Language/Classes/Getters/return_type_t01: SkipSlow
+Language/Classes/Getters/static_t01/none: SkipSlow
+Language/Classes/Getters/static_t02: SkipSlow
+Language/Classes/Getters/syntax_t01: SkipSlow
+Language/Classes/Getters/void_return_type_t01: SkipSlow
+Language/Classes/Instance_Methods/Operators/allowed_names_t01: SkipSlow
+Language/Classes/Instance_Methods/Operators/arity_0_or_1_t01: SkipSlow
+Language/Classes/Instance_Methods/Operators/arity_0_t01: SkipSlow
+Language/Classes/Instance_Methods/Operators/syntax_t01: SkipSlow
+Language/Classes/Instance_Methods/Operators/syntax_t03: SkipSlow
+Language/Classes/Instance_Methods/override_named_parameters_t03: SkipSlow
+Language/Classes/Instance_Methods/override_named_parameters_t04: SkipSlow
+Language/Classes/Instance_Methods/override_named_parameters_t06: SkipSlow
+Language/Classes/Instance_Methods/override_subtype_t05: SkipSlow
+Language/Classes/Instance_Methods/override_subtype_t06: SkipSlow
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t01: SkipSlow
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t02: SkipSlow
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t04: SkipSlow
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t05: SkipSlow
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t06: SkipSlow
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t07: SkipSlow
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t08: SkipSlow
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t09: SkipSlow
+Language/Classes/Instance_Variables/definition_t01: SkipSlow
+Language/Classes/Instance_Variables/definition_t02: SkipSlow
+Language/Classes/Instance_Variables/definition_t04: SkipSlow
+Language/Classes/Setters/instance_setter_t01: SkipSlow
+Language/Expressions/Function_Invocation/async_generator_invokation_t08: SkipSlow
+Language/Expressions/Function_Invocation/async_generator_invokation_t10: SkipSlow
+Language/Expressions/Null/instance_of_class_null_t01: SkipByDesign # dart:mirrors not supported https://github.com/dart-lang/co19/issues/522.
 Language/Expressions/Numbers/syntax_t06: SkipByDesign # uses integer literal not representable as JavaScript number
 Language/Expressions/Numbers/syntax_t09: SkipByDesign # uses integer literal not representable as JavaScript number
 Language/Expressions/Spawning_an_Isolate/new_isolate_t01: SkipByDesign # dart:isolate not supported.
 Language/Functions/External_Functions/not_connected_to_a_body_t01: SkipByDesign # External variables are not supported
 Language/Libraries_and_Scripts/Scripts/top_level_syntax_t01: SkipByDesign # External variables are not supported
 Language/Libraries_and_Scripts/top_level_syntax_t01: SkipByDesign # External variables are not supported
-Language/Metadata/before*: Skip # dart:mirrors not supported https://github.com/dart-lang/co19/issues/523.
-Language/Types/Interface_Types/subtype_t27: Skip # Times out
-Language/Types/Interface_Types/subtype_t28: Skip # Times out
-LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t03: Skip # Times out
-LibTest/html/Element/blur_A01_t01: Skip # Times out
-LibTest/html/Element/focus_A01_t01: Skip # Times out
-LibTest/html/Element/loadEvent_A01_t01: Skip # Times out
-LibTest/html/Element/mouseWheelEvent_A01_t01: Skip # Times out
-LibTest/html/Element/onLoad_A01_t01: Skip # Times out
-LibTest/html/Element/onMouseWheel_A01_t01: Skip # Times out
-LibTest/html/Element/onTransitionEnd_A01_t01: Skip # Times out
-LibTest/html/Element/transitionEndEvent_A01_t01: Skip # Times out
-LibTest/html/HttpRequest/onError_A01_t02: Skip # Times out
-LibTest/html/HttpRequest/responseText_A01_t02: Skip # Times out
-LibTest/html/HttpRequestUpload/onError_A01_t02: Skip # Times out
-LibTest/html/HttpRequestUpload/onLoadEnd_A01_t01: Skip # Times out
-LibTest/html/HttpRequestUpload/onLoadStart_A01_t01: Skip # Times out
-LibTest/html/HttpRequestUpload/onLoad_A01_t01: Skip # Times out
-LibTest/html/IFrameElement/blur_A01_t01: Skip # Times out
-LibTest/html/IFrameElement/enteredView_A01_t01: Skip # Times out
-LibTest/html/IFrameElement/focus_A01_t01: Skip # Times out
-LibTest/html/IFrameElement/onMouseWheel_A01_t01: Skip # Times out
-LibTest/html/IFrameElement/onTransitionEnd_A01_t01: Skip # Times out
+Language/Metadata/before*: SkipByDesign # dart:mirrors not supported https://github.com/dart-lang/co19/issues/523.
+Language/Types/Interface_Types/subtype_t27: SkipSlow
+Language/Types/Interface_Types/subtype_t28: SkipSlow
+LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t03: SkipSlow
+LibTest/html/Element/blur_A01_t01: SkipSlow
+LibTest/html/Element/focus_A01_t01: SkipSlow
+LibTest/html/Element/loadEvent_A01_t01: SkipSlow
+LibTest/html/Element/mouseWheelEvent_A01_t01: SkipSlow
+LibTest/html/Element/onLoad_A01_t01: SkipSlow
+LibTest/html/Element/onMouseWheel_A01_t01: SkipSlow
+LibTest/html/Element/onTransitionEnd_A01_t01: SkipSlow
+LibTest/html/Element/transitionEndEvent_A01_t01: SkipSlow
+LibTest/html/HttpRequest/onError_A01_t02: SkipSlow
+LibTest/html/HttpRequest/responseText_A01_t02: SkipSlow
+LibTest/html/HttpRequestUpload/onError_A01_t02: SkipSlow
+LibTest/html/HttpRequestUpload/onLoadEnd_A01_t01: SkipSlow
+LibTest/html/HttpRequestUpload/onLoadStart_A01_t01: SkipSlow
+LibTest/html/HttpRequestUpload/onLoad_A01_t01: SkipSlow
+LibTest/html/IFrameElement/blur_A01_t01: SkipSlow
+LibTest/html/IFrameElement/enteredView_A01_t01: SkipSlow
+LibTest/html/IFrameElement/focus_A01_t01: SkipSlow
+LibTest/html/IFrameElement/onMouseWheel_A01_t01: SkipSlow
+LibTest/html/IFrameElement/onTransitionEnd_A01_t01: SkipSlow
 LibTest/io/*: SkipByDesign # dart:io not supported.
 LibTest/isolate/*: SkipByDesign # dart:isolate not supported.
diff --git a/tests/language/const_functions/const_functions_variable_declarations_error_test.dart b/tests/language/const_functions/const_functions_variable_declarations_error_test.dart
new file mode 100644
index 0000000..56cf083
--- /dev/null
+++ b/tests/language/const_functions/const_functions_variable_declarations_error_test.dart
@@ -0,0 +1,18 @@
+// 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 variable declaration usage within const functions.
+
+// SharedOptions=--enable-experiment=const-functions
+
+import "package:expect/expect.dart";
+
+const var1 = fn1();
+//           ^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+// [cfe] Constant evaluation error:
+int fn1() {
+  var a;
+  return a;
+}
diff --git a/tests/language/const_functions/const_functions_variable_declarations_test.dart b/tests/language/const_functions/const_functions_variable_declarations_test.dart
index 492a8cc..ec6a8ec 100644
--- a/tests/language/const_functions/const_functions_variable_declarations_test.dart
+++ b/tests/language/const_functions/const_functions_variable_declarations_test.dart
@@ -53,6 +53,35 @@
   return constant;
 }
 
+const var6 = function6();
+//           ^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+int function6() {
+  var a;
+  a = 2;
+  return a;
+}
+
+const var7 = function7();
+//           ^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+int function7() {
+  var a;
+  var b;
+  a = 2;
+  return a;
+}
+
+const var8 = function8();
+//           ^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+int function8() {
+  var a;
+  int? b;
+  a = 2;
+  return a;
+}
+
 void main() {
   Expect.equals(var1, 4);
   Expect.equals(var1_1, 5);
@@ -60,4 +89,7 @@
   Expect.equals(var3, 6);
   Expect.equals(var4, 2);
   Expect.equals(var5, -2);
+  Expect.equals(var6, 2);
+  Expect.equals(var7, 2);
+  Expect.equals(var8, 2);
 }
diff --git a/tools/VERSION b/tools/VERSION
index d3375eb..c7caf78 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 13
 PATCH 0
-PRERELEASE 231
+PRERELEASE 232
 PRERELEASE_PATCH 0
\ No newline at end of file