diff --git a/.github/workflows/test-package.yml b/.github/workflows/test-package.yml
index a949134..1bb0dc4 100644
--- a/.github/workflows/test-package.yml
+++ b/.github/workflows/test-package.yml
@@ -46,7 +46,7 @@
       fail-fast: false
       matrix:
         os: [ubuntu-latest, macos-latest, windows-latest]
-        sdk: [2.15.0, dev]
+        sdk: [2.18.0, dev]
     steps:
       - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b
       - uses: dart-lang/setup-dart@6a218f2413a3e78e9087f638a238f6b40893203d
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 54a205e..660e8a4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 1.6.3-dev
+
+- Require Dart 2.18
+
 ## 1.6.2
 
 - Update `package:vm_service` constraints to '>=9.4.0 <11.0.0'.
diff --git a/analysis_options.yaml b/analysis_options.yaml
index 71eda7f..95df488 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -9,61 +9,15 @@
 
 linter:
   rules:
-    # these rules are documented on and in the same order as
-    # the Dart Lint rules page to make maintenance easier
-    # http://dart-lang.github.io/linter/lints/
-
-    # === error rules ===
-    - avoid_empty_else
-    - avoid_slow_async_io
-    - comment_references
-    - cancel_subscriptions
-    # - close_sinks
-    - control_flow_in_finally
-    - empty_statements
-    - hash_and_equals
-    - iterable_contains_unrelated_type
-    - list_remove_unrelated_type
-    - literal_only_boolean_expressions
-    - test_types_in_equals
-    - throw_in_finally
-    - unrelated_type_equality_checks
-    - valid_regexps
-
-    # === style rules ===
     - always_declare_return_types
-    # - always_specify_types
-    - annotate_overrides
-    - avoid_init_to_null
-    - avoid_return_types_on_setters
-    - await_only_futures
-    - camel_case_types
-    - constant_identifier_names
-    - empty_constructor_bodies
-    - implementation_imports
-    - library_names
-    - library_prefixes
-    - no_leading_underscores_for_local_identifiers
-    - non_constant_identifier_names
-    # - one_member_abstracts
-    # - only_throw_errors
-    - overridden_fields
+    - avoid_slow_async_io
+    - cancel_subscriptions
+    - comment_references
+    - literal_only_boolean_expressions
     - package_api_docs
-    - package_prefixed_library_names
-    - prefer_equal_for_default_values
     - prefer_final_locals
-    - prefer_generic_function_type_aliases
-    - prefer_is_not_empty
-    # - public_member_api_docs
-    - slash_for_doc_comments
     - sort_constructors_first
     - sort_unnamed_constructors_first
-    - type_annotate_public_apis # subset of always_specify_types
-    - type_init_formals
-    - unnecessary_brace_in_string_interps
-    - unnecessary_const
-    - unnecessary_getters_setters
-    - unnecessary_new
-
-    # === pub rules ===
-    - package_names
+    - test_types_in_equals
+    - throw_in_finally
+    - type_annotate_public_apis
diff --git a/pubspec.yaml b/pubspec.yaml
index df9d41d..669466c 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,10 +1,10 @@
 name: coverage
-version: 1.6.2
+version: 1.6.3-dev
 description: Coverage data manipulation and formatting
 repository: https://github.com/dart-lang/coverage
 
 environment:
-  sdk: '>=2.15.0 <3.0.0'
+  sdk: '>=2.18.0 <3.0.0'
 
 dependencies:
   args: ^2.0.0
@@ -18,8 +18,8 @@
 dev_dependencies:
   benchmark_harness: ^2.2.0
   build_runner: ^2.1.10
-  lints: ^1.0.0
-  mockito: ^5.1.0
+  lints: ^2.0.0
+  mockito: ^5.3.2
   test: ^1.16.0
   test_descriptor: ^2.0.0
   test_process: ^2.0.0
diff --git a/test/collect_coverage_mock_test.mocks.dart b/test/collect_coverage_mock_test.mocks.dart
index 4ee0971..5bc6663 100644
--- a/test/collect_coverage_mock_test.mocks.dart
+++ b/test/collect_coverage_mock_test.mocks.dart
@@ -1,7 +1,8 @@
-// Mocks generated by Mockito 5.2.0 from annotations
+// Mocks generated by Mockito 5.3.2 from annotations
 // in coverage/test/collect_coverage_mock_test.dart.
 // Do not manually edit this file.
 
+// ignore_for_file: no_leading_underscores_for_library_prefixes
 import 'dart:async' as _i3;
 
 import 'package:mockito/mockito.dart' as _i1;
@@ -16,63 +17,280 @@
 // ignore_for_file: prefer_const_constructors
 // ignore_for_file: unnecessary_parenthesis
 // ignore_for_file: camel_case_types
+// ignore_for_file: subtype_of_sealed_class
 
