Version 2.17.0-263.0.dev

Merge commit '60857f8bc7472a1707af93c8fda1e9d9a093448e' into 'dev'
diff --git a/DEPS b/DEPS
index 4799c7d..c8310ef 100644
--- a/DEPS
+++ b/DEPS
@@ -77,7 +77,7 @@
 
   # Revisions of /third_party/* dependencies.
   "args_rev": "3b3f55766af13d895d2020ec001a28e8dc147f91",
-  "async_rev": "80886150a5e6c58006c8ae5a6c2aa7108638e2a9",
+  "async_rev": "3f58c326bd4928fca9ddc10c72b19cb7ac659256",
   "bazel_worker_rev": "ceeba0982d4ff40d32371c9d35f3d2dc1868de20",
   "benchmark_harness_rev": "c546dbd9f639f75cd2f75de8df2eb9f8ea15e8e7",
   "boolean_selector_rev": "437e7f06c7e416bed91e16ae1df453555897e945",
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
index a9f8bfa..a0e3573 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -2782,6 +2782,14 @@
     problemMessage: r"""Unable to decode bytes as UTF-8.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeEnumAbstractMember = messageEnumAbstractMember;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageEnumAbstractMember = const MessageCode(
+    "EnumAbstractMember",
+    problemMessage: r"""Enums can't declare abstract members.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(
         String
diff --git a/pkg/analysis_server/lib/src/domain_analysis.dart b/pkg/analysis_server/lib/src/domain_analysis.dart
index 6874ce4..cfd19e2 100644
--- a/pkg/analysis_server/lib/src/domain_analysis.dart
+++ b/pkg/analysis_server/lib/src/domain_analysis.dart
@@ -12,6 +12,8 @@
 import 'package:analysis_server/src/handler/legacy/analysis_get_signature.dart';
 import 'package:analysis_server/src/handler/legacy/analysis_reanalyze.dart';
 import 'package:analysis_server/src/handler/legacy/analysis_set_analysis_roots.dart';
+import 'package:analysis_server/src/handler/legacy/analysis_set_general_subscriptions.dart';
+import 'package:analysis_server/src/handler/legacy/analysis_set_priority_files.dart';
 import 'package:analysis_server/src/handler/legacy/analysis_set_subscriptions.dart';
 import 'package:analysis_server/src/handler/legacy/unsupported_request.dart';
 import 'package:analysis_server/src/plugin/request_converter.dart';
@@ -63,16 +65,25 @@
             .handle();
         return Response.DELAYED_RESPONSE;
       } else if (requestName == ANALYSIS_REQUEST_SET_GENERAL_SUBSCRIPTIONS) {
-        return setGeneralSubscriptions(request);
+        AnalysisSetGeneralSubscriptionsHandler(
+                server, request, cancellationToken)
+            .handle();
+        return Response.DELAYED_RESPONSE;
       } else if (requestName == ANALYSIS_REQUEST_SET_PRIORITY_FILES) {
-        return setPriorityFiles(request);
+        AnalysisSetPriorityFilesHandler(server, request, cancellationToken)
+            .handle();
+        return Response.DELAYED_RESPONSE;
       } else if (requestName == ANALYSIS_REQUEST_SET_SUBSCRIPTIONS) {
         AnalysisSetSubscriptionsHandler(server, request, cancellationToken)
             .handle();
         return Response.DELAYED_RESPONSE;
       } else if (requestName == ANALYSIS_REQUEST_UPDATE_CONTENT) {
+        // TODO(brianwilkerson) Converting this to a handler currently causes a
+        //  test to timeout.
         return updateContent(request);
       } else if (requestName == ANALYSIS_REQUEST_UPDATE_OPTIONS) {
+        // TODO(brianwilkerson) Converting this to a handler currently causes a
+        //  test to timeout.
         return updateOptions(request);
       }
     } on RequestFailure catch (exception) {
@@ -81,36 +92,6 @@
     return null;
   }
 
-  /// Implement the 'analysis.setGeneralSubscriptions' request.
-  Response setGeneralSubscriptions(Request request) {
-    var params = AnalysisSetGeneralSubscriptionsParams.fromRequest(request);
-    server.setGeneralAnalysisSubscriptions(params.subscriptions);
-    return AnalysisSetGeneralSubscriptionsResult().toResponse(request.id);
-  }
-
-  /// Implement the 'analysis.setPriorityFiles' request.
-  Response setPriorityFiles(Request request) {
-    var params = AnalysisSetPriorityFilesParams.fromRequest(request);
-
-    for (var file in params.files) {
-      if (!server.isAbsoluteAndNormalized(file)) {
-        return Response.invalidFilePathFormat(request, file);
-      }
-    }
-
-    server.setPriorityFiles(request.id, params.files);
-    //
-    // Forward the request to the plugins.
-    //
-    var converter = RequestConverter();
-    server.pluginManager.setAnalysisSetPriorityFilesParams(
-        converter.convertAnalysisSetPriorityFilesParams(params));
-    //
-    // Send the response.
-    //
-    return AnalysisSetPriorityFilesResult().toResponse(request.id);
-  }
-
   /// Implement the 'analysis.updateContent' request.
   Response updateContent(Request request) {
     var params = AnalysisUpdateContentParams.fromRequest(request);
diff --git a/pkg/analysis_server/lib/src/domain_analytics.dart b/pkg/analysis_server/lib/src/domain_analytics.dart
index cec9fa8..1460410 100644
--- a/pkg/analysis_server/lib/src/domain_analytics.dart
+++ b/pkg/analysis_server/lib/src/domain_analytics.dart
@@ -4,10 +4,12 @@
 
 import 'package:analysis_server/protocol/protocol.dart';
 import 'package:analysis_server/protocol/protocol_constants.dart';
-import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/handler/legacy/analytics_enable.dart';
+import 'package:analysis_server/src/handler/legacy/analytics_is_enabled.dart';
+import 'package:analysis_server/src/handler/legacy/analytics_send_event.dart';
+import 'package:analysis_server/src/handler/legacy/analytics_send_timing.dart';
 import 'package:analysis_server/src/utilities/progress.dart';
-import 'package:telemetry/telemetry.dart';
 
 /// Instances of the class [AnalyticsDomainHandler] implement a [RequestHandler]
 /// that handles requests in the `analytics` domain.
@@ -16,61 +18,24 @@
 
   AnalyticsDomainHandler(this.server);
 
-  Analytics? get analytics => server.analytics;
-
-  String get _clientId => server.options.clientId ?? 'client';
-
-  Response handleEnable(Request request) {
-    var params = AnalyticsEnableParams.fromRequest(request);
-    final analytics = this.analytics;
-    if (analytics != null) {
-      analytics.enabled = params.value;
-    }
-    return AnalyticsEnableResult().toResponse(request.id);
-  }
-
-  Response handleIsEnabled(Request request) {
-    return AnalyticsIsEnabledResult(analytics?.enabled ?? false)
-        .toResponse(request.id);
-  }
-
   @override
   Response? handleRequest(
       Request request, CancellationToken cancellationToken) {
     var requestName = request.method;
 
     if (requestName == ANALYTICS_REQUEST_IS_ENABLED) {
-      return handleIsEnabled(request);
+      AnalyticsIsEnabledHandler(server, request, cancellationToken).handle();
+      return Response.DELAYED_RESPONSE;
     } else if (requestName == ANALYTICS_REQUEST_ENABLE) {
-      return handleEnable(request);
+      AnalyticsEnableHandler(server, request, cancellationToken).handle();
+      return Response.DELAYED_RESPONSE;
     } else if (requestName == ANALYTICS_REQUEST_SEND_EVENT) {
-      return handleSendEvent(request);
+      AnalyticsSendEventHandler(server, request, cancellationToken).handle();
+      return Response.DELAYED_RESPONSE;
     } else if (requestName == ANALYTICS_REQUEST_SEND_TIMING) {
-      return handleSendTiming(request);
+      AnalyticsSendTimingHandler(server, request, cancellationToken).handle();
+      return Response.DELAYED_RESPONSE;
     }
-
     return null;
   }
-
-  Response handleSendEvent(Request request) {
-    final analytics = this.analytics;
-    if (analytics == null) {
-      return AnalyticsSendEventResult().toResponse(request.id);
-    }
-
-    var params = AnalyticsSendEventParams.fromRequest(request);
-    analytics.sendEvent(_clientId, params.action);
-    return AnalyticsSendEventResult().toResponse(request.id);
-  }
-
-  Response handleSendTiming(Request request) {
-    final analytics = this.analytics;
-    if (analytics == null) {
-      return AnalyticsSendTimingResult().toResponse(request.id);
-    }
-
-    var params = AnalyticsSendTimingParams.fromRequest(request);
-    analytics.sendTiming(params.event, params.millis, category: _clientId);
-    return AnalyticsSendTimingResult().toResponse(request.id);
-  }
 }
diff --git a/pkg/analysis_server/lib/src/domain_diagnostic.dart b/pkg/analysis_server/lib/src/domain_diagnostic.dart
index 22cf45c..35a41d6 100644
--- a/pkg/analysis_server/lib/src/domain_diagnostic.dart
+++ b/pkg/analysis_server/lib/src/domain_diagnostic.dart
@@ -4,11 +4,10 @@
 
 import 'package:analysis_server/protocol/protocol.dart';
 import 'package:analysis_server/protocol/protocol_constants.dart';
-import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/handler/legacy/diagnostic_get_diagnostics.dart';
 import 'package:analysis_server/src/handler/legacy/diagnostic_get_server_port.dart';
 import 'package:analysis_server/src/utilities/progress.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
 
 /// Instances of the class [DiagnosticDomainHandler] implement a
 /// [RequestHandler] that handles requests in the `diagnostic` domain.
@@ -20,27 +19,15 @@
   /// [server].
   DiagnosticDomainHandler(this.server);
 
