Version 2.18.0-86.0.dev

Merge commit '7359e2dd7d96e0f019c216aab195f388f79084f2' into 'dev'
diff --git a/DEPS b/DEPS
index f05fe30..52a18ec 100644
--- a/DEPS
+++ b/DEPS
@@ -125,7 +125,7 @@
   "linter_rev": "14c916a16e78315e212cf79e7ccf4c19159a1bda",
   "lints_rev": "8294e5648ab49474541527e2911e72e4c5aefe55",
   "logging_rev": "dfbe88b890c3b4f7bc06da5a7b3b43e9e263b688",
-  "markdown_rev": "7479783f0493f6717e1d7ae31cb37d39a91026b2",
+  "markdown_rev": "5699cafa9ef004875fd7de8ae9ea00e5295e87a4", # 5.0.0
   "markupsafe_rev": "8f45f5cfa0009d2a70589bcda0349b8cb2b72783",
   "matcher_rev": "07595a7739d47a8315caba5a8e58fb9ae3d81261",
   "mime_rev": "c2c5ffd594674f32dc277521369da1557a1622d3",
diff --git a/pkg/analysis_server/analysis_options.yaml b/pkg/analysis_server/analysis_options.yaml
index 1b77fd0..548d7ea 100644
--- a/pkg/analysis_server/analysis_options.yaml
+++ b/pkg/analysis_server/analysis_options.yaml
@@ -22,8 +22,6 @@
     non_constant_identifier_names: ignore
     overridden_fields: ignore
     prefer_function_declarations_over_variables: ignore
-    # todo: add ignore to `protocol_generated.dart`
-    prefer_interpolation_to_compose_strings: ignore
     prefer_void_to_null: ignore
     provide_deprecation_message: ignore
 
diff --git a/pkg/analysis_server/lib/protocol/protocol_constants.dart b/pkg/analysis_server/lib/protocol/protocol_constants.dart
index 24ad02a..cc63b35 100644
--- a/pkg/analysis_server/lib/protocol/protocol_constants.dart
+++ b/pkg/analysis_server/lib/protocol/protocol_constants.dart
@@ -6,6 +6,9 @@
 // To regenerate the file, use the script
 // "pkg/analysis_server/tool/spec/generate_files".
 
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: prefer_interpolation_to_compose_strings
+
 const String PROTOCOL_VERSION = '1.33.0';
 
 const String ANALYSIS_NOTIFICATION_ANALYZED_FILES = 'analysis.analyzedFiles';
diff --git a/pkg/analysis_server/lib/protocol/protocol_generated.dart b/pkg/analysis_server/lib/protocol/protocol_generated.dart
index 37339ee..3db69c3 100644
--- a/pkg/analysis_server/lib/protocol/protocol_generated.dart
+++ b/pkg/analysis_server/lib/protocol/protocol_generated.dart
@@ -6,6 +6,9 @@
 // To regenerate the file, use the script
 // "pkg/analysis_server/tool/spec/generate_files".
 
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: prefer_interpolation_to_compose_strings
+
 import 'dart:convert' hide JsonDecoder;
 
 import 'package:analysis_server/protocol/protocol.dart';
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
index ce04f9e..f86e1d8 100644
--- a/pkg/analysis_server/test/domain_completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -2374,9 +2374,9 @@
 
     // Wait for analysis then edit the content
     await waitForTasksFinished();
-    var revisedContent = testFileContent.substring(0, 0) +
-        'i' +
-        testFileContent.substring(completionOffset);
+    var precedingContent = testFileContent.substring(0, 0);
+    var trailingContent = testFileContent.substring(completionOffset);
+    var revisedContent = '${precedingContent}i$trailingContent';
     ++completionOffset;
     server.handleRequest(AnalysisUpdateContentParams(
         {testFile.path: AddContentOverlay(revisedContent)}).toRequest('add1'));
diff --git a/pkg/analysis_server/test/integration/support/integration_test_methods.dart b/pkg/analysis_server/test/integration/support/integration_test_methods.dart
index e577b4f..98d2823 100644
--- a/pkg/analysis_server/test/integration/support/integration_test_methods.dart
+++ b/pkg/analysis_server/test/integration/support/integration_test_methods.dart
@@ -6,6 +6,9 @@
 // To regenerate the file, use the script
 // "pkg/analysis_server/tool/spec/generate_files".
 
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: prefer_interpolation_to_compose_strings
+
 /// Convenience methods for running integration tests.
 import 'dart:async';
 
diff --git a/pkg/analysis_server/test/integration/support/protocol_matchers.dart b/pkg/analysis_server/test/integration/support/protocol_matchers.dart
index c1c7fcc..3e1fb05 100644
--- a/pkg/analysis_server/test/integration/support/protocol_matchers.dart
+++ b/pkg/analysis_server/test/integration/support/protocol_matchers.dart
@@ -6,6 +6,9 @@
 // To regenerate the file, use the script
 // "pkg/analysis_server/tool/spec/generate_files".
 
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: prefer_interpolation_to_compose_strings
+
 /// Matchers for data types defined in the analysis server API.
 import 'package:test/test.dart';
 
