diff --git a/pkg/analysis_server/test/edit/assists_test.dart b/pkg/analysis_server/test/edit/assists_test.dart
index d42144e..e7ee0e0 100644
--- a/pkg/analysis_server/test/edit/assists_test.dart
+++ b/pkg/analysis_server/test/edit/assists_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/protocol/protocol_generated.dart';
-import 'package:analysis_server/src/edit/edit_domain.dart';
 import 'package:analysis_server/src/plugin/plugin_manager.dart';
 import 'package:analyzer/instrumentation/service.dart';
 import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
@@ -12,8 +11,7 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../analysis_abstract.dart';
-import '../mocks.dart';
+import '../analysis_server_base.dart';
 import '../src/plugin/plugin_manager_test.dart';
 
 void main() {
@@ -23,7 +21,7 @@
 }
 
 @reflectiveTest
-class AssistsTest extends AbstractAnalysisTest {
+class AssistsTest extends PubPackageAnalysisServerTest {
   late List<SourceChange> changes;
 
   Future<void> prepareAssists(String search, [int length = 0]) async {
@@ -32,8 +30,9 @@
   }
 
   Future<void> prepareAssistsAt(int offset, int length) async {
-    var request = EditGetAssistsParams(testFile, offset, length).toRequest('0');
-    var response = await waitResponse(request);
+    var request =
+        EditGetAssistsParams(testFile.path, offset, length).toRequest('0');
+    var response = await handleSuccessfulRequest(request);
     var result = EditGetAssistsResult.fromResponse(response);
     changes = result.assists;
   }
@@ -41,8 +40,7 @@
   @override
   Future<void> setUp() async {
     super.setUp();
-    await createProject();
-    handler = EditDomainHandler(server);
+    await setRoots(included: [workspaceRootPath], excluded: []);
   }
 
   Future<void> test_fromPlugins() async {
@@ -68,10 +66,11 @@
 
   Future<void> test_invalidFilePathFormat_notAbsolute() async {
     var request = EditGetAssistsParams('test.dart', 0, 0).toRequest('0');
-    var response = await waitResponse(request);
-    expect(
+    var response = await handleRequest(request);
+    assertResponseFailure(
       response,
-      isResponseFailure('0', RequestErrorCode.INVALID_FILE_PATH_FORMAT),
+      requestId: '0',
+      errorCode: RequestErrorCode.INVALID_FILE_PATH_FORMAT,
     );
   }
 
@@ -79,10 +78,11 @@
     var request =
         EditGetAssistsParams(convertPath('/foo/../bar/test.dart'), 0, 0)
             .toRequest('0');
-    var response = await waitResponse(request);
-    expect(
+    var response = await handleRequest(request);
+    assertResponseFailure(
       response,
-      isResponseFailure('0', RequestErrorCode.INVALID_FILE_PATH_FORMAT),
+      requestId: '0',
+      errorCode: RequestErrorCode.INVALID_FILE_PATH_FORMAT,
     );
   }
 
@@ -142,7 +142,7 @@
     for (var change in changes) {
       if (change.message == message) {
         var resultCode =
-            SourceEdit.applySequence(testCode, change.edits[0].edits);
+            SourceEdit.applySequence(testFileContent, change.edits[0].edits);
         expect(resultCode, expectedCode);
         return;
       }
diff --git a/pkg/analysis_server/test/edit/bulk_fixes_test.dart b/pkg/analysis_server/test/edit/bulk_fixes_test.dart
index 4928226..41c6916 100644
--- a/pkg/analysis_server/test/edit/bulk_fixes_test.dart
+++ b/pkg/analysis_server/test/edit/bulk_fixes_test.dart
@@ -2,17 +2,17 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:io';
+import 'dart:io' show Platform;
 
 import 'package:analysis_server/protocol/protocol_generated.dart';
-import 'package:analysis_server/src/edit/edit_domain.dart';
 import 'package:analysis_server/src/services/linter/lint_names.dart';
+import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:linter/src/rules.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../analysis_abstract.dart';
+import '../analysis_server_base.dart';
 
 void main() {
   defineReflectiveSuite(() {
@@ -21,7 +21,7 @@
 }
 
 @reflectiveTest
-class BulkFixesTest extends AbstractAnalysisTest {
+class BulkFixesTest extends PubPackageAnalysisServerTest {
   void assertContains(List<BulkFix> details,
       {required String path, required String code, required int count}) {
     for (var detail in details) {
@@ -37,11 +37,12 @@
     fail('No match found for: $path:$code->$count in $details');
   }
 
-  Future<void> assertEditEquals(String expectedSource) async {
+  Future<void> assertEditEquals(File file, String expectedSource) async {
     await waitForTasksFinished();
     var edits = await _getBulkEdits();
     expect(edits, hasLength(1));
-    var editedSource = SourceEdit.applySequence(testCode, edits[0].edits);
+    var editedSource =
+        SourceEdit.applySequence(file.readAsStringSync(), edits[0].edits);
     expect(editedSource, expectedSource);
   }
 
@@ -55,12 +56,11 @@
   Future<void> setUp() async {
     super.setUp();
     registerLintRules();
-    handler = EditDomainHandler(server);
-    await createProject();
+    await setRoots(included: [workspaceRootPath], excluded: []);
   }
 
   Future<void> test_annotateOverrides_excludedFile() async {
-    newAnalysisOptionsYamlFile2(projectPath, '''
+    newAnalysisOptionsYamlFile2(testPackageRootPath, '''
 analyzer:
   exclude:
     - test/**
@@ -69,7 +69,7 @@
     - annotate_overrides
 ''');
 
-    newFile2('$projectPath/test/test.dart', '''
+    newFile2('$testPackageRootPath/test/test.dart', '''
 class A {
   void f() {}
 }
@@ -83,14 +83,14 @@
 
   Future<void> test_annotateOverrides_excludedSubProject() async {
     // Root project.
-    newAnalysisOptionsYamlFile2(projectPath, '''
+    newAnalysisOptionsYamlFile2(testPackageRootPath, '''
 analyzer:
   exclude:
     - test/data/**
 ''');
 
     // Sub-project.
-    var subprojectRoot = '$projectPath/test/data/subproject';
+    var subprojectRoot = '$testPackageRootPath/test/data/subproject';
     newAnalysisOptionsYamlFile2(subprojectRoot, '''
 linter:
   rules:
@@ -114,7 +114,7 @@
   }
 
   Future<void> test_annotateOverrides_subProject() async {
-    var subprojectRoot = '$projectPath/test/data/subproject';
+    var subprojectRoot = '$testPackageRootPath/test/data/subproject';
     newAnalysisOptionsYamlFile2(subprojectRoot, '''
 linter:
   rules:
@@ -125,8 +125,7 @@
 name: subproject
 ''');
 
-    testFile = '$subprojectRoot/test.dart';
-    addTestFile('''
+    var file = newFile2('$subprojectRoot/test.dart', '''
 class A {
   void f() {}
 }
@@ -135,7 +134,9 @@
 }
 ''');
 
-    await assertEditEquals('''
+    await waitForTasksFinished();
+
+    await assertEditEquals(file, '''
 class A {
   void f() {}
 }
@@ -147,15 +148,14 @@
   }
 
   Future<void> test_details() async {
-    newAnalysisOptionsYamlFile2(projectPath, '''
+    newAnalysisOptionsYamlFile2(testPackageRootPath, '''
 linter:
   rules:
     - annotate_overrides
     - unnecessary_new
 ''');
 
-    var fileA = convertPath('$projectPath/a.dart');
-    newFile2(fileA, '''
+    var a = newFile2('$testPackageLibPath/a.dart', '''
 class A {
   A f() => new A();
 }
@@ -173,15 +173,15 @@
     var details = await _getBulkFixDetails();
     expect(details, hasLength(2));
     assertContains(details,
-        path: fileA, code: LintNames.unnecessary_new, count: 2);
+        path: a.path, code: LintNames.unnecessary_new, count: 2);
     assertContains(details,
-        path: fileA, code: LintNames.annotate_overrides, count: 1);
+        path: a.path, code: LintNames.annotate_overrides, count: 1);
     assertContains(details,
-        path: testFile, code: LintNames.unnecessary_new, count: 1);
+        path: testFile.path, code: LintNames.unnecessary_new, count: 1);
   }
 
   Future<void> test_unnecessaryNew() async {
-    newAnalysisOptionsYamlFile2(projectPath, '''
+    newAnalysisOptionsYamlFile2(testPackageRootPath, '''
 linter:
   rules:
     - unnecessary_new
@@ -191,13 +191,12 @@
 A f() => new A();
 ''');
 
-    await assertEditEquals('''
+    await assertEditEquals(testFile, '''
 class A {}
 A f() => A();
 ''');
   }
 
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44080')
   Future<void> test_unnecessaryNew_collectionLiteral_overlap() async {
     // The test case currently drops the 'new' but does not convert the code to
     // use a set literal. The code is no longer mangled, but we need to run the
@@ -205,7 +204,7 @@
     if (Platform.isWindows) {
       fail('Should not be passing on Windows, but it does');
     }
-    newAnalysisOptionsYamlFile2(projectPath, '''
+    newAnalysisOptionsYamlFile2(testPackageRootPath, '''
 linter:
   rules:
     - prefer_collection_literals
@@ -219,7 +218,7 @@
 }
 ''');
 
-    await assertEditEquals('''
+    await assertEditEquals(testFile, '''
 class A {
   Map<String, Object> _map = {};
   Set<String> _set = <String>{};
@@ -228,7 +227,7 @@
   }
 
   Future<void> test_unnecessaryNew_ignoredInOptions() async {
-    newAnalysisOptionsYamlFile2(projectPath, '''
+    newAnalysisOptionsYamlFile2(testPackageRootPath, '''
 analyzer:
   errors:
     unnecessary_new: ignore
@@ -244,7 +243,7 @@
   }
 
   Future<void> test_unnecessaryNew_ignoredInSource() async {
-    newAnalysisOptionsYamlFile2(projectPath, '''
+    newAnalysisOptionsYamlFile2(testPackageRootPath, '''
 linter:
   rules:
     - unnecessary_new
@@ -268,8 +267,8 @@
   }
 
   Future<EditBulkFixesResult> _getBulkFixes() async {
-    var request = EditBulkFixesParams([projectPath]).toRequest('0');
-    var response = await waitResponse(request);
+    var request = EditBulkFixesParams([workspaceRootPath]).toRequest('0');
+    var response = await handleSuccessfulRequest(request);
     return EditBulkFixesResult.fromResponse(response);
   }
 }
diff --git a/pkg/analysis_server/test/edit/fixes_test.dart b/pkg/analysis_server/test/edit/fixes_test.dart
index a2658e5..95af965 100644
--- a/pkg/analysis_server/test/edit/fixes_test.dart
+++ b/pkg/analysis_server/test/edit/fixes_test.dart
@@ -3,8 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/protocol/protocol_generated.dart';
-import 'package:analysis_server/src/edit/edit_domain.dart';
 import 'package:analysis_server/src/plugin/plugin_manager.dart';
+import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/instrumentation/service.dart';
 import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
 import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
@@ -13,8 +13,7 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../analysis_abstract.dart';
-import '../mocks.dart';
+import '../analysis_server_base.dart';
 import '../src/plugin/plugin_manager_test.dart';
 
 void main() {
@@ -24,11 +23,11 @@
 }
 
 @reflectiveTest
-class FixesTest extends AbstractAnalysisTest {
+class FixesTest extends PubPackageAnalysisServerTest {
   @override
-  void setUp() {
+  Future<void> setUp() async {
     super.setUp();
-    handler = EditDomainHandler(server);
+    await setRoots(included: [workspaceRootPath], excluded: []);
   }
 
   Future<void> test_fileOutsideRoot() async {
@@ -37,20 +36,19 @@
 
     // Set up the original project, as the code fix code won't run at all
     // if there are no contexts.
-    await createProject();
     await waitForTasksFinished();
 
     var request =
         EditGetFixesParams(convertPath(outsideFile), 0).toRequest('0');
-    var response = await waitResponse(request);
-    expect(
+    var response = await handleRequest(request);
+    assertResponseFailure(
       response,
-      isResponseFailure('0', RequestErrorCode.GET_FIXES_INVALID_FILE),
+      requestId: '0',
+      errorCode: RequestErrorCode.GET_FIXES_INVALID_FILE,
     );
   }
 
   Future<void> test_fixUndefinedClass() async {
-    await createProject();
     addTestFile('''
 main() {
   Completer<String> x = null;
@@ -58,8 +56,7 @@
 }
 ''');
     await waitForTasksFinished();
-    doAllDeclarationsTrackerWork();
-    var errorFixes = await _getFixesAt('Completer<String>');
+    var errorFixes = await _getFixesAt(testFile, 'Completer<String>');
     expect(errorFixes, hasLength(1));
     var fixes = errorFixes[0].fixes;
     expect(fixes, hasLength(3));
@@ -82,15 +79,13 @@
       info: Future.value(result.toResponse('-', 1))
     };
 
-    await createProject();
     addTestFile('main() {}');
     await waitForTasksFinished();
-    var errorFixes = await _getFixesAt('in(');
+    var errorFixes = await _getFixesAt(testFile, 'in(');
     expect(errorFixes, hasLength(1));
   }
 
   Future<void> test_hasFixes() async {
-    await createProject();
     addTestFile('''
 foo() {
   print(1)
@@ -102,13 +97,13 @@
     await waitForTasksFinished();
     // print(1)
     {
-      var errorFixes = await _getFixesAt('print(1)');
+      var errorFixes = await _getFixesAt(testFile, 'print(1)');
       expect(errorFixes, hasLength(1));
       _isSyntacticErrorWithSingleFix(errorFixes[0]);
     }
     // print(10)
     {
-      var errorFixes = await _getFixesAt('print(10)');
+      var errorFixes = await _getFixesAt(testFile, 'print(10)');
       expect(errorFixes, hasLength(2));
       _isSyntacticErrorWithSingleFix(errorFixes[0]);
       _isSyntacticErrorWithSingleFix(errorFixes[1]);
@@ -117,72 +112,73 @@
 
   Future<void> test_invalidFilePathFormat_notAbsolute() async {
     var request = EditGetFixesParams('test.dart', 0).toRequest('0');
-    var response = await waitResponse(request);
-    expect(
+    var response = await handleRequest(request);
+    assertResponseFailure(
       response,
-      isResponseFailure('0', RequestErrorCode.INVALID_FILE_PATH_FORMAT),
+      requestId: '0',
+      errorCode: RequestErrorCode.INVALID_FILE_PATH_FORMAT,
     );
   }
 
   Future<void> test_invalidFilePathFormat_notNormalized() async {
     var request = EditGetFixesParams(convertPath('/foo/../bar/test.dart'), 0)
         .toRequest('0');
-    var response = await waitResponse(request);
-    expect(
+    var response = await handleRequest(request);
+    assertResponseFailure(
       response,
-      isResponseFailure('0', RequestErrorCode.INVALID_FILE_PATH_FORMAT),
+      requestId: '0',
+      errorCode: RequestErrorCode.INVALID_FILE_PATH_FORMAT,
     );
   }
 
   Future<void> test_overlayOnlyFile() async {
-    await createProject();
-    testCode = '''
+    await _addOverlay(testFile.path, '''
 main() {
 print(1)
 }
-''';
-    await _addOverlay(testFile, testCode);
+''');
+
+    var file = server.resourceProvider.getFile(testFile.path);
+
     // ask for fixes
     await waitForTasksFinished();
-    var errorFixes = await _getFixesAt('print(1)');
+    var errorFixes = await _getFixesAt(file, 'print(1)');
     expect(errorFixes, hasLength(1));
     _isSyntacticErrorWithSingleFix(errorFixes[0]);
   }
 
   Future<void> test_suggestImportFromDifferentAnalysisRoot() async {
     newPackageConfigJsonFile(
-      '/aaa',
+      '$workspaceRootPath/aaa',
       (PackageConfigFileBuilder()
-            ..add(name: 'aaa', rootPath: '/aaa')
-            ..add(name: 'bbb', rootPath: '/bbb'))
+            ..add(name: 'aaa', rootPath: '$workspaceRootPath/aaa')
+            ..add(name: 'bbb', rootPath: '$workspaceRootPath/bbb'))
           .toContent(toUriStr: toUriStr),
     );
-    newPubspecYamlFile('/aaa', r'''
+    newPubspecYamlFile('$workspaceRootPath/aaa', r'''
 dependencies:
   bbb: any
 ''');
 
     newPackageConfigJsonFile(
-      '/bbb',
-      (PackageConfigFileBuilder()..add(name: 'bbb', rootPath: '/bbb'))
+      '$workspaceRootPath/bbb',
+      (PackageConfigFileBuilder()
+            ..add(name: 'bbb', rootPath: '$workspaceRootPath/bbb'))
           .toContent(toUriStr: toUriStr),
     );
-    newFile2('/bbb/lib/target.dart', 'class Foo() {}');
-    newFile2('/bbb/lib/target.generated.dart', 'class Foo() {}');
-    newFile2('/bbb/lib/target.template.dart', 'class Foo() {}');
-
-    await setRoots(
-        included: [convertPath('/aaa'), convertPath('/bbb')], excluded: []);
+    newFile2('$workspaceRootPath/bbb/lib/target.dart', 'class Foo() {}');
+    newFile2(
+        '$workspaceRootPath/bbb/lib/target.generated.dart', 'class Foo() {}');
+    newFile2(
+        '$workspaceRootPath/bbb/lib/target.template.dart', 'class Foo() {}');
 
     // Configure the test file.
-    testFile = convertPath('/aaa/main.dart');
-    testCode = 'main() { new Foo(); }';
-    await _addOverlay(testFile, testCode);
+    final file =
+        newFile2('$workspaceRootPath/aaa/main.dart', 'main() { new Foo(); }');
 
     await waitForTasksFinished();
-    doAllDeclarationsTrackerWork();
 
-    var fixes = (await _getFixesAt('Foo()'))
+    var fixes = (await _getFixesAt(file, 'Foo()'))
         .single
         .fixes
         .map((f) => f.message)
@@ -197,22 +193,23 @@
   }
 
   Future<void> _addOverlay(String name, String contents) async {
-    var request =
-        AnalysisUpdateContentParams({name: AddContentOverlay(contents)})
-            .toRequest('0');
-    await waitResponse(request);
+    await handleSuccessfulRequest(
+      AnalysisUpdateContentParams({
+        name: AddContentOverlay(contents),
+      }).toRequest('0'),
+    );
   }
 
-  Future<List<AnalysisErrorFixes>> _getFixes(int offset) async {
-    var request = EditGetFixesParams(testFile, offset).toRequest('0');
-    var response = await waitResponse(request);
+  Future<List<AnalysisErrorFixes>> _getFixes(File file, int offset) async {
+    var request = EditGetFixesParams(file.path, offset).toRequest('0');
+    var response = await handleSuccessfulRequest(request);
     var result = EditGetFixesResult.fromResponse(response);
     return result.fixes;
   }
 
-  Future<List<AnalysisErrorFixes>> _getFixesAt(String search) async {
-    var offset = findOffset(search);
-    return await _getFixes(offset);
+  Future<List<AnalysisErrorFixes>> _getFixesAt(File file, String search) async {
+    var offset = offsetInFile(file, search);
+    return await _getFixes(file, offset);
   }
 
   void _isSyntacticErrorWithSingleFix(AnalysisErrorFixes fixes) {
diff --git a/pkg/analysis_server/test/edit/format_if_enabled_test.dart b/pkg/analysis_server/test/edit/format_if_enabled_test.dart
index df10b41..0d6a3b0 100644
--- a/pkg/analysis_server/test/edit/format_if_enabled_test.dart
+++ b/pkg/analysis_server/test/edit/format_if_enabled_test.dart
@@ -3,12 +3,11 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/protocol/protocol_generated.dart';
-import 'package:analysis_server/src/edit/edit_domain.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../analysis_abstract.dart';
+import '../analysis_server_base.dart';
 
 void main() {
   defineReflectiveSuite(() {
@@ -17,23 +16,22 @@
 }
 
 @reflectiveTest
-class FormatIfEnabledTest extends AbstractAnalysisTest {
+class FormatIfEnabledTest extends PubPackageAnalysisServerTest {
   @override
   Future<void> setUp() async {
     super.setUp();
-    await createProject();
-    handler = EditDomainHandler(server);
+    await setRoots(included: [workspaceRootPath], excluded: []);
   }
 
   Future<void> test_enabled() async {
-    newAnalysisOptionsYamlFile2(testFolder, '''
+    newAnalysisOptionsYamlFile2(testPackageRootPath, '''
 code-style:
   format: true
 ''');
     addTestFile('''
 void f() { int x = 3; }
 ''');
-    newFile2('$testFolder/a.dart', '''
+    newFile2('$testPackageLibPath/a.dart', '''
 class A { A(); }
 ''');
     var edits = await _format();
@@ -61,8 +59,9 @@
 
   Future<List<SourceFileEdit>> _format() async {
     await waitForTasksFinished();
-    var request = EditFormatIfEnabledParams([testFolder]).toRequest('0');
-    var response = await waitResponse(request);
+    var request =
+        EditFormatIfEnabledParams([testPackageRoot.path]).toRequest('0');
+    var response = await handleSuccessfulRequest(request);
     return EditFormatIfEnabledResult.fromResponse(response).edits;
   }
 }
diff --git a/pkg/analysis_server/test/edit/format_test.dart b/pkg/analysis_server/test/edit/format_test.dart
index 742ae2a..d3dc46c 100644
--- a/pkg/analysis_server/test/edit/format_test.dart
+++ b/pkg/analysis_server/test/edit/format_test.dart
@@ -3,11 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/protocol/protocol_generated.dart';
-import 'package:analysis_server/src/edit/edit_domain.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../analysis_abstract.dart';
+import '../analysis_server_base.dart';
 import '../mocks.dart';
 
 void main() {
@@ -17,12 +16,11 @@
 }
 
 @reflectiveTest
-class FormatTest extends AbstractAnalysisTest {
+class FormatTest extends PubPackageAnalysisServerTest {
   @override
   Future<void> setUp() async {
     super.setUp();
-    await createProject();
-    handler = EditDomainHandler(server);
+    await setRoots(included: [workspaceRootPath], excluded: []);
   }
 
   Future<void> test_format_longLine() async {
@@ -100,17 +98,18 @@
 main() { int x =
 ''');
     await waitForTasksFinished();
-    var request = EditFormatParams(testFile, 0, 3).toRequest('0');
-    var response = await waitResponse(request);
+    var request = EditFormatParams(testFile.path, 0, 3).toRequest('0');
+    var response = await handleRequest(request);
     expect(response, isResponseFailure('0'));
   }
 
   Future<EditFormatResult> _formatAt(int selectionOffset, int selectionLength,
       {int? lineLength}) async {
-    var request = EditFormatParams(testFile, selectionOffset, selectionLength,
+    var request = EditFormatParams(
+            testFile.path, selectionOffset, selectionLength,
             lineLength: lineLength)
         .toRequest('0');
-    var response = await waitResponse(request);
+    var response = await handleSuccessfulRequest(request);
     return EditFormatResult.fromResponse(response);
   }
 }
diff --git a/pkg/analysis_server/test/edit/organize_directives_test.dart b/pkg/analysis_server/test/edit/organize_directives_test.dart
index fccfa57..d1909f0 100644
--- a/pkg/analysis_server/test/edit/organize_directives_test.dart
+++ b/pkg/analysis_server/test/edit/organize_directives_test.dart
@@ -3,13 +3,11 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/protocol/protocol_generated.dart';
-import 'package:analysis_server/src/edit/edit_domain.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../analysis_abstract.dart';
-import '../mocks.dart';
+import '../analysis_server_base.dart';
 
 void main() {
   defineReflectiveSuite(() {
@@ -18,14 +16,13 @@
 }
 
 @reflectiveTest
-class OrganizeDirectivesTest extends AbstractAnalysisTest {
+class OrganizeDirectivesTest extends PubPackageAnalysisServerTest {
   late SourceFileEdit fileEdit;
 
   @override
   Future<void> setUp() async {
     super.setUp();
-    await createProject();
-    handler = EditDomainHandler(server);
+    await setRoots(included: [workspaceRootPath], excluded: []);
   }
 
   @failingTest
@@ -34,9 +31,12 @@
     var request =
         EditOrganizeDirectivesParams(convertPath('/no/such/file.dart'))
             .toRequest('0');
-    var response = await waitResponse(request);
-    expect(
-        response, isResponseFailure('0', RequestErrorCode.FILE_NOT_ANALYZED));
+    var response = await handleRequest(request);
+    assertResponseFailure(
+      response,
+      requestId: '0',
+      errorCode: RequestErrorCode.FILE_NOT_ANALYZED,
+    );
   }
 
   Future test_BAD_hasParseError() async {
@@ -45,27 +45,34 @@
 
 main() {}
 ''');
-    var request = EditOrganizeDirectivesParams(testFile).toRequest('0');
-    var response = await waitResponse(request);
-    expect(response,
-        isResponseFailure('0', RequestErrorCode.ORGANIZE_DIRECTIVES_ERROR));
+    var request = EditOrganizeDirectivesParams(testFile.path).toRequest('0');
+    var response = await handleRequest(request);
+    assertResponseFailure(
+      response,
+      requestId: '0',
+      errorCode: RequestErrorCode.ORGANIZE_DIRECTIVES_ERROR,
+    );
   }
 
   Future test_BAD_notDartFile() async {
     var request = EditOrganizeDirectivesParams(
       convertPath('/not-a-Dart-file.txt'),
     ).toRequest('0');
-    var response = await waitResponse(request);
-    expect(
-        response, isResponseFailure('0', RequestErrorCode.FILE_NOT_ANALYZED));
+    var response = await handleRequest(request);
+    assertResponseFailure(
+      response,
+      requestId: '0',
+      errorCode: RequestErrorCode.FILE_NOT_ANALYZED,
+    );
   }
 
   Future<void> test_invalidFilePathFormat_notAbsolute() async {
     var request = EditOrganizeDirectivesParams('test.dart').toRequest('0');
-    var response = await waitResponse(request);
-    expect(
+    var response = await handleRequest(request);
+    assertResponseFailure(
       response,
-      isResponseFailure('0', RequestErrorCode.INVALID_FILE_PATH_FORMAT),
+      requestId: '0',
+      errorCode: RequestErrorCode.INVALID_FILE_PATH_FORMAT,
     );
   }
 
@@ -73,10 +80,11 @@
     var request =
         EditOrganizeDirectivesParams(convertPath('/foo/../bar/test.dart'))
             .toRequest('0');
-    var response = await waitResponse(request);
-    expect(
+    var response = await handleRequest(request);
+    assertResponseFailure(
       response,
-      isResponseFailure('0', RequestErrorCode.INVALID_FILE_PATH_FORMAT),
+      requestId: '0',
+      errorCode: RequestErrorCode.INVALID_FILE_PATH_FORMAT,
     );
   }
 
@@ -147,13 +155,13 @@
 
   Future _assertOrganized(String expectedCode) async {
     await _requestOrganize();
-    var resultCode = SourceEdit.applySequence(testCode, fileEdit.edits);
+    var resultCode = SourceEdit.applySequence(testFileContent, fileEdit.edits);
     expect(resultCode, expectedCode);
   }
 
   Future _requestOrganize() async {
-    var request = EditOrganizeDirectivesParams(testFile).toRequest('0');
-    var response = await waitResponse(request);
+    var request = EditOrganizeDirectivesParams(testFile.path).toRequest('0');
+    var response = await handleSuccessfulRequest(request);
     var result = EditOrganizeDirectivesResult.fromResponse(response);
     fileEdit = result.edit;
   }
diff --git a/pkg/analysis_server/test/edit/postfix_completion_test.dart b/pkg/analysis_server/test/edit/postfix_completion_test.dart
index 0de0e1c..5a49b9a 100644
--- a/pkg/analysis_server/test/edit/postfix_completion_test.dart
+++ b/pkg/analysis_server/test/edit/postfix_completion_test.dart
@@ -4,13 +4,11 @@
 
 import 'package:analysis_server/protocol/protocol.dart';
 import 'package:analysis_server/protocol/protocol_generated.dart';
-import 'package:analysis_server/src/edit/edit_domain.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../analysis_abstract.dart';
-import '../mocks.dart';
+import '../analysis_server_base.dart';
 
 void main() {
   defineReflectiveSuite(() {
@@ -19,14 +17,13 @@
 }
 
 @reflectiveTest
-class PostfixCompletionTest extends AbstractAnalysisTest {
+class PostfixCompletionTest extends PubPackageAnalysisServerTest {
   late SourceChange change;
 
   @override
   Future<void> setUp() async {
     super.setUp();
-    await createProject();
-    handler = EditDomainHandler(server);
+    await setRoots(included: [workspaceRootPath], excluded: []);
   }
 
   Future<void> test_for() async {
@@ -49,10 +46,11 @@
   Future<void> test_invalidFilePathFormat_notAbsolute() async {
     var request =
         EditGetPostfixCompletionParams('test.dart', '.for', 0).toRequest('0');
-    var response = await waitResponse(request);
-    expect(
+    var response = await handleRequest(request);
+    assertResponseFailure(
       response,
-      isResponseFailure('0', RequestErrorCode.INVALID_FILE_PATH_FORMAT),
+      requestId: '0',
+      errorCode: RequestErrorCode.INVALID_FILE_PATH_FORMAT,
     );
   }
 
@@ -60,10 +58,11 @@
     var request = EditGetPostfixCompletionParams(
             convertPath('/foo/../bar/test.dart'), '.for', 0)
         .toRequest('0');
-    var response = await waitResponse(request);
-    expect(
+    var response = await handleRequest(request);
+    assertResponseFailure(
       response,
-      isResponseFailure('0', RequestErrorCode.INVALID_FILE_PATH_FORMAT),
+      requestId: '0',
+      errorCode: RequestErrorCode.INVALID_FILE_PATH_FORMAT,
     );
   }
 
@@ -71,7 +70,7 @@
     if (change.message == message) {
       if (change.edits.isNotEmpty) {
         var resultCode =
-            SourceEdit.applySequence(testCode, change.edits[0].edits);
+            SourceEdit.applySequence(testFileContent, change.edits[0].edits);
         expect(resultCode, expectedCode.replaceAll('/*caret*/', ''));
       }
       return;
@@ -81,24 +80,24 @@
 
   Future<void> _prepareCompletion(String key) async {
     var offset = findOffset(key);
-    var src = testCode.replaceFirst(key, '', offset);
+    var src = testFileContent.replaceFirst(key, '', offset);
     modifyTestFile(src);
     await _prepareCompletionAt(offset, key);
   }
 
   Future<void> _prepareCompletionAt(int offset, String key) async {
-    var params = EditGetPostfixCompletionParams(testFile, key, offset);
+    var params = EditGetPostfixCompletionParams(testFile.path, key, offset);
     var request =
         Request('0', 'edit.isPostfixCompletionApplicable', params.toJson());
-    var response = await waitResponse(request, throwOnError: false);
+    var response = await handleSuccessfulRequest(request);
     var isApplicable =
         EditIsPostfixCompletionApplicableResult.fromResponse(response);
     if (!isApplicable.value) {
       fail('Postfix completion not applicable at given location');
     }
-    request =
-        EditGetPostfixCompletionParams(testFile, key, offset).toRequest('1');
-    response = await waitResponse(request, throwOnError: false);
+    request = EditGetPostfixCompletionParams(testFile.path, key, offset)
+        .toRequest('1');
+    response = await handleSuccessfulRequest(request);
     var result = EditGetPostfixCompletionResult.fromResponse(response);
     change = result.change;
   }
diff --git a/pkg/analysis_server/test/edit/refactoring_test.dart b/pkg/analysis_server/test/edit/refactoring_test.dart
index e391b6c..8f47785 100644
--- a/pkg/analysis_server/test/edit/refactoring_test.dart
+++ b/pkg/analysis_server/test/edit/refactoring_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:analysis_server/protocol/protocol.dart';
 import 'package:analysis_server/protocol/protocol_generated.dart';
-import 'package:analysis_server/src/domain_server.dart';
 import 'package:analysis_server/src/edit/edit_domain.dart';
 import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
@@ -12,6 +11,7 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../analysis_abstract.dart';
+import '../analysis_server_base.dart';
 import '../mocks.dart';
 import '../src/utilities/mock_packages.dart';
 
@@ -115,7 +115,7 @@
   Future<Response> _sendConvertRequest(String search) {
     var request = EditGetRefactoringParams(
             RefactoringKind.CONVERT_GETTER_TO_METHOD,
-            testFile,
+            testFile.path,
             findOffset(search),
             0,
             false)
@@ -227,7 +227,7 @@
   Future<Response> _sendConvertRequest(String search) {
     var request = EditGetRefactoringParams(
             RefactoringKind.CONVERT_METHOD_TO_GETTER,
-            testFile,
+            testFile.path,
             findOffset(search),
             0,
             false)
@@ -261,16 +261,16 @@
   }
 
   @override
-  void tearDown() {
+  Future<void> tearDown() async {
     test_simulateRefactoringException_init = false;
     test_simulateRefactoringException_final = false;
     test_simulateRefactoringException_change = false;
-    super.tearDown();
+    await super.tearDown();
   }
 
   Future<void> test_analysis_onlyOneFile() async {
     shouldWaitForFullAnalysis = false;
-    newFile2(join(testFolder, 'other.dart'), r'''
+    newFile2('$testPackageLibPath/other.dart', r'''
 foo(int myName) {}
 ''');
     addTestFile('''
@@ -295,13 +295,14 @@
 }
 ''');
     return getRefactoringResult(() {
-      return sendExtractRequest(testCode.indexOf('222 +'), 0, 'res', true);
+      return sendExtractRequest(
+          testFileContent.indexOf('222 +'), 0, 'res', true);
     }).then((result) {
       var feedback = result.feedback as ExtractLocalVariableFeedback;
       expect(feedback.coveringExpressionOffsets, [
-        testCode.indexOf('222 +'),
-        testCode.indexOf('111 +'),
-        testCode.indexOf('111 +')
+        testFileContent.indexOf('222 +'),
+        testFileContent.indexOf('111 +'),
+        testFileContent.indexOf('111 +')
       ]);
       expect(feedback.coveringExpressionLengths,
           ['222'.length, '111 + 222'.length, '111 + 222 + 333'.length]);
@@ -348,10 +349,11 @@
     var request = EditGetRefactoringParams(
             RefactoringKind.EXTRACT_LOCAL_VARIABLE, 'test.dart', 0, 0, true)
         .toRequest('0');
-    var response = await waitResponse(request);
-    expect(
+    var response = await handleRequest(request);
+    assertResponseFailure(
       response,
-      isResponseFailure('0', RequestErrorCode.INVALID_FILE_PATH_FORMAT),
+      requestId: '0',
+      errorCode: RequestErrorCode.INVALID_FILE_PATH_FORMAT,
     );
   }
 
@@ -363,10 +365,11 @@
             0,
             true)
         .toRequest('0');
-    var response = await waitResponse(request);
-    expect(
+    var response = await handleRequest(request);
+    assertResponseFailure(
       response,
-      isResponseFailure('0', RequestErrorCode.INVALID_FILE_PATH_FORMAT),
+      requestId: '0',
+      errorCode: RequestErrorCode.INVALID_FILE_PATH_FORMAT,
     );
   }
 
@@ -442,7 +445,7 @@
 
     await checkUpdate(() {
       server.updateContent('u1', {
-        testFile: AddContentOverlay('''
+        testFile.path: AddContentOverlay('''
 void f() {
   print(1 + 2); // 1
 }
@@ -452,7 +455,7 @@
 
     await checkUpdate(() {
       server.updateContent('u2', {
-        testFile: ChangeContentOverlay([
+        testFile.path: ChangeContentOverlay([
           SourceEdit(0, 0, '''
 void f() {
   print(1 + 2); // 2
@@ -463,12 +466,12 @@
     });
 
     await checkUpdate(() {
-      server.updateContent('u3', {testFile: RemoveContentOverlay()});
+      server.updateContent('u3', {testFile.path: RemoveContentOverlay()});
     });
   }
 
   Future<void> test_resetOnAnalysisSetChanged_watch_otherFile() async {
-    var otherFile = join(testFolder, 'other.dart');
+    var otherFile = join('$testPackageLibPath/other.dart');
     newFile2(otherFile, '// other 1');
     addTestFile('''
 void f() {
@@ -1090,8 +1093,7 @@
 class InlineLocalTest extends _AbstractGetRefactoring_Test {
   Future<void> test_analysis_onlyOneFile() async {
     shouldWaitForFullAnalysis = false;
-    var otherFile = join(testFolder, 'other.dart');
-    newFile2(otherFile, r'''
+    newFile2('$testPackageLibPath/other.dart', r'''
 foo(int p) {}
 ''');
     addTestFile('''
@@ -1159,7 +1161,7 @@
   }
 
   Future<void> test_resetOnAnalysisSetChanged() async {
-    newFile2(join(testFolder, 'other.dart'), '// other 1');
+    newFile2('$testPackageLibPath/other.dart', '// other 1');
     addTestFile('''
 void f() {
   int res = 1 + 2;
@@ -1185,7 +1187,7 @@
   Future<Response> _sendInlineRequest(String search) {
     var request = EditGetRefactoringParams(
             RefactoringKind.INLINE_LOCAL_VARIABLE,
-            testFile,
+            testFile.path,
             findOffset(search),
             0,
             false)
@@ -1309,7 +1311,7 @@
 
   Future<Response> _sendInlineRequest(String search) {
     var request = EditGetRefactoringParams(RefactoringKind.INLINE_METHOD,
-            testFile, findOffset(search), 0, false,
+            testFile.path, findOffset(search), 0, false,
             options: options)
         .toRequest('0');
     return serverChannel.sendRequest(request);
@@ -1321,42 +1323,43 @@
   late MoveFileOptions options;
 
   Future<void> test_file_OK() {
-    newFile2('/project/bin/lib.dart', '');
+    newFile2('$testPackageLibPath/a.dart', '');
     addTestFile('''
 import 'dart:math';
-import 'lib.dart';
+import 'a.dart';
 ''');
-    _setOptions('/project/test.dart');
+    _setOptions('$testPackageRootPath/test.dart');
     return assertSuccessfulRefactoring(() {
-      return _sendMoveRequest(testFile);
+      return _sendMoveRequest(testFile.path);
     }, '''
 import 'dart:math';
-import 'bin/lib.dart';
+import 'lib/a.dart';
 ''');
   }
 
   Future<void> test_folder_cancel() {
-    newFile2('/project/bin/original_folder/file.dart', '');
+    newFile2('$testPackageLibPath/original_folder/file.dart', '');
     addTestFile('''
 import 'dart:math';
 import 'original_folder/file.dart';
 ''');
-    _setOptions('/project/bin/new_folder');
+    _setOptions('$testPackageLibPath/new_folder');
     return assertEmptySuccessfulRefactoring(() async {
       return _sendAndCancelMoveRequest(
-          convertPath('/project/bin/original_folder'));
+          getFolder('$testPackageLibPath/original_folder').path);
     });
   }
 
   Future<void> test_folder_OK() {
-    newFile2('/project/bin/original_folder/file.dart', '');
+    newFile2('$testPackageLibPath/original_folder/file.dart', '');
     addTestFile('''
 import 'dart:math';
 import 'original_folder/file.dart';
 ''');
-    _setOptions('/project/bin/new_folder');
+    _setOptions('$testPackageLibPath/new_folder');
     return assertSuccessfulRefactoring(() async {
-      return _sendMoveRequest(convertPath('/project/bin/original_folder'));
+      return _sendMoveRequest(
+          getFolder('$testPackageLibPath/original_folder').path);
     }, '''
 import 'dart:math';
 import 'new_folder/file.dart';
@@ -1396,19 +1399,19 @@
   Future<Response> sendRenameRequest(String search, String? newName,
       {String id = '0', bool validateOnly = false}) {
     var options = newName != null ? RenameOptions(newName) : null;
-    var request = EditGetRefactoringParams(RefactoringKind.RENAME, testFile,
-            findOffset(search), 0, validateOnly,
+    var request = EditGetRefactoringParams(RefactoringKind.RENAME,
+            testFile.path, findOffset(search), 0, validateOnly,
             options: options)
         .toRequest(id);
     return serverChannel.sendRequest(request);
   }
 
   @override
-  void tearDown() {
+  Future<void> tearDown() async {
     test_simulateRefactoringReset_afterInitialConditions = false;
     test_simulateRefactoringReset_afterFinalConditions = false;
     test_simulateRefactoringReset_afterCreateChange = false;
-    super.tearDown();
+    await super.tearDown();
   }
 
   Future<void> test_cancelPendingRequest() async {
@@ -2132,7 +2135,7 @@
   }
 
   Future<void> test_library_partOfDirective() {
-    newFile2(join(testFolder, 'my_lib.dart'), '''
+    newFile2('$testPackageLibPath/my_lib.dart', '''
 library aaa.bbb.ccc;
 part 'test.dart';
 ''');
@@ -2249,7 +2252,7 @@
   print(otherName);
 }
 ''');
-    server.getAnalysisDriver(testFile)!.getResult(testFile);
+    server.getAnalysisDriver(testFile.path)!.getResult(testFile.path);
     // send the second request, with the same kind, file and offset
     await waitForTasksFinished();
     result = await getRefactoringResult(() {
@@ -2286,7 +2289,7 @@
 }
 
 @reflectiveTest
-class _AbstractGetRefactoring_Test extends AbstractAnalysisTest {
+class _AbstractGetRefactoring_Test extends PubPackageAnalysisServerTest {
   bool shouldWaitForFullAnalysis = true;
 
   Future assertEmptySuccessfulRefactoring(
@@ -2304,7 +2307,7 @@
   /// for [testFile].
   void assertNoTestRefactoringResult(EditGetRefactoringResult result) {
     var change = result.change!;
-    if (change.edits.any((edit) => edit.file == testFile)) {
+    if (change.edits.any((edit) => edit.file == testFile.path)) {
       fail('Found a SourceFileEdit for $testFile in $change');
     }
   }
@@ -2368,8 +2371,9 @@
       EditGetRefactoringResult result, String expectedCode) {
     var change = result.change!;
     for (var fileEdit in change.edits) {
-      if (fileEdit.file == testFile) {
-        var actualCode = SourceEdit.applySequence(testCode, fileEdit.edits);
+      if (fileEdit.file == testFile.path) {
+        var actualCode =
+            SourceEdit.applySequence(testFileContent, fileEdit.edits);
         expect(actualCode, expectedCode);
         return;
       }
@@ -2390,7 +2394,7 @@
       RefactoringKind kind, int offset, int length, RefactoringOptions? options,
       [bool validateOnly = false]) {
     var request = EditGetRefactoringParams(
-            kind, testFile, offset, length, validateOnly,
+            kind, testFile.path, offset, length, validateOnly,
             options: options)
         .toRequest('0');
     return serverChannel.sendRequest(request);
@@ -2399,10 +2403,6 @@
   @override
   Future<void> setUp() async {
     super.setUp();
-    await createProject();
-    server.handlers = [
-      EditDomainHandler(server),
-      ServerDomainHandler(server),
-    ];
+    await setRoots(included: [workspaceRootPath], excluded: []);
   }
 }
diff --git a/pkg/analysis_server/test/edit/sort_members_test.dart b/pkg/analysis_server/test/edit/sort_members_test.dart
index 05a3cc1..4ec9a50 100644
--- a/pkg/analysis_server/test/edit/sort_members_test.dart
+++ b/pkg/analysis_server/test/edit/sort_members_test.dart
@@ -3,13 +3,11 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/protocol/protocol_generated.dart';
-import 'package:analysis_server/src/edit/edit_domain.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../analysis_abstract.dart';
-import '../mocks.dart';
+import '../analysis_server_base.dart';
 
 void main() {
   defineReflectiveSuite(() {
@@ -18,14 +16,13 @@
 }
 
 @reflectiveTest
-class SortMembersTest extends AbstractAnalysisTest {
+class SortMembersTest extends PubPackageAnalysisServerTest {
   late SourceFileEdit fileEdit;
 
   @override
   Future<void> setUp() async {
     super.setUp();
-    await createProject();
-    handler = EditDomainHandler(server);
+    await setRoots(included: [workspaceRootPath], excluded: []);
   }
 
   @failingTest
@@ -33,9 +30,12 @@
     // The analysis driver fails to return an error
     var request =
         EditSortMembersParams(convertPath('/no/such/file.dart')).toRequest('0');
-    var response = await waitResponse(request);
-    expect(response,
-        isResponseFailure('0', RequestErrorCode.SORT_MEMBERS_INVALID_FILE));
+    var response = await handleRequest(request);
+    assertResponseFailure(
+      response,
+      requestId: '0',
+      errorCode: RequestErrorCode.INVALID_FILE_PATH_FORMAT,
+    );
   }
 
   Future<void> test_BAD_hasParseError() async {
@@ -44,37 +44,45 @@
   print()
 }
 ''');
-    var request = EditSortMembersParams(testFile).toRequest('0');
-    var response = await waitResponse(request);
-    expect(response,
-        isResponseFailure('0', RequestErrorCode.SORT_MEMBERS_PARSE_ERRORS));
+    var request = EditSortMembersParams(testFile.path).toRequest('0');
+    var response = await handleRequest(request);
+    assertResponseFailure(
+      response,
+      requestId: '0',
+      errorCode: RequestErrorCode.SORT_MEMBERS_PARSE_ERRORS,
+    );
   }
 
   Future<void> test_BAD_notDartFile() async {
     var request = EditSortMembersParams(
       convertPath('/not-a-Dart-file.txt'),
     ).toRequest('0');
-    var response = await waitResponse(request);
-    expect(response,
-        isResponseFailure('0', RequestErrorCode.SORT_MEMBERS_INVALID_FILE));
+    var response = await handleRequest(request);
+    assertResponseFailure(
+      response,
+      requestId: '0',
+      errorCode: RequestErrorCode.SORT_MEMBERS_INVALID_FILE,
+    );
   }
 
   Future<void> test_invalidFilePathFormat_notAbsolute() async {
     var request = EditSortMembersParams('test.dart').toRequest('0');
-    var response = await waitResponse(request);
-    expect(
+    var response = await handleRequest(request);
+    assertResponseFailure(
       response,
-      isResponseFailure('0', RequestErrorCode.INVALID_FILE_PATH_FORMAT),
+      requestId: '0',
+      errorCode: RequestErrorCode.INVALID_FILE_PATH_FORMAT,
     );
   }
 
   Future<void> test_invalidFilePathFormat_notNormalized() async {
     var request = EditSortMembersParams(convertPath('/foo/../bar/test.dart'))
         .toRequest('0');
-    var response = await waitResponse(request);
-    expect(
+    var response = await handleRequest(request);
+    assertResponseFailure(
       response,
-      isResponseFailure('0', RequestErrorCode.INVALID_FILE_PATH_FORMAT),
+      requestId: '0',
+      errorCode: RequestErrorCode.INVALID_FILE_PATH_FORMAT,
     );
   }
 
@@ -195,7 +203,7 @@
   }
 
   Future<void> test_OK_genericFunctionType() async {
-    newAnalysisOptionsYamlFile2(projectPath, '''
+    newAnalysisOptionsYamlFile2(testPackageRootPath, '''
 analyzer:
   strong-mode: true
 ''');
@@ -260,13 +268,13 @@
 
   Future _assertSorted(String expectedCode) async {
     await _requestSort();
-    var resultCode = SourceEdit.applySequence(testCode, fileEdit.edits);
+    var resultCode = SourceEdit.applySequence(testFileContent, fileEdit.edits);
     expect(resultCode, expectedCode);
   }
 
   Future _requestSort() async {
-    var request = EditSortMembersParams(testFile).toRequest('0');
-    var response = await waitResponse(request);
+    var request = EditSortMembersParams(testFile.path).toRequest('0');
+    var response = await handleSuccessfulRequest(request);
     var result = EditSortMembersResult.fromResponse(response);
     fileEdit = result.edit;
   }
diff --git a/pkg/analysis_server/test/edit/statement_completion_test.dart b/pkg/analysis_server/test/edit/statement_completion_test.dart
index fbbff85..6676f45 100644
--- a/pkg/analysis_server/test/edit/statement_completion_test.dart
+++ b/pkg/analysis_server/test/edit/statement_completion_test.dart
@@ -3,13 +3,11 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/protocol/protocol_generated.dart';
-import 'package:analysis_server/src/edit/edit_domain.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../analysis_abstract.dart';
-import '../mocks.dart';
+import '../analysis_server_base.dart';
 
 void main() {
   defineReflectiveSuite(() {
@@ -18,23 +16,23 @@
 }
 
 @reflectiveTest
-class StatementCompletionTest extends AbstractAnalysisTest {
+class StatementCompletionTest extends PubPackageAnalysisServerTest {
   late SourceChange change;
 
   @override
   Future<void> setUp() async {
     super.setUp();
-    await createProject();
-    handler = EditDomainHandler(server);
+    await setRoots(included: [workspaceRootPath], excluded: []);
   }
 
   Future<void> test_invalidFilePathFormat_notAbsolute() async {
     var request =
         EditGetStatementCompletionParams('test.dart', 0).toRequest('0');
-    var response = await waitResponse(request);
-    expect(
+    var response = await handleRequest(request);
+    assertResponseFailure(
       response,
-      isResponseFailure('0', RequestErrorCode.INVALID_FILE_PATH_FORMAT),
+      requestId: '0',
+      errorCode: RequestErrorCode.INVALID_FILE_PATH_FORMAT,
     );
   }
 
@@ -42,10 +40,11 @@
     var request = EditGetStatementCompletionParams(
             convertPath('/foo/../bar/test.dart'), 0)
         .toRequest('0');
-    var response = await waitResponse(request);
-    expect(
+    var response = await handleRequest(request);
+    assertResponseFailure(
       response,
-      isResponseFailure('0', RequestErrorCode.INVALID_FILE_PATH_FORMAT),
+      requestId: '0',
+      errorCode: RequestErrorCode.INVALID_FILE_PATH_FORMAT,
     );
   }
 
@@ -106,7 +105,7 @@
     if (change.message == message) {
       if (change.edits.isNotEmpty) {
         var resultCode =
-            SourceEdit.applySequence(testCode, change.edits[0].edits);
+            SourceEdit.applySequence(testFileContent, change.edits[0].edits);
         expect(resultCode, expectedCode.replaceAll('/*caret*/', ''));
         if (cmp != null) {
           var offset = cmp(resultCode);
@@ -114,7 +113,7 @@
         }
       } else {
         if (cmp != null) {
-          var offset = cmp(testCode);
+          var offset = cmp(testFileContent);
           expect(change.selection!.offset, offset);
         }
       }
@@ -136,8 +135,8 @@
 
   Future<void> _prepareCompletionAt(int offset) async {
     var request =
-        EditGetStatementCompletionParams(testFile, offset).toRequest('0');
-    var response = await waitResponse(request);
+        EditGetStatementCompletionParams(testFile.path, offset).toRequest('0');
+    var response = await handleSuccessfulRequest(request);
     var result = EditGetStatementCompletionResult.fromResponse(response);
     change = result.change;
   }
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index d49cca3..a1acd97 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -2070,6 +2070,9 @@
   /// Return `true` if this parameter was declared with the 'const' modifier.
   bool get isConst;
 
+  /// Indicates whether the parameter has an explicit type.
+  bool get isExplicitlyTyped;
+
   /// Return `true` if this parameter was declared with the 'final' modifier.
   ///
   /// Parameters that are declared with the 'const' modifier will return
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index 1b46725..f1ad356 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -440,12 +440,14 @@
   void _computeVerifyErrors(FileState file, CompilationUnit unit) {
     ErrorReporter errorReporter = _getErrorReporter(file);
 
-    CodeChecker checker = CodeChecker(
-      _typeProvider,
-      _typeSystem,
-      errorReporter,
-    );
-    checker.visitCompilationUnit(unit);
+    if (!unit.featureSet.isEnabled(Feature.non_nullable)) {
+      CodeChecker checker = CodeChecker(
+        _typeProvider,
+        _typeSystem,
+        errorReporter,
+      );
+      checker.visitCompilationUnit(unit);
+    }
 
     //
     // Validate the directives.
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 7c3815a..1a0b64c 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -3127,6 +3127,9 @@
   bool get isConst => _parameter.isConst;
 
   @override
+  bool get isExplicitlyTyped => _parameter.isExplicitlyTyped;
+
+  @override
   bool get isFinal => _parameter.isFinal;
 
   @override
@@ -4438,6 +4441,9 @@
   bool get isConst => keyword?.keyword == Keyword.CONST;
 
   @override
+  bool get isExplicitlyTyped => _parameters != null || _type != null;
+
+  @override
   bool get isFinal => keyword?.keyword == Keyword.FINAL;
 
   @override
@@ -5634,6 +5640,9 @@
   bool get isConst => false;
 
   @override
+  bool get isExplicitlyTyped => true;
+
+  @override
   bool get isFinal => false;
 
   @override
@@ -9524,6 +9533,9 @@
   bool get isConst => keyword?.keyword == Keyword.CONST;
 
   @override
+  bool get isExplicitlyTyped => _type != null;
+
+  @override
   bool get isFinal => keyword?.keyword == Keyword.FINAL;
 
   @override
@@ -10349,6 +10361,9 @@
   bool get isConst => keyword?.keyword == Keyword.CONST;
 
   @override
+  bool get isExplicitlyTyped => _parameters != null || _type != null;
+
+  @override
   bool get isFinal => keyword?.keyword == Keyword.FINAL;
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart b/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
index 84c6754..71e14b9 100644
--- a/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
@@ -361,12 +361,14 @@
   void _computeVerifyErrors(FileState file, CompilationUnit unit) {
     ErrorReporter errorReporter = _getErrorReporter(file);
 
-    CodeChecker checker = CodeChecker(
-      _typeProvider,
-      _typeSystem,
-      errorReporter,
-    );
-    checker.visitCompilationUnit(unit);
+    if (!unit.featureSet.isEnabled(Feature.non_nullable)) {
+      CodeChecker checker = CodeChecker(
+        _typeProvider,
+        _typeSystem,
+        errorReporter,
+      );
+      checker.visitCompilationUnit(unit);
+    }
 
     //
     // Validate the directives.
diff --git a/pkg/analyzer/lib/src/error/codes.g.dart b/pkg/analyzer/lib/src/error/codes.g.dart
index 64e21e7..8ed76794 100644
--- a/pkg/analyzer/lib/src/error/codes.g.dart
+++ b/pkg/analyzer/lib/src/error/codes.g.dart
@@ -7688,6 +7688,8 @@
    * Parameters:
    * 0: the type of the function
    * 1: the expected function type
+   *
+   * This error is only reported in libraries which are not null safe.
    */
   static const CompileTimeErrorCode INVALID_CAST_FUNCTION =
       CompileTimeErrorCode(
@@ -7700,6 +7702,8 @@
    * Parameters:
    * 0: the type of the torn-off function expression
    * 1: the expected function type
+   *
+   * This error is only reported in libraries which are not null safe.
    */
   static const CompileTimeErrorCode INVALID_CAST_FUNCTION_EXPR =
       CompileTimeErrorCode(
@@ -7713,6 +7717,8 @@
    * Parameters:
    * 0: the type of the literal
    * 1: the expected type
+   *
+   * This error is only reported in libraries which are not null safe.
    */
   static const CompileTimeErrorCode INVALID_CAST_LITERAL = CompileTimeErrorCode(
     'INVALID_CAST_LITERAL',
@@ -7723,6 +7729,8 @@
    * Parameters:
    * 0: the type of the list literal
    * 1: the expected type
+   *
+   * This error is only reported in libraries which are not null safe.
    */
   static const CompileTimeErrorCode INVALID_CAST_LITERAL_LIST =
       CompileTimeErrorCode(
@@ -7736,6 +7744,8 @@
    * Parameters:
    * 0: the type of the map literal
    * 1: the expected type
+   *
+   * This error is only reported in libraries which are not null safe.
    */
   static const CompileTimeErrorCode INVALID_CAST_LITERAL_MAP =
       CompileTimeErrorCode(
@@ -7749,6 +7759,8 @@
    * Parameters:
    * 0: the type of the set literal
    * 1: the expected type
+   *
+   * This error is only reported in libraries which are not null safe.
    */
   static const CompileTimeErrorCode INVALID_CAST_LITERAL_SET =
       CompileTimeErrorCode(
@@ -7762,6 +7774,8 @@
    * Parameters:
    * 0: the type of the torn-off method
    * 1: the expected function type
+   *
+   * This error is only reported in libraries which are not null safe.
    */
   static const CompileTimeErrorCode INVALID_CAST_METHOD = CompileTimeErrorCode(
     'INVALID_CAST_METHOD',
@@ -7774,6 +7788,8 @@
    * Parameters:
    * 0: the type of the instantiated object
    * 1: the expected type
+   *
+   * This error is only reported in libraries which are not null safe.
    */
   static const CompileTimeErrorCode INVALID_CAST_NEW_EXPR =
       CompileTimeErrorCode(
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 0f87a11..b757ae5 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -73,6 +73,7 @@
 import 'package:analyzer/src/generated/this_access_tracker.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/generated/variable_type_provider.dart';
+import 'package:analyzer/src/task/inference_error.dart';
 import 'package:analyzer/src/util/ast_data_extractor.dart';
 import 'package:meta/meta.dart';
 
@@ -2488,6 +2489,7 @@
           isLate: parent.isLate,
           isImplicitlyTyped: declaredType == null);
     }
+    _checkTopLevelCycle(node);
   }
 
   @override
@@ -2537,6 +2539,27 @@
     _yieldStatementResolver.resolve(node);
   }
 
+  void _checkTopLevelCycle(VariableDeclaration node) {
+    var element = node.declaredElement;
+    if (element is! PropertyInducingElementImpl) {
+      return;
+    }
+    // Errors on const are reported separately with
+    // [CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT].
+    if (element.isConst) {
+      return;
+    }
+    var error = element.typeInferenceError;
+    if (error == null) {
+      return;
+    }
+    if (error.kind == TopLevelInferenceErrorKind.dependencyCycle) {
+      var argumentsText = error.arguments.join(', ');
+      errorReporter.reportErrorForNode(CompileTimeErrorCode.TOP_LEVEL_CYCLE,
+          node.name, [node.name.name, argumentsText]);
+    }
+  }
+
   /// Creates a union of `T | Future<T>`, unless `T` is already a
   /// future-union, in which case it simply returns `T`.
   DartType _createFutureOr(DartType type) {
diff --git a/pkg/analyzer/lib/src/task/strong/checker.dart b/pkg/analyzer/lib/src/task/strong/checker.dart
index 7c2569f..8c0dcc9 100644
--- a/pkg/analyzer/lib/src/task/strong/checker.dart
+++ b/pkg/analyzer/lib/src/task/strong/checker.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
@@ -13,11 +12,9 @@
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
-import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/error/codes.dart' show CompileTimeErrorCode;
-import 'package:analyzer/src/task/inference_error.dart';
 
 Element? _getKnownElement(Expression expression) {
   if (expression is ParenthesizedExpression) {
@@ -34,25 +31,15 @@
   return null;
 }
 
-/// Checks the body of functions and properties.
+/// Checks the body of functions and properties for implicit cast errors in
+/// pre-null safe libraries.
 class CodeChecker extends RecursiveAstVisitor {
   final TypeSystemImpl _typeSystem;
   final TypeProvider _typeProvider;
   final ErrorReporter _errorReporter;
 
-  late final FeatureSet _featureSet;
-
   CodeChecker(this._typeProvider, this._typeSystem, this._errorReporter);
 
-  bool get _isNonNullableByDefault =>
-      _featureSet.isEnabled(Feature.non_nullable);
-
-  NullabilitySuffix get _noneOrStarSuffix {
-    return _isNonNullableByDefault
-        ? NullabilitySuffix.none
-        : NullabilitySuffix.star;
-  }
-
   void checkArgument(Expression arg, DartType expectedType) {
     // Preserve named argument structure, so their immediate parent is the
     // method invocation.
@@ -172,7 +159,6 @@
 
   @override
   void visitCompilationUnit(CompilationUnit node) {
-    _featureSet = node.featureSet;
     node.visitChildren(this);
   }
 
@@ -386,28 +372,6 @@
   }
 
   @override
-  void visitVariableDeclaration(VariableDeclaration node) {
-    var element = node.declaredElement;
-    if (element is PropertyInducingElementImpl) {
-      var error = element.typeInferenceError;
-      if (error != null) {
-        if (error.kind == TopLevelInferenceErrorKind.dependencyCycle) {
-          // Errors on const should have been reported with
-          // [CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT].
-          if (!element.isConst) {
-            _recordMessage(
-              node.name,
-              CompileTimeErrorCode.TOP_LEVEL_CYCLE,
-              [element.name, error.arguments],
-            );
-          }
-        }
-      }
-    }
-    node.visitChildren(this);
-  }
-
-  @override
   void visitVariableDeclarationList(VariableDeclarationList node) {
     var type = node.type;
     if (type != null) {
@@ -520,10 +484,6 @@
       bool forSpread = false,
       bool forSpreadKey = false,
       bool forSpreadValue = false}) {
-    if (_isNonNullableByDefault) {
-      return;
-    }
-
     expr = expr.unParenthesized;
     if (_needsImplicitCast(expr, to: to, from: from) == true) {
       _recordImplicitCast(expr, to,
@@ -627,7 +587,7 @@
         // Ensure it's at least a Stream / Iterable.
         return expectedElement.instantiate(
           typeArguments: [_typeProvider.dynamicType],
-          nullabilitySuffix: _noneOrStarSuffix,
+          nullabilitySuffix: NullabilitySuffix.star,
         );
       } else {
         // Analyzer will provide a separate error if expected type
@@ -836,7 +796,7 @@
     if (elementType == null) {
       var sequenceType = sequenceElement.instantiate(
         typeArguments: [_typeProvider.dynamicType],
-        nullabilitySuffix: _noneOrStarSuffix,
+        nullabilitySuffix: NullabilitySuffix.star,
       );
 
       if (_typeSystem.isSubtypeOf(sequenceType, iterableType)) {
diff --git a/pkg/analyzer/messages.yaml b/pkg/analyzer/messages.yaml
index 372e4e8..dbddb54 100644
--- a/pkg/analyzer/messages.yaml
+++ b/pkg/analyzer/messages.yaml
@@ -6771,48 +6771,64 @@
       Parameters:
       0: the type of the function
       1: the expected function type
+
+      This error is only reported in libraries which are not null safe.
   INVALID_CAST_FUNCTION_EXPR:
     problemMessage: "The function expression type '{0}' isn't of type '{1}'. This means its parameter or return type doesn't match what is expected. Consider changing parameter type(s) or the returned type(s)."
     comment: |-
       Parameters:
       0: the type of the torn-off function expression
       1: the expected function type
+
+      This error is only reported in libraries which are not null safe.
   INVALID_CAST_LITERAL:
     problemMessage: "The literal '{0}' with type '{1}' isn't of expected type '{2}'."
     comment: |-
       Parameters:
       0: the type of the literal
       1: the expected type
+
+      This error is only reported in libraries which are not null safe.
   INVALID_CAST_LITERAL_LIST:
     problemMessage: "The list literal type '{0}' isn't of expected type '{1}'. The list's type can be changed with an explicit generic type argument or by changing the element types."
     comment: |-
       Parameters:
       0: the type of the list literal
       1: the expected type
+
+      This error is only reported in libraries which are not null safe.
   INVALID_CAST_LITERAL_MAP:
     problemMessage: "The map literal type '{0}' isn't of expected type '{1}'. The map's type can be changed with an explicit generic type arguments or by changing the key and value types."
     comment: |-
       Parameters:
       0: the type of the map literal
       1: the expected type
+
+      This error is only reported in libraries which are not null safe.
   INVALID_CAST_LITERAL_SET:
     problemMessage: "The set literal type '{0}' isn't of expected type '{1}'. The set's type can be changed with an explicit generic type argument or by changing the element types."
     comment: |-
       Parameters:
       0: the type of the set literal
       1: the expected type
+
+      This error is only reported in libraries which are not null safe.
   INVALID_CAST_METHOD:
     problemMessage: "The method tear-off '{0}' has type '{1}' that isn't of expected type '{2}'. This means its parameter or return type doesn't match what is expected."
     comment: |-
       Parameters:
       0: the type of the torn-off method
       1: the expected function type
+
+      This error is only reported in libraries which are not null safe.
   INVALID_CAST_NEW_EXPR:
     problemMessage: "The constructor returns type '{0}' that isn't of expected type '{1}'."
     comment: |-
       Parameters:
       0: the type of the instantiated object
       1: the expected type
+
+      This error is only reported in libraries which are not null safe.
   INVALID_CONSTANT:
     problemMessage: Invalid constant value.
     comment: |-
diff --git a/pkg/analyzer/test/dart/ast/ast_test.dart b/pkg/analyzer/test/dart/ast/ast_test.dart
index a29e78d..b1e5cca 100644
--- a/pkg/analyzer/test/dart/ast/ast_test.dart
+++ b/pkg/analyzer/test/dart/ast/ast_test.dart
@@ -23,6 +23,7 @@
     defineReflectiveTests(ClassTypeAliasTest);
     defineReflectiveTests(ConstructorDeclarationTest);
     defineReflectiveTests(FieldFormalParameterTest);
+    defineReflectiveTests(FormalParameterIsExplicitlyTypedTest);
     defineReflectiveTests(IndexExpressionTest);
     defineReflectiveTests(InterpolationStringTest);
     defineReflectiveTests(MethodDeclarationTest);
@@ -240,6 +241,417 @@
 }
 
 @reflectiveTest
+class FormalParameterIsExplicitlyTypedTest extends ParserTestCase {
+  test_field_functionTyped_explicitReturn() {
+    _checkExplicitlyTyped('''
+class C {
+  C(int this.x());
+  final Object x;
+}
+''', true);
+  }
+
+  test_field_functionTyped_explicitReturn_default() {
+    _checkExplicitlyTyped('''
+class C {
+  C([int this.x() = y]);
+  final Object x;
+}
+''', true);
+  }
+
+  test_field_functionTyped_explicitReturn_named() {
+    _checkExplicitlyTyped('''
+class C {
+  C({required int this.x()});
+  final Object x;
+}
+''', true);
+  }
+
+  test_field_functionTyped_explicitReturn_named_default() {
+    _checkExplicitlyTyped('''
+class C {
+  C({int this.x() = y});
+  final Object x;
+}
+''', true);
+  }
+
+  test_field_functionTyped_implicitReturn() {
+    _checkExplicitlyTyped('''
+class C {
+  C(this.x());
+  final Object x;
+}
+''', true);
+  }
+
+  test_field_functionTyped_implicitReturn_default() {
+    _checkExplicitlyTyped('''
+class C {
+  C([this.x() = y]);
+  final Object x;
+}
+''', true);
+  }
+
+  test_field_functionTyped_implicitReturn_named() {
+    _checkExplicitlyTyped('''
+class C {
+  C({required this.x()});
+  final Object x;
+}
+''', true);
+  }
+
+  test_field_functionTyped_implicitReturn_named_default() {
+    _checkExplicitlyTyped('''
+class C {
+  C({this.x() = y});
+  final Object x;
+}
+''', true);
+  }
+
+  test_field_simple_explicit() {
+    _checkExplicitlyTyped('''
+class C {
+  C(int this.x);
+  final Object x;
+}
+''', true);
+  }
+
+  test_field_simple_explicit_default() {
+    _checkExplicitlyTyped('''
+class C {
+  C([int this.x = y]);
+  final Object x;
+}
+''', true);
+  }
+
+  test_field_simple_explicit_named() {
+    _checkExplicitlyTyped('''
+class C {
+  C({int? this.x});
+  final Object? x;
+}
+''', true);
+  }
+
+  test_field_simple_explicit_named_default() {
+    _checkExplicitlyTyped('''
+class C {
+  C({int this.x = y});
+  final Object x;
+}
+''', true);
+  }
+
+  test_field_simple_implicit() {
+    _checkExplicitlyTyped('''
+class C {
+  C(this.x);
+  final Object x;
+}
+''', false);
+  }
+
+  test_field_simple_implicit_default() {
+    _checkExplicitlyTyped('''
+class C {
+  C([this.x = y]);
+  final Object x;
+}
+''', false);
+  }
+
+  test_field_simple_implicit_named() {
+    _checkExplicitlyTyped('''
+class C {
+  C({this.x});
+  final Object? x;
+}
+''', false);
+  }
+
+  test_field_simple_implicit_named_default() {
+    _checkExplicitlyTyped('''
+class C {
+  C({this.x = y});
+  final Object x;
+}
+''', false);
+  }
+
+  test_functionTyped_explicitReturn() {
+    _checkExplicitlyTyped('''
+class C {
+  C(int x());
+}
+''', true);
+  }
+
+  test_functionTyped_explicitReturn_default() {
+    _checkExplicitlyTyped('''
+class C {
+  C([int x() = y]);
+}
+''', true);
+  }
+
+  test_functionTyped_explicitReturn_named() {
+    _checkExplicitlyTyped('''
+class C {
+  C({required int x()});
+}
+''', true);
+  }
+
+  test_functionTyped_explicitReturn_named_default() {
+    _checkExplicitlyTyped('''
+class C {
+  C({int x() = y});
+}
+''', true);
+  }
+
+  test_functionTyped_implicitReturn() {
+    _checkExplicitlyTyped('''
+class C {
+  C(x());
+}
+''', true);
+  }
+
+  test_functionTyped_implicitReturn_default() {
+    _checkExplicitlyTyped('''
+class C {
+  C([x() = y]);
+}
+''', true);
+  }
+
+  test_functionTyped_implicitReturn_named() {
+    _checkExplicitlyTyped('''
+class C {
+  C({required x()});
+}
+''', true);
+  }
+
+  test_functionTyped_implicitReturn_named_default() {
+    _checkExplicitlyTyped('''
+class C {
+  C({x() = y});
+}
+''', true);
+  }
+
+  test_simple_explicit() {
+    _checkExplicitlyTyped('''
+class C {
+  C(int x);
+}
+''', true);
+  }
+
+  test_simple_explicit_default() {
+    _checkExplicitlyTyped('''
+class C {
+  C([int x = y]);
+}
+''', true);
+  }
+
+  test_simple_explicit_named() {
+    _checkExplicitlyTyped('''
+class C {
+  C({int? x});
+}
+''', true);
+  }
+
+  test_simple_explicit_named_default() {
+    _checkExplicitlyTyped('''
+class C {
+  C({int x = y});
+}
+''', true);
+  }
+
+  test_simple_implicit() {
+    _checkExplicitlyTyped('''
+class C {
+  C(x);
+}
+''', false);
+  }
+
+  test_simple_implicit_default() {
+    _checkExplicitlyTyped('''
+class C {
+  C([x = y]);
+}
+''', false);
+  }
+
+  test_simple_implicit_named() {
+    _checkExplicitlyTyped('''
+class C {
+  C({x});
+}
+''', false);
+  }
+
+  test_simple_implicit_named_default() {
+    _checkExplicitlyTyped('''
+class C {
+  C({x = y});
+}
+''', false);
+  }
+
+  test_super_functionTyped_explicitReturn() {
+    _checkExplicitlyTyped('''
+class C extends B {
+  C(int super.x());
+}
+''', true);
+  }
+
+  test_super_functionTyped_explicitReturn_default() {
+    _checkExplicitlyTyped('''
+class C extends B {
+  C([int super.x() = y]);
+}
+''', true);
+  }
+
+  test_super_functionTyped_explicitReturn_named() {
+    _checkExplicitlyTyped('''
+class C extends B {
+  C({required int super.x()});
+}
+''', true);
+  }
+
+  test_super_functionTyped_explicitReturn_named_default() {
+    _checkExplicitlyTyped('''
+class C extends B {
+  C({int super.x() = y});
+}
+''', true);
+  }
+
+  test_super_functionTyped_implicitReturn() {
+    _checkExplicitlyTyped('''
+class C extends B {
+  C(super.x());
+}
+''', true);
+  }
+
+  test_super_functionTyped_implicitReturn_default() {
+    _checkExplicitlyTyped('''
+class C extends B {
+  C([super.x() = y]);
+}
+''', true);
+  }
+
+  test_super_functionTyped_implicitReturn_named() {
+    _checkExplicitlyTyped('''
+class C extends B {
+  C({required super.x()});
+}
+''', true);
+  }
+
+  test_super_functionTyped_implicitReturn_named_default() {
+    _checkExplicitlyTyped('''
+class C extends B {
+  C({super.x() = y});
+}
+''', true);
+  }
+
+  test_super_simple_explicit() {
+    _checkExplicitlyTyped('''
+class C extends B {
+  C(int super.x);
+}
+''', true);
+  }
+
+  test_super_simple_explicit_default() {
+    _checkExplicitlyTyped('''
+class C extends B {
+  C([int super.x = y]);
+}
+''', true);
+  }
+
+  test_super_simple_explicit_named() {
+    _checkExplicitlyTyped('''
+class C extends B {
+  C({int? super.x});
+}
+''', true);
+  }
+
+  test_super_simple_explicit_named_default() {
+    _checkExplicitlyTyped('''
+class C extends B {
+  C({int super.x = y});
+}
+''', true);
+  }
+
+  test_super_simple_implicit() {
+    _checkExplicitlyTyped('''
+class C extends B {
+  C(super.x);
+}
+''', false);
+  }
+
+  test_super_simple_implicit_default() {
+    _checkExplicitlyTyped('''
+class C extends B {
+  C([super.x = y]);
+}
+''', false);
+  }
+
+  test_super_simple_implicit_named() {
+    _checkExplicitlyTyped('''
+class C extends B {
+  C({super.x});
+}
+''', false);
+  }
+
+  test_super_simple_implicit_named_default() {
+    _checkExplicitlyTyped('''
+class C extends B {
+  C({super.x = y});
+}
+''', false);
+  }
+
+  void _checkExplicitlyTyped(String input, bool expected) {
+    var parseResult = parseString(content: input);
+    var class_ = parseResult.unit.declarations[0] as ClassDeclaration;
+    var constructor = class_.members[0] as ConstructorDeclaration;
+    var parameter = constructor.parameters.parameters[0];
+    expect(parameter.isExplicitlyTyped, expected);
+  }
+}
+
+@reflectiveTest
 class IndexExpressionTest extends _AstTest {
   void test_inGetterContext_assignment_compound_left() {
     IndexExpression expression = AstTestFactory.indexExpression(
diff --git a/pkg/compiler/lib/src/ir/impact.dart b/pkg/compiler/lib/src/ir/impact.dart
index 0fb8cf4..b3fbc69 100644
--- a/pkg/compiler/lib/src/ir/impact.dart
+++ b/pkg/compiler/lib/src/ir/impact.dart
@@ -177,10 +177,8 @@
       List<String> namedArguments,
       List<ir.DartType> typeArguments);
 
-  // TODO(johnniwinther): Change [node] to `InstanceGet` when the old method
-  // invocation encoding is no longer used.
-  void registerRuntimeTypeUse(ir.Expression node, RuntimeTypeUseKind kind,
-      ir.DartType receiverType, ir.DartType argumentType);
+  void registerRuntimeTypeUse(RuntimeTypeUseKind kind, ir.DartType receiverType,
+      ir.DartType argumentType);
 
   void registerConstructorNode(ir.Constructor node);
   void registerFieldNode(ir.Field node);
diff --git a/pkg/compiler/lib/src/ir/impact_data.dart b/pkg/compiler/lib/src/ir/impact_data.dart
index 96fe2ed..1d9aefd 100644
--- a/pkg/compiler/lib/src/ir/impact_data.dart
+++ b/pkg/compiler/lib/src/ir/impact_data.dart
@@ -14,6 +14,7 @@
 import '../elements/types.dart';
 import '../ir/scope.dart';
 import '../kernel/element_map.dart';
+import '../options.dart';
 import '../serialization/serialization.dart';
 import '../util/enumset.dart';
 import 'constants.dart';
@@ -57,6 +58,8 @@
   String _typeToString(DartType type) =>
       type.toStructuredText(_elementMap.types, _elementMap.options);
 
+  CompilerOptions get _options => _elementMap.options;
+
   /// Return the named arguments names as a list of strings.
   List<String> _getNamedArguments(ir.Arguments arguments) =>
       arguments.named.map((n) => n.name).toList();
@@ -551,12 +554,23 @@
     return super.visitSwitchStatement(node);
   }
 
-  // TODO(johnniwinther): Change [node] `InstanceGet` when the old method
-  // invocation encoding is no longer used.
   @override
   void handleRuntimeTypeUse(ir.Expression node, RuntimeTypeUseKind kind,
       ir.DartType receiverType, ir.DartType argumentType) {
-    registerRuntimeTypeUse(node, kind, receiverType, argumentType);
+    if (_options.omitImplicitChecks) {
+      switch (kind) {
+        case RuntimeTypeUseKind.string:
+          if (!_options.laxRuntimeTypeToString) {
+            _reporter.reportHintMessage(computeSourceSpanFromTreeNode(node),
+                MessageKind.RUNTIME_TYPE_TO_STRING);
+          }
+          break;
+        case RuntimeTypeUseKind.equals:
+        case RuntimeTypeUseKind.unknown:
+          break;
+      }
+    }
+    registerRuntimeTypeUse(kind, receiverType, argumentType);
   }
 
   @override
@@ -952,14 +966,12 @@
     _data._intLiterals.add(value);
   }
 
-  // TODO(johnniwinther): Change [node] `InstanceGet` when the old method
-  // invocation encoding is no longer used.
   @override
-  void registerRuntimeTypeUse(ir.Expression node, RuntimeTypeUseKind kind,
-      ir.DartType receiverType, ir.DartType argumentType) {
+  void registerRuntimeTypeUse(RuntimeTypeUseKind kind, ir.DartType receiverType,
+      ir.DartType argumentType) {
     _data._runtimeTypeUses ??= [];
     _data._runtimeTypeUses
-        .add(_RuntimeTypeUse(node, kind, receiverType, argumentType));
+        .add(_RuntimeTypeUse(kind, receiverType, argumentType));
   }
 
   @override
@@ -1520,7 +1532,7 @@
     if (_runtimeTypeUses != null) {
       for (_RuntimeTypeUse data in _runtimeTypeUses) {
         registry.registerRuntimeTypeUse(
-            data.node, data.kind, data.receiverType, data.argumentType);
+            data.kind, data.receiverType, data.argumentType);
       }
     }
     if (_forInData != null) {
@@ -2094,28 +2106,23 @@
 class _RuntimeTypeUse {
   static const String tag = '_RuntimeTypeUse';
 
-  // TODO(johnniwinther): Change [node] `InstanceGet` when the old method
-  // invocation encoding is no longer used.
-  final ir.Expression node;
   final RuntimeTypeUseKind kind;
   final ir.DartType receiverType;
   final ir.DartType argumentType;
 
-  _RuntimeTypeUse(this.node, this.kind, this.receiverType, this.argumentType);
+  _RuntimeTypeUse(this.kind, this.receiverType, this.argumentType);
 
   factory _RuntimeTypeUse.fromDataSource(DataSourceReader source) {
     source.begin(tag);
-    ir.TreeNode node = source.readTreeNode();
     RuntimeTypeUseKind kind = source.readEnum(RuntimeTypeUseKind.values);
     ir.DartType receiverType = source.readDartTypeNode();
     ir.DartType argumentType = source.readDartTypeNode(allowNull: true);
     source.end(tag);
-    return _RuntimeTypeUse(node, kind, receiverType, argumentType);
+    return _RuntimeTypeUse(kind, receiverType, argumentType);
   }
 
   void toDataSink(DataSinkWriter sink) {
     sink.begin(tag);
-    sink.writeTreeNode(node);
     sink.writeEnum(kind);
     sink.writeDartTypeNode(receiverType);
     sink.writeDartTypeNode(argumentType, allowNull: true);
diff --git a/pkg/compiler/lib/src/kernel/kernel_impact.dart b/pkg/compiler/lib/src/kernel/kernel_impact.dart
index 3756ddd..85119ca 100644
--- a/pkg/compiler/lib/src/kernel/kernel_impact.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_impact.dart
@@ -633,29 +633,13 @@
         const <DartType>[]));
   }
 
-  // TODO(johnniwinther): Change [node] `InstanceGet` when the old method
-  // invocation encoding is no longer used.
   @override
-  void registerRuntimeTypeUse(ir.Expression node, RuntimeTypeUseKind kind,
-      ir.DartType receiverType, ir.DartType argumentType) {
+  void registerRuntimeTypeUse(RuntimeTypeUseKind kind, ir.DartType receiverType,
+      ir.DartType argumentType) {
     DartType receiverDartType = elementMap.getDartType(receiverType);
     DartType argumentDartType =
         argumentType == null ? null : elementMap.getDartType(argumentType);
 
-    if (_options.omitImplicitChecks) {
-      switch (kind) {
-        case RuntimeTypeUseKind.string:
-          if (!_options.laxRuntimeTypeToString) {
-            reporter.reportHintMessage(computeSourceSpanFromTreeNode(node),
-                MessageKind.RUNTIME_TYPE_TO_STRING);
-          }
-          break;
-        case RuntimeTypeUseKind.equals:
-        case RuntimeTypeUseKind.unknown:
-          break;
-      }
-    }
-
     // Enable runtime type support if we discover a getter called
     // runtimeType. We have to enable runtime type before hitting the
     // codegen, so that constructors know whether they need to generate code
diff --git a/pkg/compiler/test/impact/impact_test.dart b/pkg/compiler/test/impact/impact_test.dart
index ff5ed69..cbddfb8 100644
--- a/pkg/compiler/test/impact/impact_test.dart
+++ b/pkg/compiler/test/impact/impact_test.dart
@@ -94,8 +94,8 @@
   ImpactDataGoldener(this.elementMap, this.features);
 
   @override
-  void registerRuntimeTypeUse(ir.Expression node, RuntimeTypeUseKind kind,
-      ir.DartType receiverType, ir.DartType argumentType) {
+  void registerRuntimeTypeUse(RuntimeTypeUseKind kind, ir.DartType receiverType,
+      ir.DartType argumentType) {
     final runtimeTypeUse = RuntimeTypeUse(
         kind,
         elementMap.getDartType(receiverType),
diff --git a/pkg/front_end/test/macros/incremental/data/tests/in_body_change.0.dart.expect b/pkg/front_end/test/macros/incremental/data/tests/in_body_change.0.dart.expect
index 469fe1a..8ef2bdf 100644
--- a/pkg/front_end/test/macros/incremental/data/tests/in_body_change.0.dart.expect
+++ b/pkg/front_end/test/macros/incremental/data/tests/in_body_change.0.dart.expect
@@ -18,5 +18,5 @@
 }
 
 constants  {
-  #C1 = #lib1::ToStringMacro {}
+  #C1 = mac::ToStringMacro {}
 }
diff --git a/pkg/front_end/test/macros/incremental/data/tests/inject_macro.0.dart.expect b/pkg/front_end/test/macros/incremental/data/tests/inject_macro.0.dart.expect
index a288219..af9b833 100644
--- a/pkg/front_end/test/macros/incremental/data/tests/inject_macro.0.dart.expect
+++ b/pkg/front_end/test/macros/incremental/data/tests/inject_macro.0.dart.expect
@@ -15,5 +15,5 @@
 }
 
 constants  {
-  #C1 = #lib1::InjectMacro {}
+  #C1 = mac::InjectMacro {}
 }
diff --git a/pkg/front_end/test/macros/incremental/data/tests/user_macro/main.0.dart.expect b/pkg/front_end/test/macros/incremental/data/tests/user_macro/main.0.dart.expect
index 9872609..acaa421 100644
--- a/pkg/front_end/test/macros/incremental/data/tests/user_macro/main.0.dart.expect
+++ b/pkg/front_end/test/macros/incremental/data/tests/user_macro/main.0.dart.expect
@@ -49,5 +49,5 @@
 
 constants  {
   #C1 = mac::MethodMacro {}
-  #C2 = dart.core::_Override {}
+  #C2 = core::_Override {}
 }
diff --git a/pkg/front_end/test/macros/incremental/incremental_macro_test.dart b/pkg/front_end/test/macros/incremental/incremental_macro_test.dart
index 1c5ba4b..b703dfc 100644
--- a/pkg/front_end/test/macros/incremental/incremental_macro_test.dart
+++ b/pkg/front_end/test/macros/incremental/incremental_macro_test.dart
@@ -102,12 +102,12 @@
 
   await CompilerContext.runWithOptions(processedOptions,
       (CompilerContext context) async {
-    IncrementalCompiler compiler = new IncrementalCompiler(context);
     for (Test test in tests.values) {
       if (args.isNotEmpty && !args.contains(test.name)) {
         print('Skipped ${test.name}');
         continue;
       }
+      IncrementalCompiler compiler = new IncrementalCompiler(context);
       Uri entryPoint = test.entryPoint;
       for (TestUpdate update in test.updates) {
         print('Running ${test.name} update ${update.index}');
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index bba74ca..5b5e706 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -142,6 +142,7 @@
 dart/hash_map_probes_limit_test: SkipSlow # Test includes large program compilation.
 dart/minimal_kernel_test: SkipSlow # gen_kernel is too slow in debug mode
 dart/null_safety_autodetection_in_kernel_compiler_test: SkipSlow # gen_kernel is too slow in debug mode
+dart/regress47472_test: Pass, Slow # Slow due to throwing 1 million exceptions.
 dart/spawn_shutdown_test: Pass, Slow # VM Shutdown test, It can take some time for all the isolates to shutdown in a Debug build.
 dart/type_casts_with_null_safety_autodetection_test: Pass, Slow # Very slow in debug mode, uses --optimization-counter-threshold=10
 dart_2/appjit_cha_deopt_test: Pass, Slow # Quite slow in debug mode, uses --optimization-counter-threshold=100
@@ -149,6 +150,7 @@
 dart_2/hash_map_probes_limit_test: SkipSlow # Test includes large program compilation.
 dart_2/minimal_kernel_test: SkipSlow # gen_kernel is too slow in debug mode
 dart_2/null_safety_autodetection_in_kernel_compiler_test: SkipSlow # gen_kernel is too slow in debug mode
+dart_2/regress47472_test: Pass, Slow # Slow due to throwing 1 million exceptions.
 dart_2/spawn_shutdown_test: Pass, Slow # VM Shutdown test, It can take some time for all the isolates to shutdown in a Debug build.
 
 [ $mode == product ]
diff --git a/tests/language/call/evaluation_order_lib.dart b/tests/language/call/evaluation_order_lib.dart
new file mode 100644
index 0000000..dd06624
--- /dev/null
+++ b/tests/language/call/evaluation_order_lib.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Used from 'evaluation_order_test.dart'.
+
+import 'evaluation_order_test.dart';
+
+get arg => argumentEffect();
+
+void Function(void) get m {
+  getterEffect();
+  return (_) {};
+}
diff --git a/tests/language/call/evaluation_order_test.dart b/tests/language/call/evaluation_order_test.dart
new file mode 100644
index 0000000..5d88df7
--- /dev/null
+++ b/tests/language/call/evaluation_order_test.dart
@@ -0,0 +1,115 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test tests the evaluation order in the case where a function
+// invocation `m(a)` or `r.m(a)` involves the invocation of a getter `m`
+// that returns a function object, and that function object is invoked
+// with an actual argument `arg`.
+//
+// The expectation is that evaluation occurs left-to-right in every case,
+// with one exception: when `m` is a class instance getter (this does not
+// even apply to extension instance getters) the actual argument list is
+// evaluated before the getter.
+
+import 'package:expect/expect.dart';
+import 'evaluation_order_lib.dart' as lib;
+
+String effects = '';
+
+void clearEffects() {
+  effects = '';
+}
+
+void getterEffect() {
+  effects += 'G';
+}
+
+void argumentEffect() {
+  effects += 'A';
+}
+
+get arg => argumentEffect();
+
+class A {
+  void Function(void) get m {
+    getterEffect();
+    return (_) {};
+  }
+
+  static void Function(void) get n {
+    getterEffect();
+    return (_) {};
+  }
+}
+
+class B extends A {
+  void doTest() {
+    test('Instance getter on explicit this', 'AG', () => this.m(arg));
+    test('Instance getter on implicit this', 'GA', () => m(arg));
+    test('Instance getter on super', 'GA', () => super.m(arg));
+  }
+}
+
+mixin M on A {
+  void doTest() {
+    test('Instance getter on explicit this', 'AG', () => this.m(arg));
+    test('Instance getter on implicit this', 'GA', () => m(arg));
+    test('Instance getter on super', 'GA', () => super.m(arg));
+  }
+}
+
+class AM = A with M;
+class MockAM = MockA with M;
+
+class MockA implements A {
+  noSuchMethod(Invocation i) {
+    getterEffect();
+    return (_) {};
+  }
+
+  void Function(void) get m;
+}
+
+void Function(void) get m {
+  getterEffect();
+  return (_) {};
+}
+
+extension E on int {
+  void Function(void) get m {
+    getterEffect();
+    return (_) {};
+  }
+
+  static void Function(void) get n {
+    getterEffect();
+    return (_) {};
+  }
+}
+
+void test(String name, String expectation, void Function() code) {
+  clearEffects();
+  code();
+  Expect.equals(expectation, effects, name);
+}
+
+main() {
+  var a = A();
+  dynamic d = a;
+  A mockA = MockA();
+  dynamic mockD = mockA;
+
+  test('Instance getter on A', 'AG', () => a.m(arg));
+  test('Instance getter on dynamic A', 'AG', () => d.m(arg));
+  test('Instance getter on MockA', 'AG', () => mockA.m(arg));
+  test('Instance getter on dynamic MockA', 'AG', () => mockD.m(arg));
+  test('Static getter', 'GA', () => A.n(arg));
+  test('Top-level getter', 'GA', () => m(arg));
+  test('Prefix-imported getter', 'GA', () => lib.m(arg));
+  test('Extension instance getter', 'GA', () => 1.m(arg));
+  test('Extension static getter', 'GA', () => E.n(arg));
+  B().doTest();
+  AM().doTest();
+  MockAM().doTest();
+}
diff --git a/tools/VERSION b/tools/VERSION
index d7ac1d5..fa9e9de 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 18
 PATCH 0
-PRERELEASE 1
+PRERELEASE 2
 PRERELEASE_PATCH 0
\ No newline at end of file