-  /// Answer the `diagnostic.getDiagnostics` request.
-  Response computeDiagnostics(Request request) {
-    var contexts = server.driverMap.values.map(extractDataFromDriver).toList();
-    return DiagnosticGetDiagnosticsResult(contexts).toResponse(request.id);
-  }
-
-  /// Extract context data from the given [driver].
-  ContextData extractDataFromDriver(AnalysisDriver driver) {
-    var explicitFileCount = driver.addedFiles.length;
-    var knownFileCount = driver.knownFiles.length;
-    return ContextData(driver.name, explicitFileCount,
-        knownFileCount - explicitFileCount, driver.numberOfFilesToAnalyze, []);
-  }
-
   @override
   Response? handleRequest(
       Request request, CancellationToken cancellationToken) {
     try {
       var requestName = request.method;
       if (requestName == DIAGNOSTIC_REQUEST_GET_DIAGNOSTICS) {
-        return computeDiagnostics(request);
+        DiagnosticGetDiagnosticsHandler(server, request, cancellationToken)
+            .handle();
+        return Response.DELAYED_RESPONSE;
       } else if (requestName == DIAGNOSTIC_REQUEST_GET_SERVER_PORT) {
         DiagnosticGetServerPortHandler(server, request, cancellationToken)
             .handle();
diff --git a/pkg/analysis_server/lib/src/handler/legacy/analysis_set_general_subscriptions.dart b/pkg/analysis_server/lib/src/handler/legacy/analysis_set_general_subscriptions.dart
new file mode 100644
index 0000000..1d02f73
--- /dev/null
+++ b/pkg/analysis_server/lib/src/handler/legacy/analysis_set_general_subscriptions.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analysis_server/protocol/protocol.dart';
+import 'package:analysis_server/protocol/protocol_generated.dart';
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
+
+/// The handler for the `analysis.setGeneralSubscriptions` request.
+class AnalysisSetGeneralSubscriptionsHandler extends LegacyHandler {
+  /// Initialize a newly created handler to be able to service requests for the
+  /// [server].
+  AnalysisSetGeneralSubscriptionsHandler(AnalysisServer server, Request request,
+      CancellationToken cancellationToken)
+      : super(server, request, cancellationToken);
+
+  @override
+  Future<void> handle() async {
+    var params = AnalysisSetGeneralSubscriptionsParams.fromRequest(request);
+    server.setGeneralAnalysisSubscriptions(params.subscriptions);
+    sendResult(AnalysisSetGeneralSubscriptionsResult());
+  }
+}
diff --git a/pkg/analysis_server/lib/src/handler/legacy/analysis_set_priority_files.dart b/pkg/analysis_server/lib/src/handler/legacy/analysis_set_priority_files.dart
new file mode 100644
index 0000000..9cbe6bd
--- /dev/null
+++ b/pkg/analysis_server/lib/src/handler/legacy/analysis_set_priority_files.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analysis_server/protocol/protocol.dart';
+import 'package:analysis_server/protocol/protocol_generated.dart';
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
+import 'package:analysis_server/src/plugin/request_converter.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
+
+/// The handler for the `analysis.setPriorityFiles` request.
+class AnalysisSetPriorityFilesHandler extends LegacyHandler {
+  /// Initialize a newly created handler to be able to service requests for the
+  /// [server].
+  AnalysisSetPriorityFilesHandler(AnalysisServer server, Request request,
+      CancellationToken cancellationToken)
+      : super(server, request, cancellationToken);
+
+  @override
+  Future<void> handle() async {
+    var params = AnalysisSetPriorityFilesParams.fromRequest(request);
+
+    for (var file in params.files) {
+      if (!server.isAbsoluteAndNormalized(file)) {
+        sendResponse(Response.invalidFilePathFormat(request, file));
+      }
+    }
+
+    server.setPriorityFiles(request.id, params.files);
+    //
+    // Forward the request to the plugins.
+    //
+    var converter = RequestConverter();
+    server.pluginManager.setAnalysisSetPriorityFilesParams(
+        converter.convertAnalysisSetPriorityFilesParams(params));
+    //
+    // Send the response.
+    //
+    sendResult(AnalysisSetPriorityFilesResult());
+  }
+}
diff --git a/pkg/analysis_server/lib/src/handler/legacy/analytics_enable.dart b/pkg/analysis_server/lib/src/handler/legacy/analytics_enable.dart
new file mode 100644
index 0000000..5b5a927
--- /dev/null
+++ b/pkg/analysis_server/lib/src/handler/legacy/analytics_enable.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analysis_server/protocol/protocol.dart';
+import 'package:analysis_server/protocol/protocol_generated.dart';
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
+
+/// The handler for the `analytics.enable` request.
+class AnalyticsEnableHandler extends LegacyHandler {
+  /// Initialize a newly created handler to be able to service requests for the
+  /// [server].
+  AnalyticsEnableHandler(AnalysisServer server, Request request,
+      CancellationToken cancellationToken)
+      : super(server, request, cancellationToken);
+
+  @override
+  Future<void> handle() async {
+    var params = AnalyticsEnableParams.fromRequest(request);
+    final analytics = server.analytics;
+    if (analytics != null) {
+      analytics.enabled = params.value;
+    }
+    sendResult(AnalyticsEnableResult());
+  }
+}
diff --git a/pkg/analysis_server/lib/src/handler/legacy/analytics_is_enabled.dart b/pkg/analysis_server/lib/src/handler/legacy/analytics_is_enabled.dart
new file mode 100644
index 0000000..a4d3bfb
--- /dev/null
+++ b/pkg/analysis_server/lib/src/handler/legacy/analytics_is_enabled.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analysis_server/protocol/protocol.dart';
+import 'package:analysis_server/protocol/protocol_generated.dart';
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
+
+/// The handler for the `analytics.isEnabled` request.
+class AnalyticsIsEnabledHandler extends LegacyHandler {
+  /// Initialize a newly created handler to be able to service requests for the
+  /// [server].
+  AnalyticsIsEnabledHandler(AnalysisServer server, Request request,
+      CancellationToken cancellationToken)
+      : super(server, request, cancellationToken);
+
+  @override
+  Future<void> handle() async {
+    sendResult(AnalyticsIsEnabledResult(server.analytics?.enabled ?? false));
+  }
+}
diff --git a/pkg/analysis_server/lib/src/handler/legacy/analytics_send_event.dart b/pkg/analysis_server/lib/src/handler/legacy/analytics_send_event.dart
new file mode 100644
index 0000000..ea1aee4
--- /dev/null
+++ b/pkg/analysis_server/lib/src/handler/legacy/analytics_send_event.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analysis_server/protocol/protocol.dart';
+import 'package:analysis_server/protocol/protocol_generated.dart';
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
+
+/// The handler for the `analytics.sendEvent` request.
+class AnalyticsSendEventHandler extends LegacyHandler {
+  /// Initialize a newly created handler to be able to service requests for the
+  /// [server].
+  AnalyticsSendEventHandler(AnalysisServer server, Request request,
+      CancellationToken cancellationToken)
+      : super(server, request, cancellationToken);
+
+  String get _clientId => server.options.clientId ?? 'client';
+
+  @override
+  Future<void> handle() async {
+    final analytics = server.analytics;
+    if (analytics == null) {
+      sendResult(AnalyticsSendEventResult());
+      return;
+    }
+
+    var params = AnalyticsSendEventParams.fromRequest(request);
+    analytics.sendEvent(_clientId, params.action);
+    sendResult(AnalyticsSendEventResult());
+  }
+}
diff --git a/pkg/analysis_server/lib/src/handler/legacy/analytics_send_timing.dart b/pkg/analysis_server/lib/src/handler/legacy/analytics_send_timing.dart
new file mode 100644
index 0000000..bb9961e
--- /dev/null
+++ b/pkg/analysis_server/lib/src/handler/legacy/analytics_send_timing.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analysis_server/protocol/protocol.dart';
+import 'package:analysis_server/protocol/protocol_generated.dart';
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
+
+/// The handler for the `analytics.sendTiming` request.
+class AnalyticsSendTimingHandler extends LegacyHandler {
+  /// Initialize a newly created handler to be able to service requests for the
+  /// [server].
+  AnalyticsSendTimingHandler(AnalysisServer server, Request request,
+      CancellationToken cancellationToken)
+      : super(server, request, cancellationToken);
+
+  String get _clientId => server.options.clientId ?? 'client';
+
+  @override
+  Future<void> handle() async {
+    final analytics = server.analytics;
+    if (analytics == null) {
+      sendResult(AnalyticsSendTimingResult());
+      return;
+    }
+
+    var params = AnalyticsSendTimingParams.fromRequest(request);
+    analytics.sendTiming(params.event, params.millis, category: _clientId);
+    sendResult(AnalyticsSendTimingResult());
+  }
+}
diff --git a/pkg/analysis_server/lib/src/handler/legacy/diagnostic_get_diagnostics.dart b/pkg/analysis_server/lib/src/handler/legacy/diagnostic_get_diagnostics.dart
new file mode 100644
index 0000000..678db0f
--- /dev/null
+++ b/pkg/analysis_server/lib/src/handler/legacy/diagnostic_get_diagnostics.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analysis_server/protocol/protocol.dart';
+import 'package:analysis_server/protocol/protocol_generated.dart';
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
+import 'package:analyzer/src/dart/analysis/driver.dart';
+
+/// The handler for the `diagnostic.getDiagnostics` request.
+class DiagnosticGetDiagnosticsHandler extends LegacyHandler {
+  /// Initialize a newly created handler to be able to service requests for the
+  /// [server].
+  DiagnosticGetDiagnosticsHandler(AnalysisServer server, Request request,
+      CancellationToken cancellationToken)
+      : super(server, request, cancellationToken);
+
+  @override
+  Future<void> handle() async {
+    var contexts = server.driverMap.values.map(_extractDataFromDriver).toList();
+    sendResult(DiagnosticGetDiagnosticsResult(contexts));
+  }
+
+  /// Extract context data from the given [driver].
+  ContextData _extractDataFromDriver(AnalysisDriver driver) {
+    var explicitFileCount = driver.addedFiles.length;
+    var knownFileCount = driver.knownFiles.length;
+    return ContextData(driver.name, explicitFileCount,
+        knownFileCount - explicitFileCount, driver.numberOfFilesToAnalyze, []);
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_for_loop.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_for_each_to_for_loop.dart
similarity index 86%
rename from pkg/analysis_server/lib/src/services/correction/dart/convert_to_for_loop.dart
rename to pkg/analysis_server/lib/src/services/correction/dart/convert_for_each_to_for_loop.dart
index 4abb1bf..2da9100 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_for_loop.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_for_each_to_for_loop.dart
@@ -5,7 +5,9 @@
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
 
@@ -60,6 +62,7 @@
           builder.write(') ');
         });
         builder.addDeletion(range.endEnd(body, statement));
+        body.visitChildren(_ReturnVisitor(builder));
       });
     } else if (body is ExpressionFunctionBody) {
       await builder.addDartFileEdit(file, (builder) {
@@ -80,6 +83,7 @@
           builder.write(prefix);
           builder.write('}');
         });
+        body.visitChildren(_ReturnVisitor(builder));
       });
     }
   }
@@ -87,3 +91,14 @@
   /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
   static ConvertForEachToForLoop newInstance() => ConvertForEachToForLoop();
 }
+
+class _ReturnVisitor extends RecursiveAstVisitor<void> {
+  final DartFileEditBuilder builder;
+
+  _ReturnVisitor(this.builder);
+
+  @override
+  void visitReturnStatement(ReturnStatement node) {
+    builder.addSimpleReplacement(range.node(node), 'continue;');
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index 7239a67..a4e4594a 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -44,6 +44,7 @@
 import 'package:analysis_server/src/services/correction/dart/convert_documentation_into_line.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_flutter_child.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_flutter_children.dart';
+import 'package:analysis_server/src/services/correction/dart/convert_for_each_to_for_loop.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_into_block_body.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_into_is_not.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_map_from_iterable_to_for_literal.dart';
@@ -51,7 +52,6 @@
 import 'package:analysis_server/src/services/correction/dart/convert_to_cascade.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_contains.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_expression_function_body.dart';
-import 'package:analysis_server/src/services/correction/dart/convert_to_for_loop.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_generic_function_syntax.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_if_null.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_initializing_formal.dart';
diff --git a/pkg/analysis_server/test/domain_diagnostic_test.dart b/pkg/analysis_server/test/domain_diagnostic_test.dart
index e19b27d..13b5829 100644
--- a/pkg/analysis_server/test/domain_diagnostic_test.dart
+++ b/pkg/analysis_server/test/domain_diagnostic_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/domain_diagnostic.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -34,7 +33,7 @@
     await server.onAnalysisComplete;
 
     var request = DiagnosticGetDiagnosticsParams().toRequest('0');
-    var response = handler.handleRequest(request, NotCancelableToken())!;
+    var response = await waitResponse(request);
     var result = DiagnosticGetDiagnosticsResult.fromResponse(response);
 
     expect(result.contexts, hasLength(1));
@@ -50,7 +49,7 @@
 
   Future<void> test_getDiagnostics_noRoot() async {
     var request = DiagnosticGetDiagnosticsParams().toRequest('0');
-    var response = handler.handleRequest(request, NotCancelableToken())!;
+    var response = await waitResponse(request);
     var result = DiagnosticGetDiagnosticsResult.fromResponse(response);
     expect(result.contexts, isEmpty);
   }
diff --git a/pkg/analysis_server/test/edit/fixes_test.dart b/pkg/analysis_server/test/edit/fixes_test.dart
index ba507ba..a2658e5 100644
--- a/pkg/analysis_server/test/edit/fixes_test.dart
+++ b/pkg/analysis_server/test/edit/fixes_test.dart
@@ -141,7 +141,7 @@
 print(1)
 }
 ''';
-    _addOverlay(testFile, testCode);
+    await _addOverlay(testFile, testCode);
     // ask for fixes
     await waitForTasksFinished();
     var errorFixes = await _getFixesAt('print(1)');
@@ -177,7 +177,7 @@
     // Configure the test file.
     testFile = convertPath('/aaa/main.dart');
     testCode = 'main() { new Foo(); }';
-    _addOverlay(testFile, testCode);
+    await _addOverlay(testFile, testCode);
 
     await waitForTasksFinished();
     doAllDeclarationsTrackerWork();
@@ -196,11 +196,11 @@
         isFalse);
   }
 
-  void _addOverlay(String name, String contents) {
+  Future<void> _addOverlay(String name, String contents) async {
     var request =
         AnalysisUpdateContentParams({name: AddContentOverlay(contents)})
             .toRequest('0');
-    handleSuccessfulRequest(request, handler: analysisHandler);
+    await waitResponse(request);
   }
 
   Future<List<AnalysisErrorFixes>> _getFixes(int offset) async {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_for_each_to_for_loop_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_for_each_to_for_loop_test.dart
index 88ac31a..75125cc 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/convert_for_each_to_for_loop_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_for_each_to_for_loop_test.dart
@@ -143,4 +143,25 @@
 }
 ''');
   }
+
+  Future<void> test_return() async {
+    await resolveTestCode('''
+void f(List<String> list) {
+  list.forEach((e) {
+    if (e == 'whatever') {
+      return;
+    }
+  });
+}
+''');
+    await assertHasFix('''
+void f(List<String> list) {
+  for (var e in list) {
+    if (e == 'whatever') {
+      continue;
+    }
+  }
+}
+''');
+  }
 }
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart
index 8d8f03d..73aebd1 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -185,6 +185,10 @@
         return FieldFormalParameterMember(
             _typeProvider, p, _substitution, isLegacy);
       }
+      if (p is SuperFormalParameterElement) {
+        return SuperFormalParameterMember(
+            _typeProvider, p, _substitution, isLegacy);
+      }
       return ParameterMember(_typeProvider, p, _substitution, isLegacy);
     }).toList();
   }
