Version 2.17.0-276.0.dev
Merge commit '0a74c767731a4b9c80f9d184e77a32cbc7b31ed9' into 'dev'
diff --git a/DEPS b/DEPS
index e1d4793..a5a4e52 100644
--- a/DEPS
+++ b/DEPS
@@ -44,7 +44,7 @@
# co19 is a cipd package. Use update.sh in tests/co19[_2] to update these
# hashes. It requires access to the dart-build-access group, which EngProd
# has.
- "co19_rev": "6604c07f70757e9d081f64a08ab36f5b9aeaf937",
+ "co19_rev": "8f22acf210970dfe32750351031281af88b41708",
# This line prevents conflicts when both packages are rolled simultaneously.
"co19_2_rev": "b2034a17609472e374623f3dbe0efd9f5cb258af",
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/bootstrap.dart b/pkg/_fe_analyzer_shared/lib/src/macros/bootstrap.dart
index fddd932..59b7a26 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/bootstrap.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/bootstrap.dart
@@ -170,7 +170,7 @@
}
/// Maps libraries by uri to macros by name, and then constructors by name.
-final _macroConstructors = <Uri, Map<String, Map<String, Macro Function()>>>{
+final _macroConstructors = <Uri, Map<String, Map<String, Function>>>{
$_macroConstructorEntriesMarker
};
diff --git a/pkg/analysis_server/lib/protocol/protocol.dart b/pkg/analysis_server/lib/protocol/protocol.dart
index c1d6da7..bea052b 100644
--- a/pkg/analysis_server/lib/protocol/protocol.dart
+++ b/pkg/analysis_server/lib/protocol/protocol.dart
@@ -8,7 +8,7 @@
import 'package:analysis_server/protocol/protocol_generated.dart';
import 'package:analysis_server/src/protocol/protocol_internal.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
+import 'package:analyzer/src/utilities/cancellation.dart';
export 'package:analyzer_plugin/protocol/protocol.dart' show Enum;
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index ba6dc60..f91ecc5 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -42,7 +42,6 @@
import 'package:analysis_server/src/services/execution/execution_context.dart';
import 'package:analysis_server/src/services/flutter/widget_descriptions.dart';
import 'package:analysis_server/src/utilities/process.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
import 'package:analysis_server/src/utilities/request_statistics.dart';
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/dart/analysis/session.dart';
@@ -56,6 +55,7 @@
import 'package:analyzer/src/generated/engine.dart';
import 'package:analyzer/src/generated/sdk.dart';
import 'package:analyzer/src/util/file_paths.dart' as file_paths;
+import 'package:analyzer/src/utilities/cancellation.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart' hide Element;
import 'package:analyzer_plugin/src/utilities/navigation/navigation.dart';
import 'package:analyzer_plugin/utilities/navigation/navigation_dart.dart';
diff --git a/pkg/analysis_server/lib/src/domain_analysis.dart b/pkg/analysis_server/lib/src/domain_analysis.dart
index cfd19e2..e51f5bb 100644
--- a/pkg/analysis_server/lib/src/domain_analysis.dart
+++ b/pkg/analysis_server/lib/src/domain_analysis.dart
@@ -18,8 +18,8 @@
import 'package:analysis_server/src/handler/legacy/unsupported_request.dart';
import 'package:analysis_server/src/plugin/request_converter.dart';
import 'package:analysis_server/src/protocol_server.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
import 'package:analyzer/src/generated/engine.dart' as engine;
+import 'package:analyzer/src/utilities/cancellation.dart';
/// Instances of the class [AnalysisDomainHandler] implement a [RequestHandler]
/// that handles requests in the `analysis` domain.
diff --git a/pkg/analysis_server/lib/src/domain_analytics.dart b/pkg/analysis_server/lib/src/domain_analytics.dart
index 1460410..caebdc3 100644
--- a/pkg/analysis_server/lib/src/domain_analytics.dart
+++ b/pkg/analysis_server/lib/src/domain_analytics.dart
@@ -9,7 +9,7 @@
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:analyzer/src/utilities/cancellation.dart';
/// Instances of the class [AnalyticsDomainHandler] implement a [RequestHandler]
/// that handles requests in the `analytics` domain.
diff --git a/pkg/analysis_server/lib/src/domain_completion.dart b/pkg/analysis_server/lib/src/domain_completion.dart
index 3db8862..20b1829 100644
--- a/pkg/analysis_server/lib/src/domain_completion.dart
+++ b/pkg/analysis_server/lib/src/domain_completion.dart
@@ -23,11 +23,11 @@
import 'package:analysis_server/src/services/completion/yaml/fix_data_generator.dart';
import 'package:analysis_server/src/services/completion/yaml/pubspec_generator.dart';
import 'package:analysis_server/src/services/completion/yaml/yaml_completion_generator.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
import 'package:analyzer/exception/exception.dart';
import 'package:analyzer/src/generated/engine.dart';
import 'package:analyzer/src/util/file_paths.dart' as file_paths;
import 'package:analyzer/src/util/performance/operation_performance.dart';
+import 'package:analyzer/src/utilities/cancellation.dart';
import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
diff --git a/pkg/analysis_server/lib/src/domain_diagnostic.dart b/pkg/analysis_server/lib/src/domain_diagnostic.dart
index 35a41d6..e3d2eb8 100644
--- a/pkg/analysis_server/lib/src/domain_diagnostic.dart
+++ b/pkg/analysis_server/lib/src/domain_diagnostic.dart
@@ -7,7 +7,7 @@
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/utilities/cancellation.dart';
/// Instances of the class [DiagnosticDomainHandler] implement a
/// [RequestHandler] that handles requests in the `diagnostic` domain.
diff --git a/pkg/analysis_server/lib/src/domain_execution.dart b/pkg/analysis_server/lib/src/domain_execution.dart
index 43f7db0..cdedc79 100644
--- a/pkg/analysis_server/lib/src/domain_execution.dart
+++ b/pkg/analysis_server/lib/src/domain_execution.dart
@@ -11,7 +11,7 @@
import 'package:analysis_server/src/handler/legacy/execution_set_subscriptions.dart';
import 'package:analysis_server/src/protocol_server.dart';
import 'package:analysis_server/src/services/execution/execution_context.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
+import 'package:analyzer/src/utilities/cancellation.dart';
/// Instances of the class [ExecutionDomainHandler] implement a [RequestHandler]
/// that handles requests in the `execution` domain.
diff --git a/pkg/analysis_server/lib/src/domain_kythe.dart b/pkg/analysis_server/lib/src/domain_kythe.dart
index afa3c9e..9b62c45 100644
--- a/pkg/analysis_server/lib/src/domain_kythe.dart
+++ b/pkg/analysis_server/lib/src/domain_kythe.dart
@@ -7,7 +7,7 @@
import 'package:analysis_server/src/analysis_server.dart';
import 'package:analysis_server/src/domain_abstract.dart';
import 'package:analysis_server/src/handler/legacy/kythe_get_kythe_entries.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
+import 'package:analyzer/src/utilities/cancellation.dart';
/// Instances of the class [KytheDomainHandler] implement a [RequestHandler]
/// that handles requests in the `kythe` domain.
diff --git a/pkg/analysis_server/lib/src/domain_server.dart b/pkg/analysis_server/lib/src/domain_server.dart
index a5b7b83..0c23f50 100644
--- a/pkg/analysis_server/lib/src/domain_server.dart
+++ b/pkg/analysis_server/lib/src/domain_server.dart
@@ -9,7 +9,7 @@
import 'package:analysis_server/src/handler/legacy/server_get_version.dart';
import 'package:analysis_server/src/handler/legacy/server_set_subscriptions.dart';
import 'package:analysis_server/src/handler/legacy/server_shutdown.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
+import 'package:analyzer/src/utilities/cancellation.dart';
/// Instances of the class [ServerDomainHandler] implement a [RequestHandler]
/// that handles requests in the server domain.
diff --git a/pkg/analysis_server/lib/src/edit/edit_domain.dart b/pkg/analysis_server/lib/src/edit/edit_domain.dart
index 3b7e4a3..3210578 100644
--- a/pkg/analysis_server/lib/src/edit/edit_domain.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_domain.dart
@@ -25,10 +25,10 @@
import 'package:analysis_server/src/services/correction/status.dart';
import 'package:analysis_server/src/services/refactoring/refactoring.dart';
import 'package:analysis_server/src/services/search/search_engine.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
import 'package:analyzer/dart/analysis/session.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/src/dart/ast/utilities.dart';
+import 'package:analyzer/src/utilities/cancellation.dart';
int test_resetCount = 0;
diff --git a/pkg/analysis_server/lib/src/flutter/flutter_domain.dart b/pkg/analysis_server/lib/src/flutter/flutter_domain.dart
index 66bce33..0979104 100644
--- a/pkg/analysis_server/lib/src/flutter/flutter_domain.dart
+++ b/pkg/analysis_server/lib/src/flutter/flutter_domain.dart
@@ -7,8 +7,8 @@
import 'package:analysis_server/src/domain_abstract.dart';
import 'package:analysis_server/src/protocol/protocol_internal.dart';
import 'package:analysis_server/src/protocol_server.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
import 'package:analyzer/dart/analysis/session.dart';
+import 'package:analyzer/src/utilities/cancellation.dart';
/// A [RequestHandler] that handles requests in the `flutter` domain.
class FlutterDomainHandler extends AbstractRequestHandler {
diff --git a/pkg/analysis_server/lib/src/handler/legacy/analysis_get_errors.dart b/pkg/analysis_server/lib/src/handler/legacy/analysis_get_errors.dart
index ffad95d..5548458 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/analysis_get_errors.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/analysis_get_errors.dart
@@ -7,7 +7,7 @@
import 'package:analysis_server/src/analysis_server.dart';
import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
import 'package:analysis_server/src/protocol_server.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
+import 'package:analyzer/src/utilities/cancellation.dart';
/// The handler for the `analysis.getErrors` request.
class AnalysisGetErrorsHandler extends LegacyHandler {
diff --git a/pkg/analysis_server/lib/src/handler/legacy/analysis_get_hover.dart b/pkg/analysis_server/lib/src/handler/legacy/analysis_get_hover.dart
index b3a4cc2..471bcfb 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/analysis_get_hover.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/analysis_get_hover.dart
@@ -9,8 +9,8 @@
import 'package:analysis_server/src/analysis_server.dart';
import 'package:analysis_server/src/computer/computer_hover.dart';
import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/src/utilities/cancellation.dart';
/// The handler for the `analysis.getHover` request.
class AnalysisGetHoverHandler extends LegacyHandler {
diff --git a/pkg/analysis_server/lib/src/handler/legacy/analysis_get_imported_elements.dart b/pkg/analysis_server/lib/src/handler/legacy/analysis_get_imported_elements.dart
index f7b299a..349d72d 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/analysis_get_imported_elements.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/analysis_get_imported_elements.dart
@@ -10,7 +10,7 @@
import 'package:analysis_server/src/computer/imported_elements_computer.dart';
import 'package:analysis_server/src/domain_analysis_flags.dart';
import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
+import 'package:analyzer/src/utilities/cancellation.dart';
/// The handler for the `analysis.getImportedElements` request.
class AnalysisGetImportedElementsHandler extends LegacyHandler {
diff --git a/pkg/analysis_server/lib/src/handler/legacy/analysis_get_navigation.dart b/pkg/analysis_server/lib/src/handler/legacy/analysis_get_navigation.dart
index 060bc16..4205723 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/analysis_get_navigation.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/analysis_get_navigation.dart
@@ -10,7 +10,7 @@
import 'package:analysis_server/src/domain_abstract.dart';
import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
import 'package:analysis_server/src/plugin/result_merger.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
+import 'package:analyzer/src/utilities/cancellation.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
import 'package:analyzer_plugin/src/utilities/navigation/navigation.dart';
diff --git a/pkg/analysis_server/lib/src/handler/legacy/analysis_get_signature.dart b/pkg/analysis_server/lib/src/handler/legacy/analysis_get_signature.dart
index 4b093bb..fd1f9be 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/analysis_get_signature.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/analysis_get_signature.dart
@@ -9,7 +9,7 @@
import 'package:analysis_server/src/analysis_server.dart';
import 'package:analysis_server/src/computer/computer_signature.dart';
import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
+import 'package:analyzer/src/utilities/cancellation.dart';
/// The handler for the `analysis.getSignature` request.
class AnalysisGetSignatureHandler extends LegacyHandler {
diff --git a/pkg/analysis_server/lib/src/handler/legacy/analysis_reanalyze.dart b/pkg/analysis_server/lib/src/handler/legacy/analysis_reanalyze.dart
index 0473c34..0838db8 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/analysis_reanalyze.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/analysis_reanalyze.dart
@@ -8,7 +8,7 @@
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/utilities/cancellation.dart';
/// The handler for the `analysis.reanalyze` request.
class AnalysisReanalyzeHandler extends LegacyHandler {
diff --git a/pkg/analysis_server/lib/src/handler/legacy/analysis_set_analysis_roots.dart b/pkg/analysis_server/lib/src/handler/legacy/analysis_set_analysis_roots.dart
index 5eafdf0..089929b 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/analysis_set_analysis_roots.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/analysis_set_analysis_roots.dart
@@ -8,7 +8,7 @@
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/utilities/cancellation.dart';
/// The handler for the `analysis.setAnalysisRoots` request.
class AnalysisSetAnalysisRootsHandler extends LegacyHandler {
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
index 1d02f73..8117b7c 100644
--- 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
@@ -8,7 +8,7 @@
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/utilities/cancellation.dart';
/// The handler for the `analysis.setGeneralSubscriptions` request.
class AnalysisSetGeneralSubscriptionsHandler extends LegacyHandler {
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
index 9cbe6bd..8ad5cce 100644
--- 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
@@ -9,7 +9,7 @@
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';
+import 'package:analyzer/src/utilities/cancellation.dart';
/// The handler for the `analysis.setPriorityFiles` request.
class AnalysisSetPriorityFilesHandler extends LegacyHandler {
diff --git a/pkg/analysis_server/lib/src/handler/legacy/analysis_set_subscriptions.dart b/pkg/analysis_server/lib/src/handler/legacy/analysis_set_subscriptions.dart
index bce48cf..af96fb0 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/analysis_set_subscriptions.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/analysis_set_subscriptions.dart
@@ -10,7 +10,7 @@
import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
import 'package:analysis_server/src/plugin/request_converter.dart';
import 'package:analysis_server/src/protocol/protocol_internal.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
+import 'package:analyzer/src/utilities/cancellation.dart';
/// The handler for the `analysis.setSubscriptions` request.
class AnalysisSetSubscriptionsHandler extends LegacyHandler {
diff --git a/pkg/analysis_server/lib/src/handler/legacy/analytics_enable.dart b/pkg/analysis_server/lib/src/handler/legacy/analytics_enable.dart
index 5b5a927..32b85c6 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/analytics_enable.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/analytics_enable.dart
@@ -8,7 +8,7 @@
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/utilities/cancellation.dart';
/// The handler for the `analytics.enable` request.
class AnalyticsEnableHandler extends LegacyHandler {
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
index a4d3bfb..3d0fb9e 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/analytics_is_enabled.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/analytics_is_enabled.dart
@@ -8,7 +8,7 @@
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/utilities/cancellation.dart';
/// The handler for the `analytics.isEnabled` request.
class AnalyticsIsEnabledHandler extends LegacyHandler {
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
index ea1aee4..9e86fb6 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/analytics_send_event.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/analytics_send_event.dart
@@ -8,7 +8,7 @@
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/utilities/cancellation.dart';
/// The handler for the `analytics.sendEvent` request.
class AnalyticsSendEventHandler extends LegacyHandler {
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
index bb9961e..61c90ab 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/analytics_send_timing.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/analytics_send_timing.dart
@@ -8,7 +8,7 @@
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/utilities/cancellation.dart';
/// The handler for the `analytics.sendTiming` request.
class AnalyticsSendTimingHandler extends LegacyHandler {
diff --git a/pkg/analysis_server/lib/src/handler/legacy/completion_get_suggestion_details.dart b/pkg/analysis_server/lib/src/handler/legacy/completion_get_suggestion_details.dart
index e531347..436db66 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/completion_get_suggestion_details.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/completion_get_suggestion_details.dart
@@ -8,8 +8,8 @@
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/dart/analysis/session.dart';
+import 'package:analyzer/src/utilities/cancellation.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
/// The handler for the `completion.getSuggestionDetails` request.
diff --git a/pkg/analysis_server/lib/src/handler/legacy/completion_get_suggestion_details2.dart b/pkg/analysis_server/lib/src/handler/legacy/completion_get_suggestion_details2.dart
index 2cdf656..fa00df1 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/completion_get_suggestion_details2.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/completion_get_suggestion_details2.dart
@@ -9,8 +9,8 @@
import 'package:analysis_server/src/analysis_server.dart';
import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
import 'package:analyzer/dart/analysis/session.dart';
+import 'package:analyzer/src/utilities/cancellation.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
/// The handler for the `completion.getSuggestionDetails2` request.
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
index 678db0f..c5305af 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/diagnostic_get_diagnostics.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/diagnostic_get_diagnostics.dart
@@ -8,8 +8,8 @@
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';
+import 'package:analyzer/src/utilities/cancellation.dart';
/// The handler for the `diagnostic.getDiagnostics` request.
class DiagnosticGetDiagnosticsHandler extends LegacyHandler {
diff --git a/pkg/analysis_server/lib/src/handler/legacy/diagnostic_get_server_port.dart b/pkg/analysis_server/lib/src/handler/legacy/diagnostic_get_server_port.dart
index e76abac..1fd807b 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/diagnostic_get_server_port.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/diagnostic_get_server_port.dart
@@ -8,7 +8,7 @@
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/utilities/cancellation.dart';
/// The handler for the `diagnostic.getServerPort` request.
class DiagnosticGetServerPortHandler extends LegacyHandler {
diff --git a/pkg/analysis_server/lib/src/handler/legacy/edit_bulk_fixes.dart b/pkg/analysis_server/lib/src/handler/legacy/edit_bulk_fixes.dart
index 6e2a361..4950883 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/edit_bulk_fixes.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/edit_bulk_fixes.dart
@@ -10,9 +10,9 @@
import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
import 'package:analysis_server/src/services/correction/bulk_fix_processor.dart';
import 'package:analysis_server/src/services/correction/change_workspace.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
import 'package:analyzer/exception/exception.dart';
import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart';
+import 'package:analyzer/src/utilities/cancellation.dart';
/// The handler for the `edit.bulkFixes` request.
class EditBulkFixes extends LegacyHandler {
diff --git a/pkg/analysis_server/lib/src/handler/legacy/edit_format.dart b/pkg/analysis_server/lib/src/handler/legacy/edit_format.dart
index ca6d691..bf1879c 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/edit_format.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/edit_format.dart
@@ -8,7 +8,7 @@
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/utilities/cancellation.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:dart_style/src/dart_formatter.dart';
import 'package:dart_style/src/exceptions.dart';
diff --git a/pkg/analysis_server/lib/src/handler/legacy/edit_format_if_enabled.dart b/pkg/analysis_server/lib/src/handler/legacy/edit_format_if_enabled.dart
index 5e404d4..c276376 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/edit_format_if_enabled.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/edit_format_if_enabled.dart
@@ -7,10 +7,10 @@
import 'package:analysis_server/src/analysis_server.dart';
import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
import 'package:analysis_server/src/protocol_server.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart';
import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart';
import 'package:analyzer/src/util/file_paths.dart' as file_paths;
+import 'package:analyzer/src/utilities/cancellation.dart';
import 'package:dart_style/src/dart_formatter.dart';
import 'package:dart_style/src/exceptions.dart';
import 'package:dart_style/src/source_code.dart';
diff --git a/pkg/analysis_server/lib/src/handler/legacy/edit_get_assists.dart b/pkg/analysis_server/lib/src/handler/legacy/edit_get_assists.dart
index 5d76278..d306123 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/edit_get_assists.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/edit_get_assists.dart
@@ -15,9 +15,9 @@
import 'package:analysis_server/src/services/correction/assist.dart';
import 'package:analysis_server/src/services/correction/assist_internal.dart';
import 'package:analysis_server/src/services/correction/change_workspace.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
import 'package:analyzer/dart/analysis/session.dart';
import 'package:analyzer/src/exception/exception.dart';
+import 'package:analyzer/src/utilities/cancellation.dart';
import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
diff --git a/pkg/analysis_server/lib/src/handler/legacy/edit_get_fixes.dart b/pkg/analysis_server/lib/src/handler/legacy/edit_get_fixes.dart
index 50595a1..7abcecb 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/edit_get_fixes.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/edit_get_fixes.dart
@@ -17,7 +17,6 @@
import 'package:analysis_server/src/services/correction/fix/manifest/fix_generator.dart';
import 'package:analysis_server/src/services/correction/fix/pubspec/fix_generator.dart';
import 'package:analysis_server/src/services/correction/fix_internal.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
import 'package:analyzer/dart/analysis/session.dart';
import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/src/analysis_options/analysis_options_provider.dart';
@@ -29,6 +28,7 @@
import 'package:analyzer/src/pubspec/pubspec_validator.dart';
import 'package:analyzer/src/task/options.dart';
import 'package:analyzer/src/util/file_paths.dart' as file_paths;
+import 'package:analyzer/src/utilities/cancellation.dart';
import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
import 'package:html/parser.dart';
diff --git a/pkg/analysis_server/lib/src/handler/legacy/edit_get_postfix_completion.dart b/pkg/analysis_server/lib/src/handler/legacy/edit_get_postfix_completion.dart
index c8d6bfb..4510a62 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/edit_get_postfix_completion.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/edit_get_postfix_completion.dart
@@ -9,7 +9,7 @@
import 'package:analysis_server/src/analysis_server.dart';
import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
import 'package:analysis_server/src/services/completion/postfix/postfix_completion.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
+import 'package:analyzer/src/utilities/cancellation.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
/// The handler for the `edit.getPostfixCompletion` request.
diff --git a/pkg/analysis_server/lib/src/handler/legacy/edit_get_statement_completion.dart b/pkg/analysis_server/lib/src/handler/legacy/edit_get_statement_completion.dart
index 50ace41..c274249 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/edit_get_statement_completion.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/edit_get_statement_completion.dart
@@ -9,7 +9,7 @@
import 'package:analysis_server/src/analysis_server.dart';
import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
import 'package:analysis_server/src/services/completion/statement/statement_completion.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
+import 'package:analyzer/src/utilities/cancellation.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
/// The handler for the `edit.getStatementCompletion` request.
diff --git a/pkg/analysis_server/lib/src/handler/legacy/edit_import_elements.dart b/pkg/analysis_server/lib/src/handler/legacy/edit_import_elements.dart
index 1dd1079..70bf12d 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/edit_import_elements.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/edit_import_elements.dart
@@ -9,7 +9,7 @@
import 'package:analysis_server/src/analysis_server.dart';
import 'package:analysis_server/src/computer/import_elements_computer.dart';
import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
+import 'package:analyzer/src/utilities/cancellation.dart';
/// The handler for the `edit.importElements` request.
class EditImportElementsHandler extends LegacyHandler {
diff --git a/pkg/analysis_server/lib/src/handler/legacy/edit_is_postfix_completion_applicable.dart b/pkg/analysis_server/lib/src/handler/legacy/edit_is_postfix_completion_applicable.dart
index 7c9fd50..1a8e683 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/edit_is_postfix_completion_applicable.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/edit_is_postfix_completion_applicable.dart
@@ -9,7 +9,7 @@
import 'package:analysis_server/src/analysis_server.dart';
import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
import 'package:analysis_server/src/services/completion/postfix/postfix_completion.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
+import 'package:analyzer/src/utilities/cancellation.dart';
/// The handler for the `edit.isPostfixCompletionApplicable` request.
class EditIsPostfixCompletionApplicableHandler extends LegacyHandler {
diff --git a/pkg/analysis_server/lib/src/handler/legacy/edit_list_postfix_completion_templates.dart b/pkg/analysis_server/lib/src/handler/legacy/edit_list_postfix_completion_templates.dart
index b990eea..856e4db 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/edit_list_postfix_completion_templates.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/edit_list_postfix_completion_templates.dart
@@ -9,7 +9,7 @@
import 'package:analysis_server/src/analysis_server.dart';
import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
import 'package:analysis_server/src/services/completion/postfix/postfix_completion.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
+import 'package:analyzer/src/utilities/cancellation.dart';
/// The handler for the `edit.listPostfixCompletionTemplates` request.
class EditListPostfixCompletionTemplatesHandler extends LegacyHandler {
diff --git a/pkg/analysis_server/lib/src/handler/legacy/edit_organize_directives.dart b/pkg/analysis_server/lib/src/handler/legacy/edit_organize_directives.dart
index 9a8dbc1..7c16673 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/edit_organize_directives.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/edit_organize_directives.dart
@@ -9,8 +9,8 @@
import 'package:analysis_server/src/analysis_server.dart';
import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
import 'package:analysis_server/src/services/correction/organize_imports.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
import 'package:analyzer/src/util/file_paths.dart' as file_paths;
+import 'package:analyzer/src/utilities/cancellation.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
/// The handler for the `edit.organizeDirectives` request.
diff --git a/pkg/analysis_server/lib/src/handler/legacy/edit_sort_members.dart b/pkg/analysis_server/lib/src/handler/legacy/edit_sort_members.dart
index 2aa4aa6..1b404a1 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/edit_sort_members.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/edit_sort_members.dart
@@ -9,8 +9,8 @@
import 'package:analysis_server/src/analysis_server.dart';
import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
import 'package:analysis_server/src/services/correction/sort_members.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
import 'package:analyzer/src/util/file_paths.dart' as file_paths;
+import 'package:analyzer/src/utilities/cancellation.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
/// The handler for the `edit.sortMembers` request.
diff --git a/pkg/analysis_server/lib/src/handler/legacy/execution_create_context.dart b/pkg/analysis_server/lib/src/handler/legacy/execution_create_context.dart
index 3c29df2..40ca6e1 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/execution_create_context.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/execution_create_context.dart
@@ -9,7 +9,7 @@
import 'package:analysis_server/src/analysis_server.dart';
import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
import 'package:analysis_server/src/services/execution/execution_context.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
+import 'package:analyzer/src/utilities/cancellation.dart';
/// The handler for the `execution.createContext` request.
class ExecutionCreateContextHandler extends LegacyHandler {
diff --git a/pkg/analysis_server/lib/src/handler/legacy/execution_delete_context.dart b/pkg/analysis_server/lib/src/handler/legacy/execution_delete_context.dart
index 5802dde..e4b7aae 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/execution_delete_context.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/execution_delete_context.dart
@@ -9,7 +9,7 @@
import 'package:analysis_server/src/analysis_server.dart';
import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
import 'package:analysis_server/src/services/execution/execution_context.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
+import 'package:analyzer/src/utilities/cancellation.dart';
/// The handler for the `execution.deleteContext` request.
class ExecutionDeleteContextHandler extends LegacyHandler {
diff --git a/pkg/analysis_server/lib/src/handler/legacy/execution_get_suggestions.dart b/pkg/analysis_server/lib/src/handler/legacy/execution_get_suggestions.dart
index d7413f2..f986c9e 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/execution_get_suggestions.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/execution_get_suggestions.dart
@@ -8,7 +8,7 @@
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/utilities/cancellation.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
/// The handler for the `execution.getSuggestions` request.
diff --git a/pkg/analysis_server/lib/src/handler/legacy/execution_map_uri.dart b/pkg/analysis_server/lib/src/handler/legacy/execution_map_uri.dart
index 0e84b04..a33a85a 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/execution_map_uri.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/execution_map_uri.dart
@@ -9,8 +9,8 @@
import 'package:analysis_server/src/analysis_server.dart';
import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
import 'package:analysis_server/src/services/execution/execution_context.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/utilities/cancellation.dart';
/// The handler for the `execution.mapUri` request.
class ExecutionMapUriHandler extends LegacyHandler {
diff --git a/pkg/analysis_server/lib/src/handler/legacy/execution_set_subscriptions.dart b/pkg/analysis_server/lib/src/handler/legacy/execution_set_subscriptions.dart
index 480f100a..da2d2e7 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/execution_set_subscriptions.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/execution_set_subscriptions.dart
@@ -8,7 +8,7 @@
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/utilities/cancellation.dart';
/// The handler for the `execution.setSubscriptions` request.
class ExecutionSetSubscriptionsHandler extends LegacyHandler {
diff --git a/pkg/analysis_server/lib/src/handler/legacy/kythe_get_kythe_entries.dart b/pkg/analysis_server/lib/src/handler/legacy/kythe_get_kythe_entries.dart
index e9a57e8..3ff4695 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/kythe_get_kythe_entries.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/kythe_get_kythe_entries.dart
@@ -11,8 +11,8 @@
import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
import 'package:analysis_server/src/plugin/result_merger.dart';
import 'package:analysis_server/src/services/kythe/kythe_visitors.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
+import 'package:analyzer/src/utilities/cancellation.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
diff --git a/pkg/analysis_server/lib/src/handler/legacy/legacy_handler.dart b/pkg/analysis_server/lib/src/handler/legacy/legacy_handler.dart
index 7e9094e..cc96821 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/legacy_handler.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/legacy_handler.dart
@@ -8,9 +8,9 @@
import 'package:analysis_server/protocol/protocol.dart';
import 'package:analysis_server/src/analysis_server.dart';
import 'package:analysis_server/src/protocol/protocol_internal.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
import 'package:analyzer/error/error.dart';
import 'package:analyzer/src/dart/error/syntactic_errors.g.dart';
+import 'package:analyzer/src/utilities/cancellation.dart';
/// A request handler for the legacy protocol.
abstract class LegacyHandler {
diff --git a/pkg/analysis_server/lib/src/handler/legacy/server_cancel_request.dart b/pkg/analysis_server/lib/src/handler/legacy/server_cancel_request.dart
index 5702aba..43b1707 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/server_cancel_request.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/server_cancel_request.dart
@@ -8,7 +8,7 @@
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/utilities/cancellation.dart';
/// The handler for the `server.cancelRequest` request.
class ServerCancelRequestHandler extends LegacyHandler {
diff --git a/pkg/analysis_server/lib/src/handler/legacy/server_get_version.dart b/pkg/analysis_server/lib/src/handler/legacy/server_get_version.dart
index 21eb232..0ea83dc 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/server_get_version.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/server_get_version.dart
@@ -9,7 +9,7 @@
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/utilities/cancellation.dart';
/// The handler for the `server.getVersion` request.
class ServerGetVersionHandler extends LegacyHandler {
diff --git a/pkg/analysis_server/lib/src/handler/legacy/server_set_subscriptions.dart b/pkg/analysis_server/lib/src/handler/legacy/server_set_subscriptions.dart
index 67633bf..0ebe036 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/server_set_subscriptions.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/server_set_subscriptions.dart
@@ -8,7 +8,7 @@
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/utilities/cancellation.dart';
/// The handler for the `server.setSubscriptions` request.
class ServerSetSubscriptionsHandler extends LegacyHandler {
diff --git a/pkg/analysis_server/lib/src/handler/legacy/server_shutdown.dart b/pkg/analysis_server/lib/src/handler/legacy/server_shutdown.dart
index 93689a6..a582920 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/server_shutdown.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/server_shutdown.dart
@@ -8,7 +8,7 @@
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/utilities/cancellation.dart';
/// The handler for the `server.shutdown` request.
class ServerShutdownHandler extends LegacyHandler {
diff --git a/pkg/analysis_server/lib/src/handler/legacy/unsupported_request.dart b/pkg/analysis_server/lib/src/handler/legacy/unsupported_request.dart
index 03dc5a5..b8134f6 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/unsupported_request.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/unsupported_request.dart
@@ -7,7 +7,7 @@
import 'package:analysis_server/protocol/protocol.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/utilities/cancellation.dart';
/// The handler used for the request that are no longer supported.
class UnsupportedRequestHandler extends LegacyHandler {
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_workspace_symbols.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_workspace_symbols.dart
index 31ea25d..2475623 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_workspace_symbols.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_workspace_symbols.dart
@@ -54,8 +54,16 @@
var workspaceSymbols = search.WorkspaceSymbols();
var analysisDrivers = server.driverMap.values.toList();
for (var analysisDriver in analysisDrivers) {
- await analysisDriver.search
- .declarations(workspaceSymbols, regex, remainingResults);
+ await analysisDriver.search.declarations(
+ workspaceSymbols,
+ regex,
+ remainingResults,
+ cancellationToken: token,
+ );
+
+ if (workspaceSymbols.cancelled) {
+ return cancelled();
+ }
}
// Map the results to SymbolInformations and flatten the list of lists.
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handlers.dart b/pkg/analysis_server/lib/src/lsp/handlers/handlers.dart
index 9d3225d..1880af3 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handlers.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handlers.dart
@@ -14,13 +14,13 @@
import 'package:analysis_server/src/lsp/json_parsing.dart';
import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
import 'package:analysis_server/src/lsp/progress.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/source/line_info.dart';
+import 'package:analyzer/src/utilities/cancellation.dart';
import 'package:analyzer_plugin/protocol/protocol.dart';
import 'package:analyzer_plugin/src/protocol/protocol_internal.dart';
-export 'package:analysis_server/src/utilities/progress.dart';
+export 'package:analyzer/src/utilities/cancellation.dart';
/// Converts an iterable using the provided function and skipping over any
/// null values.
diff --git a/pkg/analysis_server/lib/src/search/search_domain.dart b/pkg/analysis_server/lib/src/search/search_domain.dart
index f854cc4..da23c1a 100644
--- a/pkg/analysis_server/lib/src/search/search_domain.dart
+++ b/pkg/analysis_server/lib/src/search/search_domain.dart
@@ -11,9 +11,9 @@
import 'package:analysis_server/src/search/element_references.dart';
import 'package:analysis_server/src/search/type_hierarchy.dart';
import 'package:analysis_server/src/services/search/search_engine.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/src/dart/analysis/search.dart' as search;
+import 'package:analyzer/src/utilities/cancellation.dart';
/// Instances of the class [SearchDomainHandler] implement a [RequestHandler]
/// that handles requests in the search domain.
diff --git a/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart b/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
index efe3880..08e544a 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
@@ -20,7 +20,6 @@
import 'package:analysis_server/src/services/refactoring/rename_local.dart';
import 'package:analysis_server/src/services/refactoring/rename_unit_member.dart';
import 'package:analysis_server/src/services/search/search_engine.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/dart/analysis/session.dart';
import 'package:analyzer/dart/ast/ast.dart';
@@ -28,6 +27,7 @@
import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/src/dart/analysis/driver.dart';
import 'package:analyzer/src/dart/analysis/index.dart';
+import 'package:analyzer/src/utilities/cancellation.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart'
show RefactoringMethodParameter, SourceChange;
diff --git a/pkg/analysis_server/lib/src/services/refactoring/refactoring_internal.dart b/pkg/analysis_server/lib/src/services/refactoring/refactoring_internal.dart
index d969475..6fb1f3b 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/refactoring_internal.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/refactoring_internal.dart
@@ -8,9 +8,9 @@
import 'package:analysis_server/src/services/correction/status.dart';
import 'package:analysis_server/src/services/refactoring/refactoring.dart';
import 'package:analysis_server/src/services/search/search_engine.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/utilities/cancellation.dart';
/// Return a new [SourceReference] instance for the given [match].
SourceReference getSourceReference(SearchMatch match) {
diff --git a/pkg/analysis_server/lib/src/services/snippets/dart/dart_snippet_producers.dart b/pkg/analysis_server/lib/src/services/snippets/dart/dart_snippet_producers.dart
index 19b2fc3c..6fd4e15 100644
--- a/pkg/analysis_server/lib/src/services/snippets/dart/dart_snippet_producers.dart
+++ b/pkg/analysis_server/lib/src/services/snippets/dart/dart_snippet_producers.dart
@@ -5,6 +5,9 @@
import 'package:analysis_server/src/services/correction/util.dart';
import 'package:analysis_server/src/services/linter/lint_names.dart';
import 'package:analysis_server/src/services/snippets/dart/snippet_manager.dart';
+import 'package:analyzer/dart/analysis/features.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/nullability_suffix.dart';
import 'package:analyzer/src/dart/analysis/session_helper.dart';
import 'package:analyzer/src/dart/element/type.dart';
import 'package:analyzer/src/lint/linter.dart' show LinterContextImpl;
@@ -300,10 +303,15 @@
abstract class DartSnippetProducer extends SnippetProducer {
final AnalysisSessionHelper sessionHelper;
final CorrectionUtils utils;
+ final LibraryElement libraryElement;
+ final bool useSuperParams;
DartSnippetProducer(DartSnippetRequest request)
: sessionHelper = AnalysisSessionHelper(request.analysisSession),
utils = CorrectionUtils(request.unit),
+ libraryElement = request.unit.libraryElement,
+ useSuperParams = request.unit.libraryElement.featureSet
+ .isEnabled(Feature.super_parameters),
super(request);
bool get isInTestDirectory {
@@ -312,6 +320,11 @@
.any((testDir) => path.contains(testDir));
}
+ /// The nullable suffix to use in this library.
+ NullabilitySuffix get nullableSuffix => libraryElement.isNonNullableByDefault
+ ? NullabilitySuffix.question
+ : NullabilitySuffix.none;
+
bool isLintEnabled(String name) {
var analysisOptions = sessionHelper.session.analysisContext.analysisOptions;
return analysisOptions.isLintEnabled(name);
diff --git a/pkg/analysis_server/lib/src/services/snippets/dart/flutter_snippet_producers.dart b/pkg/analysis_server/lib/src/services/snippets/dart/flutter_snippet_producers.dart
index 90b520d..9f0f654 100644
--- a/pkg/analysis_server/lib/src/services/snippets/dart/flutter_snippet_producers.dart
+++ b/pkg/analysis_server/lib/src/services/snippets/dart/flutter_snippet_producers.dart
@@ -10,6 +10,7 @@
import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/src/dart/element/type.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:meta/meta.dart';
abstract class FlutterSnippetProducer extends DartSnippetProducer {
@@ -44,13 +45,16 @@
/// Produces a [Snippet] that creates a Flutter StatefulWidget and related State
/// class.
-class FlutterStatefulWidgetSnippetProducer extends FlutterSnippetProducer {
+class FlutterStatefulWidgetSnippetProducer extends FlutterSnippetProducer
+ with FlutterWidgetSnippetProducerMixin {
static const prefix = 'stful';
static const label = 'Flutter Stateful Widget';
late ClassElement? classStatefulWidget;
late ClassElement? classState;
+ @override
late ClassElement? classBuildContext;
+ @override
late ClassElement? classKey;
FlutterStatefulWidgetSnippetProducer._(DartSnippetRequest request)
@@ -63,50 +67,20 @@
// Checked by isValid().
final classStatefulWidget = this.classStatefulWidget!;
final classState = this.classState!;
- final classWidget = this.classWidget!;
- final classBuildContext = this.classBuildContext!;
- final classKey = this.classKey!;
- // Only include `?` for nulable types like Key? if in a null-safe library.
- final nullableSuffix = request.unit.libraryElement.isNonNullableByDefault
- ? NullabilitySuffix.question
- : NullabilitySuffix.none;
-
- final className = 'MyWidget';
await builder.addDartFileEdit(request.filePath, (builder) {
builder.addReplacement(request.replacementRange, (builder) {
// Write the StatefulWidget class
builder.writeClassDeclaration(
- className,
+ widgetClassName,
nameGroupName: 'name',
superclass: _getType(classStatefulWidget),
membersWriter: () {
- // Add the constructor.
- builder.write(' ');
- builder.writeConstructorDeclaration(
- className,
- classNameGroupName: 'name',
- isConst: true,
- parameterWriter: () {
- builder.write('{');
- builder.writeParameter(
- 'key',
- type: _getType(classKey, nullableSuffix),
- );
- builder.write('}');
- },
- initializerWriter: () => builder.write('super(key: key)'),
- );
+ writeWidgetConstructor(builder);
builder.writeln();
builder.writeln();
- // Add the createState method.
- builder.writeln(' @override');
- builder.write(' State<');
- builder.addSimpleLinkedEdit('name', className);
- builder.write('> createState() => _');
- builder.addSimpleLinkedEdit('name', className);
- builder.writeln('State();');
+ writeCreateStateMethod(builder);
},
);
builder.writeln();
@@ -114,33 +88,14 @@
// Write the State class.
builder.write('class _');
- builder.addSimpleLinkedEdit('name', className);
+ builder.addSimpleLinkedEdit('name', widgetClassName);
builder.write('State extends ');
builder.writeReference(classState);
builder.write('<');
- builder.addSimpleLinkedEdit('name', className);
+ builder.addSimpleLinkedEdit('name', widgetClassName);
builder.writeln('> {');
{
- // Add the build method.
- builder.writeln(' @override');
- builder.write(' ');
- builder.writeFunctionDeclaration(
- 'build',
- returnType: _getType(classWidget),
- parameterWriter: () {
- builder.writeParameter(
- 'context',
- type: _getType(classBuildContext),
- );
- },
- bodyWriter: () {
- builder.writeln('{');
- builder.write(' ');
- builder.selectHere();
- builder.writeln();
- builder.writeln(' }');
- },
- );
+ writeBuildMethod(builder);
}
builder.write('}');
});
@@ -178,13 +133,15 @@
/// Produces a [Snippet] that creates a Flutter StatefulWidget with a
/// AnimationController and related State class.
class FlutterStatefulWidgetWithAnimationControllerSnippetProducer
- extends FlutterSnippetProducer {
+ extends FlutterSnippetProducer with FlutterWidgetSnippetProducerMixin {
static const prefix = 'stanim';
static const label = 'Flutter Widget with AnimationController';
late ClassElement? classStatefulWidget;
late ClassElement? classState;
+ @override
late ClassElement? classBuildContext;
+ @override
late ClassElement? classKey;
late ClassElement? classAnimationController;
late ClassElement? classSingleTickerProviderStateMixin;
@@ -200,53 +157,23 @@
// Checked by isValid().
final classStatefulWidget = this.classStatefulWidget!;
final classState = this.classState!;
- final classWidget = this.classWidget!;
- final classBuildContext = this.classBuildContext!;
- final classKey = this.classKey!;
final classAnimationController = this.classAnimationController!;
final classSingleTickerProviderStateMixin =
this.classSingleTickerProviderStateMixin!;
- // Only include `?` for nulable types like Key? if in a null-safe library.
- final nullableSuffix = request.unit.libraryElement.isNonNullableByDefault
- ? NullabilitySuffix.question
- : NullabilitySuffix.none;
-
- final className = 'MyWidget';
await builder.addDartFileEdit(request.filePath, (builder) {
builder.addReplacement(request.replacementRange, (builder) {
// Write the StatefulWidget class
builder.writeClassDeclaration(
- className,
+ widgetClassName,
nameGroupName: 'name',
superclass: _getType(classStatefulWidget),
membersWriter: () {
- // Add the constructor.
- builder.write(' ');
- builder.writeConstructorDeclaration(
- className,
- classNameGroupName: 'name',
- isConst: true,
- parameterWriter: () {
- builder.write('{');
- builder.writeParameter(
- 'key',
- type: _getType(classKey, nullableSuffix),
- );
- builder.write('}');
- },
- initializerWriter: () => builder.write('super(key: key)'),
- );
+ writeWidgetConstructor(builder);
builder.writeln();
builder.writeln();
- // Add the createState method.
- builder.writeln(' @override');
- builder.write(' State<');
- builder.addSimpleLinkedEdit('name', className);
- builder.write('> createState() => _');
- builder.addSimpleLinkedEdit('name', className);
- builder.writeln('State();');
+ writeCreateStateMethod(builder);
},
);
builder.writeln();
@@ -254,11 +181,11 @@
// Write the State class.
builder.write('class _');
- builder.addSimpleLinkedEdit('name', className);
+ builder.addSimpleLinkedEdit('name', widgetClassName);
builder.write('State extends ');
builder.writeReference(classState);
builder.write('<');
- builder.addSimpleLinkedEdit('name', className);
+ builder.addSimpleLinkedEdit('name', widgetClassName);
builder.writeln('>');
builder.write(' with ');
builder.writeReference(classSingleTickerProviderStateMixin);
@@ -302,26 +229,7 @@
}
builder.writeln();
{
- // Add the build method.
- builder.writeln(' @override');
- builder.write(' ');
- builder.writeFunctionDeclaration(
- 'build',
- returnType: _getType(classWidget),
- parameterWriter: () {
- builder.writeParameter(
- 'context',
- type: _getType(classBuildContext),
- );
- },
- bodyWriter: () {
- builder.writeln('{');
- builder.write(' ');
- builder.selectHere();
- builder.writeln();
- builder.writeln(' }');
- },
- );
+ writeBuildMethod(builder);
}
builder.write('}');
});
@@ -363,12 +271,15 @@
}
/// Produces a [Snippet] that creates a Flutter StatelessWidget.
-class FlutterStatelessWidgetSnippetProducer extends FlutterSnippetProducer {
+class FlutterStatelessWidgetSnippetProducer extends FlutterSnippetProducer
+ with FlutterWidgetSnippetProducerMixin {
static const prefix = 'stless';
static const label = 'Flutter Stateless Widget';
late ClassElement? classStatelessWidget;
+ @override
late ClassElement? classBuildContext;
+ @override
late ClassElement? classKey;
FlutterStatelessWidgetSnippetProducer._(DartSnippetRequest request)
@@ -380,62 +291,19 @@
// Checked by isValid().
final classStatelessWidget = this.classStatelessWidget!;
- final classWidget = this.classWidget!;
- final classBuildContext = this.classBuildContext!;
- final classKey = this.classKey!;
- // Only include `?` for nulable types like Key? if in a null-safe library.
- final nullableSuffix = request.unit.libraryElement.isNonNullableByDefault
- ? NullabilitySuffix.question
- : NullabilitySuffix.none;
-
- final className = 'MyWidget';
await builder.addDartFileEdit(request.filePath, (builder) {
builder.addReplacement(request.replacementRange, (builder) {
builder.writeClassDeclaration(
- className,
+ widgetClassName,
nameGroupName: 'name',
superclass: _getType(classStatelessWidget),
membersWriter: () {
- // Add the constructor.
- builder.write(' ');
- builder.writeConstructorDeclaration(
- className,
- classNameGroupName: 'name',
- isConst: true,
- parameterWriter: () {
- builder.write('{');
- builder.writeParameter(
- 'key',
- type: _getType(classKey, nullableSuffix),
- );
- builder.write('}');
- },
- initializerWriter: () => builder.write('super(key: key)'),
- );
+ writeWidgetConstructor(builder);
builder.writeln();
builder.writeln();
- // Add the build method.
- builder.writeln(' @override');
- builder.write(' ');
- builder.writeFunctionDeclaration(
- 'build',
- returnType: _getType(classWidget),
- parameterWriter: () {
- builder.writeParameter(
- 'context',
- type: _getType(classBuildContext),
- );
- },
- bodyWriter: () {
- builder.writeln('{');
- builder.write(' ');
- builder.selectHere();
- builder.writeln();
- builder.writeln(' }');
- },
- );
+ writeBuildMethod(builder);
},
);
});
@@ -468,3 +336,76 @@
DartSnippetRequest request) =>
FlutterStatelessWidgetSnippetProducer._(request);
}
+
+/// A mixin that provides some common methods for producers that build snippets
+/// for Flutter widget classes.
+mixin FlutterWidgetSnippetProducerMixin on FlutterSnippetProducer {
+ ClassElement? get classBuildContext;
+ ClassElement? get classKey;
+ String get widgetClassName => 'MyWidget';
+
+ void writeBuildMethod(DartEditBuilder builder) {
+ // Checked by isValid() before this will be called.
+ final classBuildContext = this.classBuildContext!;
+ final classWidget = this.classWidget!;
+
+ // Add the build method.
+ builder.writeln(' @override');
+ builder.write(' ');
+ builder.writeFunctionDeclaration(
+ 'build',
+ returnType: _getType(classWidget),
+ parameterWriter: () {
+ builder.writeParameter(
+ 'context',
+ type: _getType(classBuildContext),
+ );
+ },
+ bodyWriter: () {
+ builder.writeln('{');
+ builder.write(' ');
+ builder.selectHere();
+ builder.writeln();
+ builder.writeln(' }');
+ },
+ );
+ }
+
+ void writeCreateStateMethod(DartEditBuilder builder) {
+ builder.writeln(' @override');
+ builder.write(' State<');
+ builder.addSimpleLinkedEdit('name', widgetClassName);
+ builder.write('> createState() => _');
+ builder.addSimpleLinkedEdit('name', widgetClassName);
+ builder.writeln('State();');
+ }
+
+ void writeWidgetConstructor(DartEditBuilder builder) {
+ // Checked by isValid() before this will be called.
+ final classKey = this.classKey!;
+
+ String keyName;
+ DartType? keyType;
+ void Function()? keyInitializer;
+ if (useSuperParams) {
+ keyName = 'super.key';
+ } else {
+ keyName = 'key';
+ keyType = _getType(classKey, nullableSuffix);
+ keyInitializer = () => builder.write('super(key: key)');
+ }
+
+ builder.write(' ');
+ builder.writeConstructorDeclaration(
+ widgetClassName,
+ classNameGroupName: 'name',
+ isConst: true,
+ parameterWriter: () {
+ builder.write('{');
+ builder.writeParameter(keyName, type: keyType);
+ builder.write('}');
+ },
+ initializerWriter: keyInitializer,
+ );
+ }
+}
diff --git a/pkg/analysis_server/test/analysis_abstract.dart b/pkg/analysis_server/test/analysis_abstract.dart
index 1bf61f7..8a06015 100644
--- a/pkg/analysis_server/test/analysis_abstract.dart
+++ b/pkg/analysis_server/test/analysis_abstract.dart
@@ -10,13 +10,13 @@
import 'package:analysis_server/src/domain_analysis.dart';
import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
import 'package:analysis_server/src/utilities/mocks.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
import 'package:analyzer/instrumentation/instrumentation.dart';
import 'package:analyzer/src/dart/analysis/driver.dart';
import 'package:analyzer/src/generated/engine.dart';
import 'package:analyzer/src/generated/sdk.dart';
import 'package:analyzer/src/test_utilities/mock_sdk.dart';
import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
+import 'package:analyzer/src/utilities/cancellation.dart';
import 'package:meta/meta.dart';
import 'package:test/test.dart';
diff --git a/pkg/analysis_server/test/analysis_server_test.dart b/pkg/analysis_server/test/analysis_server_test.dart
index 58ac7dd..31c0a79 100644
--- a/pkg/analysis_server/test/analysis_server_test.dart
+++ b/pkg/analysis_server/test/analysis_server_test.dart
@@ -9,7 +9,6 @@
import 'package:analysis_server/src/domain_server.dart';
import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
import 'package:analysis_server/src/utilities/mocks.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/file_system/memory_file_system.dart';
import 'package:analyzer/instrumentation/instrumentation.dart';
@@ -17,6 +16,7 @@
import 'package:analyzer/src/test_utilities/mock_sdk.dart';
import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
+import 'package:analyzer/src/utilities/cancellation.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/lsp/completion_dart_test.dart b/pkg/analysis_server/test/lsp/completion_dart_test.dart
index 2387349..484434a 100644
--- a/pkg/analysis_server/test/lsp/completion_dart_test.dart
+++ b/pkg/analysis_server/test/lsp/completion_dart_test.dart
@@ -23,7 +23,8 @@
defineReflectiveTests(CompletionTest);
defineReflectiveTests(DartSnippetCompletionTest);
defineReflectiveTests(FlutterSnippetCompletionTest);
- defineReflectiveTests(FlutterSnippetCompletionWithNullSafetyTest);
+ defineReflectiveTests(
+ FlutterSnippetCompletionWithLatestLanguageVersionTest);
defineReflectiveTests(CompletionTestWithNullSafetyTest);
});
}
@@ -2793,12 +2794,20 @@
@reflectiveTest
class FlutterSnippetCompletionTest extends SnippetCompletionTest {
+ /// Standard import statements expected for basic Widgets.
+ String get expectedImports => '''
+import 'package:flutter/src/foundation/key.dart';
+import 'package:flutter/src/widgets/framework.dart';''';
+
/// Nullability suffix expected in this test class.
///
/// Used to allow all tests to be run in both modes without having to
- /// duplicate all tests ([FlutterSnippetCompletionWithNullSafetyTest]
+ /// duplicate all tests ([FlutterSnippetCompletionWithLatestLanguageVersionTest]
/// overrides this).
- String get questionSuffix => '';
+ String get expectedNullableSuffix => '';
+
+ /// Constructor params expected on Widget classes.
+ String get expectedWidgetConstructorParams => '({Key key}) : super(key: key)';
@override
void setUp() {
@@ -2833,7 +2842,7 @@
class A {}
class \${1:MyWidget} extends StatefulWidget {
- const \${1:MyWidget}({Key$questionSuffix key}) : super(key: key);
+ const \${1:MyWidget}$expectedWidgetConstructorParams;
@override
State<\${1:MyWidget}> createState() => _\${1:MyWidget}State();
@@ -2875,7 +2884,7 @@
class A {}
class \${1:MyWidget} extends StatefulWidget {
- const \${1:MyWidget}({Key$questionSuffix key}) : super(key: key);
+ const \${1:MyWidget}$expectedWidgetConstructorParams;
@override
State<\${1:MyWidget}> createState() => _\${1:MyWidget}State();
@@ -2931,7 +2940,7 @@
class A {}
class \${1:MyWidget} extends StatelessWidget {
- const \${1:MyWidget}({Key$questionSuffix key}) : super(key: key);
+ const \${1:MyWidget}$expectedWidgetConstructorParams;
@override
Widget build(BuildContext context) {
@@ -2960,13 +2969,12 @@
);
expect(updated, '''
-import 'package:flutter/src/foundation/key.dart';
-import 'package:flutter/src/widgets/framework.dart';
+$expectedImports
class A {}
class \${1:MyWidget} extends StatelessWidget {
- const \${1:MyWidget}({Key$questionSuffix key}) : super(key: key);
+ const \${1:MyWidget}$expectedWidgetConstructorParams;
@override
Widget build(BuildContext context) {
@@ -2991,11 +2999,10 @@
);
expect(updated, '''
-import 'package:flutter/src/foundation/key.dart';
-import 'package:flutter/src/widgets/framework.dart';
+$expectedImports
class \${1:MyWidget} extends StatelessWidget {
- const \${1:MyWidget}({Key$questionSuffix key}) : super(key: key);
+ const \${1:MyWidget}$expectedWidgetConstructorParams;
@override
Widget build(BuildContext context) {
@@ -3018,11 +3025,10 @@
);
expect(updated, '''
-import 'package:flutter/src/foundation/key.dart';
-import 'package:flutter/src/widgets/framework.dart';
+$expectedImports
class \${1:MyWidget} extends StatelessWidget {
- const \${1:MyWidget}({Key$questionSuffix key}) : super(key: key);
+ const \${1:MyWidget}$expectedWidgetConstructorParams;
@override
Widget build(BuildContext context) {
@@ -3063,10 +3069,17 @@
}
@reflectiveTest
-class FlutterSnippetCompletionWithNullSafetyTest
+class FlutterSnippetCompletionWithLatestLanguageVersionTest
extends FlutterSnippetCompletionTest {
@override
- String get questionSuffix => '?';
+ String get expectedImports => '''
+import 'package:flutter/src/widgets/framework.dart';''';
+
+ @override
+ String get expectedNullableSuffix => '?';
+
+ @override
+ String get expectedWidgetConstructorParams => '({super.key})';
@override
String get testPackageLanguageVersion => latestLanguageVersion;
diff --git a/pkg/analysis_server/test/lsp/workspace_symbols_test.dart b/pkg/analysis_server/test/lsp/workspace_symbols_test.dart
index 3af1f88..1806765 100644
--- a/pkg/analysis_server/test/lsp/workspace_symbols_test.dart
+++ b/pkg/analysis_server/test/lsp/workspace_symbols_test.dart
@@ -7,6 +7,7 @@
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
+import '../tool/lsp_spec/matchers.dart';
import 'server_abstract.dart';
void main() {
@@ -17,6 +18,45 @@
@reflectiveTest
class WorkspaceSymbolsTest extends AbstractLspAnalysisServerTest {
+ Future<void> test_cancellation() async {
+ const content = '''
+ void f() {}
+ ''';
+ newFile2(mainFilePath, withoutMarkers(content));
+ await initialize();
+
+ final symbolsRequest1 = makeRequest(
+ Method.workspace_symbol,
+ WorkspaceSymbolParams(query: 'f'),
+ );
+ final symbolsCancellation1 = makeNotification(
+ Method.cancelRequest, CancelParams(id: symbolsRequest1.id));
+ final symbolsRequest2 = makeRequest(
+ Method.workspace_symbol,
+ WorkspaceSymbolParams(query: 'f'),
+ );
+
+ final responses = await Future.wait([
+ sendRequestToServer(symbolsRequest1),
+ sendNotificationToServer(symbolsCancellation1),
+ sendRequestToServer(symbolsRequest2),
+ ]);
+
+ // Expect the first response was cancelled.
+ final symbolsResponse1 = responses[0] as ResponseMessage;
+ expect(symbolsResponse1.result, isNull);
+ expect(symbolsResponse1.error, isNotNull);
+ expect(
+ symbolsResponse1.error,
+ isResponseError(ErrorCodes.RequestCancelled),
+ );
+
+ // But second to complete normally.
+ final symbolsResponse2 = responses[2] as ResponseMessage;
+ expect(symbolsResponse2.result, hasLength(greaterThanOrEqualTo(1)));
+ expect(symbolsResponse2.error, isNull);
+ }
+
Future<void> test_extensions() async {
const content = '''
extension StringExtensions on String {}
diff --git a/pkg/analysis_server/test/services/snippets/dart/flutter_snippet_producers_test.dart b/pkg/analysis_server/test/services/snippets/dart/flutter_snippet_producers_test.dart
index d082f0b..8cd7dbc 100644
--- a/pkg/analysis_server/test/services/snippets/dart/flutter_snippet_producers_test.dart
+++ b/pkg/analysis_server/test/services/snippets/dart/flutter_snippet_producers_test.dart
@@ -78,14 +78,8 @@
@override
String get prefix => FlutterStatefulWidgetSnippetProducer.prefix;
- Future<void> test_notValid_notFlutterProject() async {
- writeTestPackageConfig();
-
- await expectNotValidSnippet('^');
- }
-
- Future<void> test_valid() async {
- writeTestPackageConfig(flutter: true);
+ Future<void> test_noSuperParams() async {
+ writeTestPackageConfig(flutter: true, languageVersion: '2.16');
final snippet = await expectValidSnippet('^');
expect(snippet.prefix, prefix);
@@ -111,17 +105,51 @@
}
}''');
+ }
+
+ Future<void> test_notValid_notFlutterProject() async {
+ writeTestPackageConfig();
+
+ await expectNotValidSnippet('^');
+ }
+
+ Future<void> test_valid() async {
+ writeTestPackageConfig(flutter: true);
+
+ final snippet = await expectValidSnippet('^');
+ expect(snippet.prefix, prefix);
+ expect(snippet.label, label);
+ var code = '';
+ expect(snippet.change.edits, hasLength(1));
+ snippet.change.edits
+ .forEach((edit) => code = SourceEdit.applySequence(code, edit.edits));
+ expect(code, '''
+import 'package:flutter/src/widgets/framework.dart';
+
+class MyWidget extends StatefulWidget {
+ const MyWidget({super.key});
+
+ @override
+ State<MyWidget> createState() => _MyWidgetState();
+}
+
+class _MyWidgetState extends State<MyWidget> {
+ @override
+ Widget build(BuildContext context) {
+
+ }
+}''');
expect(snippet.change.selection!.file, testFile);
- expect(snippet.change.selection!.offset, 363);
+ expect(snippet.change.selection!.offset, 296);
expect(snippet.change.linkedEditGroups.map((group) => group.toJson()), [
{
'positions': [
- {'file': testFile, 'offset': 110},
- {'file': testFile, 'offset': 152},
- {'file': testFile, 'offset': 213},
- {'file': testFile, 'offset': 241},
- {'file': testFile, 'offset': 268},
- {'file': testFile, 'offset': 296},
+ {'file': testFile, 'offset': 60},
+ {'file': testFile, 'offset': 102},
+ {'file': testFile, 'offset': 146},
+ {'file': testFile, 'offset': 174},
+ {'file': testFile, 'offset': 201},
+ {'file': testFile, 'offset': 229},
],
'length': 8,
'suggestions': []
@@ -145,14 +173,8 @@
String get prefix =>
FlutterStatefulWidgetWithAnimationControllerSnippetProducer.prefix;
- Future<void> test_notValid_notFlutterProject() async {
- writeTestPackageConfig();
-
- await expectNotValidSnippet('^');
- }
-
- Future<void> test_valid() async {
- writeTestPackageConfig(flutter: true);
+ Future<void> test_noSuperParams() async {
+ writeTestPackageConfig(flutter: true, languageVersion: '2.16');
final snippet = await expectValidSnippet('^');
expect(snippet.prefix, prefix);
@@ -195,17 +217,68 @@
}
}''');
+ }
+
+ Future<void> test_notValid_notFlutterProject() async {
+ writeTestPackageConfig();
+
+ await expectNotValidSnippet('^');
+ }
+
+ Future<void> test_valid() async {
+ writeTestPackageConfig(flutter: true);
+
+ final snippet = await expectValidSnippet('^');
+ expect(snippet.prefix, prefix);
+ expect(snippet.label, label);
+ var code = '';
+ expect(snippet.change.edits, hasLength(1));
+ snippet.change.edits
+ .forEach((edit) => code = SourceEdit.applySequence(code, edit.edits));
+ expect(code, '''
+import 'package:flutter/src/animation/animation_controller.dart';
+import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/src/widgets/ticker_provider.dart';
+
+class MyWidget extends StatefulWidget {
+ const MyWidget({super.key});
+
+ @override
+ State<MyWidget> createState() => _MyWidgetState();
+}
+
+class _MyWidgetState extends State<MyWidget>
+ with SingleTickerProviderStateMixin {
+ late AnimationController _controller;
+
+ @override
+ void initState() {
+ super.initState();
+ _controller = AnimationController(vsync: this);
+ }
+
+ @override
+ void dispose() {
+ super.dispose();
+ _controller.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+
+ }
+}''');
expect(snippet.change.selection!.file, testFile);
- expect(snippet.change.selection!.offset, 766);
+ expect(snippet.change.selection!.offset, 699);
expect(snippet.change.linkedEditGroups.map((group) => group.toJson()), [
{
'positions': [
- {'file': testFile, 'offset': 235},
- {'file': testFile, 'offset': 277},
- {'file': testFile, 'offset': 338},
- {'file': testFile, 'offset': 366},
- {'file': testFile, 'offset': 393},
- {'file': testFile, 'offset': 421},
+ {'file': testFile, 'offset': 185},
+ {'file': testFile, 'offset': 227},
+ {'file': testFile, 'offset': 271},
+ {'file': testFile, 'offset': 299},
+ {'file': testFile, 'offset': 326},
+ {'file': testFile, 'offset': 354},
],
'length': 8,
'suggestions': []
@@ -226,14 +299,8 @@
@override
String get prefix => FlutterStatelessWidgetSnippetProducer.prefix;
- Future<void> test_notValid_notFlutterProject() async {
- writeTestPackageConfig();
-
- await expectNotValidSnippet('^');
- }
-
- Future<void> test_valid() async {
- writeTestPackageConfig(flutter: true);
+ Future<void> test_noSuperParams() async {
+ writeTestPackageConfig(flutter: true, languageVersion: '2.16');
final snippet = await expectValidSnippet('^');
expect(snippet.prefix, prefix);
@@ -254,13 +321,42 @@
}
}''');
+ }
+
+ Future<void> test_notValid_notFlutterProject() async {
+ writeTestPackageConfig();
+
+ await expectNotValidSnippet('^');
+ }
+
+ Future<void> test_valid() async {
+ writeTestPackageConfig(flutter: true);
+
+ final snippet = await expectValidSnippet('^');
+ expect(snippet.prefix, prefix);
+ expect(snippet.label, label);
+ var code = '';
+ expect(snippet.change.edits, hasLength(1));
+ snippet.change.edits
+ .forEach((edit) => code = SourceEdit.applySequence(code, edit.edits));
+ expect(code, '''
+import 'package:flutter/src/widgets/framework.dart';
+
+class MyWidget extends StatelessWidget {
+ const MyWidget({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+
+ }
+}''');
expect(snippet.change.selection!.file, testFile);
- expect(snippet.change.selection!.offset, 249);
+ expect(snippet.change.selection!.offset, 182);
expect(snippet.change.linkedEditGroups.map((group) => group.toJson()), [
{
'positions': [
- {'file': testFile, 'offset': 110},
- {'file': testFile, 'offset': 153},
+ {'file': testFile, 'offset': 60},
+ {'file': testFile, 'offset': 103},
],
'length': 8,
'suggestions': []
diff --git a/pkg/analysis_server/test/socket_server_test.dart b/pkg/analysis_server/test/socket_server_test.dart
index 1fbf2a5..cfc2ead 100644
--- a/pkg/analysis_server/test/socket_server_test.dart
+++ b/pkg/analysis_server/test/socket_server_test.dart
@@ -10,9 +10,9 @@
import 'package:analysis_server/src/server/error_notifier.dart';
import 'package:analysis_server/src/socket_server.dart';
import 'package:analysis_server/src/utilities/mocks.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
import 'package:analyzer/src/generated/engine.dart';
import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/utilities/cancellation.dart';
import 'package:test/test.dart';
void main() {
diff --git a/pkg/analysis_server/test/src/domain_abstract_test.dart b/pkg/analysis_server/test/src/domain_abstract_test.dart
index 5a64d54..33c09fa 100644
--- a/pkg/analysis_server/test/src/domain_abstract_test.dart
+++ b/pkg/analysis_server/test/src/domain_abstract_test.dart
@@ -6,8 +6,8 @@
import 'package:analysis_server/src/domain_abstract.dart';
import 'package:analysis_server/src/plugin/plugin_manager.dart';
import 'package:analysis_server/src/protocol_server.dart' hide Element;
-import 'package:analysis_server/src/utilities/progress.dart';
import 'package:analyzer/instrumentation/service.dart';
+import 'package:analyzer/src/utilities/cancellation.dart';
import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
import 'package:test/test.dart';
diff --git a/pkg/analyzer/lib/src/dart/analysis/search.dart b/pkg/analyzer/lib/src/dart/analysis/search.dart
index 988d60f..f6af5ab 100644
--- a/pkg/analyzer/lib/src/dart/analysis/search.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/search.dart
@@ -15,6 +15,7 @@
import 'package:analyzer/src/dart/ast/utilities.dart';
import 'package:analyzer/src/dart/element/element.dart';
import 'package:analyzer/src/summary/idl.dart';
+import 'package:analyzer/src/utilities/cancellation.dart';
import 'package:collection/collection.dart';
Element _getEnclosingElement(CompilationUnitElement unitElement, int offset) {
@@ -165,7 +166,7 @@
/// Add matching declarations to the [result].
Future<void> declarations(
WorkspaceSymbols result, RegExp? regExp, int? maxResults,
- {String? onlyForFile}) async {
+ {String? onlyForFile, CancellationToken? cancellationToken}) async {
if (result.hasMoreDeclarationsThan(maxResults)) {
return;
}
@@ -251,7 +252,14 @@
}
await _driver.discoverAvailableFiles();
+
+ if (cancellationToken?.isCancellationRequested ?? false) {
+ result.cancelled = true;
+ return;
+ }
+
var knownFiles = _driver.fsState.knownFiles.toList();
+ var filesProcessed = 0;
for (var file in knownFiles) {
var libraryElement = _driver.getLibraryByFile(file);
if (libraryElement != null) {
@@ -267,6 +275,16 @@
}
}
}
+ filesProcessed++;
+
+ // Periodically yield and check cancellation token.
+ if (cancellationToken != null && filesProcessed % 20 == 0) {
+ await null; // allow cancellation requests to be processed.
+ if (cancellationToken.isCancellationRequested) {
+ result.cancelled = true;
+ return;
+ }
+ }
}
}
@@ -820,6 +838,9 @@
final List<String> files = [];
final Map<String, int> _pathToIndex = {};
+ /// Whether this search was marked cancelled before it completed.
+ bool cancelled = false;
+
bool hasMoreDeclarationsThan(int? maxResults) {
return maxResults != null && declarations.length >= maxResults;
}
diff --git a/pkg/analysis_server/lib/src/utilities/progress.dart b/pkg/analyzer/lib/src/utilities/cancellation.dart
similarity index 100%
rename from pkg/analysis_server/lib/src/utilities/progress.dart
rename to pkg/analyzer/lib/src/utilities/cancellation.dart
diff --git a/pkg/analyzer/test/src/dart/analysis/search_test.dart b/pkg/analyzer/test/src/dart/analysis/search_test.dart
index 55c4c67..234a6ec 100644
--- a/pkg/analyzer/test/src/dart/analysis/search_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/search_test.dart
@@ -8,6 +8,7 @@
import 'package:analyzer/src/dart/analysis/driver.dart';
import 'package:analyzer/src/dart/analysis/search.dart';
import 'package:analyzer/src/test_utilities/find_element.dart';
+import 'package:analyzer/src/utilities/cancellation.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -137,6 +138,26 @@
unorderedEquals([a.methods[0], b.fields[0]]));
}
+ test_declarations_cancel() async {
+ await resolveTestCode('''
+class C {
+ int f;
+ C();
+ C.named();
+ int get g => 0;
+ void set s(_) {}
+ void m() {}
+}
+''');
+ var results = WorkspaceSymbols();
+ var token = CancelableToken();
+ var searchFuture = driver.search
+ .declarations(results, null, null, cancellationToken: token);
+ token.cancel();
+ await searchFuture;
+ expect(results.cancelled, isTrue);
+ }
+
test_declarations_class() async {
await resolveTestCode('''
class C {
diff --git a/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart b/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart
index 30b4631..79a2d15 100644
--- a/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart
@@ -132,16 +132,18 @@
}
// If the bound is not set yet, the actual value is not important yet as it
// will be set later.
- bool needsPostUpdate = false;
+ bool needsPostUpdate = nullabilityBuilder.isOmitted &&
+ identical(parameter.bound, TypeParameter.unsetBoundSentinel) ||
+ library is SourceLibraryBuilder &&
+ library.hasPendingNullability(parameter.bound);
Nullability nullability;
if (nullabilityBuilder.isOmitted) {
- if (!identical(parameter.bound, TypeParameter.unsetBoundSentinel)) {
+ if (needsPostUpdate) {
+ nullability = Nullability.legacy;
+ } else {
nullability = library.isNonNullableByDefault
? TypeParameterType.computeNullabilityFromBound(parameter)
: Nullability.legacy;
- } else {
- nullability = Nullability.legacy;
- needsPostUpdate = true;
}
} else {
nullability = nullabilityBuilder.build(library);
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 51bf903..e3481a8 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -3421,26 +3421,33 @@
// of the depth-first search. Continue to the next one.
continue;
}
- if (type.parameter.bound is TypeParameterType) {
+ DartType peeledBound = _peelOffFutureOr(type.parameter.bound);
+ if (peeledBound is TypeParameterType) {
TypeParameterType current = type;
- TypeParameterType? next = current.parameter.bound as TypeParameterType;
+ TypeParameterType? next = peeledBound;
+ bool isDirectDependency = identical(type.parameter.bound, peeledBound);
while (next != null && getDeclaredNullability(next) == null) {
stack[stackTop++] = current;
setDeclaredNullability(current, marker);
current = next;
- if (current.parameter.bound is TypeParameterType) {
- next = current.parameter.bound as TypeParameterType;
+ peeledBound = _peelOffFutureOr(current.parameter.bound);
+ isDirectDependency = isDirectDependency &&
+ identical(current.parameter.bound, peeledBound);
+ if (peeledBound is TypeParameterType) {
+ next = peeledBound;
if (getDeclaredNullability(next) == marker) {
setDeclaredNullability(next, Nullability.undetermined);
- current.parameter.bound = const InvalidType();
- current.parameter.defaultType = const InvalidType();
- addProblem(
- templateCycleInTypeVariables.withArguments(
- next.parameter.name!, current.parameter.name!),
- pendingNullability.charOffset,
- next.parameter.name!.length,
- pendingNullability.fileUri);
+ if (isDirectDependency) {
+ current.parameter.bound = const InvalidType();
+ current.parameter.defaultType = const InvalidType();
+ addProblem(
+ templateCycleInTypeVariables.withArguments(
+ next.parameter.name!, current.parameter.name!),
+ pendingNullability.charOffset,
+ next.parameter.name!.length,
+ pendingNullability.fileUri);
+ }
next = null;
}
} else {
@@ -4865,6 +4872,25 @@
.add(new PendingNullability(fileUri, charOffset, type));
}
+ bool hasPendingNullability(DartType type) {
+ type = _peelOffFutureOr(type);
+ if (type is TypeParameterType) {
+ for (PendingNullability pendingNullability in _pendingNullabilities) {
+ if (pendingNullability.type == type) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ static DartType _peelOffFutureOr(DartType type) {
+ while (type is FutureOrType) {
+ type = type.typeArgument;
+ }
+ return type;
+ }
+
/// Performs delayed bounds checks on [TypedefType]s for the library
///
/// As [TypedefType]s are built, they are eagerly unaliased, making it
@@ -5409,6 +5435,11 @@
final TypeParameterType type;
PendingNullability(this.fileUri, this.charOffset, this.type);
+
+ @override
+ String toString() {
+ return "PendingNullability(${fileUri}, ${charOffset}, ${type})";
+ }
}
class UncheckedTypedefType {
diff --git a/pkg/front_end/testcases/nnbd/pending_nullabilities.dart b/pkg/front_end/testcases/nnbd/pending_nullabilities.dart
new file mode 100644
index 0000000..5c1f12a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/pending_nullabilities.dart
@@ -0,0 +1,14 @@
+// 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';
+
+class A {
+ foo<T1 extends FutureOr<S1>, S1 extends FutureOr<T1>>(T1 t, S1 s) {}
+ bar<T2 extends FutureOr<S2>, S2 extends FutureOr<Object>>(T2 t, S2 s) {}
+ baz<U3 extends FutureOr<T3>, T3 extends FutureOr<S3>, S3 extends FutureOr<Object>>(U3 u, T3 t, S3 s) {}
+
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/pending_nullabilities.dart.strong.expect b/pkg/front_end/testcases/nnbd/pending_nullabilities.dart.strong.expect
new file mode 100644
index 0000000..ab25a3d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/pending_nullabilities.dart.strong.expect
@@ -0,0 +1,15 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+class A extends core::Object {
+ synthetic constructor •() → self::A
+ : super core::Object::•()
+ ;
+ method foo<T1 extends FutureOr<self::A::foo::S1%> = FutureOr<dynamic>, S1 extends FutureOr<self::A::foo::T1%> = FutureOr<dynamic>>(self::A::foo::T1% t, self::A::foo::S1% s) → dynamic {}
+ method bar<T2 extends FutureOr<self::A::bar::S2> = FutureOr<FutureOr<core::Object>>, S2 extends FutureOr<core::Object>>(self::A::bar::T2 t, self::A::bar::S2 s) → dynamic {}
+ method baz<U3 extends FutureOr<self::A::baz::T3> = FutureOr<FutureOr<FutureOr<core::Object>>>, T3 extends FutureOr<self::A::baz::S3> = FutureOr<FutureOr<core::Object>>, S3 extends FutureOr<core::Object>>(self::A::baz::U3 u, self::A::baz::T3 t, self::A::baz::S3 s) → dynamic {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/pending_nullabilities.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/pending_nullabilities.dart.strong.transformed.expect
new file mode 100644
index 0000000..ab25a3d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/pending_nullabilities.dart.strong.transformed.expect
@@ -0,0 +1,15 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+class A extends core::Object {
+ synthetic constructor •() → self::A
+ : super core::Object::•()
+ ;
+ method foo<T1 extends FutureOr<self::A::foo::S1%> = FutureOr<dynamic>, S1 extends FutureOr<self::A::foo::T1%> = FutureOr<dynamic>>(self::A::foo::T1% t, self::A::foo::S1% s) → dynamic {}
+ method bar<T2 extends FutureOr<self::A::bar::S2> = FutureOr<FutureOr<core::Object>>, S2 extends FutureOr<core::Object>>(self::A::bar::T2 t, self::A::bar::S2 s) → dynamic {}
+ method baz<U3 extends FutureOr<self::A::baz::T3> = FutureOr<FutureOr<FutureOr<core::Object>>>, T3 extends FutureOr<self::A::baz::S3> = FutureOr<FutureOr<core::Object>>, S3 extends FutureOr<core::Object>>(self::A::baz::U3 u, self::A::baz::T3 t, self::A::baz::S3 s) → dynamic {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/pending_nullabilities.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/pending_nullabilities.dart.textual_outline.expect
new file mode 100644
index 0000000..03d81d4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/pending_nullabilities.dart.textual_outline.expect
@@ -0,0 +1,10 @@
+import 'dart:async';
+
+class A {
+ foo<T1 extends FutureOr<S1>, S1 extends FutureOr<T1>>(T1 t, S1 s) {}
+ bar<T2 extends FutureOr<S2>, S2 extends FutureOr<Object>>(T2 t, S2 s) {}
+ baz<U3 extends FutureOr<T3>, T3 extends FutureOr<S3>,
+ S3 extends FutureOr<Object>>(U3 u, T3 t, S3 s) {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/pending_nullabilities.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/pending_nullabilities.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..1a2e67d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/pending_nullabilities.dart.textual_outline_modelled.expect
@@ -0,0 +1,10 @@
+import 'dart:async';
+
+class A {
+ bar<T2 extends FutureOr<S2>, S2 extends FutureOr<Object>>(T2 t, S2 s) {}
+ baz<U3 extends FutureOr<T3>, T3 extends FutureOr<S3>,
+ S3 extends FutureOr<Object>>(U3 u, T3 t, S3 s) {}
+ foo<T1 extends FutureOr<S1>, S1 extends FutureOr<T1>>(T1 t, S1 s) {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/pending_nullabilities.dart.weak.expect b/pkg/front_end/testcases/nnbd/pending_nullabilities.dart.weak.expect
new file mode 100644
index 0000000..ab25a3d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/pending_nullabilities.dart.weak.expect
@@ -0,0 +1,15 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+class A extends core::Object {
+ synthetic constructor •() → self::A
+ : super core::Object::•()
+ ;
+ method foo<T1 extends FutureOr<self::A::foo::S1%> = FutureOr<dynamic>, S1 extends FutureOr<self::A::foo::T1%> = FutureOr<dynamic>>(self::A::foo::T1% t, self::A::foo::S1% s) → dynamic {}
+ method bar<T2 extends FutureOr<self::A::bar::S2> = FutureOr<FutureOr<core::Object>>, S2 extends FutureOr<core::Object>>(self::A::bar::T2 t, self::A::bar::S2 s) → dynamic {}
+ method baz<U3 extends FutureOr<self::A::baz::T3> = FutureOr<FutureOr<FutureOr<core::Object>>>, T3 extends FutureOr<self::A::baz::S3> = FutureOr<FutureOr<core::Object>>, S3 extends FutureOr<core::Object>>(self::A::baz::U3 u, self::A::baz::T3 t, self::A::baz::S3 s) → dynamic {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/pending_nullabilities.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/pending_nullabilities.dart.weak.modular.expect
new file mode 100644
index 0000000..ab25a3d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/pending_nullabilities.dart.weak.modular.expect
@@ -0,0 +1,15 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+class A extends core::Object {
+ synthetic constructor •() → self::A
+ : super core::Object::•()
+ ;
+ method foo<T1 extends FutureOr<self::A::foo::S1%> = FutureOr<dynamic>, S1 extends FutureOr<self::A::foo::T1%> = FutureOr<dynamic>>(self::A::foo::T1% t, self::A::foo::S1% s) → dynamic {}
+ method bar<T2 extends FutureOr<self::A::bar::S2> = FutureOr<FutureOr<core::Object>>, S2 extends FutureOr<core::Object>>(self::A::bar::T2 t, self::A::bar::S2 s) → dynamic {}
+ method baz<U3 extends FutureOr<self::A::baz::T3> = FutureOr<FutureOr<FutureOr<core::Object>>>, T3 extends FutureOr<self::A::baz::S3> = FutureOr<FutureOr<core::Object>>, S3 extends FutureOr<core::Object>>(self::A::baz::U3 u, self::A::baz::T3 t, self::A::baz::S3 s) → dynamic {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/pending_nullabilities.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/pending_nullabilities.dart.weak.outline.expect
new file mode 100644
index 0000000..243cf41
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/pending_nullabilities.dart.weak.outline.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+class A extends core::Object {
+ synthetic constructor •() → self::A
+ ;
+ method foo<T1 extends FutureOr<self::A::foo::S1%> = FutureOr<dynamic>, S1 extends FutureOr<self::A::foo::T1%> = FutureOr<dynamic>>(self::A::foo::T1% t, self::A::foo::S1% s) → dynamic
+ ;
+ method bar<T2 extends FutureOr<self::A::bar::S2> = FutureOr<FutureOr<core::Object>>, S2 extends FutureOr<core::Object>>(self::A::bar::T2 t, self::A::bar::S2 s) → dynamic
+ ;
+ method baz<U3 extends FutureOr<self::A::baz::T3> = FutureOr<FutureOr<FutureOr<core::Object>>>, T3 extends FutureOr<self::A::baz::S3> = FutureOr<FutureOr<core::Object>>, S3 extends FutureOr<core::Object>>(self::A::baz::U3 u, self::A::baz::T3 t, self::A::baz::S3 s) → dynamic
+ ;
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/nnbd/pending_nullabilities.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/pending_nullabilities.dart.weak.transformed.expect
new file mode 100644
index 0000000..ab25a3d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/pending_nullabilities.dart.weak.transformed.expect
@@ -0,0 +1,15 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+class A extends core::Object {
+ synthetic constructor •() → self::A
+ : super core::Object::•()
+ ;
+ method foo<T1 extends FutureOr<self::A::foo::S1%> = FutureOr<dynamic>, S1 extends FutureOr<self::A::foo::T1%> = FutureOr<dynamic>>(self::A::foo::T1% t, self::A::foo::S1% s) → dynamic {}
+ method bar<T2 extends FutureOr<self::A::bar::S2> = FutureOr<FutureOr<core::Object>>, S2 extends FutureOr<core::Object>>(self::A::bar::T2 t, self::A::bar::S2 s) → dynamic {}
+ method baz<U3 extends FutureOr<self::A::baz::T3> = FutureOr<FutureOr<FutureOr<core::Object>>>, T3 extends FutureOr<self::A::baz::S3> = FutureOr<FutureOr<core::Object>>, S3 extends FutureOr<core::Object>>(self::A::baz::U3 u, self::A::baz::T3 t, self::A::baz::S3 s) → dynamic {}
+}
+static method main() → dynamic {}
diff --git a/tools/VERSION b/tools/VERSION
index eaf4277..8d5cf70 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 17
PATCH 0
-PRERELEASE 275
+PRERELEASE 276
PRERELEASE_PATCH 0
\ No newline at end of file