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