@@ -998,6 +1002,64 @@
   }
 }
 
+class SuperFormalParameterMember extends ParameterMember
+    implements SuperFormalParameterElement {
+  factory SuperFormalParameterMember(
+    TypeProviderImpl typeProvider,
+    SuperFormalParameterElement declaration,
+    MapSubstitution substitution,
+    bool isLegacy,
+  ) {
+    var freshTypeParameters = _SubstitutedTypeParameters(
+      declaration.typeParameters,
+      substitution,
+    );
+    return SuperFormalParameterMember._(
+      typeProvider,
+      declaration,
+      freshTypeParameters.substitution,
+      isLegacy,
+      freshTypeParameters.elements,
+    );
+  }
+
+  SuperFormalParameterMember._(
+    TypeProviderImpl typeProvider,
+    SuperFormalParameterElement declaration,
+    MapSubstitution substitution,
+    bool isLegacy,
+    List<TypeParameterElement> typeParameters,
+  ) : super._(
+          typeProvider,
+          declaration,
+          substitution,
+          isLegacy,
+          typeParameters,
+        );
+
+  @override
+  bool get hasDefaultValue => declaration.hasDefaultValue;
+
+  @override
+  bool get isCovariant => declaration.isCovariant;
+
+  @override
+  ParameterElement? get superConstructorParameter {
+    var superConstructorParameter =
+        (declaration as SuperFormalParameterElement).superConstructorParameter;
+    if (superConstructorParameter == null) {
+      return null;
+    }
+
+    return ParameterMember(
+        _typeProvider, superConstructorParameter, _substitution, isLegacy);
+  }
+
+  @override
+  T? accept<T>(ElementVisitor<T> visitor) =>
+      visitor.visitSuperFormalParameterElement(this);
+}
+
 class TopLevelVariableMember extends VariableMember
     implements TopLevelVariableElement {
   TopLevelVariableMember(
diff --git a/pkg/analyzer/test/generated/constant_test.dart b/pkg/analyzer/test/generated/constant_test.dart
index 34833f5..e4a67c3 100644
--- a/pkg/analyzer/test/generated/constant_test.dart
+++ b/pkg/analyzer/test/generated/constant_test.dart
@@ -647,6 +647,30 @@
 ''');
   }
 
+  test_superFormalParameter_explicitSuper_requiredNamed_generic() async {
+    await assertNoErrorsInCode('''
+class A {
+  final int a;
+  const A({required this.a});
+}
+
+class B<T> extends A {
+  final int b;
+  const B(this.b, {required super.a}) : super();
+}
+
+const x = B<int>(2, a: 1);
+''');
+
+    var value = findElement.topVar('x').evaluationResult.value;
+    assertDartObjectText(value, r'''
+B<int>
+  (super): A
+    a: int 1
+  b: int 2
+''');
+  }
+
   test_superFormalParameter_explicitSuper_requiredPositional() async {
     await assertNoErrorsInCode('''
 class A {
@@ -671,6 +695,30 @@
 ''');
   }
 
+  test_superFormalParameter_explicitSuper_requiredPositional_generic() async {
+    await assertNoErrorsInCode('''
+class A {
+  final int a;
+  const A(this.a);
+}
+
+class B<T> extends A {
+  final int b;
+  const B(super.a, this.b) : super();
+}
+
+const x = B<int>(1, 2);
+''');
+
+    var value = findElement.topVar('x').evaluationResult.value;
+    assertDartObjectText(value, r'''
+B<int>
+  (super): A
+    a: int 1
+  b: int 2
+''');
+  }
+
   test_superFormalParameter_implicitSuper_requiredNamed() async {
     await assertNoErrorsInCode('''
 class A {
@@ -695,6 +743,30 @@
 ''');
   }
 
+  test_superFormalParameter_implicitSuper_requiredNamed_generic() async {
+    await assertNoErrorsInCode('''
+class A {
+  final int a;
+  const A({required this.a});
+}
+
+class B<T> extends A {
+  final int b;
+  const B(this.b, {required super.a});
+}
+
+const x = B<int>(2, a: 1);
+''');
+
+    var value = findElement.topVar('x').evaluationResult.value;
+    assertDartObjectText(value, r'''
+B<int>
+  (super): A
+    a: int 1
+  b: int 2
+''');
+  }
+
   test_superFormalParameter_implicitSuper_requiredPositional() async {
     await assertNoErrorsInCode('''
 class A {
@@ -719,6 +791,30 @@
 ''');
   }
 
+  test_superFormalParameter_implicitSuper_requiredPositional_generic() async {
+    await assertNoErrorsInCode('''
+class A {
+  final int a;
+  const A(this.a);
+}
+
+class B<T> extends A {
+  final int b;
+  const B(super.a, this.b);
+}
+
+const x = B<int>(1, 2);
+''');
+
+    var value = findElement.topVar('x').evaluationResult.value;
+    assertDartObjectText(value, r'''
+B<int>
+  (super): A
+    a: int 1
+  b: int 2
+''');
+  }
+
   void _assertTopVarConstValue(String name, String expected) {
     assertDartObjectText(_topVarConstResult(name).value, expected);
   }
diff --git a/pkg/analyzer/test/src/summary/elements_test.dart b/pkg/analyzer/test/src/summary/elements_test.dart
index b5bc665..fdca05f 100644
--- a/pkg/analyzer/test/src/summary/elements_test.dart
+++ b/pkg/analyzer/test/src/summary/elements_test.dart
@@ -1840,7 +1840,7 @@
             parameters
               requiredPositional final super.a @63
                 type: int
-                superConstructorParameter: ParameterMember
+                superConstructorParameter: SuperFormalParameterMember
                   base: a@103
                   substitution: {T: String}
             superConstructor: ConstructorMember
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index 077f5e1..0f4ece3 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -3002,7 +3002,7 @@
     }
 
     if (type.nullability == Nullability.undetermined) {
-      throw UnsupportedError('Undetermined Nullability');
+      _undeterminedNullabilityError(type);
     }
 
     // Emit non-nullable version directly.
@@ -3037,7 +3037,7 @@
     typeRep ??= _emitFutureOrNameNoInterop();
 
     if (type.declaredNullability == Nullability.undetermined) {
-      throw UnsupportedError('Undetermined Nullability');
+      _undeterminedNullabilityError(type);
     }
 
     // Emit non-nullable version directly.
@@ -3051,6 +3051,11 @@
     return _typeTable.nameType(type, typeRep);
   }
 
+  void /* Never */ _undeterminedNullabilityError(DartType type) =>
+      throw UnsupportedError(
+          'Undetermined Nullability encounted while compiling '
+          '${currentLibrary.fileUri}, which contains the type: $type.');
+
   /// Wraps [typeRep] in the appropriate wrapper for the given [nullability].
   ///
   /// Non-nullable and undetermined nullability will not cause any wrappers to
diff --git a/pkg/front_end/lib/src/fasta/kernel/hierarchy/members_node.dart b/pkg/front_end/lib/src/fasta/kernel/hierarchy/members_node.dart
index 8672ea7..49448b4 100644
--- a/pkg/front_end/lib/src/fasta/kernel/hierarchy/members_node.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/hierarchy/members_node.dart
@@ -27,6 +27,7 @@
         messageDeclaredMemberConflictsWithInheritedMember,
         messageDeclaredMemberConflictsWithInheritedMemberCause,
         messageDeclaredMemberConflictsWithOverriddenMembersCause,
+        messageEnumAbstractMember,
         messageInheritedMembersConflict,
         messageInheritedMembersConflictCause1,
         messageInheritedMembersConflictCause2,
@@ -2351,14 +2352,19 @@
     Map<String, LocatedMessage> contextMap = <String, LocatedMessage>{};
     for (ClassMember declaration in unfoldDeclarations(abstractMembers)) {
       if (isNameVisibleIn(declaration.name, classBuilder.libraryBuilder)) {
-        String name = declaration.fullNameForErrors;
-        String className = declaration.classBuilder.fullNameForErrors;
-        String displayName =
-            declaration.isSetter ? "$className.$name=" : "$className.$name";
-        contextMap[displayName] = templateMissingImplementationCause
-            .withArguments(displayName)
-            .withLocation(
-                declaration.fileUri, declaration.charOffset, name.length);
+        if (classBuilder.isEnum && declaration.classBuilder == classBuilder) {
+          classBuilder.addProblem(messageEnumAbstractMember,
+              declaration.charOffset, declaration.name.text.length);
+        } else {
+          String name = declaration.fullNameForErrors;
+          String className = declaration.classBuilder.fullNameForErrors;
+          String displayName =
+              declaration.isSetter ? "$className.$name=" : "$className.$name";
+          contextMap[displayName] = templateMissingImplementationCause
+              .withArguments(displayName)
+              .withLocation(
+                  declaration.fileUri, declaration.charOffset, name.length);
+        }
       }
     }
     if (contextMap.isEmpty) return;
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index d7d8f6a1..078af67 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -214,6 +214,8 @@
 DuplicatedNamedArgument/example: Fail
 DuplicatedParameterName/example: Fail
 Encoding/analyzerCode: Fail
+EnumAbstractMember/analyzerCode: Fail
+EnumAbstractMember/example: Fail
 EnumConstantSameNameAsEnclosing/example: Fail
 EnumConstructorSuperInitializer/analyzerCode: Fail
 EnumConstructorSuperInitializer/example: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index dfd77a5..c2b37b6 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -5577,3 +5577,6 @@
 
 EnumImplementerContainsRestrictedInstanceDeclaration:
   problemMessage: "'#name' has 'Enum' as a superinterface and can't contain non-static members with name '#name2'."
+
+EnumAbstractMember:
+  problemMessage: "Enums can't declare abstract members."
diff --git a/pkg/front_end/testcases/enhanced_enums/abstract_members.dart b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart
new file mode 100644
index 0000000..25589b4
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart
@@ -0,0 +1,57 @@
+// Copyright (c) 2022, 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.
+
+enum E1 {
+  element;
+
+  void foo(); // Error.
+}
+
+enum E2 {
+  element;
+
+  int get foo; // Error.
+}
+
+enum E3 {
+  element;
+
+  void set foo(int val); // Error.
+}
+
+abstract class InterfaceMethod {
+  void foo();
+}
+
+enum E4 implements InterfaceMethod { // Error.
+  element
+}
+
+abstract class InterfaceGetter {
+  int get foo;
+}
+
+enum E5 implements InterfaceGetter { // Error.
+  element
+}
+
+abstract class InterfaceSetter {
+  void set foo(int val);
+}
+
+enum E6 implements InterfaceSetter { // Error.
+  element
+}
+
+mixin MethodImplementation {
+  void foo() {}
+}
+
+enum E7 with MethodImplementation {
+  element;
+
+  void foo(); // Ok.
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.strong.expect
new file mode 100644
index 0000000..01185de
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.strong.expect
@@ -0,0 +1,190 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:8:8: Error: Enums can't declare abstract members.
+//   void foo(); // Error.
+//        ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:14:11: Error: Enums can't declare abstract members.
+//   int get foo; // Error.
+//           ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:20:12: Error: Enums can't declare abstract members.
+//   void set foo(int val); // Error.
+//            ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:27:6: Error: The non-abstract class 'E4' is missing implementations for these members:
+//  - InterfaceMethod.foo
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// enum E4 implements InterfaceMethod { // Error.
+//      ^^
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:24:8: Context: 'InterfaceMethod.foo' is defined here.
+//   void foo();
+//        ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:35:6: Error: The non-abstract class 'E5' is missing implementations for these members:
+//  - InterfaceGetter.foo
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// enum E5 implements InterfaceGetter { // Error.
+//      ^^
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:32:11: Context: 'InterfaceGetter.foo' is defined here.
+//   int get foo;
+//           ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:43:6: Error: The non-abstract class 'E6' is missing implementations for these members:
+//  - InterfaceSetter.foo=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// enum E6 implements InterfaceSetter { // Error.
+//      ^^
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:40:12: Context: 'InterfaceSetter.foo=' is defined here.
+//   void set foo(int val);
+//            ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E1> values = #C4;
+  static const field self::E1 element = #C3;
+  const constructor •(core::int index, core::String name) → self::E1
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+  abstract method foo() → void;
+}
+class E2 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2> values = #C6;
+  static const field self::E2 element = #C5;
+  const constructor •(core::int index, core::String name) → self::E2
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+  abstract get foo() → core::int;
+}
+class E3 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E3> values = #C8;
+  static const field self::E3 element = #C7;
+  const constructor •(core::int index, core::String name) → self::E3
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E3.${this.{core::_Enum::_name}{core::String}}";
+  abstract set foo(core::int val) → void;
+}
+abstract class InterfaceMethod extends core::Object {
+  synthetic constructor •() → self::InterfaceMethod
+    : super core::Object::•()
+    ;
+  abstract method foo() → void;
+}
+class E4 extends core::_Enum implements self::InterfaceMethod /*isEnum*/  {
+  static const field core::List<self::E4> values = #C10;
+  static const field self::E4 element = #C9;
+  const constructor •(core::int index, core::String name) → self::E4
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E4.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class InterfaceGetter extends core::Object {
+  synthetic constructor •() → self::InterfaceGetter
+    : super core::Object::•()
+    ;
+  abstract get foo() → core::int;
+}
+class E5 extends core::_Enum implements self::InterfaceGetter /*isEnum*/  {
+  static const field core::List<self::E5> values = #C12;
+  static const field self::E5 element = #C11;
+  const constructor •(core::int index, core::String name) → self::E5
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E5.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class InterfaceSetter extends core::Object {
+  synthetic constructor •() → self::InterfaceSetter
+    : super core::Object::•()
+    ;
+  abstract set foo(core::int val) → void;
+}
+class E6 extends core::_Enum implements self::InterfaceSetter /*isEnum*/  {
+  static const field core::List<self::E6> values = #C14;
+  static const field self::E6 element = #C13;
+  const constructor •(core::int index, core::String name) → self::E6
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E6.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class MethodImplementation extends core::Object /*isMixinDeclaration*/  {
+  method foo() → void {}
+}
+abstract class _E7&_Enum&MethodImplementation = core::_Enum with self::MethodImplementation /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_E7&_Enum&MethodImplementation
+    : super core::_Enum::•(index, _name)
+    ;
+  mixin-super-stub method foo() → void
+    return super.{self::MethodImplementation::foo}();
+}
+class E7 extends self::_E7&_Enum&MethodImplementation /*isEnum*/  {
+  static const field core::List<self::E7> values = #C16;
+  static const field self::E7 element = #C15;
+  const constructor •(core::int index, core::String name) → self::E7
+    : super self::_E7&_Enum&MethodImplementation::•(index, name)
+    ;
+  method toString() → core::String
+    return "E7.${this.{core::_Enum::_name}{core::String}}";
+  abstract method foo() → void;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "element"
+  #C3 = self::E1 {index:#C1, _name:#C2}
+  #C4 = <self::E1>[#C3]
+  #C5 = self::E2 {index:#C1, _name:#C2}
+  #C6 = <self::E2>[#C5]
+  #C7 = self::E3 {index:#C1, _name:#C2}
+  #C8 = <self::E3>[#C7]
+  #C9 = self::E4 {index:#C1, _name:#C2}
+  #C10 = <self::E4>[#C9]
+  #C11 = self::E5 {index:#C1, _name:#C2}
+  #C12 = <self::E5>[#C11]
+  #C13 = self::E6 {index:#C1, _name:#C2}
+  #C14 = <self::E6>[#C13]
+  #C15 = self::E7 {index:#C1, _name:#C2}
+  #C16 = <self::E7>[#C15]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///abstract_members.dart:
+- E1. (from org-dartlang-testcase:///abstract_members.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E2. (from org-dartlang-testcase:///abstract_members.dart:11:6)
+- E3. (from org-dartlang-testcase:///abstract_members.dart:17:6)
+- E4. (from org-dartlang-testcase:///abstract_members.dart:27:6)
+- E5. (from org-dartlang-testcase:///abstract_members.dart:35:6)
+- E6. (from org-dartlang-testcase:///abstract_members.dart:43:6)
+- E7. (from org-dartlang-testcase:///abstract_members.dart:51:6)
+- _E7&_Enum&MethodImplementation. (from org-dartlang-testcase:///abstract_members.dart:51:6)
diff --git a/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.strong.transformed.expect
new file mode 100644
index 0000000..7bc3967
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.strong.transformed.expect
@@ -0,0 +1,189 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:8:8: Error: Enums can't declare abstract members.
+//   void foo(); // Error.
+//        ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:14:11: Error: Enums can't declare abstract members.
+//   int get foo; // Error.
+//           ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:20:12: Error: Enums can't declare abstract members.
+//   void set foo(int val); // Error.
+//            ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:27:6: Error: The non-abstract class 'E4' is missing implementations for these members:
+//  - InterfaceMethod.foo
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// enum E4 implements InterfaceMethod { // Error.
+//      ^^
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:24:8: Context: 'InterfaceMethod.foo' is defined here.
+//   void foo();
+//        ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:35:6: Error: The non-abstract class 'E5' is missing implementations for these members:
+//  - InterfaceGetter.foo
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// enum E5 implements InterfaceGetter { // Error.
+//      ^^
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:32:11: Context: 'InterfaceGetter.foo' is defined here.
+//   int get foo;
+//           ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:43:6: Error: The non-abstract class 'E6' is missing implementations for these members:
+//  - InterfaceSetter.foo=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// enum E6 implements InterfaceSetter { // Error.
+//      ^^
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:40:12: Context: 'InterfaceSetter.foo=' is defined here.
+//   void set foo(int val);
+//            ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E1> values = #C4;
+  static const field self::E1 element = #C3;
+  const constructor •(core::int index, core::String name) → self::E1
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+  abstract method foo() → void;
+}
+class E2 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2> values = #C6;
+  static const field self::E2 element = #C5;
+  const constructor •(core::int index, core::String name) → self::E2
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+  abstract get foo() → core::int;
+}
+class E3 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E3> values = #C8;
+  static const field self::E3 element = #C7;
+  const constructor •(core::int index, core::String name) → self::E3
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E3.${this.{core::_Enum::_name}{core::String}}";
+  abstract set foo(core::int val) → void;
+}
+abstract class InterfaceMethod extends core::Object {
+  synthetic constructor •() → self::InterfaceMethod
+    : super core::Object::•()
+    ;
+  abstract method foo() → void;
+}
+class E4 extends core::_Enum implements self::InterfaceMethod /*isEnum*/  {
+  static const field core::List<self::E4> values = #C10;
+  static const field self::E4 element = #C9;
+  const constructor •(core::int index, core::String name) → self::E4
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E4.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class InterfaceGetter extends core::Object {
+  synthetic constructor •() → self::InterfaceGetter
+    : super core::Object::•()
+    ;
+  abstract get foo() → core::int;
+}
+class E5 extends core::_Enum implements self::InterfaceGetter /*isEnum*/  {
+  static const field core::List<self::E5> values = #C12;
+  static const field self::E5 element = #C11;
+  const constructor •(core::int index, core::String name) → self::E5
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E5.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class InterfaceSetter extends core::Object {
+  synthetic constructor •() → self::InterfaceSetter
+    : super core::Object::•()
+    ;
+  abstract set foo(core::int val) → void;
+}
+class E6 extends core::_Enum implements self::InterfaceSetter /*isEnum*/  {
+  static const field core::List<self::E6> values = #C14;
+  static const field self::E6 element = #C13;
+  const constructor •(core::int index, core::String name) → self::E6
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E6.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class MethodImplementation extends core::Object /*isMixinDeclaration*/  {
+  method foo() → void {}
+}
+abstract class _E7&_Enum&MethodImplementation extends core::_Enum implements self::MethodImplementation /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_E7&_Enum&MethodImplementation
+    : super core::_Enum::•(index, _name)
+    ;
+  method foo() → void {}
+}
+class E7 extends self::_E7&_Enum&MethodImplementation /*isEnum*/  {
+  static const field core::List<self::E7> values = #C16;
+  static const field self::E7 element = #C15;
+  const constructor •(core::int index, core::String name) → self::E7
+    : super self::_E7&_Enum&MethodImplementation::•(index, name)
+    ;
+  method toString() → core::String
+    return "E7.${this.{core::_Enum::_name}{core::String}}";
+  abstract method foo() → void;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "element"
+  #C3 = self::E1 {index:#C1, _name:#C2}
+  #C4 = <self::E1>[#C3]
+  #C5 = self::E2 {index:#C1, _name:#C2}
+  #C6 = <self::E2>[#C5]
+  #C7 = self::E3 {index:#C1, _name:#C2}
+  #C8 = <self::E3>[#C7]
+  #C9 = self::E4 {index:#C1, _name:#C2}
+  #C10 = <self::E4>[#C9]
+  #C11 = self::E5 {index:#C1, _name:#C2}
+  #C12 = <self::E5>[#C11]
+  #C13 = self::E6 {index:#C1, _name:#C2}
+  #C14 = <self::E6>[#C13]
+  #C15 = self::E7 {index:#C1, _name:#C2}
+  #C16 = <self::E7>[#C15]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///abstract_members.dart:
+- E1. (from org-dartlang-testcase:///abstract_members.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E2. (from org-dartlang-testcase:///abstract_members.dart:11:6)
+- E3. (from org-dartlang-testcase:///abstract_members.dart:17:6)
+- E4. (from org-dartlang-testcase:///abstract_members.dart:27:6)
+- E5. (from org-dartlang-testcase:///abstract_members.dart:35:6)
+- E6. (from org-dartlang-testcase:///abstract_members.dart:43:6)
+- E7. (from org-dartlang-testcase:///abstract_members.dart:51:6)
+- _E7&_Enum&MethodImplementation. (from org-dartlang-testcase:///abstract_members.dart:51:6)
diff --git a/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.textual_outline.expect b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.textual_outline.expect
new file mode 100644
index 0000000..f15df76
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.textual_outline.expect
@@ -0,0 +1,47 @@
+enum E1 {
+  element;
+
+  void foo();
+}
+
+enum E2 {
+  element;
+
+  int get foo;
+}
+
+enum E3 {
+  element;
+
+  void set foo(int val);
+}
+
+abstract class InterfaceMethod {
+  void foo();
+}
+
+enum E4 implements InterfaceMethod { element }
+
+abstract class InterfaceGetter {
+  int get foo;
+}
+
+enum E5 implements InterfaceGetter { element }
+
+abstract class InterfaceSetter {
+  void set foo(int val);
+}
+
+enum E6 implements InterfaceSetter { element }
+
+mixin MethodImplementation {
+  void foo() {}
+}
+
+enum E7 with MethodImplementation {
+  element;
+
+  void foo();
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..7f0a7bd
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.textual_outline_modelled.expect
@@ -0,0 +1,46 @@
+abstract class InterfaceGetter {
+  int get foo;
+}
+
+abstract class InterfaceMethod {
+  void foo();
+}
+
+abstract class InterfaceSetter {
+  void set foo(int val);
+}
+
+enum E1 {
+  element;
+
+  void foo();
+}
+
+enum E2 {
+  element;
+
+  int get foo;
+}
+
+enum E3 {
+  element;
+
+  void set foo(int val);
+}
+
+enum E4 implements InterfaceMethod { element }
+
+enum E5 implements InterfaceGetter { element }
+
+enum E6 implements InterfaceSetter { element }
+
+enum E7 with MethodImplementation {
+  element;
+
+  void foo();
+}
+
+main() {}
+mixin MethodImplementation {
+  void foo() {}
+}
diff --git a/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.weak.expect
new file mode 100644
index 0000000..6548f65
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.weak.expect
@@ -0,0 +1,190 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:8:8: Error: Enums can't declare abstract members.
+//   void foo(); // Error.
+//        ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:14:11: Error: Enums can't declare abstract members.
+//   int get foo; // Error.
+//           ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:20:12: Error: Enums can't declare abstract members.
+//   void set foo(int val); // Error.
+//            ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:27:6: Error: The non-abstract class 'E4' is missing implementations for these members:
+//  - InterfaceMethod.foo
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// enum E4 implements InterfaceMethod { // Error.
+//      ^^
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:24:8: Context: 'InterfaceMethod.foo' is defined here.
+//   void foo();
+//        ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:35:6: Error: The non-abstract class 'E5' is missing implementations for these members:
+//  - InterfaceGetter.foo
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// enum E5 implements InterfaceGetter { // Error.
+//      ^^
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:32:11: Context: 'InterfaceGetter.foo' is defined here.
+//   int get foo;
+//           ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:43:6: Error: The non-abstract class 'E6' is missing implementations for these members:
+//  - InterfaceSetter.foo=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// enum E6 implements InterfaceSetter { // Error.
+//      ^^
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:40:12: Context: 'InterfaceSetter.foo=' is defined here.
+//   void set foo(int val);
+//            ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E1> values = #C4;
+  static const field self::E1 element = #C3;
+  const constructor •(core::int index, core::String name) → self::E1
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+  abstract method foo() → void;
+}
+class E2 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2> values = #C6;
+  static const field self::E2 element = #C5;
+  const constructor •(core::int index, core::String name) → self::E2
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+  abstract get foo() → core::int;
+}
+class E3 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E3> values = #C8;
+  static const field self::E3 element = #C7;
+  const constructor •(core::int index, core::String name) → self::E3
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E3.${this.{core::_Enum::_name}{core::String}}";
+  abstract set foo(core::int val) → void;
+}
+abstract class InterfaceMethod extends core::Object {
+  synthetic constructor •() → self::InterfaceMethod
+    : super core::Object::•()
+    ;
+  abstract method foo() → void;
+}
+class E4 extends core::_Enum implements self::InterfaceMethod /*isEnum*/  {
+  static const field core::List<self::E4> values = #C10;
+  static const field self::E4 element = #C9;
+  const constructor •(core::int index, core::String name) → self::E4
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E4.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class InterfaceGetter extends core::Object {
+  synthetic constructor •() → self::InterfaceGetter
+    : super core::Object::•()
+    ;
+  abstract get foo() → core::int;
+}
+class E5 extends core::_Enum implements self::InterfaceGetter /*isEnum*/  {
+  static const field core::List<self::E5> values = #C12;
+  static const field self::E5 element = #C11;
+  const constructor •(core::int index, core::String name) → self::E5
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E5.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class InterfaceSetter extends core::Object {
+  synthetic constructor •() → self::InterfaceSetter
+    : super core::Object::•()
+    ;
+  abstract set foo(core::int val) → void;
+}
+class E6 extends core::_Enum implements self::InterfaceSetter /*isEnum*/  {
+  static const field core::List<self::E6> values = #C14;
+  static const field self::E6 element = #C13;
+  const constructor •(core::int index, core::String name) → self::E6
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E6.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class MethodImplementation extends core::Object /*isMixinDeclaration*/  {
+  method foo() → void {}
+}
+abstract class _E7&_Enum&MethodImplementation = core::_Enum with self::MethodImplementation /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_E7&_Enum&MethodImplementation
+    : super core::_Enum::•(index, _name)
+    ;
+  mixin-super-stub method foo() → void
+    return super.{self::MethodImplementation::foo}();
+}
+class E7 extends self::_E7&_Enum&MethodImplementation /*isEnum*/  {
+  static const field core::List<self::E7> values = #C16;
+  static const field self::E7 element = #C15;
+  const constructor •(core::int index, core::String name) → self::E7
+    : super self::_E7&_Enum&MethodImplementation::•(index, name)
+    ;
+  method toString() → core::String
+    return "E7.${this.{core::_Enum::_name}{core::String}}";
+  abstract method foo() → void;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "element"
+  #C3 = self::E1 {index:#C1, _name:#C2}
+  #C4 = <self::E1*>[#C3]
+  #C5 = self::E2 {index:#C1, _name:#C2}
+  #C6 = <self::E2*>[#C5]
+  #C7 = self::E3 {index:#C1, _name:#C2}
+  #C8 = <self::E3*>[#C7]
+  #C9 = self::E4 {index:#C1, _name:#C2}
+  #C10 = <self::E4*>[#C9]
+  #C11 = self::E5 {index:#C1, _name:#C2}
+  #C12 = <self::E5*>[#C11]
+  #C13 = self::E6 {index:#C1, _name:#C2}
+  #C14 = <self::E6*>[#C13]
+  #C15 = self::E7 {index:#C1, _name:#C2}
+  #C16 = <self::E7*>[#C15]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///abstract_members.dart:
+- E1. (from org-dartlang-testcase:///abstract_members.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E2. (from org-dartlang-testcase:///abstract_members.dart:11:6)
+- E3. (from org-dartlang-testcase:///abstract_members.dart:17:6)
+- E4. (from org-dartlang-testcase:///abstract_members.dart:27:6)
+- E5. (from org-dartlang-testcase:///abstract_members.dart:35:6)
+- E6. (from org-dartlang-testcase:///abstract_members.dart:43:6)
+- E7. (from org-dartlang-testcase:///abstract_members.dart:51:6)
+- _E7&_Enum&MethodImplementation. (from org-dartlang-testcase:///abstract_members.dart:51:6)
diff --git a/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.weak.modular.expect b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.weak.modular.expect
new file mode 100644
index 0000000..6548f65
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.weak.modular.expect
@@ -0,0 +1,190 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:8:8: Error: Enums can't declare abstract members.
+//   void foo(); // Error.
+//        ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:14:11: Error: Enums can't declare abstract members.
+//   int get foo; // Error.
+//           ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:20:12: Error: Enums can't declare abstract members.
+//   void set foo(int val); // Error.
+//            ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:27:6: Error: The non-abstract class 'E4' is missing implementations for these members:
+//  - InterfaceMethod.foo
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// enum E4 implements InterfaceMethod { // Error.
+//      ^^
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:24:8: Context: 'InterfaceMethod.foo' is defined here.
+//   void foo();
+//        ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:35:6: Error: The non-abstract class 'E5' is missing implementations for these members:
+//  - InterfaceGetter.foo
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// enum E5 implements InterfaceGetter { // Error.
+//      ^^
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:32:11: Context: 'InterfaceGetter.foo' is defined here.
+//   int get foo;
+//           ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:43:6: Error: The non-abstract class 'E6' is missing implementations for these members:
+//  - InterfaceSetter.foo=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// enum E6 implements InterfaceSetter { // Error.
+//      ^^
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:40:12: Context: 'InterfaceSetter.foo=' is defined here.
+//   void set foo(int val);
+//            ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E1> values = #C4;
+  static const field self::E1 element = #C3;
+  const constructor •(core::int index, core::String name) → self::E1
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+  abstract method foo() → void;
+}
+class E2 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2> values = #C6;
+  static const field self::E2 element = #C5;
+  const constructor •(core::int index, core::String name) → self::E2
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+  abstract get foo() → core::int;
+}
+class E3 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E3> values = #C8;
+  static const field self::E3 element = #C7;
+  const constructor •(core::int index, core::String name) → self::E3
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E3.${this.{core::_Enum::_name}{core::String}}";
+  abstract set foo(core::int val) → void;
+}
+abstract class InterfaceMethod extends core::Object {
+  synthetic constructor •() → self::InterfaceMethod
+    : super core::Object::•()
+    ;
+  abstract method foo() → void;
+}
+class E4 extends core::_Enum implements self::InterfaceMethod /*isEnum*/  {
+  static const field core::List<self::E4> values = #C10;
+  static const field self::E4 element = #C9;
+  const constructor •(core::int index, core::String name) → self::E4
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E4.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class InterfaceGetter extends core::Object {
+  synthetic constructor •() → self::InterfaceGetter
+    : super core::Object::•()
+    ;
+  abstract get foo() → core::int;
+}
+class E5 extends core::_Enum implements self::InterfaceGetter /*isEnum*/  {
+  static const field core::List<self::E5> values = #C12;
+  static const field self::E5 element = #C11;
+  const constructor •(core::int index, core::String name) → self::E5
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E5.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class InterfaceSetter extends core::Object {
+  synthetic constructor •() → self::InterfaceSetter
+    : super core::Object::•()
+    ;
+  abstract set foo(core::int val) → void;
+}
+class E6 extends core::_Enum implements self::InterfaceSetter /*isEnum*/  {
+  static const field core::List<self::E6> values = #C14;
+  static const field self::E6 element = #C13;
+  const constructor •(core::int index, core::String name) → self::E6
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E6.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class MethodImplementation extends core::Object /*isMixinDeclaration*/  {
+  method foo() → void {}
+}
+abstract class _E7&_Enum&MethodImplementation = core::_Enum with self::MethodImplementation /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_E7&_Enum&MethodImplementation
+    : super core::_Enum::•(index, _name)
+    ;
+  mixin-super-stub method foo() → void
+    return super.{self::MethodImplementation::foo}();
+}
+class E7 extends self::_E7&_Enum&MethodImplementation /*isEnum*/  {
+  static const field core::List<self::E7> values = #C16;
+  static const field self::E7 element = #C15;
+  const constructor •(core::int index, core::String name) → self::E7
+    : super self::_E7&_Enum&MethodImplementation::•(index, name)
+    ;
+  method toString() → core::String
+    return "E7.${this.{core::_Enum::_name}{core::String}}";
+  abstract method foo() → void;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "element"
+  #C3 = self::E1 {index:#C1, _name:#C2}
+  #C4 = <self::E1*>[#C3]
+  #C5 = self::E2 {index:#C1, _name:#C2}
+  #C6 = <self::E2*>[#C5]
+  #C7 = self::E3 {index:#C1, _name:#C2}
+  #C8 = <self::E3*>[#C7]
+  #C9 = self::E4 {index:#C1, _name:#C2}
+  #C10 = <self::E4*>[#C9]
+  #C11 = self::E5 {index:#C1, _name:#C2}
+  #C12 = <self::E5*>[#C11]
+  #C13 = self::E6 {index:#C1, _name:#C2}
+  #C14 = <self::E6*>[#C13]
+  #C15 = self::E7 {index:#C1, _name:#C2}
+  #C16 = <self::E7*>[#C15]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///abstract_members.dart:
+- E1. (from org-dartlang-testcase:///abstract_members.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E2. (from org-dartlang-testcase:///abstract_members.dart:11:6)
+- E3. (from org-dartlang-testcase:///abstract_members.dart:17:6)
+- E4. (from org-dartlang-testcase:///abstract_members.dart:27:6)
+- E5. (from org-dartlang-testcase:///abstract_members.dart:35:6)
+- E6. (from org-dartlang-testcase:///abstract_members.dart:43:6)
+- E7. (from org-dartlang-testcase:///abstract_members.dart:51:6)
+- _E7&_Enum&MethodImplementation. (from org-dartlang-testcase:///abstract_members.dart:51:6)
diff --git a/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.weak.outline.expect b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.weak.outline.expect
new file mode 100644
index 0000000..ea495c1
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.weak.outline.expect
@@ -0,0 +1,173 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:8:8: Error: Enums can't declare abstract members.
+//   void foo(); // Error.
+//        ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:14:11: Error: Enums can't declare abstract members.
+//   int get foo; // Error.
+//           ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:20:12: Error: Enums can't declare abstract members.
+//   void set foo(int val); // Error.
+//            ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:27:6: Error: The non-abstract class 'E4' is missing implementations for these members:
+//  - InterfaceMethod.foo
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// enum E4 implements InterfaceMethod { // Error.
+//      ^^
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:24:8: Context: 'InterfaceMethod.foo' is defined here.
+//   void foo();
+//        ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:35:6: Error: The non-abstract class 'E5' is missing implementations for these members:
+//  - InterfaceGetter.foo
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// enum E5 implements InterfaceGetter { // Error.
+//      ^^
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:32:11: Context: 'InterfaceGetter.foo' is defined here.
+//   int get foo;
+//           ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:43:6: Error: The non-abstract class 'E6' is missing implementations for these members:
+//  - InterfaceSetter.foo=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// enum E6 implements InterfaceSetter { // Error.
+//      ^^
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:40:12: Context: 'InterfaceSetter.foo=' is defined here.
+//   void set foo(int val);
+//            ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E1> values = const <self::E1>[self::E1::element];
+  static const field self::E1 element = const self::E1::•(0, "element");
+  const constructor •(core::int index, core::String name) → self::E1
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+  abstract method foo() → void;
+}
+class E2 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2> values = const <self::E2>[self::E2::element];
+  static const field self::E2 element = const self::E2::•(0, "element");
+  const constructor •(core::int index, core::String name) → self::E2
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+  abstract get foo() → core::int;
+}
+class E3 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E3> values = const <self::E3>[self::E3::element];
+  static const field self::E3 element = const self::E3::•(0, "element");
+  const constructor •(core::int index, core::String name) → self::E3
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E3.${this.{core::_Enum::_name}{core::String}}";
+  abstract set foo(core::int val) → void;
+}
+abstract class InterfaceMethod extends core::Object {
+  synthetic constructor •() → self::InterfaceMethod
+    ;
+  abstract method foo() → void;
+}
+class E4 extends core::_Enum implements self::InterfaceMethod /*isEnum*/  {
+  static const field core::List<self::E4> values = const <self::E4>[self::E4::element];
+  static const field self::E4 element = const self::E4::•(0, "element");
+  const constructor •(core::int index, core::String name) → self::E4
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E4.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class InterfaceGetter extends core::Object {
+  synthetic constructor •() → self::InterfaceGetter
+    ;
+  abstract get foo() → core::int;
+}
+class E5 extends core::_Enum implements self::InterfaceGetter /*isEnum*/  {
+  static const field core::List<self::E5> values = const <self::E5>[self::E5::element];
+  static const field self::E5 element = const self::E5::•(0, "element");
+  const constructor •(core::int index, core::String name) → self::E5
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E5.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class InterfaceSetter extends core::Object {
+  synthetic constructor •() → self::InterfaceSetter
+    ;
+  abstract set foo(core::int val) → void;
+}
+class E6 extends core::_Enum implements self::InterfaceSetter /*isEnum*/  {
+  static const field core::List<self::E6> values = const <self::E6>[self::E6::element];
+  static const field self::E6 element = const self::E6::•(0, "element");
+  const constructor •(core::int index, core::String name) → self::E6
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E6.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class MethodImplementation extends core::Object /*isMixinDeclaration*/  {
+  method foo() → void
+    ;
+}
+abstract class _E7&_Enum&MethodImplementation = core::_Enum with self::MethodImplementation /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_E7&_Enum&MethodImplementation
+    : super core::_Enum::•(index, _name)
+    ;
+  mixin-super-stub method foo() → void
+    return super.{self::MethodImplementation::foo}();
+}
+class E7 extends self::_E7&_Enum&MethodImplementation /*isEnum*/  {
+  static const field core::List<self::E7> values = const <self::E7>[self::E7::element];
+  static const field self::E7 element = const self::E7::•(0, "element");
+  const constructor •(core::int index, core::String name) → self::E7
+    ;
+  method toString() → core::String
+    return "E7.${this.{core::_Enum::_name}{core::String}}";
+  abstract method foo() → void;
+}
+static method main() → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_members.dart:5:6 -> ListConstant(const <E1*>[const E1{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///abstract_members.dart:6:3 -> InstanceConstant(const E1{_Enum.index: 0, _Enum._name: "element"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_members.dart:11:6 -> ListConstant(const <E2*>[const E2{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///abstract_members.dart:12:3 -> InstanceConstant(const E2{_Enum.index: 0, _Enum._name: "element"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_members.dart:17:6 -> ListConstant(const <E3*>[const E3{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///abstract_members.dart:18:3 -> InstanceConstant(const E3{_Enum.index: 0, _Enum._name: "element"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_members.dart:27:6 -> ListConstant(const <E4*>[const E4{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///abstract_members.dart:28:3 -> InstanceConstant(const E4{_Enum.index: 0, _Enum._name: "element"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_members.dart:35:6 -> ListConstant(const <E5*>[const E5{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///abstract_members.dart:36:3 -> InstanceConstant(const E5{_Enum.index: 0, _Enum._name: "element"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_members.dart:43:6 -> ListConstant(const <E6*>[const E6{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///abstract_members.dart:44:3 -> InstanceConstant(const E6{_Enum.index: 0, _Enum._name: "element"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_members.dart:51:6 -> ListConstant(const <E7*>[const E7{}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///abstract_members.dart:52:3 -> InstanceConstant(const E7{})
+Extra constant evaluation: evaluated: 50, effectively constant: 14
diff --git a/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.weak.transformed.expect
new file mode 100644
index 0000000..08739b0
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.weak.transformed.expect
@@ -0,0 +1,189 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:8:8: Error: Enums can't declare abstract members.
+//   void foo(); // Error.
+//        ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:14:11: Error: Enums can't declare abstract members.
+//   int get foo; // Error.
+//           ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:20:12: Error: Enums can't declare abstract members.
+//   void set foo(int val); // Error.
+//            ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:27:6: Error: The non-abstract class 'E4' is missing implementations for these members:
+//  - InterfaceMethod.foo
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// enum E4 implements InterfaceMethod { // Error.
+//      ^^
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:24:8: Context: 'InterfaceMethod.foo' is defined here.
+//   void foo();
+//        ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:35:6: Error: The non-abstract class 'E5' is missing implementations for these members:
+//  - InterfaceGetter.foo
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// enum E5 implements InterfaceGetter { // Error.
+//      ^^
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:32:11: Context: 'InterfaceGetter.foo' is defined here.
+//   int get foo;
+//           ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:43:6: Error: The non-abstract class 'E6' is missing implementations for these members:
+//  - InterfaceSetter.foo=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// enum E6 implements InterfaceSetter { // Error.
+//      ^^
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:40:12: Context: 'InterfaceSetter.foo=' is defined here.
+//   void set foo(int val);
+//            ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E1> values = #C4;
+  static const field self::E1 element = #C3;
+  const constructor •(core::int index, core::String name) → self::E1
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+  abstract method foo() → void;
+}
+class E2 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2> values = #C6;
+  static const field self::E2 element = #C5;
+  const constructor •(core::int index, core::String name) → self::E2
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+  abstract get foo() → core::int;
+}
+class E3 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E3> values = #C8;
+  static const field self::E3 element = #C7;
+  const constructor •(core::int index, core::String name) → self::E3
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E3.${this.{core::_Enum::_name}{core::String}}";
+  abstract set foo(core::int val) → void;
+}
+abstract class InterfaceMethod extends core::Object {
+  synthetic constructor •() → self::InterfaceMethod
+    : super core::Object::•()
+    ;
+  abstract method foo() → void;
+}
+class E4 extends core::_Enum implements self::InterfaceMethod /*isEnum*/  {
+  static const field core::List<self::E4> values = #C10;
+  static const field self::E4 element = #C9;
+  const constructor •(core::int index, core::String name) → self::E4
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E4.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class InterfaceGetter extends core::Object {
+  synthetic constructor •() → self::InterfaceGetter
+    : super core::Object::•()
+    ;
+  abstract get foo() → core::int;
+}
+class E5 extends core::_Enum implements self::InterfaceGetter /*isEnum*/  {
+  static const field core::List<self::E5> values = #C12;
+  static const field self::E5 element = #C11;
+  const constructor •(core::int index, core::String name) → self::E5
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E5.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class InterfaceSetter extends core::Object {
+  synthetic constructor •() → self::InterfaceSetter
+    : super core::Object::•()
+    ;
+  abstract set foo(core::int val) → void;
+}
+class E6 extends core::_Enum implements self::InterfaceSetter /*isEnum*/  {
+  static const field core::List<self::E6> values = #C14;
+  static const field self::E6 element = #C13;
+  const constructor •(core::int index, core::String name) → self::E6
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E6.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class MethodImplementation extends core::Object /*isMixinDeclaration*/  {
+  method foo() → void {}
+}
+abstract class _E7&_Enum&MethodImplementation extends core::_Enum implements self::MethodImplementation /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_E7&_Enum&MethodImplementation
+    : super core::_Enum::•(index, _name)
+    ;
+  method foo() → void {}
+}
+class E7 extends self::_E7&_Enum&MethodImplementation /*isEnum*/  {
+  static const field core::List<self::E7> values = #C16;
+  static const field self::E7 element = #C15;
+  const constructor •(core::int index, core::String name) → self::E7
+    : super self::_E7&_Enum&MethodImplementation::•(index, name)
+    ;
+  method toString() → core::String
+    return "E7.${this.{core::_Enum::_name}{core::String}}";
+  abstract method foo() → void;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "element"
+  #C3 = self::E1 {index:#C1, _name:#C2}
+  #C4 = <self::E1*>[#C3]
+  #C5 = self::E2 {index:#C1, _name:#C2}
+  #C6 = <self::E2*>[#C5]
+  #C7 = self::E3 {index:#C1, _name:#C2}
+  #C8 = <self::E3*>[#C7]
+  #C9 = self::E4 {index:#C1, _name:#C2}
+  #C10 = <self::E4*>[#C9]
+  #C11 = self::E5 {index:#C1, _name:#C2}
+  #C12 = <self::E5*>[#C11]
+  #C13 = self::E6 {index:#C1, _name:#C2}
+  #C14 = <self::E6*>[#C13]
+  #C15 = self::E7 {index:#C1, _name:#C2}
+  #C16 = <self::E7*>[#C15]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///abstract_members.dart:
+- E1. (from org-dartlang-testcase:///abstract_members.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E2. (from org-dartlang-testcase:///abstract_members.dart:11:6)
+- E3. (from org-dartlang-testcase:///abstract_members.dart:17:6)
+- E4. (from org-dartlang-testcase:///abstract_members.dart:27:6)
+- E5. (from org-dartlang-testcase:///abstract_members.dart:35:6)
+- E6. (from org-dartlang-testcase:///abstract_members.dart:43:6)
+- E7. (from org-dartlang-testcase:///abstract_members.dart:51:6)
+- _E7&_Enum&MethodImplementation. (from org-dartlang-testcase:///abstract_members.dart:51:6)
diff --git a/pkg/test_runner/lib/src/options.dart b/pkg/test_runner/lib/src/options.dart
index db4f022..34a00ff 100644
--- a/pkg/test_runner/lib/src/options.dart
+++ b/pkg/test_runner/lib/src/options.dart
@@ -105,8 +105,8 @@
 dart2js:              Compile to JavaScript using dart2js.
 dart2analyzer:        Perform static analysis on Dart code using the analyzer.
 compare_analyzer_cfe: Compare analyzer and common front end representations.
-dartdevc:             Compile to JavaScript using dart2js.
-dartdevk:             Compile to JavaScript using dartdevk.
+dartdevc:             Compile to JavaScript using dartdevc.
+dartdevk:             Compile to JavaScript using dartdevc (same as dartdevc).
 app_jitk:             Compile the Dart code into Kernel and then into an app
                       snapshot.
 dartk:                Compile the Dart code into Kernel before running test.
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc
index 5f2e056..d73c065 100644
--- a/runtime/bin/dartutils.cc
+++ b/runtime/bin/dartutils.cc
@@ -680,6 +680,9 @@
   Dart_Handle type = GetDartType(kIOLibURL, "OSError");
   ASSERT(!Dart_IsError(type));
   Dart_Handle args[2];
+  if (os_error->code() == 0) {
+    FATAL("Fatal error OSError (code : 0)  DartUtils::NewDartOSError");
+  }
   args[0] = NewString(os_error->message());
   args[1] = Dart_NewInteger(os_error->code());
   return Dart_New(type, Dart_Null(), 2, args);
diff --git a/runtime/bin/file_win.cc b/runtime/bin/file_win.cc
index 8bac5cf..69cbbf7 100644
--- a/runtime/bin/file_win.cc
+++ b/runtime/bin/file_win.cc
@@ -205,22 +205,37 @@
 
 int64_t File::Position() {
   ASSERT(handle_->fd() >= 0);
-  return _lseeki64(handle_->fd(), 0, SEEK_CUR);
+  HANDLE handle = reinterpret_cast<HANDLE>(_get_osfhandle(handle_->fd()));
+  LARGE_INTEGER zero_offset;
+  zero_offset.QuadPart = 0;
+  LARGE_INTEGER position;
+  if (!SetFilePointerEx(handle, zero_offset, &position, FILE_CURRENT)) {
+    return -1L;
+  }
+  return position.QuadPart;
 }
 
 bool File::SetPosition(int64_t position) {
   ASSERT(handle_->fd() >= 0);
-  return _lseeki64(handle_->fd(), position, SEEK_SET) >= 0;
+  HANDLE handle = reinterpret_cast<HANDLE>(_get_osfhandle(handle_->fd()));
+  LARGE_INTEGER requested_position;
+  requested_position.QuadPart = position;
+  return SetFilePointerEx(handle, requested_position,
+                          /*lpNewFilePointer=*/nullptr, FILE_BEGIN);
 }
 
 bool File::Truncate(int64_t length) {
-  ASSERT(handle_->fd() >= 0);
-  return _chsize_s(handle_->fd(), length) == 0;
+  if (!SetPosition(length)) {
+    return false;
+  }
+  HANDLE handle = reinterpret_cast<HANDLE>(_get_osfhandle(handle_->fd()));
+  return SetEndOfFile(handle);
 }
 
 bool File::Flush() {
   ASSERT(handle_->fd());
-  return _commit(handle_->fd()) != -1;
+  HANDLE handle = reinterpret_cast<HANDLE>(_get_osfhandle(handle_->fd()));
+  return FlushFileBuffers(handle);
 }
 
 bool File::Lock(File::LockType lock, int64_t start, int64_t end) {
diff --git a/runtime/bin/socket.cc b/runtime/bin/socket.cc
index 21bfadf..708bda4 100644
--- a/runtime/bin/socket.cc
+++ b/runtime/bin/socket.cc
@@ -914,7 +914,18 @@
       Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
   OSError os_error;
   SocketBase::GetError(socket->fd(), &os_error);
-  Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error));
+  if (os_error.code() != 0) {
+    Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error));
+  } else {
+    Dart_SetReturnValue(args, Dart_Null());
+  }
+}
+
+void FUNCTION_NAME(Socket_Fatal)(Dart_NativeArguments args) {
+  Dart_Handle msg = Dart_GetNativeArgument(args, 0);
+  const char* msgStr =
+      (!Dart_IsNull(msg)) ? DartUtils::GetStringValue(msg) : nullptr;
+  FATAL("Fatal error in dart:io (socket): %s", msgStr);
 }
 
 void FUNCTION_NAME(Socket_GetFD)(Dart_NativeArguments args) {
diff --git a/runtime/vm/compiler/assembler/assembler_arm.cc b/runtime/vm/compiler/assembler/assembler_arm.cc
index e7778e6..795745a 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm.cc
@@ -3421,6 +3421,10 @@
 }
 
 void Assembler::EnterCFrame(intptr_t frame_space) {
+  // Already saved.
+  COMPILE_ASSERT(IsCalleeSavedRegister(THR));
+  COMPILE_ASSERT(IsCalleeSavedRegister(PP));
+
   EnterFrame(1 << FP, 0);
   ReserveAlignedFrameSpace(frame_space);
 }
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.cc b/runtime/vm/compiler/assembler/assembler_arm64.cc
index e42ac60..e2b39f7 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm64.cc
@@ -1905,6 +1905,13 @@
 }
 
 void Assembler::EnterCFrame(intptr_t frame_space) {
+  // Already saved.
+  COMPILE_ASSERT(IsCalleeSavedRegister(THR));
+  COMPILE_ASSERT(IsCalleeSavedRegister(PP));
+  COMPILE_ASSERT(IsCalleeSavedRegister(NULL_REG));
+  COMPILE_ASSERT(IsCalleeSavedRegister(HEAP_BITS));
+  COMPILE_ASSERT(IsCalleeSavedRegister(DISPATCH_TABLE_REG));
+
   Push(FP);
   mov(FP, SP);
   ReserveAlignedFrameSpace(frame_space);
diff --git a/runtime/vm/compiler/assembler/assembler_ia32.cc b/runtime/vm/compiler/assembler/assembler_ia32.cc
index de73c0f..05d3863 100644
--- a/runtime/vm/compiler/assembler/assembler_ia32.cc
+++ b/runtime/vm/compiler/assembler/assembler_ia32.cc
@@ -2738,6 +2738,9 @@
 }
 
 void Assembler::EnterCFrame(intptr_t frame_space) {
+  // Already saved.
+  COMPILE_ASSERT(IsCalleeSavedRegister(THR));
+
   EnterFrame(0);
   ReserveAlignedFrameSpace(frame_space);
 }
diff --git a/runtime/vm/compiler/assembler/assembler_riscv.cc b/runtime/vm/compiler/assembler/assembler_riscv.cc
index ff77b69..335f0ea 100644
--- a/runtime/vm/compiler/assembler/assembler_riscv.cc
+++ b/runtime/vm/compiler/assembler/assembler_riscv.cc
@@ -3478,10 +3478,13 @@
 }
 
 void Assembler::TransitionNativeToGenerated(Register state,
-                                            bool exit_safepoint) {
+                                            bool exit_safepoint,
+                                            bool ignore_unwind_in_progress) {
   if (exit_safepoint) {
-    ExitFullSafepoint(state);
+    ExitFullSafepoint(state, ignore_unwind_in_progress);
   } else {
+    // flag only makes sense if we are leaving safepoint
+    ASSERT(!ignore_unwind_in_progress);
 #if defined(DEBUG)
     // Ensure we've already left the safepoint.
     ASSERT(target::Thread::full_safepoint_state_acquired() != 0);
@@ -3540,7 +3543,8 @@
   Bind(&done);
 }
 
-void Assembler::ExitFullSafepoint(Register state) {
+void Assembler::ExitFullSafepoint(Register state,
+                                  bool ignore_unwind_in_progress) {
   // We generate the same number of instructions whether or not the slow-path is
   // forced, for consistency with EnterFullSafepoint.
   Register addr = RA;
@@ -3566,7 +3570,14 @@
   }
 
   Bind(&slow_path);
-  lx(addr, Address(THR, target::Thread::exit_safepoint_stub_offset()));
+  if (ignore_unwind_in_progress) {
+    lx(addr,
+       Address(THR,
+               target::Thread::
+                   exit_safepoint_ignore_unwind_in_progress_stub_offset()));
+  } else {
+    lx(addr, Address(THR, target::Thread::exit_safepoint_stub_offset()));
+  }
   lx(addr, FieldAddress(addr, target::Code::entry_point_offset()));
   jalr(addr);
 
@@ -3605,6 +3616,16 @@
   CheckCodePointer();
 }
 
+void Assembler::RestorePoolPointer() {
+  if (FLAG_precompiled_mode) {
+    lx(PP, Address(THR, target::Thread::global_object_pool_offset()));
+  } else {
+    lx(PP, Address(FP, target::frame_layout.code_from_fp * target::kWordSize));
+    lx(PP, FieldAddress(PP, target::Code::object_pool_offset()));
+  }
+  subi(PP, PP, kHeapObjectTag);  // Pool in PP is untagged!
+}
+
 // Restores the values of the registers that are blocked to cache some values
 // e.g. BARRIER_MASK and NULL_REG.
 void Assembler::RestorePinnedRegisters() {
@@ -3766,21 +3787,33 @@
 #undef __
 
 void Assembler::EnterCFrame(intptr_t frame_space) {
+  // Already saved.
+  COMPILE_ASSERT(IsCalleeSavedRegister(THR));
+  COMPILE_ASSERT(IsCalleeSavedRegister(NULL_REG));
+  COMPILE_ASSERT(IsCalleeSavedRegister(WRITE_BARRIER_MASK));
+  COMPILE_ASSERT(IsCalleeSavedRegister(DISPATCH_TABLE_REG));
+  // Need to save.
+  COMPILE_ASSERT(!IsCalleeSavedRegister(PP));
+
   // N.B. The ordering here is important. We must never read beyond SP or
   // it may have already been clobbered by a signal handler.
-  subi(SP, SP, frame_space + 2 * target::kWordSize);
-  sx(RA, Address(SP, frame_space + 1 * target::kWordSize));
-  sx(FP, Address(SP, frame_space + 0 * target::kWordSize));
-  addi(FP, SP, frame_space + 2 * target::kWordSize);
+  subi(SP, SP, frame_space + 3 * target::kWordSize);
+  sx(RA, Address(SP, frame_space + 2 * target::kWordSize));
+  sx(FP, Address(SP, frame_space + 1 * target::kWordSize));
+  sx(PP, Address(SP, frame_space + 0 * target::kWordSize));
+  addi(FP, SP, frame_space + 3 * target::kWordSize);
+  const intptr_t kAbiStackAlignment = 16;  // For both 32 and 64 bit.
+  andi(SP, SP, ~(kAbiStackAlignment - 1));
 }
 
 void Assembler::LeaveCFrame() {
   // N.B. The ordering here is important. We must never read beyond SP or
   // it may have already been clobbered by a signal handler.
-  subi(SP, FP, 2 * target::kWordSize);
-  lx(FP, Address(SP, 0 * target::kWordSize));
-  lx(RA, Address(SP, 1 * target::kWordSize));
-  addi(SP, SP, 2 * target::kWordSize);
+  subi(SP, FP, 3 * target::kWordSize);
+  lx(PP, Address(SP, 0 * target::kWordSize));
+  lx(FP, Address(SP, 1 * target::kWordSize));
+  lx(RA, Address(SP, 2 * target::kWordSize));
+  addi(SP, SP, 3 * target::kWordSize);
 }
 
 // A0: Receiver
diff --git a/runtime/vm/compiler/assembler/assembler_riscv.h b/runtime/vm/compiler/assembler/assembler_riscv.h
index 582a8ae..d24ea42 100644
--- a/runtime/vm/compiler/assembler/assembler_riscv.h
+++ b/runtime/vm/compiler/assembler/assembler_riscv.h
@@ -1214,12 +1214,15 @@
                                    Register new_exit_frame,
                                    Register new_exit_through_ffi,
                                    bool enter_safepoint);
-  void TransitionNativeToGenerated(Register scratch, bool exit_safepoint);
+  void TransitionNativeToGenerated(Register scratch,
+                                   bool exit_safepoint,
+                                   bool ignore_unwind_in_progress = false);
   void EnterFullSafepoint(Register scratch);
-  void ExitFullSafepoint(Register scratch);
+  void ExitFullSafepoint(Register scratch, bool ignore_unwind_in_progress);
 
   void CheckCodePointer();
   void RestoreCodePointer();
+  void RestorePoolPointer();
 
   // Restores the values of the registers that are blocked to cache some values
   // e.g. BARRIER_MASK and NULL_REG.
diff --git a/runtime/vm/compiler/assembler/assembler_x64.cc b/runtime/vm/compiler/assembler/assembler_x64.cc
index 14f4bad..bfc1a69 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.cc
+++ b/runtime/vm/compiler/assembler/assembler_x64.cc
@@ -2087,6 +2087,10 @@
 }
 
 void Assembler::EnterCFrame(intptr_t frame_space) {
+  // Already saved.
+  COMPILE_ASSERT(IsCalleeSavedRegister(THR));
+  COMPILE_ASSERT(IsCalleeSavedRegister(PP));
+
   EnterFrame(0);
   ReserveAlignedFrameSpace(frame_space);
 }
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index 3dab29a..c04289b 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -1427,8 +1427,7 @@
   const Register temp1 = locs()->temp(2).reg();
 
   // Ensure these are callee-saved register and are preserved across the call.
-  ASSERT((CallingConventions::kCalleeSaveCpuRegisters &
-          (1 << saved_fp_or_sp)) != 0);
+  ASSERT(IsCalleeSavedRegister(saved_fp_or_sp));
   // Other temps don't need to be preserved.
 
   __ mov(saved_fp_or_sp,
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index 7ba8603..2467df7 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -1253,9 +1253,8 @@
   const Register temp_csp = locs()->temp(3).reg();
 
   // Ensure these are callee-saved register and are preserved across the call.
-  ASSERT((CallingConventions::kCalleeSaveCpuRegisters &
-          (1 << saved_fp_or_sp)) != 0);
-  ASSERT((CallingConventions::kCalleeSaveCpuRegisters & (1 << temp_csp)) != 0);
+  ASSERT(IsCalleeSavedRegister(saved_fp_or_sp));
+  ASSERT(IsCalleeSavedRegister(temp_csp));
   // Other temps don't need to be preserved.
 
   __ mov(saved_fp_or_sp, is_leaf_ ? SPREG : FPREG);
diff --git a/runtime/vm/compiler/backend/il_ia32.cc b/runtime/vm/compiler/backend/il_ia32.cc
index d608637..0d29e71 100644
--- a/runtime/vm/compiler/backend/il_ia32.cc
+++ b/runtime/vm/compiler/backend/il_ia32.cc
@@ -1022,8 +1022,7 @@
   const Register saved_fp_or_sp = locs()->temp(1).reg();
 
   // Ensure these are callee-saved register and are preserved across the call.
-  ASSERT((CallingConventions::kCalleeSaveCpuRegisters &
-          (1 << saved_fp_or_sp)) != 0);
+  ASSERT(IsCalleeSavedRegister(saved_fp_or_sp));
   // Other temps don't need to be preserved.
 
   __ movl(saved_fp_or_sp, is_leaf_ ? SPREG : FPREG);
diff --git a/runtime/vm/compiler/backend/il_riscv.cc b/runtime/vm/compiler/backend/il_riscv.cc
index 9f576c9..5f31d92 100644
--- a/runtime/vm/compiler/backend/il_riscv.cc
+++ b/runtime/vm/compiler/backend/il_riscv.cc
@@ -1425,8 +1425,7 @@
   ASSERT(saved_fp_or_sp != target);
 
   // Ensure these are callee-saved register and are preserved across the call.
-  ASSERT((CallingConventions::kCalleeSaveCpuRegisters &
-          (1 << saved_fp_or_sp)) != 0);
+  ASSERT(IsCalleeSavedRegister(saved_fp_or_sp));
   // Other temps don't need to be preserved.
 
   __ mv(saved_fp_or_sp, is_leaf_ ? SPREG : FPREG);
@@ -1459,6 +1458,9 @@
 
     EmitCall(compiler, target);
 
+    ASSERT(!IsCalleeSavedRegister(PP));
+    __ RestorePoolPointer();
+
 #if !defined(PRODUCT)
     __ LoadImmediate(temp1, compiler::target::Thread::vm_tag_dart_id());
     __ StoreToOffset(temp1, THR, compiler::target::Thread::vm_tag_offset());
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index 9a12a65..f461761 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -1204,8 +1204,8 @@
   const Register saved_sp = locs()->temp(2).reg();
 
   // Ensure these are callee-saved register and are preserved across the call.
-  ASSERT((CallingConventions::kCalleeSaveCpuRegisters & (1 << saved_sp)) != 0);
-  ASSERT((CallingConventions::kCalleeSaveCpuRegisters & (1 << saved_fp)) != 0);
+  ASSERT(IsCalleeSavedRegister(saved_sp));
+  ASSERT(IsCalleeSavedRegister(saved_fp));
   // Other temps don't need to be preserved.
 
   if (is_leaf_) {
@@ -5383,7 +5383,7 @@
   // Calling convention on x64 uses XMM0 and XMM1 to pass the first two
   // double arguments and XMM0 to return the result.
   ASSERT(R13 != CALLEE_SAVED_TEMP);
-  ASSERT(((1 << R13) & CallingConventions::kCalleeSaveCpuRegisters) != 0);
+  ASSERT(IsCalleeSavedRegister(R13));
 
   if (recognized_kind() == MethodRecognizer::kMathDoublePow) {
     ASSERT(InputCount() == 2);
diff --git a/runtime/vm/compiler/backend/locations.h b/runtime/vm/compiler/backend/locations.h
index 754852e..2c59183 100644
--- a/runtime/vm/compiler/backend/locations.h
+++ b/runtime/vm/compiler/backend/locations.h
@@ -588,13 +588,15 @@
       if (reg == PC) continue;
 #elif defined(TARGET_ARCH_ARM64)
       if (reg == R31) continue;
+#elif defined(TARGET_ARCH_RISCV32) || defined(TARGET_ARCH_RISCV64)
+      if (reg == ZR || reg == TP || reg == GP) continue;
 #endif
       Add(Location::RegisterLocation(reg));
     }
 
-      for (intptr_t i = kNumberOfFpuRegisters - 1; i >= 0; --i) {
-        Add(Location::FpuRegisterLocation(static_cast<FpuRegister>(i)));
-      }
+    for (intptr_t i = kNumberOfFpuRegisters - 1; i >= 0; --i) {
+      Add(Location::FpuRegisterLocation(static_cast<FpuRegister>(i)));
+    }
   }
 
   void AddAllArgumentRegisters() {
diff --git a/runtime/vm/compiler/stub_code_compiler_riscv.cc b/runtime/vm/compiler/stub_code_compiler_riscv.cc
index 20f878b..e63cc88 100644
--- a/runtime/vm/compiler/stub_code_compiler_riscv.cc
+++ b/runtime/vm/compiler/stub_code_compiler_riscv.cc
@@ -216,16 +216,16 @@
   RegisterSet all_registers;
   all_registers.AddAllGeneralRegisters();
 
-  __ EnterFrame(0);
   __ PushRegisters(all_registers);
+  __ EnterFrame(0);
 
   __ ReserveAlignedFrameSpace(0);
 
   __ lx(TMP, Address(THR, kEnterSafepointRuntimeEntry.OffsetFromThread()));
   __ jalr(TMP);
 
-  __ PopRegisters(all_registers);
   __ LeaveFrame();
+  __ PopRegisters(all_registers);
   __ ret();
 }
 
@@ -234,8 +234,8 @@
   RegisterSet all_registers;
   all_registers.AddAllGeneralRegisters();
 
-  __ EnterFrame(0);
   __ PushRegisters(all_registers);
+  __ EnterFrame(0);
 
   __ ReserveAlignedFrameSpace(0);
 
@@ -248,8 +248,8 @@
   __ lx(TMP, Address(THR, runtime_entry_offset));
   __ jalr(TMP);
 
-  __ PopRegisters(all_registers);
   __ LeaveFrame();
+  __ PopRegisters(all_registers);
   __ ret();
 }
 
@@ -3005,12 +3005,18 @@
 #error Unimplemented
 #endif
   Label exit_through_non_ffi;
-  // Check if we exited generated from FFI. If so do transition.
+  // Check if we exited generated from FFI. If so do transition - this is needed
+  // because normally runtime calls transition back to generated via destructor
+  // of TransititionGeneratedToVM/Native that is part of runtime boilerplate
+  // code (see DEFINE_RUNTIME_ENTRY_IMPL in runtime_entry.h). Ffi calls don't
+  // have this boilerplate, don't have this stack resource, have to transition
+  // explicitly.
   __ LoadFromOffset(TMP, THR,
                     compiler::target::Thread::exit_through_ffi_offset());
   __ LoadImmediate(TMP2, target::Thread::exit_through_ffi());
   __ bne(TMP, TMP2, &exit_through_non_ffi);
-  __ Stop("Unimplemented");
+  __ TransitionNativeToGenerated(TMP, /*leave_safepoint=*/true,
+                                 /*ignore_unwind_in_progress=*/true);
   __ Bind(&exit_through_non_ffi);
 
   // Refresh pinned registers values (inc. write barrier mask and null object).
diff --git a/runtime/vm/image_snapshot.cc b/runtime/vm/image_snapshot.cc
index f1113d3..1552a72 100644
--- a/runtime/vm/image_snapshot.cc
+++ b/runtime/vm/image_snapshot.cc
@@ -23,6 +23,7 @@
 #include "vm/stub_code.h"
 #include "vm/timeline.h"
 #include "vm/type_testing_stubs.h"
+#include "vm/zone_text_buffer.h"
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
 #include "vm/compiler/backend/code_statistics.h"
@@ -1056,48 +1057,81 @@
   }
 }
 
-static void EnsureAssemblerIdentifier(char* label) {
+static void AddAssemblerIdentifier(ZoneTextBuffer* printer, const char* label) {
+  ASSERT(label[0] != '.');
   for (char c = *label; c != '\0'; c = *++label) {
+#define OP(dart_name, asm_name)                                                \
+  if (strncmp(label, dart_name, strlen(dart_name)) == 0) {                     \
+    printer->AddString(asm_name);                                              \
+    label += (strlen(dart_name) - 1);                                          \
+    continue;                                                                  \
+  }
+
+    OP("+", "operator_add")
+    OP("-", "operator_sub")
+    OP("*", "operator_mul")
+    OP("/", "operator_div")
+    OP("~/", "operator_truncdiv")
+    OP("%", "operator_mod")
+    OP("~", "operator_not")
+    OP("&", "operator_and")
+    OP("|", "operator_or")
+    OP("^", "operator_xor")
+    OP("<<", "operator_sll")
+    OP(">>>", "operator_srl")
+    OP(">>", "operator_sra")
+    OP("[]=", "operator_set")
+    OP("[]", "operator_get")
+    OP("unary-", "operator_neg")
+    OP("==", "operator_eq")
+    OP("<anonymous closure>", "anonymous_closure")
+    OP("<=", "operator_le")
+    OP("<", "operator_lt")
+    OP(">=", "operator_ge")
+    OP(">", "operator_gt")
+#undef OP
+
     if (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')) ||
-        ((c >= '0') && (c <= '9'))) {
+        ((c >= '0') && (c <= '9')) || (c == '.')) {
+      printer->AddChar(c);
       continue;
     }
-    *label = '_';
+    printer->AddChar('_');
   }
 }
 
 const char* SnapshotTextObjectNamer::SnapshotNameFor(intptr_t code_index,
                                                      const Code& code) {
   ASSERT(!code.IsNull());
-  const char* prefix = FLAG_precompiled_mode ? "Precompiled_" : "";
   owner_ = code.owner();
   if (owner_.IsNull()) {
     insns_ = code.instructions();
     const char* name = StubCode::NameOfStub(insns_.EntryPoint());
     ASSERT(name != nullptr);
-    return OS::SCreate(zone_, "%sStub_%s", prefix, name);
+    return OS::SCreate(zone_, "Stub_%s", name);
   }
   // The weak reference to the Code's owner should never have been removed via
   // an intermediate serialization, since WSRs are only introduced during
   // precompilation.
   owner_ = WeakSerializationReference::Unwrap(owner_);
   ASSERT(!owner_.IsNull());
+  ZoneTextBuffer printer(zone_);
   if (owner_.IsClass()) {
-    string_ = Class::Cast(owner_).Name();
-    const char* name = string_.ToCString();
-    EnsureAssemblerIdentifier(const_cast<char*>(name));
-    return OS::SCreate(zone_, "%sAllocationStub_%s_%" Pd, prefix, name,
-                       code_index);
+    const char* name = Class::Cast(owner_).ScrubbedNameCString();
+    printer.AddString("AllocationStub_");
+    AddAssemblerIdentifier(&printer, name);
   } else if (owner_.IsAbstractType()) {
     const char* name = namer_.StubNameForType(AbstractType::Cast(owner_));
-    return OS::SCreate(zone_, "%s%s_%" Pd, prefix, name, code_index);
+    printer.AddString(name);
   } else if (owner_.IsFunction()) {
-    const char* name = Function::Cast(owner_).ToQualifiedCString();
-    EnsureAssemblerIdentifier(const_cast<char*>(name));
-    return OS::SCreate(zone_, "%s%s_%" Pd, prefix, name, code_index);
+    const char* name = Function::Cast(owner_).QualifiedScrubbedNameCString();
+    AddAssemblerIdentifier(&printer, name);
   } else {
     UNREACHABLE();
   }
+
+  printer.Printf("_%" Pd, code_index);
+  return printer.buffer();
 }
 
 const char* SnapshotTextObjectNamer::SnapshotNameFor(
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index db1c8a1..2a287b9 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -9761,6 +9761,13 @@
   return Symbols::New(thread, printer.buffer());
 }
 
+const char* Function::QualifiedScrubbedNameCString() const {
+  Thread* thread = Thread::Current();
+  ZoneTextBuffer printer(thread->zone());
+  PrintName(NameFormattingParams(kScrubbedName), &printer);
+  return printer.buffer();
+}
+
 StringPtr Function::QualifiedUserVisibleName() const {
   Thread* thread = Thread::Current();
   ZoneTextBuffer printer(thread->zone());
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index ac28ae3..cb2be7d 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -2663,6 +2663,7 @@
   void PrintName(const NameFormattingParams& params,
                  BaseTextBuffer* printer) const;
   StringPtr QualifiedScrubbedName() const;
+  const char* QualifiedScrubbedNameCString() const;
   StringPtr QualifiedUserVisibleName() const;
   const char* QualifiedUserVisibleNameCString() const;
 
diff --git a/sdk/lib/_internal/vm/bin/socket_patch.dart b/sdk/lib/_internal/vm/bin/socket_patch.dart
index 7c9925a..d0bddf8 100644
--- a/sdk/lib/_internal/vm/bin/socket_patch.dart
+++ b/sdk/lib/_internal/vm/bin/socket_patch.dart
@@ -877,8 +877,8 @@
         // the SO_ERROR option at level SOL_SOCKET to determine whether
         // connect() completed successfully (SO_ERROR is zero) or
         // unsuccessfully.
-        final OSError osError = socket.nativeGetError();
-        if (osError.errorCode != 0) {
+        final osError = socket.nativeGetError();
+        if (osError != null) {
           socket.close();
           error ??= osError;
           connectNext();
@@ -1404,8 +1404,12 @@
 
         if (i == errorEvent) {
           if (!isClosing) {
-            final err = nativeGetError();
-            reportError(err, null, err.message);
+            final osError = nativeGetError();
+            if (osError == null) {
+              _nativeFatal("Reporting error with OSError code of 0");
+            } else {
+              reportError(osError, null, osError.message);
+            }
           }
         } else if (!isClosed) {
           // If the connection is closed right after it's accepted, there's a
@@ -1688,7 +1692,7 @@
   @pragma("vm:external-name", "Socket_GetFD")
   external int get fd;
   @pragma("vm:external-name", "Socket_GetError")
-  external OSError nativeGetError();
+  external OSError? nativeGetError();
   @pragma("vm:external-name", "Socket_GetOption")
   external nativeGetOption(int option, int protocol);
   @pragma("vm:external-name", "Socket_GetRawOption")
@@ -1703,6 +1707,8 @@
   @pragma("vm:external-name", "Socket_LeaveMulticast")
   external void nativeLeaveMulticast(
       Uint8List addr, Uint8List? interfaceAddr, int interfaceIndex);
+  @pragma("vm:external-name", "Socket_Fatal")
+  external static void _nativeFatal(msg);
 }
 
 class _RawServerSocket extends Stream<RawSocket> implements RawServerSocket {
diff --git a/tests/standalone/io/file_test.dart b/tests/standalone/io/file_test.dart
index d78e512..95ad2e4 100644
--- a/tests/standalone/io/file_test.dart
+++ b/tests/standalone/io/file_test.dart
@@ -756,6 +756,7 @@
     try {
       openedFile.truncateSync(-5);
     } on FileSystemException catch (ex) {
+      Expect.notEquals(ex.osError!.errorCode, 0);
       exceptionCaught = true;
     } on Exception catch (ex) {
       wrongExceptionCaught = true;
diff --git a/tests/standalone_2/io/file_test.dart b/tests/standalone_2/io/file_test.dart
index a3a4823..851d2c3 100644
--- a/tests/standalone_2/io/file_test.dart
+++ b/tests/standalone_2/io/file_test.dart
@@ -760,6 +760,7 @@
     try {
       openedFile.truncateSync(-5);
     } on FileSystemException catch (ex) {
+      Expect.notEquals(ex.osError.errorCode, 0);
       exceptionCaught = true;
     } on Exception catch (ex) {
       wrongExceptionCaught = true;
diff --git a/tools/VERSION b/tools/VERSION
index 41c7365..d9a3698 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 17
 PATCH 0
-PRERELEASE 262
+PRERELEASE 263
 PRERELEASE_PATCH 0
\ No newline at end of file