diff --git a/pkg/analysis_server/test/src/services/correction/assist/assign_to_local_variable_test.dart b/pkg/analysis_server/test/src/services/correction/assist/assign_to_local_variable_test.dart
index f2c08ed..3751d7f 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/assign_to_local_variable_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/assign_to_local_variable_test.dart
@@ -23,7 +23,7 @@
 
   Future<void> test_alreadyAssignment() async {
     await resolveTestCode('''
-main() {
+void f() {
   var vvv;
   vvv = 42;
 }
@@ -33,14 +33,14 @@
 
   Future<void> test_inClosure() async {
     await resolveTestCode(r'''
-main() {
+void f() {
   print(() {
     12345;
   });
 }
 ''');
     await assertHasAssistAt('345', '''
-main() {
+void f() {
   print(() {
     var i = 12345;
   });
@@ -50,14 +50,14 @@
 
   Future<void> test_invocation() async {
     await resolveTestCode('''
-main() {
+void f() {
   List<int> bytes;
   readBytes();
 }
 List<int> readBytes() => <int>[];
 ''');
     await assertHasAssistAt('readBytes();', '''
-main() {
+void f() {
   List<int> bytes;
   var readBytes = readBytes();
 }
@@ -72,10 +72,10 @@
 
   Future<void> test_invocationArgument() async {
     await resolveTestCode(r'''
-main() {
-  f(12345);
+void f() {
+  g(12345);
 }
-void f(p) {}
+void g(p) {}
 ''');
     await assertNoAssistAt('345');
   }
@@ -83,12 +83,12 @@
   Future<void> test_lint_prefer_final_locals() async {
     createAnalysisOptionsFile(lints: [LintNames.prefer_final_locals]);
     await resolveTestCode(r'''
-main() {
+void f() {
   12345;
 }
 ''');
     await assertHasAssistAt('345', '''
-main() {
+void f() {
   final i = 12345;
 }
 ''');
@@ -107,7 +107,7 @@
 
   Future<void> test_throw() async {
     await resolveTestCode('''
-main() {
+void f() {
   throw 42;
 }
 ''');
@@ -116,10 +116,10 @@
 
   Future<void> test_void() async {
     await resolveTestCode('''
-main() {
+void f() {
   f();
 }
-void f() {}
+void g() {}
 ''');
     await assertNoAssistAt('f();');
   }
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_into_async_body_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_into_async_body_test.dart
index d524c70..80e762e 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_into_async_body_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_into_async_body_test.dart
@@ -37,13 +37,13 @@
 
   Future<void> test_closure() async {
     await resolveTestCode('''
-main() {
+void h() {
   f(() => 123);
 }
 f(g) {}
 ''');
     await assertHasAssistAt('=>', '''
-main() {
+void h() {
   f(() async => 123);
 }
 f(g) {}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_into_block_body_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_into_block_body_test.dart
index c135fc2..fb714b5 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_into_block_body_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_into_block_body_test.dart
@@ -37,13 +37,13 @@
   Future<void> test_closure() async {
     await resolveTestCode('''
 setup(x) {}
-main() {
+void f() {
   setup(() => 42);
 }
 ''');
     await assertHasAssistAt('() => 42', '''
 setup(x) {}
-main() {
+void f() {
   setup(() {
     return 42;
   });
@@ -55,13 +55,13 @@
   Future<void> test_closure_voidExpression() async {
     await resolveTestCode('''
 setup(x) {}
-main() {
+void f() {
   setup(() => print('done'));
 }
 ''');
     await assertHasAssistAt('() => print', '''
 setup(x) {}
-main() {
+void f() {
   setup(() {
     print('done');
   });
@@ -91,7 +91,7 @@
 
   Future<void> test_inExpression() async {
     await resolveTestCode('''
-main() => 123;
+void f() => 123;
 ''');
     await assertNoAssistAt('123;');
   }
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_into_expression_body_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_into_expression_body_test.dart
index 10ba918..a7d246b 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_into_expression_body_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_into_expression_body_test.dart
@@ -59,7 +59,7 @@
   Future<void> test_closure() async {
     await resolveTestCode('''
 setup(x) {}
-main() {
+void f() {
   setup(() {
     return 42;
   });
@@ -67,7 +67,7 @@
 ''');
     await assertHasAssistAt('return', '''
 setup(x) {}
-main() {
+void f() {
   setup(() => 42);
 }
 ''');
@@ -76,7 +76,7 @@
   Future<void> test_closure_hasBlockComment_afterReturnStatement() async {
     await resolveTestCode('''
 setup(x) {}
-main() {
+void f() {
   setup(() {
     return 42;
     // Comment.
@@ -89,7 +89,7 @@
   Future<void> test_closure_hasBlockComment_beforeReturnKeyword() async {
     await resolveTestCode('''
 setup(x) {}
-main() {
+void f() {
   setup(() {
     // Comment.
     return 42;
@@ -102,7 +102,7 @@
   Future<void> test_closure_hasBlockComment_multiple() async {
     await resolveTestCode('''
 setup(x) {}
-main() {
+void f() {
   setup(() {
     // Comment.
 
@@ -117,7 +117,7 @@
   Future<void> test_closure_hasInlineComment_beforeBodyKeyword() async {
     await resolveTestCode('''
 setup(x) {}
-main() {
+void f() {
   setup(() /* Comment. */ async {
     return 42;
   });
@@ -129,7 +129,7 @@
   Future<void> test_closure_hasInlineComment_beforeOpenBrace() async {
     await resolveTestCode('''
 setup(x) {}
-main() {
+void f() {
   setup(() /* Comment. */ {
     return 42;
   });
@@ -141,7 +141,7 @@
   Future<void> test_closure_hasInlineComment_beforeReturn() async {
     await resolveTestCode('''
 setup(x) {}
-main() {
+void f() {
   setup(() {
     /* Comment. */
     return 42;
@@ -154,7 +154,7 @@
   Future<void> test_closure_hasInlineComment_beforeReturnSemicolon() async {
     await resolveTestCode('''
 setup(x) {}
-main() {
+void f() {
   setup(() {
     return  42 /* Comment. */;
   });
@@ -166,7 +166,7 @@
   Future<void> test_closure_voidExpression() async {
     await resolveTestCode('''
 setup(x) {}
-main() {
+void f() {
   setup((_) {
     print('test');
   });
@@ -174,7 +174,7 @@
 ''');
     await assertHasAssistAt('(_) {', '''
 setup(x) {}
-main() {
+void f() {
   setup((_) => print('test'));
 }
 ''');
@@ -236,7 +236,7 @@
 
   Future<void> test_inExpression() async {
     await resolveTestCode('''
-main() {
+int f() {
   return 42;
 }
 ''');
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_double_quoted_string_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_double_quoted_string_test.dart
index 813e4bc..12cc175 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_double_quoted_string_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_double_quoted_string_test.dart
@@ -21,7 +21,7 @@
 
   Future<void> test_one_embeddedTarget() async {
     await resolveTestCode('''
-main() {
+void f() {
   print('a"b"c');
 }
 ''');
@@ -30,7 +30,7 @@
 
   Future<void> test_one_enclosingTarget() async {
     await resolveTestCode('''
-main() {
+void f() {
   print("abc");
 }
 ''');
@@ -39,14 +39,14 @@
 
   Future<void> test_one_interpolation() async {
     await resolveTestCode(r'''
-main() {
+void f() {
   var b = 'b';
   var c = 'c';
   print('a $b-${c} d');
 }
 ''');
     await assertHasAssistAt(r"'a $b", r'''
-main() {
+void f() {
   var b = 'b';
   var c = 'c';
   print("a $b-${c} d");
@@ -66,12 +66,12 @@
 
   Future<void> test_one_raw() async {
     await resolveTestCode('''
-main() {
+void f() {
   print(r'abc');
 }
 ''');
     await assertHasAssistAt("'ab", '''
-main() {
+void f() {
   print(r"abc");
 }
 ''');
@@ -79,12 +79,12 @@
 
   Future<void> test_one_simple() async {
     await resolveTestCode('''
-main() {
+void f() {
   print('abc');
 }
 ''');
     await assertHasAssistAt("'ab", '''
-main() {
+void f() {
   print("abc");
 }
 ''');
@@ -102,7 +102,7 @@
 
   Future<void> test_three_embeddedTarget() async {
     await resolveTestCode("""
-main() {
+void f() {
   print('''a""\"c''');
 }
 """);
@@ -111,7 +111,7 @@
 
   Future<void> test_three_enclosingTarget() async {
     await resolveTestCode('''
-main() {
+void f() {
   print("""abc""");
 }
 ''');
@@ -120,14 +120,14 @@
 
   Future<void> test_three_interpolation() async {
     await resolveTestCode(r"""
-main() {
+void f() {
   var b = 'b';
   var c = 'c';
   print('''a $b-${c} d''');
 }
 """);
     await assertHasAssistAt(r"'a $b", r'''
-main() {
+void f() {
   var b = 'b';
   var c = 'c';
   print("""a $b-${c} d""");
@@ -137,12 +137,12 @@
 
   Future<void> test_three_raw() async {
     await resolveTestCode("""
-main() {
+void f() {
   print(r'''abc''');
 }
 """);
     await assertHasAssistAt("'ab", '''
-main() {
+void f() {
   print(r"""abc""");
 }
 ''');
@@ -150,12 +150,12 @@
 
   Future<void> test_three_simple() async {
     await resolveTestCode("""
-main() {
+void f() {
   print('''abc''');
 }
 """);
     await assertHasAssistAt("'ab", '''
-main() {
+void f() {
   print("""abc""");
 }
 ''');
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_multiline_string_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_multiline_string_test.dart
index 1e52915..e18bece 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_multiline_string_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_multiline_string_test.dart
@@ -21,12 +21,12 @@
 
   Future<void> test_doubleQuoted() async {
     await resolveTestCode('''
-main() {
+void f() {
   print("abc");
 }
 ''');
     await assertHasAssistAt('abc', '''
-main() {
+void f() {
   print("""
 abc""");
 }
@@ -35,7 +35,7 @@
 
   Future<void> test_doubleQuoted_alreadyMultiline() async {
     await resolveTestCode('''
-main() {
+void f() {
   print("""abc""");
 }
 ''');
@@ -44,7 +44,7 @@
 
   Future<void> test_doubleQuoted_interpolation_expressionElement() async {
     await resolveTestCode(r"""
-main() {
+void f() {
   var b = 'b';
   var c = 'c';
   print("a $b - ${c} d");
@@ -55,14 +55,14 @@
 
   Future<void> test_doubleQuoted_interpolation_stringElement_begin() async {
     await resolveTestCode(r"""
-main() {
+void f() {
   var b = 'b';
   var c = 'c';
   print("a $b - ${c} d");
 }
 """);
     await assertHasAssistAt('"a ', r'''
-main() {
+void f() {
   var b = 'b';
   var c = 'c';
   print("""
@@ -73,14 +73,14 @@
 
   Future<void> test_doubleQuoted_interpolation_stringElement_middle() async {
     await resolveTestCode(r"""
-main() {
+void f() {
   var b = 'b';
   var c = 'c';
   print("a $b - ${c} d");
 }
 """);
     await assertHasAssistAt('- ', r'''
-main() {
+void f() {
   var b = 'b';
   var c = 'c';
   print("""
@@ -91,12 +91,12 @@
 
   Future<void> test_doubleQuoted_raw() async {
     await resolveTestCode('''
-main() {
+void f() {
   print(r"abc");
 }
 ''');
     await assertHasAssistAt('abc', '''
-main() {
+void f() {
   print(r"""
 abc""");
 }
@@ -125,12 +125,12 @@
 
   Future<void> test_singleQuoted() async {
     await resolveTestCode('''
-main() {
+void f() {
   print('abc');
 }
 ''');
     await assertHasAssistAt('abc', """
-main() {
+void f() {
   print('''
 abc''');
 }
@@ -139,7 +139,7 @@
 
   Future<void> test_singleQuoted_interpolation_expressionElement() async {
     await resolveTestCode(r"""
-main() {
+void f() {
   var b = 'b';
   var c = 'c';
   print('a $b - ${c} d');
@@ -150,14 +150,14 @@
 
   Future<void> test_singleQuoted_interpolation_stringElement_begin() async {
     await resolveTestCode(r"""
-main() {
+void f() {
   var b = 'b';
   var c = 'c';
   print('a $b - ${c} d');
 }
 """);
     await assertHasAssistAt("'a ", r"""
-main() {
+void f() {
   var b = 'b';
   var c = 'c';
   print('''
@@ -168,14 +168,14 @@
 
   Future<void> test_singleQuoted_interpolation_stringElement_middle() async {
     await resolveTestCode(r"""
-main() {
+void f() {
   var b = 'b';
   var c = 'c';
   print('a $b - ${c} d');
 }
 """);
     await assertHasAssistAt('- ', r"""
-main() {
+void f() {
   var b = 'b';
   var c = 'c';
   print('''
@@ -186,12 +186,12 @@
 
   Future<void> test_singleQuoted_raw() async {
     await resolveTestCode('''
-main() {
+void f() {
   print(r'abc');
 }
 ''');
     await assertHasAssistAt('abc', """
-main() {
+void f() {
   print(r'''
 abc''');
 }
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_single_quoted_string_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_single_quoted_string_test.dart
index 4214de8..0085058 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_single_quoted_string_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_single_quoted_string_test.dart
@@ -22,7 +22,7 @@
 
   Future<void> test_one_embeddedTarget() async {
     await resolveTestCode('''
-main() {
+void f() {
   print("a'b'c");
 }
 ''');
@@ -31,7 +31,7 @@
 
   Future<void> test_one_enclosingTarget() async {
     await resolveTestCode('''
-main() {
+void f() {
   print('abc');
 }
 ''');
@@ -40,14 +40,14 @@
 
   Future<void> test_one_interpolation() async {
     await resolveTestCode(r'''
-main() {
+void f() {
   var b = 'b';
   var c = 'c';
   print("a $b-${c} d");
 }
 ''');
     await assertHasAssistAt(r'"a $b', r'''
-main() {
+void f() {
   var b = 'b';
   var c = 'c';
   print('a $b-${c} d');
@@ -67,12 +67,12 @@
 
   Future<void> test_one_raw() async {
     await resolveTestCode('''
-main() {
+void f() {
   print(r"abc");
 }
 ''');
     await assertHasAssistAt('"ab', '''
-main() {
+void f() {
   print(r'abc');
 }
 ''');
@@ -80,12 +80,12 @@
 
   Future<void> test_one_simple() async {
     await resolveTestCode('''
-main() {
+void f() {
   print("abc");
 }
 ''');
     await assertHasAssistAt('"ab', '''
-main() {
+void f() {
   print('abc');
 }
 ''');
@@ -95,7 +95,7 @@
     createAnalysisOptionsFile(lints: [LintNames.prefer_single_quotes]);
     verifyNoTestUnitErrors = false;
     await resolveTestCode('''
-main() {
+void f() {
   print("abc");
 }
 ''');
@@ -114,7 +114,7 @@
 
   Future<void> test_three_embeddedTarget() async {
     await resolveTestCode('''
-main() {
+void f() {
   print("""a''\'bc""");
 }
 ''');
@@ -123,7 +123,7 @@
 
   Future<void> test_three_enclosingTarget() async {
     await resolveTestCode("""
-main() {
+void f() {
   print('''abc''');
 }
 """);
@@ -132,14 +132,14 @@
 
   Future<void> test_three_interpolation() async {
     await resolveTestCode(r'''
-main() {
+void f() {
   var b = 'b';
   var c = 'c';
   print("""a $b-${c} d""");
 }
 ''');
     await assertHasAssistAt(r'"a $b', r"""
-main() {
+void f() {
   var b = 'b';
   var c = 'c';
   print('''a $b-${c} d''');
@@ -149,12 +149,12 @@
 
   Future<void> test_three_raw() async {
     await resolveTestCode('''
-main() {
+void f() {
   print(r"""abc""");
 }
 ''');
     await assertHasAssistAt('"ab', """
-main() {
+void f() {
   print(r'''abc''');
 }
 """);
@@ -162,12 +162,12 @@
 
   Future<void> test_three_simple() async {
     await resolveTestCode('''
-main() {
+void f() {
   print("""abc""");
 }
 ''');
     await assertHasAssistAt('"ab', """
-main() {
+void f() {
   print('''abc''');
 }
 """);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_stateful_widget_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_stateful_widget_test.dart
index dfb00eb..5e11735 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_stateful_widget_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_stateful_widget_test.dart
@@ -431,7 +431,7 @@
   Future<void> test_notClass() async {
     await resolveTestCode('''
 import 'package:flutter/material.dart';
-/*caret*/main() {}
+/*caret*/void f() {}
 ''');
     await assertNoAssist();
   }
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_move_down_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_move_down_test.dart
index 3ed98b5..11960c7 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_move_down_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_move_down_test.dart
@@ -30,7 +30,7 @@
   Future<void> test_first() async {
     await resolveTestCode('''
 import 'package:flutter/material.dart';
-main() {
+void f() {
   Column(
     children: <Widget>[
       Text('aaa'),
@@ -42,7 +42,7 @@
 ''');
     await assertHasAssist('''
 import 'package:flutter/material.dart';
-main() {
+void f() {
   Column(
     children: <Widget>[
       Text('aaa'),
@@ -58,7 +58,7 @@
   Future<void> test_last() async {
     await resolveTestCode('''
 import 'package:flutter/material.dart';
-main() {
+void f() {
   Column(
     children: <Widget>[
       Text('aaa'),
@@ -74,7 +74,7 @@
   Future<void> test_notInList() async {
     await resolveTestCode('''
 import 'package:flutter/material.dart';
-main() {
+void f() {
   Center(
     child: /*caret*/Text('aaa'),
   );
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_move_up_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_move_up_test.dart
index 905d316..80ed31d 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_move_up_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_move_up_test.dart
@@ -30,7 +30,7 @@
   Future<void> test_first() async {
     await resolveTestCode('''
 import 'package:flutter/material.dart';
-main() {
+void f() {
   Column(
     children: <Widget>[
       /*caret*/Text('aaa'),
@@ -46,7 +46,7 @@
   Future<void> test_last() async {
     await resolveTestCode('''
 import 'package:flutter/material.dart';
-main() {
+void f() {
   Column(
     children: <Widget>[
       Text('aaa'),
@@ -58,7 +58,7 @@
 ''');
     await assertHasAssist('''
 import 'package:flutter/material.dart';
-main() {
+void f() {
   Column(
     children: <Widget>[
       Text('bbbbbb'),
@@ -74,7 +74,7 @@
   Future<void> test_notInList() async {
     await resolveTestCode('''
 import 'package:flutter/material.dart';
-main() {
+void f() {
   Center(
     child: /*caret*/Text('aaa'),
   );
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_remove_widget_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_remove_widget_test.dart
index b4571e7..bf52357 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_remove_widget_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_remove_widget_test.dart
@@ -36,7 +36,7 @@
   Future<void> test_childIntoChild_multiLine() async {
     await resolveTestCode('''
 import 'package:flutter/material.dart';
-main() {
+void f() {
   Column(
     children: [
       Center(
@@ -54,7 +54,7 @@
 ''');
     await assertHasAssist('''
 import 'package:flutter/material.dart';
-main() {
+void f() {
   Column(
     children: [
       Center(
@@ -72,7 +72,7 @@
   Future<void> test_childIntoChild_singleLine() async {
     await resolveTestCode('''
 import 'package:flutter/material.dart';
-main() {
+void f() {
   Padding(
     padding: const EdgeInsets.all(8.0),
     child: /*caret*/Center(
@@ -84,7 +84,7 @@
 ''');
     await assertHasAssist('''
 import 'package:flutter/material.dart';
-main() {
+void f() {
   Padding(
     padding: const EdgeInsets.all(8.0),
     child: Text('foo'),
@@ -96,7 +96,7 @@
   Future<void> test_childIntoChildren() async {
     await resolveTestCode('''
 import 'package:flutter/material.dart';
-main() {
+void f() {
   Column(
     children: [
       Text('foo'),
@@ -114,7 +114,7 @@
 ''');
     await assertHasAssist('''
 import 'package:flutter/material.dart';
-main() {
+void f() {
   Column(
     children: [
       Text('foo'),
@@ -132,7 +132,7 @@
   Future<void> test_childrenMultipleIntoChild() async {
     await resolveTestCode('''
 import 'package:flutter/material.dart';
-main() {
+void f() {
   Center(
     child: /*caret*/Row(
       children: [
@@ -149,7 +149,7 @@
   Future<void> test_childrenOneIntoChild() async {
     await resolveTestCode('''
 import 'package:flutter/material.dart';
-main() {
+void f() {
   Center(
     child: /*caret*/Column(
       children: [
@@ -161,7 +161,7 @@
 ''');
     await assertHasAssist('''
 import 'package:flutter/material.dart';
-main() {
+void f() {
   Center(
     child: Text('foo'),
   );
@@ -172,7 +172,7 @@
   Future<void> test_childrenOneIntoReturn() async {
     await resolveTestCode('''
 import 'package:flutter/material.dart';
-main() {
+Widget f() {
   return /*caret*/Column(
     children: [
       Text('foo'),
@@ -182,7 +182,7 @@
 ''');
     await assertHasAssist('''
 import 'package:flutter/material.dart';
-main() {
+Widget f() {
   return Text('foo');
 }
 ''');
@@ -191,7 +191,7 @@
   Future<void> test_intoChildren() async {
     await resolveTestCode('''
 import 'package:flutter/material.dart';
-main() {
+void f() {
   Column(
     children: [
       Text('aaa'),
@@ -218,7 +218,7 @@
 ''');
     await assertHasAssist('''
 import 'package:flutter/material.dart';
-main() {
+void f() {
   Column(
     children: [
       Text('aaa'),
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_surround_with_set_state_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_surround_with_set_state_test.dart
index 94aec91..ff6e892 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_surround_with_set_state_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_surround_with_set_state_test.dart
@@ -31,7 +31,7 @@
     // This code selects the `CompilationUnit` node which has previously
     // caused errors in code assuming the node would have a parent.
     await resolveTestCode('''
-main() {
+void f() {
 // start
   print(0);
 }
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_parent_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_parent_test.dart
index 81aeb33..4980dea 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_parent_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_parent_test.dart
@@ -119,7 +119,7 @@
   Future<void> test_outerIsInChildren() async {
     await resolveTestCode('''
 import 'package:flutter/material.dart';
-main() {
+void f() {
   Column(
     children: [
       Column(
@@ -141,7 +141,7 @@
 ''');
     await assertHasAssist('''
 import 'package:flutter/material.dart';
-main() {
+void f() {
   Column(
     children: [
       Column(
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_builder_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_builder_test.dart
index 019a040..32237d6 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_builder_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_builder_test.dart
@@ -31,7 +31,7 @@
     await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
-main() {
+void f() {
   /*caret*/Builder(
     builder: (context) => Text(''),
   );
@@ -50,7 +50,7 @@
   Widget build(BuildContext context) => Text('');
 }
 
-main() {
+Widget f() {
   return MyWidget./*caret*/named();
 }
 ''');
@@ -63,7 +63,7 @@
   Widget build(BuildContext context) => Text('');
 }
 
-main() {
+Widget f() {
   return Builder(
     builder: (context) {
       return MyWidget.named();
@@ -77,14 +77,14 @@
     await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
-main() {
+void f() {
   /*caret*/Text('a');
 }
 ''');
     await assertHasAssist('''
 import 'package:flutter/widgets.dart';
 
-main() {
+void f() {
   Builder(
     builder: (context) {
       return Text('a');
@@ -98,7 +98,7 @@
     await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
-main() {
+void f() {
   Widget w;
   w = /*caret*/Container();
 }
@@ -106,7 +106,7 @@
     await assertHasAssist('''
 import 'package:flutter/widgets.dart';
 
-main() {
+void f() {
   Widget w;
   w = Builder(
     builder: (context) {
@@ -121,13 +121,13 @@
     await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
-  main() => /*caret*/Container();
+  void f() => /*caret*/Container();
 }
 ''');
     await assertHasAssist('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
-  main() => Builder(
+  void f() => Builder(
     builder: (context) {
       return Container();
     }
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_center_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_center_test.dart
index 44e6ed2..40bedd9 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_center_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_center_test.dart
@@ -31,7 +31,7 @@
     await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
-  main() {
+  Widget f() {
     return /*caret*/Center();
   }
 }
@@ -43,7 +43,7 @@
     await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
-  main() {
+  Widget f() {
     return /*caret*/Container();
   }
 }
@@ -51,7 +51,7 @@
     await assertHasAssist('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
-  main() {
+  Widget f() {
     return Center(child: Container());
   }
 }
@@ -68,7 +68,7 @@
   Widget build(BuildContext context) => Text('');
 }
 
-main() {
+Widget f() {
   return MyWidget./*caret*/named();
 }
 ''');
@@ -81,7 +81,7 @@
   Widget build(BuildContext context) => Text('');
 }
 
-main() {
+Widget f() {
   return Center(child: MyWidget.named());
 }
 ''');
@@ -91,7 +91,7 @@
     await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
-main() {
+void f() {
   Widget w;
   w = /*caret*/Container();
 }
@@ -99,7 +99,7 @@
     await assertHasAssist('''
 import 'package:flutter/widgets.dart';
 
-main() {
+void f() {
   Widget w;
   w = Center(child: Container());
 }
@@ -110,13 +110,13 @@
     await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
-  main() => /*caret*/Container();
+  Widget f() => /*caret*/Container();
 }
 ''');
     await assertHasAssist('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
-  main() => Center(child: Container());
+  Widget f() => Center(child: Container());
 }
 ''');
   }
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_column_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_column_test.dart
index 5f53ffdd..96f643b 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_column_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_column_test.dart
@@ -65,7 +65,7 @@
 import 'package:flutter/widgets.dart';
 
 class FakeFlutter {
-  main() {
+  Widget f() {
     return Container(
       child: /*caret*/Text('aaa'),
     );
@@ -76,7 +76,7 @@
 import 'package:flutter/widgets.dart';
 
 class FakeFlutter {
-  main() {
+  Widget f() {
     return Container(
       child: Column(
         children: [
@@ -94,7 +94,7 @@
 import 'package:flutter/widgets.dart';
 
 class FakeFlutter {
-  main() {
+  Widget f() {
     return Row(children: [
       Text('aaa'),
 // start
@@ -110,7 +110,7 @@
 import 'package:flutter/widgets.dart';
 
 class FakeFlutter {
-  main() {
+  Widget f() {
     return Row(children: [
       Text('aaa'),
       Column(
@@ -131,7 +131,7 @@
 import 'package:flutter/widgets.dart';
 
 class FakeFlutter {
-  main() {
+  Widget f() {
     return Container(
       child: Text/*caret*/('aaa'),
     );
@@ -142,7 +142,7 @@
 import 'package:flutter/widgets.dart';
 
 class FakeFlutter {
-  main() {
+  Widget f() {
     return Container(
       child: Column(
         children: [
@@ -160,7 +160,7 @@
 import 'package:flutter/widgets.dart';
 
 class FakeFlutter {
-  main() {
+  Widget f() {
     return Container(
       child: Text('aaa'),
     );
@@ -173,7 +173,7 @@
 import 'package:flutter/widgets.dart';
 
 class FakeFlutter {
-  main() {
+  Widget f() {
     return Container(
       child: Column(
         children: [
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_container_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_container_test.dart
index 04702fa..e7cbaf1 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_container_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_container_test.dart
@@ -30,7 +30,7 @@
   Future<void> test_aroundContainer() async {
     await resolveTestCode('''
 import 'package:flutter/widgets.dart';
-main() {
+Widget f() {
   return /*caret*/Container();
 }
 ''');
@@ -40,13 +40,13 @@
   Future<void> test_aroundText() async {
     await resolveTestCode('''
 import 'package:flutter/widgets.dart';
-main() {
+void f() {
   /*caret*/Text('a');
 }
 ''');
     await assertHasAssist('''
 import 'package:flutter/widgets.dart';
-main() {
+void f() {
   Container(child: Text('a'));
 }
 ''');
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_padding_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_padding_test.dart
index 3a4961a..48dc9e0 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_padding_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_padding_test.dart
@@ -31,7 +31,7 @@
     await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
-  main() {
+  Widget f() {
     return /*caret*/Container();
   }
 }
@@ -39,7 +39,7 @@
     await assertHasAssist('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
-  main() {
+  Widget f() {
     return Padding(
       padding: const EdgeInsets.all(8.0),
       child: Container(),
@@ -53,7 +53,7 @@
     await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
-  main() {
+  Widget f() {
     return Padding(
       padding: const EdgeInsets.all(8.0),
       child: Container(),
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_row_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_row_test.dart
index a9e6554..c2c97bf 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_row_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_row_test.dart
@@ -32,7 +32,7 @@
 import 'package:flutter/widgets.dart';
 
 class FakeFlutter {
-  main() {
+  Widget f() {
     return Column(children: [
       Text('aaa'),
 // start
@@ -48,7 +48,7 @@
 import 'package:flutter/widgets.dart';
 
 class FakeFlutter {
-  main() {
+  Widget f() {
     return Column(children: [
       Text('aaa'),
       Row(
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_sized_box_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_sized_box_test.dart
index d01077a..32fdaeb 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_sized_box_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_sized_box_test.dart
@@ -33,7 +33,7 @@
     await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
-  main() {
+  Widget f() {
     return /*caret*/Container();
   }
 }
@@ -41,7 +41,7 @@
     await assertHasAssist('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
-  main() {
+  Widget f() {
     return SizedBox(child: Container());
   }
 }
@@ -58,7 +58,7 @@
   Widget build(BuildContext context) => Text('');
 }
 
-main() {
+Widget f() {
   return MyWidget./*caret*/named();
 }
 ''');
@@ -71,7 +71,7 @@
   Widget build(BuildContext context) => Text('');
 }
 
-main() {
+Widget f() {
   return SizedBox(child: MyWidget.named());
 }
 ''');
@@ -81,7 +81,7 @@
     await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
-  main() {
+  Widget f() {
     return /*caret*/SizedBox();
   }
 }
@@ -93,7 +93,7 @@
     await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
-main() {
+void f() {
   Widget w;
   w = /*caret*/Container();
 }
@@ -101,7 +101,7 @@
     await assertHasAssist('''
 import 'package:flutter/widgets.dart';
 
-main() {
+void f() {
   Widget w;
   w = SizedBox(child: Container());
 }
@@ -112,13 +112,13 @@
     await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
-  main() => /*caret*/Container();
+  Widget f() => /*caret*/Container();
 }
 ''');
     await assertHasAssist('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
-  main() => SizedBox(child: Container());
+  Widget f() => SizedBox(child: Container());
 }
 ''');
   }
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_stream_builder_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_stream_builder_test.dart
index 69847f9..389b609 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_stream_builder_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_stream_builder_test.dart
@@ -45,14 +45,14 @@
     await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
-main() {
+void f() {
   /*caret*/Text('a');
 }
 ''');
     await assertHasAssist('''
 import 'package:flutter/widgets.dart';
 
-main() {
+void f() {
   StreamBuilder<Object>(
     stream: null,
     builder: (context, snapshot) {
diff --git a/pkg/analysis_server/test/src/services/correction/assist/invert_if_statement_test.dart b/pkg/analysis_server/test/src/services/correction/assist/invert_if_statement_test.dart
index b86a190..8714a3f 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/invert_if_statement_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/invert_if_statement_test.dart
@@ -21,7 +21,7 @@
 
   Future<void> test_blocks() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (true) {
     0;
   } else {
@@ -30,7 +30,7 @@
 }
 ''');
     await assertHasAssistAt('if (', '''
-main() {
+void f() {
   if (false) {
     1;
   } else {
@@ -42,7 +42,7 @@
 
   Future<void> test_statements() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (true)
     0;
   else
@@ -50,7 +50,7 @@
 }
 ''');
     await assertHasAssistAt('if (', '''
-main() {
+void f() {
   if (false)
     1;
   else
diff --git a/pkg/analysis_server/test/src/services/correction/assist/join_if_with_inner_test.dart b/pkg/analysis_server/test/src/services/correction/assist/join_if_with_inner_test.dart
index 3c19528..c24a598 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/join_if_with_inner_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/join_if_with_inner_test.dart
@@ -21,7 +21,7 @@
 
   Future<void> test_conditionAndOr() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (1 == 1) {
     if (2 == 2 || 3 == 3) {
       print(0);
@@ -30,7 +30,7 @@
 }
 ''');
     await assertHasAssistAt('if (1 ==', '''
-main() {
+void f() {
   if (1 == 1 && (2 == 2 || 3 == 3)) {
     print(0);
   }
@@ -40,7 +40,7 @@
 
   Future<void> test_conditionInvocation() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (isCheck()) {
     if (2 == 2) {
       print(0);
@@ -50,7 +50,7 @@
 bool isCheck() => false;
 ''');
     await assertHasAssistAt('if (isCheck', '''
-main() {
+void f() {
   if (isCheck() && 2 == 2) {
     print(0);
   }
@@ -61,7 +61,7 @@
 
   Future<void> test_conditionOrAnd() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (1 == 1 || 2 == 2) {
     if (3 == 3) {
       print(0);
@@ -70,7 +70,7 @@
 }
 ''');
     await assertHasAssistAt('if (1 ==', '''
-main() {
+void f() {
   if ((1 == 1 || 2 == 2) && 3 == 3) {
     print(0);
   }
@@ -80,7 +80,7 @@
 
   Future<void> test_innerNotIf() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (1 == 1) {
     print(0);
   }
@@ -91,7 +91,7 @@
 
   Future<void> test_innerWithElse() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (1 == 1) {
     if (2 == 2) {
       print(0);
@@ -106,7 +106,7 @@
 
   Future<void> test_onCondition() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (1 == 1) {
     if (2 == 2) {
       print(0);
@@ -115,7 +115,7 @@
 }
 ''');
     await assertHasAssistAt('1 ==', '''
-main() {
+void f() {
   if (1 == 1 && 2 == 2) {
     print(0);
   }
@@ -125,7 +125,7 @@
 
   Future<void> test_simpleConditions_block_block() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (1 == 1) {
     if (2 == 2) {
       print(0);
@@ -134,7 +134,7 @@
 }
 ''');
     await assertHasAssistAt('if (1 ==', '''
-main() {
+void f() {
   if (1 == 1 && 2 == 2) {
     print(0);
   }
@@ -144,7 +144,7 @@
 
   Future<void> test_simpleConditions_block_single() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (1 == 1) {
     if (2 == 2)
       print(0);
@@ -152,7 +152,7 @@
 }
 ''');
     await assertHasAssistAt('if (1 ==', '''
-main() {
+void f() {
   if (1 == 1 && 2 == 2) {
     print(0);
   }
@@ -162,7 +162,7 @@
 
   Future<void> test_simpleConditions_single_blockMulti() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (1 == 1) {
     if (2 == 2) {
       print(1);
@@ -173,7 +173,7 @@
 }
 ''');
     await assertHasAssistAt('if (1 ==', '''
-main() {
+void f() {
   if (1 == 1 && 2 == 2) {
     print(1);
     print(2);
@@ -185,7 +185,7 @@
 
   Future<void> test_simpleConditions_single_blockOne() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (1 == 1)
     if (2 == 2) {
       print(0);
@@ -193,7 +193,7 @@
 }
 ''');
     await assertHasAssistAt('if (1 ==', '''
-main() {
+void f() {
   if (1 == 1 && 2 == 2) {
     print(0);
   }
@@ -203,7 +203,7 @@
 
   Future<void> test_statementAfterInner() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (1 == 1) {
     if (2 == 2) {
       print(2);
@@ -217,7 +217,7 @@
 
   Future<void> test_statementBeforeInner() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (1 == 1) {
     print(1);
     if (2 == 2) {
@@ -231,7 +231,7 @@
 
   Future<void> test_targetNotIf() async {
     await resolveTestCode('''
-main() {
+void f() {
   print(0);
 }
 ''');
@@ -240,7 +240,7 @@
 
   Future<void> test_targetWithElse() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (1 == 1) {
     if (2 == 2) {
       print(0);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/join_if_with_outer_test.dart b/pkg/analysis_server/test/src/services/correction/assist/join_if_with_outer_test.dart
index a31c29e..5486082 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/join_if_with_outer_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/join_if_with_outer_test.dart
@@ -21,7 +21,7 @@
 
   Future<void> test_conditionAndOr() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (1 == 1) {
     if (2 == 2 || 3 == 3) {
       print(0);
@@ -30,7 +30,7 @@
 }
 ''');
     await assertHasAssistAt('if (2 ==', '''
-main() {
+void f() {
   if (1 == 1 && (2 == 2 || 3 == 3)) {
     print(0);
   }
@@ -40,7 +40,7 @@
 
   Future<void> test_conditionInvocation() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (1 == 1) {
     if (isCheck()) {
       print(0);
@@ -50,7 +50,7 @@
 bool isCheck() => false;
 ''');
     await assertHasAssistAt('if (isCheck', '''
-main() {
+void f() {
   if (1 == 1 && isCheck()) {
     print(0);
   }
@@ -61,7 +61,7 @@
 
   Future<void> test_conditionOrAnd() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (1 == 1 || 2 == 2) {
     if (3 == 3) {
       print(0);
@@ -70,7 +70,7 @@
 }
 ''');
     await assertHasAssistAt('if (3 == 3', '''
-main() {
+void f() {
   if ((1 == 1 || 2 == 2) && 3 == 3) {
     print(0);
   }
@@ -80,7 +80,7 @@
 
   Future<void> test_onCondition() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (1 == 1) {
     if (2 == 2) {
       print(0);
@@ -89,7 +89,7 @@
 }
 ''');
     await assertHasAssistAt('if (2 == 2', '''
-main() {
+void f() {
   if (1 == 1 && 2 == 2) {
     print(0);
   }
@@ -99,7 +99,7 @@
 
   Future<void> test_outerNotIf() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (1 == 1) {
     print(0);
   }
@@ -110,7 +110,7 @@
 
   Future<void> test_outerWithElse() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (1 == 1) {
     if (2 == 2) {
       print(0);
@@ -125,7 +125,7 @@
 
   Future<void> test_simpleConditions_block_block() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (1 == 1) {
     if (2 == 2) {
       print(0);
@@ -134,7 +134,7 @@
 }
 ''');
     await assertHasAssistAt('if (2 == 2', '''
-main() {
+void f() {
   if (1 == 1 && 2 == 2) {
     print(0);
   }
@@ -144,7 +144,7 @@
 
   Future<void> test_simpleConditions_block_single() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (1 == 1) {
     if (2 == 2)
       print(0);
@@ -152,7 +152,7 @@
 }
 ''');
     await assertHasAssistAt('if (2 == 2', '''
-main() {
+void f() {
   if (1 == 1 && 2 == 2) {
     print(0);
   }
@@ -162,7 +162,7 @@
 
   Future<void> test_simpleConditions_single_blockMulti() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (1 == 1) {
     if (2 == 2) {
       print(1);
@@ -173,7 +173,7 @@
 }
 ''');
     await assertHasAssistAt('if (2 == 2', '''
-main() {
+void f() {
   if (1 == 1 && 2 == 2) {
     print(1);
     print(2);
@@ -185,7 +185,7 @@
 
   Future<void> test_simpleConditions_single_blockOne() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (1 == 1)
     if (2 == 2) {
       print(0);
@@ -193,7 +193,7 @@
 }
 ''');
     await assertHasAssistAt('if (2 == 2', '''
-main() {
+void f() {
   if (1 == 1 && 2 == 2) {
     print(0);
   }
@@ -203,7 +203,7 @@
 
   Future<void> test_statementAfterInner() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (1 == 1) {
     if (2 == 2) {
       print(2);
@@ -217,7 +217,7 @@
 
   Future<void> test_statementBeforeInner() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (1 == 1) {
     print(1);
     if (2 == 2) {
@@ -231,7 +231,7 @@
 
   Future<void> test_targetNotIf() async {
     await resolveTestCode('''
-main() {
+void f() {
   print(0);
 }
 ''');
@@ -240,7 +240,7 @@
 
   Future<void> test_targetWithElse() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (1 == 1) {
     if (2 == 2) {
       print(0);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/remove_type_annotation_test.dart b/pkg/analysis_server/test/src/services/correction/assist/remove_type_annotation_test.dart
index e503c28..99f4ab7 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/remove_type_annotation_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/remove_type_annotation_test.dart
@@ -58,7 +58,7 @@
     await resolveTestCode('''
 class A {}
 
-main() {
+void f() {
   A();
 }
 ''');
@@ -67,12 +67,12 @@
 
   Future<void> test_localVariable() async {
     await resolveTestCode('''
-main() {
+void f() {
   int a = 1, b = 2;
 }
 ''');
     await assertHasAssistAt('int ', '''
-main() {
+void f() {
   var a = 1, b = 2;
 }
 ''');
@@ -80,12 +80,12 @@
 
   Future<void> test_localVariable_const() async {
     await resolveTestCode('''
-main() {
+void f() {
   const int v = 1;
 }
 ''');
     await assertHasAssistAt('int ', '''
-main() {
+void f() {
   const v = 1;
 }
 ''');
@@ -93,12 +93,12 @@
 
   Future<void> test_localVariable_final() async {
     await resolveTestCode('''
-main() {
+void f() {
   final int v = 1;
 }
 ''');
     await assertHasAssistAt('int ', '''
-main() {
+void f() {
   final v = 1;
 }
 ''');
@@ -106,7 +106,7 @@
 
   Future<void> test_localVariable_noInitializer() async {
     await resolveTestCode('''
-main() {
+void f() {
   int v;
 }
 ''');
@@ -115,7 +115,7 @@
 
   Future<void> test_localVariable_onInitializer() async {
     await resolveTestCode('''
-main() {
+void f() {
   final int v = 1;
 }
 ''');
@@ -124,12 +124,12 @@
 
   Future<void> test_loopVariable() async {
     await resolveTestCode('''
-main() {
+void f() {
   for(int i = 0; i < 3; i++) {}
 }
 ''');
     await assertHasAssistAt('int ', '''
-main() {
+void f() {
   for(var i = 0; i < 3; i++) {}
 }
 ''');
@@ -137,14 +137,14 @@
 
   Future<void> test_loopVariable_nested() async {
     await resolveTestCode('''
-main() {
+void f() {
   var v = () {
     for (int x in <int>[]) {}
   };
 }
 ''');
     await assertHasAssistAt('int x', '''
-main() {
+void f() {
   var v = () {
     for (var x in <int>[]) {}
   };
@@ -154,7 +154,7 @@
 
   Future<void> test_loopVariable_noType() async {
     await resolveTestCode('''
-main() {
+void f() {
   for(var i = 0; i < 3; i++) {}
 }
 ''');
diff --git a/pkg/analysis_server/test/src/services/correction/assist/replace_if_else_with_conditional_test.dart b/pkg/analysis_server/test/src/services/correction/assist/replace_if_else_with_conditional_test.dart
index 7641070..0e3d44e 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/replace_if_else_with_conditional_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/replace_if_else_with_conditional_test.dart
@@ -21,7 +21,7 @@
 
   Future<void> test_assignment() async {
     await resolveTestCode('''
-main() {
+void f() {
   int vvv;
   if (true) {
     vvv = 111;
@@ -31,7 +31,7 @@
 }
 ''');
     await assertHasAssistAt('if (true)', '''
-main() {
+void f() {
   int vvv;
   vvv = true ? 111 : 222;
 }
@@ -40,7 +40,7 @@
 
   Future<void> test_expressionVsReturn() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (true) {
     print(42);
   } else {
@@ -53,7 +53,7 @@
 
   Future<void> test_notIfStatement() async {
     await resolveTestCode('''
-main() {
+void f() {
   print(0);
 }
 ''');
@@ -62,7 +62,7 @@
 
   Future<void> test_notSingleStatement() async {
     await resolveTestCode('''
-main() {
+void f() {
   int vvv;
   if (true) {
     print(0);
@@ -78,7 +78,7 @@
 
   Future<void> test_return_expression_expression() async {
     await resolveTestCode('''
-main() {
+int f() {
   if (true) {
     return 111;
   } else {
@@ -87,7 +87,7 @@
 }
 ''');
     await assertHasAssistAt('if (true)', '''
-main() {
+int f() {
   return true ? 111 : 222;
 }
 ''');
diff --git a/pkg/analysis_server/test/src/services/correction/assist/sort_child_property_last_test.dart b/pkg/analysis_server/test/src/services/correction/assist/sort_child_property_last_test.dart
index b407482..c9d3e0e 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/sort_child_property_last_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/sort_child_property_last_test.dart
@@ -31,7 +31,7 @@
   Future<void> test_already_sorted() async {
     await resolveTestCode('''
 import 'package:flutter/material.dart';
-main() {
+void f() {
   Column(
     crossAxisAlignment: CrossAxisAlignment.center,
     children: <Widget>[
@@ -48,7 +48,7 @@
   Future<void> test_already_sorted_one_prop() async {
     await resolveTestCode('''
 import 'package:flutter/material.dart';
-main() {
+void f() {
   Column(
     children: <Widget>[
       Text('aaa'),
@@ -64,7 +64,7 @@
   Future<void> test_no_children() async {
     await resolveTestCode('''
 import 'package:flutter/material.dart';
-main() {
+void f() {
   Column(
     crossAxisAlignment: CrossAxisAlignment.center,
   );
@@ -76,7 +76,7 @@
   Future<void> test_sort_middleArgument() async {
     await resolveTestCode('''
 import 'package:flutter/material.dart';
-main() {
+void f() {
   Column(
     mainAxisAlignment: MainAxisAlignment.start,
     /*caret*/children: <Widget>[
@@ -90,7 +90,7 @@
 ''');
     await assertHasAssist('''
 import 'package:flutter/material.dart';
-main() {
+void f() {
   Column(
     mainAxisAlignment: MainAxisAlignment.start,
     crossAxisAlignment: CrossAxisAlignment.center,
@@ -110,7 +110,7 @@
     verifyNoTestUnitErrors = false;
     await resolveTestCode('''
 import 'package:flutter/material.dart';
-main() {
+void f() {
   Column(
     /*caret*/children: <Widget>[
       Text('aaa'),
@@ -127,7 +127,7 @@
   Future<void> test_sort_noTrailingComma() async {
     await resolveTestCode('''
 import 'package:flutter/material.dart';
-main() {
+void f() {
   Column(
     /*caret*/children: <Widget>[
       Text('aaa'),
@@ -140,7 +140,7 @@
 ''');
     await assertHasAssist('''
 import 'package:flutter/material.dart';
-main() {
+void f() {
   Column(
     crossAxisAlignment: CrossAxisAlignment.center,
     children: <Widget>[
@@ -157,7 +157,7 @@
   Future<void> test_sort_trailingComma() async {
     await resolveTestCode('''
 import 'package:flutter/material.dart';
-main() {
+void f() {
   Column(
     /*caret*/children: <Widget>[
       Text('aaa'),
@@ -170,7 +170,7 @@
 ''');
     await assertHasAssist('''
 import 'package:flutter/material.dart';
-main() {
+void f() {
   Column(
     crossAxisAlignment: CrossAxisAlignment.center,
     children: <Widget>[
diff --git a/pkg/analysis_server/test/src/services/correction/assist/split_and_condition_test.dart b/pkg/analysis_server/test/src/services/correction/assist/split_and_condition_test.dart
index bf448d7..4707477 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/split_and_condition_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/split_and_condition_test.dart
@@ -21,7 +21,7 @@
 
   Future<void> test_hasElse() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (1 == 1 && 2 == 2) {
     print(1);
   } else {
@@ -34,14 +34,14 @@
 
   Future<void> test_innerAndExpression() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (1 == 1 && 2 == 2 && 3 == 3) {
     print(0);
   }
 }
 ''');
     await assertHasAssistAt('&& 2 == 2', '''
-main() {
+void f() {
   if (1 == 1) {
     if (2 == 2 && 3 == 3) {
       print(0);
@@ -53,7 +53,7 @@
 
   Future<void> test_notAnd() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (1 == 1 || 2 == 2) {
     print(0);
   }
@@ -64,19 +64,19 @@
 
   Future<void> test_notOnOperator() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (1 == 1 && 2 == 2) {
     print(0);
   }
   print(3 == 3 && 4 == 4);
 }
 ''');
-    await assertNoAssistAt('main() {');
+    await assertNoAssistAt('f() {');
   }
 
   Future<void> test_notPartOfIf() async {
     await resolveTestCode('''
-main() {
+void f() {
   print(1 == 1 && 2 == 2);
 }
 ''');
@@ -85,7 +85,7 @@
 
   Future<void> test_notTopLevelAnd() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (true || (1 == 1 && 2 == 2)) {
     print(0);
   }
@@ -100,7 +100,7 @@
 
   Future<void> test_selectionTooLarge() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (1 == 1
 // start
 && 2
@@ -117,7 +117,7 @@
 
   Future<void> test_thenBlock() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (true && false) {
     print(0);
     if (3 == 3) {
@@ -127,7 +127,7 @@
 }
 ''');
     await assertHasAssistAt('&& false', '''
-main() {
+void f() {
   if (true) {
     if (false) {
       print(0);
@@ -142,13 +142,13 @@
 
   Future<void> test_thenStatement() async {
     await resolveTestCode('''
-main() {
+void f() {
   if (true && false)
     print(0);
 }
 ''');
     await assertHasAssistAt('&& false', '''
-main() {
+void f() {
   if (true)
     if (false)
       print(0);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/split_variable_declaration_test.dart b/pkg/analysis_server/test/src/services/correction/assist/split_variable_declaration_test.dart
index b02dad3..1024290 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/split_variable_declaration_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/split_variable_declaration_test.dart
@@ -21,7 +21,7 @@
 
   Future<void> test_const() async {
     await resolveTestCode('''
-main() {
+void f() {
   const v = 1;
 }
 ''');
@@ -30,7 +30,7 @@
 
   Future<void> test_final() async {
     await resolveTestCode('''
-main() {
+void f() {
   final v = 1;
 }
 ''');
@@ -39,7 +39,7 @@
 
   Future<void> test_notOneVariable() async {
     await resolveTestCode('''
-main() {
+void f() {
   var v = 1, v2;
 }
 ''');
@@ -48,12 +48,12 @@
 
   Future<void> test_onName() async {
     await resolveTestCode('''
-main() {
+void f() {
   var v = 1;
 }
 ''');
     await assertHasAssistAt('v =', '''
-main() {
+void f() {
   int v;
   v = 1;
 }
@@ -63,13 +63,13 @@
   Future<void> test_onName_functionStatement_noType() async {
     await resolveTestCode('''
 f() => 1;
-main() {
+void g() {
   var v = f();
 }
 ''');
     await assertHasAssistAt('v =', '''
 f() => 1;
-main() {
+void g() {
   var v;
   v = f();
 }
@@ -78,12 +78,12 @@
 
   Future<void> test_onType() async {
     await resolveTestCode('''
-main() {
+void f() {
   int v = 1;
 }
 ''');
     await assertHasAssistAt('int ', '''
-main() {
+void f() {
   int v;
   v = 1;
 }
@@ -93,12 +93,12 @@
   @failingTest
   Future<void> test_onType_prefixedByComment() async {
     await resolveTestCode('''
-main() {
+void f() {
   /*comment*/int v = 1;
 }
 ''');
     await assertHasAssistAt('int ', '''
-main() {
+void f() {
   /*comment*/int v;
   v = 1;
 }
@@ -107,12 +107,12 @@
 
   Future<void> test_onVar() async {
     await resolveTestCode('''
-main() {
+void f() {
   var v = 1;
 }
 ''');
     await assertHasAssistAt('var ', '''
-main() {
+void f() {
   int v;
   v = 1;
 }
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_block_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_block_test.dart
index 54ef449..56bfd62 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/surround_with_block_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_block_test.dart
@@ -21,7 +21,7 @@
 
   Future<void> test_notStatementInBlock() async {
     await resolveTestCode('''
-main() {
+void f() {
   while (true)
 // start
     print(0);
@@ -33,7 +33,7 @@
 
   Future<void> test_twoStatements() async {
     await resolveTestCode('''
-main() {
+void f() {
 // start
   print(0);
   print(1);
@@ -41,7 +41,7 @@
 }
 ''');
     await assertHasAssist('''
-main() {
+void f() {
   {
     print(0);
     print(1);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_do_while_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_do_while_test.dart
index d6ad18f..3976f23 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/surround_with_do_while_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_do_while_test.dart
@@ -21,7 +21,7 @@
 
   Future<void> test_twoStatements() async {
     await resolveTestCode('''
-main() {
+void f() {
 // start
   print(0);
   print(1);
@@ -29,7 +29,7 @@
 }
 ''');
     await assertHasAssist('''
-main() {
+void f() {
   do {
     print(0);
     print(1);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_in_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_in_test.dart
index 6b7ca74..89c3cb9 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_in_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_in_test.dart
@@ -21,7 +21,7 @@
 
   Future<void> test_twoStatements() async {
     await resolveTestCode('''
-main() {
+void f() {
 // start
   print(0);
   print(1);
@@ -29,7 +29,7 @@
 }
 ''');
     await assertHasAssist('''
-main() {
+void f() {
   for (var item in iterable) {
     print(0);
     print(1);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_test.dart
index ca39826..8bdab05 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_test.dart
@@ -21,7 +21,7 @@
 
   Future<void> test_twoStatements() async {
     await resolveTestCode('''
-main() {
+void f() {
 // start
   print(0);
   print(1);
@@ -29,7 +29,7 @@
 }
 ''');
     await assertHasAssist('''
-main() {
+void f() {
   for (var v = init; condition; increment) {
     print(0);
     print(1);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_if_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_if_test.dart
index 91ed08c..ec24255 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/surround_with_if_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_if_test.dart
@@ -21,7 +21,7 @@
 
   Future<void> test_twoStatements() async {
     await resolveTestCode('''
-main() {
+void f() {
 // start
   print(0);
   print(1);
@@ -29,7 +29,7 @@
 }
 ''');
     await assertHasAssist('''
-main() {
+void f() {
   if (condition) {
     print(0);
     print(1);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_catch_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_catch_test.dart
index 3fa1377..e3cfe45 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_catch_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_catch_test.dart
@@ -21,7 +21,7 @@
 
   Future<void> test_twoStatements() async {
     await resolveTestCode('''
-main() {
+void f() {
 // start
   print(0);
   print(1);
@@ -29,7 +29,7 @@
 }
 ''');
     await assertHasAssist('''
-main() {
+void f() {
   try {
     print(0);
     print(1);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_finally_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_finally_test.dart
index e6d5010..24b8943 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_finally_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_finally_test.dart
@@ -21,7 +21,7 @@
 
   Future<void> test_twoStatements() async {
     await resolveTestCode('''
-main() {
+void f() {
 // start
   print(0);
   print(1);
@@ -29,7 +29,7 @@
 }
 ''');
     await assertHasAssist('''
-main() {
+void f() {
   try {
     print(0);
     print(1);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_while_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_while_test.dart
index 24eb591..5513842 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/surround_with_while_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_while_test.dart
@@ -21,7 +21,7 @@
 
   Future<void> test_twoStatements() async {
     await resolveTestCode('''
-main() {
+void f() {
 // start
   print(0);
   print(1);
@@ -29,7 +29,7 @@
 }
 ''');
     await assertHasAssist('''
-main() {
+void f() {
   while (condition) {
     print(0);
     print(1);
diff --git a/pkg/analysis_server/tool/code_completion/completion_metrics.dart b/pkg/analysis_server/tool/code_completion/completion_metrics.dart
index 9f14280..0520b3f 100644
--- a/pkg/analysis_server/tool/code_completion/completion_metrics.dart
+++ b/pkg/analysis_server/tool/code_completion/completion_metrics.dart
@@ -155,11 +155,11 @@
     )
     ..addOption(CompletionMetricsOptions.OVERLAY,
         allowed: [
-          CompletionMetricsOptions.OVERLAY_NONE,
-          CompletionMetricsOptions.OVERLAY_REMOVE_TOKEN,
-          CompletionMetricsOptions.OVERLAY_REMOVE_REST_OF_FILE
+          OverlayMode.none.flag,
+          OverlayMode.removeRestOfFile.flag,
+          OverlayMode.removeToken.flag,
         ],
-        defaultsTo: CompletionMetricsOptions.OVERLAY_NONE,
+        defaultsTo: OverlayMode.none.flag,
         help:
             'Before attempting a completion at the location of each token, the '
             'token can be removed, or the rest of the file can be removed to '
@@ -745,17 +745,20 @@
     ExpectedCompletion expectedCompletion,
   ) async {
     // If an overlay option is being used, compute the overlay file, and
-    // have the context reanalyze the file
-    if (options.overlay != CompletionMetricsOptions.OVERLAY_NONE) {
-      var overlayContents = CompletionMetricsComputer.getOverlayContents(
-          resolvedUnitResult.content,
-          expectedCompletion,
-          options.overlay,
-          options.prefixLength);
+    // have the context reanalyze the file.
+    if (options.overlay != OverlayMode.none) {
+      final overlayContents = CompletionMetricsComputer.getOverlayContent(
+        resolvedUnitResult.content,
+        expectedCompletion,
+        options.overlay,
+        options.prefixLength,
+      );
 
-      provider.setOverlay(filePath,
-          content: overlayContents,
-          modificationStamp: overlayModificationStamp++);
+      provider.setOverlay(
+        filePath,
+        content: overlayContents,
+        modificationStamp: overlayModificationStamp++,
+      );
       context.changeFile(filePath);
       await context.applyPendingFileChanges();
       resolvedUnitResult = await context.currentSession
@@ -1396,10 +1399,10 @@
   }
 
   @override
-  void removeOverlay(String filePath) {
+  Future<void> removeOverlay(String filePath) async {
     // If an overlay option is being used, remove the overlay applied
     // earlier.
-    if (options.overlay != CompletionMetricsOptions.OVERLAY_NONE) {
+    if (options.overlay != OverlayMode.none) {
       provider.removeOverlay(filePath);
     }
   }
diff --git a/pkg/analysis_server/tool/code_completion/completion_metrics_base.dart b/pkg/analysis_server/tool/code_completion/completion_metrics_base.dart
index 24cf9c6..34056c4 100644
--- a/pkg/analysis_server/tool/code_completion/completion_metrics_base.dart
+++ b/pkg/analysis_server/tool/code_completion/completion_metrics_base.dart
@@ -87,7 +87,7 @@
           documentationCache,
         );
 
-        removeOverlay(filePath);
+        await removeOverlay(filePath);
       }
       progress.tick();
     }
@@ -113,7 +113,7 @@
   );
 
   /// Removes the overlay which has been applied to [filePath].
-  void removeOverlay(String filePath);
+  Future<void> removeOverlay(String filePath);
 
   /// Resolves all analyzed files within [context].
   Future<List<ResolvedUnitResult>> resolveAnalyzedFiles({
@@ -171,17 +171,16 @@
     return null;
   }
 
-  /// Gets overlay contents for [contents], applying a change at
+  /// Gets overlay content for [content], applying a change at
   /// [expectedCompletion] with [prefixLength], according to [overlay], one of
   /// the [CompletionMetricsOptions].
-  static String getOverlayContents(
-    String contents,
+  static String getOverlayContent(
+    String content,
     ExpectedCompletion expectedCompletion,
-    // TODO(srawlins): Replace this with an enum.
-    String overlay,
+    OverlayMode overlay,
     int prefixLength,
   ) {
-    assert(contents.isNotEmpty);
+    assert(content.isNotEmpty);
     var offset = expectedCompletion.offset;
     final length = expectedCompletion.syntacticEntity.length;
     assert(offset >= 0);
@@ -192,16 +191,12 @@
       // the given prefix length.
       offset += prefixLength;
     }
-    if (overlay == CompletionMetricsOptions.OVERLAY_REMOVE_TOKEN) {
-      return contents.substring(0, offset) + contents.substring(tokenEndOffset);
-    } else if (overlay ==
-        CompletionMetricsOptions.OVERLAY_REMOVE_REST_OF_FILE) {
-      return contents.substring(0, offset);
+    if (overlay == OverlayMode.removeToken) {
+      return content.substring(0, offset) + content.substring(tokenEndOffset);
+    } else if (overlay == OverlayMode.removeRestOfFile) {
+      return content.substring(0, offset);
     } else {
-      final removeToken = CompletionMetricsOptions.OVERLAY_REMOVE_TOKEN;
-      final removeRest = CompletionMetricsOptions.OVERLAY_REMOVE_REST_OF_FILE;
-      throw Exception('\'getOverlayContents\' called with option other than'
-          '$removeToken and $removeRest: $overlay');
+      throw ArgumentError.value(overlay, 'overlay');
     }
   }
 }
@@ -211,18 +206,6 @@
   /// An option to control whether and how overlays should be produced.
   static const String OVERLAY = 'overlay';
 
-  /// A mode indicating that no overlays should be produced.
-  /// TODO(srawlins): Replace this and the other two overlay values with enums.
-  static const String OVERLAY_NONE = 'none';
-
-  /// A mode indicating that everything from the completion offset to the end of
-  /// the file should be removed.
-  static const String OVERLAY_REMOVE_REST_OF_FILE = 'remove-rest-of-file';
-
-  /// A mode indicating that the token whose offset is the same as the
-  /// completion offset should be removed.
-  static const String OVERLAY_REMOVE_TOKEN = 'remove-token';
-
   /// An option controlling how long of a prefix should be used.
   ///
   /// This affects the offset of the completion request, and how much content is
@@ -234,8 +217,7 @@
   static const String PRINT_SLOWEST_RESULTS = 'print-slowest-results';
 
   /// The overlay mode that should be used.
-  /// TODO(srawlins): Replace this with an enum.
-  final String overlay;
+  final OverlayMode overlay;
 
   final int prefixLength;
 
@@ -244,12 +226,34 @@
   final bool printSlowestResults;
 
   CompletionMetricsOptions(ArgResults results)
-      : overlay = results[OVERLAY] as String,
+      : overlay = OverlayMode.parseFlag(results[OVERLAY] as String),
         prefixLength = int.parse(results[PREFIX_LENGTH] as String),
-        printSlowestResults = results[PRINT_SLOWEST_RESULTS] as bool {
-    assert(overlay == OVERLAY_NONE ||
-        overlay == OVERLAY_REMOVE_TOKEN ||
-        overlay == OVERLAY_REMOVE_REST_OF_FILE);
+        printSlowestResults = results[PRINT_SLOWEST_RESULTS] as bool;
+}
+
+enum OverlayMode {
+  /// A mode indicating that no overlays should be produced.
+  none('none'),
+
+  /// A mode indicating that everything from the completion offset to the end of
+  /// the file should be removed.
+  removeRestOfFile('remove-rest-of-file'),
+
+  /// A mode indicating that the token whose offset is the same as the
+  /// completion offset should be removed.
+  removeToken('remove-token');
+
+  final String flag;
+
+  const OverlayMode(this.flag);
+
+  static OverlayMode parseFlag(String flag) {
+    for (final mode in values) {
+      if (flag == mode.flag) {
+        return mode;
+      }
+    }
+    throw ArgumentError.value(flag, 'overlay');
   }
 }
 
diff --git a/pkg/analysis_server/tool/code_completion/completion_metrics_client.dart b/pkg/analysis_server/tool/code_completion/completion_metrics_client.dart
index 2248b30..ad666a8 100644
--- a/pkg/analysis_server/tool/code_completion/completion_metrics_client.dart
+++ b/pkg/analysis_server/tool/code_completion/completion_metrics_client.dart
@@ -68,11 +68,11 @@
     ..addOption(
       CompletionMetricsOptions.OVERLAY,
       allowed: [
-        CompletionMetricsOptions.OVERLAY_NONE,
-        CompletionMetricsOptions.OVERLAY_REMOVE_TOKEN,
-        CompletionMetricsOptions.OVERLAY_REMOVE_REST_OF_FILE,
+        OverlayMode.none.flag,
+        OverlayMode.removeRestOfFile.flag,
+        OverlayMode.removeToken.flag,
       ],
-      defaultsTo: CompletionMetricsOptions.OVERLAY_NONE,
+      defaultsTo: OverlayMode.none.flag,
       help: 'Before attempting a completion at the location of each token, the '
           'token can be removed, or the rest of the file can be removed to '
           'test code completion with diverse methods. The default mode is to '
@@ -143,7 +143,21 @@
     String filePath,
     ExpectedCompletion expectedCompletion,
   ) async {
-    // TODO(srawlins): Support overlays.
+    if (options.overlay != OverlayMode.none) {
+      final overlayContent = CompletionMetricsComputer.getOverlayContent(
+        resolvedUnitResult.content,
+        expectedCompletion,
+        options.overlay,
+        options.prefixLength,
+      );
+
+      provider.setOverlay(
+        filePath,
+        content: overlayContent,
+        modificationStamp: overlayModificationStamp++,
+      );
+      await client.addOverlay(filePath, overlayContent);
+    }
   }
 
   @override
@@ -193,8 +207,10 @@
   }
 
   @override
-  void removeOverlay(String filePath) {
-    // TODO(srawlins): Support overlays.
+  Future<void> removeOverlay(String filePath) async {
+    if (options.overlay != OverlayMode.none) {
+      await client.removeOverlay(filePath);
+    }
   }
 
   @override
@@ -275,19 +291,55 @@
 
   Future<int> get onExit => _process!.exitCode;
 
+  Future<AnalysisUpdateContentResult> addOverlay(
+      String file, String content) async {
+    final response = await _sendCommand(
+      'analysis.updateContent',
+      params: {
+        'files': {
+          file: {'type': 'add', 'content': content},
+        }
+      },
+    );
+    final result = response['result'] as Map<String, dynamic>;
+
+    return AnalysisUpdateContentResult.fromJson(
+      ResponseDecoder(null),
+      'result',
+      result,
+    );
+  }
+
   Future<bool> dispose() async {
     return _process?.kill() ?? true;
   }
 
+  Future<AnalysisUpdateContentResult> removeOverlay(String file) async {
+    final response = await _sendCommand(
+      'analysis.updateContent',
+      params: {
+        'files': {
+          file: {'type': 'remove'},
+        }
+      },
+    );
+    final result = response['result'] as Map<String, dynamic>;
+
+    return AnalysisUpdateContentResult.fromJson(
+      ResponseDecoder(null),
+      'result',
+      result,
+    );
+  }
+
   /// Requests a completion for [file] at [offset].
   Future<_SuggestionsData> requestCompletion(
       String file, int offset, int maxResults) async {
-    final response = await _sendCommand('completion.getSuggestions2',
-        params: <String, dynamic>{
-          'file': file,
-          'offset': offset,
-          'maxResults': maxResults,
-        });
+    final response = await _sendCommand('completion.getSuggestions2', params: {
+      'file': file,
+      'offset': offset,
+      'maxResults': maxResults,
+    });
     final result = response['result'] as Map<String, dynamic>;
     final metadata = _requestMetadata[response['id']]!;
 
@@ -440,10 +492,7 @@
               .remove(id)
               ?.completeError(_RequestError.parse(error));
         } else {
-          _requestCompleters.remove(id)?.complete(
-              //response['result'] as Map<String, dynamic>? ??
-              //    <String, dynamic>{});
-              response);
+          _requestCompleters.remove(id)?.complete(response);
         }
       }
     }
diff --git a/pkg/analysis_server_client/lib/handler/notification_handler.dart b/pkg/analysis_server_client/lib/handler/notification_handler.dart
index 2d8715a..8394584 100644
--- a/pkg/analysis_server_client/lib/handler/notification_handler.dart
+++ b/pkg/analysis_server_client/lib/handler/notification_handler.dart
@@ -6,6 +6,9 @@
 // To regenerate the file, use the script
 // "pkg/analysis_server/tool/spec/generate_files".
 
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: prefer_interpolation_to_compose_strings
+
 import 'package:analysis_server_client/protocol.dart';
 
 /// [NotificationHandler] processes analysis server notifications
diff --git a/pkg/analysis_server_client/lib/src/protocol/protocol_common.dart b/pkg/analysis_server_client/lib/src/protocol/protocol_common.dart
index e129eed..749b941 100644
--- a/pkg/analysis_server_client/lib/src/protocol/protocol_common.dart
+++ b/pkg/analysis_server_client/lib/src/protocol/protocol_common.dart
@@ -6,6 +6,9 @@
 // To regenerate the file, use the script
 // "pkg/analysis_server/tool/spec/generate_files".
 
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: prefer_interpolation_to_compose_strings
+
 import 'dart:convert' hide JsonDecoder;
 
 import 'package:analysis_server_client/src/protocol/protocol_base.dart';
diff --git a/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart b/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart
index 24ad02a..cc63b35 100644
--- a/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart
+++ b/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart
@@ -6,6 +6,9 @@
 // To regenerate the file, use the script
 // "pkg/analysis_server/tool/spec/generate_files".
 
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: prefer_interpolation_to_compose_strings
+
 const String PROTOCOL_VERSION = '1.33.0';
 
 const String ANALYSIS_NOTIFICATION_ANALYZED_FILES = 'analysis.analyzedFiles';
diff --git a/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart b/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart
index f4bb221..dd65279 100644
--- a/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart
+++ b/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart
@@ -6,6 +6,9 @@
 // To regenerate the file, use the script
 // "pkg/analysis_server/tool/spec/generate_files".
 
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: prefer_interpolation_to_compose_strings
+
 import 'dart:convert' hide JsonDecoder;
 
 import 'package:analysis_server_client/src/protocol/protocol_base.dart';
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index a446cae..5e0d327 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -84,7 +84,7 @@
 /// TODO(scheglov) Clean up the list of implicitly analyzed files.
 class AnalysisDriver implements AnalysisDriverGeneric {
   /// The version of data format, should be incremented on every format change.
-  static const int DATA_VERSION = 217;
+  static const int DATA_VERSION = 218;
 
   /// The number of exception contexts allowed to write. Once this field is
   /// zero, we stop writing any new exception contexts in this process.
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 0f7bb2d..3d1e18c 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -3709,7 +3709,7 @@
   List<ExtensionElement> get accessibleExtensions => scope.extensions;
 
   @override
-  CompilationUnitElement get definingCompilationUnit =>
+  CompilationUnitElementImpl get definingCompilationUnit =>
       _definingCompilationUnit;
 
   /// Set the compilation unit that defines this library to the given
diff --git a/pkg/analyzer/lib/src/summary2/element_flags.dart b/pkg/analyzer/lib/src/summary2/element_flags.dart
index 9481899..a8ba866 100644
--- a/pkg/analyzer/lib/src/summary2/element_flags.dart
+++ b/pkg/analyzer/lib/src/summary2/element_flags.dart
@@ -312,6 +312,7 @@
   static const int _isExternal = 1 << 2;
   static const int _isFinal = 1 << 3;
   static const int _isLate = 1 << 4;
+  static const int _isTempAugmentation = 1 << 5;
 
   static void read(
     SummaryDataReader reader,
@@ -323,6 +324,7 @@
     element.isExternal = (byte & _isExternal) != 0;
     element.isFinal = (byte & _isFinal) != 0;
     element.isLate = (byte & _isLate) != 0;
+    element.isTempAugmentation = (byte & _isTempAugmentation) != 0;
   }
 
   static void write(BufferedSink sink, TopLevelVariableElementImpl element) {
@@ -332,6 +334,7 @@
     result |= element.isExternal ? _isExternal : 0;
     result |= element.isFinal ? _isFinal : 0;
     result |= element.isLate ? _isLate : 0;
+    result |= element.isTempAugmentation ? _isTempAugmentation : 0;
     sink.writeByte(result);
   }
 }
diff --git a/pkg/analyzer/lib/src/summary2/library_builder.dart b/pkg/analyzer/lib/src/summary2/library_builder.dart
index 7fcbfcc..50e62f5 100644
--- a/pkg/analyzer/lib/src/summary2/library_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/library_builder.dart
@@ -238,6 +238,7 @@
     TypesBuilder(linker).build(nodesToBuildType);
 
     // Transplant built elements as if the augmentation was applied.
+    final augmentedUnitElement = element.definingCompilationUnit;
     for (final augmentation in unitElement.classes) {
       // TODO(scheglov) if augmentation
       final augmented = element.getType(augmentation.name);
@@ -260,6 +261,14 @@
         ];
       }
     }
+    augmentedUnitElement.accessors = [
+      ...augmentedUnitElement.accessors,
+      ...unitElement.accessors,
+    ];
+    augmentedUnitElement.topLevelVariables = [
+      ...augmentedUnitElement.topLevelVariables,
+      ...unitElement.topLevelVariables,
+    ];
   }
 
   Future<void> executeMacroTypesPhase() async {
diff --git a/pkg/analyzer/lib/src/summary2/macro.dart b/pkg/analyzer/lib/src/summary2/macro.dart
index a87f832..46f36e9 100644
--- a/pkg/analyzer/lib/src/summary2/macro.dart
+++ b/pkg/analyzer/lib/src/summary2/macro.dart
@@ -5,7 +5,6 @@
 import 'dart:isolate';
 import 'dart:typed_data';
 
-import 'package:_fe_analyzer_shared/src/macros/api.dart' as macro;
 import 'package:_fe_analyzer_shared/src/macros/bootstrap.dart' as macro;
 import 'package:_fe_analyzer_shared/src/macros/executor.dart' as macro;
 import 'package:_fe_analyzer_shared/src/macros/executor/isolated_executor.dart'
@@ -53,19 +52,17 @@
     }
   }
 
-  Future<MacroClassInstance> instantiate({
+  /// Any macro must be instantiated using this method to guarantee that
+  /// the corresponding kernel was registered first. Although as it is now,
+  /// it is still possible to request an unrelated [libraryUri].
+  Future<macro.MacroInstanceIdentifier> instantiate({
     required Uri libraryUri,
     required String className,
     required String constructorName,
     required macro.Arguments arguments,
-    required macro.IdentifierResolver identifierResolver,
-    required macro.DeclarationKind declarationKind,
-    required macro.Declaration declaration,
   }) async {
-    var instanceIdentifier = await macroExecutor.instantiateMacro(
+    return await macroExecutor.instantiateMacro(
         libraryUri, className, constructorName, arguments);
-    return MacroClassInstance._(this, identifierResolver, instanceIdentifier,
-        declarationKind, declaration);
   }
 }
 
@@ -79,41 +76,6 @@
   });
 }
 
-class MacroClassInstance {
-  final BundleMacroExecutor _bundleExecutor;
-  final macro.IdentifierResolver _identifierResolver;
-  final macro.MacroInstanceIdentifier _instanceIdentifier;
-  final macro.DeclarationKind _declarationKind;
-  final macro.Declaration _declaration;
-
-  MacroClassInstance._(
-    this._bundleExecutor,
-    this._identifierResolver,
-    this._instanceIdentifier,
-    this._declarationKind,
-    this._declaration,
-  );
-
-  Future<macro.MacroExecutionResult> executeDeclarationsPhase({
-    required macro.TypeResolver typeResolver,
-    required macro.ClassIntrospector classIntrospector,
-  }) async {
-    macro.MacroExecutor executor = _bundleExecutor.macroExecutor;
-    return await executor.executeDeclarationsPhase(_instanceIdentifier,
-        _declaration, _identifierResolver, typeResolver, classIntrospector);
-  }
-
-  Future<macro.MacroExecutionResult> executeTypesPhase() async {
-    macro.MacroExecutor executor = _bundleExecutor.macroExecutor;
-    return await executor.executeTypesPhase(
-        _instanceIdentifier, _declaration, _identifierResolver);
-  }
-
-  bool shouldExecute(macro.Phase phase) {
-    return _instanceIdentifier.shouldExecute(_declarationKind, phase);
-  }
-}
-
 abstract class MacroFileEntry {
   String get content;
 
diff --git a/pkg/analyzer/lib/src/summary2/macro_application.dart b/pkg/analyzer/lib/src/summary2/macro_application.dart
index 6d75973..e3cb33d 100644
--- a/pkg/analyzer/lib/src/summary2/macro_application.dart
+++ b/pkg/analyzer/lib/src/summary2/macro_application.dart
@@ -17,7 +17,6 @@
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/summary2/library_builder.dart';
 import 'package:analyzer/src/summary2/link.dart';
-import 'package:analyzer/src/summary2/macro.dart';
 import 'package:analyzer/src/summary2/macro_application_error.dart';
 
 class LibraryMacroApplier {
@@ -26,7 +25,10 @@
 
   final List<_MacroTarget> _targets = [];
 
-  final Map<ClassDeclaration, macro.ClassDeclaration> _classDeclarations = {};
+  final Map<ClassDeclaration, macro.ClassDeclarationImpl> _classDeclarations =
+      {};
+
+  final macro.IdentifierResolver _identifierResolver = _IdentifierResolver();
 
   final macro.TypeResolver _typeResolver = _TypeResolver();
 
@@ -48,6 +50,7 @@
         await _buildApplications(
           targetElement,
           targetNode.metadata,
+          macro.DeclarationKind.clazz,
           () => getClassDeclaration(targetNode),
         );
       }
@@ -61,11 +64,7 @@
         if (application.shouldExecute(macro.Phase.declarations)) {
           await _runWithCatchingExceptions(
             () async {
-              final result =
-                  await application.instance.executeDeclarationsPhase(
-                typeResolver: _typeResolver,
-                classIntrospector: _classIntrospector,
-              );
+              final result = await application.executeDeclarationsPhase();
               if (result.isNotEmpty) {
                 results.add(result);
               }
@@ -88,7 +87,7 @@
         if (application.shouldExecute(macro.Phase.types)) {
           await _runWithCatchingExceptions(
             () async {
-              final result = await application.instance.executeTypesPhase();
+              final result = await application.executeTypesPhase();
               if (result.isNotEmpty) {
                 results.add(result);
               }
@@ -106,7 +105,7 @@
 
   /// TODO(scheglov) Do we need this caching?
   /// Or do we need it only during macro applications creation?
-  macro.ClassDeclaration getClassDeclaration(ClassDeclaration node) {
+  macro.ClassDeclarationImpl getClassDeclaration(ClassDeclaration node) {
     return _classDeclarations[node] ??= _buildClassDeclaration(node);
   }
 
@@ -115,12 +114,13 @@
   Future<void> _buildApplications(
     MacroTargetElement targetElement,
     List<Annotation> annotations,
-    macro.Declaration Function() getDeclaration,
+    macro.DeclarationKind declarationKind,
+    macro.DeclarationImpl Function() getDeclaration,
   ) async {
     final applications = <_MacroApplication>[];
 
     for (var i = 0; i < annotations.length; i++) {
-      Future<MacroClassInstance?> instantiateSingle({
+      Future<macro.MacroInstanceIdentifier?> instantiateSingle({
         required ClassElementImpl macroClass,
         required String constructorName,
         required ArgumentList argumentsNode,
@@ -139,9 +139,6 @@
                 className: macroClass.name,
                 constructorName: constructorName,
                 arguments: arguments,
-                identifierResolver: _IdentifierResolver(),
-                declarationKind: macro.DeclarationKind.clazz,
-                declaration: getDeclaration(),
               );
             },
             annotationIndex: i,
@@ -185,7 +182,7 @@
         applications.add(
           _MacroApplication(
             annotationIndex: i,
-            instance: macroInstance,
+            instanceIdentifier: macroInstance,
           ),
         );
       }
@@ -194,7 +191,10 @@
     if (applications.isNotEmpty) {
       _targets.add(
         _MacroTarget(
+          applier: this,
           element: targetElement,
+          declarationKind: declarationKind,
+          declaration: getDeclaration(),
           applications: applications,
         ),
       );
@@ -614,25 +614,60 @@
 }
 
 class _MacroApplication {
+  late final _MacroTarget target;
   final int annotationIndex;
-  final MacroClassInstance instance;
+  final macro.MacroInstanceIdentifier instanceIdentifier;
 
   _MacroApplication({
     required this.annotationIndex,
-    required this.instance,
+    required this.instanceIdentifier,
   });
 
-  bool shouldExecute(macro.Phase phase) => instance.shouldExecute(phase);
+  Future<macro.MacroExecutionResult> executeDeclarationsPhase() async {
+    final applier = target.applier;
+    final executor = applier.macroExecutor;
+    return await executor.executeDeclarationsPhase(
+      instanceIdentifier,
+      target.declaration,
+      applier._identifierResolver,
+      applier._typeResolver,
+      applier._classIntrospector,
+    );
+  }
+
+  Future<macro.MacroExecutionResult> executeTypesPhase() async {
+    final applier = target.applier;
+    final executor = applier.macroExecutor;
+    return await executor.executeTypesPhase(
+      instanceIdentifier,
+      target.declaration,
+      applier._identifierResolver,
+    );
+  }
+
+  bool shouldExecute(macro.Phase phase) {
+    return instanceIdentifier.shouldExecute(target.declarationKind, phase);
+  }
 }
 
 class _MacroTarget {
+  final LibraryMacroApplier applier;
   final MacroTargetElement element;
+  final macro.DeclarationKind declarationKind;
+  final macro.DeclarationImpl declaration;
   final List<_MacroApplication> applications;
 
   _MacroTarget({
+    required this.applier,
     required this.element,
+    required this.declarationKind,
+    required this.declaration,
     required this.applications,
-  });
+  }) {
+    for (final application in applications) {
+      application.target = this;
+    }
+  }
 }
 
 class _MacroTargetElementCollector extends GeneralizingElementVisitor<void> {
diff --git a/pkg/analyzer/test/src/dart/element/element_test.dart b/pkg/analyzer/test/src/dart/element/element_test.dart
index aaeb60b..d105672 100644
--- a/pkg/analyzer/test/src/dart/element/element_test.dart
+++ b/pkg/analyzer/test/src/dart/element/element_test.dart
@@ -177,8 +177,7 @@
     String methodName = "m";
     MethodElement method = ElementFactory.methodElement(methodName, intNone);
     classA.methods = <MethodElement>[method];
-    (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
-        <ClassElement>[classA];
+    (library.definingCompilationUnit).classes = <ClassElement>[classA];
     expect(classA.lookUpConcreteMethod(methodName, library), same(method));
   }
 
@@ -193,8 +192,7 @@
         ElementFactory.methodElement(methodName, intNone);
     method.isAbstract = true;
     classA.methods = <MethodElement>[method];
-    (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
-        <ClassElement>[classA];
+    (library.definingCompilationUnit).classes = <ClassElement>[classA];
     expect(classA.lookUpConcreteMethod(methodName, library), isNull);
   }
 
@@ -217,8 +215,7 @@
         ElementFactory.methodElement(methodName, intNone);
     method.isAbstract = true;
     classB.methods = <MethodElement>[method];
-    (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
-        <ClassElement>[classA, classB];
+    (library.definingCompilationUnit).classes = <ClassElement>[classA, classB];
     expect(classB.lookUpConcreteMethod(methodName, library),
         same(inheritedMethod));
   }
@@ -240,8 +237,7 @@
         ElementFactory.classElement("B", interfaceTypeStar(classA));
     MethodElement method = ElementFactory.methodElement(methodName, intNone);
     classB.methods = <MethodElement>[method];
-    (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
-        <ClassElement>[classA, classB];
+    (library.definingCompilationUnit).classes = <ClassElement>[classA, classB];
     expect(classB.lookUpConcreteMethod(methodName, library), same(method));
   }
 
@@ -264,8 +260,7 @@
         ElementFactory.classElement("B", interfaceTypeStar(classA));
     MethodElement method = ElementFactory.methodElement(methodName, intNone);
     classB.methods = <MethodElement>[method];
-    (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
-        <ClassElement>[classA, classB];
+    (library.definingCompilationUnit).classes = <ClassElement>[classA, classB];
     expect(classB.lookUpConcreteMethod(methodName, library), same(method));
   }
 
@@ -283,8 +278,7 @@
     classA.methods = <MethodElement>[inheritedMethod];
     ClassElementImpl classB =
         ElementFactory.classElement("B", interfaceTypeStar(classA));
-    (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
-        <ClassElement>[classA, classB];
+    (library.definingCompilationUnit).classes = <ClassElement>[classA, classB];
     expect(classB.lookUpConcreteMethod(methodName, library),
         same(inheritedMethod));
   }
@@ -294,8 +288,7 @@
     // }
     LibraryElementImpl library = _newLibrary();
     var classA = class_(name: 'A');
-    (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
-        <ClassElement>[classA];
+    (library.definingCompilationUnit).classes = <ClassElement>[classA];
     expect(classA.lookUpConcreteMethod("m", library), isNull);
   }
 
@@ -309,8 +302,7 @@
     PropertyAccessorElement getter =
         ElementFactory.getterElement(getterName, false, intNone);
     classA.accessors = <PropertyAccessorElement>[getter];
-    (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
-        <ClassElement>[classA];
+    (library.definingCompilationUnit).classes = <ClassElement>[classA];
     expect(classA.lookUpGetter(getterName, library), same(getter));
   }
 
@@ -328,8 +320,7 @@
     classA.accessors = <PropertyAccessorElement>[getter];
     ClassElementImpl classB =
         ElementFactory.classElement("B", interfaceTypeStar(classA));
-    (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
-        <ClassElement>[classA, classB];
+    (library.definingCompilationUnit).classes = <ClassElement>[classA, classB];
     expect(classB.lookUpGetter(getterName, library), same(getter));
   }
 
@@ -338,8 +329,7 @@
     // }
     LibraryElementImpl library = _newLibrary();
     var classA = class_(name: 'A');
-    (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
-        <ClassElement>[classA];
+    (library.definingCompilationUnit).classes = <ClassElement>[classA];
     expect(classA.lookUpGetter("g", library), isNull);
   }
 
@@ -353,8 +343,7 @@
     ClassElementImpl classB =
         ElementFactory.classElement("B", interfaceTypeStar(classA));
     classA.supertype = interfaceTypeStar(classB);
-    (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
-        <ClassElement>[classA, classB];
+    (library.definingCompilationUnit).classes = <ClassElement>[classA, classB];
     expect(classA.lookUpGetter("g", library), isNull);
   }
 
@@ -364,8 +353,7 @@
     String methodName = "m";
     MethodElement method = ElementFactory.methodElement(methodName, intNone);
     classA.methods = <MethodElement>[method];
-    (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
-        <ClassElement>[classA];
+    (library.definingCompilationUnit).classes = <ClassElement>[classA];
     expect(classA.lookUpMethod(methodName, library), same(method));
   }
 
@@ -377,16 +365,14 @@
     classA.methods = <MethodElement>[method];
     ClassElementImpl classB =
         ElementFactory.classElement("B", interfaceTypeStar(classA));
-    (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
-        <ClassElement>[classA, classB];
+    (library.definingCompilationUnit).classes = <ClassElement>[classA, classB];
     expect(classB.lookUpMethod(methodName, library), same(method));
   }
 
   void test_lookUpMethod_undeclared() {
     LibraryElementImpl library = _newLibrary();
     var classA = class_(name: 'A');
-    (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
-        <ClassElement>[classA];
+    (library.definingCompilationUnit).classes = <ClassElement>[classA];
     expect(classA.lookUpMethod("m", library), isNull);
   }
 
@@ -396,8 +382,7 @@
     ClassElementImpl classB =
         ElementFactory.classElement("B", interfaceTypeStar(classA));
     classA.supertype = interfaceTypeStar(classB);
-    (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
-        <ClassElement>[classA, classB];
+    (library.definingCompilationUnit).classes = <ClassElement>[classA, classB];
     expect(classA.lookUpMethod("m", library), isNull);
   }
 
@@ -411,8 +396,7 @@
     PropertyAccessorElement setter =
         ElementFactory.setterElement(setterName, false, intNone);
     classA.accessors = <PropertyAccessorElement>[setter];
-    (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
-        <ClassElement>[classA];
+    (library.definingCompilationUnit).classes = <ClassElement>[classA];
     expect(classA.lookUpSetter(setterName, library), same(setter));
   }
 
@@ -430,8 +414,7 @@
     classA.accessors = <PropertyAccessorElement>[setter];
     ClassElementImpl classB =
         ElementFactory.classElement("B", interfaceTypeStar(classA));
-    (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
-        <ClassElement>[classA, classB];
+    (library.definingCompilationUnit).classes = <ClassElement>[classA, classB];
     expect(classB.lookUpSetter(setterName, library), same(setter));
   }
 
@@ -440,8 +423,7 @@
     // }
     LibraryElementImpl library = _newLibrary();
     var classA = class_(name: 'A');
-    (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
-        <ClassElement>[classA];
+    (library.definingCompilationUnit).classes = <ClassElement>[classA];
     expect(classA.lookUpSetter("s", library), isNull);
   }
 
@@ -455,8 +437,7 @@
     ClassElementImpl classB =
         ElementFactory.classElement("B", interfaceTypeStar(classA));
     classA.supertype = interfaceTypeStar(classB);
-    (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
-        <ClassElement>[classA, classB];
+    (library.definingCompilationUnit).classes = <ClassElement>[classA, classB];
     expect(classA.lookUpSetter("s", library), isNull);
   }
 
@@ -516,8 +497,7 @@
   void test_equals() {
     LibraryElementImpl library = ElementFactory.library(analysisContext, "lib");
     ClassElementImpl classElement = ElementFactory.classElement2("C");
-    (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
-        <ClassElement>[classElement];
+    (library.definingCompilationUnit).classes = <ClassElement>[classElement];
     FieldElement field = ElementFactory.fieldElement(
       "next",
       false,
@@ -541,8 +521,7 @@
     LibraryElementImpl library1 =
         ElementFactory.library(analysisContext, "lib1");
     ClassElement classElement = ElementFactory.classElement2("_C");
-    (library1.definingCompilationUnit as CompilationUnitElementImpl).classes =
-        <ClassElement>[classElement];
+    (library1.definingCompilationUnit).classes = <ClassElement>[classElement];
     LibraryElementImpl library2 =
         ElementFactory.library(analysisContext, "lib2");
     expect(classElement.isAccessibleIn(library2), isFalse);
@@ -551,8 +530,7 @@
   void test_isAccessibleIn_private_sameLibrary() {
     LibraryElementImpl library = ElementFactory.library(analysisContext, "lib");
     ClassElement classElement = ElementFactory.classElement2("_C");
-    (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
-        <ClassElement>[classElement];
+    (library.definingCompilationUnit).classes = <ClassElement>[classElement];
     expect(classElement.isAccessibleIn(library), isTrue);
   }
 
@@ -560,8 +538,7 @@
     LibraryElementImpl library1 =
         ElementFactory.library(analysisContext, "lib1");
     ClassElement classElement = ElementFactory.classElement2("C");
-    (library1.definingCompilationUnit as CompilationUnitElementImpl).classes =
-        <ClassElement>[classElement];
+    (library1.definingCompilationUnit).classes = <ClassElement>[classElement];
     LibraryElementImpl library2 =
         ElementFactory.library(analysisContext, "lib2");
     expect(classElement.isAccessibleIn(library2), isTrue);
@@ -570,8 +547,7 @@
   void test_isAccessibleIn_public_sameLibrary() {
     LibraryElementImpl library = ElementFactory.library(analysisContext, "lib");
     ClassElement classElement = ElementFactory.classElement2("C");
-    (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
-        <ClassElement>[classElement];
+    (library.definingCompilationUnit).classes = <ClassElement>[classElement];
     expect(classElement.isAccessibleIn(library), isTrue);
   }
 
diff --git a/pkg/analyzer/test/src/summary/elements_test.dart b/pkg/analyzer/test/src/summary/elements_test.dart
index 5d2bb23..1ad15af 100644
--- a/pkg/analyzer/test/src/summary/elements_test.dart
+++ b/pkg/analyzer/test/src/summary/elements_test.dart
@@ -38084,8 +38084,7 @@
 
   Element _elementOfDefiningUnit(
       LibraryElementImpl library, List<String> names) {
-    var unit = library.definingCompilationUnit as CompilationUnitElementImpl;
-    var reference = unit.reference!;
+    var reference = library.definingCompilationUnit.reference!;
     for (var name in names) {
       reference = reference.getChild(name);
     }
diff --git a/pkg/analyzer/test/src/summary/macro_test.dart b/pkg/analyzer/test/src/summary/macro_test.dart
index 097547d..0762782 100644
--- a/pkg/analyzer/test/src/summary/macro_test.dart
+++ b/pkg/analyzer/test/src/summary/macro_test.dart
@@ -1091,6 +1091,58 @@
 ''');
   }
 
+  test_declarationsPhase_unit_variables() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+import 'package:_fe_analyzer_shared/src/macros/api.dart';
+
+macro class MyMacro implements ClassDeclarationsMacro {
+  const MyMacro();
+
+  buildDeclarationsForClass(clazz, builder) async {
+    builder.declareInLibrary(
+      DeclarationCode.fromString('final x = 42;'),
+    );
+  }
+}
+
+const myMacro = MyMacro();
+''');
+
+    var library = await buildLibrary(r'''
+import 'a.dart';
+
+@myMacro
+class A {}
+''', preBuildSequence: [
+      {'package:test/a.dart'}
+    ]);
+
+    checkElementText(library, r'''
+library
+  imports
+    package:test/a.dart
+  definingUnit
+    classes
+      class A @33
+        metadata
+          Annotation
+            atSign: @ @18
+            name: SimpleIdentifier
+              token: myMacro @19
+              staticElement: package:test/a.dart::@getter::myMacro
+              staticType: null
+            element: package:test/a.dart::@getter::myMacro
+        constructors
+          synthetic @-1
+    topLevelVariables
+      static final x @-1
+        type: int
+    accessors
+      synthetic static get x @-1
+        returnType: int
+''');
+  }
+
   test_introspect_types_ClassDeclaration_interfaces() async {
     await _assertTypesPhaseIntrospectionText(r'''
 class A implements B, C<int, String> {}
diff --git a/pkg/analyzer_plugin/lib/protocol/protocol_common.dart b/pkg/analyzer_plugin/lib/protocol/protocol_common.dart
index 85dd6d6..6259d9a 100644
--- a/pkg/analyzer_plugin/lib/protocol/protocol_common.dart
+++ b/pkg/analyzer_plugin/lib/protocol/protocol_common.dart
@@ -6,6 +6,9 @@
 // To regenerate the file, use the script
 // "pkg/analysis_server/tool/spec/generate_files".
 
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: prefer_interpolation_to_compose_strings
+
 import 'dart:convert' hide JsonDecoder;
 
 import 'package:analyzer_plugin/protocol/protocol.dart';
diff --git a/pkg/analyzer_plugin/lib/protocol/protocol_constants.dart b/pkg/analyzer_plugin/lib/protocol/protocol_constants.dart
index fe304d5..7192e9a 100644
--- a/pkg/analyzer_plugin/lib/protocol/protocol_constants.dart
+++ b/pkg/analyzer_plugin/lib/protocol/protocol_constants.dart
@@ -6,6 +6,9 @@
 // To regenerate the file, use the script
 // "pkg/analysis_server/tool/spec/generate_files".
 
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: prefer_interpolation_to_compose_strings
+
 const String ANALYSIS_NOTIFICATION_ERRORS = 'analysis.errors';
 const String ANALYSIS_NOTIFICATION_ERRORS_ERRORS = 'errors';
 const String ANALYSIS_NOTIFICATION_ERRORS_FILE = 'file';
diff --git a/pkg/analyzer_plugin/lib/protocol/protocol_generated.dart b/pkg/analyzer_plugin/lib/protocol/protocol_generated.dart
index e8ee6b4..cae7d66 100644
--- a/pkg/analyzer_plugin/lib/protocol/protocol_generated.dart
+++ b/pkg/analyzer_plugin/lib/protocol/protocol_generated.dart
@@ -6,6 +6,9 @@
 // To regenerate the file, use the script
 // "pkg/analysis_server/tool/spec/generate_files".
 
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: prefer_interpolation_to_compose_strings
+
 import 'dart:convert' hide JsonDecoder;
 
 import 'package:analyzer_plugin/protocol/protocol.dart';
diff --git a/pkg/analyzer_plugin/test/integration/support/integration_test_methods.dart b/pkg/analyzer_plugin/test/integration/support/integration_test_methods.dart
index 79c042c..443bc76 100644
--- a/pkg/analyzer_plugin/test/integration/support/integration_test_methods.dart
+++ b/pkg/analyzer_plugin/test/integration/support/integration_test_methods.dart
@@ -6,6 +6,9 @@
 // To regenerate the file, use the script
 // "pkg/analysis_server/tool/spec/generate_files".
 
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: prefer_interpolation_to_compose_strings
+
 /// Convenience methods for running integration tests.
 import 'dart:async';
 
diff --git a/pkg/analyzer_plugin/test/integration/support/protocol_matchers.dart b/pkg/analyzer_plugin/test/integration/support/protocol_matchers.dart
index 9639648..d360ead 100644
--- a/pkg/analyzer_plugin/test/integration/support/protocol_matchers.dart
+++ b/pkg/analyzer_plugin/test/integration/support/protocol_matchers.dart
@@ -6,6 +6,9 @@
 // To regenerate the file, use the script
 // "pkg/analysis_server/tool/spec/generate_files".
 
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: prefer_interpolation_to_compose_strings
+
 /// Matchers for data types defined in the analysis server API.
 import 'package:test/test.dart';
 
diff --git a/pkg/analyzer_utilities/lib/tools.dart b/pkg/analyzer_utilities/lib/tools.dart
index aae7a2a..b57f35a 100644
--- a/pkg/analyzer_utilities/lib/tools.dart
+++ b/pkg/analyzer_utilities/lib/tools.dart
@@ -168,6 +168,9 @@
 // This file has been automatically generated. Please do not edit it manually.
 // To regenerate the file, use the script
 // "pkg/analysis_server/tool/spec/generate_files".
+
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: prefer_interpolation_to_compose_strings
 ''';
     }
     writeln(header.trim());
diff --git a/pkg/vm_service/pubspec.yaml b/pkg/vm_service/pubspec.yaml
index 8d8a774..8936629 100644
--- a/pkg/vm_service/pubspec.yaml
+++ b/pkg/vm_service/pubspec.yaml
@@ -14,7 +14,7 @@
   async: ^2.5.0
   expect: any
   lints: any
-  markdown: ^4.0.0
+  markdown: '>=4.0.0 <6.0.0'
   mockito: any
   path: ^1.8.0
   process: ^4.0.0
diff --git a/runtime/vm/app_snapshot.cc b/runtime/vm/app_snapshot.cc
index a6a4766..c8f2ca5 100644
--- a/runtime/vm/app_snapshot.cc
+++ b/runtime/vm/app_snapshot.cc
@@ -53,6 +53,11 @@
             write_v8_snapshot_profile_to,
             NULL,
             "Write a snapshot profile in V8 format to a file.");
+DEFINE_FLAG(bool,
+            print_array_optimization_candidates,
+            false,
+            "Print information about how many array are candidates for Smi and "
+            "ROData optimizations.");
 #endif  // defined(DART_PRECOMPILER)
 
 namespace {
@@ -5401,7 +5406,64 @@
     }
   }
 
+#if defined(DART_PRECOMPILER)
+  static bool IsReadOnlyCid(intptr_t cid) {
+    switch (cid) {
+      case kPcDescriptorsCid:
+      case kCodeSourceMapCid:
+      case kCompressedStackMapsCid:
+      case kOneByteStringCid:
+      case kTwoByteStringCid:
+        return true;
+      default:
+        return false;
+    }
+  }
+#endif  // defined(DART_PRECOMPILER)
+
   void WriteAlloc(Serializer* s) {
+#if defined(DART_PRECOMPILER)
+    if (FLAG_print_array_optimization_candidates) {
+      intptr_t array_count = objects_.length();
+      intptr_t array_count_allsmi = 0;
+      intptr_t array_count_allro = 0;
+      intptr_t array_count_empty = 0;
+      intptr_t element_count = 0;
+      intptr_t element_count_allsmi = 0;
+      intptr_t element_count_allro = 0;
+      for (intptr_t i = 0; i < array_count; i++) {
+        ArrayPtr array = objects_[i];
+        bool allsmi = true;
+        bool allro = true;
+        const intptr_t length = Smi::Value(array->untag()->length());
+        for (intptr_t i = 0; i < length; i++) {
+          ObjectPtr element = array->untag()->element(i);
+          intptr_t cid = element->GetClassIdMayBeSmi();
+          if (!IsReadOnlyCid(cid)) allro = false;
+          if (cid != kSmiCid) allsmi = false;
+        }
+        element_count += length;
+        if (length == 0) {
+          array_count_empty++;
+        } else if (allsmi) {
+          array_count_allsmi++;
+          element_count_allsmi += length;
+        } else if (allro) {
+          array_count_allro++;
+          element_count_allro += length;
+        }
+      }
+      OS::PrintErr("Arrays\n");
+      OS::PrintErr("  total:  %" Pd ", % " Pd " elements\n", array_count,
+                   element_count);
+      OS::PrintErr("  smi-only:%" Pd ", % " Pd " elements\n",
+                   array_count_allsmi, element_count_allsmi);
+      OS::PrintErr("  ro-only:%" Pd " , % " Pd " elements\n", array_count_allro,
+                   element_count_allro);
+      OS::PrintErr("  empty:%" Pd "\n", array_count_empty);
+    }
+#endif  // defined(DART_PRECOMPILER)
+
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
diff --git a/runtime/vm/heap/gc_shared.h b/runtime/vm/heap/gc_shared.h
index 1a0d98d7..a3112ff 100644
--- a/runtime/vm/heap/gc_shared.h
+++ b/runtime/vm/heap/gc_shared.h
@@ -233,6 +233,18 @@
             finalizer_dart->untag()->exchange_entries_collected(current_entry);
         current_entry->untag()->set_next(previous_head);
         const bool first_entry = previous_head.IsRawNull();
+
+        // If we're in the marker, we need to ensure that we release the store
+        // buffer afterwards.
+        // If we're in the scavenger and have the finalizer in old space and
+        // a new space entry, we don't need to release the store buffer.
+        if (!first_entry && previous_head->IsNewObject() &&
+            current_entry->IsOldObject()) {
+          TRACE_FINALIZER("Entry %p (old) next is %p (new)",
+                          current_entry->untag(), previous_head->untag());
+          // We must release the thread's store buffer block.
+        }
+
         // Schedule calling Dart finalizer.
         if (first_entry) {
           Isolate* isolate = finalizer->untag()->isolate_;
diff --git a/runtime/vm/heap/marker.cc b/runtime/vm/heap/marker.cc
index 2b77843..452e0d4 100644
--- a/runtime/vm/heap/marker.cc
+++ b/runtime/vm/heap/marker.cc
@@ -273,6 +273,15 @@
     work_list_.Finalize();
     deferred_work_list_.Finalize();
     MournFinalized(this);
+    // MournFinalized inserts newly discovered dead entries into the
+    // linked list attached to the Finalizer. This might create
+    // cross-generational references which might be added to the store
+    // buffer. Release the store buffer to satisfy the invariant that
+    // thread local store buffer is empty after marking and all references
+    // are processed.
+    // TODO(http://dartbug.com/48957):  `thread_` can differ from
+    // `Thread::Current()`.
+    Thread::Current()->ReleaseStoreBuffer();
   }
 
   void MournWeakProperties() {
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index e042e93..207a9a4 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -5043,6 +5043,87 @@
 
 #undef FINALIZER_CROSS_GEN_TEST_CASE
 
+// Force the marker to add a FinalizerEntry to the store buffer during marking.
+//
+// This test requires two entries, one in new space, one in old space.
+// The scavenger should run first, adding the entry to collected_entries.
+// The marker runs right after, swapping the collected_entries with the entry
+// in old space, _and_ setting the next field to the entry in new space.
+// This forces the entry to be added to the store-buffer _during_ marking.
+//
+// Then, the compacter needs to be used. Which will move the entry in old
+// space.
+//
+// If the thread's store buffer block is not released after that, the compactor
+// will not update it, causing an outdated address to be released to the store
+// buffer later.
+//
+// This causes two types of errors to trigger with --verify-store-buffer:
+// 1. We see the address in the store buffer but the object is no entry there.
+//    Also can cause segfaults on reading garbage or unallocated memory.
+// 2. We see the entry has a marked bit, but can't find it in the store buffer.
+ISOLATE_UNIT_TEST_CASE(Finalizer_Regress_48843) {
+#ifdef DEBUG
+  SetFlagScope<bool> sfs(&FLAG_trace_finalizers, true);
+  SetFlagScope<bool> sfs2(&FLAG_verify_store_buffer, true);
+#endif
+  SetFlagScope<bool> sfs3(&FLAG_use_compactor, true);
+
+  const auto& finalizer = Finalizer::Handle(Finalizer::New(Heap::kOld));
+  finalizer.set_isolate(thread->isolate());
+
+  const auto& detach1 =
+      String::Handle(OneByteString::New("detach1", Heap::kNew));
+  const auto& token1 = String::Handle(OneByteString::New("token1", Heap::kNew));
+  const auto& detach2 =
+      String::Handle(OneByteString::New("detach2", Heap::kOld));
+  const auto& token2 = String::Handle(OneByteString::New("token2", Heap::kOld));
+
+  {
+    HANDLESCOPE(thread);
+    const auto& entry1 =
+        FinalizerEntry::Handle(FinalizerEntry::New(finalizer, Heap::kNew));
+    entry1.set_detach(detach1);
+    entry1.set_token(token1);
+
+    const auto& entry2 =
+        FinalizerEntry::Handle(FinalizerEntry::New(finalizer, Heap::kOld));
+    entry2.set_detach(detach2);
+    entry2.set_token(token2);
+
+    {
+      HANDLESCOPE(thread);
+      const auto& value1 =
+          String::Handle(OneByteString::New("value1", Heap::kNew));
+      entry1.set_value(value1);
+      const auto& value2 =
+          String::Handle(OneByteString::New("value2", Heap::kOld));
+      entry2.set_value(value2);
+      // Lose both values.
+    }
+
+    // First collect new space.
+    GCTestHelper::CollectNewSpace();
+    // Then old space, this will make the old space entry point to the new
+    // space entry.
+    // Also, this must be a mark compact, not a mark sweep, to move the entry.
+    GCTestHelper::CollectOldSpace();
+  }
+
+  // Imagine callbacks running.
+  // Entries themselves become unreachable.
+  finalizer.set_entries_collected(
+      FinalizerEntry::Handle(FinalizerEntry::null()));
+
+  // There should be a single entry in the store buffer.
+  // And it should crash when seeing the address in the buffer.
+  GCTestHelper::CollectNewSpace();
+
+  // We should no longer be processing the entries.
+  GCTestHelper::CollectOldSpace();
+  GCTestHelper::CollectNewSpace();
+}
+
 void NativeFinalizer_TwoEntriesCrossGen_Finalizer(void* peer) {
   intptr_t* token = reinterpret_cast<intptr_t*>(peer);
   (*token)++;
diff --git a/runtime/vm/thread.cc b/runtime/vm/thread.cc
index 573e775..2a6495b 100644
--- a/runtime/vm/thread.cc
+++ b/runtime/vm/thread.cc
@@ -380,8 +380,10 @@
 
 void Thread::ReleaseStoreBuffer() {
   ASSERT(IsAtSafepoint());
+  if (store_buffer_block_ == nullptr || store_buffer_block_->IsEmpty()) {
+    return;  // Nothing to release.
+  }
   // Prevent scheduling another GC by ignoring the threshold.
-  ASSERT(store_buffer_block_ != nullptr);
   StoreBufferRelease(StoreBuffer::kIgnoreThreshold);
   // Make sure to get an *empty* block; the isolate needs all entries
   // at GC time.
diff --git a/sdk/lib/core/weak.dart b/sdk/lib/core/weak.dart
index e7832d8..60790e8 100644
--- a/sdk/lib/core/weak.dart
+++ b/sdk/lib/core/weak.dart
@@ -191,7 +191,7 @@
 /// No promises are made that the callback will ever be called.
 /// The only thing that is guaranteed is that if a finalizer's callback
 /// is called with a specific finalization token as argument,
-/// then at least one value with an attachment to to the finalizer
+/// then at least one value with an attachment to the finalizer
 /// that has that finalization token,
 /// is no longer accessible to the program.
 ///
diff --git a/tools/VERSION b/tools/VERSION
index 97aecf2..d56cb22 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 18
 PATCH 0
-PRERELEASE 85
+PRERELEASE 86
 PRERELEASE_PATCH 0
\ No newline at end of file