-class _FakeBreakpoint_0 extends _i1.Fake implements _i2.Breakpoint {}
+class _FakeBreakpoint_0 extends _i1.SmartFake implements _i2.Breakpoint {
+  _FakeBreakpoint_0(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
 
-class _FakeSuccess_1 extends _i1.Fake implements _i2.Success {}
+class _FakeSuccess_1 extends _i1.SmartFake implements _i2.Success {
+  _FakeSuccess_1(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
 
-class _FakeResponse_2 extends _i1.Fake implements _i2.Response {}
+class _FakeResponse_2 extends _i1.SmartFake implements _i2.Response {
+  _FakeResponse_2(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
 
-class _FakeAllocationProfile_3 extends _i1.Fake
-    implements _i2.AllocationProfile {}
+class _FakeAllocationProfile_3 extends _i1.SmartFake
+    implements _i2.AllocationProfile {
+  _FakeAllocationProfile_3(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
 
-class _FakeCpuSamples_4 extends _i1.Fake implements _i2.CpuSamples {}
+class _FakeCpuSamples_4 extends _i1.SmartFake implements _i2.CpuSamples {
+  _FakeCpuSamples_4(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
 
-class _FakeClassList_5 extends _i1.Fake implements _i2.ClassList {}
+class _FakeClassList_5 extends _i1.SmartFake implements _i2.ClassList {
+  _FakeClassList_5(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
 
-class _FakeFlagList_6 extends _i1.Fake implements _i2.FlagList {}
+class _FakeFlagList_6 extends _i1.SmartFake implements _i2.FlagList {
+  _FakeFlagList_6(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
 
-class _FakeInboundReferences_7 extends _i1.Fake
-    implements _i2.InboundReferences {}
+class _FakeInboundReferences_7 extends _i1.SmartFake
+    implements _i2.InboundReferences {
+  _FakeInboundReferences_7(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
 
-class _FakeInstanceSet_8 extends _i1.Fake implements _i2.InstanceSet {}
+class _FakeInstanceSet_8 extends _i1.SmartFake implements _i2.InstanceSet {
+  _FakeInstanceSet_8(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
 
-class _FakeIsolate_9 extends _i1.Fake implements _i2.Isolate {}
+class _FakeIsolate_9 extends _i1.SmartFake implements _i2.Isolate {
+  _FakeIsolate_9(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
 
-class _FakeIsolateGroup_10 extends _i1.Fake implements _i2.IsolateGroup {}
+class _FakeIsolateGroup_10 extends _i1.SmartFake implements _i2.IsolateGroup {
+  _FakeIsolateGroup_10(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
 
-class _FakeMemoryUsage_11 extends _i1.Fake implements _i2.MemoryUsage {}
+class _FakeMemoryUsage_11 extends _i1.SmartFake implements _i2.MemoryUsage {
+  _FakeMemoryUsage_11(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
 
-class _FakeScriptList_12 extends _i1.Fake implements _i2.ScriptList {}
+class _FakeScriptList_12 extends _i1.SmartFake implements _i2.ScriptList {
+  _FakeScriptList_12(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
 
-class _FakeObj_13 extends _i1.Fake implements _i2.Obj {}
+class _FakeObj_13 extends _i1.SmartFake implements _i2.Obj {
+  _FakeObj_13(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
 
-class _FakePortList_14 extends _i1.Fake implements _i2.PortList {}
+class _FakePortList_14 extends _i1.SmartFake implements _i2.PortList {
+  _FakePortList_14(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
 
-class _FakeRetainingPath_15 extends _i1.Fake implements _i2.RetainingPath {}
+class _FakeRetainingPath_15 extends _i1.SmartFake implements _i2.RetainingPath {
+  _FakeRetainingPath_15(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
 
-class _FakeProcessMemoryUsage_16 extends _i1.Fake
-    implements _i2.ProcessMemoryUsage {}
+class _FakeProcessMemoryUsage_16 extends _i1.SmartFake
+    implements _i2.ProcessMemoryUsage {
+  _FakeProcessMemoryUsage_16(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
 
-class _FakeStack_17 extends _i1.Fake implements _i2.Stack {}
+class _FakeStack_17 extends _i1.SmartFake implements _i2.Stack {
+  _FakeStack_17(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
 
-class _FakeProtocolList_18 extends _i1.Fake implements _i2.ProtocolList {}
+class _FakeProtocolList_18 extends _i1.SmartFake implements _i2.ProtocolList {
+  _FakeProtocolList_18(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
 
-class _FakeSourceReport_19 extends _i1.Fake implements _i2.SourceReport {}
+class _FakeSourceReport_19 extends _i1.SmartFake implements _i2.SourceReport {
+  _FakeSourceReport_19(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
 
-class _FakeVersion_20 extends _i1.Fake implements _i2.Version {}
+class _FakeVersion_20 extends _i1.SmartFake implements _i2.Version {
+  _FakeVersion_20(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
 
-class _FakeVM_21 extends _i1.Fake implements _i2.VM {}
+class _FakeVM_21 extends _i1.SmartFake implements _i2.VM {
+  _FakeVM_21(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
 
-class _FakeTimeline_22 extends _i1.Fake implements _i2.Timeline {}
+class _FakeTimeline_22 extends _i1.SmartFake implements _i2.Timeline {
+  _FakeTimeline_22(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
 
-class _FakeTimelineFlags_23 extends _i1.Fake implements _i2.TimelineFlags {}
+class _FakeTimelineFlags_23 extends _i1.SmartFake implements _i2.TimelineFlags {
+  _FakeTimelineFlags_23(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
 
-class _FakeTimestamp_24 extends _i1.Fake implements _i2.Timestamp {}
+class _FakeTimestamp_24 extends _i1.SmartFake implements _i2.Timestamp {
+  _FakeTimestamp_24(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
 
-class _FakeUriList_25 extends _i1.Fake implements _i2.UriList {}
+class _FakeUriList_25 extends _i1.SmartFake implements _i2.UriList {
+  _FakeUriList_25(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
 
-class _FakeReloadReport_26 extends _i1.Fake implements _i2.ReloadReport {}
+class _FakeReloadReport_26 extends _i1.SmartFake implements _i2.ReloadReport {
+  _FakeReloadReport_26(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
 
 /// A class which mocks [VmService].
 ///
@@ -83,480 +301,1345 @@
   }
 
   @override
-  _i3.Stream<_i2.Event> get onVMEvent =>
-      (super.noSuchMethod(Invocation.getter(#onVMEvent),
-          returnValue: Stream<_i2.Event>.empty()) as _i3.Stream<_i2.Event>);
+  _i3.Stream<_i2.Event> get onVMEvent => (super.noSuchMethod(
+        Invocation.getter(#onVMEvent),
+        returnValue: _i3.Stream<_i2.Event>.empty(),
+      ) as _i3.Stream<_i2.Event>);
   @override
-  _i3.Stream<_i2.Event> get onIsolateEvent =>
-      (super.noSuchMethod(Invocation.getter(#onIsolateEvent),
-          returnValue: Stream<_i2.Event>.empty()) as _i3.Stream<_i2.Event>);
+  _i3.Stream<_i2.Event> get onIsolateEvent => (super.noSuchMethod(
+        Invocation.getter(#onIsolateEvent),
+        returnValue: _i3.Stream<_i2.Event>.empty(),
+      ) as _i3.Stream<_i2.Event>);
   @override
-  _i3.Stream<_i2.Event> get onDebugEvent =>
-      (super.noSuchMethod(Invocation.getter(#onDebugEvent),
-          returnValue: Stream<_i2.Event>.empty()) as _i3.Stream<_i2.Event>);
+  _i3.Stream<_i2.Event> get onDebugEvent => (super.noSuchMethod(
+        Invocation.getter(#onDebugEvent),
+        returnValue: _i3.Stream<_i2.Event>.empty(),
+      ) as _i3.Stream<_i2.Event>);
   @override
-  _i3.Stream<_i2.Event> get onProfilerEvent =>
-      (super.noSuchMethod(Invocation.getter(#onProfilerEvent),
-          returnValue: Stream<_i2.Event>.empty()) as _i3.Stream<_i2.Event>);
+  _i3.Stream<_i2.Event> get onProfilerEvent => (super.noSuchMethod(
+        Invocation.getter(#onProfilerEvent),
+        returnValue: _i3.Stream<_i2.Event>.empty(),
+      ) as _i3.Stream<_i2.Event>);
   @override
-  _i3.Stream<_i2.Event> get onGCEvent =>
-      (super.noSuchMethod(Invocation.getter(#onGCEvent),
-          returnValue: Stream<_i2.Event>.empty()) as _i3.Stream<_i2.Event>);
+  _i3.Stream<_i2.Event> get onGCEvent => (super.noSuchMethod(
+        Invocation.getter(#onGCEvent),
+        returnValue: _i3.Stream<_i2.Event>.empty(),
+      ) as _i3.Stream<_i2.Event>);
   @override
-  _i3.Stream<_i2.Event> get onExtensionEvent =>
-      (super.noSuchMethod(Invocation.getter(#onExtensionEvent),
-          returnValue: Stream<_i2.Event>.empty()) as _i3.Stream<_i2.Event>);
+  _i3.Stream<_i2.Event> get onExtensionEvent => (super.noSuchMethod(
+        Invocation.getter(#onExtensionEvent),
+        returnValue: _i3.Stream<_i2.Event>.empty(),
+      ) as _i3.Stream<_i2.Event>);
   @override
-  _i3.Stream<_i2.Event> get onTimelineEvent =>
-      (super.noSuchMethod(Invocation.getter(#onTimelineEvent),
-          returnValue: Stream<_i2.Event>.empty()) as _i3.Stream<_i2.Event>);
+  _i3.Stream<_i2.Event> get onTimelineEvent => (super.noSuchMethod(
+        Invocation.getter(#onTimelineEvent),
+        returnValue: _i3.Stream<_i2.Event>.empty(),
+      ) as _i3.Stream<_i2.Event>);
   @override
-  _i3.Stream<_i2.Event> get onLoggingEvent =>
-      (super.noSuchMethod(Invocation.getter(#onLoggingEvent),
-          returnValue: Stream<_i2.Event>.empty()) as _i3.Stream<_i2.Event>);
+  _i3.Stream<_i2.Event> get onLoggingEvent => (super.noSuchMethod(
+        Invocation.getter(#onLoggingEvent),
+        returnValue: _i3.Stream<_i2.Event>.empty(),
+      ) as _i3.Stream<_i2.Event>);
   @override
-  _i3.Stream<_i2.Event> get onServiceEvent =>
-      (super.noSuchMethod(Invocation.getter(#onServiceEvent),
-          returnValue: Stream<_i2.Event>.empty()) as _i3.Stream<_i2.Event>);
+  _i3.Stream<_i2.Event> get onServiceEvent => (super.noSuchMethod(
+        Invocation.getter(#onServiceEvent),
+        returnValue: _i3.Stream<_i2.Event>.empty(),
+      ) as _i3.Stream<_i2.Event>);
   @override
-  _i3.Stream<_i2.Event> get onHeapSnapshotEvent =>
-      (super.noSuchMethod(Invocation.getter(#onHeapSnapshotEvent),
-          returnValue: Stream<_i2.Event>.empty()) as _i3.Stream<_i2.Event>);
+  _i3.Stream<_i2.Event> get onHeapSnapshotEvent => (super.noSuchMethod(
+        Invocation.getter(#onHeapSnapshotEvent),
+        returnValue: _i3.Stream<_i2.Event>.empty(),
+      ) as _i3.Stream<_i2.Event>);
   @override
-  _i3.Stream<_i2.Event> get onStdoutEvent =>
-      (super.noSuchMethod(Invocation.getter(#onStdoutEvent),
-          returnValue: Stream<_i2.Event>.empty()) as _i3.Stream<_i2.Event>);
+  _i3.Stream<_i2.Event> get onStdoutEvent => (super.noSuchMethod(
+        Invocation.getter(#onStdoutEvent),
+        returnValue: _i3.Stream<_i2.Event>.empty(),
+      ) as _i3.Stream<_i2.Event>);
   @override
-  _i3.Stream<_i2.Event> get onStderrEvent =>
-      (super.noSuchMethod(Invocation.getter(#onStderrEvent),
-          returnValue: Stream<_i2.Event>.empty()) as _i3.Stream<_i2.Event>);
+  _i3.Stream<_i2.Event> get onStderrEvent => (super.noSuchMethod(
+        Invocation.getter(#onStderrEvent),
+        returnValue: _i3.Stream<_i2.Event>.empty(),
+      ) as _i3.Stream<_i2.Event>);
   @override
-  _i3.Stream<String> get onSend =>
-      (super.noSuchMethod(Invocation.getter(#onSend),
-          returnValue: Stream<String>.empty()) as _i3.Stream<String>);
+  _i3.Stream<String> get onSend => (super.noSuchMethod(
+        Invocation.getter(#onSend),
+        returnValue: _i3.Stream<String>.empty(),
+      ) as _i3.Stream<String>);
   @override
-  _i3.Stream<String> get onReceive =>
-      (super.noSuchMethod(Invocation.getter(#onReceive),
-          returnValue: Stream<String>.empty()) as _i3.Stream<String>);
+  _i3.Stream<String> get onReceive => (super.noSuchMethod(
+        Invocation.getter(#onReceive),
+        returnValue: _i3.Stream<String>.empty(),
+      ) as _i3.Stream<String>);
   @override
-  _i3.Future<dynamic> get onDone =>
-      (super.noSuchMethod(Invocation.getter(#onDone),
-          returnValue: Future<dynamic>.value()) as _i3.Future<dynamic>);
+  _i3.Future<dynamic> get onDone => (super.noSuchMethod(
+        Invocation.getter(#onDone),
+        returnValue: _i3.Future<dynamic>.value(),
+      ) as _i3.Future<dynamic>);
   @override
-  _i3.Stream<_i2.Event> onEvent(String? streamId) =>
-      (super.noSuchMethod(Invocation.method(#onEvent, [streamId]),
-          returnValue: Stream<_i2.Event>.empty()) as _i3.Stream<_i2.Event>);
+  _i3.Stream<_i2.Event> onEvent(String? streamId) => (super.noSuchMethod(
+        Invocation.method(
+          #onEvent,
+          [streamId],
+        ),
+        returnValue: _i3.Stream<_i2.Event>.empty(),
+      ) as _i3.Stream<_i2.Event>);
   @override
   _i3.Future<_i2.Breakpoint> addBreakpoint(
-          String? isolateId, String? scriptId, int? line, {int? column}) =>
+    String? isolateId,
+    String? scriptId,
+    int? line, {
+    int? column,
+  }) =>
       (super.noSuchMethod(
-              Invocation.method(#addBreakpoint, [isolateId, scriptId, line],
-                  {#column: column}),
-              returnValue: Future<_i2.Breakpoint>.value(_FakeBreakpoint_0()))
-          as _i3.Future<_i2.Breakpoint>);
+        Invocation.method(
+          #addBreakpoint,
+          [
+            isolateId,
+            scriptId,
+            line,
+          ],
+          {#column: column},
+        ),
+        returnValue: _i3.Future<_i2.Breakpoint>.value(_FakeBreakpoint_0(
+          this,
+          Invocation.method(
+            #addBreakpoint,
+            [
+              isolateId,
+              scriptId,
+              line,
+            ],
+            {#column: column},
+          ),
+        )),
+      ) as _i3.Future<_i2.Breakpoint>);
   @override
   _i3.Future<_i2.Breakpoint> addBreakpointWithScriptUri(
-          String? isolateId, String? scriptUri, int? line, {int? column}) =>
+    String? isolateId,
+    String? scriptUri,
+    int? line, {
+    int? column,
+  }) =>
       (super.noSuchMethod(
-              Invocation.method(#addBreakpointWithScriptUri,
-                  [isolateId, scriptUri, line], {#column: column}),
-              returnValue: Future<_i2.Breakpoint>.value(_FakeBreakpoint_0()))
-          as _i3.Future<_i2.Breakpoint>);
+        Invocation.method(
+          #addBreakpointWithScriptUri,
+          [
+            isolateId,
+            scriptUri,
+            line,
+          ],
+          {#column: column},
+        ),
+        returnValue: _i3.Future<_i2.Breakpoint>.value(_FakeBreakpoint_0(
+          this,
+          Invocation.method(
+            #addBreakpointWithScriptUri,
+            [
+              isolateId,
+              scriptUri,
+              line,
+            ],
+            {#column: column},
+          ),
+        )),
+      ) as _i3.Future<_i2.Breakpoint>);
   @override
   _i3.Future<_i2.Breakpoint> addBreakpointAtEntry(
-          String? isolateId, String? functionId) =>
+    String? isolateId,
+    String? functionId,
+  ) =>
       (super.noSuchMethod(
-              Invocation.method(#addBreakpointAtEntry, [isolateId, functionId]),
-              returnValue: Future<_i2.Breakpoint>.value(_FakeBreakpoint_0()))
-          as _i3.Future<_i2.Breakpoint>);
+        Invocation.method(
+          #addBreakpointAtEntry,
+          [
+            isolateId,
+            functionId,
+          ],
+        ),
+        returnValue: _i3.Future<_i2.Breakpoint>.value(_FakeBreakpoint_0(
+          this,
+          Invocation.method(
+            #addBreakpointAtEntry,
+            [
+              isolateId,
+              functionId,
+            ],
+          ),
+        )),
+      ) as _i3.Future<_i2.Breakpoint>);
   @override
   _i3.Future<_i2.Success> clearCpuSamples(String? isolateId) =>
-      (super.noSuchMethod(Invocation.method(#clearCpuSamples, [isolateId]),
-              returnValue: Future<_i2.Success>.value(_FakeSuccess_1()))
-          as _i3.Future<_i2.Success>);
-  @override
-  _i3.Future<_i2.Success> clearVMTimeline() =>
-      (super.noSuchMethod(Invocation.method(#clearVMTimeline, []),
-              returnValue: Future<_i2.Success>.value(_FakeSuccess_1()))
-          as _i3.Future<_i2.Success>);
-  @override
-  _i3.Future<_i2.Response> invoke(String? isolateId, String? targetId,
-          String? selector, List<String>? argumentIds,
-          {bool? disableBreakpoints}) =>
       (super.noSuchMethod(
-              Invocation.method(
-                  #invoke,
-                  [isolateId, targetId, selector, argumentIds],
-                  {#disableBreakpoints: disableBreakpoints}),
-              returnValue: Future<_i2.Response>.value(_FakeResponse_2()))
-          as _i3.Future<_i2.Response>);
+        Invocation.method(
+          #clearCpuSamples,
+          [isolateId],
+        ),
+        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
+          this,
+          Invocation.method(
+            #clearCpuSamples,
+            [isolateId],
+          ),
+        )),
+      ) as _i3.Future<_i2.Success>);
+  @override
+  _i3.Future<_i2.Success> clearVMTimeline() => (super.noSuchMethod(
+        Invocation.method(
+          #clearVMTimeline,
+          [],
+        ),
+        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
+          this,
+          Invocation.method(
+            #clearVMTimeline,
+            [],
+          ),
+        )),
+      ) as _i3.Future<_i2.Success>);
+  @override
+  _i3.Future<_i2.Response> invoke(
+    String? isolateId,
+    String? targetId,
+    String? selector,
+    List<String>? argumentIds, {
+    bool? disableBreakpoints,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #invoke,
+          [
+            isolateId,
+            targetId,
+            selector,
+            argumentIds,
+          ],
+          {#disableBreakpoints: disableBreakpoints},
+        ),
+        returnValue: _i3.Future<_i2.Response>.value(_FakeResponse_2(
+          this,
+          Invocation.method(
+            #invoke,
+            [
+              isolateId,
+              targetId,
+              selector,
+              argumentIds,
+            ],
+            {#disableBreakpoints: disableBreakpoints},
+          ),
+        )),
+      ) as _i3.Future<_i2.Response>);
   @override
   _i3.Future<_i2.Response> evaluate(
-          String? isolateId, String? targetId, String? expression,
-          {Map<String, String>? scope, bool? disableBreakpoints}) =>
+    String? isolateId,
+    String? targetId,
+    String? expression, {
+    Map<String, String>? scope,
+    bool? disableBreakpoints,
+  }) =>
       (super.noSuchMethod(
-              Invocation.method(#evaluate, [isolateId, targetId, expression],
-                  {#scope: scope, #disableBreakpoints: disableBreakpoints}),
-              returnValue: Future<_i2.Response>.value(_FakeResponse_2()))
-          as _i3.Future<_i2.Response>);
+        Invocation.method(
+          #evaluate,
+          [
+            isolateId,
+            targetId,
+            expression,
+          ],
+          {
+            #scope: scope,
+            #disableBreakpoints: disableBreakpoints,
+          },
+        ),
+        returnValue: _i3.Future<_i2.Response>.value(_FakeResponse_2(
+          this,
+          Invocation.method(
+            #evaluate,
+            [
+              isolateId,
+              targetId,
+              expression,
+            ],
+            {
+              #scope: scope,
+              #disableBreakpoints: disableBreakpoints,
+            },
+          ),
+        )),
+      ) as _i3.Future<_i2.Response>);
   @override
   _i3.Future<_i2.Response> evaluateInFrame(
-          String? isolateId, int? frameIndex, String? expression,
-          {Map<String, String>? scope, bool? disableBreakpoints}) =>
+    String? isolateId,
+    int? frameIndex,
+    String? expression, {
+    Map<String, String>? scope,
+    bool? disableBreakpoints,
+  }) =>
       (super.noSuchMethod(
-              Invocation.method(
-                  #evaluateInFrame,
-                  [isolateId, frameIndex, expression],
-                  {#scope: scope, #disableBreakpoints: disableBreakpoints}),
-              returnValue: Future<_i2.Response>.value(_FakeResponse_2()))
-          as _i3.Future<_i2.Response>);
+        Invocation.method(
+          #evaluateInFrame,
+          [
+            isolateId,
+            frameIndex,
+            expression,
+          ],
+          {
+            #scope: scope,
+            #disableBreakpoints: disableBreakpoints,
+          },
+        ),
+        returnValue: _i3.Future<_i2.Response>.value(_FakeResponse_2(
+          this,
+          Invocation.method(
+            #evaluateInFrame,
+            [
+              isolateId,
+              frameIndex,
+              expression,
+            ],
+            {
+              #scope: scope,
+              #disableBreakpoints: disableBreakpoints,
+            },
+          ),
+        )),
+      ) as _i3.Future<_i2.Response>);
   @override
-  _i3.Future<_i2.AllocationProfile> getAllocationProfile(String? isolateId,
-          {bool? reset, bool? gc}) =>
+  _i3.Future<_i2.AllocationProfile> getAllocationProfile(
+    String? isolateId, {
+    bool? reset,
+    bool? gc,
+  }) =>
       (super.noSuchMethod(
-              Invocation.method(
-                  #getAllocationProfile, [isolateId], {#reset: reset, #gc: gc}),
-              returnValue: Future<_i2.AllocationProfile>.value(
-                  _FakeAllocationProfile_3()))
-          as _i3.Future<_i2.AllocationProfile>);
+        Invocation.method(
+          #getAllocationProfile,
+          [isolateId],
+          {
+            #reset: reset,
+            #gc: gc,
+          },
+        ),
+        returnValue:
+            _i3.Future<_i2.AllocationProfile>.value(_FakeAllocationProfile_3(
+          this,
+          Invocation.method(
+            #getAllocationProfile,
+            [isolateId],
+            {
+              #reset: reset,
+              #gc: gc,
+            },
+          ),
+        )),
+      ) as _i3.Future<_i2.AllocationProfile>);
   @override
-  _i3.Future<_i2.CpuSamples> getAllocationTraces(String? isolateId,
-          {int? timeOriginMicros, int? timeExtentMicros, String? classId}) =>
+  _i3.Future<_i2.CpuSamples> getAllocationTraces(
+    String? isolateId, {
+    int? timeOriginMicros,
+    int? timeExtentMicros,
+    String? classId,
+  }) =>
       (super.noSuchMethod(
-              Invocation.method(#getAllocationTraces, [
-                isolateId
-              ], {
-                #timeOriginMicros: timeOriginMicros,
-                #timeExtentMicros: timeExtentMicros,
-                #classId: classId
-              }),
-              returnValue: Future<_i2.CpuSamples>.value(_FakeCpuSamples_4()))
-          as _i3.Future<_i2.CpuSamples>);
+        Invocation.method(
+          #getAllocationTraces,
+          [isolateId],
+          {
+            #timeOriginMicros: timeOriginMicros,
+            #timeExtentMicros: timeExtentMicros,
+            #classId: classId,
+          },
+        ),
+        returnValue: _i3.Future<_i2.CpuSamples>.value(_FakeCpuSamples_4(
+          this,
+          Invocation.method(
+            #getAllocationTraces,
+            [isolateId],
+            {
+              #timeOriginMicros: timeOriginMicros,
+              #timeExtentMicros: timeExtentMicros,
+              #classId: classId,
+            },
+          ),
+        )),
+      ) as _i3.Future<_i2.CpuSamples>);
   @override
   _i3.Future<_i2.ClassList> getClassList(String? isolateId) =>
-      (super.noSuchMethod(Invocation.method(#getClassList, [isolateId]),
-              returnValue: Future<_i2.ClassList>.value(_FakeClassList_5()))
-          as _i3.Future<_i2.ClassList>);
+      (super.noSuchMethod(
+        Invocation.method(
+          #getClassList,
+          [isolateId],
+        ),
+        returnValue: _i3.Future<_i2.ClassList>.value(_FakeClassList_5(
+          this,
+          Invocation.method(
+            #getClassList,
+            [isolateId],
+          ),
+        )),
+      ) as _i3.Future<_i2.ClassList>);
   @override
   _i3.Future<_i2.CpuSamples> getCpuSamples(
-          String? isolateId, int? timeOriginMicros, int? timeExtentMicros) =>
+    String? isolateId,
+    int? timeOriginMicros,
+    int? timeExtentMicros,
+  ) =>
       (super.noSuchMethod(
-              Invocation.method(#getCpuSamples,
-                  [isolateId, timeOriginMicros, timeExtentMicros]),
-              returnValue: Future<_i2.CpuSamples>.value(_FakeCpuSamples_4()))
-          as _i3.Future<_i2.CpuSamples>);
+        Invocation.method(
+          #getCpuSamples,
+          [
+            isolateId,
+            timeOriginMicros,
+            timeExtentMicros,
+          ],
+        ),
+        returnValue: _i3.Future<_i2.CpuSamples>.value(_FakeCpuSamples_4(
+          this,
+          Invocation.method(
+            #getCpuSamples,
+            [
+              isolateId,
+              timeOriginMicros,
+              timeExtentMicros,
+            ],
+          ),
+        )),
+      ) as _i3.Future<_i2.CpuSamples>);
   @override
-  _i3.Future<_i2.FlagList> getFlagList() =>
-      (super.noSuchMethod(Invocation.method(#getFlagList, []),
-              returnValue: Future<_i2.FlagList>.value(_FakeFlagList_6()))
-          as _i3.Future<_i2.FlagList>);
+  _i3.Future<_i2.FlagList> getFlagList() => (super.noSuchMethod(
+        Invocation.method(
+          #getFlagList,
+          [],
+        ),
+        returnValue: _i3.Future<_i2.FlagList>.value(_FakeFlagList_6(
+          this,
+          Invocation.method(
+            #getFlagList,
+            [],
+          ),
+        )),
+      ) as _i3.Future<_i2.FlagList>);
   @override
   _i3.Future<_i2.InboundReferences> getInboundReferences(
-          String? isolateId, String? targetId, int? limit) =>
+    String? isolateId,
+    String? targetId,
+    int? limit,
+  ) =>
       (super.noSuchMethod(
-              Invocation.method(
-                  #getInboundReferences, [isolateId, targetId, limit]),
-              returnValue: Future<_i2.InboundReferences>.value(
-                  _FakeInboundReferences_7()))
-          as _i3.Future<_i2.InboundReferences>);
+        Invocation.method(
+          #getInboundReferences,
+          [
+            isolateId,
+            targetId,
+            limit,
+          ],
+        ),
+        returnValue:
+            _i3.Future<_i2.InboundReferences>.value(_FakeInboundReferences_7(
+          this,
+          Invocation.method(
+            #getInboundReferences,
+            [
+              isolateId,
+              targetId,
+              limit,
+            ],
+          ),
+        )),
+      ) as _i3.Future<_i2.InboundReferences>);
   @override
   _i3.Future<_i2.InstanceSet> getInstances(
-          String? isolateId, String? objectId, int? limit) =>
+    String? isolateId,
+    String? objectId,
+    int? limit, {
+    bool? includeSubclasses,
+    bool? includeImplementers,
+  }) =>
       (super.noSuchMethod(
-              Invocation.method(#getInstances, [isolateId, objectId, limit]),
-              returnValue: Future<_i2.InstanceSet>.value(_FakeInstanceSet_8()))
-          as _i3.Future<_i2.InstanceSet>);
+        Invocation.method(
+          #getInstances,
+          [
+            isolateId,
+            objectId,
+            limit,
+          ],
+          {
+            #includeSubclasses: includeSubclasses,
+            #includeImplementers: includeImplementers,
+          },
+        ),
+        returnValue: _i3.Future<_i2.InstanceSet>.value(_FakeInstanceSet_8(
+          this,
+          Invocation.method(
+            #getInstances,
+            [
+              isolateId,
+              objectId,
+              limit,
+            ],
+            {
+              #includeSubclasses: includeSubclasses,
+              #includeImplementers: includeImplementers,
+            },
+          ),
+        )),
+      ) as _i3.Future<_i2.InstanceSet>);
   @override
-  _i3.Future<_i2.Isolate> getIsolate(String? isolateId) =>
-      (super.noSuchMethod(Invocation.method(#getIsolate, [isolateId]),
-              returnValue: Future<_i2.Isolate>.value(_FakeIsolate_9()))
-          as _i3.Future<_i2.Isolate>);
+  _i3.Future<_i2.Isolate> getIsolate(String? isolateId) => (super.noSuchMethod(
+        Invocation.method(
+          #getIsolate,
+          [isolateId],
+        ),
+        returnValue: _i3.Future<_i2.Isolate>.value(_FakeIsolate_9(
+          this,
+          Invocation.method(
+            #getIsolate,
+            [isolateId],
+          ),
+        )),
+      ) as _i3.Future<_i2.Isolate>);
   @override
   _i3.Future<_i2.IsolateGroup> getIsolateGroup(String? isolateGroupId) =>
-      (super.noSuchMethod(Invocation.method(#getIsolateGroup, [isolateGroupId]),
-              returnValue:
-                  Future<_i2.IsolateGroup>.value(_FakeIsolateGroup_10()))
-          as _i3.Future<_i2.IsolateGroup>);
+      (super.noSuchMethod(
+        Invocation.method(
+          #getIsolateGroup,
+          [isolateGroupId],
+        ),
+        returnValue: _i3.Future<_i2.IsolateGroup>.value(_FakeIsolateGroup_10(
+          this,
+          Invocation.method(
+            #getIsolateGroup,
+            [isolateGroupId],
+          ),
+        )),
+      ) as _i3.Future<_i2.IsolateGroup>);
   @override
   _i3.Future<_i2.MemoryUsage> getMemoryUsage(String? isolateId) =>
-      (super.noSuchMethod(Invocation.method(#getMemoryUsage, [isolateId]),
-              returnValue: Future<_i2.MemoryUsage>.value(_FakeMemoryUsage_11()))
-          as _i3.Future<_i2.MemoryUsage>);
+      (super.noSuchMethod(
+        Invocation.method(
+          #getMemoryUsage,
+          [isolateId],
+        ),
+        returnValue: _i3.Future<_i2.MemoryUsage>.value(_FakeMemoryUsage_11(
+          this,
+          Invocation.method(
+            #getMemoryUsage,
+            [isolateId],
+          ),
+        )),
+      ) as _i3.Future<_i2.MemoryUsage>);
   @override
   _i3.Future<_i2.MemoryUsage> getIsolateGroupMemoryUsage(
           String? isolateGroupId) =>
       (super.noSuchMethod(
-              Invocation.method(#getIsolateGroupMemoryUsage, [isolateGroupId]),
-              returnValue: Future<_i2.MemoryUsage>.value(_FakeMemoryUsage_11()))
-          as _i3.Future<_i2.MemoryUsage>);
+        Invocation.method(
+          #getIsolateGroupMemoryUsage,
+          [isolateGroupId],
+        ),
+        returnValue: _i3.Future<_i2.MemoryUsage>.value(_FakeMemoryUsage_11(
+          this,
+          Invocation.method(
+            #getIsolateGroupMemoryUsage,
+            [isolateGroupId],
+          ),
+        )),
+      ) as _i3.Future<_i2.MemoryUsage>);
   @override
   _i3.Future<_i2.ScriptList> getScripts(String? isolateId) =>
-      (super.noSuchMethod(Invocation.method(#getScripts, [isolateId]),
-              returnValue: Future<_i2.ScriptList>.value(_FakeScriptList_12()))
-          as _i3.Future<_i2.ScriptList>);
-  @override
-  _i3.Future<_i2.Obj> getObject(String? isolateId, String? objectId,
-          {int? offset, int? count}) =>
       (super.noSuchMethod(
-              Invocation.method(#getObject, [isolateId, objectId],
-                  {#offset: offset, #count: count}),
-              returnValue: Future<_i2.Obj>.value(_FakeObj_13()))
-          as _i3.Future<_i2.Obj>);
+        Invocation.method(
+          #getScripts,
+          [isolateId],
+        ),
+        returnValue: _i3.Future<_i2.ScriptList>.value(_FakeScriptList_12(
+          this,
+          Invocation.method(
+            #getScripts,
+            [isolateId],
+          ),
+        )),
+      ) as _i3.Future<_i2.ScriptList>);
   @override
-  _i3.Future<_i2.PortList> getPorts(String? isolateId) =>
-      (super.noSuchMethod(Invocation.method(#getPorts, [isolateId]),
-              returnValue: Future<_i2.PortList>.value(_FakePortList_14()))
-          as _i3.Future<_i2.PortList>);
+  _i3.Future<_i2.Obj> getObject(
+    String? isolateId,
+    String? objectId, {
+    int? offset,
+    int? count,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getObject,
+          [
+            isolateId,
+            objectId,
+          ],
+          {
+            #offset: offset,
+            #count: count,
+          },
+        ),
+        returnValue: _i3.Future<_i2.Obj>.value(_FakeObj_13(
+          this,
+          Invocation.method(
+            #getObject,
+            [
+              isolateId,
+              objectId,
+            ],
+            {
+              #offset: offset,
+              #count: count,
+            },
+          ),
+        )),
+      ) as _i3.Future<_i2.Obj>);
+  @override
+  _i3.Future<_i2.PortList> getPorts(String? isolateId) => (super.noSuchMethod(
+        Invocation.method(
+          #getPorts,
+          [isolateId],
+        ),
+        returnValue: _i3.Future<_i2.PortList>.value(_FakePortList_14(
+          this,
+          Invocation.method(
+            #getPorts,
+            [isolateId],
+          ),
+        )),
+      ) as _i3.Future<_i2.PortList>);
   @override
   _i3.Future<_i2.RetainingPath> getRetainingPath(
-          String? isolateId, String? targetId, int? limit) =>
+    String? isolateId,
+    String? targetId,
+    int? limit,
+  ) =>
       (super.noSuchMethod(
-          Invocation.method(#getRetainingPath, [isolateId, targetId, limit]),
-          returnValue:
-              Future<_i2.RetainingPath>.value(_FakeRetainingPath_15())) as _i3
-          .Future<_i2.RetainingPath>);
+        Invocation.method(
+          #getRetainingPath,
+          [
+            isolateId,
+            targetId,
+            limit,
+          ],
+        ),
+        returnValue: _i3.Future<_i2.RetainingPath>.value(_FakeRetainingPath_15(
+          this,
+          Invocation.method(
+            #getRetainingPath,
+            [
+              isolateId,
+              targetId,
+              limit,
+            ],
+          ),
+        )),
+      ) as _i3.Future<_i2.RetainingPath>);
   @override
   _i3.Future<_i2.ProcessMemoryUsage> getProcessMemoryUsage() =>
-      (super.noSuchMethod(Invocation.method(#getProcessMemoryUsage, []),
-              returnValue: Future<_i2.ProcessMemoryUsage>.value(
-                  _FakeProcessMemoryUsage_16()))
-          as _i3.Future<_i2.ProcessMemoryUsage>);
-  @override
-  _i3.Future<_i2.Stack> getStack(String? isolateId, {int? limit}) =>
       (super.noSuchMethod(
-              Invocation.method(#getStack, [isolateId], {#limit: limit}),
-              returnValue: Future<_i2.Stack>.value(_FakeStack_17()))
-          as _i3.Future<_i2.Stack>);
+        Invocation.method(
+          #getProcessMemoryUsage,
+          [],
+        ),
+        returnValue:
+            _i3.Future<_i2.ProcessMemoryUsage>.value(_FakeProcessMemoryUsage_16(
+          this,
+          Invocation.method(
+            #getProcessMemoryUsage,
+            [],
+          ),
+        )),
+      ) as _i3.Future<_i2.ProcessMemoryUsage>);
+  @override
+  _i3.Future<_i2.Stack> getStack(
+    String? isolateId, {
+    int? limit,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getStack,
+          [isolateId],
+          {#limit: limit},
+        ),
+        returnValue: _i3.Future<_i2.Stack>.value(_FakeStack_17(
+          this,
+          Invocation.method(
+            #getStack,
+            [isolateId],
+            {#limit: limit},
+          ),
+        )),
+      ) as _i3.Future<_i2.Stack>);
   @override
   _i3.Future<_i2.ProtocolList> getSupportedProtocols() => (super.noSuchMethod(
-          Invocation.method(#getSupportedProtocols, []),
-          returnValue: Future<_i2.ProtocolList>.value(_FakeProtocolList_18()))
-      as _i3.Future<_i2.ProtocolList>);
+        Invocation.method(
+          #getSupportedProtocols,
+          [],
+        ),
+        returnValue: _i3.Future<_i2.ProtocolList>.value(_FakeProtocolList_18(
+          this,
+          Invocation.method(
+            #getSupportedProtocols,
+            [],
+          ),
+        )),
+      ) as _i3.Future<_i2.ProtocolList>);
   @override
   _i3.Future<_i2.SourceReport> getSourceReport(
-          String? isolateId, List<String>? reports,
-          {String? scriptId,
-          int? tokenPos,
-          int? endTokenPos,
-          bool? forceCompile,
-          bool? reportLines,
-          List<String>? libraryFilters}) =>
+    String? isolateId,
+    List<String>? reports, {
+    String? scriptId,
+    int? tokenPos,
+    int? endTokenPos,
+    bool? forceCompile,
+    bool? reportLines,
+    List<String>? libraryFilters,
+  }) =>
       (super.noSuchMethod(
-              Invocation.method(#getSourceReport, [
-                isolateId,
-                reports
-              ], {
-                #scriptId: scriptId,
-                #tokenPos: tokenPos,
-                #endTokenPos: endTokenPos,
-                #forceCompile: forceCompile,
-                #reportLines: reportLines,
-                #libraryFilters: libraryFilters
-              }),
-              returnValue:
-                  Future<_i2.SourceReport>.value(_FakeSourceReport_19()))
-          as _i3.Future<_i2.SourceReport>);
+        Invocation.method(
+          #getSourceReport,
+          [
+            isolateId,
+            reports,
+          ],
+          {
+            #scriptId: scriptId,
+            #tokenPos: tokenPos,
+            #endTokenPos: endTokenPos,
+            #forceCompile: forceCompile,
+            #reportLines: reportLines,
+            #libraryFilters: libraryFilters,
+          },
+        ),
+        returnValue: _i3.Future<_i2.SourceReport>.value(_FakeSourceReport_19(
+          this,
+          Invocation.method(
+            #getSourceReport,
+            [
+              isolateId,
+              reports,
+            ],
+            {
+              #scriptId: scriptId,
+              #tokenPos: tokenPos,
+              #endTokenPos: endTokenPos,
+              #forceCompile: forceCompile,
+              #reportLines: reportLines,
+              #libraryFilters: libraryFilters,
+            },
+          ),
+        )),
+      ) as _i3.Future<_i2.SourceReport>);
   @override
-  _i3.Future<_i2.Version> getVersion() =>
-      (super.noSuchMethod(Invocation.method(#getVersion, []),
-              returnValue: Future<_i2.Version>.value(_FakeVersion_20()))
-          as _i3.Future<_i2.Version>);
+  _i3.Future<_i2.Version> getVersion() => (super.noSuchMethod(
+        Invocation.method(
+          #getVersion,
+          [],
+        ),
+        returnValue: _i3.Future<_i2.Version>.value(_FakeVersion_20(
+          this,
+          Invocation.method(
+            #getVersion,
+            [],
+          ),
+        )),
+      ) as _i3.Future<_i2.Version>);
   @override
   _i3.Future<_i2.VM> getVM() => (super.noSuchMethod(
-      Invocation.method(#getVM, []),
-      returnValue: Future<_i2.VM>.value(_FakeVM_21())) as _i3.Future<_i2.VM>);
+        Invocation.method(
+          #getVM,
+          [],
+        ),
+        returnValue: _i3.Future<_i2.VM>.value(_FakeVM_21(
+          this,
+          Invocation.method(
+            #getVM,
+            [],
+          ),
+        )),
+      ) as _i3.Future<_i2.VM>);
   @override
-  _i3.Future<_i2.Timeline> getVMTimeline(
-          {int? timeOriginMicros, int? timeExtentMicros}) =>
+  _i3.Future<_i2.Timeline> getVMTimeline({
+    int? timeOriginMicros,
+    int? timeExtentMicros,
+  }) =>
       (super.noSuchMethod(
-              Invocation.method(#getVMTimeline, [], {
-                #timeOriginMicros: timeOriginMicros,
-                #timeExtentMicros: timeExtentMicros
-              }),
-              returnValue: Future<_i2.Timeline>.value(_FakeTimeline_22()))
-          as _i3.Future<_i2.Timeline>);
+        Invocation.method(
+          #getVMTimeline,
+          [],
+          {
+            #timeOriginMicros: timeOriginMicros,
+            #timeExtentMicros: timeExtentMicros,
+          },
+        ),
+        returnValue: _i3.Future<_i2.Timeline>.value(_FakeTimeline_22(
+          this,
+          Invocation.method(
+            #getVMTimeline,
+            [],
+            {
+              #timeOriginMicros: timeOriginMicros,
+              #timeExtentMicros: timeExtentMicros,
+            },
+          ),
+        )),
+      ) as _i3.Future<_i2.Timeline>);
   @override
   _i3.Future<_i2.TimelineFlags> getVMTimelineFlags() => (super.noSuchMethod(
-          Invocation.method(#getVMTimelineFlags, []),
-          returnValue: Future<_i2.TimelineFlags>.value(_FakeTimelineFlags_23()))
-      as _i3.Future<_i2.TimelineFlags>);
+        Invocation.method(
+          #getVMTimelineFlags,
+          [],
+        ),
+        returnValue: _i3.Future<_i2.TimelineFlags>.value(_FakeTimelineFlags_23(
+          this,
+          Invocation.method(
+            #getVMTimelineFlags,
+            [],
+          ),
+        )),
+      ) as _i3.Future<_i2.TimelineFlags>);
   @override
-  _i3.Future<_i2.Timestamp> getVMTimelineMicros() =>
-      (super.noSuchMethod(Invocation.method(#getVMTimelineMicros, []),
-              returnValue: Future<_i2.Timestamp>.value(_FakeTimestamp_24()))
-          as _i3.Future<_i2.Timestamp>);
+  _i3.Future<_i2.Timestamp> getVMTimelineMicros() => (super.noSuchMethod(
+        Invocation.method(
+          #getVMTimelineMicros,
+          [],
+        ),
+        returnValue: _i3.Future<_i2.Timestamp>.value(_FakeTimestamp_24(
+          this,
+          Invocation.method(
+            #getVMTimelineMicros,
+            [],
+          ),
+        )),
+      ) as _i3.Future<_i2.Timestamp>);
   @override
-  _i3.Future<_i2.Success> pause(String? isolateId) =>
-      (super.noSuchMethod(Invocation.method(#pause, [isolateId]),
-              returnValue: Future<_i2.Success>.value(_FakeSuccess_1()))
-          as _i3.Future<_i2.Success>);
+  _i3.Future<_i2.Success> pause(String? isolateId) => (super.noSuchMethod(
+        Invocation.method(
+          #pause,
+          [isolateId],
+        ),
+        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
+          this,
+          Invocation.method(
+            #pause,
+            [isolateId],
+          ),
+        )),
+      ) as _i3.Future<_i2.Success>);
   @override
-  _i3.Future<_i2.Success> kill(String? isolateId) =>
-      (super.noSuchMethod(Invocation.method(#kill, [isolateId]),
-              returnValue: Future<_i2.Success>.value(_FakeSuccess_1()))
-          as _i3.Future<_i2.Success>);
+  _i3.Future<_i2.Success> kill(String? isolateId) => (super.noSuchMethod(
+        Invocation.method(
+          #kill,
+          [isolateId],
+        ),
+        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
+          this,
+          Invocation.method(
+            #kill,
+            [isolateId],
+          ),
+        )),
+      ) as _i3.Future<_i2.Success>);
   @override
   _i3.Future<_i2.UriList> lookupResolvedPackageUris(
-          String? isolateId, List<String>? uris, {bool? local}) =>
+    String? isolateId,
+    List<String>? uris, {
+    bool? local,
+  }) =>
       (super.noSuchMethod(
-              Invocation.method(#lookupResolvedPackageUris, [isolateId, uris],
-                  {#local: local}),
-              returnValue: Future<_i2.UriList>.value(_FakeUriList_25()))
-          as _i3.Future<_i2.UriList>);
+        Invocation.method(
+          #lookupResolvedPackageUris,
+          [
+            isolateId,
+            uris,
+          ],
+          {#local: local},
+        ),
+        returnValue: _i3.Future<_i2.UriList>.value(_FakeUriList_25(
+          this,
+          Invocation.method(
+            #lookupResolvedPackageUris,
+            [
+              isolateId,
+              uris,
+            ],
+            {#local: local},
+          ),
+        )),
+      ) as _i3.Future<_i2.UriList>);
   @override
   _i3.Future<_i2.UriList> lookupPackageUris(
-          String? isolateId, List<String>? uris) =>
+    String? isolateId,
+    List<String>? uris,
+  ) =>
       (super.noSuchMethod(
-              Invocation.method(#lookupPackageUris, [isolateId, uris]),
-              returnValue: Future<_i2.UriList>.value(_FakeUriList_25()))
-          as _i3.Future<_i2.UriList>);
+        Invocation.method(
+          #lookupPackageUris,
+          [
+            isolateId,
+            uris,
+          ],
+        ),
+        returnValue: _i3.Future<_i2.UriList>.value(_FakeUriList_25(
+          this,
+          Invocation.method(
+            #lookupPackageUris,
+            [
+              isolateId,
+              uris,
+            ],
+          ),
+        )),
+      ) as _i3.Future<_i2.UriList>);
   @override
-  _i3.Future<_i2.Success> registerService(String? service, String? alias) =>
-      (super.noSuchMethod(Invocation.method(#registerService, [service, alias]),
-              returnValue: Future<_i2.Success>.value(_FakeSuccess_1()))
-          as _i3.Future<_i2.Success>);
-  @override
-  _i3.Future<_i2.ReloadReport> reloadSources(String? isolateId,
-          {bool? force,
-          bool? pause,
-          String? rootLibUri,
-          String? packagesUri}) =>
+  _i3.Future<_i2.Success> registerService(
+    String? service,
+    String? alias,
+  ) =>
       (super.noSuchMethod(
-              Invocation.method(#reloadSources, [
-                isolateId
-              ], {
-                #force: force,
-                #pause: pause,
-                #rootLibUri: rootLibUri,
-                #packagesUri: packagesUri
-              }),
-              returnValue:
-                  Future<_i2.ReloadReport>.value(_FakeReloadReport_26()))
-          as _i3.Future<_i2.ReloadReport>);
+        Invocation.method(
+          #registerService,
+          [
+            service,
+            alias,
+          ],
+        ),
+        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
+          this,
+          Invocation.method(
+            #registerService,
+            [
+              service,
+              alias,
+            ],
+          ),
+        )),
+      ) as _i3.Future<_i2.Success>);
+  @override
+  _i3.Future<_i2.ReloadReport> reloadSources(
+    String? isolateId, {
+    bool? force,
+    bool? pause,
+    String? rootLibUri,
+    String? packagesUri,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #reloadSources,
+          [isolateId],
+          {
+            #force: force,
+            #pause: pause,
+            #rootLibUri: rootLibUri,
+            #packagesUri: packagesUri,
+          },
+        ),
+        returnValue: _i3.Future<_i2.ReloadReport>.value(_FakeReloadReport_26(
+          this,
+          Invocation.method(
+            #reloadSources,
+            [isolateId],
+            {
+              #force: force,
+              #pause: pause,
+              #rootLibUri: rootLibUri,
+              #packagesUri: packagesUri,
+            },
+          ),
+        )),
+      ) as _i3.Future<_i2.ReloadReport>);
   @override
   _i3.Future<_i2.Success> removeBreakpoint(
-          String? isolateId, String? breakpointId) =>
+    String? isolateId,
+    String? breakpointId,
+  ) =>
       (super.noSuchMethod(
-              Invocation.method(#removeBreakpoint, [isolateId, breakpointId]),
-              returnValue: Future<_i2.Success>.value(_FakeSuccess_1()))
-          as _i3.Future<_i2.Success>);
+        Invocation.method(
+          #removeBreakpoint,
+          [
+            isolateId,
+            breakpointId,
+          ],
+        ),
+        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
+          this,
+          Invocation.method(
+            #removeBreakpoint,
+            [
+              isolateId,
+              breakpointId,
+            ],
+          ),
+        )),
+      ) as _i3.Future<_i2.Success>);
   @override
   _i3.Future<_i2.Success> requestHeapSnapshot(String? isolateId) =>
-      (super.noSuchMethod(Invocation.method(#requestHeapSnapshot, [isolateId]),
-              returnValue: Future<_i2.Success>.value(_FakeSuccess_1()))
-          as _i3.Future<_i2.Success>);
-  @override
-  _i3.Future<_i2.Success> resume(String? isolateId,
-          {String? step, int? frameIndex}) =>
       (super.noSuchMethod(
-              Invocation.method(
-                  #resume, [isolateId], {#step: step, #frameIndex: frameIndex}),
-              returnValue: Future<_i2.Success>.value(_FakeSuccess_1()))
-          as _i3.Future<_i2.Success>);
+        Invocation.method(
+          #requestHeapSnapshot,
+          [isolateId],
+        ),
+        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
+          this,
+          Invocation.method(
+            #requestHeapSnapshot,
+            [isolateId],
+          ),
+        )),
+      ) as _i3.Future<_i2.Success>);
+  @override
+  _i3.Future<_i2.Success> resume(
+    String? isolateId, {
+    String? step,
+    int? frameIndex,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #resume,
+          [isolateId],
+          {
+            #step: step,
+            #frameIndex: frameIndex,
+          },
+        ),
+        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
+          this,
+          Invocation.method(
+            #resume,
+            [isolateId],
+            {
+              #step: step,
+              #frameIndex: frameIndex,
+            },
+          ),
+        )),
+      ) as _i3.Future<_i2.Success>);
   @override
   _i3.Future<_i2.Breakpoint> setBreakpointState(
-          String? isolateId, String? breakpointId, bool? enable) =>
+    String? isolateId,
+    String? breakpointId,
+    bool? enable,
+  ) =>
       (super.noSuchMethod(
-              Invocation.method(
-                  #setBreakpointState, [isolateId, breakpointId, enable]),
-              returnValue: Future<_i2.Breakpoint>.value(_FakeBreakpoint_0()))
-          as _i3.Future<_i2.Breakpoint>);
+        Invocation.method(
+          #setBreakpointState,
+          [
+            isolateId,
+            breakpointId,
+            enable,
+          ],
+        ),
+        returnValue: _i3.Future<_i2.Breakpoint>.value(_FakeBreakpoint_0(
+          this,
+          Invocation.method(
+            #setBreakpointState,
+            [
+              isolateId,
+              breakpointId,
+              enable,
+            ],
+          ),
+        )),
+      ) as _i3.Future<_i2.Breakpoint>);
   @override
   _i3.Future<_i2.Success> setExceptionPauseMode(
-          String? isolateId, String? mode) =>
+    String? isolateId,
+    String? mode,
+  ) =>
       (super.noSuchMethod(
-              Invocation.method(#setExceptionPauseMode, [isolateId, mode]),
-              returnValue: Future<_i2.Success>.value(_FakeSuccess_1()))
-          as _i3.Future<_i2.Success>);
+        Invocation.method(
+          #setExceptionPauseMode,
+          [
+            isolateId,
+            mode,
+          ],
+        ),
+        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
+          this,
+          Invocation.method(
+            #setExceptionPauseMode,
+            [
+              isolateId,
+              mode,
+            ],
+          ),
+        )),
+      ) as _i3.Future<_i2.Success>);
   @override
-  _i3.Future<_i2.Success> setIsolatePauseMode(String? isolateId,
-          {String? exceptionPauseMode, bool? shouldPauseOnExit}) =>
+  _i3.Future<_i2.Success> setIsolatePauseMode(
+    String? isolateId, {
+    String? exceptionPauseMode,
+    bool? shouldPauseOnExit,
+  }) =>
       (super.noSuchMethod(
-              Invocation.method(#setIsolatePauseMode, [
-                isolateId
-              ], {
-                #exceptionPauseMode: exceptionPauseMode,
-                #shouldPauseOnExit: shouldPauseOnExit
-              }),
-              returnValue: Future<_i2.Success>.value(_FakeSuccess_1()))
-          as _i3.Future<_i2.Success>);
+        Invocation.method(
+          #setIsolatePauseMode,
+          [isolateId],
+          {
+            #exceptionPauseMode: exceptionPauseMode,
+            #shouldPauseOnExit: shouldPauseOnExit,
+          },
+        ),
+        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
+          this,
+          Invocation.method(
+            #setIsolatePauseMode,
+            [isolateId],
+            {
+              #exceptionPauseMode: exceptionPauseMode,
+              #shouldPauseOnExit: shouldPauseOnExit,
+            },
+          ),
+        )),
+      ) as _i3.Future<_i2.Success>);
   @override
-  _i3.Future<_i2.Response> setFlag(String? name, String? value) =>
-      (super.noSuchMethod(Invocation.method(#setFlag, [name, value]),
-              returnValue: Future<_i2.Response>.value(_FakeResponse_2()))
-          as _i3.Future<_i2.Response>);
+  _i3.Future<_i2.Response> setFlag(
+    String? name,
+    String? value,
+  ) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #setFlag,
+          [
+            name,
+            value,
+          ],
+        ),
+        returnValue: _i3.Future<_i2.Response>.value(_FakeResponse_2(
+          this,
+          Invocation.method(
+            #setFlag,
+            [
+              name,
+              value,
+            ],
+          ),
+        )),
+      ) as _i3.Future<_i2.Response>);
   @override
   _i3.Future<_i2.Success> setLibraryDebuggable(
-          String? isolateId, String? libraryId, bool? isDebuggable) =>
+    String? isolateId,
+    String? libraryId,
+    bool? isDebuggable,
+  ) =>
       (super.noSuchMethod(
-              Invocation.method(
-                  #setLibraryDebuggable, [isolateId, libraryId, isDebuggable]),
-              returnValue: Future<_i2.Success>.value(_FakeSuccess_1()))
-          as _i3.Future<_i2.Success>);
+        Invocation.method(
+          #setLibraryDebuggable,
+          [
+            isolateId,
+            libraryId,
+            isDebuggable,
+          ],
+        ),
+        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
+          this,
+          Invocation.method(
+            #setLibraryDebuggable,
+            [
+              isolateId,
+              libraryId,
+              isDebuggable,
+            ],
+          ),
+        )),
+      ) as _i3.Future<_i2.Success>);
   @override
-  _i3.Future<_i2.Success> setName(String? isolateId, String? name) =>
-      (super.noSuchMethod(Invocation.method(#setName, [isolateId, name]),
-              returnValue: Future<_i2.Success>.value(_FakeSuccess_1()))
-          as _i3.Future<_i2.Success>);
+  _i3.Future<_i2.Success> setName(
+    String? isolateId,
+    String? name,
+  ) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #setName,
+          [
+            isolateId,
+            name,
+          ],
+        ),
+        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
+          this,
+          Invocation.method(
+            #setName,
+            [
+              isolateId,
+              name,
+            ],
+          ),
+        )),
+      ) as _i3.Future<_i2.Success>);
   @override
   _i3.Future<_i2.Success> setTraceClassAllocation(
-          String? isolateId, String? classId, bool? enable) =>
+    String? isolateId,
+    String? classId,
+    bool? enable,
+  ) =>
       (super.noSuchMethod(
-              Invocation.method(
-                  #setTraceClassAllocation, [isolateId, classId, enable]),
-              returnValue: Future<_i2.Success>.value(_FakeSuccess_1()))
-          as _i3.Future<_i2.Success>);
+        Invocation.method(
+          #setTraceClassAllocation,
+          [
+            isolateId,
+            classId,
+            enable,
+          ],
+        ),
+        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
+          this,
+          Invocation.method(
+            #setTraceClassAllocation,
+            [
+              isolateId,
+              classId,
+              enable,
+            ],
+          ),
+        )),
+      ) as _i3.Future<_i2.Success>);
   @override
-  _i3.Future<_i2.Success> setVMName(String? name) =>
-      (super.noSuchMethod(Invocation.method(#setVMName, [name]),
-              returnValue: Future<_i2.Success>.value(_FakeSuccess_1()))
-          as _i3.Future<_i2.Success>);
+  _i3.Future<_i2.Success> setVMName(String? name) => (super.noSuchMethod(
+        Invocation.method(
+          #setVMName,
+          [name],
+        ),
+        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
+          this,
+          Invocation.method(
+            #setVMName,
+            [name],
+          ),
+        )),
+      ) as _i3.Future<_i2.Success>);
   @override
   _i3.Future<_i2.Success> setVMTimelineFlags(List<String>? recordedStreams) =>
       (super.noSuchMethod(
-              Invocation.method(#setVMTimelineFlags, [recordedStreams]),
-              returnValue: Future<_i2.Success>.value(_FakeSuccess_1()))
-          as _i3.Future<_i2.Success>);
+        Invocation.method(
+          #setVMTimelineFlags,
+          [recordedStreams],
+        ),
+        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
+          this,
+          Invocation.method(
+            #setVMTimelineFlags,
+            [recordedStreams],
+          ),
+        )),
+      ) as _i3.Future<_i2.Success>);
   @override
-  _i3.Future<_i2.Success> streamCancel(String? streamId) =>
-      (super.noSuchMethod(Invocation.method(#streamCancel, [streamId]),
-              returnValue: Future<_i2.Success>.value(_FakeSuccess_1()))
-          as _i3.Future<_i2.Success>);
+  _i3.Future<_i2.Success> streamCancel(String? streamId) => (super.noSuchMethod(
+        Invocation.method(
+          #streamCancel,
+          [streamId],
+        ),
+        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
+          this,
+          Invocation.method(
+            #streamCancel,
+            [streamId],
+          ),
+        )),
+      ) as _i3.Future<_i2.Success>);
   @override
   _i3.Future<_i2.Success> streamCpuSamplesWithUserTag(List<String>? userTags) =>
       (super.noSuchMethod(
-              Invocation.method(#streamCpuSamplesWithUserTag, [userTags]),
-              returnValue: Future<_i2.Success>.value(_FakeSuccess_1()))
-          as _i3.Future<_i2.Success>);
+        Invocation.method(
+          #streamCpuSamplesWithUserTag,
+          [userTags],
+        ),
+        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
+          this,
+          Invocation.method(
+            #streamCpuSamplesWithUserTag,
+            [userTags],
+          ),
+        )),
+      ) as _i3.Future<_i2.Success>);
   @override
-  _i3.Future<_i2.Success> streamListen(String? streamId) =>
-      (super.noSuchMethod(Invocation.method(#streamListen, [streamId]),
-              returnValue: Future<_i2.Success>.value(_FakeSuccess_1()))
-          as _i3.Future<_i2.Success>);
+  _i3.Future<_i2.Success> streamListen(String? streamId) => (super.noSuchMethod(
+        Invocation.method(
+          #streamListen,
+          [streamId],
+        ),
+        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
+          this,
+          Invocation.method(
+            #streamListen,
+            [streamId],
+          ),
+        )),
+      ) as _i3.Future<_i2.Success>);
   @override
-  _i3.Future<_i2.Response> callMethod(String? method,
-          {String? isolateId, Map<String, dynamic>? args}) =>
+  _i3.Future<_i2.Response> callMethod(
+    String? method, {
+    String? isolateId,
+    Map<String, dynamic>? args,
+  }) =>
       (super.noSuchMethod(
-              Invocation.method(
-                  #callMethod, [method], {#isolateId: isolateId, #args: args}),
-              returnValue: Future<_i2.Response>.value(_FakeResponse_2()))
-          as _i3.Future<_i2.Response>);
+        Invocation.method(
+          #callMethod,
+          [method],
+          {
+            #isolateId: isolateId,
+            #args: args,
+          },
+        ),
+        returnValue: _i3.Future<_i2.Response>.value(_FakeResponse_2(
+          this,
+          Invocation.method(
+            #callMethod,
+            [method],
+            {
+              #isolateId: isolateId,
+              #args: args,
+            },
+          ),
+        )),
+      ) as _i3.Future<_i2.Response>);
   @override
-  _i3.Future<_i2.Response> callServiceExtension(String? method,
-          {String? isolateId, Map<String, dynamic>? args}) =>
+  _i3.Future<_i2.Response> callServiceExtension(
+    String? method, {
+    String? isolateId,
+    Map<String, dynamic>? args,
+  }) =>
       (super.noSuchMethod(
-              Invocation.method(#callServiceExtension, [method],
-                  {#isolateId: isolateId, #args: args}),
-              returnValue: Future<_i2.Response>.value(_FakeResponse_2()))
-          as _i3.Future<_i2.Response>);
+        Invocation.method(
+          #callServiceExtension,
+          [method],
+          {
+            #isolateId: isolateId,
+            #args: args,
+          },
+        ),
+        returnValue: _i3.Future<_i2.Response>.value(_FakeResponse_2(
+          this,
+          Invocation.method(
+            #callServiceExtension,
+            [method],
+            {
+              #isolateId: isolateId,
+              #args: args,
+            },
+          ),
+        )),
+      ) as _i3.Future<_i2.Response>);
   @override
-  _i3.Future<void> dispose() =>
-      (super.noSuchMethod(Invocation.method(#dispose, []),
-          returnValue: Future<void>.value(),
-          returnValueForMissingStub: Future<void>.value()) as _i3.Future<void>);
+  _i3.Future<void> dispose() => (super.noSuchMethod(
+        Invocation.method(
+          #dispose,
+          [],
+        ),
+        returnValue: _i3.Future<void>.value(),
+        returnValueForMissingStub: _i3.Future<void>.value(),
+      ) as _i3.Future<void>);
   @override
-  void registerServiceCallback(String? service, _i2.ServiceCallback? cb) =>
+  void registerServiceCallback(
+    String? service,
+    _i2.ServiceCallback? cb,
+  ) =>
       super.noSuchMethod(
-          Invocation.method(#registerServiceCallback, [service, cb]),
-          returnValueForMissingStub: null);
+        Invocation.method(
+          #registerServiceCallback,
+          [
+            service,
+            cb,
+          ],
+        ),
+        returnValueForMissingStub: null,
+      );
 }
