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